LyoKICogUUVNVSBBY2VyIFBpY2EgTWFjaGluZSBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAoYykgMjAwNyBIZXJ26SBQb3Vzc2luZWF1CiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgogKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KICogVEhFIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlICJody5oIgojaW5jbHVkZSAibWlwcy5oIgojaW5jbHVkZSAiaXNhLmgiCiNpbmNsdWRlICJwYy5oIgojaW5jbHVkZSAiZmRjLmgiCiNpbmNsdWRlICJzeXNlbXUuaCIKI2luY2x1ZGUgImJvYXJkcy5oIgoKI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KI2RlZmluZSBCSU9TX0ZJTEVOQU1FICJtaXBzX2Jpb3MuYmluIgojZWxzZQojZGVmaW5lIEJJT1NfRklMRU5BTUUgIm1pcHNlbF9iaW9zLmJpbiIKI2VuZGlmCgojaWZkZWYgVEFSR0VUX01JUFM2NAojZGVmaW5lIFBIWVNfVE9fVklSVCh4KSAoKHgpIHwgfjB4N2ZmZmZmZmZVTEwpCiNlbHNlCiNkZWZpbmUgUEhZU19UT19WSVJUKHgpICgoeCkgfCB+MHg3ZmZmZmZmZlUpCiNlbmRpZgoKI2RlZmluZSBWSVJUX1RPX1BIWVNfQURERU5EICgtKChpbnQ2NF90KShpbnQzMl90KTB4ODAwMDAwMDApKQoKc3RhdGljIGNvbnN0IGludCBpZGVfaW9iYXNlWzJdID0geyAweDFmMCwgMHgxNzAgfTsKc3RhdGljIGNvbnN0IGludCBpZGVfaW9iYXNlMlsyXSA9IHsgMHgzZjYsIDB4Mzc2IH07CnN0YXRpYyBjb25zdCBpbnQgaWRlX2lycVsyXSA9IHsgMTQsIDE1IH07CgpzdGF0aWMgdWludDMyX3Qgc2VyaWFsX2Jhc2VbTUFYX1NFUklBTF9QT1JUU10gPSB7IDB4ODAwMDYwMDAsIDB4ODAwMDcwMDAgfTsKc3RhdGljIGludCBzZXJpYWxfaXJxW01BWF9TRVJJQUxfUE9SVFNdID0geyA4LCA5IH07CgpleHRlcm4gRklMRSAqbG9nZmlsZTsKCnN0YXRpYyB2b2lkIG1haW5fY3B1X3Jlc2V0KHZvaWQgKm9wYXF1ZSkKewogICAgQ1BVU3RhdGUgKmVudiA9IG9wYXF1ZTsKICAgIGNwdV9yZXNldChlbnYpOwp9CgpzdGF0aWMKdm9pZCBtaXBzX3BpY2E2MV9pbml0IChpbnQgcmFtX3NpemUsIGludCB2Z2FfcmFtX3NpemUsIGNvbnN0IGNoYXIgKmJvb3RfZGV2aWNlLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlTdGF0ZSAqZHMsIGNvbnN0IGNoYXIgKipmZF9maWxlbmFtZSwgaW50IHNuYXBzaG90LAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9maWxlbmFtZSwgY29uc3QgY2hhciAqa2VybmVsX2NtZGxpbmUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5pdHJkX2ZpbGVuYW1lLCBjb25zdCBjaGFyICpjcHVfbW9kZWwpCnsKICAgIGNoYXIgYnVmWzEwMjRdOwogICAgdW5zaWduZWQgbG9uZyBiaW9zX29mZnNldDsKICAgIGludCBiaW9zX3NpemU7CiAgICBDUFVTdGF0ZSAqZW52OwogICAgaW50IGk7CiAgICBpbnQgYXZhaWxhYmxlX3JhbTsKICAgIHFlbXVfaXJxICppODI1OTsKCiAgICAvKiBpbml0IENQVXMgKi8KICAgIGlmIChjcHVfbW9kZWwgPT0gTlVMTCkgewojaWZkZWYgVEFSR0VUX01JUFM2NAogICAgICAgIGNwdV9tb2RlbCA9ICJSNDAwMCI7CiNlbHNlCiAgICAgICAgLyogRklYTUU6IEFsbCB3cm9uZywgdGhpcyBtYXliZSBzaG91bGQgYmUgUjMwMDAgZm9yIHRoZSBvbGRlciBQSUNBcy4gKi8KICAgICAgICBjcHVfbW9kZWwgPSAiMjRLZiI7CiNlbmRpZgogICAgfQogICAgZW52ID0gY3B1X2luaXQoY3B1X21vZGVsKTsKICAgIGlmICghZW52KSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZmluZCBDUFUgZGVmaW5pdGlvblxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIHJlZ2lzdGVyX3NhdmV2bSgiY3B1IiwgMCwgMywgY3B1X3NhdmUsIGNwdV9sb2FkLCBlbnYpOwogICAgcWVtdV9yZWdpc3Rlcl9yZXNldChtYWluX2NwdV9yZXNldCwgZW52KTsKCiAgICAvKiBhbGxvY2F0ZSBSQU0gKGxpbWl0ZWQgdG8gMjU2IE1CKSAqLwogICAgaWYgKHJhbV9zaXplIDwgMjU2ICogMTAyNCAqIDEwMjQpCiAgICAgICAgYXZhaWxhYmxlX3JhbSA9IHJhbV9zaXplOwogICAgZWxzZQogICAgICAgIGF2YWlsYWJsZV9yYW0gPSAyNTYgKiAxMDI0ICogMTAyNDsKICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoMCwgYXZhaWxhYmxlX3JhbSwgSU9fTUVNX1JBTSk7CgogICAgLyogbG9hZCBhIEJJT1MgaW1hZ2UgKi8KICAgIGJpb3Nfb2Zmc2V0ID0gcmFtX3NpemUgKyB2Z2FfcmFtX3NpemU7CiAgICBpZiAoYmlvc19uYW1lID09IE5VTEwpCiAgICAgICAgYmlvc19uYW1lID0gQklPU19GSUxFTkFNRTsKICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy8lcyIsIGJpb3NfZGlyLCBiaW9zX25hbWUpOwogICAgYmlvc19zaXplID0gbG9hZF9pbWFnZShidWYsIHBoeXNfcmFtX2Jhc2UgKyBiaW9zX29mZnNldCk7CiAgICBpZiAoKGJpb3Nfc2l6ZSA8PSAwKSB8fCAoYmlvc19zaXplID4gQklPU19TSVpFKSkgewogICAgICAgIC8qIGZhdGFsICovCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBFcnJvciwgY291bGQgbm90IGxvYWQgTUlQUyBiaW9zICclcydcbiIsCiAgICAgICAgICAgICAgICBidWYpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDB4MWZjMDAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSU9TX1NJWkUsIGJpb3Nfb2Zmc2V0IHwgSU9fTUVNX1JPTSk7CgogICAgLyogRGV2aWNlIG1hcAogICAgICoKICAgICAqIGFkZHIgMHhlMDAwNDAwMDogbWMxNDY4MTgKICAgICAqIGFkZHIgMHhlMDAwNTAwMCBpbnRyIDY6IHBzMiBrZXlib2FyZAogICAgICogYWRkciAweGUwMDA1MDAwIGludHIgNzogcHMyIG1vdXNlCiAgICAgKiBhZGRyIDB4ZTAwMDYwMDAgaW50ciA4OiBuczE2NTUwYSwKICAgICAqIGFkZHIgMHhlMDAwNzAwMCBpbnRyIDk6IG5zMTY1NTBhCiAgICAgKiBpc2FfaW9fYmFzZSAweGUyMDAwMDAwIGlzYV9tZW1fYmFzZSAweGUzMDAwMDAwCiAgICAgKi8KCiAgICAvKiBJbml0IENQVSBpbnRlcm5hbCBkZXZpY2VzICovCiAgICBjcHVfbWlwc19pcnFfaW5pdF9jcHUoZW52KTsKICAgIGNwdV9taXBzX2Nsb2NrX2luaXQoZW52KTsKICAgIGNwdV9taXBzX2lycWN0cmxfaW5pdCgpOwoKICAgIC8qIFJlZ2lzdGVyIDY0IEtCIG9mIElTQSBJTyBzcGFjZSBhdCAweDEwMDAwMDAwICovCiAgICBpc2FfbW1pb19pbml0KDB4MTAwMDAwMDAsIDB4MDAwMTAwMDApOwogICAgaXNhX21lbV9iYXNlID0gMHgxMTAwMDAwMDsKCiAgICAvKiBQQyBzdHlsZSBJUlEgKGk4MjU5L2k4MjU0KSBhbmQgRE1BIChpODI1NykgKi8KICAgIC8qIFRoZSBQSUMgaXMgYXR0YWNoZWQgdG8gdGhlIE1JUFMgQ1BVIElOVDAgcGluICovCiAgICBpODI1OSA9IGk4MjU5X2luaXQoZW52LT5pcnFbMl0pOwogICAgcnRjX21tX2luaXQoMHg4MDAwNDA3MCwgMSwgaTgyNTlbMTRdKTsKICAgIHBpdF9pbml0KDB4NDAsIDApOwoKICAgIC8qIEtleWJvYXJkIChpODA0MikgKi8KICAgIGk4MDQyX21tX2luaXQoaTgyNTlbNl0sIGk4MjU5WzddLCAweDgwMDA1MDYwLCAwKTsKCiAgICAvKiBJREUgY29udHJvbGxlciAqLwogICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKQogICAgICAgIGlzYV9pZGVfaW5pdChpZGVfaW9iYXNlW2ldLCBpZGVfaW9iYXNlMltpXSwgaTgyNTlbaWRlX2lycVtpXV0sCiAgICAgICAgICAgICAgICAgICAgIGJzX3RhYmxlWzIgKiBpXSwgYnNfdGFibGVbMiAqIGkgKyAxXSk7CgogICAgLyogTmV0d29yayBjb250cm9sbGVyICovCiAgICAvKiBGSVhNRTogbWlzc2luZyBOUyBTT05JQyBEUDgzOTMyICovCgogICAgLyogU0NTSSBhZGFwdGVyICovCiAgICAvKiBGSVhNRTogbWlzc2luZyBOQ1IgNTNDOTQgKi8KCiAgICAvKiBJU0EgZGV2aWNlcyAoZmxvcHB5LCBzZXJpYWwsIHBhcmFsbGVsKSAqLwogICAgZmRjdHJsX2luaXQoaTgyNTlbMV0sIDEsIDEsIDB4ODAwMDMwMDAsIGZkX3RhYmxlKTsKICAgIGZvcihpID0gMDsgaSA8IE1BWF9TRVJJQUxfUE9SVFM7IGkrKykgewogICAgICAgIGlmIChzZXJpYWxfaGRzW2ldKSB7CiAgICAgICAgICAgIHNlcmlhbF9tbV9pbml0KHNlcmlhbF9iYXNlW2ldLCAwLCBpODI1OVtzZXJpYWxfaXJxW2ldXSwgc2VyaWFsX2hkc1tpXSwgMSk7CiAgICAgICAgfQogICAgfQogICAgLyogUGFyYWxsZWwgcG9ydCAqLwogICAgaWYgKHBhcmFsbGVsX2hkc1swXSkgcGFyYWxsZWxfbW1faW5pdCgweDgwMDA4MDAwLCAwLCBpODI1OVsxXSwgcGFyYWxsZWxfaGRzWzBdKTsKCiAgICAvKiBTb3VuZCBjYXJkICovCiAgICAvKiBGSVhNRTogbWlzc2luZyBKYXp6IHNvdW5kLCBJUlEgMTggKi8KCiAgICAvKiBMRUQgaW5kaWNhdG9yICovCiAgICAvKiBGSVhNRTogbWlzc2luZyBMRUQgaW5kaWNhdG9yICovCgogICAgLyogTlZSQU0gKi8KICAgIGRzMTIyNXlfaW5pdCgweDgwMDA5MDAwLCAibnZyYW0iKTsKCiAgICAvKiBWaWRlbyBjYXJkICovCiAgICAvKiBGSVhNRTogVGhpcyBjYXJkIGlzIG5vdCB0aGUgcmVhbCBvbmUgd2hpY2ggd2FzIGluIHRoZSBvcmlnaW5hbCBQSUNBLAogICAgICogYnV0IGxldCdzIGRvIHdpdGggd2hhdCBRZW11IGN1cnJlbmx5IGVtdWxhdGVzLi4uICovCiAgICBpc2FfdmdhX21tX2luaXQoZHMsIHBoeXNfcmFtX2Jhc2UgKyByYW1fc2l6ZSwgcmFtX3NpemUsIHZnYV9yYW1fc2l6ZSwKICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwLCAweDYwMDAwMDAwLCAwKTsKCiAgICAvKiBMRUQgaW5kaWNhdG9yICovCiAgICBqYXp6X2xlZF9pbml0KGRzLCAweDgwMDBmMDAwKTsKfQoKUUVNVU1hY2hpbmUgbWlwc19waWNhNjFfbWFjaGluZSA9IHsKICAgICJwaWNhNjEiLAogICAgIkFjZXIgUGljYSA2MSIsCiAgICBtaXBzX3BpY2E2MV9pbml0LAp9Owo=