LyoKICogRElTUERJQi5kbGwKICogCiAqIENvcHlyaWdodCAxOTk4IE92ZSBL5XZlbiAod2l0aCBzb21lIGhlbHAgZnJvbSBNYXJjdXMgTWVpc3NuZXIpCiAqCiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvd2luZ2RpMTYuaCIKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgImRpc3BkaWIuaCIKI2luY2x1ZGUgInZnYS5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKCnN0YXRpYyBpbnQgZGlzcGRpYl9tdWx0aSA9IDA7CgpzdGF0aWMgV09SRCBESVNQRElCX0JlZ2luKFdPUkQgd0ZsYWdzKQp7CiAgICB1bnNpZ25lZCBYcmVzLFlyZXMsRGVwdGg7CgogICAgc3dpdGNoKHdGbGFncyZESVNQTEFZRElCX01PREUpIHsKICAgICAgICBjYXNlIERJU1BMQVlESUJfTU9ERV9ERUZBVUxUOgogICAgICAgICAgICAvKiBGSVhNRTogaXMgdGhpcyBzdXBwb3NlZCB0byBhdXRvZGV0ZWN0PyAqLwogICAgICAgIGNhc2UgRElTUExBWURJQl9NT0RFXzMyMHgyMDB4ODoKICAgICAgICAgICAgWHJlcz0zMjA7IFlyZXM9MjAwOyBEZXB0aD04OyBicmVhazsKICAgICAgICBjYXNlIERJU1BMQVlESUJfTU9ERV8zMjB4MjQweDg6CiAgICAgICAgICAgIFhyZXM9MzIwOyBZcmVzPTI0MDsgRGVwdGg9ODsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIERJU1BMQVlESUJfTk9UU1VQUE9SVEVEOwogICAgfQogICAgLyogbW9yZSBvciBsZXNzIGR1bW15IGNhbGxzIHRvIERlYXRoL1Jlc3VycmVjdGlvbiwgZm9yIGNvbXBsZXRlbmVzcyAqLwogICAgLyogRklYTUU6IHdoYXQgYXJndW1lbnRzIHNob3VsZCB0aGV5IGdldD8gKi8KICAgIERlYXRoMTYoMCk7CiAgICBpZiAoVkdBX1NldE1vZGUoWHJlcyxZcmVzLERlcHRoKSkgewogICAgICAgICBSZXN1cnJlY3Rpb24xNigwLDAsMCwwLDAsMCwwKTsKICAgICAgICAgcmV0dXJuIERJU1BMQVlESUJfTk9UU1VQUE9SVEVEOwogICAgfQogICAgcmV0dXJuIERJU1BMQVlESUJfTk9FUlJPUjsKfQoKc3RhdGljIHZvaWQgRElTUERJQl9FbmQodm9pZCkKewogICAgUmVzdXJyZWN0aW9uMTYoMCwwLDAsMCwwLDAsMCk7IC8qIEZJWE1FOiBhcmd1bWVudHMgKi8KICAgIFZHQV9FeGl0KCk7Cn0KCnN0YXRpYyB2b2lkIERJU1BESUJfUGFsZXR0ZShMUEJJVE1BUElORk8gbHBiaSkKewogICAgVkdBX1NldFF1YWRQYWxldHRlKGxwYmktPmJtaUNvbG9ycywwLDI1Nik7Cn0KCnN0YXRpYyB2b2lkIERJU1BESUJfU2hvdyhMUEJJVE1BUElORk9IRUFERVIgbHBiaSxMUFNUUiBscEJpdHMsV09SRCB1RmxhZ3MpCnsKICAgIGludCBYb2ZzLFlvZnMsV2lkdGg9bHBiaS0+YmlXaWR0aCxIZWlnaHQ9bHBiaS0+YmlIZWlnaHQsRGVsdGE7CiAgICBpbnQgUGl0Y2ggPSAoV2lkdGggKyAzKSAmIH4zOwogICAgdW5zaWduZWQgaW50IHNQaXRjaCxzV2lkdGgsc0hlaWdodDsKICAgIExQU1RSIHN1cmYgPSBET1NNRU1fTWFwRG9zVG9MaW5lYXIoMHhhMDAwMCk7CgogICAgaWYgKFZHQV9HZXRNb2RlKCZzSGVpZ2h0LCZzV2lkdGgsTlVMTCkpIHJldHVybjsKICAgIHNQaXRjaD0zMjA7CgogICAgRGVsdGE9KEhlaWdodDwwKSoyLTE7CiAgICBIZWlnaHQqPS1EZWx0YTsgUGl0Y2gqPURlbHRhOwoKICAgIGlmICh1RmxhZ3MmRElTUExBWURJQl9OT0NFTlRFUikgewogICAgICAgIFhvZnM9MDsgWW9mcz0wOwogICAgfSBlbHNlIHsKICAgICAgICBYb2ZzPShzV2lkdGgtV2lkdGgpLzI7CiAgICAgICAgWW9mcz0oc0hlaWdodC1IZWlnaHQpLzI7CiAgICB9CiAgICBzdXJmICs9IChZb2ZzKnNQaXRjaCkrWG9mczsKICAgIGlmIChQaXRjaDwwKSBscEJpdHMtPVBpdGNoKihIZWlnaHQtMSk7CiAgICBmb3IgKDsgSGVpZ2h0OyBIZWlnaHQtLSxscEJpdHMrPVBpdGNoLHN1cmYrPXNQaXRjaCkgewogICAgICAgIG1lbWNweShzdXJmLGxwQml0cyxXaWR0aCk7CiAgICB9CgogICAgVkdBX1BvbGwoMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRGlzcGxheURpYgkoRElTUERJQi4xKQogKgogKiAgRGlzYWJsZXMgR0RJIGFuZCB0YWtlcyBvdmVyIHRoZSBWR0Egc2NyZWVuIHRvIHNob3cgRElCcyBpbiBmdWxsIHNjcmVlbi4KICoKICogRkxBR1MKICoKICogIERJU1BMQVlESUJfTk9QQUxFVFRFOiBkb24ndCBjaGFuZ2UgcGFsZXR0ZQogKiAgRElTUExBWURJQl9OT0NFTlRFUjogZG9uJ3QgY2VudGVyIGJpdG1hcAogKiAgRElTUExBWURJQl9OT1dBSVQ6IGRvbid0IHdhaXQgKGZvciBrZXlwcmVzcykgYmVmb3JlIHJldHVybmluZwogKiAgRElTUExBWURJQl9CRUdJTjogc3RhcnQgb2YgbXVsdGlwbGUgY2FsbHMgKGRvZXMgbm90IHJlc3RvcmUgdGhlIHNjcmVlbikKICogIERJU1BMQVlESUJfRU5EOiBlbmQgb2YgbXVsdGlwbGUgY2FsbHMgKHJlc3RvcmVzIHRoZSBzY3JlZW4pCiAqICBESVNQTEFZRElCX01PREVfREVGQVVMVDogZGVmYXVsdCBkaXNwbGF5IG1vZGUKICogIERJU1BMQVlESUJfTU9ERV8zMjB4MjAweDg6IFN0YW5kYXJkIFZHQSAzMjB4MjAwIDI1NiBjb2xvcnMKICogIERJU1BMQVlESUJfTU9ERV8zMjB4MjQweDg6IFR3ZWFrZWQgVkdBIDMyMHgyNDAgMjU2IGNvbG9ycwogKgogKiBSRVRVUk5TCiAqCiAqICBESVNQTEFZRElCX05PRVJST1I6IHN1Y2Nlc3MKICogIERJU1BMQVlESUJfTk9UU1VQUE9SVEVEOiBmdW5jdGlvbiBub3Qgc3VwcG9ydGVkCiAqICBESVNQTEFZRElCX0lOVkFMSURESUI6IG51bGwgb3IgaW52YWxpZCBESUIgaGVhZGVyCiAqICBESVNQTEFZRElCX0lOVkFMSURGT1JNQVQ6IGludmFsaWQgRElCIGZvcm1hdAogKiAgRElTUExBWURJQl9JTlZBTElEVEFTSzogbm90IGNhbGxlZCBmcm9tIGN1cnJlbnQgdGFzawogKgogKiBCVUdTCiAqCiAqICBXYWl0aW5nIGZvciBrZXlwcmVzc2VzIGlzIG5vdCBpbXBsZW1lbnRlZC4KICovCldPUkQgV0lOQVBJIERpc3BsYXlEaWIoCgkJTFBCSVRNQVBJTkZPIGxwYmksIC8qIFtpbl0gRElCIGhlYWRlciB3aXRoIHJlc29sdXRpb24gYW5kIHBhbGV0dGUgKi8KCQlMUFNUUiBscEJpdHMsICAgICAgLyogW2luXSBCaXRtYXAgYml0cyB0byBzaG93ICovCgkJV09SRCB3RmxhZ3MgICAgICAgIC8qIFtpbl0gKi8KCSkKewogICAgV09SRCByZXQ7CgogICAgaWYgKHdGbGFncyZESVNQTEFZRElCX0VORCkgewogICAgICAgIGlmIChkaXNwZGliX211bHRpKSBESVNQRElCX0VuZCgpOwogICAgICAgIGRpc3BkaWJfbXVsdGkgPSAwOwogICAgICAgIHJldHVybiBESVNQTEFZRElCX05PRVJST1I7CiAgICB9CiAgICBpZiAoIWRpc3BkaWJfbXVsdGkpIHsKICAgICAgICByZXQ9RElTUERJQl9CZWdpbih3RmxhZ3MpOwogICAgICAgIGlmIChyZXQpIHJldHVybiByZXQ7CiAgICB9CiAgICBpZiAod0ZsYWdzJkRJU1BMQVlESUJfQkVHSU4pIGRpc3BkaWJfbXVsdGkgPSAxOwogICAgaWYgKCEod0ZsYWdzJkRJU1BMQVlESUJfTk9QQUxFVFRFKSkgewogICAgICAgIERJU1BESUJfUGFsZXR0ZShscGJpKTsKICAgIH0KICAgIC8qIEZJWE1FOiBub3Qgc3VyZSBpZiBpdCdzIHZhbGlkIHRvIGRyYXcgaW1hZ2VzIGluIERJU1BMQVlESUJfQkVHSU4sIHNvLi4uICovCiAgICBpZiAobHBCaXRzKSB7CiAgICAgICAgRElTUERJQl9TaG93KCYobHBiaS0+Ym1pSGVhZGVyKSxscEJpdHMsd0ZsYWdzKTsKICAgIH0KICAgIGlmICghKHdGbGFncyZESVNQTEFZRElCX05PV0FJVCkpIHsKICAgICAgICBGSVhNRSgid2FpdCBub3QgaW1wbGVtZW50ZWRcbiIpOwogICAgfQogICAgaWYgKCFkaXNwZGliX211bHRpKSBESVNQRElCX0VuZCgpOwogICAgcmV0dXJuIERJU1BMQVlESUJfTk9FUlJPUjsKfQo=