LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9zcmMvZmNmcmVldHlwZS5jLHYgMS4xMSAyMDAyLzA4LzMxIDIyOjE3OjMyIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAxIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCi8qCiAgQ29weXJpZ2h0IKkgMjAwMi0yMDAzIGJ5IEp1bGl1c3ogQ2hyb2JvY3plawoKICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwogIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAogIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KICBUSEUgU09GVFdBUkUuCiovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJmY2ludC5oIgojaW5jbHVkZSA8ZnQyYnVpbGQuaD4KI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAojaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICiNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICiNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICgojaWYgKEZSRUVUWVBFX01JTk9SID4gMSB8fCAoRlJFRVRZUEVfTUlOT1IgPT0gMSAmJiBGUkVFVFlQRV9QQVRDSCA+PSA0KSkKI2luY2x1ZGUgRlRfQkRGX0gKI2luY2x1ZGUgRlRfTU9EVUxFX0gKI2RlZmluZSBVU0VfRlRCREYKI2RlZmluZSBIQVNfQkRGX1BST1BFUlRZKGYpICgoZikgJiYgKGYpLT5kcml2ZXIgJiYgXAoJCQkgICAgIChmKS0+ZHJpdmVyLT5yb290LmNsYXp6LT5nZXRfaW50ZXJmYWNlKQojZGVmaW5lIE1ZX0dldF9CREZfUHJvcGVydHkoZixuLHApIChIQVNfQkRGX1BST1BFUlRZKGYpID8gXAoJCQkJICAgIEZUX0dldF9CREZfUHJvcGVydHkoZixuLHApIDogXAoJCQkJICAgIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50KQojZW5kaWYKCgovKgogKiBLZWVwIEhhbiBsYW5ndWFnZXMgc2VwYXJhdGVkIGJ5IGVsaW1pbmF0aW5nIGxhbmd1YWdlcwogKiB0aGF0IHRoZSBjb2RlUGFnZVJhbmdlIGJpdHMgc2F5cyBhcmVuJ3Qgc3VwcG9ydGVkCiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBpbnQJCSAgICBiaXQ7CiAgICBjb25zdCBGY0NoYXI4ICAgKmxhbmc7Cn0gRmNDb2RlUGFnZVJhbmdlW10gPSB7CiAgICB7IDE3LAkoY29uc3QgRmNDaGFyOCAqKSAiamEiIH0sCiAgICB7IDE4LAkoY29uc3QgRmNDaGFyOCAqKSAiemgtY24iIH0sCiAgICB7IDE5LAkoY29uc3QgRmNDaGFyOCAqKSAia28iIH0sCiAgICB7IDIwLAkoY29uc3QgRmNDaGFyOCAqKSAiemgtdHciIH0sCn07CgojZGVmaW5lIE5VTV9DT0RFX1BBR0VfUkFOR0UgKHNpemVvZiBGY0NvZGVQYWdlUmFuZ2UgLyBzaXplb2YgRmNDb2RlUGFnZVJhbmdlWzBdKQoKRmNCb29sCkZjRnJlZVR5cGVJc0V4Y2x1c2l2ZUxhbmcgKGNvbnN0IEZjQ2hhcjggICpsYW5nKQp7CiAgICBpbnQJICAgIGk7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9DT0RFX1BBR0VfUkFOR0U7IGkrKykKICAgIHsKCWlmIChGY0xhbmdDb21wYXJlIChsYW5nLCBGY0NvZGVQYWdlUmFuZ2VbaV0ubGFuZykgIT0gRmNMYW5nRGlmZmVyZW50TGFuZykKCSAgICByZXR1cm4gRmNUcnVlOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCiNkZWZpbmUgRkNfTkFNRV9QUklPX0xBTkcJICAgIDB4MGYwMAojZGVmaW5lIEZDX05BTUVfUFJJT19MQU5HX0VOR0xJU0ggICAweDAyMDAKI2RlZmluZSBGQ19OQU1FX1BSSU9fTEFOR19MQVRJTgkgICAgMHgwMTAwCiNkZWZpbmUgRkNfTkFNRV9QUklPX0xBTkdfTk9ORQkgICAgMHgwMDAwCgojZGVmaW5lIEZDX05BTUVfUFJJT19FTkMJICAgIDB4MDBmMAojZGVmaW5lIEZDX05BTUVfUFJJT19FTkNfVU5JQ09ERSAgICAweDAwMTAKI2RlZmluZSBGQ19OQU1FX1BSSU9fRU5DX05PTkUJICAgIDB4MDAwMAoKI2RlZmluZSBGQ19OQU1FX1BSSU9fTkFNRQkgICAgMHgwMDBmCiNkZWZpbmUgRkNfTkFNRV9QUklPX05BTUVfRkFNSUxZICAgIDB4MDAwMgojZGVmaW5lIEZDX05BTUVfUFJJT19OQU1FX1BTCSAgICAweDAwMDEKI2RlZmluZSBGQ19OQU1FX1BSSU9fTkFNRV9OT05FCSAgICAweDAwMDAKCnN0YXRpYyBGY0Jvb2wKRmNVY3M0SXNMYXRpbiAoRmNDaGFyMzIgdWNzNCkKewogICAgRmNDaGFyMzIJcGFnZSA9IHVjczQgPj4gODsKICAgIAogICAgaWYgKHBhZ2UgPD0gMikKCXJldHVybiBGY1RydWU7CiAgICBpZiAocGFnZSA9PSAweDFlKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmICgweDIwIDw9IHBhZ2UgJiYgcGFnZSA8PSAweDIzKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIGlmIChwYWdlID09IDB4ZmIpCglyZXR1cm4gRmNUcnVlOwogICAgLyogaGFsZndpZHRoIGZvcm1zLCBkb24ndCBpbmNsdWRlIGthbmEgb3Igd2hpdGUgcGFyZW5zICovCiAgICBpZiAoMHhmZjAxIDw9IHVjczQgJiYgdWNzNCA8PSAweGZmNWUpCglyZXR1cm4gRmNUcnVlOwogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNVdGY4SXNMYXRpbiAoRmNDaGFyOCAqc3RyLCBpbnQgbGVuKQp7CiAgICB3aGlsZSAobGVuKQogICAgewoJRmNDaGFyMzIgICAgdWNzNDsKCWludAkgICAgY2xlbiA9IEZjVXRmOFRvVWNzNCAoc3RyLCAmdWNzNCwgbGVuKTsKCWlmIChjbGVuIDw9IDApCgkgICAgcmV0dXJuIEZjRmFsc2U7CglpZiAoIUZjVWNzNElzTGF0aW4gKHVjczQpKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJbGVuIC09IGNsZW47CglzdHIgKz0gY2xlbjsKICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCi8qIE9yZGVyIGlzIHNpZ25pZmljYW50LiAgRm9yIGV4YW1wbGUsIHNvbWUgQiZIIGZvbnRzIGFyZSBoaW50ZWQgYnkKICAgVVJXKyssIGFuZCBib3RoIHN0cmluZ3MgYXBwZWFyIGluIHRoZSBub3RpY2UuICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIGNvbnN0IEZjQ2hhcjggICAqbm90aWNlOwogICAgY29uc3QgRmNDaGFyOCAgICpmb3VuZHJ5Owp9IEZjTm90aWNlRm91bmRyaWVzW10gPSB7CiAgICB7IChjb25zdCBGY0NoYXI4KikgIkJpZ2Vsb3ciLAkoY29uc3QgRmNDaGFyOCAqKSAiYiZoIiB9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJBZG9iZSIsCQkoY29uc3QgRmNDaGFyOCAqKSAiYWRvYmUiIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkJpdHN0cmVhbSIsCShjb25zdCBGY0NoYXI4ICopICJiaXRzdHJlYW0iIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIk1vbm90eXBlIiwJKGNvbnN0IEZjQ2hhcjggKikgIm1vbm90eXBlIiB9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJMaW5vdHlwZSIsCShjb25zdCBGY0NoYXI4ICopICJsaW5vdHlwZSIgfSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiTElOT1RZUEUtSEVMTCIsIChjb25zdCBGY0NoYXI4ICopICJsaW5vdHlwZSIgfSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiSUJNIiwJCShjb25zdCBGY0NoYXI4ICopICJpYm0iIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIlVSVyIsCQkoY29uc3QgRmNDaGFyOCAqKSAidXJ3IiB9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJJbnRlcm5hdGlvbmFsIFR5cGVmYWNlIENvcnBvcmF0aW9uIiwgCgkJCQkJKGNvbnN0IEZjQ2hhcjggKikgIml0YyIgfSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiVGlybyBUeXBld29ya3MiLChjb25zdCBGY0NoYXI4ICopICJ0aXJvIiB9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJYRnJlZTg2IiwJKGNvbnN0IEZjQ2hhcjggKikgInhmcmVlODYiIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIk1pY3Jvc29mdCIsCShjb25zdCBGY0NoYXI4ICopICJtaWNyb3NvZnQiIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIk9tZWdhIiwJCShjb25zdCBGY0NoYXI4ICopICJvbWVnYSIgfSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiRm9udDIxIiwJKGNvbnN0IEZjQ2hhcjggKikgImh3YW4iIH0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkhhbllhbmcgU3lzdGVtIiwoY29uc3QgRmNDaGFyOCAqKSAiaGFueWFuZyIgfQp9OwoKI2RlZmluZSBOVU1fTk9USUNFX0ZPVU5EUklFUwkoc2l6ZW9mIChGY05vdGljZUZvdW5kcmllcykgLyBzaXplb2YgKEZjTm90aWNlRm91bmRyaWVzWzBdKSkKCnN0YXRpYyBjb25zdCBGY0NoYXI4ICoKRmNOb3RpY2VGb3VuZHJ5KGNvbnN0IGNoYXIgKm5vdGljZSkKewogICAgaW50IGk7CgogICAgaWYgKG5vdGljZSkKCWZvcihpID0gMDsgaSA8IE5VTV9OT1RJQ0VfRk9VTkRSSUVTOyBpKyspCgkgICAgaWYgKHN0cnN0ciAoKGNvbnN0IGNoYXIgKikgbm90aWNlLCAoY29uc3QgY2hhciAqKSBGY05vdGljZUZvdW5kcmllc1tpXS5ub3RpY2UpKQoJCXJldHVybiBGY05vdGljZUZvdW5kcmllc1tpXS5mb3VuZHJ5OwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNWZW5kb3JNYXRjaChjb25zdCBjaGFyICp2ZW5kb3IsIGNvbnN0IGNoYXIgKnZlbmRvcl9zdHJpbmcpCnsKICAgIC8qIHZlbmRvciBpcyBub3QgbmVjZXNzYXJpbHkgTlVMLXRlcm1pbmF0ZWQuICovCiAgICBpbnQgaSwgbGVuOwogICAgCiAgICBsZW4gPSBzdHJsZW4odmVuZG9yX3N0cmluZyk7CiAgICBpZiAobWVtY21wKHZlbmRvciwgdmVuZG9yX3N0cmluZywgbGVuKSAhPSAwKQogICAgICAgIHJldHVybiBGY0ZhbHNlOwogICAgZm9yIChpID0gbGVuOyBpIDwgNDsgaSsrKQogICAgICAgIGlmICh2ZW5kb3JbaV0gIT0gJyAnICYmIHZlbmRvcltpXSAhPSAnXDAnKQogICAgICAgICAgICByZXR1cm4gRmNGYWxzZTsKICAgIHJldHVybiBGY1RydWU7Cn0KCi8qIFRoaXMgdGFibGUgaXMgcGFydGx5IHRha2VuIGZyb20gdHRta2ZkaXIgYnkgSm9lcmcgUG9tbW5pdHouICovCgovKiBJdCBzaG91bGQgbm90IGNvbnRhaW4gdXNlbGVzcyBlbnRyaWVzIChzdWNoIGFzIFVOS04pIG5vciBkdXBsaWNhdGUKICAgZW50cmllcyBmb3IgcGFkZGluZyBib3RoIHdpdGggc3BhY2VzIGFuZCBOVUxzLiAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICBjb25zdCBGY0NoYXI4ICAgKnZlbmRvcjsKICAgIGNvbnN0IEZjQ2hhcjggICAqZm91bmRyeTsKfSBGY1ZlbmRvckZvdW5kcmllc1tdID0gewogICAgeyAoY29uc3QgRmNDaGFyOCopICJBREJFIiwgKGNvbnN0IEZjQ2hhcjggKikgImFkb2JlIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkFHRkEiLCAoY29uc3QgRmNDaGFyOCAqKSAiYWdmYSJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJBTFRTIiwgKGNvbnN0IEZjQ2hhcjggKikgImFsdHN5cyJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJBUFBMIiwgKGNvbnN0IEZjQ2hhcjggKikgImFwcGxlIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkFSUEgiLCAoY29uc3QgRmNDaGFyOCAqKSAiYXJwaGljIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkFURUMiLCAoY29uc3QgRmNDaGFyOCAqKSAiYWxsdHlwZSJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJCJkgiLCAgKGNvbnN0IEZjQ2hhcjggKikgImImaCJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJCSVRTIiwgKGNvbnN0IEZjQ2hhcjggKikgImJpdHN0cmVhbSJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJDQU5PIiwgKGNvbnN0IEZjQ2hhcjggKikgImNhbm5vbiJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJEWU5BIiwgKGNvbnN0IEZjQ2hhcjggKikgImR5bmFsYWIifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiRVBTTiIsIChjb25zdCBGY0NoYXI4ICopICJlcHNvbiJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJGSiIsICAgKGNvbnN0IEZjQ2hhcjggKikgImZ1aml0c3UifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiSUJNIiwgIChjb25zdCBGY0NoYXI4ICopICJpYm0ifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiSVRDIiwgIChjb25zdCBGY0NoYXI4ICopICJpdGMifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiSU1QUiIsIChjb25zdCBGY0NoYXI4ICopICJpbXByZXNzIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkxBUkEiLCAoY29uc3QgRmNDaGFyOCAqKSAibGFyYWJpZWZvbnRzIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkxFQUYiLCAoY29uc3QgRmNDaGFyOCAqKSAiaW50ZXJsZWFmIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIkxFVFIiLCAoY29uc3QgRmNDaGFyOCAqKSAibGV0cmFzZXQifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiTElOTyIsIChjb25zdCBGY0NoYXI4ICopICJsaW5vdHlwZSJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJNQUNSIiwgKGNvbnN0IEZjQ2hhcjggKikgIm1hY3JvbWVkaWEifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiTU9OTyIsIChjb25zdCBGY0NoYXI4ICopICJtb25vdHlwZSJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJNUyIsICAgKGNvbnN0IEZjQ2hhcjggKikgIm1pY3Jvc29mdCJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJNVCIsICAgKGNvbnN0IEZjQ2hhcjggKikgIm1vbm90eXBlIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIk5FQyIsICAoY29uc3QgRmNDaGFyOCAqKSAibmVjIn0sCiAgICB7IChjb25zdCBGY0NoYXI4KikgIlBBUkEiLCAoY29uc3QgRmNDaGFyOCAqKSAicGFyYXR5cGUifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiUU1TSSIsIChjb25zdCBGY0NoYXI4ICopICJxbXMifSwKICAgIHsgKGNvbnN0IEZjQ2hhcjgqKSAiUklDTyIsIChjb25zdCBGY0NoYXI4ICopICJyaWNvaCJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJVUlciLCAgKGNvbnN0IEZjQ2hhcjggKikgInVydyJ9LAogICAgeyAoY29uc3QgRmNDaGFyOCopICJZJlkiLCAgKGNvbnN0IEZjQ2hhcjggKikgInkmeSJ9Cn07CgojZGVmaW5lIE5VTV9WRU5ET1JfRk9VTkRSSUVTCShzaXplb2YgKEZjVmVuZG9yRm91bmRyaWVzKSAvIHNpemVvZiAoRmNWZW5kb3JGb3VuZHJpZXNbMF0pKQoKc3RhdGljIGNvbnN0IEZjQ2hhcjggKgpGY1ZlbmRvckZvdW5kcnkoY29uc3QgY2hhciAqdmVuZG9yKQp7CiAgICBpbnQgaTsKICAgIAogICAgaWYgKHZlbmRvcikKCWZvcihpID0gMDsgaSA8IE5VTV9WRU5ET1JfRk9VTkRSSUVTOyBpKyspCgkgICAgaWYgKEZjVmVuZG9yTWF0Y2ggKHZlbmRvciwgRmNWZW5kb3JGb3VuZHJpZXNbaV0udmVuZG9yKSkKCQlyZXR1cm4gRmNWZW5kb3JGb3VuZHJpZXNbaV0uZm91bmRyeTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgZG91YmxlCkZjR2V0UGl4ZWxTaXplIChGVF9GYWNlIGZhY2UsIGludCBpKQp7CiNpZiBIQVZFX0ZUX0dFVF9CREZfUFJPUEVSVFkKICAgIGlmIChmYWNlLT5udW1fZml4ZWRfc2l6ZXMgPT0gMSkKICAgIHsKCUJERl9Qcm9wZXJ0eVJlYwlwcm9wOwoJaW50CQlyYzsKCglyYyA9IE1ZX0dldF9CREZfUHJvcGVydHkgKGZhY2UsICJQSVhFTF9TSVpFIiwgJnByb3ApOwoJaWYgKHJjID09IDAgJiYgcHJvcC50eXBlID09IEJERl9QUk9QRVJUWV9UWVBFX0lOVEVHRVIpCgkgICAgcmV0dXJuIChkb3VibGUpIHByb3AudS5pbnRlZ2VyOwogICAgfQojZW5kaWYKI2lmIEhBVkVfRlRfQklUTUFQX1NJWkVfWV9QUEVNCiAgICByZXR1cm4gKGRvdWJsZSkgZmFjZS0+YXZhaWxhYmxlX3NpemVzW2ldLnlfcHBlbSAvIDY0LjA7CiNlbHNlCiAgICByZXR1cm4gKGRvdWJsZSkgZmFjZS0+YXZhaWxhYmxlX3NpemVzW2ldLmhlaWdodDsKI2VuZGlmCn0KCkZjUGF0dGVybiAqCkZjRnJlZVR5cGVRdWVyeSAoY29uc3QgRmNDaGFyOAkqZmlsZSwKCQkgaW50CQlpZCwKCQkgRmNCbGFua3MJKmJsYW5rcywKCQkgaW50CQkqY291bnQpCnsKICAgIEZUX0ZhY2UJICAgIGZhY2U7CiAgICBGY1BhdHRlcm4JICAgICpwYXQ7CiAgICBpbnQJCSAgICBzbGFudDsKICAgIGludAkJICAgIHdlaWdodDsKICAgIGludAkJICAgIHdpZHRoID0gLTE7CiAgICBpbnQJCSAgICBpOwogICAgRmNDaGFyU2V0CSAgICAqY3M7CiAgICBGY0xhbmdTZXQJICAgICpsczsKICAgIEZUX0xpYnJhcnkJICAgIGZ0TGlicmFyeTsKICAgIEZjQ2hhcjgJICAgICpmYW1pbHkgPSAwOwogICAgRmNDaGFyOAkgICAgKnN0eWxlID0gMDsKICAgIGNvbnN0IEZjQ2hhcjggICAqZm91bmRyeSA9IDA7CiAgICBpbnQJCSAgICBzcGFjaW5nOwogICAgVFRfT1MyCSAgICAqb3MyOwogICAgUFNfRm9udEluZm9SZWMgIHBzZm9udGluZm87CiAgICBUVF9IZWFkZXIJICAgICpoZWFkOwogICAgY29uc3QgRmNDaGFyOCAgICpleGNsdXNpdmVMYW5nID0gMDsKICAgIEZUX1NmbnROYW1lCSAgICBzbmFtZTsKICAgIEZUX1VJbnQgICAgCSAgICBzbmFtZWksIHNuYW1lYzsKICAgIEZjQm9vbAkgICAgZmFtaWx5X2FsbG9jYXRlZCA9IEZjRmFsc2U7CiAgICBGY0Jvb2wJICAgIHN0eWxlX2FsbG9jYXRlZCA9IEZjRmFsc2U7CiAgICBpbnQJCSAgICBmYW1pbHlfcHJpbyA9IDA7CiAgICBpbnQJCSAgICBzdHlsZV9wcmlvID0gMDsKCiAgICBpZiAoRlRfSW5pdF9GcmVlVHlwZSAoJmZ0TGlicmFyeSkpCglyZXR1cm4gMDsKICAgIAogICAgaWYgKEZUX05ld19GYWNlIChmdExpYnJhcnksIChjaGFyICopIGZpbGUsIGlkLCAmZmFjZSkpCglnb3RvIGJhaWw7CgogICAgKmNvdW50ID0gZmFjZS0+bnVtX2ZhY2VzOwoKICAgIHBhdCA9IEZjUGF0dGVybkNyZWF0ZSAoKTsKICAgIGlmICghcGF0KQoJZ290byBiYWlsMDsKCiAgICBpZiAoIUZjUGF0dGVybkFkZEJvb2wgKHBhdCwgRkNfT1VUTElORSwKCQkJICAgKGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUpICE9IDApKQoJZ290byBiYWlsMTsKCiAgICBpZiAoIUZjUGF0dGVybkFkZEJvb2wgKHBhdCwgRkNfU0NBTEFCTEUsCgkJCSAgIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKSAhPSAwKSkKCWdvdG8gYmFpbDE7CgoKICAgIHNsYW50ID0gRkNfU0xBTlRfUk9NQU47CiAgICBpZiAoZmFjZS0+c3R5bGVfZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0lUQUxJQykKCXNsYW50ID0gRkNfU0xBTlRfSVRBTElDOwoKCiAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfTUVESVVNOwogICAgaWYgKGZhY2UtPnN0eWxlX2ZsYWdzICYgRlRfU1RZTEVfRkxBR19CT0xEKQoJd2VpZ2h0ID0gRkNfV0VJR0hUX0JPTEQ7CgogICAgLyoKICAgICAqIEdldCB0aGUgT1MvMiB0YWJsZQogICAgICovCiAgICBvczIgPSAoVFRfT1MyICopIEZUX0dldF9TZm50X1RhYmxlIChmYWNlLCBmdF9zZm50X29zMik7CgogICAgLyoKICAgICAqIExvb2sgZmlyc3QgaW4gdGhlIE9TLzIgdGFibGUgZm9yIHRoZSBmb3VuZHJ5LCBpZgogICAgICogbm90IGZvdW5kIGhlcmUsIHRoZSB2YXJpb3VzIG5vdGljZXMgd2lsbCBiZSBzZWFyY2hlZCBmb3IKICAgICAqIHRoYXQgaW5mb3JtYXRpb24sIGVpdGhlciBmcm9tIHRoZSBzZm50IG5hbWUgdGFibGVzIG9yCiAgICAgKiB0aGUgUG9zdHNjcmlwdCBGb250SW5mbyBkaWN0aW9uYXJ5LiAgRmluYWxseSwgdGhlCiAgICAgKiBCREYgcHJvcGVydGllcyB3aWxsIHF1ZXJpZWQuCiAgICAgKi8KICAgIAogICAgaWYgKG9zMiAmJiBvczItPnZlcnNpb24gPj0gMHgwMDAxICYmIG9zMi0+dmVyc2lvbiAhPSAweGZmZmYpCiAgICAgICAgZm91bmRyeSA9IEZjVmVuZG9yRm91bmRyeShvczItPmFjaFZlbmRJRCk7CgogICAgLyoKICAgICAqIEdydWIgdGhyb3VnaCB0aGUgbmFtZSB0YWJsZSBsb29raW5nIGZvciBmYW1pbHkKICAgICAqIGFuZCBzdHlsZSBuYW1lcy4gIEZyZWVUeXBlIG1ha2VzIHF1aXRlIGEgaGFzaAogICAgICogb2YgdGhlbQogICAgICovCiAgICBzbmFtZWMgPSBGVF9HZXRfU2ZudF9OYW1lX0NvdW50IChmYWNlKTsKICAgIGZvciAoc25hbWVpID0gMDsgc25hbWVpIDwgc25hbWVjOyBzbmFtZWkrKykKICAgIHsKCUZjQ2hhcjgJCSp1dGY4OwoJaW50CQlsZW47CglpbnQJCXdjaGFyOwoJRmNDaGFyOAkJKnNyYzsKCWludAkJc3JjX2xlbjsKCUZjQ2hhcjgJCSp1ODsKCUZjQ2hhcjMyCXVjczQ7CglpbnQJCWlsZW4sIG9sZW47CglpbnQJCXByaW8gPSAwOwoJCgljb25zdCBGY0NoYXJNYXAJKm1hcDsKCWVudW0gewoJICAgIEZjTmFtZUVuY29kaW5nVXRmMTYsIAoJICAgIEZjTmFtZUVuY29kaW5nQXBwbGVSb21hbiwKCSAgICBGY05hbWVFbmNvZGluZ0xhdGluMSAKCX0gZW5jb2Rpbmc7CgkKCQoJaWYgKEZUX0dldF9TZm50X05hbWUgKGZhY2UsIHNuYW1laSwgJnNuYW1lKSAhPSAwKQoJICAgIGJyZWFrOwoJCgkvKgoJICogTG9vayBmb3IgVW5pY29kZSBzdHJpbmdzCgkgKi8KCXN3aXRjaCAoc25hbWUucGxhdGZvcm1faWQpIHsKCWNhc2UgVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERToKCSAgICAvKgoJICAgICAqIEFsbCBBUFBMRV9VTklDT0RFIGVuY29kaW5ncyBhcmUgVXRmMTYgQkUKCSAgICAgKgoJICAgICAqIEJlY2F1c2UgdGhlcmUncyBubyBsYW5ndWFnZSBpZCBmb3IgVW5pY29kZSwKCSAgICAgKiBhc3N1bWUgaXQncyBFbmdsaXNoCgkgICAgICovCgkgICAgcHJpbyB8PSBGQ19OQU1FX1BSSU9fTEFOR19FTkdMSVNIOwoJICAgIHByaW8gfD0gRkNfTkFNRV9QUklPX0VOQ19VTklDT0RFOwoJICAgIGVuY29kaW5nID0gRmNOYW1lRW5jb2RpbmdVdGYxNjsKCSAgICBicmVhazsKCWNhc2UgVFRfUExBVEZPUk1fTUFDSU5UT1NIOgoJICAgIHN3aXRjaCAoc25hbWUuZW5jb2RpbmdfaWQpIHsKCSAgICBjYXNlIFRUX01BQ19JRF9ST01BTjoKCQllbmNvZGluZyA9IEZjTmFtZUVuY29kaW5nQXBwbGVSb21hbjsKCQlicmVhazsKCSAgICBkZWZhdWx0OgoJCWNvbnRpbnVlOwoJICAgIH0KCSAgICBzd2l0Y2ggKHNuYW1lLmxhbmd1YWdlX2lkKSB7CgkgICAgY2FzZSBUVF9NQUNfTEFOR0lEX0VOR0xJU0g6CgkJcHJpbyB8PSBGQ19OQU1FX1BSSU9fTEFOR19FTkdMSVNIOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJLyoKCQkgKiBTb21ldGltZXMgTWljcm9zb2Z0IGxhbmd1YWdlIGlkcwoJCSAqIGVuZCB1cCBpbiB0aGUgbWFjaW50b3NoIHRhYmxlLiAgVGhpcwoJCSAqIGlzIG9mdGVuIGFjY29tcGFuaWVkIGJ5IGRhdGEgaW4KCQkgKiBzb21lIG15c3RpYyBlbmNvZGluZy4gIElnbm9yZSB0aGVzZSBuYW1lcwoJCSAqLwoJCWlmIChzbmFtZS5sYW5ndWFnZV9pZCA+PSAweDEwMCkKCQkgICAgY29udGludWU7CgkJYnJlYWs7CgkgICAgfQoJICAgIGJyZWFrOwoJY2FzZSBUVF9QTEFURk9STV9NSUNST1NPRlQ6CgkgICAgc3dpdGNoIChzbmFtZS5lbmNvZGluZ19pZCkgewoJICAgIGNhc2UgVFRfTVNfSURfVU5JQ09ERV9DUzoKCQllbmNvZGluZyA9IEZjTmFtZUVuY29kaW5nVXRmMTY7CgkJcHJpbyB8PSBGQ19OQU1FX1BSSU9fRU5DX1VOSUNPREU7CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQljb250aW51ZTsKCSAgICB9CgkgICAgc3dpdGNoIChzbmFtZS5sYW5ndWFnZV9pZCAmIDB4ZmYpIHsKCSAgICBjYXNlIDB4MDk6CgkJcHJpbyB8PSBGQ19OQU1FX1BSSU9fTEFOR19FTkdMSVNIOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJYnJlYWs7CgkgICAgfQoJICAgIGJyZWFrOwoJY2FzZSBUVF9QTEFURk9STV9JU086CgkgICAgc3dpdGNoIChzbmFtZS5lbmNvZGluZ19pZCkgewoJICAgIGNhc2UgVFRfSVNPX0lEXzEwNjQ2OgoJCWVuY29kaW5nID0gRmNOYW1lRW5jb2RpbmdVdGYxNjsKCQlwcmlvIHw9IEZDX05BTUVfUFJJT19FTkNfVU5JQ09ERTsKCQlicmVhazsKCSAgICBjYXNlIFRUX0lTT19JRF83QklUX0FTQ0lJOgoJICAgIGNhc2UgVFRfSVNPX0lEXzg4NTlfMToKCQllbmNvZGluZyA9IEZjTmFtZUVuY29kaW5nTGF0aW4xOwoJCWJyZWFrOwoJICAgIGRlZmF1bHQ6CgkJY29udGludWU7CgkgICAgfQoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBjb250aW51ZTsKCX0KCQoJLyoKCSAqIExvb2sgZm9yIGZhbWlseSBhbmQgc3R5bGUgbmFtZXMgCgkgKi8KCXN3aXRjaCAoc25hbWUubmFtZV9pZCkgewoJY2FzZSBUVF9OQU1FX0lEX0ZPTlRfRkFNSUxZOgoJICAgIHByaW8gfD0gRkNfTkFNRV9QUklPX05BTUVfRkFNSUxZOwoJICAgIGJyZWFrOwoJY2FzZSBUVF9OQU1FX0lEX1BTX05BTUU6CgkgICAgcHJpbyB8PSBGQ19OQU1FX1BSSU9fTkFNRV9QUzsKCSAgICBicmVhazsKCWNhc2UgVFRfTkFNRV9JRF9GT05UX1NVQkZBTUlMWToKICAgICAgICBjYXNlIFRUX05BTUVfSURfVFJBREVNQVJLOgogICAgICAgIGNhc2UgVFRfTkFNRV9JRF9NQU5VRkFDVFVSRVI6CiAgICAgICAgICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBjb250aW51ZTsKCX0KCSAgICAKICAgICAgICBzcmMgPSAoRmNDaGFyOCAqKSBzbmFtZS5zdHJpbmc7CiAgICAgICAgc3JjX2xlbiA9IHNuYW1lLnN0cmluZ19sZW47CgkKCXN3aXRjaCAoZW5jb2RpbmcpIHsKCWNhc2UgRmNOYW1lRW5jb2RpbmdVdGYxNjoKCSAgICAvKgoJICAgICAqIENvbnZlcnQgVXRmMTYgdG8gVXRmOAoJICAgICAqLwoJICAgIAoJICAgIGlmICghRmNVdGYxNkxlbiAoc3JjLCBGY0VuZGlhbkJpZywgc3JjX2xlbiwgJmxlbiwgJndjaGFyKSkKCQljb250aW51ZTsKICAgIAoJICAgIC8qCgkgICAgICogQWxsb2NhdGUgcGxlbnR5IG9mIHNwYWNlLiAgRnJlZWQgYmVsb3cKCSAgICAgKi8KCSAgICB1dGY4ID0gbWFsbG9jIChsZW4gKiBGQ19VVEY4X01BWF9MRU4gKyAxKTsKCSAgICBpZiAoIXV0ZjgpCgkJY29udGludWU7CgkJCgkgICAgdTggPSB1dGY4OwoJICAgIAoJICAgIHdoaWxlICgoaWxlbiA9IEZjVXRmMTZUb1VjczQgKHNyYywgRmNFbmRpYW5CaWcsICZ1Y3M0LCBzcmNfbGVuKSkgPiAwKQoJICAgIHsKCQlzcmNfbGVuIC09IGlsZW47CgkJc3JjICs9IGlsZW47CgkJb2xlbiA9IEZjVWNzNFRvVXRmOCAodWNzNCwgdTgpOwoJCXU4ICs9IG9sZW47CgkgICAgfQoJICAgICp1OCA9ICdcMCc7CgkgICAgYnJlYWs7CgljYXNlIEZjTmFtZUVuY29kaW5nTGF0aW4xOgoJICAgIC8qCgkgICAgICogQ29udmVydCBMYXRpbjEgdG8gVXRmOC4gRnJlZWQgYmVsb3cKCSAgICAgKi8KCSAgICB1dGY4ID0gbWFsbG9jIChzcmNfbGVuICogMiArIDEpOwoJICAgIGlmICghdXRmOCkKCQljb250aW51ZTsKCgkgICAgdTggPSB1dGY4OwoJICAgIHdoaWxlIChzcmNfbGVuID4gMCkKCSAgICB7CgkJdWNzNCA9ICpzcmMrKzsKCQlzcmNfbGVuLS07CgkJb2xlbiA9IEZjVWNzNFRvVXRmOCAodWNzNCwgdTgpOwoJCXU4ICs9IG9sZW47CgkgICAgfQoJICAgICp1OCA9ICdcMCc7CgkgICAgYnJlYWs7CgljYXNlIEZjTmFtZUVuY29kaW5nQXBwbGVSb21hbjoKCSAgICAvKgoJICAgICAqIENvbnZlcnQgQXBwbGVSb21hbiB0byBVdGY4CgkgICAgICovCgkgICAgbWFwID0gRmNGcmVlVHlwZUdldFByaXZhdGVNYXAgKGZ0X2VuY29kaW5nX2FwcGxlX3JvbWFuKTsKCSAgICBpZiAoIW1hcCkKCQljb250aW51ZTsKCgkgICAgLyogZnJlZWQgYmVsb3cgKi8KCSAgICB1dGY4ID0gbWFsbG9jIChzcmNfbGVuICogMyArIDEpOwoJICAgIGlmICghdXRmOCkKCQljb250aW51ZTsKCgkgICAgdTggPSB1dGY4OwoJICAgIHdoaWxlIChzcmNfbGVuID4gMCkKCSAgICB7CgkJdWNzNCA9IEZjRnJlZVR5cGVQcml2YXRlVG9VY3M0ICgqc3JjKyssIG1hcCk7CgkJc3JjX2xlbi0tOwoJCW9sZW4gPSBGY1VjczRUb1V0ZjggKHVjczQsIHU4KTsKCQl1OCArPSBvbGVuOwoJICAgIH0KCSAgICAqdTggPSAnXDAnOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBjb250aW51ZTsKCX0KCWlmICgocHJpbyAmIEZDX05BTUVfUFJJT19MQU5HKSA9PSBGQ19OQU1FX1BSSU9fTEFOR19OT05FKQoJICAgIGlmIChGY1V0ZjhJc0xhdGluICh1dGY4LCBzdHJsZW4gKChjaGFyICopIHV0ZjgpKSkKCQlwcmlvIHw9IEZDX05BTUVfUFJJT19MQU5HX0xBVElOOwoJCQkgICAgICAgCglpZiAoRmNEZWJ1ZyAoKSAmIEZDX0RCR19TQ0FOVikKCSAgICBwcmludGYgKCJcbmZvdW5kIG5hbWUgKG5hbWUgJWQgcGxhdGZvcm0gJWQgZW5jb2RpbmcgJWQgbGFuZ3VhZ2UgMHgleCBwcmlvIDB4JXgpICVzXG4iLAoJCSAgICBzbmFtZS5uYW1lX2lkLCBzbmFtZS5wbGF0Zm9ybV9pZCwKCQkgICAgc25hbWUuZW5jb2RpbmdfaWQsIHNuYW1lLmxhbmd1YWdlX2lkLAoJCSAgICBwcmlvLCB1dGY4KTsKICAgIAoJc3dpdGNoIChzbmFtZS5uYW1lX2lkKSB7CgljYXNlIFRUX05BTUVfSURfRk9OVF9GQU1JTFk6CgljYXNlIFRUX05BTUVfSURfUFNfTkFNRToKCSAgICBpZiAoIWZhbWlseSB8fCBwcmlvID4gZmFtaWx5X3ByaW8pCgkgICAgewoJCWlmIChmYW1pbHkpCgkJICAgIGZyZWUgKGZhbWlseSk7CgkJZmFtaWx5ID0gdXRmODsKCQl1dGY4ID0gMDsKCQlmYW1pbHlfYWxsb2NhdGVkID0gRmNUcnVlOwoJCWZhbWlseV9wcmlvID0gcHJpbzsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIFRUX05BTUVfSURfRk9OVF9TVUJGQU1JTFk6CgkgICAgaWYgKCFzdHlsZSB8fCBwcmlvID4gc3R5bGVfcHJpbykKCSAgICB7CgkJaWYgKHN0eWxlKQoJCSAgICBmcmVlIChzdHlsZSk7CgkJc3R5bGUgPSB1dGY4OwoJCXV0ZjggPSAwOwoJCXN0eWxlX2FsbG9jYXRlZCA9IEZjVHJ1ZTsKCQlzdHlsZV9wcmlvID0gcHJpbzsKCSAgICB9CgkgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUVF9OQU1FX0lEX1RSQURFTUFSSzoKICAgICAgICBjYXNlIFRUX05BTUVfSURfTUFOVUZBQ1RVUkVSOgoJICAgIC8qIElmIHRoZSBmb3VuZHJ5IHdhc24ndCBmb3VuZCBpbiB0aGUgT1MvMiB0YWJsZSwgbG9vayBoZXJlICovCiAgICAgICAgICAgIGlmKCFmb3VuZHJ5KQogICAgICAgICAgICAgICAgZm91bmRyeSA9IEZjTm90aWNlRm91bmRyeSh1dGY4KTsKICAgICAgICAgICAgYnJlYWs7Cgl9CglpZiAodXRmOCkKCSAgICBmcmVlICh1dGY4KTsKICAgIH0KICAgIAogICAgaWYgKCFmYW1pbHkpCglmYW1pbHkgPSAoRmNDaGFyOCAqKSBmYWNlLT5mYW1pbHlfbmFtZTsKICAgIAogICAgaWYgKCFzdHlsZSkKCXN0eWxlID0gKEZjQ2hhcjggKikgZmFjZS0+c3R5bGVfbmFtZTsKICAgIAogICAgaWYgKCFmYW1pbHkpCiAgICB7CglGY0NoYXI4CSpzdGFydCwgKmVuZDsKCQoJc3RhcnQgPSAoRmNDaGFyOCAqKSBzdHJyY2hyICgoY2hhciAqKSBmaWxlLCAnLycpOwoJaWYgKHN0YXJ0KQoJICAgIHN0YXJ0Kys7CgllbHNlCgkgICAgc3RhcnQgPSAoRmNDaGFyOCAqKSBmaWxlOwoJZW5kID0gKEZjQ2hhcjggKikgc3RycmNociAoKGNoYXIgKikgc3RhcnQsICcuJyk7CglpZiAoIWVuZCkKCSAgICBlbmQgPSBzdGFydCArIHN0cmxlbiAoKGNoYXIgKikgc3RhcnQpOwoJLyogZnJlZWQgYmVsb3cgKi8KCWZhbWlseSA9IG1hbGxvYyAoZW5kIC0gc3RhcnQgKyAxKTsKCXN0cm5jcHkgKChjaGFyICopIGZhbWlseSwgKGNoYXIgKikgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKCWZhbWlseVtlbmQgLSBzdGFydF0gPSAnXDAnOwoJZmFtaWx5X2FsbG9jYXRlZCA9IEZjVHJ1ZTsKICAgIH0KCiAgICBpZiAoRmNEZWJ1ZygpICYgRkNfREJHX1NDQU4pCglwcmludGYgKCJcIiVzXCIgXCIlc1wiICIsIGZhbWlseSwgc3R5bGUgPyBzdHlsZSA6IChGY0NoYXI4ICopICI8bm9uZT4iKTsKCiAgICBpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19GQU1JTFksIGZhbWlseSkpCiAgICB7CglpZiAoZmFtaWx5X2FsbG9jYXRlZCkKCSAgICBmcmVlIChmYW1pbHkpOwoJaWYgKHN0eWxlX2FsbG9jYXRlZCkKCSAgICBmcmVlIChzdHlsZSk7Cglnb3RvIGJhaWwxOwogICAgfQoKICAgIGlmIChmYW1pbHlfYWxsb2NhdGVkKQoJZnJlZSAoZmFtaWx5KTsKCiAgICBpZiAoc3R5bGUpCiAgICB7CglpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19TVFlMRSwgc3R5bGUpKQoJewoJICAgIGlmIChzdHlsZV9hbGxvY2F0ZWQpCgkJZnJlZSAoc3R5bGUpOwoJICAgIGdvdG8gYmFpbDE7Cgl9CglpZiAoc3R5bGVfYWxsb2NhdGVkKQoJICAgIGZyZWUgKHN0eWxlKTsKICAgIH0KCiAgICBpZiAoIUZjUGF0dGVybkFkZFN0cmluZyAocGF0LCBGQ19GSUxFLCBmaWxlKSkKCWdvdG8gYmFpbDE7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX0lOREVYLCBpZCkpCglnb3RvIGJhaWwxOwoKICAgIGlmICghRmNQYXR0ZXJuQWRkU3RyaW5nIChwYXQsIEZDX1NPVVJDRSwgKEZjQ2hhcjggKikgIkZyZWVUeXBlIikpCglnb3RvIGJhaWwxOwoKI2lmIDAKICAgIC8qCiAgICAgKiBkb24ndCBldmVuIHRyeSB0aGlzIC0tIENKSyAnbW9ub3NwYWNlJyBmb250cyBhcmUgcmVhbGx5CiAgICAgKiBkdWFsIHdpZHRoLCBhbmQgbW9zdCBvdGhlciBmb250cyBkb24ndCBib3RoZXIgdG8gc2V0CiAgICAgKiB0aGUgYXR0cmlidXRlLiAgU2lnaC4KICAgICAqLwogICAgaWYgKChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIKSAhPSAwKQoJaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX1NQQUNJTkcsIEZDX01PTk8pKQoJICAgIGdvdG8gYmFpbDE7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBGaW5kIHRoZSBmb250IHJldmlzaW9uIChpZiBhdmFpbGFibGUpCiAgICAgKi8KICAgIGhlYWQgPSAoVFRfSGVhZGVyICopIEZUX0dldF9TZm50X1RhYmxlIChmYWNlLCBmdF9zZm50X2hlYWQpOwogICAgaWYgKGhlYWQpCiAgICB7CglpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfRk9OVFZFUlNJT04sIGhlYWQtPkZvbnRfUmV2aXNpb24pKQoJICAgIGdvdG8gYmFpbDE7CiAgICB9CiAgICBlbHNlCiAgICB7CglpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfRk9OVFZFUlNJT04sIDApKQoJICAgIGdvdG8gYmFpbDE7CiAgICB9CgogICAgaWYgKG9zMiAmJiBvczItPnZlcnNpb24gPj0gMHgwMDAxICYmIG9zMi0+dmVyc2lvbiAhPSAweGZmZmYpCiAgICB7Cglmb3IgKGkgPSAwOyBpIDwgTlVNX0NPREVfUEFHRV9SQU5HRTsgaSsrKQoJewoJICAgIEZUX1VMb25nCWJpdHM7CgkgICAgaW50CQliaXQ7CgkgICAgaWYgKEZjQ29kZVBhZ2VSYW5nZVtpXS5iaXQgPCAzMikKCSAgICB7CgkJYml0cyA9IG9zMi0+dWxDb2RlUGFnZVJhbmdlMTsKCQliaXQgPSBGY0NvZGVQYWdlUmFuZ2VbaV0uYml0OwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWJpdHMgPSBvczItPnVsQ29kZVBhZ2VSYW5nZTI7CgkJYml0ID0gRmNDb2RlUGFnZVJhbmdlW2ldLmJpdCAtIDMyOwoJICAgIH0KCSAgICBpZiAoYml0cyAmICgxIDw8IGJpdCkpCgkgICAgewoJCS8qIAoJCSAqIElmIHRoZSBmb250IGFkdmVydGlzZXMgc3VwcG9ydCBmb3IgbXVsdGlwbGUKCQkgKiAiZXhjbHVzaXZlIiBsYW5ndWFnZXMsIHRoZW4gaW5jbHVkZSBzdXBwb3J0CgkJICogZm9yIGFueSBsYW5ndWFnZSBmb3VuZCB0byBoYXZlIGNvdmVyYWdlCgkJICovCgkJaWYgKGV4Y2x1c2l2ZUxhbmcpCgkJewoJCSAgICBleGNsdXNpdmVMYW5nID0gMDsKCQkgICAgYnJlYWs7CgkJfQoJCWV4Y2x1c2l2ZUxhbmcgPSBGY0NvZGVQYWdlUmFuZ2VbaV0ubGFuZzsKCSAgICB9Cgl9CiAgICB9CgogICAgaWYgKG9zMiAmJiBvczItPnZlcnNpb24gIT0gMHhmZmZmKQogICAgewoJaWYgKG9zMi0+dXNXZWlnaHRDbGFzcyA9PSAwKQoJICAgIHdlaWdodCA9IC0xOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgMTUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9USElOOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgMjUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9FWFRSQUxJR0hUOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgMzUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9MSUdIVDsKCWVsc2UgaWYgKG9zMi0+dXNXZWlnaHRDbGFzcyA8IDQ1MCkKCSAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfUkVHVUxBUjsKCWVsc2UgaWYgKG9zMi0+dXNXZWlnaHRDbGFzcyA8IDU1MCkKCSAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfTUVESVVNOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgNjUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9TRU1JQk9MRDsKCWVsc2UgaWYgKG9zMi0+dXNXZWlnaHRDbGFzcyA8IDc1MCkKCSAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfQk9MRDsKCWVsc2UgaWYgKG9zMi0+dXNXZWlnaHRDbGFzcyA8IDg1MCkKCSAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfRVhUUkFCT0xEOwoJZWxzZSBpZiAob3MyLT51c1dlaWdodENsYXNzIDwgOTUwKQoJICAgIHdlaWdodCA9IEZDX1dFSUdIVF9CTEFDSzsKCWVsc2UKCSAgICB3ZWlnaHQgPSBGQ19XRUlHSFRfTUVESVVNOwoKCXN3aXRjaCAob3MyLT51c1dpZHRoQ2xhc3MpIHsKCWNhc2UgMToJd2lkdGggPSBGQ19XSURUSF9VTFRSQUNPTkRFTlNFRDsgYnJlYWs7CgljYXNlIDI6CXdpZHRoID0gRkNfV0lEVEhfRVhUUkFDT05ERU5TRUQ7IGJyZWFrOwoJY2FzZSAzOgl3aWR0aCA9IEZDX1dJRFRIX0NPTkRFTlNFRDsgYnJlYWs7CgljYXNlIDQ6CXdpZHRoID0gRkNfV0lEVEhfU0VNSUNPTkRFTlNFRDsgYnJlYWs7CgljYXNlIDU6CXdpZHRoID0gRkNfV0lEVEhfTk9STUFMOyBicmVhazsKCWNhc2UgNjoJd2lkdGggPSBGQ19XSURUSF9TRU1JRVhQQU5ERUQ7IGJyZWFrOwoJY2FzZSA3Ogl3aWR0aCA9IEZDX1dJRFRIX0VYUEFOREVEOyBicmVhazsKCWNhc2UgODoJd2lkdGggPSBGQ19XSURUSF9FWFRSQUVYUEFOREVEOyBicmVhazsKCWNhc2UgOToJd2lkdGggPSBGQ19XSURUSF9VTFRSQUVYUEFOREVEOyBicmVhazsKCX0KICAgIH0KCiAgICAvKgogICAgICogVHlwZSAxOiBDaGVjayBmb3IgRm9udEluZm8gZGljdGlvbmFyeSBpbmZvcm1hdGlvbgogICAgICogQ29kZSBmcm9tIGcyQG1hZ2VzdHVkaW9zLm5ldCAoR2VyYXJkIEVzY2FsYW50ZSkKICAgICAqLwogICAgCiAgICBpZiAoRlRfR2V0X1BTX0ZvbnRfSW5mbyhmYWNlLCAmcHNmb250aW5mbykgPT0gMCkKICAgIHsKCWlmIChwc2ZvbnRpbmZvLndlaWdodCkKCXsKCSAgICBzdGF0aWMgc3RydWN0IHsKCQljaGFyICAgICpuYW1lOwoJCWludAl2YWx1ZTsKCSAgICB9IHBzX3dlaWdodHNbXSA9IHsKCQl7ICJ0aGluIiwJCUZDX1dFSUdIVF9USElOIH0sCgkJeyAiZXh0cmFsaWdodCIsCQlGQ19XRUlHSFRfRVhUUkFMSUdIVCB9LAoJCXsgInVsdHJhbGlnaHQiLAkJRkNfV0VJR0hUX1VMVFJBTElHSFQgfSwKCQl7ICJsaWdodCIsCQlGQ19XRUlHSFRfTElHSFQgfSwKCQl7ICJyZWd1bGFyIiwJCUZDX1dFSUdIVF9SRUdVTEFSIH0sCgkJeyAibm9ybWFsIiwJCUZDX1dFSUdIVF9OT1JNQUwgfSwKCQl7ICJtZWRpdW0iLAkJRkNfV0VJR0hUX01FRElVTSB9LAoJCXsgImRlbWlib2xkIiwJCUZDX1dFSUdIVF9ERU1JQk9MRCB9LAoJCXsgInNlbWlib2xkIiwJCUZDX1dFSUdIVF9TRU1JQk9MRCB9LAoJCXsgImJvbGQiLAkJRkNfV0VJR0hUX0JPTEQgfSwKCQl7ICJleHRyYWJvbGQiLAkJRkNfV0VJR0hUX0VYVFJBQk9MRCB9LAoJCXsgInVsdHJhYm9sZCIsCQlGQ19XRUlHSFRfVUxUUkFCT0xEIH0sCgkJeyAiYmxhY2siLAkJRkNfV0VJR0hUX0JMQUNLIH0sCgkJeyAiaGVhdnkiLAkJRkNfV0VJR0hUX0hFQVZZIH0sCgkgICAgfTsKI2RlZmluZSBOVU1fUFNfV0VJR0hUUwkoc2l6ZW9mIChwc193ZWlnaHRzKSAvIHNpemVvZiAocHNfd2VpZ2h0c1swXSkpCgkgICAgaW50CXc7CgkgICAgZm9yICh3ID0gMDsgdyA8IE5VTV9QU19XRUlHSFRTOyB3KyspCgkJaWYgKCFGY1N0ckNtcElnbm9yZUNhc2UgKChGY0NoYXI4ICopIHBzX3dlaWdodHNbd10ubmFtZSwKCQkJCQkgKEZjQ2hhcjggKikgcHNmb250aW5mby53ZWlnaHQpKQoJCXsKCQkgICAgd2VpZ2h0ID0gcHNfd2VpZ2h0c1t3XS52YWx1ZTsKCQkgICAgYnJlYWs7CgkJfQoJfQogICAgIAojaWYgMAoJLyogCgkgKiBEb24ndCBib3RoZXIgd2l0aCBpdGFsaWNfYW5nbGU7IEZyZWVUeXBlIGFscmVhZHkgZXh0cmFjdHMgdGhhdAoJICogaW5mb3JtYXRpb24gZm9yIHVzIGFuZCBzdGlja3MgaXQgaW50byBzdHlsZV9mbGFncwoJICovCiAgICAgICAgaWYgKHBzZm9udGluZm8uaXRhbGljX2FuZ2xlIDwgMCkgCiAgICAgICAgICAgIHNsYW50ID0gRkNfU0xBTlRfSVRBTElDOyAKICAgICAgICBlbHNlIGlmIChwc2ZvbnRpbmZvLml0YWxpY19hbmdsZSA+PSAwKSAKICAgICAgICAgICAgc2xhbnQgPSBGQ19TTEFOVF9ST01BTjsgCiNlbmRpZgoKICAgICAgICBpZighZm91bmRyeSkKICAgICAgICAgICAgZm91bmRyeSA9IEZjTm90aWNlRm91bmRyeShwc2ZvbnRpbmZvLm5vdGljZSk7CiAgICB9CiAgICAKI2lmZGVmIFVTRV9GVEJERgogICAgLyoKICAgICAqIEZpbmFsbHksIGxvb2sgZm9yIGEgRk9VTkRSWSBCREYgcHJvcGVydHkgaWYgbm8gb3RoZXIKICAgICAqIG1lY2hhbmlzbSBoYXMgbWFuYWdlZCB0byBsb2NhdGUgYSBmb3VuZHJ5CiAgICAgKi8KCiAgICBpZiAoIWZvdW5kcnkpCiAgICB7CglpbnQgICAgICAgICAgICAgcmM7CglCREZfUHJvcGVydHlSZWMgcHJvcDsKCXJjID0gTVlfR2V0X0JERl9Qcm9wZXJ0eShmYWNlLCAiRk9VTkRSWSIsICZwcm9wKTsKCWlmKHJjID09IDAgJiYgcHJvcC50eXBlID09IEJERl9QUk9QRVJUWV9UWVBFX0FUT00pCgkgICAgZm91bmRyeSA9IHByb3AudS5hdG9tOwogICAgfQoKICAgIGlmICh3aWR0aCA9PSAtMSkKICAgIHsKCUJERl9Qcm9wZXJ0eVJlYyBwcm9wOwoJaWYgKE1ZX0dldF9CREZfUHJvcGVydHkoZmFjZSwgIlJFTEFUSVZFX1NFVFdJRFRIIiwgJnByb3ApID09IDAgJiYKCSAgICAocHJvcC50eXBlID09IEJERl9QUk9QRVJUWV9UWVBFX0lOVEVHRVIgfHwKCSAgICAgcHJvcC50eXBlID09IEJERl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMKSkKCXsKCSAgICBGVF9JbnQzMgl2YWx1ZTsKCSAgICAKCSAgICBpZiAocHJvcC50eXBlID09IEJERl9QUk9QRVJUWV9UWVBFX0lOVEVHRVIpCgkJdmFsdWUgPSBwcm9wLnUuaW50ZWdlcjsKCSAgICBlbHNlCgkJdmFsdWUgPSAoRlRfSW50MzIpIHByb3AudS5jYXJkaW5hbDsKCSAgICBzd2l0Y2ggKCh2YWx1ZSArIDUpIC8gMTApIHsKCSAgICBjYXNlIDE6IHdpZHRoID0gRkNfV0lEVEhfVUxUUkFDT05ERU5TRUQ7IGJyZWFrOwoJICAgIGNhc2UgMjogd2lkdGggPSBGQ19XSURUSF9FWFRSQUNPTkRFTlNFRDsgYnJlYWs7CgkgICAgY2FzZSAzOiB3aWR0aCA9IEZDX1dJRFRIX0NPTkRFTlNFRDsgYnJlYWs7CgkgICAgY2FzZSA0OiB3aWR0aCA9IEZDX1dJRFRIX1NFTUlDT05ERU5TRUQ7IGJyZWFrOwoJICAgIGNhc2UgNTogd2lkdGggPSBGQ19XSURUSF9OT1JNQUw7IGJyZWFrOwoJICAgIGNhc2UgNjogd2lkdGggPSBGQ19XSURUSF9TRU1JRVhQQU5ERUQ7IGJyZWFrOwoJICAgIGNhc2UgNzogd2lkdGggPSBGQ19XSURUSF9FWFBBTkRFRDsgYnJlYWs7CgkgICAgY2FzZSA4OiB3aWR0aCA9IEZDX1dJRFRIX0VYVFJBRVhQQU5ERUQ7IGJyZWFrOwoJICAgIGNhc2UgOTogd2lkdGggPSBGQ19XSURUSF9VTFRSQUVYUEFOREVEOyBicmVhazsKCSAgICB9Cgl9CgllbHNlIGlmIChNWV9HZXRfQkRGX1Byb3BlcnR5IChmYWNlLCAiU0VUV0lEVEhfTkFNRSIsICZwcm9wKSA9PSAwICYmCgkJIHByb3AudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9BVE9NKQoJewoJICAgIHN0YXRpYyBzdHJ1Y3QgewoJCUZjQ2hhcjgJICAgICp3aWR0aF9uYW1lOwoJCWludAkgICAgd2lkdGg7CgkgICAgfSBGY1NldFdpZHRoc1tdID0gewoJCXsgIkNvbmRlbnNlZCIsCSAgICBGQ19XSURUSF9DT05ERU5TRUQgfSwKCQl7ICJTZW1pQ29uZGVuc2VkIiwgIEZDX1dJRFRIX1NFTUlDT05ERU5TRUQgfSwKCQl7ICJOb3JtYWwiLAkgICAgRkNfV0lEVEhfTk9STUFMIH0sCgkgICAgfTsKCSAgICBpbnQJaTsKCgkgICAgaWYgKEZjRGVidWcgKCkgJiBGQ19EQkdfU0NBTlYpCgkJcHJpbnRmICgiXG5zZXR3aWR0aDogJXNcbiIsIHByb3AudS5hdG9tKTsKCSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChGY1NldFdpZHRocykgLyBzaXplb2YgKEZjU2V0V2lkdGhzWzBdKTsgaSsrKQoJCWlmICghRmNTdHJDbXBJZ25vcmVDYXNlICgoRmNDaGFyOCAqKSBwcm9wLnUuYXRvbSwKCQkJCQkgRmNTZXRXaWR0aHNbaV0ud2lkdGhfbmFtZSkpCgkJewoJCSAgICB3aWR0aCA9IEZjU2V0V2lkdGhzW2ldLndpZHRoOwoJCSAgICBicmVhazsKCQl9Cgl9CiAgICB9CgojZW5kaWYKCiAgICBpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfU0xBTlQsIHNsYW50KSkKCWdvdG8gYmFpbDE7CgogICAgaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX1dFSUdIVCwgd2VpZ2h0KSkKCWdvdG8gYmFpbDE7CgogICAgaWYgKHdpZHRoICE9IC0xKQoJaWYgKCFGY1BhdHRlcm5BZGRJbnRlZ2VyIChwYXQsIEZDX1dJRFRILCB3aWR0aCkpCgkgICAgZ290byBiYWlsMTsKCiAgICBpZihmb3VuZHJ5KSAKICAgIHsKICAgICAgICBpZighRmNQYXR0ZXJuQWRkU3RyaW5nIChwYXQsIEZDX0ZPVU5EUlksIGZvdW5kcnkpKQogICAgICAgICAgICBnb3RvIGJhaWwxOwogICAgfQoKICAgIC8qCiAgICAgKiBDb21wdXRlIHRoZSB1bmljb2RlIGNvdmVyYWdlIGZvciB0aGUgZm9udAogICAgICovCiAgICBjcyA9IEZjRnJlZVR5cGVDaGFyU2V0QW5kU3BhY2luZyAoZmFjZSwgYmxhbmtzLCAmc3BhY2luZyk7CiAgICBpZiAoIWNzKQoJZ290byBiYWlsMTsKCiAgICAvKgogICAgICogU2tpcCBvdmVyIFBDRiBmb250cyB0aGF0IGhhdmUgbm8gZW5jb2RlZCBjaGFyYWN0ZXJzOyB0aGV5J3JlCiAgICAgKiB1c3VhbGx5IGp1c3QgVW5pY29kZSBmb250cyB0cmFuc2NvZGVkIHRvIHNvbWUgbGVnYWN5IGVuY29kaW5nCiAgICAgKi8KICAgIGlmIChGY0NoYXJTZXRDb3VudCAoY3MpID09IDApCiAgICB7CglpZiAoIXN0cmNtcChGVF9NT0RVTEVfQ0xBU1MoJmZhY2UtPmRyaXZlci0+cm9vdCktPm1vZHVsZV9uYW1lLCAicGNmIikpCgkgICAgZ290byBiYWlsMjsKICAgIH0KCiAgICBpZiAoIUZjUGF0dGVybkFkZENoYXJTZXQgKHBhdCwgRkNfQ0hBUlNFVCwgY3MpKQoJZ290byBiYWlsMjsKCiAgICBscyA9IEZjRnJlZVR5cGVMYW5nU2V0IChjcywgZXhjbHVzaXZlTGFuZyk7CiAgICBpZiAoIWxzKQoJZ290byBiYWlsMjsKCiAgICBpZiAoIUZjUGF0dGVybkFkZExhbmdTZXQgKHBhdCwgRkNfTEFORywgbHMpKQoJZ290byBiYWlsMjsKCiAgICBpZiAoc3BhY2luZyAhPSBGQ19QUk9QT1JUSU9OQUwpCglpZiAoIUZjUGF0dGVybkFkZEludGVnZXIgKHBhdCwgRkNfU1BBQ0lORywgc3BhY2luZykpCgkgICAgZ290byBiYWlsMjsKCiAgICAvKgogICAgICogRHJvcCBvdXIgcmVmZXJlbmNlIHRvIHRoZSBjaGFyc2V0CiAgICAgKi8KICAgIEZjQ2hhclNldERlc3Ryb3kgKGNzKTsKICAgIAogICAgaWYgKCEoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkpCiAgICB7Cglmb3IgKGkgPSAwOyBpIDwgZmFjZS0+bnVtX2ZpeGVkX3NpemVzOyBpKyspCgkgICAgaWYgKCFGY1BhdHRlcm5BZGREb3VibGUgKHBhdCwgRkNfUElYRUxfU0laRSwKCQkJCSAgICAgRmNHZXRQaXhlbFNpemUgKGZhY2UsIGkpKSkKCQlnb3RvIGJhaWwxOwoJaWYgKCFGY1BhdHRlcm5BZGRCb29sIChwYXQsIEZDX0FOVElBTElBUywgRmNGYWxzZSkpCgkgICAgZ290byBiYWlsMTsKICAgIH0KCiAgICBGVF9Eb25lX0ZhY2UgKGZhY2UpOwogICAgRlRfRG9uZV9GcmVlVHlwZSAoZnRMaWJyYXJ5KTsKICAgIHJldHVybiBwYXQ7CgpiYWlsMjoKICAgIEZjQ2hhclNldERlc3Ryb3kgKGNzKTsKYmFpbDE6CiAgICBGY1BhdHRlcm5EZXN0cm95IChwYXQpOwpiYWlsMDoKICAgIEZUX0RvbmVfRmFjZSAoZmFjZSk7CmJhaWw6CiAgICBGVF9Eb25lX0ZyZWVUeXBlIChmdExpYnJhcnkpOwogICAgcmV0dXJuIDA7Cn0KCgovKgogKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhlIGF2YWlsYWJsZSBmcmVldHlwZSBoYXMgRlRfR2V0X05leHRfQ2hhcgogKi8KCiNpZiBGUkVFVFlQRV9NQUpPUiA+IDIKIyBkZWZpbmUgSEFTX05FWFRfQ0hBUgojZWxzZQojIGlmIEZSRUVUWVBFX01BSk9SID09IDIKIyAgaWYgRlJFRVRZUEVfTUlOT1IgPiAwCiMgICBkZWZpbmUgSEFTX05FWFRfQ0hBUgojICBlbHNlCiMgICBpZiBGUkVFVFlQRV9NSU5PUiA9PSAwCiMgICAgaWYgRlJFRVRZUEVfUEFUQ0ggPj0gOQojICAgICBkZWZpbmUgSEFTX05FWFRfQ0hBUgojICAgIGVuZGlmCiMgICBlbmRpZgojICBlbmRpZgojIGVuZGlmCiNlbmRpZgoKLyoKICogRm9yIG91ciBwdXJwb3NlcywgdGhpcyBhcHByb3hpbWF0aW9uIGlzIHN1ZmZpY2llbnQKICovCiNpZm5kZWYgSEFTX05FWFRfQ0hBUgojZGVmaW5lIEZUX0dldF9GaXJzdF9DaGFyKGZhY2UsIGdpKSAoKCooZ2kpID0gMSksIDEpCiNkZWZpbmUgRlRfR2V0X05leHRfQ2hhcihmYWNlLCB1Y3M0LCBnaSkgKCh1Y3M0KSA+PSAweGZmZmZmZiA/IFwKCQkJCQkgICgqKGdpKSA9IDApLCAwIDogXAoJCQkJCSAgKCooZ2kpID0gMSksICh1Y3M0KSArIDEpCiN3YXJuaW5nICJObyBGVF9HZXRfTmV4dF9DaGFyIgojZW5kaWYKCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJFbnQgewogICAgRmNDaGFyMTYJICAgIGJtcDsKICAgIHVuc2lnbmVkIGNoYXIgICBlbmNvZGU7Cn0gRmNDaGFyRW50OwoKc3RydWN0IF9GY0NoYXJNYXAgewogICAgY29uc3QgRmNDaGFyRW50ICplbnQ7CiAgICBpbnQJCSAgICBuZW50Owp9OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRm9udERlY29kZSB7CiAgICBGVF9FbmNvZGluZwkgICAgZW5jb2Rpbmc7CiAgICBjb25zdCBGY0NoYXJNYXAgKm1hcDsKICAgIEZjQ2hhcjMyCSAgICBtYXg7Cn0gRmNGb250RGVjb2RlOwoKc3RhdGljIGNvbnN0IEZjQ2hhckVudCBBcHBsZVJvbWFuRW50W10gPSB7CiAgICB7IDB4MDAyMCwgMHgyMCB9LCAvKiBTUEFDRSAqLwogICAgeyAweDAwMjEsIDB4MjEgfSwgLyogRVhDTEFNQVRJT04gTUFSSyAqLwogICAgeyAweDAwMjIsIDB4MjIgfSwgLyogUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgwMDIzLCAweDIzIH0sIC8qIE5VTUJFUiBTSUdOICovCiAgICB7IDB4MDAyNCwgMHgyNCB9LCAvKiBET0xMQVIgU0lHTiAqLwogICAgeyAweDAwMjUsIDB4MjUgfSwgLyogUEVSQ0VOVCBTSUdOICovCiAgICB7IDB4MDAyNiwgMHgyNiB9LCAvKiBBTVBFUlNBTkQgKi8KICAgIHsgMHgwMDI3LCAweDI3IH0sIC8qIEFQT1NUUk9QSEUgKi8KICAgIHsgMHgwMDI4LCAweDI4IH0sIC8qIExFRlQgUEFSRU5USEVTSVMgKi8KICAgIHsgMHgwMDI5LCAweDI5IH0sIC8qIFJJR0hUIFBBUkVOVEhFU0lTICovCiAgICB7IDB4MDAyQSwgMHgyQSB9LCAvKiBBU1RFUklTSyAqLwogICAgeyAweDAwMkIsIDB4MkIgfSwgLyogUExVUyBTSUdOICovCiAgICB7IDB4MDAyQywgMHgyQyB9LCAvKiBDT01NQSAqLwogICAgeyAweDAwMkQsIDB4MkQgfSwgLyogSFlQSEVOLU1JTlVTICovCiAgICB7IDB4MDAyRSwgMHgyRSB9LCAvKiBGVUxMIFNUT1AgKi8KICAgIHsgMHgwMDJGLCAweDJGIH0sIC8qIFNPTElEVVMgKi8KICAgIHsgMHgwMDMwLCAweDMwIH0sIC8qIERJR0lUIFpFUk8gKi8KICAgIHsgMHgwMDMxLCAweDMxIH0sIC8qIERJR0lUIE9ORSAqLwogICAgeyAweDAwMzIsIDB4MzIgfSwgLyogRElHSVQgVFdPICovCiAgICB7IDB4MDAzMywgMHgzMyB9LCAvKiBESUdJVCBUSFJFRSAqLwogICAgeyAweDAwMzQsIDB4MzQgfSwgLyogRElHSVQgRk9VUiAqLwogICAgeyAweDAwMzUsIDB4MzUgfSwgLyogRElHSVQgRklWRSAqLwogICAgeyAweDAwMzYsIDB4MzYgfSwgLyogRElHSVQgU0lYICovCiAgICB7IDB4MDAzNywgMHgzNyB9LCAvKiBESUdJVCBTRVZFTiAqLwogICAgeyAweDAwMzgsIDB4MzggfSwgLyogRElHSVQgRUlHSFQgKi8KICAgIHsgMHgwMDM5LCAweDM5IH0sIC8qIERJR0lUIE5JTkUgKi8KICAgIHsgMHgwMDNBLCAweDNBIH0sIC8qIENPTE9OICovCiAgICB7IDB4MDAzQiwgMHgzQiB9LCAvKiBTRU1JQ09MT04gKi8KICAgIHsgMHgwMDNDLCAweDNDIH0sIC8qIExFU1MtVEhBTiBTSUdOICovCiAgICB7IDB4MDAzRCwgMHgzRCB9LCAvKiBFUVVBTFMgU0lHTiAqLwogICAgeyAweDAwM0UsIDB4M0UgfSwgLyogR1JFQVRFUi1USEFOIFNJR04gKi8KICAgIHsgMHgwMDNGLCAweDNGIH0sIC8qIFFVRVNUSU9OIE1BUksgKi8KICAgIHsgMHgwMDQwLCAweDQwIH0sIC8qIENPTU1FUkNJQUwgQVQgKi8KICAgIHsgMHgwMDQxLCAweDQxIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgKi8KICAgIHsgMHgwMDQyLCAweDQyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEIgKi8KICAgIHsgMHgwMDQzLCAweDQzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEMgKi8KICAgIHsgMHgwMDQ0LCAweDQ0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEQgKi8KICAgIHsgMHgwMDQ1LCAweDQ1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgKi8KICAgIHsgMHgwMDQ2LCAweDQ2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEYgKi8KICAgIHsgMHgwMDQ3LCAweDQ3IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEcgKi8KICAgIHsgMHgwMDQ4LCAweDQ4IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEggKi8KICAgIHsgMHgwMDQ5LCAweDQ5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgKi8KICAgIHsgMHgwMDRBLCAweDRBIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEogKi8KICAgIHsgMHgwMDRCLCAweDRCIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEsgKi8KICAgIHsgMHgwMDRDLCAweDRDIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEwgKi8KICAgIHsgMHgwMDRELCAweDREIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE0gKi8KICAgIHsgMHgwMDRFLCAweDRFIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE4gKi8KICAgIHsgMHgwMDRGLCAweDRGIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gKi8KICAgIHsgMHgwMDUwLCAweDUwIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFAgKi8KICAgIHsgMHgwMDUxLCAweDUxIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFEgKi8KICAgIHsgMHgwMDUyLCAweDUyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFIgKi8KICAgIHsgMHgwMDUzLCAweDUzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFMgKi8KICAgIHsgMHgwMDU0LCAweDU0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFQgKi8KICAgIHsgMHgwMDU1LCAweDU1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgKi8KICAgIHsgMHgwMDU2LCAweDU2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFYgKi8KICAgIHsgMHgwMDU3LCAweDU3IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFcgKi8KICAgIHsgMHgwMDU4LCAweDU4IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFggKi8KICAgIHsgMHgwMDU5LCAweDU5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFkgKi8KICAgIHsgMHgwMDVBLCAweDVBIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFogKi8KICAgIHsgMHgwMDVCLCAweDVCIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgKi8KICAgIHsgMHgwMDVDLCAweDVDIH0sIC8qIFJFVkVSU0UgU09MSURVUyAqLwogICAgeyAweDAwNUQsIDB4NUQgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQgKi8KICAgIHsgMHgwMDVFLCAweDVFIH0sIC8qIENJUkNVTUZMRVggQUNDRU5UICovCiAgICB7IDB4MDA1RiwgMHg1RiB9LCAvKiBMT1cgTElORSAqLwogICAgeyAweDAwNjAsIDB4NjAgfSwgLyogR1JBVkUgQUNDRU5UICovCiAgICB7IDB4MDA2MSwgMHg2MSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSAqLwogICAgeyAweDAwNjIsIDB4NjIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEIgKi8KICAgIHsgMHgwMDYzLCAweDYzIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBDICovCiAgICB7IDB4MDA2NCwgMHg2NCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRCAqLwogICAgeyAweDAwNjUsIDB4NjUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgKi8KICAgIHsgMHgwMDY2LCAweDY2IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBGICovCiAgICB7IDB4MDA2NywgMHg2NyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRyAqLwogICAgeyAweDAwNjgsIDB4NjggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEggKi8KICAgIHsgMHgwMDY5LCAweDY5IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJICovCiAgICB7IDB4MDA2QSwgMHg2QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSiAqLwogICAgeyAweDAwNkIsIDB4NkIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEsgKi8KICAgIHsgMHgwMDZDLCAweDZDIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBMICovCiAgICB7IDB4MDA2RCwgMHg2RCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTSAqLwogICAgeyAweDAwNkUsIDB4NkUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE4gKi8KICAgIHsgMHgwMDZGLCAweDZGIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPICovCiAgICB7IDB4MDA3MCwgMHg3MCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUCAqLwogICAgeyAweDAwNzEsIDB4NzEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFEgKi8KICAgIHsgMHgwMDcyLCAweDcyIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBSICovCiAgICB7IDB4MDA3MywgMHg3MyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUyAqLwogICAgeyAweDAwNzQsIDB4NzQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFQgKi8KICAgIHsgMHgwMDc1LCAweDc1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVICovCiAgICB7IDB4MDA3NiwgMHg3NiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgViAqLwogICAgeyAweDAwNzcsIDB4NzcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFcgKi8KICAgIHsgMHgwMDc4LCAweDc4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBYICovCiAgICB7IDB4MDA3OSwgMHg3OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWSAqLwogICAgeyAweDAwN0EsIDB4N0EgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFogKi8KICAgIHsgMHgwMDdCLCAweDdCIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVCAqLwogICAgeyAweDAwN0MsIDB4N0MgfSwgLyogVkVSVElDQUwgTElORSAqLwogICAgeyAweDAwN0QsIDB4N0QgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCAqLwogICAgeyAweDAwN0UsIDB4N0UgfSwgLyogVElMREUgKi8KICAgIHsgMHgwMEEwLCAweENBIH0sIC8qIE5PLUJSRUFLIFNQQUNFICovCiAgICB7IDB4MDBBMSwgMHhDMSB9LCAvKiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLICovCiAgICB7IDB4MDBBMiwgMHhBMiB9LCAvKiBDRU5UIFNJR04gKi8KICAgIHsgMHgwMEEzLCAweEEzIH0sIC8qIFBPVU5EIFNJR04gKi8KICAgIHsgMHgwMEE1LCAweEI0IH0sIC8qIFlFTiBTSUdOICovCiAgICB7IDB4MDBBNywgMHhBNCB9LCAvKiBTRUNUSU9OIFNJR04gKi8KICAgIHsgMHgwMEE4LCAweEFDIH0sIC8qIERJQUVSRVNJUyAqLwogICAgeyAweDAwQTksIDB4QTkgfSwgLyogQ09QWVJJR0hUIFNJR04gKi8KICAgIHsgMHgwMEFBLCAweEJCIH0sIC8qIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SICovCiAgICB7IDB4MDBBQiwgMHhDNyB9LCAvKiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDAwQUMsIDB4QzIgfSwgLyogTk9UIFNJR04gKi8KICAgIHsgMHgwMEFFLCAweEE4IH0sIC8qIFJFR0lTVEVSRUQgU0lHTiAqLwogICAgeyAweDAwQUYsIDB4RjggfSwgLyogTUFDUk9OICovCiAgICB7IDB4MDBCMCwgMHhBMSB9LCAvKiBERUdSRUUgU0lHTiAqLwogICAgeyAweDAwQjEsIDB4QjEgfSwgLyogUExVUy1NSU5VUyBTSUdOICovCiAgICB7IDB4MDBCNCwgMHhBQiB9LCAvKiBBQ1VURSBBQ0NFTlQgKi8KICAgIHsgMHgwMEI1LCAweEI1IH0sIC8qIE1JQ1JPIFNJR04gKi8KICAgIHsgMHgwMEI2LCAweEE2IH0sIC8qIFBJTENST1cgU0lHTiAqLwogICAgeyAweDAwQjcsIDB4RTEgfSwgLyogTUlERExFIERPVCAqLwogICAgeyAweDAwQjgsIDB4RkMgfSwgLyogQ0VESUxMQSAqLwogICAgeyAweDAwQkEsIDB4QkMgfSwgLyogTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SICovCiAgICB7IDB4MDBCQiwgMHhDOCB9LCAvKiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgwMEJGLCAweEMwIH0sIC8qIElOVkVSVEVEIFFVRVNUSU9OIE1BUksgKi8KICAgIHsgMHgwMEMwLCAweENCIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwQzEsIDB4RTcgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBDMiwgMHhFNSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwQzMsIDB4Q0MgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFICovCiAgICB7IDB4MDBDNCwgMHg4MCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBDNSwgMHg4MSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqLwogICAgeyAweDAwQzYsIDB4QUUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUgKi8KICAgIHsgMHgwMEM3LCAweDgyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCiAgICB7IDB4MDBDOCwgMHhFOSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEM5LCAweDgzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwQ0EsIDB4RTYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMENCLCAweEU4IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMENDLCAweEVEIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwQ0QsIDB4RUEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBDRSwgMHhFQiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwQ0YsIDB4RUMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRDEsIDB4ODQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFICovCiAgICB7IDB4MDBEMiwgMHhGMSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEQzLCAweEVFIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRDQsIDB4RUYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEQ1LCAweENEIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERSAqLwogICAgeyAweDAwRDYsIDB4ODUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRDgsIDB4QUYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLwogICAgeyAweDAwRDksIDB4RjQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBEQSwgMHhGMiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMERCLCAweEYzIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBEQywgMHg4NiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBERiwgMHhBNyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAqLwogICAgeyAweDAwRTAsIDB4ODggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRTEsIDB4ODcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRTIsIDB4ODkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBFMywgMHg4QiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFICovCiAgICB7IDB4MDBFNCwgMHg4QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRTUsIDB4OEMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFICovCiAgICB7IDB4MDBFNiwgMHhCRSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQUUgKi8KICAgIHsgMHgwMEU3LCAweDhEIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqLwogICAgeyAweDAwRTgsIDB4OEYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRTksIDB4OEUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRUEsIDB4OTAgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBFQiwgMHg5MSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRUMsIDB4OTMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRUQsIDB4OTIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRUUsIDB4OTQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBFRiwgMHg5NSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRjEsIDB4OTYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERSAqLwogICAgeyAweDAwRjIsIDB4OTggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRjMsIDB4OTcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRjQsIDB4OTkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBGNSwgMHg5QiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFICovCiAgICB7IDB4MDBGNiwgMHg5QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRjcsIDB4RDYgfSwgLyogRElWSVNJT04gU0lHTiAqLwogICAgeyAweDAwRjgsIDB4QkYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KICAgIHsgMHgwMEY5LCAweDlEIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEZBLCAweDlDIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEZCLCAweDlFIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRkMsIDB4OUYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEZGLCAweEQ4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDEzMSwgMHhGNSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJICovCiAgICB7IDB4MDE1MiwgMHhDRSB9LCAvKiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FICovCiAgICB7IDB4MDE1MywgMHhDRiB9LCAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRSAqLwogICAgeyAweDAxNzgsIDB4RDkgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAxOTIsIDB4QzQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LICovCiAgICB7IDB4MDJDNiwgMHhGNiB9LCAvKiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQgKi8KICAgIHsgMHgwMkM3LCAweEZGIH0sIC8qIENBUk9OICovCiAgICB7IDB4MDJEOCwgMHhGOSB9LCAvKiBCUkVWRSAqLwogICAgeyAweDAyRDksIDB4RkEgfSwgLyogRE9UIEFCT1ZFICovCiAgICB7IDB4MDJEQSwgMHhGQiB9LCAvKiBSSU5HIEFCT1ZFICovCiAgICB7IDB4MDJEQiwgMHhGRSB9LCAvKiBPR09ORUsgKi8KICAgIHsgMHgwMkRDLCAweEY3IH0sIC8qIFNNQUxMIFRJTERFICovCiAgICB7IDB4MDJERCwgMHhGRCB9LCAvKiBET1VCTEUgQUNVVEUgQUNDRU5UICovCiAgICB7IDB4MDNBOSwgMHhCRCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSAqLwogICAgeyAweDAzQzAsIDB4QjkgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFBJICovCiAgICB7IDB4MjAxMywgMHhEMCB9LCAvKiBFTiBEQVNIICovCiAgICB7IDB4MjAxNCwgMHhEMSB9LCAvKiBFTSBEQVNIICovCiAgICB7IDB4MjAxOCwgMHhENCB9LCAvKiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMTksIDB4RDUgfSwgLyogUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxQSwgMHhFMiB9LCAvKiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDFDLCAweEQyIH0sIC8qIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxRCwgMHhEMyB9LCAvKiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDFFLCAweEUzIH0sIC8qIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMjAsIDB4QTAgfSwgLyogREFHR0VSICovCiAgICB7IDB4MjAyMSwgMHhFMCB9LCAvKiBET1VCTEUgREFHR0VSICovCiAgICB7IDB4MjAyMiwgMHhBNSB9LCAvKiBCVUxMRVQgKi8KICAgIHsgMHgyMDI2LCAweEM5IH0sIC8qIEhPUklaT05UQUwgRUxMSVBTSVMgKi8KICAgIHsgMHgyMDMwLCAweEU0IH0sIC8qIFBFUiBNSUxMRSBTSUdOICovCiAgICB7IDB4MjAzOSwgMHhEQyB9LCAvKiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwM0EsIDB4REQgfSwgLyogU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjA0NCwgMHhEQSB9LCAvKiBGUkFDVElPTiBTTEFTSCAqLwogICAgeyAweDIwQUMsIDB4REIgfSwgLyogRVVSTyBTSUdOICovCiAgICB7IDB4MjEyMiwgMHhBQSB9LCAvKiBUUkFERSBNQVJLIFNJR04gKi8KICAgIHsgMHgyMjAyLCAweEI2IH0sIC8qIFBBUlRJQUwgRElGRkVSRU5USUFMICovCiAgICB7IDB4MjIwNiwgMHhDNiB9LCAvKiBJTkNSRU1FTlQgKi8KICAgIHsgMHgyMjBGLCAweEI4IH0sIC8qIE4tQVJZIFBST0RVQ1QgKi8KICAgIHsgMHgyMjExLCAweEI3IH0sIC8qIE4tQVJZIFNVTU1BVElPTiAqLwogICAgeyAweDIyMUEsIDB4QzMgfSwgLyogU1FVQVJFIFJPT1QgKi8KICAgIHsgMHgyMjFFLCAweEIwIH0sIC8qIElORklOSVRZICovCiAgICB7IDB4MjIyQiwgMHhCQSB9LCAvKiBJTlRFR1JBTCAqLwogICAgeyAweDIyNDgsIDB4QzUgfSwgLyogQUxNT1NUIEVRVUFMIFRPICovCiAgICB7IDB4MjI2MCwgMHhBRCB9LCAvKiBOT1QgRVFVQUwgVE8gKi8KICAgIHsgMHgyMjY0LCAweEIyIH0sIC8qIExFU1MtVEhBTiBPUiBFUVVBTCBUTyAqLwogICAgeyAweDIyNjUsIDB4QjMgfSwgLyogR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPICovCiAgICB7IDB4MjVDQSwgMHhENyB9LCAvKiBMT1pFTkdFICovCiAgICB7IDB4RjhGRiwgMHhGMCB9LCAvKiBBcHBsZSBsb2dvICovCiAgICB7IDB4RkIwMSwgMHhERSB9LCAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGSSAqLwogICAgeyAweEZCMDIsIDB4REYgfSwgLyogTEFUSU4gU01BTEwgTElHQVRVUkUgRkwgKi8KfTsKCnN0YXRpYyBjb25zdCBGY0NoYXJNYXAgQXBwbGVSb21hbiA9IHsKICAgIEFwcGxlUm9tYW5FbnQsCiAgICBzaXplb2YgKEFwcGxlUm9tYW5FbnQpIC8gc2l6ZW9mIChBcHBsZVJvbWFuRW50WzBdKQp9OwoKc3RhdGljIGNvbnN0IEZjQ2hhckVudCBBZG9iZVN5bWJvbEVudFtdID0gewogICAgeyAweDAwMjAsIDB4MjAgfSwgLyogU1BBQ0UJIyBzcGFjZSAqLwogICAgeyAweDAwMjEsIDB4MjEgfSwgLyogRVhDTEFNQVRJT04gTUFSSwkjIGV4Y2xhbSAqLwogICAgeyAweDAwMjMsIDB4MjMgfSwgLyogTlVNQkVSIFNJR04JIyBudW1iZXJzaWduICovCiAgICB7IDB4MDAyNSwgMHgyNSB9LCAvKiBQRVJDRU5UIFNJR04JIyBwZXJjZW50ICovCiAgICB7IDB4MDAyNiwgMHgyNiB9LCAvKiBBTVBFUlNBTkQJIyBhbXBlcnNhbmQgKi8KICAgIHsgMHgwMDI4LCAweDI4IH0sIC8qIExFRlQgUEFSRU5USEVTSVMJIyBwYXJlbmxlZnQgKi8KICAgIHsgMHgwMDI5LCAweDI5IH0sIC8qIFJJR0hUIFBBUkVOVEhFU0lTCSMgcGFyZW5yaWdodCAqLwogICAgeyAweDAwMkIsIDB4MkIgfSwgLyogUExVUyBTSUdOCSMgcGx1cyAqLwogICAgeyAweDAwMkMsIDB4MkMgfSwgLyogQ09NTUEJIyBjb21tYSAqLwogICAgeyAweDAwMkUsIDB4MkUgfSwgLyogRlVMTCBTVE9QCSMgcGVyaW9kICovCiAgICB7IDB4MDAyRiwgMHgyRiB9LCAvKiBTT0xJRFVTCSMgc2xhc2ggKi8KICAgIHsgMHgwMDMwLCAweDMwIH0sIC8qIERJR0lUIFpFUk8JIyB6ZXJvICovCiAgICB7IDB4MDAzMSwgMHgzMSB9LCAvKiBESUdJVCBPTkUJIyBvbmUgKi8KICAgIHsgMHgwMDMyLCAweDMyIH0sIC8qIERJR0lUIFRXTwkjIHR3byAqLwogICAgeyAweDAwMzMsIDB4MzMgfSwgLyogRElHSVQgVEhSRUUJIyB0aHJlZSAqLwogICAgeyAweDAwMzQsIDB4MzQgfSwgLyogRElHSVQgRk9VUgkjIGZvdXIgKi8KICAgIHsgMHgwMDM1LCAweDM1IH0sIC8qIERJR0lUIEZJVkUJIyBmaXZlICovCiAgICB7IDB4MDAzNiwgMHgzNiB9LCAvKiBESUdJVCBTSVgJIyBzaXggKi8KICAgIHsgMHgwMDM3LCAweDM3IH0sIC8qIERJR0lUIFNFVkVOCSMgc2V2ZW4gKi8KICAgIHsgMHgwMDM4LCAweDM4IH0sIC8qIERJR0lUIEVJR0hUCSMgZWlnaHQgKi8KICAgIHsgMHgwMDM5LCAweDM5IH0sIC8qIERJR0lUIE5JTkUJIyBuaW5lICovCiAgICB7IDB4MDAzQSwgMHgzQSB9LCAvKiBDT0xPTgkjIGNvbG9uICovCiAgICB7IDB4MDAzQiwgMHgzQiB9LCAvKiBTRU1JQ09MT04JIyBzZW1pY29sb24gKi8KICAgIHsgMHgwMDNDLCAweDNDIH0sIC8qIExFU1MtVEhBTiBTSUdOCSMgbGVzcyAqLwogICAgeyAweDAwM0QsIDB4M0QgfSwgLyogRVFVQUxTIFNJR04JIyBlcXVhbCAqLwogICAgeyAweDAwM0UsIDB4M0UgfSwgLyogR1JFQVRFUi1USEFOIFNJR04JIyBncmVhdGVyICovCiAgICB7IDB4MDAzRiwgMHgzRiB9LCAvKiBRVUVTVElPTiBNQVJLCSMgcXVlc3Rpb24gKi8KICAgIHsgMHgwMDVCLCAweDVCIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQJIyBicmFja2V0bGVmdCAqLwogICAgeyAweDAwNUQsIDB4NUQgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQJIyBicmFja2V0cmlnaHQgKi8KICAgIHsgMHgwMDVGLCAweDVGIH0sIC8qIExPVyBMSU5FCSMgdW5kZXJzY29yZSAqLwogICAgeyAweDAwN0IsIDB4N0IgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUCSMgYnJhY2VsZWZ0ICovCiAgICB7IDB4MDA3QywgMHg3QyB9LCAvKiBWRVJUSUNBTCBMSU5FCSMgYmFyICovCiAgICB7IDB4MDA3RCwgMHg3RCB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUCSMgYnJhY2VyaWdodCAqLwogICAgeyAweDAwQTAsIDB4MjAgfSwgLyogTk8tQlJFQUsgU1BBQ0UJIyBzcGFjZSAqLwogICAgeyAweDAwQUMsIDB4RDggfSwgLyogTk9UIFNJR04JIyBsb2dpY2Fsbm90ICovCiAgICB7IDB4MDBCMCwgMHhCMCB9LCAvKiBERUdSRUUgU0lHTgkjIGRlZ3JlZSAqLwogICAgeyAweDAwQjEsIDB4QjEgfSwgLyogUExVUy1NSU5VUyBTSUdOCSMgcGx1c21pbnVzICovCiAgICB7IDB4MDBCNSwgMHg2RCB9LCAvKiBNSUNSTyBTSUdOCSMgbXUgKi8KICAgIHsgMHgwMEQ3LCAweEI0IH0sIC8qIE1VTFRJUExJQ0FUSU9OIFNJR04JIyBtdWx0aXBseSAqLwogICAgeyAweDAwRjcsIDB4QjggfSwgLyogRElWSVNJT04gU0lHTgkjIGRpdmlkZSAqLwogICAgeyAweDAxOTIsIDB4QTYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCSMgZmxvcmluICovCiAgICB7IDB4MDM5MSwgMHg0MSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQkjIEFscGhhICovCiAgICB7IDB4MDM5MiwgMHg0MiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBCSMgQmV0YSAqLwogICAgeyAweDAzOTMsIDB4NDcgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEJIyBHYW1tYSAqLwogICAgeyAweDAzOTQsIDB4NDQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEJIyBEZWx0YSAqLwogICAgeyAweDAzOTUsIDB4NDUgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgkjIEVwc2lsb24gKi8KICAgIHsgMHgwMzk2LCAweDVBIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEJIyBaZXRhICovCiAgICB7IDB4MDM5NywgMHg0OCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEJIyBFdGEgKi8KICAgIHsgMHgwMzk4LCAweDUxIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCSMgVGhldGEgKi8KICAgIHsgMHgwMzk5LCAweDQ5IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEJIyBJb3RhICovCiAgICB7IDB4MDM5QSwgMHg0QiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBLQVBQQQkjIEthcHBhICovCiAgICB7IDB4MDM5QiwgMHg0QyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1EQQkjIExhbWJkYSAqLwogICAgeyAweDAzOUMsIDB4NEQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgTVUJIyBNdSAqLwogICAgeyAweDAzOUQsIDB4NEUgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUJIyBOdSAqLwogICAgeyAweDAzOUUsIDB4NTggfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkJIyBYaSAqLwogICAgeyAweDAzOUYsIDB4NEYgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTgkjIE9taWNyb24gKi8KICAgIHsgMHgwM0EwLCAweDUwIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFBJCSMgUGkgKi8KICAgIHsgMHgwM0ExLCAweDUyIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFJITwkjIFJobyAqLwogICAgeyAweDAzQTMsIDB4NTMgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEJIyBTaWdtYSAqLwogICAgeyAweDAzQTQsIDB4NTQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCSMgVGF1ICovCiAgICB7IDB4MDNBNSwgMHg1NSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCSMgVXBzaWxvbiAqLwogICAgeyAweDAzQTYsIDB4NDYgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCSMgUGhpICovCiAgICB7IDB4MDNBNywgMHg0MyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkJIyBDaGkgKi8KICAgIHsgMHgwM0E4LCAweDU5IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFBTSQkjIFBzaSAqLwogICAgeyAweDAzQTksIDB4NTcgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EJIyBPbWVnYSAqLwogICAgeyAweDAzQjEsIDB4NjEgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCSMgYWxwaGEgKi8KICAgIHsgMHgwM0IyLCAweDYyIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCSMgYmV0YSAqLwogICAgeyAweDAzQjMsIDB4NjcgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCSMgZ2FtbWEgKi8KICAgIHsgMHgwM0I0LCAweDY0IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQkjIGRlbHRhICovCiAgICB7IDB4MDNCNSwgMHg2NSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgkjIGVwc2lsb24gKi8KICAgIHsgMHgwM0I2LCAweDdBIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBaRVRBCSMgemV0YSAqLwogICAgeyAweDAzQjcsIDB4NjggfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEVUQQkjIGV0YSAqLwogICAgeyAweDAzQjgsIDB4NzEgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBCSMgdGhldGEgKi8KICAgIHsgMHgwM0I5LCAweDY5IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBCSMgaW90YSAqLwogICAgeyAweDAzQkEsIDB4NkIgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEtBUFBBCSMga2FwcGEgKi8KICAgIHsgMHgwM0JCLCAweDZDIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQkjIGxhbWJkYSAqLwogICAgeyAweDAzQkMsIDB4NkQgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIE1VCSMgbXUgKi8KICAgIHsgMHgwM0JELCAweDZFIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBOVQkjIG51ICovCiAgICB7IDB4MDNCRSwgMHg3OCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgWEkJIyB4aSAqLwogICAgeyAweDAzQkYsIDB4NkYgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04JIyBvbWljcm9uICovCiAgICB7IDB4MDNDMCwgMHg3MCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUEkJIyBwaSAqLwogICAgeyAweDAzQzEsIDB4NzIgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFJITwkjIHJobyAqLwogICAgeyAweDAzQzIsIDB4NTYgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCSMgc2lnbWExICovCiAgICB7IDB4MDNDMywgMHg3MyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEJIyBzaWdtYSAqLwogICAgeyAweDAzQzQsIDB4NzQgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFRBVQkjIHRhdSAqLwogICAgeyAweDAzQzUsIDB4NzUgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04JIyB1cHNpbG9uICovCiAgICB7IDB4MDNDNiwgMHg2NiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCSMgcGhpICovCiAgICB7IDB4MDNDNywgMHg2MyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCSMgY2hpICovCiAgICB7IDB4MDNDOCwgMHg3OSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUFNJCSMgcHNpICovCiAgICB7IDB4MDNDOSwgMHg3NyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EJIyBvbWVnYSAqLwogICAgeyAweDAzRDEsIDB4NEEgfSwgLyogR1JFRUsgVEhFVEEgU1lNQk9MCSMgdGhldGExICovCiAgICB7IDB4MDNEMiwgMHhBMSB9LCAvKiBHUkVFSyBVUFNJTE9OIFdJVEggSE9PSyBTWU1CT0wJIyBVcHNpbG9uMSAqLwogICAgeyAweDAzRDUsIDB4NkEgfSwgLyogR1JFRUsgUEhJIFNZTUJPTAkjIHBoaTEgKi8KICAgIHsgMHgwM0Q2LCAweDc2IH0sIC8qIEdSRUVLIFBJIFNZTUJPTAkjIG9tZWdhMSAqLwogICAgeyAweDIwMjIsIDB4QjcgfSwgLyogQlVMTEVUCSMgYnVsbGV0ICovCiAgICB7IDB4MjAyNiwgMHhCQyB9LCAvKiBIT1JJWk9OVEFMIEVMTElQU0lTCSMgZWxsaXBzaXMgKi8KICAgIHsgMHgyMDMyLCAweEEyIH0sIC8qIFBSSU1FCSMgbWludXRlICovCiAgICB7IDB4MjAzMywgMHhCMiB9LCAvKiBET1VCTEUgUFJJTUUJIyBzZWNvbmQgKi8KICAgIHsgMHgyMDQ0LCAweEE0IH0sIC8qIEZSQUNUSU9OIFNMQVNICSMgZnJhY3Rpb24gKi8KICAgIHsgMHgyMEFDLCAweEEwIH0sIC8qIEVVUk8gU0lHTgkjIEV1cm8gKi8KICAgIHsgMHgyMTExLCAweEMxIH0sIC8qIEJMQUNLLUxFVFRFUiBDQVBJVEFMIEkJIyBJZnJha3R1ciAqLwogICAgeyAweDIxMTgsIDB4QzMgfSwgLyogU0NSSVBUIENBUElUQUwgUAkjIHdlaWVyc3RyYXNzICovCiAgICB7IDB4MjExQywgMHhDMiB9LCAvKiBCTEFDSy1MRVRURVIgQ0FQSVRBTCBSCSMgUmZyYWt0dXIgKi8KICAgIHsgMHgyMTI2LCAweDU3IH0sIC8qIE9ITSBTSUdOCSMgT21lZ2EgKi8KICAgIHsgMHgyMTM1LCAweEMwIH0sIC8qIEFMRUYgU1lNQk9MCSMgYWxlcGggKi8KICAgIHsgMHgyMTkwLCAweEFDIH0sIC8qIExFRlRXQVJEUyBBUlJPVwkjIGFycm93bGVmdCAqLwogICAgeyAweDIxOTEsIDB4QUQgfSwgLyogVVBXQVJEUyBBUlJPVwkjIGFycm93dXAgKi8KICAgIHsgMHgyMTkyLCAweEFFIH0sIC8qIFJJR0hUV0FSRFMgQVJST1cJIyBhcnJvd3JpZ2h0ICovCiAgICB7IDB4MjE5MywgMHhBRiB9LCAvKiBET1dOV0FSRFMgQVJST1cJIyBhcnJvd2Rvd24gKi8KICAgIHsgMHgyMTk0LCAweEFCIH0sIC8qIExFRlQgUklHSFQgQVJST1cJIyBhcnJvd2JvdGggKi8KICAgIHsgMHgyMUI1LCAweEJGIH0sIC8qIERPV05XQVJEUyBBUlJPVyBXSVRIIENPUk5FUiBMRUZUV0FSRFMJIyBjYXJyaWFnZXJldHVybiAqLwogICAgeyAweDIxRDAsIDB4REMgfSwgLyogTEVGVFdBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJsbGVmdCAqLwogICAgeyAweDIxRDEsIDB4REQgfSwgLyogVVBXQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibHVwICovCiAgICB7IDB4MjFEMiwgMHhERSB9LCAvKiBSSUdIVFdBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJscmlnaHQgKi8KICAgIHsgMHgyMUQzLCAweERGIH0sIC8qIERPV05XQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibGRvd24gKi8KICAgIHsgMHgyMUQ0LCAweERCIH0sIC8qIExFRlQgUklHSFQgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmxib3RoICovCiAgICB7IDB4MjIwMCwgMHgyMiB9LCAvKiBGT1IgQUxMCSMgdW5pdmVyc2FsICovCiAgICB7IDB4MjIwMiwgMHhCNiB9LCAvKiBQQVJUSUFMIERJRkZFUkVOVElBTAkjIHBhcnRpYWxkaWZmICovCiAgICB7IDB4MjIwMywgMHgyNCB9LCAvKiBUSEVSRSBFWElTVFMJIyBleGlzdGVudGlhbCAqLwogICAgeyAweDIyMDUsIDB4QzYgfSwgLyogRU1QVFkgU0VUCSMgZW1wdHlzZXQgKi8KICAgIHsgMHgyMjA2LCAweDQ0IH0sIC8qIElOQ1JFTUVOVAkjIERlbHRhICovCiAgICB7IDB4MjIwNywgMHhEMSB9LCAvKiBOQUJMQQkjIGdyYWRpZW50ICovCiAgICB7IDB4MjIwOCwgMHhDRSB9LCAvKiBFTEVNRU5UIE9GCSMgZWxlbWVudCAqLwogICAgeyAweDIyMDksIDB4Q0YgfSwgLyogTk9UIEFOIEVMRU1FTlQgT0YJIyBub3RlbGVtZW50ICovCiAgICB7IDB4MjIwQiwgMHgyNyB9LCAvKiBDT05UQUlOUyBBUyBNRU1CRVIJIyBzdWNodGhhdCAqLwogICAgeyAweDIyMEYsIDB4RDUgfSwgLyogTi1BUlkgUFJPRFVDVAkjIHByb2R1Y3QgKi8KICAgIHsgMHgyMjExLCAweEU1IH0sIC8qIE4tQVJZIFNVTU1BVElPTgkjIHN1bW1hdGlvbiAqLwogICAgeyAweDIyMTIsIDB4MkQgfSwgLyogTUlOVVMgU0lHTgkjIG1pbnVzICovCiAgICB7IDB4MjIxNSwgMHhBNCB9LCAvKiBESVZJU0lPTiBTTEFTSAkjIGZyYWN0aW9uICovCiAgICB7IDB4MjIxNywgMHgyQSB9LCAvKiBBU1RFUklTSyBPUEVSQVRPUgkjIGFzdGVyaXNrbWF0aCAqLwogICAgeyAweDIyMUEsIDB4RDYgfSwgLyogU1FVQVJFIFJPT1QJIyByYWRpY2FsICovCiAgICB7IDB4MjIxRCwgMHhCNSB9LCAvKiBQUk9QT1JUSU9OQUwgVE8JIyBwcm9wb3J0aW9uYWwgKi8KICAgIHsgMHgyMjFFLCAweEE1IH0sIC8qIElORklOSVRZCSMgaW5maW5pdHkgKi8KICAgIHsgMHgyMjIwLCAweEQwIH0sIC8qIEFOR0xFCSMgYW5nbGUgKi8KICAgIHsgMHgyMjI3LCAweEQ5IH0sIC8qIExPR0lDQUwgQU5ECSMgbG9naWNhbGFuZCAqLwogICAgeyAweDIyMjgsIDB4REEgfSwgLyogTE9HSUNBTCBPUgkjIGxvZ2ljYWxvciAqLwogICAgeyAweDIyMjksIDB4QzcgfSwgLyogSU5URVJTRUNUSU9OCSMgaW50ZXJzZWN0aW9uICovCiAgICB7IDB4MjIyQSwgMHhDOCB9LCAvKiBVTklPTgkjIHVuaW9uICovCiAgICB7IDB4MjIyQiwgMHhGMiB9LCAvKiBJTlRFR1JBTAkjIGludGVncmFsICovCiAgICB7IDB4MjIzNCwgMHg1QyB9LCAvKiBUSEVSRUZPUkUJIyB0aGVyZWZvcmUgKi8KICAgIHsgMHgyMjNDLCAweDdFIH0sIC8qIFRJTERFIE9QRVJBVE9SCSMgc2ltaWxhciAqLwogICAgeyAweDIyNDUsIDB4NDAgfSwgLyogQVBQUk9YSU1BVEVMWSBFUVVBTCBUTwkjIGNvbmdydWVudCAqLwogICAgeyAweDIyNDgsIDB4QkIgfSwgLyogQUxNT1NUIEVRVUFMIFRPCSMgYXBwcm94ZXF1YWwgKi8KICAgIHsgMHgyMjYwLCAweEI5IH0sIC8qIE5PVCBFUVVBTCBUTwkjIG5vdGVxdWFsICovCiAgICB7IDB4MjI2MSwgMHhCQSB9LCAvKiBJREVOVElDQUwgVE8JIyBlcXVpdmFsZW5jZSAqLwogICAgeyAweDIyNjQsIDB4QTMgfSwgLyogTEVTUy1USEFOIE9SIEVRVUFMIFRPCSMgbGVzc2VxdWFsICovCiAgICB7IDB4MjI2NSwgMHhCMyB9LCAvKiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8JIyBncmVhdGVyZXF1YWwgKi8KICAgIHsgMHgyMjgyLCAweENDIH0sIC8qIFNVQlNFVCBPRgkjIHByb3BlcnN1YnNldCAqLwogICAgeyAweDIyODMsIDB4QzkgfSwgLyogU1VQRVJTRVQgT0YJIyBwcm9wZXJzdXBlcnNldCAqLwogICAgeyAweDIyODQsIDB4Q0IgfSwgLyogTk9UIEEgU1VCU0VUIE9GCSMgbm90c3Vic2V0ICovCiAgICB7IDB4MjI4NiwgMHhDRCB9LCAvKiBTVUJTRVQgT0YgT1IgRVFVQUwgVE8JIyByZWZsZXhzdWJzZXQgKi8KICAgIHsgMHgyMjg3LCAweENBIH0sIC8qIFNVUEVSU0VUIE9GIE9SIEVRVUFMIFRPCSMgcmVmbGV4c3VwZXJzZXQgKi8KICAgIHsgMHgyMjk1LCAweEM1IH0sIC8qIENJUkNMRUQgUExVUwkjIGNpcmNsZXBsdXMgKi8KICAgIHsgMHgyMjk3LCAweEM0IH0sIC8qIENJUkNMRUQgVElNRVMJIyBjaXJjbGVtdWx0aXBseSAqLwogICAgeyAweDIyQTUsIDB4NUUgfSwgLyogVVAgVEFDSwkjIHBlcnBlbmRpY3VsYXIgKi8KICAgIHsgMHgyMkM1LCAweEQ3IH0sIC8qIERPVCBPUEVSQVRPUgkjIGRvdG1hdGggKi8KICAgIHsgMHgyMzIwLCAweEYzIH0sIC8qIFRPUCBIQUxGIElOVEVHUkFMCSMgaW50ZWdyYWx0cCAqLwogICAgeyAweDIzMjEsIDB4RjUgfSwgLyogQk9UVE9NIEhBTEYgSU5URUdSQUwJIyBpbnRlZ3JhbGJ0ICovCiAgICB7IDB4MjMyOSwgMHhFMSB9LCAvKiBMRUZULVBPSU5USU5HIEFOR0xFIEJSQUNLRVQJIyBhbmdsZWxlZnQgKi8KICAgIHsgMHgyMzJBLCAweEYxIH0sIC8qIFJJR0hULVBPSU5USU5HIEFOR0xFIEJSQUNLRVQJIyBhbmdsZXJpZ2h0ICovCiAgICB7IDB4MjVDQSwgMHhFMCB9LCAvKiBMT1pFTkdFCSMgbG96ZW5nZSAqLwogICAgeyAweDI2NjAsIDB4QUEgfSwgLyogQkxBQ0sgU1BBREUgU1VJVAkjIHNwYWRlICovCiAgICB7IDB4MjY2MywgMHhBNyB9LCAvKiBCTEFDSyBDTFVCIFNVSVQJIyBjbHViICovCiAgICB7IDB4MjY2NSwgMHhBOSB9LCAvKiBCTEFDSyBIRUFSVCBTVUlUCSMgaGVhcnQgKi8KICAgIHsgMHgyNjY2LCAweEE4IH0sIC8qIEJMQUNLIERJQU1PTkQgU1VJVAkjIGRpYW1vbmQgKi8KICAgIHsgMHhGNkQ5LCAweEQzIH0sIC8qIENPUFlSSUdIVCBTSUdOIFNFUklGCSMgY29weXJpZ2h0c2VyaWYgKENVUykgKi8KICAgIHsgMHhGNkRBLCAweEQyIH0sIC8qIFJFR0lTVEVSRUQgU0lHTiBTRVJJRgkjIHJlZ2lzdGVyc2VyaWYgKENVUykgKi8KICAgIHsgMHhGNkRCLCAweEQ0IH0sIC8qIFRSQURFIE1BUksgU0lHTiBTRVJJRgkjIHRyYWRlbWFya3NlcmlmIChDVVMpICovCiAgICB7IDB4RjhFNSwgMHg2MCB9LCAvKiBSQURJQ0FMIEVYVEVOREVSCSMgcmFkaWNhbGV4IChDVVMpICovCiAgICB7IDB4RjhFNiwgMHhCRCB9LCAvKiBWRVJUSUNBTCBBUlJPVyBFWFRFTkRFUgkjIGFycm93dmVydGV4IChDVVMpICovCiAgICB7IDB4RjhFNywgMHhCRSB9LCAvKiBIT1JJWk9OVEFMIEFSUk9XIEVYVEVOREVSCSMgYXJyb3dob3JpemV4IChDVVMpICovCiAgICB7IDB4RjhFOCwgMHhFMiB9LCAvKiBSRUdJU1RFUkVEIFNJR04gU0FOUyBTRVJJRgkjIHJlZ2lzdGVyc2FucyAoQ1VTKSAqLwogICAgeyAweEY4RTksIDB4RTMgfSwgLyogQ09QWVJJR0hUIFNJR04gU0FOUyBTRVJJRgkjIGNvcHlyaWdodHNhbnMgKENVUykgKi8KICAgIHsgMHhGOEVBLCAweEU0IH0sIC8qIFRSQURFIE1BUksgU0lHTiBTQU5TIFNFUklGCSMgdHJhZGVtYXJrc2FucyAoQ1VTKSAqLwogICAgeyAweEY4RUIsIDB4RTYgfSwgLyogTEVGVCBQQVJFTiBUT1AJIyBwYXJlbmxlZnR0cCAoQ1VTKSAqLwogICAgeyAweEY4RUMsIDB4RTcgfSwgLyogTEVGVCBQQVJFTiBFWFRFTkRFUgkjIHBhcmVubGVmdGV4IChDVVMpICovCiAgICB7IDB4RjhFRCwgMHhFOCB9LCAvKiBMRUZUIFBBUkVOIEJPVFRPTQkjIHBhcmVubGVmdGJ0IChDVVMpICovCiAgICB7IDB4RjhFRSwgMHhFOSB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUIFRPUAkjIGJyYWNrZXRsZWZ0dHAgKENVUykgKi8KICAgIHsgMHhGOEVGLCAweEVBIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgRVhURU5ERVIJIyBicmFja2V0bGVmdGV4IChDVVMpICovCiAgICB7IDB4RjhGMCwgMHhFQiB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNrZXRsZWZ0YnQgKENVUykgKi8KICAgIHsgMHhGOEYxLCAweEVDIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVCBUT1AJIyBicmFjZWxlZnR0cCAoQ1VTKSAqLwogICAgeyAweEY4RjIsIDB4RUQgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUIE1JRAkjIGJyYWNlbGVmdG1pZCAoQ1VTKSAqLwogICAgeyAweEY4RjMsIDB4RUUgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNlbGVmdGJ0IChDVVMpICovCiAgICB7IDB4RjhGNCwgMHhFRiB9LCAvKiBDVVJMWSBCUkFDS0VUIEVYVEVOREVSCSMgYnJhY2VleCAoQ1VTKSAqLwogICAgeyAweEY4RjUsIDB4RjQgfSwgLyogSU5URUdSQUwgRVhURU5ERVIJIyBpbnRlZ3JhbGV4IChDVVMpICovCiAgICB7IDB4RjhGNiwgMHhGNiB9LCAvKiBSSUdIVCBQQVJFTiBUT1AJIyBwYXJlbnJpZ2h0dHAgKENVUykgKi8KICAgIHsgMHhGOEY3LCAweEY3IH0sIC8qIFJJR0hUIFBBUkVOIEVYVEVOREVSCSMgcGFyZW5yaWdodGV4IChDVVMpICovCiAgICB7IDB4RjhGOCwgMHhGOCB9LCAvKiBSSUdIVCBQQVJFTiBCT1RUT00JIyBwYXJlbnJpZ2h0YnQgKENVUykgKi8KICAgIHsgMHhGOEY5LCAweEY5IH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUIFRPUAkjIGJyYWNrZXRyaWdodHRwIChDVVMpICovCiAgICB7IDB4RjhGQSwgMHhGQSB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCBFWFRFTkRFUgkjIGJyYWNrZXRyaWdodGV4IChDVVMpICovCiAgICB7IDB4RjhGQiwgMHhGQiB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCBCT1RUT00JIyBicmFja2V0cmlnaHRidCAoQ1VTKSAqLwogICAgeyAweEY4RkMsIDB4RkMgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCBUT1AJIyBicmFjZXJpZ2h0dHAgKENVUykgKi8KICAgIHsgMHhGOEZELCAweEZEIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQgTUlECSMgYnJhY2VyaWdodG1pZCAoQ1VTKSAqLwogICAgeyAweEY4RkUsIDB4RkUgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCBCT1RUT00JIyBicmFjZXJpZ2h0YnQgKENVUykgKi8KfTsKCnN0YXRpYyBjb25zdCBGY0NoYXJNYXAgQWRvYmVTeW1ib2wgPSB7CiAgICBBZG9iZVN5bWJvbEVudCwKICAgIHNpemVvZiAoQWRvYmVTeW1ib2xFbnQpIC8gc2l6ZW9mIChBZG9iZVN5bWJvbEVudFswXSksCn07CiAgICAKc3RhdGljIGNvbnN0IEZjRm9udERlY29kZSBmY0ZvbnREZWNvZGVyc1tdID0gewogICAgeyBmdF9lbmNvZGluZ191bmljb2RlLAkwLAkJKDEgPDwgMjEpIC0gMSB9LAogICAgeyBmdF9lbmNvZGluZ19zeW1ib2wsCSZBZG9iZVN5bWJvbCwJKDEgPDwgMTYpIC0gMSB9LAogICAgeyBmdF9lbmNvZGluZ19hcHBsZV9yb21hbiwJJkFwcGxlUm9tYW4sCSgxIDw8IDE2KSAtIDEgfSwKfTsKCiNkZWZpbmUgTlVNX0RFQ09ERSAgKHNpemVvZiAoZmNGb250RGVjb2RlcnMpIC8gc2l6ZW9mIChmY0ZvbnREZWNvZGVyc1swXSkpCgpGY0NoYXIzMgpGY0ZyZWVUeXBlVWNzNFRvUHJpdmF0ZSAoRmNDaGFyMzIgdWNzNCwgY29uc3QgRmNDaGFyTWFwICptYXApCnsKICAgIGludAkJbG93LCBoaWdoLCBtaWQ7CiAgICBGY0NoYXIxNglibXA7CgogICAgbG93ID0gMDsKICAgIGhpZ2ggPSBtYXAtPm5lbnQgLSAxOwogICAgaWYgKHVjczQgPCBtYXAtPmVudFtsb3ddLmJtcCB8fCBtYXAtPmVudFtoaWdoXS5ibXAgPCB1Y3M0KQoJcmV0dXJuIH4wOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKQogICAgewoJbWlkID0gKGhpZ2ggKyBsb3cpID4+IDE7CglibXAgPSBtYXAtPmVudFttaWRdLmJtcDsKCWlmICh1Y3M0ID09IGJtcCkKCSAgICByZXR1cm4gKEZUX1VMb25nKSBtYXAtPmVudFttaWRdLmVuY29kZTsKCWlmICh1Y3M0IDwgYm1wKQoJICAgIGhpZ2ggPSBtaWQgLSAxOwoJZWxzZQoJICAgIGxvdyA9IG1pZCArIDE7CiAgICB9CiAgICByZXR1cm4gfjA7Cn0KCkZjQ2hhcjMyCkZjRnJlZVR5cGVQcml2YXRlVG9VY3M0IChGY0NoYXIzMiBwcml2YXRlLCBjb25zdCBGY0NoYXJNYXAgKm1hcCkKewogICAgaW50CSAgICBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBtYXAtPm5lbnQ7IGkrKykKCWlmIChtYXAtPmVudFtpXS5lbmNvZGUgPT0gcHJpdmF0ZSkKCSAgICByZXR1cm4gKEZjQ2hhcjMyKSBtYXAtPmVudFtpXS5ibXA7CiAgICByZXR1cm4gfjA7Cn0KCmNvbnN0IEZjQ2hhck1hcCAqCkZjRnJlZVR5cGVHZXRQcml2YXRlTWFwIChGVF9FbmNvZGluZyBlbmNvZGluZykKewogICAgaW50CWk7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9ERUNPREU7IGkrKykKCWlmIChmY0ZvbnREZWNvZGVyc1tpXS5lbmNvZGluZyA9PSBlbmNvZGluZykKCSAgICByZXR1cm4gZmNGb250RGVjb2RlcnNbaV0ubWFwOwogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIE1hcCBhIFVDUzQgZ2x5cGggdG8gYSBnbHlwaCBpbmRleC4gIFVzZSBhbGwgYXZhaWxhYmxlIGVuY29kaW5nCiAqIHRhYmxlcyB0byB0cnkgYW5kIGZpbmQgb25lIHRoYXQgd29ya3MuICBUaGlzIGluZm9ybWF0aW9uIGlzIGV4cGVjdGVkCiAqIHRvIGJlIGNhY2hlZCBieSBoaWdoZXIgbGV2ZWxzLCBzbyBwZXJmb3JtYW5jZSBpc24ndCBjcml0aWNhbAogKi8KCkZUX1VJbnQKRmNGcmVlVHlwZUNoYXJJbmRleCAoRlRfRmFjZSBmYWNlLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJCSAgICBpbml0aWFsLCBvZmZzZXQsIGRlY29kZTsKICAgIEZUX1VJbnQJICAgIGdseXBoaW5kZXg7CiAgICBGY0NoYXIzMgkgICAgY2hhcmNvZGU7CgogICAgaW5pdGlhbCA9IDA7CiAgICAvKgogICAgICogRmluZCB0aGUgY3VycmVudCBlbmNvZGluZwogICAgICovCiAgICBpZiAoZmFjZS0+Y2hhcm1hcCkKICAgIHsKCWZvciAoOyBpbml0aWFsIDwgTlVNX0RFQ09ERTsgaW5pdGlhbCsrKQoJICAgIGlmIChmY0ZvbnREZWNvZGVyc1tpbml0aWFsXS5lbmNvZGluZyA9PSBmYWNlLT5jaGFybWFwLT5lbmNvZGluZykKCQlicmVhazsKCWlmIChpbml0aWFsID09IE5VTV9ERUNPREUpCgkgICAgaW5pdGlhbCA9IDA7CiAgICB9CiAgICAvKgogICAgICogQ2hlY2sgZWFjaCBlbmNvZGluZyBmb3IgdGhlIGdseXBoLCBzdGFydGluZyB3aXRoIHRoZSBjdXJyZW50IG9uZQogICAgICovCiAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IE5VTV9ERUNPREU7IG9mZnNldCsrKQogICAgewoJZGVjb2RlID0gKGluaXRpYWwgKyBvZmZzZXQpICUgTlVNX0RFQ09ERTsKCWlmICghZmFjZS0+Y2hhcm1hcCB8fCBmYWNlLT5jaGFybWFwLT5lbmNvZGluZyAhPSBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLmVuY29kaW5nKQoJICAgIGlmIChGVF9TZWxlY3RfQ2hhcm1hcCAoZmFjZSwgZmNGb250RGVjb2RlcnNbZGVjb2RlXS5lbmNvZGluZykgIT0gMCkKCQljb250aW51ZTsKCWlmIChmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLm1hcCkKCXsKCSAgICBjaGFyY29kZSA9IEZjRnJlZVR5cGVVY3M0VG9Qcml2YXRlICh1Y3M0LCBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLm1hcCk7CgkgICAgaWYgKGNoYXJjb2RlID09IH4wKQoJCWNvbnRpbnVlOwoJfQoJZWxzZQoJICAgIGNoYXJjb2RlID0gdWNzNDsKCWdseXBoaW5kZXggPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgKEZUX1VMb25nKSBjaGFyY29kZSk7CglpZiAoZ2x5cGhpbmRleCkKCSAgICByZXR1cm4gZ2x5cGhpbmRleDsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdGF0aWMgRmNCb29sCkZjRnJlZVR5cGVDaGVja0dseXBoIChGVF9GYWNlIGZhY2UsIEZjQ2hhcjMyIHVjczQsIAoJCSAgICAgIEZUX1VJbnQgZ2x5cGgsIEZjQmxhbmtzICpibGFua3MsCgkJICAgICAgRlRfUG9zICphZHZhbmNlKQp7CiAgICBGVF9JbnQJICAgIGxvYWRfZmxhZ3MgPSBGVF9MT0FEX05PX1NDQUxFIHwgRlRfTE9BRF9OT19ISU5USU5HOwogICAgRlRfR2x5cGhTbG90ICAgIHNsb3Q7CiAgICAKICAgIC8qCiAgICAgKiBXaGVuIHVzaW5nIHNjYWxhYmxlIGZvbnRzLCBvbmx5IHJlcG9ydCB0aG9zZSBnbHlwaHMKICAgICAqIHdoaWNoIGNhbiBiZSBzY2FsZWQ7IG90aGVyd2lzZSB0aG9zZSBmb250cyB3aWxsCiAgICAgKiBvbmx5IGJlIGF2YWlsYWJsZSBhdCBzb21lIHNpemVzLCBhbmQgbmV2ZXIgd2hlbgogICAgICogdHJhbnNmb3JtZWQuICBBdm9pZCB0aGlzIGJ5IHNpbXBseSByZXBvcnRpbmcgYml0bWFwLW9ubHkKICAgICAqIGdseXBocyBhcyBtaXNzaW5nCiAgICAgKi8KICAgIGlmIChmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKQoJbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0JJVE1BUDsKICAgIAogICAgaWYgKEZUX0xvYWRfR2x5cGggKGZhY2UsIGdseXBoLCBsb2FkX2ZsYWdzKSkKCXJldHVybiBGY0ZhbHNlOwogICAgCiAgICBzbG90ID0gZmFjZS0+Z2x5cGg7CiAgICBpZiAoIWdseXBoKQoJcmV0dXJuIEZjRmFsc2U7CiAgICAKICAgICphZHZhbmNlID0gc2xvdC0+bWV0cmljcy5ob3JpQWR2YW5jZTsKCiAgICBzd2l0Y2ggKHNsb3QtPmZvcm1hdCkgewogICAgY2FzZSBmdF9nbHlwaF9mb3JtYXRfYml0bWFwOgoJLyoKCSAqIEJpdG1hcHMgYXJlIGFzc3VtZWQgdG8gYmUgcmVhc29uYWJsZTsgaWYKCSAqIHRoaXMgcHJvdmVzIHRvIGJlIGEgcmFzaCBhc3N1bXB0aW9uLCB0aGlzCgkgKiBjb2RlIGNhbiBiZSBlYXNpbHkgbW9kaWZpZWQKCSAqLwoJcmV0dXJuIEZjVHJ1ZTsKICAgIGNhc2UgZnRfZ2x5cGhfZm9ybWF0X291dGxpbmU6CgkvKgoJICogR2x5cGhzIHdpdGggY29udG91cnMgYXJlIGFsd2F5cyBPSwoJICovCglpZiAoc2xvdC0+b3V0bGluZS5uX2NvbnRvdXJzICE9IDApCgkgICAgcmV0dXJuIEZjVHJ1ZTsKCS8qCgkgKiBHbHlwaHMgd2l0aCBubyBjb250b3VycyBhcmUgb25seSBPSyBpZgoJICogdGhleSdyZSBtZW1iZXJzIG9mIHRoZSBCbGFua3Mgc2V0IHNwZWNpZmllZAoJICogaW4gdGhlIGNvbmZpZ3VyYXRpb24uICBJZiBibGFua3MgaXNuJ3Qgc2V0LAoJICogdGhlbiBhbGxvdyBhbnkgZ2x5cGggdG8gYmUgYmxhbmsKCSAqLwoJaWYgKCFibGFua3MgfHwgRmNCbGFua3NJc01lbWJlciAoYmxhbmtzLCB1Y3M0KSkKCSAgICByZXR1cm4gRmNUcnVlOwoJLyogZmFsbCB0aHJvdWdoIC4uLiAqLwogICAgZGVmYXVsdDoKCWJyZWFrOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCkZjQ2hhclNldCAqCkZjRnJlZVR5cGVDaGFyU2V0QW5kU3BhY2luZyAoRlRfRmFjZSBmYWNlLCBGY0JsYW5rcyAqYmxhbmtzLCBpbnQgKnNwYWNpbmcpCnsKICAgIEZjQ2hhcjMyCSAgICBwYWdlLCBvZmYsIG1heCwgdWNzNDsKI2lmZGVmIENIRUNLCiAgICBGY0NoYXIzMgkgICAgZm9udF9tYXggPSAwOwojZW5kaWYKICAgIEZjQ2hhclNldAkgICAgKmZjczsKICAgIEZjQ2hhckxlYWYJICAgICpsZWFmOwogICAgY29uc3QgRmNDaGFyTWFwICptYXA7CiAgICBpbnQJCSAgICBvOwogICAgaW50CQkgICAgaTsKICAgIEZUX1VJbnQJICAgIGdseXBoOwogICAgRlRfUG9zCSAgICBhZHZhbmNlLCBhbGxfYWR2YW5jZSA9IDA7CiAgICBGY0Jvb2wJICAgIGhhc19hZHZhbmNlID0gRmNGYWxzZSwgZml4ZWRfYWR2YW5jZSA9IEZjVHJ1ZTsKCiAgICBmY3MgPSBGY0NoYXJTZXRDcmVhdGUgKCk7CiAgICBpZiAoIWZjcykKCWdvdG8gYmFpbDA7CiAgICAKICAgIGZvciAobyA9IDA7IG8gPCBOVU1fREVDT0RFOyBvKyspCiAgICB7CglpZiAoRlRfU2VsZWN0X0NoYXJtYXAgKGZhY2UsIGZjRm9udERlY29kZXJzW29dLmVuY29kaW5nKSAhPSAwKQoJICAgIGNvbnRpbnVlOwoJbWFwID0gZmNGb250RGVjb2RlcnNbb10ubWFwOwoJaWYgKG1hcCkKCXsKCSAgICAvKgoJICAgICAqIE5vbi1Vbmljb2RlIHRhYmxlcyBhcmUgZWFzeTsgdGhlcmUncyBhIGxpc3Qgb2YgYWxsIHBvc3NpYmxlCgkgICAgICogY2hhcmFjdGVycwoJICAgICAqLwoJICAgIGZvciAoaSA9IDA7IGkgPCBtYXAtPm5lbnQ7IGkrKykKCSAgICB7CgkJdWNzNCA9IG1hcC0+ZW50W2ldLmJtcDsKCQlnbHlwaCA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCBtYXAtPmVudFtpXS5lbmNvZGUpOwoJCWlmIChnbHlwaCAmJiAKCQkgICAgRmNGcmVlVHlwZUNoZWNrR2x5cGggKGZhY2UsIHVjczQsIGdseXBoLCBibGFua3MsICZhZHZhbmNlKSkKCQl7CgkJICAgIGlmICghaGFzX2FkdmFuY2UpCgkJICAgIHsKCQkJaGFzX2FkdmFuY2UgPSBGY1RydWU7CgkJCWFsbF9hZHZhbmNlID0gYWR2YW5jZTsKCQkgICAgfQoJCSAgICBlbHNlIGlmIChhZHZhbmNlICE9IGFsbF9hZHZhbmNlKQoJCQlmaXhlZF9hZHZhbmNlID0gRmNGYWxzZTsKCQkgICAgbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOwoJCSAgICBpZiAoIWxlYWYpCgkJCWdvdG8gYmFpbDE7CgkJICAgIGxlYWYtPm1hcFsodWNzNCAmIDB4ZmYpID4+IDVdIHw9ICgxIDw8ICh1Y3M0ICYgMHgxZikpOwojaWZkZWYgQ0hFQ0sKCQkgICAgaWYgKHVjczQgPiBmb250X21heCkKCQkJZm9udF9tYXggPSB1Y3M0OwojZW5kaWYKCQl9CgkgICAgfQoJfQoJZWxzZQoJewoJICAgIEZUX1VJbnQgZ2luZGV4OwoJICAKCSAgICBtYXggPSBmY0ZvbnREZWNvZGVyc1tvXS5tYXg7CgkgICAgLyoKCSAgICAgKiBGaW5kIHRoZSBmaXJzdCBlbmNvZGVkIGNoYXJhY3RlciBpbiB0aGUgZm9udAoJICAgICAqLwoJICAgIGlmIChGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgMCkpCgkgICAgewoJCXVjczQgPSAwOwoJCWdpbmRleCA9IDE7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJdWNzNCA9IEZUX0dldF9OZXh0X0NoYXIgKGZhY2UsIDAsICZnaW5kZXgpOwoJCWlmICghdWNzNCkKCQkgICAgZ2luZGV4ID0gMDsKCSAgICB9CgoJICAgIHdoaWxlIChnaW5kZXgpCgkgICAgewoJCXBhZ2UgPSB1Y3M0ID4+IDg7CgkJbGVhZiA9IDA7CgkJd2hpbGUgKCh1Y3M0ID4+IDgpID09IHBhZ2UpCgkJewoJCSAgICBnbHlwaCA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCB1Y3M0KTsKCQkgICAgaWYgKGdseXBoICYmIEZjRnJlZVR5cGVDaGVja0dseXBoIChmYWNlLCB1Y3M0LCAKCQkJCQkJICAgICAgIGdseXBoLCBibGFua3MsICZhZHZhbmNlKSkKCQkgICAgewoJCQlpZiAoIWhhc19hZHZhbmNlKQoJCQl7CgkJCSAgICBoYXNfYWR2YW5jZSA9IEZjVHJ1ZTsKCQkJICAgIGFsbF9hZHZhbmNlID0gYWR2YW5jZTsKCQkJfQoJCQllbHNlIGlmIChhZHZhbmNlICE9IGFsbF9hZHZhbmNlKQoJCQkgICAgZml4ZWRfYWR2YW5jZSA9IEZjRmFsc2U7CgkJCWlmICghbGVhZikKCQkJewoJCQkgICAgbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOwoJCQkgICAgaWYgKCFsZWFmKQoJCQkJZ290byBiYWlsMTsKCQkJfQoJCQlvZmYgPSB1Y3M0ICYgMHhmZjsKCQkJbGVhZi0+bWFwW29mZiA+PiA1XSB8PSAoMSA8PCAob2ZmICYgMHgxZikpOwojaWZkZWYgQ0hFQ0sKCQkJaWYgKHVjczQgPiBmb250X21heCkKCQkJICAgIGZvbnRfbWF4ID0gdWNzNDsKI2VuZGlmCgkJICAgIH0KCQkgICAgdWNzNCsrOwoJCX0KCQl1Y3M0ID0gRlRfR2V0X05leHRfQ2hhciAoZmFjZSwgdWNzNCAtIDEsICZnaW5kZXgpOwoJCWlmICghdWNzNCkKCQkgICAgZ2luZGV4ID0gMDsKCSAgICB9CiNpZmRlZiBDSEVDSwoJICAgIGZvciAodWNzNCA9IDA7IHVjczQgPCAweDEwMDAwOyB1Y3M0KyspCgkgICAgewoJCUZjQm9vbAkgICAgRlRfSGFzLCBGQ19IYXM7CgoJCUZUX0hhcyA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCB1Y3M0KSAhPSAwOwoJCUZDX0hhcyA9IEZjQ2hhclNldEhhc0NoYXIgKGZjcywgdWNzNCk7CgkJaWYgKEZUX0hhcyAhPSBGQ19IYXMpCgkJewoJCSAgICBwcmludGYgKCIweCUwOHggRlQgc2F5cyAlZCBGQyBzYXlzICVkXG4iLCB1Y3M0LCBGVF9IYXMsIEZDX0hhcyk7CgkJfQoJICAgIH0KI2VuZGlmCgl9CiAgICB9CiNpZmRlZiBDSEVDSwogICAgcHJpbnRmICgiJWQgZ2x5cGhzICVkIGVuY29kZWRcbiIsIChpbnQpIGZhY2UtPm51bV9nbHlwaHMsIEZjQ2hhclNldENvdW50IChmY3MpKTsKICAgIGZvciAodWNzNCA9IDA7IHVjczQgPD0gZm9udF9tYXg7IHVjczQrKykKICAgIHsKCUZjQm9vbAloYXNfY2hhciA9IEZjRnJlZVR5cGVDaGFySW5kZXggKGZhY2UsIHVjczQpICE9IDA7CglGY0Jvb2wJaGFzX2JpdCA9IEZjQ2hhclNldEhhc0NoYXIgKGZjcywgdWNzNCk7CgoJaWYgKGhhc19jaGFyICYmICFoYXNfYml0KQoJICAgIHByaW50ZiAoIkJpdG1hcCBtaXNzaW5nIGNoYXIgMHgleFxuIiwgdWNzNCk7CgllbHNlIGlmICghaGFzX2NoYXIgJiYgaGFzX2JpdCkKCSAgICBwcmludGYgKCJCaXRtYXAgZXh0cmEgY2hhciAweCV4XG4iLCB1Y3M0KTsKICAgIH0KI2VuZGlmCiAgICBpZiAoZml4ZWRfYWR2YW5jZSkKCSpzcGFjaW5nID0gRkNfTU9OTzsKICAgIGVsc2UKCSpzcGFjaW5nID0gRkNfUFJPUE9SVElPTkFMOwogICAgcmV0dXJuIGZjczsKYmFpbDE6CiAgICBGY0NoYXJTZXREZXN0cm95IChmY3MpOwpiYWlsMDoKICAgIHJldHVybiAwOwp9CgpGY0NoYXJTZXQgKgpGY0ZyZWVUeXBlQ2hhclNldCAoRlRfRmFjZSBmYWNlLCBGY0JsYW5rcyAqYmxhbmtzKQp7CiAgICBpbnQgc3BhY2luZzsKCiAgICByZXR1cm4gRmNGcmVlVHlwZUNoYXJTZXRBbmRTcGFjaW5nIChmYWNlLCBibGFua3MsICZzcGFjaW5nKTsKfQo=