LyogQ29weXJpZ2h0IDIwMTggTlhQCiAqCiAqIFBlbmcgRmFuIDxwZW5nLmZhbkBueHAuY29tPgogKgogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogICAgIEdQTC0yLjArCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2suaD4KI2luY2x1ZGUgPGFzbS9hcmNoL2lteC1yZWdzLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8ZGl2NjQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CgpERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCnN0YXRpYyBzdHJ1Y3QgYW5hbWl4X3BsbCAqYW5hX3BsbCA9IChzdHJ1Y3QgYW5hbWl4X3BsbCAqKUFOQVRPUF9CQVNFX0FERFI7CgojaWZkZWYgQ09ORklHX1NFQ1VSRV9CT09UCnZvaWQgaGFiX2NhYW1fY2xvY2tfZW5hYmxlKHVuc2lnbmVkIGNoYXIgZW5hYmxlKQp7CgkvKiBUaGUgQ0FBTSBjbG9jayBpcyBhbHdheXMgb24gZm9yIGlNWDhNICovCn0KI2VuZGlmCgojaWZkZWYgQ09ORklHX01YQ19PQ09UUAp2b2lkIGVuYWJsZV9vY290cF9jbGsodW5zaWduZWQgY2hhciBlbmFibGUpCnsKCWNsb2NrX2VuYWJsZShDQ0dSX09DT1RQLCAhIWVuYWJsZSk7Cn0KI2VuZGlmCgppbnQgZW5hYmxlX2kyY19jbGsodW5zaWduZWQgY2hhciBlbmFibGUsIHVuc2lnbmVkIGkyY19udW0pCnsKCS8qIDAgLSAzIGlzIHZhbGlkIGkyYyBudW0gKi8KCWlmIChpMmNfbnVtID4gMykKCQlyZXR1cm4gLUVJTlZBTDsKCgljbG9ja19lbmFibGUoQ0NHUl9JMkMxICsgaTJjX251bSwgISFlbmFibGUpOwoKCXJldHVybiAwOwp9Cgp1MzIgZGVjb2RlX2ludHBsbChlbnVtIGNsa19yb290X3NyYyBpbnRwbGwpCnsKCXUzMiBwbGxfZ25ybF9jdGwsIHBsbF9kaXZfY3RsLCBwbGxfY2xrZV9tYXNrOwoJdTMyIG1haW5fZGl2LCBwcmVfZGl2LCBwb3N0X2RpdiwgZGl2OwoJdTY0IGZyZXE7CgoJc3dpdGNoIChpbnRwbGwpIHsKCWNhc2UgQVJNX1BMTF9DTEs6CgkJcGxsX2ducmxfY3RsID0gcmVhZGwoJmFuYV9wbGwtPmFybV9wbGxfZ25ybF9jdGwpOwoJCXBsbF9kaXZfY3RsID0gcmVhZGwoJmFuYV9wbGwtPmFybV9wbGxfZGl2X2N0bCk7CgkJYnJlYWs7CgljYXNlIEdQVV9QTExfQ0xLOgoJCXBsbF9nbnJsX2N0bCA9IHJlYWRsKCZhbmFfcGxsLT5ncHVfcGxsX2ducmxfY3RsKTsKCQlwbGxfZGl2X2N0bCA9IHJlYWRsKCZhbmFfcGxsLT5ncHVfcGxsX2Rpdl9jdGwpOwoJCWJyZWFrOwoJY2FzZSBWUFVfUExMX0NMSzoKCQlwbGxfZ25ybF9jdGwgPSByZWFkbCgmYW5hX3BsbC0+dnB1X3BsbF9nbnJsX2N0bCk7CgkJcGxsX2Rpdl9jdGwgPSByZWFkbCgmYW5hX3BsbC0+dnB1X3BsbF9kaXZfY3RsKTsKCQlicmVhazsKCWNhc2UgU1lTVEVNX1BMTDFfODAwTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwxXzQwME1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMV8yNjZNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDFfMjAwTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwxXzE2ME1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMV8xMzNNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDFfMTAwTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwxXzgwTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwxXzQwTV9DTEs6CgkJcGxsX2ducmxfY3RsID0gcmVhZGwoJmFuYV9wbGwtPnN5c19wbGwxX2ducmxfY3RsKTsKCQlwbGxfZGl2X2N0bCA9IHJlYWRsKCZhbmFfcGxsLT5zeXNfcGxsMV9kaXZfY3RsKTsKCQlicmVhazsKCWNhc2UgU1lTVEVNX1BMTDJfMTAwME1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMl81MDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDJfMzMzTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwyXzI1ME1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMl8yMDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDJfMTY2TV9DTEs6CgljYXNlIFNZU1RFTV9QTEwyXzEyNU1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMl8xMDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDJfNTBNX0NMSzoKCQlwbGxfZ25ybF9jdGwgPSByZWFkbCgmYW5hX3BsbC0+c3lzX3BsbDJfZ25ybF9jdGwpOwoJCXBsbF9kaXZfY3RsID0gcmVhZGwoJmFuYV9wbGwtPnN5c19wbGwyX2Rpdl9jdGwpOwoJCWJyZWFrOwoJY2FzZSBTWVNURU1fUExMM19DTEs6CgkJcGxsX2ducmxfY3RsID0gcmVhZGwoJmFuYV9wbGwtPnN5c19wbGwzX2ducmxfY3RsKTsKCQlwbGxfZGl2X2N0bCA9IHJlYWRsKCZhbmFfcGxsLT5zeXNfcGxsM19kaXZfY3RsKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLyogT25seSBzdXBwb3J0IFNZU19YVEFMIDI0TSwgUEFEX0NMSyBub3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gKi8KCWlmICgocGxsX2ducmxfY3RsICYgSU5UUExMX1JFRl9DTEtfU0VMX01BU0spICE9IDApCgkJcmV0dXJuIDA7CgoJaWYgKChwbGxfZ25ybF9jdGwgJiBJTlRQTExfUlNUX01BU0spID09IDApCgkJcmV0dXJuIDA7CgoJLyoKCSAqIFdoZW4gQllQQVNTIGlzIGVxdWFsIHRvIDEsIFBMTCBlbnRlcnMgdGhlIGJ5cGFzcyBtb2RlCgkgKiByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZXMgb2YgUkVTRVRCCgkgKi8KCWlmIChwbGxfZ25ybF9jdGwgJiBJTlRQTExfQllQQVNTX01BU0spCgkJcmV0dXJuIDI0MDAwMDAwdTsKCglpZiAoIShwbGxfZ25ybF9jdGwgJiBJTlRQTExfTE9DS19NQVNLKSkgewoJCXB1dHMoInBsbCBub3QgbG9ja2VkXG4iKTsKCQlyZXR1cm4gMDsKCX0KCglzd2l0Y2ggKGludHBsbCkgewoJY2FzZSBBUk1fUExMX0NMSzoKCWNhc2UgR1BVX1BMTF9DTEs6CgljYXNlIFZQVV9QTExfQ0xLOgoJY2FzZSBTWVNURU1fUExMM19DTEs6CgljYXNlIFNZU1RFTV9QTEwxXzgwME1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMl8xMDAwTV9DTEs6CgkJcGxsX2Nsa2VfbWFzayA9IElOVFBMTF9DTEtFX01BU0s7CgkJZGl2ID0gMTsKCQlicmVhazsKCgljYXNlIFNZU1RFTV9QTEwxXzQwME1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMl81MDBNX0NMSzoKCQlwbGxfY2xrZV9tYXNrID0gSU5UUExMX0RJVjJfQ0xLRV9NQVNLOwoJCWRpdiA9IDI7CgkJYnJlYWs7CgoJY2FzZSBTWVNURU1fUExMMV8yNjZNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDJfMzMzTV9DTEs6CgkJcGxsX2Nsa2VfbWFzayA9IElOVFBMTF9ESVYzX0NMS0VfTUFTSzsKCQlkaXYgPSAzOwoJCWJyZWFrOwoKCWNhc2UgU1lTVEVNX1BMTDFfMjAwTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwyXzI1ME1fQ0xLOgoJCXBsbF9jbGtlX21hc2sgPSBJTlRQTExfRElWNF9DTEtFX01BU0s7CgkJZGl2ID0gNDsKCQlicmVhazsKCgljYXNlIFNZU1RFTV9QTEwxXzE2ME1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMl8yMDBNX0NMSzoKCQlwbGxfY2xrZV9tYXNrID0gSU5UUExMX0RJVjVfQ0xLRV9NQVNLOwoJCWRpdiA9IDU7CgkJYnJlYWs7CgoJY2FzZSBTWVNURU1fUExMMV8xMzNNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDJfMTY2TV9DTEs6CgkJcGxsX2Nsa2VfbWFzayA9IElOVFBMTF9ESVY2X0NMS0VfTUFTSzsKCQlkaXYgPSA2OwoJCWJyZWFrOwoKCWNhc2UgU1lTVEVNX1BMTDFfMTAwTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwyXzEyNU1fQ0xLOgoJCXBsbF9jbGtlX21hc2sgPSBJTlRQTExfRElWOF9DTEtFX01BU0s7CgkJZGl2ID0gODsKCQlicmVhazsKCgljYXNlIFNZU1RFTV9QTEwxXzgwTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwyXzEwME1fQ0xLOgoJCXBsbF9jbGtlX21hc2sgPSBJTlRQTExfRElWMTBfQ0xLRV9NQVNLOwoJCWRpdiA9IDEwOwoJCWJyZWFrOwoKCWNhc2UgU1lTVEVNX1BMTDFfNDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDJfNTBNX0NMSzoKCQlwbGxfY2xrZV9tYXNrID0gSU5UUExMX0RJVjIwX0NMS0VfTUFTSzsKCQlkaXYgPSAyMDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJaWYgKChwbGxfZ25ybF9jdGwgJiBwbGxfY2xrZV9tYXNrKSA9PSAwKQoJCXJldHVybiAwOwoKCW1haW5fZGl2ID0gKHBsbF9kaXZfY3RsICYgSU5UUExMX01BSU5fRElWX01BU0spID4+CgkJSU5UUExMX01BSU5fRElWX1NISUZUOwoJcHJlX2RpdiA9IChwbGxfZGl2X2N0bCAmIElOVFBMTF9QUkVfRElWX01BU0spID4+CgkJSU5UUExMX1BSRV9ESVZfU0hJRlQ7Cglwb3N0X2RpdiA9IChwbGxfZGl2X2N0bCAmIElOVFBMTF9QT1NUX0RJVl9NQVNLKSA+PgoJCUlOVFBMTF9QT1NUX0RJVl9TSElGVDsKCgkvKiBGRlZDTyA9IChtICogRkZJTikgLyBwLCBGRk9VVCA9IChtICogRkZJTikgLyAocCAqIDJecykgKi8KCWZyZXEgPSAyNDAwMDAwMFVMTCAqIG1haW5fZGl2OwoJcmV0dXJuIGxsZGl2KGZyZXEsIHByZV9kaXYgKiAoMSA8PCBwb3N0X2RpdikgKiBkaXYpOwp9Cgp1MzIgZGVjb2RlX2ZyYWNwbGwoZW51bSBjbGtfcm9vdF9zcmMgZnJhY19wbGwpCnsKCXUzMiBwbGxfZ25ybF9jdGwsIHBsbF9mZGl2X2N0bDAsIHBsbF9mZGl2X2N0bDE7Cgl1MzIgbWFpbl9kaXYsIHByZV9kaXYsIHBvc3RfZGl2LCBrOwoKCXN3aXRjaCAoZnJhY19wbGwpIHsKCWNhc2UgRFJBTV9QTEwxX0NMSzoKCQlwbGxfZ25ybF9jdGwgPSByZWFkbCgmYW5hX3BsbC0+ZHJhbV9wbGxfZ25ybF9jdGwpOwoJCXBsbF9mZGl2X2N0bDAgPSByZWFkbCgmYW5hX3BsbC0+ZHJhbV9wbGxfZmRpdl9jdGwwKTsKCQlwbGxfZmRpdl9jdGwxID0gcmVhZGwoJmFuYV9wbGwtPmRyYW1fcGxsX2ZkaXZfY3RsMSk7CgkJYnJlYWs7CgljYXNlIEFVRElPX1BMTDFfQ0xLOgoJCXBsbF9nbnJsX2N0bCA9IHJlYWRsKCZhbmFfcGxsLT5hdWRpb19wbGwxX2ducmxfY3RsKTsKCQlwbGxfZmRpdl9jdGwwID0gcmVhZGwoJmFuYV9wbGwtPmF1ZGlvX3BsbDFfZmRpdl9jdGwwKTsKCQlwbGxfZmRpdl9jdGwxID0gcmVhZGwoJmFuYV9wbGwtPmF1ZGlvX3BsbDFfZmRpdl9jdGwxKTsKCQlicmVhazsKCWNhc2UgQVVESU9fUExMMl9DTEs6CgkJcGxsX2ducmxfY3RsID0gcmVhZGwoJmFuYV9wbGwtPmF1ZGlvX3BsbDJfZ25ybF9jdGwpOwoJCXBsbF9mZGl2X2N0bDAgPSByZWFkbCgmYW5hX3BsbC0+YXVkaW9fcGxsMl9mZGl2X2N0bDApOwoJCXBsbF9mZGl2X2N0bDEgPSByZWFkbCgmYW5hX3BsbC0+YXVkaW9fcGxsMl9mZGl2X2N0bDEpOwoJCWJyZWFrOwoJY2FzZSBWSURFT19QTExfQ0xLOgoJCXBsbF9nbnJsX2N0bCA9IHJlYWRsKCZhbmFfcGxsLT52aWRlb19wbGwxX2ducmxfY3RsKTsKCQlwbGxfZmRpdl9jdGwwID0gcmVhZGwoJmFuYV9wbGwtPnZpZGVvX3BsbDFfZmRpdl9jdGwwKTsKCQlwbGxfZmRpdl9jdGwxID0gcmVhZGwoJmFuYV9wbGwtPnZpZGVvX3BsbDFfZmRpdl9jdGwxKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRmKCJOb3Qgc3VwcG9ydGVkXG4iKTsKCQlyZXR1cm4gMDsKCX0KCgkvKiBPbmx5IHN1cHBvcnQgU1lTX1hUQUwgMjRNLCBQQURfQ0xLIG5vdCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiAqLwoJaWYgKChwbGxfZ25ybF9jdGwgJiBJTlRQTExfUkVGX0NMS19TRUxfTUFTSykgIT0gMCkKCQlyZXR1cm4gMDsKCglpZiAoKHBsbF9nbnJsX2N0bCAmIElOVFBMTF9SU1RfTUFTSykgPT0gMCkKCQlyZXR1cm4gMDsKCS8qCgkgKiBXaGVuIEJZUEFTUyBpcyBlcXVhbCB0byAxLCBQTEwgZW50ZXJzIHRoZSBieXBhc3MgbW9kZQoJICogcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWVzIG9mIFJFU0VUQgoJICovCglpZiAocGxsX2ducmxfY3RsICYgSU5UUExMX0JZUEFTU19NQVNLKQoJCXJldHVybiAyNDAwMDAwMHU7CgoJaWYgKCEocGxsX2ducmxfY3RsICYgSU5UUExMX0xPQ0tfTUFTSykpIHsKCQlwdXRzKCJwbGwgbm90IGxvY2tlZFxuIik7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKCEocGxsX2ducmxfY3RsICYgSU5UUExMX0NMS0VfTUFTSykpCgkJcmV0dXJuIDA7CgoJbWFpbl9kaXYgPSAocGxsX2ZkaXZfY3RsMCAmIElOVFBMTF9NQUlOX0RJVl9NQVNLKSA+PgoJCUlOVFBMTF9NQUlOX0RJVl9TSElGVDsKCXByZV9kaXYgPSAocGxsX2ZkaXZfY3RsMCAmIElOVFBMTF9QUkVfRElWX01BU0spID4+CgkJSU5UUExMX1BSRV9ESVZfU0hJRlQ7Cglwb3N0X2RpdiA9IChwbGxfZmRpdl9jdGwwICYgSU5UUExMX1BPU1RfRElWX01BU0spID4+CgkJSU5UUExMX1BPU1RfRElWX1NISUZUOwoKCWsgPSBwbGxfZmRpdl9jdGwxICYgR0VOTUFTSygxNSwgMCk7CgoJLyogRkZPVVQgPSAoKG0gKyBrIC8gNjU1MzYpICogRkZJTikgLyAocCAqIDJecyksIDEgodwgcCCh3CA2MywgNjQgodwgbSCh3CAxMDIzLCAwIKHcIHMgodwgNiAqLwoJcmV0dXJuIGxsZGl2KChtYWluX2RpdiAqIDY1NTM2ICsgaykgKiAyNDAwMDAwMFVMTCwgNjU1MzYgKiBwcmVfZGl2ICogKDEgPDwgcG9zdF9kaXYpKTsKfQoKc3RhdGljIHN0cnVjdCBpbXhfaW50X3BsbF9yYXRlX3RhYmxlIGlteDhtbV9mcmFjcGxsX3RibFtdID0gewoJUExMXzE0NDNYX1JBVEUoODAwMDAwMDAwVSwgMjAwLCAzLCAxLCAwKSwKCVBMTF8xNDQzWF9SQVRFKDc1MDAwMDAwMFUsIDI1MCwgMiwgMiwgMCksCglQTExfMTQ0M1hfUkFURSg2NTAwMDAwMDBVLCAzMjUsIDMsIDIsIDApLAoJUExMXzE0NDNYX1JBVEUoNjAwMDAwMDAwVSwgMzAwLCAzLCAyLCAwKSwKCVBMTF8xNDQzWF9SQVRFKDU5NDAwMDAwMFUsIDk5LCAxLCAyLCAwKSwKCVBMTF8xNDQzWF9SQVRFKDQwMDAwMDAwMFUsIDQwMCwgMywgMywgMCksCglQTExfMTQ0M1hfUkFURSgyNjYwMDAwMDBVLCAyNjYsIDMsIDMsIDApLAoJUExMXzE0NDNYX1JBVEUoMTY3MDAwMDAwVSwgMzM0LCAzLCA0LCAwKSwKCVBMTF8xNDQzWF9SQVRFKDEwMDAwMDAwMFUsIDIwMCwgMywgNCwgMCksCn07CgppbnQgZnJhY3BsbF9jb25maWd1cmUoZW51bSBwbGxfY2xvY2tzIHBsbCwgdTMyIGZyZXEpCnsKCWludCBpOwoJdTMyIHRtcCwgZGl2X3ZhbDsKCXZvaWQgKnBsbF9iYXNlOwoJc3RydWN0IGlteF9pbnRfcGxsX3JhdGVfdGFibGUgKnJhdGU7CgoJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW14OG1tX2ZyYWNwbGxfdGJsKTsgaSsrKSB7CgkJaWYgKGZyZXEgPT0gaW14OG1tX2ZyYWNwbGxfdGJsW2ldLnJhdGUpCgkJCWJyZWFrOwoJfQoKCWlmIChpID09IEFSUkFZX1NJWkUoaW14OG1tX2ZyYWNwbGxfdGJsKSkgewoJCXByaW50ZigiTm8gbWF0Y2hlZCBmcmVxIHRhYmxlICV1XG4iLCBmcmVxKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglyYXRlID0gJmlteDhtbV9mcmFjcGxsX3RibFtpXTsKCglzd2l0Y2ggKHBsbCkgewoJY2FzZSBBTkFUT1BfRFJBTV9QTEw6CgkJI2RlZmluZSBTUkNfRERSMV9FTkFCTEVfTUFTSyAoMHg4RjAwMDAwMFVMKQoJCXNldGJpdHNfbGUzMihHUENfQkFTRV9BRERSICsgMHhFQywgMSA8PCA3KTsKCQlzZXRiaXRzX2xlMzIoR1BDX0JBU0VfQUREUiArIDB4RjgsIDEgPDwgNSk7CgkJd3JpdGVsKFNSQ19ERFIxX0VOQUJMRV9NQVNLLCBTUkNfQkFTRV9BRERSICsgMHgxMDA0KTsKCgkJcGxsX2Jhc2UgPSAmYW5hX3BsbC0+ZHJhbV9wbGxfZ25ybF9jdGw7CgkJYnJlYWs7CgljYXNlIEFOQVRPUF9WSURFT19QTEw6CgkJcGxsX2Jhc2UgPSAmYW5hX3BsbC0+dmlkZW9fcGxsMV9nbnJsX2N0bDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7Cgl9CgkvKiBCeXBhc3MgY2xvY2sgYW5kIHNldCBsb2NrIHRvIHBsbCBvdXRwdXQgbG9jayAqLwoJdG1wID0gcmVhZGwocGxsX2Jhc2UpOwoJdG1wIHw9IEJZUEFTU19NQVNLOwoJd3JpdGVsKHRtcCwgcGxsX2Jhc2UpOwoKCS8qIEVuYWJsZSBSU1QgKi8KCXRtcCAmPSB+UlNUX01BU0s7Cgl3cml0ZWwodG1wLCBwbGxfYmFzZSk7CgoJZGl2X3ZhbCA9IChyYXRlLT5tZGl2IDw8IE1ESVZfU0hJRlQpIHwgKHJhdGUtPnBkaXYgPDwgUERJVl9TSElGVCkgfAoJCShyYXRlLT5zZGl2IDw8IFNESVZfU0hJRlQpOwoJd3JpdGVsKGRpdl92YWwsIHBsbF9iYXNlICsgNCk7Cgl3cml0ZWwocmF0ZS0+a2RpdiA8PCBLRElWX1NISUZULCBwbGxfYmFzZSArIDgpOwoKCV9fdWRlbGF5KDEwMCk7CgoJLyogRGlzYWJsZSBSU1QgKi8KCXRtcCB8PSBSU1RfTUFTSzsKCXdyaXRlbCh0bXAsIHBsbF9iYXNlKTsKCgkvKiBXYWl0IExvY2sqLwoJd2hpbGUgKCEocmVhZGwocGxsX2Jhc2UpICYgTE9DS19TVEFUVVMpKQoJCTsKCgkvKiBCeXBhc3MgKi8KCXRtcCAmPSB+QllQQVNTX01BU0s7Cgl3cml0ZWwodG1wLCBwbGxfYmFzZSk7CgoJcmV0dXJuIDA7Cn0KCiNpZmRlZiBDT05GSUdfU1BMX0JVSUxECnZvaWQgZHJhbV9wbGxfaW5pdCh1bG9uZyBwbGxfdmFsKQp7CglmcmFjcGxsX2NvbmZpZ3VyZShBTkFUT1BfRFJBTV9QTEwsIHBsbF92YWwpOwp9CgpzdGF0aWMgc3RydWN0IGRyYW1fYnlwYXNzX2Nsa19zZXR0aW5nIGlteDhtbV9kcmFtX2J5cGFzc190YmxbXSA9IHsKCURSQU1fQllQQVNTX1JPT1RfQ09ORklHKE1IWigxMDApLCAyLCBDTEtfUk9PVF9QUkVfRElWMSwgMiwgQ0xLX1JPT1RfUFJFX0RJVjIpLAoJRFJBTV9CWVBBU1NfUk9PVF9DT05GSUcoTUhaKDI1MCksIDMsIENMS19ST09UX1BSRV9ESVYyLCAyLCBDTEtfUk9PVF9QUkVfRElWMiksCglEUkFNX0JZUEFTU19ST09UX0NPTkZJRyhNSFooNDAwKSwgMSwgQ0xLX1JPT1RfUFJFX0RJVjIsIDMsIENMS19ST09UX1BSRV9ESVYyKSwKfTsKCnZvaWQgZHJhbV9lbmFibGVfYnlwYXNzKHVsb25nIGNsa192YWwpCnsKCWludCBpOwoJc3RydWN0IGRyYW1fYnlwYXNzX2Nsa19zZXR0aW5nICpjb25maWc7CgoJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW14OG1tX2RyYW1fYnlwYXNzX3RibCk7IGkrKykgewoJCWlmIChjbGtfdmFsID09IGlteDhtbV9kcmFtX2J5cGFzc190YmxbaV0uY2xrKQoJCQlicmVhazsKCX0KCglpZiAoaSA9PSBBUlJBWV9TSVpFKGlteDhtbV9kcmFtX2J5cGFzc190YmwpKSB7CgkJcHJpbnRmKCJObyBtYXRjaGVkIGZyZXEgdGFibGUgJWx1XG4iLCBjbGtfdmFsKTsKCQlyZXR1cm47Cgl9CgoJY29uZmlnID0gJmlteDhtbV9kcmFtX2J5cGFzc190YmxbaV07CgoJY2xvY2tfc2V0X3RhcmdldF92YWwoRFJBTV9BTFRfQ0xLX1JPT1QsIENMS19ST09UX09OIHwgQ0xLX1JPT1RfU09VUkNFX1NFTChjb25maWctPmFsdF9yb290X3NlbCkgfCBDTEtfUk9PVF9QUkVfRElWKGNvbmZpZy0+YWx0X3ByZV9kaXYpKTsKCWNsb2NrX3NldF90YXJnZXRfdmFsKERSQU1fQVBCX0NMS19ST09ULCBDTEtfUk9PVF9PTiB8IENMS19ST09UX1NPVVJDRV9TRUwoY29uZmlnLT5hcGJfcm9vdF9zZWwpIHwgQ0xLX1JPT1RfUFJFX0RJVihjb25maWctPmFwYl9wcmVfZGl2KSk7CgljbG9ja19zZXRfdGFyZ2V0X3ZhbChEUkFNX1NFTF9DRkcsIENMS19ST09UX09OIHwgQ0xLX1JPT1RfU09VUkNFX1NFTCgxKSk7Cn0KCnZvaWQgZHJhbV9kaXNhYmxlX2J5cGFzcyh2b2lkKQp7CgljbG9ja19zZXRfdGFyZ2V0X3ZhbChEUkFNX1NFTF9DRkcsIENMS19ST09UX09OIHwgQ0xLX1JPT1RfU09VUkNFX1NFTCgwKSk7CgljbG9ja19zZXRfdGFyZ2V0X3ZhbChEUkFNX0FQQl9DTEtfUk9PVCwgQ0xLX1JPT1RfT04gfCBDTEtfUk9PVF9TT1VSQ0VfU0VMKDQpIHwgQ0xLX1JPT1RfUFJFX0RJVihDTEtfUk9PVF9QUkVfRElWNSkpOwp9CiNlbmRpZgoKaW50IGludHBsbF9jb25maWd1cmUoZW51bSBwbGxfY2xvY2tzIHBsbCwgdWxvbmcgZnJlcSkKewoJdm9pZCBfX2lvbWVtICpwbGxfZ25ybF9jdGwsIF9faW9tZW0gKnBsbF9kaXZfY3RsOwoJdTMyIHBsbF9kaXZfY3RsX3ZhbCwgcGxsX2Nsa2VfbWFza3M7CgoJc3dpdGNoIChwbGwpIHsKCWNhc2UgQU5BVE9QX1NZU1RFTV9QTEwxOgoJCXBsbF9nbnJsX2N0bCA9ICZhbmFfcGxsLT5zeXNfcGxsMV9nbnJsX2N0bDsKCQlwbGxfZGl2X2N0bCA9ICZhbmFfcGxsLT5zeXNfcGxsMV9kaXZfY3RsOwoJCXBsbF9jbGtlX21hc2tzID0gSU5UUExMX0RJVjIwX0NMS0VfTUFTSyB8CgkJCUlOVFBMTF9ESVYxMF9DTEtFX01BU0sgfCBJTlRQTExfRElWOF9DTEtFX01BU0sgfAoJCQlJTlRQTExfRElWNl9DTEtFX01BU0sgfCBJTlRQTExfRElWNV9DTEtFX01BU0sgfAoJCQlJTlRQTExfRElWNF9DTEtFX01BU0sgfCBJTlRQTExfRElWM19DTEtFX01BU0sgfAoJCQlJTlRQTExfRElWMl9DTEtFX01BU0sgfCBJTlRQTExfQ0xLRV9NQVNLOwoJCWJyZWFrOwoJY2FzZSBBTkFUT1BfU1lTVEVNX1BMTDI6CgkJcGxsX2ducmxfY3RsID0gJmFuYV9wbGwtPnN5c19wbGwyX2ducmxfY3RsOwoJCXBsbF9kaXZfY3RsID0gJmFuYV9wbGwtPnN5c19wbGwyX2Rpdl9jdGw7CgkJcGxsX2Nsa2VfbWFza3MgPSBJTlRQTExfRElWMjBfQ0xLRV9NQVNLIHwKCQkJSU5UUExMX0RJVjEwX0NMS0VfTUFTSyB8IElOVFBMTF9ESVY4X0NMS0VfTUFTSyB8CgkJCUlOVFBMTF9ESVY2X0NMS0VfTUFTSyB8IElOVFBMTF9ESVY1X0NMS0VfTUFTSyB8CgkJCUlOVFBMTF9ESVY0X0NMS0VfTUFTSyB8IElOVFBMTF9ESVYzX0NMS0VfTUFTSyB8CgkJCUlOVFBMTF9ESVYyX0NMS0VfTUFTSyB8IElOVFBMTF9DTEtFX01BU0s7CgkJYnJlYWs7CgljYXNlIEFOQVRPUF9TWVNURU1fUExMMzoKCQlwbGxfZ25ybF9jdGwgPSAmYW5hX3BsbC0+c3lzX3BsbDNfZ25ybF9jdGw7CgkJcGxsX2Rpdl9jdGwgPSAmYW5hX3BsbC0+c3lzX3BsbDNfZGl2X2N0bDsKCQlwbGxfY2xrZV9tYXNrcyA9IElOVFBMTF9DTEtFX01BU0s7CgkJYnJlYWs7CgljYXNlIEFOQVRPUF9BUk1fUExMOgoJCXBsbF9nbnJsX2N0bCA9ICZhbmFfcGxsLT5hcm1fcGxsX2ducmxfY3RsOwoJCXBsbF9kaXZfY3RsID0gJmFuYV9wbGwtPmFybV9wbGxfZGl2X2N0bDsKCQlwbGxfY2xrZV9tYXNrcyA9IElOVFBMTF9DTEtFX01BU0s7CgkJYnJlYWs7CgljYXNlIEFOQVRPUF9HUFVfUExMOgoJCXBsbF9nbnJsX2N0bCA9ICZhbmFfcGxsLT5ncHVfcGxsX2ducmxfY3RsOwoJCXBsbF9kaXZfY3RsID0gJmFuYV9wbGwtPmdwdV9wbGxfZGl2X2N0bDsKCQlwbGxfY2xrZV9tYXNrcyA9IElOVFBMTF9DTEtFX01BU0s7CgkJYnJlYWs7CgljYXNlIEFOQVRPUF9WUFVfUExMOgoJCXBsbF9nbnJsX2N0bCA9ICZhbmFfcGxsLT52cHVfcGxsX2ducmxfY3RsOwoJCXBsbF9kaXZfY3RsID0gJmFuYV9wbGwtPnZwdV9wbGxfZGl2X2N0bDsKCQlwbGxfY2xrZV9tYXNrcyA9IElOVFBMTF9DTEtFX01BU0s7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAtRUlOVkFMOwoJfTsKCglzd2l0Y2ggKGZyZXEpIHsKCWNhc2UgTUhaKDc1MCk6CgkJLyogMjQgKiAweGZhIC8gMiAvIDIgXiAyICovCgkJcGxsX2Rpdl9jdGxfdmFsID0gSU5UUExMX01BSU5fRElWX1ZBTCgweGZhKSB8CgkJCUlOVFBMTF9QUkVfRElWX1ZBTCgyKSB8IElOVFBMTF9QT1NUX0RJVl9WQUwoMik7CgkJYnJlYWs7CgljYXNlIE1IWig4MDApOgoJCS8qIDI0ICogMHgxOTAgLyAzIC8gMiBeIDIgKi8KCQlwbGxfZGl2X2N0bF92YWwgPSBJTlRQTExfTUFJTl9ESVZfVkFMKDB4MTkwKSB8CgkJCUlOVFBMTF9QUkVfRElWX1ZBTCgzKSB8IElOVFBMTF9QT1NUX0RJVl9WQUwoMik7CgkJYnJlYWs7CgljYXNlIE1IWigxMDAwKToKCQkvKiAyNCAqIDB4ZmEgLyAzIC8gMiBeIDEgKi8KCQlwbGxfZGl2X2N0bF92YWwgPSBJTlRQTExfTUFJTl9ESVZfVkFMKDB4ZmEpIHwKCQkJSU5UUExMX1BSRV9ESVZfVkFMKDMpIHwgSU5UUExMX1BPU1RfRElWX1ZBTCgxKTsKCQlicmVhazsKCWNhc2UgTUhaKDEyMDApOgoJCS8qIDI0ICogMHhjOCAvIDIgLyAyIF4gMSAqLwoJCXBsbF9kaXZfY3RsX3ZhbCA9IElOVFBMTF9NQUlOX0RJVl9WQUwoMHhjOCkgfAoJCQlJTlRQTExfUFJFX0RJVl9WQUwoMikgfCBJTlRQTExfUE9TVF9ESVZfVkFMKDEpOwoJCWJyZWFrOwoJY2FzZSBNSFooMjAwMCk6CgkJLyogMjQgKiAweGZhIC8gMyAvIDIgXiAwICovCgkJcGxsX2Rpdl9jdGxfdmFsID0gSU5UUExMX01BSU5fRElWX1ZBTCgweGZhKSB8CgkJCUlOVFBMTF9QUkVfRElWX1ZBTCgzKSB8IElOVFBMTF9QT1NUX0RJVl9WQUwoMCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAtRUlOVkFMOwoJfTsKCS8qIEJ5cGFzcyBjbG9jayBhbmQgc2V0IGxvY2sgdG8gcGxsIG91dHB1dCBsb2NrICovCglzZXRiaXRzX2xlMzIocGxsX2ducmxfY3RsLCBJTlRQTExfQllQQVNTX01BU0sgfCBJTlRQTExfTE9DS19TRUxfTUFTSyk7CgkvKiBFbmFibGUgcmVzZXQgKi8KCWNscmJpdHNfbGUzMihwbGxfZ25ybF9jdGwsIElOVFBMTF9SU1RfTUFTSyk7CgkvKiBDb25maWd1cmUgKi8KCXdyaXRlbChwbGxfZGl2X2N0bF92YWwsIHBsbF9kaXZfY3RsKTsKCglfX3VkZWxheSgxMDApOwoKCS8qIERpc2FibGUgcmVzZXQgKi8KCXNldGJpdHNfbGUzMihwbGxfZ25ybF9jdGwsIElOVFBMTF9SU1RfTUFTSyk7CgkvKiBXYWl0IExvY2sgKi8KCXdoaWxlICghKHJlYWRsKHBsbF9nbnJsX2N0bCkgJiBJTlRQTExfTE9DS19NQVNLKSkKCQk7CgkvKiBDbGVhciBieXBhc3MgKi8KCWNscmJpdHNfbGUzMihwbGxfZ25ybF9jdGwsIElOVFBMTF9CWVBBU1NfTUFTSyk7CglzZXRiaXRzX2xlMzIocGxsX2ducmxfY3RsLCBwbGxfY2xrZV9tYXNrcyk7CgoJcmV0dXJuIDA7Cn0KCiNkZWZpbmUgVklERU9fUExMX1JBVEUgNTk0MDAwMDAwVQoKdm9pZCBteHNfc2V0X2xjZGNsayh1aW50MzJfdCBiYXNlX2FkZHIsIHVpbnQzMl90IGZyZXEpCnsKCXVpbnQzMl90IGRpdiwgcHJlLCBwb3N0OwoKCWRpdiA9IFZJREVPX1BMTF9SQVRFIC8gMTAwMDsKCWRpdiA9IChkaXYgKyBmcmVxIC0gMSkgLyBmcmVxOwoKCWlmIChkaXYgPCAxKQoJCWRpdiA9IDE7CgoJZm9yIChwcmUgPSAxOyBwcmUgPD0gODsgcHJlKyspIHsKCQlmb3IgKHBvc3QgPSAxOyBwb3N0IDw9IDY0OyBwb3N0KyspIHsKCQkJaWYgKHByZSAqIHBvc3QgPT0gZGl2KSB7CgkJCQlnb3RvIGZpbmQ7CgkJCX0KCQl9Cgl9CgoJcHJpbnRmKCJGYWlsIHRvIHNldCByYXRlIHRvICVka2h6IiwgZnJlcSk7CglyZXR1cm47CgpmaW5kOgoJLyogU2VsZWN0IHRvIHZpZGVvIFBMTCAqLwoJZGVidWcoIm14c19zZXRfbGNkY2xrLCBwcmUgPSAlZCwgcG9zdCA9ICVkXG4iLCBwcmUsIHBvc3QpOwoJY2xvY2tfc2V0X3RhcmdldF92YWwoTENESUZfUElYRUxfQ0xLX1JPT1QsIENMS19ST09UX09OIHwgQ0xLX1JPT1RfU09VUkNFX1NFTCgxKSB8IENMS19ST09UX1BSRV9ESVYocHJlIC0gMSkgfCBDTEtfUk9PVF9QT1NUX0RJVihwb3N0IC0gMSkpOwoKfQoKdm9pZCBlbmFibGVfZGlzcGxheV9jbGsodW5zaWduZWQgY2hhciBlbmFibGUpCnsKCWlmIChlbmFibGUpIHsKCQljbG9ja19lbmFibGUoQ0NHUl9ESVNQTUlYLCBmYWxzZSk7CgoJCS8qIFNldCBWaWRlbyBQTEwgdG8gNTk0TWh6LCBwID0gMSwgbSA9IDk5LCAgayA9IDAsIHMgPSAyICovCgkJZnJhY3BsbF9jb25maWd1cmUoQU5BVE9QX1ZJREVPX1BMTCwgVklERU9fUExMX1JBVEUpOwoKCQkvKiA1MDBNaHogKi8KCQljbG9ja19zZXRfdGFyZ2V0X3ZhbChESVNQTEFZX0FYSV9DTEtfUk9PVCwgQ0xLX1JPT1RfT04gfCBDTEtfUk9PVF9TT1VSQ0VfU0VMKDEpIHwgQ0xLX1JPT1RfUFJFX0RJVihDTEtfUk9PVF9QUkVfRElWMikpOwoKCQkvKiAyMDBNaHogKi8KCQljbG9ja19zZXRfdGFyZ2V0X3ZhbChESVNQTEFZX0FQQl9DTEtfUk9PVCwgQ0xLX1JPT1RfT04gfCBDTEtfUk9PVF9TT1VSQ0VfU0VMKDIpIHxDTEtfUk9PVF9QUkVfRElWKENMS19ST09UX1BSRV9ESVY0KSk7CgoJCWNsb2NrX3NldF90YXJnZXRfdmFsKE1JUElfRFNJX0NPUkVfQ0xLX1JPT1QsIENMS19ST09UX09OIHwgQ0xLX1JPT1RfU09VUkNFX1NFTCgxKSk7CgoJCS8qIDI3TWh6IE1JUEkgRFBIWSBQTEwgcmVmIGZyb20gdmlkZW8gUExMICovCgkJY2xvY2tfc2V0X3RhcmdldF92YWwoTUlQSV9EU0lfUEhZX1JFRl9DTEtfUk9PVCwgQ0xLX1JPT1RfT04gfCBDTEtfUk9PVF9TT1VSQ0VfU0VMKDcpIHxDTEtfUk9PVF9QT1NUX0RJVihDTEtfUk9PVF9QT1NUX0RJVjIyKSk7CgoJCWNsb2NrX2VuYWJsZShDQ0dSX0RJU1BNSVgsIHRydWUpOwoJfSBlbHNlIHsKCQljbG9ja19lbmFibGUoQ0NHUl9ESVNQTUlYLCBmYWxzZSk7Cgl9Cn0KCnZvaWQgaW5pdF91YXJ0X2Nsayh1MzIgaW5kZXgpCnsKCS8qCgkgKiBzZXQgdWFydCBjbG9jayByb290CgkgKiAyNE0gT1NDCgkgKi8KCXN3aXRjaCAoaW5kZXgpIHsKCWNhc2UgMDoKCQljbG9ja19lbmFibGUoQ0NHUl9VQVJUMSwgMCk7CgkJY2xvY2tfc2V0X3RhcmdldF92YWwoVUFSVDFfQ0xLX1JPT1QsIENMS19ST09UX09OIHwKCQkJCSAgICAgQ0xLX1JPT1RfU09VUkNFX1NFTCgwKSk7CgkJY2xvY2tfZW5hYmxlKENDR1JfVUFSVDEsIDEpOwoJCXJldHVybjsKCWNhc2UgMToKCQljbG9ja19lbmFibGUoQ0NHUl9VQVJUMiwgMCk7CgkJY2xvY2tfc2V0X3RhcmdldF92YWwoVUFSVDJfQ0xLX1JPT1QsIENMS19ST09UX09OIHwKCQkJCSAgICAgQ0xLX1JPT1RfU09VUkNFX1NFTCgwKSk7CgkJY2xvY2tfZW5hYmxlKENDR1JfVUFSVDIsIDEpOwoJCXJldHVybjsKCWNhc2UgMjoKCQljbG9ja19lbmFibGUoQ0NHUl9VQVJUMywgMCk7CgkJY2xvY2tfc2V0X3RhcmdldF92YWwoVUFSVDNfQ0xLX1JPT1QsIENMS19ST09UX09OIHwKCQkJCSAgICAgQ0xLX1JPT1RfU09VUkNFX1NFTCgwKSk7CgkJY2xvY2tfZW5hYmxlKENDR1JfVUFSVDMsIDEpOwoJCXJldHVybjsKCWNhc2UgMzoKCQljbG9ja19lbmFibGUoQ0NHUl9VQVJUNCwgMCk7CgkJY2xvY2tfc2V0X3RhcmdldF92YWwoVUFSVDRfQ0xLX1JPT1QsIENMS19ST09UX09OIHwKCQkJCSAgICAgQ0xLX1JPT1RfU09VUkNFX1NFTCgwKSk7CgkJY2xvY2tfZW5hYmxlKENDR1JfVUFSVDQsIDEpOwoJCXJldHVybjsKCWRlZmF1bHQ6CgkJcHJpbnRmKCJJbnZhbGlkIHVhcnQgaW5kZXhcbiIpOwoJCXJldHVybjsKCX0KfQoKdm9pZCBpbml0X3dkb2dfY2xrKHZvaWQpCnsKCWNsb2NrX2VuYWJsZShDQ0dSX1dET0cxLCAwKTsKCWNsb2NrX2VuYWJsZShDQ0dSX1dET0cyLCAwKTsKCWNsb2NrX2VuYWJsZShDQ0dSX1dET0czLCAwKTsKCWNsb2NrX3NldF90YXJnZXRfdmFsKFdET0dfQ0xLX1JPT1QsIENMS19ST09UX09OIHwKCQkJICAgICBDTEtfUk9PVF9TT1VSQ0VfU0VMKDApKTsKCWNsb2NrX2VuYWJsZShDQ0dSX1dET0cxLCAxKTsKCWNsb2NrX2VuYWJsZShDQ0dSX1dET0cyLCAxKTsKCWNsb2NrX2VuYWJsZShDQ0dSX1dET0czLCAxKTsKfQoKdm9pZCBpbml0X2Nsa191c2RoYyh1MzIgaW5kZXgpCnsKCS8qCgkgKiBzZXQgdXNkaGMgY2xvY2sgcm9vdAoJICogc3lzIHBsbDEgNDAwTQoJICovCglzd2l0Y2ggKGluZGV4KSB7CgljYXNlIDA6CgkJY2xvY2tfZW5hYmxlKENDR1JfVVNESEMxLCAwKTsKCQljbG9ja19zZXRfdGFyZ2V0X3ZhbChVU0RIQzFfQ0xLX1JPT1QsIENMS19ST09UX09OIHwKCQkJCSAgICAgQ0xLX1JPT1RfU09VUkNFX1NFTCgxKSB8CgkJCQkgICAgIENMS19ST09UX1BPU1RfRElWKENMS19ST09UX1BPU1RfRElWMikpOwoJCWNsb2NrX2VuYWJsZShDQ0dSX1VTREhDMSwgMSk7CgkJcmV0dXJuOwoJY2FzZSAxOgoJCWNsb2NrX2VuYWJsZShDQ0dSX1VTREhDMiwgMCk7CgkJY2xvY2tfc2V0X3RhcmdldF92YWwoVVNESEMyX0NMS19ST09ULCBDTEtfUk9PVF9PTiB8CgkJCQkgICAgIENMS19ST09UX1NPVVJDRV9TRUwoMSkgfAoJCQkJICAgICBDTEtfUk9PVF9QT1NUX0RJVihDTEtfUk9PVF9QT1NUX0RJVjIpKTsKCQljbG9ja19lbmFibGUoQ0NHUl9VU0RIQzIsIDEpOwoJCXJldHVybjsKCWNhc2UgMjoKCQljbG9ja19lbmFibGUoQ0NHUl9VU0RIQzMsIDApOwoJCWNsb2NrX3NldF90YXJnZXRfdmFsKFVTREhDM19DTEtfUk9PVCwgQ0xLX1JPT1RfT04gfAoJCQkJICAgICBDTEtfUk9PVF9TT1VSQ0VfU0VMKDEpIHwKCQkJCSAgICAgQ0xLX1JPT1RfUE9TVF9ESVYoQ0xLX1JPT1RfUE9TVF9ESVYyKSk7CgkJY2xvY2tfZW5hYmxlKENDR1JfVVNESEMzLCAxKTsKCQlyZXR1cm47CglkZWZhdWx0OgoJCXByaW50ZigiSW52YWxpZCB1c2RoYyBpbmRleFxuIik7CgkJcmV0dXJuOwoJfQp9Cgp2b2lkIGluaXRfY2xrX2Vjc3BpKHUzMiBpbmRleCkKewoJc3dpdGNoIChpbmRleCkgewoJY2FzZSAwOgoJCWNsb2NrX2VuYWJsZShDQ0dSX0VDU1BJMSwgMCk7CgkJY2xvY2tfc2V0X3RhcmdldF92YWwoRUNTUEkxX0NMS19ST09ULCBDTEtfUk9PVF9PTiB8IENMS19ST09UX1NPVVJDRV9TRUwoMCkpOwoJCWNsb2NrX2VuYWJsZShDQ0dSX0VDU1BJMSwgMSk7CgkJcmV0dXJuOwoJY2FzZSAxOgoJCWNsb2NrX2VuYWJsZShDQ0dSX0VDU1BJMiwgMCk7CgkJY2xvY2tfc2V0X3RhcmdldF92YWwoRUNTUEkyX0NMS19ST09ULCBDTEtfUk9PVF9PTiB8IENMS19ST09UX1NPVVJDRV9TRUwoMCkpOwoJCWNsb2NrX2VuYWJsZShDQ0dSX0VDU1BJMiwgMSk7CgljYXNlIDI6CgkJY2xvY2tfZW5hYmxlKENDR1JfRUNTUEkzLCAwKTsKCQljbG9ja19zZXRfdGFyZ2V0X3ZhbChFQ1NQSTNfQ0xLX1JPT1QsIENMS19ST09UX09OIHwgQ0xLX1JPT1RfU09VUkNFX1NFTCgwKSk7CgkJY2xvY2tfZW5hYmxlKENDR1JfRUNTUEkzLCAxKTsKCQlyZXR1cm47CglkZWZhdWx0OgoJCXByaW50ZigiSW52YWxpZCBlY3NwaSBpbmRleFxuIik7CgkJcmV0dXJuOwoJfQp9Cgp2b2lkIGluaXRfbmFuZF9jbGsodm9pZCkKewoJLyoKCSAqIHNldCByYXduYW5kIHJvb3QKCSAqIHN5cyBwbGwxIDQwME0KCSAqLwoJY2xvY2tfZW5hYmxlKENDR1JfUkFXTkFORCwgMCk7CgljbG9ja19zZXRfdGFyZ2V0X3ZhbChOQU5EX0NMS19ST09ULCBDTEtfUk9PVF9PTiB8CgkJQ0xLX1JPT1RfU09VUkNFX1NFTCgzKSB8IENMS19ST09UX1BPU1RfRElWKENMS19ST09UX1BPU1RfRElWNCkpOyAvKiAxMDBNICovCgljbG9ja19lbmFibGUoQ0NHUl9SQVdOQU5ELCAxKTsKfQoKaW50IGNsb2NrX2luaXQoKQp7Cgl1aW50MzJfdCB2YWxfY2ZnMDsKCgkvKgoJICogQWNjb3JkaW5nIHRvIEFOQU1JWCBTUEVDCgkgKiBzeXMgcGxsMSBmaXhlZCBhdCA4MDBNSHoKCSAqIHN5cyBwbGwyIGZpeGVkIGF0IDFHSHoKCSAqIEhlcmUgd2Ugb25seSBlbmFibGUgdGhlIG91dHB1dHMuCgkgKi8KCXZhbF9jZmcwID0gcmVhZGwoJmFuYV9wbGwtPnN5c19wbGwxX2ducmxfY3RsKTsKCXZhbF9jZmcwIHw9IElOVFBMTF9DTEtFX01BU0sgfCBJTlRQTExfRElWMl9DTEtFX01BU0sgfAoJCUlOVFBMTF9ESVYzX0NMS0VfTUFTSyB8IElOVFBMTF9ESVY0X0NMS0VfTUFTSyB8CgkJSU5UUExMX0RJVjVfQ0xLRV9NQVNLIHwgSU5UUExMX0RJVjZfQ0xLRV9NQVNLIHwKCQlJTlRQTExfRElWOF9DTEtFX01BU0sgfCBJTlRQTExfRElWMTBfQ0xLRV9NQVNLIHwKCQlJTlRQTExfRElWMjBfQ0xLRV9NQVNLOwoJd3JpdGVsKHZhbF9jZmcwLCAmYW5hX3BsbC0+c3lzX3BsbDFfZ25ybF9jdGwpOwoKCXZhbF9jZmcwID0gcmVhZGwoJmFuYV9wbGwtPnN5c19wbGwyX2ducmxfY3RsKTsKCXZhbF9jZmcwIHw9IElOVFBMTF9DTEtFX01BU0sgfCBJTlRQTExfRElWMl9DTEtFX01BU0sgfAoJCUlOVFBMTF9ESVYzX0NMS0VfTUFTSyB8IElOVFBMTF9ESVY0X0NMS0VfTUFTSyB8CgkJSU5UUExMX0RJVjVfQ0xLRV9NQVNLIHwgSU5UUExMX0RJVjZfQ0xLRV9NQVNLIHwKCQlJTlRQTExfRElWOF9DTEtFX01BU0sgfCBJTlRQTExfRElWMTBfQ0xLRV9NQVNLIHwKCQlJTlRQTExfRElWMjBfQ0xLRV9NQVNLOwoJd3JpdGVsKHZhbF9jZmcwLCAmYW5hX3BsbC0+c3lzX3BsbDJfZ25ybF9jdGwpOwoKCS8qIENvbmZpZ3VyZSBBUk0gYXQgMS4yR0h6ICovCgljbG9ja19zZXRfdGFyZ2V0X3ZhbChBUk1fQTUzX0NMS19ST09ULCBDTEtfUk9PVF9PTiB8IFwKCQkJICAgICBDTEtfUk9PVF9TT1VSQ0VfU0VMKDIpKTsKCglpbnRwbGxfY29uZmlndXJlKEFOQVRPUF9BUk1fUExMLCBNSFooMTIwMCkpOwoKCWNsb2NrX3NldF90YXJnZXRfdmFsKEFSTV9BNTNfQ0xLX1JPT1QsIENMS19ST09UX09OIHwgXAoJCQkgICAgIENMS19ST09UX1NPVVJDRV9TRUwoMSkgfCBcCgkJCSAgICAgQ0xLX1JPT1RfUE9TVF9ESVYoQ0xLX1JPT1RfUE9TVF9ESVYxKSk7CgoJaW50cGxsX2NvbmZpZ3VyZShBTkFUT1BfU1lTVEVNX1BMTDMsIE1IWig3NTApKTsKCWNsb2NrX3NldF90YXJnZXRfdmFsKE5PQ19DTEtfUk9PVCwgQ0xLX1JPT1RfT04gfCBDTEtfUk9PVF9TT1VSQ0VfU0VMKDIpKTsKCgkvKiBjb25maWcgR0lDIHRvIHN5c19wbGwyXzEwMG0gKi8KCWNsb2NrX2VuYWJsZShDQ0dSX0dJQywgMCk7CgljbG9ja19zZXRfdGFyZ2V0X3ZhbChHSUNfQ0xLX1JPT1QsIENMS19ST09UX09OIHwgQ0xLX1JPT1RfU09VUkNFX1NFTCgzKSk7CgljbG9ja19lbmFibGUoQ0NHUl9HSUMsIDEpOwoKCWNsb2NrX3NldF90YXJnZXRfdmFsKE5BTkRfVVNESENfQlVTX0NMS19ST09ULCBDTEtfUk9PVF9PTiB8CgkJCQkJCUNMS19ST09UX1NPVVJDRV9TRUwoMSkpOwoKCWNsb2NrX2VuYWJsZShDQ0dSX0REUjEsIDApOwoJY2xvY2tfc2V0X3RhcmdldF92YWwoRFJBTV9BTFRfQ0xLX1JPT1QsQ0xLX1JPT1RfT04gfCBDTEtfUk9PVF9TT1VSQ0VfU0VMKDEpKTsKCWNsb2NrX3NldF90YXJnZXRfdmFsKERSQU1fQVBCX0NMS19ST09ULENMS19ST09UX09OIHwgQ0xLX1JPT1RfU09VUkNFX1NFTCgxKSk7CgljbG9ja19lbmFibGUoQ0NHUl9ERFIxLCAxKTsKCglpbml0X3dkb2dfY2xrKCk7CgoJY2xvY2tfZW5hYmxlKENDR1JfVEVNUF9TRU5TT1IsIDEpOwoKCWNsb2NrX2VuYWJsZShDQ0dSX1NFQ19ERUJVRywgMSk7CgoJZW5hYmxlX2Rpc3BsYXlfY2xrKDEpOwoJcmV0dXJuIDA7Cn07CgppbnQgc2V0X2Nsa19xc3BpKHZvaWQpCnsKCS8qCgkgKiBzZXQgcXNwaSByb290CgkgKiBzeXMgcGxsMSAxMDBNCgkgKi8KCWNsb2NrX2VuYWJsZShDQ0dSX1FTUEksIDApOwoJY2xvY2tfc2V0X3RhcmdldF92YWwoUVNQSV9DTEtfUk9PVCwgQ0xLX1JPT1RfT04gfAoJCQkgICAgIENMS19ST09UX1NPVVJDRV9TRUwoNykpOwoJY2xvY2tfZW5hYmxlKENDR1JfUVNQSSwgMSk7CgoJcmV0dXJuIDA7Cn0KCiNpZmRlZiBDT05GSUdfRkVDX01YQwppbnQgc2V0X2Nsa19lbmV0KGVudW0gZW5ldF9mcmVxIHR5cGUpCnsKCXUzMiB0YXJnZXQ7Cgl1MzIgZW5ldDFfcmVmOwoKCS8qIGRpc2FibGUgdGhlIGNsb2NrIGZpcnN0ICovCgljbG9ja19lbmFibGUoQ0NHUl9FTkVUMSwgMCk7CgljbG9ja19lbmFibGUoQ0NHUl9TSU1fRU5FVCwgMCk7CgoJc3dpdGNoICh0eXBlKSB7CgljYXNlIEVORVRfMTI1TUhaOgoJCWVuZXQxX3JlZiA9IEVORVQxX1JFRl9DTEtfUk9PVF9GUk9NX1BMTF9FTkVUX01BSU5fMTI1TV9DTEs7CgkJYnJlYWs7CgljYXNlIEVORVRfNTBNSFo6CgkJZW5ldDFfcmVmID0gRU5FVDFfUkVGX0NMS19ST09UX0ZST01fUExMX0VORVRfTUFJTl81ME1fQ0xLOwoJCWJyZWFrOwoJY2FzZSBFTkVUXzI1TUhaOgoJCWVuZXQxX3JlZiA9IEVORVQxX1JFRl9DTEtfUk9PVF9GUk9NX1BMTF9FTkVUX01BSU5fMjVNX0NMSzsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLyogc2V0IGVuZXQgYXhpIGNsb2NrIDI2Nk1oeiAqLwoJdGFyZ2V0ID0gQ0xLX1JPT1RfT04gfCBFTkVUX0FYSV9DTEtfUk9PVF9GUk9NX1NZUzFfUExMXzI2Nk0gfAoJCSBDTEtfUk9PVF9QUkVfRElWKENMS19ST09UX1BSRV9ESVYxKSB8CgkJIENMS19ST09UX1BPU1RfRElWKENMS19ST09UX1BPU1RfRElWMSk7CgljbG9ja19zZXRfdGFyZ2V0X3ZhbChFTkVUX0FYSV9DTEtfUk9PVCwgdGFyZ2V0KTsKCgl0YXJnZXQgPSBDTEtfUk9PVF9PTiB8IGVuZXQxX3JlZiB8CgkJIENMS19ST09UX1BSRV9ESVYoQ0xLX1JPT1RfUFJFX0RJVjEpIHwKCQkgQ0xLX1JPT1RfUE9TVF9ESVYoQ0xLX1JPT1RfUE9TVF9ESVYxKTsKCWNsb2NrX3NldF90YXJnZXRfdmFsKEVORVRfUkVGX0NMS19ST09ULCB0YXJnZXQpOwoKCXRhcmdldCA9IENMS19ST09UX09OIHwgRU5FVDFfVElNRV9DTEtfUk9PVF9GUk9NX1BMTF9FTkVUX01BSU5fMTAwTV9DTEsgfAoJCSBDTEtfUk9PVF9QUkVfRElWKENMS19ST09UX1BSRV9ESVYxKSB8CgkJIENMS19ST09UX1BPU1RfRElWKENMS19ST09UX1BPU1RfRElWNCk7CgljbG9ja19zZXRfdGFyZ2V0X3ZhbChFTkVUX1RJTUVSX0NMS19ST09ULCB0YXJnZXQpOwoKI2lmZGVmIENPTkZJR19GRUNfTVhDXzI1TV9SRUZfQ0xLCgl0YXJnZXQgPSBDTEtfUk9PVF9PTiB8CgkJIEVORVRfUEhZX1JFRl9DTEtfUk9PVF9GUk9NX1BMTF9FTkVUX01BSU5fMjVNX0NMSyB8CgkJIENMS19ST09UX1BSRV9ESVYoQ0xLX1JPT1RfUFJFX0RJVjEpIHwKCQkgQ0xLX1JPT1RfUE9TVF9ESVYoQ0xLX1JPT1RfUE9TVF9ESVYxKTsKCWNsb2NrX3NldF90YXJnZXRfdmFsKEVORVRfUEhZX1JFRl9DTEtfUk9PVCwgdGFyZ2V0KTsKI2VuZGlmCgkvKiBlbmFibGUgY2xvY2sgKi8KCWNsb2NrX2VuYWJsZShDQ0dSX1NJTV9FTkVULCAxKTsKCWNsb2NrX2VuYWJsZShDQ0dSX0VORVQxLCAxKTsKCglyZXR1cm4gMDsKfQojZW5kaWYKCnUzMiBnZXRfcm9vdF9zcmNfY2xrKGVudW0gY2xrX3Jvb3Rfc3JjIHJvb3Rfc3JjKQp7Cglzd2l0Y2ggKHJvb3Rfc3JjKSB7CgljYXNlIE9TQ18yNE1fQ0xLOgoJCXJldHVybiAyNDAwMDAwMHU7CgljYXNlIE9TQ19IRE1JX0NMSzoKCQlyZXR1cm4gMjYwMDAwMDB1OwoJY2FzZSBPU0NfMzJLX0NMSzoKCQlyZXR1cm4gMzIwMDB1OwoJY2FzZSBBUk1fUExMX0NMSzoKCWNhc2UgR1BVX1BMTF9DTEs6CgljYXNlIFZQVV9QTExfQ0xLOgoJY2FzZSBTWVNURU1fUExMMV84MDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDFfNDAwTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwxXzI2Nk1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMV8yMDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDFfMTYwTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwxXzEzM01fQ0xLOgoJY2FzZSBTWVNURU1fUExMMV8xMDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDFfODBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDFfNDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDJfMTAwME1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMl81MDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDJfMzMzTV9DTEs6CgljYXNlIFNZU1RFTV9QTEwyXzI1ME1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMl8yMDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDJfMTY2TV9DTEs6CgljYXNlIFNZU1RFTV9QTEwyXzEyNU1fQ0xLOgoJY2FzZSBTWVNURU1fUExMMl8xMDBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDJfNTBNX0NMSzoKCWNhc2UgU1lTVEVNX1BMTDNfQ0xLOgoJCXJldHVybiBkZWNvZGVfaW50cGxsKHJvb3Rfc3JjKTsKCWNhc2UgRFJBTV9QTEwxX0NMSzoKCWNhc2UgQVVESU9fUExMMV9DTEs6CgljYXNlIEFVRElPX1BMTDJfQ0xLOgoJY2FzZSBWSURFT19QTExfQ0xLOgoJCXJldHVybiBkZWNvZGVfZnJhY3BsbChyb290X3NyYyk7CglkZWZhdWx0OgoJCXJldHVybiAwOwoJfQoKCXJldHVybiAwOwp9Cgp1MzIgZ2V0X3Jvb3RfY2xrKGVudW0gY2xrX3Jvb3RfaW5kZXggY2xvY2tfaWQpCnsKCWVudW0gY2xrX3Jvb3Rfc3JjIHJvb3Rfc3JjOwoJdTMyIHBvc3RfcG9kZiwgcHJlX3BvZGYsIHJvb3Rfc3JjX2NsazsKCglpZiAoY2xvY2tfcm9vdF9lbmFibGVkKGNsb2NrX2lkKSA8PSAwKQoJCXJldHVybiAwOwoKCWlmIChjbG9ja19nZXRfcHJlZGl2KGNsb2NrX2lkLCAmcHJlX3BvZGYpIDwgMCkKCQlyZXR1cm4gMDsKCglpZiAoY2xvY2tfZ2V0X3Bvc3RkaXYoY2xvY2tfaWQsICZwb3N0X3BvZGYpIDwgMCkKCQlyZXR1cm4gMDsKCglpZiAoY2xvY2tfZ2V0X3NyYyhjbG9ja19pZCwgJnJvb3Rfc3JjKSA8IDApCgkJcmV0dXJuIDA7CgoJcm9vdF9zcmNfY2xrID0gZ2V0X3Jvb3Rfc3JjX2Nsayhyb290X3NyYyk7CgoJcmV0dXJuIHJvb3Rfc3JjX2NsayAvIChwb3N0X3BvZGYgKyAxKSAvIChwcmVfcG9kZiArIDEpOwp9Cgp1MzIgbXhjX2dldF9jbG9jayhlbnVtIG14Y19jbG9jayBjbGspCnsKCXUzMiB2YWw7CgoJc3dpdGNoIChjbGspIHsKCQljYXNlIE1YQ19BUk1fQ0xLOgoJCQlyZXR1cm4gZ2V0X3Jvb3RfY2xrKEFSTV9BNTNfQ0xLX1JPT1QpOwoJCWNhc2UgTVhDX0lQR19DTEs6CgkJCWNsb2NrX2dldF90YXJnZXRfdmFsKElQR19DTEtfUk9PVCwgJnZhbCk7CgkJCXZhbCA9IHZhbCAmIDB4MzsKCQkJcmV0dXJuIGdldF9yb290X2NsayhBSEJfQ0xLX1JPT1QpIC8gMiAvICh2YWwgKyAxKTsKCQljYXNlIE1YQ19DU1BJX0NMSzoKCQkJcmV0dXJuIGdldF9yb290X2NsayhFQ1NQSTFfQ0xLX1JPT1QpOwoJCWNhc2UgTVhDX0VTREhDX0NMSzoKCQkJcmV0dXJuIGdldF9yb290X2NsayhVU0RIQzFfQ0xLX1JPT1QpOwoJCWNhc2UgTVhDX0VTREhDMl9DTEs6CgkJCXJldHVybiBnZXRfcm9vdF9jbGsoVVNESEMyX0NMS19ST09UKTsKCQljYXNlIE1YQ19FU0RIQzNfQ0xLOgoJCQlyZXR1cm4gZ2V0X3Jvb3RfY2xrKFVTREhDM19DTEtfUk9PVCk7CgkJY2FzZSBNWENfSTJDX0NMSzoKCQkJcmV0dXJuIGdldF9yb290X2NsayhJMkMxX0NMS19ST09UKTsKCQljYXNlIE1YQ19VQVJUX0NMSzoKCQkJcmV0dXJuIGdldF9yb290X2NsayhVQVJUMV9DTEtfUk9PVCk7CgkJY2FzZSBNWENfUVNQSV9DTEs6CgkJCXJldHVybiBnZXRfcm9vdF9jbGsoUVNQSV9DTEtfUk9PVCk7CgkJZGVmYXVsdDoKCQkJcHJpbnRmKCJVbnN1cHBvcnRlZCBteGNfY2xvY2sgJWRcbiIsIGNsayk7CgkJCWJyZWFrOwoJfQoKCXJldHVybiAwOwp9Cgp1MzIgaW14X2dldF91YXJ0Y2xrKHZvaWQpCnsKCXJldHVybiBteGNfZ2V0X2Nsb2NrKE1YQ19VQVJUX0NMSyk7Cn0KCnUzMiBpbXhfZ2V0X2ZlY2Nsayh2b2lkKQp7CglyZXR1cm4gZ2V0X3Jvb3RfY2xrKEVORVRfQVhJX0NMS19ST09UKTsKfQoKdm9pZCBlbmFibGVfdXNib2gzX2Nsayh1bnNpZ25lZCBjaGFyIGVuYWJsZSkKewoJaWYgKGVuYWJsZSkgewoJCWNsb2NrX2VuYWJsZShDQ0dSX1VTQl9NU0NBTEVfUEwzMDEsIDApOwoJCS8qIDUwME0gKi8KCQljbG9ja19zZXRfdGFyZ2V0X3ZhbChVU0JfQlVTX0NMS19ST09ULCBDTEtfUk9PVF9PTiB8IENMS19ST09UX1NPVVJDRV9TRUwoMSkpOwoJCS8qIDEwME0gKi8KCQljbG9ja19zZXRfdGFyZ2V0X3ZhbChVU0JfQ09SRV9SRUZfQ0xLX1JPT1QsIENMS19ST09UX09OIHwgQ0xLX1JPT1RfU09VUkNFX1NFTCgxKSk7CgkJLyogMTAwTSAqLwoJCWNsb2NrX3NldF90YXJnZXRfdmFsKFVTQl9QSFlfUkVGX0NMS19ST09ULCBDTEtfUk9PVF9PTiB8IENMS19ST09UX1NPVVJDRV9TRUwoMSkpOwoJCWNsb2NrX2VuYWJsZShDQ0dSX1VTQl9NU0NBTEVfUEwzMDEsIDEpOwoJfSBlbHNlIHsKCQljbG9ja19lbmFibGUoQ0NHUl9VU0JfTVNDQUxFX1BMMzAxLCAwKTsKCX0KfQoKLyoKICogRHVtcCBzb21lIGNsb2NrZXMuCiAqLwojaWZuZGVmIENPTkZJR19TUExfQlVJTEQKaW50IGRvX21zY2FsZV9zaG93Y2xvY2tzKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJdTMyIGZyZXE7CgoJZnJlcSA9IGRlY29kZV9pbnRwbGwoQVJNX1BMTF9DTEspOwoJcHJpbnRmKCJBUk1fUExMICAgICU4ZCBNSHpcbiIsIGZyZXEgLyAxMDAwMDAwKTsKCWZyZXEgPSBkZWNvZGVfaW50cGxsKFNZU1RFTV9QTEwxXzgwME1fQ0xLKTsKCXByaW50ZigiU1lTX1BMTDFfODAwICAgICU4ZCBNSHpcbiIsIGZyZXEgLyAxMDAwMDAwKTsKCWZyZXEgPSBkZWNvZGVfaW50cGxsKFNZU1RFTV9QTEwxXzQwME1fQ0xLKTsKCXByaW50ZigiU1lTX1BMTDFfNDAwICAgICU4ZCBNSHpcbiIsIGZyZXEgLyAxMDAwMDAwKTsKCWZyZXEgPSBkZWNvZGVfaW50cGxsKFNZU1RFTV9QTEwxXzI2Nk1fQ0xLKTsKCXByaW50ZigiU1lTX1BMTDFfMjY2ICAgICU4ZCBNSHpcbiIsIGZyZXEgLyAxMDAwMDAwKTsKCWZyZXEgPSBkZWNvZGVfaW50cGxsKFNZU1RFTV9QTEwxXzE2ME1fQ0xLKTsKCXByaW50ZigiU1lTX1BMTDFfMTYwICAgICU4ZCBNSHpcbiIsIGZyZXEgLyAxMDAwMDAwKTsKCWZyZXEgPSBkZWNvZGVfaW50cGxsKFNZU1RFTV9QTEwxXzEzM01fQ0xLKTsKCXByaW50ZigiU1lTX1BMTDFfMTMzICAgICU4ZCBNSHpcbiIsIGZyZXEgLyAxMDAwMDAwKTsKCWZyZXEgPSBkZWNvZGVfaW50cGxsKFNZU1RFTV9QTEwxXzEwME1fQ0xLKTsKCXByaW50ZigiU1lTX1BMTDFfMTAwICAgICU4ZCBNSHpcbiIsIGZyZXEgLyAxMDAwMDAwKTsKCWZyZXEgPSBkZWNvZGVfaW50cGxsKFNZU1RFTV9QTEwxXzgwTV9DTEspOwoJcHJpbnRmKCJTWVNfUExMMV84MCAgICAlOGQgTUh6XG4iLCBmcmVxIC8gMTAwMDAwMCk7CglmcmVxID0gZGVjb2RlX2ludHBsbChTWVNURU1fUExMMV80ME1fQ0xLKTsKCXByaW50ZigiU1lTX1BMTDFfNDAgICAgJThkIE1IelxuIiwgZnJlcSAvIDEwMDAwMDApOwoJZnJlcSA9IGRlY29kZV9pbnRwbGwoU1lTVEVNX1BMTDJfMTAwME1fQ0xLKTsKCXByaW50ZigiU1lTX1BMTDJfMTAwMCAgICAlOGQgTUh6XG4iLCBmcmVxIC8gMTAwMDAwMCk7CglmcmVxID0gZGVjb2RlX2ludHBsbChTWVNURU1fUExMMl81MDBNX0NMSyk7CglwcmludGYoIlNZU19QTEwyXzUwMCAgICAlOGQgTUh6XG4iLCBmcmVxIC8gMTAwMDAwMCk7CglmcmVxID0gZGVjb2RlX2ludHBsbChTWVNURU1fUExMMl8zMzNNX0NMSyk7CglwcmludGYoIlNZU19QTEwyXzMzMyAgICAlOGQgTUh6XG4iLCBmcmVxIC8gMTAwMDAwMCk7CglmcmVxID0gZGVjb2RlX2ludHBsbChTWVNURU1fUExMMl8yNTBNX0NMSyk7CglwcmludGYoIlNZU19QTEwyXzI1MCAgICAlOGQgTUh6XG4iLCBmcmVxIC8gMTAwMDAwMCk7CglmcmVxID0gZGVjb2RlX2ludHBsbChTWVNURU1fUExMMl8yMDBNX0NMSyk7CglwcmludGYoIlNZU19QTEwyXzIwMCAgICAlOGQgTUh6XG4iLCBmcmVxIC8gMTAwMDAwMCk7CglmcmVxID0gZGVjb2RlX2ludHBsbChTWVNURU1fUExMMl8xNjZNX0NMSyk7CglwcmludGYoIlNZU19QTEwyXzE2NiAgICAlOGQgTUh6XG4iLCBmcmVxIC8gMTAwMDAwMCk7CglmcmVxID0gZGVjb2RlX2ludHBsbChTWVNURU1fUExMMl8xMjVNX0NMSyk7CglwcmludGYoIlNZU19QTEwyXzEyNSAgICAlOGQgTUh6XG4iLCBmcmVxIC8gMTAwMDAwMCk7CglmcmVxID0gZGVjb2RlX2ludHBsbChTWVNURU1fUExMMl8xMDBNX0NMSyk7CglwcmludGYoIlNZU19QTEwyXzEwMCAgICAlOGQgTUh6XG4iLCBmcmVxIC8gMTAwMDAwMCk7CglmcmVxID0gZGVjb2RlX2ludHBsbChTWVNURU1fUExMMl81ME1fQ0xLKTsKCXByaW50ZigiU1lTX1BMTDJfNTAgICAgJThkIE1IelxuIiwgZnJlcSAvIDEwMDAwMDApOwoJZnJlcSA9IGRlY29kZV9pbnRwbGwoU1lTVEVNX1BMTDNfQ0xLKTsKCXByaW50ZigiU1lTX1BMTDMgICAgICAgJThkIE1IelxuIiwgZnJlcSAvIDEwMDAwMDApOwoJZnJlcSA9IG14Y19nZXRfY2xvY2soTVhDX1VBUlRfQ0xLKTsKCXByaW50ZigiVUFSVDEgICAgICAgICAgJThkIE1IelxuIiwgZnJlcSAvIDEwMDAwMDApOwoJZnJlcSA9IG14Y19nZXRfY2xvY2soTVhDX0VTREhDX0NMSyk7CglwcmludGYoIlVTREhDMSAgICAgICAgICU4ZCBNSHpcbiIsIGZyZXEgLyAxMDAwMDAwKTsKCWZyZXEgPSBteGNfZ2V0X2Nsb2NrKE1YQ19RU1BJX0NMSyk7CglwcmludGYoIlFTUEkgICAgICAgICAgICU4ZCBNSHpcbiIsIGZyZXEgLyAxMDAwMDAwKTsKCglyZXR1cm4gMDsKfQoKVV9CT09UX0NNRCgKCWNsb2NrcywJQ09ORklHX1NZU19NQVhBUkdTLCAxLCBkb19tc2NhbGVfc2hvd2Nsb2NrcywKCSJkaXNwbGF5IGNsb2NrcyIsCgkiIgopOwojZW5kaWYK