友链
IyBb5Y L6ZO XShodHRwOi8vMTQ0LjM0LjE2NC4yMTcvKQoK55u46L6D5LqO5bm/5pKt77yM5bCx5piv5aSa5LqG5LiA5Liq6K6 572u5aSa5pKt57uE5ZKM5Yqg5YWl5aSa5pKt57uE55qE5pON5L2cCgpnY2MgMS5jIC1vIDEgLWxwdGhyZWFkCgpjdHJsK2bmkJzntKLmnI3liqHnq6/ku6PnoIHlkozlrqLmiLfnq6/ku6PnoIHojrflj5bku6PnoIHmlpzkvZPmoLflvI8K5pyN5Yqh56uv5Luj56CBOgpgYGBjCi8vIOOAgeOAgeS9v eUqOWGheWtmOaYoOWwhOWPr S7peaLt i0neaWh S7tgovKgrlr7nljp/lp4vmlofku7bov5vooYzlhoXlrZjmmKDlsIQK5Yib5bu65LiA5Liq5paw5paH5Lu2CuaKiuaWsOaWh S7tueahOaVsOaNruaLt i0neaYoOWwhOWIsOWGheWtmOS4rQrpgJrov4flhoXlrZjmi7fotJ3lsIbnrKzkuIDkuKrmlofku7bnmoTlhoXlrZjmmKDlsITljLrmi7fotJ3liLDnrKzkuozkuKrmlofku7bnmoTlhoXlrZjmmKDlsITljLoK6YeK5pS 6LWE5rqQCiovCgovLyDljL/lkI3mmKDlsITvvIzkuI3pnIDopoHmlofku7blrp7kvZPmnaXov5vooYzlhoXlrZjmmKDlsIQKLy8g5Y q6IO955So5LqO5pyJ6KGA57yY5YWz57O755qE6L b56iL6Ze06YCa5L hCiNpbmNsdWRlIDxzeXMvbW1hbi5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg IAojaW5jbHVkZSA8c2lnbmFsLmg CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgovLyBpbnQgbWFpbigpCi8vIHsKCiAgICAvKgovLyBraWxs5Ye95pWwCi8vIHBpZOOAizDlsIbkv6Hlj7flj5HpgIHnu5nmjIflrprov5vnqIsKLy8gPTDvvJrlsIbkv6Hlj7flj5HpgIHnu5nlvZPliY3ov5vnqIvnu4QKLy8gPS0x77ya5bCG5L h5Y 35Y R6YCB57uZ5q P5LiA5Liq5pyJ5p2D6ZmQ5o6l5Y X6L Z5Liq5L h5Y 355qE6L b56iLCi8vIOOAii0x77ya6L b56iL57uEaWTnmoTnu53lr7nlgLwKLy8gc2ln77yM6KaB5Y R6YCB55qE5L h5Y 3Ci8vIGtpbGwoZ2V0cHBpZCgpLCA5KTsKLy8ga2lsbChnZXRwaWQoKSwgOSk7Ci8vIHJhaXNl5Ye95pWw77yM57uZ5b2T5YmN6L b56iL5Y R6YCB5L h5Y 3Ci8vIHNpZ 8jOimgeWPkemAgeeahOS/oeWPt 8jOaIkOWKn i/lOWbnjDvvIzlpLHotKXov5Tlm57pnZ4wKi8KLy8gYWxhcm3lh73mlbAKLy8g6K6 572u5a6a5pe25Zmo77yM5YCS6K6h5pe277yM5b2T5pe26Ze05Li6MOeahOaXtuWAme 8jOS8mue7meW9k WJjei/m eoi WPkemAgeS4gOS4qiBTSUdBTEFSTeS/oeWPtwovLyDlj5bmtojlrprml7blmajvvIxhbGFybSgwKeWNs WPrwovLyDov5Tlm57lgLzmmK91bnNpZ25lZCBpbnTvvIzlgJLorqHml7bliankvZnnmoTml7bpl7TvvIjkuIrkuIDkuKphbGFybeWJqeS9meeahOaXtumXtO 8iQovLyBTSUdBTFJBUk3kv6Hlj7fpu5jorqTnu4jmraLlvZPliY3ov5vnqIvvvIzmr4/kuKrov5vnqIvlj6rog73orr7nva7kuIDkuKrlrprml7blmagKLy8aW50IHNlY29uZHMgPSBhbGFybSg1KTsKLy8gcHJpbnRmKCIlZFxuIiwgc2Vjb25kcyk7Ci8vICBzbGVlcCgyKTsKLy8gIHNlY29uZHMgPSBhbGFybSgzKTsKLy8gcHJpbnRmKCIlZFxuIiwgc2Vjb25kcyk7Ci8vIHdoaWxlKDEpewoKLy8gfQovLyAx56eS6ZKf55S16ISR6IO96L6T5aSa5bCR5Liq5pWwPwovL+aXoOiuuui/m+eoi+WkhOS6juS7gOS5iOeKtuaAge+8jGFsYXJt6YO95Lya5q2j5bi46K6h5pe2Ci8vIOWunumZheaXtumXtD3lhoXmoLjml7bpl7Qr55So5oi35pe26Ze0K2lv5raI6ICX55qE5pe26Ze0Ci8vIGFsYXJtKDEpOwovLyBpbnQgaSA9MDsKLy8gd2hpbGUoMSl7Ci8vICAgICBwcmludGYoIiVkXG4iLGkrKyk7Ci8vIH0KCi8vIHNldHRpbWVlcuWHveaVsO+8jOeUqOS6juabv+aNomFsYXJt5Ye95pWw77yM5LiU57K+5bqm5q+UYWxhcm3opoHpq5jlvojlpJrvvIwKLy8g5Y+C5pWwCi8vIHdoaWNo77yM5a6a5pe25Zmo5Lul5LuA5LmI5pe26Ze06K6h5pe2Ci8vICAgICBJVElNRV9SRUFM77yaIOecn+WunuaXtumXtO+8jOaXtumXtOWIsOi+vu+8jOWwseWPkemAgVNJR0FMUk0KLy8gICAgIElUSU1FX1ZJUlRVQUzvvJvnlKjmiLfml7bpl7TvvIzml7bpl7TliLDovr7lsLHlj5HpgIFTSUdWVEFMUk0KLy8gICAgIElUSU1FUl9QUk9G77ya6L+b56iL5Zyo5YaF5qC454q25oCB5LiL5raI6ICX55qE5pe26Ze0Ci8vIOi/hzPnp5LlkI7vvIzmr4/kuKTnp5LmiafooYzkuIDmrKEKLy8gc3RydWN0IGl0aW1lcnZhbCBuZXdfdmFsdWU7Ci8vIC8vIOiuvue9ruWAvAovLyBuZXdfdmFsdWUuaXRfaW50ZXJ2YWwudHZfc2VjID0gMjsKLy8gbmV3X3ZhbHVlLml0X2ludGVydmFsLnR2X3VzZWMgPTA7Ci8vIG5ld192YWx1ZS5pdF92YWx1ZS50dl9zZWM9MzsKLy8gbmV3X3ZhbHVlLml0X3ZhbHVlLnR2X3VzZWM9MDsKLy8gaW50IHJldCA9IHNldGl0aW1lcihJVElNRVJfUkVBTCwmbmV3X3ZhbHVlLE5VTEwpOwovLyBwcmludGYoIuWumuaXtuWZqOW8gOWni1xuIik7Ci8vIGlmIChyZXQ9PS0xKXsKLy8gICAgIHBlcnJvcigic2V0dGltZXIiKTsKLy8gICAgIGV4aXQoMCk7Ci8vIH0KLy8gZ2V0Y2hhcigpOwovLyBzaWduYWzmjZXojrfkv6Hlj7cKLy8gc2lna2lsbCxzaWdzdG9w5pei5LiN6IO96KKr5o2V5o2J5Lmf5LiN6IO96KKr5b+955WlCi8vIHNpZ251be+8muimgeaNleaNieeahOS/oeWPtwovLyBoYW5kbGVy77ya5o2V5o2J5Yiw5L+h5Y+35LmL5ZCO5aaC5L2V5aSE55CGCi8vICAgICBzaWdfaWdu77ya5b+955WlCi8vICAgICBzaWdfZGZs77ya5L2/55So5L+h5Y+36buY6K6k55qE6KGM5Li6Ci8vICAgICDlm57osIPlh73mlbA65o2V6I635Yiw5L+h5Y+35ZCO5omn6KGM6K+l5Ye95pWwCi8vIOi/hzPnp5LlkI7vvIzmr4/kuKTnp5LmiafooYzkuIDmrKEKLy8g5rOo5YaM5L+h5Y+35o2V5o2J5Ye95pWwCi8v5b+955Wl5L+h5Y+3Ci8vIHNpZ25hbChTSUdBTFJNLFNJR19JR04pOwovL+ebtOihjOS/oeWPt+eahOm7mOiupOWKqOS9nO+8iHNpZ19BTFJN57uT5p2f56iL5bqP77yJCi8vIHNpZ25hbChTSUdBTFJNLFNJR19ERkwpOwovLyB2b2lkICgqc2lnX2hhbmRsZXIpKGludCks6L+Z5piv5LiA5Liq5Ye95pWw5oyH6ZKI44CC6L+U5Zuedm9pZO+8jOWPguaVsGludO+8jOWHveaVsOWQjeensO+8mnNpZ19oYW5kbGVyCi8vIOiOt+WPluW9k+WJjee6v+eoi+eahOeOsOaIkGlkCiAgICBpbnQgYXNkYSA9NTsKICAgIC8v5omA5qyy55qE57q/56iL5bqU6K+l5YWx5Lqr6L+ZMTAw5byg6Zeo56WoCiAgICBpbnQgdGlja2V0cyA9MTAwOwogICAgLy8g5Yib5bu65LiA5Liq5LqS5pal6YePCiAgICAgcHRocmVhZF9tdXRleF90IG11dGV4OyAKCiAgICAvL+WHuueOsOS6huWQjOS4gOS4que6v+eoi++8jOS5sOWQjOS4gOW8oOelqOeahOaDheWGtQogICAgLy8g6ZyA6KaB56Gu5L+d5aSa5Liq57q/56iL5LiN5Lya5ZCM5pe25L+u5pS55LiA5Liq5Y+Y6YePCiAgICAvLyDkuLTnlYzljLrjgILvvJtp5L2g5aeQ6LWE5rqQCiAgICAvLyAjaW5jbHVkZTwKICAgICAgcHRocmVhZF9tdXRleF90IG11dGV4MTsKICAgICAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXgyOwp2b2lkICpzaWdfaGFuZGxlcih2b2lkKiBhcmcpIHsKLy8gICAgIHByaW50ZigiJWRcbiIsKihpbnQqKWFyZyk7Ci8vICAgICBwcmludGYoIuaNleiOt+WIsOWtkOe6v+eoi++8mlxuIik7Ci8vICAgICAvLyBzbGVlcCgzKTsKLy8gICAgIHByaW50ZigibGxsbGxsbGzlrZDnur/nqItkaWxsbGxsbGxdbueahOOAgW4lbGRcbiIscHRocmVhZF9zZWxmKCkpOwovLyAgICAgLy8gcmV0dXJuIE5VTEw7Ci8vICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKLy8ge3ByaW50Zigi5oiR5piv5L2g5YS/5a2QJWRcbiIsaSk7Ci8vICAgICAvKiBjb2RlICovCi8vIH0KLy8gcmV0dXJuIE5VTEw7Ci8vICAgICBwdGhyZWFkX2V4aXQoKHZvaWQqKSZhc2RhKTsKLy8g5Y2W56WoCi8vIOaet+mUgQp3aGlsZSgxKXsKcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CnB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwogICAgaWYodGlja2V0cz4wKXsKICAgIHByaW50Zigi5a2Q57q/56iLJWxk5q2j5Zyo5Y2W5ZywJWTlvKDlk6bnpahcbiIscHRocmVhZF9zZWxmKCksMTAwLXRpY2tldHMrMSk7CiAgICB0aWNrZXRzLS07Cn1lbHNlIHtwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpO2JyZWFrO30KLy8g6Kej6ZSBCgpwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwpwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwp9CnJldHVybiBOVUxMOwp9CgoKLy8gICAgIHByaW50ZigiJWRcbiIsKihpbnQqKWFyZyk7Ci8vICAgICBwcmludGYoIuaNleiOt+WIsOWtkOe6v+eoi++8mlxuIik7Ci8vICAgICAvLyBzbGVlcCgzKTsKLy8gICAgIHByaW50ZigibGxsbGxsbGzlrZDnur/nqItkaWxsbGxsbGxdbueahOOAgW4lbGRcbiIscHRocmVhZF9zZWxmKCkpOwovLyAgICAgLy8gcmV0dXJuIE5VTEw7Ci8vICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKLy8ge3ByaW50Zigi5oiR5piv5L2g5YS/5a2QJWRcbiIsaSk7Ci8vICAgICAvKiBjb2RlICovCi8vIH0KLy8gcmV0dXJuIE5VTEw7Ci8vICAgICBwdGhyZWFkX2V4aXQoKHZvaWQqKSZhc2RhKTsKLy8g5Y2W56WoCi8vIOaet+mUgQpwdGhyZWFkX211dGV4X3QgYXNkYXNkYXNkYXNkYXNkYXM7CmludCBudW1tID0xOwp2b2lkICpzaWdfaGFuZGxlcjEodm9pZCogYXJnKSB7Ci8vIC8vIHdoaWxlKDEpewoKLy8gcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleDEpOwogICAgd2hpbGUoMSl7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZhc2Rhc2Rhc2Rhc2Rhc2Rhcyk7Cm51bW0rKzsKLy8gIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhc2Rhc2Rhc2Rhc2Rhc2Rhcyk7CnByaW50ZigiKyvosKLosKLvvIx0aWQ6JWxkLG51bW1tOiVkXG4iLHB0aHJlYWRfc2VsZigpLG51bW0pOwogcHRocmVhZF9tdXRleF91bmxvY2soJmFzZGFzZGFzZGFzZGFzZGFzKTsKdXNsZWVwKDEpOwovLyAoMSk7CiAgICB9Ci8vIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgyKTsKLy8gcHJpbnRmKCJ3b3JrQe+8mu+8mlxuIik7CgovLyBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgyKTsKLy8gcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4MSk7Ci8vIC8vICAgICBpZih0aWNrZXRzPjApewovLyAvLyAgICAgcHJpbnRmKCLlrZDnur/nqIslbGTmraPlnKjljZblnLAlZOW8oOWTpuelqFxuIixwdGhyZWFkX3NlbGYoKSwxMDAtdGlja2V0cysxKTsKLy8gLy8gICAgIHRpY2tldHMtLTsKLy8gLy8gfWVsc2Uge3B0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7YnJlYWs7Ci8vIC8vIH0KLy8gLy8g6Kej6ZSBCgovLyAvLyBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwovLyAvLyBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwovLyAvLyB9CnJldHVybiBOVUxMOwp9Ci8vIOWtmOWcqOaVsOaNruWuieWFqOmXrumimGnvvIzor7vlhpnmt7fkubEKdm9pZCAqc2lnX2hhbmRsZXIxMjIzMih2b2lkKiBhcmcpIHsKLy8gLy8gd2hpbGUoMSl7Ci8vIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgyKTsKLy8gc2xlZXAoMSk7Ci8vIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgxKTsKLy8gcHJpbnRmKCLkuozom4vvvJrvvJpcbiIpOwoKLy8gcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4MSk7Ci8vIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleDIpOwovLyAvLyAgICAgaWYodGlja2V0cz4wKXsKLy8gLy8gICAgIHByaW50Zigi5a2Q57q/56iLJWxk5q2j5Zyo5Y2W5ZywJWTlvKDlk6bnpahcbiIscHRocmVhZF9zZWxmKCksMTAwLXRpY2tldHMrMSk7Ci8vIC8vICAgICB0aWNrZXRzLS07Ci8vIC8vIH1lbHNlIHtwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpO2JyZWFrOwovLyAvLyB9CiAgICB3aGlsZSgxKXsKLy8gbnVtbSsrOwogcHRocmVhZF9tdXRleF9sb2NrKCZhc2Rhc2Rhc2Rhc2Rhc2Rhcyk7CnByaW50ZigiKyvor7vor7vvvIx0aWQ6JWxkLG51bW1tOiVkXG4iLHB0aHJlYWRfc2VsZigpLG51bW0pOwogcHRocmVhZF9tdXRleF91bmxvY2soJmFzZGFzZGFzZGFzZGFzZGFzKTsKdXNsZWVwKDEpOwogICAgfQpyZXR1cm4gTlVMTDsKfQoKLy8gICAgIOS/oeWPt+mbhgovLyAgICAg5Lqn55Sf5L2G5piv6L+Y5rKh5pyJ6KKr5aSE55CG55qE5L+h5Y+36KKr5b2S5Yiw5pyq5Yaz5L+h5Y+36ZuGCgovLyAgICAgc2lnaW505L+h5Y+354q25oCB6KKr5a2Y5YKo5Zyo56ys5LqM5LiqYml05L2N5LiKCi8vICAgICAgICAgYml05L2N5Li6Me+8jOivtOaYjuS/oeWPt+WkhOS6juacquWGs+eKtuaAgQovLyDmnKrlhrPnirbmgIHlr7nnmoTkv6Hlj7fpnIDopoHlpIflpITnkIYKLy8g5L2G5piv5Zyo5aSE55CG5LmL5YmN6ZyA6KaB5ZKM5Y+m5LiA5Liq5Y+r5YGa6Zi75aGe5L+h5Y+36ZuG55qE5a+55bqU5q+U54m55L2N6L+b6KGM5q+U6L6DCi8vIOWmguaenOWvueW6lOS9jee9ruaYrzHvvIzpgqPkuYjlsLHor7TmmI7kv6Hlj7fooqvpmLvloZ7vvIzpgqPkuYjov5nkuKrkv6Hlj7flsLHkuI3kvJrooqvlpITnkIbvvIznm7TliLDmjIflj5jmiJAwCi8vIOmYu+WhnuS/oeWPt+mbhum7mOiupOS4jemYu+WhnuS7u+S9leS/oeWPt++8jOaIkeS7rOWPr+S7peaJi+WKqOi/m+ihjOiuvue9ru+8iOiwg+eUqOezu+e7n0FQSe+8iQoKLy8gc2lnZW1wdHlzZXTlh73mlbAKLy8gICAgIOa4heepuuS/oeWPt+mbhuS4reeahOaVsOaNru+8jOaJgOacieagh+W/l+S9jeiiq+iuvue9ruS4ujAKLy8gICAgIOWPguaVsO+8mnNldO+8jOimgeiuvue9rueahOS/oeWPt+mbhgovLyBzaWdmaWxsc2V05Ye95pWwCi8vICAgICDorr7kuLoxCi8vIHNpZ2FkZHNldOWHveaVsAovLyAgICAg6K6+572u5L+h5Y+36ZuG5Lit55qE5p+Q5LiA5Liq5qCH5b+X5L2N6K6+572u5Li6MQovLyBzaWdkZWxzZXQg5Ye95pWwCi8vICAgICDlkozkuIrpnaLnmoTnm7jlj43vvIwwCi8vIHNpZ2lzbWVtYmVy5Ye95pWwCi8vICAgICDliKTmlq3mn5DkuKrkv6Hlj7fmmK/lkKbpmLvloZ4KLy8g5LiK6Z2i55qE5Ye95pWw6YO95piv6Zi75aGe5L+h5Y+36ZuG55qE5pON5L2c5Ye95pWwCi8vIOWIm+W7uuS4gOS4quS/oeWPt+mbhgovLyBzaWdzZXRfdCBzZXQgOwovLyAvLyDlhYjmuIXnqboKLy8gc2lnZW1wdHlzZXQoJnNldCk7Ci8vIC8vIOWIpOaWreS/oeWPt+aYr+WQpuWcqOS/oeWPt+mbhuS4rQovLyBpbnQgcmV0ID0gc2lnaXNtZW1iZXIoJnNldCxTSUdJTlQpOwovLyBpZiAocmV0ID09IDApIHsKLy8gcHJpbnRmKCJTSUdJTlQg5LiN6Zi75aGeXG4iKTsKLy8gfWVsc2UgaWYocmV0ID09IDEpIHsKLy8gcHJpbnRmKCJTSUdJTlQg6Zi75aGeXG4iKTsKCi8vIH0KLy8gLy8g5re75Yqg5L+h5Y+35Yiw5L+h5Y+36ZuG5LitCi8vIHNpZ2FkZHNldCgmc2V0LFNJR0lOVCk7Ci8vIHNpZ2FkZHNldCgmc2V0LFNJR1FVSVQpOwovLyAgcmV0ID0gc2lnaXNtZW1iZXIoJnNldCxTSUdJTlQpOwovLyBpZiAocmV0ID09IDApIHsKLy8gcHJpbnRmKCJTSUdJTlQg5LiN6Zi75aGeXG4iKTsKLy8gfWVsc2UgaWYocmV0ID09IDEpIHsKLy8gcHJpbnRmKCJTSUdJTlQg6Zi75aGeXG4iKTsKCi8vIH0KLy8gIHJldCA9IHNpZ2lzbWVtYmVyKCZzZXQsU0lHUVVJVCk7Ci8vIGlmIChyZXQgPT0gMCkgewovLyBwcmludGYoIlNJR1FVSVQg5LiN6Zi75aGeXG4iKTsKLy8gfWVsc2UgaWYocmV0ID09IDEpIHsKLy8gcHJpbnRmKCJTSUdRVUlUIOmYu+WhnlxuIik7CgovLyB9Ci8vIHNpZ2RlbHNldCgmc2V0LCBTSUdRVUlUKTsKLy8gIHJldCA9IHNpZ2lzbWVtYmVyKCZzZXQsU0lHUVVJVCk7Ci8vIGlmIChyZXQgPT0gMCkgewovLyBwcmludGYoIlNJR1FVSVQg5LiN6Zi75aGeXG4iKTsKLy8gfWVsc2UgaWYocmV0ID09IDEpIHsKLy8gcHJpbnRmKCJTSUdRVUlUIOmYu+WhnlxuIik7CgovLyB9Ci8vIOezu+e7n+iwg+eUqOiuvue9ruS/oeWPt+mbhgovLyBzaWdwcm9jbWFzawovLyDor6Xlh73mlbDlj6/ku6XlsIbmiJHku6zoh6rlrprkuYnnmoTkv6Hlj7fpm4bmmKDlsITliLDlhoXmoLjkuK0KLy8gaG9377yaCi8vICAgICDlpoLkvZXlr7nlhoXmoLjkuK3nmoTpmLvloZ7kv6Hlj7fpm4bov5vooYzlpITnkIYKLy8gICAgICAgICBzaWdfYmxvY2vvvIxtYXNrfHNldAovLyAgICAgICAgIFNJR19VTkJMT0NLOiBtYXNrXnNldCjlvILmiJbmk43kvZwKLy8gICAgICAgICBzaWdfc2V0bWFzayDopobnm5blhoXmoLjnmoTmjIcKLy8gc2lncGVuZGluZwovLyAgICAg6I635Y+W5YaF5qC45b2T5Lit55qE5pyq5Yaz5L+h5Y+36ZuGCgovLyDnvJblhpnkuIDkuKrnqIvluo/vvIzlsIbmiYDmnInnmoTluLjop4Tkv6Hlj7fvvIgxLTMx77yJ55qE5pyq5Yaz54q25oCB5omT5Y2w5Ye65p2lCi8vIOiuvue9ruafkOS6m+S/oeWPt+aYr+mYu+WhnueahO+8jOmAmui/h+mUruebmOadpeS6p+eUn+i/meS6m+S/oeWPt2N0cmwrPwovLyDorr7nva4y44CBM+S/oeWPt+mYu+WhngovLyBzaWdzZXRfdCBzZXQ7Ci8vIHNpZ2VtcHR5c2V0KCZzZXQpOwovLyAvLyDlsIYy44CBM+S/oeWPt+a3u+WKoOWIsOS/oeWPt+mbhuS4rQovLyBzaWdhZGRzZXQoJnNldCxTSUdJTlQpOwovLyBzaWdhZGRzZXQoJnNldCxTSUdRVUlUKTsKLy8gLy/kv67mlLnlhoXmoLjkuK3nmoTpmLvloZ7kv6Hlj7fpm4YKLy8gc2lncHJvY21hc2soU0lHX0JMT0NLLCZzZXQsIE5VTEwpOwovLyBpbnQgbnVtPTA7Ci8vIHdoaWxlKDEpIHsKLy8gICAgIHByaW50ZigibnVt77yaJWRcbiIsbnVtKTsKLy8gICAgIGlmKG51bSA9PSA1KXsKLy8gICAgICAgICAvLyDop6PpmaRzaWdpbnTnmoTpmLvloZ4KLy8gICAgICAgICBzaWdwcm9jbWFzayhTSUdfVU5CTE9DSywmc2V0LE5VTEwpOwovLyAgICAgfQovLyAgICAgbnVtKys7Ci8vICAgICAvLyDojrflj5blvZPliY3nmoTmnKrlhrPkv6Hlj7fpm4YKLy8gICAgIHNpZ3NldF90IHBlbmRpbmdzZXQ7Ci8vICAgICBzaWdlbXB0eXNldCgmcGVuZGluZ3NldCk7Ci8vICAgICBzaWdwZW5kaW5nKCZwZW5kaW5nc2V0KTsKLy8gICAgIC8v6YGN5Y6GYml05L2NCi8vICAgICBmb3IoaW50IGk9MTtpPD0zMjtpKyspIHsKLy8gaWYoc2lnaXNtZW1iZXIoJnBlbmRpbmdzZXQsaSk9PTEpewovLyAgICAgcHJpbnRmKCIxIik7Ci8vIH1lbHNlIGlmKHNpZ2lzbWVtYmVyKCZwZW5kaW5nc2V0LCBpKT09MCkgewovLyAgICAgcHJpbnRmKCIwIik7Ci8vIH1lbHNlewovLyAgICAgcGVycm9yKCJzaWdpc21lbWJlclxuIik7ZXhpdCgwKTsKLy8gfQoKCi8vICAgICB9cHJpbnRmKCJcbiIpO3NsZWVwKDEpOwovLyB9Ci8vIHNpZ2FjdGlvbgovLyDmo4Dmn6XmiJbogIXmlLnlj5jkv6Hlj7fnmoTlpITnkIbmlrnlvI8KLy8gc2lnbnVt77yM6ZyA6KaB5o2V5o2J55qE5L+h5Y+3Ci8vIGFjdO+8jOaNleaNieWIsOS/oeWPt+WQjumcgOimgeaJp+ihjOeahOWKqOS9nAovLyBvbGRhYWN077yM5rKh55SoCgovLyBzdHJ1Y3Qgc2lnYWN0aW9uCi8vICAgICBzYV9oYW5kbGU65Zue6LCD5Ye95pWw5oyH6ZKICgovLyAgICAg5Li05pe26Zi75aGe5L+h5Y+36ZuGCi8vICAgICBzYV9tYXNrCi8vICAgICDkuLTml7bpmLvloZ7mn5Dkupvkv6Hlj7cKCi8vIOS9v+eUqOmCo+S4quS/oeWPt+WkhOeQhuWvueS/oeWPt+i/m+ihjOWkhOeQhuOAguWmguaenOaYrzDooajnpLrkvb/nlKjlm57osIPlh73mlbAKLy8gICAgIC8vIOW/hemhu+WcqOiuvue9ruWumuaXtuWZqOS5i+WJjeazqOWGjOWbnuiwg+WHveaVsAovLyDmnIDlpb3kvb/nlKhzaWdhY3Rpb27ljrvms6jlhozlm57osIPlh73mlbAKLy8gc3RydWN0IHNpZ2FjdGlvbiBhY3Q7Ci8vIGFjdC5zYV9mbGFncyA9IDA7Ci8vIGFjdC5zYV9zaWdhY3Rpb24gPSBzaWdfaGFuZGxlcjsKLy8gLy/muIXnqbrkuLTml7bpmLvloZ7kv6Hlj7fpm4YKLy8gc2lnZW1wdHlzZXQoJmFjdC5zYV9tYXNrKTsKLy8gc2lnYWN0aW9uKFNJR0FMUk0sJmFjdCxOVUxMKTsKLy8gLy8gc2lnX3QgcmV0ciA9ICBzaWduYWwoU0lHQUxSTSxzaWdfaGFuZGxlcik7Ci8vIC8vIGlmKHJldHI9PVNJR19FUlIpIHsKLy8gLy8gICAgIHBlcnJvcigic2lnbmFs5rOo5YaMIik7Ci8vIC8vICAgICBleGl0KC0xKTsKLy8gLy8gfQovLyBzdHJ1Y3QgaXRpbWVydmFsIG5ld192YWx1ZTsKLy8gLy8g6K6+572u5YC8Ci8vIG5ld192YWx1ZS5pdF9pbnRlcnZhbC50dl9zZWMgPSAyOwovLyBuZXdfdmFsdWUuaXRfaW50ZXJ2YWwudHZfdXNlYyA9MDsKLy8gbmV3X3ZhbHVlLml0X3ZhbHVlLnR2X3NlYz0zOwovLyBuZXdfdmFsdWUuaXRfdmFsdWUudHZfdXNlYz0wOwovLyBpbnQgcmV0ID0gc2V0aXRpbWVyKElUSU1FUl9SRUFMLCZuZXdfdmFsdWUsTlVMTCk7Ci8vIHByaW50Zigi5a6a5pe25Zmo5byA5aeLXG4iKTsKLy8gaWYgKHJldD09LTEpewovLyAgICAgcGVycm9yKCJzZXR0aW1lciIpOwovLyAgICAgZXhpdCgwKTsKLy8gfQovLyAvLyBnZXRjaGFyKCk7Ci8vIC8vIHdoaWxlKDEpOwovLyBzaWdjaGlsZOS/oeWPt+S6p+eUn+eahOadoeS7tgovLyAgICAg5a2Q6L+b56iL57uI5q2iCi8vICAgICDlrZDov5vnqIvmjqXmlLbliLBzaWdzdG9w5L+h5Y+35YGc5q2iCi8vICAgICDlrZDov5vnqIvlpITkuo7lgZzmu57nirbmgIHvvIzmlLbliLBzaWdjb2505ZCO5ZSk6YaSCi8vIOeItui/m+eoi+m7mOiupOiRq+iKpuivpeS/oeWPtwovLyDlj6/ku6XnlKjkuo7op6PlhrPlg7XlsLjov5vln47nmoTpl67popgKI2luY2x1ZGU8c3lzL3RpbWUuaD4KI2luY2x1ZGU8dGltZS5oPgp2b2lkIHNpZ19oYW5kbGVyMihpbnQgbnVtKXsKdGltZV90ICAgICB0bTIgPSB0aW1lKE5VTEwpOwpzdHJ1Y3QgdG0qIGxvYyA9IGxvY2FsdGltZSgmdG0yKTsKCi8vIGNoYXIgYnVmd2FlaHJzdGVkeXJ0ZWRzWzUyNF07Ci8vIHNwcmludGYoYnVmd2FlaHJzdGVkeXJ0ZWRzLCAiJWQtJWQtJWQgJWQ6JWQ6JWRcbiIsbG9jLT50bV95ZWFyLGxvYy0+dG1fbW9uLGxvYy0+dG1fbWRheSxsb2MtPnRtX2hvdXIsbG9jLT50bV9taW4sbG9jLT50bV9zZWMpOwovLyBwcmludGYoIiVzXG4iLGJ1ZndhZWhyc3RlZHlydGVkcyk7CmNoYXIqIHN0ciAgPWFzY3RpbWUobG9jKTsKaW50IGZkID1vcGVuKCJ0aW1lLnR4dCIsT19SRFdSfE9fQ1JFQVR8T19BUFBFTkQsMDY2NCk7CndyaXRlKGZkLHN0cixzdHJsZW4oc3RyKSk7CmNsb3NlKGZkKTsKICAgIC8vIHByaW50Zigi5o2V5o2J5aWl5b6X5L+h5Y+377yaJWRcbiIsbnVtKTsKICAgIC8vIC8vIOWbnummlue0q+emgeWfjgogICAgLy8gLy8gd2hpbGUoMSl7CiAgICAvLyAvLyB3YWl0KE5VTEwpO30KICAgIC8vIHdoaWxlICgxKQogICAgLy8ge2ludCByZXQgPXdhaXRwaWQoLTEsTlVMTCxXTk9IQU5HKTsKICAgIC8vICAgICAvKiBjb2RlICovCiAgICAvLyAgICAgaWYocmV0PjApewogICAgLy8gICAgICAgICBwcmludGYoIuS6jOWtl+aMguS6hu+8miVkXG4iLCByZXQpOwogICAgLy8gICAgIH1lbHNlIGlmKHJldCA9PTApIHsKICAgIC8vICAgICAgICAgLy8g6K+05piO6L+Y5pyJ5a2Q6L+b56iL5oiW6ICFCiAgICAvLyAgICAgICAgICAgYnJlYWs7CiAgICAvLyAgICAgfWVsc2UgaWYocmV0ID09LSAxKXsKICAgIC8vICAgICAgICAgLy8g5rKh5pyJ57Sr56aB5Z+O5LqGCiAgICAvLyAgICAgICAgIGJyZWFrOwogICAgLy8gICAgIH0KICAgIC8vIH0KICAgIAp9CiNpbmNsdWRlPHN5cy9zaG0uaD4KLy8gaW50IG1haW4oKQovLyB7Ci8vICAgICAvLyDmj5DliY3orr7nva7lpb3pmLvloZ7kv6Hlj7fpm4YKLy8gICAgIC8vIOmYu+WhnnNpZ2NoaWxkCi8vICAgICAvLyDlm6DkuLpVTuWcqOilv21haW7ov5nnp43lj6/og73vvJoKLy8gICAgIC8vICAgICDlrZDov5vnqIvlnKjms6jlhozlj7flm57osIPlh73mlbDkuYvliY3lsLHlt7Lnu4/nu5PmnZ/kuoYKLy8gc2lnc2V0X3Qgc2V0OwovLyBzaWdlbXB0eXNldCgmc2V0KTsKLy8gc2lnYWRkc2V0KCZzZXQsU0lHQ0hMRCk7Ci8vIHNpZ3Byb2NtYXNrKFNJR19CTE9DSywmc2V0ICAsTlVMTCk7CgoKLy8gcGlkX3QgcGlkOwovLyBpbnQgY291bnQ9MjA7Ci8vIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLy8gewovLyAgICAgcGlkID0gZm9yaygpOwovLyAgICAgaWYocGlkPT0wKXsKLy8gICAgICAgICBicmVhazsKLy8gICAgIH0KLy8gICAgIC8qIGNvZGUgKi8KCi8vIH0KLy8gLy8g5o2V5o2J5a2Q6L+b56iL5q275Lqh5pe25Y+R6YCB55qEc2lnY2hpbGTkv6Hlj7cKLy8gc3RydWN0IHNpZ2FjdGlvbiBhY3Q7Ci8vIGFjdC5zYV9mbGFncz0wOwovLyBhY3Quc2Ffc2lnYWN0aW9uID0gc2lnX2hhbmRsZXIyOwovLyBzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOwovLyBzaWdhY3Rpb24oU0lHQ0hMRCwmYWN0LE5VTEwpOwovLyAvLyDms6jlhozlrozkv6Hlj7fmjZXmjYnkuYvlkI7vvIzlsLHmjqXop6bpmLvloZ4KLy8gc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssJnNldCxOVUxMKTsKLy8gaWYocGlkPjApewovLyAgICAgLy8g54i26L+b56iLCi8vICAgICB3aGlsZSgxKXsKLy8gICAgICAgICBwcmludGYoIuaIkeaYr+S9oOeIuVxuIik7Ci8vICAgICAgICAgc2xlZXAoMik7Ci8vICAgICB9fSBlbHNlIGlmKHBpZD09MCl7Ci8vICAgICAgICAgcHJpbnRmKCLlhL/lrZfvvJolZFxuIixnZXRwaWQoKSk7Ci8vICAgICB9CgovLyBwaWRfdCBwaWQgPSBmb3JrKCk7Ci8vIGlmKHBpZD09MCl7Ci8vICAgICBmb3IoaW50IGk9MDtpPDU7aSsrKSB7Ci8vICAgICAgICAgcHJpbnRmKCLlranlrZDov5vnqIslZFxuIiwgaSk7Ci8vICAgICAgICAgc2xlZXAoMSk7Ci8vICAgICB9Ci8vIH1lbHNlIGlmKHBpZD4wKSB7Ci8vICAgcHJpbnRmKCLniLnov5vnqItcbiIpOwovLyAgIHNsZWVwKDIpOwovLyAgIHByaW50Zigi5YK75YS/5a2QXG4iKTsKLy8gICBraWxsKHBpZCxTSUdJTlQpOwovLyB9Ci8vIOWFseS6q+WGheWtmAovLyDliJvlu7rkuIDkuKrmlrDnmoTlhoXlrZjlhbHkuqvmrrUKLy8g5oiW6ICF6I635Y+W5LiA5LiqICAg5pei5pyJ55qE5YWx5Lqr5YaF5a2Y5q61Ci8vIHNobWF05ZKM5b2T5YmN6L+b56iL6L+b6KGM5YWz6IGUCi8vIHNobWRhdO+8jOenu+mZpOWSjOW9k+WJjei/m+eoi+eahOWFs+iBlAovLyBzaG1jdGwKLy8g5Yib5bu65LiA5Liq5YWx5Lqr5YaF5a2YCi8vIGludCBzaG1pZCA9IHNobWdldCg1MCw0MDk2LElQQ19DUkVBVHwwNjY0KTsKLy8gLy8g5ZKM5b2T5YmN6L+b56iL6L+b6KGM5YWz6IGUCi8vIHZvaWQqIHB0ciA9IHNobWF0KHNobWlkLE5VTEwsMCk7Ci8vIHByaW50ZigiJWRcbiIsIHNobWlkKTsKLy8gY2hhcipzdHIgPSAiaGVsbG8gd29ybGQiOwovLyBtZW1jcHkocHRyLHN0cixzdHJsZW4oc3RyKSsxKTsKLy8gcHJpbnRmKCLmjInku7vmhI/plK7nu6fnu61cbiIpOwovLyBnZXRjaGFyKCk7Ci8vIHNobWR0KHB0cik7Ci8vIHNobWN0bChzaG1pZCxJUENfUk1JRCxOVUxMKTsKLy8gZnRva+WHveaVsO+8jOagueaNruaMh+WumueahOi3r+W+hOWQjeWSjGludOaMh+eUn+aIkOS4gOS4quWFseS6q+WGheWtmOeahGtleQoKLy8g6Jm954S25pivaW5057G75Z6L55qE5oyH77yM5L2G5piv5YaF5qC45Y+q5Lya5L2/55So5LuW55qE5LiA5Liq5a2X6IqC77yM5Lmf5bCx5piv6K+06IyD5Zu05YW25a6e5pivMC0yNTUKLy8g5pON5L2c57O757uf5aaC5L2V55+l6YGT5LiA5Z2X5YWx5Lqr5YaF5a2Y5pyJ5aSa5bCR5Liq6L+b56iL5YWz6IGUCi8vICAgICDlhbHkuqvlhoXlrZjnu7TmiqTkuobkuIDkuKrnu5PmnoTkvZPvvIxzdHJ1Y3Qgc2htaWTigJTigJRkcwovLyAgICAg6K+l57uT5p6E5L2T5Lit5pyJ5LiA5Liq5oiQ5ZGYc2htX25vYXR0YWNo6K6w5b2V5LqG55u45YWz5L+h5oGvCi8vICAgICBpcGNzIC1t5Y+v5Lul5p+l55yLCi8vIOe8luWGmeS4gOS4quWuiOaKpOi/m+eoi++8jOavj+malOS4pOenkuiOt+WPluS4gOS4i+ezu+e7n+aXtumXtO+8jOWwhui/meS4quaXtumXtOWGmeWFpeejgeebmOaWh+S7tuS4rQovLyDliJvlu7rlrZDov5vnqIvvvIzmjqjlh7rniLbov5vnqIsKLy8gcGlkX3QgcGlkID1mb3JrKCk7Ci8vIGlmKHBpZD4wKXsKLy8gICAgIGV4aXQoMCk7Ci8vIH0KLy8gLy8g5bCG5a2Q6L+b56iL5o+Q5Y2H5Li65Zue6K+d77yMCi8vIHNldHNpZCgpOwovLyAvLyDorr7nva7mjqnnoIEKLy8gdW1hc2soMDIyKTsKLy8gLy8g5pu05pS55bel5L2c55uu5b2VCi8vIGNoZGlyKCIvIik7Ci8vIC8vIOWFs+mXreW5tumHjeWumuWQkeaWh+S7tuaPj+i/sOespgovLyAvLyBpbnQgZmQgPSBvcGVuKCIvZGV2L251bGwiLE9fUkRXUik7Ci8vIC8vIGR1cDIoZmQsU1RESU5fRklMRU5PKTsKLy8gLy8gZHVwMihmZCxTVERPVVRfRklMRU5PKTsKLy8gLy8gZHVwMihmZCxTVERFUlJfRklMRU5PKTsKLy8gLy8g5Lia5Yqh6YC76L6RCi8vIC8vIOWIm+W7uuWumuaXtuWZqAovLyAvLyBzZXRpdGltZXIoSVRJTUVSX1JFQUwsJnZhbCxOVUxMKTsKLy8gLy8g5o2V5o2J5a6a5piv5L+h5Y+3Ci8vIHN0cnVjdCBzaWdhY3Rpb24gYWN0OwovLyBhY3Quc2FfZmxhZ3MgPSAwOwovLyBhY3Quc2Ffc2lnYWN0aW9uID0gc2lnX2hhbmRsZXIyOwovLyBzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOwovLyBzaWdhY3Rpb24oU0lHQUxSTSwmYWN0LE5VTEwpOwovLyAvLyBzdHJ1Y3QgaXRpbWVydmFsIG5ld192YWx1ZTsKLy8gLy8g6K6+572u5YC8Ci8vIHN0cnVjdCBpdGltZXJ2YWwgbmV3X3ZhbHVlOwovLyBuZXdfdmFsdWUuaXRfaW50ZXJ2YWwudHZfc2VjID0gMjsKLy8gbmV3X3ZhbHVlLml0X2ludGVydmFsLnR2X3VzZWMgPTA7Ci8vIG5ld192YWx1ZS5pdF92YWx1ZS50dl9zZWM9MjsKLy8gbmV3X3ZhbHVlLml0X3ZhbHVlLnR2X3VzZWM9MDsKLy8gaW50IHJldCA9IHNldGl0aW1lcihJVElNRVJfUkVBTCwmbmV3X3ZhbHVlLE5VTEwpOwovLyB3aGlsZSgxKXsKLy8gICAgIHNsZWVwKDUpOwovLyB9Ci8vIHB0aHJlYWRfY3JlYXRl5Ye95pWwCi8vICAgICDnlKjkuo7liJvlu7rkuIDkuKrlrZDnur/nqIsKCi8vIOS4gOiIrOaDheWGteS4i++8jG1haW7lh73mlbDmiYDlnKjnmoTljr/ln47nmoTkuLrkuLvljr/ln44KLy8g5YW25L2Z5Yib5bu655qE546w5oiQ5Li65a2Q57q/56iLCi8vIOeoi+W6j+S4rem7mOiupOWPquacieS4gOS4que6v+eoi++8iOS4u+e6v+eoi++8iQovLyDosIPnlKhwdGhyZWFkX2NyZWF0ZeWIm+W7uuS4gOS4quaWsOeahOWOv+WfjgovLyBwdGhlcmVfZGV0YWNoCi8vICAgICDliIbnprvljr/ln44KLy8gICAgIOWli+WKm+S4gOS4quWOv+WOv+WfjuWxggovLyAgICAg6KKr5YiG56a755qE5Y6/5Z+O5Zyo5Lit5YC85b6X5pe25YCZ77yM6LWE5rqQ5Lya6Ieq5Yqo6L+U5Zue57uZ57O757ufCi8vICAgICDkuI3og73lpJrmrKHliIbnprsKLy8gICAgIOWQpuWImeS8muS6p+eUn+S4jeWPr+mihOaWmeeahOihjOS4ugovLyAgICAg5LiN6IO95Y676L+e5o6l5LiA5Liq5bey57uP5YiG56a755qE5Y6/5Z+OCi8vICAgICAgICAg5ZCm5YiZ5Lya5oql6ZSZCi8vICAgICDlj4LmlbDvvJoKLy8gICAgICAgICDliIbopoHliIbnprvnmoTljr/ln45pZAovLyAgICAgICAgIOaIkOWKn+i/lOWbnjDvvIzlpLHotKXov5Tlm57plJnor6/lj7cKLy8g5Yib5bu65LiA5Liq5pi+5oiQ54af5oCnCi8vIOWIm+W7ujXkuKrnlJ/kuqfogIXnur/nqIvvvIw15Liq5raI6LS56ICF57q/56iLCi8vIOS9v+eUqOmTvuihqOadpeWunueOsOWuueWZqAovLyDkvb/nlKjkupLmlqXph4/op6PlhrPlkIzmraXpl67popgKcHRocmVhZF9tdXRleF90IG11dGV4dDsKLy8g5Yib5bu65p2h5Lu25Y+Y6YePCnB0aHJlYWRfY29uZF90IGNvbmQ7CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KLy8g5Yib5bu65Lik5Liq5L+h5Y+36YePCnNlbV90IHBzZW07CnNlbV90IGNzZW07CnN0cnVjdCBOb2RlIHsKICAgIGludCBudW07CiAgICBzdHJ1Y3QgTm9kZSogbmV4dDsKfTsKLy8g5aS06IqC54K5CnN0cnVjdCBOb2RlKiBoZWFkID0gTlVMTDsKCnZvaWQqIHByb2R1Y2VyICh2b2lkKiBhcmcpIHsKICAgIHdoaWxlKDEpIHsKICAgICAgICAvLyDkuI3mlq3lnLDliJvlu7rmlrDnmoToioLngrnlubbmt7vliqDliLDpk77ooajlvZPkuK0KICAgICAgICBzZW1fd2FpdCgmcHNlbSk7CiAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CiAgICAgICAgc3RydWN0IE5vZGUqIG5ld19ub2RlID0gKHN0cnVjdCBOb2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBOb2RlKSk7CiAgICAgICAgbmV3X25vZGUtPm5leHQgPSBoZWFkOwogICAgICAgIGhlYWQgPSBuZXdfbm9kZTsKICAgICAgICBuZXdfbm9kZS0+bnVtID0gcmFuZCgpICUgMTAwMDsKICAgICAgICBwcmludGYoImFkZCBub2RlLCBudW0gJWQsIHRpZDogJWxkXG4iLCBuZXdfbm9kZS0+bnVtLCBwdGhyZWFkX3NlbGYoKSk7CiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKICAgICAgICAvLyDpgJrnn6XmtojotLnogIXnlJ/kuqflh7rkuobkuIDkuKrkuqflk4EKICAgICAgICBzZW1fcG9zdCgmY3NlbSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQp2b2lkKiBjb25zdW1lciAodm9pZCogYXJnKSB7CiAgIHdoaWxlKDEpIHsKICAgICAgICBzZW1fd2FpdCgmY3NlbSk7CiAgICAgICAgIC8vIOS/neWtmOWktOe7k+eCueeahOaMh+mSiAogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwogICAgICAgIHN0cnVjdCBOb2RlKiB0bXAgPSBoZWFkOwogICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OwogICAgICAgIHByaW50ZigiZGVsZXRlIG5vZGUsIG51bTogJWQsIHRpZDogJWxkXG4iLCB0bXAtPm51bSwgcHRocmVhZF9zZWxmKCkpOwogICAgICAgIGZyZWUodG1wKTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwogICAgICAgIC8vIOmAmuefpeeUn+S6p+iAheWPr+S7peWGjeeUn+S6p+S4gOS4qgogICAgICAgIHNlbV9wb3N0KCZwc2VtKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CiNpbmNsdWRlPGFycGEvaW5ldC5oPgojaW5jbHVkZTxiaXRzL3NvY2tldC5oPgp2b2lkIHJlY3lsZV9jaGlsZChpbnQgYXJnKSB7CiAgICB3aGlsZSgxKSB7CiAgICAgICAgaW50IHJldCA9IHdhaXRwaWQoLTEsIE5VTEwsIFdOT0hBTkcpOwogICAgICAgIGlmICgtMSA9PSByZXQpIHsKICAgICAgICAgICAgLy8g5omA5pyJ55qE5a2Q6L+b56iL6YO95Zue5pS25a6M5q+VCiAgICAgICAgICAgIHByaW50Zigi5omA5pyJ55qE5a2Q6L+b56iL5Zue5pS25a6M5q+VXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAvLyDor7TmmI7ov5jmnInlrZDov5vnqIvmtLvnnYAKICAgICAgICAgICAgLy8g562J5b6F5LiL5LiA5qyh5L+h5Y+36L+b5p2lCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgewogICAgICAgICAgICAvLyDov5vnqIvooqvlm57mlLbkuoYKICAgICAgICAgICAgcHJpbnRmKCLlrZDov5vnqIslZOiiq+WbnuaUtuS6hlxuIiwgcmV0KTsKICAgICAgICB9CiAgICB9Cn0KI2luY2x1ZGU8ZXJybm8uaD4KI2luY2x1ZGU8Y3R5cGUuaD4KI2luY2x1ZGU8Y3R5cGUuaD4KI2luY2x1ZGU8Y3R5cGUuaD4KI2luY2x1ZGU8c3lzL3NlbGVjdC5oPgojaW5jbHVkZTxwb2xsLmg+CiNpbmNsdWRlPHN5cy9lcG9sbC5oPgppbnQgbWFpbigpCnsKICAgIC8vIOe7hOaSreWSjOW5v+aSreW3ruS4jeWkmu+8jOWwseaYr+mcgOimgeiuvue9ruS4gOS4que7hOaSree7hAogICAgLy8g5a6i5oi356uv5Yqg5YWl5Yiw5aSa5pKt57uECiAgICAvLyBsZXZlbDogICAgICBJUFBST1RPX0lQCiAgICAvLyBvcHRuYW1lOiAgICBJUF9BRERfTUVNQkVSU0hJUAogICAgLy8gb3B0dmFsOiAgICAgc3RydWN0IG1yZXFuCiAgICBpbnQgZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgMCk7CiAgICBpZiAoLTEgPT0gZmQpIHsKICAgICAgICBwZXJyb3IoIuiNieaLn+WQl3NvY2tldCIpOwogICAgICAgIGV4aXQoLTEpOwogICAgfQogICAgLy8g6K6+572u5aSa5pKt5bGe5oCn77yM6K6+572u5aSW5Ye65o6l5Y+jCiAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfbXVsdGlhZGRyOwogICAgLy8g5Yid5aeL5YyW5aSa5pKt5Zyw5Z2ACiAgICBpbmV0X3B0b24oQUZfSU5FVCwgIjIzOS4wLjAuMSIsICZpbXJfbXVsdGlhZGRyLnNfYWRkcik7CiAgICBzZXRzb2Nrb3B0KGZkLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfSUYsICZpbXJfbXVsdGlhZGRyLCBzaXplb2YoaW1yX211bHRpYWRkcikpOwoKCiAgICAvLyDliJ3lp4vljJblrqLmiLfnq6/lnLDlnYDkv6Hmga8KICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwogICAgYWRkci5zaW5fZmFtaWx5ICA9QUZfSU5FVDsKICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyg5OTk5KTsKICAgIGluZXRfcHRvbihBRl9JTkVULCAiMjM5LjAuMC4xIiwgJmFkZHIuc2luX2FkZHIuc19hZGRyKTsKCiAgICBpbnQgbnVtID0gMDsKICAgIHdoaWxlKDEpIHsKICAgICAgICAvLyBjaGFyIHJlY3ZidWZbMTI4XTsKICAgICAgICAvLyBjaGFyIGlwX2J1ZlsxNl07CiAgICAgICAgLy8gc3RydWN0IHNvY2thZGRyX2luIGNsaWFkZHI7CiAgICAgICAgLy8gaW50IGxlbiA9IHNpemVvZihjbGlhZGRyKTsKICAgICAgICAvLyBpbnQgbnVtID0gcmVjdmZyb20oZmQsIHJlY3ZidWYsIHNpemVvZihyZWN2YnVmKSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbGlhZGRyLCAoc29ja2xlbl90KikmbGVuKTsKICAgICAgICAvLyBpZiAoLTEgPT0gbnVtKSB7CiAgICAgICAgLy8gICAgIHBlcnJvcigi6I2J5ouf5ZCXcmVjdmZyb20iKTsKICAgICAgICAvLyAgICAgZXhpdCgtMSk7CiAgICAgICAgLy8gfQogICAgICAgIC8vIHByaW50Zigi5a6i5oi356uvSVDvvJolcywg56uv5Y+j77yaJWRcbiIsIAogICAgICAgIC8vICAgICBpbmV0X250b3AoQUZfSU5FVCwgJmNsaWFkZHIuc2luX2FkZHIuc19hZGRyLCBpcF9idWYsIHNpemVvZihpcF9idWYpKSwgCiAgICAgICAgLy8gICAgIG50b2hzKGNsaWFkZHIuc2luX3BvcnQpCiAgICAgICAgLy8gICAgICk7CiAgICAgICAgLy8gcHJpbnRmKCLmjqXmlLbliLDnmoTmlbDmja7vvJolc1xuIiwgcmVjdmJ1Zik7CiAgICAgICAgY2hhciBzZW5kYnVmWzEyOF07CiAgICAgICAgc3ByaW50ZihzZW5kYnVmLCJIZWxsbyDkuLTmvbwlZFxuIiwgbnVtKyspOwoKICAgICAgICAvLyDlj5HpgIHmlbDmja4KICAgICAgICBzZW5kdG8oZmQsIHNlbmRidWYsIHN0cmxlbihzZW5kYnVmKSsxLCAwLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7CiAgICAgICAgcHJpbnRmKCLnu4Tmkq3nmoTmlbDmja4lc1xuIiwgc2VuZGJ1Zik7CiAgICAgICAgc2xlZXAoMSk7CiAgICB9CiAgICBjbG9zZShmZCk7CiAgICByZXR1cm4gMDsKfQovLyAgICAgLy8g6K6+572u5bm/5pKt5bGe5oCnCi8vICAgICAvLyBzZXRzb2Nrb3B0Ci8vICAgICAvLyBsZXZlbDogU09MX1NPQ0tFVAovLyAgICAgLy8gb3B0bmFtZTogU09fQlJPQURDQVNUCi8vICAgICAvLyBvcHR2YWw6IGludOexu+Wei+eahOWAvOOAgjHooajnpLrlub/mkq0KLy8gICAgIC8vIG9wdGxlbjogb3B0dmFsdWXnmoTlpKflsI8KCi8vICAgICAvLyDlub/mkq3nmoTlrp7njrAKLy8gICAgIC8vIFVEUAovLyAgICAgLy8gc2VuZHRvCi8vICAgICAvLyByZWNlaXZlX2Zyb20KLy8gICAgIGludCBmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKLy8gICAgIGlmICgtMSA9PSBmZCkgewovLyAgICAgICAgIHBlcnJvcigi6I2J5ouf5ZCXc29ja2V0Iik7Ci8vICAgICAgICAgZXhpdCgtMSk7Ci8vICAgICB9Ci8vICAgICAvLyDorr7nva7lub/mkq3lsZ7mgKcKLy8gICAgIGludCBvcCA9IDE7Ci8vICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19CUk9BRENBU1QsICZvcCwgc2l6ZW9mKG9wKSk7CgoKLy8gICAgIC8vIOWIm+W7uuS4gOS4quW5v+aSreeahOWcsOWdgAovLyAgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Ci8vICAgICBhZGRyLnNpbl9mYW1pbHkgID1BRl9JTkVUOwovLyAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKDk5OTkpOwovLyAgICAgaW5ldF9wdG9uKEFGX0lORVQsICIxOTIuMTY4LjEwLjI1NSIsICZhZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci8vICAgICAvLyDkvb/nlKjlub/mkq3nmoTml7blgJnvvIzmnI3liqHnq6/kuI3pnIDopoHnu5HlrpoKLy8gICAgIC8vIGludCByZXQgPSBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7Ci8vICAgICAvLyBpZiAoLTEgPT0gcmV0KSB7Ci8vICAgICAvLyAgICAgcGVycm9yKCLojYnmi5/lkJdiaW5kIik7Ci8vICAgICAvLyAgICAgZXhpdCgtMSk7Ci8vICAgICAvLyB9Ci8vICAgICAvLyDpgJrkv6EKLy8gICAgIGludCBudW0gPSAwOwovLyAgICAgd2hpbGUoMSkgewovLyAgICAgICAgIC8vIGNoYXIgcmVjdmJ1ZlsxMjhdOwovLyAgICAgICAgIC8vIGNoYXIgaXBfYnVmWzE2XTsKLy8gICAgICAgICAvLyBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpYWRkcjsKLy8gICAgICAgICAvLyBpbnQgbGVuID0gc2l6ZW9mKGNsaWFkZHIpOwovLyAgICAgICAgIC8vIGludCBudW0gPSByZWN2ZnJvbShmZCwgcmVjdmJ1Ziwgc2l6ZW9mKHJlY3ZidWYpLCAwLCAoc3RydWN0IHNvY2thZGRyICopJmNsaWFkZHIsIChzb2NrbGVuX3QqKSZsZW4pOwovLyAgICAgICAgIC8vIGlmICgtMSA9PSBudW0pIHsKLy8gICAgICAgICAvLyAgICAgcGVycm9yKCLojYnmi5/lkJdyZWN2ZnJvbSIpOwovLyAgICAgICAgIC8vICAgICBleGl0KC0xKTsKLy8gICAgICAgICAvLyB9Ci8vICAgICAgICAgLy8gcHJpbnRmKCLlrqLmiLfnq69JUO+8miVzLCDnq6/lj6PvvJolZFxuIiwgCi8vICAgICAgICAgLy8gICAgIGluZXRfbnRvcChBRl9JTkVULCAmY2xpYWRkci5zaW5fYWRkci5zX2FkZHIsIGlwX2J1Ziwgc2l6ZW9mKGlwX2J1ZikpLCAKLy8gICAgICAgICAvLyAgICAgbnRvaHMoY2xpYWRkci5zaW5fcG9ydCkKLy8gICAgICAgICAvLyAgICAgKTsKLy8gICAgICAgICAvLyBwcmludGYoIuaOpeaUtuWIsOeahOaVsOaNru+8miVzXG4iLCByZWN2YnVmKTsKLy8gY2hhciBzZW5kYnVmWzEyOF07Ci8vIHNwcmludGYoc2VuZGJ1ZiwiSGVsbG8g5Li05r28JWRcbiIsIG51bSsrKTsKCi8vICAgICAgICAgLy8g5Y+R6YCB5pWw5o2uCi8vICAgICAgICAgc2VuZHRvKGZkLCBzZW5kYnVmLCBzdHJsZW4oc2VuZGJ1ZikrMSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwovLyAgICAgICAgIHByaW50Zigi5bm/5pKt55qE5pWw5o2uXG4iKTsKLy8gICAgICAgICBzbGVlcCgxKTsKLy8gICAgIH0KLy8gICAgIGNsb3NlKGZkKTsKLy8gICAgIHJldHVybiAwOwoKLy8gfQoKLy8gLy8gICAgIC8vIHNlbmR0bwovLyAvLyAgICAgLy8gcmVjZWl2ZV9mcm9tCi8vIC8vICAgICBpbnQgZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgMCk7Ci8vIC8vICAgICBpZiAoLTEgPT0gZmQpIHsKLy8gLy8gICAgICAgICBwZXJyb3IoIuiNieaLn+WQl3NvY2tldCIpOwovLyAvLyAgICAgICAgIGV4aXQoLTEpOwovLyAvLyAgICAgfQovLyAvLyAgICAgLy/nu5HlrpoKLy8gLy8gICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwovLyAvLyAgICAgYWRkci5zaW5fZmFtaWx5ICA9QUZfSU5FVDsKLy8gLy8gICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKLy8gLy8gICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyg5OTk5KTsKCgovLyAvLyAgICAgaW50IHJldCA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKLy8gLy8gICAgIGlmICgtMSA9PSByZXQpIHsKLy8gLy8gICAgICAgICBwZXJyb3IoIuiNieaLn+WQl2JpbmQiKTsKLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gICAgIH0KLy8gLy8gICAgIC8vIOmAmuS/oQovLyAvLyAgICAgd2hpbGUoMSkgewovLyAvLyAgICAgICAgIGNoYXIgcmVjdmJ1ZlsxMjhdOwovLyAvLyAgICAgICAgIGNoYXIgaXBfYnVmWzE2XTsKLy8gLy8gICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpYWRkcjsKLy8gLy8gICAgICAgICBpbnQgbGVuID0gc2l6ZW9mKGNsaWFkZHIpOwovLyAvLyAgICAgICAgIGludCBudW0gPSByZWN2ZnJvbShmZCwgcmVjdmJ1Ziwgc2l6ZW9mKHJlY3ZidWYpLCAwLCAoc3RydWN0IHNvY2thZGRyICopJmNsaWFkZHIsIChzb2NrbGVuX3QqKSZsZW4pOwovLyAvLyAgICAgICAgIGlmICgtMSA9PSBudW0pIHsKLy8gLy8gICAgICAgICAgICAgcGVycm9yKCLojYnmi5/lkJdyZWN2ZnJvbSIpOwovLyAvLyAgICAgICAgICAgICBleGl0KC0xKTsKLy8gLy8gICAgICAgICB9Ci8vIC8vICAgICAgICAgcHJpbnRmKCLlrqLmiLfnq69JUO+8miVzLCDnq6/lj6PvvJolZFxuIiwgCi8vIC8vICAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVULCAmY2xpYWRkci5zaW5fYWRkci5zX2FkZHIsIGlwX2J1Ziwgc2l6ZW9mKGlwX2J1ZikpLCAKLy8gLy8gICAgICAgICAgICAgbnRvaHMoY2xpYWRkci5zaW5fcG9ydCkKLy8gLy8gICAgICAgICAgICAgKTsKLy8gLy8gICAgICAgICBwcmludGYoIuaOpeaUtuWIsOeahOaVsOaNru+8miVzXG4iLCByZWN2YnVmKTsKCi8vIC8vICAgICAgICAgLy8g5Y+R6YCB5pWw5o2uCi8vIC8vICAgICAgICAgc2VuZHRvKGZkLCByZWN2YnVmLCBzdHJsZW4ocmVjdmJ1ZikrMSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbGlhZGRyLCBsZW4pOwovLyAvLyAgICAgfQovLyAvLyAgICAgY2xvc2UoZmQpOwovLyAvLyAgICAgcmV0dXJuIDA7Ci8vIC8vIH0KLy8gLy8gICAgIC8vIGVwb2xs55qE5bel5L2c5qih5byPCi8vIC8vICAgICAvLyBsdCAgbGV2ZWwgdHJpZ2dlciAg5rC05bmz6Kem5Y+R5qih5byPCi8vIC8vICAgICAvLyBldCAgZWRnZSB0cmlnZ2VyIOi+uee8mOinpuWPkQovLyAvLyAgICAgLy8gbHTmqKHlvI/mmK/pu5jorqTnmoQKLy8gLy8gICAgIC8vIGV05piv6auY6YCf5bel5L2c5pa55byPCi8vIC8vICAgICAvLyDliY3ogIXkvJrkuIDnm7TpgJrnn6XvvIzlkI7ogIXlj6rkvJrpgJrnn6XkuIDmrKHvvIzlpoLmnpzkvaDnvJPlhrLljLrph4zpnaLnmoTmlbDmja7msqHor7vlrozvvIzkuZ/kuI3kvJrlho3pgJrnn6XkuoYKLy8gLy8gICAgIC8vIOWQjuiAheavlOi+g+mrmOaViO+8jOS9huaYr+mcgOimgeino+WGs3JlYWTpmLvloZ7nmoTpl67popgKCiAgICAKLy8gLy8gICAgIC8qKgovLyAvLyAgKiBlcG9sbOeahOWOn+eQhgovLyAvLyAgKiBlcG9sbF9jcmVhdGUoKeWHveaVsOS8muWcqOWGheaguOWMuuWIhumFjeS4gOWdl+WGheWtmAovLyAvLyAgKiBlcG9sbC0+ZXZlbnQgcG9sbAovLyAvLyAgKiDov5Tlm57lgLzmmK/kuIDkuKrmlofku7bmj4/ov7DnrKYKLy8gLy8gICogc3RydWN0IGV2ZW50cG9sbCB7Ci8vIC8vICAqICAuLi4KLy8gLy8gICogIHN0cnVjdCByYl9yb290IHJicjsgLy/nuqLpu5HmoJEKLy8gLy8gICogIHN0cnVjdCBsaXN0X2hlYWQgcmRsaXN0OyAvLyByZWFkeSBsaXN0Ci8vIC8vICAqICAuLi4KLy8gLy8gICogfQovLyAvLyAgKiDnm7TmjqXmk43kvZzlhoXmoLjmgIHnmoTmlbDmja7vvIzkuI3nlKjku47nlKjmiLfmgIHlkozlhoXmoLjmgIHmnaXlm57liIfmjaLkuoYKLy8gLy8gICogCi8vIC8vICAqIGVwb2xsY3RsIAovLyAvLyAgKiAKLy8gLy8gICog55u05o6l5Zyo5YaF5qC45Lit5byA6L6f5LiA5Z2X5YaF5a2Y77yM5bCx5LiN55So5p2l5Zue5YiH5o2i5LqGCi8vIC8vICAqIOaPkOmrmOaViOeOhwovLyAvLyAgKiDnuqLpu5HmoJEgICDkuIDnp43pq5jmlYjnmoTmlbDmja7nu5PmnoQKLy8gLy8gICogCi8vIC8vICAqIOS5i+WJjeaYr+e6v+aAp+aVsOe7hOe7k+aehO+8jOeOsOWcqOaYr+e6oum7keagkee7k+aehAovLyAvLyAgKiAKLy8gLy8gICogZXBvbGxfY3RsKGVwZmQsIEVQT0xMX0NUTF9BREQsIGxmZCwgJmV2KTsKLy8gLy8gICogCi8vIC8vICAqIOesrOS4gOS4quWPguaVsOaYr2NyZWF0ZeaWueazleeahOi/lOWbnuWAvAovLyAvLyAgKiBFUE9MTF9DVExfQUREIOihqOekuui/m+ihjOa3u+WKoOaTjeS9nAovLyAvLyAgKiBsZmTmmK/opoHmo4DmtYvnmoTmj4/ov7DnrKYKLy8gLy8gICog56ys5Zub5Liq5Y+C5pWwZXbvvIzlp5TmiZjlhoXmoLjmo4DmtYvnmoTkuovku7YKLy8gLy8gICogCi8vIC8vICAqIHN0cnVjdCBlcG9sbF9ldmVudCBldjsKLy8gLy8gICogZXYuZXZlbnRzID0gRVBPTExJTiAvLyDor7vkuovku7YKLy8gLy8gICogZXYuZGF0YS5mZCA9IGxmZCAvLyDopoHmo4DmtYvnmoTmlofku7bmj4/ov7DnrKbnmoTmjIcKLy8gLy8gICogCi8vIC8vICAqIGVwb2xsX3dhaXQoZXBmZCkgLy8g6K+l5pa55rOV5Lya5bCGcmRsaXN05Lit55qE5pWw5o2u5ou36LSd5Zue55So5oi35oCBCi8vIC8vICAqIGZvciAoKXsKLy8gLy8gICogIAovLyAvLyAgKiB9Ci8vIC8vICAqIAovLyAvLyAgKiDnm7TmjqXpgY3ljobov5Tlm57nmoTmlbDmja7lsLHooYzkuobvvIzov5Tlm57nmoTnu5PmnpzmmK/lhbfkvZPlk6rlh6DkuKroioLngrnnmoTnirbmgIHlj5HnlJ/kuobmlLnlj5gKLy8gLy8gICogCi8vIC8vICAqIHJkbGlzdOaYr+S4gOS4quWPjOmTvuihqAovLyAvLyAgKiAKLy8gLy8gICogCi8vIC8vICAqIAovLyAvLyAgKi8KLy8gLy8gLy8g5Yib5bu65LiA5Liq5paw55qEZXBvbGzlrp7kvovvvIzlnKjlhoXmoLjkuK3liJvlu7rkuIDkuKrmlbDmja7vvIzov5nkuKrkuK3mnInkuKTkuKrmr5TovoPph43opoHnmoTmiJDlkZgKLy8gLy8gLy8g5LiA5Liq5piv6ZyA6KaB5qOA5rWL5paH5Lu25o+P6L+w56ym55qE5pWw5o2u77yI57qi6buR5qCR77yJ77yM5Y+m5LiA5Liq5piv5bCx5bqP5YiX6KGo77yM55So5LqO5a2Y5pS+5pWw5o2u5Y+R55Sf5pS55Y+Y55qE5paH5Lu25o+P6L+w56ym6ZuG5ZCI77yI5Y+M5ZCR6ZO+6KGo77yJCgovLyAvLyAvLyDlj4LmlbAgc2l6ZSDnm67liY3or6Xlj4LmlbDmmK/msqHmnInmhI/kuYnnmoTvvIzpmo/kvr/lhpnkuIDkuKrmlbDlsLHooYzvvIjpnZ4w77yJCgovLyAvLyAvLyDov5Tlm57lgLwgICA+MCDooajnpLrmlofku7bmj4/ov7DnrKbvvIzmmK/nlKjkuo7mk43kvZxlcG9sbOWunuS+i+eahCAgICAg5aSx6LSl6L+U5ZueLTEKCgoKLy8gLy8gLy8gIGludCByZXQgPSBlcG9sbF9jcmVhdGUoaW50IHNpemUpOwovLyAvLyAvLyDlr7llcG9sbOWunuS+i+i/m+ihjOeuoeeQhgovLyAvLyAvLyBlcG9sbF9jdGzvvIhpbnQgZXBmZCwgaW50IG9wLCBpbnQgZmQgLCBzdHJ1Y3QgZXBvbGxfZW5ldnQqIGV2ZW5077yJCi8vIC8vIC8vIGVwb2xsX2N0bF9hZGQgIGVwb2xsX2N0bF9tb2QgICBlcG9sbF9jdGxfZGVsCi8vIC8vIC8vIGZkICDluLjop4HnmoRlcG9sbOajgOa1i+S6i+S7tiAgIGVwb2xsSU4gIGVwb2xsb3V0IGVwb2xsZXJyCi8vIC8vIC8vIGVwb2xsX2N0bCAgIOa3u+WKoOaWh+S7tuaPj+i/sOespuS/oeaBryAgIOWIoOmZpCAg5L+u5pS5562J55qECi8vIC8vIC8vIOS/ruaUue+8jOWPr+S7peS/ruaUueimgeajgOa1i+eahOS6i+S7tu+8jOavlOWmguS7peWJjeimgeajgOa1i+ivu++8jOaIkeS7rOWPr+S7peS/ruaUueS4uuajgOa1i+WGmQovLyAvLyAgICAgLy8gCiAgICAKLy8gLy8gICAgIC8vIOajgOa1i+WHveaVsAovLyAvLyAgICAgLy8gZXBvbGzigJTigJR3YWl077yJ77yIaW50IGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnRzLCBpbnQgbWF4ZXZlbnRzLCBpbnQgdGltZW91dHPvvInigJQKLy8gLy8gICAgIC8vZXBmZCAgICAgICBlcG9sbOWunuS+i+WvueW6lOeahOaWh+S7tuaPj+i/sOespgovLyAvLyAvLyBldmVudHPkvKDlh7rlj4LmlbAgICDvvIzph4zpnaLkv53lrZjnmoTmnInlj5HnlJ/kuoblj5jljJbnmoTmlofku7bmj4/ov7DnrKbkv6Hmga/vvIjlk6rlh6DkuKrlj5HnlJ/kuoblj5jljJbvvIzlsLHov5Tlm57lk6rlh6DkuKrvvIkKLy8gLy8gLy8gbWF4ZXZlbnRzICAg56ys5LqM5Liq5Y+C5pWw57uT5p6E5L2T5pWw57uE55qE5aSn5bCPCi8vIC8vIC8vIHRpbWVvdXTpmLvloZ7ml7bpl7QgICAgIDDooajnpLrkuI3pmLvloZ7jgIItMeihqOekuumYu+WhniAgIOebtOWIsOajgOa1i+WIsGZk5pWw5o2u5Y+R55Sf5Y+Y5YyWICDlsLHkvJrop6PpmaTpmLvloZ4KCi8vIC8vIC8vICDjgIswIOihqOekuumYu+WhnueahOaXtumVv++8iOWNleS9jeaYr+avq+enku+8iQovLyAvLyAvLyDov5Tlm57lgLzvvIzov5Tlm57lj5HnlJ/lj5jljJbnmoTmlofku7bmj4/ov7DnrKbnmoTkuKrmlbAKCgovLyAvLyAvLyAvLyAKLy8gLy8gLy8gLy8gIOWIm+W7unNvY2tldAovLyAvLyAvLyAgICAgaW50IGxmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci8vIC8vIC8vICAgICBpZiAoLTEgPT0gbGZkKSB7Ci8vIC8vIC8vIAkJcGVycm9yKCJzb2NrZXQiKTsKLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gICAgIH0KCi8vIC8vIC8vICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7Ci8vIC8vIC8vICAgICBzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLy8gLy8gLy8gICAgIHNlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7Ci8vIC8vIC8vICAgICBzZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKDk5OTkpOwoKLy8gLy8gLy8gICAgIC8vIGludCBvcHRfdmFsID0gMTsKLy8gLy8gLy8gICAgIC8vIHNldHNvY2tvcHQobGZkLCBTT0xfU09DS0VULCBTT19SRVVTRVBPUlQsICZvcHRfdmFsLCBzaXplb2Yob3B0X3ZhbCkpOwovLyAvLyAvLyAgICAgLy8g57uR5a6aCi8vIC8vIC8vICAgICBpbnQgcmV0ID0gYmluZChsZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzZXJ2ZXJfYWRkciwgc2l6ZW9mKHNlcnZlcl9hZGRyKSk7Ci8vIC8vIC8vICAgICBpZiAoLTEgPT0gcmV0KSB7Ci8vIC8vIC8vICAgICAgICAgcGVycm9yKCJiaW5kIik7Ci8vIC8vIC8vICAgICAgICAgZXhpdCgtMSk7Ci8vIC8vIC8vICAgICB9Ci8vIC8vIC8vIAkvLyDnm5HlkKwKLy8gLy8gLy8gICAgIHJldCA9IGxpc3RlbihsZmQsIDEyOCk7Ci8vIC8vIC8vICAgICBpZiAoLTEgPT0gcmV0KSB7Ci8vIC8vIC8vICAgICAgICAgcGVycm9yKCJsaXN0ZW4iKTsKLy8gLy8gLy8gICAgICAgICBleGl0KC0xKTsKLy8gLy8gLy8gICAgIH0gCgovLyAvLyAvLyAgICAgLy8g6LCD55SoZXBvbGxfY3JlYXRlKCnliJvlu7rkuIDkuKplcG9sbOWunuS+iwovLyAvLyAvLyAgICAgaW50IGVwZmQgPSBlcG9sbF9jcmVhdGUoMTAwKTsKLy8gLy8gLy8gICAgIC8vIOWwhuebkeWQrOeahOaWh+S7tuaPj+i/sOespuebuOWFs+S/oeaBr+a3u+WKoOWIsGVwb2xs5a6e5L6L5b2T5LitCi8vIC8vIC8vICAgICBzdHJ1Y3QgIGVwb2xsX2V2ZW50IGVwZXY7Ci8vIC8vIC8vICAgICBlcGV2LmV2ZW50cyA9IEVQT0xMSU47Ci8vIC8vIC8vICAgICBlcGV2LmRhdGEuZmQgPSBsZmQ7CiAgICAKLy8gLy8gLy8gICAgIGVwb2xsX2N0bChlcGZkLCBFUE9MTF9DVExfQURELCBsZmQsICZlcGV2KTsKCiAgICAKLy8gLy8gLy8gICAgIHN0cnVjdCAgZXBvbGxfZXZlbnQgZXBldnNbMTAyNF0gPSB7MH07CgovLyAvLyAvLyAgICAgd2hpbGUoMSl7Ci8vIC8vIC8vICAgICAgICAgcHJpbnRmKCLov5Tlm57lvqrnjq9cbiIpOwovLyAvLyAvLyAgICAgICAgIC8vIOiwg+eUqGVwb2xs4oCU4oCUd2F0aeajgOa1i+aWh+S7tuaPj+i/sOespueahOWPmOWMlgovLyAvLyAvLyAgICAgICAgIGludCB0cmV0dCA9ZXBvbGxfd2FpdChlcGZkLCBlcGV2cywxMDI0LC0xKTsKLy8gLy8gLy8gICAgICAgICBpZiAoLTEgPT10cmV0dCkgewovLyAvLyAvLyAgICAgICAgICAgICBwZXJyb3IoImVwb2xsX3dhaXQiKTsKLy8gLy8gLy8gICAgICAgICAgICAgZXhpdCgtMSk7Ci8vIC8vIC8vICAgICAgICAgfQoKLy8gLy8gLy8gICAgICAgICAvLyDlj5HnlJ/mlLnlj5jnmoTkuKrmlbAKLy8gLy8gLy8gICAgICAgICBwcmludGYoImVwb2xsX3dhaXTlh73mlbDnmoTov5Tlm57lgLwgcmV0ID0gJWRcbiIsIHRyZXR0KTsKLy8gLy8gLy8gICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZXR0OyBpKyspCi8vIC8vIC8vICAgICAgICAgeyAgIAovLyAvLyAvLyAgICAgICAgICAgICBpbnQgY3VyZmQgPSBlcGV2c1tpXS5kYXRhLmZkOwoKLy8gLy8gLy8gICAgICAgICAgICAgaWYoY3VyZmQ9PWxmZCkgewovLyAvLyAvLyAgICAgICAgICAgICAgICAgLy8g6KGo56S65pyJ5paw55qE5a6i5oi356uv6L+e5o6l6L+b5p2l5LqG77yIbGlzdGVu55qEbGZk77yJCi8vIC8vIC8vICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpZW50X2FkZHI7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICBpbnQgbGVuID0gc2l6ZW9mKGNsaWVudF9hZGRyKTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIGludCBjZmQgPSBhY2NlcHQobGZkLCAoc3RydWN0IHNvY2thZGRyKikmY2xpZW50X2FkZHIsICZsZW4pOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgcHJpbnRmKCLmlrDnmoTlrqLmiLfnq6/ov5vmnaXkuoZcbiIpOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgY2hhciBjbGllbnRfaXBbMTZdOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQsICZjbGllbnRfYWRkci5zaW5fYWRkci5zX2FkZHIsIGNsaWVudF9pcCwgc2l6ZW9mKGNsaWVudF9pcCkpOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY2xpZW50X3BvcnQgPSBudG9ocyhjbGllbnRfYWRkci5zaW5fcG9ydCk7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICBwcmludGYoIuWuouaIt+err0lQ77yaJXNcbuerr+WPo++8miVkXG4iLCBjbGllbnRfaXAsIGNsaWVudF9wb3J0KTsKLy8gLy8gLy8gICAgICAgICAgICAgICAgIGlmICgtMSA9PSBjZmQpIHsKLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBpZiAoRUlOVFIgPT0gZXJybm8gKSB7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIH0KLy8gLy8gLy8gICAgICAgICAgICAgICAgICAgICBwZXJyb3IoImFjY2VwdCIpOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgICAgIGV4aXQoLTEpOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgfQovLyAvLyAvLyAgICAgICAgICAgICAgICAgLy8g6L+95Yqg5paH5Lu25o+P6L+w56ymCi8vIC8vIC8vICAgICAgICAgICAgICAgICBlcGV2LmV2ZW50cz1FUE9MTElOfEVQT0xMRVQ7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICBlcGV2LmRhdGEuZmQ9Y2ZkOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgZXBvbGxfY3RsKGVwZmQsIEVQT0xMX0NUTF9BREQsY2ZkLCZlcGV2KTsKLy8gLy8gLy8gICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIAovLyAvLyAvLyAgICAgICAgICAgICAgICAgaWYgKGVwZXZzW2ldLmV2ZW50cyAmRVBPTExPVVQpIGNvbnRpbnVlOwovLyAvLyAvLyAgICAgICAgICAgICAgICAgLy8g5pyJ5pWw5o2u5Yiw6L6+Ci8vIC8vIC8vICAgICAgICAgICAgICAgICBwcmludGYoIuacieaVsOaNrui/m+adpVxuIik7Ci8vIC8vIC8vICAgICAgICAgICAgICAgICAvLyDor7TmmI7ov5nkuKrmlofku7bmj4/ov7DnrKblr7nlupTnmoTnvJPlhrLljLrmnaXmlbDmja7kuoYKLy8gLy8gLy8gICAgICAgICAgICAgICAgIC8vIOS4gOasoeWPquiDveivu+WPljXkuKrlrZfoioLnmoTmlbDmja4KLy8gLy8gLy8gICAgICAgICAgICAgICAgIC8vIOS4jeefpemBk+S4uuWVpeOAguS7luaAu+aYr+WQp+S5i+WJjei+k+WHuueahOWuouaIt+err0lQ5byE5YiwYnVm57yT5Yay5Yy65Lit77yM5Zug5q2k5oiR5Y+q5aW95aSa5Yid5aeL5YyW5LiA5Liq5a2X6IqCCi8vIC8vIC8vICAgICAgICAgICAgICAgICAvLyDov5nmoLflsLHkuI3kvJror7vliLDlpJrkvZnnmoTmlbDmja7kuoYKLy8gLy8gLy8gICAgICAgICAgICAgICAgIGNoYXIgY