LyogIENvZGUgZ2VuZXJhdG9yIGZvciBNb3Rvcm9sYSA2OGhjMTIgbWljcm9jb250cm9sbGVycy4gICAgICAgICAgICAgICAqLwoKLypUT0RPOgogIHJlZ3NfbW9kaWZpZWQgYmVpIHN0cnVjdC1jb3B5CiAgc2F2aW5ncyB2ZXJmZWluZXJuCiAgNC1CeXRlIENvcHkKICBbc3RhdGljXSB0ZXN0ZW4KICBwZWVwaG9sZS1QYXNzIHVtIEFMTE9DUkVHcyB6dSBlbnRmZXJuZW4KICBBQ0NfSU5EIChBY2h0dW5nPykKICBzdHJ1Y3QtY29weSBQcm9ibGVtZuRsbGUKICBiYW5rZWQKICBiaXQKICBsb25nIGxvbmcsIGZsb2F0LCBkb3VibGUsIGxvbmcgZG91YmxlCgoqLwoKI2luY2x1ZGUgInN1cHAuaCIKI2luY2x1ZGUgInZiYy5oIiAvKiBuaWNodCBzY2hvZW4sIGFiZXIgLi4uICovCgpzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOwoKI2luY2x1ZGUgImR3YXJmMi5jIgoKLyogIFB1YmxpYyBkYXRhIHRoYXQgTVVTVCBiZSB0aGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgovKiBOYW1lIGFuZCBjb3B5cmlnaHQuICovCmNoYXIgY2dfY29weXJpZ2h0W109InZiY2MgY29kZS1nZW5lcmF0b3IgZm9yIDY4MDkvNjgwMy82OGhjMTIgVjAuMiAoYykgaW4gMjAwMC0yMDIyIGJ5IFZvbGtlciBCYXJ0aGVsbWFubiI7CgovKiAgQ29tbWFuZGxpbmUtZmxhZ3MgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMgICAgICAgICAgICAgICAgKi8KaW50IGdfZmxhZ3NbTUFYR0ZdPXtWQUxGTEFHLFZBTEZMQUcsMCwwLAogICAgICAgICAgICAgICAgICAgIDAsMCwwLDAsCgkJICAgIDAsMH07CmNoYXIgKmdfZmxhZ3NfbmFtZVtNQVhHRl09eyJjcHUiLCJmcHUiLCJuby1kZWxheWVkLXBvcHBpbmciLCJjb25zdC1pbi1kYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lcmdlLWNvbnN0YW50cyIsIm5vLXBlZXBob2xlIiwibWVtLWNzZSIsImFjYy1nbG9iIiwKCQkJICAgInBjcmVsIiwiZHJlbCIsIm5vLWNoYXItYWRkaTJwIiwibm9keCIsIm5vdSJ9Owp1bmlvbiBwcGkgZ19mbGFnc192YWxbTUFYR0ZdOwoKLyogVHlwZW5hbWVzIChuZWVkZWQgYmVjYXVzZSBvZiBIQVZFX0VYVF9UWVBFUykuICovCmNoYXIgKnR5cG5hbWVbXT17InN0cmFuZ2UiLCJiaXQiLCJjaGFyIiwic2hvcnQiLCJpbnQiLCJsb25nIiwibG9uZyBsb25nIiwKCQkgImZsb2F0IiwiZG91YmxlIiwibG9uZyBkb3VibGUiLCJ2b2lkIiwKICAgICAgICAgICAgICAgICAibmVhci1wb2ludGVyIiwiZmFyLXBvaW50ZXIiLCJodWdlLXBvaW50ZXIiLAoJCSAiYXJyYXkiLCJzdHJ1Y3QiLCJ1bmlvbiIsImVudW0iLCJmdW5jdGlvbiJ9OwoKaW50IGJpdHNwZXJieXRlID0gODsKaW50IGJ5dGVtYXNrID0gMHhmZjsKaW50IGRibF9ieXRlbWFzayA9IDB4ZmZmZjsKCi8qICBBbGlnbm1lbnQtcmVxdWlyZW1lbnRzIGZvciBhbGwgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAqLwp6bWF4IGFsaWduW01BWF9UWVBFKzFdOwoKLyogIEFsaWdubWVudCB0aGF0IGlzIHN1ZmZpY2llbnQgZm9yIGV2ZXJ5IG9iamVjdC4gICAgICAgICAgICAgICovCnptYXggbWF4YWxpZ247CgovKiAgQ0hBUl9CSVQgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8Kem1heCBjaGFyX2JpdDsKCi8qICBTaXplcyBvZiBhbGwgZWxlbWVudGFyeSB0eXBlcyBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLwp6bWF4IHNpemV0YWJbTUFYX1RZUEUrMV07CgovKiAgTWluaW11bSBhbmQgTWF4aW11bSB2YWx1ZXMgZWFjaCB0eXBlIGNhbiBoYXZlLiAgICAgICAgICAgICAgKi8KLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCnptYXggdF9taW5bTUFYX1RZUEUrMV07Cnp1bWF4IHRfbWF4W01BWF9UWVBFKzFdOwp6dW1heCB0dV9tYXhbTUFYX1RZUEUrMV07CgovKiAgTmFtZXMgb2YgYWxsIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KY2hhciAqcmVnbmFtZXNbXT17Im5vcmVnIiwiZCIsIngiLCJ5Iiwic3AiLCJ1IiwiZC94In07CgovKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8Kem1heCByZWdzaXplW01BWFIrMV07CgovKiAgVHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4gKi8Kc3RydWN0IFR5cCAqcmVndHlwZVtNQVhSKzFdOwoKLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCi8qICBub3QgYmUgdXNlZCBieSB0aGUgY29tcGlsZXIgcGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwppbnQgcmVnc2FbTUFYUisxXTsKCi8qICBTcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIG1heSBiZSBzY3JhdGNoZWQgYnkgZnVuY3Rpb25zLiAgICAqLwppbnQgcmVnc2NyYXRjaFtNQVhSKzFdPXswLDEsMSwwLDEsMH07CgppbnQgcmVnX3ByaW9bTUFYUisxXT17MCwwLDEsMSwwLDB9OwoKc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZT17MH07CgovKiBOYW1lcyBvZiB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAgKi8KY2hhciAqZ19hdHRyX25hbWVbXT17Il9faW50ZXJydXB0IiwiX19kcGFnZSIsIl9fZmFyIiwwfTsKI2RlZmluZSBJTlRFUlJVUFQgMQojZGVmaW5lIERQQUdFICAgICAyCiNkZWZpbmUgRkFSCQkJCTQKCmludCBNSU5BRERJMlA9Q0hBUjsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgU29tZSBwcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgbG9uZyBtYWxpZ25bTUFYX1RZUEUrMV09ICB7MSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMX07CnN0YXRpYyBsb25nIG1zaXpldGFiW01BWF9UWVBFKzFdPXswLDEsMSwyLDIsNCw0LDQsNCw0LDAsMiw0LDQsMCwwLDAsMiwwfTsKCnN0cnVjdCBUeXAgaXR5cD17U0hPUlR9LGx0eXA9e0xPTkd9OwoKI2RlZmluZSBEQVRBIDAKI2RlZmluZSBCU1MgMQojZGVmaW5lIENPREUgMgojZGVmaW5lIFJPREFUQSAzCiNkZWZpbmUgU1BFQ0lBTCA0CgpzdGF0aWMgaW50IHNlY3Rpb249LTEsbmV3b2JqLHNjbnQscHVzaGVkX2FjYzsKc3RhdGljIGNoYXIgKmNvZGVuYW1lPSJcdC50ZXh0XG4iLAogICAgICAgICAgICAqZGF0YW5hbWU9Ilx0LmRhdGFcbiIsCiAgICAgICAgICAgICpic3NuYW1lPSJcdC5zZWN0aW9uXHQuYnNzXG4iLAogICAgICAgICAgICAqcm9kYXRhbmFtZT0iXHQuc2VjdGlvblx0LnJvZGF0YVxuIjsKCiNkZWZpbmUgSU1NX0lORCAgMQojZGVmaW5lIFZBUl9JTkQgIDIKI2RlZmluZSBQT1NUX0lOQyAzCiNkZWZpbmUgUE9TVF9ERUMgNAojZGVmaW5lIFBSRV9JTkMgIDUKI2RlZmluZSBQUkVfREVDICA2CiNkZWZpbmUgQUNDX0lORCAgNwojZGVmaW5lIEtPTlNUSU5DIDgKCi8qICh1c2VyKXN0YWNrLXBvaW50ZXIsIHBvaW50ZXItdG1wLCBpbnQtdG1wOyByZXNlcnZlZCBmb3IgY29tcGlsZXIgKi8Kc3RhdGljIGludCBhY2M9MSxpeD0yLGl5PTMsc3A9NCxpdT01LGR4PTY7CnN0YXRpYyB2b2lkIHByKEZJTEUgKixzdHJ1Y3QgSUMgKik7CnN0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICosc3RydWN0IFZhciAqLGxvbmcpOwpzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICosbG9uZyk7CgpzdGF0aWMgY2hhciAqbWFycmF5W109eyJfX3NlY3Rpb24oeCx5KT1fX3ZhdHRyKFwic2VjdGlvbihcIiN4XCIsXCIjeVwiKVwiKSIsCgkJICAgICAgICJfX0hDMTJfXyIsCgkJICAgICAgICJfX1NJWkVfVF9JTlQ9MSIsCgkJICAgICAgICJfX2RpcmVjdD1fX3ZhdHRyKFwic2VjdGlvbihcXFwiZHBhZ2VcXFwiKVwiKSIsCgkJICAgICAgIDB9OwoKI2RlZmluZSBpc3JlZyh4KSAoKHAtPnguZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykKI2RlZmluZSBpc2NvbnN0KHgpICgocC0+eC5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCkKCnN0YXRpYyBsb25nIGxvZmYscm9mZixzdGFja29mZnNldCxub3Rwb3BwZWQsZG9udHBvcCxtYXhwdXNoZWQsc3RhY2s7CgpzdGF0aWMgY2hhciAqeF90W109eyI/IiwiIiwiYiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiJ9OwpzdGF0aWMgY2hhciAqY2NzW109eyJlcSIsIm5lIiwibHQiLCJnZSIsImxlIiwiZ3QifTsKc3RhdGljIGNoYXIgKnVjY3NbXT17ImVxIiwibmUiLCJsbyIsImhzIiwibHMiLCJoaSJ9OwpzdGF0aWMgY2hhciAqbG9naWNhbHNbXT17Im9yYSIsImVvciIsImFuZCJ9OwpzdGF0aWMgY2hhciAqZGN0W109eyIiLCIuYml0IiwiLmJ5dGUiLCIuMmJ5dGUiLCIuMmJ5dGUiLCIuNGJ5dGUiLCIuOGJ5dGUiLCIuNGJ5dGUiLCIuOGJ5dGUiLCIuOGJ5dGUiLAoJCSAgICAiKHZvaWQpIiwiLjJieXRlIiwiLjM0Ynl0ZSIsIi4zNGJ5dGUifTsKc3RhdGljIGNoYXIgKmlkcHJlZml4PSIiLCpsYWJwcmVmaXg9Ii5sIjsKc3RhdGljIGludCBleGl0X2xhYmVsLGhhdmVfZnJhbWU7CnN0YXRpYyBjaGFyICpyZXQ7CnN0YXRpYyBpbnQgc3RhY2tjaGVja2xhYmVsOwpzdGF0aWMgaW50IGZyYW1lX3VzZWQsc3RhY2tfdmFsaWQ7CnN0YXRpYyBpbnQgQ1BVPTY4MTI7CnN0YXRpYyBpbnQgcGNyZWwsZHJlbDsKc3RhdGljIGludCBza2lwX3JlbDsKc3RhdGljIGNoYXIgKmpzcmluc3Q9ImpzciI7CnN0YXRpYyBjaGFyICpqbXBpbnN0PSJqbXAiOwpzdGF0aWMgaW50IG5vZHgsbm91OwppbnQgc3dpdGNoc3ViczsKCnN0YXRpYyBpbnQgY2NfdDsKc3RhdGljIHN0cnVjdCBvYmogKmNjOwoKc3RhdGljIHN0cnVjdCBvYmogbW9iajsKCiNkZWZpbmUgU1RSX05FQVIgIm5lYXIiCiNkZWZpbmUgU1RSX0ZBUiAiZmFyIgojZGVmaW5lIFNUUl9IVUdFICJodWdlIgojZGVmaW5lIFNUUl9CQUREUiAiYmFkZHIiCgojZGVmaW5lIElTTlVMTCgpICh6bWVxdG8odm1heCxsMnptKDBMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpJiZ6bGRlcXRvKHZsZG91YmxlLGQyemxkKDAuMCkpKQojZGVmaW5lIElTTFdPUkQodCkgKCh0Jk5RKT09TE9OR3x8KHQmTlEpPT1GUE9JTlRFUnx8KHQmTlEpPT1IUE9JTlRFUnx8KHQmTlEpPT1GTE9BVCkKI2RlZmluZSBJU0hXT1JEKHQpICgodCZOUSk9PUlOVHx8KHQmTlEpPT1TSE9SVHx8KHQmTlEpPT1OUE9JTlRFUikKI2RlZmluZSBJU0NIV09SRCh0KSAoKHQmTlEpPT1DSEFSfHxJU0hXT1JEKHQpKQojZGVmaW5lIElTU1RBVElDKHYpICgodiktPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTnx8KHYpLT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpCiNkZWZpbmUgSVNCQUREUih2KSAoKHYpLT52dHlwLT5hdHRyJiZzdHJzdHIoU1RSX0JBRERSLCh2KS0+dnR5cC0+YXR0cikpCi8qRklYTUUqLwojZGVmaW5lIElTRkFSKHYpICgodiktPnZ0eXAtPmF0dHImJihzdHJzdHIoU1RSX0ZBUiwodiktPnZ0eXAtPmF0dHIpfHxzdHJzdHIoU1RSX0hVR0UsKHYpLT52dHlwLT5hdHRyKSkpCgojZGVmaW5lIElTQUNDKHgpICgoeCk9PWFjYykKI2RlZmluZSBJU1goeCkgKCh4KT09aXgpCiNkZWZpbmUgSVNZKHgpICgoeCk9PWl5KQojZGVmaW5lIElTVSh4KSAoKHgpPT1pdSkKI2RlZmluZSBJU0lEWCh4KSAoSVNYKHgpfHxJU1koeCl8fChJU1UoeCkmJkNQVSE9NjgxMikpCiNkZWZpbmUgSVNSQUNDKHgpIChpc3JlZyh4KSYmSVNBQ0MocC0+eC5yZWcpKQojZGVmaW5lIElTUlgoeCkgKGlzcmVnKHgpJiZJU1gocC0+eC5yZWcpKQojZGVmaW5lIElTUlkoeCkgKGlzcmVnKHgpJiZJU1kocC0+eC5yZWcpKQojZGVmaW5lIElTUlUoeCkgKGlzcmVnKHgpJiZJU1UocC0+eC5yZWcpKQojZGVmaW5lIElTUklEWCh4KSAoaXNyZWcoeCkmJklTSURYKHAtPngucmVnKSkKCiNkZWZpbmUgQ1BVT1BUICgoZ19mbGFnc1swXSZVU0VERkxBRyk/Z19mbGFnc192YWxbMF0ubDo2ODEyKQoKI2RlZmluZSBTUFVTSCh4KSAoQ1BVPT02ODEyPyJcdHBzaCIgeCAiXG4iOiJcdHBzaHNcdCIgeCAiXG4iKQojZGVmaW5lIFNQVVNIRCAgIChDUFU9PTY4MTI/Ilx0cHNoZFxuIjoiXHRwc2hzXHRiLGFcbiIpCiNkZWZpbmUgU1BVTEwoeCkgKENQVT09NjgxMj8iXHRwdWwiIHggIlxuIjoiXHRwdWxzXHQiIHggIlxuIikKI2RlZmluZSBTUFVMTEQgICAoQ1BVPT02ODEyPyJcdHB1bGRcbiI6Ilx0cHVsc1x0YSxiXG4iKQojZGVmaW5lIFNDTVAoeCkgIChDUFU9PTY4MTI/Ilx0Y3AiIHggIlx0IjoiXHRjbXAiIHggIlx0IikKI2RlZmluZSBTRVggICAgICAoQ1BVPT02ODEyPyJcdHNleFx0YixkXG4iOiJcdHNleFxuIikKCiNkZWZpbmUgU0dOMTYoeCkgKHptMmwoemkyem0oem0yemkobDJ6bSgobG9uZykoeCkpKSkpKQoKZW51bSBwZWVwZiB7IE5FRURTQU1FID0gMSwgUkVNT1ZFMVNUID0gMiwgQUxMT1dTRlggPSA0fTsKc3RydWN0IHBlZXBzIHtjaGFyICpzMSwqczIsKnI7ZW51bSBwZWVwZiBmbGFnczt9OwoKc3RhdGljIGludCBjaGVja19zZngoY2hhciAqcykKewogIGlmKCEqcykgcmV0dXJuIDA7CiAgcys9c3RybGVuKHMpLTE7CiAgaWYoKnM9PScrJ3x8KnM9PSctJykgcmV0dXJuIDE7CiAgaWYoKnMhPSdzJyYmKnMhPSd4JyYmKnMhPSd5JyYmKnMhPSd1JykgcmV0dXJuIDA7CiAgcy0tOwogIGlmKCpzIT0nLCcpIHJldHVybiAwOwogIHMtLTsKICBpZigqcz09JysnfHwqcz09Jy0nKSByZXR1cm4gMTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZXRzemZsYWcoY2hhciAqb3AsY2hhciByKQp7CiAgc3RhdGljIGNoYXIgKnpiW109eyJhZGNiIiwiYWRkYiIsImFuZGIiLCJhc2xiIiwiYXNyYiIsImNscmIiLCJjb21iIiwiZGVjYiIsImVvcmIiLCJpbmNiIiwKCQkibGRhYiIsImxkYiIsImxzbGIiLCJsc3JiIiwibmVnYiIsIm9yYiIsIm9yYWIiLCJyb2xiIiwicm9yYiIsInNiY2IiLAoJCSJzdGIiLCJzdGFiIiwic3ViYiIsInRzdGIifTsKICBzdGF0aWMgY2hhciAqemRbXT17ImFkZGQiLCJsZGQiLCJzZXgiLCJzdGQiLCJzdWJkIn07CgogIGludCBpOwoKICBpZihyPT0nYicpewogICAgZm9yKGk9MDtpPHNpemVvZih6Yikvc2l6ZW9mKCp6Yik7aSsrKQogICAgICBpZighc3RyY21wKG9wLHpiW2ldKSkKCXJldHVybiAxOwogIH0KICBpZihyPT0nZCcpewogICAgZm9yKGk9MDtpPHNpemVvZih6ZCkvc2l6ZW9mKCp6ZCk7aSsrKQogICAgICBpZighc3RyY21wKG9wLHpkW2ldKSkKCXJldHVybiAxOwogIH0KICBpZihyPT0neCcmJighc3RyY21wKG9wLCJsZWF4Iil8fCFzdHJjbXAob3AsImxkeCIpKSkgcmV0dXJuIDE7CiAgaWYocj09J3knJiYoIXN0cmNtcChvcCwibGVheSIpfHwhc3RyY21wKG9wLCJsZHkiKSkpIHJldHVybiAxOwogIGlmKENQVT09NjgxMil7CiAgICBpZihyPT0neCcmJighc3RyY21wKG9wLCJkZXgiKXx8IXN0cmNtcChvcCwiaW54IikpKSByZXR1cm4gMTsKICAgIGlmKHI9PSd5JyYmKCFzdHJjbXAob3AsImRleSIpfHwhc3RyY21wKG9wLCJpbnkiKSkpIHJldHVybiAxOwogIH0KICByZXR1cm4gMDsKfQoKaW50IGVtaXRfcGVlcGhvbGUodm9pZCkKewogIGludCBlbnRyaWVzLGksaix2MSx2MjsKICBjaGFyICphc21saW5lW0VNSVRfQlVGX0RFUFRIXTsKICBjaGFyIGJ1ZjFbMTAyNF0sYnVmMlsxMDI0XTsKICBjaGFyIG9wMVs4XSxvcDJbOF07CgoKICAvKiBUT0RPOiBhZGFwdCBiZXR0ZXIgKi8KICBzdGF0aWMgc3RydWN0IHBlZXBzIGVsaW1bXT17CiAgICAibGRhIiwic3RhIiwwLE5FRURTQU1FLAogICAgImxkYiIsInN0YiIsMCxORUVEU0FNRSwKICAgICJsZGFhIiwic3RhYSIsMCxORUVEU0FNRSwKICAgICJsZGFiIiwic3RhYiIsMCxORUVEU0FNRSwKICAgICJsZGQiLCJzdGQiLDAsTkVFRFNBTUUsCiAgICAibGR4Iiwic3R4IiwwLE5FRURTQU1FLAogICAgImxkeSIsInN0eSIsMCxORUVEU0FNRSwKICAgICJsZHUiLCJzdHUiLDAsTkVFRFNBTUUsCiAgICAic3RhIiwic3RhIiwwLE5FRURTQU1FLAogICAgInN0YiIsInN0YiIsMCxORUVEU0FNRSwKICAgICJzdGFhIiwic3RhYSIsMCxORUVEU0FNRSwKICAgICJzdGFiIiwic3RhYiIsMCxORUVEU0FNRSwKICAgICJzdGQiLCJzdGQiLDAsTkVFRFNBTUUsCiAgICAic3R4Iiwic3R4IiwwLE5FRURTQU1FLAogICAgInN0eSIsInN0eSIsMCxORUVEU0FNRSwKICAgICJzdHUiLCJzdHUiLDAsTkVFRFNBTUUsCiAgICAic3RhIiwibGRhIiwwLE5FRURTQU1FLAogICAgInN0YiIsImxkYiIsMCxORUVEU0FNRSwKICAgICJzdGFhIiwibGRhYSIsMCxORUVEU0FNRSwKICAgICJzdGFiIiwibGRhYiIsMCxORUVEU0FNRSwKICAgICJzdGQiLCJsZGQiLDAsTkVFRFNBTUUsCiAgICAic3R4IiwibGR4IiwwLE5FRURTQU1FLAogICAgInN0eSIsImxkeSIsMCxORUVEU0FNRSwKICAgICJzdHUiLCJsZHUiLDAsTkVFRFNBTUUsCiNpZiAwCiAgICAibGRhIiwibGRhIiwwLFJFTU9WRTFTVCwKICAgICJsZGFhIiwibGRhYSIsMCxSRU1PVkUxU1QsCiAgICAibGRhYiIsImxkYWIiLDAsUkVNT1ZFMVNULAogICAgImxkYiIsImxkYiIsMCxSRU1PVkUxU1QsCiAgICAibGRkIiwibGRkIiwwLFJFTU9WRTFTVCwKICAgICJsZHgiLCJsZHgiLDAsUkVNT1ZFMVNULAogICAgImxkeSIsImxkeSIsMCxSRU1PVkUxU1QsCiAgICAibGR1IiwibGR1IiwwLFJFTU9WRTFTVCwKICAgICJsZGEiLCJwbGEiLDAsUkVNT1ZFMVNULAogICAgImxkYSIsInR4YSIsMCxSRU1PVkUxU1QsCiAgICAibGRhIiwidHlhIiwwLFJFTU9WRTFTVCwKICAgICJsZHgiLCJ0YXgiLDAsUkVNT1ZFMVNULAogICAgImxkeSIsInRheSIsMCxSRU1PVkUxU1QsCiAgICAidGF5IiwibGR5IiwwLFJFTU9WRTFTVCwKICAgICJ0YXgiLCJsZHgiLDAsUkVNT1ZFMVNULAogICAgInR4YSIsImxkYSIsMCxSRU1PVkUxU1QsCiAgICAidHlhIiwibGRhIiwwLFJFTU9WRTFTVCwKI2VuZGlmCiAgfTsKCgogIGk9ZW1pdF9sOwogIGlmKGVtaXRfZj09MCkKICAgIGVudHJpZXM9aS1lbWl0X2YrMTsKICBlbHNlCiAgICBlbnRyaWVzPUVNSVRfQlVGX0RFUFRIOwogIGFzbWxpbmVbMF09ZW1pdF9idWZmZXJbaV07CiAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09MiYmIXN0cmNtcChvcDEsImNtcGIiKSYmIXN0cmNtcChidWYxLCIjMCIpKQogICAgc3RyY3B5KGFzbWxpbmVbMF0sIlx0dHN0YlxuIik7CiAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09MiYmIXN0cmNtcChvcDEsImNtcGQiKSYmIXN0cmNtcChidWYxLCIjMCIpKQogICAgc3RyY3B5KGFzbWxpbmVbMF0sIlx0c3ViZFx0IzBcbiIpOwoKICBpZihlbnRyaWVzPj0yKXsKICAgIGktLTsKICAgIGlmKGk8MCkgaT1FTUlUX0JVRl9ERVBUSC0xOwogICAgYXNtbGluZVsxXT1lbWl0X2J1ZmZlcltpXTsKCiAgICBmb3Ioaj0wO2o8c2l6ZW9mKGVsaW0pL3NpemVvZihlbGltWzBdKTtqKyspewogICAgICBpZihlbGltW2pdLmZsYWdzJk5FRURTQU1FKXsKCWlmKHNzY2FuZihhc21saW5lWzBdLCIgJTZzICU5OTlzIixvcDIsYnVmMik9PTImJgoJICAgc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09MiYmCgkgICAhc3RyY21wKG9wMSxlbGltW2pdLnMxKSYmIXN0cmNtcChvcDIsZWxpbVtqXS5zMikmJgoJICAgIXN0cmNtcChidWYxLGJ1ZjIpKXsKCSAgaWYoIWNoZWNrX3NmeChidWYxKSYmIWNoZWNrX3NmeChidWYyKSl7CgkgICAgaWYoZWxpbVtqXS5yKXsKCSAgICAgIHN0cmNweShhc21saW5lWzBdLGVsaW1bal0ucik7CgkgICAgfWVsc2V7CgkgICAgICBpZihlbGltW2pdLmZsYWdzJlJFTU9WRTFTVCkKCQlzdHJjcHkoYXNtbGluZVsxXSxhc21saW5lWzBdKTsKCSAgICAgIHJlbW92ZV9hc20oKTsKCSAgICB9CgkgICAgcmV0dXJuIDE7CgkgIH0KCX0KICAgICAgfWVsc2V7CgkqYnVmMT0wOypidWYyPTA7CglpZihzc2NhbmYoYXNtbGluZVsxXSwiICU2cyAlOTk5cyIsb3AxLGJ1ZjEpPj0xJiYKCSAgIHNzY2FuZihhc21saW5lWzBdLCIgJTZzICU5OTlzIixvcDIsYnVmMik+PTEmJgoJICAgIXN0cmNtcChvcDEsZWxpbVtqXS5zMSkmJiFzdHJjbXAob3AyLGVsaW1bal0uczIpKXsKCSAgaWYoKGVsaW1bal0uZmxhZ3MmQUxMT1dTRlgpfHwoIWNoZWNrX3NmeChidWYxKSYmIWNoZWNrX3NmeChidWYyKSkpewoJICAgIGlmKGVsaW1bal0uZmxhZ3MmUkVNT1ZFMVNUKQoJICAgICAgc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CgkgICAgcmVtb3ZlX2FzbSgpOwoJICAgIHJldHVybiAxOwoJICB9Cgl9CiAgICAgIH0KICAgIH0KCiAgICBpZighc3RyY21wKGFzbWxpbmVbMF0sIlx0cnRzXG4iKSYmc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09MiYmIXN0cmNtcChvcDEsInB1bHMiKSl7CiAgICAgIHNwcmludGYoYXNtbGluZVsxXStzdHJsZW4oYXNtbGluZVsxXSktMSwiLHBjXG4iKTsKICAgICAgcmVtb3ZlX2FzbSgpOwogICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBpZighc3RyY21wKGFzbWxpbmVbMF0sIlx0c3RiXHQwLHNcbiIpJiYhc3RyY21wKGFzbWxpbmVbMV0sIlx0bGVhc1x0LTEsc1xuIikpewogICAgICBzdHJjcHkoYXNtbGluZVsxXSwiXHRwc2hzXHRiXG4iKTsKICAgICAgcmVtb3ZlX2FzbSgpOwogICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBpZighc3RyY21wKGFzbWxpbmVbMF0sIlx0c3RkXHQwLHNcbiIpJiYhc3RyY21wKGFzbWxpbmVbMV0sIlx0bGVhc1x0LTIsc1xuIikpewogICAgICBzdHJjcHkoYXNtbGluZVsxXSwiXHRwc2hzXHRiLGFcbiIpOwogICAgICByZW1vdmVfYXNtKCk7CiAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHRsZGJcdDAsc1xuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHRwc2hzXHRiXG4iKSl7CiAgICAgIHJlbW92ZV9hc20oKTsKICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdGxkZFx0MCxzXG4iKSYmIXN0cmNtcChhc21saW5lWzFdLCJcdHBzaHNcdGIsYVxuIikpewogICAgICByZW1vdmVfYXNtKCk7CiAgICAgIHJldHVybiAxOwogICAgfQoKICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHRwc2hzXHRiLGFcbiIpJiYhc3RyY21wKGFzbWxpbmVbMV0sIlx0cHVsc1x0YSxiXG4iKSl7CiAgICAgIHN0cmNweShhc21saW5lWzFdLCJcdGxkZFx0MCxzXG4iKTsKICAgICAgcmVtb3ZlX2FzbSgpOwogICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBpZihzc2NhbmYoYXNtbGluZVsxXSwiIGxkZCAlOTk5cyIsb3AxKT49MSYmc3NjYW5mKGFzbWxpbmVbMF0sIiBsZGQgJTk5OXMiLG9wMik+PTEpewogICAgICBpZighKChvcDJbMF09PSdhJ3x8b3AyWzBdPT0nYid8fG9wMlswXT09J2QnKSYmb3AyWzFdPT0nLCcpKXsKCXN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOwoJcmVtb3ZlX2FzbSgpOwoJcmV0dXJuIDE7CiAgICAgIH0KICAgIH0KCiAgICBpZighc3RyY21wKGFzbWxpbmVbMF0sIlx0dGZyXHR4LGRcbiIpJiYhc3RyY21wKGFzbWxpbmVbMV0sIlx0dGZyXHRkLHhcbiIpKXsKICAgICAgcmVtb3ZlX2FzbSgpOwogICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHR0ZnJcdHksZFxuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHR0ZnJcdGQseVxuIikpewogICAgICByZW1vdmVfYXNtKCk7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdHN0ZFx0MCxzcFxuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHRwc2hkXG4iKSl7CiAgICAgIHJlbW92ZV9hc20oKTsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZighc3RyY21wKGFzbWxpbmVbMF0sIlx0bGRkXHQwLHNwXG4iKSYmIXN0cmNtcChhc21saW5lWzFdLCJcdHBzaGRcbiIpKXsKICAgICAgcmVtb3ZlX2FzbSgpOwogICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBpZihzc2NhbmYoYXNtbGluZVswXSwiIGxlYXMgJWQscyIsJnYxKT09MSYmc3NjYW5mKGFzbWxpbmVbMV0sIiBsZWFzICVkLHMiLCZ2Mik9PTEpewogICAgICBzcHJpbnRmKGFzbWxpbmVbMV0sIlx0bGVhc1x0JWxkLHNcbiIsU0dOMTYodjErdjIpKTsKICAgICAgcmVtb3ZlX2FzbSgpOwogICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBpZihDUFUhPTY4MTImJnNzY2FuZihhc21saW5lWzBdLCIgdGZyICVjLCVjIixidWYxLGJ1ZjIpPT0yKXsKICAgICAgaWYoKCpidWYxPT0neCd8fCpidWYxPT0neSd8fCpidWYxPT0ndSd8fCpidWYxPT0ncycpJiYKCSAoKmJ1ZjI9PSd4J3x8KmJ1ZjI9PSd5J3x8KmJ1ZjI9PSd1J3x8KmJ1ZjI9PSdzJykpewoJc3ByaW50Zihhc21saW5lWzBdLCJcdGxlYSVjXHQsJWNcbiIsKmJ1ZjIsKmJ1ZjEpOwogICAgICB9CiAgICB9CiAgICBpZihDUFU9PTY4MTImJighc3RyY21wKGFzbWxpbmVbMV0sIlx0ZGV4XG4iKXx8IXN0cmNtcChhc21saW5lWzFdLCJcdGRleVxuIil8fCFzdHJjbXAoYXNtbGluZVsxXSwiXHRzdWJkXHQjMVxuIikpJiYKICAgICAgICghc3RybmNtcChhc21saW5lWzBdLCJcdGJuZVx0Iiw1KXx8IXN0cm5jbXAoYXNtbGluZVswXSwiXHRiZXFcdCIsNSkpKXsKICAgICAgY2hhciByPWFzbWxpbmVbMV1bM107CiAgICAgIGlmKHI9PSdiJykgcj0nZCc7CiAgICAgIHN0cmNweShhc21saW5lWzFdLCJcdGQiKTsKICAgICAgc3RybmNweShhc21saW5lWzFdKzIsYXNtbGluZVswXSsxLDQpOwogICAgICBhc21saW5lWzFdWzZdPXI7YXNtbGluZVsxXVs3XT0nLCc7CiAgICAgIHN0cmNweShhc21saW5lWzFdKzgsYXNtbGluZVswXSs1KTsKICAgICAgcmVtb3ZlX2FzbSgpOwogICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmKENQVT09NjgxMiYmKCFzdHJjbXAoYXNtbGluZVsxXSwiXHRpbnhcbiIpfHwhc3RyY21wKGFzbWxpbmVbMV0sIlx0aW55XG4iKXx8IXN0cmNtcChhc21saW5lWzFdLCJcdGFkZGRcdCMxXG4iKSkmJgogICAgICAgKCFzdHJuY21wKGFzbWxpbmVbMF0sIlx0Ym5lXHQiLDUpfHwhc3RybmNtcChhc21saW5lWzBdLCJcdGJlcVx0Iiw1KSkpewogICAgICBjaGFyIHI9YXNtbGluZVsxXVszXTsKICAgICAgc3RyY3B5KGFzbWxpbmVbMV0sIlx0aSIpOwogICAgICBzdHJuY3B5KGFzbWxpbmVbMV0rMixhc21saW5lWzBdKzEsNCk7CiAgICAgIGFzbWxpbmVbMV1bNl09cjthc21saW5lWzFdWzddPScsJzsKICAgICAgc3RyY3B5KGFzbWxpbmVbMV0rOCxhc21saW5lWzBdKzUpOwogICAgICByZW1vdmVfYXNtKCk7CiAgICAgIHJldHVybiAxOwogICAgfQogIH0KICBpZihlbnRyaWVzPj0zKXsKICAgIGktLTsKICAgIGlmKGk8MCkgaT1FTUlUX0JVRl9ERVBUSC0xOwogICAgYXNtbGluZVsyXT1lbWl0X2J1ZmZlcltpXTsKICAgIGlmKHNzY2FuZihhc21saW5lWzBdLCIgJTZzICU5OTlzIixvcDEsYnVmMSk9PTIpewogICAgICBpZighc3RyY21wKG9wMSwiYmVxIil8fCFzdHJjbXAob3AxLCJibmUiKSl7CglpZighc3RyY21wKGFzbWxpbmVbMV0sIlx0dHN0YlxuIil8fCFzdHJjbXAoYXNtbGluZVsxXSwiXHRjcGJcdCMwXG4iKSl7CgkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzICU5OTlzIixvcDIsYnVmMik+PTEmJgoJICAgICBzZXRzemZsYWcob3AyLCdiJykpewoJICAgIHN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOwoJICAgIHJlbW92ZV9hc20oKTsKCSAgICByZXR1cm4gMTsKCSAgfQoJfQoJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCgkgICAoIXN0cmNtcChvcDIsInN1YmQiKXx8IXN0cmNtcChvcDIsImNwZCIpKSYmIXN0cmNtcChidWYyLCIjMCIpKXsKCSAgaWYoc3NjYW5mKGFzbWxpbmVbMl0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT49MSYmCgkgICAgIHNldHN6ZmxhZyhvcDIsJ2QnKSl7CgkgICAgc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CgkgICAgcmVtb3ZlX2FzbSgpOwoJICAgIHJldHVybiAxOwoJICB9Cgl9CglpZihzc2NhbmYoYXNtbGluZVsxXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPT0yJiYKCSAgICFzdHJjbXAob3AyLChDUFU9PTY4MTIpPyJjcHgiOiJjbXB4IikmJiFzdHJjbXAoYnVmMiwiIzAiKSl7CgkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzICU5OTlzIixvcDIsYnVmMik+PTEmJgoJICAgICBzZXRzemZsYWcob3AyLCd4JykpewoJICAgIHN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOwoJICAgIHJlbW92ZV9hc20oKTsKCSAgICByZXR1cm4gMTsKCSAgfQoJfQoJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCgkgICAhc3RyY21wKG9wMiwoQ1BVPT02ODEyKT8iY3B5IjoiY21weSIpJiYhc3RyY21wKGJ1ZjIsIiMwIikpewoJICBpZihzc2NhbmYoYXNtbGluZVsyXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPj0xJiYKCSAgICAgc2V0c3pmbGFnKG9wMiwneScpKXsKCSAgICBzdHJjcHkoYXNtbGluZVsxXSxhc21saW5lWzBdKTsKCSAgICByZW1vdmVfYXNtKCk7CgkgICAgcmV0dXJuIDE7CgkgIH0KCX0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBzcGVjaWFsX3NlY3Rpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQp7CiAgY2hhciAqc2VjOwogIGlmKHYtPnRhdHRyJkRQQUdFKXsKICAgIGVtaXQoZiwiXHQuc2VjdGlvblx0LmRwYWdlXG4iKTsKICB9ZWxzZXsKICAgIGlmKCF2LT52YXR0cikgcmV0dXJuIDA7CiAgICBzZWM9c3Ryc3RyKHYtPnZhdHRyLCJzZWN0aW9uKCIpOwogICAgaWYoIXNlYykgcmV0dXJuIDA7CiAgICBzZWMrPXN0cmxlbigic2VjdGlvbigiKTsKICAgIGVtaXQoZiwiXHQuc2VjdGlvblx0Iik7CiAgICB3aGlsZSgqc2VjJiYqc2VjIT0nKScpIGVtaXRfY2hhcihmLCpzZWMrKyk7CiAgICBlbWl0KGYsIlxuIik7CiAgfQogIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKICByZXR1cm4gMTsKfQoKc3RhdGljIHN0cnVjdCBmcGNvbnN0bGlzdCB7CiAgICBzdHJ1Y3QgZnBjb25zdGxpc3QgKm5leHQ7CiAgICBpbnQgbGFiZWwsdHlwOwogICAgdW5pb24gYXR5cHMgdmFsOwp9ICpmaXJzdGZwYzsKCnN0YXRpYyBpbnQgYWRkZnBjb25zdChzdHJ1Y3Qgb2JqICpvLGludCB0KQp7CiAgc3RydWN0IGZwY29uc3RsaXN0ICpwPWZpcnN0ZnBjOwogIHQmPU5ROwogIGlmKGdfZmxhZ3NbNF0mVVNFREZMQUcpewogICAgZm9yKHA9Zmlyc3RmcGM7cDtwPXAtPm5leHQpewogICAgICBpZih0PT1wLT50eXApewoJZXZhbF9jb25zdCgmcC0+dmFsLHQpOwoJaWYodD09RkxPQVQmJnpsZGVxdG8odmxkb3VibGUsemYyemxkKG8tPnZhbC52ZmxvYXQpKSkgcmV0dXJuIHAtPmxhYmVsOwoJaWYodD09RE9VQkxFJiZ6bGRlcXRvKHZsZG91YmxlLHpkMnpsZChvLT52YWwudmRvdWJsZSkpKSByZXR1cm4gcC0+bGFiZWw7CglpZih0PT1MRE9VQkxFJiZ6bGRlcXRvKHZsZG91YmxlLG8tPnZhbC52bGRvdWJsZSkpIHJldHVybiBwLT5sYWJlbDsKICAgICAgfQogICAgfQogIH0KICBwPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgZnBjb25zdGxpc3QpKTsKICBwLT5uZXh0PWZpcnN0ZnBjOwogIHAtPmxhYmVsPSsrbGFiZWw7CiAgcC0+dHlwPXQ7CiAgcC0+dmFsPW8tPnZhbDsKICBmaXJzdGZwYz1wOwogIHJldHVybiBwLT5sYWJlbDsKfQoKaW50IHBvaW50ZXJfdHlwZShzdHJ1Y3QgVHlwICpwKQp7CiAgaWYoIXApIGllcnJvcigwKTsKICB3aGlsZSgocC0+ZmxhZ3MmTlEpPT1BUlJBWSkgcD1wLT5uZXh0OwogIGlmKChwLT5mbGFncyZOUSk9PUZVTktUKSB7CiAgCWlmKHAtPmF0dHIpCiAgICAJaWYoc3Ryc3RyKHAtPmF0dHIsU1RSX0ZBUikpIHJldHVybiBGUE9JTlRFUjsKICAJaWYgKHAtPmZsYWdzJkZBUikKICAJCXJldHVybiBGUE9JTlRFUjsKICAJcmV0dXJuIE5QT0lOVEVSOyAvKkZJWE1FOiBiYW5rZWQqLwogIH0KICBpZihwLT5hdHRyKXsKICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9IVUdFKSkgcmV0dXJuIEhQT0lOVEVSOwogICAgaWYoc3Ryc3RyKHAtPmF0dHIsU1RSX0ZBUikpIHJldHVybiBGUE9JTlRFUjsKICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9ORUFSKSkgcmV0dXJuIE5QT0lOVEVSOwogIH0KICAvKkZJWE1FKi8KICByZXR1cm4gTlBPSU5URVI7Cn0Kc3RhdGljIGxvbmcgdm9mZihzdHJ1Y3Qgb2JqICpwKQp7CiAgaWYoem0ybChwLT52LT5vZmZzZXQpPDApIAogICAgcmV0dXJuIGxvZmYtem0ybChwLT52LT5vZmZzZXQpK3ptMmwocC0+dmFsLnZtYXgpLXN0YWNrb2Zmc2V0KzE7CiAgZWxzZQogICAgcmV0dXJuIHptMmwocC0+di0+b2Zmc2V0KSt6bTJsKHAtPnZhbC52bWF4KS1zdGFja29mZnNldDsKfQoKc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KQovKiAgR2lidCBPYmpla3QgYXVmIEJpbGRzY2hpcm0gYXVzICAgICAgICAgICAgICAgICAgICAgICovCnsKICBpZihwLT5hbSl7CiAgICBpbnQgZmxhZ3M9cC0+YW0tPmZsYWdzOwogICAgaWYoZmxhZ3M9PUFDQ19JTkQpewogICAgICBlbWl0KGYsIiVzLCVzIixyZWduYW1lc1thY2NdLHJlZ25hbWVzW3AtPmFtLT5iYXNlXSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKGZsYWdzPT1LT05TVElOQyl7CiAgICAgIGV2YWxfY29uc3QoJnAtPnZhbCxwLT5hbS0+YmFzZSk7CiAgICAgIGlmKCh0Jk5RKT09Q0hBUil7Cgl2dW1heD16dW1yc2hpZnQodnVtYXgsYml0c3BlcmJ5dGUqMy1iaXRzcGVyYnl0ZSpwLT5hbS0+b2Zmc2V0KTsKCXZ1bWF4PXp1bWFuZCh2dW1heCx1bDJ6dW0odHVfbWF4W0NIQVJdKSk7CiAgICAgIH1lbHNlewoJdnVtYXg9enVtcnNoaWZ0KHZ1bWF4LGJpdHNwZXJieXRlKjItYml0c3BlcmJ5dGUqcC0+YW0tPm9mZnNldCk7Cgl2dW1heD16dW1hbmQodnVtYXgsdWwyenVtKHR1X21heFtTSE9SVF0pKTsKICAgICAgfQogICAgICBlbWl0KGYsIiMlbHUiLHp1bTJ1bCh2dW1heCkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZihmbGFnczxQT1NUX0lOQ3x8ZmxhZ3M+UFJFX0RFQ3x8Q1BVPT02ODEyKQogICAgICBlbWl0KGYsIiVsZCIscC0+YW0tPm9mZnNldCZ0dV9tYXhbU0hPUlRdKTsKICAgIGlmKHAtPmFtLT52KXsKICAgICAgaWYocC0+YW0tPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykKCWVtaXQoZiwiKyVzJWxkIixsYWJwcmVmaXgsem0ybChwLT5hbS0+di0+b2Zmc2V0KSk7CiAgICAgIGVsc2UKCWVtaXQoZiwiKyglcyVzKSIsaWRwcmVmaXgscC0+YW0tPnYtPmlkZW50aWZpZXIpOwogICAgfQogICAgZW1pdChmLCIsIik7CiAgICBpZihmbGFncz09UFJFX0lOQyl7CiAgICAgIGVtaXQoZiwiKyIpOwogICAgICBpZihwLT5hbS0+b2Zmc2V0PT0yJiZDUFUhPTY4MTIpIGVtaXQoZiwiKyIpOwogICAgfWVsc2UgaWYoZmxhZ3M9PVBSRV9ERUMpewogICAgICBlbWl0KGYsIi0iKTsKICAgICAgaWYocC0+YW0tPm9mZnNldD09MiYmQ1BVIT02ODEyKSBlbWl0KGYsIi0iKTsKICAgIH0KICAgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3AtPmFtLT5iYXNlXSk7CiAgICBpZihmbGFncz09UE9TVF9JTkMpewogICAgICBlbWl0KGYsIisiKTsKICAgICAgaWYocC0+YW0tPm9mZnNldD09MiYmQ1BVIT02ODEyKSBlbWl0KGYsIisiKTsKICAgIH1lbHNlIGlmKGZsYWdzPT1QT1NUX0RFQyl7CiAgICAgIGVtaXQoZiwiLSIpOwogICAgICBpZihwLT5hbS0+b2Zmc2V0PT0yJiZDUFUhPTY4MTIpIGVtaXQoZiwiLSIpOwogICAgfQogICAgcmV0dXJuOwogIH0KICBpZigocC0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09KEtPTlNUfERSRUZPQkopKXsKICAgIGVtaXR2YWwoZiwmcC0+dmFsLHAtPmR0eXAmTlUpOwogICAgcmV0dXJuOwogIH0KICBpZihwLT5mbGFncyZWQVJBRFIpIGVtaXQoZiwiIyIpOwogIGlmKChwLT5mbGFncyYoRFJFRk9CSnxSRUcpKT09KERSRUZPQkp8UkVHKSkgZW1pdChmLCIwLCIpOwogIGlmKChwLT5mbGFncyYoRFJFRk9CSnxSRUcpKT09RFJFRk9CSikgZW1pdChmLCJbIik7CiAgaWYoKHAtPmZsYWdzJihWQVJ8UkVHKSk9PVZBUil7CiAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CiAgICAgIGVtaXQoZiwiJWxkLCVzIix2b2ZmKHApLHJlZ25hbWVzW3NwXSk7CiAgICB9ZWxzZXsKICAgICAgaWYoIXptZXF0byhsMnptKDBMKSxwLT52YWwudm1heCkpewoJZW1pdChmLCIlbGQiLHptMmwoemkyem0oem0yemkocC0+dmFsLnZtYXgpKSkpOwoJZW1pdChmLCIrIik7CiAgICAgIH0KICAgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKXsKCWVtaXQoZiwiJXMlbGQiLGxhYnByZWZpeCx6bTJsKHAtPnYtPm9mZnNldCkpOwogICAgICB9ZWxzZXsKCWVtaXQoZiwiKCVzJXMpIixpZHByZWZpeCxwLT52LT5pZGVudGlmaWVyKTsKICAgICAgfQogICAgICBpZihwY3JlbCYmIShwLT5mbGFncyZWQVJBRFIpJiZJU0ZVTkMocC0+di0+dnR5cC0+ZmxhZ3MpKQoJZW1pdChmLCIscGMiKTsKICAgICAgaWYoZHJlbCYmIShwLT5mbGFncyZWQVJBRFIpJiYhSVNGVU5DKHAtPnYtPnZ0eXAtPmZsYWdzKSl7CglpZihDUFU9PTY4MTIpIGllcnJvcigwKTsKCWVtaXQoZiwiLCVzIixyZWduYW1lc1tpdV0pOwogICAgICB9CiAgICB9CiAgfQogIGlmKHAtPmZsYWdzJlJFRyl7CiAgICBpZihJU0FDQyhwLT5yZWcpJiYodCZOUSk9PUNIQVIpCiAgICAgIGVtaXQoZiwiYiIpOwogICAgZWxzZQogICAgICBlbWl0KGYsIiVzIixyZWduYW1lc1twLT5yZWddKTsKICB9CiAgaWYocC0+ZmxhZ3MmS09OU1QpewogICAgaWYoSVNGTE9BVCh0KSl7CiAgICAgIGVtaXQoZiwiJXMlZCIsbGFicHJlZml4LGFkZGZwY29uc3QocCx0KSk7CiAgICB9ZWxzZXsKICAgICAgZW1pdChmLCIjIik7ZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CiAgICB9CiAgfQogIGlmKChwLT5mbGFncyYoRFJFRk9CSnxSRUcpKT09RFJFRk9CSil7CiAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CiAgICAgIGlmKGlzX2NvbnN0KHAtPnYtPnZ0eXApKXsKCWlmKCFwY3JlbCYmQ1BVPT02ODEyKSBlbWl0KGYsIixwYyIpOwogICAgICB9ZWxzZXsKCWlmKCFkcmVsJiZDUFU9PTY4MTIpIGVtaXQoZiwiLHBjIik7CiAgICAgIH0KICAgIH0KICAgIGVtaXQoZiwiXSIpOwogIH0KfQoKc3RhdGljIHZvaWQgZHdhcmYyX3ByaW50X2ZyYW1lX2xvY2F0aW9uKEZJTEUgKmYsc3RydWN0IFZhciAqdikKewogIC8qRklYTUU6IG5lZWRzIGEgbG9jYXRpb24gbGlzdCBhbmQgY29ycmVjdCByZWdpc3RlciB0cmFuc2xhdGlvbiAqLwogIHN0cnVjdCBvYmogbzsKICBvLmZsYWdzPVJFRzsKICBvLnJlZz1zcDsKICBvLnZhbC52bWF4PWwyem0oMEwpOwogIG8udj0wOwogIGR3YXJmMl9wcmludF9sb2NhdGlvbihmLCZvKTsKfQpzdGF0aWMgaW50IGR3YXJmMl9yZWdudW1iZXIoaW50IHIpCnsKICAvKkZJWE1FOiBhbHdheXMgcmV0dXJucyBEIGFzIGFjY3VtdWxhdG9yLCBldmVuIGlmIGJ5dGUgc2l6ZSAqLwogIHN0YXRpYyBpbnQgZHdhcmZfcmVnc1tNQVhSKzFdPXstMSwzLDcsOCwxNX07CiAgcmV0dXJuIGR3YXJmX3JlZ3Nbcl07Cn0Kc3RhdGljIHptYXggZHdhcmYyX2Zib2Zmc2V0KHN0cnVjdCBWYXIgKnYpCnsKICAvKkZJWE1FKi8KICBpZighdnx8KHYtPnN0b3JhZ2VfY2xhc3MhPUFVVE8mJnYtPnN0b3JhZ2VfY2xhc3MhPVJFR0lTVEVSKSkgaWVycm9yKDApOwogIGlmKCF6bWxlcShsMnptKDBMKSx2LT5vZmZzZXQpKQogICAgcmV0dXJuIGwyem0oKGxvbmcpKGxvZmYtem0ybCh2LT5vZmZzZXQpKSk7CiAgZWxzZQogICAgcmV0dXJuIHYtPm9mZnNldDsKfSAKCi8qIHRlc3Qgb3BlcmFuZCBmb3IgbW92IGluc3RydWN0aW9uICovCnN0YXRpYyBpbnQgbW92X29wKHN0cnVjdCBvYmogKm8pCnsKICBsb25nIG9mZjsKICBpZihDUFUhPTY4MTIpIHJldHVybiAwOwogIGlmKG8tPmFtKXsKICAgIGludCBmPW8tPmFtLT5mbGFnczsKICAgIGlmKGY9PVBPU1RfSU5DfHxmPT1QUkVfSU5DfHxmPT1QT1NUX0RFQ3x8Zj09UFJFX0RFQ3x8Zj09QUNDX0lORCkKICAgICAgcmV0dXJuIDE7CiAgICBpZihmPT1JTU1fSU5EKXsKICAgICAgaWYoby0+YW0tPnYpIHJldHVybiAwOwogICAgICBvZmY9by0+YW0tPm9mZnNldDsKICAgICAgaWYob2ZmPj0tMjU2JiZvZmY8PTI1NSkKCXJldHVybiAxOwogICAgICBlbHNlCglyZXR1cm4gMDsKICAgIH0KICAgIGllcnJvcigwKTsKICB9CiAgaWYoby0+ZmxhZ3MmKEtPTlNUfFZBUkFEUikpIHJldHVybiAxOwogIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSkgcmV0dXJuIDE7CiAgaWYoKG8tPmZsYWdzJihWQVJ8UkVHfERSRUZPQkopKT09VkFSKXsKICAgIGlmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8by0+di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKQogICAgICByZXR1cm4gMTsKICAgIG9mZj12b2ZmKG8pOwogICAgaWYob2ZmPj0tMjU2JiZvZmY8PTI1NSkKICAgICAgcmV0dXJuIDE7CiAgICBlbHNlCiAgICAgIHJldHVybiAwOwogIH0KICByZXR1cm4gMDsKfQoKLyogYWRkIGFuIG9mZnNldCB0byBhbiBvYmplY3QgZGVzY3JpYmluZyBhIG1lbW9yeSBhZGRyZXNzICovCnN0YXRpYyB2b2lkIGluY19hZGRyKHN0cnVjdCBvYmogKm8sbG9uZyB2YWwsaW50IHQpCnsKICBpZihvLT5hbSl7CiAgICBpbnQgZj1vLT5hbS0+ZmxhZ3M7CiAgICBpZihmPT1JTU1fSU5EfHxmPT1LT05TVElOQykKICAgICAgby0+YW0tPm9mZnNldCs9dmFsOwogICAgZWxzZSBpZihmPT1QT1NUX0lOQ3x8Zj09UE9TVF9ERUN8fGY9PVBSRV9JTkN8fGY9PVBSRV9ERUMpewogICAgICBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKm9sZD1vLT5hbTsKICAgICAgby0+YW09bXltYWxsb2Moc2l6ZW9mKCpvLT5hbSkpOwogICAgICBvLT5hbS0+ZmxhZ3M9SU1NX0lORDsKICAgICAgby0+YW0tPmJhc2U9b2xkLT5iYXNlOwogICAgICBvLT5hbS0+dj0wOwogICAgICBpZihmPT1QT1NUX0RFQykgby0+YW0tPm9mZnNldD1vbGQtPm9mZnNldC12YWw7CiAgICAgIGVsc2UgaWYoZj09UE9TVF9JTkMpIG8tPmFtLT5vZmZzZXQ9LW9sZC0+b2Zmc2V0K3ZhbDsKICAgICAgZWxzZSBpZihmPT1QUkVfREVDKSBvLT5hbS0+b2Zmc2V0PXZhbDsKICAgICAgZWxzZSBvLT5hbS0+b2Zmc2V0PS12YWw7CiAgICB9ZWxzZQogICAgICBpZXJyb3IoMCk7CiAgfWVsc2UgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CiAgICBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOwogICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOwogICAgYW0tPmZsYWdzPUlNTV9JTkQ7CiAgICBpZighby0+cmVnKSBpZXJyb3IoMCk7CiAgICBhbS0+YmFzZT1vLT5yZWc7CiAgICBhbS0+b2Zmc2V0PXptMmwodmFsKTsKICAgIGFtLT52PTA7CiAgfWVsc2UgaWYoby0+ZmxhZ3MmS09OU1QpewogICAgc3RydWN0IEFkZHJlc3NpbmdNb2RlICphbTsKICAgIGlmKG8tPmFtKSBpZXJyb3IoMCk7CiAgICBvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CiAgICBhbS0+ZmxhZ3M9S09OU1RJTkM7CiAgICBhbS0+b2Zmc2V0PXptMmwodmFsKTsKICAgIGFtLT5iYXNlPXQ7CiAgfWVsc2V7CiAgICBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCx2YWwpOwogIH0KfQoKLyogcHVzaGVkIG9uIHRoZSBzdGFjayBieSBhIGNhbGxlZSwgbm8gcG9wIG5lZWRlZCAqLwpzdGF0aWMgdm9pZCBjYWxsZWVfcHVzaChsb25nIGwpCnsKICBpZihsLXN0YWNrb2Zmc2V0PnN0YWNrKQogICAgc3RhY2s9bC1zdGFja29mZnNldDsKfQpzdGF0aWMgdm9pZCBwdXNoKGxvbmcgbCkKewogIHN0YWNrb2Zmc2V0LT1sOwogIGlmKHN0YWNrb2Zmc2V0PG1heHB1c2hlZCkgbWF4cHVzaGVkPXN0YWNrb2Zmc2V0OwogIGlmKC1tYXhwdXNoZWQ+c3RhY2spIHN0YWNrPS1tYXhwdXNoZWQ7Cn0Kc3RhdGljIHZvaWQgcG9wKGxvbmcgbCkKewogIHN0YWNrb2Zmc2V0Kz1sOwp9CnN0YXRpYyB2b2lkIGdlbl9wb3AoRklMRSAqZixsb25nIGwpCnsKICBpZihsPT0wKSByZXR1cm47CiAgaWYobD09MSYmQ1BVPT02ODEyKXsKICAgIGVtaXQoZiwiXHRpbnNcbiIpOwojaWYgMCAvKiBtaWdodCBjbG9iYmVyIHJldHVybiByZWdpc3RlciAqLwogIH1lbHNlIGlmKGw9PTImJiFyZWdzW2FjY10pewogICAgZW1pdChmLFNQVUxMRCk7CiAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsYWNjKTsKICB9ZWxzZSBpZihsPT0yJiYhcmVnc1tpeF0pewogICAgZW1pdChmLFNQVUxMKCJ4IikpOwogICAgQlNFVChyZWdzX21vZGlmaWVkLGl4KTsKICB9ZWxzZSBpZihsPT0yJiYhcmVnc1tpeV0pewogICAgZW1pdChmLFNQVUxMKCJ5IikpOwogICAgQlNFVChyZWdzX21vZGlmaWVkLGl5KTsKI2VuZGlmCiAgfWVsc2V7CiAgICBlbWl0KGYsIlx0bGVhc1x0JXUsJXNcbiIsU0dOMTYobCkscmVnbmFtZXNbc3BdKTsKICB9CiAgcG9wKGwpOwp9CnN0YXRpYyB2b2lkIHByKEZJTEUgKmYsc3RydWN0IElDICpwKQp7CiAgaW50IHI7CiAgaWYocHVzaGVkX2FjYyl7CiAgICBlbWl0KGYsU1BVTExEKTsKICAgIHBvcCgyKTsKICAgIHB1c2hlZF9hY2M9MDsKICB9CiAgZm9yKHI9TUFYUjtyPj0xO3ItLSl7CiAgICBpZihyZWdzW3JdJjgpewogICAgICBlbWl0KGYsIlx0JXMlc1xuIixDUFU9PTY4MTI/InB1bCI6InB1bHNcdCIscmVnbmFtZXNbcl0pOwogICAgICBwb3AoMik7CiAgICB9CiAgICByZWdzW3JdJj1+MTI7CiAgfQp9CnN0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCi8qICBlcnpldWd0IEZ1bmt0aW9uc2tvcGYgICAgICAgICAgICAgICAgICAgICAgICovCnsKICBpbnQgaTsKICBlbWl0KGYsIiMgb2Zmc2V0PSVsZFxuIixvZmZzZXQpOwogIGhhdmVfZnJhbWU9MDtzdGFja192YWxpZD0xO3N0YWNrPTA7CiAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpJiZzZWN0aW9uIT1DT0RFKXtlbWl0KGYsY29kZW5hbWUpO2lmKGYpIHNlY3Rpb249Q09ERTt9CiAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKICAgIGlmKCh2LT5mbGFncyYoSU5MSU5FRlVOQ3xJTkxJTkVFWFQpKSE9SU5MSU5FRlVOQykKICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CiAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOwogIH1lbHNlewogICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CiAgfQogIHJvZmY9MDsKICBmb3IoaT1NQVhSO2k+MDtpLS0pewogICAgaWYocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSl7CiAgICAgIGhhdmVfZnJhbWU9MTsKICAgICAgbG9mZis9MjsKICAgICAgcm9mZis9MjsKICAgICAgaWYoaT09aXkpIGVtaXQoZixTUFVTSCgieSIpKTsKICAgICAgZWxzZSBpZihpPT1pdSl7CglpZihDUFUhPTY4MTImJnJlZ3VzZWRbaXldKXsKCSAgZW1pdChmLCJcdHBzaHNcdHUseVxuIik7CgkgIGxvZmYrPTI7cm9mZis9MjtpPWl5OwoJfWVsc2UKCSAgZW1pdChmLFNQVVNIKCJ1IikpOwogICAgICB9ZWxzZQoJaWVycm9yKDApOwogICAgfQogIH0KICBpZihzdGFja19jaGVjayl7CiAgICBzdGFja2NoZWNrbGFiZWw9KytsYWJlbDsKICAgIGVtaXQoZiwiXHRsZHlcdCMlcyVkXG4iLGxhYnByZWZpeCxzdGFja2NoZWNrbGFiZWwpOwogICAgLyogRklYTUU6IGJhbmtlZCAqLwogICAgZW1pdChmLCJcdCVzXHQlc19fc3RhY2tfY2hlY2tcbiIsanNyaW5zdCxpZHByZWZpeCk7CiAgfQogIGlmKG9mZnNldCl7CiAgICBpZihDUFU9PTY4MTImJm9mZnNldD09MSkKICAgICAgZW1pdChmLFNQVVNIKCJiIikpOwogICAgZWxzZSBpZihDUFU9PTY4MTImJm9mZnNldD09MikKICAgICAgZW1pdChmLFNQVVNIRCk7CiAgICBlbHNlCiAgICAgIGVtaXQoZiwiXHRsZWFzXHQlbGQsJXNcbiIsU0dOMTYoLW9mZnNldCkscmVnbmFtZXNbc3BdKTsKICAgIGhhdmVfZnJhbWU9MTsKICB9Cn0Kc3RhdGljIHZvaWQgZnVuY3Rpb25fYm90dG9tKEZJTEUgKmYsc3RydWN0IFZhciAqdixsb25nIG9mZnNldCkKLyogIGVyemV1Z3QgRnVua3Rpb25zZW5kZSAgICAgICAgICAgICAgICAgICAgICAgKi8KewogIGludCBpOwogIG9mZnNldC09cm9mZjsKICBpZihvZmZzZXQpewogICAgaWYob2Zmc2V0PT0xJiZDUFU9PTY4MTIpCiAgICAgIGVtaXQoZiwiXHRpbnNcbiIpOwogICAgZWxzZSBpZihvZmZzZXQ9PTImJkNQVT09NjgxMiYmIXptZXF0byhzem9mKHYtPnZ0eXAtPm5leHQpLGwyem0oNEwpKSkKICAgICAgZW1pdChmLFNQVUxMKCJ4IikpOwogICAgZWxzZSBpZihvZmZzZXQ9PTImJkNQVT09NjgxMiYmcmVndXNlZFtpeV0pCiAgICAgIGVtaXQoZixTUFVMTCgieSIpKTsKICAgIGVsc2UKICAgICAgZW1pdChmLCJcdGxlYXNcdCVsZCwlc1xuIixTR04xNihvZmZzZXQpLHJlZ25hbWVzW3NwXSk7CiAgfQogIGZvcihpPTE7aTw9TUFYUjtpKyspewogICAgaWYocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSl7CiAgICAgIGhhdmVfZnJhbWU9MTsKICAgICAgaWYoaT09aXkpewoJaWYoQ1BVIT02ODEyJiZyZWd1c2VkW2l1XSYmIXJlZ3NjcmF0Y2hbaXVdJiYhcmVnc2FbaXVdKXsKCSAgZW1pdChmLCJcdHB1bHNcdHUseVxuIik7CgkgIGk9aXU7Cgl9ZWxzZQoJICBlbWl0KGYsU1BVTEwoInkiKSk7CiAgICAgIH1lbHNlIGlmKGk9PWl1KSBlbWl0KGYsU1BVTEwoInUiKSk7CiAgICAgIGVsc2UKCWllcnJvcigwKTsKICAgIH0KICB9CiAgaWYocmV0KSBlbWl0KGYsIlx0JXNcbiIscmV0KTsKICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pewogICAgZW1pdChmLCJcdC50eXBlXHQlcyVzLEBmdW5jdGlvblxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlcywkLSVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKICB9ZWxzZXsKICAgIGVtaXQoZiwiXHQudHlwZVx0JXMlbGQsQGZ1bmN0aW9uXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOwogICAgZW1pdChmLCJcdC5zaXplXHQlcyVsZCwkLSVzJWxkXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCksbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CiAgfQogIGlmKHN0YWNrX2NoZWNrKQogICAgZW1pdChmLCJcdC5lcXVcdCVzJWQsJWxkXG4iLGxhYnByZWZpeCxzdGFja2NoZWNrbGFiZWwsb2Zmc2V0LW1heHB1c2hlZCk7CiAgaWYoc3RhY2tfdmFsaWQpewogICAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKICAgIHYtPmZpLT5mbGFnc3w9QUxMX1NUQUNLOwogICAgdi0+ZmktPnN0YWNrMT1sMnptKHN0YWNrK29mZnNldCk7CiAgICBlbWl0KGYsIiMgc3RhY2tzaXplPSVsZFxuIixzdGFjaytvZmZzZXQpOwogICAgZW1pdChmLCJcdC5lcXVcdCVzX19zdGFja18lcywlbGRcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcixzdGFjaytvZmZzZXQpOwogIH0KfQpzdGF0aWMgaW50IGNvbXBhcmVfb2JqZWN0cyhzdHJ1Y3Qgb2JqICpvMSxzdHJ1Y3Qgb2JqICpvMikKewogIGlmKG8xLT5mbGFncz09bzItPmZsYWdzJiZvMS0+YW09PW8yLT5hbSl7CiAgICBpZighKG8xLT5mbGFncyZWQVIpfHwobzEtPnY9PW8yLT52JiZ6bWVxdG8obzEtPnZhbC52bWF4LG8yLT52YWwudm1heCkpKXsKICAgICAgaWYoIShvMS0+ZmxhZ3MmUkVHKXx8bzEtPnJlZz09bzItPnJlZyl7CglyZXR1cm4gMTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gMDsKfQoKLypGSVhNRSovCnN0YXRpYyB2b2lkIGNsZWFyX2V4dF9pYyhzdHJ1Y3QgZXh0X2ljICpwKQp7CiAgcC0+ZmxhZ3M9MDsKICBwLT5yPTA7CiAgcC0+b2Zmc2V0PTA7Cn0Kc3RhdGljIGxvbmcgcG9mMih6dW1heCB4KQovKiAgWWllbGRzIGxvZzIoeCkrMSBvZGVyIDAuICovCnsKICB6dW1heCBwO2ludCBsbj0xOwogIHA9dWwyenVtKDFMKTsKICB3aGlsZShsbjw9MzImJnp1bWxlcShwLHgpKXsKICAgIGlmKHp1bWVxdG8oeCxwKSkgcmV0dXJuIGxuOwogICAgbG4rKztwPXp1bWFkZChwLHApOwogIH0KICByZXR1cm4gMDsKfQpzdGF0aWMgdm9pZCBwZWVwaG9sZShzdHJ1Y3QgSUMgKnApCnsKICBpbnQgYyxjMixyLHQ7c3RydWN0IElDICpwMjsKICBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOwogIHptYXggaW5jbWluLGluY21heDsKICBpZihDUFU9PTY4MTIpewogICAgaW5jbWluPWwyem0oLThMKTsKICAgIGluY21heD1sMnptKDhMKTsKICB9ZWxzZXsKICAgIGluY21pbj1sMnptKC0yTCk7CiAgICBpbmNtYXg9bDJ6bSgyTCk7CiAgfQogIGZyYW1lX3VzZWQ9MDsKICBmb3IoO3A7cD1wLT5uZXh0KXsKICAgIGM9cC0+Y29kZTsKICAgIGlmKCFmcmFtZV91c2VkKXsKICAgICAgaWYoKHAtPnExLmZsYWdzJihSRUd8VkFSKSk9PVZBUiYmIUlTU1RBVElDKHAtPnExLnYpKSBmcmFtZV91c2VkPTE7CiAgICAgIGlmKChwLT5xMi5mbGFncyYoUkVHfFZBUikpPT1WQVImJiFJU1NUQVRJQyhwLT5xMi52KSkgZnJhbWVfdXNlZD0xOwogICAgICBpZigocC0+ei5mbGFncyYoUkVHfFZBUikpPT1WQVImJiFJU1NUQVRJQyhwLT56LnYpKSBmcmFtZV91c2VkPTE7CiAgICB9CiAgICAvKiBsZXR6dGVzIExhYmVsIG1lcmtlbiAqLwogICAgaWYoYyE9RlJFRVJFRyYmYyE9QUxMT0NSRUcmJihjIT1TRVRSRVRVUk58fCFpc3JlZyhxMSl8fHAtPnExLnJlZyE9cC0+ei5yZWcpKSBleGl0X2xhYmVsPTA7CiAgICBpZihjPT1MQUJFTCkgZXhpdF9sYWJlbD1wLT50eXBmOwojaWYgMAogICAgLyogYW5kIHgsI2NvbnN0O2JuZS9iZXEsIEZJWE1FICovCiAgICBpZihjPT1BTkQmJmlzY29uc3QocTIpJiZpc3JlZyh6KSl7CiAgICAgIGxvbmcgYml0OwogICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZik7CiAgICAgIGlmKGJpdD1wb2YyKHZ1bWF4KSl7CglzdHJ1Y3QgSUMgKmNtcD0wO2ludCBmcj0wOwoJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpewoJICBjMj1wMi0+Y29kZTsKCSAgaWYoYzI9PVRFU1QpewoJICAgIGlmKChwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cC0+ei5yZWcpewoJICAgICAgY21wPXAyO2NvbnRpbnVlOwoJICAgIH0KCSAgfQoJICBpZihjMj09Q09NUEFSRSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1wLT56LnJlZyYmKHAyLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CgkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxwMi0+dHlwZik7CgkgICAgaWYoSVNOVUxMKCkpewoJICAgICAgY21wPXAyO2NvbnRpbnVlOwoJICAgIH0KCSAgICBicmVhazsKCSAgfQoJICBpZihjMj09RlJFRVJFRyYmcDItPnExLnJlZz09cC0+ei5yZWcpIHtmcisrO2NvbnRpbnVlO30KCSAgaWYoKGMyPT1CTkV8fGMyPT1CRVEpJiZjbXAmJmZyPT0xKXsKCSAgICBwLT5leHQuZmxhZ3M9RVhUX0lDX0JUU1Q7CgkgICAgcDItPmV4dC5mbGFncz1FWFRfSUNfQlRTVDsKCSAgICBwMi0+ZXh0Lm9mZnNldD1iaXQtMTsKCSAgICBjbXAtPmNvZGU9Tk9QOwoJICAgIGNtcC0+cTEuZmxhZ3M9Y21wLT5xMi5mbGFncz1jbXAtPnouZmxhZ3M9MDsKCSAgICBicmVhazsKCSAgfQoJICBpZigoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1wLT56LnJlZyl8fCgocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXAtPnoucmVnKXx8KChwMi0+ei5mbGFncyZSRUcpJiZwMi0+ei5yZWc9PXAtPnoucmVnKSkgYnJlYWs7CgkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7Cgl9CiAgICAgIH0KICAgIH0KI2VuZGlmCiAgICAvKiBUcnkgZCxpZHggKi8KICAgIGlmKGM9PUFEREkyUCYmSVNSQUNDKHEyKSYmSVNSSURYKHopJiYoSVNSSURYKHExKXx8cC0+cTIucmVnIT1wLT56LnJlZykpewogICAgICBpbnQgYmFzZSxpZHg7c3RydWN0IG9iaiAqbzsKICAgICAgcj1wLT56LnJlZztpZHg9cC0+cTIucmVnOwogICAgICBpZihpc3JlZyhxMSkpIGJhc2U9cC0+cTEucmVnOyBlbHNlIGJhc2U9cjsKICAgICAgbz0wOwogICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CiAgICAgICAgYzI9cDItPmNvZGU7CiAgICAgICAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKICAgICAgICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKICAgICAgICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTIucmVnPT1yKSBicmVhazsKICAgICAgICBpZigocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1pZHgmJmlkeCE9cikgYnJlYWs7CgkKICAgICAgICBpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8pewogICAgICAgICAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CiAgICAgICAgICAgIGlmKG98fCFJU0NIV09SRChxMXR5cChwMikpKSBicmVhazsKICAgICAgICAgICAgbz0mcDItPnExOwogICAgICAgICAgfQogICAgICAgICAgaWYoIXAyLT5xMi5hbSYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnEyLnJlZz09cil7CgkgICAgYnJlYWs7IC8qVE9ETzogY2hlY2sgd2hhdCBpcyBwb3NzaWJsZSAqLwogICAgICAgICAgICBpZihvfHwhSVNDSFdPUkQocTJ0eXAocDIpKSkgYnJlYWs7CiAgICAgICAgICAgIG89JnAyLT5xMjsKICAgICAgICAgIH0KICAgICAgICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpewoJICAgIGJyZWFrOyAvKlRPRE86IGNoZWNrIHdoYXQgaXMgcG9zc2libGUgKi8KICAgICAgICAgICAgaWYob3x8IUlTQ0hXT1JEKHp0eXAocDIpKSkgYnJlYWs7CiAgICAgICAgICAgIG89JnAyLT56OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihjMj09RlJFRVJFR3x8KHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpewogICAgICAgICAgaW50IG07CiAgICAgICAgICBpZihjMj09RlJFRVJFRykKICAgICAgICAgICAgbT1wMi0+cTEucmVnOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBtPXAyLT56LnJlZzsKICAgICAgICAgIGlmKG09PXIpewogICAgICAgICAgICBpZihvKXsKICAgICAgICAgICAgICBvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CiAgICAgICAgICAgICAgYW0tPmZsYWdzPUFDQ19JTkQ7CiAgICAgICAgICAgICAgYW0tPmJhc2U9YmFzZTsKCSAgICAgIGlmKGlkeCE9YWNjKSBpZXJyb3IoMCk7CiAgICAgICAgICAgICAgYW0tPm9mZnNldD1pZHg7CgkgICAgICBpZihpc3JlZyhxMSkpewoJCXAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOwoJICAgICAgfWVsc2V7CgkJcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wOwoJCXAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07CgkgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CgkgIGNvbnRpbnVlOwoJfQoJLyogYmV0dGVyIG5vIGluc3RydWN0aW9ucyBiZXR3ZWVuLCBhY2N1IHVzZWQgdG9vIG11Y2ggKi8KCWlmKGMyIT1GUkVFUkVHJiZjMiE9QUxMT0NSRUcmJiFvKSBicmVhazsKICAgICAgfQogICAgfQogICAgLyogUE9TVF9JTkMvREVDIGluIHExICovCiAgICBpZighcC0+cTEuYW0mJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSl7CiAgICAgIHI9cC0+cTEucmVnOyB0PXExdHlwKHApOwogICAgICBpZihJU0NIV09SRCh0KSYmSVNJRFgocikmJighKHAtPnEyLmZsYWdzJlJFRyl8fHAtPnEyLnJlZyE9cikmJighKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWchPXIpKXsKCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKCSAgYzI9cDItPmNvZGU7CgkgIGlmKChjMj09QUREfHxjMj09QURESTJQfHwoQ1BVPT02ODEyJiYoYzI9PVNVQnx8YzI9PVNVQklGUCkpKSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmcDItPnoucmVnPT1yJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKCSAgICBldmFsX2NvbnN0KCZwMi0+cTIudmFsLHAyLT50eXBmMik7CgkgICAgaWYoYzI9PVNVQnx8YzI9PVNVQklGUCkgdm1heD16bXN1YihsMnptKDBMKSx2bWF4KTsKCSAgICBpZih6bWxlcSh2bWF4LGluY21heCkmJnptbGVxKGluY21pbix2bWF4KSl7CgkgICAgICBwMi0+Y29kZT1OT1A7CgkgICAgICBwMi0+cTEuZmxhZ3M9cDItPnEyLmZsYWdzPXAyLT56LmZsYWdzPTA7CgkgICAgICBwLT5xMS5hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CgkgICAgICBwLT5xMS5hbS0+YmFzZT1yOwoJICAgICAgcC0+cTEuYW0tPnY9MDsKCSAgICAgIGlmKHptbGVxKHZtYXgsbDJ6bSgwTCkpKXsKCQlwLT5xMS5hbS0+ZmxhZ3M9UE9TVF9ERUM7CgkJcC0+cTEuYW0tPm9mZnNldD0tem0ybCh2bWF4KTsKCSAgICAgIH1lbHNlewoJCXAtPnExLmFtLT5mbGFncz1QT1NUX0lOQzsKCQlwLT5xMS5hbS0+b2Zmc2V0PXptMmwodm1heCk7CgkgICAgICB9CgkgICAgfWVsc2UgYnJlYWs7CgkgIH0KCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKCSAgaWYoKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cil8fCgocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXIpfHwoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikpIGJyZWFrOwoJfQogICAgICB9CiAgICB9CiAgICAvKiBQT1NUX0lOQy9ERUMgaW4gcTIgKi8KICAgIGlmKCFwLT5xMi5hbSYmKHAtPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKICAgICAgcj1wLT5xMi5yZWc7IHQ9cTJ0eXAocCk7CiAgICAgIGlmKElTQ0hXT1JEKHQpJiZJU0lEWChyKSYmKCEocC0+cTEuZmxhZ3MmUkVHKXx8cC0+cTEucmVnIT1yKSYmKCEocC0+ei5mbGFncyZSRUcpfHxwLT56LnJlZyE9cikpewoJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpewoJICBjMj1wMi0+Y29kZTsKCSAgaWYoKGMyPT1BRER8fGMyPT1BRERJMlB8fChDUFU9PTY4MTImJihjMj09U1VCfHxjMj09U1VCSUZQKSkpJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yJiZwMi0+ei5yZWc9PXImJihwMi0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpewoJICAgIGV2YWxfY29uc3QoJnAyLT5xMi52YWwscDItPnR5cGYyKTsKCSAgICBpZihjMj09U1VCfHxjMj09U1VCSUZQKSB2bWF4PXptc3ViKGwyem0oMEwpLHZtYXgpOwoJICAgIGlmKHptbGVxKHZtYXgsaW5jbWF4KSYmem1sZXEoaW5jbWluLHZtYXgpKXsKCSAgICAgIHAyLT5jb2RlPU5PUDsKCSAgICAgIHAyLT5xMS5mbGFncz1wMi0+cTIuZmxhZ3M9cDItPnouZmxhZ3M9MDsKCSAgICAgIHAtPnEyLmFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKCSAgICAgIHAtPnEyLmFtLT5iYXNlPXI7CgkgICAgICBwLT5xMi5hbS0+dj0wOwoJICAgICAgaWYoem1sZXEodm1heCxsMnptKDBMKSkpewoJCXAtPnEyLmFtLT5mbGFncz1QT1NUX0RFQzsKCQlwLT5xMi5hbS0+b2Zmc2V0PS16bTJsKHZtYXgpOwoJICAgICAgfWVsc2V7CgkJcC0+cTIuYW0tPmZsYWdzPVBPU1RfSU5DOwoJCXAtPnEyLmFtLT5vZmZzZXQ9em0ybCh2bWF4KTsKCSAgICAgIH0KCSAgICB9ZWxzZSBicmVhazsKCSAgfQoJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOwoJICBpZigoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1yKXx8KChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cil8fCgocDItPnouZmxhZ3MmUkVHKSYmcDItPnoucmVnPT1yKSkgYnJlYWs7Cgl9CiAgICAgIH0KICAgIH0KICAgIC8qIFBPU1RfSU5DL0RFQyBpbiB6ICovCiAgICBpZighcC0+ei5hbSYmKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikpewogICAgICByPXAtPnoucmVnOyB0PXp0eXAocCk7CiAgICAgIGlmKElTQ0hXT1JEKHQpJiZJU0lEWChyKSYmKCEocC0+cTEuZmxhZ3MmUkVHKXx8cC0+cTEucmVnIT1yKSYmKCEocC0+cTIuZmxhZ3MmUkVHKXx8cC0+cTIucmVnIT1yKSl7Cglmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CgkgIGMyPXAyLT5jb2RlOwoJICBpZigoYzI9PUFERHx8YzI9PUFEREkyUHx8KENQVT09NjgxMiYmKGMyPT1TVUJ8fGMyPT1TVUJJRlApKSkmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXImJnAyLT56LnJlZz09ciYmKHAyLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CgkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxwMi0+dHlwZjIpOwoJICAgIGlmKGMyPT1TVUJ8fGMyPT1TVUJJRlApIHZtYXg9em1zdWIobDJ6bSgwTCksdm1heCk7CgkgICAgaWYoem1sZXEodm1heCxpbmNtYXgpJiZ6bWxlcShpbmNtaW4sdm1heCkpewoJICAgICAgcDItPmNvZGU9Tk9QOwoJICAgICAgcDItPnExLmZsYWdzPXAyLT5xMi5mbGFncz1wMi0+ei5mbGFncz0wOwoJICAgICAgcC0+ei5hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CgkgICAgICBwLT56LmFtLT5iYXNlPXI7CgkgICAgICBwLT56LmFtLT52PTA7CgkgICAgICBpZih6bWxlcSh2bWF4LGwyem0oMEwpKSl7CgkJcC0+ei5hbS0+ZmxhZ3M9UE9TVF9ERUM7CgkJcC0+ei5hbS0+b2Zmc2V0PS16bTJsKHZtYXgpOwoJICAgICAgfWVsc2V7CgkJcC0+ei5hbS0+ZmxhZ3M9UE9TVF9JTkM7CgkJcC0+ei5hbS0+b2Zmc2V0PXptMmwodm1heCk7CgkgICAgICB9CgkgICAgfWVsc2UgYnJlYWs7CgkgIH0KCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKCSAgaWYoKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cil8fCgocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXIpfHwoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikpIGJyZWFrOwoJfQogICAgICB9CiAgICB9CgogICAgLyogUiwjYyAqLwogICAgaWYoKGM9PUFEREkyUHx8Yz09U1VCSUZQKSYmSVNIV09SRChwLT50eXBmKSYmKChwLT50eXBmMiZOUSk9PU5QT0lOVEVSfHwocC0+dHlwZjImTlEpPT1GUE9JTlRFUikmJmlzcmVnKHopJiYoKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUfHwoIWRyZWwmJihwLT5xMS5mbGFncyZWQVJBRFIpKSkpewogICAgICBpbnQgYmFzZTt6bWF4IG9mO3N0cnVjdCBvYmogKm87c3RydWN0IFZhciAqdjsKICAgICAgaWYocC0+cTEuZmxhZ3MmVkFSQURSKXsKCXY9cC0+cTEudjsKCW9mPXAtPnExLnZhbC52bWF4OwoJcj1wLT56LnJlZzsKCWlmKGlzcmVnKHEyKSYmSVNJRFgocC0+cTIucmVnKSkKCSAgYmFzZT1wLT5xMi5yZWc7CgllbHNlCgkgIGJhc2U9cjsKICAgICAgfWVsc2V7CglldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZik7CglpZihjPT1TVUJJRlApIG9mPXptc3ViKGwyem0oMEwpLHZtYXgpOyBlbHNlIG9mPXZtYXg7Cgl2PTA7CglyPXAtPnoucmVnOwoJaWYoaXNyZWcocTEpJiZJU0lEWChwLT5xMS5yZWcpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CiAgICAgIH0KICAgICAgbz0wOwogICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CgljMj1wMi0+Y29kZTsKCWlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CglpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKCWlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOwoJaWYoYzIhPUNBTEwmJihjMjxMQUJFTHx8YzI+QlJBKS8qJiZjMiE9QUREUkVTUyovKXsKCSAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CgkgICAgaWYob3x8IUlTSFdPUkQocTF0eXAocDIpKSkgYnJlYWs7CgkgICAgbz0mcDItPnExOwoJICB9CgkgIGlmKCFwMi0+cTIuYW0mJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMi5yZWc9PXIpewoJICAgIGlmKG98fCFJU0hXT1JEKHEydHlwKHAyKSkpIGJyZWFrOwoJICAgIG89JnAyLT5xMjsKCSAgfQoJICBpZighcDItPnouYW0mJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnoucmVnPT1yKXsKCSAgICBpZihvfHwhSVNIV09SRCh6dHlwKHAyKSkpIGJyZWFrOwoJICAgIG89JnAyLT56OwoJICB9Cgl9CglpZihjMj09RlJFRVJFR3x8KHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpewoJICBpbnQgbTsKCSAgaWYoYzI9PUZSRUVSRUcpIAoJICAgIG09cDItPnExLnJlZzsKCSAgZWxzZQoJICAgIG09cDItPnoucmVnOwoJICBpZihtPT1yKXsKCSAgICBpZihvKXsKCSAgICAgIG8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKCSAgICAgIGFtLT5mbGFncz1JTU1fSU5EOwoJICAgICAgYW0tPmJhc2U9YmFzZTsKCSAgICAgIGFtLT5vZmZzZXQ9em0ybChvZik7CgkgICAgICBhbS0+dj12OwoJICAgICAgaWYoIXYpewoJCWlmKGlzcmVnKHExKSYmSVNJRFgocC0+cTEucmVnKSl7CgkJICBwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKCQl9ZWxzZXsKCQkgIHAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsKCQkgIHAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07CgkJfQoJICAgICAgfWVsc2V7CgkJaWYoaXNyZWcocTIpJiZJU0lEWChwLT5xMi5yZWcpKXsKCQkgIHAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOwoJCX1lbHNlewoJCSAgcC0+Y29kZT1jPUFTU0lHTjtwLT5xMT1wLT5xMjtwLT5xMi5mbGFncz0wOwoJCSAgcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmJk5RXTsKCQl9CgkgICAgICB9CgkgICAgfQoJICAgIGJyZWFrOwoJICB9CgkgIGlmKC8qZ2V0X3JlZyEhIGMyIT1GUkVFUkVHJiYqL209PWJhc2UpIGJyZWFrOwoJICBjb250aW51ZTsKCX0KICAgICAgfQogICAgfSAgICAgIAogIH0KfQoKc3RhdGljIHN0cnVjdCBvYmogKmNhbShpbnQgZmxhZ3MsaW50IGJhc2UsbG9uZyBvZmZzZXQsc3RydWN0IFZhciAqdikKLyogIEluaXRpYWxpemVzIGFuIGFkZHJlc3NpbmctbW9kZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvICAgKi8KLyogIHRoYXQgb2JqZWN0LiBXaWxsIG5vdCBzdXJ2aXZlIGEgc2Vjb25kIGNhbGwhICAgICAgICAgICAgICAgICAgICAgICAgKi8KewogIHN0YXRpYyBzdHJ1Y3Qgb2JqIG9iajsKICBzdGF0aWMgc3RydWN0IEFkZHJlc3NpbmdNb2RlIGFtOwogIG9iai5hbT0mYW07CiAgYW0uZmxhZ3M9ZmxhZ3M7CiAgYW0uYmFzZT1iYXNlOwogIGFtLm9mZnNldD1vZmZzZXQ7CiAgYW0udj12OwogIHJldHVybiAmb2JqOwp9CgpzdGF0aWMgdm9pZCBnZXRfYWNjKEZJTEUgKmYsc3RydWN0IElDICpwKQp7CiAgaWYocmVnc1thY2NdKXsKICAgIGlmKHAtPnEyLmFtKQogICAgICBpZihwLT5xMi5hbS0+ZmxhZ3M9PUFDQ19JTkQpIGllcnJvcigwKTsKICAgIGVsc2UKICAgICAgaWYoKHAtPnEyLmZsYWdzJlJFRykmJklTQUNDKHAtPnEyLnJlZykpIGllcnJvcigwKTsKICAgIGlmKHAtPnouYW0pCiAgICAgIGlmKHAtPnouYW0tPmZsYWdzPT1BQ0NfSU5EKSBpZXJyb3IoMCk7CiAgICBlbHNlCiAgICAgIGlmKChwLT56LmZsYWdzJlJFRykmJklTQUNDKHAtPnoucmVnKSkgaWVycm9yKDApOwogICAgaWYocmVnc1thY2NdKXsKICAgICAgZW1pdChmLFNQVVNIRCk7CiAgICAgIHB1c2goMik7CiAgICAgIHB1c2hlZF9hY2M9MTsKICAgIH0KICB9Cn0Kc3RhdGljIGludCBnZXRfaWR4KEZJTEUgKmYsSUMgKnApCnsKICBpbnQgcjsKICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKICAgIGlmKElTSURYKHIpKXsKICAgICAgaWYoIXJlZ3Nbcl0pewoJcmVnc1tyXXw9NDsKCXJldHVybiByOwogICAgICB9CiAgICB9CiAgfQogIGZvcihyPTE7cjw9TUFYUjtyKyspewogICAgaWYoSVNJRFgocikpewogICAgICBpZigoIShwLT5xMS5mbGFncyZSRUcpfHxwLT5xMS5yZWchPXIpJiYKCSAoIShwLT5xMi5mbGFncyZSRUcpfHxwLT5xMi5yZWchPXIpJiYKCSAoIShwLT56LmZsYWdzJlJFRyl8fHAtPnoucmVnIT1yKSl7CgllbWl0KGYsIlx0JXMlc1xuIixDUFU9PTY4MTI/InBzaCI6InBzaHNcdCIscmVnbmFtZXNbcl0pOwoJcmVnc1tyXXw9ODsKCXB1c2goMik7CglyZXR1cm4gcjsKICAgICAgfQogICAgfQogIH0KICBpZXJyb3IoMCk7Cn0Kc3RhdGljIGludCBnZXRfcmVnKEZJTEUgKmYsc3RydWN0IElDICpwLGludCB0KQp7CiAgaW50IHJlZzsKICBpZighcmVnc1thY2NdKQogICAgcmVnPWFjYzsKICBlbHNlIGlmKElTSFdPUkQodCkmJiFyZWdzW2l4XSkKICAgIHJlZz1peDsKI2lmIDAKICBlbHNlIGlmKElTSFdPUkQodCkmJiFyZWdzW2l5XSkKICAgIHJlZz1peTsKI2VuZGlmCiAgZWxzZXsKICAgIGdldF9hY2MoZixwKTsKICAgIHJlZz1hY2M7CiAgfQogIEJTRVQocmVnc19tb2RpZmllZCxyZWcpOwogIHJldHVybiByZWc7Cn0Kc3RhdGljIHZvaWQgbG9hZF9yZWcoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0KQp7CiAgaWYoIW8tPmFtKXsKICAgIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKICAgICAgaWYoby0+cmVnPT1yKSByZXR1cm47CiAgICAgIGVtaXQoZiwiXHR0ZnJcdCVzLCVzXG4iLHJlZ25hbWVzW28tPnJlZ10scmVnbmFtZXNbcl0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZihyPT1hY2MmJihvLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CiAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCx0KTsKICAgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSl7CglpZihDUFUhPTY4MTImJiFvcHRzaXplKQoJICBlbWl0KGYsIlx0bGRkXHQjMFxuIik7CgllbHNlCgkgIGVtaXQoZiwiXHRjbHJhXG5cdGNscmJcbiIpOyAKCWNjPW87Y2NfdD10OwoJcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQogIGlmKG8tPmZsYWdzJlZBUkFEUil7CiAgICBjaGFyICpiYXNlPTA7CiAgICBpZihwY3JlbCYmSVNGVU5DKG8tPnYtPnZ0eXAtPmZsYWdzKSkKICAgICAgYmFzZT0icGMiOwogICAgaWYoZHJlbCYmIUlTRlVOQyhvLT52LT52dHlwLT5mbGFncykpCiAgICAgIGJhc2U9cmVnbmFtZXNbaXVdOwogICAgaWYoYmFzZSYmIXNraXBfcmVsKXsKICAgICAgaWYoSVNBQ0MocikpCgllbWl0KGYsIlx0dGZyXHQlcyxkXG4iLGJhc2UpOwogICAgICBpZihJU0lEWChyKSkKCWVtaXQoZiwiXHRsZWElc1x0IixyZWduYW1lc1tyXSk7CiAgICAgIGVsc2V7CglpZigqYmFzZT09J3AnKSBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKCWVtaXQoZiwiXHRhZGRkXHQjIik7CiAgICAgIH0KICAgICAgZW1pdHptKGYsby0+dmFsLnZtYXgpOwogICAgICBlbWl0KGYsIisiKTsKICAgICAgaWYoby0+di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKQoJZW1pdChmLCIlcyVzIixpZHByZWZpeCxvLT52LT5pZGVudGlmaWVyKTsKICAgICAgZWxzZQoJZW1pdChmLCIlcyVsZCIsbGFicHJlZml4LHptMmwoby0+di0+b2Zmc2V0KSk7CiAgICAgIGlmKElTSURYKHIpKQoJZW1pdChmLCIsJXMiLGJhc2UpOwogICAgICBlbHNlIGlmKCpiYXNlPT0ncCcpCgllbWl0KGYsIi0lcyVkIixsYWJwcmVmaXgsbGFiZWwpOwogICAgICBlbWl0KGYsIlxuIik7CiAgICAgIGNjPW87Y2NfdD10OwogICAgICByZXR1cm47CiAgICB9CiAgICBza2lwX3JlbD0wOwogIH0KICBlbWl0KGYsIlx0bGQlc1x0Iiwocj09YWNjJiYodCZOUSk9PUNIQVIpPyhDUFU9PTY4MTI/ImFiIjoiYiIpOnJlZ25hbWVzW3JdKTsKICBlbWl0X29iaihmLG8sdCk7ZW1pdChmLCJcbiIpOwogIGNjPW87Y2NfdD10Owp9CnN0YXRpYyB2b2lkIHN0b3JlX3JlZyhGSUxFICpmLGludCByLHN0cnVjdCBvYmogKm8saW50IHQpCnsKICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CiAgICBpZihvLT5yZWc9PXIpIHJldHVybjsKICAgIGVtaXQoZiwiXHR0ZnJcdCVzLCVzXG4iLHJlZ25hbWVzW3JdLHJlZ25hbWVzW28tPnJlZ10pOwogIH1lbHNlewogICAgaWYocj09YWNjJiYodCZOUSk9PUNIQVIpCiAgICAgIGVtaXQoZiwiXHRzdCVzXHQiLChDUFU9PTY4MTIpPyJhYiI6ImIiKTsKICAgIGVsc2UKICAgICAgZW1pdChmLCJcdHN0JXNcdCIscmVnbmFtZXNbcl0pOwogICAgZW1pdF9vYmooZixvLHQpO2VtaXQoZiwiXG4iKTsKICAgIGNjPW87Y2NfdD10OwogIH0KfQpzdGF0aWMgdm9pZCBsb2FkX2FkZHIoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvKQp7CiAgaWYoby0+YW0pewogICAgaWYoby0+YW0tPmZsYWdzPT1JTU1fSU5EKXsKICAgICAgaWYoby0+YW0tPmJhc2U9PXImJm8tPmFtLT5vZmZzZXQ9PTAmJiFvLT5hbS0+dikgcmV0dXJuOwogICAgICBpZihJU0lEWChyKSl7CgllbWl0KGYsIlx0bGVhJXNcdCIscmVnbmFtZXNbcl0pOwoJZW1pdF9vYmooZixvLDApOwoJZW1pdChmLCJcbiIpOwogICAgICB9ZWxzZXsKCWlmKHIhPWFjYykgaWVycm9yKDApOwoJZW1pdChmLCJcdHRmclx0JXMsJXNcbiIscmVnbmFtZXNbby0+YW0tPmJhc2VdLHJlZ25hbWVzW3JdKTsKCWVtaXQoZiwiXHRhZGRkXHQjJWxkXG4iLG8tPmFtLT5vZmZzZXQpOwoJaWYoby0+YW0tPnYpewoJICBpZihvLT5hbS0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKQoJICAgIGVtaXQoZiwiKyVzJWxkIixsYWJwcmVmaXgsem0ybChvLT5hbS0+di0+b2Zmc2V0KSk7CgkgIGVsc2UKCSAgICBlbWl0KGYsIislcyVzIixpZHByZWZpeCxvLT5hbS0+di0+aWRlbnRpZmllcik7Cgl9CgllbWl0KGYsIlxuIik7CgljYz0wOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGllcnJvcigwKTsKICB9CiAgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CiAgICBvLT5mbGFncyY9fkRSRUZPQko7CiAgICBsb2FkX3JlZyhmLHIsbyxvLT5kdHlwKTsKICAgIG8tPmZsYWdzfD1EUkVGT0JKOwogICAgcmV0dXJuOwogIH0KICBpZigoby0+ZmxhZ3MmKFZBUnxWQVJBRFIpKT09VkFSKXsKICAgIGlmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8by0+di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKICAgICAgby0+ZmxhZ3N8PVZBUkFEUjsKICAgICAgbG9hZF9yZWcoZixyLG8sUE9JTlRFUl9UWVBFKG8tPnYtPnZ0eXApKTsKICAgICAgby0+ZmxhZ3MmPX5WQVJBRFI7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmKHZvZmYobyk9PTApewogICAgICBlbWl0KGYsIlx0dGZyXHQlcywlc1xuIixyZWduYW1lc1tzcF0scmVnbmFtZXNbcl0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZihJU0lEWChyKSl7CiAgICAgIGVtaXQoZiwiXHRsZWElc1x0IixyZWduYW1lc1tyXSk7CiAgICAgIGVtaXRfb2JqKGYsbywwKTsKICAgICAgZW1pdChmLCJcbiIpOwogICAgfWVsc2V7CiAgICAgIGlmKHIhPWFjYykgaWVycm9yKDApOwogICAgICBlbWl0KGYsIlx0dGZyXHQlcywlc1xuIixyZWduYW1lc1tzcF0scmVnbmFtZXNbcl0pOwogICAgICBlbWl0KGYsIlx0YWRkZFx0IyVsZFxuIix2b2ZmKG8pKTsKICAgICAgY2M9MDsKICAgIH0KICAgIHJldHVybjsKICB9CiAgaWVycm9yKDApOwp9CgpzdGF0aWMgaW50IHNjcmF0Y2hyZWcoaW50IHIsc3RydWN0IElDICpwKQp7CiAgaW50IGM7CiAgd2hpbGUoMSl7CiAgICBwPXAtPm5leHQ7CiAgICBpZighcHx8KChjPXAtPmNvZGUpPT1GUkVFUkVHJiZwLT5xMS5yZWc9PXIpKSByZXR1cm4gMTsKICAgIGlmKGM9PUNBTEx8fChjPj1CRVEmJmM8PUJSQSkpIHJldHVybiAwOwogICAgaWYoKHAtPnExLmZsYWdzJlJFRykmJnAtPnExLnJlZz09cikgcmV0dXJuIDA7CiAgICBpZigocC0+cTIuZmxhZ3MmUkVHKSYmcC0+cTIucmVnPT1yKSByZXR1cm4gMDsKICAgIGlmKChwLT56LmZsYWdzJlJFRykmJnAtPnoucmVnPT1yKSByZXR1cm4gMDsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgRW5kIG9mIHByaXZhdGUgZmF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKaW50IGluaXRfY2codm9pZCkKLyogIERvZXMgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9ucyBmb3IgdGhlIGNvZGUtZ2VuZXJhdG9yLiBHZXRzIGNhbGxlZCAgKi8KLyogIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgc2hvdWxkIHJldHVybiAwIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAgICAgKi8KewogIGludCBpOwoKICBDUFU9Q1BVT1BUOwoKCWlmIChDUFU9PTY4MDkxMikgewoJCWJpdHNwZXJieXRlID0gMTI7CgkJYnl0ZW1hc2sgPSAweGZmZjsKCQlkYmxfYnl0ZW1hc2sgPSAweGZmZmZmZjsKCX0KCQogIC8qICBJbml0aWFsaXplIHNvbWUgdmFsdWVzIHdoaWNoIGNhbm5vdCBiZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkICAgKi8KICAvKiAgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGFyaXRobWV0aWMuICAgICAgICAgICAgICovCiAgbWF4YWxpZ249bDJ6bSgxTCk7CiAgY2hhcl9iaXQ9bDJ6bSgobG9uZyliaXRzcGVyYnl0ZSk7CiAgZm9yKGk9MDtpPD1NQVhfVFlQRTtpKyspewogICAgc2l6ZXRhYltpXT1sMnptKG1zaXpldGFiW2ldKTsKICAgIGFsaWduW2ldPWwyem0obWFsaWduW2ldKTsKICB9CiAgZm9yKGk9MTtpPD1pdTtpKyspewogICAgcmVnc2l6ZVtpXT1sMnptKDJMKTtyZWd0eXBlW2ldPSZpdHlwOwogIH0JCiAgcmVnc2l6ZVtkeF09bDJ6bSg0TCk7cmVndHlwZVtpXT0mbHR5cDsKCiAgLyogIEluaXRpYWxpemUgdGhlIG1pbi9tYXgtc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGUgdHlwZXMgb2YgdGhlICAgICAqLwogIC8qICBob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KICAvKiAgb25seSB1c2UgdGhlIHNtYWxsZXN0IG1heGltdW0gdmFsdWVzIEFOU0kgZ3VhcmFudGVlcyBpZiB5b3UgICAgICovCiAgLyogIHdhbnQgdG8gYmUgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICBUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KICAvKiAgYmUgdW5hYmxlIHRvIHJlcHJlc2VudCAtMjE0NzQ4MzY0OCBvbiB0aGUgaG9zdCBzeXN0ZW0uICAgICAgICAgICovCiAgaWYgKENQVT09NjgwOTEyKSB7CgkgIHRfbWluW0NIQVJdPWwyem0oLTIwNDhMKTsKCSAgdF9taW5bU0hPUlRdPWwyem0oLTgzODg2MDhMKTsKCSAgdF9taW5bSU5UXT10X21pbltTSE9SVF07CgkgIHRfbWluW0xPTkddPXptc3ViKGwyem0oMHg4MDAwMDAwMDAwMDBMTCksbDJ6bSgxTCkpOwoJICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKCSAgdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CgkgIHRfbWF4W0NIQVJdPXVsMnp1bSgyMDQ3TCk7CgkgIHRfbWF4W1NIT1JUXT11bDJ6dW0oODM4ODYwN1VMKTsKCSAgdF9tYXhbSU5UXT10X21heFtTSE9SVF07CgkgIHRfbWF4W0xPTkddPXVsMnp1bSgweDdmZmZmZmZmZmZmZlVMTCk7CgkgIHRfbWF4W0xMT05HXT16dW1yc2hpZnQoenVta29tcGwodWwyenVtKDBVTCkpLHVsMnp1bSgxVUwpKTsKCSAgdF9tYXhbTUFYSU5UXT10X21heChMTE9ORyk7CgkgIHR1X21heFtDSEFSXT11bDJ6dW0oNDA5NVVMKTsKCSAgdHVfbWF4W1NIT1JUXT11bDJ6dW0oMTY3NzcyMTVVTCk7CgkgIHR1X21heFtJTlRdPXR1X21heFtTSE9SVF07CgkgIHR1X21heFtMT05HXT11bDJ6dW0oMHhmZmZmZmZmZmZmZmZVTEwpOwoJICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKCSAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOwoJfQoJZWxzZSB7CgkgIHRfbWluW0NIQVJdPWwyem0oLTEyOEwpOwoJICB0X21pbltTSE9SVF09bDJ6bSgtMzI3NjhMKTsKCSAgdF9taW5bSU5UXT10X21pbltTSE9SVF07CgkgIHRfbWluW0xPTkddPXptc3ViKGwyem0oLTIxNDc0ODM2NDdMKSxsMnptKDFMKSk7CgkgIHRfbWluW0xMT05HXT16bWxzaGlmdChsMnptKDFMKSxsMnptKDYzTCkpOwoJICB0X21pbltNQVhJTlRdPXRfbWluKExMT05HKTsKCSAgdF9tYXhbQ0hBUl09dWwyenVtKDEyN0wpOwoJICB0X21heFtTSE9SVF09dWwyenVtKDMyNzY3VUwpOwoJICB0X21heFtJTlRdPXRfbWF4W1NIT1JUXTsKCSAgdF9tYXhbTE9OR109dWwyenVtKDIxNDc0ODM2NDdVTCk7CgkgIHRfbWF4W0xMT05HXT16dW1yc2hpZnQoenVta29tcGwodWwyenVtKDBVTCkpLHVsMnp1bSgxVUwpKTsKCSAgdF9tYXhbTUFYSU5UXT10X21heChMTE9ORyk7CgkgIHR1X21heFtDSEFSXT11bDJ6dW0oMjU1VUwpOwoJICB0dV9tYXhbU0hPUlRdPXVsMnp1bSg2NTUzNVVMKTsKCSAgdHVfbWF4W0lOVF09dHVfbWF4W1NIT1JUXTsKCSAgdHVfbWF4W0xPTkddPXVsMnp1bSg0Mjk0OTY3Mjk1VUwpOwoJICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKCSAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOwoJfQoKICBpZihnX2ZsYWdzWzldJlVTRURGTEFHKSBkcmVsPTE7CiAgaWYoZ19mbGFnc1sxMF0mVVNFREZMQUcpIE1JTkFEREkyUD1TSE9SVDsKICBpZihnX2ZsYWdzWzExXSZVU0VERkxBRykgbm9keD0xOwogIGlmKGdfZmxhZ3NbMTJdJlVTRURGTEFHKSBub3U9MTsKCiAgaWYoQ1BVPT02ODEyKSBzd2l0Y2hzdWJzPTE7CgogIC8qICBSZXNlcnZlIGEgZmV3IHJlZ2lzdGVycyBmb3IgdXNlIGJ5IHRoZSBjb2RlLWdlbmVyYXRvci4gICAgICAqLwogIHJlZ3NhW3NwXT1SRUdTQV9ORVZFUjsKICByZWdzY3JhdGNoW3NwXT0wOwoKICBpZihDUFU9PTY4MTJ8fGRyZWx8fG5vdSl7CiAgICByZWdzYVtpdV09UkVHU0FfTkVWRVI7CiAgICByZWdzY3JhdGNoW2l1XT0wOwogIH0KCiAgaWYoQ1BVIT02ODEyKXsKICAgIHJlZ25hbWVzW3NwXT0icyI7CiAgICBsb2dpY2Fsc1swXT0ib3IiOwogIH0KCiAgaWYoIShnX2ZsYWdzWzZdJlVTRURGTEFHKSl7CiAgICBleHRlcm4gaW50IHN0YXRpY19jc2UsZHJlZl9jc2U7CiAgICBzdGF0aWNfY3NlPTA7CiAgICBkcmVmX2NzZT0wOwogIH0KCiAgaWYoIShnX2ZsYWdzWzddJlVTRURGTEFHKSl7CiAgICByZWdzYVthY2NdPVJFR1NBX1RFTVBTOwogICAgcmVnc2FbZHhdPVJFR1NBX1RFTVBTOwogIH0KCiAgaWYoZ19mbGFnc1s4XSZVU0VERkxBRyl7CiAgICBwY3JlbD0xOwogICAganNyaW5zdD0ibGJzciI7CiAgICBqbXBpbnN0PSJsYnJhIjsKICAgIHJvZGF0YW5hbWU9Ilx0LmRhdGFcbiI7CiAgfQoKICBpZihDUFU9PTY4MDkpCiAgICBtYXJyYXlbMV09Il9fNjgwOV9fIjsKICBpZihDUFU9PTYzMDkpCiAgICBtYXJyYXlbMV09Il9fNjMwOV9fIjsKICBpZihDUFU9PTY4MDkxMikKICAgIG1hcnJheVsxXT0iX182ODA5MTJfXyI7CiAgdGFyZ2V0X21hY3Jvcz1tYXJyYXk7CgoKICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsaW50MTYiLElOVCxJTlQsYWNjLElOVCwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmludDE2IixJTlQsSU5ULGl4LElOVCxhY2MsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDE2IixVTlNJR05FRHxJTlQsVU5TSUdORUR8SU5ULGl4LFVOU0lHTkVEfElOVCxhY2MsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kaW50MTYiLElOVCxJTlQsaXgsSU5ULGFjYywxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50MTYiLFVOU0lHTkVEfElOVCxVTlNJR05FRHxJTlQsaXgsVU5TSUdORUR8SU5ULGFjYywxLDApOwoKCiAgLyogVE9ETzogc2V0IGFyZ3VtZW50IHJlZ2lzdGVycyAqLwogIGRlY2xhcmVfYnVpbHRpbigiX19tdWxpbnQzMiIsTE9ORyxMT05HLDAsTE9ORywwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGludDMyIixMT05HLExPTkcsMCxMT05HLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fc3ViaW50MzIiLExPTkcsTE9ORywwLExPTkcsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19hbmRpbnQzMiIsTE9ORyxMT05HLDAsTE9ORywwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX29yaW50MzIiLExPTkcsTE9ORywwLExPTkcsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19lb3JpbnQzMiIsTE9ORyxMT05HLDAsTE9ORywwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ludDMyIixMT05HLExPTkcsMCwwLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNsaW50MzIiLExPTkcsTE9ORywwLElOVCwwLDEsMCk7CgogIGRlY2xhcmVfYnVpbHRpbigiX19kaXZpbnQzMiIsTE9ORyxMT05HLDAsTE9ORywwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2RpdnVpbnQzMiIsVU5TSUdORUR8TE9ORyxVTlNJR05FRHxMT05HLDAsVU5TSUdORUR8TE9ORywwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX21vZGludDMyIixMT05HLExPTkcsMCxMT05HLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kdWludDMyIixVTlNJR05FRHxMT05HLFVOU0lHTkVEfExPTkcsMCxVTlNJR05FRHxMT05HLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNyc2ludDMyIixMT05HLExPTkcsMCxJTlQsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19sc3J1aW50MzIiLFVOU0lHTkVEfExPTkcsVU5TSUdORUR8TE9ORywwLElOVCwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2NtcHNpbnQzMiIsSU5ULExPTkcsMCxMT05HLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wdWludDMyIixJTlQsVU5TSUdORUR8TE9ORywwLFVOU0lHTkVEfExPTkcsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19zaW50MzJ0b2ZsdDMyIixGTE9BVCxMT05HLDAsMCwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQzMnRvZmx0MzIiLEZMT0FULFVOU0lHTkVEfExPTkcsMCwwLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDMydG9mbHQ2NCIsRE9VQkxFLExPTkcsMCwwLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDMydG9mbHQ2NCIsRE9VQkxFLFVOU0lHTkVEfExPTkcsMCwwLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3NpbnQzMiIsTE9ORyxGTE9BVCwwLDAsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDMyIixVTlNJR05FRHxMT05HLEZMT0FULDAsMCwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50MzIiLExPTkcsRE9VQkxFLDAsMCwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG91aW50MzIiLFVOU0lHTkVEfExPTkcsRE9VQkxFLDAsMCwwLDEsMCk7CgoKCiAgZGVjbGFyZV9idWlsdGluKCJfX211bGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fYWRkaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19zdWJpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2FuZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fb3JpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2VvcmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fbmVnaW50NjQiLExMT05HLExMT05HLDAsMCwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2xzbGludDY0IixMTE9ORyxMTE9ORywwLElOVCwwLDEsMCk7CgogIGRlY2xhcmVfYnVpbHRpbigiX19kaXZzaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19kaXZ1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19tb2RzaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19sc3JzaW50NjQiLExMT05HLExMT05HLDAsSU5ULDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNydWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLElOVCwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2NtcHNpbnQ2NCIsSU5ULExMT05HLDAsTExPTkcsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19jbXB1aW50NjQiLElOVCxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDY0dG9mbHQzMiIsRkxPQVQsTExPTkcsMCwwLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9mbHQzMiIsRkxPQVQsVU5TSUdORUR8TExPTkcsMCwwLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDY0dG9mbHQ2NCIsRE9VQkxFLExMT05HLDAsMCwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQ2NHRvZmx0NjQiLERPVUJMRSxVTlNJR05FRHxMTE9ORywwLDAsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvc2ludDY0IixMTE9ORyxGTE9BVCwwLDAsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDY0IixVTlNJR05FRHxMTE9ORyxGTE9BVCwwLDAsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvc2ludDY0IixMTE9ORyxET1VCTEUsMCwwLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQ2NCIsVU5TSUdORUR8TExPTkcsRE9VQkxFLDAsMCwwLDEsMCk7CgogIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvZmx0NjQiLERPVUJMRSxGTE9BVCwwLDAsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvZmx0MzIiLEZMT0FULERPVUJMRSwwLDAsMCwxLDApOwoKCiAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fc3ViZmx0MzIiLEZMT0FULEZMT0FULDAsRkxPQVQsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19tdWxmbHQzMiIsRkxPQVQsRkxPQVQsMCxGTE9BVCwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fbmVnZmx0MzIiLEZMT0FULEZMT0FULDAsRkxPQVQsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19jbXBmbHQzMiIsSU5ULEZMT0FULDAsRkxPQVQsMCwxLDApOwoKICBkZWNsYXJlX2J1aWx0aW4oIl9fYWRkZmx0NjQiLERPVUJMRSxET1VCTEUsMCxET1VCTEUsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19zdWJmbHQ2NCIsRE9VQkxFLERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2Zmx0NjQiLERPVUJMRSxET1VCTEUsMCxET1VCTEUsMCwxLDApOwogIGRlY2xhcmVfYnVpbHRpbigiX19uZWdmbHQ2NCIsRE9VQkxFLERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CiAgZGVjbGFyZV9idWlsdGluKCJfX2NtcGZsdDY0IixJTlQsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKCgogIHJldHVybiAxOwp9CgppbnQgZnJldHVybihzdHJ1Y3QgVHlwICp0KQovKiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIgaW4gd2hpY2ggdmFyaWFibGVzIG9mIHR5cGUgdCBhcmUgcmV0dXJuZWQuICovCi8qICBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIgcmV0dXJucyAwLiAgICAgICAgKi8KewogIGludCBmPXQtPmZsYWdzJk5ROwogIGlmKElTU0NBTEFSKGYpKXsKICAgIGlmKElTSFdPUkQoZil8fGY9PUNIQVIpCiAgICAgIHJldHVybiBhY2M7CiAgICBlbHNlIGlmKElTTFdPUkQoZikpCiAgICAgIHJldHVybiBkeDsKICB9CiAgcmV0dXJuIDA7Cn0KCmludCByZWdvayhpbnQgcixpbnQgdCxpbnQgbW9kZSkKLyogIFJldHVybnMgMCBpZiByZWdpc3RlciByIGNhbm5vdCBzdG9yZSB2YXJpYWJsZXMgb2YgICAqLwovKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovCi8qICBub24temVybyBvbmx5IGlmIHRoZSByZWdpc3RlciBjYW4gc3RvcmUgYSBwb2ludGVyICAgKi8KLyogIGFuZCBkZXJlZmVyZW5jZSBhIHBvaW50ZXIgdG8gbW9kZS4gICAgICAgICAgICAgICAgICAqLwp7CiAgaWYoIUlTU0NBTEFSKHQpKSByZXR1cm4gMDsKICBpZihyPT1keCl7CiAgICBpZihJU0xXT1JEKHQpJiYob3B0ZmxhZ3MmMikmJiFub2R4KSByZXR1cm4gMTsKICAgIHJldHVybiAwOwogIH0KICBpZihtb2RlPT0tMSl7CiAgICBpZihJU0hXT1JEKHQpKSByZXR1cm4gMTsKICAgIGlmKCh0Jk5RKT09Q0hBUiYmSVNBQ0MocikpIHJldHVybiAxOwogIH1lbHNlewogICAgaWYoSVNJRFgocikpewogICAgICBpZihJU1BPSU5URVIodCkmJklTSFdPUkQodCkpCglyZXR1cm4gMTsKICAgIH0KICAgIGlmKElTQUNDKHIpKXsKICAgICAgaWYoKHQmTlEpPT1DSEFSKQoJcmV0dXJuIDE7CiAgICAgIGlmKElTSU5UKHQpJiZJU0hXT1JEKHQpKQoJcmV0dXJuIDE7CiAgICB9CiAgfQogIHJldHVybiAwOwp9CgppbnQgcmVnX3BhaXIoaW50IHIsc3RydWN0IHJwYWlyICpwKQovKiBSZXR1cm5zIDAgaWYgdGhlIHJlZ2lzdGVyIGlzIG5vIHJlZ2lzdGVyIHBhaXIuIElmIHIgICovCi8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KLyogc3RydWN0dXJlIHBvaW50ZWQgdG8gcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0d28gICAqLwovKiBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCnsKICBpZihyPT1keCl7CiAgICBwLT5yMT1hY2M7CiAgICBwLT5yMj1peDsKICAgIHJldHVybiAxOwogIH0KICByZXR1cm4gMDsKfQoKaW50IGNvc3Rfc2F2aW5ncyhzdHJ1Y3QgSUMgKnAsaW50IHIsc3RydWN0IG9iaiAqbykKewogIC8qRklYTUUqLwogIGludCBjPXAtPmNvZGU7CiAgaWYocj09ZHgpewogICAgaWYoYz09R0VUUkVUVVJOfHxjPT1TRVRSRVRVUk58fGM9PVBVU0h8fGM9PUFTU0lHTikgcmV0dXJuIDg7CiAgICByZXR1cm4gSU5UX01JTjsKICB9CiAgaWYoby0+ZmxhZ3MmVktPTlNUKXsKICAgIHN0cnVjdCBvYmogKmNvPSZvLT52LT5jb2JqOwogICAgaWYoby0+ZmxhZ3MmRFJFRk9CSikKICAgICAgcmV0dXJuIDA7CiAgICBpZihvPT0mcC0+cTEmJnAtPmNvZGU9PUFTU0lHTiYmKChwLT56LmZsYWdzJkRSRUZPQkopfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8cC0+ei52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pKXsKICAgICAgcmV0dXJuIDI7CiAgICB9CiAgICByZXR1cm4gMDsKICB9CiAgaWYoKG8tPmZsYWdzJkRSRUZPQkopKXsKICAgIGlmKCFJU0lEWChyKSkgcmV0dXJuIElOVF9NSU47CiAgICBpZihwLT5xMi5mbGFncyYmbyE9JnAtPnopCiAgICAgIHJldHVybiA2OwogICAgZWxzZQogICAgICByZXR1cm4gNjsKICB9ZWxzZSBpZihjPT1HRVRSRVRVUk4mJnAtPnExLnJlZz09cil7CiAgICByZXR1cm4gNDsKICB9ZWxzZSBpZihjPT1TRVRSRVRVUk4mJnAtPnoucmVnPT1yKXsKICAgIHJldHVybiA0OwogIH1lbHNlIGlmKGM9PUNPTlZFUlQmJigocC0+dHlwZiZOUSk9PUNIQVJ8fChwLT50eXBmMiZOUSk9PUNIQVIpJiZyZWdvayhyLENIQVIsMCkpewogICAgcmV0dXJuIDM7CiAgfQogIGlmKG89PSZwLT56JiZyPT1hY2MpewogICAgaWYoYz09U1VCfHxjPT1TVUJJRlB8fGM9PVNVQlBGUHx8Yz09QU5EfHxjPT1PUnx8Yz09WE9SKQogICAgICByZXR1cm4gNjsKICAgIGlmKChjPT1BRER8fGM9PUFEREkyUCkmJiEocC0+cTEuZmxhZ3MmKEtPTlNUfFZLT05TVCkpJiYhKHAtPnEyLmZsYWdzJihLT05TVHxWS09OU1QpKSkKICAgICAgcmV0dXJuIDQ7CiAgICBpZihjPT1NVUxUKSByZXR1cm4gNTsKICAgIGlmKGM9PUFTU0lHTiYmKHAtPnExLmZsYWdzJktPTlNUKSl7CiAgICAgIGV2YWxfY29uc3QoJnAtPnExLnZhbCxwLT50eXBmKTsKICAgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSkKCXJldHVybiAzOwogICAgfQogIH0KI2lmIDEKICBpZigobz09JnAtPnEyLyp8fG89PSZwLT56Ki8pJiYhKG8tPmZsYWdzJkRSRUZPQkopJiYhSVNBQ0Moby0+cmVnKSYmKGM9PU1VTFR8fGM9PURJVnx8Yz09TU9EKSkKICAgIHJldHVybiBJTlRfTUlOOwojZW5kaWYKICBpZihjPT1DT01QQVJFfHxjPT1URVNUKXsKICAgIGlmKHI9PWl4KSByZXR1cm4gMzsKICAgIGlmKHI9PWl5KSByZXR1cm4gMjsKICAgIGlmKHI9PWl1KSByZXR1cm4gMTsKICB9CiAgcmV0dXJuIDI7Cn0KCmludCBkYW5nZXJvdXNfSUMoc3RydWN0IElDICpwKQovKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCi8qICB3aXRob3V0IGRhbmdlciBvZiBleGNlcHRpb25zIG9yIHNpbWlsYXIgdGhpbmdzLiAgICAgKi8KLyogIHZiY2MgbWF5IGdlbmVyYXRlIGNvZGUgaW4gd2hpY2ggbm9uLWRhbmdlcm91cyBJQ3MgICAqLwovKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCi8qICBuZXZlciByZWFjaCB0aGVtIChtYWlubHkgd2hlbiBtb3ZpbmcgY29tcHV0YXRpb25zICAgKi8KLyogIG91dCBvZiBsb29wcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCi8qICBtYWNoaW5lcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAtIGFjY2Vzc2VzIHZpYSBwb2ludGVycyAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgLSBvdmVyZmxvdyBvbiBzaWduZWQgaW50ZWdlci9mbG9hdHMgICAgICAgICAgICAgKi8KewogIGludCBjPXAtPmNvZGU7CiAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQogICAgcmV0dXJuIDE7CiAgaWYoKGM9PURJVnx8Yz09TU9EKSYmIWlzY29uc3QocTIpKQogICAgcmV0dXJuIDE7CiAgcmV0dXJuIDA7Cn0KCi8qIFJldHVybiBuYW1lIG9mIGxpYnJhcnkgZnVuY3Rpb24sIGlmIHRoaXMgbm9kZSBzaG91bGQgYmUKICAgaW1wbGVtZW50ZWQgdmlhIGxpYmNhbGwuICovCmNoYXIgKnVzZV9saWJjYWxsKGludCBjLGludCB0LGludCB0MikKewogIHN0YXRpYyBjaGFyIGZuYW1lWzE2XTsKICBjaGFyICpyZXQ9MDsKCiAgaWYoYz09Q09NUEFSRSl7CiAgICBpZigodCZOUSk9PUxMT05HfHxJU0ZMT0FUKHQpKXsKICAgICAgc3ByaW50ZihmbmFtZSwiX19jbXAlcyVzJWxkIiwodCZVTlNJR05FRCk/InUiOiJzIixJU0ZMT0FUKHQpPyJmbHQiOiJpbnQiLHptMmwoc2l6ZXRhYlt0Jk5RXSkqOCk7CiAgICAgIHJldD1mbmFtZTsKICAgIH0KICB9ZWxzZXsKICAgIHQmPU5VOwogICAgdDImPU5VOwogICAgaWYodD09TERPVUJMRSkgdD1ET1VCTEU7CiAgICBpZih0Mj09TERPVUJMRSkgdDI9RE9VQkxFOwogICAgaWYoYz09Q09OVkVSVCl7CiAgICAgIGlmKHQ9PXQyKSByZXR1cm4gMDsKICAgICAgaWYodD09RkxPQVQmJnQyPT1ET1VCTEUpIHJldHVybiAiX19mbHQ2NHRvZmx0MzIiOwogICAgICBpZih0PT1ET1VCTEUmJnQyPT1GTE9BVCkgcmV0dXJuICJfX2ZsdDMydG9mbHQ2NCI7CgogICAgICBpZihJU0ZMT0FUKHQpKXsKICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVjaW50JWxkdG9mbHQlZCIsKHQyJlVOU0lHTkVEKT8ndSc6J3MnLHptMmwoc2l6ZXRhYlt0MiZOUV0pKjgsKHQ9PUZMT0FUKT8zMjo2NCk7CiAgICAgICAgcmV0PWZuYW1lOwogICAgICB9CiAgICAgIGlmKElTRkxPQVQodDIpKXsKICAgICAgICBzcHJpbnRmKGZuYW1lLCJfX2ZsdCVkdG8lY2ludCVsZCIsKCh0MiZOVSk9PUZMT0FUKT8zMjo2NCwodCZVTlNJR05FRCk/J3UnOidzJyx6bTJsKHNpemV0YWJbdCZOUV0pKjgpOwogICAgICAgIHJldD1mbmFtZTsKICAgICAgfQogICAgfQogICAgaWYoKHQmTlEpPT1MTE9OR3x8SVNGTE9BVCh0KSl7CiAgICAgIGlmKChjPj1MU0hJRlQmJmM8PU1PRCl8fChjPj1PUiYmYzw9QU5EKXx8Yz09S09NUExFTUVOVHx8Yz09TUlOVVMpewoJaWYodD09KFVOU0lHTkVEfExMT05HKSYmKGM9PURJVnx8Yz09TU9EfHxjPT1SU0hJRlQpKXsKCSAgc3ByaW50ZihmbmFtZSwiX18lc3VpbnQ2NCIsZW5hbWVbY10pOwoJICByZXQ9Zm5hbWU7Cgl9ZWxzZSBpZigodCZOUSk9PUxMT05HKXsKICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXNpbnQ2NCIsZW5hbWVbY10pOwogICAgICAgICAgcmV0PWZuYW1lOwoJfWVsc2UgaWYodD09KFVOU0lHTkVEfExPTkcpJiYoYz09RElWfHxjPT1NT0R8fGM9PVJTSElGVCkpewoJICBzcHJpbnRmKGZuYW1lLCJfXyVzdWludDMyIixlbmFtZVtjXSk7CgkgIHJldD1mbmFtZTsKCX1lbHNlIGlmKCh0Jk5RKT09TE9ORyl7CiAgICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzaW50MzIiLGVuYW1lW2NdKTsKICAgICAgICAgIHJldD1mbmFtZTsKICAgICAgICB9ZWxzZXsKCSAgc3ByaW50ZihmbmFtZSwiX18lcyVzJXMlbGQiLGVuYW1lW2NdLChjIT1NVUxUJiYodCZVTlNJR05FRCkpPyJ1IjoiIixJU0ZMT0FUKHQpPyJmbHQiOiJpbnQiLHptMmwoc2l6ZXRhYlt0Jk5RXSkqOCk7CiAgICAgICAgICByZXQ9Zm5hbWU7Cgl9CiAgICAgIH0KICAgIH0KICAgIGlmKChjPT1NVUxUJiYoQ1BVPT02ODA5fHwodCZOUSk9PUxPTkcpKXx8Yz09RElWfHxjPT1NT0QpewogICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzJXMlcyVsZCIsZW5hbWVbY10sKGMhPU1VTFQmJih0JlVOU0lHTkVEKSk/InUiOiIiLElTRkxPQVQodCk/ImZsdCI6ImludCIsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKICAgICAgcmV0PWZuYW1lOwogICAgfQogIH0KCiAgcmV0dXJuIHJldDsKfQoKCgppbnQgbXVzdF9jb252ZXJ0KGludCBvLGludCB0LGludCBjb25zdF9leHByKQovKiAgUmV0dXJucyB6ZXJvIGlmIGNvZGUgZm9yIGNvbnZlcnRpbmcgbnAgdG8gdHlwZSB0ICAgICovCi8qICBjYW4gYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KewogIGludCBvcD1vJk5RLHRwPXQmTlE7CiAgaWYob3A9PXRwKSByZXR1cm4gMDsKICBpZihJU0hXT1JEKG9wKSYmSVNIV09SRCh0cCkpIHJldHVybiAwOwogIGlmKElTRkxPQVQob3ApfHxJU0ZMT0FUKHRwKSkgcmV0dXJuIDE7CiAgaWYoSVNMV09SRChvcCkmJklTTFdPUkQodHApKSByZXR1cm4gMDsKICByZXR1cm4gMTsKfQoKdm9pZCBnZW5fZHMoRklMRSAqZix6bWF4IHNpemUsc3RydWN0IFR5cCAqdCkKLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSA8c2l6ZT4gYnl0ZXMgb2Ygc3RvcmFnZSAqLwovKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCnsKICBpZihuZXdvYmomJnNlY3Rpb24hPVNQRUNJQUwpCiAgICBlbWl0KGYsIiVsZFxuIix6bTJsKHNpemUpKTsKICBlbHNlCiAgICBlbWl0KGYsIlx0LnNwYWNlXHQlbGRcbiIsem0ybChzaXplKSk7CiAgbmV3b2JqPTA7ICAKfQoKdm9pZCBnZW5fYWxpZ24oRklMRSAqZix6bWF4IGFsaWduKQovKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gbWFrZSBzdXJlIHRoZSBuZXh0IGRhdGEgaXMgICAgICovCi8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8KewogIC8qIG5vdGhpbmcgdG8gZG8gKi8KfQoKdm9pZCBnZW5fdmFyX2hlYWQoRklMRSAqZixzdHJ1Y3QgVmFyICp2KQovKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHRoZSBoZWFkIG9mIGEgdmFyaWFibGUgICovCi8qICBkZWZpbml0aW9uLCBpLmUuIHRoZSBsYWJlbCBhbmQgaW5mb3JtYXRpb24gZm9yICAgICAgKi8KLyogIGxpbmthZ2UgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwp7CiAgaW50IGNvbnN0ZmxhZzsKICBpZih2LT5jbGlzdCkgY29uc3RmbGFnPWlzX2NvbnN0KHYtPnZ0eXApOwogIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CiAgICBpZihJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKSByZXR1cm47CiAgICBpZih2LT50YXR0ciZEUEFHRSkKICAgICAgZW1pdChmLCJcdC5kaXJlY3RcdCVzJWxkXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOwogICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKICAgICAgaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1szXSZVU0VERkxBRykpJiZzZWN0aW9uIT1EQVRBKXsKCWVtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBOwogICAgICB9CiAgICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1szXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7CgllbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7CiAgICAgIH0KICAgICAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1MpewoJZW1pdChmLGJzc25hbWUpO2lmKGYpIHNlY3Rpb249QlNTOwogICAgICB9CiAgICB9CiAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJWxkLEBvYmplY3RcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CiAgICBlbWl0KGYsIlx0LnNpemVcdCVzJWxkLCVsZFxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpLHptMmwoc3pvZih2LT52dHlwKSkpOwogICAgaWYodi0+Y2xpc3R8fHNlY3Rpb249PVNQRUNJQUwpCiAgICAgIGVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOwogICAgZWxzZQogICAgICBlbWl0KGYsIlx0Lmxjb21tXHQlcyVsZCwiLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOwogICAgbmV3b2JqPTE7IAogIH0KICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pewogICAgaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSl7CiAgICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOwogICAgICBpZih2LT50YXR0ciZEUEFHRSkKCWVtaXQoZiwiXHQuZGlyZWN0XHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOwogICAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpewoJaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1szXSZVU0VERkxBRykpJiZzZWN0aW9uIT1EQVRBKXsKCSAgZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7Cgl9CglpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbM10mVVNFREZMQUcpJiZzZWN0aW9uIT1ST0RBVEEpewoJICBlbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7Cgl9CglpZighdi0+Y2xpc3QmJnNlY3Rpb24hPUJTUyl7CgkgIGVtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzsKCX0KICAgICAgfQogICAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJXMsQG9iamVjdFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKICAgICAgZW1pdChmLCJcdC5zaXplXHQlcyVzLCVsZFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyLHptMmwoc3pvZih2LT52dHlwKSkpOwogICAgICBpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCkKICAgICAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOwogICAgICBlbHNlCiAgICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcblx0Lmxjb21tXHQlcyVzLCIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKICAgICAgbmV3b2JqPTE7ICAgCiAgICB9CiAgfQp9Cgp2b2lkIGdlbl9kYyhGSUxFICpmLGludCB0LHN0cnVjdCBjb25zdF9saXN0ICpwKQovKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlICAgICAgICAgICovCi8qICBpbml0aWFsaXplZCB3aXRoIGNvbnN0LWxpc3QgcC4gICAgICAgICAgICAgICAgICAgICAgKi8KewogIGVtaXQoZiwiXHQlc1x0IixkY3RbdCZOUV0pOwogIGlmKCFwLT50cmVlKXsKICAgIGlmKElTRkxPQVQodCkpewogICAgICAvKiAgYXVjaCB3aWVkZXIgbmljaHQgc2VociBzY2hvZW4gdW5kIElFRUUgbm9ldGlnICAgKi8KICAgICAgdW5zaWduZWQgY2hhciAqaXA7CiAgICAgIGlwPSh1bnNpZ25lZCBjaGFyICopJnAtPnZhbC52ZG91YmxlOwogICAgICBlbWl0KGYsIjB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbM10saXBbMl0saXBbMV0saXBbMF0pOwogICAgICBpZigodCZOUSk9PURPVUJMRXx8KHQmTlEpPT1MRE9VQkxFKXsKCWVtaXQoZiwiLDB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbN10saXBbNl0saXBbNV0saXBbNF0pOwogICAgICB9CiAgICB9ZWxzZXsKICAgICAgZW1pdHZhbChmLCZwLT52YWwsKHQmTlUpfFVOU0lHTkVEKTsKICAgIH0KICB9ZWxzZXsKICAgIGludCBtPXAtPnRyZWUtPm8uZmxhZ3MsbWQ9ZHJlbCxtcD1wY3JlbDsKICAgIHAtPnRyZWUtPm8uZmxhZ3MmPX5WQVJBRFI7CiAgICBkcmVsPTA7cGNyZWw9MDsKICAgIGVtaXRfb2JqKGYsJnAtPnRyZWUtPm8sdCZOVSk7CiAgICBwLT50cmVlLT5vLmZsYWdzPW07CiAgICBkcmVsPW1kO3BjcmVsPW1wOwogIH0KICBlbWl0KGYsIlxuIik7bmV3b2JqPTA7Cn0KCgpzdGF0aWMgdm9pZCBwcmVsb2FkKEZJTEUgKmYsSUMgKnApCnsKICBpbnQgdCxyOwoKICBpZigocC0+dHlwZiZWT0xBVElMRSl8fChwLT50eXBmMiZWT0xBVElMRSl8fAogICAgICgocC0+cTEuZmxhZ3MmRFJFRk9CSikmJihwLT5xMS5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSl8fAogICAgICgocC0+cTIuZmxhZ3MmRFJFRk9CSikmJihwLT5xMi5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSl8fAogICAgICgocC0+ei5mbGFncyZEUkVGT0JKKSYmKHAtPnouZHR5cCYoVk9MQVRJTEV8UFZPTEFUSUxFKSkpKQogICAgZW1pdChmLCI7IHZvbGF0aWxlIGJhcnJpZXJcbiIpOwoKICB0PXExdHlwKHApOwogIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKJiZJU0xXT1JEKHQpKXsKICAgIHI9Z2V0X2lkeChmLHApOwogICAgcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOwogICAgbG9hZF9yZWcoZixyLCZwLT5xMSxJTlQpOwogICAgcC0+cTEuZmxhZ3N8PShSRUd8RFJFRk9CSik7CiAgICBwLT5xMS5yZWc9cjsKICB9CiAgdD1xMnR5cChwKTsKICBpZighcC0+cTIuYW0mJihwLT5xMi5mbGFncyYoUkVHfERSRUZPQkp8S09OU1QpKT09RFJFRk9CSiYmSVNMV09SRCh0KSl7CiAgICByPWdldF9pZHgoZixwKTsKICAgIHAtPnEyLmZsYWdzJj1+RFJFRk9CSjsKICAgIGxvYWRfcmVnKGYsciwmcC0+cTIsSU5UKTsKICAgIHAtPnEyLmZsYWdzfD0oUkVHfERSRUZPQkopOwogICAgcC0+cTIucmVnPXI7CiAgfWVsc2UgaWYoaXNyZWcoeikmJigoKHAtPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwLT5xMi5yZWc9PXAtPnoucmVnKXx8KHAtPnEyLmFtJiZwLT5xMi5hbS0+YmFzZT09cC0+ei5yZWcpKSl7CiAgICByPWdldF9pZHgoZixwKTsKICAgIHAtPnEyLmZsYWdzJj1+RFJFRk9CSjsKICAgIGxvYWRfcmVnKGYsciwmcC0+cTIsSU5UKTsKICAgIHAtPnEyLmZsYWdzfD0oUkVHfERSRUZPQkopOwogICAgcC0+cTIucmVnPXI7CiAgfQogIHQ9enR5cChwKTsKICBpZighcC0+ei5hbSYmKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkomJklTTFdPUkQodCkpewogICAgcj1nZXRfaWR4KGYscCk7CiAgICBwLT56IC5mbGFncyY9fkRSRUZPQko7CiAgICBsb2FkX3JlZyhmLHIsJnAtPnogLElOVCk7CiAgICBwLT56IC5mbGFnc3w9KFJFR3xEUkVGT0JKKTsKICAgIHAtPnogLnJlZz1yOwogIH0KfQoKLyogIFRoZSBtYWluIGNvZGUtZ2VuZXJhdGlvbiByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAqLwovKiAgZiBpcyB0aGUgc3RyZWFtIHRoZSBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvLiAgICAgICovCi8qICBwIGlzIGEgcG9pbnRlciB0byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBJQ3MgICAgICAgKi8KLyogIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGJvZHkgdG8gZ2VuZXJhdGUgY29kZSBmb3IuICAqLwovKiAgdiBpcyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCi8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uICAgKi8KLyogIG5lZWRzIGZvciBsb2NhbCB2YXJpYWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwp2b2lkIGdlbl9jb2RlKEZJTEUgKmYsc3RydWN0IElDICpmcCxzdHJ1Y3QgVmFyICp2LHptYXggb2Zmc2V0KQp7CiAgaW50IGMsdCxsYXN0Y29tcD0wLHJlZyxzaG9ydF9hZGQsYml0X3JldmVyc2UsbmVlZF9yZXR1cm49MDsKICBzdHJ1Y3Qgb2JqICpiaXRfb2JqO2NoYXIgKmJpdF9yZWc7CiAgc3RhdGljIGludCBpZG9uZTsKICBzdHJ1Y3Qgb2JqIG87CiAgSUMgKnAsKnAyOwogIGlmKHYtPnRhdHRyJklOVEVSUlVQVCkKICAgIHJldD0icnRpIjsKICBlbHNlIGlmICh2LT50YXR0ciZGQVIpCiAgCXJldD0icnRmIjsKICBlbHNlCiAgICByZXQ9InJ0cyI7IC8qRklYTUU6IGJhbmtlZCAqLwogIGlmKERFQlVHJjEpIHByaW50ZigiZ2VuX2NvZGUoKVxuIik7CiAgZm9yKHA9ZnA7cDtwPXAtPm5leHQpIGNsZWFyX2V4dF9pYygmcC0+ZXh0KTsKICBlbWl0KGYsIiNvZmYxPSVsZFxuIix6bTJsKG9mZnNldCkpOwogIGlmKCEoZ19mbGFnc1s1XSZVU0VERkxBRykpewogICAgcGVlcGhvbGUoZnApOwogICAgaWYoIWZyYW1lX3VzZWQpIG9mZnNldD1sMnptKDBMKTsKICB9CiAgZm9yKGM9MTtjPD1NQVhSO2MrKykgcmVnc1tjXT0ocmVnc2FbY109PVJFR1NBX05FVkVSKT8xOjA7CiAgZm9yKGM9MTtjPD1NQVhSO2MrKyl7CiAgICBpZihyZWdzY3JhdGNoW2NdJiYocmVnc2FbY118fHJlZ3VzZWRbY10pKXsKICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGMpOwogICAgfQogIH0KICB0PTA7CiAgZm9yKHA9ZnA7cDtwPXAtPm5leHQpewogICAgYz1wLT5jb2RlOwogICAgaWYoYz09QUxMT0NSRUcpeyByZWdzW3AtPnExLnJlZ109MTsgaWYocC0+cTEucmVnPT1keCkgcmVnc1thY2NdPXJlZ3NbaXhdPTE7fQogICAgaWYoYz09RlJFRVJFRyl7IHJlZ3NbcC0+cTEucmVnXT0wOyBpZihwLT5xMS5yZWc9PWR4KSByZWdzW2FjY109cmVnc1tpeF09MDt9CiAgICBpZigoYz09TFNISUZUfHxjPT1SU0hJRlQpJiYocC0+dHlwZiZOUSk+PUxPTkcpIHJlZ3VzZWRbaXldPTE7CiAgICBpZihjPT1QVVNIJiYocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPVJFRyl7CiAgICAgIGlmKHptZXF0byhwLT5xMi52YWwudm1heCxaMSkpewoJaWYocmVnc1thY2NdKSB0PSh0PjIpP3Q6MjsKICAgICAgfWVsc2UgaWYoem1lcXRvKHAtPnEyLnZhbC52bWF4LGwyem0oMkwpKSl7CglpZihyZWdzW2FjY10mJnJlZ3NbaXhdJiZyZWdzW2l5XSYmKENQVT09NjgxMnx8cmVnc1tpdV0pKSB0PSh0PjIpP3Q6MjsKICAgICAgfWVsc2UgaWYoem1lcXRvKHAtPnEyLnZhbC52bWF4LGwyem0oNEwpKSl7CglpZihyZWdzW2FjY10pIHQ9KHQ+Mik/dDoyOwogICAgICB9ZWxzZXsKCS8qIFRPRE86IGZpbmVyIGNoZWNrICovCglpZihkcmVsfHwhcmVnc2FbaXVdKQoJICB0PSh0PjgpP3Q6ODsKCWVsc2UKCSAgdD0odD42KT90OjY7CiAgICAgIH0KICAgIH0KICB9CiAgZW1pdChmLCIjdG9mZj0lZFxuIix0KTsKICBsb2ZmPXptMmwob2Zmc2V0KSt0OwogIGZ1bmN0aW9uX3RvcChmLHYsbG9mZik7CiAgc3RhY2tvZmZzZXQ9bm90cG9wcGVkPWRvbnRwb3A9bWF4cHVzaGVkPTA7CiAgZm9yKHA9ZnA7cDtwcihmLHApLHA9cC0+bmV4dCl7CiAgICBjPXAtPmNvZGU7dD1wLT50eXBmOwogICAgaWYoZGVidWdfaW5mbykKICAgICAgZHdhcmYyX2xpbmVfaW5mbyhmLHApOyAKICAgIHNob3J0X2FkZD0wOwogICAgaWYoYz09Tk9QKSBjb250aW51ZTsKICAgIGlmKGM9PUFMTE9DUkVHKXsKICAgICAgcmVnc1twLT5xMS5yZWddPTE7CiAgICAgIGlmKHAtPnExLnJlZz09ZHgpIHJlZ3NbYWNjXT1yZWdzW2l4XT0xOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmKGM9PUZSRUVSRUcpewogICAgICByZWdzW3AtPnExLnJlZ109MDsKICAgICAgaWYocC0+cTEucmVnPT1keCkgcmVnc1thY2NdPXJlZ3NbaXhdPTA7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYobm90cG9wcGVkJiYhZG9udHBvcCl7CiAgICAgIGludCBmbGFnPTA7CiAgICAgIGlmKGM9PUxBQkVMfHxjPT1DT01QQVJFfHxjPT1URVNUfHxjPT1CUkEpewoJZ2VuX3BvcChmLG5vdHBvcHBlZCk7Cglub3Rwb3BwZWQ9MDsKICAgICAgfQogICAgfQogICAgaWYoYz09TEFCRUwpIHtjYz0wO2VtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LHQpO2NvbnRpbnVlO30KICAgIGlmKGM+PUJFUSYmYzw9QkdUJiZ0PT1leGl0X2xhYmVsKSBuZWVkX3JldHVybj0xOwogICAgaWYoYz09QlJBKXsKICAgICAgaWYocC0+dHlwZj09ZXhpdF9sYWJlbCYmIWhhdmVfZnJhbWUpewoJZW1pdChmLCJcdCVzXG4iLHJldCk7CiAgICAgIH1lbHNlewoJaWYodD09ZXhpdF9sYWJlbCkgbmVlZF9yZXR1cm49MTsKCWVtaXQoZiwiXHRicmFcdCVzJWRcbiIsbGFicHJlZml4LHQpOwogICAgICB9CiAgICAgIGNjPTA7Y29udGludWU7CiAgICB9CiAgICBpZihjPj1CRVEmJmM8QlJBKXsgICAgICAKICAgICAgaWYoKGxhc3Rjb21wJlVOU0lHTkVEKXx8SVNQT0lOVEVSKGxhc3Rjb21wKSkKICAgICAgICBlbWl0KGYsIlx0YiVzXHQlcyVkXG4iLHVjY3NbYy1CRVFdLGxhYnByZWZpeCx0KTsKICAgICAgZWxzZQogICAgICAgIGVtaXQoZiwiXHRiJXNcdCVzJWRcbiIsY2NzW2MtQkVRXSxsYWJwcmVmaXgsdCk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYoYz09TU9WRVRPUkVHKXsKICAgICAgbG9hZF9yZWcoZixwLT56LnJlZywmcC0+cTEsU0hPUlQpOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmKGM9PU1PVkVGUk9NUkVHKXsKICAgICAgc3RvcmVfcmVnKGYscC0+cTEucmVnLCZwLT56LFNIT1JUKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICAKICAgIC8qaWYoSVNGTE9BVCh0KSkge3ByaWMyKHN0ZG91dCxwKTtpZXJyb3IoMCk7fSovCgogICAgaWYoKHQmTlEpPT1CSVQpewogICAgICBpZXJyb3IoMCk7CiAgICB9CgogICAgaWYoYz09Q09OVkVSVCYmSVNMV09SRCh0KSYmSVNMV09SRChwLT50eXBmMikpewogICAgICBwLT5jb2RlPWM9QVNTSUdOOwogICAgICBwLT5xMi52YWwudm1heD1sMnptKDRMKTsKICAgIH0KCiAgICBpZigocC0+cTIuZmxhZ3MmUkVHKSYmSVNBQ0MocC0+cTIucmVnKSYmKGM9PUFERHx8Yz09TVVMVHx8Yz09QU5EfHxjPT1PUnx8Yz09WE9SKSl7CiAgICAgIG9iaiBvPXAtPnExOwogICAgICBwLT5xMT1wLT5xMjsKICAgICAgcC0+cTI9bzsKICAgIH0KCiAgICBpZihjPT1URVNUKXsKICAgICAgbGFzdGNvbXA9dDsKICAgICAgcC0+Y29kZT1jPUNPTVBBUkU7CiAgICAgIGd2YWwudm1heD1sMnptKDBMKTsKICAgICAgcC0+cTIuZmxhZ3M9S09OU1Q7CiAgICAgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKICAgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMi52YWwsdCk7CiAgICB9CgogICAgaWYoYz09U1VCUEZQKXsKICAgICAgcC0+Y29kZT1jPVNVQjsKICAgICAgcC0+dHlwZj10PShVTlNJR05FRHxJTlQpOwogICAgfQoKCgogICAgaWYoKGM9PUFTU0lHTnx8Yz09UFVTSCkmJnptZXF0byhwLT5xMi52YWwudm1heCxsMnptKDRMKSkpCiAgICAgIHAtPnR5cGY9dD1MT05HOwoKICAgIHByZWxvYWQoZixwKTsKCiAgICBpZihjPT1BRERJMlB8fGM9PVNVQklGUCl7CiAgICAgIGlmKChwLT50eXBmMiZOUSkhPUhQT0lOVEVSKXsKCWlmKHAtPnEyLmZsYWdzJktPTlNUKXsKCSAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYpOwoJICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmMik7CgkgIHAtPnR5cGY9dD0oVU5TSUdORUR8U0hPUlQpOwoJfWVsc2V7CgkgIGlmKElTTFdPUkQodCkpIGluY19hZGRyKCZwLT5xMiwyLHQpOwoJICBpZigodCZOUSk9PUNIQVIpIHNob3J0X2FkZD10OwoJICBwLT50eXBmPXQ9KFVOU0lHTkVEfFNIT1JUKTsKCX0KICAgICAgfWVsc2UgaWYoSVNIV09SRCh0KSl7CglpZigodCZOUSk9PUxMT05HKSAKCSAgaW5jX2FkZHIoJnAtPnEyLDQsdCk7CgllbHNlIGlmKCh0Jk5RKSE9TE9ORykgCgkgIHNob3J0X2FkZD10OwoJcC0+dHlwZj10PShVTlNJR05FRHxMT05HKTsKICAgICAgfQogICAgICBwLT5jb2RlPWM9KGM9PUFEREkyUCk/QUREOlNVQjsKICAgIH0KCiAgICBpZihjPT1DT01QQVJFJiZJU0xXT1JEKHQpKXsKICAgICAgSUMgKmJyYW5jaD1wLT5uZXh0OwogICAgICBpbnQgcjsKICAgICAgd2hpbGUoYnJhbmNoJiZicmFuY2gtPmNvZGU9PUZSRUVSRUcpIGJyYW5jaD1icmFuY2gtPm5leHQ7CiAgICAgIGlmKCFicmFuY2gpIGllcnJvcigwKTsKICAgICAgYz1icmFuY2gtPmNvZGU7CiAgICAgIGlmKGM8QkVRfHxjPkJHVCkgaWVycm9yKDApOwogICAgICBpZighcmVnc1tpeF0pCglyPWl4OwogICAgICBlbHNlCglyPWdldF9yZWcoZixwLElOVCk7CiAgICAgIAogICAgICBpZihjPT1CRVF8fGM9PUJORSl7CglpbmNfYWRkcigmcC0+cTEsMCx0KTsKCWluY19hZGRyKCZwLT5xMiwwLHQpOwoJbG9hZF9yZWcoZixyLCZwLT5xMSxJTlQpOwoJZW1pdChmLCJcdCVzJXNcdCIsQ1BVPT02ODEyPyJjcCI6ImNtcCIscmVnbmFtZXNbcl0pOwoJZW1pdF9vYmooZiwmcC0+cTIsSU5UKTsKCWVtaXQoZiwiXG4iKTsKCWlmKHB1c2hlZF9hY2MpIGVtaXQoZixTUFVMTEQpOwoJZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYz09QkVRPysrbGFiZWw6YnJhbmNoLT50eXBmKTsKCWlmKHB1c2hlZF9hY2MpIGVtaXQoZixTUFVTSEQpOwoJaW5jX2FkZHIoJnAtPnExLDIsdCk7CglpbmNfYWRkcigmcC0+cTIsMix0KTsKCWxvYWRfcmVnKGYsciwmcC0+cTEsSU5UKTsKCWVtaXQoZiwiXHQlcyVzXHQiLENQVT09NjgxMj8iY3AiOiJjbXAiLHJlZ25hbWVzW3JdKTsKCWVtaXRfb2JqKGYsJnAtPnEyLElOVCk7CgllbWl0KGYsIlxuIik7CglwcihmLHApOwoJaWYoYz09QkVRKXsKCSAgZW1pdChmLCJcdGJlcVx0JXMlZFxuIixsYWJwcmVmaXgsYnJhbmNoLT50eXBmKTsKCSAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOwoJfWVsc2UKCSAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYnJhbmNoLT50eXBmKTsKICAgICAgfWVsc2V7CglpbmNfYWRkcigmcC0+cTEsMCx0KTsKCWluY19hZGRyKCZwLT5xMiwwLHQpOwoJbG9hZF9yZWcoZixyLCZwLT5xMSxJTlQpOwoJZW1pdChmLCJcdCVzJXNcdCIsQ1BVPT02ODEyPyJjcCI6ImNtcCIscmVnbmFtZXNbcl0pOwoJZW1pdF9vYmooZiwmcC0+cTIsSU5UKTsKCWVtaXQoZiwiXG4iKTsKCWxhYmVsKys7CglpZihwdXNoZWRfYWNjKSBlbWl0KGYsU1BVTExEKTsKCWlmKHQmVU5TSUdORUQpewoJICBpZihjPT1CTFR8fGM9PUJHVCkKCSAgICBlbWl0KGYsIlx0YiVzXHQlcyVkXG4iLChjPT1CTFQpPyJsbyI6ImhpIixsYWJwcmVmaXgsYnJhbmNoLT50eXBmKTsKCSAgZWxzZQoJICAgIGVtaXQoZiwiXHRiJXNcdCVzJWRcbiIsKGM9PUJHRSk/ImxvIjoiaGkiLGxhYnByZWZpeCxsYWJlbCk7Cgl9ZWxzZXsKCSAgaWYoYz09QkxUfHxjPT1CR1QpCgkgICAgZW1pdChmLCJcdGIlc1x0JXMlZFxuIiwoYz09QkxUKT8ibHQiOiJndCIsbGFicHJlZml4LGJyYW5jaC0+dHlwZik7CgkgIGVsc2UKCSAgICBlbWl0KGYsIlx0YiVzXHQlcyVkXG4iLChjPT1CR0UpPyJsdCI6Imd0IixsYWJwcmVmaXgsbGFiZWwpOwoJfQoJZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsKGM9PUJMVHx8Yz09QkdUKT9sYWJlbDpicmFuY2gtPnR5cGYpOwoJaWYocHVzaGVkX2FjYykgZW1pdChmLFNQVVNIRCk7CglpbmNfYWRkcigmcC0+cTEsMix0KTsKCWluY19hZGRyKCZwLT5xMiwyLHQpOwoJbG9hZF9yZWcoZixyLCZwLT5xMSxJTlQpOwoJZW1pdChmLCJcdCVzJXNcdCIsQ1BVPT02ODEyPyJjcCI6ImNtcCIscmVnbmFtZXNbcl0pOwoJZW1pdF9vYmooZiwmcC0+cTIsSU5UKTsKCWVtaXQoZiwiXG4iKTsKCXByKGYscCk7CgllbWl0KGYsIlx0YiVzXHQlcyVkXG4iLHVjY3NbYy1CRVFdLGxhYnByZWZpeCxicmFuY2gtPnR5cGYpOwoJZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOwogICAgICB9CiAgICAgIGJyYW5jaC0+Y29kZT1OT1A7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmKElTTFdPUkQodCkmJihjPT1MU0hJRlR8fGM9PVJTSElGVCkpewogICAgICBpbnQgY250PS0xMDAwLGkscj0wOwogICAgICBpbnQgcHg9MCxweT0wLHBhPTA7CiAgICAgIGlmKGlzY29uc3QocTIpKXsKCWV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmMik7CgljbnQ9KGludCl6bTJsKHZtYXgpOwoJaWYoY250PT0xJiZjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSl7CgkgIGlmKGM9PUxTSElGVCkKCSAgICBlbWl0KGYsIlx0bHNsXHQiKTsKCSAgZWxzZQoJICAgIGVtaXQoZiwiXHQlc1x0IiwodCZVTlNJR05FRCk/ImxzciI6ImFzciIpOwoJICBpbmNfYWRkcigmcC0+eixjPT1MU0hJRlQ/MzowLHQpOwoJICBlbWl0X29iaihmLCZwLT56LHQpOwoJICBlbWl0KGYsIlxuIik7CgkgIGVtaXQoZiwiXHQlc1x0IiwoYz09TFNISUZUKT8icm9sIjoicm9yIik7CgkgIGluY19hZGRyKCZwLT56LGM9PUxTSElGVD8tMToxLHQpOwoJICBlbWl0X29iaihmLCZwLT56LHQpOwoJICBlbWl0KGYsIlxuIik7CgkgIGVtaXQoZiwiXHQlc1x0IiwoYz09TFNISUZUKT8icm9sIjoicm9yIik7CgkgIGluY19hZGRyKCZwLT56LGM9PUxTSElGVD8tMToxLHQpOwoJICBlbWl0X29iaihmLCZwLT56LHQpOwoJICBlbWl0KGYsIlxuIik7CgkgIGVtaXQoZiwiXHQlc1x0IiwoYz09TFNISUZUKT8icm9sIjoicm9yIik7CgkgIGluY19hZGRyKCZwLT56LGM9PUxTSElGVD8tMToxLHQpOwoJICBlbWl0X29iaihmLCZwLT56LHQpOwoJICBlbWl0KGYsIlxuIik7CgkgIGNvbnRpbnVlOwoJfQogICAgICB9CiAgICAgIGluY19hZGRyKCZwLT5xMSwyLHQpOwogICAgICBpbmNfYWRkcigmcC0+eiwyLHQpOwoKICAgICAgaWYoSVNSQUNDKHEyKXx8KHJlZ3NbYWNjXSYmIXNjcmF0Y2hyZWcoYWNjLHApKSl7CgllbWl0KGYsU1BVU0hEKTsKCXB1c2goMik7CglwYT0xOwogICAgICB9CgogICAgICBpZihjbnQ8MHx8KG9wdHNpemUmJmNudD4xKXx8KGNudD4zJiYhb3B0c3BlZWQpKXsKCWlmKHJlZ3NbaXhdJiYhc2NyYXRjaHJlZyhpeCxwKSkge3B4PTE7ZW1pdChmLFNQVVNIKCJ4IikpO3B1c2goMik7fQoJaWYocmVnc1tpeV0mJiFzY3JhdGNocmVnKGl5LHApKSB7cHk9MTtlbWl0KGYsU1BVU0goInkiKSk7cHVzaCgyKTt9CiAgICAgIH0KCiAgICAgIGlmKCFjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSl7Cglsb2FkX3JlZyhmLGFjYywmcC0+cTEsSU5UKTsKCXN0b3JlX3JlZyhmLGFjYywmcC0+eixJTlQpOwogICAgICB9CiAgICAgIGluY19hZGRyKCZwLT5xMSwtMix0KTsKICAgICAgaW5jX2FkZHIoJnAtPnosLTIsdCk7CiAgICAgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSxJTlQpOwogICAgICBpZihjbnQ8MHx8KG9wdHNpemUmJmNudD4xKXx8KGNudD4zJiYhb3B0c3BlZWQpKXsKCWlmKChwLT5xMi5mbGFncyZSRUcpJiZwLT5xMi5yZWc9PWl4KXsKCSAgaWYoKHAtPnouZmxhZ3MmUkVHKSYmcC0+ei5yZWc9PWl5KSBpZXJyb3IoMCk7Cgl9ZWxzZQoJICBsb2FkX2FkZHIoZixpeCwmcC0+eik7CglpZihJU1JBQ0MocTIpKXsKCSAgaWYoc2NyYXRjaHJlZyhhY2MscCkmJihweCtweT09MCkpewoJICAgIGVtaXQoZixTUFVMTCgieSIpKTsKCSAgICBwb3AoMik7cGE9MDsKCSAgfWVsc2UKCSAgICBlbWl0KGYsIlx0bGR5XHQlZCwlc1xuIiwocHgrcHkpKjIscmVnbmFtZXNbc3BdKTsKCX1lbHNlCgkgIGxvYWRfcmVnKGYsaXksJnAtPnEyLHAtPnR5cGYyKTsgLypUT0RPOiB0eXBlcyE9SU5UPz8gKi8KCWlmKChwLT5xMi5mbGFncyZSRUcpJiZwLT5xMi5yZWc9PWl4KQoJICBsb2FkX2FkZHIoZixpeCwmcC0+eik7CglpZihjPT1MU0hJRlQpCgkgIGVtaXQoZiwiXHQlc1x0JXNfX2xzbGxcbiIsanNyaW5zdCxpZHByZWZpeCk7CgllbHNlCgkgIGVtaXQoZiwiXHQlc1x0JXNfXyVzXG4iLGpzcmluc3QsaWRwcmVmaXgsKHQmVU5TSUdORUQpPyJsc3JsIjoiYXNybCIpOwoJaWYocHkpIHtlbWl0KGYsU1BVTEwoInkiKSk7cG9wKDIpO30KCWlmKHB4KSB7ZW1pdChmLFNQVUxMKCJ4IikpO3BvcCgyKTt9CiAgICAgIH1lbHNlewoJaW5jX2FkZHIoJnAtPnosYz09TFNISUZUPzM6Mix0KTsKCWZvcihpPTA7aTxjbnQ7aSsrKXsKCSAgaWYoYz09TFNISUZUKXsKCSAgICBlbWl0KGYsIlx0bHNsXHQiKTsKCSAgICBlbWl0X29iaihmLCZwLT56LENIQVIpOwoJICAgIGVtaXQoZiwiXG4iKTsKCSAgICBpbmNfYWRkcigmcC0+eiwtMSx0KTsKCSAgICBlbWl0KGYsIlx0cm9sXHQiKTsKCSAgICBlbWl0X29iaihmLCZwLT56LENIQVIpOwoJICAgIGVtaXQoZiwiXG4iKTsKCSAgICBpbmNfYWRkcigmcC0+eiwxLHQpOwoJICAgIGVtaXQoZiwiXHRyb2xiXG4iKTsKCSAgICBlbWl0KGYsIlx0cm9sYVxuIik7CgkgIH1lbHNlewoJICAgIGVtaXQoZiwiXHQlc1xuIiwodCZVTlNJR05FRCk/ImxzcmEiOiJhc3JhIik7CgkgICAgZW1pdChmLCJcdHJvcmJcbiIpOwoJICAgIGVtaXQoZiwiXHRyb3JcdCIpOwoJICAgIGVtaXRfb2JqKGYsJnAtPnosQ0hBUik7CgkgICAgZW1pdChmLCJcbiIpOwoJICAgIGluY19hZGRyKCZwLT56LDEsdCk7CgkgICAgZW1pdChmLCJcdHJvclx0Iik7CgkgICAgZW1pdF9vYmooZiwmcC0+eixDSEFSKTsKCSAgICBlbWl0KGYsIlxuIik7CgkgICAgaW5jX2FkZHIoJnAtPnosLTEsdCk7CgkgIH0KCX0KCWluY19hZGRyKCZwLT56LGM9PUxTSElGVD8tMzotMix0KTsKCXN0b3JlX3JlZyhmLGFjYywmcC0+eixJTlQpOwogICAgICB9CiAgICAgIGlmKHBhKSB7ZW1pdChmLFNQVUxMRCk7cG9wKDIpO30KICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYoSVNMV09SRCh0KSYmYyE9R0VUUkVUVVJOJiZjIT1TRVRSRVRVUk4mJmMhPUNPTVBBUkUmJmMhPUNPTlZFUlQmJmMhPUFERFJFU1MpewogICAgICBpZihjPT1QVVNIJiZpc3JlZyhxMSkmJnAtPnExLnJlZz09ZHgpewoJaWYoQ1BVPT02ODEyKXsKCSAgZW1pdChmLCJcdHBzaGRcbiIpOwoJICBlbWl0KGYsIlx0cHNoeFxuIik7Cgl9ZWxzZXsKCSAgLy9lbWl0KGYsIlx0cHNoc1x0YSxiLHhcbiIpOwoJICBlbWl0KGYsIlx0cHNoc1x0YixhXG4iKTsKCSAgZW1pdChmLCJcdHBzaHNcdHhcbiIpOwoJfQoJcHVzaCg0KTsKCWNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmKGM9PUFTU0lHTiYmaXNyZWcocTEpJiZwLT5xMS5yZWc9PWR4KXsKCWluY19hZGRyKCZwLT56LDIsdCk7CglzdG9yZV9yZWcoZixpeCwmcC0+eixJTlQpOwoJaW5jX2FkZHIoJnAtPnosLTIsdCk7CglzdG9yZV9yZWcoZixhY2MsJnAtPnosSU5UKTsKCWNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmKGM9PUFTU0lHTiYmaXNyZWcoeikmJnAtPnoucmVnPT1keCl7CglpbmNfYWRkcigmcC0+cTEsMix0KTsKCWxvYWRfcmVnKGYsaXgsJnAtPnExLElOVCk7CglpbmNfYWRkcigmcC0+cTEsLTIsdCk7Cglsb2FkX3JlZyhmLGFjYywmcC0+cTEsSU5UKTsKCWNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmKGM9PVBVU0gpewoJaWYocmVnc1thY2NdKSBlbWl0KGYsIlx0c3RkXHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTItc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKICAgICAgfWVsc2UKCWdldF9hY2MoZixwKTsKICAgICAgLypUT0RPOiBhY2MgaW4gSUMsIGNvbnN0YW50cyAqLwogICAgICBpbmNfYWRkcigmcC0+cTEsMix0KTsKICAgICAgaWYoYz09TUlOVVMpewoJaWYoQ1BVIT02ODEyJiYhb3B0c2l6ZSkKCSAgZW1pdChmLCJcdGxkZFx0IzBcbiIpOwoJZWxzZQoJICBlbWl0KGYsIlx0Y2xyYVxuXHRjbHJiXG4iKTsKICAgICAgfWVsc2UKCWxvYWRfcmVnKGYsYWNjLCZwLT5xMSxJTlQpOwogICAgICBpZihjPT1BRER8fGM9PVNVQil7CglpbmNfYWRkcigmcC0+cTIsMix0KTsKCWVtaXQoZiwiXHQlc1x0IixjPT1BREQ/ImFkZGQiOiJzdWJkIik7CgllbWl0X29iaihmLCZwLT5xMixJTlQpOwoJZW1pdChmLCJcbiIpOwogICAgICB9ZWxzZSBpZihjPT1BU1NJR058fGM9PVBVU0gpewogICAgICB9ZWxzZSBpZihjPT1NSU5VUyl7CgllbWl0KGYsIlx0c3ViZFx0Iik7CgllbWl0X29iaihmLCZwLT5xMSxJTlQpOwoJZW1pdChmLCJcbiIpOwogICAgICB9ZWxzZSBpZihjPT1LT01QTEVNRU5UKXsKCWVtaXQoZiwiXHRjb21hXG4iKTsKCWVtaXQoZiwiXHRjb21iXG4iKTsKICAgICAgfWVsc2V7CglpZihjPT1BTkQpCgkgIGVtaXQoZiwiXHRhbmRiXHQiKTsKCWVsc2UgaWYoYz09T1IpCgkgIGVtaXQoZiwiXHRvciVzYlx0IixDUFU9PTY4MTI/ImEiOiIiKTsKCWVsc2UgaWYoYz09WE9SKQoJICBlbWl0KGYsIlx0ZW9yYlx0Iik7CglpbmNfYWRkcigmcC0+cTIsMyx0KTsKCWVtaXRfb2JqKGYsJnAtPnEyLENIQVIpOwoJZW1pdChmLCJcbiIpOwoJaWYoYz09QU5EKQoJICBlbWl0KGYsIlx0YW5kYVx0Iik7CgllbHNlIGlmKGM9PU9SKQoJICBlbWl0KGYsIlx0b3Ilc2FcdCIsQ1BVPT02ODEyPyJhIjoiIik7CgllbHNlIGlmKGM9PVhPUikKCSAgZW1pdChmLCJcdGVvcmFcdCIpOwoJaW5jX2FkZHIoJnAtPnEyLC0xLHQpOwoJZW1pdF9vYmooZiwmcC0+cTIsQ0hBUik7CgllbWl0KGYsIlxuIik7CiAgICAgIH0KICAgICAgaWYoYz09UFVTSCl7CglpZihDUFU9PTY4MTIpCgkgIGVtaXQoZiwiXHRwc2hkXG4iKTsKCWVsc2UKCSAgZW1pdChmLCJcdHBzaHNcdGIsYVxuIik7CglwdXNoKDIpO2RvbnRwb3ArPTI7CiAgICAgIH1lbHNlewoJaW5jX2FkZHIoJnAtPnosMix0KTsKCXN0b3JlX3JlZyhmLGFjYywmcC0+eixJTlQpOwogICAgICB9CiAgICAgIGluY19hZGRyKCZwLT5xMSwtMix0KTsKICAgICAgaWYoYz09TUlOVVMpCgllbWl0KGYsIlx0bGRkXHQjMFxuIik7CiAgICAgIGVsc2UKCWxvYWRfcmVnKGYsYWNjLCZwLT5xMSxJTlQpOwogICAgICBpZihjPT1BREQpCgllbWl0KGYsIlx0YWRjYlx0Iik7CiAgICAgIGVsc2UgaWYoYz09U1VCKQoJZW1pdChmLCJcdHNiY2JcdCIpOwogICAgICBlbHNlIGlmKGM9PUFORCkKCWVtaXQoZiwiXHRhbmRiXHQiKTsKICAgICAgZWxzZSBpZihjPT1PUikKCWVtaXQoZiwiXHRvciVzYlx0IixDUFU9PTY4MTI/ImEiOiIiKTsKICAgICAgZWxzZSBpZihjPT1YT1IpCgllbWl0KGYsIlx0ZW9yYlx0Iik7CiAgICAgIGVsc2UgaWYoYz09S09NUExFTUVOVCkKCWVtaXQoZiwiXHRjb21iXG4iKTsKICAgICAgZWxzZSBpZihjPT1NSU5VUyl7CglpbmNfYWRkcigmcC0+cTEsMSx0KTsKCWVtaXQoZiwiXHRzYmNiXHQiKTsKCWVtaXRfb2JqKGYsJnAtPnExLENIQVIpOwoJZW1pdChmLCJcbiIpOwogICAgICB9CiAgICAgIGlmKHAtPnEyLmZsYWdzKXsKCWluY19hZGRyKCZwLT5xMiwtMSx0KTsKCWVtaXRfb2JqKGYsJnAtPnEyLENIQVIpOwoJZW1pdChmLCJcbiIpOwogICAgICB9CiAgICAgIGlmKGM9PUFERCkKCWVtaXQoZiwiXHRhZGNhXHQiKTsKICAgICAgZWxzZSBpZihjPT1TVUIpCgllbWl0KGYsIlx0c2JjYVx0Iik7CiAgICAgIGVsc2UgaWYoYz09QU5EKQoJZW1pdChmLCJcdGFuZGFcdCIpOwogICAgICBlbHNlIGlmKGM9PU9SKQoJZW1pdChmLCJcdG9yJXNhXHQiLENQVT09NjgxMj8iYSI6IiIpOwogICAgICBlbHNlIGlmKGM9PVhPUikKCWVtaXQoZiwiXHRlb3JhXHQiKTsKICAgICAgZWxzZSBpZihjPT1LT01QTEVNRU5UKQoJZW1pdChmLCJcdGNvbWFcbiIpOwogICAgICBlbHNlIGlmKGM9PU1JTlVTKXsKCWluY19hZGRyKCZwLT5xMSwtMSx0KTsKCWVtaXQoZiwiXHRzYmNhXHQiKTsKCWVtaXRfb2JqKGYsJnAtPnExLENIQVIpOwoJZW1pdChmLCJcbiIpOwogICAgICB9CiAgICAgIGlmKHAtPnEyLmZsYWdzKXsKCWluY19hZGRyKCZwLT5xMiwtMSx0KTsKCWVtaXRfb2JqKGYsJnAtPnEyLENIQVIpOwoJZW1pdChmLCJcbiIpOwogICAgICB9CiAgICAgIGlmKGM9PVBVU0gpewoJaWYoQ1BVPT02ODEyKQoJICBlbWl0KGYsIlx0cHNoZFxuIik7CgllbHNlCgkgIGVtaXQoZiwiXHRwc2hzXHRiLGFcbiIpOwoJcHVzaCgyKTtkb250cG9wKz0yOwoJaWYocmVnc1thY2NdKSBlbWl0KGYsIlx0bGRkXHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTItc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKICAgICAgfWVsc2V7CglpbmNfYWRkcigmcC0+eiwtMix0KTsKCXN0b3JlX3JlZyhmLGFjYywmcC0+eixJTlQpOwogICAgICB9CiAgICAgIGNvbnRpbnVlOwogICAgfQoKIAogICAgaWYoYz09Q09NUEFSRSl7CiAgICAgIGludCB2YWRyOwogICAgICBpZihkcmVsJiYocC0+cTEuZmxhZ3MmVkFSQURSKSYmIUlTRlVOQyhwLT5xMS52LT52dHlwLT5mbGFncykpIHZhZHI9MTsKICAgICAgZWxzZSBpZihkcmVsJiYocC0+cTIuZmxhZ3MmVkFSQURSKSYmIUlTRlVOQyhwLT5xMi52LT52dHlwLT5mbGFncykpIHZhZHI9MjsKICAgICAgZWxzZSBpZihwY3JlbCYmKHAtPnExLmZsYWdzJlZBUkFEUikmJklTRlVOQyhwLT5xMS52LT52dHlwLT5mbGFncykpIHZhZHI9MTsKICAgICAgZWxzZSBpZihwY3JlbCYmKHAtPnEyLmZsYWdzJlZBUkFEUikmJklTRlVOQyhwLT5xMi52LT52dHlwLT5mbGFncykpIHZhZHI9MjsKICAgICAgZWxzZSB2YWRyPTA7CiAgICAgIGlmKHZhZHIhPTEmJih2YWRyPT0yfHxpc2NvbnN0KHExKXx8SVNSQUNDKHEyKSkpewoJc3RydWN0IElDICpwMjsKCW89cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bzsKCXAyPXAtPm5leHQ7Cgl3aGlsZShwMiYmcDItPmNvZGU9PUZSRUVSRUcpIHAyPXAyLT5uZXh0OwoJaWYoIXAyfHxwMi0+Y29kZTxCRVF8fHAyLT5jb2RlPkJHVCkgaWVycm9yKDApOwoJaWYocDItPmNvZGU9PUJMVCkgcDItPmNvZGU9QkdUOwoJZWxzZSBpZihwMi0+Y29kZT09QkdUKSBwMi0+Y29kZT1CTFQ7CgllbHNlIGlmKHAyLT5jb2RlPT1CTEUpIHAyLT5jb2RlPUJHRTsKCWVsc2UgaWYocDItPmNvZGU9PUJHRSkgcDItPmNvZGU9QkxFOwogICAgICB9CiAgICAgIC8qIGNhc2Ugd2l0aCB0d28gcmVsYXRpdmUgYWRkcmVzc2VzICovCiAgICAgIGlmKGRyZWwmJihwLT5xMi5mbGFncyZWQVJBRFIpJiYhSVNGVU5DKHAtPnEyLnYtPnZ0eXAtPmZsYWdzKSkgc2tpcF9yZWw9MTsKICAgICAgaWYocGNyZWwmJihwLT5xMi5mbGFncyZWQVJBRFIpJiZJU0ZVTkMocC0+cTIudi0+dnR5cC0+ZmxhZ3MpKSBza2lwX3JlbD0xOwogICAgfQojaWYgMAogICAgLyogVE9ETzogZml4IGNjICovCiAgICBpZihjPT1DT01QQVJFJiZpc2NvbnN0KHEyKSl7CiAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKICAgICAgaWYoSVNOVUxMKCkpewoJaWYoY2MmJihjY190Jk5VKT09KHQmTlUpJiZjb21wYXJlX29iamVjdHMoY2MsJnAtPnExKSl7CgkgIGxhc3Rjb21wPXQ7Y29udGludWU7Cgl9CiAgICAgIH0KICAgIH0KI2VuZGlmCgogICAgaWYoIXNob3J0X2FkZCkKICAgICAgc3dpdGNoX0lDKHApOwoKICAgIGlmKGM9PUNPTlZFUlQpewogICAgICBpbnQgdG89cC0+dHlwZjImTlU7CiAgICAgIGlmKHRvPT1JTlQpIHRvPVNIT1JUOwogICAgICBpZih0bz09KFVOU0lHTkVEfElOVCl8fHRvPT1OUE9JTlRFUikgdG89KFVOU0lHTkVEfFNIT1JUKTsKICAgICAgaWYodG89PUZQT0lOVEVSfHx0bz09SFBPSU5URVIpIHRvPShVTlNJR05FRHxMT05HKTsKICAgICAgaWYoKHQmTlUpPT1JTlQpIHQ9U0hPUlQ7CiAgICAgIGlmKCh0Jk5VKT09KFVOU0lHTkVEfElOVCl8fCh0Jk5VKT09TlBPSU5URVIpIHQ9KFVOU0lHTkVEfFNIT1JUKTsKICAgICAgaWYoKHQmTlEpPT1GUE9JTlRFUnx8KHQmTlEpPT1IUE9JTlRFUikgdD0oVU5TSUdORUR8TE9ORyk7CiAgICAgIC8qaWYoKHQmTlEpPj1MT05HfHwodG8mTlEpPj1MT05HKSBpZXJyb3IoMCk7Ki8KICAgICAgaWYoKHRvJk5RKTw9TE9ORyYmKHQmTlEpPD1MT05HKXsKCWlmKCh0byZOUSk8KHQmTlEpKXsKCSAgaWYoSVNMV09SRCh0KSl7CgkgICAgZ2V0X2FjYyhmLHApOwoJICAgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0byk7CgkgICAgaWYoKHRvJk5VKT09Q0hBUikKCSAgICAgIGVtaXQoZixTRVgpOwoJICAgIGVsc2UgaWYoKHRvJk5VKT09KFVOU0lHTkVEfENIQVIpKQoJICAgICAgZW1pdChmLCJcdGNscmFcbiIpOwoJICAgIGluY19hZGRyKCZwLT56LDIsdCk7CgkgICAgc3RvcmVfcmVnKGYsYWNjLCZwLT56LElOVCk7CgkgICAgaW5jX2FkZHIoJnAtPnosLTIsdCk7CgkgICAgaWYodG8mVU5TSUdORUQpewoJICAgICAgZW1pdChmLCJcdGNscmFcblx0Y2xyYlxuIik7CgkgICAgfWVsc2V7CgkgICAgICBpZihDUFU9PTY4MTIpCgkJZW1pdChmLCJcdGV4Z1x0YSxiXG4iKTsKCSAgICAgIGVsc2UKCQllbWl0KGYsIlx0dGZyXHRhLGJcbiIpOwoJICAgICAgZW1pdChmLFNFWCk7CgkgICAgICBlbWl0KGYsIlx0dGZyXHRhLGJcbiIpOwoJICAgIH0KCSAgICBzdG9yZV9yZWcoZixhY2MsJnAtPnosSU5UKTsKCSAgICBjb250aW51ZTsKCSAgfQoJICAvKmVtaXQoZiwiI2NvbnYgUkFDQz0lZCwgcmVncz0lZCBzY3JhdGNoPSVkXG4iLChpbnQpSVNSQUNDKHopLHJlZ3NbYWNjXSxzY3JhdGNocmVnKGFjYyxwKSk7Ki8KCSAgaWYoIUlTUkFDQyh6KSkKCSAgICBnZXRfYWNjKGYscCk7CgkgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0byk7CgkgIGlmKHRvJlVOU0lHTkVEKQoJICAgIGVtaXQoZiwiXHRjbHJhXG4iKTsKCSAgZWxzZQoJICAgIGVtaXQoZixTRVgpOwoJICBzdG9yZV9yZWcoZixhY2MsJnAtPnosdCk7CgkgIGNjPSZwLT56O2NjX3Q9dDsKCSAgY29udGludWU7Cgl9ZWxzZSBpZigodG8mTlEpPih0Jk5RKSl7CgkgIGlmKCFJU1JBQ0MoeikmJiFJU1JBQ0MocTEpKQoJICAgIGdldF9hY2MoZixwKTsKCSAgaWYoSVNMV09SRCh0bykpCgkgICAgaW5jX2FkZHIoJnAtPnExLDIsdG8pOwoJICBsb2FkX3JlZyhmLGFjYywmcC0+cTEsdG8pOwoJICBzdG9yZV9yZWcoZixhY2MsJnAtPnosdCk7CgkgIGNvbnRpbnVlOwoJfWVsc2V7CgkgIGM9QVNTSUdOOwoJICBwLT5xMi52YWwudm1heD1zaXpldGFiW3QmTlFdOwoJfQogICAgICB9CiAgICB9CiAgICBpZihjPT1LT01QTEVNRU5UKXsKICAgICAgY2M9MDsKICAgICAgaWYoY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikmJiFpc3JlZyhxMSkmJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKSE9RFJFRk9CSiYmKCFwLT5xMS5hbXx8cC0+cTEuYW0tPmZsYWdzIT1BQ0NfSU5EKSl7CgllbWl0KGYsIlx0Y29tXHQiKTsKCWVtaXRfb2JqKGYsJnAtPnosdCk7CgllbWl0KGYsIlxuIik7CglpZihJU0hXT1JEKHQpKXsKCSAgbW9iaj1wLT56OwoJICBpbmNfYWRkcigmbW9iaiwxLHQpOwoJICBlbWl0KGYsIlx0Y29tXHQiKTsKCSAgZW1pdF9vYmooZiwmbW9iaixJTlQpOwoJICBlbWl0KGYsIlxuIik7Cgl9Cgljb250aW51ZTsKICAgICAgfQogICAgICBpZigoIWlzcmVnKHopfHxwLT56LnJlZyE9YWNjKSYmcmVnc1thY2NdJiYhc2NyYXRjaHJlZyhhY2MscCkpCglnZXRfYWNjKGYscCk7CiAgICAgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0KTsKICAgICAgZW1pdChmLCJcdGNvbWFcblx0Y29tYlxuIik7CiAgICAgIHN0b3JlX3JlZyhmLGFjYywmcC0+eix0KTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZihjPT1NSU5VUyl7CiAgICAgIGlmKCghaXNyZWcoeil8fHAtPnoucmVnIT1hY2MpJiZyZWdzW2FjY10mJiFzY3JhdGNocmVnKGFjYyxwKSkKCWdldF9hY2MoZixwKTsKICAgICAgaWYoaXNyZWcocTEpKXsKCWxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0KTsKCWVtaXQoZiwiXHRuZWdhXG5cdG5lZ2Jcblx0c2JjYVx0IzBcbiIpOwogICAgICB9ZWxzZXsKCWlmKENQVSE9NjgxMiYmIW9wdHNpemUpCgkgIGVtaXQoZiwiXHRsZGRcdCMwXG4iKTsKCWVsc2UKCSAgZW1pdChmLCJcdGNscmFcblx0Y2xyYlxuIik7CgllbWl0KGYsIlx0c3ViZFx0Iik7CgllbWl0X29iaihmLCZwLT5xMSx0KTsKCWVtaXQoZiwiXG4iKTsKICAgICAgfQogICAgICBjYz0mcC0+ejtjY190PXQ7CiAgICAgIHN0b3JlX3JlZyhmLGFjYywmcC0+eix0KTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZihjPT1TRVRSRVRVUk4pewogICAgICBpZihpc3JlZyhxMSkmJnAtPnExLnJlZz09cC0+ei5yZWcpIGNvbnRpbnVlOwogICAgICBpZihwLT56LnJlZyl7CglpZihJU0xXT1JEKHQpKXsKCSAgaW5jX2FkZHIoJnAtPnExLDAsdCk7CgkgIGxvYWRfcmVnKGYsaXgsJnAtPnExLElOVCk7CgkgIEJTRVQocmVnc19tb2RpZmllZCxpeCk7CgkgIGluY19hZGRyKCZwLT5xMSwyLHQpOwoJfQoJbG9hZF9yZWcoZixhY2MsJnAtPnExLHQpOwoJQlNFVChyZWdzX21vZGlmaWVkLGFjYyk7CgogICAgICB9CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYoYz09R0VUUkVUVVJOKXsKICAgICAgaWYoaXNyZWcoeikmJnAtPnoucmVnPT1wLT5xMS5yZWcpIGNvbnRpbnVlOwogICAgICBpZihwLT5xMS5yZWcpewoJaWYoSVNMV09SRCh0KSl7CgkgIHN0b3JlX3JlZyhmLGl4LCZwLT56LElOVCk7CgkgIEJTRVQocmVnc19tb2RpZmllZCxpeCk7CgkgIGluY19hZGRyKCZwLT56LDIsdCk7Cgl9CglzdG9yZV9yZWcoZixhY2MsJnAtPnosKHQmTlEpPT1DSEFSP3Q6SU5UKTsKICAgICAgfQogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmKGM9PUNBTEwpewogICAgICBpbnQgcmVnLGptcD0wOwogICAgICBjYz0wOwogICAgICBpZighY2FsY19yZWdzKHAsZiE9MCkmJnYtPmZpKSB2LT5maS0+ZmxhZ3MmPX5BTExfUkVHUzsKICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJiFzdHJjbXAoIl9fdmFfc3RhcnQiLHAtPnExLnYtPmlkZW50aWZpZXIpKXsKCWxvbmcgb2Y9dmFfb2Zmc2V0KHYpK2xvZmYrMjsKCWVtaXQoZiwiXHR0ZnJcdCVzLGRcbiIscmVnbmFtZXNbc3BdKTsKCWlmKG9mKSBlbWl0KGYsIlx0YWRkZFx0IyVsZFxuIixvZik7Cgljb250aW51ZTsKICAgICAgfQogICAgICBpZigocC0+cTEuZmxhZ3MmVkFSKSYmcC0+cTEudi0+ZmkmJnAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKXsKCWVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKCWptcD0xOwogICAgICB9ZWxzZXsKCWlmKHN0YWNrb2Zmc2V0PT0wJiYhaGF2ZV9mcmFtZSYmIXN0cmNtcChyZXQsInJ0cyIpKXsKCSAgc3RydWN0IElDICpwMjsKCSAgam1wPTE7CgkgIGZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKCSAgICBpZihwMi0+Y29kZSE9RlJFRVJFRyYmcDItPmNvZGUhPUFMTE9DUkVHJiZwMi0+Y29kZSE9TEFCRUwpewoJICAgICAgam1wPTA7YnJlYWs7CgkgICAgfQoJICB9Cgl9CglpZihwLT5xMS5mbGFncyZEUkVGT0JKKXsKCSAgLypGSVhNRTogdGVzdCB0aGlzKi8KCSAgaWYoam1wKQoJICAgIGVtaXQoZiwiXHRqbXBcdCIpOwoJICBlbHNlCgkgICAgZW1pdChmLCJcdGpzclx0Iik7CgkgIGlmIChwLT5xMS52LT50YXR0ciZGQVIpCgkgIAllbWl0KGYsIlx0ZmFyXHQiKTsKCSAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CgkgIGVtaXQoZiwiXG4iKTsKCX1lbHNlewoJICBpZihqbXApewoJICAgIGVtaXQoZiwiXHQlc1x0IixqbXBpbnN0KTsgLyplbWl0KGYsIlx0YnJhXHQiKTsqLwoJICAgIC8qaWYoIW5lZWRfcmV0dXJuKSByZXQ9MDsqLyAvKlRPRE86IHdvcmtzIHdpdGggb3B0aW1pemVyPyAqLwoJICB9ZWxzZXsKCSAgICBlbWl0KGYsIlx0JXNcdCIsanNyaW5zdCk7IC8qZW1pdChmLCJcdGJzclx0Iik7Ki8KCSAgfQoJICBpZiAocC0+cTEudi0+dGF0dHImRkFSKQoJICAJZW1pdChmLCJcdGZhclx0Iik7CgkgIGlmKHBjcmVsKXsKCSAgICBwY3JlbD0wOwoJICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOwoJICAgIHBjcmVsPTE7CgkgIH1lbHNlCgkgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CgkgIGVtaXQoZiwiXG4iKTsKCX0KICAgICAgfQogICAgICBpZihzdGFja192YWxpZCl7CiAgICAgICAgaW50IGk7CiAgICAgICAgaWYocC0+Y2FsbF9jbnQ8PTApewogICAgICAgICAgZXJyX2ljPXA7aWYoZikgZXJyb3IoMzIwKTsKICAgICAgICAgIHN0YWNrX3ZhbGlkPTA7CiAgICAgICAgfQogICAgICAgIGZvcihpPTA7c3RhY2tfdmFsaWQmJmk8cC0+Y2FsbF9jbnQ7aSsrKXsKICAgICAgICAgIGlmKHAtPmNhbGxfbGlzdFtpXS52LT5maSYmKHAtPmNhbGxfbGlzdFtpXS52LT5maS0+ZmxhZ3MmQUxMX1NUQUNLKSl7CgkgICAgLypGSVhNRTogc2l6ZSBvZiByZXR1cm4gYWRkciBkZXBlbmRzIG9uIG1vZGUgKi8KCSAgICBpZigham1wKSBwdXNoKDIpOwoJICAgIGNhbGxlZV9wdXNoKHptMmwocC0+Y2FsbF9saXN0W2ldLnYtPmZpLT5zdGFjazEpKTsKCSAgICBpZigham1wKSBwb3AoMik7CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgZXJyX2ljPXA7aWYoZikgZXJyb3IoMzE3LHAtPmNhbGxfbGlzdFtpXS52LT5pZGVudGlmaWVyKTsKICAgICAgICAgICAgc3RhY2tfdmFsaWQ9MDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYoIXptZXF0byhsMnptKDBMKSxwLT5xMi52YWwudm1heCkpewoJbm90cG9wcGVkKz16bTJsKHAtPnEyLnZhbC52bWF4KTsKCWRvbnRwb3AtPXptMmwocC0+cTIudmFsLnZtYXgpOwoJaWYoIShnX2ZsYWdzWzJdJlVTRURGTEFHKSYmc3RhY2tvZmZzZXQ9PS1ub3Rwb3BwZWQpewoJICAvKiAgRW50ZmVybmVuIGRlciBQYXJhbWV0ZXIgdmVyem9lZ2VybiAgKi8KCX1lbHNlewoJICBnZW5fcG9wKGYsem0ybChwLT5xMi52YWwudm1heCkpOwoJICBub3Rwb3BwZWQtPXptMmwocC0+cTIudmFsLnZtYXgpOwoJfQogICAgICB9CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYoYz09QVNTSUdOfHxjPT1QVVNIKXsKICAgICAgaWYoYz09UFVTSCkgZG9udHBvcCs9em0ybChwLT5xMi52YWwudm1heCk7CiAgICAgIGlmKCF6bWxlcShwLT5xMi52YWwudm1heCxsMnptKDJMKSkpewoJdW5zaWduZWQgbG9uZyBzaXplO2ludCBxcj0wLHpyPTAsY3I9MCxweD0wLHB5PTAscHU9MCxwZD0wLGxxPTAsbHo9MDsKCXNpemU9em0ybChwLT5xMi52YWwudm1heCk7CglpZihjPT1BU1NJR04pewoJICBpZighcC0+ei5hbSYmKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJklTSURYKHAtPnoucmVnKSl7CgkgICAgenI9cC0+ei5yZWc7bHo9MTsKCSAgfQoJfQoJaWYoIXAtPnExLmFtJiYocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJklTSURYKHAtPnExLnJlZykmJnAtPnExLnJlZyE9enIpewoJICBxcj1wLT5xMS5yZWc7bHE9MTsKCX0KCWlmKCFxcil7CgkgIGlmKHpyPT1peCkgcXI9aXk7CgkgIGVsc2UgaWYoenI9PWl5fHx6cj09aXUpIHFyPWl4OwoJICBlbHNle3FyPWl4O3pyPWl5O30KCX1lbHNlIGlmKCF6cil7CgkgIGlmKHFyPT1peCkgenI9aXk7IGVsc2UgenI9aXg7Cgl9CglpZihDUFUhPTY4MTIpewoJICBpZihxciE9aXUmJnpyIT1pdSkgY3I9aXU7CgkgIGlmKHFyIT1peCYmenIhPWl4KSBjcj1peDsKCSAgaWYocXIhPWl5JiZ6ciE9aXkpIGNyPWl5OwoJICBpZighY3IpIGllcnJvcigwKTsKCX0KCWlmKGM9PVBVU0gpewoJICBlbWl0KGYsIlx0bGVhc1x0JWxkLCVzXG4iLFNHTjE2KC1zaXplKSxyZWduYW1lc1tzcF0pOwoJICBwdXNoKHNpemUpOwoJfQoJaWYoQ1BVIT02ODEyJiYoZHJlbHx8IXJlZ3VzZWRbaXVdfHwocmVnc1tpdV0mJiFzY3JhdGNocmVnKGl1LHApKSkpewoJICBpZihjPT1QVVNIKQoJICAgIGVtaXQoZiwiXHRzdHVcdCVsZCwlc1xuIixsb2ZmLXJvZmYtOC1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOwoJICBlbHNlewoJICAgIGVtaXQoZixTUFVTSCgidSIpKTsKCSAgICBwdXNoKDIpOwoJICB9CgkgIHB1PTE7Cgl9CglpZighcmVndXNlZFtpeV18fChyZWdzW2l5XSYmIXNjcmF0Y2hyZWcoaXkscCkpKXsKCSAgaWYoYz09UFVTSCkKCSAgICBlbWl0KGYsIlx0c3R5XHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTQtc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKCSAgZWxzZXsKCSAgICBlbWl0KGYsU1BVU0goInkiKSk7CgkgICAgcHVzaCgyKTsKCSAgfQoJICBweT0xOwoJfQoJaWYocmVnc1tpeF0mJiFzY3JhdGNocmVnKGl4LHApKXsKCSAgaWYoYz09UFVTSCkKCSAgICBlbWl0KGYsIlx0c3R4XHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTItc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKCSAgZWxzZXsKCSAgICBlbWl0KGYsU1BVU0goIngiKSk7CgkgICAgcHVzaCgyKTsKCSAgfQoJICBweD0xOwoJfQoJaWYoIWxxKSBsb2FkX2FkZHIoZixxciwmcC0+cTEpOwoJaWYoYz09UFVTSCkKCSAgZW1pdChmLCJcdHRmclx0JXMsJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3pyXSk7CgllbHNlCgkgIGlmKCFseikgbG9hZF9hZGRyKGYsenIsJnAtPnopOwoJaWYoc2l6ZTw9Nnx8KHNpemU8PTE2JiYhb3B0c2l6ZSkpewoJICBpZihDUFUhPTY4MTIpewoJICAgIGlmKCFzY3JhdGNocmVnKGFjYyxwKSl7CgkgICAgICBpZihjPT1QVVNIKQoJCWVtaXQoZiwiXHRzdGRcdCVsZCwlc1xuIixsb2ZmLXJvZmYtNi1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOwoJICAgICAgZWxzZXsKCQllbWl0KGYsU1BVU0hEKTsKCQlwdXNoKDIpOwoJICAgICAgfQoJICAgICAgcGQ9MjsKCSAgICB9CgkgIH0KCSAgd2hpbGUoc2l6ZT4yKXsKCSAgICBpZihDUFU9PTY4MTIpCgkgICAgICBlbWl0KGYsIlx0bW92d1x0MiwlcyssMiwlcytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CgkgICAgZWxzZQoJICAgICAgZW1pdChmLCJcdGxkZFx0LCVzKytcblx0c3RkXHQsJXMrK1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKCSAgICBzaXplLT0yOwoJICB9CgkgIGlmKENQVT09NjgxMikKCSAgICBlbWl0KGYsIlx0bW92JWNcdDAsJXMsMCwlc1xuIixzaXplPT0yPyd3JzonYicscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CgkgIGVsc2UKCSAgICBlbWl0KGYsIlx0bGQlY1x0LCVzXG5cdHN0JWNcdCwlc1xuIixzaXplPT0yPydkJzonYicscmVnbmFtZXNbcXJdLHNpemU9PTI/J2QnOidiJyxyZWduYW1lc1t6cl0pOwoJfWVsc2V7CgkgIGludCBsPSsrbGFiZWwsY250PShpbnQpKG9wdHNpemU/c2l6ZTpzaXplLzgpOwoJICBpZihyZWdzW2FjY10mJiFzY3JhdGNocmVnKGFjYyxwKSl7CgkgICAgaWYoYz09UFVTSCkKCSAgICAgIGVtaXQoZiwiXHRzdCVjXHQlbGQsJXNcbiIsKENQVSE9NjgxMiYmY250PD1ieXRlbWFzayk/J2InOidkJyxsb2ZmLXJvZmYtNi1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOwoJICAgIGVsc2V7CgkgICAgICBpZihDUFUhPTY4MTImJmNudDw9Ynl0ZW1hc2spewoJCWVtaXQoZixTUFVTSCgiYiIpKTsKCQlwdXNoKDEpOwoJICAgICAgfWVsc2V7CgkJZW1pdChmLFNQVVNIRCk7CgkJcHVzaCgyKTsKCSAgICAgIH0KCSAgICB9CgkgICAgcGQ9KENQVSE9NjgxMiYmY250PD1ieXRlbWFzayk/MToyOwoJICB9CgkgIGlmKENQVSE9NjgxMiYmY250PD1ieXRlbWFzaykKCSAgICBlbWl0KGYsIlx0bGRiXHQjJWx1XG4iLGNudCk7CgkgIGVsc2UKCSAgICBlbWl0KGYsIlx0bGRkXHQjJWx1XG4iLGNudCk7CgkgIGNjPTA7CiNpZiAwCgkgIGlmKENQVSE9NjgxMiYmKCghcmVnc2FbaXVdJiZyZWdzW2l1XSl8fGRyZWwpKXsKCSAgICBpZihjPT1QVVNIKXsKCSAgICAgIGVtaXQoZiwiXHRzdHVcdCVsZCwlc1xuIixsb2ZmLXJvZmYtOC1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOyAKCSAgICB9ZWxzZXsKCSAgICAgIGVtaXQoZixTUFVTSCgidSIpKTtwdXNoKDIpOwoJICAgIH0KCSAgfQojZW5kaWYKCSAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbCk7CgkgIGlmKENQVT09NjgxMil7CgkgICAgaWYob3B0c2l6ZSl7CgkgICAgICBlbWl0KGYsIlx0bW92Ylx0MiwlcyssMiwlcytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CgkgICAgfWVsc2V7CgkgICAgICBlbWl0KGYsIlx0bW92d1x0MiwlcyssMiwlcytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CgkgICAgICBlbWl0KGYsIlx0bW92d1x0MiwlcyssMiwlcytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CgkgICAgICBlbWl0KGYsIlx0bW92d1x0MiwlcyssMiwlcytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CgkgICAgICBlbWl0KGYsIlx0bW92d1x0MiwlcyssMiwlcytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CgkgICAgICBzaXplPXNpemUmNzsKCSAgICB9CgkgICAgZW1pdChmLCJcdGRibmVcdGQsJXMlZFxuIixsYWJwcmVmaXgsbCk7CgkgIH1lbHNlewoJICAgIGlmKG9wdHNpemUpewoJICAgICAgZW1pdChmLCJcdGxkJXNcdCwlcytcblx0c3Qlc1x0LCVzK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOwoJICAgICAgc2l6ZSY9MTsKCSAgICB9ZWxzZXsKCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOwoJICAgICAgZW1pdChmLCJcdGxkJXNcdCwlcysrXG5cdHN0JXNcdCwlcysrXG4iLHJlZ25hbWVzW2NyXSxyZWduYW1lc1txcl0scmVnbmFtZXNbY3JdLHJlZ25hbWVzW3pyXSk7CgkgICAgICBlbWl0KGYsIlx0bGQlc1x0LCVzKytcblx0c3Qlc1x0LCVzKytcbiIscmVnbmFtZXNbY3JdLHJlZ25hbWVzW3FyXSxyZWduYW1lc1tjcl0scmVnbmFtZXNbenJdKTsKCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOwoJICAgICAgc2l6ZSY9NzsKCSAgICB9CgkgICAgaWYoY250PD1ieXRlbWFzaykKCSAgICAgIGVtaXQoZiwiXHRkZWNiXG4iKTsKCSAgICBlbHNlCgkgICAgICBlbWl0KGYsIlx0c3ViZFx0IzFcbiIpOwoJICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGwpOwoJICB9CiNpZiAwCgkgIGlmKENQVSE9NjgxMiYmKCghcmVnc2FbaXVdJiZyZWdzW2l1XSl8fGRyZWwpKXsKCSAgICBpZihjPT1QVVNIKXsKCSAgICAgIGVtaXQoZiwiXHRsZHVcdCVsZCwlc1xuIixsb2ZmLXJvZmYtOC1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOwoJICAgIH1lbHNlewoJICAgICAgZW1pdChmLFNQVUxMKCJ1IikpO3BvcCgyKTsKCSAgICB9CgkgIH0KI2VuZGlmCgkgIHdoaWxlKHNpemU+PTIpewoJICAgIGlmKENQVT09NjgxMikKCSAgICAgIGVtaXQoZiwiXHRtb3Z3XHQyLCVzKywyLCVzK1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKCSAgICBlbHNlCgkgICAgICBlbWl0KGYsIlx0bGRkXHQsJXMrK1xuXHRzdGRcdCwlcysrXG4iLHJlZ25hbWVzW3FyXSxyZWduYW1lc1t6cl0pOwoJICAgIHNpemUtPTI7CgkgIH0KCSAgaWYoc2l6ZSl7CgkgICAgaWYoQ1BVPT02ODEyKQoJICAgICAgZW1pdChmLCJcdG1vdmJcdDAsJXMsMCwlc1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKCSAgICBlbHNlCgkgICAgICBlbWl0KGYsIlx0bGRiXHQsJXNcblx0c3RiXHQsJXNcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CgkgIH0KCX0KCWlmKHBkKXsKCSAgaWYoYz09UFVTSCkgCgkgICAgZW1pdChmLCJcdGxkJWNcdCVsZCwlc1xuIiwocGQ9PTEpPydiJzonZCcsbG9mZi1yb2ZmLTYtc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKCSAgZWxzZXsKCSAgICBpZihwZD09MSl7CgkgICAgICBlbWl0KGYsU1BVTEwoImIiKSk7CgkgICAgICBwb3AoMSk7CgkgICAgfWVsc2V7CgkgICAgICBlbWl0KGYsU1BVTExEKTsKCSAgICAgIHBvcCgyKTsKCSAgICB9CgkgIH0KCX0KCWlmKHB4KXsKCSAgaWYoYz09UFVTSCkgCgkgICAgZW1pdChmLCJcdGxkeFx0JWxkLCVzXG4iLGxvZmYtcm9mZi0yLXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CgkgIGVsc2V7CgkgICAgZW1pdChmLFNQVUxMKCJ4IikpOwoJICAgIHBvcCgyKTsKCSAgfQoJfQoJaWYocHkpewoJICBpZihjPT1QVVNIKSAKCSAgICBlbWl0KGYsIlx0bGR5XHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTQtc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKCSAgZWxzZXsKCSAgICBlbWl0KGYsU1BVTEwoInkiKSk7CgkgICAgcG9wKDIpOwoJICB9Cgl9CglpZihwdSl7CgkgIGlmKGM9PVBVU0gpIAoJICAgIGVtaXQoZiwiXHRsZHVcdCVsZCwlc1xuIixsb2ZmLXJvZmYtOC1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOwoJICBlbHNlewoJICAgIGVtaXQoZixTUFVMTCgidSIpKTsKCSAgICBwb3AoMik7CgkgIH0KCX0KCWNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmKCFJU1NDQUxBUih0KSkgdD16bWVxdG8ocC0+cTIudmFsLnZtYXgsbDJ6bSgxTCkpP0NIQVI6SU5UOwogICAgICBpZigodCZOUSk9PUNIQVImJiF6bWVxdG8ocC0+cTIudmFsLnZtYXgsbDJ6bSgxTCkpKSB0PUlOVDsJCiAgICAgIGlmKG1vdl9vcCgmcC0+cTEpJiYoYz09UFVTSHx8bW92X29wKCZwLT56KSkpewoJZW1pdChmLCJcdG1vdiVjXHQiLElTSFdPUkQodCk/J3cnOidiJyk7CgllbWl0X29iaihmLCZwLT5xMSx0KTsKCWlmKGM9PUFTU0lHTil7CgkgIGVtaXQoZiwiLCIpOwoJICBlbWl0X29iaihmLCZwLT56LHQpOwoJICBlbWl0KGYsIlxuIik7Cgl9ZWxzZXsKCSAgZW1pdChmLCIsJWQsLSVzXG4iLElTSFdPUkQodCk/MjoxLHJlZ25hbWVzW3NwXSk7CgkgIHB1c2goSVNIV09SRCh0KT8yOjEpOwoJfQoJY29udGludWU7CiAgICAgIH0KICAgICAgaWYoKChyZWdzW2FjY10mJnJlZ3NbaXhdKXx8KHQmTlEpPT1DSEFSKSYmKHAtPnExLmZsYWdzJktPTlNUKSYmIWlzcmVnKHopKXsKCWV2YWxfY29uc3QoJnAtPnExLnZhbCx0KTsKCWlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkmJigocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKSE9RFJFRk9CSnx8KHQmTlEpPT1DSEFSKSYmKCFwLT56LmFtfHxwLT56LmFtLT5mbGFncyE9QUNDX0lORHx8KHQmTlEpPT1DSEFSKSl7CgkgIGVtaXQoZiwiXHRjbHJcdCIpOwoJICBpZihjPT1BU1NJR04pewoJICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7ZW1pdChmLCJcbiIpOwoJICB9ZWxzZXsKCSAgICBlbWl0KGYsQ1BVPT02ODEyPyIxLC1zcFxuIjoiLC1zXG4iKTsKCSAgICBwdXNoKDEpOwoJICB9CgkgIGlmKCFJU0hXT1JEKHQpKSBjb250aW51ZTsKCSAgZW1pdChmLCJcdGNsclx0Iik7CgkgIGlmKGM9PUFTU0lHTil7CgkgICAgbW9iaj1wLT56OwoJICAgIGluY19hZGRyKCZtb2JqLDEsdCk7CgkgICAgZW1pdF9vYmooZiwmbW9iaix0KTtlbWl0KGYsIlxuIik7CgkgIH1lbHNlewoJICAgIGVtaXQoZixDUFU9PTY4MTI/IjEsLXNwXG4iOiIsLXNcbiIpOwoJICAgIHB1c2goMSk7CgkgIH0KCSAgY29udGludWU7Cgl9CgogICAgICB9CiAgICAgIGlmKGM9PVBVU0gpewoJaW50IHN0PTA7CglpZihpc3JlZyhxMSkpewoJICByZWc9cC0+cTEucmVnOwoJfWVsc2V7CgkgIGlmKCh0Jk5RKT09Q0hBUnx8IXJlZ3NbYWNjXXx8c2NyYXRjaHJlZyhhY2MscCkpIHJlZz1hY2M7CgkgIGVsc2UgaWYoIXJlZ3NbaXhdfHxzY3JhdGNocmVnKGl4LHApKSByZWc9aXg7CgkgIGVsc2UgaWYocmVndXNlZFtpeV0mJighcmVnc1tpeV18fHNjcmF0Y2hyZWcoaXkscCkpKSByZWc9aXk7CgkgIGVsc2UgaWYocmVndXNlZFtpdV0mJiFkcmVsJiZDUFUhPTY4MTImJighcmVnc1tpdV18fHNjcmF0Y2hyZWcoaXUscCkpKSByZWc9aXU7CgkgIGVsc2UgcmVnPWFjYzsKCSAgaWYocmVnc1tyZWddJiYhc2NyYXRjaHJlZyhyZWcscCkpewoJICAgIHN0PTE7CgkgICAgZW1pdChmLCJcdHN0JXNcdCVsZCwlc1xuIixyZWduYW1lc1tyZWddLChsb25nKWxvZmYtcm9mZi0yLXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CgkgIH0KCSAgbG9hZF9yZWcoZixyZWcsJnAtPnExLHQpOwoJfQoJaWYoKHQmTlEpPT1DSEFSKQoJICBlbWl0KGYsU1BVU0goImIiKSk7CgllbHNlIGlmKHJlZz09aXgpCgkgIGVtaXQoZixTUFVTSCgieCIpKTsKCWVsc2UgaWYocmVnPT1peSkKCSAgZW1pdChmLFNQVVNIKCJ5IikpOwoJZWxzZSBpZihyZWc9PWl1KQoJICBlbWl0KGYsU1BVU0goInUiKSk7CgllbHNlCgkgIGVtaXQoZixTUFVTSEQpOwoJcHVzaCh6bTJsKHAtPnEyLnZhbC52bWF4KSk7CglpZihzdCkKCSAgZW1pdChmLCJcdGxkJXNcdCVsZCwlc1xuIixyZWduYW1lc1tyZWddLChsb25nKWxvZmYtcm9mZi0yLXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7Cgljb250aW51ZTsKICAgICAgfQogICAgICBpZihjPT1BU1NJR04pewoJaWYoaXNyZWcocTEpJiZpc3JlZyh6KSl7CgkgIGlmKHAtPnExLnJlZyE9cC0+ei5yZWcpCgkgICAgZW1pdChmLCJcdHRmclx0JXMsJXNcbiIscmVnbmFtZXNbcC0+cTEucmVnXSxyZWduYW1lc1twLT56LnJlZ10pOwoJfWVsc2UgaWYoaXNyZWcocTEpKXsKCSAgc3RvcmVfcmVnKGYscC0+cTEucmVnLCZwLT56LHQpOwoJfWVsc2UgaWYoaXNyZWcoeikpewoJICBsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSx0KTsKCX1lbHNlewoJICByZWc9Z2V0X3JlZyhmLHAsdCk7CgkgIGxvYWRfcmVnKGYscmVnLCZwLT5xMSx0KTsKCSAgc3RvcmVfcmVnKGYscmVnLCZwLT56LHQpOwoJfQoJY29udGludWU7CiAgICAgIH0KICAgICAgaWVycm9yKDApOwogICAgfQogICAgaWYoYz09QUREUkVTUyl7CiAgICAgIGludCBweD0wOwogICAgICBpZihpc3JlZyh6KSl7CglyZWc9cC0+ei5yZWc7CiAgICAgIH1lbHNlIGlmKCFyZWdzW2l4XSl7CglyZWc9aXg7CiAgICAgIH1lbHNlIGlmKCFyZWdzW2l5XSl7CglyZWc9aXk7CiAgICAgIH1lbHNlewoJLypGSVhNRTogdGVzdCBpZiB4IHVzZWQgaW4gcTEgKi8KCXB4PTE7CgllbWl0KGYsU1BVU0goIngiKSk7CglyZWc9aXg7CglwdXNoKDIpOwogICAgICB9CiAgICAgIGxvYWRfYWRkcihmLHJlZywmcC0+cTEpOwogICAgICBpZighKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWchPXJlZykKCXN0b3JlX3JlZyhmLHJlZywmcC0+eixwLT50eXBmMik7CiAgICAgIGlmKHB4KXsKCWVtaXQoZixTUFVMTCgieCIpKTsKCXBvcCgyKTsKICAgICAgfQogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZigoYz09TVVMVHx8Yz09RElWfHwoYz09TU9EJiYocC0+dHlwZiZVTlNJR05FRCkpKSYmaXNjb25zdChxMikpewogICAgICBsb25nIGxuOwogICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CiAgICAgIGlmKHptbGVxKGwyem0oMEwpLHZtYXgpJiZ6dW1sZXEodWwyenVtKDBVTCksdnVtYXgpKXsKCWlmKChsbj1wb2YyKHZ1bWF4KSkmJmxuPDUpewoJICBpZihjPT1NT0QpewoJICAgIHZtYXg9em1zdWIodm1heCxsMnptKDFMKSk7CgkgICAgYz1wLT5jb2RlPWM9QU5EOwoJICB9ZWxzZXsKCSAgICB2bWF4PWwyem0obG4tMSk7CgkgICAgaWYoYz09RElWKSBwLT5jb2RlPWM9UlNISUZUOyBlbHNlIHAtPmNvZGU9Yz1MU0hJRlQ7CgkgIH0KCSAgYz1wLT5jb2RlOwoJICBndmFsLnZtYXg9dm1heDsKCSAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOwoJICBpZihjPT1BTkQpewoJICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLHQpOwoJICB9ZWxzZXsKCSAgICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCx0KTsKCSAgICBwLT50eXBmMj1JTlQ7CgkgIH0KCX0KICAgICAgfQogICAgfQogICAgaWYoYz09TU9EfHxjPT1ESVYpewogICAgICBpZXJyb3IoMCk7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKCiAgICBpZigoYz09QUREfHxjPT1TVUIpJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QmJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKSE9UkVHJiYocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPURSRUZPQkomJiFwLT5xMS5hbSYmIXAtPnouYW0mJmNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXsKICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOwogICAgICBpZihjPT1TVUIpIHZtYXg9em1zdWIoWjAsdm1heCk7CiAgICAgIGlmKCh0Jk5RKT09Q0hBUiYmem1lcXRvKHZtYXgsWjEpKXsKCWVtaXQoZiwiXHRpbmNcdCIpOwoJZW1pdF9vYmooZiwmcC0+eix0KTsKCWVtaXQoZiwiXG4iKTsKCWNvbnRpbnVlOwogICAgICB9ZWxzZSBpZigodCZOUSk9PUNIQVImJnptZXF0byh2bWF4LGwyem0oLTFMKSkpewoJZW1pdChmLCJcdGRlY1x0Iik7CgllbWl0X29iaihmLCZwLT56LHQpOwoJZW1pdChmLCJcbiIpOwoJY29udGludWU7CiAgICAgIH1lbHNlIGlmKCgodCZOUSk9PVNIT1JUfHwodCZOUSk9PUlOVCkmJnptZXF0byh2bWF4LGwyem0oMUwpKSl7CglpbmNfYWRkcigmcC0+eiwxLHQpOwoJZW1pdChmLCJcdGluY1x0Iik7CgllbWl0X29iaihmLCZwLT56LHQpOwoJZW1pdChmLCJcbiIpOwoJZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CglpbmNfYWRkcigmcC0+eiwtMSx0KTsKCWVtaXQoZiwiXHRpbmNcdCIpOwoJZW1pdF9vYmooZiwmcC0+eix0KTsKCWVtaXQoZiwiXG4iKTsKCWVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKCWNvbnRpbnVlOwogICAgICB9ZWxzZSBpZihyZWdzW2FjY10mJigodCZOUSk9PVNIT1JUfHwodCZOUSk9PUlOVCkmJnptZXF0byh2bWF4LGwyem0oLTFMKSkpewoJaW5jX2FkZHIoJnAtPnosMSx0KTsKCWVtaXQoZiwiXHR0c3RcdCIpOwoJZW1pdF9vYmooZiwmcC0+eix0KTsKCWVtaXQoZiwiXG4iKTsKCWVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOwoJaW5jX2FkZHIoJnAtPnosLTEsdCk7CgllbWl0KGYsIlx0ZGVjXHQiKTsKCWVtaXRfb2JqKGYsJnAtPnosdCk7CgllbWl0KGYsIlxuIik7CgllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CglpbmNfYWRkcigmcC0+eiwxLHQpOwoJZW1pdChmLCJcdGRlY1x0Iik7CgllbWl0X29iaihmLCZwLT56LHQpOwoJZW1pdChmLCJcbiIpOwoJY29udGludWU7CiAgICAgIH0KICAgIH0KCiAgICBpZigoYz49TFNISUZUJiZjPD1NT0QpfHxjPT1BRERJMlB8fGM9PVNVQklGUHx8Yz09U1VCUEZQfHwoYz49T1ImJmM8PUFORCl8fGM9PUNPTVBBUkUpewogICAgICBjaGFyICpzOwogICAgICAvKkZJWE1FOiBuaWNodCBpbW1lciBiZXNzZXIqLwogICAgICBpZihJU0xXT1JEKHQpJiZjPT1MU0hJRlQmJmlzY29uc3QocTIpKXsKCWV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKCWlmKHptMmwodm1heCk9PTEpewoJICBwLT5jb2RlPWM9QUREOwoJICBwLT5xMj1wLT5xMTsKCX0KICAgICAgfQogICAgICBpZigoYz09QUREfHxjPT1BRERJMlB8fGM9PU1VTFR8fChjPj1PUiYmYzw9QU5EKSkmJmlzcmVnKHEyKSYmIWlzcmVnKHExKSYmIXNob3J0X2FkZCl7CglvPXAtPnExO3AtPnExPXAtPnEyO3AtPnEyPW87CiAgICAgIH0KICAgICAgaWYoKGM9PUFERHx8Yz09TVVMVHx8KGM+PU9SJiZjPD1BTkQpKSYmaXNyZWcocTIpJiZwLT5xMi5yZWc9PWFjYyYmIXNob3J0X2FkZCl7CglvPXAtPnExO3AtPnExPXAtPnEyO3AtPnEyPW87CiAgICAgIH0KICAgICAgaWYoYz09TVVMVHx8Yz09TU9EKXsKCWlmKCghaXNyZWcoeil8fHAtPnoucmVnIT1hY2MpJiZyZWdzW2FjY10mJiFzY3JhdGNocmVnKGFjYyxwKSkKCSAgZ2V0X2FjYyhmLHApOwoJcmVnPWFjYzsKCS8qRklYTUU6IHkgYnp3LiB4LVJlZ2lzdGVyKi8KICAgICAgfWVsc2UgaWYoYz09TFNISUZUfHxjPT1SU0hJRlR8fGM9PUFORHx8Yz09T1J8fGM9PVhPUil7CglpZigoIWlzcmVnKHopfHxwLT56LnJlZyE9YWNjKSYmcmVnc1thY2NdJiYhc2NyYXRjaHJlZyhhY2MscCkpCgkgIGdldF9hY2MoZixwKTsKCXJlZz1hY2M7CiAgICAgIH1lbHNlIGlmKGM9PURJVil7CglyZWc9aXg7CglpZXJyb3IoMCk7CiAgICAgIH1lbHNlIGlmKGlzcmVnKHopKXsKCXJlZz1wLT56LnJlZzsKICAgICAgfWVsc2UgaWYoaXNyZWcocTEpJiYoYz09Q09NUEFSRXx8c2NyYXRjaHJlZyhwLT5xMS5yZWcscCkpKXsKCXJlZz1wLT5xMS5yZWc7CiAgICAgIH1lbHNlewoJaWYoYz09QUREfHxjPT1TVUJ8fGM9PUFEREkyUHx8Yz09U1VCSUZQfHxjPT1DT01QQVJFKXsKCSAgaWYoSVNSQUNDKHEyKSkKCSAgICByZWc9YWNjOwoJICBlbHNlCgkgICAgcmVnPWdldF9yZWcoZixwLHQpOwoJfWVsc2V7CgkgIGdldF9hY2MoZixwKTsKCSAgcmVnPWFjYzsKCX0KICAgICAgfQogICAgICBpZihjPT1BRER8fGM9PUFEREkyUHx8Yz09U1VCfHxjPT1TVUJJRlApewoJaW50IG9wZG9uZT0wOwoJaWYoaXNyZWcocTEpKXsKCSAgaWYoSVNJRFgocmVnKSYmSVNJRFgocC0+cTEucmVnKSYmaXNjb25zdChxMikpewoJICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxzaG9ydF9hZGQ/c2hvcnRfYWRkOnEydHlwKHApKTsKCSAgICBpZihDUFU9PTY4MTImJnAtPnExLnJlZz09cmVnJiZ6bWVxdG8odm1heCxsMnptKDFMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDFVTCkpKXsKCSAgICAgIGVtaXQoZiwiXHQlcyVzXG4iLGM9PVNVQj8iZGUiOiJpbiIscmVnbmFtZXNbcmVnXSk7CgkgICAgICAvKkZJWE1FOiBjb25kaXRpb24tY29kZXMgZm9yIGJuZS9iZXEgY291bGQgYmUgdXNlZCAqLwoJICAgIH1lbHNlewoJICAgICAgZW1pdChmLCJcdGxlYSVzXHQlbGQsJXNcbiIscmVnbmFtZXNbcmVnXSxjPT1TVUI/U0dOMTYoLXptMmwodm1heCkpOlNHTjE2KHptMmwodm1heCkpLHJlZ25hbWVzW3AtPnExLnJlZ10pOwoJICAgIH0KCSAgICBvcGRvbmU9MTsKCSAgfWVsc2UJaWYoKGM9PUFERHx8Yz09QURESTJQKSYmSVNJRFgocmVnKSYmSVNJRFgocC0+cTEucmVnKSYmSVNSQUNDKHEyKSl7CgkgICAgZW1pdChmLCJcdGxlYSVzXHQlcywlc1xuIixyZWduYW1lc1tyZWddLCgodCZOUSk9PUNIQVJ8fChzaG9ydF9hZGQmTlEpPT1DSEFSKT8iYiI6ImQiLHJlZ25hbWVzW3AtPnExLnJlZ10pOwoJICAgIG9wZG9uZT0xOwoJICB9ZWxzZSBpZigoYz09QUREfHxjPT1BRERJMlApJiZJU0lEWChyZWcpJiZJU0FDQyhwLT5xMS5yZWcpJiZJU1JJRFgocTIpKXsKCSAgICBlbWl0KGYsIlx0bGVhJXNcdCVzLCVzXG4iLHJlZ25hbWVzW3JlZ10sKHQmTlEpPT1DSEFSPyJiIjoiZCIscmVnbmFtZXNbcC0+cTIucmVnXSk7CgkgICAgb3Bkb25lPTE7CgkgIH1lbHNlIGlmKChjPT1BRER8fGM9PUFEREkyUCkmJnAtPnExLnJlZz09YWNjJiZJU0lEWChyZWcpJiYhc2hvcnRfYWRkKXsKCSAgICBsb2FkX3JlZyhmLHJlZywmcC0+cTIsdCk7CgkgICAgZW1pdChmLCJcdGxlYSVzXHQlcywlc1xuIixyZWduYW1lc1tyZWddLCh0Jk5RKT09Q0hBUj8iYiI6ImQiLHJlZ25hbWVzW3JlZ10pOwoJICAgIG9wZG9uZT0xOwoJICB9ZWxzZSBpZigoYz09QUREfHxjPT1BRERJMlApJiZwLT5xMS5yZWc9PWFjYyYmSVNJRFgocmVnKSYmKHNob3J0X2FkZCZOVSk9PShVTlNJR05FRHxDSEFSKSYmc2NyYXRjaHJlZyhhY2MscCkpewoJICAgIGVtaXQoZiwiXHRhZGRiXHQiKTsKCSAgICBlbWl0X29iaihmLCZwLT5xMixzaG9ydF9hZGQpOwoJICAgIGVtaXQoZiwiXG4iKTsKCSAgICBlbWl0KGYsIlx0YWRjYVx0IzBcbiIpOwoJICAgIGVtaXQoZiwiXHR0ZnJcdGQseVxuIik7CgkgICAgb3Bkb25lPTE7CgkgIH1lbHNlIGlmKChjPT1BRER8fGM9PUFEREkyUCkmJklTQUNDKHAtPnExLnJlZykmJklTUkFDQyh6KSYmaXNyZWcocTIpJiZJU0lEWChwLT5xMi5yZWcpKXsKCSAgICBpZighc2NyYXRjaHJlZyhwLT5xMi5yZWcscCkpIGVtaXQoZiwiXHRleGdcdCVzLCVzXG4iLHJlZ25hbWVzW2FjY10scmVnbmFtZXNbcC0+cTIucmVnXSk7CgkgICAgZW1pdChmLCJcdGxlYSVzXHQlcywlc1xuIixyZWduYW1lc1twLT5xMi5yZWddLHJlZ25hbWVzW2FjY10scmVnbmFtZXNbcC0+cTIucmVnXSk7CgkgICAgZW1pdChmLCJcdGV4Z1x0JXMsJXNcbiIscmVnbmFtZXNbYWNjXSxyZWduYW1lc1twLT5xMi5yZWddKTsKCSAgICBvcGRvbmU9MTsKCSAgfWVsc2UJaWYocC0+cTEucmVnIT1yZWcpewoJICAgIGlmKGM9PUFERHx8Yz09QURESTJQfHwhSVNSQUNDKHEyKSkKCSAgICAgIGVtaXQoZiwiXHR0ZnJcdCVzLCVzXG4iLHJlZ25hbWVzW3AtPnExLnJlZ10scmVnbmFtZXNbcmVnXSk7CgkgIH0KCX1lbHNlIGlmKHNob3J0X2FkZCYmYz09U1VCJiZyZWc9PWFjYyYmIShzaG9ydF9hZGQmVU5TSUdORUQpKXsKCSAgbG9hZF9yZWcoZixyZWcsJnAtPnEyLHNob3J0X2FkZCk7CgkgIGVtaXQoZiwiXHRjbHJhXG4iKTsKCSAgZW1pdChmLCJcdG5lZ2JcbiIpOwoJICBlbWl0KGYsIlx0c2JjYVx0IzBcbiIpOwoJICBlbWl0KGYsIlx0YWRkZFx0Iik7CgkgIGVtaXRfb2JqKGYsJnAtPnExLHQpOwoJICBlbWl0KGYsIlxuIik7CgkgIHN0b3JlX3JlZyhmLHJlZywmcC0+eix6dHlwKHApKTsKCSAgY29udGludWU7Cgl9ZWxzZSBpZihzaG9ydF9hZGQmJmM9PUFERCYmcmVnPT1hY2MpewoJICBsb2FkX3JlZyhmLHJlZywmcC0+cTIsc2hvcnRfYWRkKTsKCSAgaWYoc2hvcnRfYWRkJlVOU0lHTkVEKQoJICAgIGVtaXQoZiwiXHRjbHJhXG4iKTsKCSAgZWxzZQoJICAgIGVtaXQoZixTRVgpOwoJICBlbWl0KGYsIlx0YWRkZFx0Iik7CgkgIGVtaXRfb2JqKGYsJnAtPnExLHQpOwoJICBlbWl0KGYsIlxuIik7CgkgIHN0b3JlX3JlZyhmLHJlZywmcC0+eix6dHlwKHApKTsKCSAgY29udGludWU7Cgl9ZWxzZXsKCSAgaWYoIUlTUkFDQyhxMikpCgkgICAgbG9hZF9yZWcoZixyZWcsJnAtPnExLHExdHlwKHApKTsKCX0KCWlmKCFvcGRvbmUpewoJICBpZihyZWc9PWFjYyl7CgkgICAgaWYoSVNSQUNDKHEyKSl7CgkgICAgICBpZighSVNSQUNDKHopKSBnZXRfYWNjKGYscCk7CgkgICAgICBpZihjPT1BRER8fGM9PUFEREkyUCl7CgkJaWYoc2hvcnRfYWRkKXsKCQkgIGlmKHNob3J0X2FkZCZVTlNJR05FRCkKCQkgICAgZW1pdChmLCJcdGNscmFcbiIpOwoJCSAgZWxzZQoJCSAgICBlbWl0KGYsU0VYKTsKCQkgIGVtaXQoZiwiXHRhZGRkXHQiKTsKCQkgIGVtaXRfb2JqKGYsJnAtPnExLHQpOwoJCSAgZW1pdChmLCJcbiIpOwoJCX1lbHNlewoJCSAgaWYoQ1BVPT02ODEyKQoJCSAgICBlbWl0KGYsIlx0YXNsZFxuIik7IC8qIG9ubHkgY2FzZXMgd2l0aCBxMT1xMj1hY2Mgc2hvdWxkIHJlbWFpbiAqLwoJCSAgZWxzZXsKCQkgICAgZW1pdChmLCJcdGFzbGJcbiIpOwoJCSAgICBpZigodCZOUSkhPUNIQVIpCgkJICAgICAgZW1pdChmLCJcdHJvbGFcbiIpOwoJCSAgfQoJCX0KCSAgICAgIH1lbHNlewoJCWlmKHNob3J0X2FkZCl7CgkJICBpZihzaG9ydF9hZGQmVU5TSUdORUQpCgkJICAgIGVtaXQoZiwiXHRsZCVzYVx0IzI1NVxuIiwoQ1BVPT02ODEyKT8iYSI6IiIpOwoJCSAgZWxzZXsKCQkgICAgZW1pdChmLFNFWCk7CgkJICAgIGVtaXQoZiwiXHRuZWdhXG4iKTsKCQkgIH0KCQkgIGVtaXQoZiwiXHRuZWdiXG5cdHNiY2FcdCMwXG4iKTsKCQl9ZWxzZSBpZigodCZOUSkhPUNIQVIpewoJCSAgZW1pdChmLCJcdG5lZ2Fcblx0bmVnYlxuXHRzYmNhXHQjMFxuIik7CgkJfWVsc2V7CgkJICBlbWl0KGYsIlx0bmVnYlxuIik7CgkJfQoJCQoJCWlmKElTUklEWChxMSkpewoJCSAgZW1pdChmLCJcdCVzJXNcbiIsQ1BVPT02ODEyPyJwc2giOiJwc2hzXHQiLHJlZ25hbWVzW3AtPnExLnJlZ10pOwoJCSAgZW1pdChmLCJcdGFkZGRcdCVzXG4iLENQVT09NjgxMj8iMSxzKyI6IixzKysiKTsKCQl9ZWxzZXsKCQkgIGVtaXQoZiwiXHRhZGRkXHQiKTsKCQkgIGVtaXRfb2JqKGYsJnAtPnExLHQpOwoJCSAgZW1pdChmLCJcbiIpOwoJCX0KCSAgICAgIH0KCSAgICB9ZWxzZXsKCSAgICAgIGlmKElTUklEWChxMikpewoJCWlmKENQVT09NjgxMikKCQkgIGVtaXQoZiwiXHRwc2glc1xuIixyZWduYW1lc1twLT5xMi5yZWddKTsKCQllbHNlCgkJICBlbWl0KGYsIlx0cHNoc1x0JXNcbiIscmVnbmFtZXNbcC0+cTIucmVnXSk7CgkJcHVzaCgyKTtwb3AoMik7CgkJaWYoQ1BVPT02ODEyKQoJCSAgZW1pdChmLCJcdCVzZFx0MiwlcytcbiIsKGM9PUFERHx8Yz09QURESTJQKT8iYWRkIjoic3ViIixyZWduYW1lc1tzcF0pOwoJCWVsc2UKCQkgIGVtaXQoZiwiXHQlc2RcdCwlcysrXG4iLChjPT1BRER8fGM9PUFEREkyUCk/ImFkZCI6InN1YiIscmVnbmFtZXNbc3BdKTsKCSAgICAgIH1lbHNlewoJCWVtaXQoZiwiXHQlcyVzXHQiLChjPT1BRER8fGM9PUFEREkyUCk/ImFkZCI6InN1YiIsKHNob3J0X2FkZHx8KHQmTlEpPT1DSEFSKT8iYiI6ImQiKTsKCQllbWl0X29iaihmLCZwLT5xMixzaG9ydF9hZGQ/c2hvcnRfYWRkOnQpO2VtaXQoZiwiXG4iKTsKCQlpZihzaG9ydF9hZGQpewoJCSAgaWYoc2hvcnRfYWRkJlVOU0lHTkVEKQoJCSAgICBlbWl0KGYsIlx0JXNcdCMwXG4iLGM9PUFERD8iYWRjYSI6InNiY2EiKTsKCQkgIGVsc2UKCQkgICAgaWVycm9yKDApOwoJCX0KCQlpZihkcmVsJiYocC0+cTIuZmxhZ3MmVkFSQURSKSl7CgkJICBpZihDUFU9PTY4MTIpIGllcnJvcigwKTsKCQkgIGVtaXQoZiwiXHRwc2hzXHQlc1xuIixyZWduYW1lc1tpdV0pO3B1c2goMik7CgkJICBlbWl0KGYsIlx0JXNkXHQsJXMrK1xuIiwoYz09QUREfHxjPT1BRERJMlApPyJhZGQiOiJzdWIiLHJlZ25hbWVzW3NwXSk7CgkJICBwb3AoMik7CgkJfQoJICAgICAgfQoJICAgIH0KCSAgICBjYz0mcC0+ejtjY190PXQ7CgkgIH1lbHNlewoJICAgIGlmKGlzY29uc3QocTIpKXsKCSAgICAgIGxvbmcgbDsKCSAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxzaG9ydF9hZGQ/c2hvcnRfYWRkOnQpOwoJICAgICAgbD16bTJsKHZtYXgpOwoJICAgICAgaWYoYz09U1VCKSBsPS1sOwoJICAgICAgLypGSVhNRTogY29uZGl0aW9uLWNvZGVzIGZvciBibmUvYmVxIGNvdWxkIGJlIHVzZWQgKi8KCSAgICAgIGlmKGw9PTEmJnJlZz09aXgmJkNQVT09NjgxMil7CgkJZW1pdChmLCJcdGlueFxuIik7CgkgICAgICB9ZWxzZSBpZihsPT0xJiZyZWc9PWl5JiZDUFU9PTY4MTIpewoJCWVtaXQoZiwiXHRpbnlcbiIpOwoJICAgICAgfWVsc2UgaWYobD09LTEmJnJlZz09aXgmJkNQVT09NjgxMil7CgkJZW1pdChmLCJcdGRleFxuIik7CgkgICAgICB9ZWxzZSBpZihsPT0tMSYmcmVnPT1peSYmQ1BVPT02ODEyKXsKCQllbWl0KGYsIlx0ZGV5XG4iKTsKCSAgICAgIH1lbHNlewoJCWVtaXQoZiwiXHRsZWElc1x0JWxkLCVzXG4iLHJlZ25hbWVzW3JlZ10sU0dOMTYobCkscmVnbmFtZXNbcmVnXSk7CgkgICAgICB9CgkgICAgfWVsc2V7CgkgICAgICBpZihjIT1BREQmJmMhPUFEREkyUCl7CgkJaWYoIUlTUkFDQyhxMikpewoJCSAgaWYoIXNjcmF0Y2hyZWcoYWNjLHApKQoJCSAgICBnZXRfYWNjKGYscCk7CgkJICBsb2FkX3JlZyhmLGFjYywmcC0+cTIsdCk7CgkJICBpZigodCZOUSkhPUNIQVIpewoJCSAgICBlbWl0KGYsIlx0bmVnYVxuXHRuZWdiXG5cdHNiY2FcdCMwXG4iKTsKCQkgIH1lbHNlewoJCSAgICBlbWl0KGYsIlx0bmVnYlxuIik7CgkJICB9CgkJICAvKmxvYWRfcmVnKGYscmVnLCZwLT5xMSx0KTsqLwoJCX1lbHNlewoJCSAgZ2V0X2FjYyhmLHApOwoJCSAgbG9hZF9yZWcoZixyZWcsJnAtPnExLHQpOwoJCSAgaWYoKHQmTlEpPT1DSEFSKQoJCSAgICBlbWl0KGYsIlx0bmVnYlxuIik7CgkJICBlbHNlCgkJICAgIGVtaXQoZiwiXHRuZWdhXG5cdG5lZ2Jcblx0c2JjYVx0IzBcbiIpOwoJCX0gIAoJICAgICAgfWVsc2UgaWYoIUlTUkFDQyhxMikpewoJCWdldF9hY2MoZixwKTsKCQlpZihzaG9ydF9hZGQpewoJCSAgbG9hZF9yZWcoZixhY2MsJnAtPnEyLHNob3J0X2FkZCk7CgkJICBpZihzaG9ydF9hZGQmVU5TSUdORUQpewoJCSAgICBpZihyZWc9PWl4KXsKCQkgICAgICBlbWl0KGYsIlx0YWJ4XG4iKTsKCQkgICAgICBzdG9yZV9yZWcoZixyZWcsJnAtPnosenR5cChwKSk7CgkJICAgICAgY29udGludWU7CgkJICAgIH1lbHNlewoJCSAgICAgIGVtaXQoZiwiXHRjbHJhXG4iKTsKCQkgICAgfQoJCSAgfWVsc2UKCQkgICAgdD1DSEFSOwoJCX1lbHNlCgkJICBsb2FkX3JlZyhmLGFjYywmcC0+cTIsdCk7CgkgICAgICB9ZWxzZXsKCQlsb2FkX3JlZyhmLHJlZywmcC0+cTEsdCk7CgkJaWYoc2hvcnRfYWRkJlVOU0lHTkVEKQoJCSAgZW1pdChmLCJcdGNscmFcbiIpOwoJCWVtaXQoZiwiXHRsZWElc1x0JXMsJXNcbiIscmVnbmFtZXNbcmVnXSwoKHQmTlUpPT1DSEFSfHwoc2hvcnRfYWRkJk5VKT09Q0hBUik/ImIiOiJkIixyZWduYW1lc1tyZWddKTsKCQlzdG9yZV9yZWcoZixyZWcsJnAtPnosenR5cChwKSk7CgkJY29udGludWU7CgkgICAgICB9CgkgICAgICBlbWl0KGYsIlx0bGVhJXNcdCVzLCVzXG4iLHJlZ25hbWVzW3JlZ10sKHQmTlEpPT1DSEFSPyJiIjoiZCIscmVnbmFtZXNbcmVnXSk7CgkgICAgfQoJICB9Cgl9CglzdG9yZV9yZWcoZixyZWcsJnAtPnosenR5cChwKSk7Cgljb250aW51ZTsKICAgICAgfQogICAgICBpZihjIT1MU0hJRlQmJmMhPVJTSElGVCkKCWxvYWRfcmVnKGYscmVnLCZwLT5xMSx0KTsKICAgICAgaWYoYz09TVVMVCl7CglpZihDUFU9PTY4MTIpewoJICBpbnQgcHk9MDsKCSAgaWYocmVnIT1hY2MpIGllcnJvcihyZWcpOwoJICBpZighSVNSWShxMikmJnJlZ3NbaXldKXsKCSAgICBlbWl0KGYsIlx0cHNoeVxuIik7CgkgICAgcHVzaCgyKTsKCSAgICBweT0xOwoJICB9CgkgIGxvYWRfcmVnKGYsaXksJnAtPnEyLHQpOwoJICBlbWl0KGYsIlx0ZW11bFxuIik7CgkgIGlmKHB5KXsKCSAgICBlbWl0KGYsU1BVTEwoInkiKSk7CgkgICAgcG9wKDIpOwoJICB9CgkgIHN0b3JlX3JlZyhmLGFjYywmcC0+eix0KTsKCSAgY29udGludWU7Cgl9ZWxzZQoJICBpZXJyb3IoMCk7CiAgICAgIH0KICAgICAgaWYoYz09TFNISUZUfHxjPT1SU0hJRlQpewoJaWYoaXNjb25zdChxMikpewoJICBpbnQgbCxvbGRsOwoJICBsb2FkX3JlZyhmLGFjYywmcC0+cTEsdCk7CgkgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKCSAgb2xkbD1sPXptMmwodm1heCk7CgkgIGlmKGw+PTI0KXsKCSAgICBpZihDUFUhPTY4MTImJiFvcHRzaXplKQoJICAgICAgZW1pdChmLCJcdGxkZFx0IzBcbiIpOwoJICAgIGVsc2UKCSAgICAgIGVtaXQoZiwiXHRjbHJhXG5cdGNscmJcbiIpOwoJICAgIGw9MDsKCSAgfQoJICBpZihsPj04KXsKCSAgICBpZihjPT1MU0hJRlQpCgkgICAgICBlbWl0KGYsIlx0JXNcblx0Y2xyYlxuIiwoQ1BVPT02ODEyKT8idGJhIjoidGZyXHRiLGEiKTsKCSAgICBlbHNlewoJICAgICAgaWYodCZVTlNJR05FRCkKCQllbWl0KGYsIlx0dGZyXHRhLGJcblx0Y2xyYVxuIik7CgkgICAgICBlbHNlewoJCWVtaXQoZiwiXHR0ZnJcdGEsYlxuIik7CgkJZW1pdChmLFNFWCk7CgkgICAgICB9CgkgICAgfQoJICAgIGwtPTg7CgkgIH0KCSAgd2hpbGUobC0tKXsKCSAgICBpZihjPT1SU0hJRlQpewoJICAgICAgaWYodCZVTlNJR05FRCl7CgkJaWYoKHQmTlEpPT1DSEFSKQoJCSAgZW1pdChmLCJcdGxzcmJcbiIpOwoJCWVsc2UKCQkgIGVtaXQoZixDUFU9PTY4MDk/Ilx0bHNyYVxuXHRyb3JiXG4iOiJcdGxzcmRcbiIpOwoJICAgICAgfWVsc2V7CgkJaWYob2xkbD4xMnx8KHQmTlEpPT1DSEFSKQoJCSAgZW1pdChmLCJcdGFzcmJcbiIpOwoJCWVsc2UKCQkgIGVtaXQoZiwiXHRhc3JhXG5cdHJvcmJcbiIpOwoJICAgICAgfQoJICAgIH1lbHNlewoJICAgICAgaWYoKHQmTlEpPT1DSEFSKQoJCWVtaXQoZiwiXHRhc2xiXG4iKTsKCSAgICAgIGVsc2UKCQllbWl0KGYsQ1BVPT02ODA5PyJcdGFzbGJcblx0cm9sYVxuIjoiXHRhc2xkXG4iKTsKCSAgICB9CgkgIH0KCX1lbHNlewoJICBpbnQgcHg7Y2hhciAqczsKCSAgaWYocmVnc1tpeF0mJiFzY3JhdGNocmVnKGl4LHApJiYoIWlzcmVnKHopfHxwLT56LnJlZyE9aXgpKXsKCSAgICBlbWl0KGYsU1BVU0goIngiKSk7CgkgICAgcHVzaCgyKTtweD0xOwoJICB9ZWxzZQoJICAgIHB4PTA7CgkgIGlmKChwLT50eXBmMiZOUSk9PUNIQVIpewoJICAgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMixwLT50eXBmMik7CgkgICAgZW1pdChmLChwLT50eXBmMiZVTlNJR05FRCk/Ilx0Y2xyYVxuIjpTRVgpOwoJICAgIGVtaXQoZiwiXHR0ZnJcdGQseFxuIik7CgkgIH1lbHNlCgkgICAgbG9hZF9yZWcoZixpeCwmcC0+cTIsdCk7CgkgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSxwLT50eXBmKTsKCSAgaWYoKHQmTlEpPT1DSEFSKQoJICAgIGVtaXQoZiwocC0+dHlwZjImVU5TSUdORUQpPyJcdGNscmFcbiI6U0VYKTsKCSAgaWYoYz09TFNISUZUKSBzPSJsc2wiOwoJICBlbHNlIGlmKHQmVU5TSUdORUQpIHM9ImxzciI7CgkgIGVsc2Ugcz0iYXNyIjsKCSAgZW1pdChmLCJcdC5nbG9iYWxcdCVzX18lc1xuIixpZHByZWZpeCxzKTsKCSAgZW1pdChmLCJcdCVzXHQlc19fJXNcbiIsanNyaW5zdCxpZHByZWZpeCxzKTsKCSAgaWYocHgpewoJICAgIGVtaXQoZixTUFVMTCgieCIpKTsKCSAgICAvKmVtaXQoZiwiXHRwdWwlc1xuIixyZWduYW1lc1tpeF0pOyovCgkgICAgcG9wKDIpOwoJICB9Cgl9CgljYz0wOwoJc3RvcmVfcmVnKGYsYWNjLCZwLT56LHQpOwoJY29udGludWU7CiAgICAgIH0KICAgICAgaWYoYz49T1ImJmM8PUFORCl7CglzPWxvZ2ljYWxzW2MtT1JdOwoJaWYocC0+cTIuYW0mJnAtPnEyLmFtLT5mbGFncz09QUNDX0lORCl7CgkgIG1vYmo9cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bW9iajsKCX0KCWlmKHAtPnEyLmZsYWdzJktPTlNUKXsKCSAgdW5zaWduZWQgbG9uZyBsLGg7CgkgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKCSAgbD16dW0ydWwodnVtYXgpOwoJICBpZigodCZOUSkhPUNIQVIpewoJICAgIGg9KGw+PmJpdHNwZXJieXRlKSZieXRlbWFzazsKCSAgICBpZihjPT1BTkQmJmg9PTApCgkgICAgICBlbWl0KGYsIlx0Y2xyYVxuIik7CgkgICAgZWxzZSBpZihjPT1YT1ImJmg9PWJ5dGVtYXNrKQoJICAgICAgZW1pdChmLCJcdGNvbWFcbiIpOwoJICAgIGVsc2UgaWYoKGM9PUFORCYmaCE9Ynl0ZW1hc2spfHwoYz09T1ImJmghPTApfHwoYz09WE9SJiZoIT0wKSkKCSAgICAgIGVtaXQoZiwiXHQlc2FcdCMlbHVcbiIscyxoKTsKCSAgfQoJICBoPWwmYnl0ZW1hc2s7CgkgIGlmKGM9PUFORCYmaD09MCkKCSAgICBlbWl0KGYsIlx0Y2xyYlxuIik7CgkgIGVsc2UgaWYoYz09WE9SJiZoPT1ieXRlbWFzaykKCSAgICBlbWl0KGYsIlx0Y29tYlxuIik7CgkgIGVsc2UgaWYoKGM9PUFORCYmaCE9Ynl0ZW1hc2spfHwoYz09T1ImJmghPTApfHwoYz09WE9SJiZoIT0wKSkKCSAgICBlbWl0KGYsIlx0JXNiXHQjJWx1XG4iLHMsaCk7Cgl9ZWxzZXsKCSAgaWYoaXNyZWcocTIpKXsKCSAgICBpZihwLT5xMi5yZWc9PWFjYyl7CgkgICAgICBpZihjPT1YT1IpewoJCWVtaXQoZiwiXHRjbHJiXG4iKTsKCQlpZigodCZOUSkhPUNIQVIpIGVtaXQoZiwiXHRjbHJhXG4iKTsKCSAgICAgIH0KCSAgICB9ZWxzZXsKCSAgICAgIGlmKCh0Jk5RKT09Q0hBUil7CgkJZW1pdChmLFNQVVNIKCJhIikpOwoJCXB1c2goMSk7CgkJZW1pdChmLCJcdCVzYVx0JXMsJXMrXG4iLHMsQ1BVPT02ODEyPyIxIjoiIixyZWduYW1lc1tzcF0pOwoJCXBvcCgxKTsKCSAgICAgIH1lbHNlewoJCWVtaXQoZiwiXHQlcyVzXG4iLChDUFU9PTY4MTIpPyJwc2giOiJwc2hzXHQiLHJlZ25hbWVzW3AtPnEyLnJlZ10pOwoJCXB1c2goMik7CgkJZW1pdChmLCJcdCVzYVx0JXMsJXMrXG4iLHMsQ1BVPT02ODEyPyIxIjoiIixyZWduYW1lc1tzcF0pOwoJCWVtaXQoZiwiXHQlc2JcdCVzLCVzK1xuIixzLENQVT09NjgxMj8iMSI6IiIscmVnbmFtZXNbc3BdKTsKCQlwb3AoMik7CgkgICAgICB9CgkgICAgfQoJICB9ZWxzZSBpZigocC0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PURSRUZPQkomJih0Jk5RKSE9Q0hBUil7CgkgICAgaW50IHhyPTA7CgkgICAgaWYoIXJlZ3NbaXhdKSB4cj1peDsKCSAgICBlbHNlIGlmKCFyZWdzW2l5XSkgeHI9aXk7CgkgICAgZWxzZXsKCSAgICAgIHhyPWl4OwoJICAgICAgZW1pdChmLCJcdCVzJXNcbiIsKENQVT09NjgxMik/InBzaCI6InBzaHNcdCIscmVnbmFtZXNbeHJdKTsKCSAgICAgIHB1c2goMik7CgoJICAgIH0KCSAgICBCU0VUKHJlZ3NfbW9kaWZpZWQseHIpOwoJICAgIGxvYWRfYWRkcihmLHhyLCZwLT5xMik7CgkgICAgaWYoKHQmTlEpPT1DSEFSKQoJICAgICAgZW1pdChmLCJcdCVzYlx0MCwlc1xuIixzLHJlZ25hbWVzW3hyXSk7CgkgICAgZWxzZXsKCSAgICAgIGVtaXQoZiwiXHQlc2FcdDAsJXNcbiIscyxyZWduYW1lc1t4cl0pOwoJICAgICAgZW1pdChmLCJcdCVzYlx0MSwlc1xuIixzLHJlZ25hbWVzW3hyXSk7CgkgICAgfQoJICAgIGlmKHJlZ3NbaXhdJiZ4cj09aXgpewoJICAgICAgZW1pdChmLFNQVUxMKCJ4IikpOwoJICAgICAgcG9wKDIpOwoJICAgIH0KCSAgfWVsc2V7CgkgICAgZW1pdChmLCJcdCVzYlx0IixzKTsKCSAgICBpZigodCZOUSkhPUNIQVIpIGluY19hZGRyKCZwLT5xMiwxLHQpOwoJICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOwoJICAgIGVtaXQoZiwiXG4iKTsKCSAgICBpZigodCZOUSkhPUNIQVIpewoJICAgICAgaW5jX2FkZHIoJnAtPnEyLC0xLHQpOwoJICAgICAgZW1pdChmLCJcdCVzYVx0IixzKTsKCSAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOwoJICAgICAgZW1pdChmLCJcbiIpOwoJICAgIH0KCSAgfQoJfQoJY2M9MDsKCXN0b3JlX3JlZyhmLHJlZywmcC0+eix0KTsKCWNvbnRpbnVlOwogICAgICB9ZWxzZSBpZihjPT1DT01QQVJFKXsKCWxhc3Rjb21wPXQ7CglpZihpc3JlZyhxMikpewoJICBlbWl0KGYsIlx0JXMlc1xuIiwoQ1BVPT02ODEyKT8icHNoIjoicHNoc1x0IixyZWduYW1lc1twLT5xMi5yZWddKTsKCSAgcHVzaCgyKTsKCX0KCWlmKHJlZz09YWNjKXsKCSAgaWYoKHQmTlEpPT1DSEFSKQoJICAgIGVtaXQoZiwiXHRjbXBiXHQiKTsKCSAgZWxzZQoJICAgIGVtaXQoZixTQ01QKCJkIikpOwoJfWVsc2UgaWYocmVnPT1peCl7CgkgIGVtaXQoZixTQ01QKCJ4IikpOwoJfWVsc2UgaWYocmVnPT1peSl7CgkgIGVtaXQoZixTQ01QKCJ5IikpOwoJfWVsc2UgaWYocmVnPT1pdSl7CgkgIGVtaXQoZixTQ01QKCJ1IikpOwoJfWVsc2UKCSAgaWVycm9yKDApOwoJaWYoaXNyZWcocTIpKXsKCSAgaWYoQ1BVPT02ODEyKQoJICAgIGVtaXQoZiwiMiwlcytcbiIscmVnbmFtZXNbc3BdKTsKCSAgZWxzZQoJICAgIGVtaXQoZiwiLCVzKytcbiIscmVnbmFtZXNbc3BdKTsKCSAgcG9wKDIpOwoJfWVsc2V7CgkgIGVtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiXG4iKTsKCX0KCWNvbnRpbnVlOwogICAgICB9CiAgICAgIGllcnJvcigwKTsKICAgIH0KICAgIHByaWMyKHN0ZG91dCxwKTsKICAgIGllcnJvcigwKTsKICB9CiAgaWYobm90cG9wcGVkKXsKICAgIGdlbl9wb3AoZixub3Rwb3BwZWQpOwogICAgbm90cG9wcGVkPTA7CiAgfQogIGZ1bmN0aW9uX2JvdHRvbShmLHYsbG9mZik7CiAgaWYoZGVidWdfaW5mbyl7CiAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKICAgIGR3YXJmMl9mdW5jdGlvbihmLHYsbGFiZWwpOwogICAgaWYoZikgc2VjdGlvbj0tMTsKICB9ICAgICAKfQoKaW50IHNob3J0Y3V0KGludCBjLGludCB0KQp7CiAgaWYoYz09Q09NUEFSRXx8Yz09QUREfHxjPT1TVUJ8fGM9PUFORHx8Yz09T1J8fGM9PVhPUikgcmV0dXJuIDE7CiAgaWYoKGM9PUxTSElGVHx8Yz09UlNISUZUKSYmSVNDSFdPUkQodCZOUSkpIHJldHVybiAxOwogIHJldHVybiAwOwp9Cgp2b2lkIGNsZWFudXBfY2coRklMRSAqZikKewogIHN0cnVjdCBmcGNvbnN0bGlzdCAqcDsKICB1bnNpZ25lZCBjaGFyICppcDsKICBpZihmJiZzdGFja19jaGVjaykKICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlc19fc3RhY2tfY2hlY2tcbiIsaWRwcmVmaXgpOwogIHdoaWxlKHA9Zmlyc3RmcGMpewogICAgaWYoZil7CiAgICAgIGlmKHNlY3Rpb24hPVJPREFUQSl7CgllbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7CiAgICAgIH0KICAgICAgZW1pdChmLCIlcyVkXG5cdCVzXHQiLGxhYnByZWZpeCxwLT5sYWJlbCxkY3RbTE9OR10pOwogICAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKICAgICAgZW1pdChmLCIweCUwMnglMDJ4JTAyeCUwMngiLGlwWzBdLGlwWzFdLGlwWzJdLGlwWzNdKTsKICAgICAgaWYoKHAtPnR5cCZOUSk9PURPVUJMRXx8KHAtPnR5cCZOUSk9PUxET1VCTEUpewoJZW1pdChmLCIsMHglMDJ4JTAyeCUwMnglMDJ4IixpcFs0XSxpcFs1XSxpcFs2XSxpcFs3XSk7CiAgICAgIH0KICAgICAgZW1pdChmLCJcbiIpOwogICAgfQogICAgZmlyc3RmcGM9cC0+bmV4dDsKICAgIGZyZWUocCk7CiAgfQp9CgppbnQgcmVnX3Bhcm0oc3RydWN0IHJlZ19oYW5kbGUgKnAsc3RydWN0IFR5cCAqdCxpbnQgbW9kZSxzdHJ1Y3QgVHlwICpma3QpCnsKICBpZihwLT5ncHIpIHJldHVybiAwOwogIGlmKElTU0NBTEFSKHQtPmZsYWdzKSYmIUlTRkxPQVQodC0+ZmxhZ3MpJiYhSVNMV09SRCh0LT5mbGFncykpewogICAgcC0+Z3ByPTE7CiAgICByZXR1cm4gYWNjOwogIH0KICByZXR1cm4gMDsKfQoKdm9pZCBpbnNlcnRfY29uc3QodW5pb24gYXR5cHMgKnAsaW50IHQpCi8qICBUcmFlZ3QgS29uc3RhbnRlIGluIGVudHByZWNoZW5kZXMgRmVsZCBlaW4uICAgICAgICovCnsKICBpZighcCkgaWVycm9yKDApOwogIHQmPU5VOwogIGlmKHQ9PUJJVCkge2lmKHptZXF0byh6YzJ6bSh2Y2hhciksbDJ6bSgwTCkpKSBwLT52Y2hhcj16bTJ6YyhsMnptKDBMKSk7IGVsc2UgcC0+dmNoYXI9em0yemMobDJ6bSgxTCkpO3JldHVybjt9CiAgaWYodD09Q0hBUikge3AtPnZjaGFyPXZjaGFyO3JldHVybjt9CiAgaWYodD09U0hPUlQpIHtwLT52c2hvcnQ9dnNob3J0O3JldHVybjt9CiAgaWYodD09SU5UKSB7cC0+dmludD12aW50O3JldHVybjt9CiAgaWYodD09TE9ORykge3AtPnZsb25nPXZsb25nO3JldHVybjt9CiAgaWYodD09TExPTkcpIHtwLT52bGxvbmc9dmxsb25nO3JldHVybjt9CiAgaWYodD09TUFYSU5UKSB7cC0+dm1heD12bWF4O3JldHVybjt9CiAgaWYodD09KFVOU0lHTkVEfEJJVCkpIHtpZih6dW1lcXRvKHp1YzJ6dW0odnVjaGFyKSx1bDJ6dW0oMFVMKSkpIHAtPnZ1Y2hhcj16dW0yenVjKHVsMnp1bSgwVUwpKTsgZWxzZSBwLT52dWNoYXI9enVtMnp1Yyh1bDJ6dW0oMVVMKSk7cmV0dXJuO30gIAogIGlmKHQ9PShVTlNJR05FRHxDSEFSKSkge3AtPnZ1Y2hhcj12dWNoYXI7cmV0dXJuO30KICBpZih0PT0oVU5TSUdORUR8U0hPUlQpKSB7cC0+dnVzaG9ydD12dXNob3J0O3JldHVybjt9CiAgaWYodD09KFVOU0lHTkVEfElOVCkpIHtwLT52dWludD12dWludDtyZXR1cm47fQogIGlmKHQ9PShVTlNJR05FRHxMT05HKSkge3AtPnZ1bG9uZz12dWxvbmc7cmV0dXJuO30KICBpZih0PT0oVU5TSUdORUR8TExPTkcpKSB7cC0+dnVsbG9uZz12dWxsb25nO3JldHVybjt9CiAgaWYodD09KFVOU0lHTkVEfE1BWElOVCkpIHtwLT52dW1heD12dW1heDtyZXR1cm47fQogIGlmKHQ9PUZMT0FUKSB7cC0+dmZsb2F0PXZmbG9hdDtyZXR1cm47fQogIGlmKHQ9PURPVUJMRSkge3AtPnZkb3VibGU9dmRvdWJsZTtyZXR1cm47fQogIGlmKHQ9PUxET1VCTEUpIHtwLT52bGRvdWJsZT12bGRvdWJsZTtyZXR1cm47fQogIGlmKHQ9PU5QT0lOVEVSKSB7cC0+dnVpbnQ9dnVpbnQ7cmV0dXJuO30KICBpZih0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpIHtwLT52dWxvbmc9dnVsb25nO3JldHVybjt9Cn0Kdm9pZCBldmFsX2NvbnN0KHVuaW9uIGF0eXBzICpwLGludCB0KQovKiAgV2Vpc3QgYmVzdGltbXRlbiBnbG9iYWxlbiBWYXJpYWJsZW4gV2VydCBlaW5lciBDRVhQUiB6dS4gICAgICAgKi8KewogIGludCBmPXQmTlE7CiAgaWYoIXApIGllcnJvcigwKTsKICBpZihmPT1NQVhJTlR8fChmPj1CSVQmJmY8PUxMT05HKSl7CiAgICBpZighKHQmVU5TSUdORUQpKXsKICAgICAgaWYoZj09QklUKXsKCWlmKHptZXF0byh6YzJ6bShwLT52Y2hhciksbDJ6bSgwTCkpKSB2bWF4PWwyem0oMEwpOyBlbHNlIHZtYXg9bDJ6bSgxTCk7CiAgICAgIH1lbHNlIGlmKGY9PUNIQVIpIHZtYXg9emMyem0ocC0+dmNoYXIpOwogICAgICBlbHNlIGlmKGY9PVNIT1JUKXZtYXg9enMyem0ocC0+dnNob3J0KTsKICAgICAgZWxzZSBpZihmPT1JTlQpICB2bWF4PXppMnptKHAtPnZpbnQpOwogICAgICBlbHNlIGlmKGY9PUxPTkcpIHZtYXg9emwyem0ocC0+dmxvbmcpOwogICAgICBlbHNlIGlmKGY9PUxMT05HKSB2bWF4PXpsbDJ6bShwLT52bGxvbmcpOwogICAgICBlbHNlIGlmKGY9PU1BWElOVCkgdm1heD1wLT52bWF4OwogICAgICBlbHNlIGllcnJvcigwKTsKICAgICAgdnVtYXg9em0yenVtKHZtYXgpOwogICAgICB2bGRvdWJsZT16bTJ6bGQodm1heCk7CiAgICB9ZWxzZXsKICAgICAgaWYoZj09QklUKXsKCWlmKHp1bWVxdG8oenVjMnp1bShwLT52dWNoYXIpLHVsMnp1bSgwVUwpKSkgdnVtYXg9dWwyenVtKDBVTCk7IGVsc2UgdnVtYXg9dWwyenVtKDFVTCk7CiAgICAgIH1lbHNlIGlmKGY9PUNIQVIpIHZ1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTsKICAgICAgZWxzZSBpZihmPT1TSE9SVCl2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpOwogICAgICBlbHNlIGlmKGY9PUlOVCkgIHZ1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpOwogICAgICBlbHNlIGlmKGY9PUxPTkcpIHZ1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTsKICAgICAgZWxzZSBpZihmPT1MTE9ORykgdnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7CiAgICAgIGVsc2UgaWYoZj09TUFYSU5UKSB2dW1heD1wLT52dW1heDsKICAgICAgZWxzZSBpZXJyb3IoMCk7CiAgICAgIHZtYXg9enVtMnptKHZ1bWF4KTsKICAgICAgdmxkb3VibGU9enVtMnpsZCh2dW1heCk7CiAgICB9CiAgfWVsc2V7CiAgICBpZihJU1BPSU5URVIoZikpewogICAgICBpZihmPT1OUE9JTlRFUikKCXZ1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpOwogICAgICBlbHNlCgl2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7CiAgICAgIHZtYXg9enVtMnptKHZ1bWF4KTt2bGRvdWJsZT16dW0yemxkKHZ1bWF4KTsKICAgIH1lbHNlewogICAgICBpZihmPT1GTE9BVCkgdmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7CiAgICAgIGVsc2UgaWYoZj09RE9VQkxFKSB2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7CiAgICAgIGVsc2Ugdmxkb3VibGU9cC0+dmxkb3VibGU7CiAgICAgIHZtYXg9emxkMnptKHZsZG91YmxlKTsKICAgICAgdnVtYXg9emxkMnp1bSh2bGRvdWJsZSk7CiAgICB9CiAgfQogIHZmbG9hdD16bGQyemYodmxkb3VibGUpOwogIHZkb3VibGU9emxkMnpkKHZsZG91YmxlKTsKICB2dWNoYXI9enVtMnp1Yyh2dW1heCk7CiAgdnVzaG9ydD16dW0yenVzKHZ1bWF4KTsKICB2dWludD16dW0yenVpKHZ1bWF4KTsKICB2dWxvbmc9enVtMnp1bCh2dW1heCk7CiAgdnVsbG9uZz16dW0yenVsbCh2dW1heCk7CiAgdmNoYXI9em0yemModm1heCk7CiAgdnNob3J0PXptMnpzKHZtYXgpOwogIHZpbnQ9em0yemkodm1heCk7CiAgdmxvbmc9em0yemwodm1heCk7CiAgdmxsb25nPXptMnpsbCh2bWF4KTsKfQp2b2lkIHByaW50dmFsKEZJTEUgKmYsdW5pb24gYXR5cHMgKnAsaW50IHQpCi8qICBHaWJ0IGF0eXBzIGF1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KewogIHQmPU5VOwogIGlmKHQ9PUJJVCl7dm1heD16YzJ6bShwLT52Y2hhcik7ZnByaW50ZihmLCJCJWQiLCF6bWVxdG8odm1heCxsMnptKDBMKSkpO30KICBpZih0PT0oVU5TSUdORUR8QklUKSl7dnVtYXg9enVjMnp1bShwLT52dWNoYXIpO2ZwcmludGYoZiwiVUIlZCIsIXp1bWVxdG8odm1heCx1bDJ6dW0oMFVMKSkpO30KICBpZih0PT1DSEFSKXt2bWF4PXpjMnptKHAtPnZjaGFyKTtwcmludHptKGYsdm1heCk7fQogIGlmKHQ9PShVTlNJR05FRHxDSEFSKSl7ZnByaW50ZihmLCJVQyIpO3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtwcmludHp1bShmLHZ1bWF4KTt9CiAgaWYodD09U0hPUlQpe2ZwcmludGYoZiwiUyIpO3ZtYXg9enMyem0ocC0+dnNob3J0KTtwcmludHptKGYsdm1heCk7fQogIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpe2ZwcmludGYoZiwiVVMiKTt2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpO3ByaW50enVtKGYsdnVtYXgpO30KICBpZih0PT1GTE9BVCl7ZnByaW50ZihmLCJGIik7dmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7cHJpbnR6bGQoZix2bGRvdWJsZSk7fQogIGlmKHQ9PURPVUJMRSl7ZnByaW50ZihmLCJEIik7dmxkb3VibGU9emQyemxkKHAtPnZkb3VibGUpO3ByaW50emxkKGYsdmxkb3VibGUpO30KICBpZih0PT1MRE9VQkxFKXtmcHJpbnRmKGYsIkxEIik7cHJpbnR6bGQoZixwLT52bGRvdWJsZSk7fQogIGlmKHQ9PUlOVCl7ZnByaW50ZihmLCJJIik7dm1heD16aTJ6bShwLT52aW50KTtwcmludHptKGYsdm1heCk7fQogIGlmKHQ9PShVTlNJR05FRHxJTlQpfHx0PT1OUE9JTlRFUil7ZnByaW50ZihmLCJVSSIpO3Z1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpO3ByaW50enVtKGYsdnVtYXgpO30KICBpZih0PT1MT05HKXtmcHJpbnRmKGYsIkwiKTt2bWF4PXpsMnptKHAtPnZsb25nKTtwcmludHptKGYsdm1heCk7fQogIGlmKHQ9PShVTlNJR05FRHxMT05HKXx8dD09RlBPSU5URVJ8fHQ9PUhQT0lOVEVSKXtmcHJpbnRmKGYsIlVMIik7dnVtYXg9enVsMnp1bShwLT52dWxvbmcpO3ByaW50enVtKGYsdnVtYXgpO30KICBpZih0PT1MTE9ORyl7ZnByaW50ZihmLCJMTCIpO3ZtYXg9emxsMnptKHAtPnZsbG9uZyk7cHJpbnR6bShmLHZtYXgpO30KICBpZih0PT0oVU5TSUdORUR8TExPTkcpKXtmcHJpbnRmKGYsIlVMTCIpO3Z1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpO3ByaW50enVtKGYsdnVtYXgpO30KICBpZih0PT1NQVhJTlQpIHByaW50em0oZixwLT52bWF4KTsKICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkgcHJpbnR6dW0oZixwLT52dW1heCk7Cn0gCnZvaWQgZW1pdHZhbChGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQp7CiAgdCY9TlU7CiAgaWYoKHQmTlEpPT1OUE9JTlRFUikgdD0oVU5TSUdORUR8SU5UKTsKICBpZih0PT1CSVQpe3ZtYXg9emMyem0ocC0+dmNoYXIpO2VtaXQoZiwiJWQiLCF6bWVxdG8odm1heCxsMnptKDBMKSkpO30KICBpZih0PT0oVU5TSUdORUR8QklUKSl7dnVtYXg9enVjMnp1bShwLT52dWNoYXIpO2VtaXQoZiwiJWQiLCF6dW1lcXRvKHZtYXgsdWwyenVtKDBVTCkpKTt9CiAgaWYodD09Q0hBUil7dm1heD16YzJ6bShwLT52Y2hhcik7ZW1pdHptKGYsdm1heCk7fQogIGlmKHQ9PShVTlNJR05FRHxDSEFSKSl7dnVtYXg9enVjMnp1bShwLT52dWNoYXIpO2VtaXR6dW0oZix2dW1heCk7fQogIGlmKHQ9PVNIT1JUKXt2bWF4PXpzMnptKHAtPnZzaG9ydCk7ZW1pdHptKGYsdm1heCk7fQogIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpe3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7ZW1pdHp1bShmLHZ1bWF4KTt9CiAgaWYodD09RkxPQVQpe3ZsZG91YmxlPXpmMnpsZChwLT52ZmxvYXQpO2VtaXR6bGQoZix2bGRvdWJsZSk7fQogIGlmKHQ9PURPVUJMRSl7dmxkb3VibGU9emQyemxkKHAtPnZkb3VibGUpO2VtaXR6bGQoZix2bGRvdWJsZSk7fQogIGlmKHQ9PUxET1VCTEUpe2VtaXR6bGQoZixwLT52bGRvdWJsZSk7fQogIGlmKHQ9PUlOVCl7dm1heD16aTJ6bShwLT52aW50KTtlbWl0em0oZix2bWF4KTt9CiAgaWYodD09KFVOU0lHTkVEfElOVCl8fHQ9PU5QT0lOVEVSKXt2dW1heD16dWkyenVtKHAtPnZ1aW50KTtlbWl0enVtKGYsdnVtYXgpO30KICBpZih0PT1MT05HKXt2bWF4PXpsMnptKHAtPnZsb25nKTtlbWl0em0oZix2bWF4KTt9CiAgaWYodD09KFVOU0lHTkVEfExPTkcpfHx0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpe3Z1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTtlbWl0enVtKGYsdnVtYXgpO30KICBpZih0PT1MTE9ORyl7dm1heD16bGwyem0ocC0+dmxsb25nKTtlbWl0em0oZix2bWF4KTt9CiAgaWYodD09KFVOU0lHTkVEfExMT05HKSl7dnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7ZW1pdHp1bShmLHZ1bWF4KTt9CiAgaWYodD09TUFYSU5UKSBlbWl0em0oZixwLT52bWF4KTsKICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkgZW1pdHp1bShmLHAtPnZ1bWF4KTsKfQoKdm9pZCBjb252X3R5cChzdHJ1Y3QgVHlwICpwKQovKiBFcnpldWd0IGV4dGVuZGVkIHR5cGVzIGluIGVpbmVtIFR5cC4gKi8KewogIGNoYXIgKmF0dHI7CiAgd2hpbGUocCl7CiAgICBpZihJU1BPSU5URVIocC0+ZmxhZ3MpKXsKICAgICAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfFBPSU5URVJfVFlQRShwLT5uZXh0KSk7CiAgICAgIGlmKGF0dHI9cC0+bmV4dC0+YXR0cil7CglpZihzdHJzdHIoYXR0cixTVFJfTkVBUikpCgkgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxOUE9JTlRFUik7CglpZihzdHJzdHIoYXR0cixTVFJfRkFSKSkKCSAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfEZQT0lOVEVSKTsKCWlmKHN0cnN0cihhdHRyLFNUUl9IVUdFKSkKCSAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfEhQT0lOVEVSKTsKICAgICAgfQogICAgfQogICAgaWYoSVNJTlQocC0+ZmxhZ3MpJiYoYXR0cj1wLT5hdHRyKSYmc3Ryc3RyKGF0dHIsImJpdCIpKQogICAgICBwLT5mbGFncz0oKHAtPmZsYWdzJn5OVSl8QklUKTsKICAgIHA9cC0+bmV4dDsKICB9Cn0KCnZvaWQgaW5pdF9kYihGSUxFICpmKQp7CiAgZHdhcmYyX3NldHVwKHNpemV0YWJbSFBPSU5URVJdLCIuYnl0ZSIsIi4yYnl0ZSIsIi40Ynl0ZSIsIi40Ynl0ZSIsbGFicHJlZml4LGlkcHJlZml4LCIuc2VjdGlvbiIpOwogIGR3YXJmMl9wcmludF9jb21wX3VuaXRfaGVhZGVyKGYpOwp9CnZvaWQgY2xlYW51cF9kYihGSUxFICpmKQp7CiAgZHdhcmYyX2NsZWFudXAoZik7CiAgaWYoZikgc2VjdGlvbj0tMTsKfSAK