LyoKICogU29tZSB1bml0IHRlc3RzIGZvciBkM2QgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAoQykgMjAwNSBBbnRvaW5lIENoYXZhc3NlCiAqIENvcHlyaWdodCAoQykgMjAwNiBTdGVmYW4gRPZzaW5nZXIgZm9yIENvZGVXZWF2ZXJzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgIndpbmUvdGVzdC5oIgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKc3RhdGljIExQRElSRUNURFJBVzcgICAgICAgICAgIGxwREQgPSBOVUxMOwpzdGF0aWMgTFBESVJFQ1QzRDcgICAgICAgICAgICAgbHBEM0QgPSBOVUxMOwpzdGF0aWMgTFBESVJFQ1REUkFXU1VSRkFDRTcgICAgbHBERFMgPSBOVUxMOwpzdGF0aWMgTFBESVJFQ1QzRERFVklDRTcgICAgICAgbHBEM0REZXZpY2UgPSBOVUxMOwpzdGF0aWMgTFBESVJFQ1QzRFZFUlRFWEJVRkZFUjcgbHBWQnVmU3JjID0gTlVMTDsKc3RhdGljIExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGxwVkJ1ZkRlc3QxID0gTlVMTDsKc3RhdGljIExQRElSRUNUM0RWRVJURVhCVUZGRVI3IGxwVkJ1ZkRlc3QyID0gTlVMTDsKCi8qIFRvIGNvbXBhcmUgYmFkIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIE5vdCB0aGUgaWRlYWwgd2F5IHRvIGRvIGl0LAogKiBidXQgaXQgc2hvdWxkIGJlIGVub3VnaHQgZm9yIGhlcmUgKi8KI2RlZmluZSBjb21wYXJlZmxvYXQoYSwgYikgKCAoKGEgLSBiKSA8IDAuMDAwMSkgJiYgKChhLWIpID4gLTAuMDAwMSkgKQoKc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqcERpcmVjdERyYXdDcmVhdGVFeCkoTFBHVUlELExQVk9JRCosUkVGSUlELExQVU5LTk9XTik7Cgp0eXBlZGVmIHN0cnVjdCBfVkVSVEVYCnsKICAgIGZsb2F0IHgsIHksIHo7ICAvKiBwb3NpdGlvbiAqLwp9IFZFUlRFWCwgKkxQVkVSVEVYOwoKdHlwZWRlZiBzdHJ1Y3QgX1RWRVJURVgKewogICAgZmxvYXQgeCwgeSwgejsgIC8qIHBvc2l0aW9uICovCiAgICBmbG9hdCByaHc7Cn0gVFZFUlRFWCwgKkxQVFZFUlRFWDsKCgpzdGF0aWMgdm9pZCBpbml0X2Z1bmN0aW9uX3BvaW50ZXJzKHZvaWQpCnsKICAgIEhNT0RVTEUgaG1vZCA9IEdldE1vZHVsZUhhbmRsZUEoImRkcmF3LmRsbCIpOwoKICAgIGlmKGhtb2QpCiAgICB7CiAgICAgICAgcERpcmVjdERyYXdDcmVhdGVFeCA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhobW9kLCAiRGlyZWN0RHJhd0NyZWF0ZUV4Iik7CiAgICB9Cn0KCgpzdGF0aWMgQk9PTCBDcmVhdGVEaXJlY3QzRCh2b2lkKQp7CiAgICBIUkVTVUxUIHJjOwogICAgRERTVVJGQUNFREVTQzIgZGRzZDsKCiAgICByYyA9IHBEaXJlY3REcmF3Q3JlYXRlRXgoTlVMTCwgKHZvaWQqKikmbHBERCwKICAgICAgICAmSUlEX0lEaXJlY3REcmF3NywgTlVMTCk7CiAgICBvayhyYz09RERfT0sgfHwgcmM9PURERVJSX05PRElSRUNURFJBV1NVUFBPUlQsICJEaXJlY3REcmF3Q3JlYXRlRXggcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwogICAgaWYgKCFscEREKSB7CiAgICAgICAgdHJhY2UoIkRpcmVjdERyYXdDcmVhdGVFeCgpIGZhaWxlZCB3aXRoIGFuIGVycm9yICVseFxuIiwgcmMpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICByYyA9IElEaXJlY3REcmF3X1NldENvb3BlcmF0aXZlTGV2ZWwobHBERCwgTlVMTCwgRERTQ0xfTk9STUFMKTsKICAgIG9rKHJjPT1ERF9PSywgIlNldENvb3BlcmF0aXZlTGV2ZWwgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwoKICAgIHJjID0gSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlKGxwREQsICZJSURfSURpcmVjdDNENywgKHZvaWQqKikgJmxwRDNEKTsKICAgIGlmIChyYyA9PSBFX05PSU5URVJGQUNFKSByZXR1cm4gRkFMU0U7CiAgICBvayhyYz09RERfT0ssICJRdWVyeUludGVyZmFjZSByZXR1cm5lZDogJWx4XG4iLCByYyk7CgogICAgbWVtc2V0KCZkZHNkLCAwLCBzaXplb2YoZGRzZCkpOwogICAgZGRzZC5kd1NpemUgPSBzaXplb2YoZGRzZCk7CiAgICBkZHNkLmR3RmxhZ3MgPSBERFNEX0NBUFMgfCBERFNEX1dJRFRIIHwgRERTRF9IRUlHSFQ7CiAgICBkZHNkLmRkc0NhcHMuZHdDYXBzID0gRERTQ0FQU19PRkZTQ1JFRU5QTEFJTiB8IEREU0NBUFNfM0RERVZJQ0U7CiAgICBkZHNkLmR3V2lkdGggPSAyNTY7CiAgICBkZHNkLmR3SGVpZ2h0ID0gMjU2OwogICAgcmMgPSBJRGlyZWN0RHJhdzdfQ3JlYXRlU3VyZmFjZShscERELCAmZGRzZCwgJmxwRERTLCBOVUxMKTsKICAgIG9rKHJjPT1ERF9PSywgIkNyZWF0ZVN1cmZhY2UgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwoKICAgIHJjID0gSURpcmVjdDNEN19DcmVhdGVEZXZpY2UobHBEM0QsICZJSURfSURpcmVjdDNEVG5MSGFsRGV2aWNlLCBscEREUywKICAgICAgICAmbHBEM0REZXZpY2UpOwogICAgb2socmM9PUQzRF9PSyB8fCByYz09RERFUlJfTk9QQUxFVFRFQVRUQUNIRUQgfHwgcmM9PUVfT1VUT0ZNRU1PUlksICJDcmVhdGVEZXZpY2UgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwogICAgaWYgKCFscEQzRERldmljZSkgewogICAgICAgIHRyYWNlKCJJRGlyZWN0M0Q3OjpDcmVhdGVEZXZpY2UoKSBmYWlsZWQgd2l0aCBhbiBlcnJvciAlbHhcbiIsIHJjKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyB2b2lkIFJlbGVhc2VEaXJlY3QzRCh2b2lkKQp7CiAgICBpZiAobHBEM0REZXZpY2UgIT0gTlVMTCkKICAgIHsKICAgICAgICBJRGlyZWN0M0REZXZpY2U3X1JlbGVhc2UobHBEM0REZXZpY2UpOwogICAgICAgIGxwRDNERGV2aWNlID0gTlVMTDsKICAgIH0KCiAgICBpZiAobHBERFMgIT0gTlVMTCkKICAgIHsKICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShscEREUyk7CiAgICAgICAgbHBERFMgPSBOVUxMOwogICAgfQoKICAgIGlmIChscEQzRCAhPSBOVUxMKQogICAgewogICAgICAgIElEaXJlY3QzRDdfUmVsZWFzZShscEQzRCk7CiAgICAgICAgbHBEM0QgPSBOVUxMOwogICAgfQoKICAgIGlmIChscEREICE9IE5VTEwpCiAgICB7CiAgICAgICAgSURpcmVjdERyYXdfUmVsZWFzZShscEREKTsKICAgICAgICBscEREID0gTlVMTDsKICAgIH0KfQoKc3RhdGljIHZvaWQgTGlnaHRUZXN0KHZvaWQpCnsKICAgIEhSRVNVTFQgcmM7CiAgICBEM0RMSUdIVDcgbGlnaHQ7CiAgICBEM0RMSUdIVDcgZGVmYXVsdGxpZ2h0OwogICAgQk9PTCBiRW5hYmxlZCA9IEZBTFNFOwoKICAgIC8qIFNldCBhIGZldyBsaWdodHMgd2l0aCBmdW5reSBpbmRpY2VzLiAqLwogICAgbWVtc2V0KCZsaWdodCwgMCwgc2l6ZW9mKGxpZ2h0KSk7CiAgICBsaWdodC5kbHRUeXBlID0gRDNETElHSFRfRElSRUNUSU9OQUw7CiAgICBVMShsaWdodC5kY3ZEaWZmdXNlKS5yID0gMC41ZjsKICAgIFUyKGxpZ2h0LmRjdkRpZmZ1c2UpLmcgPSAwLjZmOwogICAgVTMobGlnaHQuZGN2RGlmZnVzZSkuYiA9IDAuN2Y7CiAgICBVMihsaWdodC5kdkRpcmVjdGlvbikueSA9IDEuZjsKCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfU2V0TGlnaHQobHBEM0REZXZpY2UsIDUsICZsaWdodCk7CiAgICBvayhyYz09RDNEX09LLCAiU2V0TGlnaHQgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X1NldExpZ2h0KGxwRDNERGV2aWNlLCAxMCwgJmxpZ2h0KTsKICAgIG9rKHJjPT1EM0RfT0ssICJTZXRMaWdodCByZXR1cm5lZDogJWx4XG4iLCByYyk7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfU2V0TGlnaHQobHBEM0REZXZpY2UsIDQ1LCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIlNldExpZ2h0IHJldHVybmVkOiAlbHhcbiIsIHJjKTsKCgogICAgLyogVHJ5IHRvIHJldHJpZXZlIGEgbGlnaHQgYmV5b25kIHRoZSBpbmRpY2VzIG9mIHRoZSBsaWdodHMgdGhhdCBoYXZlCiAgICAgICBiZWVuIHNldC4gKi8KICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19HZXRMaWdodChscEQzRERldmljZSwgNTAsICZsaWdodCk7CiAgICBvayhyYz09RERFUlJfSU5WQUxJRFBBUkFNUywgIkdldExpZ2h0IHJldHVybmVkOiAlbHhcbiIsIHJjKTsKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19HZXRMaWdodChscEQzRERldmljZSwgMiwgJmxpZ2h0KTsKICAgIG9rKHJjPT1EREVSUl9JTlZBTElEUEFSQU1TLCAiR2V0TGlnaHQgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwoKCiAgICAvKiBUcnkgdG8gcmV0cmlldmUgb25lIG9mIHRoZSBsaWdodHMgdGhhdCBoYXZlIGJlZW4gc2V0ICovCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfR2V0TGlnaHQobHBEM0REZXZpY2UsIDEwLCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIkdldExpZ2h0IHJldHVybmVkOiAlbHhcbiIsIHJjKTsKCgogICAgLyogRW5hYmxlIGEgbGlnaHQgdGhhdCBoYXZlIGJlZW4gcHJldmlvdXNseSBzZXQuICovCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfTGlnaHRFbmFibGUobHBEM0REZXZpY2UsIDEwLCBUUlVFKTsKICAgIG9rKHJjPT1EM0RfT0ssICJMaWdodEVuYWJsZSByZXR1cm5lZDogJWx4XG4iLCByYyk7CgoKICAgIC8qIEVuYWJsZSBzb21lIGxpZ2h0cyB0aGF0IGhhdmUgbm90IGJlZW4gcHJldmlvdXNseSBzZXQsIGFuZCB2ZXJpZnkgdGhhdAogICAgICAgdGhleSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBwcm9wZXIgZGVmYXVsdCB2YWx1ZXMuICovCiAgICBtZW1zZXQoJmRlZmF1bHRsaWdodCwgMCwgc2l6ZW9mKEQzRExJR0hUNykpOwogICAgZGVmYXVsdGxpZ2h0LmRsdFR5cGUgPSBEM0RMSUdIVF9ESVJFQ1RJT05BTDsKICAgIFUxKGRlZmF1bHRsaWdodC5kY3ZEaWZmdXNlKS5yID0gMS5mOwogICAgVTIoZGVmYXVsdGxpZ2h0LmRjdkRpZmZ1c2UpLmcgPSAxLmY7CiAgICBVMyhkZWZhdWx0bGlnaHQuZGN2RGlmZnVzZSkuYiA9IDEuZjsKICAgIFUzKGRlZmF1bHRsaWdodC5kdkRpcmVjdGlvbikueiA9IDEuZjsKCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfTGlnaHRFbmFibGUobHBEM0REZXZpY2UsIDIwLCBUUlVFKTsKICAgIG9rKHJjPT1EM0RfT0ssICJMaWdodEVuYWJsZSByZXR1cm5lZDogJWx4XG4iLCByYyk7CiAgICBtZW1zZXQoJmxpZ2h0LCAwLCBzaXplb2YoRDNETElHSFQ3KSk7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfR2V0TGlnaHQobHBEM0REZXZpY2UsIDIwLCAmbGlnaHQpOwogICAgb2socmM9PUQzRF9PSywgIkdldExpZ2h0IHJldHVybmVkOiAlbHhcbiIsIHJjKTsKICAgIG9rKCFtZW1jbXAoJmxpZ2h0LCAmZGVmYXVsdGxpZ2h0LCBzaXplb2YoRDNETElHSFQ3KSksCiAgICAgICAgImxpZ2h0IGRhdGEgZG9lc24ndCBtYXRjaCBleHBlY3RlZCBkZWZhdWx0IHZhbHVlc1xuIiApOwoKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19MaWdodEVuYWJsZShscEQzRERldmljZSwgNTAsIFRSVUUpOwogICAgb2socmM9PUQzRF9PSywgIkxpZ2h0RW5hYmxlIHJldHVybmVkOiAlbHhcbiIsIHJjKTsKICAgIG1lbXNldCgmbGlnaHQsIDAsIHNpemVvZihEM0RMSUdIVDcpKTsKICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19HZXRMaWdodChscEQzRERldmljZSwgNTAsICZsaWdodCk7CiAgICBvayhyYz09RDNEX09LLCAiR2V0TGlnaHQgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwogICAgb2soIW1lbWNtcCgmbGlnaHQsICZkZWZhdWx0bGlnaHQsIHNpemVvZihEM0RMSUdIVDcpKSwKICAgICAgICAibGlnaHQgZGF0YSBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIGRlZmF1bHQgdmFsdWVzXG4iICk7CgoKICAgIC8qIERpc2FibGUgb25lIG9mIHRoZSBsaWdodCB0aGF0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGVuYWJsZWQuICovCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfTGlnaHRFbmFibGUobHBEM0REZXZpY2UsIDIwLCBGQUxTRSk7CiAgICBvayhyYz09RDNEX09LLCAiTGlnaHRFbmFibGUgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwoKICAgIC8qIFRyeSB0byByZXRyaWV2ZSB0aGUgZW5hYmxlIHN0YXR1cyBvZiBzb21lIGxpZ2h0cyAqLwogICAgLyogTGlnaHQgMjAgaXMgc3VwcG9zZWQgdG8gYmUgZGlzYWJsZWQgKi8KICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19HZXRMaWdodEVuYWJsZShscEQzRERldmljZSwgMjAsICZiRW5hYmxlZCApOwogICAgb2socmM9PUQzRF9PSywgIkdldExpZ2h0RW5hYmxlIHJldHVybmVkOiAlbHhcbiIsIHJjKTsKICAgIG9rKCFiRW5hYmxlZCwgIkdldExpZ2h0RW5hYmxlIHNheXMgdGhlIGxpZ2h0IGlzIGVuYWJsZWRcbiIpOwoKICAgIC8qIExpZ2h0IDEwIGlzIHN1cHBvc2VkIHRvIGJlIGVuYWJsZWQgKi8KICAgIGJFbmFibGVkID0gRkFMU0U7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfR2V0TGlnaHRFbmFibGUobHBEM0REZXZpY2UsIDEwLCAmYkVuYWJsZWQgKTsKICAgIG9rKHJjPT1EM0RfT0ssICJHZXRMaWdodEVuYWJsZSByZXR1cm5lZDogJWx4XG4iLCByYyk7CiAgICBvayhiRW5hYmxlZCwgIkdldExpZ2h0RW5hYmxlIHNheXMgdGhlIGxpZ2h0IGlzIGRpc2FibGVkXG4iKTsKCiAgICAvKiBMaWdodCA4MCBoYXMgbm90IGJlZW4gc2V0ICovCiAgICByYyA9IElEaXJlY3QzRERldmljZTdfR2V0TGlnaHRFbmFibGUobHBEM0REZXZpY2UsIDgwLCAmYkVuYWJsZWQgKTsKICAgIG9rKHJjPT1EREVSUl9JTlZBTElEUEFSQU1TLCAiR2V0TGlnaHRFbmFibGUgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwoKICAgIC8qIExpZ2h0IDIzIGhhcyBub3QgYmVlbiBzZXQgKi8KICAgIHJjID0gSURpcmVjdDNERGV2aWNlN19HZXRMaWdodEVuYWJsZShscEQzRERldmljZSwgMjMsICZiRW5hYmxlZCApOwogICAgb2socmM9PURERVJSX0lOVkFMSURQQVJBTVMsICJHZXRMaWdodEVuYWJsZSByZXR1cm5lZDogJWx4XG4iLCByYyk7Cn0KCnN0YXRpYyB2b2lkIFByb2Nlc3NWZXJ0aWNlc1Rlc3QoKQp7CiAgICBEM0RWRVJURVhCVUZGRVJERVNDIGRlc2M7CiAgICBIUkVTVUxUIHJjOwogICAgVkVSVEVYICppbjsKICAgIFRWRVJURVggKm91dDsKICAgIFZFUlRFWCAqb3V0MjsKICAgIEQzRFZJRVdQT1JUNyB2cDsKICAgIEQzRE1BVFJJWCB2aWV3ID0geyAgMi4wLCAwLjAsIDAuMCwgMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAwLjAsIC0xLjAsIDAuMCwgMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDAuMCwgMS4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDMuMCB9OwoKICAgIEQzRE1BVFJJWCB3b3JsZCA9IHsgMC4wLCAxLjAsIDAuMCwgMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAxLjAsIDAuMCwgMC4wLCAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAwLjAsIDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAxLjAsIDEuMCwgMS4wIH07CgogICAgRDNETUFUUklYIHByb2ogPSB7ICAxLjAsIDAuMCwgMC4wLCAxLjAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwgMS4wLCAxLjAsIDAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAxLjAsIDEuMCwgMC4wLAogICAgICAgICAgICAgICAgICAgICAgICAxLjAsIDAuMCwgMC4wLCAxLjAgfTsKICAgIC8qIENyZWF0ZSBzb21lIHZlcnRleCBidWZmZXJzICovCgogICAgbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOwogICAgZGVzYy5kd1NpemUgPSBzaXplb2YoZGVzYyk7CiAgICBkZXNjLmR3Q2FwcyA9IDA7CiAgICBkZXNjLmR3RlZGID0gRDNERlZGX1hZWjsKICAgIGRlc2MuZHdOdW1WZXJ0aWNlcyA9IDE2OwogICAgcmMgPSBJRGlyZWN0M0Q3X0NyZWF0ZVZlcnRleEJ1ZmZlcihscEQzRCwgJmRlc2MsICZscFZCdWZTcmMsIDApOwogICAgb2socmM9PUQzRF9PSyB8fCByYz09RV9PVVRPRk1FTU9SWSwgIkNyZWF0ZVZlcnRleEJ1ZmZlciByZXR1cm5lZDogJWx4XG4iLCByYyk7CiAgICBpZiAoIWxwVkJ1ZlNyYykKICAgIHsKICAgICAgICB0cmFjZSgiSURpcmVjdDNENzo6Q3JlYXRlVmVydGV4QnVmZmVyKCkgZmFpbGVkIHdpdGggYW4gZXJyb3IgJWx4XG4iLCByYyk7CiAgICAgICAgZ290byBvdXQ7CiAgICB9CgogICAgbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOwogICAgZGVzYy5kd1NpemUgPSBzaXplb2YoZGVzYyk7CiAgICBkZXNjLmR3Q2FwcyA9IDA7CiAgICBkZXNjLmR3RlZGID0gRDNERlZGX1hZWlJIVzsKICAgIGRlc2MuZHdOdW1WZXJ0aWNlcyA9IDE2OwogICAgLyogTXNkbiBzYXlzIHRoYXQgdGhlIGxhc3QgcGFyYW1ldGVyIG11c3QgYmUgMCAtIGNoZWNrIHRoYXQgKi8KICAgIHJjID0gSURpcmVjdDNEN19DcmVhdGVWZXJ0ZXhCdWZmZXIobHBEM0QsICZkZXNjLCAmbHBWQnVmRGVzdDEsIDQpOwogICAgb2socmM9PUQzRF9PSyB8fCByYz09RV9PVVRPRk1FTU9SWSwgIkNyZWF0ZVZlcnRleEJ1ZmZlciByZXR1cm5lZDogJWx4XG4iLCByYyk7CiAgICBpZiAoIWxwVkJ1ZkRlc3QxKQogICAgewogICAgICAgIHRyYWNlKCJJRGlyZWN0M0Q3OjpDcmVhdGVWZXJ0ZXhCdWZmZXIoKSBmYWlsZWQgd2l0aCBhbiBlcnJvciAlbHhcbiIsIHJjKTsKICAgICAgICBnb3RvIG91dDsKICAgIH0KCiAgICBtZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CiAgICBkZXNjLmR3U2l6ZSA9IHNpemVvZihkZXNjKTsKICAgIGRlc2MuZHdDYXBzID0gMDsKICAgIGRlc2MuZHdGVkYgPSBEM0RGVkZfWFlaOwogICAgZGVzYy5kd051bVZlcnRpY2VzID0gMTY7CiAgICAvKiBNc2RuIHNheXMgdGhhdCB0aGUgbGFzdCBwYXJhbWV0ZXIgbXVzdCBiZSAwIC0gY2hlY2sgdGhhdCAqLwogICAgcmMgPSBJRGlyZWN0M0Q3X0NyZWF0ZVZlcnRleEJ1ZmZlcihscEQzRCwgJmRlc2MsICZscFZCdWZEZXN0MiwgMTIzNDU2NzgpOwogICAgb2socmM9PUQzRF9PSyB8fCByYz09RV9PVVRPRk1FTU9SWSwgIkNyZWF0ZVZlcnRleEJ1ZmZlciByZXR1cm5lZDogJWx4XG4iLCByYyk7CiAgICBpZiAoIWxwVkJ1ZkRlc3QyKQogICAgewogICAgICAgIHRyYWNlKCJJRGlyZWN0M0Q3OjpDcmVhdGVWZXJ0ZXhCdWZmZXIoKSBmYWlsZWQgd2l0aCBhbiBlcnJvciAlbHhcbiIsIHJjKTsKICAgICAgICBnb3RvIG91dDsKICAgIH0KCiAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfTG9jayhscFZCdWZTcmMsIDAsICh2b2lkICoqKSAmaW4sIE5VTEwpOwogICAgb2socmM9PUQzRF9PSyAsICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OkxvY2sgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwogICAgaWYoIWluKSBnb3RvIG91dDsKCiAgICAvKiBDaGVjayBiYXNpYyB0cmFuc2Zvcm1hdGlvbiAqLwoKICAgIGluWzBdLnggPSAwLjA7CiAgICBpblswXS55ID0gMC4wOwogICAgaW5bMF0ueiA9IDAuMDsKCiAgICBpblsxXS54ID0gMS4wOwogICAgaW5bMV0ueSA9IDEuMDsKICAgIGluWzFdLnogPSAxLjA7CgogICAgaW5bMl0ueCA9IC0xLjA7CiAgICBpblsyXS55ID0gLTEuMDsKICAgIGluWzJdLnogPSAwLjU7CgogICAgaW5bM10ueCA9IDAuNTsKICAgIGluWzNdLnkgPSAtMC41OwogICAgaW5bM10ueiA9IDAuMjU7CiAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfVW5sb2NrKGxwVkJ1ZlNyYyk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6VW5sb2NrIHJldHVybmVkOiAlbHhcbiIsIHJjKTsKCiAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfUHJvY2Vzc1ZlcnRpY2VzKGxwVkJ1ZkRlc3QxLCBEM0RWT1BfVFJBTlNGT1JNLCAwLCA0LCBscFZCdWZTcmMsIDAsIGxwRDNERGV2aWNlLCAwKTsKICAgIG9rKHJjPT1EM0RfT0sgLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOjpQcm9jZXNzVmVydGljZXMgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19Qcm9jZXNzVmVydGljZXMobHBWQnVmRGVzdDIsIEQzRFZPUF9UUkFOU0ZPUk0sIDAsIDQsIGxwVkJ1ZlNyYywgMCwgbHBEM0REZXZpY2UsIDApOwogICAgb2socmM9PUQzRF9PSyAsICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OlByb2Nlc3NWZXJ0aWNlcyByZXR1cm5lZDogJWx4XG4iLCByYyk7CgogICAgcmMgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X0xvY2sobHBWQnVmRGVzdDEsIDAsICh2b2lkICoqKSAmb3V0LCBOVUxMKTsKICAgIG9rKHJjPT1EM0RfT0sgLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOjpMb2NrIHJldHVybmVkOiAlbHhcbiIsIHJjKTsKICAgIGlmKCFvdXQpIGdvdG8gb3V0OwoKICAgIC8qIENoZWNrIHRoZSByZXN1bHRzICovCiAgICBpZiggIWNvbXBhcmVmbG9hdChvdXRbMF0ueCwgMTI4LjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzBdLnksIDEyOC4wICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFswXS56LCAwLjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzBdLnJodywgMS4wICkpCiAgICB7CiAgICAgICAgdG9kb193aW5lIG9rKEZBTFNFLCAiT3V0cHV0IDAgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFswXS54LCBvdXRbMF0ueSwgb3V0WzBdLnosIG91dFswXS5yaHcpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhUUlVFLCAiT3V0cHV0IDAgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFswXS54LCBvdXRbMF0ueSwgb3V0WzBdLnosIG91dFswXS5yaHcpOwogICAgfQoKICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFsxXS54LCAyNTYuMCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMV0ueSwgMC4wICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsxXS56LCAxLjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzFdLnJodywgMS4wICkpCiAgICB7CiAgICAgICAgdG9kb193aW5lIG9rKEZBTFNFLCAiT3V0cHV0IDEgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsxXS54LCBvdXRbMV0ueSwgb3V0WzFdLnosIG91dFsxXS5yaHcpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhUUlVFLCAiT3V0cHV0IDEgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsxXS54LCBvdXRbMV0ueSwgb3V0WzFdLnosIG91dFsxXS5yaHcpOwogICAgfQoKICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFsyXS54LCAwLjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzJdLnksIDI1Ni4wICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsyXS56LCAwLjUgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzJdLnJodywgMS4wICkpCiAgICB7CiAgICAgICAgdG9kb193aW5lIG9rKEZBTFNFLCAiT3V0cHV0IDIgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsyXS54LCBvdXRbMl0ueSwgb3V0WzJdLnosIG91dFsyXS5yaHcpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhUUlVFLCAiT3V0cHV0IDIgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsyXS54LCBvdXRbMl0ueSwgb3V0WzJdLnosIG91dFsyXS5yaHcpOwogICAgfQoKICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFszXS54LCAxOTIuMCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbM10ueSwgMTkyLjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzNdLnosIDAuMjUgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzNdLnJodywgMS4wICkpCiAgICB7CiAgICAgICAgdG9kb193aW5lIG9rKEZBTFNFLCAiT3V0cHV0IDMgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFszXS54LCBvdXRbM10ueSwgb3V0WzNdLnosIG91dFszXS5yaHcpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhUUlVFLCAiT3V0cHV0IDMgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFszXS54LCBvdXRbM10ueSwgb3V0WzNdLnosIG91dFszXS5yaHcpOwogICAgfQoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19VbmxvY2sobHBWQnVmRGVzdDEpOwogICAgb2socmM9PUQzRF9PSyAsICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OlVubG9jayByZXR1cm5lZDogJWx4XG4iLCByYyk7CiAgICBvdXQgPSBOVUxMOwoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19Mb2NrKGxwVkJ1ZkRlc3QyLCAwLCAodm9pZCAqKikgJm91dDIsIE5VTEwpOwogICAgb2socmM9PUQzRF9PSyAsICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OkxvY2sgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwogICAgaWYoIW91dDIpIGdvdG8gb3V0OwogICAgLyogU21hbGwgdGhpbmcgd2l0aG91dCBtdWNoIHByYWN0aWFsIG1lYW5pbmcsIGJ1dCBJIHN0dW1ibGVkIHVwb24gaXQsCiAgICAgKiBzbyBsZXQncyBjaGVjayBmb3IgaXQ6IElmIHRoZSBvdXRwdXQgdmVydGV4IGJ1ZmZlciBoYXMgdG8gUkhXIHZhbHVlLAogICAgICogVGhlIFJIVyB2YWx1ZSBvZiB0aGUgbGFzdCB2ZXJ0ZXggaXMgd3JpdHRlbiBpbnRvIHRoZSBuZXh0IHZlcnRleAogICAgICovCiAgICBpZiggIWNvbXBhcmVmbG9hdChvdXQyWzRdLngsIDEuMCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXQyWzRdLnksIDAuMCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXQyWzRdLnosIDAuMCApICkKICAgIHsKICAgICAgICB0b2RvX3dpbmUgb2soRkFMU0UsICJPdXRwdXQgNCB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZilcbiIsIG91dDJbNF0ueCwgb3V0Mls0XS55LCBvdXQyWzRdLnopOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhUUlVFLCAiT3V0cHV0IDQgdmVydGV4IGlzICglZiAsICVmICwgJWYpXG4iLCBvdXQyWzRdLngsIG91dDJbNF0ueSwgb3V0Mls0XS56KTsKICAgIH0KCiAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfVW5sb2NrKGxwVkJ1ZkRlc3QyKTsKICAgIG9rKHJjPT1EM0RfT0sgLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOjpVbmxvY2sgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwogICAgb3V0ID0gTlVMTDsKCiAgICAvKiBUcnkgYSBtb3JlIGNvbXBsaWNhdGVkIHZpZXdwb3J0LCBzYW1lIHZlcnRpY2VzICovCiAgICBtZW1zZXQoJnZwLCAwLCBzaXplb2YodnApKTsKICAgIHZwLmR3WCA9IDEwOwogICAgdnAuZHdZID0gNTsKICAgIHZwLmR3V2lkdGggPSAyNDY7CiAgICB2cC5kd0hlaWdodCA9IDEzMDsKICAgIHZwLmR2TWluWiA9IC0yLjA7CiAgICB2cC5kdk1heFogPSA0LjA7CiAgICByYyA9IElEaXJlY3QzRERldmljZTdfU2V0Vmlld3BvcnQobHBEM0REZXZpY2UsICZ2cCk7CiAgICBvayhyYz09RDNEX09LLCAiSURpcmVjdDNERGV2aWNlN19TZXRWaWV3cG9ydCBmYWlsZWQgd2l0aCByYz0lbHhcbiIsIHJjKTsKCiAgICAvKiBQcm9jZXNzIGFnYWluICovCiAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfUHJvY2Vzc1ZlcnRpY2VzKGxwVkJ1ZkRlc3QxLCBEM0RWT1BfVFJBTlNGT1JNLCAwLCA0LCBscFZCdWZTcmMsIDAsIGxwRDNERGV2aWNlLCAwKTsKICAgIG9rKHJjPT1EM0RfT0sgLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOjpQcm9jZXNzVmVydGljZXMgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19Mb2NrKGxwVkJ1ZkRlc3QxLCAwLCAodm9pZCAqKikgJm91dCwgTlVMTCk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6TG9jayByZXR1cm5lZDogJWx4XG4iLCByYyk7CiAgICBpZighb3V0KSBnb3RvIG91dDsKCiAgICAvKiBDaGVjayB0aGUgcmVzdWx0cyAqLwogICAgaWYoICFjb21wYXJlZmxvYXQob3V0WzBdLngsIDEzMy4wICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFswXS55LCA3MC4wICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFswXS56LCAtMi4wICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFswXS5yaHcsIDEuMCApKQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhGQUxTRSwgIk91dHB1dCAwIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMF0ueCwgb3V0WzBdLnksIG91dFswXS56LCBvdXRbMF0ucmh3KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB0b2RvX3dpbmUgb2soVFJVRSwgIk91dHB1dCAwIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMF0ueCwgb3V0WzBdLnksIG91dFswXS56LCBvdXRbMF0ucmh3KTsKICAgIH0KCiAgICBpZiggIWNvbXBhcmVmbG9hdChvdXRbMV0ueCwgMjU2LjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzFdLnksIDUuMCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMV0ueiwgNC4wICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsxXS5yaHcsIDEuMCApKQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhGQUxTRSwgIk91dHB1dCAxIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMV0ueCwgb3V0WzFdLnksIG91dFsxXS56LCBvdXRbMV0ucmh3KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB0b2RvX3dpbmUgb2soVFJVRSwgIk91dHB1dCAxIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMV0ueCwgb3V0WzFdLnksIG91dFsxXS56LCBvdXRbMV0ucmh3KTsKICAgIH0KCiAgICBpZiggIWNvbXBhcmVmbG9hdChvdXRbMl0ueCwgMTAuMCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMl0ueSwgMTM1LjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzJdLnosIDEuMCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMl0ucmh3LCAxLjAgKSkKICAgIHsKICAgICAgICB0b2RvX3dpbmUgb2soRkFMU0UsICJPdXRwdXQgMiB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzFdLngsIG91dFsxXS55LCBvdXRbMV0ueiwgb3V0WzFdLnJodyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdG9kb193aW5lIG9rKFRSVUUsICJPdXRwdXQgMiB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzFdLngsIG91dFsxXS55LCBvdXRbMV0ueiwgb3V0WzFdLnJodyk7CiAgICB9CgogICAgaWYoICFjb21wYXJlZmxvYXQob3V0WzNdLngsIDE5NC41ICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFszXS55LCAxMDIuNSApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbM10ueiwgLTAuNSApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbM10ucmh3LCAxLjAgKSkKICAgIHsKICAgICAgICB0b2RvX3dpbmUgb2soRkFMU0UsICJPdXRwdXQgMyB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzNdLngsIG91dFszXS55LCBvdXRbM10ueiwgb3V0WzNdLnJodyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdG9kb193aW5lIG9rKFRSVUUsICJPdXRwdXQgMyB2ZXJ0ZXggaXMgKCVmICwgJWYgLCAlZiAsICVmKVxuIiwgb3V0WzNdLngsIG91dFszXS55LCBvdXRbM10ueiwgb3V0WzNdLnJodyk7CiAgICB9CgogICAgcmMgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1VubG9jayhscFZCdWZEZXN0MSk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6VW5sb2NrIHJldHVybmVkOiAlbHhcbiIsIHJjKTsKICAgIG91dCA9IE5VTEw7CgogICAgLyogUGxheSB3aXRoIHNvbWUgbWF0cmljZXMuICovCgogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X1NldFRyYW5zZm9ybShscEQzRERldmljZSwgRDNEVFJBTlNGT1JNU1RBVEVfVklFVywgJnZpZXcpOwogICAgb2socmM9PUQzRF9PSywgIklEaXJlY3QzRERldmljZTdfU2V0VHJhbnNmb3JtIGZhaWxlZFxuIik7CgogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X1NldFRyYW5zZm9ybShscEQzRERldmljZSwgRDNEVFJBTlNGT1JNU1RBVEVfUFJPSkVDVElPTiwgJnByb2opOwogICAgb2socmM9PUQzRF9PSywgIklEaXJlY3QzRERldmljZTdfU2V0VHJhbnNmb3JtIGZhaWxlZFxuIik7CgogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X1NldFRyYW5zZm9ybShscEQzRERldmljZSwgRDNEVFJBTlNGT1JNU1RBVEVfV09STEQsICZ3b3JsZCk7CiAgICBvayhyYz09RDNEX09LLCAiSURpcmVjdDNERGV2aWNlN19TZXRUcmFuc2Zvcm0gZmFpbGVkXG4iKTsKCiAgICByYyA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjdfUHJvY2Vzc1ZlcnRpY2VzKGxwVkJ1ZkRlc3QxLCBEM0RWT1BfVFJBTlNGT1JNLCAwLCA0LCBscFZCdWZTcmMsIDAsIGxwRDNERGV2aWNlLCAwKTsKICAgIG9rKHJjPT1EM0RfT0sgLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOjpQcm9jZXNzVmVydGljZXMgcmV0dXJuZWQ6ICVseFxuIiwgcmMpOwoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19Mb2NrKGxwVkJ1ZkRlc3QxLCAwLCAodm9pZCAqKikgJm91dCwgTlVMTCk7CiAgICBvayhyYz09RDNEX09LICwgIklEaXJlY3QzRFZlcnRleEJ1ZmZlcjo6TG9jayByZXR1cm5lZDogJWx4XG4iLCByYyk7CiAgICBpZighb3V0KSBnb3RvIG91dDsKCiAgICAvKiBLZWVwIHRoZSB2aWV3cG9ydCBzaW1wbGVyLCBvdGhlcndpc2Ugd2UgZ2V0IGJhZCBudW1iZXJzIHRvIGNvbXBhcmUgKi8KICAgIHZwLmR3WCA9IDA7CiAgICB2cC5kd1kgPSAwOwogICAgdnAuZHdXaWR0aCA9IDEwMDsKICAgIHZwLmR3SGVpZ2h0ID0gMTAwOwogICAgdnAuZHZNaW5aID0gMS4wOwogICAgdnAuZHZNYXhaID0gMC4wOwogICAgcmMgPSBJRGlyZWN0M0REZXZpY2U3X1NldFZpZXdwb3J0KGxwRDNERGV2aWNlLCAmdnApOwogICAgb2socmM9PUQzRF9PSywgIklEaXJlY3QzRERldmljZTdfU2V0Vmlld3BvcnQgZmFpbGVkXG4iKTsKCiAgICAvKiBDaGVjayB0aGUgcmVzdWx0cyAqLwogICAgaWYoICFjb21wYXJlZmxvYXQob3V0WzBdLngsIDI1Ni4wICkgfHwgICAgLyogWCBjb29yZGluYXRlIGlzIGN1dCBhdCB0aGUgc3VyZmFjZSBlZGdlcyAqLwogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzBdLnksIDcwLjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzBdLnosIC0yLjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzBdLnJodywgKDEuMCAvIDMuMCkpKQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhGQUxTRSwgIk91dHB1dCAwIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMF0ueCwgb3V0WzBdLnksIG91dFswXS56LCBvdXRbMF0ucmh3KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB0b2RvX3dpbmUgb2soVFJVRSwgIk91dHB1dCAwIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMF0ueCwgb3V0WzBdLnksIG91dFswXS56LCBvdXRbMF0ucmh3KTsKICAgIH0KCiAgICBpZiggIWNvbXBhcmVmbG9hdChvdXRbMV0ueCwgMjU2LjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzFdLnksIDc4LjEyNTAwMCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMV0ueiwgLTIuNzUwMDAwICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsxXS5yaHcsIDAuMTI1MDAwICkpCiAgICB7CiAgICAgICAgdG9kb193aW5lIG9rKEZBTFNFLCAiT3V0cHV0IDEgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsxXS54LCBvdXRbMV0ueSwgb3V0WzFdLnosIG91dFsxXS5yaHcpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhUUlVFLCAiT3V0cHV0IDEgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFsxXS54LCBvdXRbMV0ueSwgb3V0WzFdLnosIG91dFsxXS5yaHcpOwogICAgfQoKICAgIGlmKCAhY29tcGFyZWZsb2F0KG91dFsyXS54LCAyNTYuMCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMl0ueSwgNDQuMDAwMDAwICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFsyXS56LCAwLjQwMDAwMCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbMl0ucmh3LCAwLjQwMDAwMCApKQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhGQUxTRSwgIk91dHB1dCAyIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMl0ueCwgb3V0WzJdLnksIG91dFsyXS56LCBvdXRbMl0ucmh3KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB0b2RvX3dpbmUgb2soVFJVRSwgIk91dHB1dCAyIHZlcnRleCBpcyAoJWYgLCAlZiAsICVmICwgJWYpXG4iLCBvdXRbMl0ueCwgb3V0WzJdLnksIG91dFsyXS56LCBvdXRbMl0ucmh3KTsKICAgIH0KCiAgICBpZiggIWNvbXBhcmVmbG9hdChvdXRbM10ueCwgMjU2LjAgKSB8fAogICAgICAgICFjb21wYXJlZmxvYXQob3V0WzNdLnksIDgxLjgxODE4NCApIHx8CiAgICAgICAgIWNvbXBhcmVmbG9hdChvdXRbM10ueiwgLTMuMDkwOTA5ICkgfHwKICAgICAgICAhY29tcGFyZWZsb2F0KG91dFszXS5yaHcsIDAuMzYzNjM2ICkpCiAgICB7CiAgICAgICAgdG9kb193aW5lIG9rKEZBTFNFLCAiT3V0cHV0IDMgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFszXS54LCBvdXRbM10ueSwgb3V0WzNdLnosIG91dFszXS5yaHcpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRvZG9fd2luZSBvayhUUlVFLCAiT3V0cHV0IDMgdmVydGV4IGlzICglZiAsICVmICwgJWYgLCAlZilcbiIsIG91dFszXS54LCBvdXRbM10ueSwgb3V0WzNdLnosIG91dFszXS5yaHcpOwogICAgfQoKICAgIHJjID0gSURpcmVjdDNEVmVydGV4QnVmZmVyN19VbmxvY2sobHBWQnVmRGVzdDEpOwogICAgb2socmM9PUQzRF9PSyAsICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OlVubG9jayByZXR1cm5lZDogJWx4XG4iLCByYyk7CiAgICBvdXQgPSBOVUxMOwoKb3V0OgogICAgSURpcmVjdDNEVmVydGV4QnVmZmVyN19SZWxlYXNlKGxwVkJ1ZlNyYyk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3X1JlbGVhc2UobHBWQnVmRGVzdDEpOwogICAgSURpcmVjdDNEVmVydGV4QnVmZmVyN19SZWxlYXNlKGxwVkJ1ZkRlc3QyKTsKfQoKU1RBUlRfVEVTVChkM2QpCnsKICAgIGluaXRfZnVuY3Rpb25fcG9pbnRlcnMoKTsKICAgIGlmKCFwRGlyZWN0RHJhd0NyZWF0ZUV4KSB7CiAgICAgICAgdHJhY2UoImZ1bmN0aW9uIERpcmVjdERyYXdDcmVhdGVFeCBub3QgYXZhaWxhYmxlLCBza2lwcGluZyB0ZXN0c1xuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmKCFDcmVhdGVEaXJlY3QzRCgpKSB7CiAgICAgICAgdHJhY2UoIlNraXBwaW5nIHRlc3RzXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBMaWdodFRlc3QoKTsKICAgIFByb2Nlc3NWZXJ0aWNlc1Rlc3QoKTsKICAgIFJlbGVhc2VEaXJlY3QzRCgpOwp9Cg==