LyoKICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8bmV0ZGV2Lmg+CiNpbmNsdWRlIDxkczE3MjIuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+CiNpbmNsdWRlIDxhc20vaWMvc3NpLmg+CgpERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCi8qCiAqIFRoZW9yeToKICogV2UgZmlyc3Qgc2V0IHVwIGFsbCBJUlFzIHRvIGJlIG5vbi1wY2ksIGVkZ2UgdHJpZ2dlcmVkLAogKiB3aGVuIHdlIGxhdGVyIGVudW1lcmF0ZSB0aGUgcGNpIGJ1cyBhbmQgcGNpX3NjNTIwX2ZpeHVwX2lycSgpIGdldHMKICogY2FsbGVkIHdlIHJlYWxsb2NhdGUgaXJxcyB0byB0aGUgcGNpIGJ1cyB3aXRoIHNjNTIwX3BjaV9zZXRfaXJxKCkKICogYXMgbmVlZGVkLiBXaGUgY2hvb3NlIHRoZSBpcnFzIHRvIGdyYW0gZnJvbSBhIGNvbmZpZ3VyYWJsZSBsaXN0CiAqIGluc2lkZSBwY2lfc2M1MjBfZml4dXBfaXJxKCkgKElmIHRoaXMgbGlzdCBjb250YWlucyBzdHVwaWQgaXJxJ3MKICogc3VjaCBhcyAwIHRobmdhcyB3aWxsIG5vdCB3b3JrKQogKi8KCnN0YXRpYyB2b2lkIGlycV9pbml0KHZvaWQpCnsKCS8qIGRpc2FibGUgZ2xvYmFsIGludGVycnVwdCBtb2RlICovCglzYzUyMF9tbWNyLT5waWNpY3IgPSAweDQwOwoKCS8qIHNldCBhbGwgaXJxcyB0byBlZGdlICovCglzYzUyMF9tbWNyLT5waWNfbW9kZVswXSA9IDB4MDA7CglzYzUyMF9tbWNyLT5waWNfbW9kZVsxXSA9IDB4MDA7CglzYzUyMF9tbWNyLT5waWNfbW9kZVsyXSA9IDB4MDA7CgoJLyogYWN0aXZlIGxvdyBwb2xhcml0eSBvbiBQSUMgaW50ZXJydXB0IHBpbnMsCgkgKiAgYWN0aXZlIGhpZ2ggcG9sYXJpdHkgb24gYWxsIG90aGVyIGlycSBwaW5zICovCglzYzUyMF9tbWNyLT5pbnRwaW5wb2wgPSAweDAwMDA7CgoJLyogc2V0IGlycSBudW1iZXIgbWFwcGluZyAqLwoJc2M1MjBfbW1jci0+Z3BfdG1yX2ludF9tYXBbMF0gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgR1AgdGltZXIgMCBJTlQgKi8KCXNjNTIwX21tY3ItPmdwX3Rtcl9pbnRfbWFwWzFdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIEdQIHRpbWVyIDEgSU5UICovCglzYzUyMF9tbWNyLT5ncF90bXJfaW50X21hcFsyXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBHUCB0aW1lciAyIElOVCAqLwoJc2M1MjBfbW1jci0+cGl0X2ludF9tYXBbMF0gPSBTQzUyMF9JUlEwOwkJLyogU2V0IFBJVCB0aW1lciAwIElOVCB0byBJUlEwICovCglzYzUyMF9tbWNyLT5waXRfaW50X21hcFsxXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBQSVQgdGltZXIgMSBJTlQgKi8KCXNjNTIwX21tY3ItPnBpdF9pbnRfbWFwWzJdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIFBJVCB0aW1lciAyIElOVCAqLwoJc2M1MjBfbW1jci0+cGNpX2ludF9tYXBbMF0gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgUENJIElOVCBBICovCglzYzUyMF9tbWNyLT5wY2lfaW50X21hcFsxXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBQQ0kgSU5UIEIgKi8KCXNjNTIwX21tY3ItPnBjaV9pbnRfbWFwWzJdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIFBDSSBJTlQgQyAqLwoJc2M1MjBfbW1jci0+cGNpX2ludF9tYXBbM10gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgUENJIElOVCBEICovCglzYzUyMF9tbWNyLT5kbWFiY2ludG1hcCA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJCS8qIGRpc2FibGUgRE1BIElOVCAqLwoJc2M1MjBfbW1jci0+c3NpbWFwID0gU0M1MjBfSVJRNjsJCQkvKiBTZXQgU3luY2hyb25pdXMgc2VyaWFsIElOVCB0byBJUlE2Ki8KCXNjNTIwX21tY3ItPndkdG1hcCA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJCS8qIGRpc2FibGUgV2F0Y2hkb2cgSU5UICovCglzYzUyMF9tbWNyLT5ydGNtYXAgPSBTQzUyMF9JUlE4OwkJCS8qIFNldCBSVEMgaW50IHRvIDggKi8KCXNjNTIwX21tY3ItPndwdm1hcCA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJCS8qIGRpc2FibGUgd3JpdGUgcHJvdGVjdCBJTlQgKi8KCXNjNTIwX21tY3ItPmljZW1hcCA9IFNDNTIwX0lSUTE7CQkJLyogU2V0IElDRSBEZWJ1ZyBTZXJpZWxwb3J0IElOVCB0byBJUlExICovCglzYzUyMF9tbWNyLT5mZXJybWFwID0gU0M1MjBfSVJRMTM7IAkJCS8qIFNldCBGUCBlcnJvciBJTlQgdG8gSVJRMTMgKi8KCgoJc2M1MjBfbW1jci0+dWFydF9pbnRfbWFwWzBdID0gU0M1MjBfSVJRNDsJCS8qIFNldCBpbnRlcm5hbCBVQVJUMSBJTlQgdG8gSVJRNCAqLwoJc2M1MjBfbW1jci0+dWFydF9pbnRfbWFwWzFdID0gU0M1MjBfSVJRMzsJCS8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRMyAqLwoKCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbMF0gPSBTQzUyMF9JUlE3OwkJCS8qIFNldCBHUElSUTAgKFBDLUNhcmQgQVVYIElSUSkgdG8gSVJRNyAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFsxXSA9IFNDNTIwX0lSUTE0OwkJLyogU2V0IEdQSVJRMSAoQ0YgSVJRKSB0byBJUlExNCAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFszXSA9IFNDNTIwX0lSUTU7CQkJLyogU2V0IEdQSVJRMyAoIENBTiBJUlEgKSB0aSBJUlE1ICovCglzYzUyMF9tbWNyLT5ncF9pbnRfbWFwWzRdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkJLyogZGlzYmFsZSBHSVJRNCAoIElSUiBJUlEgKSAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFs1XSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJCS8qIGRpc2FibGUgR1BJUlE1ICovCglzYzUyMF9tbWNyLT5ncF9pbnRfbWFwWzZdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkJLyogZGlzYWJsZSBHUElSUTYgKi8KCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbN10gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CQkvKiBkaXNhYmxlIEdQSVJRNyAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFs4XSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJCS8qIGRpc2FibGUgR1BJUlE4ICovCglzYzUyMF9tbWNyLT5ncF9pbnRfbWFwWzldID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkJLyogZGlzYWJsZSBHUElSUTkgKi8KCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbMl0gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CQkvKiBkaXNhYmxlIEdQSVJRMiAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFsxMF0gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgR1BJUlExMCAqLwoKCXNjNTIwX21tY3ItPnBjaWhvc3RtYXAgPSAweDExZjsJCQkJLyogTWFwIFBDSSBob3N0YnJpZGdlIElOVCB0byBOTUkgKi8KCXNjNTIwX21tY3ItPmVjY21hcCA9IDB4MTAwOwkJCQkvKiBNYXAgU0RSQU0gRUNDIGZhaWx1cmUgSU5UIHRvIE5NSSAqLwoKfQoKLyogc2V0IHVwIHRoZSBJU0EgYnVzIHRpbWluZyBhbmQgc3lzdGVtIGFkZHJlc3MgbWFwcGluZ3MgKi8Kc3RhdGljIHZvaWQgYnVzX2luaXQodm9pZCkKewoJLyogdmVyc2lvbnMKCSAqIDAgICBIeWdsbyB2ZXJzaW9ucyAwLjk1IGFuZCAwLjk2IChsYXJnZSBiYW9yZHMpCgkgKiA/PyAgSHlnbG8gdmVyc2lvbiAwLjk3IChzbWFsbCBib2FyZCkKCSAqIDEwICBTcHVuayBib2FyZAoJICovCglpbnQgdmVyc2lvbiA9IHNjNTIwX21tY3ItPnN5c2luZm87CgoJaWYgKHZlcnNpb24pIHsKCQkvKiBzZXQgdXAgdGhlIEdQIElPIHBpbnMgKGZvciB0aGUgU3B1bmsgYm9hcmQpICovCgkJc2M1MjBfbW1jci0+cGlvcGZzMzFfMTYgPSAweGZmZjA7CS8qIHNldCB0aGUgR1BJTyBwaW4gZnVuY3Rpb24gMzEtMTYgcmVnICovCgkJc2M1MjBfbW1jci0+cGlvcGZzMTVfMCA9IDB4MDAwZjsJLyogc2V0IHRoZSBHUElPIHBpbiBmdW5jdGlvbiAxNS0wIHJlZyAqLwoJCXNjNTIwX21tY3ItPnBpb2RpcjMxXzE2ID0gMHgwMDBmOwkvKiBzZXQgdGhlIEdQSU8gZGlyZWN0aW9uIDMxLTE2IHJlZyAqLwoJCXNjNTIwX21tY3ItPnBpb2RpcjE1XzAgPSAweDFmZjA7CS8qIHNldCB0aGUgR1BJTyBkaXJlY3Rpb24gMTUtMCByZWcgKi8KCQlzYzUyMF9tbWNyLT5jc3BmcyA9IDB4YzA7CQkvKiBzZXQgdGhlIENTIHBpbiBmdW5jdGlvbiByZWcgKi8KCQlzYzUyMF9tbWNyLT5jbGtzZWwgPSAweDcwOwoKCQlzYzUyMF9tbWNyLT5waW9jbHIzMV8xNiA9IDB4MDAwMzsJLyogcmVzZXQgU1NJIGNoaXAtc2VsZWN0cyAqLwoJCXNjNTIwX21tY3ItPnBpb3NldDMxXzE2ID0gMHgwMDBjOwoKCX0gZWxzZSB7CgkJLyogc2V0IHVwIHRoZSBHUCBJTyBwaW5zIChmb3IgdGhlIEh5Z2xvIGJvYXJkKSAqLwoJCXNjNTIwX21tY3ItPnBpb3BmczMxXzE2ID0gMHhmZmMwOwkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDMxLTE2IHJlZyAqLwoJCXNjNTIwX21tY3ItPnBpb3BmczE1XzAgPSAweDFlN2Y7CS8qIHNldCB0aGUgR1BJTyBwaW4gZnVuY3Rpb24gMTUtMCByZWcgKi8KCQlzYzUyMF9tbWNyLT5waW9kaXIzMV8xNiA9IDB4MDAzZjsJLyogc2V0IHRoZSBHUElPIGRpcmVjdGlvbiAzMS0xNiByZWcgKi8KCQlzYzUyMF9tbWNyLT5waW9kaXIxNV8wID0gMHhlMTgwOwkvKiBzZXQgdGhlIEdQSU8gZGlyZWN0aW9uIDE1LTAgcmVnICovCgkJc2M1MjBfbW1jci0+Y3NwZnMgPSAweDAwOwkJLyogc2V0IHRoZSBDUyBwaW4gZnVuY3Rpb24gcmVnICovCgkJc2M1MjBfbW1jci0+Y2xrc2VsID0gMHg3MDsKCgkJc2M1MjBfbW1jci0+cGlvY2xyMTVfMCA9IDB4MDE4MDsJLyogcmVzZXQgU1NJIGNoaXAtc2VsZWN0cyAqLwoJfQoKCXNjNTIwX21tY3ItPmdwY3NydCA9IDE7CQkvKiBzZXQgdGhlIEdQIENTIG9mZnNldCAqLwoJc2M1MjBfbW1jci0+Z3Bjc3B3ID0gMzsJCS8qIHNldCB0aGUgR1AgQ1MgcHVsc2Ugd2lkdGggKi8KCXNjNTIwX21tY3ItPmdwY3NvZmYgPSAxOwkvKiBzZXQgdGhlIEdQIENTIG9mZnNldCAqLwoJc2M1MjBfbW1jci0+Z3ByZHcgPSAzOwkJLyogc2V0IHRoZSBSRCBwdWxzZSB3aWR0aCAqLwoJc2M1MjBfbW1jci0+Z3ByZG9mZiA9IDE7CS8qIHNldCB0aGUgR1AgUkQgb2Zmc2V0ICovCglzYzUyMF9tbWNyLT5ncHdydyA9IDM7CQkvKiBzZXQgdGhlIEdQIFdSIHB1bHNlIHdpZHRoICovCglzYzUyMF9tbWNyLT5ncHdyb2ZmID0gMTsJLyogc2V0IHRoZSBHUCBXUiBvZmZzZXQgKi8KCglzYzUyMF9tbWNyLT5ib290Y3NjdGwgPSAweDA0MDc7CS8qIHNldCB1cCB0aW1pbmcgb2YgQk9PVENTICovCgoJLyogYWRqdXN0IHRoZSBtZW1vcnkgbWFwOgoJICogYnkgZGVmYXVsdCB0aGUgZmlyc3QgMjU2TUIgKDB4MDAwMDAwMDAgLSAweDBmZmZmZmZmKSBpcyBtYXBwZWQgdG8gU0RSQU0KCSAqIGFuZCAyNTZNQiB0byAxRy0xMjhrICAoMHgxMDAwMDAwIC0gMHgzN2ZmZmZmZikgaXMgbWFwcGVkIHRvIFBDSSBtbWlvCgkgKiB3ZSBuZWVkIHRvIG1hcCAxRy0xMjhrIC0gMUcgKDB4MzgwMDAwMDAgLSAweDNmZmZmZmZmKSB0byBDUzEgKi8KCgoJLyogYm9vdGNzICovCglzYzUyMF9tbWNyLT5wYXJbMTJdID0gMHg4YmZmZTgwMDsKCgkvKiBJREUwID0gR1BDUzYgMWYwLTFmNyAqLwoJc2M1MjBfbW1jci0+cGFyWzNdID0gMHgzODA4MDFmMDsKCgkvKiBJREUxID0gR1BDUzcgM2Y2ICovCglzYzUyMF9tbWNyLT5wYXJbNF0gPSAweDNjMDAwM2Y2OwoKCWFzbSAoIndiaW52ZFxuIik7IC8qIEZsdXNoIGNhY2hlLCByZXEuIGFmdGVyIHNldHRpbmcgdGhlIHVuY2hhY2hlZCBhdHRyaWJ1dGUgb25hIFBBUiAqLwoKCXNjNTIwX21tY3ItPmFkZGRlY2N0bCA9IHNjNTIwX21tY3ItPmFkZGRlY2N0bCAmIH4oVUFSVDJfRElTfFVBUlQxX0RJUyk7Cgp9CgoKLyogcGFyIHVzYWdlOgogKiBQQVIwICAgKGxlZ2FjeV92aWRlbykKICogUEFSMSAgIChQQ0kgUk9NIG1hcHBpbmcpCiAqIFBBUjIKICogUEFSMyAgIElERQogKiBQQVI0ICAgSURFCiAqIFBBUjUgICAobGVnYWN5X3ZpZGVvKQogKiBQQVI2CiAqIFBBUjcgICAobGVnYWN5X3ZpZGVvKQogKiBQQVI4ICAgKGxlZ2FjeV92aWRlbykKICogUEFSOSAgIChsZWdhY3lfdmlkZW8pCiAqIFBBUjEwCiAqIFBBUjExICAoSVNBUk9NKQogKiBQQVIxMiAgQk9PVENTCiAqIFBBUjEzCiAqIFBBUjE0CiAqIFBBUjE1CiAqLwoKLyoKICogTWlzY2VsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMKICovCgppbnQgYm9hcmRfaW5pdCh2b2lkKQp7Cglpbml0X3NjNTIwKCk7CglidXNfaW5pdCgpOwoJaXJxX2luaXQoKTsKCgkvKiBtYXggZHJpdmUgY3VycmVudCBvbiBTRFJBTSAqLwoJc2M1MjBfbW1jci0+ZHNjdGwgPSAweDAxMDA7CgoJLyogZW50ZXIgZGVidWcgbW9kZSBhZnRlciBuZXh0IHJlc2V0IChvbmx5IGlmIGp1bXBlciBpcyBhbHNvIHNldCkgKi8KCXNjNTIwX21tY3ItPnJlc2NmZyA9IDB4MDg7CgkvKiBjb25maWd1cmUgdGhlIHNvZnR3YXJlIHRpbWVyIHRvIDMzLjAwME1IeiAqLwoJc2M1MjBfbW1jci0+c3d0bXJjZmcgPSAxOwoJZ2QtPmJ1c19jbGsgPSAzMzAwMDAwMDsKCglyZXR1cm4gMDsKfQoKaW50IGRyYW1faW5pdCh2b2lkKQp7Cglpbml0X3NjNTIwX2RyYW0oKTsKCXJldHVybiAwOwp9Cgp2b2lkIHNob3dfYm9vdF9wcm9ncmVzcyhpbnQgdmFsKQp7CglpbnQgdmVyc2lvbiA9IHNjNTIwX21tY3ItPnN5c2luZm87CgoJaWYgKHZhbCA8IC0zMikgdmFsID0gLTE7ICAvKiBsZXQgdGhpbmdzIGNvbXBhdGlibGUgKi8KCWlmICh2ZXJzaW9uID09IDApIHsKCQkvKiBQSU8zMS1QSU8xNiBEYXRhICovCgkJc2M1MjBfbW1jci0+cGlvZGF0YTMxXzE2ID0gKHNjNTIwX21tY3ItPnBpb2RhdGEzMV8xNiAmIDB4ZmZjMCkgfCAoKHZhbCYweDdlKT4+MSk7IC8qIDB4MWY4ID4+IDMgKi8KCgkJLyogUElPMC1QSU8xNSBEYXRhICovCgkJc2M1MjBfbW1jci0+cGlvZGF0YTE1XzAgPSAoc2M1MjBfbW1jci0+cGlvZGF0YTE1XzAgJiAweDFmZmYpfCAoKHZhbCYweDcpPDwxMyk7Cgl9IGVsc2UgewoJCS8qIG5ld2VyIGJvYXJkcyB1c2UgUElPNC1QSU8xMiAqLwoJCS8qIFBJTzAtUElPMTUgRGF0YSAqLwojaWYgMAoJCXZhbCA9ICh2YWwgJiAweDAwNykgfCAoKHZhbCAmIDB4MDM4KSA8PCAzKSB8ICgodmFsICYgMHgxYzApID4+IDMpOwojZWxzZQoJCXZhbCA9ICh2YWwgJiAweDAwNykgfCAoKHZhbCAmIDB4MDdlKSA8PCAyKTsKI2VuZGlmCgkJc2M1MjBfbW1jci0+cGlvZGF0YTE1XzAgPSAoc2M1MjBfbW1jci0+cGlvZGF0YTE1XzAgJiAweGUwMGYpIHwgKCh2YWwmMHgwMWZmKTw8NCk7Cgl9Cn0KCgppbnQgbGFzdF9zdGFnZV9pbml0KHZvaWQpCnsKCglpbnQgdmVyc2lvbiA9IHNjNTIwX21tY3ItPnN5c2luZm87CgoJcHJpbnRmKCJPbWljcm9uIENldGkgU0M1MjAgU3B1bmsgcmV2aXNpb24gJXhcbiIsIHZlcnNpb24pOwoKI2lmIDAKCWlmICh2ZXJzaW9uKSB7CgkJaW50IHgsIHk7CgoJCXByaW50ZigiZWVwcm9tIHByb2JlICVkXG4iLCBzcGlfZWVwcm9tX3Byb2JlKDEpKTsKCgkJc3BpX2VlcHJvbV9yZWFkKDEsIDAsICh1OCopJngsIDIpOwoJCXNwaV9lZXByb21fcmVhZCgxLCAxLCAodTgqKSZ5LCAyKTsKCQlwcmludGYoImVlcHJvbSBieXRlcyAlMDR4JTA0eFxuIiwgeCwgeSk7CgkJeCBePSAweGZmZmY7CgkJeSBePSAweGZmZmY7CgkJc3BpX2VlcHJvbV93cml0ZSgxLCAwLCAodTgqKSZ4LCAyKTsKCQlzcGlfZWVwcm9tX3dyaXRlKDEsIDEsICh1OCopJnksIDIpOwoKCQlzcGlfZWVwcm9tX3JlYWQoMSwgMCwgKHU4KikmeCwgMik7CgkJc3BpX2VlcHJvbV9yZWFkKDEsIDEsICh1OCopJnksIDIpOwoJCXByaW50ZigiZWVwcm9tIGJ5dGVzICUwNHglMDR4XG4iLCB4LCB5KTsKCgl9IGVsc2UgewoJCWludCB4LCB5OwoKCQlwcmludGYoImVlcHJvbSBwcm9iZSAlZFxuIiwgbXdfZWVwcm9tX3Byb2JlKDEpKTsKCgkJbXdfZWVwcm9tX3JlYWQoMSwgMCwgKHU4KikmeCwgMik7CgkJbXdfZWVwcm9tX3JlYWQoMSwgMSwgKHU4KikmeSwgMik7CgkJcHJpbnRmKCJlZXByb20gYnl0ZXMgJTA0eCUwNHhcbiIsIHgsIHkpOwoKCQl4IF49IDB4ZmZmZjsKCQl5IF49IDB4ZmZmZjsKCQltd19lZXByb21fd3JpdGUoMSwgMCwgKHU4KikmeCwgMik7CgkJbXdfZWVwcm9tX3dyaXRlKDEsIDEsICh1OCopJnksIDIpOwoKCQltd19lZXByb21fcmVhZCgxLCAwLCAodTgqKSZ4LCAyKTsKCQltd19lZXByb21fcmVhZCgxLCAxLCAodTgqKSZ5LCAyKTsKCQlwcmludGYoImVlcHJvbSBieXRlcyAlMDR4JTA0eFxuIiwgeCwgeSk7CgoKCX0KI2VuZGlmCgoJZHMxNzIyX3Byb2JlKDIpOwoKCXJldHVybiAwOwp9Cgp2b2lkIHNzaV9jaGlwX3NlbGVjdChpbnQgZGV2KQp7CglpbnQgdmVyc2lvbiA9IHNjNTIwX21tY3ItPnN5c2luZm87CgoJaWYgKHZlcnNpb24pIHsKCQkvKiBTcHVuayBib2FyZDogRUVQUk9NIGFuZCBDQU4gYXJlIGFjdG92ZS1sb3csIFRFTVAgYW5kIEFVWCBhcmUgYWN0aXZlIGhpZ2ggKi8KCQlzd2l0Y2ggKGRldikgewoJCWNhc2UgMTogLyogRUVQUk9NICovCgkJCXNjNTIwX21tY3ItPnBpb2NscjMxXzE2ID0gMHgwMDA0OwoJCQlicmVhazsKCgkJY2FzZSAyOiAvKiBUZW1wIFByb2JlICovCgkJCXNjNTIwX21tY3ItPnBpb3NldDMxXzE2ID0gMHgwMDAyOwoJCQlicmVhazsKCgkJY2FzZSAzOiAvKiBDQU4gKi8KCQkJc2M1MjBfbW1jci0+cGlvY2xyMzFfMTYgPSAweDAwMDg7CgkJCWJyZWFrOwoKCQljYXNlIDQ6IC8qIEFVWCAqLwoJCQlzYzUyMF9tbWNyLT5waW9zZXQzMV8xNiA9IDB4MDAwMTsKCQkJYnJlYWs7CgoJCWNhc2UgMDoKCQkJc2M1MjBfbW1jci0+cGlvY2xyMzFfMTYgPSAweDAwMDM7CgkJCXNjNTIwX21tY3ItPnBpb3NldDMxXzE2ID0gMHgwMDBjOwoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJcHJpbnRmKCJJbGxlZ2FsIFNTSSBkZXZpY2UgcmVxdWVzdGVkOiAlZFxuIiwgZGV2KTsKCQl9Cgl9IGVsc2UgewoKCQkvKiBHbG9ib3ggYm9hcmQ6IEJvdGggRUVQUk9NIGFuZCBURU1QIGFyZSBhY3RpdmUtaGlnaCAqLwoKCQlzd2l0Y2ggKGRldikgewoJCWNhc2UgMTogLyogRUVQUk9NICovCgkJCXNjNTIwX21tY3ItPnBpb3NldDE1XzAgPSAweDAxMDA7CgkJCWJyZWFrOwoKCQljYXNlIDI6IC8qIFRlbXAgUHJvYmUgKi8KCQkJc2M1MjBfbW1jci0+cGlvc2V0MTVfMCA9IDB4MDA4MDsKCQkJYnJlYWs7CgoJCWNhc2UgMDoKCQkJc2M1MjBfbW1jci0+cGlvY2xyMTVfMCA9IDB4MDE4MDsKCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCXByaW50ZigiSWxsZWdhbCBTU0kgZGV2aWNlIHJlcXVlc3RlZDogJWRcbiIsIGRldik7CgkJfQoJfQp9Cgp2b2lkIHNwaV9lZXByb21fcHJvYmUoaW50IHgpCnsKfQoKaW50IHNwaV9lZXByb21fcmVhZChpbnQgeCwgaW50IG9mZnNldCwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewogICAgICAgcmV0dXJuIDA7Cn0KCmludCBzcGlfZWVwcm9tX3dyaXRlKGludCB4LCBpbnQgb2Zmc2V0LCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQp7CiAgICAgICByZXR1cm4gMDsKfQoKdm9pZCBtd19lZXByb21fcHJvYmUoaW50IHgpCnsKfQoKaW50IG13X2VlcHJvbV9yZWFkKGludCB4LCBpbnQgb2Zmc2V0LCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQp7CiAgICAgICByZXR1cm4gMDsKfQoKaW50IG13X2VlcHJvbV93cml0ZShpbnQgeCwgaW50IG9mZnNldCwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewogICAgICAgcmV0dXJuIDA7Cn0KCnZvaWQgc3BpX2luaXRfZih2b2lkKQp7CglzYzUyMF9tbWNyLT5zeXNpbmZvID8gc3BpX2VlcHJvbV9wcm9iZSgxKSA6IG13X2VlcHJvbV9wcm9iZSgxKTsKCn0KCnNzaXplX3Qgc3BpX3JlYWQodWNoYXIgKmFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQp7CglpbnQgb2Zmc2V0OwoJaW50IGk7CgoJb2Zmc2V0ID0gMDsKCWZvciAoaT0wO2k8YWxlbjtpKyspIHsKCQlvZmZzZXQgPDw9IDg7CgkJb2Zmc2V0IHw9IGFkZHJbaV07Cgl9CgoJcmV0dXJuCXNjNTIwX21tY3ItPnN5c2luZm8gPwoJCXNwaV9lZXByb21fcmVhZCgxLCBvZmZzZXQsIGJ1ZmZlciwgbGVuKSA6Cgltd19lZXByb21fcmVhZCgxLCBvZmZzZXQsIGJ1ZmZlciwgbGVuKTsKfQoKc3NpemVfdCBzcGlfd3JpdGUodWNoYXIgKmFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQp7CglpbnQgb2Zmc2V0OwoJaW50IGk7CgoJb2Zmc2V0ID0gMDsKCWZvciAoaT0wO2k8YWxlbjtpKyspIHsKCQlvZmZzZXQgPDw9IDg7CgkJb2Zmc2V0IHw9IGFkZHJbaV07Cgl9CgoJcmV0dXJuCXNjNTIwX21tY3ItPnN5c2luZm8gPwoJCXNwaV9lZXByb21fd3JpdGUoMSwgb2Zmc2V0LCBidWZmZXIsIGxlbikgOgoJbXdfZWVwcm9tX3dyaXRlKDEsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwp9CgppbnQgYm9hcmRfZXRoX2luaXQoYmRfdCAqYmlzKQp7CglyZXR1cm4gcGNpX2V0aF9pbml0KGJpcyk7Cn0K