ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJhdHV0aWxzL2F0X3V0aWxzLmMgYi9hcC9saWIvbGliYXR1dGlscy9hdF91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwYjY0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9saWIvbGliYXR1dGlscy9hdF91dGlscy5jCkBAIC0wLDAgKzEsMTA1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvLw0KKy8vwKnVuWF0w/zB7rmkvt+8r6Os08PT2sn6s8m6zb3izvbAqdW5YXTD/MHuDQorLy+2r9f3x+vH86O6YXQreHg9eXksenpcclxuDQorLy+y6dGvx+vH8zogYXQreHg/IFxyXG4NCisvL9b3tq/Jz7GoOiBcclxuK3h4Onl5LHp6XHJcbg0KKy8vveG5+8Lro7pcclxub2s6MlxyXG4NCisvLyAgICAgICAgXHJcbmVycm9yOnd3XHJcbg0KKy8vsbjXoqO6xuTW0KOseHjOqkFUw/zB7sP7o7t5ec6qss7K/TG1xNa1o6x6es6qss7K/TK1xNa1o7t3d86qvt/M5bXEtO3O88Lr1rWjrMjnufvDu9PQtO3O88Lro6zErMjPzqowLg0KKy8vICAgDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjaW5jbHVkZSAiYXRfdXRpbHMuaCINCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRlICJ6eGljX2Vycm5vLmgiDQorI2luY2x1ZGUgImF0X21zZy5oIg0KKyNpbmNsdWRlICJzb2Z0YXBfbG9nLmgiDQorI2luY2x1ZGUgPGN0eXBlLmg+DQorI2luY2x1ZGUgPHN5cy90aW1lLmg+DQorI2luY2x1ZGUgPHRlcm1pb3MuaD4NCisNCisjZGVmaW5lIERJRkZfVkFMVUUgKCdhJy0nQScpDQorI2RlZmluZSBBVF9QQVJBTV9NQVhfTlVNICAoNTApDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvLw0KKy8vyfqzyWF0tq/X98frx/PD/MHuLNK7sOPU2mFwcF9jbHRfb3BzX3TW0LX308OjrLj5vt3P+8+ixNrI3aOsyfqzydfu1tW1xGF0x+vH88P8we4NCisvL8n6s8lhdMfrx/PD/MHuyrGjrLHY0OvNqLn9bWFsbG9jyerH68q508O1xMTatOajrLKit7W72LjD1rjV67j4zeKy47X308O6r8r9yrnTw6OsDQorLy/X7tbV08nN4rLjtffTw7qvyv3KzbfFuMPE2rTmDQorLy9pbnB1dDogIGNtZCAgInh4Ig0KKy8vICAgICAgICAgICBwYXJhbSAgICAieXksenoiDQorLy9vdXRwdXQ6ICAgYXQreHg9eXksenpcclxuDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitjaGFyKiBhdF9hY3RfYnVpbGQoY2hhciogY21kLCBjaGFyKiBwYXJhbSkNCit7DQorICAgIGNoYXIgKiBhdF9zdHI7DQorCWlmKHBhcmFtKQ0KKwl7DQorICAgIAlhdF9zdHIgPSBtYWxsb2MoMzIgKyBzdHJsZW4oY21kKSArIHN0cmxlbihwYXJhbSkpOw0KKwl9DQorCWVsc2UNCisJew0KKyAgICAJYXRfc3RyID0gbWFsbG9jKDMyICsgc3RybGVuKGNtZCkpOw0KKwl9DQorCWFzc2VydChhdF9zdHIpOw0KKyAgICAvL2lmKCFhdF9zdHIpDQorICAgICAgICAvL3JldHVybiBOVUxMOw0KKyAgICBpZihwYXJhbSkNCisgICAgICAgIHNwcmludGYoYXRfc3RyLCJhdCslcz0lc1xyXG4iLGNtZCxwYXJhbSk7DQorICAgIGVsc2UNCisgICAgICAgIHNwcmludGYoYXRfc3RyLCJhdCslc1xyXG4iLGNtZCk7DQorICAgIHJldHVybiBhdF9zdHI7ICAgIA0KKw0KK30NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8vyfqzyWF0sunRr8frx/PD/MHuo6zSu7Dj1NphcHBfY2x0X29wc1901tC199PDo6y4+b7dz/vPosTayN2jrMn6s8nX7tbVtcRhdMfrx/PD/MHuDQorLy/J+rPJYXSy6dGvw/zB7sqxo6zNqLn9bWFsbG9jyerH68q508O1xMTatOajrLKit7W72LjD1rjV67j4zeKy47X308O6r8r9yrnTw6OsDQorLy/X7tbV08nN4rLjtffTw7qvyv3KzbfFuMPE2rTmDQorLy9pbnB1dDogIGNtZCAgInh4IiAgICAgICAgIA0KKy8vb3V0cHV0OiAgIGF0K3h4PyBcclxuDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitjaGFyKiBhdF9xdWVyeV9idWlsZChjaGFyKiBjbWQpDQorew0KKyAgICBjaGFyICogYXRfc3RyOw0KKyAgICANCisgICAgYXRfc3RyID0gbWFsbG9jKDMyICsgc3RybGVuKGNtZCkpOyAvL9PJYXRfY3RsuLrU8MrNt8UNCisJYXNzZXJ0KGF0X3N0cik7DQorICAgIC8vaWYoIWF0X3N0cikNCisgICAgICAgIC8vcmV0dXJuIE5VTEw7DQorICAgIHNwcmludGYoYXRfc3RyLCJhdCslcz9cclxuIixjbWQpOw0KKyAgICANCisgICAgcmV0dXJuIGF0X3N0cjsgICAgDQorDQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLy/J+rPJYXSy6dGvx+vH88P8we61xM/s06bD/MHuo6y1sdPQ1tC85L3hufvJz7GoyrGjrNTac2VyX29wc190MrXEcnNwX2FjdLX308OjrA0KKy8vuMO6r8r91tC9q9bQvOTJz7GoveG5+7rNb2thdMP8we7X6dew1NrSu8bwo6zNqLn9bWFsbG9jyerH68q508O1xMTatOajrLKit7W72A0KKy8vuMPWuNXruPjN4rLjtffTw7qvyv3KudPDo6zX7tbV08nN4rLjtffTw7qvyv3KzbfFuMPE2rTmDQorLy9pbnB1dDogIGNtZCAgInh4IiAgIA0KKy8vICAgICAgICAgICBwYXJhbSAgICAieXksenoiIA0KKy8vb3V0cHV0OiAgIFxyXG4reHg6eXksenpcclxuDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitjaGFyKiBhdF9xdWVyeV9yZXN1bHRfYnVpbGQoY2hhciogY21kLCBjaGFyKiBwYXJhbSkNCit7DQorICAgIGNoYXIgKiBhdF9zdHI7DQorDQorCWlmKHBhcmFtKQ0KKwl7DQorICAgIAlhdF9zdHIgPSBtYWxsb2MoMzIgKyBzdHJsZW4oY21kKSArIHN0cmxlbihwYXJhbSkpOw0KKwl9DQorCWVsc2UNCisJew0KKyAgICAJYXRfc3RyID0gbWFsbG9jKDMyICsgc3RybGVuKGNtZCkpOw0KKwl9DQorCWFzc2VydChhdF9zdHIpOw0KKyAgICAvL2lmKCFhdF9zdHIpDQorICAgICAgICAvL3JldHVybiBOVUxMOw0KKyAgICBpZighcGFyYW0pDQorICAgICAgICBzcHJpbnRmKGF0X3N0ciwiXHJcbislc1xyXG5cclxuT0tcclxuIixjbWQpOw0KKyAgICBlbHNlDQorICAgICAgICBzcHJpbnRmKGF0X3N0ciwiXHJcbislczogJXNcclxuXHJcbk9LXHJcbiIsY21kLHBhcmFtKTsNCisNCisgICAgcmV0dXJuIGF0X3N0cjsgICAgDQorDQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLy/J+rPJYXS1xG9rz+zTpsP8we6jrLj5vt2yzsr90MXPosn6s8myu82stcRva8/s06bD/MHuDQorLy/NqLn9bWFsbG9jyerH68q508O1xMTatOajrLKit7W72LjD1rjV67j4zeKy47X308O6r8r9yrnTw6Os1+7W1dPJzeKy47X308O6r8r9ys23xbjDxNq05g0KKy8vaW5wdXQ6ICBwYXJhbSAgInh4IiAgDQorDQorLy9vdXRwdXQ6ICAgXHJcbm9rOnh4DQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitjaGFyKiBhdF9va19idWlsZCgpDQorew0KKyAgICBjaGFyICogYXRfc3RyOw0KKyAgICANCisgICAgYXRfc3RyID0gbWFsbG9jKDMyKTsgLy/TyWF0X2N0bLi61PDKzbfFDQorCWFzc2VydChhdF9zdHIpOw0KKwkNCisJc3ByaW50ZihhdF9zdHIsIlxyXG5PS1xyXG4iKTsNCisNCisgICAgICAgIA0KKyAgICByZXR1cm4gYXRfc3RyOyAgICANCisNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvL8n6s8lhdLXEZXJyz+zTpsP8we6jrLj5vt2yzsr90MXPosn6s8myu82stcRlcnLP7NOmw/zB7g0KKy8vzai5/W1hbGxvY8nqx+vKudPDtcTE2rTmo6yyore1u9i4w9a41eu4+M3isuO199PDuq/K/cq508OjrNfu1tXTyc3isuO199PDuq/K/crNt8W4w8TatOYNCisvL2lucHV0OiAgcGFyYW0gIHh4ICANCisvL291dHB1dDogICBcclxuZXJyOnh4DQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitjaGFyKiBhdF9lcnJfYnVpbGQoaW50IHBhcmFtKQ0KK3sNCisgICAgY2hhciAqYXRfc3RyID0gTlVMTDsNCisJDQorICAgIGF0X3N0ciA9IG1hbGxvYygzMik7DQorCQ0KKwlhc3NlcnQoYXRfc3RyKTsNCisgICAgaWYocGFyYW0gPT0gMCkNCisgICAgICAgIHNwcmludGYoYXRfc3RyLCJcclxuRVJST1JcclxuIik7DQorICAgIGVsc2UNCisgICAgICAgIHNwcmludGYoYXRfc3RyLCJcclxuK0NNRSBFUlJPUjogJWRcclxuIixwYXJhbSk7DQorICAgICAgICANCisgICAgcmV0dXJuIGF0X3N0cjsgICAgDQorDQorfQ0KKw0KK3N0YXRpYyBpbnQgaXNfZGlnaXRfc3RyKGNvbnN0IGNoYXIgKnN0cikNCit7DQorCXVuc2lnbmVkIGludCBkaWdpdF9sZW4gPSAwOw0KKwl3aGlsZSgqc3RyID09ICcgJyl7DQorCQlzdHIrKzsNCisJfQ0KKwlpZigqc3RyID09ICctJyB8fCAqc3RyID09ICcrJyl7DQorCQlzdHIrKzsNCisJfQ0KKwl3aGlsZShpc2RpZ2l0KCpzdHIpKXsNCisJCXN0cisrOw0KKwkJZGlnaXRfbGVuKys7DQorCX0NCisJd2hpbGUoKnN0ciA9PSAnICcpew0KKwkJc3RyKys7DQorCX0NCisJcmV0dXJuICpzdHIgPT0gJ1wwJyAmJiBkaWdpdF9sZW4gPiAwOw0KK30NCisNCisNCisvKrjDuq/K/dPD09qwtNXVuPi2qLXEuPHKvb3izvayzsr9o6y48cq9vfbWp7PWJWS6zSVzLM2syrG/ydLU1NrDv7j2uPHKvcewvNPJz8r919bS1Na4tqgNCiux5MG/v8nS1Liz1rW1xL/VvOS089Cho6y1pc67zqrX1r3ao6zA/cjnJTJkse3Kvr3Tyty05rSiv9W85M6qMtfWvdqjuyU1c7Htyr7L48nPJ1wwJ6Os1+624L/J0tQNCiu908rcNbj219a3+6GjtbElZLK71ri2qMr919bKsaOssLTV1TTX1r3avfjQ0Liz1rWjrCVz1PKwtNXVyrW8yr3izva1xNfWt/u0rrOktsjN6siruLPWtaOs09C/ycTcDQoru+HT0NS9veeho7TLzeLTw7unyrnTw8qxo6zI9LK7z+vTybjDvdO/2sTasr+9+NDQss7K/bXEuPHKvbuvveLO9qOsv8nS1L2rZm10uLPWtc6qIiVzIqOsDQorcHZhbLiz1rXOqmNoYXIgKipwy6vWuNXro6zV4tH5ss7K/b2r1/fOqtX7zOXX1rf7tK63tbvYuPi199PD1d8qLw0KK2ludCBwYXJzZV9wYXJhbTIoY2hhciAqZm10LCBjaGFyICpidWYsIHZvaWQgKipwdmFsKQ0KK3sNCisJY2hhciAqcDsNCisJY2hhciAqc2VwcDsgDQorCWNoYXIgKnRtcDsNCisJY2hhciBzZXBjOw0KKwljaGFyICpwc3RyW0FUX1BBUkFNX01BWF9OVU1dID0geyAwIH07DQorCWludCAgbGVuLCBmbGFnOw0KKwlpbnQgIG4JPSAwOw0KKwlpbnQgIG5wYXJhbSA9IDA7DQorCWlmIChidWYgPT0gTlVMTCkgew0KKwkJcHJpbnRmKCJidWYgTlVMTFxuIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJDQorCWxlbiA9IHN0cmxlbihidWYpICsgMTsNCisJdG1wID0gcCA9IChjaGFyKiltYWxsb2MobGVuKTsNCisJaWYgKHAgPT0gTlVMTCkgew0KKwkJLy9hc3NlcnQoMCk7DQorCQlwcmludGYoImZhaWwgdG8gbWFsbG9jXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwltZW1zZXQocCwgMCwgbGVuKTsNCisJbWVtY3B5KHAsIGJ1Ziwgc3RybGVuKGJ1ZikpOw0KKwkvKiByZW1vdmUgXHIgb3IgXG4gYXQgdGggZW5kICovDQorCWZvcihsZW4tLTsgbGVuID4gMDsgbGVuLS0pew0KKwkJaWYocFtsZW4gLSAxXSA9PSAnXHInIHx8IHBbbGVuIC0gMV0gPT0gJ1xuJyl7DQorCQkJcFtsZW4gLSAxXSA9ICdcMCc7DQorCQl9IGVsc2Ugew0KKwkJCWJyZWFrOw0KKwkJfQ0KKwl9DQorCS8qIGRpdmlzZSB0aGUgYXQtc3RyaW5nIHRvIHNvbWUgc3RyaW5nIHBhcmFtICovDQorCWRvIHsNCisJCWZsYWcgPSAwOw0KKwkJaWYgKCpwID09ICciJykgew0KKwkJCWludCBpLCBqOw0KKwkJCWZvciAoaSA9IGogPSAwLCArK3A7IHBbal0gIT0gJ1wwJzsgaSsrLCBqKyspIHsNCisJCQkJaWYgKHBbal0gPT0gJyInKSB7DQorCQkJCQkrK2o7DQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisNCisJCQlpZiAoaiA9PSAxKSBmbGFnID0gMTsNCisJCQlwW2ogLSAxXSA9ICdcMCc7DQorCQkJc2VwcCA9IHAgKyBqOw0KKwkJfSBlbHNlIHsNCisJCQlzZXBwID0gcCArIHN0cmNzcG4ocCwgIiwiKTsNCisJCQlpZiAocCA9PSBzZXBwKSBmbGFnID0gMTsNCisJCX0NCisNCisJCW5wYXJhbSsrOw0KKwkJc2VwYyA9IHNlcHBbMF07DQorCQlzZXBwWzBdID0gJ1wwJzsNCisNCisJCWlmIChmbGFnID09IDEpDQorCQkJcHN0cltuKytdID0gTlVMTDsNCisJCWVsc2UNCisJCQlwc3RyW24rK10gPSBwOw0KKwkJcCA9IHNlcHAgKyAxOw0KKwl9IHdoaWxlICgobiA8IEFUX1BBUkFNX01BWF9OVU0pICYmIChzZXBjID09ICcsJykpOw0KKw0KKwkvKiBjb252ZXJ0IHRoZSBzdHJpbmcgcGFyYW1zIHRvIHRoZSB0eXBlcyB0aGF0IGZtdCBBcHBvaW50ZWQgKi8NCisJaW50IHBhcmFtX2NvdW50ID0gMDsgLyogY291bnQgdGhlIHBhcmFtIHRoYXQgYmVpbmcgZ2V0ICovDQorCWludCBwYXJhbV9zdHJfaW5kZXggPSAwOyAvKiB0aGUgaW5kZXggb2Ygc3RyaW5nIHBhcmFtcyAqLw0KKwlpbnQgcGFyYW1fdmFsX2luZGV4ID0gMDsgLyogdGhlIGluZGV4IG9mIHBhcmFtIHZhbHVlcyAgKi8NCisJZm9yICg7IGZtdCAhPSAgTlVMTCAmJiBwYXJhbV9zdHJfaW5kZXggPCBucGFyYW07IHBhcmFtX3N0cl9pbmRleCsrKSB7DQorCQljaGFyIHR5cGU7DQorCQlpbnQgIHNpemU7DQorCQljaGFyIHN0cl9wYXJhbV9zaXplWzZdID0geyAwIH07DQorCQlpbnQgIHBhcmFtX3NpemVfaW5kZXggID0gMDsNCisNCisJCXdoaWxlKCpmbXQgPT0gJyAnKSBmbXQrKzsNCisJCWlmKCpmbXQgPT0gJywnKXsNCisJCQlmbXQrKzsNCisJCQljb250aW51ZTsgIC8qIGlnbW9yZSB0aGUgcGFyYW0gdGhhdCBpcyB3aXRob3V0IHR5cGUgKi8NCisJCX0NCisJCWlmKCpmbXQrKyAhPSAnJScpew0KKwkJCSBicmVhazsNCisJCX0NCisJCWZvciAoOyBwYXJhbV9zaXplX2luZGV4IDwgc2l6ZW9mKHN0cl9wYXJhbV9zaXplKSAtIDE7IGZtdCsrLCBwYXJhbV9zaXplX2luZGV4Kyspew0KKwkJCWlmKCFpc2RpZ2l0KCpmbXQpKXsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJCXN0cl9wYXJhbV9zaXplW3BhcmFtX3NpemVfaW5kZXhdID0gKmZtdDsNCisJCX0NCisJCXR5cGUgPSAqKGZtdCsrKTsNCisJCWNoYXIgKnN0b3A7DQorCQllcnJubyA9IDA7DQorCQlzaXplID0gKGludClzdHJ0b2woc3RyX3BhcmFtX3NpemUsICZzdG9wLCAxMCk7DQorCQlpZiAoZXJybm8gPT0gRVJBTkdFKS8vIGt3IEVSUk5PLk5PVF9DSEVDS0VEDQorCQl7DQorCQkJcHJpbnRmKCJzdHJ0b2wgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisJCX0NCisJCS8vc2l6ZSA9IGF0b2koc3RyX3BhcmFtX3NpemUpOw0KKwkJaWYoc2l6ZSA8IDApDQorCQkJYnJlYWs7DQorCQl3aGlsZSgqZm10ID09ICcgJykgZm10Kys7IC8qIGlnbW9yZSB0aGUgYmxhbmtzICovDQorCQlmbXQgPSAoKmZtdCA9PSAnLCcgPyBmbXQgKyAxIDogTlVMTCk7DQorDQorCQlpZiAodHlwZSA9PSAnZCcpIHsNCisJCQlpZihzaXplID09IDAgfHwgc2l6ZSA9PSA0KSB7DQorCQkJCWlmKHBzdHJbcGFyYW1fc3RyX2luZGV4XSAhPSBOVUxMKSB7DQorCQkJCQlpZighaXNfZGlnaXRfc3RyKHBzdHJbcGFyYW1fc3RyX2luZGV4XSkpew0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQkJKigoaW50ICopcHZhbFtwYXJhbV92YWxfaW5kZXhdKSA9IChpbnQpYXRvaShwc3RyW3BhcmFtX3N0cl9pbmRleF0pOw0KKwkJCQkJcGFyYW1fY291bnQrKzsNCisJCQkJfQ0KKwkJCX0gZWxzZSBpZihzaXplID09IDEpIHsNCisJCQkJaWYocHN0cltwYXJhbV9zdHJfaW5kZXhdICE9IE5VTEwpIHsNCisJCQkJCWlmKCFpc19kaWdpdF9zdHIocHN0cltwYXJhbV9zdHJfaW5kZXhdKSl7DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCQkqKChjaGFyICopcHZhbFtwYXJhbV92YWxfaW5kZXhdKSA9IChjaGFyKWF0b2kocHN0cltwYXJhbV9zdHJfaW5kZXhdKTsNCisJCQkJCXBhcmFtX2NvdW50Kys7DQorCQkJCX0NCisJCQl9IGVsc2UgaWYoc2l6ZSA9PSAyKSB7DQorCQkJCWlmKHBzdHJbcGFyYW1fc3RyX2luZGV4XSAhPSBOVUxMKSB7DQorCQkJCQlpZighaXNfZGlnaXRfc3RyKHBzdHJbcGFyYW1fc3RyX2luZGV4XSkpew0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQkJKigoc2hvcnQgKilwdmFsW3BhcmFtX3ZhbF9pbmRleF0pID0gKHNob3J0KWF0b2kocHN0cltwYXJhbV9zdHJfaW5kZXhdKTsgDQorCQkJCQlwYXJhbV9jb3VudCsrOw0KKwkJCQl9DQorCQkJfWVsc2Ugew0KKwkJCQlicmVhazsNCisJCQl9IA0KKwkJfSBlbHNlIGlmICh0eXBlID09ICdzJykgew0KKwkJCWlmIChzaXplID09IDApIHsNCisJCQkJaWYocHN0cltwYXJhbV9zdHJfaW5kZXhdICE9IE5VTEwpIHsNCisJCQkJCXN0cmNweSgoY2hhciAqKXB2YWxbcGFyYW1fdmFsX2luZGV4XSwgcHN0cltwYXJhbV9zdHJfaW5kZXhdKTsNCisJCQkJCXBhcmFtX2NvdW50Kys7DQorCQkJCX0NCisJCQl9IGVsc2UgaWYgKHNpemUgPCAweGZmZmYpIHsvL2tsb2N3b3JrDQorCQkJICAgaWYocHN0cltwYXJhbV9zdHJfaW5kZXhdICE9IE5VTEwpIHsNCisJCQkJCS8vc3RybmNweSgoY2hhciAqKXB2YWxbcGFyYW1fdmFsX2luZGV4XSwgcHN0cltwYXJhbV9zdHJfaW5kZXhdLCBzaXplIC0gMSk7DQorCQkJCQlzbnByaW50ZigoY2hhciAqKXB2YWxbcGFyYW1fdmFsX2luZGV4XSxzaXplLCIlcyIscHN0cltwYXJhbV9zdHJfaW5kZXhdKTsNCisJCQkJCXBhcmFtX2NvdW50Kys7DQorCQkJCX0NCisJCQl9IGVsc2Ugew0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJcGFyYW1fdmFsX2luZGV4Kys7DQorCX0NCisJZnJlZSh0bXApOw0KKwkJDQorCXJldHVybiBwYXJhbV9jb3VudDsNCit9DQorDQorDQorc3RhdGljIGludCBpc19wcmludF9zdHIoY29uc3QgY2hhciAqc3RyKXsNCisgICAgd2hpbGUoaXNwcmludCgqc3RyKSl7DQorICAgICAgICBzdHIrKzsNCisgICAgfQ0KKyAgICByZXR1cm4gKnN0ciA9PSAnXDAnOw0KK30NCisNCitzdGF0aWMgaW50IGdldF9mbXRfcGFyYW1fY291bnQoY29uc3QgY2hhciAqc3RyKXsNCisgICAgaW50IGZtdF9wYXJhbV9jb3VudCA9IDA7DQorICAgIA0KKyAgICBmb3IoOyAqc3RyICE9ICdcMCc7IHN0cisrKXsNCisgICAgICAgIGlmKCpzdHIgPT0gJywnKXsNCisgICAgICAgICAgICBmbXRfcGFyYW1fY291bnQrKzsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gZm10X3BhcmFtX2NvdW50ICsgMTsNCit9DQorDQorLypyZXR1cm4gMLHtyr694s72ss7K/dX9s6OjrMTasr+9+NDQ0c+48bXEss7K/bzssumjrLD8wKiyzsr9uPbK/dK71sLQ1LzssumjrLbU09q/ydGhss7K/aOs0OjSqrX308PV39fU0NC/vMLHKi8NCitpbnQgIHBhcnNlX3BhcmFtX3NhZmUoY2hhciAqZm10LCBjaGFyICpidWYsIHZvaWQgKipwdmFsKQ0KK3sNCisJY2hhciAqcDsNCisgICAgY2hhciAqc2VwcDsgDQorICAgIGNoYXIgKnRtcDsNCisJY2hhciBzZXBjOw0KKwljaGFyICpwc3RyW0FUX1BBUkFNX01BWF9OVU1dID0gezB9Ow0KKwlpbnQgIGxlbiwgZmxhZzsNCisJaW50ICBuICAgPSAwOw0KKwlpbnQgIG5wYXJhbSA9IDA7Ly9idWbX1rf7tK7KtbzKtcSyzsr9uPbK/Q0KKwlpbnQgIGZtdF9wYXJhbV9udW0gPSAwOy8vZm10uPHKvbuv1tDSqsfztcSyzsr919y49sr9o6zT6yW49sr90rvWwg0KKwlpbnQgIHJldCAgPSBBVF9QQVJTRV9PSzsNCisJaW50ICBtYXJrX2ZsYWcgPSAwOy8v08PT2rHqyrbM2Mrit/u6xbXExeS21Mfpv/ajrMS/x7DTw9Pay6vS/brFDQorCWlmIChidWYgPT0gTlVMTCkgew0KKwkJcmV0dXJuIEFURVJSX1BST0NfRkFJTEVEOw0KKwl9DQorICAgIHdoaWxlKCpidWYgPT0gJyAnKSBidWYrKzsNCisJbGVuID0gc3RybGVuKGJ1ZikgKyAxOw0KKwl0bXAgPSBwID0gKGNoYXIqKW1hbGxvYyhsZW4pOw0KKwlpZiAocCA9PSBOVUxMKSB7DQorCQlyZXR1cm4gQVRFUlJfTk9fUFJJTlQ7DQorCX0NCisJLy9mbXRfcGFyYW1fbnVtID0gZmluZF9jaGFyX251bShmbXQsIiUiKTsNCisJbWVtc2V0KHAsIDAsIGxlbik7DQorCS8vyerH69DCxNq05rTmt8XI67LOtcRBVMP8we6jrNLUseO9+NDQ1fvQzrao1sYNCisJbWVtY3B5KHAsIGJ1Ziwgc3RybGVuKGJ1ZikpOw0KKyAgICAvKsils/3OsrK/tcRcclxuo6zEv8ewvfbU2jcxMDDJz9PQtMvOysziICovDQorICAgIGZvcihsZW4tLTsgbGVuID4gMDsgbGVuLS0pew0KKyAgICAgICAgaWYocFtsZW4gLSAxXSA9PSAnXHInIHx8IHBbbGVuIC0gMV0gPT0gJ1xuJyl7DQorICAgICAgICAgICAgcFtsZW4gLSAxXSA9ICdcMCc7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGlmKCFpc19wcmludF9zdHIocCkpey8qIMjnQVTD/MHu1tCw/Lqssru/ybz719a3+9axvdO3tbvYtO3O8yAqLw0KKyAgICAgICAgZnJlZSh0bXApOw0KKwkJcmV0dXJuIEFURVJSX05PX1BSSU5UOw0KKyAgICB9DQorICAgIC8qsLS2urrFvfjQ0MO/uPayzsr9tcS31rju1fvQzizLq9L9usXA77XEtrq6xcz4uf0qLw0KKwlkbyB7DQorCQlmbGFnID0gMDsNCisJCW1hcmtfZmxhZyA9IDA7DQorCQlpZiAoKnAgPT0gJyInKSB7DQorCQkJaW50IGksIGo7DQorCQkJZm9yIChpID0gaiA9IDAsICsrcDsgcFtqXSAhPSAnXDAnOyBpKyssIGorKykgew0KKwkJCQlpZiAocFtqXSA9PSAnIicpIHsNCisJCQkJCSsrajsNCisJCQkJCW1hcmtfZmxhZyA9IDE7DQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisJCQlpZihtYXJrX2ZsYWcgPT0gMCl7LyogzrTGpcXktb3Lq9L9usXWsb3Tt7W72LTtzvMgKi8NCisJCQkJZnJlZSh0bXApOw0KKwkJCQlyZXR1cm4gQVRFUlJfRFJPUF9NQVJLOw0KKwkJCX0NCisJCQlpZiAoaiA9PSAxKSBmbGFnID0gMTsNCisJCQlwW2ogLSAxXSA9ICdcMCc7DQorCQkJc2VwcCA9IHAgKyBqOw0KKwkJfSBlbHNlIHsNCisJCQlzZXBwID0gcCArIHN0cmNzcG4ocCwgIiwiKTsNCisJCQlpZiAocCA9PSBzZXBwKSBmbGFnID0gMTsNCisJCX0NCisNCisJCW5wYXJhbSsrOw0KKwkJc2VwYyA9IHNlcHBbMF07DQorCQlzZXBwWzBdID0gJ1wwJzsNCisNCisJCWlmIChmbGFnID09IDEpDQorCQkJcHN0cltuKytdID0gTlVMTDsNCisJCWVsc2UNCisJCQlwc3RyW24rK10gPSBwOw0KKwkJcCA9IHNlcHAgKyAxOw0KKwl9IHdoaWxlICgobiA8IEFUX1BBUkFNX01BWF9OVU0pICYmIChzZXBjID09ICcsJykpOw0KKw0KKyAgICBpZihucGFyYW0gPCBnZXRfZm10X3BhcmFtX2NvdW50KGZtdCkpew0KKwkJcmV0ID0gQVRXQVJOX0RST1BfUk47ICAgIA0KKwl9ZWxzZSBpZihucGFyYW0gPiBnZXRfZm10X3BhcmFtX2NvdW50KGZtdCkpew0KKwkJcmV0ID0gQVRXQVJOX0xBQ0tfUEFSQU07ICAgIA0KKwl9DQorICAgIC8qIGNvbnZlcnQgdGhlIHN0cmluZyBwYXJhbXMgdG8gdGhlIHR5cGVzIHRoYXQgZm10IEFwcG9pbnRlZCAqLw0KKyAgICBpbnQgcGFyYW1fY291bnQgPSAwOyAvKsrkyOu1xNfWt/u0rtbQ09DQp7LOyv249sr9Ki8NCisgICAgaW50IHBhcmFtX3N0cl9pbmRleCA9IDA7IC8qIHRoZSBpbmRleCBvZiBzdHJpbmcgcGFyYW1zICovDQorICAgIGludCBwYXJhbV92YWxfaW5kZXggPSAwOyAvKiB0aGUgaW5kZXggb2YgcGFyYW0gdmFsdWVzICAqLw0KKwkvL7C01dXI67LOuPHKvb340NDDv7j2ss7K/da1tcS3tbvYuLPWtQ0KKyAgICBmb3IgKDsgZm10ICE9ICBOVUxMICYmIHBhcmFtX3N0cl9pbmRleCA8IG5wYXJhbTsgcGFyYW1fc3RyX2luZGV4KyspIHsNCisgICAgICAgIGNoYXIgdHlwZTsNCisgICAgICAgIGludCAgc2l6ZTsNCisgICAgICAgIGNoYXIgc3RyX3BhcmFtX3NpemVbMTBdID0geyAwIH07DQorICAgICAgICBpbnQgIHBhcmFtX3NpemVfaW5kZXggID0gMDsNCisNCisgICAgICAgIHdoaWxlKCpmbXQgPT0gJyAnKSBmbXQrKzsNCisgICAgICAgIGlmKCpmbXQgPT0gJywnKXsNCisgICAgICAgICAgICBmbXQrKzsNCisgICAgICAgICAgICBjb250aW51ZTsgIC8qIGlnbW9yZSB0aGUgcGFyYW0gdGhhdCBpcyB3aXRob3V0IHR5cGUgKi8NCisgICAgICAgIH0NCisgICAgICAgIGlmKCpmbXQrKyAhPSAnJScpew0KKyAgICAgICAgICAgICByZXQgPSBBVEVSUl9OT19QUklOVDsNCisgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKDsgcGFyYW1fc2l6ZV9pbmRleCA8IHNpemVvZihzdHJfcGFyYW1fc2l6ZSkgLSAxOyBmbXQrKywgcGFyYW1fc2l6ZV9pbmRleCsrKXsNCisgICAgICAgICAgICBpZighaXNkaWdpdCgqZm10KSl7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzdHJfcGFyYW1fc2l6ZVtwYXJhbV9zaXplX2luZGV4XSA9ICpmbXQ7DQorICAgICAgICB9DQorICAgICAgICB0eXBlID0gKihmbXQrKyk7DQorCQljaGFyICpzdG9wOw0KKwkJZXJybm8gPSAwOw0KKwkJc2l6ZSA9IChpbnQpc3RydG9sKHN0cl9wYXJhbV9zaXplLCAmc3RvcCwgMTApOw0KKwkJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRA0KKwkJew0KKwkJCXByaW50Zigic3RydG9sIGVycm5vICVkOiAlc1xuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorCQl9DQorICAgICAgICAvL3NpemUgPSBhdG9pKHN0cl9wYXJhbV9zaXplKTsNCisJCWlmKHNpemUgPCAwKXsNCisJCQlyZXQgPSBBVEVSUl9TVFJfVE9PX0xPTkc7DQorCQkJYnJlYWs7DQorCQl9DQorICAgICAgICB3aGlsZSgqZm10ID09ICcgJykgZm10Kys7IC8qIGlnbW9yZSB0aGUgYmxhbmtzICovDQorICAgICAgICBmbXQgPSAoKmZtdCA9PSAnLCcgPyBmbXQgKyAxIDogTlVMTCk7DQorDQorICAgICAgICBpZiAodHlwZSA9PSAnZCcpIHsNCisgICAgICAgICAgICBpZihzaXplID09IDAgfHwgc2l6ZSA9PSA0KSB7DQorICAgICAgICAgICAgICAgIGlmKHBzdHJbcGFyYW1fc3RyX2luZGV4XSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICAqKChpbnQgKilwdmFsW3BhcmFtX3ZhbF9pbmRleF0pID0gKGludClhdG9pKHBzdHJbcGFyYW1fc3RyX2luZGV4XSk7DQorICAgICAgICAgICAgICAgICAgICBwYXJhbV9jb3VudCsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIGlmKHNpemUgPT0gMSkgew0KKyAgICAgICAgICAgICAgICBpZihwc3RyW3BhcmFtX3N0cl9pbmRleF0gIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgKigoY2hhciAqKXB2YWxbcGFyYW1fdmFsX2luZGV4XSkgPSAoY2hhcilhdG9pKHBzdHJbcGFyYW1fc3RyX2luZGV4XSk7DQorICAgICAgICAgICAgICAgICAgICBwYXJhbV9jb3VudCsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIGlmKHNpemUgPT0gMikgew0KKyAgICAgICAgICAgICAgICBpZihwc3RyW3BhcmFtX3N0cl9pbmRleF0gIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgKigoc2hvcnQgKilwdmFsW3BhcmFtX3ZhbF9pbmRleF0pID0gKHNob3J0KWF0b2kocHN0cltwYXJhbV9zdHJfaW5kZXhdKTsgDQorICAgICAgICAgICAgICAgICAgICBwYXJhbV9jb3VudCsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfWVsc2Ugew0KKyAgICAgICAgICAgICAgICBhc3NlcnQoMCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0gDQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3MnKSB7DQorICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBpZihwc3RyW3BhcmFtX3N0cl9pbmRleF0gIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KChjaGFyICopcHZhbFtwYXJhbV92YWxfaW5kZXhdLCBwc3RyW3BhcmFtX3N0cl9pbmRleF0pOw0KKyAgICAgICAgICAgICAgICAgICAgcGFyYW1fY291bnQrKzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgaWYocHN0cltwYXJhbV9zdHJfaW5kZXhdICE9IE5VTEwgJiYgc2l6ZSA8IHN0cmxlbihwc3RyW3BhcmFtX3N0cl9pbmRleF0pKXsNCisJCQkJICAgIHJldCA9IEFURVJSX1NUUl9UT09fTE9ORzsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKwkJCSAgIH0NCisgICAgICAgICAgICAgICBpZihwc3RyW3BhcmFtX3N0cl9pbmRleF0gIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgLy9zdHJuY3B5KChjaGFyICopcHZhbFtwYXJhbV92YWxfaW5kZXhdLCBwc3RyW3BhcmFtX3N0cl9pbmRleF0sIHNpemUgLSAxKTsNCisJCQkJCWlmKHNpemUgPCAweGZmZmYpLy9rbG9jd29yaw0KKwkJCQkJc25wcmludGYoKGNoYXIgKilwdmFsW3BhcmFtX3ZhbF9pbmRleF0sc2l6ZSwiJXMiLHBzdHJbcGFyYW1fc3RyX2luZGV4XSk7DQorICAgICAgICAgICAgICAgICAgICBwYXJhbV9jb3VudCsrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYXNzZXJ0KDApOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHBhcmFtX3ZhbF9pbmRleCsrOw0KKyAgICB9DQorICAgIGZyZWUodG1wKTsNCisgICAgcmV0dXJuIHJldDsNCit9DQorLypyZXR1cm4gMLHtyr694s72ss7K/dX9s6OjrLK7vfjQ0LLOyv249sr9tcTT0NCn0NS87LLpo6y+38zlt7W72Na1ss6/tEFUX1BBUlNFX09Ltci66ta1Ki8NCitpbnQgIHBhcnNlX3BhcmFtKGNoYXIgKmZtdCwgY2hhciAqYnVmLCB2b2lkICoqcHZhbCkNCit7DQorICAgIGludCByZXQgPSBwYXJzZV9wYXJhbV9zYWZlKGZtdCxidWYscHZhbCk7DQorICAgIGlmKHJldD09QVRXQVJOX0xBQ0tfUEFSQU18fHJldD09QVRXQVJOX0RST1BfUk4pDQorICAgICAgICByZXR1cm4gIEFUX1BBUlNFX09LOw0KKyAgICByZXR1cm4gcmV0Ow0KK30NCisvKioNCisgKiBAYnJpZWYgv8m08tOh19a3+7Su16q7u86q19a92sr9vt0go6zI56O6DQorICAgICAgICAgICAgICAgICJDODMyOUJGRDBFMDEiIC0tPiB7MHhDOCwgMHgzMiwgMHg5QiwgMHhGRCwgMHgwRSwgMHgwMX0NCisgKiBAcGFyYW0gcFNyYyDUtNfWt/u0rta41esNCisgKiBAcGFyYW0gcERzdCDEv7Hqyv2+3da41esNCisgKiBAcGFyYW0gblNyY0xlbmd0aCDUtNfWt/u0rrOktsgNCisgKiBAcmV0dXJuIMS/serK/b7ds6S2yA0KKyAqIEBub3RlICAgDQorICogQHdhcm5pbmcgDQorICovDQoraW50IHN0cmluZzJieXRlcyhjb25zdCBjaGFyKiBwU3JjLCB1bnNpZ25lZCBjaGFyKiBwRHN0LCBpbnQgblNyY0xlbmd0aCkNCit7DQorICAgIGludCBpPTA7DQorDQorICAgIC8v0KPR6bLOyv0NCisgICAgaWYocFNyYyA9PSAgTlVMTCB8fCBwRHN0ID09IE5VTEwgfHwgblNyY0xlbmd0aCA8IDApDQorICAgIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBmb3IoaSA9IDA7IGkgPCBuU3JjTGVuZ3RoOyBpICs9IDIpDQorICAgIHsNCisgICAgICAgIC8vIMrks/a43zTOuw0KKyAgICAgICAgaWYoKnBTcmMgPj0gJzAnICYmICpwU3JjIDw9ICc5JykNCisgICAgICAgIHsNCisgICAgICAgICAgICAqcERzdCA9ICgqcFNyYyAtICcwJykgPDwgNDsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICAqcERzdCA9ICgodG91cHBlcigqcFNyYykgLSAnQScpICsgMTApIDw8IDQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwU3JjKys7DQorDQorICAgICAgICAvLyDK5LP2tc00zrsNCisgICAgICAgIGlmKCpwU3JjID49ICcwJyAmJiAqcFNyYyA8PSAnOScpDQorICAgICAgICB7DQorICAgICAgICAgICAgKnBEc3QgfD0gKnBTcmMgLSAnMCc7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgKnBEc3QgfD0gKHRvdXBwZXIoKnBTcmMpIC0gJ0EnKSArIDEwOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcFNyYysrOw0KKyAgICAgICAgcERzdCsrOw0KKyAgICB9DQorDQorICAgIC8vILe1u9jEv7Hqyv2+3bOktsgNCisgICAgcmV0dXJuIG5TcmNMZW5ndGggLyAyOw0KK30NCisNCisvKioNCisgKiBAYnJpZWYg19a92sr9vt3Xqru7zqq/ybTy06HX1rf7tK4go6zI56O6DQorICAgICAgICAgICAgICAgICAgICAgezB4QzgsIDB4MzIsIDB4OUIsIDB4RkQsIDB4MEUsIDB4MDF9IC0tPiAiQzgzMjlCRkQwRTAxIg0KKyAqIEBwYXJhbSBwU3JjINS0yv2+3da41esNCisgKiBAcGFyYW0gcERzdCDEv7Hq19a3+7Su1rjV6w0KKyAqIEBwYXJhbSBuU3JjTGVuZ3RoINS0yv2+3bOktsgNCisgKiBAcmV0dXJuIMS/serK/b7ds6S2yKO7DQorICogQG5vdGUgICANCisgKiBAd2FybmluZyANCisgKi8NCitpbnQgYnl0ZXMyc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBTcmMsIGNoYXIqIHBEc3QsIGludCBuU3JjTGVuZ3RoKQ0KK3sNCisgICAgY29uc3QgY2hhciB0YWJbXT0iMDEyMzQ1Njc4OUFCQ0RFRiI7CS8vIDB4MC0weGa1xNfWt/uy6dXSse0NCisgICAgaW50IGkgPSAwOw0KKw0KKyAgICAvL9Cj0emyzsr9DQorICAgIGlmKHBTcmMgPT0gIE5VTEwgfHwgcERzdCA9PSBOVUxMIHx8IG5TcmNMZW5ndGggPCAwKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgZm9yKGk9MDsgaTxuU3JjTGVuZ3RoOyBpKyspDQorICAgIHsNCisgICAgICAgICpwRHN0KysgPSB0YWJbKnBTcmMgPj4gNF07CQkvLyDK5LP2tc00zrsNCisgICAgICAgICpwRHN0KysgPSB0YWJbKnBTcmMgJiAweDBmXTsJLy8gyuSz9rjfNM67DQorICAgICAgICBwU3JjKys7DQorICAgIH0NCisNCisgICAgLy8gt7W72MS/serX1rf7tK6zpLbIDQorICAgIHJldHVybiBuU3JjTGVuZ3RoICogMjsNCit9DQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiC6r8r9w/uzxqO6IHZvaWQgenhpY19lcnJfdHJhY2soaW50IGVycikNCisqILmmxNzD6Mr2o7ogvavTptPDtO3O87rFzO2807W9bnbW0A0KKyogyuTI67LOyv2juiAgICAgIGVycjogtO3O87rFDQorKiC3tSC72CDWtaO6xL+x6sr9vt2zpLbIo7sNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCit2b2lkIHp4aWNfZXJyX3RyYWNrKGludCBlcnIpDQorew0KKwlFUlJfVFJBQ0sgZXJyVHJhY2sgPSB7MH07DQorCWNoYXIgICBudkVyclRyYWNrWzIgKiBzaXplb2YoRVJSX1RSQUNLKV0gPSB7MH07DQorCWNoYXIgICBhc3NlcnRfZXJybm9bMTBdID0gezB9Ow0KKwlpbnQgcmVjb3JkTGVuID0gMCwgY3VyRXJybm8gPSAwLCBwcmVudW0gPSAwLCBpID0gMDsNCisJc3RydWN0IHRpbWV2YWwgY3VyVGltZSA9IHswfTsNCisJdW5zaWduZWQgbG9uZyBjdXJFcnJUaW1lICA9IDA7IC8vusHD6w0KKwlpbnQgaW5kZXg7DQorDQorCWdldHRpbWVvZmRheSgmY3VyVGltZSwgTlVMTCk7DQorCWN1ckVyclRpbWUgPSBjdXJUaW1lLnR2X3NlYyAqIDEwMDAgKyBjdXJUaW1lLnR2X3VzZWMgLyAxMDAwOw0KKw0KKwljdXJFcnJubyA9IGVycjsNCisJLy9hdF9wcmludChBVF9ERUJVRywiW0VSUl1jdXJFcnJubyA9ICVkXHJcbiIsIGN1ckVycm5vKTsNCisNCisJLy+3osvN0OjSqrbP0dS1xGVycm5vo6zWsb3Tts/R1A0KKwljZmdfZ2V0X2l0ZW0oImFzc2VydF9lcnJubyIsIGFzc2VydF9lcnJubywgc2l6ZW9mKGFzc2VydF9lcnJubykpOw0KKwlpZiAoY3VyRXJybm8gPT0gYXRvaShhc3NlcnRfZXJybm8pKSB7DQorCQlhc3NlcnQoMCk7DQorCX0NCisNCisJLy+0005WtsHIobTtzvO/7NXV0MXPog0KKwlyZWNvcmRMZW4gPSAyICogc2l6ZW9mKEVSUl9UUkFDSyk7DQorCW1lbXNldChudkVyclRyYWNrLCAweDAwLCByZWNvcmRMZW4pOw0KKwljZmdfZ2V0X2l0ZW0oImVycl90cmFjayIsIG52RXJyVHJhY2ssIHJlY29yZExlbik7DQorCXN0cmluZzJieXRlcyhudkVyclRyYWNrLCAodW5zaWduZWQgY2hhciopJmVyclRyYWNrLCBzdHJsZW4obnZFcnJUcmFjaykpOw0KKw0KKw0KKwkvL7Ty06G/7NXV0MXPog0KKyNpZiAwDQorCWF0X3ByaW50KEFUX0RFQlVHLCAiW0VSUl1udW0gPSAlZFxyXG4iLCBlcnJUcmFjay5udW0pOw0KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7DQorCQlhdF9wcmludChBVF9ERUJVRywgIltFUlJdZXJyVHJhY2suZXJySW5mb1slZF0uZXJybm8gPSAlZFxyXG4iLCBpLCBlcnJUcmFjay5lcnJJbmZvW2ldLmVycl9ubyk7DQorCQlhdF9wcmludChBVF9ERUJVRywgIltFUlJdZXJyVHJhY2suZXJySW5mb1slZF0uZXJydGltZSA9ICVsZFxyXG4iLCBpLCBlcnJUcmFjay5lcnJJbmZvW2ldLmVycl90aW1lKTsNCisJfQ0KKyNlbmRpZg0KKwlpbmRleCA9IGVyclRyYWNrLm51bSAlIEVSUl9UUkFDS19NQVhfTlVNOw0KKwkvL9Gtu7e8x8K8tO3O89DFz6INCisJaWYgKGluZGV4ID09IDAgJiYgZXJyVHJhY2subnVtICE9IDApDQorCQlwcmVudW0gPSBFUlJfVFJBQ0tfTUFYX05VTSAtIDE7DQorCWVsc2UgaWYgKGluZGV4ID09IDApDQorCQlwcmVudW0gPSAwOw0KKwllbHNlDQorCQlwcmVudW0gPSBpbmRleCAtIDE7DQorDQorCS8vwb20zmVycm5vz+DNrKOsvfa4/NDCyrG85A0KKwlpZiAoY3VyRXJybm8gPT0gZXJyVHJhY2suZXJySW5mb1twcmVudW1dLmVycl9ubykgew0KKwkJZXJyVHJhY2suZXJySW5mb1twcmVudW1dLmVycl90aW1lID0gY3VyRXJyVGltZTsNCisJfQ0KKwkvL8G9tM5lcnJub7K7z+DNrKOsvMfCvM/C0MK1xGVycm5vus1lcnJ0aW1lDQorCWVsc2Ugew0KKwkJZXJyVHJhY2suZXJySW5mb1tpbmRleF0uZXJyX25vID0gY3VyRXJybm87DQorCQllcnJUcmFjay5lcnJJbmZvW2luZGV4XS5lcnJfdGltZSA9IGN1ckVyclRpbWU7DQorCQllcnJUcmFjay5udW0rKzsNCisJfQ0KKw0KKwkvL7GjtOa07c7zv+zV1dDFz6K1vU5WDQorDQorCW1lbXNldChudkVyclRyYWNrLCAweDAwLCByZWNvcmRMZW4pOw0KKwlieXRlczJzdHJpbmcoKHVuc2lnbmVkIGNoYXIqKSZlcnJUcmFjaywgbnZFcnJUcmFjaywgc2l6ZW9mKEVSUl9UUkFDSykpOw0KKwljZmdfc2V0KCJlcnJfdHJhY2siLCBudkVyclRyYWNrKTsNCisNCit9DQorDQorDQordm9pZCBnZXRfYXRfcmVxX3ByZWZpeChjaGFyICphdF9zdHIsIGNoYXIqKiBhdF9wcmVmaXgpDQorew0KKwljaGFyICpwcmVmaXggPSBOVUxMOwkNCisgICAgY2hhciAqcHN6QXRIZWFkID0gTlVMTDsJDQorICAgIGNoYXIgKnB0ZW1zdHIgPSBOVUxMOw0KKwkNCisJaWYoKCphdF9zdHIgPT0gJ0EnfHwqYXRfc3RyID09ICdhJykmJigqKGF0X3N0cisxKSA9PSAnVCd8fCooYXRfc3RyKzEpID09ICd0JykpDQorICAgIHsNCisgICAgICAgIGlmKGlzYWxwaGEoKihhdF9zdHIrMikpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICphdF9wcmVmaXggPSBOVUxMOw0KKyAgICAgICAgfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXByZWZpeCA9IChjaGFyKiltYWxsb2MoNTApOw0KKwkJCWlmKHByZWZpeCA9PSBOVUxMKSB7DQorCQkJCXNvZnRhcF9hc3NlcnQoIm1hbGxvYyBmYWlsISIpOw0KKwkJCQlyZXR1cm47DQorCQkJfQ0KKwkJCW1lbXNldChwcmVmaXgsIDB4MDAsIDUwKTsNCisJDQorCQkJcHN6QXRIZWFkID0gYXRfc3RyOw0KKwkJCS8v1dK1vcrXuPa3x9fWxLi78tXfyv3X1rXEss7K/aOswP3I5ysNCisJCQlmb3IoOyAqYXRfc3RyICE9ICdcMCc7IGF0X3N0cisrKQ0KKwkJCXsNCisJCQkgICBpZighKGlzYWxudW0oKmF0X3N0cikgfHwgKmF0X3N0ciA9PSAnXHInIHx8ICphdF9zdHIgPT0gJ1xuJykpDQorCQkJICAgew0KKwkJCQkgICBwc3pBdEhlYWQgPSBhdF9zdHI7DQorCQkJCSAgIHBzekF0SGVhZCsrOw0KKwkJCQkgICBicmVhazsNCisJCQkgICB9DQorCQkJfQ0KKw0KKwkJCWZvcihwdGVtc3RyID0gcHN6QXRIZWFkOyAqcHRlbXN0ciAhPSAnXDAnOyBwdGVtc3RyKyspDQorCQkJew0KKwkJCQlpZigqcHRlbXN0ciA9PSAnPScgfHwgKnB0ZW1zdHIgPT0gJz8nIHx8ICpwdGVtc3RyID09ICdccicpDQorCQkJCXsNCisJCQkJCW1lbWNweShwcmVmaXgsIHBzekF0SGVhZCwgcHRlbXN0ci1wc3pBdEhlYWQpOyANCisJCQkJCSphdF9wcmVmaXggPSBwcmVmaXg7DQorCQkJCQlyZXR1cm47DQorCQkJCX0NCisJCQl9DQorCQl9DQorICAgIH0NCisJZWxzZQ0KKwl7DQorCQlzb2Z0YXBfYXNzZXJ0KCJyZXFfYXQgY21kIGlzIGludmFsaWQhIik7DQorCX0NCisJaWYocHJlZml4KQ0KKwlmcmVlKHByZWZpeCk7DQorfQ0KKw0KKw0KKy8vuPhhdF9jbGllbnS3osvNx+vH88/7z6KjrNCvtPhhdMP8we7X1rf7tK66zbOsyrHKsbOkDQordm9pZCBzZW5kX2FwcF9yZXEoaW50IG1vZHVsZV9pZCwgY2hhciAqcmVxX2F0LCBpbnQgbGVuLCBpbnQgdGltZW91dCxpbnQgZGlyZWN0KQ0KK3sNCisJc3RydWN0IGFwcF9zZW5kX3JlcV9hdCBhcHByZXE7DQorDQorCW1lbXNldCgmYXBwcmVxLCAweDAwLCBzaXplb2Yoc3RydWN0IGFwcF9zZW5kX3JlcV9hdCkpOw0KKwltZW1jcHkoYXBwcmVxLmF0c3RyLCByZXFfYXQsIGxlbik7DQorCWFwcHJlcS5zdHJfbGVuID0gbGVuOw0KKyAgICBhcHByZXEudGltZW91dCA9IHRpbWVvdXQ7DQorCWlmKGRpcmVjdCA9PSBORUFSX1BTKQ0KKwkJaXBjX3NlbmRfbWVzc2FnZShtb2R1bGVfaWQsIE1PRFVMRV9JRF9BVF9DVEwsIE1TR19DTURfU0VORF9BVF9UT19QUyxzaXplb2Yoc3RydWN0IGFwcF9zZW5kX3JlcV9hdCksICZhcHByZXEsIDApOw0KKwllbHNlDQorCQlpcGNfc2VuZF9tZXNzYWdlKG1vZHVsZV9pZCwgTU9EVUxFX0lEX0FUX0NUTCwgTVNHX0NNRF9TRU5EX1JFUUFUX1RPX0ZBUlBTLHNpemVvZihzdHJ1Y3QgYXBwX3NlbmRfcmVxX2F0KSwgJmFwcHJlcSwgMCk7DQorDQorCXByaW50Zigic2VuZF9hcHBfcmVxXG4iKTsNCisNCit9DQorDQorDQorLyoqDQorICogQGJyaWVmINOm08O3osvNtq/X98DgQVTH68fzo6yyotfoyPu1yLT9tq/X973hufuju9ei0uKjurjDvdO/2ta7xNzTw9PasunRr7rNyejWw7rN1rTQ0Mfrx/OjrM2ouf3I67LOvfjQ0NbQvOS94bn7tcTE2rK/veLO9rSmwO2jrLKix9INCisgICAgICAgICAg09DW0LzkveG5+8nPsajKsaOs1rvWp7PW0rvM9dbQvOS94bn7tcTJz7GoveLO9qO7DQorICogQHBhcmFtIHJlcV9hdCAgx+vH80FUw/zB7g0KKyAqIEBwYXJhbSBpbmZvX2ZtdCBBVM/s06a1xLjxyr27r7e9yr0NCisgKiBAcGFyYW0gcHZhbCAguPHKvbuvuvO1xEFUz+zTpg0KKyAqIEBwYXJhbSBzYWZlX3Bhcm1fY2hlY2sJ1rjKvsrHt/G21LLOyv249sr9vfjQ0NK71sLQ1LzssumjrDCx7cq+uqy/ydGhss7K/aOssru21LLOyv249sr9vfjQ0Lzssuk7MbHtyr621LLOyv249sr9vfjQ0NHPuPG87LLpDQorICogQHJldHVybiAwse3Kvre1u9izybmmo6zG5Mv71rWx7cq+yqew3LTtzvPC6w0KKyAqIEBub3RlICAxLiDTw7unyrnTw8qxo6zI9LK7z+vTybjDvdO/2sTasr+9+NDQss7K/bXEuPHKvbuvveLO9qOsv8nS1L2raW5mb19mbXS4s9a1zqoiJXMio6xwdmFsuLPWtc6qY2hhciAqKnDLq9a41eujrNXi0fmyzsr9vavX986q1fvM5dfWt/u0rre1u9i4+LX308PV3w0KKwkgICAgICAyLiC21NPaWk1HTCxDUEJSLCBDT1BTPT+1yNK7zPXH68fzu+HT0LbgzPXW0LzkveG5+8fpv/ajrLu50OjKudPDcmVnaXN0ZXJfaW5mb3JtX2Z1bmPXorLh1tC85L3hufu1xLSmwO26r8r9DQorICogQHdhcm5pbmcgDQorICovDQoraW50ICBzZW5kX3JlcV9hbmRfd2FpdChjaGFyICpyZXFfYXQsaW50IGxlbixjaGFyICppbmZvX2ZtdCx2b2lkICoqcHZhbCwgaW50IHNhZmVfcGFybV9jaGVjayxpbnQgdGltZW91dCxpbnQgZGlyZWN0KQ0KK3sNCisJaW50IG15X2hhbmRsZSA9IDA7DQorICAgIGNoYXIgKnByZWZpeCA9IE5VTEw7DQorCU1TR19CVUYgcnNwX21zZyA9IHswfTsNCisJTE9ORyBtc2dTaXplID0gc2l6ZW9mKE1TR19CVUYpLXNpemVvZihMT05HKTsNCisJaW50IGlSZXQgPSAwOw0KKyAgICBpbnQgbW9kdWxlX2lkID0gTU9EVUxFX0lEX0FURFlOQU1JQ19CQVNFOy8vxNqyv7avzKy78cih1LTEo7/pSUSjrLP1yrzWtc6qTU9EVUxFX0lEX0FURFlOQU1JQ19CQVNFDQorICAgIGludCAgZXJyID0gMDsNCisJaW50ICBhdF9zZW5kX2NudCA9IDA7DQorDQorDQorCWlmKGxlbiA+PSBNU0dfREFUQV9NQVhfTEVOLTEyKQkJDQorCQlzb2Z0YXBfYXNzZXJ0KCJzZW5kX3JlcV9hbmRfd2FpdCByZXEgYXQgaXMgdG9vIGxvbmchISEhISIpOw0KKyAgICBhc3NlcnQoKGluZm9fZm10PT1OVUxMJiZwdmFsPT1OVUxMKXx8KGluZm9fZm10IT1OVUxMJiZwdmFsIT1OVUxMKSk7DQorICAgIC8vtq/MrLS0vajB2cqxtcTP+8+ittPB0LnctcANCisgICAgLy9tc2dnZXTKudPDss7K/UlQQ19DUkVBVCB8IElQQ19FWENMfCAwNjAwo6zF0LbPtbHHsG1vZHVsZV9pZLXEz/vPorbTwdDKx7fxDQorICAgIC8vtObU2qOsyOe5+7K7tObU2qOs1rG907S0vajQwrXEz/vPorbTwdCju8jnufu05tTao6y3tbvY1rXOtC0xo6zIu7rzbW9kdWxlX2lkDQorICAgIC8v1rW80zGjrLK7ts/Rrbu31rG1vdXStb3Du9PQyrnTw7XEbW9kdWxlX2lk1rUNCisgICAgd2hpbGUoKG15X2hhbmRsZSA9IG1zZ2dldChtb2R1bGVfaWQsSVBDX0NSRUFUIHwgSVBDX0VYQ0x8IDA2MDApKSA9PSAtMSkNCisgICAgew0KKyAgICAgICAgbW9kdWxlX2lkKys7DQorCQlpZiAobW9kdWxlX2lkID4gTU9EVUxFX0lEX0FURFlOQU1JQ19FTkQpIA0KKwkJCS8vtbFtb2R1bGVfaWS089PaTU9EVUxFX0lEX0FURFlOQU1JQ19FTkTWtcqxo6zW97avts/R1A0KKwkJCXNvZnRhcF9hc3NlcnQoImF0IGR5bmFtaWMgbXNnIHBpcGkgbm90IGZyZWUgdGltZWx5ISEhISEhISEhISEiKTsNCisJfQ0KKyAgICAvL7j5vt3H68fzQVTD/MHuus2y6dGv0++3qKOs1dK1vbbU06a1xLLp0a/HsNe6o6y2r8ysuLPWtbj4s/ayzqOszeKyv7340NDE2rTmtcTKzbfFDQorICAgIGdldF9hdF9yZXFfcHJlZml4KHJlcV9hdCwmcHJlZml4KTsNCitSRVNFTkQ6CQ0KKyAgICAvL7j4YXRfY3Rst6LLzc/7z6KjrLeiy821xM/7z6LE2sjdysdhdMP8we7X1rf7tK4NCisJYXRfc2VuZF9jbnQrKzsNCisgICAgYXNzZXJ0KGF0X3NlbmRfY250PD0zKTsNCisgICAgLy/TyWF0Y3Rs1ve/2MTasr/J6NbDs6zKsbXItP2jrNbYt6K687vh08nW2Lm51tjJ6LjDtqjKscb3DQorCXNlbmRfYXBwX3JlcShtb2R1bGVfaWQscmVxX2F0LGxlbix0aW1lb3V0LGRpcmVjdCk7DQorCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInByZWZpeDolc1xuIixwcmVmaXgpOw0KKwl3aGlsZSgxKQ0KKwl7DQorCQlpUmV0ID0gMDsNCisJCW1lbXNldCgmcnNwX21zZywgMHgwMCwgc2l6ZW9mKE1TR19CVUYpKTsNCisJCWlSZXQgPSBtc2dyY3YobXlfaGFuZGxlLCAmcnNwX21zZywgbXNnU2l6ZSwgMCwgMCk7DQorCQlpZiAoaVJldCA8IDApDQorICAgICAgICB7DQorICAgICAgICAJY29udGludWU7DQorCQl9DQorCQkvL8vAtcjTprTwz/vPog0KKwkJaWYocnNwX21zZy51c01zZ0NtZCA9PSBNU0dfQ01EX1NFTkRfQVRfTVNHX1JTUCkvL8alxeS1vcrHTVNHX0NNRF9TRU5EX0FUX01TR19SU1DKsbLFtKbA7Q0KKwkJew0KKwkJICAgIGNoYXIgKmJ1ZiA9IHJzcF9tc2cuYXVjRGF0YUJ1ZjsNCisgICAgICAgICAgICBjaGFyICphdF9wYXJhcyA9IE5VTEw7DQorICAgICAgICAJY2hhciAqcnNwX2hlYWQgPSBOVUxMOw0KKwkJCWNoYXIgKnJzcF90YWlsID0gTlVMTDsNCisgICAgICAgICAgICByc3BfaGVhZCA9IGJ1ZjsNCisJCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJyZWN2IE1TR19DTURfU0VORF9BVF9NU0dfUlNQLCBidWY6JXNcbiIsYnVmKTsNCisgICAgICAgIAkvL7bU09qy6dGvx+vH86OssqLM4bmpwcuyzsr9xNq05r/VvOSjrNTyvfjQ0LLOyv21xL3izvYNCisgICAgICAgIAlpZihwcmVmaXghPU5VTEwgJiYgaW5mb19mbXQhPU5VTEwgJiYgcHZhbCE9TlVMTCAmJiAoKHJzcF9oZWFkPWF0X3N0cnN0cihidWYscHJlZml4KSkhPU5VTEwpKQ0KKyAgICAgICAgCXsNCisgICAgICAgIAkJLy/M+Ln91tC85L3hufu1xM23sr+jrNXStb2yzsr9tcTK17XY1rcNCisgICAgICAgIAkJcnNwX2hlYWQgPSByc3BfaGVhZCtzdHJsZW4ocHJlZml4KSsyOyANCisJCQkJaWYoKHJzcF90YWlsID0gc3Ryc3RyKHJzcF9oZWFkLCJcclxuIikpID09IE5VTEwpLy+1scnPsai1xNbQvOS94bn71tDDu9PQXHJcbsqxo6zLtcP3veG5+9PQzsrM4qOs1rG907bP0dQNCisJCQkJCXNvZnRhcF9hc3NlcnQoInJzcCByZXN1bHQgaXMgd3JvbmcgYW5kIHBsZWFzZSBjb250YWN0IHdpdGggeWFuZ3l1biEiKTsNCisJCQkJDQorCQkJCWlmKHN0cmNtcChpbmZvX2ZtdCwiJXMiKSA9PSAwKQ0KKwkJCQkJLy/I57n7srvP69PJxNqyv7340NCyzsr9tcS48cq9u6+94s72yrGjrNaxvdO9q8irsr+yzsr9xNrI3cihs/bAtLiz1rW1vXB2YWxbMF3W0KOssrvX9sjOus694s72DQorCQkJCQkvL3N0cm5jcHkoKGNoYXIgKikqcHZhbCwgcnNwX2hlYWQsIChpbnQpKHJzcF90YWlsLXJzcF9oZWFkKSk7DQorCQkJCQkvL7fA1rnI67LOt8fIqzCjrNTaxKnOsrzT19a3+7SuveHK+Lf7DQorCQkJCQlzbnByaW50ZigoY2hhciAqKSpwdmFsLCAocnNwX3RhaWwtcnNwX2hlYWQpKzEsICIlcyIsIHJzcF9oZWFkKTsNCisJCQkJZWxzZS8v0OjSqrLOyv294s72yrGjrL2r1tC85L3hufu008nPsai94bn71tCz6bP2wLSjqMnPsai1xL3hufvW0L/JxNzT0E9LtObU2qOpDQorCQkJCXsNCisJCQkJCWNoYXIgKmF0X3BhcmFzID0gIG1hbGxvYyhzdHJsZW4ocnNwX2hlYWQpKzEpOw0KKwkJCQkJaWYoYXRfcGFyYXMgPT0gTlVMTCkgew0KKwkJCQkJCXNvZnRhcF9hc3NlcnQoIm1hbGxvYyBmYWlsISIpOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGF0X3BhcmFzLCAwLCBzdHJsZW4ocnNwX2hlYWQpKzEpOw0KKwkJCQkJbWVtY3B5KGF0X3BhcmFzLCByc3BfaGVhZCwgKGludCkocnNwX3RhaWwtcnNwX2hlYWQpKTsNCisNCisJCQkJCWlmKHNhZmVfcGFybV9jaGVjaykNCisJCQkJCQllcnIgPSBwYXJzZV9wYXJhbV9zYWZlKGluZm9fZm10LCBhdF9wYXJhcywgcHZhbCk7Ly+wtNXVuPHKvb3izvayzsr9DQorCQkJCQllbHNlDQorCQkJCQkJZXJyID0gcGFyc2VfcGFyYW0oaW5mb19mbXQsIGF0X3BhcmFzLCBwdmFsKTsvL7C01dW48cq9veLO9rLOyv0NCisJCQkJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInJzcCBwYXJzZV9wYXJhbV9zYWZlIHJldHVybiBFUlI9JWQhISEhISFcbiIsZXJyKTsNCisNCisJCQkJCS8vaWYoYXRfcGFyYXMgIT0gTlVMTCkNCisJCQkJCQlmcmVlKGF0X3BhcmFzKTsNCisgICAgICAgICAgICAgICAgICAgIC8vss7K/bK7us+3qKOsx9LKx9PrzeKyv01DVb340NC9u7ulyrGjrMGivLTW2NDCt6LLzcfrx/MNCisgICAgICAgICAgICAgICAgICAgIGlmKGRpcmVjdD09RkFSX1BTICYmIGVyciAhPSBBVF9QQVJTRV9PSykNCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIFJFU0VORDsNCisgICAgICAgICAgICAgICAgICAgIC8vss7K/bK7us+3qKOsWlhJQ8Tasr+9u7ulyrGjrMGivLS3tbvYss7K/bTtzvPC6w0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihlcnIgIT0gQVRfUEFSU0VfT0spDQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorCQkJCX0gICAgICAgICAgICAgICAgDQorICAgICAgICAJfQ0KKyAgICAgICAgCS8vttTT2rLp0a/A4KOssrvTprjDt7W72LTtzvOjrNXS0K3S6dW7DQorICAgICAgICAJaWYoKHJzcF9oZWFkID0gc3Ryc3RyKGJ1ZiwiRVJST1IiKSkgIT0gTlVMTCkNCisJCQl7DQorCQkJCXNzY2FuZihyc3BfaGVhZCtzdHJsZW4oIkVSUk9SIikrMiwgIiVkIiwgJmVycik7IAkJCQkNCisJCQkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAic2VydmVyIHJldHVybiBFUlI9JWQsIGF0X3NlbmRfY250PSVkISEhISEhIVxuIixlcnIsYXRfc2VuZF9jbnQpOw0KKyAgICAgICAgICAgICAgICAvL87e0OizrMqx1ti3orvy1d+3tbvYtcS07c7zwuvOqtPDu6fAqdW5tO3O86Ossru9+NDQ1ti3og0KKyAgICAgICAgICAgICAgICBpZihkaXJlY3Q9PUZBUl9QUyYmZXJyPDkwMDApDQorCQkJCQlnb3RvIFJFU0VORDsNCisJCQkJDQorCQkJCWNoYXIgbmVlZEluaXRbMjBdID0gezB9Ow0KKwkJCQkvL7bU09rNqLn9NzEwMMnPzfjEo8q9o6zX9szYyuK2qNbGo6y72Li0ZXJyb3K687HY0OvW2LSrDQorICAgIAkJCWNmZ19nZXRfaXRlbSgiY3VzdG9tZXJfdHlwZSIsbmVlZEluaXQsc2l6ZW9mKG5lZWRJbml0KSk7DQorCQkJCWlmKDAgPT0gc3RyY21wKG5lZWRJbml0LCAiNzEwMG1vZGVtIikgJiYgZXJyPDkwMDApDQorCQkJCQlnb3RvIFJFU0VORDsNCisJCQkJDQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKwkJCX0JCQkNCisJCQkvL7bU09rJ6NbDwODD/MHuus3Su9Cp1rTQ0MDgw/zB7qOs1rvT0E9Lyc+xqMO709DW0LzkveG5+8nPsagNCisJCQllbHNlIGlmKChyc3BfaGVhZCA9IHN0cnN0cihidWYsIk9LIikpICE9IE5VTEwpDQorICAgICAgICAJew0KKyAgICAgICAgICAgICAgICBicmVhazsJCQ0KKyAgICAgICAgCX0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZihwcmVmaXghPU5VTEwpDQorICAgICAgICBmcmVlKHByZWZpeCk7DQorICAgIC8vsunRr8P8we694bn7t7W72Lrzo6zP+rvZ1q7HsLS0vai1xM/7z6K208HQDQorICAgIGlmKG1zZ2N0bChteV9oYW5kbGUsSVBDX1JNSUQsMCkgPCAwKQ0KKyAgICAgICAgc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAiJWQ6JXMiLGVycm5vLHN0cmVycm9yKGVycm5vKSk7CQ0KKyAgICByZXR1cm4gZXJyOw0KK30NCitpbnQgIGdldF9tb2RlbV9pbmZvKGNoYXIgKnJlcV9hdCxjaGFyICppbmZvX2ZtdCx2b2lkICoqcHZhbCkNCit7DQorICAgIHJldHVybiBzZW5kX3JlcV9hbmRfd2FpdChyZXFfYXQsc3RybGVuKHJlcV9hdCksaW5mb19mbXQscHZhbCwwLDAsTkVBUl9QUyk7DQorfQ0KK2ludCAgZ2V0X21vZGVtX2luZm8yKGNoYXIgKnJlcV9hdCxjaGFyICppbmZvX2ZtdCx2b2lkICoqcHZhbCwgaW50IHNhZmVfcGFybV9jaGVjaywgaW50IHRpbWVvdXQpDQorew0KKyAgICByZXR1cm4gc2VuZF9yZXFfYW5kX3dhaXQocmVxX2F0LHN0cmxlbihyZXFfYXQpLGluZm9fZm10LHB2YWwsc2FmZV9wYXJtX2NoZWNrLHRpbWVvdXQsTkVBUl9QUyk7DQorfQ0KK2ludCAgc2VuZF9yZXFhdF90b19mYXJwcyhjaGFyICpyZXFfYXQsaW50IGxlbixjaGFyICppbmZvX2ZtdCx2b2lkICoqcHZhbCwgaW50IHNhZmVfcGFybV9jaGVjaywgaW50IHRpbWVvdXQpDQorew0KKyAgICByZXR1cm4gc2VuZF9yZXFfYW5kX3dhaXQocmVxX2F0LGxlbixpbmZvX2ZtdCxwdmFsLHNhZmVfcGFybV9jaGVjayx0aW1lb3V0LEZBUl9QUyk7DQorfQ0KKw0KKy8q1Nq69sLUtPPQodC0tcTHsMzhz8Issci9z8G919a3+7Suyse38c3qyKvGpcXko6zI57n7xqXF5Le1u9gwo6zI57n7tdrSu7j2yOuyzrTz09q12rb+uPbI67LOo6wNCiu3tbvY1f3WtaOst/HU8re1u9i4uta1o7sNCiu/ydPD09qxyL3PQVTD/MHux7DXusrHt/HGpcXko6zA/cjnYXQrY29wcz+6zUFUK0NPUFM/tcSxyL3PKi8NCitpbnQgYXRfc3RyY21wKGNvbnN0IGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNvdXJjZSkNCit7DQorICAgIC8vaW50IERJRkZfVkFMVUUgPSAnYSctJ0EnOw0KKyAgICBpbnQgY2gxID0gMDsNCisgICAgaW50IGNoMiA9IDA7DQorDQorICAgIGlmKE5VTEwgPT0gZGVzdCB8fCBOVUxMID09IHNvdXJjZSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorCS8vvavBvdfWt/u0rtbQtcS089Ch19bEuM/I16q7r7PJttTTprXE0KHQtNfWxLi687HIvc8NCisgICAgZG8NCisgICAgew0KKyAgICAgICAgaWYoKGNoMSA9ICoodW5zaWduZWQgY2hhciAqKWRlc3QpID49ICdBJyAmJiAoY2gxIDw9ICdaJykpDQorICAgICAgICB7DQorICAgICAgICAgICAgY2gxICs9IERJRkZfVkFMVUU7DQorICAgICAgICB9DQorICAgICAgICBpZigoY2gyID0gKih1bnNpZ25lZCBjaGFyICopc291cmNlKSA+PSAnQScgJiYgKGNoMiA8PSAnWicpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNoMiArPSBESUZGX1ZBTFVFOw0KKyAgICAgICAgfQ0KKwkJZGVzdCsrOw0KKwkJc291cmNlKys7DQorICAgIH13aGlsZSgoY2gxID09IGNoMikgJiYgY2gxICYmIGNoMik7DQorDQorICAgIGlmKGNoMSA9PSBjaDIpDQorCQlyZXR1cm4gMDsNCisJZWxzZQ0KKwkJcmV0dXJuICooLS1kZXN0KSAtICooLS1zb3VyY2UpOw0KK30NCisNCisvKtTauvbC1LTz0KHQtLXEx7DM4c/CLLHIvc/BvdfWt/u0rsewc2l6ZdfWt/vKx7fxxqXF5KOsyOe5+8alxeS3tbvYMKOsDQoryOe5+7Xa0ru49sjrss6089Patdq2/rj2yOuyzqOst7W72NX91rWjrLfx1PK3tbvYuLrWtaO7DQorv8nTw9Pasci9z0FUw/zB7sfrx/PHsNe6us3G5NbQvOS94bn7tcTHsNe6yse38calxeSjrMD9yOdjb3BzP7rNQ09QU9Tax7A0uPbX1rf7tcSxyL3PKi8NCitpbnQgYXRfc3RybmNtcChjb25zdCBjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzb3VyY2UsIGludCBzaXplKQ0KK3sNCisJLy9pbnQgRElGRl9WQUxVRSA9ICdhJy0nQSc7DQorICAgIGludCBjaDEgPSAwOw0KKyAgICBpbnQgY2gyID0gMDsNCisNCisJaWYoTlVMTCA9PSBkZXN0IHx8IE5VTEwgPT0gc291cmNlIHx8IHNpemUgPCAwKQ0KKwl7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgaWYoMCA9PSBzaXplKQ0KKwl7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKwkvL72rwb3X1rf7tK7W0LXEtPPQodfWxLjPyNequ6+zybbU06a1xNCh0LTX1sS4uvOxyL3Px7BzaXpl19a3+w0KKwlkbw0KKyAgICB7DQorICAgICAgICBpZigoY2gxID0gKih1bnNpZ25lZCBjaGFyICopZGVzdCkgPj0gJ0EnICYmIChjaDEgPD0gJ1onKSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBjaDEgKz0gRElGRl9WQUxVRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmKChjaDIgPSAqKHVuc2lnbmVkIGNoYXIgKilzb3VyY2UpID49ICdBJyAmJiAoY2gyIDw9ICdaJykpDQorICAgICAgICB7DQorICAgICAgICAgICAgY2gyICs9IERJRkZfVkFMVUU7DQorICAgICAgICB9DQorCQlkZXN0Kys7DQorCQlzb3VyY2UrKzsNCisgICAgfXdoaWxlKC0tc2l6ZSAmJiAoY2gxID09IGNoMikgJiYgY2gxICYmIGNoMik7DQorDQorICAgIGlmKGNoMSA9PSBjaDIpDQorCQlyZXR1cm4gMDsNCisJZWxzZQ0KKwkJcmV0dXJuICooLS1kZXN0KSAtICooLS1zb3VyY2UpOw0KKw0KK30NCisNCisvKtTauvbC1LTz0KHQtLXEx7DM4c/CLCDU2nNvdXJjZdbQ0bDV0nN1YnN0ctfTtK6jrMjnufvV0rW9o6zWsb3Tt7W72NTac291cmNl1tC12tK7tM6z9s/WtcTOu9bDo6wNCivI57n7w7vT0NXStb2jrLe1u9hOVUxMKi8NCitjaGFyICogYXRfc3Ryc3RyKGNvbnN0IGNoYXIgKiBzb3VyY2UsIGNvbnN0IGNoYXIgKiBzdWJzdHIpDQorew0KKwkvL2ludCBESUZGX1ZBTFVFID0gJ2EnLSdBJzsNCisgICAgaW50IGNoMSA9IDA7DQorICAgIGludCBjaDIgPSAwOw0KKw0KKyAgICBpZihzdWJzdHIgPT0gTlVMTCB8fCAgc291cmNlID09IE5VTEwpDQorCQlyZXR1cm4gTlVMTDsNCisJLy+9q8G919a3+7Su1tC1xLTz0KHX1sS4z8jXqruvs8m21NOmtcTQodC019bEuLrz1Nmy6dXSDQorICAgIHdoaWxlKCpzb3VyY2UgIT0gJ1wwJykNCisgICAgew0KKwkJY2hhciAqcCA9IChjaGFyICopc291cmNlOw0KKyAgICAgICAgY2hhciAqcSA9IChjaGFyICopc3Vic3RyOw0KKyAgICAgICAgY2hhciAqcmVzID0gTlVMTDsNCisgICAgICAgIA0KKwkJcmVzID0gcDsNCisJCWRvDQorCQl7DQorCQkJaWYoKGNoMSA9ICoodW5zaWduZWQgY2hhciAqKXApID49ICdBJyAmJiAoY2gxIDw9ICdaJykpDQorCQkJew0KKwkJCQljaDEgKz0gRElGRl9WQUxVRTsNCisJCQl9DQorCQkJaWYoKGNoMiA9ICoodW5zaWduZWQgY2hhciAqKXEpID49ICdBJyAmJiAoY2gyIDw9ICdaJykpDQorCQkJew0KKwkJCQljaDIgKz0gRElGRl9WQUxVRTsNCisJCQl9DQorCQkJcCsrOw0KKwkJCXErKzsNCisJCX13aGlsZShjaDEgJiYgY2gyICYmIChjaDEgPT0gY2gyKSk7DQorICAgICAgICAgICAgICAgIA0KKwkJaWYoY2gyID09ICdcMCcpDQorCQkJcmV0dXJuIHJlczsgDQorICAgICAgICBzb3VyY2UrKzsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCit9DQorDQorLy+3/s7xtsvTptPDs8zQ8qOst6LLzdbQvOS94bn7us3P7NOmtb3N4rK/TUNVDQoraW50IHNlbmRfcnNwX3N0cl90b19mYXJwcyhpbnQgIG1vZHVsZV9pZCwgY2hhciAqcnNwX2NtZCxpbnQgcnNwX2xlbikNCit7DQorCXJldHVybiBpcGNfc2VuZF9tZXNzYWdlKG1vZHVsZV9pZCwgTU9EVUxFX0lEX0FUX0NUTCwgTVNHX0NNRF9TRU5EX1JTUF9UT19PVVRTSURFLCByc3BfbGVuLCByc3BfY21kLCAwKTsNCit9DQorDQorDQordW5zaWduZWQgc2hvcnQgZ2V0X2Noa3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIsIHVuc2lnbmVkIHNob3J0IGxlbikNCit7DQorCXVuc2lnbmVkIGludCBzdW0gPSAwOw0KKwl1bnNpZ25lZCBpbnQgdG1wOw0KKwljb25zdCB1bnNpZ25lZCBjaGFyICplbmQ7DQorDQorCWVuZCA9IHB0ciArIGxlbiAtIDE7DQorDQorCXdoaWxlIChwdHIgPCBlbmQpIHsNCisJCXRtcCA9IChwdHJbMF0gPDwgOCkgKyBwdHJbMV07DQorCQlzdW0gKz0gdG1wOw0KKwkJaWYgKHN1bSA8IHRtcCkgew0KKwkJCXN1bSsrOw0KKwkJfQ0KKwkJcHRyICs9IDI7DQorCX0NCisNCisJaWYgKHB0ciA9PSBlbmQpIHsNCisJCXRtcCA9IHB0clswXSA8PCA4Ow0KKwkJc3VtICs9IHRtcDsNCisJCWlmIChzdW0gPCB0bXApIHsNCisJCQlzdW0rKzsNCisJCX0NCisJfQ0KKw0KKwlyZXR1cm4gc3VtOw0KK30NCisNCg==