LyoKICogbWliLmMKICoKICogJElkJAogKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqCiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRzLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmZGVmIFdJTjMyCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbmRpZgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NFTEVDVF9ICiNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgoKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9vdXRwdXRfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9jb25maWdfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC91dGlsaXRpZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2FzbjEuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbWliLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3BhcnNlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2ludDY0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfY2xpZW50Lmg+CgovKiogQGRlZmdyb3VwIG1pYl91dGlsaXRpZXMgbWliIHBhcnNpbmcgYW5kIGRhdGF0eXBlIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KICogIEBpbmdyb3VwIGxpYnJhcnkKICoKICogIEB7CiAqLwoKc3RhdGljIGNoYXIgICAgKnVwdGltZVN0cmluZyh1X2xvbmcsIGNoYXIgKiwgc2l6ZV90KTsKCnN0YXRpYyBzdHJ1Y3QgdHJlZSAqX2dldF9yZWFsbG9jX3N5bWJvbChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZfb3ZlcmZsb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBlbmRfb2Zfa25vd24pOwoKc3RhdGljIGludCAgICAgIHByaW50X3RyZWVfbm9kZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICp0cCwgaW50IHdpZHRoKTsKc3RhdGljIHZvaWQgICAgIGhhbmRsZV9taWJkaXJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpOwpzdGF0aWMgdm9pZCAgICAgaGFuZGxlX21pYnNfY29uZihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSk7CnN0YXRpYyB2b2lkICAgICBoYW5kbGVfbWliZmlsZV9jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKTsKCnN0YXRpYyB2b2lkICAgICBfb2lkX2ZpbmlzaF9wcmludGluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgaW50ICpidWZfb3ZlcmZsb3cpOwoKLyoKICogaGVscGVyIGZ1bmN0aW9ucyBmb3IgZ2V0X21vZHVsZV9ub2RlIAogKi8Kc3RhdGljIGludCAgICAgIG5vZGVfdG9fb2lkKHN0cnVjdCB0cmVlICosIG9pZCAqLCBzaXplX3QgKik7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnN0YXRpYyBpbnQgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHN0cnVjdCB0cmVlICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZWxzZQpzdGF0aWMgaW50ICAgICAgX2FkZF9zdHJpbmdzX3RvX29pZCh2b2lkICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICosIHNpemVfdCAqLCBzaXplX3QpOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwpleHRlcm4gc3RydWN0IHRyZWUgKnRyZWVfaGVhZDsKc3RhdGljIHN0cnVjdCB0cmVlICp0cmVlX3RvcDsKCnN0cnVjdCB0cmVlICAgICpNaWI7ICAgICAgICAgICAgLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKb2lkICAgICAgICAgICAgIFJGQzEyMTNfTUlCW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEgfTsKc3RhdGljIGNoYXIgICAgIFN0YW5kYXJkX1ByZWZpeFtdID0gIi4xLjMuNi4xLjIuMSI7CgovKgogKiBTZXQgZGVmYXVsdCBoZXJlIGFzIHNvbWUgdXNlcyBvZiByZWFkX29iamlkIHJlcXVpcmUgdmFsaWQgcG9pbnRlci4gCiAqLwpzdGF0aWMgY2hhciAgICAqUHJlZml4ID0gJlN0YW5kYXJkX1ByZWZpeFswXTsKdHlwZWRlZiBzdHJ1Y3QgX1ByZWZpeExpc3QgewogICAgY29uc3QgY2hhciAgICAgKnN0cjsKICAgIGludCAgICAgICAgICAgICBsZW47Cn0gICAgICAgICAgICAgICpQcmVmaXhMaXN0UHRyLCBQcmVmaXhMaXN0OwoKLyoKICogSGVyZSBhcmUgdGhlIHByZWZpeCBzdHJpbmdzLgogKiBOb3RlIHRoYXQgdGhlIGZpcnN0IG9uZSBmaW5kcyB0aGUgdmFsdWUgb2YgUHJlZml4IG9yIFN0YW5kYXJkX1ByZWZpeC4KICogQW55IG9mIHRoZXNlIE1BWSBzdGFydCB3aXRoIHBlcmlvZDsgYWxsIHdpbGwgTk9UIGVuZCB3aXRoIHBlcmlvZC4KICogUGVyaW9kIGlzIGFkZGVkIHdoZXJlIG5lZWRlZC4gIFNlZSB1c2Ugb2YgUHJlZml4IGluIHRoaXMgbW9kdWxlLgogKi8KUHJlZml4TGlzdCAgICAgIG1pYl9wcmVmaXhlc1tdID0gewogICAgeyZTdGFuZGFyZF9QcmVmaXhbMF19LCAgICAgIC8qIHBsYWNlaG9sZGVyIGZvciBQcmVmaXggZGF0YSAqLwogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQubWdtdC5taWItMiJ9LAogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQuZXhwZXJpbWVudGFsIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5wcml2YXRlIn0sCiAgICB7Ii5pc28ub3JnLmRvZC5pbnRlcm5ldC5zbm1wUGFydGllcyJ9LAogICAgeyIuaXNvLm9yZy5kb2QuaW50ZXJuZXQuc25tcFNlY3JldHMifSwKICAgIHtOVUxMLCAwfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgbGlzdCAqLwp9OwoKZW51bSBpbmV0X2FkZHJlc3NfdHlwZSB7CiAgICBJUFY0ID0gMSwKICAgIElQVjYgPSAyLAogICAgSVBWNFogPSAzLAogICAgSVBWNlogPSA0LAogICAgRE5TID0gMTYKfTsKCgovKioKICogQGludGVybmFsCiAqIENvbnZlcnRzIHRpbWV0aWNrcyB0byBob3VycywgbWludXRlcywgc2Vjb25kcyBzdHJpbmcuCiAqCiAqIEBwYXJhbSB0aW1ldGlja3MgICAgVGhlIHRpbWV0aWNrcyB0byBjb252ZXJ0LgogKiBAcGFyYW0gYnVmICAgICAgICAgIEJ1ZmZlciB0byB3cml0ZSB0bywgaGFzIHRvIGJlIGF0IAogKiAgICAgICAgICAgICAgICAgICAgIGxlYXN0IDQwIEJ5dGVzIGxhcmdlLgogKiAgICAgICAKICogQHJldHVybiBUaGUgYnVmZmVyLgogKi8Kc3RhdGljIGNoYXIgICAgKgp1cHRpbWVTdHJpbmcodV9sb25nIHRpbWV0aWNrcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgY2VudGlzZWNzLCBzZWNvbmRzLCBtaW51dGVzLCBob3VycywgZGF5czsKCiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKSkgewogICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWx1IiwgdGltZXRpY2tzKTsKICAgICAgICByZXR1cm4gYnVmOwogICAgfQoKCiAgICBjZW50aXNlY3MgPSB0aW1ldGlja3MgJSAxMDA7CiAgICB0aW1ldGlja3MgLz0gMTAwOwogICAgZGF5cyA9IHRpbWV0aWNrcyAvICg2MCAqIDYwICogMjQpOwogICAgdGltZXRpY2tzICU9ICg2MCAqIDYwICogMjQpOwoKICAgIGhvdXJzID0gdGltZXRpY2tzIC8gKDYwICogNjApOwogICAgdGltZXRpY2tzICU9ICg2MCAqIDYwKTsKCiAgICBtaW51dGVzID0gdGltZXRpY2tzIC8gNjA7CiAgICBzZWNvbmRzID0gdGltZXRpY2tzICUgNjA7CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpCiAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZDolZDolMDJkOiUwMmQuJTAyZCIsCiAgICAgICAgICAgICAgICBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgIGVsc2UgewogICAgICAgIGlmIChkYXlzID09IDApIHsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZDolMDJkOiUwMmQuJTAyZCIsCiAgICAgICAgICAgICAgICAgICAgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGNlbnRpc2Vjcyk7CiAgICAgICAgfSBlbHNlIGlmIChkYXlzID09IDEpIHsKICAgICAgICAgICAgc25wcmludGYoYnVmLCBidWZsZW4sICIlZCBkYXksICVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgICAgICBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkIGRheXMsICVkOiUwMmQ6JTAyZC4lMDJkIiwKICAgICAgICAgICAgICAgICAgICBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgY2VudGlzZWNzKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmOwp9CgoKCi8qKgogKiBAaW50ZXJuYWwKICogUHJpbnRzIHRoZSBjaGFyYWN0ZXIgcG9pbnRlZCB0byBpZiBpbiBodW1hbi1yZWFkYWJsZSBBU0NJSSByYW5nZSwKICogb3RoZXJ3aXNlIHByaW50cyBhIGRvdC4KICoKICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcHJpbnQgdGhlIGNoYXJhY3RlciB0by4KICogQHBhcmFtIGNoICBDaGFyYWN0ZXIgdG8gcHJpbnQuCiAqLwpzdGF0aWMgdm9pZApzcHJpbnRfY2hhcihjaGFyICpidWYsIGNvbnN0IHVfY2hhciBjaCkKewogICAgaWYgKGlzcHJpbnQoY2gpIHx8IGlzc3BhY2UoY2gpKSB7CiAgICAgICAgc3ByaW50ZihidWYsICIlYyIsIChpbnQpIGNoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc3ByaW50ZihidWYsICIuIik7CiAgICB9Cn0KCgoKLyoqCiAqIFByaW50cyBhIGhleGFkZWNpbWFsIHN0cmluZyBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgY2hhcmFjdGVycyBwb2ludGVkIGJ5ICpjcCBhcmUgZW5jb2RlZCBhcyBoZXhhZGVjaW1hbCBzdHJpbmcuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgYWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgaW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIGNwICAgICAgIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXJzIHRvIGVuY29kZS4KICogQHBhcmFtIGxpbmVfbGVuIHRoZSBhcnJheSBsZW5ndGggb2YgY3AuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50Cl9zcHJpbnRfaGV4c3RyaW5nX2xpbmUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsaW5lX2xlbikKewogICAgY29uc3QgdV9jaGFyICAgKnRwOwogICAgY29uc3QgdV9jaGFyICAgKmNwMiA9IGNwOwogICAgc2l6ZV90ICAgICAgICAgIGxlbmxlZnQgPSBsaW5lX2xlbjsKCiAgICAvKgogICAgICogTWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIHJvb20gZm9yIHRoZSBoZXggb3V0cHV0Li4uLgogICAgICovCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgbGluZV9sZW4qMysxKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogLi4uLiBhbmQgZGlzcGxheSB0aGUgaGV4IHZhbHVlcyB0aGVtc2VsdmVzLi4uLgogICAgICovCiAgICBmb3IgKDsgbGVubGVmdCA+PSA4OyBsZW5sZWZ0LT04KSB7CiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwKICAgICAgICAgICAgICAgICIlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggIiwgY3BbMF0sIGNwWzFdLAogICAgICAgICAgICAgICAgY3BbMl0sIGNwWzNdLCBjcFs0XSwgY3BbNV0sIGNwWzZdLCBjcFs3XSk7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgICAgICBjcCAgICAgICArPSA4OwogICAgfQogICAgZm9yICg7IGxlbmxlZnQgPiAwOyBsZW5sZWZ0LS0pIHsKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJTAyWCAiLCAqY3ArKyk7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgIH0KCiAgICAvKgogICAgICogLi4uLiBwbHVzIChvcHRpb25hbGx5KSBkbyB0aGUgc2FtZSBmb3IgdGhlIEFTQ0lJIGVxdWl2YWxlbnQuCiAgICAgKi8KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfSEVYX1RFWFQpKSB7CiAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIGxpbmVfbGVuKzUpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiICBbIik7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgICAgICBmb3IgKHRwID0gY3AyOyB0cCA8IGNwOyB0cCsrKSB7CiAgICAgICAgICAgIHNwcmludF9jaGFyKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAqdHApOwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgfQogICAgICAgIHNwcmludGYoKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbiksICJdIik7CiAgICAgICAgKm91dF9sZW4gKz0gc3RybGVuKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIGludCBsaW5lX2xlbiA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfSEVYX09VVFBVVF9MRU5HVEgpOwogICAgaWYgKCFsaW5lX2xlbikKICAgICAgICBsaW5lX2xlbj1sZW47CgogICAgZm9yICg7IChpbnQpbGVuID4gbGluZV9sZW47IGxlbiAtPSBsaW5lX2xlbikgewogICAgICAgIGlmKCFfc3ByaW50X2hleHN0cmluZ19saW5lKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3AsIGxpbmVfbGVuKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgKigqYnVmICsgKCpvdXRfbGVuKSsrKSA9ICdcbic7CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gMDsKICAgICAgICBjcCArPSBsaW5lX2xlbjsKICAgIH0KICAgIGlmKCFfc3ByaW50X2hleHN0cmluZ19saW5lKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3AsIGxlbikpCiAgICAgICAgcmV0dXJuIDA7CiAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAwOwogICAgcmV0dXJuIDE7Cn0KCgoKLyoqCiAqIFByaW50cyBhbiBhc2NpaSBzdHJpbmcgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIGNoYXJhY3RlcnMgcG9pbnRlZCBieSAqY3AgYXJlIGVuY29kZWQgYXMgYW4gYXNjaWkgc3RyaW5nLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBhZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBhZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gY3AgICAgICAgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgdG8gZW5jb2RlLgogKiBAcGFyYW0gbGVuICAgICAgdGhlIGFycmF5IGxlbmd0aCBvZiBjcC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgbGVuOyBpKyspIHsKICAgICAgICBpZiAoaXNwcmludCgqY3ApIHx8IGlzc3BhY2UoKmNwKSkgewogICAgICAgICAgICBpZiAoKmNwID09ICdcXCcgfHwgKmNwID09ICciJykgewogICAgICAgICAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gJ1xcJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCpvdXRfbGVuID49ICpidWZfbGVuKSAmJgogICAgICAgICAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKigqYnVmICsgKCpvdXRfbGVuKSsrKSA9ICpjcCsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgICAgICAgICAhKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAqKCpidWYgKyAoKm91dF9sZW4pKyspID0gJy4nOwogICAgICAgICAgICBjcCsrOwogICAgICAgIH0KICAgIH0KICAgIGlmICgoKm91dF9sZW4gPj0gKmJ1Zl9sZW4pICYmCiAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKICAgIHJldHVybiAxOwp9CgovKioKICogUHJpbnRzIGFuIG9jdGV0IHN0cmluZyBpbnRvIGEgYnVmZmVyLgogKgogKiBUaGUgdmFyaWFibGUgdmFyIGlzIGVuY29kZWQgYXMgb2N0ZXQgc3RyaW5nLgogKiAKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsIGNvbnN0IGNoYXIgKmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIHNhdmVkX291dF9sZW4gPSAqb3V0X2xlbjsKICAgIGNvbnN0IGNoYXIgICAgICpzYXZlZF9oaW50ID0gaGludDsKICAgIGludCAgICAgICAgICAgICBoZXggPSAwLCB4ID0gMDsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0LCBjbnQ7CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX09DVEVUX1NUUikgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICBjb25zdCBjaGFyICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE9DVEVUIFNUUklORyk6ICI7CiAgICAgICAgaWYgKHNubXBfY3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgoKICAgIGlmIChoaW50KSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHJlcGVhdCwgd2lkdGggPSAxOwogICAgICAgIGxvbmcgICAgICAgICAgICB2YWx1ZTsKICAgICAgICBjaGFyICAgICAgICAgICAgY29kZSA9ICdkJywgc2VwYXIgPSAwLCB0ZXJtID0gMCwgY2gsIGludGJ1ZlszMl07CiAgICAgICAgdV9jaGFyICAgICAgICAgKmVjcDsKCiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlNUUklORzogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNwID0gdmFyLT52YWwuc3RyaW5nOwogICAgICAgIGVjcCA9IGNwICsgdmFyLT52YWxfbGVuOwoKICAgICAgICB3aGlsZSAoY3AgPCBlY3ApIHsKICAgICAgICAgICAgcmVwZWF0ID0gMTsKICAgICAgICAgICAgaWYgKCpoaW50KSB7CiAgICAgICAgICAgICAgICBpZiAoKmhpbnQgPT0gJyonKSB7CiAgICAgICAgICAgICAgICAgICAgcmVwZWF0ID0gKmNwKys7CiAgICAgICAgICAgICAgICAgICAgaGludCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2lkdGggPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKCcwJyA8PSAqaGludCAmJiAqaGludCA8PSAnOScpCiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAod2lkdGggKiAxMCkgKyAoKmhpbnQrKyAtICcwJyk7CiAgICAgICAgICAgICAgICBjb2RlID0gKmhpbnQrKzsKICAgICAgICAgICAgICAgIGlmICgoY2ggPSAqaGludCkgJiYgY2ggIT0gJyonICYmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykKICAgICAgICAgICAgICAgICAgICAmJiAod2lkdGggIT0gMAogICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2ggIT0gJ3gnICYmIGNoICE9ICdkJyAmJiBjaCAhPSAnbycpKSkKICAgICAgICAgICAgICAgICAgICBzZXBhciA9ICpoaW50Kys7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgc2VwYXIgPSAwOwogICAgICAgICAgICAgICAgaWYgKChjaCA9ICpoaW50KSAmJiBjaCAhPSAnKicgJiYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQogICAgICAgICAgICAgICAgICAgICYmICh3aWR0aCAhPSAwCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaCAhPSAneCcgJiYgY2ggIT0gJ2QnICYmIGNoICE9ICdvJykpKQogICAgICAgICAgICAgICAgICAgIHRlcm0gPSAqaGludCsrOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHRlcm0gPSAwOwogICAgICAgICAgICAgICAgaWYgKHdpZHRoID09IDApICAvKiBIYW5kbGUgbWFsZm9ybWVkIGhpbnQgc3RyaW5ncyAqLwogICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKHJlcGVhdCAmJiBjcCA8IGVjcCkgewogICAgICAgICAgICAgICAgdmFsdWUgPSAwOwogICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gJ2EnICYmIGNvZGUgIT0gJ3QnKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDI1NiArICpjcCsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCXzJESUdJVF9IRVhfT1VUUFVUKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWx1ZSA8IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiMCVseCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVseCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsZCIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWxvIiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAndCc6IC8qIG5ldyBpbiByZmMgMzQxMSAqLwogICAgICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICAgICAgICAgY250ID0gU05NUF9NSU4od2lkdGgsIGVjcCAtIGNwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIGNwLCBjbnQpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBjcCArPSBjbnQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICpvdXRfbGVuID0gc2F2ZWRfb3V0X2xlbjsKICAgICAgICAgICAgICAgICAgICBpZiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoQmFkIGhpbnQgaWdub3JlZDogIikKICAgICAgICAgICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgc2F2ZWRfaGludCkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgIikgIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyhidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChjcCA8IGVjcCAmJiBzZXBhcikgewogICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAxKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gc2VwYXI7CiAgICAgICAgICAgICAgICAgICAgKCpvdXRfbGVuKSsrOwogICAgICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9ICdcMCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXBlYXQtLTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHRlcm0gJiYgY3AgPCBlY3ApIHsKICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAxKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHRlcm07CiAgICAgICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodW5pdHMpIHsKICAgICAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCgqb3V0X2xlbiA+PSAqYnVmX2xlbikgJiYKICAgICAgICAgICAgIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1wwJzsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgb3V0cHV0X2Zvcm1hdCA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1NUUklOR19PVVRQVVRfRk9STUFUKTsKICAgIGlmICgwID09IG91dHB1dF9mb3JtYXQpIHsKICAgICAgICBvdXRwdXRfZm9ybWF0ID0gTkVUU05NUF9TVFJJTkdfT1VUUFVUX0dVRVNTOwogICAgfQogICAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KSB7CiAgICBjYXNlIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9HVUVTUzoKICAgICAgICBoZXggPSAwOwogICAgICAgIGZvciAoY3AgPSB2YXItPnZhbC5zdHJpbmcsIHggPSAwOyB4IDwgKGludCkgdmFyLT52YWxfbGVuOyB4KyssIGNwKyspIHsKICAgICAgICAgICAgaWYgKCFpc3ByaW50KCpjcCkgJiYgIWlzc3BhY2UoKmNwKSkgewogICAgICAgICAgICAgICAgaGV4ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9BU0NJSToKICAgICAgICBoZXggPSAwOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0hFWDoKICAgICAgICBoZXggPSAxOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh2YXItPnZhbF9sZW4gPT0gMCkgewogICAgICAgIHJldHVybiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCJcIiIpOwogICAgfQoKICAgIGlmIChoZXgpIHsKICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiSGV4LVNUUklORzogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nLCB2YXItPnZhbF9sZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCIiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNUUklORzogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcIiIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2FzY2lpc3RyaW5nCiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHZhci0+dmFsLnN0cmluZywKICAgICAgICAgICAgIHZhci0+dmFsX2xlbikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiIikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCgovKioKICogUHJpbnRzIGEgZmxvYXQgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIHZhcmlhYmxlIHZhciBpcyBlbmNvZGVkIGFzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2Zsb2F0KHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX09QQVFVRV9GTE9BVCkgJiYKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIGlmIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICJXcm9uZyBUeXBlIChzaG91bGQgYmUgRmxvYXQpOiAiKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJPcGFxdWU6IEZsb2F0OiAiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBIb3cgbXVjaCBzcGFjZSBuZWVkZWQgZm9yIG1heC4gbGVuZ3RoIGZsb2F0PyAgMTI4IGlzIG92ZXJraWxsLiAgCiAgICAgKi8KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMTI4ICsgMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiVmIiwgKnZhci0+dmFsLmZsb2F0VmFsKTsKICAgICpvdXRfbGVuICs9IHN0cmxlbigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSk7CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgZG91YmxlIGludG8gYSBidWZmZXIuCiAqCiAqIFRoZSB2YXJpYWJsZSB2YXIgaXMgZW5jb2RlZCBhcyBhIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUuCiAqIAogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2RvdWJsZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0RPVUJMRSkgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICBpZiAoc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAgIldyb25nIFR5cGUgKHNob3VsZCBiZSBEb3VibGUpOiAiKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJPcGFxdWU6IEZsb2F0OiAiKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIEhvdyBtdWNoIHNwYWNlIG5lZWRlZCBmb3IgbWF4LiBsZW5ndGggZG91YmxlPyAgMTI4IGlzIG92ZXJraWxsLiAgCiAgICAgKi8KCiAgICB3aGlsZSAoKCpvdXRfbGVuICsgMTI4ICsgMSkgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiVmIiwgKnZhci0+dmFsLmRvdWJsZVZhbCk7CiAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTICovCgoKLyoqCiAqIFByaW50cyBhIGNvdW50ZXIgaW50byBhIGJ1ZmZlci4KICoKICogVGhlIHZhcmlhYmxlIHZhciBpcyBlbmNvZGVkIGFzIGEgY291bnRlciB2YWx1ZS4KICogCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICBhNjRidWZbSTY0Q0hBUlNaICsgMV07CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX0NPVU5URVI2NAojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfQ09VTlRFUjY0CiAgICAgICAgJiYgdmFyLT50eXBlICE9IEFTTl9PUEFRVUVfSTY0ICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX1U2NAojZW5kaWYKICAgICAgICApICYmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgaWYgKHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIAogICAgICAgICAgICAgICAgICAgICAgICAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIENvdW50ZXI2NCk6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICBpZiAodmFyLT50eXBlICE9IEFTTl9DT1VOVEVSNjQpIHsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJPcGFxdWU6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgICAgICBzd2l0Y2ggKHZhci0+dHlwZSkgewogICAgICAgIGNhc2UgQVNOX09QQVFVRV9VNjQ6CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiVUludDY0OiAiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBU05fT1BBUVVFX0k2NDoKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJJbnQ2NDogIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQVNOX0NPVU5URVI2NDoKICAgICAgICBjYXNlIEFTTl9PUEFRVUVfQ09VTlRFUjY0OgojZW5kaWYKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJDb3VudGVyNjQ6ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQojaWZkZWYgTkVUU05NUF9XSVRIX09QQVFVRV9TUEVDSUFMX1RZUEVTCiAgICAgICAgfQojZW5kaWYKICAgIH0KI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgaWYgKHZhci0+dHlwZSA9PSBBU05fT1BBUVVFX0k2NCkgewogICAgICAgIHByaW50STY0KGE2NGJ1ZiwgdmFyLT52YWwuY291bnRlcjY0KTsKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGE2NGJ1ZikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKI2VuZGlmCiAgICAgICAgcHJpbnRVNjQoYTY0YnVmLCB2YXItPnZhbC5jb3VudGVyNjQpOwogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgYTY0YnVmKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIH0KI2VuZGlmCgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIG9iamVjdCBpZGVudGlmaWVyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2Nfb3BhcXVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9PUEFRVUUKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0NPVU5URVI2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX1U2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0k2NAogICAgICAgICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0ZMT0FUICYmIHZhci0+dHlwZSAhPSBBU05fT1BBUVVFX0RPVUJMRQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwogICAgICAgICkgJiYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICBpZiAoc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIE9wYXF1ZSk6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICBjYXNlIEFTTl9PUEFRVUVfQ09VTlRFUjY0OgogICAgY2FzZSBBU05fT1BBUVVFX1U2NDoKICAgIGNhc2UgQVNOX09QQVFVRV9JNjQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09QQVFVRV9GTE9BVDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZmxvYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFX0RPVUJMRToKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZG91YmxlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUU6CiNlbmRpZgogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiT1BBUVVFOiAiOwogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZywgdmFyLT52YWxfbGVuKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIH0KI2VuZGlmCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIG9iamVjdCBpZGVudGlmaWVyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2Nfb2JqZWN0X2lkZW50aWZpZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fT0JKRUNUX0lEKSAmJgogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0KICAgICAgICAgICAgIldyb25nIFR5cGUgKHNob3VsZCBiZSBPQkpFQ1QgSURFTlRJRklFUik6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJPSUQ6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2lkICopICh2YXItPnZhbC5vYmppZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCkpOwoKICAgIGlmIChidWZfb3ZlcmZsb3cpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAodW5pdHMpIHsKICAgICAgICByZXR1cm4gKHNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiAiKQogICAgICAgICAgICAgICAgJiYgc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSB1bml0cykpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCgoKLyoqCiAqIFByaW50cyBhIHRpbWV0aWNrIHZhcmlhYmxlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGNoYXIgICAgICAgICAgICB0aW1lYnVmWzQwXTsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fVElNRVRJQ0tTKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgVGltZXRpY2tzKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OVU1FUklDX1RJTUVUSUNLUykpIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIiVsdSIsICoodV9sb25nICopIHZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgIHNwcmludGYoc3RyLCAiVGltZXRpY2tzOiAoJWx1KSAiLCAqKHVfbG9uZyAqKSB2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICB1cHRpbWVTdHJpbmcoKih1X2xvbmcgKikgKHZhci0+dmFsLmludGVnZXIpLCB0aW1lYnVmLCBzaXplb2YodGltZWJ1ZikpOwogICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgdGltZWJ1ZikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYW4gaW50ZWdlciBhY2NvcmRpbmcgdG8gdGhlIGhpbnQgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFsICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGRlY2ltYWx0eXBlICdkJyBvciAndScgZGVwZW5kaW5nIG9uIGludGVnZXIgdHlwZQogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IF9OT1RfIGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19oaW50ZWRfaW50ZWdlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB2YWwsIGNvbnN0IGNoYXIgZGVjaW1hbHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAgZm10WzEwXSA9ICIlbEAiLCB0bXBbMjU2XTsKICAgIGludCAgICAgICAgICAgICBzaGlmdCA9IDAsIGxlbiwgbmVnYXRpdmUgPSAwOwoKICAgIGlmIChoaW50WzBdID09ICdkJykgewogICAgICAgIC8qCiAgICAgICAgICogV2UgbWlnaHQgKmFjdHVhbGx5KiB3YW50IGEgJ3UnIGhlcmUuICAKICAgICAgICAgKi8KICAgICAgICBpZiAoaGludFsxXSA9PSAnLScpCiAgICAgICAgICAgIHNoaWZ0ID0gYXRvaShoaW50ICsgMik7CiAgICAgICAgZm10WzJdID0gZGVjaW1hbHR5cGU7CiAgICAgICAgaWYgKHZhbCA8IDApIHsKICAgICAgICAgICAgbmVnYXRpdmUgPSAxOwogICAgICAgICAgICB2YWwgPSAtdmFsOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyoKICAgICAgICAgKiBESVNQTEFZLUhJTlQgY2hhcmFjdGVyIGlzICdiJywgJ28nLCBvciAneCcuICAKICAgICAgICAgKi8KICAgICAgICBmbXRbMl0gPSBoaW50WzBdOwogICAgfQoKICAgIGlmIChoaW50WzBdID09ICdiJykgewoJdW5zaWduZWQgbG9uZyBpbnQgYml0ID0gMHg4MDAwMDAwMExVOwoJY2hhciAqYnAgPSB0bXA7Cgl3aGlsZSAoYml0KSB7CgkgICAgKmJwKysgPSB2YWwgJiBiaXQgPyAnMScgOiAnMCc7CgkgICAgYml0ID4+PSAxOwoJfQoJKmJwID0gMDsKICAgIH0KICAgIGVsc2UKCXNwcmludGYodG1wLCBmbXQsIHZhbCk7CgogICAgaWYgKHNoaWZ0ICE9IDApIHsKICAgICAgICBsZW4gPSBzdHJsZW4odG1wKTsKICAgICAgICBpZiAoc2hpZnQgPD0gbGVuKSB7CiAgICAgICAgICAgIHRtcFtsZW4gKyAxXSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChzaGlmdC0tKSB7CiAgICAgICAgICAgICAgICB0bXBbbGVuXSA9IHRtcFtsZW4gLSAxXTsKICAgICAgICAgICAgICAgIGxlbi0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtcFtsZW5dID0gJy4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRtcFtzaGlmdCArIDFdID0gMDsKICAgICAgICAgICAgd2hpbGUgKHNoaWZ0KSB7CiAgICAgICAgICAgICAgICBpZiAobGVuLS0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdG1wW3NoaWZ0XSA9IHRtcFtsZW5dOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0bXBbc2hpZnRdID0gJzAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2hpZnQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0bXBbMF0gPSAnLic7CiAgICAgICAgfQogICAgfQogICAgaWYgKG5lZ2F0aXZlKSB7CiAgICAgICAgbGVuID0gc3RybGVuKHRtcCkrMTsKICAgICAgICB3aGlsZSAobGVuKSB7CiAgICAgICAgICAgIHRtcFtsZW5dID0gdG1wW2xlbi0xXTsKICAgICAgICAgICAgbGVuLS07CiAgICAgICAgfQogICAgICAgIHRtcFswXSA9ICctJzsKICAgIH0KICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICh1X2NoYXIgKil0bXApOwp9CgoKLyoqCiAqIFByaW50cyBhbiBpbnRlZ2VyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfaW50ZWdlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgKmVudW1fc3RyaW5nID0gTlVMTDsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fSU5URUdFUikgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIElOVEVHRVIpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGZvciAoOyBlbnVtczsgZW51bXMgPSBlbnVtcy0+bmV4dCkgewogICAgICAgIGlmIChlbnVtcy0+dmFsdWUgPT0gKnZhci0+dmFsLmludGVnZXIpIHsKICAgICAgICAgICAgZW51bV9zdHJpbmcgPSBlbnVtcy0+bGFiZWw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIklOVEVHRVI6ICIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZW51bV9zdHJpbmcgPT0gTlVMTCB8fAogICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX0VOVU0pKSB7CiAgICAgICAgaWYgKGhpbnQpIHsKICAgICAgICAgICAgaWYgKCEoc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFyLT52YWwuaW50ZWdlciwgJ2QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LCB1bml0cykpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBzdHJbMzJdOwogICAgICAgICAgICBzcHJpbnRmKHN0ciwgIiVsZCIsICp2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlbnVtX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICBzcHJpbnRmKHN0ciwgIiglbGQpIiwgKnZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHVuaXRzKSB7CiAgICAgICAgcmV0dXJuIChzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopICIgIikKICAgICAgICAgICAgICAgICYmIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgdW5pdHMpKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoKLyoqCiAqIFByaW50cyBhbiB1bnNpZ25lZCBpbnRlZ2VyIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfdWludGVnZXIodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBjaGFyICAgICAgICAgICAqZW51bV9zdHJpbmcgPSBOVUxMOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9VSU5URUdFUikgJiYgCiAgICAgICAgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiV3JvbmcgVHlwZSAoc2hvdWxkIGJlIFVJbnRlZ2VyMzIpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKDsgZW51bXM7IGVudW1zID0gZW51bXMtPm5leHQpIHsKICAgICAgICBpZiAoZW51bXMtPnZhbHVlID09ICp2YXItPnZhbC5pbnRlZ2VyKSB7CiAgICAgICAgICAgIGVudW1fc3RyaW5nID0gZW51bXMtPmxhYmVsOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGVudW1fc3RyaW5nID09IE5VTEwgfHwKICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKSkgewogICAgICAgIGlmIChoaW50KSB7CiAgICAgICAgICAgIGlmICghKHNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhci0+dmFsLmludGVnZXIsICd1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCwgdW5pdHMpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGFyICAgICAgICAgICAgc3RyWzMyXTsKICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlbHUiLCAqdmFyLT52YWwuaW50ZWdlcik7CiAgICAgICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBzdHIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgc3ByaW50ZihzdHIsICIoJWx1KSIsICp2YXItPnZhbC5pbnRlZ2VyKTsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGVudW1fc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBnYXVnZSB2YWx1ZSBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2dhdWdlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgIHRtcFszMl07CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX0dBVUdFKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9CiAgICAgICAgICAgICJXcm9uZyBUeXBlIChzaG91bGQgYmUgR2F1Z2UzMiBvciBVbnNpZ25lZDMyKTogIjsKICAgICAgICBpZiAoc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIkdhdWdlMzI6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgaWYgKGhpbnQpIHsKICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX2hpbnRlZF9pbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFyLT52YWwuaW50ZWdlciwgJ3UnLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgc3ByaW50Zih0bXAsICIldSIsICh1bnNpZ25lZCBpbnQpKCp2YXItPnZhbC5pbnRlZ2VyICYgMHhmZmZmZmZmZikpOwogICAgICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgKGNvbnN0IHVfY2hhciAqKSB0bXApKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBjb3VudGVyIHZhbHVlIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfY291bnRlcih1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgY2hhciAgICAgICAgICAgIHRtcFszMl07CgogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX0NPVU5URVIpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBDb3VudGVyMzIpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiQ291bnRlcjMyOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIHNwcmludGYodG1wLCAiJXUiLCAodW5zaWduZWQgaW50KSgqdmFyLT52YWwuaW50ZWdlciAmIDB4ZmZmZmZmZmYpKTsKICAgIGlmICghc25tcF9zdHJjYXQKICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAoY29uc3QgdV9jaGFyICopIHRtcCkpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICh1bml0cykgewogICAgICAgIHJldHVybiAoc25tcF9zdHJjYXQKICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpCiAgICAgICAgICAgICAgICAmJiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHVuaXRzKSk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKCi8qKgogKiBQcmludHMgYSBuZXR3b3JrIGFkZHJlc3MgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19uZXR3b3JrYWRkcmVzcyh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBpOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9JUEFERFJFU1MpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBOZXR3b3JrQWRkcmVzcyk6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJOZXR3b3JrIEFkZHJlc3M6ICI7CiAgICAgICAgaWYgKCFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlICgoKm91dF9sZW4gKyAodmFyLT52YWxfbGVuICogMykgKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgdmFyLT52YWxfbGVuOyBpKyspIHsKICAgICAgICBzcHJpbnRmKChjaGFyICopICgqYnVmICsgKm91dF9sZW4pLCAiJTAyWCIsIHZhci0+dmFsLnN0cmluZ1tpXSk7CiAgICAgICAgKm91dF9sZW4gKz0gMjsKICAgICAgICBpZiAoaSA8IHZhci0+dmFsX2xlbiAtIDEpIHsKICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJzonOwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGFuIGlwLWFkZHJlc3MgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19pcGFkZHJlc3ModV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgdV9jaGFyICAgICAgICAgKmlwID0gdmFyLT52YWwuc3RyaW5nOwoKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9JUEFERFJFU1MpICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBJcEFkZHJlc3MpOiAiOwogICAgICAgIGlmIChzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCkpIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiSXBBZGRyZXNzOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIHdoaWxlICgoKm91dF9sZW4gKyAxNykgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaXApCiAgICAgICAgc3ByaW50ZigoY2hhciAqKSAoKmJ1ZiArICpvdXRfbGVuKSwgIiVkLiVkLiVkLiVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcFswXSwgaXBbMV0sIGlwWzJdLCBpcFszXSk7CiAgICAqb3V0X2xlbiArPSBzdHJsZW4oKGNoYXIgKikgKCpidWYgKyAqb3V0X2xlbikpOwogICAgcmV0dXJuIDE7Cn0KCgovKioKICogUHJpbnRzIGEgbnVsbCB2YWx1ZSBpbnRvIGEgYnVmZmVyLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX251bGwodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGlmICgodmFyLT50eXBlICE9IEFTTl9OVUxMKSAmJiAKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgTlVMTCk6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiTlVMTCI7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKTsKICAgIH0KfQoKCi8qKgogKiBQcmludHMgYSBiaXQgc3RyaW5nIGludG8gYSBidWZmZXIuCiAqCiAqIElmIGFsbG93X3JlYWxsb2MgaXMgdHJ1ZSB0aGUgYnVmZmVyIHdpbGwgYmUgKHJlKWFsbG9jYXRlZCB0byBmaXQgaW4gdGhlIAogKiBuZWVkZWQgc2l6ZS4gKE5vdGU6ICpidWYgbWF5IGNoYW5nZSBkdWUgdG8gdGhpcy4pCiAqIAogKiBAcGFyYW0gYnVmICAgICAgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHByaW50IHRvLgogKiBAcGFyYW0gYnVmX2xlbiAgQWRkcmVzcyB0byBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgYnVmLgogKiBAcGFyYW0gb3V0X2xlbiAgSW5jcmVtZW50ZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCiAqIEBwYXJhbSBhbGxvd19yZWFsbG9jIGlmIG5vdCB6ZXJvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlciB0byBmaXQgdGhlIAogKiAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZS4KICogQHBhcmFtIHZhciAgICAgIFRoZSB2YXJpYWJsZSB0byBlbmNvZGUuCiAqIEBwYXJhbSBlbnVtcyAgICBUaGUgZW51bWVyYXRpb24gZmYgdGhpcyB2YXJpYWJsZSBpcyBlbnVtZXJhdGVkLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIGhpbnQgICAgIENvbnRlbnRzIG9mIHRoZSBESVNQTEFZLUhJTlQgY2xhdXNlIG9mIHRoZSBNSUIuCiAqICAgICAgICAgICAgICAgICBTZWUgUkZDIDE5MDMgU2VjdGlvbiAzLjEgZm9yIGRldGFpbHMuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gdW5pdHMgICAgQ29udGVudHMgb2YgdGhlIFVOSVRTIGNsYXVzZSBvZiB0aGUgTUlCLiBtYXkgYmUgTlVMTC4KICogCiAqIEByZXR1cm4gMSBvbiBzdWNjZXNzLCBvciAwIG9uIGZhaWx1cmUgKG91dCBvZiBtZW1vcnksIG9yIGJ1ZmZlciB0bwogKiAgICAgICAgIHNtYWxsIHdoZW4gbm90IGFsbG93ZWQgdG8gcmVhbGxvYy4pCiAqLwppbnQKc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIGludCAgICAgICAgICAgICBsZW4sIGJpdDsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIGNoYXIgICAgICAgICAgICplbnVtX3N0cmluZzsKCiAgICBpZiAoKHZhci0+dHlwZSAhPSBBU05fQklUX1NUUiAmJiB2YXItPnR5cGUgIT0gQVNOX09DVEVUX1NUUikgJiYKICAgICAgICAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQpKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJXcm9uZyBUeXBlIChzaG91bGQgYmUgQklUUyk6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIlwiIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJCSVRTOiAiOwogICAgICAgIGlmICghc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGlmICghc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLmJpdHN0cmluZywgdmFyLT52YWxfbGVuKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIlwiIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNwID0gdmFyLT52YWwuYml0c3RyaW5nOwogICAgICAgIGZvciAobGVuID0gMDsgbGVuIDwgKGludCkgdmFyLT52YWxfbGVuOyBsZW4rKykgewogICAgICAgICAgICBmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoKmNwICYgKDB4ODAgPj4gYml0KSkgewogICAgICAgICAgICAgICAgICAgIGVudW1fc3RyaW5nID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZW51bXM7IGVudW1zID0gZW51bXMtPm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1zLT52YWx1ZSA9PSAobGVuICogOCkgKyBiaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fc3RyaW5nID0gZW51bXMtPmxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1fc3RyaW5nID09IE5VTEwgfHwKICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX1BSSU5UX05VTUVSSUNfRU5VTSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJWQgIiwgKGxlbiAqIDgpICsgYml0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIHN0cikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIHN0clszMl07CiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiKCVkKSAiLCAobGVuICogOCkgKyBiaXQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgZW51bV9zdHJpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgc3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3ArKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKaW50CnNwcmludF9yZWFsbG9jX25zYXBhZGRyZXNzKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgaWYgKCh2YXItPnR5cGUgIT0gQVNOX05TQVApICYmIAogICAgICAgICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCkpKSB7CiAgICAgICAgdV9jaGFyICAgICAgICAgIHN0cltdID0gIldyb25nIFR5cGUgKHNob3VsZCBiZSBOc2FwQWRkcmVzcyk6ICI7CiAgICAgICAgaWYgKHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKSkgewogICAgICAgIHVfY2hhciAgICAgICAgICBzdHJbXSA9ICJOc2FwQWRkcmVzczogIjsKICAgICAgICBpZiAoIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2hleHN0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZywgdmFyLT52YWxfbGVuKTsKfQoKCi8qKgogKiBGYWxsYmFjayByb3V0aW5lIGZvciBhIGJhZCB0eXBlLCBwcmludHMgIlZhcmlhYmxlIGhhcyBiYWQgdHlwZSIgaW50byBhIGJ1ZmZlci4KICoKICogSWYgYWxsb3dfcmVhbGxvYyBpcyB0cnVlIHRoZSBidWZmZXIgd2lsbCBiZSAocmUpYWxsb2NhdGVkIHRvIGZpdCBpbiB0aGUgCiAqIG5lZWRlZCBzaXplLiAoTm90ZTogKmJ1ZiBtYXkgY2hhbmdlIGR1ZSB0byB0aGlzLikKICogCiAqIEBwYXJhbSBidWYgICAgICBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSBidWZfbGVuICBBZGRyZXNzIHRvIGFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBidWYuCiAqIEBwYXJhbSBvdXRfbGVuICBJbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KICogQHBhcmFtIGFsbG93X3JlYWxsb2MgaWYgbm90IHplcm8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIGZpdCB0aGUgCiAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBzaXplLgogKiBAcGFyYW0gdmFyICAgICAgVGhlIHZhcmlhYmxlIHRvIGVuY29kZS4KICogQHBhcmFtIGVudW1zICAgIFRoZSBlbnVtZXJhdGlvbiBmZiB0aGlzIHZhcmlhYmxlIGlzIGVudW1lcmF0ZWQuIG1heSBiZSBOVUxMLgogKiBAcGFyYW0gaGludCAgICAgQ29udGVudHMgb2YgdGhlIERJU1BMQVktSElOVCBjbGF1c2Ugb2YgdGhlIE1JQi4KICogICAgICAgICAgICAgICAgIFNlZSBSRkMgMTkwMyBTZWN0aW9uIDMuMSBmb3IgZGV0YWlscy4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSB1bml0cyAgICBDb250ZW50cyBvZiB0aGUgVU5JVFMgY2xhdXNlIG9mIHRoZSBNSUIuIG1heSBiZSBOVUxMLgogKiAKICogQHJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIDAgb24gZmFpbHVyZSAob3V0IG9mIG1lbW9yeSwgb3IgYnVmZmVyIHRvCiAqICAgICAgICAgc21hbGwgd2hlbiBub3QgYWxsb3dlZCB0byByZWFsbG9jLikKICovCmludApzcHJpbnRfcmVhbGxvY19iYWR0eXBlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICB1X2NoYXIgICAgICAgICAgc3RyW10gPSAiVmFyaWFibGUgaGFzIGJhZCB0eXBlIjsKCiAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpOwp9CgoKCi8qKgogKiBVbml2ZXJzYWwgcHJpbnQgcm91dGluZSwgcHJpbnRzIGEgdmFyaWFibGUgaW50byBhIGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHZhcmlhYmxlIAogKiB0eXBlLgogKgogKiBJZiBhbGxvd19yZWFsbG9jIGlzIHRydWUgdGhlIGJ1ZmZlciB3aWxsIGJlIChyZSlhbGxvY2F0ZWQgdG8gZml0IGluIHRoZSAKICogbmVlZGVkIHNpemUuIChOb3RlOiAqYnVmIG1heSBjaGFuZ2UgZHVlIHRvIHRoaXMuKQogKiAKICogQHBhcmFtIGJ1ZiAgICAgIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB0byBwcmludCB0by4KICogQHBhcmFtIGJ1Zl9sZW4gIEFkZHJlc3MgdG8gYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBzaXplIG9mIGJ1Zi4KICogQHBhcmFtIG91dF9sZW4gIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgogKiBAcGFyYW0gYWxsb3dfcmVhbGxvYyBpZiBub3QgemVybyByZWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gZml0IHRoZSAKICogICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHNpemUuCiAqIEBwYXJhbSB2YXIgICAgICBUaGUgdmFyaWFibGUgdG8gZW5jb2RlLgogKiBAcGFyYW0gZW51bXMgICAgVGhlIGVudW1lcmF0aW9uIGZmIHRoaXMgdmFyaWFibGUgaXMgZW51bWVyYXRlZC4gbWF5IGJlIE5VTEwuCiAqIEBwYXJhbSBoaW50ICAgICBDb250ZW50cyBvZiB0aGUgRElTUExBWS1ISU5UIGNsYXVzZSBvZiB0aGUgTUlCLgogKiAgICAgICAgICAgICAgICAgU2VlIFJGQyAxOTAzIFNlY3Rpb24gMy4xIGZvciBkZXRhaWxzLiBtYXkgYmUgTlVMTC4KICogQHBhcmFtIHVuaXRzICAgIENvbnRlbnRzIG9mIHRoZSBVTklUUyBjbGF1c2Ugb2YgdGhlIE1JQi4gbWF5IGJlIE5VTEwuCiAqIAogKiBAcmV0dXJuIDEgb24gc3VjY2Vzcywgb3IgMCBvbiBmYWlsdXJlIChvdXQgb2YgbWVtb3J5LCBvciBidWZmZXIgdG8KICogICAgICAgICBzbWFsbCB3aGVuIG5vdCBhbGxvd2VkIHRvIHJlYWxsb2MuKQogKi8KaW50CnNwcmludF9yZWFsbG9jX2J5X3R5cGUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIERFQlVHTVNHVEwoKCJvdXRwdXQiLCAic3ByaW50X2J5X3R5cGUsIHR5cGUgJWRcbiIsIHZhci0+dHlwZSkpOwoKICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICBjYXNlIEFTTl9JTlRFR0VSOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19pbnRlZ2VyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgY2FzZSBBU05fQklUX1NUUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYml0c3RyaW5nKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29wYXF1ZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9PQkpFQ1RfSUQ6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCwgdW5pdHMpOwogICAgY2FzZSBBU05fVElNRVRJQ0tTOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY190aW1ldGlja3MoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgIGNhc2UgQVNOX0dBVUdFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19nYXVnZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX0NPVU5URVI6CiAgICAgICAgcmV0dXJuIHNwcmludF9yZWFsbG9jX2NvdW50ZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKTsKICAgIGNhc2UgQVNOX0lQQUREUkVTUzoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9OVUxMOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19udWxsKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9VSU5URUdFUjoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfdWludGVnZXIoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXIsIGVudW1zLCBoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiAgICBjYXNlIEFTTl9DT1VOVEVSNjQ6CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGNhc2UgQVNOX09QQVFVRV9VNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgogICAgY2FzZSBBU05fT1BBUVVFX0NPVU5URVI2NDoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyk7CiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGNhc2UgQVNOX09QQVFVRV9GTE9BVDoKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfZmxvYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cyk7CiAgICBjYXNlIEFTTl9PUEFRVUVfRE9VQkxFOgogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19kb3VibGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic3ByaW50X2J5X3R5cGUiLCAiYmFkIHR5cGU6ICVkXG4iLCB2YXItPnR5cGUpKTsKICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYmFkdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpOwogICAgfQp9CgoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKLyoqCiAqIFJldHJpZXZlcyB0aGUgdHJlZSBoZWFkLgogKgogKiBAcmV0dXJuIHRoZSB0cmVlIGhlYWQuCiAqLwpzdHJ1Y3QgdHJlZSAgICAqCmdldF90cmVlX2hlYWQodm9pZCkKewogICAgcmV0dXJuICh0cmVlX2hlYWQpOwp9CgpzdGF0aWMgY2hhciAgICAqY29uZm1pYmRpciA9IE5VTEw7CnN0YXRpYyBjaGFyICAgICpjb25mbWlicyA9IE5VTEw7CgpzdGF0aWMgdm9pZApoYW5kbGVfbWliZGlyc19jb25mKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjaGFyICAgICAgICAgICAqY3RtcDsKCiAgICBpZiAoY29uZm1pYmRpcikgewogICAgICAgIGlmICgoKmxpbmUgPT0gJysnKSB8fCAoKmxpbmUgPT0gJy0nKSkgewogICAgICAgICAgICBjdG1wID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihjb25mbWliZGlyKSArIHN0cmxlbihsaW5lKSArIDIpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaWJkaXIgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCpsaW5lKysgPT0gJysnKQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgY29uZm1pYmRpciwgRU5WX1NFUEFSQVRPUl9DSEFSLCBsaW5lKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc3ByaW50ZihjdG1wLCAiJXMlYyVzIiwgbGluZSwgRU5WX1NFUEFSQVRPUl9DSEFSLCBjb25mbWliZGlyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdG1wID0gc3RyZHVwKGxpbmUpOwogICAgICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgIm1pYnMgY29uZiBtYWxsb2MgZmFpbGVkIikpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShjb25mbWliZGlyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25mbWliZGlyID0gY3RtcDsKICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgInVzaW5nIG1pYmRpcnM6ICVzXG4iLCBjb25mbWliZGlyKSk7Cn0KCnN0YXRpYyB2b2lkCmhhbmRsZV9taWJzX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIGNoYXIgICAgICAgICAgICpjdG1wOwoKICAgIGlmIChjb25mbWlicykgewogICAgICAgIGlmICgoKmxpbmUgPT0gJysnKSB8fCAoKmxpbmUgPT0gJy0nKSkgewogICAgICAgICAgICBjdG1wID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihjb25mbWlicykgKyBzdHJsZW4obGluZSkgKyAyKTsKICAgICAgICAgICAgaWYgKCFjdG1wKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJtaWJzIGNvbmYgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZigqbGluZSsrID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYoY3RtcCwgIiVzJWMlcyIsIGNvbmZtaWJzLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGxpbmUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKGN0bXAsICIlcyVjJXMiLCBsaW5lLCBFTlZfU0VQQVJBVE9SX0NIQVIsIGNvbmZtaWJkaXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN0bXAgPSBzdHJkdXAobGluZSk7CiAgICAgICAgICAgIGlmICghY3RtcCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKGNvbmZtaWJzKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY3RtcCA9IHN0cmR1cChsaW5lKTsKICAgICAgICBpZiAoIWN0bXApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInJlYWRfY29uZmlnOmluaXRtaWIiLCAibWlicyBjb25mIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBjb25mbWlicyA9IGN0bXA7CiAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJ1c2luZyBtaWJzOiAlc1xuIiwgY29uZm1pYnMpKTsKfQoKCnN0YXRpYyB2b2lkCmhhbmRsZV9taWJmaWxlX2NvbmYoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIERFQlVHTVNHVEwoKCJyZWFkX2NvbmZpZzppbml0bWliIiwgInJlYWRpbmcgbWliZmlsZTogJXNcbiIsIGxpbmUpKTsKICAgIHJlYWRfbWliKGxpbmUpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQKaGFuZGxlX3ByaW50X251bWVyaWMoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIGNvbnN0IGNoYXIgKnZhbHVlOwogICAgY2hhciAgICAgICAqc3Q7CgogICAgdmFsdWUgPSBzdHJ0b2tfcihsaW5lLCAiIFx0XG4iLCAmc3QpOwogICAgaWYgKHZhbHVlICYmICgKCSAgICAoc3RyY2FzZWNtcCh2YWx1ZSwgInllcyIpICA9PSAwKSB8fCAKCSAgICAoc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSA9PSAwKSB8fAoJICAgICgqdmFsdWUgPT0gJzEnKSApKSB7CgogICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDKTsKICAgIH0KfQoKY2hhciAgICAgICAgICAgKgpzbm1wX291dF90b2dnbGVfb3B0aW9ucyhjaGFyICpvcHRpb25zKQp7CiAgICB3aGlsZSAoKm9wdGlvbnMpIHsKICAgICAgICBzd2l0Y2ggKCpvcHRpb25zKyspIHsKICAgICAgICBjYXNlICcwJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfMkRJR0lUX0hFWF9PVVRQVVQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfU1RSSU5HX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfU1RSSU5HX09VVFBVVF9BU0NJSSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9CUkVBS0RPV05fT0lEUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX09JRF9PVVRQVVRfRlVMTCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX05VTUVSSUMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdxJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnUSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQsIDEpOwogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9TVUZGSVgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdTJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnVCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9IRVhfVEVYVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9PSURfT1VUUFVUX1VDRCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfQkFSRV9WQUxVRSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9TVFJJTkdfT1VUUFVUX0ZPUk1BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9TVFJJTkdfT1VUUFVUX0hFWCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1gnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVhURU5ERURfSU5ERVgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gb3B0aW9ucyAtIDE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCnZvaWQKc25tcF9vdXRfdG9nZ2xlX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqbGVhZCwgRklMRSAqIG91dGYpCnsKICAgIGZwcmludGYob3V0ZiwgIiVzMDogIHByaW50IGxlYWRpbmcgMCBmb3Igc2luZ2xlLWRpZ2l0IGhleCBjaGFyYWN0ZXJzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzYTogIHByaW50IGFsbCBzdHJpbmdzIGluIGFzY2lpIGZvcm1hdFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2I6ICBkbyBub3QgYnJlYWsgT0lEIGluZGV4ZXMgZG93blxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc2U6ICBwcmludCBlbnVtcyBudW1lcmljYWxseVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc0U6ICBlc2NhcGUgcXVvdGVzIGluIHN0cmluZyBpbmRpY2VzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzZjogIHByaW50IGZ1bGwgT0lEcyBvbiBvdXRwdXRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNuOiAgcHJpbnQgT0lEcyBudW1lcmljYWxseVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3E6ICBxdWljayBwcmludCBmb3IgZWFzaWVyIHBhcnNpbmdcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNROiAgcXVpY2sgcHJpbnQgd2l0aCBlcXVhbC1zaWduc1xuIiwgbGVhZCk7ICAgIC8qIEBASkRXICovCiAgICBmcHJpbnRmKG91dGYsICIlc3M6ICBwcmludCBvbmx5IGxhc3Qgc3ltYm9saWMgZWxlbWVudCBvZiBPSURcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNTOiAgcHJpbnQgTUlCIG1vZHVsZS1pZCBwbHVzIGxhc3QgZWxlbWVudFxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc3Q6ICBwcmludCB0aW1ldGlja3MgdW5wYXJzZWQgYXMgbnVtZXJpYyBpbnRlZ2Vyc1xuIiwKICAgICAgICAgICAgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsCiAgICAgICAgICAgICIlc1Q6ICBwcmludCBodW1hbi1yZWFkYWJsZSB0ZXh0IGFsb25nIHdpdGggaGV4IHN0cmluZ3NcbiIsCiAgICAgICAgICAgIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXN1OiAgcHJpbnQgT0lEcyB1c2luZyBVQ0Qtc3R5bGUgcHJlZml4IHN1cHByZXNzaW9uXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzVTogIGRvbid0IHByaW50IHVuaXRzXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzdjogIHByaW50IHZhbHVlcyBvbmx5IChub3QgT0lEID0gdmFsdWUpXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzeDogIHByaW50IGFsbCBzdHJpbmdzIGluIGhleCBmb3JtYXRcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNYOiAgZXh0ZW5kZWQgaW5kZXggZm9ybWF0XG4iLCBsZWFkKTsKfQoKY2hhciAqCnNubXBfaW5fb3B0aW9ucyhjaGFyICpvcHRhcmcsIGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndikKewogICAgY2hhciAqY3A7CgogICAgZm9yIChjcCA9IG9wdGFyZzsgKmNwOyBjcCsrKSB7CiAgICAgICAgc3dpdGNoICgqY3ApIHsKICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFR0VYX0FDQ0VTUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkFORE9NX0FDQ0VTUyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRE9OVF9DSEVDS19SQU5HRSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTk9fRElTUExBWV9ISU5UKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUFEX1VDRF9TVFlMRV9PSUQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgLyogV2hhdCBpZiBhcmdjL2FyZ3YgYXJlIG51bGwgPyAqLwogICAgICAgICAgICBpZiAoISooKytjcCkpCiAgICAgICAgICAgICAgICBjcCA9IGFyZ3Zbb3B0aW5kKytdOwogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEU1VGRklYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgIC8qIFdoYXQgaWYgYXJnYy9hcmd2IGFyZSBudWxsID8gKi8KICAgICAgICAgICAgaWYgKCEqKCsrY3ApKQogICAgICAgICAgICAgICAgY3AgPSBhcmd2W29wdGluZCsrXTsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX09JRFBSRUZJWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgLyoKICAgICAgICAgICAgKiAgSGVyZT8gIE9yIGluIHNubXBfcGFyc2VfYXJncz8KICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVua25vd24gaW5wdXQgb3B0aW9uIHBhc3NlZCB0byAtSTogJWMuXG4iLCAqY3ApOwogICAgICAgICAgICAqLwogICAgICAgICAgICByZXR1cm4gY3A7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCmNoYXIgICAgICAgICAgICoKc25tcF9pbl90b2dnbGVfb3B0aW9ucyhjaGFyICpvcHRpb25zKQp7CiAgICByZXR1cm4gc25tcF9pbl9vcHRpb25zKCBvcHRpb25zLCAwLCBOVUxMICk7Cn0KCgovKioKICogUHJpbnRzIG91dCBhIGhlbHAgdXNhZ2UgZm9yIHRoZSBpbiogdG9nZ2xlIG9wdGlvbnMuCiAqCiAqIEBwYXJhbSBsZWFkICAgICAgVGhlIGxlYWQgdG8gcHJpbnQgZm9yIGV2ZXJ5IGxpbmUuCiAqIEBwYXJhbSBvdXRmICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSB0by4KICogCiAqLwp2b2lkCnNubXBfaW5fdG9nZ2xlX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqbGVhZCwgRklMRSAqIG91dGYpCnsKICAgIGZwcmludGYob3V0ZiwgIiVzYjogIGRvIGJlc3QvcmVnZXggbWF0Y2hpbmcgdG8gZmluZCBhIE1JQiBub2RlXG4iLCBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwgIiVzaDogIGRvbid0IGFwcGx5IERJU1BMQVktSElOVHNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLCAiJXNyOiAgZG8gbm90IGNoZWNrIHZhbHVlcyBmb3IgcmFuZ2UvdHlwZSBsZWdhbGl0eVxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc1I6ICBkbyByYW5kb20gYWNjZXNzIHRvIE9JRCBsYWJlbHNcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXN1OiAgdG9wLWxldmVsIE9JRHMgbXVzdCBoYXZlICcuJyBwcmVmaXggKFVDRC1zdHlsZSlcbiIsIGxlYWQpOwogICAgZnByaW50ZihvdXRmLAogICAgICAgICAgICAiJXNzIFNVRkZJWDogIEFwcGVuZCBhbGwgdGV4dHVhbCBPSURzIHdpdGggU1VGRklYIGJlZm9yZSBwYXJzaW5nXG4iLAogICAgICAgICAgICBsZWFkKTsKICAgIGZwcmludGYob3V0ZiwKICAgICAgICAgICAgIiVzUyBQUkVGSVg6ICBQcmVwZW5kIGFsbCB0ZXh0dWFsIE9JRHMgd2l0aCBQUkVGSVggYmVmb3JlIHBhcnNpbmdcbiIsCiAgICAgICAgICAgIGxlYWQpOwp9CgovKioqCiAqCiAqLyAKdm9pZApyZWdpc3Rlcl9taWJfaGFuZGxlcnModm9pZCkKewojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcigic25tcCIsICJtaWJkaXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX21pYmRpcnNfY29uZiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlttaWItZGlyc3wrbWliLWRpcnN8LW1pYi1kaXJzXSIpOwogICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcigic25tcCIsICJtaWJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX21pYnNfY29uZiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlttaWItdG9rZW5zfCttaWItdG9rZW5zXSIpOwogICAgcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoInNubXAiLCAibWliZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfbWliZmlsZV9jb25mLCBOVUxMLCAibWliZmlsZS10by1yZWFkIik7CiAgICAvKgogICAgICogcmVnaXN0ZXIgdGhlIHNubXAuY29uZiBjb25maWd1cmF0aW9uIGhhbmRsZXJzIGZvciBkZWZhdWx0CiAgICAgKiBwYXJzaW5nIGJlaGF2aW91ciAKICAgICAqLwoKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJzaG93TWliRXJyb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9FUlJPUlMpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInN0cmljdENvbW1lbnRUZXJtIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgIm1pYkFsbG93VW5kZXJsaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9QQVJTRV9MQUJFTCk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fSU5URUdFUiwgInNubXAiLCAibWliV2FybmluZ0xldmVsIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUyk7CiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAibWliUmVwbGFjZVdpdGhMYXRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX1JFUExBQ0UpOwojZW5kaWYKCiAgICBuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYihBU05fQk9PTEVBTiwgInNubXAiLCAicHJpbnROdW1lcmljRW51bXMiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNKTsKICAgIHJlZ2lzdGVyX3ByZW5ldHNubXBfbWliX2hhbmRsZXIoInNubXAiLCAicHJpbnROdW1lcmljT2lkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3ByaW50X251bWVyaWMsIE5VTEwsICIoMXx5ZXN8dHJ1ZXwwfG5vfGZhbHNlKSIpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImVzY2FwZVF1b3RlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJkb250QnJlYWtkb3duT2lkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0JSRUFLRE9XTl9PSURTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJxdWlja1ByaW50aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJudW1lcmljVGltZXRpY2tzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9JTlRFR0VSLCAic25tcCIsICJvaWRPdXRwdXRGb3JtYXQiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfT0lEX09VVFBVVF9GT1JNQVQpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgInN1ZmZpeFByaW50aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJleHRlbmRlZEluZGV4IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VYVEVOREVEX0lOREVYKTsKICAgIG5ldHNubXBfZHNfcmVnaXN0ZXJfcHJlbWliKEFTTl9CT09MRUFOLCAic25tcCIsICJwcmludEhleFRleHQiLAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUFJJTlRfSEVYX1RFWFQpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgInByaW50VmFsdWVPbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1BSSU5UX0JBUkVfVkFMVUUpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImRvbnRQcmludFVuaXRzIiwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMpOwogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0lOVEVHRVIsICJzbm1wIiwgImhleE91dHB1dExlbmd0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9IRVhfT1VUUFVUX0xFTkdUSCk7Cn0KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qCiAqIGZ1bmN0aW9uIDogbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeQogKiAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBzdHJpbmcgb2YgdGhlIGRpcmVjdG9yaWVzCiAqICAgICAgICAgICAgICBmcm9tIHdoaWNoIHRoZSBNSUIgbW9kdWxlcyB3aWxsIGJlIHNlYXJjaGVkIG9yCiAqICAgICAgICAgICAgICBsb2FkZWQuCiAqIGFyZ3VtZW50czogY29uc3QgY2hhciAqZGlyLCB3aGljaCBhcmUgdGhlIGRpcmVjdG9yaWVzCiAqICAgICAgICAgICAgICBmcm9tIHdoaWNoIHRoZSBNSUIgbW9kdWxlcyB3aWxsIGJlIHNlYXJjaGVkIG9yCiAqICAgICAgICAgICAgICBsb2FkZWQuCiAqIHJldHVybnMgIDogLQogKi8Kdm9pZApuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKmRpcikKewogICAgY29uc3QgY2hhciAqbmV3ZGlyOwogICAgY2hhciAqb2xkZGlyLCAqdG1wZGlyID0gTlVMTDsKCiAgICBERUJVR1RSQUNFOwogICAgaWYgKE5VTEwgPT0gZGlyKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBvbGRkaXIgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAoJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCRElSUyk7CiAgICBpZiAob2xkZGlyKSB7CiAgICAgICAgaWYgKCgqZGlyID09ICcrJykgfHwgKCpkaXIgPT0gJy0nKSkgewogICAgICAgICAgICAvKiogTmV3IGRpciBzdGFydHMgd2l0aCAnKycsIHRodXMgd2UgYWRkIGl0LiAqLwogICAgICAgICAgICB0bXBkaXIgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oZGlyKSArIHN0cmxlbihvbGRkaXIpICsgMik7CiAgICAgICAgICAgIGlmICghdG1wZGlyKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicmVhZF9jb25maWc6aW5pdG1pYiIsICJzZXQgbWliZGlyIG1hbGxvYyBmYWlsZWQiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCpkaXIrKyA9PSAnKycpCiAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcGRpciwgIiVzJWMlcyIsIG9sZGRpciwgRU5WX1NFUEFSQVRPUl9DSEFSLCBkaXIpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcGRpciwgIiVzJWMlcyIsIGRpciwgRU5WX1NFUEFSQVRPUl9DSEFSLCBvbGRkaXIpOwogICAgICAgICAgICBuZXdkaXIgPSB0bXBkaXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV3ZGlyID0gZGlyOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyoqIElmIGRpciBzdGFydHMgd2l0aCAnKycgc2tpcCAnKycgaXQuICovCiAgICAgICAgbmV3ZGlyID0gKCgqZGlyID09ICcrJykgPyArK2RpciA6IGRpcik7CiAgICB9CiAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9NSUJESVJTLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2Rpcik7CgogICAgLyoqIHNldF9zdHJpbmcgY2FsbHMgc3RyZHVwLCBzbyBpZiB3ZSBhbGxvY2F0ZWQgbWVtb3J5LCBmcmVlIGl0ICovCiAgICBpZiAodG1wZGlyID09IG5ld2RpcikgewogICAgICAgIFNOTVBfRlJFRSh0bXBkaXIpOwogICAgfQp9CgovKgogKiBmdW5jdGlvbiA6IG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkKICogICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZyBvZiB0aGUgZGlyZWN0b3JpZXMKICogICAgICAgICAgICAgIGZyb20gd2hpY2ggdGhlIE1JQiBtb2R1bGVzIHdpbGwgYmUgc2VhcmNoZWQgb3IKICogICAgICAgICAgICAgIGxvYWRlZC4KICogICAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBzdGlsbCBkb2VzIG5vdCBleGlzdHMsIGl0IHdpbGwgYmUgbWFkZQogKiAgICAgICAgICAgICAgZnJvbSB0aGUgZXZpcm9ubWVudCB2YXJpYWJsZSAnTUlCRElSUycgYW5kL29yIHRoZQogKiAgICAgICAgICAgICAgZGVmYXVsdC4KICogYXJndW1lbnRzOiAtCiAqIHJldHVybnMgIDogY2hhciAqIG9mIHRoZSBkaXJlY3RvcmllcyBpbiB3aGljaCB0aGUgTUlCIG1vZHVsZXMKICogICAgICAgICAgICB3aWxsIGJlIHNlYXJjaGVkL2xvYWRlZC4KICovCgpjaGFyICoKbmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeSh2b2lkKQp7CiAgICBjaGFyICpkaXI7CgogICAgREVCVUdUUkFDRTsKICAgIGRpciA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQkRJUlMpOwogICAgaWYgKGRpciA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm5vIG1pYiBkaXJlY3RvcmllcyBzZXRcbiIpKTsKCiAgICAgICAgLyoqIENoZWNrIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgKi8KICAgICAgICBkaXIgPSBuZXRzbm1wX2dldGVudigiTUlCRElSUyIpOwogICAgICAgIGlmIChkaXIgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibm8gbWliIGRpcmVjdG9yaWVzIHNldCBieSBlbnZpcm9ubWVudFxuIikpOwogICAgICAgICAgICAvKiogTm90IHNldCB1c2UgaGFyZCBjb2RlZCBwYXRoICovCiAgICAgICAgICAgIGlmIChjb25mbWliZGlyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJubyBtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGNvbmZpZ1xuIikpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShORVRTTk1QX0RFRkFVTFRfTUlCRElSUyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoKCpjb25mbWliZGlyID09ICcrJykgfHwgKCpjb25mbWliZGlyID09ICctJykpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJnZXRfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgc2V0IGJ5IGNvbmZpZyAoYnV0IGFkZGVkKVxuIikpOwogICAgICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShORVRTTk1QX0RFRkFVTFRfTUlCRElSUyk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGNvbmZtaWJkaXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgY29uZmlnXG4iKSk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGNvbmZtaWJkaXIpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgoKmRpciA9PSAnKycpIHx8ICgqZGlyID09ICctJykpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgYnkgZW52aXJvbm1lbnQgKGJ1dCBhZGRlZClcbiIpKTsKICAgICAgICAgICAgbmV0c25tcF9zZXRfbWliX2RpcmVjdG9yeShORVRTTk1QX0RFRkFVTFRfTUlCRElSUyk7CiAgICAgICAgICAgIG5ldHNubXBfc2V0X21pYl9kaXJlY3RvcnkoZGlyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBERUJVR01TR1RMKCgiZ2V0X21pYl9kaXJlY3RvcnkiLCAibWliIGRpcmVjdG9yaWVzIHNldCBieSBlbnZpcm9ubWVudFxuIikpOwogICAgICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KGRpcik7CiAgICAgICAgfQogICAgICAgIGRpciA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQkRJUlMpOwogICAgfQogICAgREVCVUdNU0dUTCgoImdldF9taWJfZGlyZWN0b3J5IiwgIm1pYiBkaXJlY3RvcmllcyBzZXQgJyVzJ1xuIiwgZGlyKSk7CiAgICByZXR1cm4oZGlyKTsKfQoKLyoKICogZnVuY3Rpb24gOiBuZXRzbm1wX2ZpeHVwX21pYl9kaXJlY3RvcnkKICogYXJndW1lbnRzOiAtCiAqIHJldHVybnMgIDogLQogKi8Kdm9pZApuZXRzbm1wX2ZpeHVwX21pYl9kaXJlY3Rvcnkodm9pZCkKewogICAgY2hhciAqaG9tZXBhdGggPSBuZXRzbm1wX2dldGVudigiSE9NRSIpOwogICAgY2hhciAqbWlicGF0aCA9IG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkoKTsKICAgIGNoYXIgKm9sZG1pYnBhdGggPSBOVUxMOwogICAgY2hhciAqcHRyX2hvbWU7CiAgICBjaGFyICpuZXdfbWlicGF0aDsKCiAgICBERUJVR1RSQUNFOwogICAgaWYgKGhvbWVwYXRoICYmIG1pYnBhdGgpIHsKICAgICAgICBERUJVR01TR1RMKCgiZml4dXBfbWliX2RpcmVjdG9yeSIsICJtaWIgZGlyZWN0b3JpZXMgJyVzJ1xuIiwgbWlicGF0aCkpOwogICAgICAgIHdoaWxlICgocHRyX2hvbWUgPSBzdHJzdHIobWlicGF0aCwgIiRIT01FIikpKSB7CiAgICAgICAgICAgIG5ld19taWJwYXRoID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKG1pYnBhdGgpIC0gc3RybGVuKCIkSE9NRSIpICsKCQkJCQkgc3RybGVuKGhvbWVwYXRoKSsxKTsKICAgICAgICAgICAgaWYgKG5ld19taWJwYXRoKSB7CiAgICAgICAgICAgICAgICAqcHRyX2hvbWUgPSAwOyAvKiBudWxsIG91dCB0aGUgc3BvdCB3aGVyZSB3ZSBzdG9wIGNvcHlpbmcgKi8KICAgICAgICAgICAgICAgIHNwcmludGYobmV3X21pYnBhdGgsICIlcyVzJXMiLCBtaWJwYXRoLCBob21lcGF0aCwKCQkJcHRyX2hvbWUgKyBzdHJsZW4oIiRIT01FIikpOwogICAgICAgICAgICAgICAgLyoqIHN3YXAgaW4gdGhlIG5ldyB2YWx1ZSBhbmQgcmVwZWF0ICovCiAgICAgICAgICAgICAgICBtaWJwYXRoID0gbmV3X21pYnBhdGg7CgkJaWYgKG9sZG1pYnBhdGggIT0gTlVMTCkgewoJCSAgICBTTk1QX0ZSRUUob2xkbWlicGF0aCk7CgkJfQoJCW9sZG1pYnBhdGggPSBuZXdfbWlicGF0aDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXRzbm1wX3NldF9taWJfZGlyZWN0b3J5KG1pYnBhdGgpOwoJCgkvKiAgVGhlIGFib3ZlIGNvcGllcyB0aGUgbWlicGF0aCBmb3IgdXMsIHNvLi4uICAqLwoKCWlmIChvbGRtaWJwYXRoICE9IE5VTEwpIHsKCSAgICBTTk1QX0ZSRUUob2xkbWlicGF0aCk7Cgl9CgogICAgfQoKfQoKLyoqCiAqIEluaXRpYWxpc2VzIHRoZSBtaWIgcmVhZGVyLgogKgogKiBSZWFkcyBpbiBhbGwgc2V0dGluZ3MgZnJvbSB0aGUgZW52aXJvbm1lbnQuCiAqLwp2b2lkCm5ldHNubXBfaW5pdF9taWIodm9pZCkKewogICAgY29uc3QgY2hhciAgICAgKnByZWZpeDsKICAgIGNoYXIgICAgICAgICAgICplbnZfdmFyLCAqZW50cnk7CiAgICBQcmVmaXhMaXN0UHRyICAgcHAgPSAmbWliX3ByZWZpeGVzWzBdOwogICAgY2hhciAgICAgICAgICAgKnN0ID0gTlVMTDsKCiAgICBpZiAoTWliKQogICAgICAgIHJldHVybjsKICAgIG5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKCk7CgogICAgLyoKICAgICAqIEluaXRpYWxpc2UgdGhlIE1JQiBkaXJlY3RvcnkvaWVzIAogICAgICovCiAgICBuZXRzbm1wX2ZpeHVwX21pYl9kaXJlY3RvcnkoKTsKICAgIGVudl92YXIgPSBzdHJkdXAobmV0c25tcF9nZXRfbWliX2RpcmVjdG9yeSgpKTsKCiAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLAogICAgICAgICAgICAgICAgIlNlZW4gTUlCRElSUzogTG9va2luZyBpbiAnJXMnIGZvciBtaWIgZGlycyAuLi5cbiIsCiAgICAgICAgICAgICAgICBlbnZfdmFyKSk7CgogICAgZW50cnkgPSBzdHJ0b2tfcihlbnZfdmFyLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgYWRkX21pYmRpcihlbnRyeSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgfQogICAgU05NUF9GUkVFKGVudl92YXIpOwoKICAgIGVudl92YXIgPSBuZXRzbm1wX2dldGVudigiTUlCRklMRVMiKTsKICAgIGlmIChlbnZfdmFyICE9IE5VTEwpIHsKICAgICAgICBpZiAoKmVudl92YXIgPT0gJysnKQogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIrMSwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgICAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICAgICAgYWRkX21pYmZpbGUoZW50cnksIE5VTEwsIE5VTEwpOwogICAgICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgfQogICAgfQoKICAgIG5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKCk7CgogICAgLyoKICAgICAqIFJlYWQgaW4gYW55IG1vZHVsZXMgb3IgbWlicyByZXF1ZXN0ZWQgCiAgICAgKi8KCiAgICBlbnZfdmFyID0gbmV0c25tcF9nZXRlbnYoIk1JQlMiKTsKICAgIGlmIChlbnZfdmFyID09IE5VTEwpIHsKICAgICAgICBpZiAoY29uZm1pYnMgIT0gTlVMTCkKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChjb25mbWlicyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBlbnZfdmFyID0gc3RyZHVwKE5FVFNOTVBfREVGQVVMVF9NSUJTKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZW52X3ZhciA9IHN0cmR1cChlbnZfdmFyKTsKICAgIH0KICAgIGlmIChlbnZfdmFyICYmICgoKmVudl92YXIgPT0gJysnKSB8fCAoKmVudl92YXIgPT0gJy0nKSkpIHsKICAgICAgICBlbnRyeSA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oTkVUU05NUF9ERUZBVUxUX01JQlMpICsgc3RybGVuKGVudl92YXIpICsgMik7CiAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgiaW5pdF9taWIiLCAiZW52IG1pYnMgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgU05NUF9GUkVFKGVudl92YXIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCplbnZfdmFyID09ICcrJykKICAgICAgICAgICAgICAgIHNwcmludGYoZW50cnksICIlcyVjJXMiLCBORVRTTk1QX0RFRkFVTFRfTUlCUywgRU5WX1NFUEFSQVRPUl9DSEFSLAogICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyKzEpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgZW52X3ZhcisxLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfREVGQVVMVF9NSUJTICk7CiAgICAgICAgfQogICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgICAgICBlbnZfdmFyID0gZW50cnk7CiAgICB9CgogICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICJTZWVuIE1JQlM6IExvb2tpbmcgaW4gJyVzJyBmb3IgbWliIGZpbGVzIC4uLlxuIiwKICAgICAgICAgICAgICAgIGVudl92YXIpKTsKICAgIGVudHJ5ID0gc3RydG9rX3IoZW52X3ZhciwgRU5WX1NFUEFSQVRPUiwgJnN0KTsKICAgIHdoaWxlIChlbnRyeSkgewogICAgICAgIGlmIChzdHJjYXNlY21wKGVudHJ5LCBERUJVR19BTFdBWVNfVE9LRU4pID09IDApIHsKICAgICAgICAgICAgcmVhZF9hbGxfbWlicygpOwogICAgICAgIH0gZWxzZSBpZiAoc3Ryc3RyKGVudHJ5LCAiLyIpICE9IDApIHsKICAgICAgICAgICAgcmVhZF9taWIoZW50cnkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ldHNubXBfcmVhZF9tb2R1bGUoZW50cnkpOwogICAgICAgIH0KICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICB9CiAgICBhZG9wdF9vcnBoYW5zKCk7CiAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CgogICAgZW52X3ZhciA9IG5ldHNubXBfZ2V0ZW52KCJNSUJGSUxFUyIpOwogICAgaWYgKGVudl92YXIgIT0gTlVMTCkgewogICAgICAgIGlmICgoKmVudl92YXIgPT0gJysnKSB8fCAoKmVudl92YXIgPT0gJy0nKSkgewojaWZkZWYgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTCiAgICAgICAgICAgIGVudHJ5ID0KICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGVudl92YXIpICsgMik7CiAgICAgICAgICAgIGlmICghZW50cnkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsICJlbnYgbWliZmlsZXMgbWFsbG9jIGZhaWxlZCIpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgqZW52X3ZhcisrID09ICcrJykKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGVudHJ5LCAiJXMlYyVzIiwgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTLCBFTlZfU0VQQVJBVE9SX0NIQVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyICk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihlbnRyeSwgIiVzJWMlcyIsIGVudl92YXIsIEVOVl9TRVBBUkFUT1JfQ0hBUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfREVGQVVMVF9NSUJGSUxFUyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFNOTVBfRlJFRShlbnZfdmFyKTsKICAgICAgICAgICAgZW52X3ZhciA9IGVudHJ5OwojZWxzZQogICAgICAgICAgICBlbnZfdmFyID0gc3RyZHVwKGVudl92YXIgKyAxKTsKI2VuZGlmCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZW52X3ZhciA9IHN0cmR1cChlbnZfdmFyKTsKICAgICAgICB9CiAgICB9IGVsc2UgewojaWZkZWYgTkVUU05NUF9ERUZBVUxUX01JQkZJTEVTCiAgICAgICAgZW52X3ZhciA9IHN0cmR1cChORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMpOwojZW5kaWYKICAgIH0KCiAgICBpZiAoZW52X3ZhciAhPSAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImluaXRfbWliIiwKICAgICAgICAgICAgICAgICAgICAiU2VlbiBNSUJGSUxFUzogTG9va2luZyBpbiAnJXMnIGZvciBtaWIgZmlsZXMgLi4uXG4iLAogICAgICAgICAgICAgICAgICAgIGVudl92YXIpKTsKICAgICAgICBlbnRyeSA9IHN0cnRva19yKGVudl92YXIsIEVOVl9TRVBBUkFUT1IsICZzdCk7CiAgICAgICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgICAgIHJlYWRfbWliKGVudHJ5KTsKICAgICAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCBFTlZfU0VQQVJBVE9SLCAmc3QpOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUoZW52X3Zhcik7CiAgICB9CgogICAgcHJlZml4ID0gbmV0c25tcF9nZXRlbnYoIlBSRUZJWCIpOwoKICAgIGlmICghcHJlZml4KQogICAgICAgIHByZWZpeCA9IFN0YW5kYXJkX1ByZWZpeDsKCiAgICBQcmVmaXggPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHByZWZpeCkgKyAyKTsKICAgIGlmICghUHJlZml4KQogICAgICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsICJQcmVmaXggbWFsbG9jIGZhaWxlZCIpKTsKICAgIGVsc2UKICAgICAgICBzdHJjcHkoUHJlZml4LCBwcmVmaXgpOwoKICAgIERFQlVHTVNHVEwoKCJpbml0X21pYiIsCiAgICAgICAgICAgICAgICAiU2VlbiBQUkVGSVg6IExvb2tpbmcgaW4gJyVzJyBmb3IgcHJlZml4IC4uLlxuIiwgUHJlZml4KSk7CgogICAgLyoKICAgICAqIHJlbW92ZSB0cmFpbGluZyBkb3QgCiAgICAgKi8KICAgIGlmIChQcmVmaXgpIHsKICAgICAgICBlbnZfdmFyID0gJlByZWZpeFtzdHJsZW4oUHJlZml4KSAtIDFdOwogICAgICAgIGlmICgqZW52X3ZhciA9PSAnLicpCiAgICAgICAgICAgICplbnZfdmFyID0gJ1wwJzsKICAgIH0KCiAgICBwcC0+c3RyID0gUHJlZml4OyAgICAgICAgICAgLyogZml4dXAgZmlyc3QgbWliX3ByZWZpeCBlbnRyeSAqLwogICAgLyoKICAgICAqIG5vdyB0aGF0IHRoZSBsaXN0IG9mIHByZWZpeGVzIGlzIGJ1aWx0LCBzYXZlIGVhY2ggc3RyaW5nIGxlbmd0aC4gCiAgICAgKi8KICAgIHdoaWxlIChwcC0+c3RyKSB7CiAgICAgICAgcHAtPmxlbiA9IHN0cmxlbihwcC0+c3RyKTsKICAgICAgICBwcCsrOwogICAgfQoKICAgIE1pYiA9IHRyZWVfaGVhZDsgICAgICAgICAgICAvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogICAgdHJlZV90b3AgPSAoc3RydWN0IHRyZWUgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdHJlZSkpOwogICAgLyoKICAgICAqIFhYIGVycm9yIGNoZWNrID8gCiAgICAgKi8KICAgIGlmICh0cmVlX3RvcCkgewogICAgICAgIHRyZWVfdG9wLT5sYWJlbCA9IHN0cmR1cCgiKHRvcCkiKTsKICAgICAgICB0cmVlX3RvcC0+Y2hpbGRfbGlzdCA9IHRyZWVfaGVhZDsKICAgIH0KfQoKI2lmbmRlZiBORVRTTk1QX0NMRUFOX05BTUVTUEFDRQp2b2lkCmluaXRfbWliKHZvaWQpCnsKICAgIG5ldHNubXBfaW5pdF9taWIoKTsKfQojZW5kaWYKCgovKioKICogVW5sb2FkcyBhbGwgbWlicy4KICovCnZvaWQKc2h1dGRvd25fbWliKHZvaWQpCnsKICAgIHVubG9hZF9hbGxfbWlicygpOwogICAgaWYgKHRyZWVfdG9wKSB7CiAgICAgICAgaWYgKHRyZWVfdG9wLT5sYWJlbCkKICAgICAgICAgICAgU05NUF9GUkVFKHRyZWVfdG9wLT5sYWJlbCk7CiAgICAgICAgU05NUF9GUkVFKHRyZWVfdG9wKTsKICAgICAgICB0cmVlX3RvcCA9IE5VTEw7CiAgICB9CiAgICB0cmVlX2hlYWQgPSBOVUxMOwogICAgTWliID0gTlVMTDsKICAgIGlmIChQcmVmaXggIT0gTlVMTCAmJiBQcmVmaXggIT0gJlN0YW5kYXJkX1ByZWZpeFswXSkKICAgICAgICBTTk1QX0ZSRUUoUHJlZml4KTsKICAgIGlmIChQcmVmaXgpCiAgICAgICAgUHJlZml4ID0gTlVMTDsKICAgIFNOTVBfRlJFRShjb25mbWlicyk7CiAgICBTTk1QX0ZSRUUoY29uZm1pYmRpcik7Cn0KCi8qKgogKiBQcmludHMgdGhlIE1JQnMgdG8gdGhlIGZpbGUgZnAuCiAqCiAqIEBwYXJhbSBmcCAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqLwp2b2lkCnByaW50X21pYihGSUxFICogZnApCnsKICAgIHByaW50X3N1YnRyZWUoZnAsIHRyZWVfaGVhZCwgMCk7Cn0KCnZvaWQKcHJpbnRfYXNjaWlfZHVtcChGSUxFICogZnApCnsKICAgIGZwcmludGYoZnAsICJkdW1wIERFRklOSVRJT05TIDo6PSBCRUdJTlxuIik7CiAgICBwcmludF9hc2NpaV9kdW1wX3RyZWUoZnAsIHRyZWVfaGVhZCwgMCk7CiAgICBmcHJpbnRmKGZwLCAiRU5EXG4iKTsKfQoKCi8qKgogKiBTZXQncyB0aGUgcHJpbnRpbmcgZnVuY3Rpb24gcHJpbnRvbWF0IGluIGEgc3VidHJlZSBhY2NvcmRpbmcKICogaXQncyB0eXBlCiAqCiAqIEBwYXJhbSBzdWJ0cmVlICAgIFRoZSBzdWJ0cmVlIHRvIHNldC4KICovCnZvaWQKc2V0X2Z1bmN0aW9uKHN0cnVjdCB0cmVlICpzdWJ0cmVlKQp7CiAgICBzdWJ0cmVlLT5wcmludGVyID0gTlVMTDsKICAgIHN3aXRjaCAoc3VidHJlZS0+dHlwZSkgewogICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX29iamVjdF9pZGVudGlmaWVyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZzsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2ludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2ludGVnZXI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTkVUQUREUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19uZXR3b3JrYWRkcmVzczsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfaXBhZGRyZXNzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0NPVU5URVI6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfY291bnRlcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19nYXVnZTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09QQVFVRToKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19vcGFxdWU7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTlVMTDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19udWxsOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX0JJVFNUUklORzoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmc7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgc3VidHJlZS0+cHJpbnRvbWF0ID0gc3ByaW50X3JlYWxsb2NfbnNhcGFkZHJlc3M7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFRZUEVfQ09VTlRFUjY0OgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2NvdW50ZXI2NDsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY191aW50ZWdlcjsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIHN1YnRyZWUtPnByaW50b21hdCA9IHNwcmludF9yZWFsbG9jX2dhdWdlOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBUWVBFX09USEVSOgogICAgZGVmYXVsdDoKICAgICAgICBzdWJ0cmVlLT5wcmludG9tYXQgPSBzcHJpbnRfcmVhbGxvY19ieV90eXBlOwogICAgICAgIGJyZWFrOwogICAgfQp9CgojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgovKioKICogUmVhZHMgYW4gb2JqZWN0IGlkZW50aWZpZXIgZnJvbSBhbiBpbnB1dCBzdHJpbmcgaW50byBpbnRlcm5hbCBPSUQgZm9ybS4KICogCiAqIFdoZW4gY2FsbGVkLCBvdXRfbGVuIG11c3QgaG9sZCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG91dHB1dCBhcnJheS4KICoKICogQHBhcmFtIGlucHV0ICAgICB0aGUgaW5wdXQgc3RyaW5nLgogKiBAcGFyYW0gb3V0cHV0ICAgIHRoZSBvaWQgd2lydGUuCiAqIEBwYXJhbSBvdXRfbGVuICAgbnVtYmVyIG9mIHN1YmlkJ3MgaW4gb3V0cHV0LgogKiAKICogQHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwuCiAqIAogKiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGFuZCBNQVkgc2V0IHNubXBfZXJybm8uCiAqIHNubXBfZXJybm8gaXMgTk9UIHNldCBpZiBTRVRfU05NUF9FUlJPUiBldmFsdWF0ZXMgdG8gbm90aGluZy4KICogVGhpcyBjYW4gbWFrZSBtdWx0aS10aHJlYWRlZCB1c2UgYSB0aW55IGJpdCBtb3JlIHJvYnVzdC4KICovCmludApyZWFkX29iamlkKGNvbnN0IGNoYXIgKmlucHV0LCBvaWQgKiBvdXRwdXQsIHNpemVfdCAqIG91dF9sZW4pCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN1YmlkJ3MgaW4gIm91dHB1dCIgKi8KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICpyb290ID0gdHJlZV90b3A7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIGNoYXIgICAgICAgICAgICBidWZbU1BSSU5UX01BWF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIHJldCwgbWF4X291dF9sZW47CiAgICBjaGFyICAgICAgICAgICAqbmFtZSwgY2g7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CgogICAgY3AgPSBpbnB1dDsKICAgIHdoaWxlICgoY2ggPSAqY3ApKSB7CiAgICAgICAgaWYgKCgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKQogICAgICAgICAgICB8fCAoJ2EnIDw9IGNoICYmIGNoIDw9ICd6JykKICAgICAgICAgICAgfHwgKCdBJyA8PSBjaCAmJiBjaCA8PSAnWicpCiAgICAgICAgICAgIHx8IGNoID09ICctJykKICAgICAgICAgICAgY3ArKzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKGNoID09ICc6JykKICAgICAgICByZXR1cm4gZ2V0X25vZGUoaW5wdXQsIG91dHB1dCwgb3V0X2xlbik7CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiAgICBpZiAoKmlucHV0ID09ICcuJykKICAgICAgICBpbnB1dCsrOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgZWxzZSBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX1JFQURfVUNEX1NUWUxFX09JRCkpIHsKICAgICAgICAvKgogICAgICAgICAqIGdldCBwYXN0IGxlYWRpbmcgJy4nLCBhcHBlbmQgJy4nIHRvIFByZWZpeC4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCpQcmVmaXggPT0gJy4nKQogICAgICAgICAgICBzdHJsY3B5KGJ1ZiwgUHJlZml4ICsgMSwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc3RybGNweShidWYsIFByZWZpeCwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIHN0cmxjYXQoYnVmLCAiLiIsIHNpemVvZihidWYpKTsKICAgICAgICBzdHJsY2F0KGJ1ZiwgaW5wdXQsIHNpemVvZihidWYpKTsKICAgICAgICBpbnB1dCA9IGJ1ZjsKICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmICgocm9vdCA9PSBOVUxMKSAmJiAodHJlZV9oZWFkICE9IE5VTEwpKSB7CiAgICAgICAgcm9vdCA9IHRyZWVfaGVhZDsKICAgIH0KICAgIGVsc2UgaWYgKHJvb3QgPT0gTlVMTCkgewogICAgICAgIFNFVF9TTk1QX0VSUk9SKFNOTVBFUlJfTk9NSUIpOwogICAgICAgICpvdXRfbGVuID0gMDsKICAgICAgICByZXR1cm4gMDsKICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgbmFtZSA9IHN0cmR1cChpbnB1dCk7CiAgICBtYXhfb3V0X2xlbiA9ICpvdXRfbGVuOwogICAgKm91dF9sZW4gPSAwOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgaWYgKChyZXQgPQogICAgICAgICBfYWRkX3N0cmluZ3NfdG9fb2lkKHJvb3QsIG5hbWUsIG91dHB1dCwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfb3V0X2xlbikpIDw9IDApCiNlbHNlCiAgICBpZiAoKHJldCA9CiAgICAgICAgIF9hZGRfc3RyaW5nc190b19vaWQoTlVMTCwgbmFtZSwgb3V0cHV0LCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9vdXRfbGVuKSkgPD0gMCkKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgewogICAgICAgIGlmIChyZXQgPT0gMCkKICAgICAgICAgICAgcmV0ID0gU05NUEVSUl9VTktOT1dOX09CSklEOwogICAgICAgIFNFVF9TTk1QX0VSUk9SKHJldCk7CiAgICAgICAgU05NUF9GUkVFKG5hbWUpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgU05NUF9GUkVFKG5hbWUpOwoKICAgIHJldHVybiAxOwp9CgovKioKICogCiAqLwp2b2lkCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWQodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICB1X2NoYXIgICAgICAgICAqdGJ1ZiA9IE5VTEwsICpjcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgdGJ1Zl9sZW4gPSAyNTYsIHRvdXRfbGVuID0gMDsKICAgIGludCAgICAgICAgICAgICB0YnVmX292ZXJmbG93ID0gMDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0OwoKICAgIGlmICgodGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKHRidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIHRidWZfb3ZlcmZsb3cgPSAxOwogICAgfSBlbHNlIHsKICAgICAgICAqdGJ1ZiA9ICcuJzsKICAgICAgICB0b3V0X2xlbiA9IDE7CiAgICB9CgogICAgX29pZF9maW5pc2hfcHJpbnRpbmcob2JqaWQsIG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJnRidWYsICZ0YnVmX2xlbiwgJnRvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJnRidWZfb3ZlcmZsb3cpOwoKICAgIGlmICh0YnVmX292ZXJmbG93KSB7CiAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdGJ1Zik7CiAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgIH0KICAgICAgICBTTk1QX0ZSRUUodGJ1Zik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG91dHB1dF9mb3JtYXQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBpZiAoMCA9PSBvdXRwdXRfZm9ybWF0KSB7CiAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDOwogICAgfQogICAgc3dpdGNoIChvdXRwdXRfZm9ybWF0KSB7CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9GVUxMOgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQzoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX1NVRkZJWDoKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX01PRFVMRToKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTk9ORToKICAgIGRlZmF1bHQ6CiAgICAgICAgY3AgPSBOVUxMOwogICAgfQoKICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJgogICAgICAgICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkgewogICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgfQogICAgU05NUF9GUkVFKHRidWYpOwp9CgovKioKICogCiAqLwojaWZkZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCnZvaWQKbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKewogICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywgb2JqaWQsIG9iamlkbGVuKTsKfQojZWxzZQpzdHJ1Y3QgdHJlZSAgICAqCm5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4pCnsKICAgIHVfY2hhciAgICAgICAgICp0YnVmID0gTlVMTCwgKmNwID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICB0YnVmX2xlbiA9IDUxMiwgdG91dF9sZW4gPSAwOwogICAgc3RydWN0IHRyZWUgICAgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CiAgICBzaXplX3QgICAgICAgICAgbWlkcG9pbnRfb2Zmc2V0ID0gMDsKICAgIGludCAgICAgICAgICAgICB0YnVmX292ZXJmbG93ID0gMDsKICAgIGludCAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0OwoKICAgIGlmICgodGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKHRidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIHRidWZfb3ZlcmZsb3cgPSAxOwogICAgfSBlbHNlIHsKICAgICAgICAqdGJ1ZiA9ICcuJzsKICAgICAgICB0b3V0X2xlbiA9IDE7CiAgICB9CgogICAgc3VidHJlZSA9IF9nZXRfcmVhbGxvY19zeW1ib2wob2JqaWQsIG9iamlkbGVuLCBzdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRidWYsICZ0YnVmX2xlbiwgJnRvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJnRidWZfb3ZlcmZsb3csIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlkcG9pbnRfb2Zmc2V0KTsKCiAgICBpZiAodGJ1Zl9vdmVyZmxvdykgewogICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRidWYpOwogICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICB9CiAgICAgICAgU05NUF9GUkVFKHRidWYpOwogICAgICAgIHJldHVybiBzdWJ0cmVlOwogICAgfQoKICAgIG91dHB1dF9mb3JtYXQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9PSURfT1VUUFVUX0ZPUk1BVCk7CiAgICBpZiAoMCA9PSBvdXRwdXRfZm9ybWF0KSB7CiAgICAgICAgb3V0cHV0X2Zvcm1hdCA9IE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU7CiAgICB9CiAgICBzd2l0Y2ggKG91dHB1dF9mb3JtYXQpIHsKICAgIGNhc2UgTkVUU05NUF9PSURfT1VUUFVUX0ZVTEw6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDOgogICAgICAgIGNwID0gdGJ1ZjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9TVUZGSVg6CiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9NT0RVTEU6CiAgICAgICAgZm9yIChjcCA9IHRidWY7ICpjcDsgY3ArKyk7CgogICAgICAgIGlmIChtaWRwb2ludF9vZmZzZXQgIT0gMCkgewogICAgICAgICAgICBjcCA9IHRidWYgKyBtaWRwb2ludF9vZmZzZXQgLSAyOyAgICAvKiAgYmV5b25kIHRoZSAnLicgICovCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2hpbGUgKGNwID49IHRidWYpIHsKICAgICAgICAgICAgICAgIGlmIChpc2FscGhhKCpjcCkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNwLS07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHdoaWxlIChjcCA+PSB0YnVmKSB7CiAgICAgICAgICAgIGlmICgqY3AgPT0gJy4nKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjcC0tOwogICAgICAgIH0KCiAgICAgICAgY3ArKzsKCiAgICAgICAgaWYgKChORVRTTk1QX09JRF9PVVRQVVRfTU9EVUxFID09IG91dHB1dF9mb3JtYXQpCiAgICAgICAgICAgICYmIGNwID4gdGJ1ZikgewogICAgICAgICAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl0gPSB7IDAgfSwgKm1vZCA9CiAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZShzdWJ0cmVlLT5tb2RpZCwgbW9kYnVmKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIERvbid0IGFkZCB0aGUgbW9kdWxlIElEIGlmIGl0J3MganVzdCBudW1lcmljIChpLmUuIHdlIGNvdWxkbid0IGxvb2sKICAgICAgICAgICAgICogaXQgdXAgcHJvcGVybHkuICAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgbW9kYnVmWzBdICE9ICcjJykgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX3N0cmNhdAogICAgICAgICAgICAgICAgICAgIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgbW9kKQogICAgICAgICAgICAgICAgICAgIHx8ICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIjo6IikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIE5FVFNOTVBfT0lEX09VVFBVVF9VQ0Q6CiAgICB7CiAgICAgICAgUHJlZml4TGlzdFB0ciAgIHBwID0gJm1pYl9wcmVmaXhlc1swXTsKICAgICAgICBzaXplX3QgICAgICAgICAgaWxlbiwgdGxlbjsKICAgICAgICBjb25zdCBjaGFyICAgICAqdGVzdGNwOwoKICAgICAgICBjcCA9IHRidWY7CiAgICAgICAgdGxlbiA9IHN0cmxlbigoY2hhciAqKSB0YnVmKTsKCiAgICAgICAgd2hpbGUgKHBwLT5zdHIpIHsKICAgICAgICAgICAgaWxlbiA9IHBwLT5sZW47CiAgICAgICAgICAgIHRlc3RjcCA9IHBwLT5zdHI7CgogICAgICAgICAgICBpZiAoKHRsZW4gPiBpbGVuKSAmJiBtZW1jbXAodGJ1ZiwgdGVzdGNwLCBpbGVuKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBjcCArPSAoaWxlbiArIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHArKzsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSBORVRTTk1QX09JRF9PVVRQVVRfTk9ORToKICAgIGRlZmF1bHQ6CiAgICAgICAgY3AgPSBOVUxMOwogICAgfQoKICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJgogICAgICAgICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSkgewogICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgfQogICAgU05NUF9GUkVFKHRidWYpOwogICAgcmV0dXJuIHN1YnRyZWU7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKaW50CnNwcmludF9yZWFsbG9jX29iamlkKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgYnVmX292ZXJmbG93ID0gMDsKCiAgICBuZXRzbm1wX3NwcmludF9yZWFsbG9jX29iamlkX3RyZWUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7CiAgICByZXR1cm4gIWJ1Zl9vdmVyZmxvdzsKfQoKaW50CnNucHJpbnRfb2JqaWQoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CgogICAgaWYgKHNwcmludF9yZWFsbG9jX29iamlkKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuKSkgewogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn0KCi8qKgogKiBQcmludHMgYW4gb2lkIHRvIHN0ZG91dC4KICoKICogQHBhcmFtIG9iamlkICAgICAgVGhlIG9pZCB0byBwcmludAogKiBAcGFyYW0gb2JqaWRsZW4gICBUaGUgbGVuZ3RoIG9mIG9pZGlkLgogKi8Kdm9pZApwcmludF9vYmppZChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJpZGVudGlmaWVycyAqLwogICAgZnByaW50X29iamlkKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuKTsKfQoKCi8qKgogKiBQcmludHMgYW4gb2lkIHRvIGEgZmlsZSBkZXNjcmlwdG9yLgogKgogKiBAcGFyYW0gZiAgICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gb2JqaWQgICAgICBUaGUgb2lkIHRvIHByaW50CiAqIEBwYXJhbSBvYmppZGxlbiAgIFRoZSBsZW5ndGggb2Ygb2lkaWQuCiAqLwp2b2lkCmZwcmludF9vYmppZChGSUxFICogZiwgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbikKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgKi8KICAgIHVfY2hhciAgICAgICAgICpidWYgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAyNTYsIG91dF9sZW4gPSAwOwogICAgaW50ICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdyA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIG5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZSgmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZfb3ZlcmZsb3csIG9iamlkLCBvYmppZGxlbik7CiAgICAgICAgaWYgKGJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgYnVmKTsKICAgICAgICB9CiAgICB9CgogICAgU05NUF9GUkVFKGJ1Zik7Cn0KCmludApzcHJpbnRfcmVhbGxvY192YXJpYWJsZSh1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyaWFibGUpCnsKICAgIGludCAgICAgICAgICAgICBidWZfb3ZlcmZsb3cgPSAwOwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIHN0cnVjdCB0cmVlICAgICpzdWJ0cmVlID0gdHJlZV9oZWFkOwoKICAgIHN1YnRyZWUgPQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICAgICAgbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJmJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuKTsKCiAgICBpZiAoYnVmX292ZXJmbG93KSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9QUklOVF9CQVJFX1ZBTFVFKSkgewogICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tFX1BSSU5UKSkgewogICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIiA9ICIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUVVJQ0tfUFJJTlQpKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiICIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfc3RyY2F0CiAgICAgICAgICAgICAgICAgICAgKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiID0gIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYtZWxzZSBORVRTTk1QX0RTX0xJQl9RVUlDS19QUklOVCAqLwogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpZi1lbHNlIE5FVFNOTVBfRFNfTElCX1FVSUNLRV9QUklOVCAqLwogICAgfSBlbHNlIHsKICAgICAgICAqb3V0X2xlbiA9IDA7CiAgICB9CgogICAgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfTk9TVUNIT0JKRUNUKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBPYmplY3QgYXZhaWxhYmxlIG9uIHRoaXMgYWdlbnQgYXQgdGhpcyBPSUQiKTsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hJTlNUQU5DRSkgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFN1Y2ggSW5zdGFuY2UgY3VycmVudGx5IGV4aXN0cyBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX0VORE9GTUlCVklFVykgewogICAgICAgIHJldHVybiBzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgdmFyaWFibGVzIGxlZnQgaW4gdGhpcyBNSUIgVmlldyAoSXQgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBNSUIgdHJlZSkiKTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIH0gZWxzZSBpZiAoc3VidHJlZSkgewogICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzID0gTlVMTDsKICAgICAgICBjb25zdCBjaGFyICpoaW50ID0gTlVMTDsKICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9ET05UX1BSSU5UX1VOSVRTKSkgewogICAgICAgICAgICB1bml0cyA9IHN1YnRyZWUtPnVuaXRzOwogICAgICAgIH0KCgkJaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTk9fRElTUExBWV9ISU5UKSkgewoJCQloaW50ID0gc3VidHJlZS0+aGludDsKICAgICAgICB9CgogICAgICAgIGlmIChzdWJ0cmVlLT5wcmludG9tYXQpIHsKICAgICAgICAgICAgcmV0dXJuICgqc3VidHJlZS0+cHJpbnRvbWF0KSAoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCB2YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZS0+ZW51bXMsIGhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5lbnVtcywgaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMpOwogICAgICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIEhhbmRsZSByYXJlIGNhc2Ugd2hlcmUgdHJlZSBpcyBlbXB0eS4gIAogICAgICAgICAqLwogICAgICAgIHJldHVybiBzcHJpbnRfcmVhbGxvY19ieV90eXBlKGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSwgMCwgMCwgMCk7CiAgICB9Cn0KCmludApzbnByaW50X3ZhcmlhYmxlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY192YXJpYWJsZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKLyoqCiAqIFByaW50cyBhIHZhcmlhYmxlIHRvIHN0ZG91dC4KICoKICogQHBhcmFtIG9iamlkICAgICBUaGUgb2JqZWN0IGlkLgogKiBAcGFyYW0gb2JqaWRsZW4gIFRoZSBsZW5ndGggb2YgdGVoIG9iamVjdCBpZC4KICogQHBhcmFtIHZhcmlhYmxlICBUaGUgdmFyaWFibGUgdG8gcHJpbnQuCiAqLwp2b2lkCnByaW50X3ZhcmlhYmxlKGNvbnN0IG9pZCAqIG9iamlkLAogICAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBmcHJpbnRfdmFyaWFibGUoc3Rkb3V0LCBvYmppZCwgb2JqaWRsZW4sIHZhcmlhYmxlKTsKfQoKCi8qKgogKiBQcmludHMgYSB2YXJpYWJsZSB0byBhIGZpbGUgZGVzY3JpcHRvci4KICoKICogQHBhcmFtIGYgICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gb2JqaWQgICAgIFRoZSBvYmplY3QgaWQuCiAqIEBwYXJhbSBvYmppZGxlbiAgVGhlIGxlbmd0aCBvZiB0ZWggb2JqZWN0IGlkLgogKiBAcGFyYW0gdmFyaWFibGUgIFRoZSB2YXJpYWJsZSB0byBwcmludC4KICovCnZvaWQKZnByaW50X3ZhcmlhYmxlKEZJTEUgKiBmLAogICAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX3ZhcmlhYmxlKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgppbnQKc3ByaW50X3JlYWxsb2NfdmFsdWUodV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICBpZiAodmFyaWFibGUtPnR5cGUgPT0gU05NUF9OT1NVQ0hPQkpFQ1QpIHsKICAgICAgICByZXR1cm4gc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBTdWNoIE9iamVjdCBhdmFpbGFibGUgb24gdGhpcyBhZ2VudCBhdCB0aGlzIE9JRCIpOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZS0+dHlwZSA9PSBTTk1QX05PU1VDSElOU1RBTkNFKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU3VjaCBJbnN0YW5jZSBjdXJyZW50bHkgZXhpc3RzIGF0IHRoaXMgT0lEIik7CiAgICB9IGVsc2UgaWYgKHZhcmlhYmxlLT50eXBlID09IFNOTVBfRU5ET0ZNSUJWSUVXKSB7CiAgICAgICAgcmV0dXJuIHNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSB2YXJpYWJsZXMgbGVmdCBpbiB0aGlzIE1JQiBWaWV3IChJdCBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIE1JQiB0cmVlKSIpOwogICAgfSBlbHNlIHsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICBjb25zdCBjaGFyICp1bml0cyA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyZWUgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CglzdWJ0cmVlID0gZ2V0X3RyZWUob2JqaWQsIG9iamlkbGVuLCBzdWJ0cmVlKTsKICAgICAgICBpZiAoc3VidHJlZSAmJiAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfRE9OVF9QUklOVF9VTklUUykpIHsKICAgICAgICAgICAgdW5pdHMgPSBzdWJ0cmVlLT51bml0czsKICAgICAgICB9CiAgICAgICAgaWYgKHN1YnRyZWUpIHsKCSAgICBpZihzdWJ0cmVlLT5wcmludG9tYXQpIHsKCQlyZXR1cm4gKCpzdWJ0cmVlLT5wcmludG9tYXQpIChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCgkJCQkJICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCgkJCQkJICAgICAgc3VidHJlZS0+ZW51bXMsIHN1YnRyZWUtPmhpbnQsCgkJCQkJICAgICAgdW5pdHMpOwoJICAgIH0gZWxzZSB7CgkJcmV0dXJuIHNwcmludF9yZWFsbG9jX2J5X3R5cGUoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAoJCQkJCSAgICAgIGFsbG93X3JlYWxsb2MsIHZhcmlhYmxlLAoJCQkJCSAgICAgIHN1YnRyZWUtPmVudW1zLCBzdWJ0cmVlLT5oaW50LAoJCQkJCSAgICAgIHVuaXRzKTsKCSAgICB9Cgl9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgICAgICByZXR1cm4gc3ByaW50X3JlYWxsb2NfYnlfdHlwZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICB9Cn0KCmludApzbnByaW50X3ZhbHVlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwoKICAgIGlmIChzcHJpbnRfcmVhbGxvY192YWx1ZSgodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgdmFyaWFibGUpKSB7CiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKdm9pZApwcmludF92YWx1ZShjb25zdCBvaWQgKiBvYmppZCwKICAgICAgICAgICAgc2l6ZV90IG9iamlkbGVuLCBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJpYWJsZSkKewogICAgZnByaW50X3ZhbHVlKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSk7Cn0KCnZvaWQKZnByaW50X3ZhbHVlKEZJTEUgKiBmLAogICAgICAgICAgICAgY29uc3Qgb2lkICogb2JqaWQsCiAgICAgICAgICAgICBzaXplX3Qgb2JqaWRsZW4sIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhcmlhYmxlKQp7CiAgICB1X2NoYXIgICAgICAgICAqYnVmID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMjU2LCBvdXRfbGVuID0gMDsKCiAgICBpZiAoKGJ1ZiA9ICh1X2NoYXIgKikgY2FsbG9jKGJ1Zl9sZW4sIDEpKSA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihmLCAiW1RSVU5DQVRFRF1cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX3ZhbHVlKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB2YXJpYWJsZSkpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXNcbiIsIGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1Zik7CiAgICAgICAgfQogICAgfQoKICAgIFNOTVBfRlJFRShidWYpOwp9CgoKLyoqCiAqIFRha2VzIHRoZSB2YWx1ZSBpbiBWQVIgYW5kIHR1cm5zIGl0IGludG8gYW4gT0lEIHNlZ21lbnQgaW4gdmFyLT5uYW1lLgogKiAgCiAqIEBwYXJhbSB2YXIgICAgVGhlIHZhcmlhYmxlLgogKgogKiBAcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUyBvciBTTk1QRVJSX0dFTkVSUiAKICovCmludApidWlsZF9vaWRfc2VnbWVudChuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIpCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgdWludDMyX3QgICAgICAgIGlwYWRkcjsKCiAgICBpZiAodmFyLT5uYW1lICYmIHZhci0+bmFtZSAhPSB2YXItPm5hbWVfbG9jKQogICAgICAgIFNOTVBfRlJFRSh2YXItPm5hbWUpOwogICAgc3dpdGNoICh2YXItPnR5cGUpIHsKICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgY2FzZSBBU05fR0FVR0U6CiAgICBjYXNlIEFTTl9USU1FVElDS1M6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IDE7CiAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICB2YXItPm5hbWVbMF0gPSAqKHZhci0+dmFsLmludGVnZXIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX0lQQUREUkVTUzoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gNDsKICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIG1lbWNweSgmaXBhZGRyLCB2YXItPnZhbC5zdHJpbmcsIHNpemVvZihpcGFkZHIpKTsKICAgICAgICB2YXItPm5hbWVbMF0gPSAoaXBhZGRyID4+IDI0KSAmIDB4ZmY7CiAgICAgICAgdmFyLT5uYW1lWzFdID0gKGlwYWRkciA+PiAxNikgJiAweGZmOwogICAgICAgIHZhci0+bmFtZVsyXSA9IChpcGFkZHIgPj4gIDgpICYgMHhmZjsKICAgICAgICB2YXItPm5hbWVbM10gPSAoaXBhZGRyID4+ICAwKSAmIDB4ZmY7CiAgICAgICAgYnJlYWs7CiAgICAgICAgCiAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0JKRUNUX0lEOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW4gLyBzaXplb2Yob2lkKTsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IChzaXplb2YodmFyLT5uYW1lX2xvYykgLyBzaXplb2Yob2lkKSkpCiAgICAgICAgICAgIHZhci0+bmFtZSA9IChvaWQgKikgbWFsbG9jKHNpemVvZihvaWQpICogKHZhci0+bmFtZV9sZW5ndGgpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgaWYgKHZhci0+bmFtZSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSB2YXItPm5hbWVfbGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpXSA9IHZhci0+dmFsLm9iamlkW2ldOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX09CSkVDVF9JRDoKICAgICAgICB2YXItPm5hbWVfbGVuZ3RoID0gdmFyLT52YWxfbGVuIC8gc2l6ZW9mKG9pZCkgKyAxOwogICAgICAgIGlmICh2YXItPm5hbWVfbGVuZ3RoID4gKHNpemVvZih2YXItPm5hbWVfbG9jKSAvIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgdmFyLT5uYW1lID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAodmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyLT5uYW1lID0gdmFyLT5uYW1lX2xvYzsKICAgICAgICBpZiAodmFyLT5uYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICAgICAgdmFyLT5uYW1lWzBdID0gdmFyLT5uYW1lX2xlbmd0aCAtIDE7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+bmFtZV9sZW5ndGggLSAxOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpICsgMV0gPSB2YXItPnZhbC5vYmppZFtpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSOgogICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSB2YXItPnZhbF9sZW47CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgdmFyLT52YWxfbGVuOyBpKyspCiAgICAgICAgICAgIHZhci0+bmFtZVtpXSA9IChvaWQpIHZhci0+dmFsLnN0cmluZ1tpXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCA9IHZhci0+dmFsX2xlbiArIDE7CiAgICAgICAgaWYgKHZhci0+bmFtZV9sZW5ndGggPiAoc2l6ZW9mKHZhci0+bmFtZV9sb2MpIC8gc2l6ZW9mKG9pZCkpKQogICAgICAgICAgICB2YXItPm5hbWUgPSAob2lkICopIG1hbGxvYyhzaXplb2Yob2lkKSAqICh2YXItPm5hbWVfbGVuZ3RoKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB2YXItPm5hbWUgPSB2YXItPm5hbWVfbG9jOwogICAgICAgIGlmICh2YXItPm5hbWUgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICB2YXItPm5hbWVbMF0gPSAob2lkKSB2YXItPnZhbF9sZW47CiAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIHZhci0+dmFsX2xlbjsgaSsrKQogICAgICAgICAgICB2YXItPm5hbWVbaSArIDFdID0gKG9pZCkgdmFyLT52YWwuc3RyaW5nW2ldOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoImJ1aWxkX29pZF9zZWdtZW50IiwKICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBhc24gdHlwZTogJWRcbiIsIHZhci0+dHlwZSkpOwogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KCiAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCA+IE1BWF9PSURfTEVOKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImJ1aWxkX29pZF9zZWdtZW50IiwKICAgICAgICAgICAgICAgICAgICAiU29tZXRoaW5nIHRlcnJpYmx5IHdyb25nLCBuYW1lbGVuID0gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgdmFyLT5uYW1lX2xlbmd0aCkpOwogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KCiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKaW50CmJ1aWxkX29pZF9ub2FsbG9jKG9pZCAqIGluLCBzaXplX3QgaW5fbGVuLCBzaXplX3QgKiBvdXRfbGVuLAogICAgICAgICAgICAgICAgICBvaWQgKiBwcmVmaXgsIHNpemVfdCBwcmVmaXhfbGVuLAogICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiBpbmRleGVzKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcjsKCiAgICBpZiAocHJlZml4KSB7CiAgICAgICAgaWYgKGluX2xlbiA8IHByZWZpeF9sZW4pCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICBtZW1jcHkoaW4sIHByZWZpeCwgcHJlZml4X2xlbiAqIHNpemVvZihvaWQpKTsKICAgICAgICAqb3V0X2xlbiA9IHByZWZpeF9sZW47CiAgICB9IGVsc2UgewogICAgICAgICpvdXRfbGVuID0gMDsKICAgIH0KCiAgICBmb3IgKHZhciA9IGluZGV4ZXM7IHZhciAhPSBOVUxMOyB2YXIgPSB2YXItPm5leHRfdmFyaWFibGUpIHsKICAgICAgICBpZiAoYnVpbGRfb2lkX3NlZ21lbnQodmFyKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICBpZiAodmFyLT5uYW1lX2xlbmd0aCArICpvdXRfbGVuIDw9IGluX2xlbikgewogICAgICAgICAgICBtZW1jcHkoJihpblsqb3V0X2xlbl0pLCB2YXItPm5hbWUsCiAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqIHZhci0+bmFtZV9sZW5ndGgpOwogICAgICAgICAgICAqb3V0X2xlbiArPSB2YXItPm5hbWVfbGVuZ3RoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICB9CiAgICB9CgogICAgREVCVUdNU0dUTCgoImJ1aWxkX29pZF9ub2FsbG9jIiwgImdlbmVyYXRlZDogIikpOwogICAgREVCVUdNU0dPSUQoKCJidWlsZF9vaWRfbm9hbGxvYyIsIGluLCAqb3V0X2xlbikpOwogICAgREVCVUdNU0coKCJidWlsZF9vaWRfbm9hbGxvYyIsICJcbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCmludApidWlsZF9vaWQob2lkICoqIG91dCwgc2l6ZV90ICogb3V0X2xlbiwKICAgICAgICAgIG9pZCAqIHByZWZpeCwgc2l6ZV90IHByZWZpeF9sZW4sIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIGluZGV4ZXMpCnsKICAgIG9pZCAgICAgICAgICAgICB0bXBvdXRbTUFYX09JRF9MRU5dOwoKICAgIC8qCiAgICAgKiB4eHgtcmtzOiBpbmVmZmljZW50LiB0cnkgb25seSBidWlsZGluZyBzZWdtZW50cyB0byBmaW5kIGluZGV4IGxlbjoKICAgICAqICAgZm9yICh2YXIgPSBpbmRleGVzOyB2YXIgIT0gTlVMTDsgdmFyID0gdmFyLT5uZXh0X3ZhcmlhYmxlKSB7CiAgICAgKiAgICAgIGlmIChidWlsZF9vaWRfc2VnbWVudCh2YXIpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAqICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICogICAgICAqb3V0X2xlbiArPSB2YXItPm5hbWVfbGVuZ3RoOwogICAgICoKICAgICAqIHRoZW4gc2VlIGlmIGl0IGZpdHMgaW4gZXhpc3RpbmcgYnVmZmVyLCBvciByZWFsbG9jIGJ1ZmZlci4KICAgICAqLwogICAgaWYgKGJ1aWxkX29pZF9ub2FsbG9jKHRtcG91dCwgc2l6ZW9mKHRtcG91dCksIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBwcmVmaXhfbGVuLCBpbmRleGVzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgIC8qKiB4eHgtcmtzOiBzaG91bGQgZnJlZSBwcmV2aW91cyB2YWx1ZT8gKi8KICAgIHNubXBfY2xvbmVfbWVtKCh2b2lkICoqKSBvdXQsICh2b2lkICopIHRtcG91dCwgKm91dF9sZW4gKiBzaXplb2Yob2lkKSk7CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKLyoKICogdmJsaXN0X291dCBtdXN0IGNvbnRhaW4gYSBwcmUtYWxsb2NhdGVkIHN0cmluZyBvZiB2YXJpYWJsZXMgaW50bwogKiB3aGljaCBpbmRleGVzIGNhbiBiZSBleHRyYWN0ZWQgYmFzZWQgb24gdGhlIHByZXZpb3VzbHkgZXhpc3RpbmcKICogdHlwZXMgaW4gdGhlIHZhcmlhYmxlIGNoYWluCiAqIHJldHVybnM6CiAqIFNOTVBFUlJfR0VORVJSICBvbiBlcnJvcgogKiBTTk1QRVJSX1NVQ0NFU1Mgb24gc3VjY2VzcwogKi8KCmludApwYXJzZV9vaWRfaW5kZXhlcyhvaWQgKiBvaWRJbmRleCwgc2l6ZV90IG9pZExlbiwKICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXIgPSBkYXRhOwoKICAgIHdoaWxlICh2YXIgJiYgb2lkTGVuID4gMCkgewoKICAgICAgICBpZiAocGFyc2Vfb25lX29pZF9pbmRleCgmb2lkSW5kZXgsICZvaWRMZW4sIHZhciwgMCkgIT0KICAgICAgICAgICAgU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgdmFyID0gdmFyLT5uZXh0X3ZhcmlhYmxlOwogICAgfQoKICAgIGlmICh2YXIgIT0gTlVMTCB8fCBvaWRMZW4gIT0gMCkKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKaW50CnBhcnNlX29uZV9vaWRfaW5kZXgob2lkICoqIG9pZFN0YXJ0LCBzaXplX3QgKiBvaWRMZW4sCiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogZGF0YSwgaW50IGNvbXBsZXRlKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhciA9IGRhdGE7CiAgICBvaWQgICAgICAgICAgICAgdG1wb3V0W01BWF9PSURfTEVOXTsKICAgIHVuc2lnbmVkIGludCAgICBpOwogICAgdW5zaWduZWQgaW50ICAgIHVpdG1wID0gMDsKCiAgICBvaWQgICAgICAgICAgICAqb2lkSW5kZXggPSAqb2lkU3RhcnQ7CgogICAgaWYgKHZhciA9PSBOVUxMIHx8ICgoKm9pZExlbiA9PSAwKSAmJiAoY29tcGxldGUgPT0gMCkpKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIGVsc2UgewogICAgICAgIHN3aXRjaCAodmFyLT50eXBlKSB7CiAgICAgICAgY2FzZSBBU05fSU5URUdFUjoKICAgICAgICBjYXNlIEFTTl9DT1VOVEVSOgogICAgICAgIGNhc2UgQVNOX0dBVUdFOgogICAgICAgIGNhc2UgQVNOX1RJTUVUSUNLUzoKICAgICAgICAgICAgaWYgKCpvaWRMZW4pIHsKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgb2lkSW5kZXgrKywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobG9uZykpOwogICAgICAgICAgICAgICAgLS0oKm9pZExlbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIG9pZExlbiwgc2l6ZW9mKGxvbmcpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIGludCglZCk6ICVkXG4iLCB2YXItPnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICp2YXItPnZhbC5pbnRlZ2VyKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFTTl9JUEFERFJFU1M6CiAgICAgICAgICAgIGlmICgoNCA+ICpvaWRMZW4pICYmIChjb21wbGV0ZSA9PSAwKSkKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIGkgPCAqb2lkTGVuOyArK2kpIHsKICAgICAgICAgICAgICAgIGlmIChvaWRJbmRleFtpXSA+IDI1NSkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgb2lkIGluIGluZGV4OiAlZFxuIiwgb2lkSW5kZXhbMF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOyAgLyogc3ViLWlkZW50aWZpZXIgdG9vIGxhcmdlICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gdWl0bXAgKyAob2lkSW5kZXhbaV0gPDwgKDgqKDMtaSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKDQgPiAoaW50KSAoKm9pZExlbikpIHsKICAgICAgICAgICAgICAgIG9pZEluZGV4ICs9ICpvaWRMZW47CiAgICAgICAgICAgICAgICAoKm9pZExlbikgPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gNDsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSAtPSA0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVpdG1wID0gaHRvbmwodWl0bXApOyAvKiBwdXQgaXQgaW4gcHJvcGVyIG9yZGVyIGZvciBieXRlIGNvcGllcyAqLwogICAgICAgICAgICB1aXRtcCA9IAogICAgICAgICAgICAgICAgc25tcF9zZXRfdmFyX3ZhbHVlKHZhciwgKHVfY2hhciAqKSAmdWl0bXAsIDQpOwogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIGlwYWRkciglZCk6ICVkLiVkLiVkLiVkXG4iLCB2YXItPnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZ1swXSwgdmFyLT52YWwuc3RyaW5nWzFdLAogICAgICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbMl0sIHZhci0+dmFsLnN0cmluZ1szXSkpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgICAgIGNhc2UgQVNOX1BSSVZfSU1QTElFRF9PQkpFQ1RfSUQ6CiAgICAgICAgICAgIGlmICh2YXItPnR5cGUgPT0gQVNOX1BSSVZfSU1QTElFRF9PQkpFQ1RfSUQpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBtaWdodCBub3QgYmUgaW1wbGllZCwgbWlnaHQgYmUgZml4ZWQgbGVuLiBjaGVjayBpZgogICAgICAgICAgICAgICAgICogY2FsbGVyIHNldCB1cCB2YWwgbGVuLCBhbmQgdXNlIGl0IGlmIHRoZXkgZGlkLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoMCA9PSB2YXItPnZhbF9sZW4pCiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzOmZpeCIsICJmaXhlZCBsZW4gb2lkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSB2YXItPnZhbF9sZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoKm9pZExlbikgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgLS0oKm9pZExlbik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgodWl0bXAgPiAqb2lkTGVuKSAmJiAoY29tcGxldGUgPT0gMCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodWl0bXAgPiBNQVhfT0lEX0xFTikKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsgIC8qIHRvbyBiaWcgYW5kIGlsbGVnYWwgKi8KCiAgICAgICAgICAgIGlmICh1aXRtcCA+ICpvaWRMZW4pIHsKICAgICAgICAgICAgICAgIG1lbWNweSh0bXBvdXQsIG9pZEluZGV4LCBzaXplb2Yob2lkKSAqICgqb2lkTGVuKSk7CiAgICAgICAgICAgICAgICBtZW1zZXQoJnRtcG91dFsqb2lkTGVuXSwgMHgwMCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSAqICh1aXRtcCAtICpvaWRMZW4pKTsKICAgICAgICAgICAgICAgIHNubXBfc2V0X3Zhcl92YWx1ZSh2YXIsICh1X2NoYXIgKikgdG1wb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogdWl0bXApOwogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gKm9pZExlbjsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUodmFyLCAodV9jaGFyICopIG9pZEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogdWl0bXApOwogICAgICAgICAgICAgICAgb2lkSW5kZXggKz0gdWl0bXA7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgLT0gdWl0bXA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWRfaW5kZXhlcyIsICJQYXJzZWQgb2lkOiAiKSk7CiAgICAgICAgICAgIERFQlVHTVNHT0lEKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwub2JqaWQsIHZhci0+dmFsX2xlbiAvIHNpemVvZihvaWQpKSk7CiAgICAgICAgICAgIERFQlVHTVNHKCgicGFyc2Vfb2lkX2luZGV4ZXMiLCAiXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFTTl9PUEFRVUU6CiAgICAgICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgICAgIGNhc2UgQVNOX1BSSVZfSU1QTElFRF9PQ1RFVF9TVFI6CiAgICAgICAgICAgIGlmICh2YXItPnR5cGUgPT0gQVNOX1BSSVZfSU1QTElFRF9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBtaWdodCBub3QgYmUgaW1wbGllZCwgbWlnaHQgYmUgZml4ZWQgbGVuLiBjaGVjayBpZgogICAgICAgICAgICAgICAgICogY2FsbGVyIHNldCB1cCB2YWwgbGVuLCBhbmQgdXNlIGl0IGlmIHRoZXkgZGlkLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoMCA9PSB2YXItPnZhbF9sZW4pCiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSAqb2lkTGVuOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzOmZpeCIsICJmaXhlZCBsZW4gc3RyXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgdWl0bXAgPSB2YXItPnZhbF9sZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoKm9pZExlbikgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gKm9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgLS0oKm9pZExlbik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHVpdG1wID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgodWl0bXAgPiAqb2lkTGVuKSAmJiAoY29tcGxldGUgPT0gMCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB3ZSBoYW5kbGUgdGhpcyBvbmUgb3Vyc2VsdmVzIHNpbmNlIHdlIGRvbid0IGhhdmUKICAgICAgICAgICAgICogcHJlLWFsbG9jYXRlZCBtZW1vcnkgdG8gY29weSBmcm9tIHVzaW5nCiAgICAgICAgICAgICAqIHNubXBfc2V0X3Zhcl92YWx1ZSgpIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmICh1aXRtcCA9PSAwKQogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIHplcm8gbGVuZ3RoIHN0cmluZ3Mgc2hvdWxkbid0IG1hbGxvYyAqLwoKICAgICAgICAgICAgaWYgKHVpdG1wID4gTUFYX09JRF9MRU4pCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7ICAvKiB0b28gYmlnIGFuZCBpbGxlZ2FsICovCgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBtYWxsb2MgYnkgc2l6ZSsxIHRvIGFsbG93IGEgbnVsbCB0byBiZSBhcHBlbmRlZC4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YXItPnZhbF9sZW4gPSB1aXRtcDsKICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nID0gKHVfY2hhciAqKSBjYWxsb2MoMSwgdWl0bXAgKyAxKTsKICAgICAgICAgICAgaWYgKHZhci0+dmFsLnN0cmluZyA9PSBOVUxMKQogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgICAgICAgICAgaWYgKChzaXplX3QpdWl0bXAgPiAoKm9pZExlbikpIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqb2lkTGVuOyArK2kpCiAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW2ldID0gKHVfY2hhcikgKiBvaWRJbmRleCsrOwogICAgICAgICAgICAgICAgZm9yIChpID0gKm9pZExlbjsgaSA8IHVpdG1wOyArK2kpCiAgICAgICAgICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW2ldID0gJ1wwJzsKICAgICAgICAgICAgICAgICgqb2lkTGVuKSA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdWl0bXA7ICsraSkKICAgICAgICAgICAgICAgICAgICB2YXItPnZhbC5zdHJpbmdbaV0gPSAodV9jaGFyKSAqIG9pZEluZGV4Kys7CiAgICAgICAgICAgICAgICAoKm9pZExlbikgLT0gdWl0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nW3VpdG1wXSA9ICdcMCc7CgogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2Vfb2lkX2luZGV4ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIHN0ciglZCk6ICVzXG4iLCB2YXItPnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhci0+dmFsLnN0cmluZykpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlX29pZF9pbmRleGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgYXNuIHR5cGU6ICVkXG4iLCB2YXItPnR5cGUpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIH0KICAgIH0KICAgICgqb2lkU3RhcnQpID0gb2lkSW5kZXg7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgovKgogKiBkdW1wX3JlYWxsb2Nfb2lkX3RvX2luZXRhZGRyZXNzOgogKiAgIHJldHVybiAwIGZvciBmYWlsdXJlLAogKiAgIHJldHVybiAxIGZvciBzdWNjZXNzLAogKiAgIHJldHVybiAyIGZvciBub3QgaGFuZGxlZAogKi8KCmludCAKZHVtcF9yZWFsbG9jX29pZF90b19pbmV0YWRkcmVzcyhjb25zdCBpbnQgYWRkcl90eXBlLCBjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHF1b3RlY2hhcikKewogICAgaW50ICAgICAgICAgICAgIGksIGxlbjsKICAgIGNoYXIgICAgICAgICAgICBpbnRidWZbNjRdLCAqcDsKICAgIGNoYXIgKmNvbnN0ICAgICBlbmQgPSBpbnRidWYgKyBzaXplb2YoaW50YnVmKTsKICAgIHVuc2lnbmVkIGNoYXIgICp6YzsKICAgIHVuc2lnbmVkIGxvbmcgICB6b25lOwoKICAgIGlmICghYnVmKQogICAgICAgIHJldHVybiAxOwoKICAgIGZvciAoaSA9IDA7IGkgPCBvYmppZGxlbjsgaSsrKQogICAgICAgIGlmIChvYmppZFtpXSA8IDAgfHwgb2JqaWRbaV0gPiAyNTUpCiAgICAgICAgICAgIHJldHVybiAyOwoKICAgIHAgPSBpbnRidWY7CiAgICAqcCsrID0gcXVvdGVjaGFyOwoKICAgIHN3aXRjaCAoYWRkcl90eXBlKSB7CiAgICBjYXNlIElQVjQ6CiAgICBjYXNlIElQVjRaOgogICAgICAgIGlmICgoYWRkcl90eXBlID09IElQVjQgICYmIG9iamlkbGVuICE9IDQpIHx8CiAgICAgICAgICAgIChhZGRyX3R5cGUgPT0gSVBWNFogJiYgb2JqaWRsZW4gIT0gOCkpCiAgICAgICAgICAgIHJldHVybiAyOwoKICAgICAgICBsZW4gPSBzbnByaW50ZihwLCBlbmQgLSBwLCAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidS4iCiAgICAgICAgICAgICAgICAgICAgICAiJSIgTkVUU05NUF9QUklvICJ1LiUiIE5FVFNOTVBfUFJJbyAidSIsCiAgICAgICAgICAgICAgICAgICAgICBvYmppZFswXSwgb2JqaWRbMV0sIG9iamlkWzJdLCBvYmppZFszXSk7CiAgICAgICAgcCArPSBsZW47CiAgICAgICAgaWYgKHAgPj0gZW5kKQogICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICBpZiAoYWRkcl90eXBlID09IElQVjRaKSB7CiAgICAgICAgICAgIHpjID0gKHVuc2lnbmVkIGNoYXIqKSZ6b25lOwogICAgICAgICAgICB6Y1swXSA9IG9iamlkWzRdOwogICAgICAgICAgICB6Y1sxXSA9IG9iamlkWzVdOwogICAgICAgICAgICB6Y1syXSA9IG9iamlkWzZdOwogICAgICAgICAgICB6Y1szXSA9IG9iamlkWzddOwogICAgICAgICAgICB6b25lID0gbnRvaGwoem9uZSk7CiAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHAsIGVuZCAtIHAsICIlJSVsdSIsIHpvbmUpOwogICAgICAgICAgICBwICs9IGxlbjsKICAgICAgICAgICAgaWYgKHAgPj0gZW5kKQogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCiAgICBjYXNlIElQVjY6CiAgICBjYXNlIElQVjZaOgogICAgICAgIGlmICgoYWRkcl90eXBlID09IElQVjYgJiYgb2JqaWRsZW4gIT0gMTYpIHx8CiAgICAgICAgICAgIChhZGRyX3R5cGUgPT0gSVBWNlogJiYgb2JqaWRsZW4gIT0gMjApKQogICAgICAgICAgICByZXR1cm4gMjsKCiAgICAgICAgbGVuID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKyspIHsKICAgICAgICAgICAgbGVuID0gc25wcmludGYocCwgZW5kIC0gcCwgIiVzJTAyIiBORVRTTk1QX1BSSW8gIngiLCBpID8gIjoiIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkW2ldKTsKICAgICAgICAgICAgcCArPSBsZW47CiAgICAgICAgICAgIGlmIChwID49IGVuZCkKICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFkZHJfdHlwZSA9PSBJUFY2WikgewogICAgICAgICAgICB6YyA9ICh1bnNpZ25lZCBjaGFyKikmem9uZTsKICAgICAgICAgICAgemNbMF0gPSBvYmppZFsxNl07CiAgICAgICAgICAgIHpjWzFdID0gb2JqaWRbMTddOwogICAgICAgICAgICB6Y1syXSA9IG9iamlkWzE4XTsKICAgICAgICAgICAgemNbM10gPSBvYmppZFsxOV07CiAgICAgICAgICAgIHpvbmUgPSBudG9obCh6b25lKTsKICAgICAgICAgICAgbGVuID0gc25wcmludGYocCwgZW5kIC0gcCwgIiUlJWx1Iiwgem9uZSk7CiAgICAgICAgICAgIHAgKz0gbGVuOwogICAgICAgICAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CgogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgRE5TOgogICAgZGVmYXVsdDogCiAgICAgICAgLyogRE5TIGNhbiBqdXN0IGJlIGhhbmRsZWQgYnkgZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcoKSAqLwogICAgICAgIHJldHVybiAyOwogICAgfQoKICAgICpwKysgPSBxdW90ZWNoYXI7CiAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgcmV0dXJuIDI7CgogICAgKnArKyA9ICdcMCc7CiAgICBpZiAocCA+PSBlbmQpCiAgICAgICAgcmV0dXJuIDI7CgogICAgcmV0dXJuIHNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGludGJ1Zik7Cn0KCmludApkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZyhjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogYnVmLCBzaXplX3QgKiBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvdXRfbGVuLCBpbnQgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBxdW90ZWNoYXIpCnsKICAgIGlmIChidWYpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgaSwgYWxlbjsKCiAgICAgICAgZm9yIChpID0gMCwgYWxlbiA9IDA7IGkgPCAoaW50KSBvYmppZGxlbjsgaSsrKSB7CiAgICAgICAgICAgIG9pZCAgICAgICAgICAgICB0c3QgPSBvYmppZFtpXTsKICAgICAgICAgICAgaWYgKCh0c3QgPiAyNTQpIHx8ICghaXNwcmludCh0c3QpKSkgewogICAgICAgICAgICAgICAgdHN0ID0gKG9pZCkgJy4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoYWxlbiA9PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX0VTQ0FQRV9RVU9URVMpKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXFwnOwogICAgICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICgoKm91dF9sZW4gKyAyKSA+PSAqYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IHF1b3RlY2hhcjsKICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICBpZiAoIShhbGxvd19yZWFsbG9jICYmIHNubXBfcmVhbGxvYyhidWYsIGJ1Zl9sZW4pKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICooKmJ1ZiArICpvdXRfbGVuKSA9IChjaGFyKSB0c3Q7CiAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgYWxlbisrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFsZW4pIHsKICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTKSkgewogICAgICAgICAgICAgICAgd2hpbGUgKCgqb3V0X2xlbiArIDIpID49ICpidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYWxsb3dfcmVhbGxvYyAmJiBzbm1wX3JlYWxsb2MoYnVmLCBidWZfbGVuKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gJ1xcJzsKICAgICAgICAgICAgICAgICgqb3V0X2xlbikrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoKCpvdXRfbGVuICsgMikgPj0gKmJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIGlmICghKGFsbG93X3JlYWxsb2MgJiYgc25tcF9yZWFsbG9jKGJ1ZiwgYnVmX2xlbikpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKigqYnVmICsgKm91dF9sZW4pID0gcXVvdGVjaGFyOwogICAgICAgICAgICAoKm91dF9sZW4pKys7CiAgICAgICAgfQoKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbikgPSAnXDAnOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgp2b2lkCl9vaWRfZmluaXNoX3ByaW50aW5nKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd19yZWFsbG9jLCBpbnQgKmJ1Zl9vdmVyZmxvdykgewogICAgY2hhciAgICAgICAgICAgIGludGJ1Zls2NF07CiAgICBpZiAoKmJ1ZiAhPSBOVUxMICYmICooKmJ1ZiArICpvdXRfbGVuIC0gMSkgIT0gJy4nKSB7CiAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiLiIpKSB7CiAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICB3aGlsZSAob2JqaWRsZW4tLSA+IDApIHsgICAgLyogb3V0cHV0IHJlc3Qgb2YgbmFtZSwgdW5pbnRlcnByZXRlZCAqLwogICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx1LiIsICpvYmppZCsrKTsKICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopIGludGJ1ZikpIHsKICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIGlmICgqYnVmICE9IE5VTEwpIHsKICAgICAgICAqKCpidWYgKyAqb3V0X2xlbiAtIDEpID0gJ1wwJzsgIC8qIHJlbW92ZSB0cmFpbGluZyBkb3QgKi8KICAgICAgICAqb3V0X2xlbiA9ICpvdXRfbGVuIC0gMTsKICAgIH0KfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKc3RhdGljIHN0cnVjdCB0cmVlICoKX2dldF9yZWFsbG9jX3N5bWJvbChjb25zdCBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmVlICpzdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sIHNpemVfdCAqIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgaW50IGFsbG93X3JlYWxsb2MsIGludCAqYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbmRleF9saXN0ICppbl9kaWNlcywgc2l6ZV90ICogZW5kX29mX2tub3duKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqcmV0dXJuX3RyZWUgPSBOVUxMOwogICAgaW50ICAgICAgICAgICAgIGV4dGVuZGVkX2luZGV4ID0KICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVhURU5ERURfSU5ERVgpOwogICAgaW50ICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQgPQogICAgICAgIG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUKTsKICAgIGNoYXIgICAgICAgICAgICBpbnRidWZbNjRdOwoKICAgIGlmICghb2JqaWQgfHwgIWJ1ZikgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGZvciAoOyBzdWJ0cmVlOyBzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyKSB7CiAgICAgICAgaWYgKCpvYmppZCA9PSBzdWJ0cmVlLT5zdWJpZCkgewoJICAgIHdoaWxlIChzdWJ0cmVlLT5uZXh0X3BlZXIgJiYgc3VidHJlZS0+bmV4dF9wZWVyLT5zdWJpZCA9PSAqb2JqaWQpCgkJc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcjsKICAgICAgICAgICAgaWYgKHN1YnRyZWUtPmluZGV4ZXMpIHsKICAgICAgICAgICAgICAgIGluX2RpY2VzID0gc3VidHJlZS0+aW5kZXhlczsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJ0cmVlLT5hdWdtZW50cykgewogICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgICAgKnRwMiA9CiAgICAgICAgICAgICAgICAgICAgZmluZF90cmVlX25vZGUoc3VidHJlZS0+YXVnbWVudHMsIC0xKTsKICAgICAgICAgICAgICAgIGlmICh0cDIpIHsKICAgICAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHRwMi0+aW5kZXhlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzdHJuY21wKHN1YnRyZWUtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikgfHwKICAgICAgICAgICAgICAgIChORVRTTk1QX09JRF9PVVRQVVRfTlVNRVJJQyA9PSBvdXRwdXRfZm9ybWF0KSkgewogICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbHUiLCBzdWJ0cmVlLT5zdWJpZCk7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5sYWJlbCkpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG9iamlkbGVuID4gMSkgewogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93ICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIi4iKSkgewogICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybl90cmVlID0gX2dldF9yZWFsbG9jX3N5bWJvbChvYmppZCArIDEsIG9iamlkbGVuIC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlLT5jaGlsZF9saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywgaW5fZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX29mX2tub3duKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHJldHVybl90cmVlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5fdHJlZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdWJ0cmVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICBpZiAoZW5kX29mX2tub3duKSB7CiAgICAgICAgKmVuZF9vZl9rbm93biA9ICpvdXRfbGVuOwogICAgfQoKICAgIC8qCiAgICAgKiBTdWJ0cmVlIG5vdCBmb3VuZC4gIAogICAgICovCgogICAgd2hpbGUgKGluX2RpY2VzICYmIChvYmppZGxlbiA+IDApICYmCiAgICAgICAgICAgKE5FVFNOTVBfT0lEX09VVFBVVF9OVU1FUklDICE9IG91dHB1dF9mb3JtYXQpICYmCiAgICAgICAgICAgIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0JSRUFLRE9XTl9PSURTKSkgewogICAgICAgIHNpemVfdCAgICAgICAgICBudW1pZHM7CiAgICAgICAgc3RydWN0IHRyZWUgICAgKnRwOwoKICAgICAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKGluX2RpY2VzLT5pbGFiZWwsIC0xKTsKCiAgICAgICAgaWYgKCF0cCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBDYW4ndCBmaW5kIGFuIGluZGV4IGluIHRoZSBtaWIgdHJlZS4gIEJhaWwuICAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgIH0KCiAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4KSB7CiAgICAgICAgICAgIGlmICgqYnVmICE9IE5VTEwgJiYgKigqYnVmICsgKm91dF9sZW4gLSAxKSA9PSAnLicpIHsKICAgICAgICAgICAgICAgICgqb3V0X2xlbiktLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIlsiKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfT0NURVRTVFI6CiAgICAgICAgICAgIGlmIChleHRlbmRlZF9pbmRleCAmJiB0cC0+aGludCkgewogICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0IHZhcjsKICAgICAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBidWZmZXJbMTAyNF07CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICAgICAgICAgICAgICBtZW1zZXQoJnZhciwgMCwgc2l6ZW9mIHZhcik7CiAgICAgICAgICAgICAgICBpZiAoaW5fZGljZXMtPmlzaW1wbGllZCkgewogICAgICAgICAgICAgICAgICAgIG51bWlkcyA9IG9iamlkbGVuOwogICAgICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRwLT5yYW5nZXMgJiYgIXRwLT5yYW5nZXMtPm5leHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHAtPnJhbmdlcy0+bG93ID09IHRwLT5yYW5nZXMtPmhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICBudW1pZHMgPSB0cC0+cmFuZ2VzLT5sb3c7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbnVtaWRzID0gKm9iamlkOwogICAgICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPj0gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgICAgIG9iamlkKys7CiAgICAgICAgICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChudW1pZHMgPiBvYmppZGxlbikKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KSBudW1pZHM7IGkrKykKICAgICAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSAodV9jaGFyKSBvYmppZFtpXTsKICAgICAgICAgICAgICAgIHZhci50eXBlID0gQVNOX09DVEVUX1NUUjsKICAgICAgICAgICAgICAgIHZhci52YWwuc3RyaW5nID0gYnVmZmVyOwogICAgICAgICAgICAgICAgdmFyLnZhbF9sZW4gPSBudW1pZHM7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNwcmludF9yZWFsbG9jX29jdGV0X3N0cmluZyhidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJnZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB0cC0+aGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5fZGljZXMtPmlzaW1wbGllZCkgewogICAgICAgICAgICAgICAgbnVtaWRzID0gb2JqaWRsZW47CiAgICAgICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CgogICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAob2JqaWQsIG51bWlkcywgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgJ1wnJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHRwLT5yYW5nZXMgJiYgIXRwLT5yYW5nZXMtPm5leHQKICAgICAgICAgICAgICAgICAgICAgICAmJiB0cC0+cmFuZ2VzLT5sb3cgPT0gdHAtPnJhbmdlcy0+aGlnaCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGEgZml4ZWQtbGVuZ3RoIG9jdGV0IHN0cmluZyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbnVtaWRzID0gdHAtPnJhbmdlcy0+bG93OwogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwoKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICAgICAgICAgIGlmICghZHVtcF9yZWFsbG9jX29pZF90b19zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgKG9iamlkLCBudW1pZHMsIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICdcJycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG51bWlkcyA9IChzaXplX3QpICogb2JqaWQgKyAxOwogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA+IG9iamlkbGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICAgICAgaWYgKG51bWlkcyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4KICAgICAgICAgICAgICAgICAgICAgICAgKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXFwiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXCIiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4KICAgICAgICAgICAgICAgICAgICAgICAgKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfRVNDQVBFX1FVT1RFUykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXFwiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSAiXCIiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdykgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAqIG5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vcm1hbF9oYW5kbGluZyA9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAtPm5leHRfcGVlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9wZWVyID0gdHAtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJ5IGhhbmRsaW5nIHRoZSBJbmV0QWRkcmVzcyBpbiB0aGUgT0lELCBpbiBjYXNlIG9mIGZhaWx1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHVzZSB0aGUgbm9ybWFsX2hhbmRsaW5nLiAKICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cC0+bmV4dF9wZWVyICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dGNfaW5kZXggIT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcGVlci0+dGNfaW5kZXggIT0gLTEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChnZXRfdGNfZGVzY3JpcHRvcih0cC0+dGNfaW5kZXgpLCAiSW5ldEFkZHJlc3MiKSA9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoZ2V0X3RjX2Rlc2NyaXB0b3IobmV4dF9wZWVyLT50Y19pbmRleCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5ldEFkZHJlc3NUeXBlIikgPT0gMCApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkZHJfdHlwZSA9ICoob2JqaWQgLSAxKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBkdW1wX3JlYWxsb2Nfb2lkX3RvX2luZXRhZGRyZXNzKGFkZHJfdHlwZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCArIDEsIG51bWlkcyAtIDEsIGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxfaGFuZGxpbmcgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsX2hhbmRsaW5nICYmICFkdW1wX3JlYWxsb2Nfb2lkX3RvX3N0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iamlkICsgMSwgbnVtaWRzIC0gMSwgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsICciJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iamlkICs9IG51bWlkczsKICAgICAgICAgICAgb2JqaWRsZW4gLT0gbnVtaWRzOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICBjYXNlIFRZUEVfVUlOVEVHRVI6CiAgICAgICAgY2FzZSBUWVBFX1VOU0lHTkVEMzI6CiAgICAgICAgY2FzZSBUWVBFX0dBVUdFOgogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgICAgICBpZiAodHAtPmVudW1zKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgZW51bV9saXN0ICplcCA9IHRwLT5lbnVtczsKICAgICAgICAgICAgICAgIHdoaWxlIChlcCAmJiBlcC0+dmFsdWUgIT0gKGludCkgKCpvYmppZCkpIHsKICAgICAgICAgICAgICAgICAgICBlcCA9IGVwLT5uZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmX292ZXJmbG93CiAgICAgICAgICAgICAgICAgICAgICAgICYmICFzbm1wX3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBlcC0+bGFiZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpidWZfb3ZlcmZsb3cgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbHUiLCAqb2JqaWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKGludGJ1ZiwgIiVsdSIsICpvYmppZCk7CiAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqaWQrKzsKICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgICAgIC8qIEluIGFuIGluZGV4LCB0aGlzIGlzIHByb2JhYmx5IGEgdGltZWZpbHRlciAqLwogICAgICAgICAgICBpZiAoZXh0ZW5kZWRfaW5kZXgpIHsKICAgICAgICAgICAgICAgIHVwdGltZVN0cmluZyggKm9iamlkLCBpbnRidWYsIHNpemVvZiggaW50YnVmICkgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJSIgTkVUU05NUF9QUklvICJ1IiwgKm9iamlkKTsKICAgICAgICAgICAgfSAgIAogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvYmppZCsrOwogICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgICAgICBpZiAoaW5fZGljZXMtPmlzaW1wbGllZCkgewogICAgICAgICAgICAgICAgbnVtaWRzID0gb2JqaWRsZW47CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBudW1pZHMgPSAoc2l6ZV90KSAqIG9iamlkICsgMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobnVtaWRzID4gb2JqaWRsZW4pCiAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgaWYgKGV4dGVuZGVkX2luZGV4KSB7CiAgICAgICAgICAgICAgICBpZiAoaW5fZGljZXMtPmlzaW1wbGllZCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhbmV0c25tcF9zcHJpbnRfcmVhbGxvY19vYmppZF90cmVlKGJ1ZiwgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWlkcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW5ldHNubXBfc3ByaW50X3JlYWxsb2Nfb2JqaWRfdHJlZShidWYsIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vdmVyZmxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppZCArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtaWRzIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfZ2V0X3JlYWxsb2Nfc3ltYm9sKG9iamlkLCBudW1pZHMsIE5VTEwsIGJ1ZiwgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgYnVmX292ZXJmbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvYmppZCArPSAobnVtaWRzKTsKICAgICAgICAgICAgb2JqaWRsZW4gLT0gKG51bWlkcyk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgICAgICBpZiAob2JqaWRsZW4gPCA0KQogICAgICAgICAgICAgICAgZ290byBmaW5pc2hfaXQ7CiAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx1LiVsdS4lbHUuJWx1IiwKICAgICAgICAgICAgICAgICAgICBvYmppZFswXSwgb2JqaWRbMV0sIG9iamlkWzJdLCBvYmppZFszXSk7CiAgICAgICAgICAgIG9iamlkICs9IDQ7CiAgICAgICAgICAgIG9iamlkbGVuIC09IDQ7CiAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVfY2hhciAqKSBpbnRidWYpKSB7CiAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX05FVEFERFI6ewogICAgICAgICAgICAgICAgb2lkICAgICAgICAgICAgIG50eXBlID0gKm9iamlkKys7CgogICAgICAgICAgICAgICAgb2JqaWRsZW4tLTsKICAgICAgICAgICAgICAgIHNwcmludGYoaW50YnVmLCAiJWx1LiIsIG50eXBlKTsKICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdyAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdV9jaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGJ1ZikpIHsKICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobnR5cGUgPT0gMSAmJiBvYmppZGxlbiA+PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpbnRidWYsICIlbHUuJWx1LiVsdS4lbHUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWRbMF0sIG9iamlkWzFdLCBvYmppZFsyXSwgb2JqaWRbM10pOwogICAgICAgICAgICAgICAgICAgIGlmICghKmJ1Zl9vdmVyZmxvdwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc25tcF9zdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgaW50YnVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICAqYnVmX292ZXJmbG93ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb2JqaWQgKz0gNDsKICAgICAgICAgICAgICAgICAgICBvYmppZGxlbiAtPSA0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaF9pdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBUWVBFX05TQVBBRERSRVNTOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGdvdG8gZmluaXNoX2l0OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChleHRlbmRlZF9pbmRleCkgewogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIl0iKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoISpidWZfb3ZlcmZsb3cgJiYgIXNubXBfc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1X2NoYXIgKikgIi4iKSkgewogICAgICAgICAgICAgICAgKmJ1Zl9vdmVyZmxvdyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW5fZGljZXMgPSBpbl9kaWNlcy0+bmV4dDsKICAgIH0KCiAgZmluaXNoX2l0OgogICAgX29pZF9maW5pc2hfcHJpbnRpbmcob2JqaWQsIG9iamlkbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZfbGVuLCBvdXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVhbGxvYywgYnVmX292ZXJmbG93KTsKICAgIHJldHVybiBOVUxMOwp9CgpzdHJ1Y3QgdHJlZSAgICAqCmdldF90cmVlKGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIHN0cnVjdCB0cmVlICpzdWJ0cmVlKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqcmV0dXJuX3RyZWUgPSBOVUxMOwoKICAgIGZvciAoOyBzdWJ0cmVlOyBzdWJ0cmVlID0gc3VidHJlZS0+bmV4dF9wZWVyKSB7CiAgICAgICAgaWYgKCpvYmppZCA9PSBzdWJ0cmVlLT5zdWJpZCkKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgIH0KCiAgICByZXR1cm4gTlVMTDsKCiAgZm91bmQ6CiAgICB3aGlsZSAoc3VidHJlZS0+bmV4dF9wZWVyICYmIHN1YnRyZWUtPm5leHRfcGVlci0+c3ViaWQgPT0gKm9iamlkKQoJc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcjsKICAgIGlmIChvYmppZGxlbiA+IDEpCiAgICAgICAgcmV0dXJuX3RyZWUgPQogICAgICAgICAgICBnZXRfdHJlZShvYmppZCArIDEsIG9iamlkbGVuIC0gMSwgc3VidHJlZS0+Y2hpbGRfbGlzdCk7CiAgICBpZiAocmV0dXJuX3RyZWUgIT0gTlVMTCkKICAgICAgICByZXR1cm4gcmV0dXJuX3RyZWU7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIHN1YnRyZWU7Cn0KCi8qKgogKiBQcmludHMgb24gb2lkIGRlc2NyaXB0aW9uIG9uIHN0ZG91dC4KICoKICogQHNlZSBmcHJpbnRfZGVzY3JpcHRpb24KICovCnZvaWQKcHJpbnRfZGVzY3JpcHRpb24ob2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwgLyogbnVtYmVyIG9mIHN1YmlkZW50aWZpZXJzICovCiAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkKewogICAgZnByaW50X2Rlc2NyaXB0aW9uKHN0ZG91dCwgb2JqaWQsIG9iamlkbGVuLCB3aWR0aCk7Cn0KCgovKioKICogUHJpbnRzIG9uIG9pZCBkZXNjcmlwdGlvbiBpbnRvIGEgZmlsZSBkZXNjcmlwdG9yLgogKiAKICogQHBhcmFtIGYgICAgICAgICBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHByaW50IHRvLgogKiBAcGFyYW0gb2JqaWQgICAgIFRoZSBvYmplY3QgaWRlbnRpZmllci4KICogQHBhcmFtIG9iamlkbGVuICBUaGUgb2JqZWN0IGlkIGxlbmd0aC4KICogQHBhcmFtIHdpZHRoICAgICBOdW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMuCiAqLwp2b2lkCmZwcmludF9kZXNjcmlwdGlvbihGSUxFICogZiwgb2lkICogb2JqaWQsIHNpemVfdCBvYmppZGxlbiwKICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkKewogICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IDI1Niwgb3V0X2xlbiA9IDA7CgogICAgaWYgKChidWYgPSAodV9jaGFyICopIGNhbGxvYyhidWZfbGVuLCAxKSkgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoZiwgIltUUlVOQ0FURURdXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIGlmICghc3ByaW50X3JlYWxsb2NfZGVzY3JpcHRpb24oJmJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkLCBvYmppZGxlbiwgd2lkdGgpKSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIFtUUlVOQ0FURURdXG4iLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzXG4iLCBidWYpOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUoYnVmKTsKfQoKaW50CnNucHJpbnRfZGVzY3JpcHRpb24oY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICBvaWQgKiBvYmppZCwgc2l6ZV90IG9iamlkbGVuLCBpbnQgd2lkdGgpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKCiAgICBpZiAoc3ByaW50X3JlYWxsb2NfZGVzY3JpcHRpb24oKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqaWQsIG9iamlkbGVuLCB3aWR0aCkpIHsKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CgppbnQKc3ByaW50X3JlYWxsb2NfZGVzY3JpcHRpb24odV9jaGFyICoqIGJ1Ziwgc2l6ZV90ICogYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogb3V0X2xlbiwgaW50IGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIG9pZCAqIG9iamlkLCBzaXplX3Qgb2JqaWRsZW4sIGludCB3aWR0aCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwID0gZ2V0X3RyZWUob2JqaWQsIG9iamlkbGVuLCB0cmVlX2hlYWQpOwogICAgc3RydWN0IHRyZWUgICAgKnN1YnRyZWUgPSB0cmVlX2hlYWQ7CiAgICBpbnQgICAgICAgICAgICAgcG9zLCBsZW47CiAgICBjaGFyICAgICAgICAgICAgdG1wYnVmWzEyOF07CiAgICBjb25zdCBjaGFyICAgICAqY3A7CgogICAgaWYgKE5VTEwgPT0gdHApCiAgICAgICAgcmV0dXJuIDA7CgogICAgaWYgKHRwLT50eXBlIDw9IFRZUEVfU0lNUExFX0xBU1QpCiAgICAgICAgY3AgPSAiIE9CSkVDVC1UWVBFIjsKICAgIGVsc2UKICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX1RSQVBUWVBFOgogICAgICAgICAgICBjcCA9ICIgVFJBUC1UWVBFIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05PVElGVFlQRToKICAgICAgICAgICAgY3AgPSAiIE5PVElGSUNBVElPTi1UWVBFIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09CSkdST1VQOgogICAgICAgICAgICBjcCA9ICIgT0JKRUNULUdST1VQIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0FHRU5UQ0FQOgogICAgICAgICAgICBjcCA9ICIgQUdFTlQtQ0FQQUJJTElUSUVTIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX01PRElEOgogICAgICAgICAgICBjcCA9ICIgTU9EVUxFLUlERU5USVRZIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09CSklERU5USVRZOgogICAgICAgICAgICBjcCA9ICIgT0JKRUNULUlERU5USVRZIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX01PRENPTVA6CiAgICAgICAgICAgIGNwID0gIiBNT0RVTEUtQ09NUExJQU5DRSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNwcmludGYodG1wYnVmLCAiIHR5cGVfJWQiLCB0cC0+dHlwZSk7CiAgICAgICAgICAgIGNwID0gdG1wYnVmOwogICAgICAgIH0KCiAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5sYWJlbCkgfHwKICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApIHx8CiAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoIXByaW50X3RyZWVfbm9kZShidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLCB3aWR0aCkpCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICI6Oj0geyIpKQogICAgICAgIHJldHVybiAwOwogICAgcG9zID0gNTsKICAgIHdoaWxlIChvYmppZGxlbiA+IDEpIHsKICAgICAgICBmb3IgKDsgc3VidHJlZTsgc3VidHJlZSA9IHN1YnRyZWUtPm5leHRfcGVlcikgewogICAgICAgICAgICBpZiAoKm9iamlkID09IHN1YnRyZWUtPnN1YmlkKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoc3VidHJlZS0+bmV4dF9wZWVyICYmIHN1YnRyZWUtPm5leHRfcGVlci0+c3ViaWQgPT0gKm9iamlkKQogICAgICAgICAgICAgICAgICAgIHN1YnRyZWUgPSBzdWJ0cmVlLT5uZXh0X3BlZXI7CiAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChzdWJ0cmVlLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pKSB7CiAgICAgICAgICAgICAgICAgICAgc25wcmludGYodG1wYnVmLCBzaXplb2YodG1wYnVmKSwgIiAlcyglbHUpIiwgc3VidHJlZS0+bGFiZWwsIHN1YnRyZWUtPnN1YmlkKTsKICAgICAgICAgICAgICAgICAgICB0bXBidWZbIHNpemVvZih0bXBidWYpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcGJ1ZiwgIiAlbHUiLCBzdWJ0cmVlLT5zdWJpZCk7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4odG1wYnVmKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAiXG4gICAgICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSA1OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0bXBidWYpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbjsKICAgICAgICAgICAgICAgIG9iamlkKys7CiAgICAgICAgICAgICAgICBvYmppZGxlbi0tOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN1YnRyZWUpCiAgICAgICAgICAgIHN1YnRyZWUgPSBzdWJ0cmVlLT5jaGlsZF9saXN0OwogICAgICAgIGVsc2UKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICB3aGlsZSAob2JqaWRsZW4gPiAxKSB7CiAgICAgICAgc3ByaW50Zih0bXBidWYsICIgJWx1IiwgKm9iamlkKTsKICAgICAgICBsZW4gPSBzdHJsZW4odG1wYnVmKTsKICAgICAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuICAgICAiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBwb3MgPSA1OwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRtcGJ1ZikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHBvcyArPSBsZW47CiAgICAgICAgb2JqaWQrKzsKICAgICAgICBvYmppZGxlbi0tOwogICAgfQogICAgc3ByaW50Zih0bXBidWYsICIgJWx1IH0iLCAqb2JqaWQpOwogICAgbGVuID0gc3RybGVuKHRtcGJ1Zik7CiAgICBpZiAocG9zICsgbGVuICsgMiA+IHdpZHRoKSB7CiAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4gICAgICIpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBwb3MgPSA1OwogICAgfQogICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0bXBidWYpKQogICAgICAgIHJldHVybiAwOwogICAgcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQKcHJpbnRfdHJlZV9ub2RlKHVfY2hhciAqKiBidWYsIHNpemVfdCAqIGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIG91dF9sZW4sIGludCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZSAqdHAsIGludCB3aWR0aCkKewogICAgY29uc3QgY2hhciAgICAgKmNwOwogICAgY2hhciAgICAgICAgICAgIHN0cltNQVhUT0tFTl07CiAgICBpbnQgICAgICAgICAgICAgaSwgcHJldm1vZCwgcG9zLCBsZW47CgogICAgaWYgKHRwKSB7CiAgICAgICAgbW9kdWxlX25hbWUodHAtPm1vZGlkLCBzdHIpOwogICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiAgLS0gRlJPTVx0IikgfHwKICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHBvcyA9IDE2K3N0cmxlbihzdHIpOwogICAgICAgIGZvciAoaSA9IDEsIHByZXZtb2QgPSB0cC0+bW9kaWQ7IGkgPCB0cC0+bnVtYmVyX21vZHVsZXM7IGkrKykgewogICAgICAgICAgICBpZiAocHJldm1vZCAhPSB0cC0+bW9kdWxlX2xpc3RbaV0pIHsKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lKHRwLT5tb2R1bGVfbGlzdFtpXSwgc3RyKTsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHIpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsXG4gIC0tXHRcdCIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICBwb3MgPSAxNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiwgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgcG9zICs9IGxlbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmV2bW9kID0gdHAtPm1vZHVsZV9saXN0W2ldOwogICAgICAgIH0KICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPnRjX2luZGV4ICE9IC0xKSB7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgLS0gVEVYVFVBTCBDT05WRU5USU9OICIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3RjX2Rlc2NyaXB0b3IodHAtPnRjX2luZGV4KSkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgICAgICBjcCA9ICJPQkpFQ1QgSURFTlRJRklFUiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICAgICAgY3AgPSAiT0NURVQgU1RSSU5HIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVI6CiAgICAgICAgICAgIGNwID0gIklOVEVHRVIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTkVUQUREUjoKICAgICAgICAgICAgY3AgPSAiTmV0d29ya0FkZHJlc3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgICAgICBjcCA9ICJJcEFkZHJlc3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQ09VTlRFUjoKICAgICAgICAgICAgY3AgPSAiQ291bnRlcjMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0dBVUdFOgogICAgICAgICAgICBjcCA9ICJHYXVnZTMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICAgICAgY3AgPSAiVGltZVRpY2tzIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09QQVFVRToKICAgICAgICAgICAgY3AgPSAiT3BhcXVlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05VTEw6CiAgICAgICAgICAgIGNwID0gIk5VTEwiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQ09VTlRFUjY0OgogICAgICAgICAgICBjcCA9ICJDb3VudGVyNjQiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQklUU1RSSU5HOgogICAgICAgICAgICBjcCA9ICJCSVRTIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX05TQVBBRERSRVNTOgogICAgICAgICAgICBjcCA9ICJOc2FwQWRkcmVzcyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICAgICAgY3AgPSAiVUludGVnZXIzMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgICAgICBjcCA9ICJVbnNpZ25lZDMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICAgICAgY3AgPSAiSW50ZWdlcjMyIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgY3AgPSBOVUxMOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiNpZiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUKICAgICAgICBpZiAoIWNwICYmICh0cC0+cmFuZ2VzIHx8IHRwLT5lbnVtcykpIHsgLyogcmFuZ2VzIHdpdGhvdXQgdHlwZSA/ICovCiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiPzAgd2l0aCAlcyAlcyA/IiwKICAgICAgICAgICAgICAgICAgICB0cC0+cmFuZ2VzID8gIlJhbmdlIiA6ICIiLCB0cC0+ZW51bXMgPyAiRW51bSIgOiAiIik7CiAgICAgICAgICAgIGNwID0gc3RyOwogICAgICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBTWU5UQVhcdCIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5yYW5nZXMpIHsKICAgICAgICAgICAgc3RydWN0IHJhbmdlX2xpc3QgKnJwID0gdHAtPnJhbmdlczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMTsKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiICgiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB3aGlsZSAocnApIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgICAgICAgICAgICAgICAgICBpZiAocnAtPmxvdyA9PSBycC0+aGlnaCkKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyVkIiwgKGZpcnN0ID8gIiIgOiAiIHwgIiksIHJwLT5sb3cgKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMlZC4uJWQiLCAoZmlyc3QgPyAiIiA6ICIgfCAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycC0+bG93LCBycC0+aGlnaCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICAgICAgICAgICAgICBpZiAocnAtPmxvdyA9PSBycC0+aGlnaCkKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsICIlcyV1IiwgKGZpcnN0ID8gIiIgOiAiIHwgIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXJwLT5sb3cgKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyLCAiJXMldS4uJXUiLCAoZmlyc3QgPyAiIiA6ICIgfCAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcnAtPmxvdywgKHVuc2lnbmVkKXJwLT5oaWdoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgLyogTm8gb3RoZXIgcmFuZ2UgdHlwZXMgYWxsb3dlZCAqLwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCBzdHIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIHJwID0gcnAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiKSAiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodHAtPmVudW1zKSB7CiAgICAgICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwID0gdHAtPmVudW1zOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZmlyc3QgPSAxOwogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgeyIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIHBvcyA9IDE2ICsgc3RybGVuKGNwKSArIDI7CiAgICAgICAgICAgIHdoaWxlIChlcCkgewogICAgICAgICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIsICIpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlcyglZCkiLCBlcC0+bGFiZWwsIGVwLT52YWx1ZSk7CiAgICAgICAgICAgICAgICBzdHJbIHNpemVvZihzdHIpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc3RyKTsKICAgICAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gKyAyID4gd2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jLCAiXG5cdFx0ICAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgcG9zID0gMTg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHN0cikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMjsKICAgICAgICAgICAgICAgIGVwID0gZXAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAifSAiKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPmhpbnQpCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBESVNQTEFZLUhJTlRcdFwiIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+aGludCkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT51bml0cykKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFVOSVRTXHRcdFwiIikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCB0cC0+dW5pdHMpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlwiXG4iKSkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHN3aXRjaCAodHAtPmFjY2VzcykgewogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19SRUFET05MWToKICAgICAgICAgICAgY3AgPSAicmVhZC1vbmx5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1JFQURXUklURToKICAgICAgICAgICAgY3AgPSAicmVhZC13cml0ZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19XUklURU9OTFk6CiAgICAgICAgICAgIGNwID0gIndyaXRlLW9ubHkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfTk9BQ0NFU1M6CiAgICAgICAgICAgIGNwID0gIm5vdC1hY2Nlc3NpYmxlIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX05PVElGWToKICAgICAgICAgICAgY3AgPSAiYWNjZXNzaWJsZS1mb3Itbm90aWZ5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX0NSRUFURToKICAgICAgICAgICAgY3AgPSAicmVhZC1jcmVhdGUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGNwID0gTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc3ByaW50ZihzdHIsICJhY2Nlc3NfJWQiLCB0cC0+YWNjZXNzKTsKICAgICAgICAgICAgY3AgPSBzdHI7CiAgICAgICAgfQogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIE1BWC1BQ0NFU1NcdCIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgY3ApIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBzd2l0Y2ggKHRwLT5zdGF0dXMpIHsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfTUFOREFUT1JZOgogICAgICAgICAgICBjcCA9ICJtYW5kYXRvcnkiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9TVEFUVVNfT1BUSU9OQUw6CiAgICAgICAgICAgIGNwID0gIm9wdGlvbmFsIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX09CU09MRVRFOgogICAgICAgICAgICBjcCA9ICJvYnNvbGV0ZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX1NUQVRVU19ERVBSRUNBVEVEOgogICAgICAgICAgICBjcCA9ICJkZXByZWNhdGVkIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfU1RBVFVTX0NVUlJFTlQ6CiAgICAgICAgICAgIGNwID0gImN1cnJlbnQiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGNwID0gTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgc3ByaW50ZihzdHIsICJzdGF0dXNfJWQiLCB0cC0+c3RhdHVzKTsKICAgICAgICAgICAgY3AgPSBzdHI7CiAgICAgICAgfQojaWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKCFjcCAmJiAodHAtPmluZGV4ZXMpKSB7ICAgICAvKiBpbmRleCB3aXRob3V0IHN0YXR1cyA/ICovCiAgICAgICAgICAgIHNwcmludGYoc3RyLCAiPzAgd2l0aCAlcyA/IiwgdHAtPmluZGV4ZXMgPyAiSW5kZXgiIDogIiIpOwogICAgICAgICAgICBjcCA9IHN0cjsKICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFICovCiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgU1RBVFVTXHQiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIGNwKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5hdWdtZW50cykKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEFVR01FTlRTXHR7ICIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmF1Z21lbnRzKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgfVxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAodHAtPmluZGV4ZXMpIHsKICAgICAgICAgICAgc3RydWN0IGluZGV4X2xpc3QgKmlwID0gdHAtPmluZGV4ZXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBmaXJzdCA9IDE7CiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBJTkRFWFx0XHR7ICIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIHBvcyA9IDE2ICsgMjsKICAgICAgICAgICAgd2hpbGUgKGlwKSB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIiwgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiVzJXMiLAogICAgICAgICAgICAgICAgICAgICAgICBpcC0+aXNpbXBsaWVkID8gIklNUExJRUQgIiA6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICBpcC0+aWxhYmVsKTsKICAgICAgICAgICAgICAgIHN0clsgc2l6ZW9mKHN0ciktMSBdID0gMDsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHIpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgIlxuXHRcdCAgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDE2ICsgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW4gKyAyOwogICAgICAgICAgICAgICAgaXAgPSBpcC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgfVxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHRwLT52YXJiaW5kcykgewogICAgICAgICAgICBzdHJ1Y3QgdmFyYmluZF9saXN0ICp2cCA9IHRwLT52YXJiaW5kczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMTsKCiAgICAgICAgICAgIGlmICh0cC0+dHlwZSA9PSBUWVBFX1RSQVBUWVBFKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsCiAgICAgICAgICAgICAgICAgICAgIiAgVkFSSUFCTEVTXHR7ICIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICIgIE9CSkVDVFNcdHsgIikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcG9zID0gMTYgKyAyOwogICAgICAgICAgICB3aGlsZSAodnApIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiLCAiKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBzdHJsY3B5KHN0ciwgdnAtPnZibGFiZWwsIHNpemVvZihzdHIpKTsKICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzdHIpOwogICAgICAgICAgICAgICAgaWYgKHBvcyArIGxlbiArIDIgPiB3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHRcdCAgIikpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHBvcyA9IDE2ICsgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgc3RyKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHBvcyArPSBsZW4gKyAyOwogICAgICAgICAgICAgICAgdnAgPSB2cC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICIgfVxuIikpCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHRwLT5kZXNjcmlwdGlvbikKICAgICAgICAgICAgaWYgKCFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBERVNDUklQVElPTlx0XCIiKSB8fAogICAgICAgICAgICAgICAgIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsIHRwLT5kZXNjcmlwdGlvbikgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiXCJcbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKHRwLT5kZWZhdWx0VmFsdWUpCiAgICAgICAgICAgIGlmICghc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgREVGVkFMXHR7ICIpIHx8CiAgICAgICAgICAgICAgICAhc25tcF9jc3RyY2F0KGJ1ZiwgYnVmX2xlbiwgb3V0X2xlbiwgYWxsb3dfcmVhbGxvYywgdHAtPmRlZmF1bHRWYWx1ZSkgfHwKICAgICAgICAgICAgICAgICFzbm1wX2NzdHJjYXQoYnVmLCBidWZfbGVuLCBvdXRfbGVuLCBhbGxvd19yZWFsbG9jLCAiIH1cbiIpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UKICAgICAgICBpZiAoIXNubXBfY3N0cmNhdChidWYsIGJ1Zl9sZW4sIG91dF9sZW4sIGFsbG93X3JlYWxsb2MsICJObyBkZXNjcmlwdGlvblxuIikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgcmV0dXJuIDE7Cn0KCmludApnZXRfbW9kdWxlX25vZGUoY29uc3QgY2hhciAqZm5hbWUsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2R1bGUsIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbikKewogICAgaW50ICAgICAgICAgICAgIG1vZGlkLCByYyA9IDA7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICBjaGFyICAgICAgICAgICAqbmFtZSwgKmNwOwoKICAgIGlmICghc3RyY21wKG1vZHVsZSwgIkFOWSIpKQogICAgICAgIG1vZGlkID0gLTE7CiAgICBlbHNlIHsKICAgICAgICBuZXRzbm1wX3JlYWRfbW9kdWxlKG1vZHVsZSk7CiAgICAgICAgbW9kaWQgPSB3aGljaF9tb2R1bGUobW9kdWxlKTsKICAgICAgICBpZiAobW9kaWQgPT0gLTEpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qCiAgICAgKiBJc29sYXRlIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIG5hbWUgLi4uIAogICAgICovCiAgICBuYW1lID0gc3RyZHVwKGZuYW1lKTsKICAgIGNwID0gc3RyY2hyKG5hbWUsICcuJyk7CiAgICBpZiAoY3AgIT0gTlVMTCkgewogICAgICAgICpjcCA9ICdcMCc7CiAgICAgICAgY3ArKzsKICAgIH0KICAgIC8qCiAgICAgKiAuLi4gYW5kIGxvY2F0ZSBpdCBpbiB0aGUgdHJlZS4gCiAgICAgKi8KICAgIHRwID0gZmluZF90cmVlX25vZGUobmFtZSwgbW9kaWQpOwogICAgaWYgKHRwKSB7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIG1heGxlbiA9ICpvYmppZGxlbjsKCiAgICAgICAgLyoKICAgICAgICAgKiBTZXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIG9iamVjdCBJRCAKICAgICAgICAgKi8KICAgICAgICBpZiAobm9kZV90b19vaWQodHAsIG9iamlkLCBvYmppZGxlbikpIHsKICAgICAgICAgICAgcmMgPSAxOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgdGhlIG5hbWUgcmVxdWVzdGVkIHdhcyBtb3JlIHRoYW4gb25lIGVsZW1lbnQsCiAgICAgICAgICAgICAqIHRhZyBvbiB0aGUgcmVzdCBvZiB0aGUgY29tcG9uZW50cyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChjcCAhPSBOVUxMKQogICAgICAgICAgICAgICAgcmMgPSBfYWRkX3N0cmluZ3NfdG9fb2lkKHRwLCBjcCwgb2JqaWQsIG9iamlkbGVuLCBtYXhsZW4pOwogICAgICAgIH0KICAgIH0KCiAgICBTTk1QX0ZSRUUobmFtZSk7CiAgICByZXR1cm4gKHJjKTsKfQoKCi8qKgogKiBAaW50ZXJuYWwKICoKICogUG9wdWxhdGVzIHRoZSBvYmplY3QgaWRlbnRpZmllciBmcm9tIGEgbm9kZSBpbiB0aGUgTUlCIGhpZXJhcmNoeS4KICogQnVpbGRzIHVwIHRoZSBvYmplY3QgSUQsIHdvcmtpbmcgYmFja3dhcmRzLAogKiBzdGFydGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIG9iamlkIGJ1ZmZlci4KICogV2hlbiB0aGUgdG9wIG9mIHRoZSBNSUIgdHJlZSBpcyByZWFjaGVkLCB0aGUgYnVmZmVyIGlzIGFkanVzdGVkLgogKgogKiBUaGUgYnVmZmVyIGxlbmd0aCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBzdWJpZGVudGlmaWVycwogKiBmb3IgdGhlIG9iamVjdCBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTUlCIG5vZGUuCiAqIAogKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygc3ViaWRlbnRpZmllcnMgY29waWVkLgogKgogKiBJZiAwIGlzIHJldHVybmVkLCB0aGUgb2JqaWQgYnVmZmVyIGlzIHRvbyBzbWFsbCwKICogYW5kIHRoZSBidWZmZXIgY29udGVudHMgYXJlIGluZGV0ZXJtaW5hdGUuCiAqIFRoZSBidWZmZXIgbGVuZ3RoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGxhcmdlciBidWZmZXIuCiAqLwpzdGF0aWMgaW50Cm5vZGVfdG9fb2lkKHN0cnVjdCB0cmVlICp0cCwgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgbnVtaWRzLCBsZW5pZHM7CiAgICBvaWQgICAgICAgICAgICAqb3A7CgogICAgaWYgKCF0cCB8fCAhb2JqaWQgfHwgIW9iamlkbGVuKQogICAgICAgIHJldHVybiAwOwoKICAgIGxlbmlkcyA9IChpbnQpICpvYmppZGxlbjsKICAgIG9wID0gb2JqaWQgKyBsZW5pZHM7ICAgICAgICAvKiBwb2ludHMgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudCAqLwoKICAgIGZvciAobnVtaWRzID0gMDsgdHA7IHRwID0gdHAtPnBhcmVudCwgbnVtaWRzKyspIHsKICAgICAgICBpZiAobnVtaWRzID49IGxlbmlkcykKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgLS1vcDsKICAgICAgICAqb3AgPSB0cC0+c3ViaWQ7CiAgICB9CgogICAgKm9iamlkbGVuID0gKHNpemVfdCkgbnVtaWRzOwogICAgaWYgKG51bWlkcyA+IGxlbmlkcykgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChudW1pZHMgPCBsZW5pZHMpCiAgICAgICAgbWVtbW92ZShvYmppZCwgb3AsIG51bWlkcyAqIHNpemVvZihvaWQpKTsKCiAgICByZXR1cm4gKG51bWlkcyk7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKLyoKICogUmVwbGFjZSBceCB3aXRoIHggc3RvcCBhdCBlb3NfbWFya2VyCiAqIHJldHVybiBOVUxMIGlmIGVvc19tYXJrZXIgbm90IGZvdW5kCiAqLwpzdGF0aWMgY2hhciAqX2FwcGx5X2VzY2FwZXMoY2hhciAqc3JjLCBjaGFyIGVvc19tYXJrZXIpCnsKICAgIGNoYXIgKmRzdDsKICAgIGludCBiYWNrc2xhc2ggPSAwOwogICAgCiAgICBkc3QgPSBzcmM7CiAgICB3aGlsZSAoKnNyYykgewoJaWYgKGJhY2tzbGFzaCkgewoJICAgIGJhY2tzbGFzaCA9IDA7CgkgICAgKmRzdCsrID0gKnNyYzsKCX0gZWxzZSB7CgkgICAgaWYgKGVvc19tYXJrZXIgPT0gKnNyYykgYnJlYWs7CgkgICAgaWYgKCdcXCcgPT0gKnNyYykgewoJCWJhY2tzbGFzaCA9IDE7CgkgICAgfSBlbHNlIHsKCQkqZHN0KysgPSAqc3JjOwoJICAgIH0KCX0KCXNyYysrOwogICAgfQogICAgaWYgKCEqc3JjKSB7CgkvKiBuZXZlciBmb3VuZCBlb3NfbWFya2VyICovCglyZXR1cm4gTlVMTDsKICAgIH0gZWxzZSB7CgkqZHN0ID0gMDsKCXJldHVybiBzcmM7CiAgICB9Cn0KCnN0YXRpYyBpbnQKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKX2FkZF9zdHJpbmdzX3RvX29pZChzdHJ1Y3QgdHJlZSAqdHAsIGNoYXIgKmNwLAogICAgICAgICAgICAgICAgICAgIG9pZCAqIG9iamlkLCBzaXplX3QgKiBvYmppZGxlbiwgc2l6ZV90IG1heGxlbikKI2Vsc2UKX2FkZF9zdHJpbmdzX3RvX29pZCh2b2lkICp0cCwgY2hhciAqY3AsCiAgICAgICAgICAgICAgICAgICAgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuLCBzaXplX3QgbWF4bGVuKQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCnsKICAgIG9pZCAgICAgICAgICAgICBzdWJpZDsKICAgIGludCAgICAgICAgICAgICBsZW5faW5kZXggPSAxMDAwMDAwOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgc3RydWN0IHRyZWUgICAgKnRwMiA9IE5VTEw7CiAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5fZGljZXMgPSBOVUxMOwojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCiAgICBjaGFyICAgICAgICAgICAqZmNwLCAqZWNwLCAqY3AyID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICBkb2luZ3F1b3RlOwogICAgaW50ICAgICAgICAgICAgIGxlbiA9IC0xLCBwb3MgPSAtMTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGludCAgICAgICAgICAgICBjaGVjayA9CiAgICAgICAgIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9ET05UX0NIRUNLX1JBTkdFKTsKICAgIGludCAgICAgICAgICAgICBkb19oaW50ID0gIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9OT19ESVNQTEFZX0hJTlQpOwoKICAgIHdoaWxlIChjcCAmJiB0cCAmJiB0cC0+Y2hpbGRfbGlzdCkgewogICAgICAgIGZjcCA9IGNwOwogICAgICAgIHRwMiA9IHRwLT5jaGlsZF9saXN0OwogICAgICAgIC8qCiAgICAgICAgICogSXNvbGF0ZSB0aGUgbmV4dCBlbnRyeSAKICAgICAgICAgKi8KICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgKmNwMisrID0gJ1wwJzsKCiAgICAgICAgLyoKICAgICAgICAgKiBTZWFyY2ggZm9yIHRoZSBhcHByb3ByaWF0ZSBjaGlsZCAKICAgICAgICAgKi8KICAgICAgICBpZiAoaXNkaWdpdCgqY3ApKSB7CiAgICAgICAgICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIHdoaWxlICh0cDIgJiYgdHAyLT5zdWJpZCAhPSBzdWJpZCkKICAgICAgICAgICAgICAgIHRwMiA9IHRwMi0+bmV4dF9wZWVyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdoaWxlICh0cDIgJiYgc3RyY21wKHRwMi0+bGFiZWwsIGZjcCkpCiAgICAgICAgICAgICAgICB0cDIgPSB0cDItPm5leHRfcGVlcjsKICAgICAgICAgICAgaWYgKCF0cDIpCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgc3ViaWQgPSB0cDItPnN1YmlkOwogICAgICAgIH0KICAgICAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikKICAgICAgICAgICAgZ290byBiYWRfaWQ7Cgl3aGlsZSAodHAyICYmIHRwMi0+bmV4dF9wZWVyICYmIHRwMi0+bmV4dF9wZWVyLT5zdWJpZCA9PSBzdWJpZCkKCSAgICB0cDIgPSB0cDItPm5leHRfcGVlcjsKICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3ViaWQ7CiAgICAgICAgKCpvYmppZGxlbikrKzsKCiAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgaWYgKCF0cDIpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHRwID0gdHAyOwogICAgfQoKICAgIGlmICh0cCAmJiAhdHAtPmNoaWxkX2xpc3QpIHsKICAgICAgICBpZiAoKHRwMiA9IHRwLT5wYXJlbnQpKSB7CiAgICAgICAgICAgIGlmICh0cDItPmluZGV4ZXMpCiAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHRwMi0+aW5kZXhlczsKICAgICAgICAgICAgZWxzZSBpZiAodHAyLT5hdWdtZW50cykgewogICAgICAgICAgICAgICAgdHAyID0gZmluZF90cmVlX25vZGUodHAyLT5hdWdtZW50cywgLTEpOwogICAgICAgICAgICAgICAgaWYgKHRwMikKICAgICAgICAgICAgICAgICAgICBpbl9kaWNlcyA9IHRwMi0+aW5kZXhlczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0cCA9IE5VTEw7CiAgICB9CgogICAgd2hpbGUgKGNwICYmIGluX2RpY2VzKSB7CiAgICAgICAgZmNwID0gY3A7CgogICAgICAgIHRwID0gZmluZF90cmVlX25vZGUoaW5fZGljZXMtPmlsYWJlbCwgLTEpOwogICAgICAgIGlmICghdHApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHN3aXRjaCAodHAtPnR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgICAgICBjYXNlIFRZUEVfSU5URUdFUjMyOgogICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICBjYXNlIFRZUEVfVElNRVRJQ0tTOgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJc29sYXRlIHRoZSBuZXh0IGVudHJ5IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgKmNwMisrID0gJ1wwJzsKICAgICAgICAgICAgaWYgKGlzZGlnaXQoKmNwKSkgewogICAgICAgICAgICAgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHRwLT5lbnVtcykgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKmVwID0gdHAtPmVudW1zOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChlcCAmJiBzdHJjbXAoZXAtPmxhYmVsLCBjcCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGVwID0gZXAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcCkKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgc3ViaWQgPSBlcC0+dmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hlY2sgJiYgdHAtPnJhbmdlcykgewogICAgICAgICAgICAgICAgc3RydWN0IHJhbmdlX2xpc3QgKnJwID0gdHAtPnJhbmdlczsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBvayA9IDA7CiAgICAgICAgICAgICAgICBpZiAodHAtPnR5cGUgPT0gVFlQRV9JTlRFR0VSIHx8CiAgICAgICAgICAgICAgICAgICAgdHAtPnR5cGUgPT0gVFlQRV9JTlRFR0VSMzIpIHsKICAgICAgICAgICAgICAgICAgd2hpbGUgKCFvayAmJiBycCkgewogICAgICAgICAgICAgICAgICAgIGlmICgocnAtPmxvdyA8PSAoaW50KSBzdWJpZCkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChpbnQpIHN1YmlkIDw9IHJwLT5oaWdoKSkKICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSAxOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcnAgPSBycC0+bmV4dDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogY2hlY2sgdW5zaWduZWQgcmFuZ2UgKi8KICAgICAgICAgICAgICAgICAgd2hpbGUgKCFvayAmJiBycCkgewogICAgICAgICAgICAgICAgICAgIGlmICgoKHVuc2lnbmVkIGludClycC0+bG93IDw9IHN1YmlkKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3ViaWQgPD0gKHVuc2lnbmVkIGludClycC0+aGlnaCkpCiAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gMTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJwID0gcnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghb2spCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwogICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfSVBBRERSOgogICAgICAgICAgICBpZiAoKm9iamlkbGVuICsgNCA+IG1heGxlbikKICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICBmb3IgKHN1YmlkID0gMDsgY3AgJiYgc3ViaWQgPCA0OyBzdWJpZCsrKSB7CiAgICAgICAgICAgICAgICBmY3AgPSBjcDsKICAgICAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgICAgIGlmIChjcDIpCiAgICAgICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgaWYgKGNoZWNrICYmIG9iamlkWypvYmppZGxlbl0gPiAyNTUpCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICBpZiAodHAtPnJhbmdlcyAmJiAhdHAtPnJhbmdlcy0+bmV4dAogICAgICAgICAgICAgICAgJiYgdHAtPnJhbmdlcy0+bG93ID09IHRwLT5yYW5nZXMtPmhpZ2gpCiAgICAgICAgICAgICAgICBsZW4gPSB0cC0+cmFuZ2VzLT5sb3c7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGxlbiA9IC0xOwogICAgICAgICAgICBwb3MgPSAwOwogICAgICAgICAgICBpZiAoKmNwID09ICciJyB8fCAqY3AgPT0gJ1wnJykgewogICAgICAgICAgICAgICAgZG9pbmdxdW90ZSA9ICpjcCsrOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGluc2VydCBsZW5ndGggaWYgcmVxdWVzdGVkIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoIWluX2RpY2VzLT5pc2ltcGxpZWQgJiYgbGVuID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvaW5ncXVvdGUgPT0gJ1wnJykgewogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX3NldF9kZXRhaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiJy1xdW90ZSBpcyBmb3IgZml4ZWQgbGVuZ3RoIHN0cmluZ3MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBsZW5faW5kZXggPSAqb2JqaWRsZW47CiAgICAgICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9pbmdxdW90ZSA9PSAnIicpIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX3NldF9kZXRhaWwKICAgICAgICAgICAgICAgICAgICAgICAgKCJcIi1xdW90ZSBpcyBmb3IgdmFyaWFibGUgbGVuZ3RoIHN0cmluZ3MiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KCgkJY3AyID0gX2FwcGx5X2VzY2FwZXMoY3AsIGRvaW5ncXVvdGUpOwoJCWlmICghY3AyKSBnb3RvIGJhZF9pZDsKCQllbHNlIHsKCQkgICAgdW5zaWduZWQgY2hhciAqbmV3X3ZhbDsKCQkgICAgaW50IG5ld192YWxfbGVuOwoJCSAgICBpbnQgcGFyc2VkX2hpbnQgPSAwOwoJCSAgICBjb25zdCBjaGFyICpwYXJzZWRfdmFsdWU7CgoJCSAgICBpZiAoZG9faGludCAmJiB0cC0+aGludCkgewoJCQlwYXJzZWRfdmFsdWUgPSBwYXJzZV9vY3RldF9oaW50KHRwLT5oaW50LCBjcCwKCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X3ZhbCwgJm5ld192YWxfbGVuKTsKCQkJcGFyc2VkX2hpbnQgPSBwYXJzZWRfdmFsdWUgPT0gTlVMTDsKCQkgICAgfQoJCSAgICBpZiAocGFyc2VkX2hpbnQpIHsKCQkJaW50IGk7CgkJCWZvciAoaSA9IDA7IGkgPCBuZXdfdmFsX2xlbjsgaSsrKSB7CgkJCSAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikgZ290byBiYWRfaWQ7CgkJCSAgICBvYmppZFsgKm9iamlkbGVuIF0gPSBuZXdfdmFsW2ldOwoJCQkgICAgKCpvYmppZGxlbikrKzsKCQkJICAgIHBvcysrOwoJCQl9CgkJCVNOTVBfRlJFRShuZXdfdmFsKTsKCQkgICAgfSBlbHNlIHsKCQkJd2hpbGUoKmNwKSB7CgkJCSAgICBpZiAoKm9iamlkbGVuID49IG1heGxlbikgZ290byBiYWRfaWQ7CgkJCSAgICBvYmppZFsgKm9iamlkbGVuIF0gPSAqY3ArKzsKCQkJICAgICgqb2JqaWRsZW4pKys7CgkJCSAgICBwb3MrKzsKCQkJfQoJCSAgICB9CgkJfQoJCQoJCWNwMisrOwogICAgICAgICAgICAgICAgaWYgKCEqY3AyKQogICAgICAgICAgICAgICAgICAgIGNwMiA9IE5VTEw7CiAgICAgICAgICAgICAgICBlbHNlIGlmICgqY3AyICE9ICcuJykKICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBjcDIrKzsKCQlpZiAoY2hlY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBvayA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChycCAmJiAhb2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnAtPmxvdyA8PSBwb3MgJiYgcG9zIDw9IHJwLT5oaWdoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9rKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5fZGljZXMtPmlzaW1wbGllZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamlkW2xlbl9pbmRleF0gPSBwb3M7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MgIT0gbGVuKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKCQl9CgkJZWxzZSBpZiAobGVuID09IC0xICYmICFpbl9kaWNlcy0+aXNpbXBsaWVkKQoJCSAgICBvYmppZFtsZW5faW5kZXhdID0gcG9zOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFpbl9kaWNlcy0+aXNpbXBsaWVkICYmIGxlbiA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGZjcCA9IGNwOwogICAgICAgICAgICAgICAgICAgIGNwMiA9IHN0cmNocihjcCwgJy4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgICAgICAgICAqY3AyKysgPSAwOwogICAgICAgICAgICAgICAgICAgIGxlbiA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwogICAgICAgICAgICAgICAgICAgIGlmICgqZWNwKQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICBpZiAoKm9iamlkbGVuICsgbGVuICsgMSA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIG9iamlkWypvYmppZGxlbl0gPSBsZW47CiAgICAgICAgICAgICAgICAgICAgKCpvYmppZGxlbikrKzsKICAgICAgICAgICAgICAgICAgICBjcCA9IGNwMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gJiYgY3ApIHsKICAgICAgICAgICAgICAgICAgICBmY3AgPSBjcDsKICAgICAgICAgICAgICAgICAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNwMikKICAgICAgICAgICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gc3RydG91bChjcCwgJmVjcCwgMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgICAgIGlmIChjaGVjayAmJiBvYmppZFsqb2JqaWRsZW5dID4gMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICAgICAgICAgIGxlbi0tOwogICAgICAgICAgICAgICAgICAgIGNwID0gY3AyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9PQkpJRDoKICAgICAgICAgICAgaW5fZGljZXMgPSBOVUxMOwogICAgICAgICAgICBjcDIgPSBjcDsKICAgICAgICAgICAgYnJlYWs7CgljYXNlIFRZUEVfTkVUQUREUjoKCSAgICBmY3AgPSBjcDsKCSAgICBjcDIgPSBzdHJjaHIoY3AsICcuJyk7CgkgICAgaWYgKGNwMikKCQkqY3AyKysgPSAwOwoJICAgIHN1YmlkID0gc3RydG91bChjcCwgJmVjcCwgMCk7CgkgICAgaWYgKCplY3ApCgkJZ290byBiYWRfaWQ7CgkgICAgaWYgKCpvYmppZGxlbiArIDEgPj0gbWF4bGVuKQoJCWdvdG8gYmFkX2lkOwoJICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKCSAgICAoKm9iamlkbGVuKSsrOwoJICAgIGNwID0gY3AyOwoJICAgIGlmIChzdWJpZCA9PSAxKSB7CgkJZm9yIChsZW4gPSAwOyBjcCAmJiBsZW4gPCA0OyBsZW4rKykgewoJCSAgICBmY3AgPSBjcDsKCQkgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwoJCSAgICBpZiAoY3AyKQoJCQkqY3AyKysgPSAwOwoJCSAgICBzdWJpZCA9IHN0cnRvdWwoY3AsICZlY3AsIDApOwoJCSAgICBpZiAoKmVjcCkKCQkJZ290byBiYWRfaWQ7CgkJICAgIGlmICgqb2JqaWRsZW4gKyAxID49IG1heGxlbikKCQkJZ290byBiYWRfaWQ7CgkJICAgIGlmIChjaGVjayAmJiBzdWJpZCA+IDI1NSkKCQkJZ290byBiYWRfaWQ7CgkJICAgIG9iamlkWypvYmppZGxlbl0gPSBzdWJpZDsKCQkgICAgKCpvYmppZGxlbikrKzsKCQkgICAgY3AgPSBjcDI7CgkJfQoJICAgIH0KCSAgICBlbHNlIHsKCQlpbl9kaWNlcyA9IE5VTEw7CgkgICAgfQoJICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJVbmV4cGVjdGVkIGluZGV4IHR5cGU6ICVkICVzICVzXG4iLAogICAgICAgICAgICAgICAgICAgICB0cC0+dHlwZSwgaW5fZGljZXMtPmlsYWJlbCwgY3ApOwogICAgICAgICAgICBpbl9kaWNlcyA9IE5VTEw7CiAgICAgICAgICAgIGNwMiA9IGNwOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY3AgPSBjcDI7CiAgICAgICAgaWYgKGluX2RpY2VzKQogICAgICAgICAgICBpbl9kaWNlcyA9IGluX2RpY2VzLT5uZXh0OwogICAgfQoKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgd2hpbGUgKGNwKSB7CiAgICAgICAgZmNwID0gY3A7CiAgICAgICAgc3dpdGNoICgqY3ApIHsKICAgICAgICBjYXNlICcwJzoKICAgICAgICBjYXNlICcxJzoKICAgICAgICBjYXNlICcyJzoKICAgICAgICBjYXNlICczJzoKICAgICAgICBjYXNlICc0JzoKICAgICAgICBjYXNlICc1JzoKICAgICAgICBjYXNlICc2JzoKICAgICAgICBjYXNlICc3JzoKICAgICAgICBjYXNlICc4JzoKICAgICAgICBjYXNlICc5JzoKICAgICAgICAgICAgY3AyID0gc3RyY2hyKGNwLCAnLicpOwogICAgICAgICAgICBpZiAoY3AyKQogICAgICAgICAgICAgICAgKmNwMisrID0gMDsKICAgICAgICAgICAgc3ViaWQgPSBzdHJ0b3VsKGNwLCAmZWNwLCAwKTsKICAgICAgICAgICAgaWYgKCplY3ApCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IHN1YmlkOwogICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICciJzoKICAgICAgICBjYXNlICdcJyc6CiAgICAgICAgICAgIGRvaW5ncXVvdGUgPSAqY3ArKzsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaW5zZXJ0IGxlbmd0aCBpZiByZXF1ZXN0ZWQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoZG9pbmdxdW90ZSA9PSAnIicpIHsKICAgICAgICAgICAgICAgIGlmICgqb2JqaWRsZW4gPj0gbWF4bGVuKQogICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgICAgICAgICAgb2JqaWRbKm9iamlkbGVuXSA9IGxlbiA9IHN0cmNocihjcCwgZG9pbmdxdW90ZSkgLSBjcDsKICAgICAgICAgICAgICAgICgqb2JqaWRsZW4pKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghY3ApCiAgICAgICAgICAgICAgICBnb3RvIGJhZF9pZDsKICAgICAgICAgICAgd2hpbGUgKCpjcCAmJiAqY3AgIT0gZG9pbmdxdW90ZSkgewogICAgICAgICAgICAgICAgaWYgKCpvYmppZGxlbiA+PSBtYXhsZW4pCiAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgICAgICBvYmppZFsqb2JqaWRsZW5dID0gKmNwKys7CiAgICAgICAgICAgICAgICAoKm9iamlkbGVuKSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNwMiA9IGNwICsgMTsKICAgICAgICAgICAgaWYgKCEqY3AyKQogICAgICAgICAgICAgICAgY3AyID0gTlVMTDsKICAgICAgICAgICAgZWxzZSBpZiAoKmNwMiA9PSAnLicpCiAgICAgICAgICAgICAgICBjcDIrKzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ290byBiYWRfaWQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGdvdG8gYmFkX2lkOwogICAgICAgIH0KICAgICAgICBjcCA9IGNwMjsKICAgIH0KICAgIHJldHVybiAxOwoKICBiYWRfaWQ6CiAgICB7CiAgICAgICAgY2hhciAgICAgICAgICAgIGJ1ZlsyNTZdOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgICAgIGlmIChpbl9kaWNlcykKICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkluZGV4IG91dCBvZiByYW5nZTogJXMgKCVzKSIsCiAgICAgICAgICAgICAgICAgICAgZmNwLCBpbl9kaWNlcy0+aWxhYmVsKTsKICAgICAgICBlbHNlIGlmICh0cCkKICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlN1Yi1pZCBub3QgZm91bmQ6ICVzIC0+ICVzIiwgdHAtPmxhYmVsLCBmY3ApOwogICAgICAgIGVsc2UKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMiLCBmY3ApOwogICAgICAgIGJ1Zlsgc2l6ZW9mKGJ1ZiktMSBdID0gMDsKCiAgICAgICAgc25tcF9zZXRfZGV0YWlsKGJ1Zik7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HCi8qKgogKiBAc2VlIGNvbW1lbnRzIG9uIGZpbmRfYmVzdF90cmVlX25vZGUgZm9yIHVzYWdlIGFmdGVyIGZpcnN0IHRpbWUuCiAqLwppbnQKZ2V0X3dpbGRfbm9kZShjb25zdCBjaGFyICpuYW1lLCBvaWQgKiBvYmppZCwgc2l6ZV90ICogb2JqaWRsZW4pCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCA9IGZpbmRfYmVzdF90cmVlX25vZGUobmFtZSwgdHJlZV9oZWFkLCBOVUxMKTsKICAgIGlmICghdHApCiAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gZ2V0X25vZGUodHAtPmxhYmVsLCBvYmppZCwgb2JqaWRsZW4pOwp9CgppbnQKZ2V0X25vZGUoY29uc3QgY2hhciAqbmFtZSwgb2lkICogb2JqaWQsIHNpemVfdCAqIG9iamlkbGVuKQp7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CiAgICBjaGFyICAgICAgICAgICAgY2g7CiAgICBpbnQgICAgICAgICAgICAgcmVzOwoKICAgIGNwID0gbmFtZTsKICAgIHdoaWxlICgoY2ggPSAqY3ApKQogICAgICAgIGlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykKICAgICAgICAgICAgfHwgKCdhJyA8PSBjaCAmJiBjaCA8PSAneicpCiAgICAgICAgICAgIHx8ICgnQScgPD0gY2ggJiYgY2ggPD0gJ1onKQogICAgICAgICAgICB8fCBjaCA9PSAnLScpCiAgICAgICAgICAgIGNwKys7CiAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgIGlmIChjaCAhPSAnOicpCiAgICAgICAgaWYgKCpuYW1lID09ICcuJykKICAgICAgICAgICAgcmVzID0gZ2V0X21vZHVsZV9ub2RlKG5hbWUgKyAxLCAiQU5ZIiwgb2JqaWQsIG9iamlkbGVuKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlcyA9IGdldF9tb2R1bGVfbm9kZShuYW1lLCAiQU5ZIiwgb2JqaWQsIG9iamlkbGVuKTsKICAgIGVsc2UgewogICAgICAgIGNoYXIgICAgICAgICAgICptb2R1bGU7CiAgICAgICAgLyoKICAgICAgICAgKiAgcmVxdWVzdGVkIG5hbWUgaXMgb2YgdGhlIGZvcm0KICAgICAgICAgKiAgICAgICJtb2R1bGU6c3ViaWRlbnRpZmllciIKICAgICAgICAgKi8KICAgICAgICBtb2R1bGUgPSAoY2hhciAqKSBtYWxsb2MoKHNpemVfdCkgKGNwIC0gbmFtZSArIDEpKTsKICAgICAgICBpZiAoIW1vZHVsZSkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIHNwcmludGYobW9kdWxlLCAiJS4qcyIsIChpbnQpIChjcCAtIG5hbWUpLCBuYW1lKTsKICAgICAgICBjcCsrOyAgICAgICAgICAgICAgICAgICAvKiBjcCBub3cgcG9pbnQgdG8gdGhlIHN1YmlkZW50aWZpZXIgKi8KICAgICAgICBpZiAoKmNwID09ICc6JykKICAgICAgICAgICAgY3ArKzsKCiAgICAgICAgLyoKICAgICAgICAgKiAnY3AnIGFuZCAnbmFtZScgKmRvKiBnbyB0aGF0IHdheSByb3VuZCEgCiAgICAgICAgICovCiAgICAgICAgcmVzID0gZ2V0X21vZHVsZV9ub2RlKGNwLCBtb2R1bGUsIG9iamlkLCBvYmppZGxlbik7CiAgICAgICAgU05NUF9GUkVFKG1vZHVsZSk7CiAgICB9CiAgICBpZiAocmVzID09IDApIHsKICAgICAgICBTRVRfU05NUF9FUlJPUihTTk1QRVJSX1VOS05PV05fT0JKSUQpOwogICAgfQoKICAgIHJldHVybiByZXM7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwoKI2lmZGVmIHRlc3RpbmcKCm1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgb2lkICAgICAgICAgICAgIG9iamlkW01BWF9PSURfTEVOXTsKICAgIGludCAgICAgICAgICAgICBvYmppZGxlbiA9IE1BWF9PSURfTEVOOwogICAgaW50ICAgICAgICAgICAgIGNvdW50OwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0IHZhcmlhYmxlOwoKICAgIG5ldHNubXBfaW5pdF9taWIoKTsKICAgIGlmIChhcmdjIDwgMikKICAgICAgICBwcmludF9zdWJ0cmVlKHN0ZG91dCwgdHJlZV9oZWFkLCAwKTsKICAgIHZhcmlhYmxlLnR5cGUgPSBBU05fSU5URUdFUjsKICAgIHZhcmlhYmxlLnZhbC5pbnRlZ2VyID0gMzsKICAgIHZhcmlhYmxlLnZhbF9sZW4gPSA0OwogICAgZm9yIChhcmdjLS07IGFyZ2M7IGFyZ2MtLSwgYXJndisrKSB7CiAgICAgICAgb2JqaWRsZW4gPSBNQVhfT0lEX0xFTjsKICAgICAgICBwcmludGYoInJlYWRfb2JqaWQoJXMpID0gJWRcbiIsCiAgICAgICAgICAgICAgIGFyZ3ZbMV0sIHJlYWRfb2JqaWQoYXJndlsxXSwgb2JqaWQsICZvYmppZGxlbikpOwogICAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG9iamlkbGVuOyBjb3VudCsrKQogICAgICAgICAgICBwcmludGYoIiVkLiIsIG9iamlkW2NvdW50XSk7CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIHByaW50X3ZhcmlhYmxlKG9iamlkLCBvYmppZGxlbiwgJnZhcmlhYmxlKTsKICAgIH0KfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0aW5nICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKgogKiBpbml0aWFsaXplOiBubyBwZWVycyBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LiAKICovCnZvaWQKY2xlYXJfdHJlZV9mbGFncyhyZWdpc3RlciBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGZvciAoOyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgdHAtPnJlcG9ydGVkID0gMDsKICAgICAgICBpZiAodHAtPmNoaWxkX2xpc3QpCiAgICAgICAgICAgIGNsZWFyX3RyZWVfZmxhZ3ModHAtPmNoaWxkX2xpc3QpOwogICAgIC8qUkVDVVJTRSovfQp9CgovKgogKiBVcGRhdGU6IDE5OTgtMDctMTcgPGpoeUBnc3UuZWR1PgogKiBBZGRlZCBwcmludF9vaWRfcmVwb3J0KiBmdW5jdGlvbnMuCiAqLwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X2xhYmVsZWRvaWQgPSAwOwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X29pZCA9IDA7CnN0YXRpYyBpbnQgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3ltYm9saWMgPSAwOwpzdGF0aWMgaW50ICAgICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X21pYmNoaWxkb2lkID0gMDsKc3RhdGljIGludCAgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zdWZmaXggPSAwOwoKLyoKICogVGhlc2UgbWV0aG9kcyByZWN1cnNlLiAKICovCnN0YXRpYyB2b2lkICAgICBwcmludF9wYXJlbnRfbGFiZWxlZG9pZChGSUxFICosIHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfcGFyZW50X29pZChGSUxFICosIHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgcHJpbnRfcGFyZW50X21pYmNoaWxkb2lkKEZJTEUgKiwgc3RydWN0IHRyZWUgKik7CnN0YXRpYyB2b2lkICAgICBwcmludF9wYXJlbnRfbGFiZWwoRklMRSAqLCBzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydChGSUxFICosIHN0cnVjdCB0cmVlICosIGludCk7CgoKdm9pZApwcmludF9vaWRfcmVwb3J0KEZJTEUgKiBmcCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgY2xlYXJfdHJlZV9mbGFncyh0cmVlX2hlYWQpOwogICAgZm9yICh0cCA9IHRyZWVfaGVhZDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikKICAgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoZnAsIHRwLCAwKTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9sYWJlbGVkb2lkKHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9sYWJlbGVkb2lkID0gMTsKfQoKdm9pZApwcmludF9vaWRfcmVwb3J0X2VuYWJsZV9vaWQodm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X29pZCA9IDE7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfc3VmZml4KHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zdWZmaXggPSAxOwp9Cgp2b2lkCnByaW50X29pZF9yZXBvcnRfZW5hYmxlX3N5bWJvbGljKHZvaWQpCnsKICAgIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydF9zeW1ib2xpYyA9IDE7Cn0KCnZvaWQKcHJpbnRfb2lkX3JlcG9ydF9lbmFibGVfbWliY2hpbGRvaWQodm9pZCkKewogICAgcHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X21pYmNoaWxkb2lkID0gMTsKfQoKLyoKICogaGVscGVyIG1ldGhvZHMgZm9yIHByaW50X3N1YnRyZWVfb2lkX3JlcG9ydCgpCiAqIGVhY2ggb25lIHRyYXZlcnNlcyBiYWNrIHVwIHRoZSBub2RlIHRyZWUKICogdW50aWwgdGhlcmUgaXMgbm8gcGFyZW50LiAgVGhlbiwgdGhlIGxhYmVsIGNvbWJpbmF0aW9uCiAqIGlzIG91dHB1dCwgc3VjaCB0aGF0IHRoZSBwYXJlbnQgaXMgZGlzcGxheWVkIGZpcnN0LgogKgogKiBXYXJuaW5nOiB0aGVzZSBtZXRob2RzIGFyZSBhbGwgcmVjdXJzaXZlLgogKi8KCnN0YXRpYyB2b2lkCnByaW50X3BhcmVudF9sYWJlbGVkb2lkKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGlmICh0cCkgewogICAgICAgIGlmICh0cC0+cGFyZW50KSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbGVkb2lkKGYsIHRwLT5wYXJlbnQpOwogICAgICAgICAvKlJFQ1VSU0UqL30KICAgICAgICBmcHJpbnRmKGYsICIuJXMoJWx1KSIsIHRwLT5sYWJlbCwgdHAtPnN1YmlkKTsKICAgIH0KfQoKc3RhdGljIHZvaWQKcHJpbnRfcGFyZW50X29pZChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBpZiAodHApIHsKICAgICAgICBpZiAodHAtPnBhcmVudCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfb2lkKGYsIHRwLT5wYXJlbnQpOwogICAgICAgICAvKlJFQ1VSU0UqL30KICAgICAgICBmcHJpbnRmKGYsICIuJWx1IiwgdHAtPnN1YmlkKTsKICAgIH0KfQoKCnN0YXRpYyB2b2lkIHByaW50X3BhcmVudF9taWJjaGlsZG9pZChGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwKQp7CiAgICBzdGF0aWMgc3RydWN0IHRyZWUgKnRlbXA7CiAgICB1bnNpZ25lZCBsb25nIGVsZW1zWzEwMF07CiAgICBpbnQgZWxlbV9jbnQgPSAwOwogICAgaW50IGkgPSAwOwogICAgdGVtcCA9IHRwOwogICAgaWYgKHRlbXApIHsKICAgICAgICB3aGlsZSAodGVtcC0+cGFyZW50KSB7CiAgICAgICAgICAgICAgICBlbGVtc1tlbGVtX2NudCsrXSA9IHRlbXAtPnN1YmlkOwogICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAtPnBhcmVudDsKICAgICAgICB9CiAgICAgICAgZWxlbXNbZWxlbV9jbnQrK10gPSB0ZW1wLT5zdWJpZDsKICAgIH0KICAgIGZvciAoaSA9IGVsZW1fY250IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBpZiAoaSA9PSBlbGVtX2NudCAtIDEpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiJWx1IiwgZWxlbXNbaV0pOyAgICAgICAgICAgCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZwcmludGYoZiwgIi4lbHUiLCBlbGVtc1tpXSk7ICAgICAgICAgIAogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKcHJpbnRfcGFyZW50X2xhYmVsKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIGlmICh0cCkgewogICAgICAgIGlmICh0cC0+cGFyZW50KSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbChmLCB0cC0+cGFyZW50KTsKICAgICAgICAgLypSRUNVUlNFKi99CiAgICAgICAgZnByaW50ZihmLCAiLiVzIiwgdHAtPmxhYmVsKTsKICAgIH0KfQoKLyoqCiAqIEBpbnRlcm5hbAogKiBUaGlzIG1ldGhvZHMgZ2VuZXJhdGVzIHZhcmlhdGlvbnMgb24gdGhlIG9yaWdpbmFsIHByaW50X3N1YnRyZWUoKSByZXBvcnQuCiAqIFRyYXZlcnNlIHRoZSB0cmVlIGRlcHRoIGZpcnN0LCBmcm9tIGxlYXN0IHRvIGdyZWF0ZXN0IHN1Yi1pZGVudGlmaWVyLgogKiBXYXJuaW5nOiB0aGlzIG1ldGhvZHMgcmVjdXJzZXMgYW5kIGNhbGxzIG1ldGhvZHMgdGhhdCByZWN1cnNlLgogKgogKiBAcGFyYW0gZiAgICAgICBGaWxlIGRlc2NyaXB0b3IgdG8gcHJpbnQgdG8uCiAqIEBwYXJhbSB0cmVlICAgID8/PwogKiBAcGFyYW0gY291bnQgICA/Pz8KICovCgpzdGF0aWMgdm9pZApwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoRklMRSAqIGYsIHN0cnVjdCB0cmVlICp0cmVlLCBpbnQgY291bnQpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKCiAgICBjb3VudCsrOwoKICAgIC8qCiAgICAgKiBzYW5pdHkgY2hlY2sgCiAgICAgKi8KICAgIGlmICghdHJlZSkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKgogICAgICogZmluZCB0aGUgbm90IHJlcG9ydGVkIHBlZXIgd2l0aCB0aGUgbG93ZXN0IHN1Yi1pZGVudGlmaWVyLgogICAgICogaWYgbm8gbW9yZSwgYnJlYWsgdGhlIGxvb3AgYW5kIGNsZWFudXAuCiAgICAgKiBzZXQgInJlcG9ydGVkIiBmbGFnLCBhbmQgY3JlYXRlIHJlcG9ydCBmb3IgdGhpcyBwZWVyLgogICAgICogcmVjdXJzZSB1c2luZyB0aGUgY2hpbGRyZW4gb2YgdGhpcyBwZWVyLCBpZiBhbnkuCiAgICAgKi8KICAgIHdoaWxlICgxKSB7CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHRyZWUgKm50cDsKCiAgICAgICAgdHAgPSAwOwogICAgICAgIGZvciAobnRwID0gdHJlZS0+Y2hpbGRfbGlzdDsgbnRwOyBudHAgPSBudHAtPm5leHRfcGVlcikgewogICAgICAgICAgICBpZiAobnRwLT5yZXBvcnRlZCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKCF0cCB8fCAodHAtPnN1YmlkID4gbnRwLT5zdWJpZCkpCiAgICAgICAgICAgICAgICB0cCA9IG50cDsKICAgICAgICB9CiAgICAgICAgaWYgKCF0cCkKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIHRwLT5yZXBvcnRlZCA9IDE7CgogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbGFiZWxlZG9pZCkgewogICAgICAgICAgICBwcmludF9wYXJlbnRfbGFiZWxlZG9pZChmLCB0cCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfb2lkKSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9vaWQoZiwgdHApOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBpZiAocHJpbnRfc3VidHJlZV9vaWRfcmVwb3J0X3N5bWJvbGljKSB7CiAgICAgICAgICAgIHByaW50X3BhcmVudF9sYWJlbChmLCB0cCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfbWliY2hpbGRvaWQpIHsKCSAgICBmcHJpbnRmKGYsICJcIiVzXCJcdCIsIHRwLT5sYWJlbCk7CiAgICAgICAgICAgIGZwcmludGYoZiwgIlx0XHRcIiIpOwogICAgICAgICAgICBwcmludF9wYXJlbnRfbWliY2hpbGRvaWQoZiwgdHApOwogICAgICAgICAgICBmcHJpbnRmKGYsICJcIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmludF9zdWJ0cmVlX29pZF9yZXBvcnRfc3VmZml4KSB7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAgIik7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzKCVsZCkgdHlwZT0lZCIsIHRwLT5sYWJlbCwgdHAtPnN1YmlkLCB0cC0+dHlwZSk7CiAgICAgICAgICAgIGlmICh0cC0+dGNfaW5kZXggIT0gLTEpCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgdGM9JWQiLCB0cC0+dGNfaW5kZXgpOwogICAgICAgICAgICBpZiAodHAtPmhpbnQpCiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgaGludD0lcyIsIHRwLT5oaW50KTsKICAgICAgICAgICAgaWYgKHRwLT51bml0cykKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiB1bml0cz0lcyIsIHRwLT51bml0cyk7CgogICAgICAgICAgICBmcHJpbnRmKGYsICJcbiIpOwogICAgICAgIH0KICAgICAgICBwcmludF9zdWJ0cmVlX29pZF9yZXBvcnQoZiwgdHAsIGNvdW50KTsKICAgICAvKlJFQ1VSU0UqL30KfQojZW5kaWYgLyogTkVUU05NUF9ESVNBQkxFX01JQl9MT0FESU5HICovCgoKLyoqCiAqIENvbnZlcnRzIHRpbWV0aWNrcyB0byBob3VycywgbWludXRlcywgc2Vjb25kcyBzdHJpbmcuCiAqIENNVSBjb21wYXRpYmxlIGRvZXMgbm90IHNob3cgY2VudGlzZWNvbmRzLgogKgogKiBAcGFyYW0gdGltZXRpY2tzICAgIFRoZSB0aW1ldGlja3MgdG8gY29udmVydC4KICogQHBhcmFtIGJ1ZiAgICAgICAgICBCdWZmZXIgdG8gd3JpdGUgdG8sIGhhcyB0byBiZSBhdCAKICogICAgICAgICAgICAgICAgICAgICBsZWFzdCA0MCBCeXRlcyBsYXJnZS4KICogICAgICAgCiAqIEByZXR1cm4gVGhlIGJ1ZmZlcgogKgogKiBAc2VlIHVwdGltZVN0cmluZwogKi8KY2hhciAgICAgICAgICAgKgp1cHRpbWVfc3RyaW5nKHVfbG9uZyB0aW1ldGlja3MsIGNoYXIgKmJ1ZikKewogICAgcmV0dXJuIHVwdGltZV9zdHJpbmdfbiggdGltZXRpY2tzLCBidWYsIDQwKTsKfQoKY2hhciAgICAgICAgICAgKgp1cHRpbWVfc3RyaW5nX24odV9sb25nIHRpbWV0aWNrcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CiAgICB1cHRpbWVTdHJpbmcodGltZXRpY2tzLCBidWYsIGJ1Zmxlbik7CiNpZmRlZiBDTVVfQ09NUEFUSUJMRQogICAgewogICAgY2hhciAqY3AgPSBzdHJyY2hyKGJ1ZiwgJy4nKTsKICAgIGlmIChjcCkKICAgICAgICAqY3AgPSAnXDAnOwogICAgfQojZW5kaWYKICAgIHJldHVybiBidWY7Cn0KCi8qKgogKiBHaXZlbiBhIHN0cmluZywgcGFyc2VzIGFuIG9pZCBvdXQgb2YgaXQgKGlmIHBvc3NpYmxlKS4KICogSXQgd2lsbCB0cnkgdG8gcGFyc2UgaXQgYmFzZWQgb24gcHJlZGV0ZXJtaW5lZCBjb25maWd1cmF0aW9uIGlmCiAqIHByZXNlbnQgb3IgYnkgZXZlcnkgbWV0aG9kIHBvc3NpYmxlIG90aGVyd2lzZS4KICogSWYgYSBzdWZmaXggaGFzIGJlZW4gcmVnaXN0ZXJlZCB1c2luZyBORVRTTk1QX0RTX0xJQl9PSURTVUZGSVgsIGl0CiAqIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGlucHV0IHN0cmluZyBiZWZvcmUgcHJvY2Vzc2luZy4KICoKICogQHBhcmFtIGFyZ3YgICAgVGhlIE9JRCB0byBzdHJpbmcgcGFyc2UKICogQHBhcmFtIHJvb3QgICAgQW4gT0lEIGFycmF5IHdoZXJlIHRoZSByZXN1bHRzIGFyZSBzdG9yZWQuCiAqIEBwYXJhbSByb290bGVuIFRoZSBtYXggbGVuZ3RoIG9mIHRoZSBhcnJheSBnb2luZyBpbiBhbmQgdGhlIGRhdGEKICogICAgICAgICAgICAgICAgbGVuZ3RoIGNvbWluZyBvdXQuCiAqCiAqIEByZXR1cm4gICAgICAgIFRoZSByb290IG9pZCBwb2ludGVyIGlmIHN1Y2Nlc3NmdWwsIG9yIE5VTEwgb3RoZXJ3aXNlLgogKi8KIApvaWQgICAgICAgICAgICAqCnNubXBfcGFyc2Vfb2lkKGNvbnN0IGNoYXIgKmFyZ3YsIG9pZCAqIHJvb3QsIHNpemVfdCAqIHJvb3RsZW4pCnsKICAgIHNpemVfdCAgICAgICAgICBzYXZsZW4gPSAqcm9vdGxlbjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBidWZfbGVuID0gMDsKICAgIHN0YXRpYyBjaGFyICAgICp0bXBidWY7CiAgICBjb25zdCBjaGFyICAgICAqc3VmZml4LCAqcHJlZml4OwoKICAgIHN1ZmZpeCA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEU1VGRklYKTsKICAgIHByZWZpeCA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfT0lEUFJFRklYKTsKICAgIGlmICgoc3VmZml4ICYmIHN1ZmZpeFswXSkgfHwgKHByZWZpeCAmJiBwcmVmaXhbMF0pKSB7CiAgICAgICAgaWYgKCFzdWZmaXgpCiAgICAgICAgICAgIHN1ZmZpeCA9ICIiOwogICAgICAgIGlmICghcHJlZml4KQogICAgICAgICAgICBwcmVmaXggPSAiIjsKICAgICAgICBpZiAoKHN0cmxlbihzdWZmaXgpICsgc3RybGVuKHByZWZpeCkgKyBzdHJsZW4oYXJndikgKyAyKSA+IHRtcGJ1Zl9sZW4pIHsKICAgICAgICAgICAgdG1wYnVmX2xlbiA9IHN0cmxlbihzdWZmaXgpICsgc3RybGVuKGFyZ3YpICsgc3RybGVuKHByZWZpeCkgKyAyOwogICAgICAgICAgICB0bXBidWYgPSAoY2hhciAqKXJlYWxsb2ModG1wYnVmLCB0bXBidWZfbGVuKTsKICAgICAgICB9CiAgICAgICAgc25wcmludGYodG1wYnVmLCB0bXBidWZfbGVuLCAiJXMlcyVzJXMiLCBwcmVmaXgsIGFyZ3YsCiAgICAgICAgICAgICAgICAgKChzdWZmaXhbMF0gPT0gJy4nIHx8IHN1ZmZpeFswXSA9PSAnXDAnKSA/ICIiIDogIi4iKSwKICAgICAgICAgICAgICAgICBzdWZmaXgpOwogICAgICAgIGFyZ3YgPSB0bXBidWY7CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBfcGFyc2Vfb2lkIiwiUGFyc2luZzogJXNcbiIsYXJndikpOwogICAgfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfUkFORE9NX0FDQ0VTUykKICAgICAgICB8fCBzdHJjaHIoYXJndiwgJzonKSkgewogICAgICAgIGlmIChnZXRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9SRUdFWF9BQ0NFU1MpKSB7CgljbGVhcl90cmVlX2ZsYWdzKHRyZWVfaGVhZCk7CiAgICAgICAgaWYgKGdldF93aWxkX25vZGUoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgfSBlbHNlIHsKI2VuZGlmIC8qIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORyAqLwogICAgICAgIGlmIChyZWFkX29iamlkKGFyZ3YsIHJvb3QsIHJvb3RsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgIH0KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICAqcm9vdGxlbiA9IHNhdmxlbjsKICAgICAgICBpZiAoZ2V0X25vZGUoYXJndiwgcm9vdCwgcm9vdGxlbikpIHsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgICAgICpyb290bGVuID0gc2F2bGVuOwogICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZV9vaWQiLCAid2lsZGx5IHBhcnNpbmdcbiIpKTsKCWNsZWFyX3RyZWVfZmxhZ3ModHJlZV9oZWFkKTsKICAgICAgICBpZiAoZ2V0X3dpbGRfbm9kZShhcmd2LCByb290LCByb290bGVuKSkgewogICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICB9CiAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KICAgIHJldHVybiBOVUxMOwp9CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwovKgogKiBVc2UgRElTUExBWS1ISU5UIHRvIHBhcnNlIGEgdmFsdWUgaW50byBhbiBvY3RldCBzdHJpbmcuCiAqCiAqIG5vdGUgdGhhdCAiMWQxZCIsICIxMSIgY291bGQgaGF2ZSBjb21lIGZyb20gYW4gb2N0ZXQgc3RyaW5nIHRoYXQKICogbG9va2VkIGxpa2UgeyAxLCAxIH0gb3IgYW4gb2N0ZXQgc3RyaW5nIHRoYXQgbG9va2VkIGxpa2UgeyAxMSB9CiAqIGJlY2F1c2Ugb2YgdGhpcywgaXQncyBkb3VidGZ1bCB0aGF0IGFueW9uZSB3b3VsZCB1c2Ugc3VjaCBhIGRpc3BsYXkKICogc3RyaW5nLiBUaGVyZWZvcmUsIHRoZSBwYXJzZXIgaWdub3JlcyB0aGlzIGNhc2UuCiAqLwoKc3RydWN0IHBhcnNlX2hpbnRzIHsKICAgIGludCBsZW5ndGg7CiAgICBpbnQgcmVwZWF0OwogICAgaW50IGZvcm1hdDsKICAgIGludCBzZXBhcmF0b3I7CiAgICBpbnQgdGVybWluYXRvcjsKICAgIHVuc2lnbmVkIGNoYXIgKnJlc3VsdDsKICAgIGludCByZXN1bHRfbWF4OwogICAgaW50IHJlc3VsdF9sZW47Cn07CgpzdGF0aWMgdm9pZCBwYXJzZV9oaW50c19yZXNldChzdHJ1Y3QgcGFyc2VfaGludHMgKnBoKQp7CiAgICBwaC0+bGVuZ3RoID0gMDsKICAgIHBoLT5yZXBlYXQgPSAwOwogICAgcGgtPmZvcm1hdCA9IDA7CiAgICBwaC0+c2VwYXJhdG9yID0gMDsKICAgIHBoLT50ZXJtaW5hdG9yID0gMDsKfQoKc3RhdGljIHZvaWQgcGFyc2VfaGludHNfY3RvcihzdHJ1Y3QgcGFyc2VfaGludHMgKnBoKQp7CiAgICBwYXJzZV9oaW50c19yZXNldChwaCk7CiAgICBwaC0+cmVzdWx0ID0gTlVMTDsKICAgIHBoLT5yZXN1bHRfbWF4ID0gMDsKICAgIHBoLT5yZXN1bHRfbGVuID0gMDsKfQoKc3RhdGljIGludCBwYXJzZV9oaW50c19hZGRfcmVzdWx0X29jdGV0KHN0cnVjdCBwYXJzZV9oaW50cyAqcGgsIHVuc2lnbmVkIGNoYXIgb2N0ZXQpCnsKICAgIGlmICghKHBoLT5yZXN1bHRfbGVuIDwgcGgtPnJlc3VsdF9tYXgpKSB7CglwaC0+cmVzdWx0X21heCA9IHBoLT5yZXN1bHRfbGVuICsgMzI7CglpZiAoIXBoLT5yZXN1bHQpIHsKCSAgICBwaC0+cmVzdWx0ID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MocGgtPnJlc3VsdF9tYXgpOwoJfSBlbHNlIHsKCSAgICBwaC0+cmVzdWx0ID0gKHVuc2lnbmVkIGNoYXIgKilyZWFsbG9jKHBoLT5yZXN1bHQsIHBoLT5yZXN1bHRfbWF4KTsKCX0KICAgIH0KICAgIAogICAgaWYgKCFwaC0+cmVzdWx0KSB7CglyZXR1cm4gMDsJCS8qIGZhaWxlZCAqLwogICAgfQoKICAgIHBoLT5yZXN1bHRbcGgtPnJlc3VsdF9sZW4rK10gPSBvY3RldDsKICAgIHJldHVybiAxOwkJCS8qIHN1Y2Nlc3MgKi8KfQoKc3RhdGljIGludCBwYXJzZV9oaW50c19wYXJzZShzdHJ1Y3QgcGFyc2VfaGludHMgKnBoLCBjb25zdCBjaGFyICoqdl9pbl9vdXQpCnsKICAgIGNvbnN0IGNoYXIgKnYgPSAqdl9pbl9vdXQ7CiAgICBjaGFyICpudjsKICAgIGludCBiYXNlOwogICAgaW50IHJlcGVhdHMgPSAwOwogICAgaW50IHJlcGVhdF9maXh1cCA9IHBoLT5yZXN1bHRfbGVuOwogICAgCiAgICBpZiAocGgtPnJlcGVhdCkgewoJaWYgKCFwYXJzZV9oaW50c19hZGRfcmVzdWx0X29jdGV0KHBoLCAwKSkgewoJICAgIHJldHVybiAwOwoJfQogICAgfQogICAgZG8gewoJYmFzZSA9IDA7Cglzd2l0Y2ggKHBoLT5mb3JtYXQpIHsKCWNhc2UgJ3gnOiBiYXNlICs9IDY7CS8qIGZhbGwgdGhyb3VnaCAqLwoJY2FzZSAnZCc6IGJhc2UgKz0gMjsJLyogZmFsbCB0aHJvdWdoICovCgljYXNlICdvJzogYmFzZSArPSA4OwkvKiBmYWxsIHRocm91Z2ggKi8KCSAgICB7CgkJaW50IGk7CgkJdW5zaWduZWQgbG9uZyBudW1iZXIgPSBzdHJ0b2wodiwgJm52LCBiYXNlKTsKCQlpZiAobnYgPT0gdikgcmV0dXJuIDA7CgkJdiA9IG52OwoJCWZvciAoaSA9IDA7IGkgPCBwaC0+bGVuZ3RoOyBpKyspIHsKCQkgICAgaW50IHNoaWZ0ID0gOCAqIChwaC0+bGVuZ3RoIC0gMSAtIGkpOwoJCSAgICBpZiAoIXBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQocGgsICh1X2NoYXIpKG51bWJlciA+PiBzaGlmdCkgKSkgewoJCQlyZXR1cm4gMDsgLyogZmFpbGVkICovCgkJICAgIH0KCQl9CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgJ2EnOgoJICAgIHsKCQlpbnQgaTsKCQkgICAgCgkJZm9yIChpID0gMDsgaSA8IHBoLT5sZW5ndGggJiYgKnY7IGkrKykgewoJCSAgICBpZiAoIXBhcnNlX2hpbnRzX2FkZF9yZXN1bHRfb2N0ZXQocGgsICp2KyspKSB7CgkJCXJldHVybiAwOwkvKiBmYWlsZWQgKi8KCQkgICAgfQoJCX0KCSAgICB9CgkgICAgYnJlYWs7Cgl9CgoJcmVwZWF0cysrOwoKCWlmIChwaC0+c2VwYXJhdG9yICYmICp2KSB7CgkgICAgaWYgKCp2ID09IHBoLT5zZXBhcmF0b3IpIHsKCQl2Kys7CgkgICAgfSBlbHNlIHsKCQlyZXR1cm4gMDsJCS8qIGZhaWxlZCAqLwoJICAgIH0KCX0KCglpZiAocGgtPnRlcm1pbmF0b3IpIHsKCSAgICBpZiAoKnYgPT0gcGgtPnRlcm1pbmF0b3IpIHsKCQl2Kys7CgkJYnJlYWs7CgkgICAgfQoJfQogICAgfSB3aGlsZSAocGgtPnJlcGVhdCAmJiAqdik7CiAgICBpZiAocGgtPnJlcGVhdCkgewoJcGgtPnJlc3VsdFtyZXBlYXRfZml4dXBdID0gcmVwZWF0czsKICAgIH0KCiAgICAqdl9pbl9vdXQgPSB2OwogICAgcmV0dXJuIDE7Cn0KCnN0YXRpYyB2b2lkIHBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoc3RydWN0IHBhcnNlX2hpbnRzICpwaCwgaW50IGRpZ2l0KQp7CiAgICBwaC0+bGVuZ3RoICo9IDEwOwogICAgcGgtPmxlbmd0aCArPSBkaWdpdCAtICcwJzsKfQoKY29uc3QgY2hhciAqcGFyc2Vfb2N0ZXRfaGludChjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp2YWx1ZSwgdW5zaWduZWQgY2hhciAqKm5ld192YWwsIGludCAqbmV3X3ZhbF9sZW4pCnsKICAgIGNvbnN0IGNoYXIgKmggPSBoaW50OwogICAgY29uc3QgY2hhciAqdiA9IHZhbHVlOwogICAgc3RydWN0IHBhcnNlX2hpbnRzIHBoOwogICAgaW50IHJldHZhbCA9IDE7CiAgICAvKiBTZWUgUkZDIDE0NDMgKi8KICAgIGVudW0gewoJSElOVF8xXzIsCglISU5UXzJfMywKCUhJTlRfMV8yXzQsCglISU5UXzFfMl81CiAgICB9IHN0YXRlID0gSElOVF8xXzI7CgogICAgcGFyc2VfaGludHNfY3RvcigmcGgpOwogICAgd2hpbGUgKCpoICYmICp2ICYmIHJldHZhbCkgewoJc3dpdGNoIChzdGF0ZSkgewoJY2FzZSBISU5UXzFfMjoKCSAgICBpZiAoJyonID09ICpoKSB7CgkJcGgucmVwZWF0ID0gMTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSBpZiAoaXNkaWdpdCgqaCkpIHsKCQlwYXJzZV9oaW50c19sZW5ndGhfYWRkX2RpZ2l0KCZwaCwgKmgpOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIHsKCQlyZXR1cm4gdjsJLyogZmFpbGVkICovCgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgSElOVF8yXzM6CgkgICAgaWYgKGlzZGlnaXQoKmgpKSB7CgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQkvKiBzdGF0ZSA9IEhJTlRfMl8zICovCgkgICAgfSBlbHNlIGlmICgneCcgPT0gKmggfHwgJ2QnID09ICpoIHx8ICdvJyA9PSAqaCB8fCAnYScgPT0gKmgpIHsKCQlwaC5mb3JtYXQgPSAqaDsKCQlzdGF0ZSA9IEhJTlRfMV8yXzQ7CgkgICAgfSBlbHNlIHsKCQlyZXR1cm4gdjsJLyogZmFpbGVkICovCgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgSElOVF8xXzJfNDoKCSAgICBpZiAoJyonID09ICpoKSB7CgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCQkKCQlwaC5yZXBlYXQgPSAxOwoJCXN0YXRlID0gSElOVF8yXzM7CgkgICAgfSBlbHNlIGlmIChpc2RpZ2l0KCpoKSkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGFyc2VfaGludHNfbGVuZ3RoX2FkZF9kaWdpdCgmcGgsICpoKTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSB7CgkJcGguc2VwYXJhdG9yID0gKmg7CgkJc3RhdGUgPSBISU5UXzFfMl81OwoJICAgIH0KCSAgICBicmVhazsKCgljYXNlIEhJTlRfMV8yXzU6CgkgICAgaWYgKCcqJyA9PSAqaCkgewoJCXJldHZhbCA9IHBhcnNlX2hpbnRzX3BhcnNlKCZwaCwgJnYpOwoJCXBhcnNlX2hpbnRzX3Jlc2V0KCZwaCk7CgkJCgkJcGgucmVwZWF0ID0gMTsKCQlzdGF0ZSA9IEhJTlRfMl8zOwoJICAgIH0gZWxzZSBpZiAoaXNkaWdpdCgqaCkpIHsKCQlyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKCQlwYXJzZV9oaW50c19yZXNldCgmcGgpOwoJCQoJCXBhcnNlX2hpbnRzX2xlbmd0aF9hZGRfZGlnaXQoJnBoLCAqaCk7CgkJc3RhdGUgPSBISU5UXzJfMzsKCSAgICB9IGVsc2UgewoJCXBoLnRlcm1pbmF0b3IgPSAqaDsKCgkJcmV0dmFsID0gcGFyc2VfaGludHNfcGFyc2UoJnBoLCAmdik7CgkJcGFyc2VfaGludHNfcmVzZXQoJnBoKTsKCgkJc3RhdGUgPSBISU5UXzFfMjsKCSAgICB9CgkgICAgYnJlYWs7Cgl9CgloKys7CiAgICB9CiAgICB3aGlsZSAoKnYgJiYgcmV0dmFsKSB7CglyZXR2YWwgPSBwYXJzZV9oaW50c19wYXJzZSgmcGgsICZ2KTsKICAgIH0KICAgIGlmIChyZXR2YWwpIHsKCSpuZXdfdmFsID0gcGgucmVzdWx0OwoJKm5ld192YWxfbGVuID0gcGgucmVzdWx0X2xlbjsKICAgIH0gZWxzZSB7CglpZiAocGgucmVzdWx0KSB7CgkgICAgU05NUF9GUkVFKHBoLnJlc3VsdCk7Cgl9CgkqbmV3X3ZhbCA9IE5VTEw7CgkqbmV3X3ZhbF9sZW4gPSAwOwogICAgfQogICAgcmV0dXJuIHJldHZhbCA/IE5VTEwgOiB2Owp9CiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8KCiNpZmRlZiB0ZXN0X2Rpc3BsYXlfaGludAoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQp7CiAgICBjb25zdCBjaGFyICpoaW50OwogICAgY29uc3QgY2hhciAqdmFsdWU7CiAgICB1bnNpZ25lZCBjaGFyICpuZXdfdmFsOwogICAgaW50IG5ld192YWxfbGVuOwogICAgY2hhciAqcjsKICAgIAogICAgaWYgKGFyZ2MgPCAzKSB7CglmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBkaCA8aGludD4gPHZhbHVlPlxuIik7CglleGl0KDIpOwogICAgfQogICAgaGludCA9IGFyZ3ZbMV07CiAgICB2YWx1ZSA9IGFyZ3ZbMl07CiAgICByID0gcGFyc2Vfb2N0ZXRfaGludChoaW50LCB2YWx1ZSwgJm5ld192YWwsICZuZXdfdmFsX2xlbik7CiAgICBwcmludGYoIntcIiVzXCIsIFwiJXNcIn06IFxuXHQiLCBoaW50LCB2YWx1ZSk7CiAgICBpZiAocikgewogICAgICAgICpyID0gMDsKICAgIAlwcmludGYoInJldHVybmVkIGZhaWxlZFxuIik7CglwcmludGYoInZhbHVlIHN5bnRheCBlcnJvciBhdDogJXNcbiIsIHZhbHVlKTsKICAgIH0KICAgIGVsc2UgewoJaW50IGk7CglwcmludGYoInJldHVybmVkIHN1Y2Nlc3NcbiIpOwoJZm9yIChpID0gMDsgaSA8IG5ld192YWxfbGVuOyBpKyspIHsKCSAgICBpbnQgYyA9IG5ld192YWxbaV0gJiAweEZGOwoJICAgIHByaW50ZigiJTAyWCglYykgIiwgYywgaXNwcmludChjKSA/IGMgOiAnICcpOwoJfQoJU05NUF9GUkVFKG5ld192YWwpOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwogICAgZXhpdCgwKTsKfQoKI2VuZGlmIC8qIHRlc3RfZGlzcGxheV9oaW50ICovCgp1X2NoYXIKbWliX3RvX2Fzbl90eXBlKGludCBtaWJfdHlwZSkKewogICAgc3dpdGNoIChtaWJfdHlwZSkgewogICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgIHJldHVybiBBU05fT0JKRUNUX0lEOwoKICAgIGNhc2UgVFlQRV9PQ1RFVFNUUjoKICAgICAgICByZXR1cm4gQVNOX09DVEVUX1NUUjsKCiAgICBjYXNlIFRZUEVfTkVUQUREUjoKICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgcmV0dXJuIEFTTl9JUEFERFJFU1M7CgogICAgY2FzZSBUWVBFX0lOVEVHRVIzMjoKICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgIHJldHVybiBBU05fSU5URUdFUjsKCiAgICBjYXNlIFRZUEVfQ09VTlRFUjoKICAgICAgICByZXR1cm4gQVNOX0NPVU5URVI7CgogICAgY2FzZSBUWVBFX0dBVUdFOgogICAgICAgIHJldHVybiBBU05fR0FVR0U7CgogICAgY2FzZSBUWVBFX1RJTUVUSUNLUzoKICAgICAgICByZXR1cm4gQVNOX1RJTUVUSUNLUzsKCiAgICBjYXNlIFRZUEVfT1BBUVVFOgogICAgICAgIHJldHVybiBBU05fT1BBUVVFOwoKICAgIGNhc2UgVFlQRV9OVUxMOgogICAgICAgIHJldHVybiBBU05fTlVMTDsKCiAgICBjYXNlIFRZUEVfQ09VTlRFUjY0OgogICAgICAgIHJldHVybiBBU05fQ09VTlRFUjY0OwoKICAgIGNhc2UgVFlQRV9CSVRTVFJJTkc6CiAgICAgICAgcmV0dXJuIEFTTl9CSVRfU1RSOwoKICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgICAgIHJldHVybiBBU05fVU5TSUdORUQ7CgogICAgY2FzZSBUWVBFX05TQVBBRERSRVNTOgogICAgICAgIHJldHVybiBBU05fTlNBUDsKCiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCi8qKgogKiBDb252ZXJ0cyBhIHN0cmluZyB0byBpdHMgT0lEIGZvcm0uCiAqIGluIGV4YW1wbGUgICJoZWxsbyIgPSA1IC4gJ2gnIC4gJ2UnIC4gJ2wnIC4gJ2wnIC4gJ28nCiAqCiAqIEBwYXJhbSBTICAgVGhlIHN0cmluZy4KICogQHBhcmFtIE8gICBUaGUgb2lkLgogKiBAcGFyYW0gTCAgIFRoZSBsZW5ndGggb2YgdGhlIG9pZC4KICoKICogQHJldHVybiAwIG9uIFN1Y2VzcywgMSBvbiBmYWlsdXJlLgogKi8KaW50Cm5ldHNubXBfc3RyMm9pZChjb25zdCBjaGFyICpTLCBvaWQgKiBPLCBpbnQgTCkKewogICAgY29uc3QgY2hhciAgICAgKmMgPSBTOwogICAgb2lkICAgICAgICAgICAgKm8gPSAmT1sxXTsKCiAgICAtLUw7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVhdmUgcm9vbSBmb3IgbGVuZ3RoIHByZWZpeCAqLwoKICAgIGZvciAoOyAqYyAmJiBMOyAtLUwsICsrbywgKytjKQogICAgICAgICpvID0gKmM7CgogICAgLyoKICAgICAqIG1ha2Ugc3VyZSB3ZSBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIAogICAgICovCiAgICBpZiAoKmMgIT0gMCkKICAgICAgICByZXR1cm4gMTsKCiAgICAvKgogICAgICogc2V0IHRoZSBsZW5ndGggb2YgdGhlIG9pZCAKICAgICAqLwogICAgKk8gPSBjIC0gUzsKCiAgICByZXR1cm4gMDsKfQoKLyoqCiAqIENvbnZlcnRzIGFuIE9JRCB0byBpdHMgY2hhcmFjdGVyIGZvcm0uCiAqIGluIGV4YW1wbGUgIDUgLiAxIC4gMiAuIDMgLiA0IC4gNSA9IDEyMzQ1CiAqCiAqIEBwYXJhbSBDICAgVGhlIGNoYXJhY3RlciBidWZmZXIuCiAqIEBwYXJhbSBMICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLgogKiBAcGFyYW0gTyAgIFRoZSBvaWQuCiAqCiAqIEByZXR1cm4gMCBvbiBTdWNlc3MsIDEgb24gZmFpbHVyZS4KICovCmludApuZXRzbm1wX29pZDJjaGFycyhjaGFyICpDLCBpbnQgTCwgY29uc3Qgb2lkICogTykKewogICAgY2hhciAgICAgICAgICAgKmMgPSBDOwogICAgY29uc3Qgb2lkICAgICAgKm8gPSAmT1sxXTsKCiAgICBpZiAoTCA8IChpbnQpKk8pCiAgICAgICAgcmV0dXJuIDE7CgogICAgTCA9ICpPOyAvKiogbGVuZ3RoICovCiAgICBmb3IgKDsgTDsgLS1MLCArK28sICsrYykgewogICAgICAgIGlmICgqbyA+IDB4RkYpCiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICpjID0gKGNoYXIpKm87CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqCiAqIENvbnZlcnRzIGFuIE9JRCB0byBpdHMgc3RyaW5nIGZvcm0uCiAqIGluIGV4YW1wbGUgIDUgLiAnaCcgLiAnZScgLiAnbCcgLiAnbCcgLiAnbycgPSAiaGVsbG9cMCIgKG51bGwgdGVybWluYXRlZCkKICoKICogQHBhcmFtIFMgICBUaGUgY2hhcmFjdGVyIHN0cmluZyBidWZmZXIuCiAqIEBwYXJhbSBMICAgVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGJ1ZmZlci4KICogQHBhcmFtIE8gICBUaGUgb2lkLgogKgogKiBAcmV0dXJuIDAgb24gU3VjZXNzLCAxIG9uIGZhaWx1cmUuCiAqLwppbnQKbmV0c25tcF9vaWQyc3RyKGNoYXIgKlMsIGludCBMLCBvaWQgKiBPKQp7CiAgICBpbnQgICAgICAgICAgICByYzsKCiAgICBpZiAoTCA8PSAoaW50KSpPKQogICAgICAgIHJldHVybiAxOwoKICAgIHJjID0gbmV0c25tcF9vaWQyY2hhcnMoUywgTCwgTyk7CiAgICBpZiAocmMpCiAgICAgICAgcmV0dXJuIDE7CgogICAgU1sgKk8gXSA9IDA7CgogICAgcmV0dXJuIDA7Cn0KCmludApzbnByaW50X2J5X3R5cGUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19ieV90eXBlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9oZXhzdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwgY29uc3QgdV9jaGFyICogY3AsIHNpemVfdCBsZW4pCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AsIGxlbikpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9hc2NpaXN0cmluZyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIGNwLCBzaXplX3QgbGVuKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfYXNjaWlzdHJpbmcKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgY3AsIGxlbikpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9vY3RldF9zdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19vY3RldF9zdHJpbmcKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfb3BhcXVlKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2Nfb3BhcXVlKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X29iamVjdF9pZGVudGlmaWVyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLCBjb25zdCBjaGFyICpoaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2Nfb2JqZWN0X2lkZW50aWZpZXIKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfdGltZXRpY2tzKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfdGltZXRpY2tzKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2hpbnRlZF9pbnRlZ2VyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB2YWwsIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfaGludGVkX2ludGVnZXIKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFsLCAnZCcsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2ludGVnZXIoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2ludGVnZXIoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X3VpbnRlZ2VyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX3VpbnRlZ2VyKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfZ2F1Z2UoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfZ2F1Z2UoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9jb3VudGVyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19jb3VudGVyKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9uZXR3b3JrYWRkcmVzcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywgY29uc3QgY2hhciAqaGludCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX25ldHdvcmthZGRyZXNzCiAgICAgICAgKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsIHZhciwgZW51bXMsIGhpbnQsCiAgICAgICAgIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2lwYWRkcmVzcyhjaGFyICpidWYsIHNpemVfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2lwYWRkcmVzcygodV9jaGFyICoqKSAmIGJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9udWxsKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19udWxsKCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9iaXRzdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19iaXRzdHJpbmcoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfbnNhcGFkZHJlc3MoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfbnNhcGFkZHJlc3MKICAgICAgICAoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwgdmFyLCBlbnVtcywgaGludCwKICAgICAgICAgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQoKaW50CnNucHJpbnRfY291bnRlcjY0KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfY291bnRlcjY0KCh1X2NoYXIgKiopICYgYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCmludApzbnByaW50X2JhZHR5cGUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgIGNvbnN0IG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgY29uc3Qgc3RydWN0IGVudW1fbGlzdCAqZW51bXMsCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoaW50LCBjb25zdCBjaGFyICp1bml0cykKewogICAgc2l6ZV90ICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgaWYgKHNwcmludF9yZWFsbG9jX2JhZHR5cGUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgZW51bXMsIGhpbnQsIHVuaXRzKSkKICAgICAgICByZXR1cm4gKGludCkgb3V0X2xlbjsKICAgIGVsc2UKICAgICAgICByZXR1cm4gLTE7Cn0KCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKaW50CnNucHJpbnRfZmxvYXQoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICBjb25zdCBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsIGNvbnN0IHN0cnVjdCBlbnVtX2xpc3QgKmVudW1zLAogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhpbnQsIGNvbnN0IGNoYXIgKnVuaXRzKQp7CiAgICBzaXplX3QgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICBpZiAoc3ByaW50X3JlYWxsb2NfZmxvYXQoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIsIGVudW1zLCBoaW50LCB1bml0cykpCiAgICAgICAgcmV0dXJuIChpbnQpIG91dF9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIC0xOwp9CgppbnQKc25wcmludF9kb3VibGUoY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiwKICAgICAgICAgICAgICAgY29uc3QgbmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyLCBjb25zdCBzdHJ1Y3QgZW51bV9saXN0ICplbnVtcywKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGludCwgY29uc3QgY2hhciAqdW5pdHMpCnsKICAgIHNpemVfdCAgICAgICAgICBvdXRfbGVuID0gMDsKICAgIGlmIChzcHJpbnRfcmVhbGxvY19kb3VibGUoKHVfY2hhciAqKikgJiBidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyLCBlbnVtcywgaGludCwgdW5pdHMpKQogICAgICAgIHJldHVybiAoaW50KSBvdXRfbGVuOwogICAgZWxzZQogICAgICAgIHJldHVybiAtMTsKfQojZW5kaWYKLyoqIEB9ICovCgo=