LyoKICogRGlyZWN0RHJhdyBoZWxwZXIgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgogKiBDb3B5cmlnaHQgKGMpIDE5OTggTGlvbmVsIFVsbWVyCiAqIENvcHlyaWdodCAoYykgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwoKdm9pZCBERFJBV19kdW1wX2ZsYWdzXyhEV09SRCBmbGFncywgY29uc3QgZmxhZ19pbmZvKiBuYW1lcywgc2l6ZV90IG51bV9uYW1lcywgaW50IG5ld2xpbmUpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0RECiAqCiAqIENvbnZlcnRzIGFuIFdJTkVEM0RGT1JNQVQgdmFsdWUgaW50byBhIEREUElYRUxGT1JNQVQgc3RydWN0dXJlCiAqCiAqIFBhcmFtczoKICogIEREUGl4ZWxGb3JtYXQ6IEFkZHJlc3Mgb2YgdGhlIHN0cnVjdHVyZSB0byB3cml0ZSB0aGUgcGl4ZWwgZm9ybWF0IHRvCiAqICBXaW5lRDNERm9ybWF0OiBTb3VyY2UgZm9ybWF0CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERChERFBJWEVMRk9STUFUICpERFBpeGVsRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk9STUFUIFdpbmVEM0RGb3JtYXQpCnsKICAgIERXT1JEIFNpemUgPSBERFBpeGVsRm9ybWF0LT5kd1NpemU7CiAgICBUUkFDRSgiQ29udmVydGluZyBXSU5FRDNERk9STUFUICVkIHRvIEREUkFXXG4iLCBXaW5lRDNERm9ybWF0KTsKCiAgICBpZihTaXplPT0wKSByZXR1cm47CgogICAgbWVtc2V0KEREUGl4ZWxGb3JtYXQsIDB4MDAsIFNpemUpOwogICAgRERQaXhlbEZvcm1hdC0+ZHdTaXplID0gU2l6ZTsKICAgIHN3aXRjaChXaW5lRDNERm9ybWF0KQogICAgewogICAgICAgIGNhc2UgV0lORUQzREZNVF9SOEc4Qjg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMjQ7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwZmYwMDAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDAwZmYwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwMDAwZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4UjhHOEI4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAzMjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDBmZjAwMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMDBmZjAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDAwMDBmZjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweGZmMDAwMDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1g4UjhHOEI4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDMyOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwMGZmMDAwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDAwMGZmMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDAwMGZmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOEI4RzhSODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAzMjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDAwMDAwZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMDBmZjAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMGZmMDAwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjVHNkI1OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHhGODAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwN0UwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDFGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YMVI1RzVCNToKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4N0MwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDNFMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAxRjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTFSNUc1QjU6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQiB8IEREUEZfQUxQSEFQSVhFTFM7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHg3QzAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwM0UwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDFGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4ODAwMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BNFI0RzRCNDoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDBGMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwRjA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMEY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHhGMDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1IzRzNCMjoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSA4OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHhFMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MUM7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAzOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9QODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUEFMRVRURUlOREVYRUQ4IHwgRERQRl9SR0I7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDg7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0FMUEhBOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3QWxwaGFCaXREZXB0aCA9IDg7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3THVtaW5hbmNlQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4UjNHM0IyOgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDBFMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDAxQzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwMzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweEYwMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDRSNEc0QjQ6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDBGMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwRjA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMEY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICByZXR1cm47CgogICAgICAgIC8qIEhvdyBhcmUgWiBidWZmZXIgYml0IGRlcHRoIGFuZCBTdGVuY2lsIGJ1ZmZlciBiaXQgZGVwdGggcmVsYXRlZD8KICAgICAgICAgKi8KICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDE2OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3U3RlbmNpbEJpdERlcHRoID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdaQml0TWFzayA9IDB4MDAwMEZGRkY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCWkJpdE1hc2sgPSAweDAwMDBGRkZGOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QzMjoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDMyOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweEZGRkZGRkZGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd1N0ZW5jaWxCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQlpCaXRNYXNrID0gMHhGRkZGRkZGRjsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMjRYNFM0OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSIHwgRERQRl9TVEVOQ0lMQlVGRkVSOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIC8qIFNob3VsZCBJIHNldCBkd1pCdWZmZXJCaXREZXB0aCB0byAzMiBoZXJlPyAqLwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDI0OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDQ7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNFM4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSIHwgRERQRl9TVEVOQ0lMQlVGRkVSOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIC8qIFNob3VsZCBJIHNldCBkd1pCdWZmZXJCaXREZXB0aCB0byAzMiBoZXJlPyAqLwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDI0OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDg7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNFg4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoID0gMjQ7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3U3RlbmNpbEJpdERlcHRoID0gODsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdaQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdTdGVuY2lsQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CgogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDE1UzE6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1pCVUZGRVIgfCBERFBGX1NURU5DSUxCVUZGRVI7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgLyogU2hvdWxkIEkgc2V0IGR3WkJ1ZmZlckJpdERlcHRoIHRvIDE2IGhlcmU/ICovCiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoID0gMTU7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3U3RlbmNpbEJpdERlcHRoID0gMTsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdaQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdTdGVuY2lsQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVVlWWToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWVVZMjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUMToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUMjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUMzoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUNDoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUNToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTVVMVEkyX0FSR0I6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0c4UjhfRzhCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjhHOF9COEc4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9GT1VSQ0M7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gV2luZUQzREZvcm1hdDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIC8qIEx1bWluYW5jZSAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9MODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfTFVNSU5BTkNFOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3THVtaW5hbmNlQml0Q291bnQgPSA4OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd0x1bWluYW5jZUJpdE1hc2sgPSAweGZmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0J1bXBEdkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3THVtaW5hbmNlQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E0TDQ6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0FMUEhBUElYRUxTIHwgRERQRl9MVU1JTkFOQ0U7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdMdW1pbmFuY2VCaXRDb3VudCA9IDQ7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3THVtaW5hbmNlQml0TWFzayA9IDB4MGY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweGYwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4TDg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0FMUEhBUElYRUxTIHwgRERQRl9MVU1JTkFOQ0U7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdMdW1pbmFuY2VCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd0x1bWluYW5jZUJpdE1hc2sgPSAweDAwZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweGZmMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAvKiBCdW1wIG1hcHBpbmcgKi8KICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVjhVODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQlVNUERVRFY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdCdW1wQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdCdW1wRHVCaXRNYXNrID0gICAgICAgICAweDAwMDAwMGZmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0J1bXBEdkJpdE1hc2sgPSAgICAgICAgIDB4MDAwMGZmMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPSAgMHgwMDAwMDAwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDAwMDAwMDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0w2VjVVNToKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQlVNUERVRFY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdCdW1wQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdCdW1wRHVCaXRNYXNrID0gICAgICAgICAweDAwMDAwMDFmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0J1bXBEdkJpdE1hc2sgPSAgICAgICAgIDB4MDAwMDAzZTA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPSAgMHgwMDAwZmMwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDAwMDAwMDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRVJSKCJDYW4ndCB0cmFuc2xhdGUgdGhpcyBQaXhlbGZvcm1hdCAlZFxuIiwgV2luZUQzREZvcm1hdCk7CiAgICB9CgogICAgaWYoVFJBQ0VfT04oZGRyYXcpKSB7CiAgICAgICAgVFJBQ0UoIlJldHVybmluZzogIik7CiAgICAgICAgRERSQVdfZHVtcF9waXhlbGZvcm1hdChERFBpeGVsRm9ybWF0KTsKICAgICAgICBUUkFDRSgiXG4iKTsKICAgIH0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGl4ZWxGb3JtYXRfREQyV2luZUQzRAogKgogKiBSZWFkcyBhIEREUElYRUxGT1JNQVQgc3RydWN0dXJlIGFuZCByZXR1cm5zIHRoZSBlcXVhbCBXSU5FRDNERk9STUFUCiAqCiAqIFBhcmFtczoKICogIEREUGl4ZWxGb3JtYXQ6IFRoZSBzb3VyY2UgZm9ybWF0CiAqCiAqIFJldHVybnM6CiAqICBUaGUgV0lORUQzREZPUk1BVCBlcXVhbCB0byB0aGUgRERyYXcgZm9ybWF0CiAqICBXSU5FRDNERk1UX1VOS05PV04gaWYgYSBtYXRjaGluZyBmb3JtYXQgd2Fzbid0IGZvdW5kCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KV0lORUQzREZPUk1BVApQaXhlbEZvcm1hdF9ERDJXaW5lRDNEKEREUElYRUxGT1JNQVQgKkREUGl4ZWxGb3JtYXQpCnsKICAgIFRSQUNFKCJDb252ZXJ0IGEgRGlyZWN0RHJhdyBQaXhlbGZvcm1hdCB0byBhIFdpbmVEM0QgUGl4ZWxmb3JtYXRcbiIpOyAgICAKICAgIGlmKFRSQUNFX09OKGRkcmF3KSkKICAgIHsKICAgICAgICBERFJBV19kdW1wX3BpeGVsZm9ybWF0KEREUGl4ZWxGb3JtYXQpOwogICAgICAgIFRSQUNFKCJcbiIpOwogICAgfQoKICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX1BBTEVUVEVJTkRFWEVEOCkKICAgIHsKICAgICAgICByZXR1cm4gV0lORUQzREZNVF9QODsKICAgIH0KICAgIGVsc2UgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIChERFBGX1BBTEVUVEVJTkRFWEVEMSB8IEREUEZfUEFMRVRURUlOREVYRUQyIHwgRERQRl9QQUxFVFRFSU5ERVhFRDQpICkKICAgIHsKICAgICAgICBGSVhNRSgiRERQRl9QQUxFVFRFSU5ERVhFRDEgdG8gRERQRl9QQUxFVFRFSU5ERVhFRDQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgV2luZUQzRCAoeWV0KS4gUmV0dXJuaW5nIFdJTkVEM0RGTVRfUDhcbiIpOwogICAgICAgIHJldHVybiBXSU5FRDNERk1UX1A4OwogICAgfQogICAgZWxzZSBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9SR0IpCiAgICB7CiAgICAgICAgc3dpdGNoKEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBvbmx5IGZvcm1hdCB0aGF0IGNhbiBtYXRjaCBoZXJlICovCiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9SM0czQjI7CgogICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgQ29sb3IgbWFza3MgKi8KICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweEY4MDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwN0UwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID09IDB4MDAxRikgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1I1RzZCNTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPT0gMHg3QzAwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID09IDB4MDNFMCkgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMUYpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHg4MDAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQTFSNUc1QjU7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9YMVI1RzVCNTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPT0gMHgwRjAwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID09IDB4MDBGMCkgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMEYpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHhGMDAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQTRSNEc0QjQ7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9YNFI0RzRCNDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweEZGMDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPT0gMHgwMEUwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID09IDB4MDAxQykgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMDMpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BOFIzRzNCMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEVSUigiMTYgYml0IFJHQiBQaXhlbCBmb3JtYXQgZG9lcyBub3QgbWF0Y2hcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKCiAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9SOEc4Qjg7CgogICAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgQ29sb3IgbWFza3MgKi8KICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweDAwRkYwMDAwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID09IDB4MDAwMEZGMDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPT0gMHgwMDAwMDBGRikgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweEZGMDAwMDAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQThSOEc4Qjg7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9YOFI4RzhCODsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBFUlIoIjMyIGJpdCBSR0IgcGl4ZWwgZm9ybWF0IGRvZXMgbm90IG1hdGNoXG4iKTsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBFUlIoIkludmFsaWQgZHdSR0JCaXRDb3VudCBpbiBQaXhlbGZvcm1hdCBzdHJ1Y3R1cmVcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEEpICkKICAgIHsKICAgICAgICAvKiBBbHBoYSBvbmx5IFBpeGVsZm9ybWF0ICovCiAgICAgICAgc3dpdGNoKEREUGl4ZWxGb3JtYXQtPnUxLmR3QWxwaGFCaXREZXB0aCkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBFUlIoIlVuc3VwcG9ydGVkIEFscGhhLU9ubHkgYml0IGRlcHRoIDB4JXhcbiIsIEREUGl4ZWxGb3JtYXQtPnUxLmR3QWxwaGFCaXREZXB0aCk7CiAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0E4OwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIEVSUigiSW52YWxpZCBBbHBoYUJpdERlcHRoIGluIEFscGhhLU9ubHkgUGl4ZWxmb3JtYXRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0xVTUlOQU5DRSkKICAgIHsKICAgICAgICAvKiBMdW1pbmFuY2Utb25seSBvciBsdW1pbmFuY2UtYWxwaGEgKi8KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9BTFBIQVBJWEVMUykKICAgICAgICB7CiAgICAgICAgICAgIC8qIEx1bWluYW5jZSB3aXRoIEFscGhhICovCiAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd0x1bWluYW5jZUJpdENvdW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+dTEuZHdBbHBoYUJpdERlcHRoID09IDQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0E0TDQ7CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmtub3duIEFscGhhIC8gTHVtaW5hbmNlIGJpdCBkZXB0aCBjb21iaW5hdGlvblxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKCiAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJBIGx1bWluYW5jZSBQaXhlbGZvcm1hdCBzaG91bGRuJ3QgaGF2ZSA2IGx1bWluYW5jZSBiaXRzLiBSZXR1cm5pbmcgRDNERk1UX0w2VjVVNSBmb3Igbm93ISFcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0w2VjVVNTsKCiAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+dTEuZHdBbHBoYUJpdERlcHRoID09IDgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0E4TDg7CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmtub3duIEFscGhhIC8gTHVtaW5jYXNlIGJpdCBkZXB0aCBjb21iaW5hdGlvblxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKiBMdW1pbmFuY2Utb25seSAqLwogICAgICAgICAgICBzd2l0Y2goRERQaXhlbEZvcm1hdC0+dTEuZHdMdW1pbmFuY2VCaXRDb3VudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgIEVSUigiQSBsdW1pbmFuY2UgUGl4ZWxmb3JtYXQgc2hvdWxkbid0IGhhdmUgNiBsdW1pbmFuY2UgYml0cy4gUmV0dXJuaW5nIEQzREZNVF9MNlY1VTUgZm9yIG5vdyEhXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9MNlY1VTU7CgogICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0w4OwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbmtub3duIGx1bWluYW5jZS1vbmx5IGJpdCBkZXB0aCAweCV4XG4iLCBERFBpeGVsRm9ybWF0LT51MS5kd0x1bWluYW5jZUJpdENvdW50KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfWkJVRkZFUikKICAgIHsKICAgICAgICAvKiBaIGJ1ZmZlciAqLwogICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX1NURU5DSUxCVUZGRVIpCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2goRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBFUlIoIjggQml0cyBaK1N0ZW5jaWwgYnVmZmVyIHBpeGVsZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuIFJldHVybmluZyBXSU5FRDNERk1UX1VOS05PV05cbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CgogICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+dTIuZHdTdGVuY2lsQml0RGVwdGggPT0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDE1UzE7CgogICAgICAgICAgICAgICAgICAgIEVSUigiRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGEgMTYgYml0IFogYnVmZmVyIHdpdGggJWQgYml0IHN0ZW5jaWwgYnVmZmVyIHBpeGVsZm9ybWF0XG4iLCBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKCiAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIEVSUigiRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGEgMjQgYml0IGRlcHRoIGJ1ZmZlciB3aXRoIHN0ZW5jaWwgYml0c1xuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDI0Uzg7CgogICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9PSA4KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMjRTODsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QyNFg0UzQ7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gWiBidWZmZXIgZGVwdGggJWRcbiIsIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIEVSUigiOCBCaXQgWiBidWZmZXJzIGFyZSBub3Qgc3VwcG9ydGVkLiBUcnlpbmcgYSAxNiBCaXQgb25lXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMTY7CgogICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMTY7CgogICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMjRYODsKCiAgICAgICAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QzMjsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIEVSUigiVW5zdXBwb3J0ZWQgWiBidWZmZXIgZGVwdGggJWRcbiIsIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpCiAgICB7CiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnVScsICdZJywgJ1YnLCAnWScpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVVlWWTsKICAgICAgICB9CiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnWScsICdVJywgJ1knLCAnMicpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfWVVZMjsKICAgICAgICB9CiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnRCcsICdYJywgJ1QnLCAnMScpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRFhUMTsKICAgICAgICB9CiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnRCcsICdYJywgJ1QnLCAnMicpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRFhUMjsKICAgICAgICB9CiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnRCcsICdYJywgJ1QnLCAnMycpKQogICAgICAgIHsKICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EWFQzOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICc0JykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EWFQ0OwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICc1JykpCiAgICAgICAgewoJICAgIHJldHVybiBXSU5FRDNERk1UX0RYVDU7CiAgICAgICAgfQogICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID09IE1BS0VGT1VSQ0MoJ0cnLCAnUicsICdHJywgJ0InKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0c4UjhfRzhCODsKICAgICAgICB9CiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnUicsICdHJywgJ0InLCAnRycpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfUjhHOF9COEc4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOyAgLyogQWJ1c2UgdGhpcyBhcyBhIGVycm9yIHZhbHVlICovCiAgICB9CiAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0JVTVBEVURWKQogICAgewogICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTEuZHdCdW1wQml0Q291bnQgICAgICAgICA9PSAxNiAgICAgICAgKSAmJgogICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTIuZHdCdW1wRHVCaXRNYXNrICAgICAgICA9PSAweDAwMDAwMGZmKSAmJgogICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTMuZHdCdW1wRHZCaXRNYXNrICAgICAgICA9PSAweDAwMDBmZjAwKSAmJgogICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9PSAweDAwMDAwMDAwKSApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9WOFU4OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICggKEREUGl4ZWxGb3JtYXQtPnUxLmR3QnVtcEJpdENvdW50ICAgICAgICAgPT0gMTYgICAgICAgICkgJiYKICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUyLmR3QnVtcER1Qml0TWFzayAgICAgICAgPT0gMHgwMDAwMDAxZikgJiYKICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayAgICAgICAgPT0gMHgwMDAwMDNlMCkgJiYKICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPT0gMHgwMDAwZmMwMCkgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfTDZWNVU1OwogICAgICAgIH0KICAgIH0KCiAgICBFUlIoIlVua25vd24gUGl4ZWxmb3JtYXQhXG4iKTsKICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBWYXJpb3VzIGR1bXBpbmcgZnVuY3Rpb25zLgogKgogKiBUaGV5IHdyaXRlIHRoZSBjb250ZW50cyBvZiBhIHNwZWNpZmljIGZ1bmN0aW9uIHRvIGEgRFBSSU5URi4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApERFJBV19kdW1wX0RXT1JEKGNvbnN0IHZvaWQgKmluKQp7CiAgICBEUFJJTlRGKCIlZCIsICooKGNvbnN0IERXT1JEICopIGluKSk7Cn0Kc3RhdGljIHZvaWQKRERSQVdfZHVtcF9QVFIoY29uc3Qgdm9pZCAqaW4pCnsKICAgIERQUklOVEYoIiVwIiwgKigoY29uc3Qgdm9pZCAqIGNvbnN0KikgaW4pKTsKfQp2b2lkCkREUkFXX2R1bXBfRERDT0xPUktFWShjb25zdCBERENPTE9SS0VZICpkZGNrKQp7CiAgICBEUFJJTlRGKCIgTG93IDogJWQgIC0gSGlnaCA6ICVkIiwgZGRjay0+ZHdDb2xvclNwYWNlTG93VmFsdWUsIGRkY2stPmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSk7Cn0Kdm9pZCBERFJBV19kdW1wX0REU0NBUFMyKGNvbnN0IEREU0NBUFMyICppbikKewogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0gewogICAgICAgIEZFKEREU0NBUFNfUkVTRVJWRUQxKSwKICAgICAgICBGRShERFNDQVBTX0FMUEhBKSwKICAgICAgICBGRShERFNDQVBTX0JBQ0tCVUZGRVIpLAogICAgICAgIEZFKEREU0NBUFNfQ09NUExFWCksCiAgICAgICAgRkUoRERTQ0FQU19GTElQKSwKICAgICAgICBGRShERFNDQVBTX0ZST05UQlVGRkVSKSwKICAgICAgICBGRShERFNDQVBTX09GRlNDUkVFTlBMQUlOKSwKICAgICAgICBGRShERFNDQVBTX09WRVJMQVkpLAogICAgICAgIEZFKEREU0NBUFNfUEFMRVRURSksCiAgICAgICAgRkUoRERTQ0FQU19QUklNQVJZU1VSRkFDRSksCiAgICAgICAgRkUoRERTQ0FQU19QUklNQVJZU1VSRkFDRUxFRlQpLAogICAgICAgIEZFKEREU0NBUFNfU1lTVEVNTUVNT1JZKSwKICAgICAgICBGRShERFNDQVBTX1RFWFRVUkUpLAogICAgICAgIEZFKEREU0NBUFNfM0RERVZJQ0UpLAogICAgICAgIEZFKEREU0NBUFNfVklERU9NRU1PUlkpLAogICAgICAgIEZFKEREU0NBUFNfVklTSUJMRSksCiAgICAgICAgRkUoRERTQ0FQU19XUklURU9OTFkpLAogICAgICAgIEZFKEREU0NBUFNfWkJVRkZFUiksCiAgICAgICAgRkUoRERTQ0FQU19PV05EQyksCiAgICAgICAgRkUoRERTQ0FQU19MSVZFVklERU8pLAogICAgICAgIEZFKEREU0NBUFNfSFdDT0RFQyksCiAgICAgICAgRkUoRERTQ0FQU19NT0RFWCksCiAgICAgICAgRkUoRERTQ0FQU19NSVBNQVApLAogICAgICAgIEZFKEREU0NBUFNfUkVTRVJWRUQyKSwKICAgICAgICBGRShERFNDQVBTX0FMTE9DT05MT0FEKSwKICAgICAgICBGRShERFNDQVBTX1ZJREVPUE9SVCksCiAgICAgICAgRkUoRERTQ0FQU19MT0NBTFZJRE1FTSksCiAgICAgICAgRkUoRERTQ0FQU19OT05MT0NBTFZJRE1FTSksCiAgICAgICAgRkUoRERTQ0FQU19TVEFOREFSRFZHQU1PREUpLAogICAgICAgIEZFKEREU0NBUFNfT1BUSU1JWkVEKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3MyW10gPSB7CiAgICAgICAgRkUoRERTQ0FQUzJfSEFSRFdBUkVERUlOVEVSTEFDRSksCiAgICAgICAgRkUoRERTQ0FQUzJfSElOVERZTkFNSUMpLAogICAgICAgIEZFKEREU0NBUFMyX0hJTlRTVEFUSUMpLAogICAgICAgIEZFKEREU0NBUFMyX1RFWFRVUkVNQU5BR0UpLAogICAgICAgIEZFKEREU0NBUFMyX1JFU0VSVkVEMSksCiAgICAgICAgRkUoRERTQ0FQUzJfUkVTRVJWRUQyKSwKICAgICAgICBGRShERFNDQVBTMl9PUEFRVUUpLAogICAgICAgIEZFKEREU0NBUFMyX0hJTlRBTlRJQUxJQVNJTkcpLAogICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVApLAogICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVYKSwKICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX05FR0FUSVZFWCksCiAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVkpLAogICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVZKSwKICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX1BPU0lUSVZFWiksCiAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9ORUdBVElWRVopLAogICAgICAgIEZFKEREU0NBUFMyX01JUE1BUFNVQkxFVkVMKSwKICAgICAgICBGRShERFNDQVBTMl9EM0RURVhUVVJFTUFOQUdFKSwKICAgICAgICBGRShERFNDQVBTMl9ET05PVFBFUlNJU1QpLAogICAgICAgIEZFKEREU0NBUFMyX1NURVJFT1NVUkZBQ0VMRUZUKQogICAgfTsKCiAgICBERFJBV19kdW1wX2ZsYWdzXyhpbi0+ZHdDYXBzLCBmbGFncywgc2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pLCAwKTsKICAgIEREUkFXX2R1bXBfZmxhZ3NfKGluLT5kd0NhcHMyLCBmbGFnczIsIHNpemVvZihmbGFnczIpL3NpemVvZihmbGFnczJbMF0pLCAwKTsKfQoKdm9pZApERFJBV19kdW1wX0REU0NBUFMoY29uc3QgRERTQ0FQUyAqaW4pCnsKICAgIEREU0NBUFMyIGluX2JpczsKCiAgICBpbl9iaXMuZHdDYXBzID0gaW4tPmR3Q2FwczsKICAgIGluX2Jpcy5kd0NhcHMyID0gMDsKICAgIGluX2Jpcy5kd0NhcHMzID0gMDsKICAgIGluX2Jpcy5kd0NhcHM0ID0gMDsKCiAgICBERFJBV19kdW1wX0REU0NBUFMyKCZpbl9iaXMpOwp9Cgp2b2lkCkREUkFXX2R1bXBfZmxhZ3NfKERXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICBjb25zdCBmbGFnX2luZm8qIG5hbWVzLAogICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX25hbWVzLAogICAgICAgICAgICAgICAgICBpbnQgbmV3bGluZSkKewogICAgdW5zaWduZWQgaW50CWk7CgogICAgZm9yIChpPTA7IGkgPCBudW1fbmFtZXM7IGkrKykKICAgICAgICBpZiAoKGZsYWdzICYgbmFtZXNbaV0udmFsKSB8fCAgICAgIC8qIHN0YW5kYXJkIGZsYWcgdmFsdWUgKi8KICAgICAgICAgICAgKCghZmxhZ3MpICYmICghbmFtZXNbaV0udmFsKSkpIC8qIHplcm8gdmFsdWUgb25seSAqLwogICAgICAgICAgICBEUFJJTlRGKCIlcyAiLCBuYW1lc1tpXS5uYW1lKTsKCiAgICBpZiAobmV3bGluZSkKICAgICAgICBEUFJJTlRGKCJcbiIpOwp9Cgp2b2lkCkREUkFXX2R1bXBfcGl4ZWxmb3JtYXRfZmxhZyhEV09SRCBmbGFnbWFzaykKewogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KICAgICAgICB7CiAgICAgICAgICAgIEZFKEREUEZfQUxQSEFQSVhFTFMpLAogICAgICAgICAgICBGRShERFBGX0FMUEhBKSwKICAgICAgICAgICAgRkUoRERQRl9GT1VSQ0MpLAogICAgICAgICAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVENCksCiAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRURUTzgpLAogICAgICAgICAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVEOCksCiAgICAgICAgICAgIEZFKEREUEZfUkdCKSwKICAgICAgICAgICAgRkUoRERQRl9DT01QUkVTU0VEKSwKICAgICAgICAgICAgRkUoRERQRl9SR0JUT1lVViksCiAgICAgICAgICAgIEZFKEREUEZfWVVWKSwKICAgICAgICAgICAgRkUoRERQRl9aQlVGRkVSKSwKICAgICAgICAgICAgRkUoRERQRl9QQUxFVFRFSU5ERVhFRDEpLAogICAgICAgICAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVEMiksCiAgICAgICAgICAgIEZFKEREUEZfWlBJWEVMUykKICAgIH07CgogICAgRERSQVdfZHVtcF9mbGFnc18oZmxhZ21hc2ssIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSksIDApOwp9Cgp2b2lkCkREUkFXX2R1bXBfbWVtYmVycyhEV09SRCBmbGFncywKICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsCiAgICAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJfaW5mbyogbWVtcywKICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fbWVtcykKewogICAgdW5zaWduZWQgaW50IGk7CgogICAgZm9yIChpPTA7IGkgPCBudW1fbWVtczsgaSsrKQogICAgewogICAgICAgIGlmIChtZW1zW2ldLnZhbCAmIGZsYWdzKQogICAgICAgIHsKICAgICAgICAgICAgRFBSSU5URigiIC0gJXMgOiAiLCBtZW1zW2ldLm5hbWUpOwogICAgICAgICAgICBtZW1zW2ldLmZ1bmMoKGNvbnN0IGNoYXIgKilkYXRhICsgbWVtc1tpXS5vZmZzZXQpOwogICAgICAgICAgICBEUFJJTlRGKCJcbiIpOwogICAgICAgIH0KICAgIH0KfQoKdm9pZApERFJBV19kdW1wX3BpeGVsZm9ybWF0KGNvbnN0IEREUElYRUxGT1JNQVQgKnBmKQp7CiAgICBEUFJJTlRGKCIoICIpOwogICAgRERSQVdfZHVtcF9waXhlbGZvcm1hdF9mbGFnKHBmLT5kd0ZsYWdzKTsKICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfRk9VUkNDKQogICAgewogICAgICAgIERQUklOVEYoIiwgZHdGb3VyQ0MgY29kZSAnJWMlYyVjJWMnICgweCUwOHgpIC0gJWQgYml0cyBwZXIgcGl4ZWwiLAogICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKCBwZi0+ZHdGb3VyQ0MgICAgICYweGZmKSwKICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSgocGYtPmR3Rm91ckNDPj4gOCkmMHhmZiksCiAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikoKHBmLT5kd0ZvdXJDQz4+MTYpJjB4ZmYpLAogICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKChwZi0+ZHdGb3VyQ0M+PjI0KSYweGZmKSwKICAgICAgICAgICAgICAgIHBmLT5kd0ZvdXJDQywKICAgICAgICAgICAgICAgIHBmLT51MS5kd1lVVkJpdENvdW50CiAgICAgICAgKTsKICAgIH0KICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfUkdCKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgKmNtZDsKICAgICAgICBEUFJJTlRGKCIsIFJHQiBiaXRzOiAlZCwgIiwgcGYtPnUxLmR3UkdCQml0Q291bnQpOwogICAgICAgIHN3aXRjaCAocGYtPnUxLmR3UkdCQml0Q291bnQpCiAgICAgICAgewogICAgICAgIGNhc2UgNDogY21kID0gIiUxbHgiOyBicmVhazsKICAgICAgICBjYXNlIDg6IGNtZCA9ICIlMDJseCI7IGJyZWFrOwogICAgICAgIGNhc2UgMTY6IGNtZCA9ICIlMDRseCI7IGJyZWFrOwogICAgICAgIGNhc2UgMjQ6IGNtZCA9ICIlMDZseCI7IGJyZWFrOwogICAgICAgIGNhc2UgMzI6IGNtZCA9ICIlMDhseCI7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IEVSUigiVW5leHBlY3RlZCBiaXQgZGVwdGggIVxuIik7IGNtZCA9ICIlZCI7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBEUFJJTlRGKCIgUiAiKTsgRFBSSU5URihjbWQsIHBmLT51Mi5kd1JCaXRNYXNrKTsKICAgICAgICBEUFJJTlRGKCIgRyAiKTsgRFBSSU5URihjbWQsIHBmLT51My5kd0dCaXRNYXNrKTsKICAgICAgICBEUFJJTlRGKCIgQiAiKTsgRFBSSU5URihjbWQsIHBmLT51NC5kd0JCaXRNYXNrKTsKICAgICAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKQogICAgICAgIHsKICAgICAgICAgICAgRFBSSU5URigiIEEgIik7IERQUklOVEYoY21kLCBwZi0+dTUuZHdSR0JBbHBoYUJpdE1hc2spOwogICAgICAgIH0KICAgICAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX1pQSVhFTFMpCiAgICAgICAgewogICAgICAgICAgICBEUFJJTlRGKCIgWiAiKTsgRFBSSU5URihjbWQsIHBmLT51NS5kd1JHQlpCaXRNYXNrKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX1pCVUZGRVIpCiAgICB7CiAgICAgICAgRFBSSU5URigiLCBaIGJpdHMgOiAlZCIsIHBmLT51MS5kd1pCdWZmZXJCaXREZXB0aCk7CiAgICB9CiAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBKQogICAgewogICAgICAgIERQUklOVEYoIiwgQWxwaGEgYml0cyA6ICVkIiwgcGYtPnUxLmR3QWxwaGFCaXREZXB0aCk7CiAgICB9CiAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0JVTVBEVURWKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgKmNtZCA9ICIlMDhseCI7CiAgICAgICAgRFBSSU5URigiLCBCdW1wIGJpdHM6ICVkLCAiLCBwZi0+dTEuZHdCdW1wQml0Q291bnQpOwogICAgICAgIERQUklOVEYoIiBVICIpOyBEUFJJTlRGKGNtZCwgcGYtPnUyLmR3QnVtcER1Qml0TWFzayk7CiAgICAgICAgRFBSSU5URigiIFYgIik7IERQUklOVEYoY21kLCBwZi0+dTMuZHdCdW1wRHZCaXRNYXNrKTsKICAgICAgICBEUFJJTlRGKCIgTCAiKTsgRFBSSU5URihjbWQsIHBmLT51NC5kd0J1bXBMdW1pbmFuY2VCaXRNYXNrKTsKICAgIH0KICAgIERQUklOVEYoIikiKTsKfQoKdm9pZCBERFJBV19kdW1wX3N1cmZhY2VfZGVzYyhjb25zdCBERFNVUkZBQ0VERVNDMiAqbHBkZHNkKQp7CiNkZWZpbmUgU1RSVUNUIEREU1VSRkFDRURFU0MyCiAgICBzdGF0aWMgY29uc3QgbWVtYmVyX2luZm8gbWVtYmVyc1tdID0KICAgICAgICB7CiAgICAgICAgICAgIE1FKEREU0RfSEVJR0hULCBERFJBV19kdW1wX0RXT1JELCBkd0hlaWdodCksCiAgICAgICAgICAgIE1FKEREU0RfV0lEVEgsIEREUkFXX2R1bXBfRFdPUkQsIGR3V2lkdGgpLAogICAgICAgICAgICBNRShERFNEX1BJVENILCBERFJBV19kdW1wX0RXT1JELCB1MSAvKiBsUGl0Y2ggKi8pLAogICAgICAgICAgICBNRShERFNEX0xJTkVBUlNJWkUsIEREUkFXX2R1bXBfRFdPUkQsIHUxIC8qIGR3TGluZWFyU2l6ZSAqLyksCiAgICAgICAgICAgIE1FKEREU0RfQkFDS0JVRkZFUkNPVU5ULCBERFJBV19kdW1wX0RXT1JELCBkd0JhY2tCdWZmZXJDb3VudCksCiAgICAgICAgICAgIE1FKEREU0RfTUlQTUFQQ09VTlQsIEREUkFXX2R1bXBfRFdPUkQsIHUyIC8qIGR3TWlwTWFwQ291bnQgKi8pLAogICAgICAgICAgICBNRShERFNEX1pCVUZGRVJCSVRERVBUSCwgRERSQVdfZHVtcF9EV09SRCwgdTIgLyogZHdaQnVmZmVyQml0RGVwdGggKi8pLCAvKiBUaGlzIGlzIGZvciAnb2xkLXN0eWxlJyBEM0QgKi8KICAgICAgICAgICAgTUUoRERTRF9SRUZSRVNIUkFURSwgRERSQVdfZHVtcF9EV09SRCwgdTIgLyogZHdSZWZyZXNoUmF0ZSAqLyksCiAgICAgICAgICAgIE1FKEREU0RfQUxQSEFCSVRERVBUSCwgRERSQVdfZHVtcF9EV09SRCwgZHdBbHBoYUJpdERlcHRoKSwKICAgICAgICAgICAgTUUoRERTRF9MUFNVUkZBQ0UsIEREUkFXX2R1bXBfUFRSLCBscFN1cmZhY2UpLAogICAgICAgICAgICBNRShERFNEX0NLREVTVE9WRVJMQVksIEREUkFXX2R1bXBfRERDT0xPUktFWSwgdTMgLyogZGRja0NLRGVzdE92ZXJsYXkgKi8pLAogICAgICAgICAgICBNRShERFNEX0NLREVTVEJMVCwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCBkZGNrQ0tEZXN0Qmx0KSwKICAgICAgICAgICAgTUUoRERTRF9DS1NSQ09WRVJMQVksIEREUkFXX2R1bXBfRERDT0xPUktFWSwgZGRja0NLU3JjT3ZlcmxheSksCiAgICAgICAgICAgIE1FKEREU0RfQ0tTUkNCTFQsIEREUkFXX2R1bXBfRERDT0xPUktFWSwgZGRja0NLU3JjQmx0KSwKICAgICAgICAgICAgTUUoRERTRF9QSVhFTEZPUk1BVCwgRERSQVdfZHVtcF9waXhlbGZvcm1hdCwgdTQgLyogZGRwZlBpeGVsRm9ybWF0ICovKQogICAgICAgIH07CiAgICBzdGF0aWMgY29uc3QgbWVtYmVyX2luZm8gbWVtYmVyc19jYXBzW10gPQogICAgICAgIHsKICAgICAgICAgICAgTUUoRERTRF9DQVBTLCBERFJBV19kdW1wX0REU0NBUFMsIGRkc0NhcHMpCiAgICAgICAgfTsKICAgIHN0YXRpYyBjb25zdCBtZW1iZXJfaW5mbyBtZW1iZXJzX2NhcHMyW10gPQogICAgICAgIHsKICAgICAgICAgICAgTUUoRERTRF9DQVBTLCBERFJBV19kdW1wX0REU0NBUFMyLCBkZHNDYXBzKQogICAgICAgIH07CiN1bmRlZiBTVFJVQ1QKCiAgICBpZiAoTlVMTCA9PSBscGRkc2QpCiAgICB7CiAgICAgICAgRFBSSU5URigiKG51bGwpXG4iKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYgKGxwZGRzZC0+ZHdTaXplID49IHNpemVvZihERFNVUkZBQ0VERVNDMikpCiAgICAgIHsKICAgICAgICAgIEREUkFXX2R1bXBfbWVtYmVycyhscGRkc2QtPmR3RmxhZ3MsIGxwZGRzZCwgbWVtYmVyc19jYXBzMiwgMSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICBERFJBV19kdW1wX21lbWJlcnMobHBkZHNkLT5kd0ZsYWdzLCBscGRkc2QsIG1lbWJlcnNfY2FwcywgMSk7CiAgICAgIH0KICAgICAgRERSQVdfZHVtcF9tZW1iZXJzKGxwZGRzZC0+ZHdGbGFncywgbHBkZHNkLCBtZW1iZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtZW1iZXJzKS9zaXplb2YobWVtYmVyc1swXSkpOwogICAgfQp9Cgp2b2lkCmR1bXBfRDNETUFUUklYKEQzRE1BVFJJWCAqbWF0KQp7CiAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl8xMSwgbWF0LT5fMTIsIG1hdC0+XzEzLCBtYXQtPl8xNCk7CiAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl8yMSwgbWF0LT5fMjIsIG1hdC0+XzIzLCBtYXQtPl8yNCk7CiAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl8zMSwgbWF0LT5fMzIsIG1hdC0+XzMzLCBtYXQtPl8zNCk7CiAgICBEUFJJTlRGKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl80MSwgbWF0LT5fNDIsIG1hdC0+XzQzLCBtYXQtPl80NCk7Cn0KCkRXT1JECmdldF9mbGV4aWJsZV92ZXJ0ZXhfc2l6ZShEV09SRCBkM2R2dFZlcnRleFR5cGUpCnsKICAgIERXT1JEIHNpemUgPSAwOwogICAgaW50IGk7CgogICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9OT1JNQUwpIHNpemUgKz0gMyAqIHNpemVvZihEM0RWQUxVRSk7CiAgICBpZiAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX0RJRkZVU0UpIHNpemUgKz0gc2l6ZW9mKERXT1JEKTsKICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfU1BFQ1VMQVIpIHNpemUgKz0gc2l6ZW9mKERXT1JEKTsKICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfUkVTRVJWRUQxKSBzaXplICs9IHNpemVvZihEV09SRCk7CiAgICBzd2l0Y2ggKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKQogICAgewogICAgICAgIGNhc2UgRDNERlZGX1hZWjogc2l6ZSArPSAzICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RGVkZfWFlaUkhXOiBzaXplICs9IDQgKiBzaXplb2YoRDNEVkFMVUUpOyBicmVhazsKICAgICAgICBkZWZhdWx0OiBUUkFDRSgiIG1hdHJpeCB3ZWlnaHRpbmcgbm90IGhhbmRsZWQgeWV0Li4uXG4iKTsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBHRVRfVEVYQ09VTlRfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlKTsgaSsrKQogICAgewogICAgICAgIHNpemUgKz0gR0VUX1RFWENPT1JEX1NJWkVfRlJPTV9GVkYoZDNkdnRWZXJ0ZXhUeXBlLCBpKSAqIHNpemVvZihEM0RWQUxVRSk7CiAgICB9CgogICAgcmV0dXJuIHNpemU7Cn0KCnZvaWQgRERSQVdfQ29udmVydF9ERFNDQVBTXzFfVG9fMihjb25zdCBERFNDQVBTKiBwSW4sIEREU0NBUFMyKiBwT3V0KQp7CiAgICAvKiAyIGFkZHMgdGhyZWUgYWRkaXRpb25hbCBjYXBzIGZpZWxkcyB0byB0aGUgZW5kLiBCb3RoIHZlcnNpb25zCiAgICAgKiBhcmUgdW52ZXJzaW9uZWQuICovCiAgICBwT3V0LT5kd0NhcHMgPSBwSW4tPmR3Q2FwczsKICAgIHBPdXQtPmR3Q2FwczIgPSAwOwogICAgcE91dC0+ZHdDYXBzMyA9IDA7CiAgICBwT3V0LT5kd0NhcHM0ID0gMDsKfQoKdm9pZCBERFJBV19Db252ZXJ0X0REREVWSUNFSURFTlRJRklFUl8yX1RvXzEoY29uc3QgRERERVZJQ0VJREVOVElGSUVSMiogcEluLCBERERFVklDRUlERU5USUZJRVIqIHBPdXQpCnsKICAgIC8qIDIgYWRkcyBhIGR3V0hRTExldmVsIGZpZWxkIHRvIHRoZSBlbmQuIEJvdGggc3RydWN0dXJlcyBhcmUKICAgICAqIHVudmVyc2lvbmVkLiAqLwogICAgbWVtY3B5KHBPdXQsIHBJbiwgc2l6ZW9mKCpwT3V0KSk7Cn0KCnZvaWQgRERSQVdfZHVtcF9jb29wZXJhdGl2ZWxldmVsKERXT1JEIGNvb3BsZXZlbCkKewogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KICAgICAgICB7CiAgICAgICAgICAgIEZFKEREU0NMX0ZVTExTQ1JFRU4pLAogICAgICAgICAgICBGRShERFNDTF9BTExPV1JFQk9PVCksCiAgICAgICAgICAgIEZFKEREU0NMX05PV0lORE9XQ0hBTkdFUyksCiAgICAgICAgICAgIEZFKEREU0NMX05PUk1BTCksCiAgICAgICAgICAgIEZFKEREU0NMX0FMTE9XTU9ERVgpLAogICAgICAgICAgICBGRShERFNDTF9FWENMVVNJVkUpLAogICAgICAgICAgICBGRShERFNDTF9TRVRGT0NVU1dJTkRPVyksCiAgICAgICAgICAgIEZFKEREU0NMX1NFVERFVklDRVdJTkRPVyksCiAgICAgICAgICAgIEZFKEREU0NMX0NSRUFURURFVklDRVdJTkRPVykKICAgIH07CgogICAgaWYgKFRSQUNFX09OKGRkcmF3KSkKICAgIHsKICAgICAgICBEUFJJTlRGKCIgLSAiKTsKICAgICAgICBERFJBV19kdW1wX2ZsYWdzKGNvb3BsZXZlbCwgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSk7CiAgICB9Cn0KCnZvaWQgRERSQVdfZHVtcF9ERENBUFMoY29uc3QgRERDQVBTICpscGNhcHMpCnsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3MxW10gPQogICAgewogICAgICBGRShERENBUFNfM0QpLAogICAgICBGRShERENBUFNfQUxJR05CT1VOREFSWURFU1QpLAogICAgICBGRShERENBUFNfQUxJR05TSVpFREVTVCksCiAgICAgIEZFKEREQ0FQU19BTElHTkJPVU5EQVJZU1JDKSwKICAgICAgRkUoRERDQVBTX0FMSUdOU0laRVNSQyksCiAgICAgIEZFKEREQ0FQU19BTElHTlNUUklERSksCiAgICAgIEZFKEREQ0FQU19CTFQpLAogICAgICBGRShERENBUFNfQkxUUVVFVUUpLAogICAgICBGRShERENBUFNfQkxURk9VUkNDKSwKICAgICAgRkUoRERDQVBTX0JMVFNUUkVUQ0gpLAogICAgICBGRShERENBUFNfR0RJKSwKICAgICAgRkUoRERDQVBTX09WRVJMQVkpLAogICAgICBGRShERENBUFNfT1ZFUkxBWUNBTlRDTElQKSwKICAgICAgRkUoRERDQVBTX09WRVJMQVlGT1VSQ0MpLAogICAgICBGRShERENBUFNfT1ZFUkxBWVNUUkVUQ0gpLAogICAgICBGRShERENBUFNfUEFMRVRURSksCiAgICAgIEZFKEREQ0FQU19QQUxFVFRFVlNZTkMpLAogICAgICBGRShERENBUFNfUkVBRFNDQU5MSU5FKSwKICAgICAgRkUoRERDQVBTX1NURVJFT1ZJRVcpLAogICAgICBGRShERENBUFNfVkJJKSwKICAgICAgRkUoRERDQVBTX1pCTFRTKSwKICAgICAgRkUoRERDQVBTX1pPVkVSTEFZUyksCiAgICAgIEZFKEREQ0FQU19DT0xPUktFWSksCiAgICAgIEZFKEREQ0FQU19BTFBIQSksCiAgICAgIEZFKEREQ0FQU19DT0xPUktFWUhXQVNTSVNUKSwKICAgICAgRkUoRERDQVBTX05PSEFSRFdBUkUpLAogICAgICBGRShERENBUFNfQkxUQ09MT1JGSUxMKSwKICAgICAgRkUoRERDQVBTX0JBTktTV0lUQ0hFRCksCiAgICAgIEZFKEREQ0FQU19CTFRERVBUSEZJTEwpLAogICAgICBGRShERENBUFNfQ0FOQ0xJUCksCiAgICAgIEZFKEREQ0FQU19DQU5DTElQU1RSRVRDSEVEKSwKICAgICAgRkUoRERDQVBTX0NBTkJMVFNZU01FTSkKICAgIH07CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzMltdID0KICAgIHsKICAgICAgRkUoRERDQVBTMl9DRVJUSUZJRUQpLAogICAgICBGRShERENBUFMyX05PMkREVVJJTkczRFNDRU5FKSwKICAgICAgRkUoRERDQVBTMl9WSURFT1BPUlQpLAogICAgICBGRShERENBUFMyX0FVVE9GTElQT1ZFUkxBWSksCiAgICAgIEZFKEREQ0FQUzJfQ0FOQk9CSU5URVJMRUFWRUQpLAogICAgICBGRShERENBUFMyX0NBTkJPQk5PTklOVEVSTEVBVkVEKSwKICAgICAgRkUoRERDQVBTMl9DT0xPUkNPTlRST0xPVkVSTEFZKSwKICAgICAgRkUoRERDQVBTMl9DT0xPUkNPTlRST0xQUklNQVJZKSwKICAgICAgRkUoRERDQVBTMl9DQU5EUk9QWjE2QklUKSwKICAgICAgRkUoRERDQVBTMl9OT05MT0NBTFZJRE1FTSksCiAgICAgIEZFKEREQ0FQUzJfTk9OTE9DQUxWSURNRU1DQVBTKSwKICAgICAgRkUoRERDQVBTMl9OT1BBR0VMT0NLUkVRVUlSRUQpLAogICAgICBGRShERENBUFMyX1dJREVTVVJGQUNFUyksCiAgICAgIEZFKEREQ0FQUzJfQ0FORkxJUE9EREVWRU4pLAogICAgICBGRShERENBUFMyX0NBTkJPQkhBUkRXQVJFKSwKICAgICAgRkUoRERDQVBTMl9DT1BZRk9VUkNDKSwKICAgICAgRkUoRERDQVBTMl9QUklNQVJZR0FNTUEpLAogICAgICBGRShERENBUFMyX0NBTlJFTkRFUldJTkRPV0VEKSwKICAgICAgRkUoRERDQVBTMl9DQU5DQUxJQlJBVEVHQU1NQSksCiAgICAgIEZFKEREQ0FQUzJfRkxJUElOVEVSVkFMKSwKICAgICAgRkUoRERDQVBTMl9GTElQTk9WU1lOQyksCiAgICAgIEZFKEREQ0FQUzJfQ0FOTUFOQUdFVEVYVFVSRSksCiAgICAgIEZFKEREQ0FQUzJfVEVYTUFOSU5OT05MT0NBTFZJRE1FTSksCiAgICAgIEZFKEREQ0FQUzJfU1RFUkVPKSwKICAgICAgRkUoRERDQVBTMl9TWVNUT05PTkxPQ0FMX0FTX1NZU1RPTE9DQUwpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczNbXSA9CiAgICB7CiAgICAgIEZFKEREQ0tFWUNBUFNfREVTVEJMVCksCiAgICAgIEZFKEREQ0tFWUNBUFNfREVTVEJMVENMUlNQQUNFKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUQkxUQ0xSU1BBQ0VZVVYpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RCTFRZVVYpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUT1ZFUkxBWUNMUlNQQUNFKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUT1ZFUkxBWUNMUlNQQUNFWVVWKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUT1ZFUkxBWU9ORUFDVElWRSksCiAgICAgIEZFKEREQ0tFWUNBUFNfREVTVE9WRVJMQVlZVVYpLAogICAgICBGRShERENLRVlDQVBTX1NSQ0JMVCksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDQkxUQ0xSU1BBQ0UpLAogICAgICBGRShERENLRVlDQVBTX1NSQ0JMVENMUlNQQUNFWVVWKSwKICAgICAgRkUoRERDS0VZQ0FQU19TUkNCTFRZVVYpLAogICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVkpLAogICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVlDTFJTUEFDRSksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDT1ZFUkxBWUNMUlNQQUNFWVVWKSwKICAgICAgRkUoRERDS0VZQ0FQU19TUkNPVkVSTEFZT05FQUNUSVZFKSwKICAgICAgRkUoRERDS0VZQ0FQU19TUkNPVkVSTEFZWVVWKSwKICAgICAgRkUoRERDS0VZQ0FQU19OT0NPU1RPVkVSTEFZKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M0W10gPQogICAgewogICAgICBGRShEREZYQ0FQU19CTFRBTFBIQSksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlBTFBIQSksCiAgICAgIEZFKERERlhDQVBTX0JMVEFSSVRIU1RSRVRDSFlOKSwKICAgICAgRkUoRERGWENBUFNfQkxUQVJJVEhTVFJFVENIWSksCiAgICAgIEZFKERERlhDQVBTX0JMVE1JUlJPUkxFRlRSSUdIVCksCiAgICAgIEZFKERERlhDQVBTX0JMVE1JUlJPUlVQRE9XTiksCiAgICAgIEZFKERERlhDQVBTX0JMVFJPVEFUSU9OKSwKICAgICAgRkUoRERGWENBUFNfQkxUUk9UQVRJT045MCksCiAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1gpLAogICAgICBGRShEREZYQ0FQU19CTFRTSFJJTktYTiksCiAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1kpLAogICAgICBGRShEREZYQ0FQU19CTFRTSFJJTktZTiksCiAgICAgIEZFKERERlhDQVBTX0JMVFNUUkVUQ0hYKSwKICAgICAgRkUoRERGWENBUFNfQkxUU1RSRVRDSFhOKSwKICAgICAgRkUoRERGWENBUFNfQkxUU1RSRVRDSFkpLAogICAgICBGRShEREZYQ0FQU19CTFRTVFJFVENIWU4pLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZQVJJVEhTVFJFVENIWSksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlBUklUSFNUUkVUQ0hZTiksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTSFJJTktYKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNIUklOS1hOKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNIUklOS1kpLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU0hSSU5LWU4pLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFgpLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFhOKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNUUkVUQ0hZKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNUUkVUQ0hZTiksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlNSVJST1JMRUZUUklHSFQpLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZTUlSUk9SVVBET1dOKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M1W10gPQogICAgewogICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBRURHRUJMRU5EKSwKICAgICAgRkUoRERGWEFMUEhBQ0FQU19CTFRBTFBIQVBJWEVMUyksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfQkxUQUxQSEFQSVhFTFNORUcpLAogICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBU1VSRkFDRVMpLAogICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBU1VSRkFDRVNORUcpLAogICAgICBGRShEREZYQUxQSEFDQVBTX09WRVJMQVlBTFBIQUVER0VCTEVORCksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBUElYRUxTKSwKICAgICAgRkUoRERGWEFMUEhBQ0FQU19PVkVSTEFZQUxQSEFQSVhFTFNORUcpLAogICAgICBGRShEREZYQUxQSEFDQVBTX09WRVJMQVlBTFBIQVNVUkZBQ0VTKSwKICAgICAgRkUoRERGWEFMUEhBQ0FQU19PVkVSTEFZQUxQSEFTVVJGQUNFU05FRykKICAgIH07CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzNltdID0KICAgIHsKICAgICAgRkUoRERQQ0FQU180QklUKSwKICAgICAgRkUoRERQQ0FQU184QklURU5UUklFUyksCiAgICAgIEZFKEREUENBUFNfOEJJVCksCiAgICAgIEZFKEREUENBUFNfSU5JVElBTElaRSksCiAgICAgIEZFKEREUENBUFNfUFJJTUFSWVNVUkZBQ0UpLAogICAgICBGRShERFBDQVBTX1BSSU1BUllTVVJGQUNFTEVGVCksCiAgICAgIEZFKEREUENBUFNfQUxMT1cyNTYpLAogICAgICBGRShERFBDQVBTX1ZTWU5DKSwKICAgICAgRkUoRERQQ0FQU18xQklUKSwKICAgICAgRkUoRERQQ0FQU18yQklUKSwKICAgICAgRkUoRERQQ0FQU19BTFBIQSksCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczdbXSA9CiAgICB7CiAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVEMSksCiAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVEMiksCiAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVEMyksCiAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVENCksCiAgICAgIEZFKEREU1ZDQVBTX1NURVJFT1NFUVVFTlRJQUwpLAogICAgfTsKCiAgICBEUFJJTlRGKCIgLSBkd1NpemUgOiAlZFxuIiwgbHBjYXBzLT5kd1NpemUpOwogICAgRFBSSU5URigiIC0gZHdDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0NhcHMsIGZsYWdzMSwgc2l6ZW9mKGZsYWdzMSkvc2l6ZW9mKGZsYWdzMVswXSkpOwogICAgRFBSSU5URigiIC0gZHdDYXBzMiA6ICIpOyBERFJBV19kdW1wX2ZsYWdzKGxwY2Fwcy0+ZHdDYXBzMiwgZmxhZ3MyLCBzaXplb2YoZmxhZ3MyKS9zaXplb2YoZmxhZ3MyWzBdKSk7CiAgICBEUFJJTlRGKCIgLSBkd0NLZXlDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0NLZXlDYXBzLCBmbGFnczMsIHNpemVvZihmbGFnczMpL3NpemVvZihmbGFnczNbMF0pKTsKICAgIERQUklOVEYoIiAtIGR3RlhDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0ZYQ2FwcywgZmxhZ3M0LCBzaXplb2YoZmxhZ3M0KS9zaXplb2YoZmxhZ3M0WzBdKSk7CiAgICBEUFJJTlRGKCIgLSBkd0ZYQWxwaGFDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0ZYQWxwaGFDYXBzLCBmbGFnczUsIHNpemVvZihmbGFnczUpL3NpemVvZihmbGFnczVbMF0pKTsKICAgIERQUklOVEYoIiAtIGR3UGFsQ2FwcyA6ICIpOyBERFJBV19kdW1wX2ZsYWdzKGxwY2Fwcy0+ZHdQYWxDYXBzLCBmbGFnczYsIHNpemVvZihmbGFnczYpL3NpemVvZihmbGFnczZbMF0pKTsKICAgIERQUklOVEYoIiAtIGR3U1ZDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd1NWQ2FwcywgZmxhZ3M3LCBzaXplb2YoZmxhZ3M3KS9zaXplb2YoZmxhZ3M3WzBdKSk7CiAgICBEUFJJTlRGKCIuLi5cbiIpOwogICAgRFBSSU5URigiIC0gZHdOdW1Gb3VyQ0NDb2RlcyA6ICVkXG4iLCBscGNhcHMtPmR3TnVtRm91ckNDQ29kZXMpOwogICAgRFBSSU5URigiIC0gZHdDdXJyVmlzaWJsZU92ZXJsYXlzIDogJWRcbiIsIGxwY2Fwcy0+ZHdDdXJyVmlzaWJsZU92ZXJsYXlzKTsKICAgIERQUklOVEYoIiAtIGR3TWluT3ZlcmxheVN0cmV0Y2ggOiAlZFxuIiwgbHBjYXBzLT5kd01pbk92ZXJsYXlTdHJldGNoKTsKICAgIERQUklOVEYoIiAtIGR3TWF4T3ZlcmxheVN0cmV0Y2ggOiAlZFxuIiwgbHBjYXBzLT5kd01heE92ZXJsYXlTdHJldGNoKTsKICAgIERQUklOVEYoIi4uLlxuIik7CiAgICBEUFJJTlRGKCIgLSBkZHNDYXBzIDogIik7IEREUkFXX2R1bXBfRERTQ0FQUzIoJmxwY2Fwcy0+ZGRzQ2Fwcyk7IERQUklOVEYoIlxuIik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdWx0aXBseV9tYXRyaXgKICoKICogTXVsdGlwbGllcyAyIDR4NCBtYXRyaWNlcyBzcmMxIGFuZCBzcmMyLCBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gZGVzdC4KICoKICogUGFyYW1zOgogKiAgZGVzdDogUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWF0cml4CiAqICBzcmMxOiBQb2ludGVyIHRvIHRoZSBmaXJzdCBzb3VyY2UgbWF0cml4CiAqICBzcmMyOiBQb2ludGVyIHRvIHRoZSBzZWNvbmQgc291cmNlIG1hdHJpeAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKbXVsdGlwbHlfbWF0cml4KEQzRE1BVFJJWCAqZGVzdCwKICAgICAgICAgICAgICAgIEQzRE1BVFJJWCAqc3JjMSwKICAgICAgICAgICAgICAgIEQzRE1BVFJJWCAqc3JjMikKewogICAgRDNETUFUUklYIHRlbXA7CgogICAgLyogTm93IGRvIHRoZSBtdWx0aXBsaWNhdGlvbiAnYnkgaGFuZCcuCiAgICAgICBJIGtub3cgdGhhdCBhbGwgdGhpcyBjb3VsZCBiZSBvcHRpbWlzZWQsIGJ1dCB0aGlzIHdpbGwgYmUgZG9uZSBsYXRlciA6LSkgKi8KICAgIHRlbXAuXzExID0gKHNyYzEtPl8xMSAqIHNyYzItPl8xMSkgKyAoc3JjMS0+XzIxICogc3JjMi0+XzEyKSArIChzcmMxLT5fMzEgKiBzcmMyLT5fMTMpICsgKHNyYzEtPl80MSAqIHNyYzItPl8xNCk7CiAgICB0ZW1wLl8yMSA9IChzcmMxLT5fMTEgKiBzcmMyLT5fMjEpICsgKHNyYzEtPl8yMSAqIHNyYzItPl8yMikgKyAoc3JjMS0+XzMxICogc3JjMi0+XzIzKSArIChzcmMxLT5fNDEgKiBzcmMyLT5fMjQpOwogICAgdGVtcC5fMzEgPSAoc3JjMS0+XzExICogc3JjMi0+XzMxKSArIChzcmMxLT5fMjEgKiBzcmMyLT5fMzIpICsgKHNyYzEtPl8zMSAqIHNyYzItPl8zMykgKyAoc3JjMS0+XzQxICogc3JjMi0+XzM0KTsKICAgIHRlbXAuXzQxID0gKHNyYzEtPl8xMSAqIHNyYzItPl80MSkgKyAoc3JjMS0+XzIxICogc3JjMi0+XzQyKSArIChzcmMxLT5fMzEgKiBzcmMyLT5fNDMpICsgKHNyYzEtPl80MSAqIHNyYzItPl80NCk7CgogICAgdGVtcC5fMTIgPSAoc3JjMS0+XzEyICogc3JjMi0+XzExKSArIChzcmMxLT5fMjIgKiBzcmMyLT5fMTIpICsgKHNyYzEtPl8zMiAqIHNyYzItPl8xMykgKyAoc3JjMS0+XzQyICogc3JjMi0+XzE0KTsKICAgIHRlbXAuXzIyID0gKHNyYzEtPl8xMiAqIHNyYzItPl8yMSkgKyAoc3JjMS0+XzIyICogc3JjMi0+XzIyKSArIChzcmMxLT5fMzIgKiBzcmMyLT5fMjMpICsgKHNyYzEtPl80MiAqIHNyYzItPl8yNCk7CiAgICB0ZW1wLl8zMiA9IChzcmMxLT5fMTIgKiBzcmMyLT5fMzEpICsgKHNyYzEtPl8yMiAqIHNyYzItPl8zMikgKyAoc3JjMS0+XzMyICogc3JjMi0+XzMzKSArIChzcmMxLT5fNDIgKiBzcmMyLT5fMzQpOwogICAgdGVtcC5fNDIgPSAoc3JjMS0+XzEyICogc3JjMi0+XzQxKSArIChzcmMxLT5fMjIgKiBzcmMyLT5fNDIpICsgKHNyYzEtPl8zMiAqIHNyYzItPl80MykgKyAoc3JjMS0+XzQyICogc3JjMi0+XzQ0KTsKCiAgICB0ZW1wLl8xMyA9IChzcmMxLT5fMTMgKiBzcmMyLT5fMTEpICsgKHNyYzEtPl8yMyAqIHNyYzItPl8xMikgKyAoc3JjMS0+XzMzICogc3JjMi0+XzEzKSArIChzcmMxLT5fNDMgKiBzcmMyLT5fMTQpOwogICAgdGVtcC5fMjMgPSAoc3JjMS0+XzEzICogc3JjMi0+XzIxKSArIChzcmMxLT5fMjMgKiBzcmMyLT5fMjIpICsgKHNyYzEtPl8zMyAqIHNyYzItPl8yMykgKyAoc3JjMS0+XzQzICogc3JjMi0+XzI0KTsKICAgIHRlbXAuXzMzID0gKHNyYzEtPl8xMyAqIHNyYzItPl8zMSkgKyAoc3JjMS0+XzIzICogc3JjMi0+XzMyKSArIChzcmMxLT5fMzMgKiBzcmMyLT5fMzMpICsgKHNyYzEtPl80MyAqIHNyYzItPl8zNCk7CiAgICB0ZW1wLl80MyA9IChzcmMxLT5fMTMgKiBzcmMyLT5fNDEpICsgKHNyYzEtPl8yMyAqIHNyYzItPl80MikgKyAoc3JjMS0+XzMzICogc3JjMi0+XzQzKSArIChzcmMxLT5fNDMgKiBzcmMyLT5fNDQpOwoKICAgIHRlbXAuXzE0ID0gKHNyYzEtPl8xNCAqIHNyYzItPl8xMSkgKyAoc3JjMS0+XzI0ICogc3JjMi0+XzEyKSArIChzcmMxLT5fMzQgKiBzcmMyLT5fMTMpICsgKHNyYzEtPl80NCAqIHNyYzItPl8xNCk7CiAgICB0ZW1wLl8yNCA9IChzcmMxLT5fMTQgKiBzcmMyLT5fMjEpICsgKHNyYzEtPl8yNCAqIHNyYzItPl8yMikgKyAoc3JjMS0+XzM0ICogc3JjMi0+XzIzKSArIChzcmMxLT5fNDQgKiBzcmMyLT5fMjQpOwogICAgdGVtcC5fMzQgPSAoc3JjMS0+XzE0ICogc3JjMi0+XzMxKSArIChzcmMxLT5fMjQgKiBzcmMyLT5fMzIpICsgKHNyYzEtPl8zNCAqIHNyYzItPl8zMykgKyAoc3JjMS0+XzQ0ICogc3JjMi0+XzM0KTsKICAgIHRlbXAuXzQ0ID0gKHNyYzEtPl8xNCAqIHNyYzItPl80MSkgKyAoc3JjMS0+XzI0ICogc3JjMi0+XzQyKSArIChzcmMxLT5fMzQgKiBzcmMyLT5fNDMpICsgKHNyYzEtPl80NCAqIHNyYzItPl80NCk7CgogICAgLyogQW5kIGNvcHkgdGhlIG5ldyBtYXRyaXggaW4gdGhlIGdvb2Qgc3RvcmFnZS4uICovCiAgICBtZW1jcHkoZGVzdCwgJnRlbXAsIDE2ICogc2l6ZW9mKEQzRFZBTFVFKSk7Cn0KCgpIUkVTVUxUCmhyX2RkcmF3X2Zyb21fd2luZWQzZChIUkVTVUxUIGhyKQp7CiAgICBzd2l0Y2goaHIpCiAgICB7CiAgICAgICAgY2FzZSBXSU5FRDNERVJSX0lOVkFMSURDQUxMOiByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgICAgICBkZWZhdWx0OiByZXR1cm4gaHI7CiAgICB9Cn0K