LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2NoYXJzZXQuYyx2IDEuMTYgMjAwMi8wNy8wOSAwMjoyODoyOSBrZWl0aHAgRXhwICQKICoKICogQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAiZmNpbnQuaCIKCi8qICNkZWZpbmUgQ0hFQ0sgKi8KCi8qICNkZWZpbmUgQ0hBVFRZICovCgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRDcmVhdGUgKHZvaWQpCnsKICAgIEZjQ2hhclNldAkqZmNzOwoKICAgIGZjcyA9IChGY0NoYXJTZXQgKikgbWFsbG9jIChzaXplb2YgKEZjQ2hhclNldCkpOwogICAgaWYgKCFmY3MpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSU0VULCBzaXplb2YgKEZjQ2hhclNldCkpOwogICAgZmNzLT5yZWYgPSAxOwogICAgZmNzLT5udW0gPSAwOwogICAgZmNzLT5sZWF2ZXMgPSAwOwogICAgZmNzLT5udW1iZXJzID0gMDsKICAgIGZjcy0+Y29uc3RhbnQgPSBGY0ZhbHNlOwogICAgcmV0dXJuIGZjczsKfQoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0TmV3ICh2b2lkKTsKICAgIApGY0NoYXJTZXQgKgpGY0NoYXJTZXROZXcgKHZvaWQpCnsKICAgIHJldHVybiBGY0NoYXJTZXRDcmVhdGUgKCk7Cn0KCgp2b2lkCkZjQ2hhclNldERlc3Ryb3kgKEZjQ2hhclNldCAqZmNzKQp7CiAgICBpZiAoIWZjcy0+Y29uc3RhbnQgJiYgLS1mY3MtPnJlZiA8PSAwKQogICAgewoJaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IGZjcy0+bnVtOyBpKyspCgl7CgkgICAgRmNNZW1GcmVlIChGQ19NRU1fQ0hBUk5PREUsIHNpemVvZiAoRmNDaGFyTGVhZikpOwoJICAgIGZyZWUgKGZjcy0+bGVhdmVzW2ldKTsKCX0KCWlmIChmY3MtPmxlYXZlcykKCXsKCSAgICBGY01lbUZyZWUgKEZDX01FTV9DSEFSU0VULCBmY3MtPm51bSAqIHNpemVvZiAoRmNDaGFyTGVhZiAqKSk7CgkgICAgZnJlZSAoZmNzLT5sZWF2ZXMpOwoJfQoJaWYgKGZjcy0+bnVtYmVycykKCXsKCSAgICBGY01lbUZyZWUgKEZDX01FTV9DSEFSU0VULCBmY3MtPm51bSAqIHNpemVvZiAoRmNDaGFyMTYpKTsKCSAgICBmcmVlIChmY3MtPm51bWJlcnMpOwoJfQoJRmNNZW1GcmVlIChGQ19NRU1fQ0hBUlNFVCwgc2l6ZW9mIChGY0NoYXJTZXQpKTsKCWZyZWUgKGZjcyk7CiAgICB9Cn0KCi8qCiAqIExvY2F0ZSB0aGUgbGVhZiBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgY2hhciwgcmV0dXJuCiAqIGl0cyBpbmRleCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSByZXR1cm4gbmVnYXRpdmUgb2YKICogdGhlIChwb3NpdGlvbiArIDEpIHdoZXJlIGl0IHNob3VsZCBiZSBpbnNlcnRlZAogKi8KCnN0YXRpYyBpbnQKRmNDaGFyU2V0RmluZExlYWZQb3MgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBGY0NoYXIxNgkJKm51bWJlcnMgPSBmY3MtPm51bWJlcnM7CiAgICBGY0NoYXIxNgkJcGFnZTsKICAgIGludAkJCWxvdyA9IDA7CiAgICBpbnQJCQloaWdoID0gZmNzLT5udW0gLSAxOwoKICAgIGlmICghbnVtYmVycykKCXJldHVybiAtMTsKICAgIHVjczQgPj49IDg7CiAgICB3aGlsZSAobG93IDw9IGhpZ2gpCiAgICB7CglpbnQgbWlkID0gKGxvdyArIGhpZ2gpID4+IDE7CglwYWdlID0gbnVtYmVyc1ttaWRdOwoJaWYgKHBhZ2UgPT0gdWNzNCkKCSAgICByZXR1cm4gbWlkOwoJaWYgKHBhZ2UgPCB1Y3M0KQoJICAgIGxvdyA9IG1pZCArIDE7CgllbHNlCgkgICAgaGlnaCA9IG1pZCAtIDE7CiAgICB9CiAgICBpZiAoaGlnaCA8IDAgfHwgKGhpZ2ggPCBmY3MtPm51bSAmJiBudW1iZXJzW2hpZ2hdIDwgdWNzNCkpCgloaWdoKys7CiAgICByZXR1cm4gLShoaWdoICsgMSk7Cn0KCnN0YXRpYyBGY0NoYXJMZWFmICoKRmNDaGFyU2V0RmluZExlYWYgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJcG9zID0gRmNDaGFyU2V0RmluZExlYWZQb3MgKGZjcywgdWNzNCk7CiAgICBpZiAocG9zID49IDApCglyZXR1cm4gZmNzLT5sZWF2ZXNbcG9zXTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgRmNCb29sCkZjQ2hhclNldFB1dExlYWYgKEZjQ2hhclNldAkqZmNzLCAKCQkgIEZjQ2hhcjMyCXVjczQsCgkJICBGY0NoYXJMZWFmCSpsZWFmLCAKCQkgIGludAkJcG9zKQp7CiAgICBGY0NoYXJMZWFmCSoqbGVhdmVzOwogICAgRmNDaGFyMTYJKm51bWJlcnM7CgogICAgdWNzNCA+Pj0gODsKICAgIGlmICh1Y3M0ID49IDB4MTAwMDApCglyZXR1cm4gRmNGYWxzZTsKICAgIGlmICghZmNzLT5sZWF2ZXMpCglsZWF2ZXMgPSBtYWxsb2MgKHNpemVvZiAoRmNDaGFyTGVhZiAqKSk7CiAgICBlbHNlCglsZWF2ZXMgPSByZWFsbG9jIChmY3MtPmxlYXZlcywgKGZjcy0+bnVtICsgMSkgKiBzaXplb2YgKEZjQ2hhckxlYWYgKikpOwogICAgaWYgKCFsZWF2ZXMpCglyZXR1cm4gRmNGYWxzZTsKICAgIGZjcy0+bGVhdmVzID0gbGVhdmVzOwogICAgaWYgKCFmY3MtPm51bWJlcnMpCgludW1iZXJzID0gbWFsbG9jIChzaXplb2YgKEZjQ2hhcjE2KSk7CiAgICBlbHNlCgludW1iZXJzID0gcmVhbGxvYyAoZmNzLT5udW1iZXJzLCAoZmNzLT5udW0gKyAxKSAqIHNpemVvZiAoRmNDaGFyMTYpKTsKICAgIGlmICghbnVtYmVycykKCXJldHVybiBGY0ZhbHNlOwogICAgZmNzLT5udW1iZXJzID0gbnVtYmVyczsKICAgIAogICAgbWVtbW92ZSAoZmNzLT5sZWF2ZXMgKyBwb3MgKyAxLCBmY3MtPmxlYXZlcyArIHBvcywgCgkgICAgIChmY3MtPm51bSAtIHBvcykgKiBzaXplb2YgKEZjQ2hhckxlYWYgKikpOwogICAgbWVtbW92ZSAoZmNzLT5udW1iZXJzICsgcG9zICsgMSwgZmNzLT5udW1iZXJzICsgcG9zLAoJICAgICAoZmNzLT5udW0gLSBwb3MpICogc2l6ZW9mIChGY0NoYXIxNikpOwogICAgZmNzLT5udW1iZXJzW3Bvc10gPSAoRmNDaGFyMTYpIHVjczQ7CiAgICBmY3MtPmxlYXZlc1twb3NdID0gbGVhZjsKICAgIGZjcy0+bnVtKys7CiAgICByZXR1cm4gRmNUcnVlOwp9CgovKgogKiBMb2NhdGUgdGhlIGxlYWYgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGNoYXIsIGNyZWF0aW5nIGl0CiAqIGlmIGRlc2lyZWQKICovCgpzdGF0aWMgRmNDaGFyTGVhZiAqCkZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCkKewogICAgaW50CQkJcG9zOwogICAgRmNDaGFyTGVhZgkJKmxlYWY7CgogICAgcG9zID0gRmNDaGFyU2V0RmluZExlYWZQb3MgKGZjcywgdWNzNCk7CiAgICBpZiAocG9zID49IDApCglyZXR1cm4gZmNzLT5sZWF2ZXNbcG9zXTsKICAgIAogICAgbGVhZiA9IGNhbGxvYyAoMSwgc2l6ZW9mIChGY0NoYXJMZWFmKSk7CiAgICBpZiAoIWxlYWYpCglyZXR1cm4gMDsKICAgIAogICAgcG9zID0gLXBvcyAtIDE7CiAgICBpZiAoIUZjQ2hhclNldFB1dExlYWYgKGZjcywgdWNzNCwgbGVhZiwgcG9zKSkKICAgIHsKCWZyZWUgKGxlYWYpOwoJcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gbGVhZjsKfQoKc3RhdGljIEZjQm9vbApGY0NoYXJTZXRJbnNlcnRMZWFmIChGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCwgRmNDaGFyTGVhZiAqbGVhZikKewogICAgaW50CQkgICAgcG9zOwoKICAgIHBvcyA9IEZjQ2hhclNldEZpbmRMZWFmUG9zIChmY3MsIHVjczQpOwogICAgaWYgKHBvcyA+PSAwKQogICAgewoJRmNNZW1BbGxvYyAoRkNfTUVNX0NIQVJOT0RFLCBzaXplb2YgKEZjQ2hhckxlYWYpKTsKCWZyZWUgKGZjcy0+bGVhdmVzW3Bvc10pOwoJZmNzLT5sZWF2ZXNbcG9zXSA9IGxlYWY7CglyZXR1cm4gRmNUcnVlOwogICAgfQogICAgcG9zID0gLXBvcyAtIDE7CiAgICByZXR1cm4gRmNDaGFyU2V0UHV0TGVhZiAoZmNzLCB1Y3M0LCBsZWFmLCBwb3MpOwp9CgpGY0Jvb2wKRmNDaGFyU2V0QWRkQ2hhciAoRmNDaGFyU2V0ICpmY3MsIEZjQ2hhcjMyIHVjczQpCnsKICAgIEZjQ2hhckxlYWYJKmxlYWY7CiAgICBGY0NoYXIzMgkqYjsKICAgIAogICAgaWYgKGZjcy0+Y29uc3RhbnQpCglyZXR1cm4gRmNGYWxzZTsKICAgIGxlYWYgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoZmNzLCB1Y3M0KTsKICAgIGlmICghbGVhZikKCXJldHVybiBGY0ZhbHNlOwogICAgYiA9ICZsZWFmLT5tYXBbKHVjczQgJiAweGZmKSA+PiA1XTsKICAgICpiIHw9ICgxIDw8ICh1Y3M0ICYgMHgxZikpOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKLyoKICogQW4gaXRlcmF0b3IgZm9yIHRoZSBsZWF2ZXMgb2YgYSBjaGFyc2V0CiAqLwoKdHlwZWRlZiBzdHJ1Y3QgX2ZjQ2hhclNldEl0ZXIgewogICAgRmNDaGFyTGVhZgkgICAgKmxlYWY7CiAgICBGY0NoYXIzMgkgICAgdWNzNDsKICAgIGludAkJICAgIHBvczsKfSBGY0NoYXJTZXRJdGVyOwoKLyoKICogU2V0IGl0ZXItPmxlYWYgdG8gdGhlIGxlYWYgY29udGFpbmluZyBpdGVyLT51Y3M0IG9yIGhpZ2hlcgogKi8KCnN0YXRpYyB2b2lkCkZjQ2hhclNldEl0ZXJTZXQgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXJTZXRJdGVyICppdGVyKQp7CiAgICBpbnQJCSAgICBwb3MgPSBGY0NoYXJTZXRGaW5kTGVhZlBvcyAoZmNzLCBpdGVyLT51Y3M0KTsKCiAgICBpZiAocG9zIDwgMCkKICAgIHsKCXBvcyA9IC1wb3MgLSAxOwoJaWYgKHBvcyA9PSBmY3MtPm51bSkKCXsKCSAgICBpdGVyLT51Y3M0ID0gfjA7CgkgICAgaXRlci0+bGVhZiA9IDA7CgkgICAgcmV0dXJuOwoJfQogICAgICAgIGl0ZXItPnVjczQgPSAoRmNDaGFyMzIpIGZjcy0+bnVtYmVyc1twb3NdIDw8IDg7CiAgICB9CiAgICBpdGVyLT5sZWFmID0gZmNzLT5sZWF2ZXNbcG9zXTsKICAgIGl0ZXItPnBvcyA9IHBvczsKI2lmZGVmIENIQVRUWQogICAgcHJpbnRmICgic2V0ICUwOHg6ICUwOHhcbiIsIGl0ZXItPnVjczQsIChGY0NoYXIzMikgaXRlci0+bGVhZik7CiNlbmRpZgp9CgpzdGF0aWMgdm9pZApGY0NoYXJTZXRJdGVyTmV4dCAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhclNldEl0ZXIgKml0ZXIpCnsKICAgIGludAlwb3MgPSBpdGVyLT5wb3MgKyAxOwogICAgaWYgKHBvcyA+PSBmY3MtPm51bSkKICAgIHsKCWl0ZXItPnVjczQgPSB+MDsKCWl0ZXItPmxlYWYgPSAwOwogICAgfQogICAgZWxzZQogICAgewoJaXRlci0+dWNzNCA9IChGY0NoYXIzMikgZmNzLT5udW1iZXJzW3Bvc10gPDwgODsKCWl0ZXItPmxlYWYgPSBmY3MtPmxlYXZlc1twb3NdOwoJaXRlci0+cG9zID0gcG9zOwogICAgfQp9CgojaWZkZWYgQ0hBVFRZCnN0YXRpYyB2b2lkCkZjQ2hhclNldER1bXAgKGNvbnN0IEZjQ2hhclNldCAqZmNzKQp7CiAgICBpbnQJCXBvczsKCiAgICBwcmludGYgKCJmY3MgJTA4eDpcbiIsIChGY0NoYXIzMikgZmNzKTsKICAgIGZvciAocG9zID0gMDsgcG9zIDwgZmNzLT5udW07IHBvcysrKQogICAgewoJRmNDaGFyTGVhZgkqbGVhZiA9IGZjcy0+bGVhdmVzW3Bvc107CglGY0NoYXIzMgl1Y3M0ID0gKEZjQ2hhcjMyKSBmY3MtPm51bWJlcnNbcG9zXSA8PCA4OwoJCglwcmludGYgKCIgICAgJTA4eDogJTA4eFxuIiwgdWNzNCwgKEZjQ2hhcjMyKSBsZWFmKTsKICAgIH0KfQojZW5kaWYKCnN0YXRpYyB2b2lkCkZjQ2hhclNldEl0ZXJTdGFydCAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhclNldEl0ZXIgKml0ZXIpCnsKI2lmZGVmIENIQVRUWQogICAgRmNDaGFyU2V0RHVtcCAoZmNzKTsKI2VuZGlmCiAgICBpdGVyLT51Y3M0ID0gMDsKICAgIEZjQ2hhclNldEl0ZXJTZXQgKGZjcywgaXRlcik7Cn0KCkZjQ2hhclNldCAqCkZjQ2hhclNldENvcHkgKEZjQ2hhclNldCAqc3JjKQp7CiAgICBzcmMtPnJlZisrOwogICAgcmV0dXJuIHNyYzsKfQoKRmNCb29sCkZjQ2hhclNldEVxdWFsIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKewogICAgRmNDaGFyU2V0SXRlciAgIGFpLCBiaTsKICAgIGludAkJICAgIGk7CiAgICAKICAgIGlmIChhID09IGIpCglyZXR1cm4gRmNUcnVlOwogICAgZm9yIChGY0NoYXJTZXRJdGVyU3RhcnQgKGEsICZhaSksIEZjQ2hhclNldEl0ZXJTdGFydCAoYiwgJmJpKTsKCSBhaS5sZWFmICYmIGJpLmxlYWY7CgkgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSksIEZjQ2hhclNldEl0ZXJOZXh0IChiLCAmYmkpKQogICAgewoJaWYgKGFpLnVjczQgIT0gYmkudWNzNCkKCSAgICByZXR1cm4gRmNGYWxzZTsKCWZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCSAgICBpZiAoYWkubGVhZi0+bWFwW2ldICE9IGJpLmxlYWYtPm1hcFtpXSkKCQlyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldHVybiBhaS5sZWFmID09IGJpLmxlYWY7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDaGFyU2V0QWRkTGVhZiAoRmNDaGFyU2V0CSpmY3MsCgkJICBGY0NoYXIzMgl1Y3M0LAoJCSAgRmNDaGFyTGVhZgkqbGVhZikKewogICAgRmNDaGFyTGVhZiAgICpuZXcgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoZmNzLCB1Y3M0KTsKICAgIGlmICghbmV3KQoJcmV0dXJuIEZjRmFsc2U7CiAgICAqbmV3ID0gKmxlYWY7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNDaGFyU2V0ICoKRmNDaGFyU2V0T3BlcmF0ZSAoY29uc3QgRmNDaGFyU2V0ICAgKmEsCgkJICBjb25zdCBGY0NoYXJTZXQgICAqYiwKCQkgIEZjQm9vbAkgICAgKCpvdmVybGFwKSAoRmNDaGFyTGVhZgkgICAgKnJlc3VsdCwKCQkJCQkJY29uc3QgRmNDaGFyTGVhZiAgICAqYWwsCgkJCQkJCWNvbnN0IEZjQ2hhckxlYWYgICAgKmJsKSwKCQkgIEZjQm9vbAlhb25seSwKCQkgIEZjQm9vbAlib25seSkKewogICAgRmNDaGFyU2V0CSAgICAqZmNzOwogICAgRmNDaGFyU2V0SXRlciAgIGFpLCBiaTsKCiAgICBmY3MgPSBGY0NoYXJTZXRDcmVhdGUgKCk7CiAgICBpZiAoIWZjcykKCWdvdG8gYmFpbDA7CiAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGEsICZhaSk7CiAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGIsICZiaSk7CiAgICB3aGlsZSAoKGFpLmxlYWYgfHwgKGJvbmx5ICYmIGJpLmxlYWYpKSAmJiAoYmkubGVhZiB8fCAoYW9ubHkgJiYgYWkubGVhZikpKQogICAgewoJaWYgKGFpLnVjczQgPCBiaS51Y3M0KQoJewoJICAgIGlmIChhb25seSkKCSAgICB7CgkJaWYgKCFGY0NoYXJTZXRBZGRMZWFmIChmY3MsIGFpLnVjczQsIGFpLmxlYWYpKQoJCSAgICBnb3RvIGJhaWwxOwoJCUZjQ2hhclNldEl0ZXJOZXh0IChhLCAmYWkpOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWFpLnVjczQgPSBiaS51Y3M0OwoJCUZjQ2hhclNldEl0ZXJTZXQgKGEsICZhaSk7CgkgICAgfQoJfQoJZWxzZSBpZiAoYmkudWNzNCA8IGFpLnVjczQgKQoJewoJICAgIGlmIChib25seSkKCSAgICB7CgkJaWYgKCFGY0NoYXJTZXRBZGRMZWFmIChmY3MsIGJpLnVjczQsIGJpLmxlYWYpKQoJCSAgICBnb3RvIGJhaWwxOwoJCUZjQ2hhclNldEl0ZXJOZXh0IChiLCAmYmkpOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWJpLnVjczQgPSBhaS51Y3M0OwoJCUZjQ2hhclNldEl0ZXJTZXQgKGIsICZiaSk7CgkgICAgfQoJfQoJZWxzZQoJewoJICAgIEZjQ2hhckxlYWYgIGxlYWY7CgoJICAgIGlmICgoKm92ZXJsYXApICgmbGVhZiwgYWkubGVhZiwgYmkubGVhZikpCgkgICAgewoJCWlmICghRmNDaGFyU2V0QWRkTGVhZiAoZmNzLCBhaS51Y3M0LCAmbGVhZikpCgkJICAgIGdvdG8gYmFpbDE7CgkgICAgfQoJICAgIEZjQ2hhclNldEl0ZXJOZXh0IChhLCAmYWkpOwoJICAgIEZjQ2hhclNldEl0ZXJOZXh0IChiLCAmYmkpOwoJfQogICAgfQogICAgcmV0dXJuIGZjczsKYmFpbDE6CiAgICBGY0NoYXJTZXREZXN0cm95IChmY3MpOwpiYWlsMDoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgRmNCb29sCkZjQ2hhclNldEludGVyc2VjdExlYWYgKEZjQ2hhckxlYWYgKnJlc3VsdCwKCQkJY29uc3QgRmNDaGFyTGVhZiAqYWwsCgkJCWNvbnN0IEZjQ2hhckxlYWYgKmJsKQp7CiAgICBpbnQJICAgIGk7CiAgICBGY0Jvb2wgIG5vbmVtcHR5ID0gRmNGYWxzZTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCglpZiAoKHJlc3VsdC0+bWFwW2ldID0gYWwtPm1hcFtpXSAmIGJsLT5tYXBbaV0pKQoJICAgIG5vbmVtcHR5ID0gRmNUcnVlOwogICAgcmV0dXJuIG5vbmVtcHR5Owp9CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRJbnRlcnNlY3QgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQp7CiAgICByZXR1cm4gRmNDaGFyU2V0T3BlcmF0ZSAoYSwgYiwgRmNDaGFyU2V0SW50ZXJzZWN0TGVhZiwgRmNGYWxzZSwgRmNGYWxzZSk7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDaGFyU2V0VW5pb25MZWFmIChGY0NoYXJMZWFmICpyZXN1bHQsCgkJICAgIGNvbnN0IEZjQ2hhckxlYWYgKmFsLAoJCSAgICBjb25zdCBGY0NoYXJMZWFmICpibCkKewogICAgaW50CWk7CgogICAgZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJcmVzdWx0LT5tYXBbaV0gPSBhbC0+bWFwW2ldIHwgYmwtPm1hcFtpXTsKICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQ2hhclNldCAqCkZjQ2hhclNldFVuaW9uIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKewogICAgcmV0dXJuIEZjQ2hhclNldE9wZXJhdGUgKGEsIGIsIEZjQ2hhclNldFVuaW9uTGVhZiwgRmNUcnVlLCBGY1RydWUpOwp9CgpzdGF0aWMgRmNCb29sCkZjQ2hhclNldFN1YnRyYWN0TGVhZiAoRmNDaGFyTGVhZiAqcmVzdWx0LAoJCSAgICAgICBjb25zdCBGY0NoYXJMZWFmICphbCwKCQkgICAgICAgY29uc3QgRmNDaGFyTGVhZiAqYmwpCnsKICAgIGludAkgICAgaTsKICAgIEZjQm9vbCAgbm9uZW1wdHkgPSBGY0ZhbHNlOwoKICAgIGZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCWlmICgocmVzdWx0LT5tYXBbaV0gPSBhbC0+bWFwW2ldICYgfmJsLT5tYXBbaV0pKQoJICAgIG5vbmVtcHR5ID0gRmNUcnVlOwogICAgcmV0dXJuIG5vbmVtcHR5Owp9CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRTdWJ0cmFjdCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpCnsKICAgIHJldHVybiBGY0NoYXJTZXRPcGVyYXRlIChhLCBiLCBGY0NoYXJTZXRTdWJ0cmFjdExlYWYsIEZjVHJ1ZSwgRmNGYWxzZSk7Cn0KCkZjQm9vbApGY0NoYXJTZXRIYXNDaGFyIChjb25zdCBGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCkKewogICAgRmNDaGFyTGVhZgkqbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmIChmY3MsIHVjczQpOwogICAgaWYgKCFsZWFmKQoJcmV0dXJuIEZjRmFsc2U7CiAgICByZXR1cm4gKGxlYWYtPm1hcFsodWNzNCAmIDB4ZmYpID4+IDVdICYgKDEgPDwgKHVjczQgJiAweDFmKSkpICE9IDA7Cn0KCnN0YXRpYyBGY0NoYXIzMgpGY0NoYXJTZXRQb3BDb3VudCAoRmNDaGFyMzIgYzEpCnsKICAgIC8qIGhhY2ttZW0gMTY5ICovCiAgICBGY0NoYXIzMgljMiA9IChjMSA+PiAxKSAmIDAzMzMzMzMzMzMzMzsKICAgIGMyID0gYzEgLSBjMiAtICgoYzIgPj4gMSkgJiAwMzMzMzMzMzMzMzMpOwogICAgcmV0dXJuICgoKGMyICsgKGMyID4+IDMpKSAmIDAzMDcwNzA3MDcwNykgJSAwNzcpOwp9CgpGY0NoYXIzMgpGY0NoYXJTZXRJbnRlcnNlY3RDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpCnsKICAgIEZjQ2hhclNldEl0ZXIgICBhaSwgYmk7CiAgICBGY0NoYXIzMgkgICAgY291bnQgPSAwOwogICAgCiAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGEsICZhaSk7CiAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGIsICZiaSk7CiAgICB3aGlsZSAoYWkubGVhZiAmJiBiaS5sZWFmKQogICAgewoJaWYgKGFpLnVjczQgPT0gYmkudWNzNCkKCXsKCSAgICBGY0NoYXIzMgkqYW0gPSBhaS5sZWFmLT5tYXA7CgkgICAgRmNDaGFyMzIJKmJtID0gYmkubGVhZi0+bWFwOwoJICAgIGludAkJaSA9IDI1Ni8zMjsKCSAgICB3aGlsZSAoaS0tKQoJCWNvdW50ICs9IEZjQ2hhclNldFBvcENvdW50ICgqYW0rKyAmICpibSsrKTsKCSAgICBGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKTsKCX0gCgllbHNlIGlmIChhaS51Y3M0IDwgYmkudWNzNCkKCXsKCSAgICBhaS51Y3M0ID0gYmkudWNzNDsKCSAgICBGY0NoYXJTZXRJdGVyU2V0IChhLCAmYWkpOwoJfQoJaWYgKGJpLnVjczQgPCBhaS51Y3M0KQoJewoJICAgIGJpLnVjczQgPSBhaS51Y3M0OwoJICAgIEZjQ2hhclNldEl0ZXJTZXQgKGIsICZiaSk7Cgl9CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KCkZjQ2hhcjMyCkZjQ2hhclNldENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEpCnsKICAgIEZjQ2hhclNldEl0ZXIgICBhaTsKICAgIEZjQ2hhcjMyCSAgICBjb3VudCA9IDA7CiAgICAKICAgIGZvciAoRmNDaGFyU2V0SXRlclN0YXJ0IChhLCAmYWkpOyBhaS5sZWFmOyBGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKSkKICAgIHsKCWludAkJICAgIGkgPSAyNTYvMzI7CglGY0NoYXIzMgkgICAgKmFtID0gYWkubGVhZi0+bWFwOwoKCXdoaWxlIChpLS0pCgkgICAgY291bnQgKz0gRmNDaGFyU2V0UG9wQ291bnQgKCphbSsrKTsKICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKRmNDaGFyMzIKRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpCnsKICAgIEZjQ2hhclNldEl0ZXIgICBhaSwgYmk7CiAgICBGY0NoYXIzMgkgICAgY291bnQgPSAwOwogICAgCiAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGEsICZhaSk7CiAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGIsICZiaSk7CiAgICB3aGlsZSAoYWkubGVhZikKICAgIHsKCWlmIChhaS51Y3M0IDw9IGJpLnVjczQpCgl7CgkgICAgRmNDaGFyMzIJKmFtID0gYWkubGVhZi0+bWFwOwoJICAgIGludAkJaSA9IDI1Ni8zMjsKCSAgICBpZiAoYWkudWNzNCA9PSBiaS51Y3M0KQoJICAgIHsKCQlGY0NoYXIzMgkqYm0gPSBiaS5sZWFmLT5tYXA7OwoJCXdoaWxlIChpLS0pCgkJICAgIGNvdW50ICs9IEZjQ2hhclNldFBvcENvdW50ICgqYW0rKyAmIH4qYm0rKyk7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJd2hpbGUgKGktLSkKCQkgICAgY291bnQgKz0gRmNDaGFyU2V0UG9wQ291bnQgKCphbSsrKTsKCSAgICB9CgkgICAgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSk7Cgl9CgllbHNlIGlmIChiaS5sZWFmKQoJewoJICAgIGJpLnVjczQgPSBhaS51Y3M0OwoJICAgIEZjQ2hhclNldEl0ZXJTZXQgKGIsICZiaSk7Cgl9CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KCi8qCiAqIHJldHVybiBGY1RydWUgaWZmIGEgaXMgYSBzdWJzZXQgb2YgYgogKi8KRmNCb29sCkZjQ2hhclNldElzU3Vic2V0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKewogICAgaW50CQlhaSwgYmk7CiAgICBGY0NoYXIxNglhbiwgYm47CiAgICAKICAgIGlmIChhID09IGIpIHJldHVybiBGY1RydWU7CiAgICBiaSA9IDA7CiAgICBhaSA9IDA7CiAgICB3aGlsZSAoYWkgPCBhLT5udW0gJiYgYmkgPCBiLT5udW0pCiAgICB7CglhbiA9IGEtPm51bWJlcnNbYWldOwoJYm4gPSBiLT5udW1iZXJzW2JpXTsKCWlmIChhbiA9PSBibikKCXsKCSAgICBGY0NoYXIzMgkqYW0gPSBhLT5sZWF2ZXNbYWldLT5tYXA7CgkgICAgRmNDaGFyMzIJKmJtID0gYi0+bGVhdmVzW2JpXS0+bWFwOwoJICAgIAoJICAgIGlmIChhbSAhPSBibSkKCSAgICB7CgkJaW50CWkgPSAyNTYvMzI7CgkJd2hpbGUgKGktLSkKCQkgICAgaWYgKCphbSsrICYgfipibSsrKQoJCQlyZXR1cm4gRmNGYWxzZTsKCSAgICB9CgkgICAgYWkrKzsKCSAgICBiaSsrOwoJfQoJZWxzZSBpZiAoYW4gPCBibikKCSAgICByZXR1cm4gRmNGYWxzZTsKCWVsc2UKCXsKCSAgICBpbnQJICAgIGxvdyA9IGJpICsgMTsKCSAgICBpbnQJICAgIGhpZ2ggPSBiLT5udW0gLSAxOwoKCSAgICB3aGlsZSAobG93IDw9IGhpZ2gpCgkgICAgewoJCWludCBtaWQgPSAobG93ICsgaGlnaCkgPj4gMTsKCQlibiA9IGItPm51bWJlcnNbbWlkXTsKCQlpZiAoYm4gPT0gYW4pCgkJewoJCSAgICBoaWdoID0gbWlkOwoJCSAgICBicmVhazsKCQl9CgkJaWYgKGJuIDwgYW4pCgkJICAgIGxvdyA9IG1pZCArIDE7CgkJZWxzZQoJCSAgICBoaWdoID0gbWlkIC0gMTsKCSAgICB9CgkgICAgYmkgPSBoaWdoOwoJICAgIHdoaWxlIChiaSA8IGItPm51bSAmJiBiLT5udW1iZXJzW2JpXSA8IGFuKQoJCWJpKys7Cgl9CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9CgovKgogKiBUaGVzZSB0d28gZnVuY3Rpb25zIGVmZmljaWVudGx5IHdhbGsgdGhlIGVudGlyZSBjaGFybWFwIGZvcgogKiBvdGhlciBzb2Z0d2FyZSAobGlrZSBwYW5nbykgdGhhdCB3YW50IHRoZWlyIG93biBjb3B5CiAqLwoKRmNDaGFyMzIKRmNDaGFyU2V0TmV4dFBhZ2UgKGNvbnN0IEZjQ2hhclNldCAgKmEsIAoJCSAgIEZjQ2hhcjMyCSAgICBtYXBbRkNfQ0hBUlNFVF9NQVBfU0laRV0sCgkJICAgRmNDaGFyMzIJICAgICpuZXh0KQp7CiAgICBGY0NoYXJTZXRJdGVyICAgYWk7CiAgICBGY0NoYXIzMgkgICAgcGFnZTsKCiAgICBhaS51Y3M0ID0gKm5leHQ7CiAgICBGY0NoYXJTZXRJdGVyU2V0IChhLCAmYWkpOwogICAgaWYgKCFhaS5sZWFmKQoJcmV0dXJuIEZDX0NIQVJTRVRfRE9ORTsKICAgIAogICAgLyoKICAgICAqIFNhdmUgY3VycmVudCBpbmZvcm1hdGlvbgogICAgICovCiAgICBwYWdlID0gYWkudWNzNDsKICAgIG1lbWNweSAobWFwLCBhaS5sZWFmLT5tYXAsIHNpemVvZiAoYWkubGVhZi0+bWFwKSk7CiAgICAvKgogICAgICogU3RlcCB0byBuZXh0IHBhZ2UKICAgICAqLwogICAgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSk7CiAgICAqbmV4dCA9IGFpLnVjczQ7CgogICAgcmV0dXJuIHBhZ2U7Cn0KCkZjQ2hhcjMyCkZjQ2hhclNldEZpcnN0UGFnZSAoY29uc3QgRmNDaGFyU2V0ICphLCAKCQkgICAgRmNDaGFyMzIJICAgIG1hcFtGQ19DSEFSU0VUX01BUF9TSVpFXSwKCQkgICAgRmNDaGFyMzIJICAgICpuZXh0KQp7CiAgICAqbmV4dCA9IDA7CiAgICByZXR1cm4gRmNDaGFyU2V0TmV4dFBhZ2UgKGEsIG1hcCwgbmV4dCk7Cn0KCi8qCiAqIG9sZCBjb3ZlcmFnZSBBUEksIHJhdGhlciBoYXJkIHRvIHVzZSBjb3JyZWN0bHkKICovCkZjQ2hhcjMyCkZjQ2hhclNldENvdmVyYWdlIChjb25zdCBGY0NoYXJTZXQgKmEsIEZjQ2hhcjMyIHBhZ2UsIEZjQ2hhcjMyICpyZXN1bHQpOwogICAgCkZjQ2hhcjMyCkZjQ2hhclNldENvdmVyYWdlIChjb25zdCBGY0NoYXJTZXQgKmEsIEZjQ2hhcjMyIHBhZ2UsIEZjQ2hhcjMyICpyZXN1bHQpCnsKICAgIEZjQ2hhclNldEl0ZXIgICBhaTsKCiAgICBhaS51Y3M0ID0gcGFnZTsKICAgIEZjQ2hhclNldEl0ZXJTZXQgKGEsICZhaSk7CiAgICBpZiAoIWFpLmxlYWYpCiAgICB7CgltZW1zZXQgKHJlc3VsdCwgJ1wwJywgMjU2IC8gOCk7CglwYWdlID0gMDsKICAgIH0KICAgIGVsc2UKICAgIHsKCW1lbWNweSAocmVzdWx0LCBhaS5sZWFmLT5tYXAsIHNpemVvZiAoYWkubGVhZi0+bWFwKSk7CglGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKTsKCXBhZ2UgPSBhaS51Y3M0OwogICAgfQogICAgcmV0dXJuIHBhZ2U7Cn0KCi8qCiAqIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIGNoYXJzZXRzLgogKiAKICogRWFjaCBsZWFmIGlzIHJlcHJlc2VudGVkIGFzIDkgMzItYml0IHZhbHVlcywgdGhlIGNvZGUgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBmb2xsb3dlZAogKiBieSA4IDMyIGJpdCB2YWx1ZXMgZm9yIHRoZSBsZWFmIGl0c2VsZi4gIEVhY2ggdmFsdWUgaXMgZW5jb2RlZCBhcyA1IEFTQ0lJIGNoYXJhY3RlcnMsCiAqIG9ubHkgODUgZGlmZmVyZW50IHZhbHVlcyBhcmUgdXNlZCB0byBhdm9pZCBjb250cm9sIGNoYXJhY3RlcnMgYXMgd2VsbCBhcyB0aGUgb3RoZXIKICogY2hhcmFjdGVycyB1c2VkIHRvIGVuY29kZSBmb250IG5hbWVzLiAgODUqKjUgPiAyXjMyIHNvIHRoaW5ncyB3b3JrIG91dCwgYnV0CiAqIGl0J3Mgbm90IGV4YWN0bHkgaHVtYW4gcmVhZGFibGUgb3V0cHV0LiAgQXMgYSBzcGVjaWFsIGNhc2UsIDAgaXMgZW5jb2RlZCBhcyBhIHNwYWNlCiAqLwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIJY2hhclRvVmFsdWVbMjU2XSA9IHsKICAgIC8qICAgICAiIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAgICJcYiIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwwMjAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMDMwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAgICAiICIgKi8gMHhmZiwgIDB4MDAsICAweGZmLCAgMHgwMSwgIDB4MDIsICAweDAzLCAgMHgwNCwgIDB4ZmYsIAogICAgLyogICAgIigiICovIDB4MDUsICAweDA2LCAgMHgwNywgIDB4MDgsICAweGZmLCAgMHhmZiwgIDB4MDksICAweDBhLCAKICAgIC8qICAgICIwIiAqLyAweDBiLCAgMHgwYywgIDB4MGQsICAweDBlLCAgMHgwZiwgIDB4MTAsICAweDExLCAgMHgxMiwgCiAgICAvKiAgICAiOCIgKi8gMHgxMywgIDB4MTQsICAweGZmLCAgMHgxNSwgIDB4MTYsICAweGZmLCAgMHgxNywgIDB4MTgsIAogICAgLyogICAgIkAiICovIDB4MTksICAweDFhLCAgMHgxYiwgIDB4MWMsICAweDFkLCAgMHgxZSwgIDB4MWYsICAweDIwLCAKICAgIC8qICAgICJIIiAqLyAweDIxLCAgMHgyMiwgIDB4MjMsICAweDI0LCAgMHgyNSwgIDB4MjYsICAweDI3LCAgMHgyOCwgCiAgICAvKiAgICAiUCIgKi8gMHgyOSwgIDB4MmEsICAweDJiLCAgMHgyYywgIDB4MmQsICAweDJlLCAgMHgyZiwgIDB4MzAsIAogICAgLyogICAgIlgiICovIDB4MzEsICAweDMyLCAgMHgzMywgIDB4MzQsICAweGZmLCAgMHgzNSwgIDB4MzYsICAweGZmLCAKICAgIC8qICAgICJgIiAqLyAweGZmLCAgMHgzNywgIDB4MzgsICAweDM5LCAgMHgzYSwgIDB4M2IsICAweDNjLCAgMHgzZCwgCiAgICAvKiAgICAiaCIgKi8gMHgzZSwgIDB4M2YsICAweDQwLCAgMHg0MSwgIDB4NDIsICAweDQzLCAgMHg0NCwgIDB4NDUsIAogICAgLyogICAgInAiICovIDB4NDYsICAweDQ3LCAgMHg0OCwgIDB4NDksICAweDRhLCAgMHg0YiwgIDB4NGMsICAweDRkLCAKICAgIC8qICAgICJ4IiAqLyAweDRlLCAgMHg0ZiwgIDB4NTAsICAweDUxLCAgMHg1MiwgIDB4NTMsICAweDU0LCAgMHhmZiwgCiAgICAvKiAiXDIwMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyMTAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjIwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDIzMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyNDAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjUwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDI2MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyNzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzAwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDMxMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzMjAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzMwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDM0MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzNTAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzYwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDM3MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAp9OwoKc3RhdGljIGNvbnN0IEZjQ2hhcjggdmFsdWVUb0NoYXJbMHg1NV0gPSB7CiAgICAvKiAweDAwICovICchJywgJyMnLCAnJCcsICclJywgJyYnLCAnKCcsICcpJywgJyonLAogICAgLyogMHgwOCAqLyAnKycsICcuJywgJy8nLCAnMCcsICcxJywgJzInLCAnMycsICc0JywKICAgIC8qIDB4MTAgKi8gJzUnLCAnNicsICc3JywgJzgnLCAnOScsICc7JywgJzwnLCAnPicsCiAgICAvKiAweDE4ICovICc/JywgJ0AnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLAogICAgLyogMHgyMCAqLyAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywKICAgIC8qIDB4MjggKi8gJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsCiAgICAvKiAweDMwICovICdXJywgJ1gnLCAnWScsICdaJywgJ1snLCAnXScsICdeJywgJ2EnLAogICAgLyogMHgzOCAqLyAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywKICAgIC8qIDB4NDAgKi8gJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJywgJ3AnLCAncScsCiAgICAvKiAweDQ4ICovICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLAogICAgLyogMHg1MCAqLyAneicsICd7JywgJ3wnLCAnfScsICd+JywKfTsKCnN0YXRpYyBGY0NoYXI4ICoKRmNDaGFyU2V0UGFyc2VWYWx1ZSAoRmNDaGFyOCAqc3RyaW5nLCBGY0NoYXIzMiAqdmFsdWUpCnsKICAgIGludAkJaTsKICAgIEZjQ2hhcjMyCXY7CiAgICBGY0NoYXIzMgljOwogICAgCiAgICBpZiAoKnN0cmluZyA9PSAnICcpCiAgICB7Cgl2ID0gMDsKCXN0cmluZysrOwogICAgfQogICAgZWxzZQogICAgewoJdiA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQoJewoJICAgIGlmICghKGMgPSAoRmNDaGFyMzIpICh1bnNpZ25lZCBjaGFyKSAqc3RyaW5nKyspKQoJCXJldHVybiAwOwoJICAgIGMgPSBjaGFyVG9WYWx1ZVtjXTsKCSAgICBpZiAoYyA9PSAweGZmKQoJCXJldHVybiAwOwoJICAgIHYgPSB2ICogODUgKyBjOwoJfQogICAgfQogICAgKnZhbHVlID0gdjsKICAgIHJldHVybiBzdHJpbmc7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDaGFyU2V0VW5wYXJzZVZhbHVlIChGY1N0ckJ1ZiAqYnVmLCBGY0NoYXIzMiB2YWx1ZSkKewogICAgaW50CSAgICBpOwogICAgaWYgKHZhbHVlID09IDApCiAgICB7CglyZXR1cm4gRmNTdHJCdWZDaGFyIChidWYsICcgJyk7CiAgICB9CiAgICBlbHNlCiAgICB7CglGY0NoYXI4CXN0cmluZ1s2XTsKCUZjQ2hhcjgJKnMgPSBzdHJpbmcgKyA1OwoJc3RyaW5nWzVdID0gJ1wwJzsKCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCgl7CgkgICAgKi0tcyA9IHZhbHVlVG9DaGFyW3ZhbHVlICUgODVdOwoJICAgIHZhbHVlIC89IDg1OwoJfQoJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKCSAgICBpZiAoIUZjU3RyQnVmQ2hhciAoYnVmLCAqcysrKSkKCQlyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJMZWFmRW50IEZjQ2hhckxlYWZFbnQ7CgpzdHJ1Y3QgX0ZjQ2hhckxlYWZFbnQgewogICAgRmNDaGFyTGVhZkVudCAgICpuZXh0OwogICAgRmNDaGFyMzIJICAgIGhhc2g7CiAgICBGY0NoYXJMZWFmCSAgICBsZWFmOwp9OwoKI2RlZmluZSBGQ19DSEFSX0xFQUZfQkxPQ0sJKDQwOTYgLyBzaXplb2YgKEZjQ2hhckxlYWZFbnQpKQoKc3RhdGljIEZjQ2hhckxlYWZFbnQgKgpGY0NoYXJMZWFmRW50Q3JlYXRlICh2b2lkKQp7CiAgICBzdGF0aWMgRmNDaGFyTGVhZkVudCAgICAqYmxvY2s7CiAgICBzdGF0aWMgaW50CQkgICAgcmVtYWluOwoKICAgIGlmICghcmVtYWluKQogICAgewoJYmxvY2sgPSBtYWxsb2MgKEZDX0NIQVJfTEVBRl9CTE9DSyAqIHNpemVvZiAoRmNDaGFyTGVhZkVudCkpOwoJaWYgKCFibG9jaykKCSAgICByZXR1cm4gMDsKCXJlbWFpbiA9IEZDX0NIQVJfTEVBRl9CTE9DSzsKICAgIH0KICAgIHJlbWFpbi0tOwogICAgcmV0dXJuIGJsb2NrKys7Cn0KCiNkZWZpbmUgRkNfQ0hBUl9MRUFGX0hBU0hfU0laRQkyNTcKCnN0YXRpYyBGY0NoYXIzMgpGY0NoYXJMZWFmSGFzaCAoRmNDaGFyTGVhZiAqbGVhZikKewogICAgRmNDaGFyMzIJaGFzaCA9IDA7CiAgICBpbnQJCWk7CgogICAgZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJaGFzaCA9ICgoaGFzaCA8PCAxKSB8IChoYXNoID4+IDMxKSkgXiBsZWFmLT5tYXBbaV07CiAgICByZXR1cm4gaGFzaDsKfQoKc3RhdGljIGludAlGY0NoYXJMZWFmVG90YWw7CnN0YXRpYyBpbnQJRmNDaGFyTGVhZlVzZWQ7CgpzdGF0aWMgRmNDaGFyTGVhZiAqCkZjQ2hhclNldEZyZWV6ZUxlYWYgKEZjQ2hhckxlYWYgKmxlYWYpCnsKICAgIHN0YXRpYyBGY0NoYXJMZWFmRW50CSpoYXNoVGFibGVbRkNfQ0hBUl9MRUFGX0hBU0hfU0laRV07CiAgICBGY0NoYXIzMgkJCWhhc2ggPSBGY0NoYXJMZWFmSGFzaCAobGVhZik7CiAgICBGY0NoYXJMZWFmRW50CQkqKmJ1Y2tldCA9ICZoYXNoVGFibGVbaGFzaCAlIEZDX0NIQVJfTEVBRl9IQVNIX1NJWkVdOwogICAgRmNDaGFyTGVhZkVudAkJKmVudDsKICAgIAogICAgRmNDaGFyTGVhZlRvdGFsKys7CiAgICBmb3IgKGVudCA9ICpidWNrZXQ7IGVudDsgZW50ID0gZW50LT5uZXh0KQogICAgewoJaWYgKGVudC0+aGFzaCA9PSBoYXNoICYmICFtZW1jbXAgKCZlbnQtPmxlYWYsIGxlYWYsIHNpemVvZiAoRmNDaGFyTGVhZikpKQoJICAgIHJldHVybiAmZW50LT5sZWFmOwogICAgfQoKICAgIGVudCA9IEZjQ2hhckxlYWZFbnRDcmVhdGUoKTsKICAgIGlmICghZW50KQoJcmV0dXJuIDA7CiAgICBGY0NoYXJMZWFmVXNlZCsrOwogICAgZW50LT5sZWFmID0gKmxlYWY7CiAgICBlbnQtPmhhc2ggPSBoYXNoOwogICAgZW50LT5uZXh0ID0gKmJ1Y2tldDsKICAgICpidWNrZXQgPSBlbnQ7CiAgICByZXR1cm4gJmVudC0+bGVhZjsKfQoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhclNldEVudCBGY0NoYXJTZXRFbnQ7CgpzdHJ1Y3QgX0ZjQ2hhclNldEVudCB7CiAgICBGY0NoYXJTZXRFbnQJKm5leHQ7CiAgICBGY0NoYXIzMgkJaGFzaDsKICAgIEZjQ2hhclNldAkJc2V0Owp9OwoKI2RlZmluZSBGQ19DSEFSX1NFVF9IQVNIX1NJWkUgICAgNjcKCnN0YXRpYyBGY0NoYXIzMgpGY0NoYXJTZXRIYXNoIChGY0NoYXJTZXQgKmZjcykKewogICAgRmNDaGFyMzIJaGFzaCA9IDA7CiAgICBGY0NoYXIzMgkqcDsKICAgIGludAkJaTsKCiAgICAvKiBoYXNoIGluIGxlYXZlcyAqLwogICAgcCA9IChGY0NoYXIzMiAqKSBmY3MtPmxlYXZlczsKICAgIGZvciAoaSA9IDA7IGkgPCBmY3MtPm51bSAqIHNpemVvZiAoRmNDaGFyTGVhZiAqKSAvIHNpemVvZiAoRmNDaGFyMzIpOyBpKyspCgloYXNoID0gKChoYXNoIDw8IDEpIHwgKGhhc2ggPj4gMzEpKSBeICpwKys7CiAgICAvKiBoYXNoIGluIG51bWJlcnMgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBmY3MtPm51bTsgaSsrKQoJaGFzaCA9ICgoaGFzaCA8PCAxKSB8IChoYXNoID4+IDMxKSkgXiBmY3MtPm51bWJlcnNbaV07CiAgICByZXR1cm4gaGFzaDsKfQoKc3RhdGljIGludAlGY0NoYXJTZXRUb3RhbDsKc3RhdGljIGludAlGY0NoYXJTZXRVc2VkOwpzdGF0aWMgaW50CUZjQ2hhclNldFRvdGFsRW50cywgRmNDaGFyU2V0VXNlZEVudHM7CgpzdGF0aWMgRmNDaGFyU2V0ICoKRmNDaGFyU2V0RnJlZXplQmFzZSAoRmNDaGFyU2V0ICpmY3MpCnsKICAgIHN0YXRpYyBGY0NoYXJTZXRFbnQJKmhhc2hUYWJsZVtGQ19DSEFSX1NFVF9IQVNIX1NJWkVdOwogICAgRmNDaGFyMzIJCWhhc2ggPSBGY0NoYXJTZXRIYXNoIChmY3MpOwogICAgRmNDaGFyU2V0RW50CSoqYnVja2V0ID0gJmhhc2hUYWJsZVtoYXNoICUgRkNfQ0hBUl9TRVRfSEFTSF9TSVpFXTsKICAgIEZjQ2hhclNldEVudAkqZW50OwoKICAgIEZjQ2hhclNldFRvdGFsKys7CiAgICBGY0NoYXJTZXRUb3RhbEVudHMgKz0gZmNzLT5udW07CiAgICBmb3IgKGVudCA9ICpidWNrZXQ7IGVudDsgZW50ID0gZW50LT5uZXh0KQogICAgewoJaWYgKGVudC0+aGFzaCA9PSBoYXNoICYmCgkgICAgZW50LT5zZXQubnVtID09IGZjcy0+bnVtICYmCgkgICAgIW1lbWNtcCAoZW50LT5zZXQubGVhdmVzLCBmY3MtPmxlYXZlcywKCQkgICAgIGZjcy0+bnVtICogc2l6ZW9mIChGY0NoYXJMZWFmICopKSAmJgoJICAgICFtZW1jbXAgKGVudC0+c2V0Lm51bWJlcnMsIGZjcy0+bnVtYmVycywKCQkgICAgIGZjcy0+bnVtICogc2l6ZW9mIChGY0NoYXIxNikpKQoJewoJICAgIHJldHVybiAmZW50LT5zZXQ7Cgl9CiAgICB9CgogICAgZW50ID0gbWFsbG9jIChzaXplb2YgKEZjQ2hhclNldEVudCkgKwoJCSAgZmNzLT5udW0gKiBzaXplb2YgKEZjQ2hhckxlYWYgKikgKwoJCSAgZmNzLT5udW0gKiBzaXplb2YgKEZjQ2hhcjE2KSk7CiAgICBpZiAoIWVudCkKCXJldHVybiAwOwogICAgRmNDaGFyU2V0VXNlZCsrOwogICAgRmNDaGFyU2V0VXNlZEVudHMgKz0gZmNzLT5udW07CiAgICAKICAgIGVudC0+c2V0LnJlZiA9IDA7CiAgICBlbnQtPnNldC5jb25zdGFudCA9IEZjVHJ1ZTsKICAgIGVudC0+c2V0Lm51bSA9IGZjcy0+bnVtOwogICAgaWYgKGZjcy0+bnVtKQogICAgewoJZW50LT5zZXQubGVhdmVzID0gKEZjQ2hhckxlYWYgKiopIChlbnQgKyAxKTsKCWVudC0+c2V0Lm51bWJlcnMgPSAoRmNDaGFyMTYgKikgKGVudC0+c2V0LmxlYXZlcyArIGZjcy0+bnVtKTsKCW1lbWNweSAoZW50LT5zZXQubGVhdmVzLCBmY3MtPmxlYXZlcywgZmNzLT5udW0gKiBzaXplb2YgKEZjQ2hhckxlYWYgKikpOwoJbWVtY3B5IChlbnQtPnNldC5udW1iZXJzLCBmY3MtPm51bWJlcnMsIGZjcy0+bnVtICogc2l6ZW9mIChGY0NoYXIxNikpOwogICAgfQogICAgZWxzZQogICAgewoJZW50LT5zZXQubGVhdmVzID0gMDsKCWVudC0+c2V0Lm51bWJlcnMgPSAwOwogICAgfQoKICAgIGVudC0+aGFzaCA9IGhhc2g7CiAgICBlbnQtPm5leHQgPSAqYnVja2V0OwogICAgKmJ1Y2tldCA9IGVudDsKICAgIHJldHVybiAmZW50LT5zZXQ7Cn0KCkZjQ2hhclNldCAqCkZjQ2hhclNldEZyZWV6ZSAoRmNDaGFyU2V0ICpmY3MpCnsKICAgIEZjQ2hhclNldAkqYjsKICAgIEZjQ2hhclNldAkqbiA9IDA7CiAgICBGY0NoYXJMZWFmCSpsOwogICAgaW50CQlpOwoKICAgIGIgPSBGY0NoYXJTZXRDcmVhdGUgKCk7CiAgICBpZiAoIWIpCglnb3RvIGJhaWwwOwogICAgZm9yIChpID0gMDsgaSA8IGZjcy0+bnVtOyBpKyspCiAgICB7CglsID0gRmNDaGFyU2V0RnJlZXplTGVhZiAoZmNzLT5sZWF2ZXNbaV0pOwoJaWYgKCFsKQoJICAgIGdvdG8gYmFpbDE7CglpZiAoIUZjQ2hhclNldEluc2VydExlYWYgKGIsIGZjcy0+bnVtYmVyc1tpXSA8PCA4LCBsKSkKCSAgICBnb3RvIGJhaWwxOwogICAgfQogICAgbiA9IEZjQ2hhclNldEZyZWV6ZUJhc2UgKGIpOwpiYWlsMToKICAgIGlmIChiLT5sZWF2ZXMpCglmcmVlIChiLT5sZWF2ZXMpOwogICAgaWYgKGItPm51bWJlcnMpCglmcmVlIChiLT5udW1iZXJzKTsKICAgIGZyZWUgKGIpOwpiYWlsMDoKICAgIHJldHVybiBuOwp9CgpGY0NoYXJTZXQgKgpGY05hbWVQYXJzZUNoYXJTZXQgKEZjQ2hhcjggKnN0cmluZykKewogICAgRmNDaGFyU2V0CSpjLCAqbiA9IDA7CiAgICBGY0NoYXIzMgl1Y3M0OwogICAgRmNDaGFyTGVhZgkqbGVhZjsKICAgIEZjQ2hhckxlYWYJdGVtcDsKICAgIEZjQ2hhcjMyCWJpdHM7CiAgICBpbnQJCWk7CgogICAgYyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKICAgIGlmICghYykKCWdvdG8gYmFpbDA7CiAgICB3aGlsZSAoKnN0cmluZykKICAgIHsKCXN0cmluZyA9IEZjQ2hhclNldFBhcnNlVmFsdWUgKHN0cmluZywgJnVjczQpOwoJaWYgKCFzdHJpbmcpCgkgICAgZ290byBiYWlsMTsKCWJpdHMgPSAwOwoJZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJewoJICAgIHN0cmluZyA9IEZjQ2hhclNldFBhcnNlVmFsdWUgKHN0cmluZywgJnRlbXAubWFwW2ldKTsKCSAgICBpZiAoIXN0cmluZykKCQlnb3RvIGJhaWwxOwoJICAgIGJpdHMgfD0gdGVtcC5tYXBbaV07Cgl9CglpZiAoYml0cykKCXsKCSAgICBsZWFmID0gRmNDaGFyU2V0RnJlZXplTGVhZiAoJnRlbXApOwoJICAgIGlmICghbGVhZikKCQlnb3RvIGJhaWwxOwoJICAgIGlmICghRmNDaGFyU2V0SW5zZXJ0TGVhZiAoYywgdWNzNCwgbGVhZikpCgkJZ290byBiYWlsMTsKCX0KICAgIH0KI2lmZGVmIENIQVRUWQogICAgcHJpbnRmICgiICAgICAgICAgICU4cyAlOHMgJThzICU4c1xuIiwgInRvdGFsIiwgInRvdGFsbWVtIiwgIm5ldyIsICJuZXdtZW0iKTsKICAgIHByaW50ZiAoIkxlYXZlczogICAlOGQgJThkICU4ZCAlOGRcbiIsCgkgICAgRmNDaGFyTGVhZlRvdGFsLCBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlRvdGFsLAoJICAgIEZjQ2hhckxlYWZVc2VkLCBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlVzZWQpOwogICAgcHJpbnRmICgiQ2hhcnNldHM6ICU4ZCAlOGQgJThkICU4ZFxuIiwKCSAgICBGY0NoYXJTZXRUb3RhbCwgc2l6ZW9mIChGY0NoYXJTZXQpICogRmNDaGFyU2V0VG90YWwsCgkgICAgRmNDaGFyU2V0VXNlZCwgc2l6ZW9mIChGY0NoYXJTZXQpICogRmNDaGFyU2V0VXNlZCk7CiAgICBwcmludGYgKCJUYWJsZXM6ICAgJThkICU4ZCAlOGQgJThkXG4iLAoJICAgIEZjQ2hhclNldFRvdGFsRW50cywgRmNDaGFyU2V0VG90YWxFbnRzICogKHNpemVvZiAoRmNDaGFyTGVhZiAqKSArIHNpemVvZiAoRmNDaGFyMTYpKSwKCSAgICBGY0NoYXJTZXRVc2VkRW50cywgRmNDaGFyU2V0VXNlZEVudHMgKiAoc2l6ZW9mIChGY0NoYXJMZWFmICopICsgc2l6ZW9mIChGY0NoYXIxNikpKTsKICAgIHByaW50ZiAoIlRvdGFsOiAgICAlOHMgJThkICU4cyAlOGRcbiIsIAoJICAgICIiLCAKCSAgICBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlRvdGFsICsKCSAgICBzaXplb2YgKEZjQ2hhclNldCkgKiBGY0NoYXJTZXRUb3RhbCArCgkgICAgRmNDaGFyU2V0VG90YWxFbnRzICogKHNpemVvZiAoRmNDaGFyTGVhZiAqKSArIHNpemVvZiAoRmNDaGFyMTYpKSwKCSAgICAiIiwKCSAgICBzaXplb2YgKEZjQ2hhckxlYWYpICogRmNDaGFyTGVhZlVzZWQgKwoJICAgIHNpemVvZiAoRmNDaGFyU2V0KSAqIEZjQ2hhclNldFVzZWQgKwoJICAgIEZjQ2hhclNldFVzZWRFbnRzICogKHNpemVvZiAoRmNDaGFyTGVhZiAqKSArIHNpemVvZiAoRmNDaGFyMTYpKSk7CiNlbmRpZgogICAgbiA9IEZjQ2hhclNldEZyZWV6ZUJhc2UgKGMpOwpiYWlsMToKICAgIGlmIChjLT5sZWF2ZXMpCglmcmVlIChjLT5sZWF2ZXMpOwogICAgaWYgKGMtPm51bWJlcnMpCglmcmVlIChjLT5udW1iZXJzKTsKICAgIGZyZWUgKGMpOwpiYWlsMDoKICAgIHJldHVybiBuOwp9CgpGY0Jvb2wKRmNOYW1lVW5wYXJzZUNoYXJTZXQgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjQ2hhclNldCAqYykKewogICAgRmNDaGFyU2V0SXRlciAgIGNpOwogICAgaW50CQkgICAgaTsKI2lmZGVmIENIRUNLCiAgICBpbnQJCSAgICBsZW4gPSBidWYtPmxlbjsKI2VuZGlmCgogICAgZm9yIChGY0NoYXJTZXRJdGVyU3RhcnQgKGMsICZjaSk7CgkgY2kubGVhZjsKCSBGY0NoYXJTZXRJdGVyTmV4dCAoYywgJmNpKSkKICAgIHsKCWlmICghRmNDaGFyU2V0VW5wYXJzZVZhbHVlIChidWYsIGNpLnVjczQpKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJICAgIGlmICghRmNDaGFyU2V0VW5wYXJzZVZhbHVlIChidWYsIGNpLmxlYWYtPm1hcFtpXSkpCgkJcmV0dXJuIEZjRmFsc2U7CiAgICB9CiNpZmRlZiBDSEVDSwogICAgewoJRmNDaGFyU2V0CSpjaGVjazsKCUZjQ2hhcjMyCW1pc3Npbmc7CglGY0NoYXJTZXRJdGVyCWNpLCBjaGVja2k7CgkKCS8qIG51bGwgdGVybWluYXRlIGZvciBwYXJzZXIgKi8KCUZjU3RyQnVmQ2hhciAoYnVmLCAnXDAnKTsKCS8qIHN0ZXAgYmFjayBvdmVyIG51bGwgZm9yIGxpZmUgYWZ0ZXIgdGVzdCAqLwoJYnVmLT5sZW4tLTsKCWNoZWNrID0gRmNOYW1lUGFyc2VDaGFyU2V0IChidWYtPmJ1ZiArIGxlbik7CglGY0NoYXJTZXRJdGVyU3RhcnQgKGMsICZjaSk7CglGY0NoYXJTZXRJdGVyU3RhcnQgKGNoZWNrLCAmY2hlY2tpKTsKCXdoaWxlIChjaS5sZWFmIHx8IGNoZWNraS5sZWFmKQoJewoJICAgIGlmIChjaS51Y3M0IDwgY2hlY2tpLnVjczQpCgkgICAgewoJCXByaW50ZiAoIk1pc3NpbmcgbGVhZiBub2RlIGF0IDB4JXhcbiIsIGNpLnVjczQpOwoJCUZjQ2hhclNldEl0ZXJOZXh0IChjLCAmY2kpOwoJICAgIH0KCSAgICBlbHNlIGlmIChjaGVja2kudWNzNCA8IGNpLnVjczQpCgkgICAgewoJCXByaW50ZiAoIkV4dHJhIGxlYWYgbm9kZSBhdCAweCV4XG4iLCBjaGVja2kudWNzNCk7CgkJRmNDaGFyU2V0SXRlck5leHQgKGNoZWNrLCAmY2hlY2tpKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQlpbnQJICAgIGkgPSAyNTYvMzI7CgkJRmNDaGFyMzIgICAgKmNtID0gY2kubGVhZi0+bWFwOwoJCUZjQ2hhcjMyICAgICpjaGVja20gPSBjaGVja2kubGVhZi0+bWFwOwoKCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDMyKQoJCXsKCQkgICAgaWYgKCpjbSAhPSAqY2hlY2ttKQoJCQlwcmludGYgKCJNaXNtYXRjaGluZyBzZXRzIGF0IDB4JTA4eDogMHglMDh4ICE9IDB4JTA4eFxuIiwKCQkJCWNpLnVjczQgKyBpLCAqY20sICpjaGVja20pOwoJCSAgICBjbSsrOwoJCSAgICBjaGVja20rKzsKCQl9CgkJRmNDaGFyU2V0SXRlck5leHQgKGMsICZjaSk7CgkJRmNDaGFyU2V0SXRlck5leHQgKGNoZWNrLCAmY2hlY2tpKTsKCSAgICB9Cgl9CglpZiAoKG1pc3NpbmcgPSBGY0NoYXJTZXRTdWJ0cmFjdENvdW50IChjLCBjaGVjaykpKQoJICAgIHByaW50ZiAoIiVkIG1pc3NpbmcgaW4gcmVwYXJzZWQgcmVzdWx0XG4iLCBtaXNzaW5nKTsKCWlmICgobWlzc2luZyA9IEZjQ2hhclNldFN1YnRyYWN0Q291bnQgKGNoZWNrLCBjKSkpCgkgICAgcHJpbnRmICgiJWQgZXh0cmEgaW4gcmVwYXJzZWQgcmVzdWx0XG4iLCBtaXNzaW5nKTsKCUZjQ2hhclNldERlc3Ryb3kgKGNoZWNrKTsKICAgIH0KI2VuZGlmCiAgICAKICAgIHJldHVybiBGY1RydWU7Cn0KCi8qCiAqIEZpZ3VyZSBvdXQgd2hldGhlciB0aGUgYXZhaWxhYmxlIGZyZWV0eXBlIGhhcyBGVF9HZXRfTmV4dF9DaGFyCiAqLwoKI2lmIEZSRUVUWVBFX01BSk9SID4gMgojIGRlZmluZSBIQVNfTkVYVF9DSEFSCiNlbHNlCiMgaWYgRlJFRVRZUEVfTUFKT1IgPT0gMgojICBpZiBGUkVFVFlQRV9NSU5PUiA+IDAKIyAgIGRlZmluZSBIQVNfTkVYVF9DSEFSCiMgIGVsc2UKIyAgIGlmIEZSRUVUWVBFX01JTk9SID09IDAKIyAgICBpZiBGUkVFVFlQRV9QQVRDSCA+PSA5CiMgICAgIGRlZmluZSBIQVNfTkVYVF9DSEFSCiMgICAgZW5kaWYKIyAgIGVuZGlmCiMgIGVuZGlmCiMgZW5kaWYKI2VuZGlmCgovKgogKiBGb3Igb3VyIHB1cnBvc2VzLCB0aGlzIGFwcHJveGltYXRpb24gaXMgc3VmZmljaWVudAogKi8KI2lmbmRlZiBIQVNfTkVYVF9DSEFSCiNkZWZpbmUgRlRfR2V0X0ZpcnN0X0NoYXIoZmFjZSwgZ2kpICgoKihnaSkgPSAxKSwgMSkKI2RlZmluZSBGVF9HZXRfTmV4dF9DaGFyKGZhY2UsIHVjczQsIGdpKSAoKHVjczQpID49IDB4ZmZmZmZmID8gXAoJCQkJCSAgKCooZ2kpID0gMCksIDAgOiBcCgkJCQkJICAoKihnaSkgPSAxKSwgKHVjczQpICsgMSkKI3dhcm5pbmcgIk5vIEZUX0dldF9OZXh0X0NoYXIiCiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhckVudCB7CiAgICBGY0NoYXIxNgkgICAgYm1wOwogICAgdW5zaWduZWQgY2hhciAgIGVuY29kZTsKfSBGY0NoYXJFbnQ7CgpzdHJ1Y3QgX0ZjQ2hhck1hcCB7CiAgICBjb25zdCBGY0NoYXJFbnQgKmVudDsKICAgIGludAkJICAgIG5lbnQ7Cn07Cgp0eXBlZGVmIHN0cnVjdCBfRmNGb250RGVjb2RlIHsKICAgIEZUX0VuY29kaW5nCSAgICBlbmNvZGluZzsKICAgIGNvbnN0IEZjQ2hhck1hcCAqbWFwOwogICAgRmNDaGFyMzIJICAgIG1heDsKfSBGY0ZvbnREZWNvZGU7CgpzdGF0aWMgY29uc3QgRmNDaGFyRW50IEFwcGxlUm9tYW5FbnRbXSA9IHsKICAgIHsgMHgwMDIwLCAweDIwIH0sIC8qIFNQQUNFICovCiAgICB7IDB4MDAyMSwgMHgyMSB9LCAvKiBFWENMQU1BVElPTiBNQVJLICovCiAgICB7IDB4MDAyMiwgMHgyMiB9LCAvKiBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDAwMjMsIDB4MjMgfSwgLyogTlVNQkVSIFNJR04gKi8KICAgIHsgMHgwMDI0LCAweDI0IH0sIC8qIERPTExBUiBTSUdOICovCiAgICB7IDB4MDAyNSwgMHgyNSB9LCAvKiBQRVJDRU5UIFNJR04gKi8KICAgIHsgMHgwMDI2LCAweDI2IH0sIC8qIEFNUEVSU0FORCAqLwogICAgeyAweDAwMjcsIDB4MjcgfSwgLyogQVBPU1RST1BIRSAqLwogICAgeyAweDAwMjgsIDB4MjggfSwgLyogTEVGVCBQQVJFTlRIRVNJUyAqLwogICAgeyAweDAwMjksIDB4MjkgfSwgLyogUklHSFQgUEFSRU5USEVTSVMgKi8KICAgIHsgMHgwMDJBLCAweDJBIH0sIC8qIEFTVEVSSVNLICovCiAgICB7IDB4MDAyQiwgMHgyQiB9LCAvKiBQTFVTIFNJR04gKi8KICAgIHsgMHgwMDJDLCAweDJDIH0sIC8qIENPTU1BICovCiAgICB7IDB4MDAyRCwgMHgyRCB9LCAvKiBIWVBIRU4tTUlOVVMgKi8KICAgIHsgMHgwMDJFLCAweDJFIH0sIC8qIEZVTEwgU1RPUCAqLwogICAgeyAweDAwMkYsIDB4MkYgfSwgLyogU09MSURVUyAqLwogICAgeyAweDAwMzAsIDB4MzAgfSwgLyogRElHSVQgWkVSTyAqLwogICAgeyAweDAwMzEsIDB4MzEgfSwgLyogRElHSVQgT05FICovCiAgICB7IDB4MDAzMiwgMHgzMiB9LCAvKiBESUdJVCBUV08gKi8KICAgIHsgMHgwMDMzLCAweDMzIH0sIC8qIERJR0lUIFRIUkVFICovCiAgICB7IDB4MDAzNCwgMHgzNCB9LCAvKiBESUdJVCBGT1VSICovCiAgICB7IDB4MDAzNSwgMHgzNSB9LCAvKiBESUdJVCBGSVZFICovCiAgICB7IDB4MDAzNiwgMHgzNiB9LCAvKiBESUdJVCBTSVggKi8KICAgIHsgMHgwMDM3LCAweDM3IH0sIC8qIERJR0lUIFNFVkVOICovCiAgICB7IDB4MDAzOCwgMHgzOCB9LCAvKiBESUdJVCBFSUdIVCAqLwogICAgeyAweDAwMzksIDB4MzkgfSwgLyogRElHSVQgTklORSAqLwogICAgeyAweDAwM0EsIDB4M0EgfSwgLyogQ09MT04gKi8KICAgIHsgMHgwMDNCLCAweDNCIH0sIC8qIFNFTUlDT0xPTiAqLwogICAgeyAweDAwM0MsIDB4M0MgfSwgLyogTEVTUy1USEFOIFNJR04gKi8KICAgIHsgMHgwMDNELCAweDNEIH0sIC8qIEVRVUFMUyBTSUdOICovCiAgICB7IDB4MDAzRSwgMHgzRSB9LCAvKiBHUkVBVEVSLVRIQU4gU0lHTiAqLwogICAgeyAweDAwM0YsIDB4M0YgfSwgLyogUVVFU1RJT04gTUFSSyAqLwogICAgeyAweDAwNDAsIDB4NDAgfSwgLyogQ09NTUVSQ0lBTCBBVCAqLwogICAgeyAweDAwNDEsIDB4NDEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSAqLwogICAgeyAweDAwNDIsIDB4NDIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiAqLwogICAgeyAweDAwNDMsIDB4NDMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyAqLwogICAgeyAweDAwNDQsIDB4NDQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCAqLwogICAgeyAweDAwNDUsIDB4NDUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSAqLwogICAgeyAweDAwNDYsIDB4NDYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRiAqLwogICAgeyAweDAwNDcsIDB4NDcgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyAqLwogICAgeyAweDAwNDgsIDB4NDggfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCAqLwogICAgeyAweDAwNDksIDB4NDkgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSAqLwogICAgeyAweDAwNEEsIDB4NEEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSiAqLwogICAgeyAweDAwNEIsIDB4NEIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyAqLwogICAgeyAweDAwNEMsIDB4NEMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCAqLwogICAgeyAweDAwNEQsIDB4NEQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTSAqLwogICAgeyAweDAwNEUsIDB4NEUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiAqLwogICAgeyAweDAwNEYsIDB4NEYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyAqLwogICAgeyAweDAwNTAsIDB4NTAgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgUCAqLwogICAgeyAweDAwNTEsIDB4NTEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgUSAqLwogICAgeyAweDAwNTIsIDB4NTIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiAqLwogICAgeyAweDAwNTMsIDB4NTMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyAqLwogICAgeyAweDAwNTQsIDB4NTQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCAqLwogICAgeyAweDAwNTUsIDB4NTUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSAqLwogICAgeyAweDAwNTYsIDB4NTYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgViAqLwogICAgeyAweDAwNTcsIDB4NTcgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyAqLwogICAgeyAweDAwNTgsIDB4NTggfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgWCAqLwogICAgeyAweDAwNTksIDB4NTkgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSAqLwogICAgeyAweDAwNUEsIDB4NUEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiAqLwogICAgeyAweDAwNUIsIDB4NUIgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVCAqLwogICAgeyAweDAwNUMsIDB4NUMgfSwgLyogUkVWRVJTRSBTT0xJRFVTICovCiAgICB7IDB4MDA1RCwgMHg1RCB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCAqLwogICAgeyAweDAwNUUsIDB4NUUgfSwgLyogQ0lSQ1VNRkxFWCBBQ0NFTlQgKi8KICAgIHsgMHgwMDVGLCAweDVGIH0sIC8qIExPVyBMSU5FICovCiAgICB7IDB4MDA2MCwgMHg2MCB9LCAvKiBHUkFWRSBBQ0NFTlQgKi8KICAgIHsgMHgwMDYxLCAweDYxIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBICovCiAgICB7IDB4MDA2MiwgMHg2MiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQiAqLwogICAgeyAweDAwNjMsIDB4NjMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEMgKi8KICAgIHsgMHgwMDY0LCAweDY0IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBEICovCiAgICB7IDB4MDA2NSwgMHg2NSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSAqLwogICAgeyAweDAwNjYsIDB4NjYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEYgKi8KICAgIHsgMHgwMDY3LCAweDY3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBHICovCiAgICB7IDB4MDA2OCwgMHg2OCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSCAqLwogICAgeyAweDAwNjksIDB4NjkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgKi8KICAgIHsgMHgwMDZBLCAweDZBIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBKICovCiAgICB7IDB4MDA2QiwgMHg2QiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSyAqLwogICAgeyAweDAwNkMsIDB4NkMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEwgKi8KICAgIHsgMHgwMDZELCAweDZEIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBNICovCiAgICB7IDB4MDA2RSwgMHg2RSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTiAqLwogICAgeyAweDAwNkYsIDB4NkYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gKi8KICAgIHsgMHgwMDcwLCAweDcwIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBQICovCiAgICB7IDB4MDA3MSwgMHg3MSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUSAqLwogICAgeyAweDAwNzIsIDB4NzIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFIgKi8KICAgIHsgMHgwMDczLCAweDczIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBTICovCiAgICB7IDB4MDA3NCwgMHg3NCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVCAqLwogICAgeyAweDAwNzUsIDB4NzUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgKi8KICAgIHsgMHgwMDc2LCAweDc2IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBWICovCiAgICB7IDB4MDA3NywgMHg3NyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVyAqLwogICAgeyAweDAwNzgsIDB4NzggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFggKi8KICAgIHsgMHgwMDc5LCAweDc5IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBZICovCiAgICB7IDB4MDA3QSwgMHg3QSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWiAqLwogICAgeyAweDAwN0IsIDB4N0IgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUICovCiAgICB7IDB4MDA3QywgMHg3QyB9LCAvKiBWRVJUSUNBTCBMSU5FICovCiAgICB7IDB4MDA3RCwgMHg3RCB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUICovCiAgICB7IDB4MDA3RSwgMHg3RSB9LCAvKiBUSUxERSAqLwogICAgeyAweDAwQTAsIDB4Q0EgfSwgLyogTk8tQlJFQUsgU1BBQ0UgKi8KICAgIHsgMHgwMEExLCAweEMxIH0sIC8qIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksgKi8KICAgIHsgMHgwMEEyLCAweEEyIH0sIC8qIENFTlQgU0lHTiAqLwogICAgeyAweDAwQTMsIDB4QTMgfSwgLyogUE9VTkQgU0lHTiAqLwogICAgeyAweDAwQTUsIDB4QjQgfSwgLyogWUVOIFNJR04gKi8KICAgIHsgMHgwMEE3LCAweEE0IH0sIC8qIFNFQ1RJT04gU0lHTiAqLwogICAgeyAweDAwQTgsIDB4QUMgfSwgLyogRElBRVJFU0lTICovCiAgICB7IDB4MDBBOSwgMHhBOSB9LCAvKiBDT1BZUklHSFQgU0lHTiAqLwogICAgeyAweDAwQUEsIDB4QkIgfSwgLyogRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KICAgIHsgMHgwMEFCLCAweEM3IH0sIC8qIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MDBBQywgMHhDMiB9LCAvKiBOT1QgU0lHTiAqLwogICAgeyAweDAwQUUsIDB4QTggfSwgLyogUkVHSVNURVJFRCBTSUdOICovCiAgICB7IDB4MDBBRiwgMHhGOCB9LCAvKiBNQUNST04gKi8KICAgIHsgMHgwMEIwLCAweEExIH0sIC8qIERFR1JFRSBTSUdOICovCiAgICB7IDB4MDBCMSwgMHhCMSB9LCAvKiBQTFVTLU1JTlVTIFNJR04gKi8KICAgIHsgMHgwMEI0LCAweEFCIH0sIC8qIEFDVVRFIEFDQ0VOVCAqLwogICAgeyAweDAwQjUsIDB4QjUgfSwgLyogTUlDUk8gU0lHTiAqLwogICAgeyAweDAwQjYsIDB4QTYgfSwgLyogUElMQ1JPVyBTSUdOICovCiAgICB7IDB4MDBCNywgMHhFMSB9LCAvKiBNSURETEUgRE9UICovCiAgICB7IDB4MDBCOCwgMHhGQyB9LCAvKiBDRURJTExBICovCiAgICB7IDB4MDBCQSwgMHhCQyB9LCAvKiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KICAgIHsgMHgwMEJCLCAweEM4IH0sIC8qIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDAwQkYsIDB4QzAgfSwgLyogSU5WRVJURUQgUVVFU1RJT04gTUFSSyAqLwogICAgeyAweDAwQzAsIDB4Q0IgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBDMSwgMHhFNyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEMyLCAweEU1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBDMywgMHhDQyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEM0LCAweDgwIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEM1LCAweDgxIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFICovCiAgICB7IDB4MDBDNiwgMHhBRSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRSAqLwogICAgeyAweDAwQzcsIDB4ODIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEgKi8KICAgIHsgMHgwMEM4LCAweEU5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwQzksIDB4ODMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBDQSwgMHhFNiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwQ0IsIDB4RTggfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwQ0MsIDB4RUQgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBDRCwgMHhFQSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMENFLCAweEVCIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBDRiwgMHhFQyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBEMSwgMHg4NCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEQyLCAweEYxIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRDMsIDB4RUUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBENCwgMHhFRiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRDUsIDB4Q0QgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFICovCiAgICB7IDB4MDBENiwgMHg4NSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBEOCwgMHhBRiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFICovCiAgICB7IDB4MDBEOSwgMHhGNCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMERBLCAweEYyIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwREIsIDB4RjMgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMERDLCAweDg2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMERGLCAweEE3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTICovCiAgICB7IDB4MDBFMCwgMHg4OCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBFMSwgMHg4NyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBFMiwgMHg4OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEUzLCAweDhCIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEU0LCAweDhBIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBFNSwgMHg4QyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi8KICAgIHsgMHgwMEU2LCAweEJFIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBRSAqLwogICAgeyAweDAwRTcsIDB4OEQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCiAgICB7IDB4MDBFOCwgMHg4RiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBFOSwgMHg4RSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBFQSwgMHg5MCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEVCLCAweDkxIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBFQywgMHg5MyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBFRCwgMHg5MiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBFRSwgMHg5NCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEVGLCAweDk1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBGMSwgMHg5NiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFICovCiAgICB7IDB4MDBGMiwgMHg5OCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBGMywgMHg5NyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBGNCwgMHg5OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEY1LCAweDlCIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEY2LCAweDlBIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBGNywgMHhENiB9LCAvKiBESVZJU0lPTiBTSUdOICovCiAgICB7IDB4MDBGOCwgMHhCRiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqLwogICAgeyAweDAwRjksIDB4OUQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwRkEsIDB4OUMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwRkIsIDB4OUUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBGQywgMHg5RiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwRkYsIDB4RDggfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMTMxLCAweEY1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkgKi8KICAgIHsgMHgwMTUyLCAweENFIH0sIC8qIExBVElOIENBUElUQUwgTElHQVRVUkUgT0UgKi8KICAgIHsgMHgwMTUzLCAweENGIH0sIC8qIExBVElOIFNNQUxMIExJR0FUVVJFIE9FICovCiAgICB7IDB4MDE3OCwgMHhEOSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDE5MiwgMHhDNCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sgKi8KICAgIHsgMHgwMkM2LCAweEY2IH0sIC8qIE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVCAqLwogICAgeyAweDAyQzcsIDB4RkYgfSwgLyogQ0FST04gKi8KICAgIHsgMHgwMkQ4LCAweEY5IH0sIC8qIEJSRVZFICovCiAgICB7IDB4MDJEOSwgMHhGQSB9LCAvKiBET1QgQUJPVkUgKi8KICAgIHsgMHgwMkRBLCAweEZCIH0sIC8qIFJJTkcgQUJPVkUgKi8KICAgIHsgMHgwMkRCLCAweEZFIH0sIC8qIE9HT05FSyAqLwogICAgeyAweDAyREMsIDB4RjcgfSwgLyogU01BTEwgVElMREUgKi8KICAgIHsgMHgwMkRELCAweEZEIH0sIC8qIERPVUJMRSBBQ1VURSBBQ0NFTlQgKi8KICAgIHsgMHgwM0E5LCAweEJEIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBICovCiAgICB7IDB4MDNDMCwgMHhCOSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUEkgKi8KICAgIHsgMHgyMDEzLCAweEQwIH0sIC8qIEVOIERBU0ggKi8KICAgIHsgMHgyMDE0LCAweEQxIH0sIC8qIEVNIERBU0ggKi8KICAgIHsgMHgyMDE4LCAweEQ0IH0sIC8qIExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxOSwgMHhENSB9LCAvKiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDFBLCAweEUyIH0sIC8qIFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMUMsIDB4RDIgfSwgLyogTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDFELCAweEQzIH0sIC8qIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMUUsIDB4RTMgfSwgLyogRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAyMCwgMHhBMCB9LCAvKiBEQUdHRVIgKi8KICAgIHsgMHgyMDIxLCAweEUwIH0sIC8qIERPVUJMRSBEQUdHRVIgKi8KICAgIHsgMHgyMDIyLCAweEE1IH0sIC8qIEJVTExFVCAqLwogICAgeyAweDIwMjYsIDB4QzkgfSwgLyogSE9SSVpPTlRBTCBFTExJUFNJUyAqLwogICAgeyAweDIwMzAsIDB4RTQgfSwgLyogUEVSIE1JTExFIFNJR04gKi8KICAgIHsgMHgyMDM5LCAweERDIH0sIC8qIFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAzQSwgMHhERCB9LCAvKiBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDQ0LCAweERBIH0sIC8qIEZSQUNUSU9OIFNMQVNIICovCiAgICB7IDB4MjBBQywgMHhEQiB9LCAvKiBFVVJPIFNJR04gKi8KICAgIHsgMHgyMTIyLCAweEFBIH0sIC8qIFRSQURFIE1BUksgU0lHTiAqLwogICAgeyAweDIyMDIsIDB4QjYgfSwgLyogUEFSVElBTCBESUZGRVJFTlRJQUwgKi8KICAgIHsgMHgyMjA2LCAweEM2IH0sIC8qIElOQ1JFTUVOVCAqLwogICAgeyAweDIyMEYsIDB4QjggfSwgLyogTi1BUlkgUFJPRFVDVCAqLwogICAgeyAweDIyMTEsIDB4QjcgfSwgLyogTi1BUlkgU1VNTUFUSU9OICovCiAgICB7IDB4MjIxQSwgMHhDMyB9LCAvKiBTUVVBUkUgUk9PVCAqLwogICAgeyAweDIyMUUsIDB4QjAgfSwgLyogSU5GSU5JVFkgKi8KICAgIHsgMHgyMjJCLCAweEJBIH0sIC8qIElOVEVHUkFMICovCiAgICB7IDB4MjI0OCwgMHhDNSB9LCAvKiBBTE1PU1QgRVFVQUwgVE8gKi8KICAgIHsgMHgyMjYwLCAweEFEIH0sIC8qIE5PVCBFUVVBTCBUTyAqLwogICAgeyAweDIyNjQsIDB4QjIgfSwgLyogTEVTUy1USEFOIE9SIEVRVUFMIFRPICovCiAgICB7IDB4MjI2NSwgMHhCMyB9LCAvKiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8gKi8KICAgIHsgMHgyNUNBLCAweEQ3IH0sIC8qIExPWkVOR0UgKi8KICAgIHsgMHhGOEZGLCAweEYwIH0sIC8qIEFwcGxlIGxvZ28gKi8KICAgIHsgMHhGQjAxLCAweERFIH0sIC8qIExBVElOIFNNQUxMIExJR0FUVVJFIEZJICovCiAgICB7IDB4RkIwMiwgMHhERiB9LCAvKiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGTCAqLwp9OwoKc3RhdGljIGNvbnN0IEZjQ2hhck1hcCBBcHBsZVJvbWFuID0gewogICAgQXBwbGVSb21hbkVudCwKICAgIHNpemVvZiAoQXBwbGVSb21hbkVudCkgLyBzaXplb2YgKEFwcGxlUm9tYW5FbnRbMF0pCn07CgpzdGF0aWMgY29uc3QgRmNDaGFyRW50IEFkb2JlU3ltYm9sRW50W10gPSB7CiAgICB7IDB4MDAyMCwgMHgyMCB9LCAvKiBTUEFDRQkjIHNwYWNlICovCiAgICB7IDB4MDAyMSwgMHgyMSB9LCAvKiBFWENMQU1BVElPTiBNQVJLCSMgZXhjbGFtICovCiAgICB7IDB4MDAyMywgMHgyMyB9LCAvKiBOVU1CRVIgU0lHTgkjIG51bWJlcnNpZ24gKi8KICAgIHsgMHgwMDI1LCAweDI1IH0sIC8qIFBFUkNFTlQgU0lHTgkjIHBlcmNlbnQgKi8KICAgIHsgMHgwMDI2LCAweDI2IH0sIC8qIEFNUEVSU0FORAkjIGFtcGVyc2FuZCAqLwogICAgeyAweDAwMjgsIDB4MjggfSwgLyogTEVGVCBQQVJFTlRIRVNJUwkjIHBhcmVubGVmdCAqLwogICAgeyAweDAwMjksIDB4MjkgfSwgLyogUklHSFQgUEFSRU5USEVTSVMJIyBwYXJlbnJpZ2h0ICovCiAgICB7IDB4MDAyQiwgMHgyQiB9LCAvKiBQTFVTIFNJR04JIyBwbHVzICovCiAgICB7IDB4MDAyQywgMHgyQyB9LCAvKiBDT01NQQkjIGNvbW1hICovCiAgICB7IDB4MDAyRSwgMHgyRSB9LCAvKiBGVUxMIFNUT1AJIyBwZXJpb2QgKi8KICAgIHsgMHgwMDJGLCAweDJGIH0sIC8qIFNPTElEVVMJIyBzbGFzaCAqLwogICAgeyAweDAwMzAsIDB4MzAgfSwgLyogRElHSVQgWkVSTwkjIHplcm8gKi8KICAgIHsgMHgwMDMxLCAweDMxIH0sIC8qIERJR0lUIE9ORQkjIG9uZSAqLwogICAgeyAweDAwMzIsIDB4MzIgfSwgLyogRElHSVQgVFdPCSMgdHdvICovCiAgICB7IDB4MDAzMywgMHgzMyB9LCAvKiBESUdJVCBUSFJFRQkjIHRocmVlICovCiAgICB7IDB4MDAzNCwgMHgzNCB9LCAvKiBESUdJVCBGT1VSCSMgZm91ciAqLwogICAgeyAweDAwMzUsIDB4MzUgfSwgLyogRElHSVQgRklWRQkjIGZpdmUgKi8KICAgIHsgMHgwMDM2LCAweDM2IH0sIC8qIERJR0lUIFNJWAkjIHNpeCAqLwogICAgeyAweDAwMzcsIDB4MzcgfSwgLyogRElHSVQgU0VWRU4JIyBzZXZlbiAqLwogICAgeyAweDAwMzgsIDB4MzggfSwgLyogRElHSVQgRUlHSFQJIyBlaWdodCAqLwogICAgeyAweDAwMzksIDB4MzkgfSwgLyogRElHSVQgTklORQkjIG5pbmUgKi8KICAgIHsgMHgwMDNBLCAweDNBIH0sIC8qIENPTE9OCSMgY29sb24gKi8KICAgIHsgMHgwMDNCLCAweDNCIH0sIC8qIFNFTUlDT0xPTgkjIHNlbWljb2xvbiAqLwogICAgeyAweDAwM0MsIDB4M0MgfSwgLyogTEVTUy1USEFOIFNJR04JIyBsZXNzICovCiAgICB7IDB4MDAzRCwgMHgzRCB9LCAvKiBFUVVBTFMgU0lHTgkjIGVxdWFsICovCiAgICB7IDB4MDAzRSwgMHgzRSB9LCAvKiBHUkVBVEVSLVRIQU4gU0lHTgkjIGdyZWF0ZXIgKi8KICAgIHsgMHgwMDNGLCAweDNGIH0sIC8qIFFVRVNUSU9OIE1BUksJIyBxdWVzdGlvbiAqLwogICAgeyAweDAwNUIsIDB4NUIgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVAkjIGJyYWNrZXRsZWZ0ICovCiAgICB7IDB4MDA1RCwgMHg1RCB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAkjIGJyYWNrZXRyaWdodCAqLwogICAgeyAweDAwNUYsIDB4NUYgfSwgLyogTE9XIExJTkUJIyB1bmRlcnNjb3JlICovCiAgICB7IDB4MDA3QiwgMHg3QiB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQJIyBicmFjZWxlZnQgKi8KICAgIHsgMHgwMDdDLCAweDdDIH0sIC8qIFZFUlRJQ0FMIExJTkUJIyBiYXIgKi8KICAgIHsgMHgwMDdELCAweDdEIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQJIyBicmFjZXJpZ2h0ICovCiAgICB7IDB4MDBBMCwgMHgyMCB9LCAvKiBOTy1CUkVBSyBTUEFDRQkjIHNwYWNlICovCiAgICB7IDB4MDBBQywgMHhEOCB9LCAvKiBOT1QgU0lHTgkjIGxvZ2ljYWxub3QgKi8KICAgIHsgMHgwMEIwLCAweEIwIH0sIC8qIERFR1JFRSBTSUdOCSMgZGVncmVlICovCiAgICB7IDB4MDBCMSwgMHhCMSB9LCAvKiBQTFVTLU1JTlVTIFNJR04JIyBwbHVzbWludXMgKi8KICAgIHsgMHgwMEI1LCAweDZEIH0sIC8qIE1JQ1JPIFNJR04JIyBtdSAqLwogICAgeyAweDAwRDcsIDB4QjQgfSwgLyogTVVMVElQTElDQVRJT04gU0lHTgkjIG11bHRpcGx5ICovCiAgICB7IDB4MDBGNywgMHhCOCB9LCAvKiBESVZJU0lPTiBTSUdOCSMgZGl2aWRlICovCiAgICB7IDB4MDE5MiwgMHhBNiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sJIyBmbG9yaW4gKi8KICAgIHsgMHgwMzkxLCAweDQxIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBCSMgQWxwaGEgKi8KICAgIHsgMHgwMzkyLCAweDQyIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEJIyBCZXRhICovCiAgICB7IDB4MDM5MywgMHg0NyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQkjIEdhbW1hICovCiAgICB7IDB4MDM5NCwgMHg0NCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQkjIERlbHRhICovCiAgICB7IDB4MDM5NSwgMHg0NSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCSMgRXBzaWxvbiAqLwogICAgeyAweDAzOTYsIDB4NUEgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQkjIFpldGEgKi8KICAgIHsgMHgwMzk3LCAweDQ4IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQQkjIEV0YSAqLwogICAgeyAweDAzOTgsIDB4NTEgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEJIyBUaGV0YSAqLwogICAgeyAweDAzOTksIDB4NDkgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQkjIElvdGEgKi8KICAgIHsgMHgwMzlBLCAweDRCIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCSMgS2FwcGEgKi8KICAgIHsgMHgwMzlCLCAweDRDIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCSMgTGFtYmRhICovCiAgICB7IDB4MDM5QywgMHg0RCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQkjIE11ICovCiAgICB7IDB4MDM5RCwgMHg0RSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBOVQkjIE51ICovCiAgICB7IDB4MDM5RSwgMHg1OCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBYSQkjIFhpICovCiAgICB7IDB4MDM5RiwgMHg0RiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCSMgT21pY3JvbiAqLwogICAgeyAweDAzQTAsIDB4NTAgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkJIyBQaSAqLwogICAgeyAweDAzQTEsIDB4NTIgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCSMgUmhvICovCiAgICB7IDB4MDNBMywgMHg1MyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQkjIFNpZ21hICovCiAgICB7IDB4MDNBNCwgMHg1NCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUQVUJIyBUYXUgKi8KICAgIHsgMHgwM0E1LCAweDU1IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04JIyBVcHNpbG9uICovCiAgICB7IDB4MDNBNiwgMHg0NiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkJIyBQaGkgKi8KICAgIHsgMHgwM0E3LCAweDQzIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIENISQkjIENoaSAqLwogICAgeyAweDAzQTgsIDB4NTkgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCSMgUHNpICovCiAgICB7IDB4MDNBOSwgMHg1NyB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQkjIE9tZWdhICovCiAgICB7IDB4MDNCMSwgMHg2MSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEJIyBhbHBoYSAqLwogICAgeyAweDAzQjIsIDB4NjIgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEJFVEEJIyBiZXRhICovCiAgICB7IDB4MDNCMywgMHg2NyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEJIyBnYW1tYSAqLwogICAgeyAweDAzQjQsIDB4NjQgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCSMgZGVsdGEgKi8KICAgIHsgMHgwM0I1LCAweDY1IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCSMgZXBzaWxvbiAqLwogICAgeyAweDAzQjYsIDB4N0EgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEJIyB6ZXRhICovCiAgICB7IDB4MDNCNywgMHg2OCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgRVRBCSMgZXRhICovCiAgICB7IDB4MDNCOCwgMHg3MSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEJIyB0aGV0YSAqLwogICAgeyAweDAzQjksIDB4NjkgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIElPVEEJIyBpb3RhICovCiAgICB7IDB4MDNCQSwgMHg2QiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgS0FQUEEJIyBrYXBwYSAqLwogICAgeyAweDAzQkIsIDB4NkMgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCSMgbGFtYmRhICovCiAgICB7IDB4MDNCQywgMHg2RCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgTVUJIyBtdSAqLwogICAgeyAweDAzQkQsIDB4NkUgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIE5VCSMgbnUgKi8KICAgIHsgMHgwM0JFLCAweDc4IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBYSQkjIHhpICovCiAgICB7IDB4MDNCRiwgMHg2RiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgkjIG9taWNyb24gKi8KICAgIHsgMHgwM0MwLCAweDcwIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBQSQkjIHBpICovCiAgICB7IDB4MDNDMSwgMHg3MiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCSMgcmhvICovCiAgICB7IDB4MDNDMiwgMHg1NiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEJIyBzaWdtYTEgKi8KICAgIHsgMHgwM0MzLCAweDczIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQkjIHNpZ21hICovCiAgICB7IDB4MDNDNCwgMHg3NCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCSMgdGF1ICovCiAgICB7IDB4MDNDNSwgMHg3NSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTgkjIHVwc2lsb24gKi8KICAgIHsgMHgwM0M2LCAweDY2IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkJIyBwaGkgKi8KICAgIHsgMHgwM0M3LCAweDYzIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBDSEkJIyBjaGkgKi8KICAgIHsgMHgwM0M4LCAweDc5IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBQU0kJIyBwc2kgKi8KICAgIHsgMHgwM0M5LCAweDc3IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQkjIG9tZWdhICovCiAgICB7IDB4MDNEMSwgMHg0QSB9LCAvKiBHUkVFSyBUSEVUQSBTWU1CT0wJIyB0aGV0YTEgKi8KICAgIHsgMHgwM0QyLCAweEExIH0sIC8qIEdSRUVLIFVQU0lMT04gV0lUSCBIT09LIFNZTUJPTAkjIFVwc2lsb24xICovCiAgICB7IDB4MDNENSwgMHg2QSB9LCAvKiBHUkVFSyBQSEkgU1lNQk9MCSMgcGhpMSAqLwogICAgeyAweDAzRDYsIDB4NzYgfSwgLyogR1JFRUsgUEkgU1lNQk9MCSMgb21lZ2ExICovCiAgICB7IDB4MjAyMiwgMHhCNyB9LCAvKiBCVUxMRVQJIyBidWxsZXQgKi8KICAgIHsgMHgyMDI2LCAweEJDIH0sIC8qIEhPUklaT05UQUwgRUxMSVBTSVMJIyBlbGxpcHNpcyAqLwogICAgeyAweDIwMzIsIDB4QTIgfSwgLyogUFJJTUUJIyBtaW51dGUgKi8KICAgIHsgMHgyMDMzLCAweEIyIH0sIC8qIERPVUJMRSBQUklNRQkjIHNlY29uZCAqLwogICAgeyAweDIwNDQsIDB4QTQgfSwgLyogRlJBQ1RJT04gU0xBU0gJIyBmcmFjdGlvbiAqLwogICAgeyAweDIwQUMsIDB4QTAgfSwgLyogRVVSTyBTSUdOCSMgRXVybyAqLwogICAgeyAweDIxMTEsIDB4QzEgfSwgLyogQkxBQ0stTEVUVEVSIENBUElUQUwgSQkjIElmcmFrdHVyICovCiAgICB7IDB4MjExOCwgMHhDMyB9LCAvKiBTQ1JJUFQgQ0FQSVRBTCBQCSMgd2VpZXJzdHJhc3MgKi8KICAgIHsgMHgyMTFDLCAweEMyIH0sIC8qIEJMQUNLLUxFVFRFUiBDQVBJVEFMIFIJIyBSZnJha3R1ciAqLwogICAgeyAweDIxMjYsIDB4NTcgfSwgLyogT0hNIFNJR04JIyBPbWVnYSAqLwogICAgeyAweDIxMzUsIDB4QzAgfSwgLyogQUxFRiBTWU1CT0wJIyBhbGVwaCAqLwogICAgeyAweDIxOTAsIDB4QUMgfSwgLyogTEVGVFdBUkRTIEFSUk9XCSMgYXJyb3dsZWZ0ICovCiAgICB7IDB4MjE5MSwgMHhBRCB9LCAvKiBVUFdBUkRTIEFSUk9XCSMgYXJyb3d1cCAqLwogICAgeyAweDIxOTIsIDB4QUUgfSwgLyogUklHSFRXQVJEUyBBUlJPVwkjIGFycm93cmlnaHQgKi8KICAgIHsgMHgyMTkzLCAweEFGIH0sIC8qIERPV05XQVJEUyBBUlJPVwkjIGFycm93ZG93biAqLwogICAgeyAweDIxOTQsIDB4QUIgfSwgLyogTEVGVCBSSUdIVCBBUlJPVwkjIGFycm93Ym90aCAqLwogICAgeyAweDIxQjUsIDB4QkYgfSwgLyogRE9XTldBUkRTIEFSUk9XIFdJVEggQ09STkVSIExFRlRXQVJEUwkjIGNhcnJpYWdlcmV0dXJuICovCiAgICB7IDB4MjFEMCwgMHhEQyB9LCAvKiBMRUZUV0FSRFMgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmxsZWZ0ICovCiAgICB7IDB4MjFEMSwgMHhERCB9LCAvKiBVUFdBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJsdXAgKi8KICAgIHsgMHgyMUQyLCAweERFIH0sIC8qIFJJR0hUV0FSRFMgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmxyaWdodCAqLwogICAgeyAweDIxRDMsIDB4REYgfSwgLyogRE9XTldBUkRTIERPVUJMRSBBUlJPVwkjIGFycm93ZGJsZG93biAqLwogICAgeyAweDIxRDQsIDB4REIgfSwgLyogTEVGVCBSSUdIVCBET1VCTEUgQVJST1cJIyBhcnJvd2RibGJvdGggKi8KICAgIHsgMHgyMjAwLCAweDIyIH0sIC8qIEZPUiBBTEwJIyB1bml2ZXJzYWwgKi8KICAgIHsgMHgyMjAyLCAweEI2IH0sIC8qIFBBUlRJQUwgRElGRkVSRU5USUFMCSMgcGFydGlhbGRpZmYgKi8KICAgIHsgMHgyMjAzLCAweDI0IH0sIC8qIFRIRVJFIEVYSVNUUwkjIGV4aXN0ZW50aWFsICovCiAgICB7IDB4MjIwNSwgMHhDNiB9LCAvKiBFTVBUWSBTRVQJIyBlbXB0eXNldCAqLwogICAgeyAweDIyMDYsIDB4NDQgfSwgLyogSU5DUkVNRU5UCSMgRGVsdGEgKi8KICAgIHsgMHgyMjA3LCAweEQxIH0sIC8qIE5BQkxBCSMgZ3JhZGllbnQgKi8KICAgIHsgMHgyMjA4LCAweENFIH0sIC8qIEVMRU1FTlQgT0YJIyBlbGVtZW50ICovCiAgICB7IDB4MjIwOSwgMHhDRiB9LCAvKiBOT1QgQU4gRUxFTUVOVCBPRgkjIG5vdGVsZW1lbnQgKi8KICAgIHsgMHgyMjBCLCAweDI3IH0sIC8qIENPTlRBSU5TIEFTIE1FTUJFUgkjIHN1Y2h0aGF0ICovCiAgICB7IDB4MjIwRiwgMHhENSB9LCAvKiBOLUFSWSBQUk9EVUNUCSMgcHJvZHVjdCAqLwogICAgeyAweDIyMTEsIDB4RTUgfSwgLyogTi1BUlkgU1VNTUFUSU9OCSMgc3VtbWF0aW9uICovCiAgICB7IDB4MjIxMiwgMHgyRCB9LCAvKiBNSU5VUyBTSUdOCSMgbWludXMgKi8KICAgIHsgMHgyMjE1LCAweEE0IH0sIC8qIERJVklTSU9OIFNMQVNICSMgZnJhY3Rpb24gKi8KICAgIHsgMHgyMjE3LCAweDJBIH0sIC8qIEFTVEVSSVNLIE9QRVJBVE9SCSMgYXN0ZXJpc2ttYXRoICovCiAgICB7IDB4MjIxQSwgMHhENiB9LCAvKiBTUVVBUkUgUk9PVAkjIHJhZGljYWwgKi8KICAgIHsgMHgyMjFELCAweEI1IH0sIC8qIFBST1BPUlRJT05BTCBUTwkjIHByb3BvcnRpb25hbCAqLwogICAgeyAweDIyMUUsIDB4QTUgfSwgLyogSU5GSU5JVFkJIyBpbmZpbml0eSAqLwogICAgeyAweDIyMjAsIDB4RDAgfSwgLyogQU5HTEUJIyBhbmdsZSAqLwogICAgeyAweDIyMjcsIDB4RDkgfSwgLyogTE9HSUNBTCBBTkQJIyBsb2dpY2FsYW5kICovCiAgICB7IDB4MjIyOCwgMHhEQSB9LCAvKiBMT0dJQ0FMIE9SCSMgbG9naWNhbG9yICovCiAgICB7IDB4MjIyOSwgMHhDNyB9LCAvKiBJTlRFUlNFQ1RJT04JIyBpbnRlcnNlY3Rpb24gKi8KICAgIHsgMHgyMjJBLCAweEM4IH0sIC8qIFVOSU9OCSMgdW5pb24gKi8KICAgIHsgMHgyMjJCLCAweEYyIH0sIC8qIElOVEVHUkFMCSMgaW50ZWdyYWwgKi8KICAgIHsgMHgyMjM0LCAweDVDIH0sIC8qIFRIRVJFRk9SRQkjIHRoZXJlZm9yZSAqLwogICAgeyAweDIyM0MsIDB4N0UgfSwgLyogVElMREUgT1BFUkFUT1IJIyBzaW1pbGFyICovCiAgICB7IDB4MjI0NSwgMHg0MCB9LCAvKiBBUFBST1hJTUFURUxZIEVRVUFMIFRPCSMgY29uZ3J1ZW50ICovCiAgICB7IDB4MjI0OCwgMHhCQiB9LCAvKiBBTE1PU1QgRVFVQUwgVE8JIyBhcHByb3hlcXVhbCAqLwogICAgeyAweDIyNjAsIDB4QjkgfSwgLyogTk9UIEVRVUFMIFRPCSMgbm90ZXF1YWwgKi8KICAgIHsgMHgyMjYxLCAweEJBIH0sIC8qIElERU5USUNBTCBUTwkjIGVxdWl2YWxlbmNlICovCiAgICB7IDB4MjI2NCwgMHhBMyB9LCAvKiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8JIyBsZXNzZXF1YWwgKi8KICAgIHsgMHgyMjY1LCAweEIzIH0sIC8qIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTwkjIGdyZWF0ZXJlcXVhbCAqLwogICAgeyAweDIyODIsIDB4Q0MgfSwgLyogU1VCU0VUIE9GCSMgcHJvcGVyc3Vic2V0ICovCiAgICB7IDB4MjI4MywgMHhDOSB9LCAvKiBTVVBFUlNFVCBPRgkjIHByb3BlcnN1cGVyc2V0ICovCiAgICB7IDB4MjI4NCwgMHhDQiB9LCAvKiBOT1QgQSBTVUJTRVQgT0YJIyBub3RzdWJzZXQgKi8KICAgIHsgMHgyMjg2LCAweENEIH0sIC8qIFNVQlNFVCBPRiBPUiBFUVVBTCBUTwkjIHJlZmxleHN1YnNldCAqLwogICAgeyAweDIyODcsIDB4Q0EgfSwgLyogU1VQRVJTRVQgT0YgT1IgRVFVQUwgVE8JIyByZWZsZXhzdXBlcnNldCAqLwogICAgeyAweDIyOTUsIDB4QzUgfSwgLyogQ0lSQ0xFRCBQTFVTCSMgY2lyY2xlcGx1cyAqLwogICAgeyAweDIyOTcsIDB4QzQgfSwgLyogQ0lSQ0xFRCBUSU1FUwkjIGNpcmNsZW11bHRpcGx5ICovCiAgICB7IDB4MjJBNSwgMHg1RSB9LCAvKiBVUCBUQUNLCSMgcGVycGVuZGljdWxhciAqLwogICAgeyAweDIyQzUsIDB4RDcgfSwgLyogRE9UIE9QRVJBVE9SCSMgZG90bWF0aCAqLwogICAgeyAweDIzMjAsIDB4RjMgfSwgLyogVE9QIEhBTEYgSU5URUdSQUwJIyBpbnRlZ3JhbHRwICovCiAgICB7IDB4MjMyMSwgMHhGNSB9LCAvKiBCT1RUT00gSEFMRiBJTlRFR1JBTAkjIGludGVncmFsYnQgKi8KICAgIHsgMHgyMzI5LCAweEUxIH0sIC8qIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVAkjIGFuZ2xlbGVmdCAqLwogICAgeyAweDIzMkEsIDB4RjEgfSwgLyogUklHSFQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVAkjIGFuZ2xlcmlnaHQgKi8KICAgIHsgMHgyNUNBLCAweEUwIH0sIC8qIExPWkVOR0UJIyBsb3plbmdlICovCiAgICB7IDB4MjY2MCwgMHhBQSB9LCAvKiBCTEFDSyBTUEFERSBTVUlUCSMgc3BhZGUgKi8KICAgIHsgMHgyNjYzLCAweEE3IH0sIC8qIEJMQUNLIENMVUIgU1VJVAkjIGNsdWIgKi8KICAgIHsgMHgyNjY1LCAweEE5IH0sIC8qIEJMQUNLIEhFQVJUIFNVSVQJIyBoZWFydCAqLwogICAgeyAweDI2NjYsIDB4QTggfSwgLyogQkxBQ0sgRElBTU9ORCBTVUlUCSMgZGlhbW9uZCAqLwogICAgeyAweEY2RDksIDB4RDMgfSwgLyogQ09QWVJJR0hUIFNJR04gU0VSSUYJIyBjb3B5cmlnaHRzZXJpZiAoQ1VTKSAqLwogICAgeyAweEY2REEsIDB4RDIgfSwgLyogUkVHSVNURVJFRCBTSUdOIFNFUklGCSMgcmVnaXN0ZXJzZXJpZiAoQ1VTKSAqLwogICAgeyAweEY2REIsIDB4RDQgfSwgLyogVFJBREUgTUFSSyBTSUdOIFNFUklGCSMgdHJhZGVtYXJrc2VyaWYgKENVUykgKi8KICAgIHsgMHhGOEU1LCAweDYwIH0sIC8qIFJBRElDQUwgRVhURU5ERVIJIyByYWRpY2FsZXggKENVUykgKi8KICAgIHsgMHhGOEU2LCAweEJEIH0sIC8qIFZFUlRJQ0FMIEFSUk9XIEVYVEVOREVSCSMgYXJyb3d2ZXJ0ZXggKENVUykgKi8KICAgIHsgMHhGOEU3LCAweEJFIH0sIC8qIEhPUklaT05UQUwgQVJST1cgRVhURU5ERVIJIyBhcnJvd2hvcml6ZXggKENVUykgKi8KICAgIHsgMHhGOEU4LCAweEUyIH0sIC8qIFJFR0lTVEVSRUQgU0lHTiBTQU5TIFNFUklGCSMgcmVnaXN0ZXJzYW5zIChDVVMpICovCiAgICB7IDB4RjhFOSwgMHhFMyB9LCAvKiBDT1BZUklHSFQgU0lHTiBTQU5TIFNFUklGCSMgY29weXJpZ2h0c2FucyAoQ1VTKSAqLwogICAgeyAweEY4RUEsIDB4RTQgfSwgLyogVFJBREUgTUFSSyBTSUdOIFNBTlMgU0VSSUYJIyB0cmFkZW1hcmtzYW5zIChDVVMpICovCiAgICB7IDB4RjhFQiwgMHhFNiB9LCAvKiBMRUZUIFBBUkVOIFRPUAkjIHBhcmVubGVmdHRwIChDVVMpICovCiAgICB7IDB4RjhFQywgMHhFNyB9LCAvKiBMRUZUIFBBUkVOIEVYVEVOREVSCSMgcGFyZW5sZWZ0ZXggKENVUykgKi8KICAgIHsgMHhGOEVELCAweEU4IH0sIC8qIExFRlQgUEFSRU4gQk9UVE9NCSMgcGFyZW5sZWZ0YnQgKENVUykgKi8KICAgIHsgMHhGOEVFLCAweEU5IH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgVE9QCSMgYnJhY2tldGxlZnR0cCAoQ1VTKSAqLwogICAgeyAweEY4RUYsIDB4RUEgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVCBFWFRFTkRFUgkjIGJyYWNrZXRsZWZ0ZXggKENVUykgKi8KICAgIHsgMHhGOEYwLCAweEVCIH0sIC8qIExFRlQgU1FVQVJFIEJSQUNLRVQgQk9UVE9NCSMgYnJhY2tldGxlZnRidCAoQ1VTKSAqLwogICAgeyAweEY4RjEsIDB4RUMgfSwgLyogTEVGVCBDVVJMWSBCUkFDS0VUIFRPUAkjIGJyYWNlbGVmdHRwIChDVVMpICovCiAgICB7IDB4RjhGMiwgMHhFRCB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQgTUlECSMgYnJhY2VsZWZ0bWlkIChDVVMpICovCiAgICB7IDB4RjhGMywgMHhFRSB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQgQk9UVE9NCSMgYnJhY2VsZWZ0YnQgKENVUykgKi8KICAgIHsgMHhGOEY0LCAweEVGIH0sIC8qIENVUkxZIEJSQUNLRVQgRVhURU5ERVIJIyBicmFjZWV4IChDVVMpICovCiAgICB7IDB4RjhGNSwgMHhGNCB9LCAvKiBJTlRFR1JBTCBFWFRFTkRFUgkjIGludGVncmFsZXggKENVUykgKi8KICAgIHsgMHhGOEY2LCAweEY2IH0sIC8qIFJJR0hUIFBBUkVOIFRPUAkjIHBhcmVucmlnaHR0cCAoQ1VTKSAqLwogICAgeyAweEY4RjcsIDB4RjcgfSwgLyogUklHSFQgUEFSRU4gRVhURU5ERVIJIyBwYXJlbnJpZ2h0ZXggKENVUykgKi8KICAgIHsgMHhGOEY4LCAweEY4IH0sIC8qIFJJR0hUIFBBUkVOIEJPVFRPTQkjIHBhcmVucmlnaHRidCAoQ1VTKSAqLwogICAgeyAweEY4RjksIDB4RjkgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQgVE9QCSMgYnJhY2tldHJpZ2h0dHAgKENVUykgKi8KICAgIHsgMHhGOEZBLCAweEZBIH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUIEVYVEVOREVSCSMgYnJhY2tldHJpZ2h0ZXggKENVUykgKi8KICAgIHsgMHhGOEZCLCAweEZCIH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNrZXRyaWdodGJ0IChDVVMpICovCiAgICB7IDB4RjhGQywgMHhGQyB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUIFRPUAkjIGJyYWNlcmlnaHR0cCAoQ1VTKSAqLwogICAgeyAweEY4RkQsIDB4RkQgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVCBNSUQJIyBicmFjZXJpZ2h0bWlkIChDVVMpICovCiAgICB7IDB4RjhGRSwgMHhGRSB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUIEJPVFRPTQkjIGJyYWNlcmlnaHRidCAoQ1VTKSAqLwp9OwoKc3RhdGljIGNvbnN0IEZjQ2hhck1hcCBBZG9iZVN5bWJvbCA9IHsKICAgIEFkb2JlU3ltYm9sRW50LAogICAgc2l6ZW9mIChBZG9iZVN5bWJvbEVudCkgLyBzaXplb2YgKEFkb2JlU3ltYm9sRW50WzBdKSwKfTsKICAgIApzdGF0aWMgY29uc3QgRmNGb250RGVjb2RlIGZjRm9udERlY29kZXJzW10gPSB7CiAgICB7IGZ0X2VuY29kaW5nX3VuaWNvZGUsCTAsCQkoMSA8PCAyMSkgLSAxIH0sCiAgICB7IGZ0X2VuY29kaW5nX3N5bWJvbCwJJkFkb2JlU3ltYm9sLAkoMSA8PCAxNikgLSAxIH0sCiAgICB7IGZ0X2VuY29kaW5nX2FwcGxlX3JvbWFuLAkmQXBwbGVSb21hbiwJKDEgPDwgMTYpIC0gMSB9LAp9OwoKI2RlZmluZSBOVU1fREVDT0RFICAoc2l6ZW9mIChmY0ZvbnREZWNvZGVycykgLyBzaXplb2YgKGZjRm9udERlY29kZXJzWzBdKSkKCkZjQ2hhcjMyCkZjRnJlZVR5cGVVY3M0VG9Qcml2YXRlIChGY0NoYXIzMiB1Y3M0LCBjb25zdCBGY0NoYXJNYXAgKm1hcCkKewogICAgaW50CQlsb3csIGhpZ2gsIG1pZDsKICAgIEZjQ2hhcjE2CWJtcDsKCiAgICBsb3cgPSAwOwogICAgaGlnaCA9IG1hcC0+bmVudCAtIDE7CiAgICBpZiAodWNzNCA8IG1hcC0+ZW50W2xvd10uYm1wIHx8IG1hcC0+ZW50W2hpZ2hdLmJtcCA8IHVjczQpCglyZXR1cm4gfjA7CiAgICB3aGlsZSAobG93IDw9IGhpZ2gpCiAgICB7CgltaWQgPSAoaGlnaCArIGxvdykgPj4gMTsKCWJtcCA9IG1hcC0+ZW50W21pZF0uYm1wOwoJaWYgKHVjczQgPT0gYm1wKQoJICAgIHJldHVybiAoRlRfVUxvbmcpIG1hcC0+ZW50W21pZF0uZW5jb2RlOwoJaWYgKHVjczQgPCBibXApCgkgICAgaGlnaCA9IG1pZCAtIDE7CgllbHNlCgkgICAgbG93ID0gbWlkICsgMTsKICAgIH0KICAgIHJldHVybiB+MDsKfQoKRmNDaGFyMzIKRmNGcmVlVHlwZVByaXZhdGVUb1VjczQgKEZjQ2hhcjMyIHByaXZhdGUsIGNvbnN0IEZjQ2hhck1hcCAqbWFwKQp7CiAgICBpbnQJICAgIGk7CgogICAgZm9yIChpID0gMDsgaSA8IG1hcC0+bmVudDsgaSsrKQoJaWYgKG1hcC0+ZW50W2ldLmVuY29kZSA9PSBwcml2YXRlKQoJICAgIHJldHVybiAoRmNDaGFyMzIpIG1hcC0+ZW50W2ldLmJtcDsKICAgIHJldHVybiB+MDsKfQoKY29uc3QgRmNDaGFyTWFwICoKRmNGcmVlVHlwZUdldFByaXZhdGVNYXAgKEZUX0VuY29kaW5nIGVuY29kaW5nKQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RFQ09ERTsgaSsrKQoJaWYgKGZjRm9udERlY29kZXJzW2ldLmVuY29kaW5nID09IGVuY29kaW5nKQoJICAgIHJldHVybiBmY0ZvbnREZWNvZGVyc1tpXS5tYXA7CiAgICByZXR1cm4gMDsKfQoKLyoKICogTWFwIGEgVUNTNCBnbHlwaCB0byBhIGdseXBoIGluZGV4LiAgVXNlIGFsbCBhdmFpbGFibGUgZW5jb2RpbmcKICogdGFibGVzIHRvIHRyeSBhbmQgZmluZCBvbmUgdGhhdCB3b3Jrcy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgZXhwZWN0ZWQKICogdG8gYmUgY2FjaGVkIGJ5IGhpZ2hlciBsZXZlbHMsIHNvIHBlcmZvcm1hbmNlIGlzbid0IGNyaXRpY2FsCiAqLwoKRlRfVUludApGY0ZyZWVUeXBlQ2hhckluZGV4IChGVF9GYWNlIGZhY2UsIEZjQ2hhcjMyIHVjczQpCnsKICAgIGludAkJICAgIGluaXRpYWwsIG9mZnNldCwgZGVjb2RlOwogICAgRlRfVUludAkgICAgZ2x5cGhpbmRleDsKICAgIEZjQ2hhcjMyCSAgICBjaGFyY29kZTsKCiAgICBpbml0aWFsID0gMDsKICAgIC8qCiAgICAgKiBGaW5kIHRoZSBjdXJyZW50IGVuY29kaW5nCiAgICAgKi8KICAgIGlmIChmYWNlLT5jaGFybWFwKQogICAgewoJZm9yICg7IGluaXRpYWwgPCBOVU1fREVDT0RFOyBpbml0aWFsKyspCgkgICAgaWYgKGZjRm9udERlY29kZXJzW2luaXRpYWxdLmVuY29kaW5nID09IGZhY2UtPmNoYXJtYXAtPmVuY29kaW5nKQoJCWJyZWFrOwoJaWYgKGluaXRpYWwgPT0gTlVNX0RFQ09ERSkKCSAgICBpbml0aWFsID0gMDsKICAgIH0KICAgIC8qCiAgICAgKiBDaGVjayBlYWNoIGVuY29kaW5nIGZvciB0aGUgZ2x5cGgsIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnQgb25lCiAgICAgKi8KICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgTlVNX0RFQ09ERTsgb2Zmc2V0KyspCiAgICB7CglkZWNvZGUgPSAoaW5pdGlhbCArIG9mZnNldCkgJSBOVU1fREVDT0RFOwoJaWYgKCFmYWNlLT5jaGFybWFwIHx8IGZhY2UtPmNoYXJtYXAtPmVuY29kaW5nICE9IGZjRm9udERlY29kZXJzW2RlY29kZV0uZW5jb2RpbmcpCgkgICAgaWYgKEZUX1NlbGVjdF9DaGFybWFwIChmYWNlLCBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLmVuY29kaW5nKSAhPSAwKQoJCWNvbnRpbnVlOwoJaWYgKGZjRm9udERlY29kZXJzW2RlY29kZV0ubWFwKQoJewoJICAgIGNoYXJjb2RlID0gRmNGcmVlVHlwZVVjczRUb1ByaXZhdGUgKHVjczQsIGZjRm9udERlY29kZXJzW2RlY29kZV0ubWFwKTsKCSAgICBpZiAoY2hhcmNvZGUgPT0gfjApCgkJY29udGludWU7Cgl9CgllbHNlCgkgICAgY2hhcmNvZGUgPSB1Y3M0OwoJZ2x5cGhpbmRleCA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCAoRlRfVUxvbmcpIGNoYXJjb2RlKTsKCWlmIChnbHlwaGluZGV4KQoJICAgIHJldHVybiBnbHlwaGluZGV4OwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNGcmVlVHlwZUNoZWNrR2x5cGggKEZUX0ZhY2UgZmFjZSwgRmNDaGFyMzIgdWNzNCwgCgkJICAgICAgRlRfVUludCBnbHlwaCwgRmNCbGFua3MgKmJsYW5rcykKewogICAgRlRfSW50CSAgICBsb2FkX2ZsYWdzID0gRlRfTE9BRF9OT19TQ0FMRSB8IEZUX0xPQURfTk9fSElOVElORzsKICAgIEZUX0dseXBoU2xvdCAgICBzbG90OwogICAgCiAgICAvKgogICAgICogV2hlbiB1c2luZyBzY2FsYWJsZSBmb250cywgb25seSByZXBvcnQgdGhvc2UgZ2x5cGhzCiAgICAgKiB3aGljaCBjYW4gYmUgc2NhbGVkOyBvdGhlcndpc2UgdGhvc2UgZm9udHMgd2lsbAogICAgICogb25seSBiZSBhdmFpbGFibGUgYXQgc29tZSBzaXplcywgYW5kIG5ldmVyIHdoZW4KICAgICAqIHRyYW5zZm9ybWVkLiAgQXZvaWQgdGhpcyBieSBzaW1wbHkgcmVwb3J0aW5nIGJpdG1hcC1vbmx5CiAgICAgKiBnbHlwaHMgYXMgbWlzc2luZwogICAgICovCiAgICBpZiAoZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkKCWxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19CSVRNQVA7CiAgICAKICAgIGlmIChGVF9Mb2FkX0dseXBoIChmYWNlLCBnbHlwaCwgbG9hZF9mbGFncykpCglyZXR1cm4gRmNGYWxzZTsKICAgIAogICAgc2xvdCA9IGZhY2UtPmdseXBoOwogICAgaWYgKCFnbHlwaCkKCXJldHVybiBGY0ZhbHNlOwogICAgCiAgICBzd2l0Y2ggKHNsb3QtPmZvcm1hdCkgewogICAgY2FzZSBmdF9nbHlwaF9mb3JtYXRfYml0bWFwOgoJLyoKCSAqIEJpdG1hcHMgYXJlIGFzc3VtZWQgdG8gYmUgcmVhc29uYWJsZTsgaWYKCSAqIHRoaXMgcHJvdmVzIHRvIGJlIGEgcmFzaCBhc3N1bXB0aW9uLCB0aGlzCgkgKiBjb2RlIGNhbiBiZSBlYXNpbHkgbW9kaWZpZWQKCSAqLwoJcmV0dXJuIEZjVHJ1ZTsKICAgIGNhc2UgZnRfZ2x5cGhfZm9ybWF0X291dGxpbmU6CgkvKgoJICogR2x5cGhzIHdpdGggY29udG91cnMgYXJlIGFsd2F5cyBPSwoJICovCglpZiAoc2xvdC0+b3V0bGluZS5uX2NvbnRvdXJzICE9IDApCgkgICAgcmV0dXJuIEZjVHJ1ZTsKCS8qCgkgKiBHbHlwaHMgd2l0aCBubyBjb250b3VycyBhcmUgb25seSBPSyBpZgoJICogdGhleSdyZSBtZW1iZXJzIG9mIHRoZSBCbGFua3Mgc2V0IHNwZWNpZmllZAoJICogaW4gdGhlIGNvbmZpZ3VyYXRpb24uICBJZiBibGFua3MgaXNuJ3Qgc2V0LAoJICogdGhlbiBhbGxvdyBhbnkgZ2x5cGggdG8gYmUgYmxhbmsKCSAqLwoJaWYgKCFibGFua3MgfHwgRmNCbGFua3NJc01lbWJlciAoYmxhbmtzLCB1Y3M0KSkKCSAgICByZXR1cm4gRmNUcnVlOwoJLyogZmFsbCB0aHJvdWdoIC4uLiAqLwogICAgZGVmYXVsdDoKCWJyZWFrOwogICAgfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCkZjQ2hhclNldCAqCkZjRnJlZVR5cGVDaGFyU2V0IChGVF9GYWNlIGZhY2UsIEZjQmxhbmtzICpibGFua3MpCnsKICAgIEZjQ2hhcjMyCSAgICBwYWdlLCBvZmYsIG1heCwgdWNzNDsKI2lmZGVmIENIRUNLCiAgICBGY0NoYXIzMgkgICAgZm9udF9tYXggPSAwOwojZW5kaWYKICAgIEZjQ2hhclNldAkgICAgKmZjczsKICAgIEZjQ2hhckxlYWYJICAgICpsZWFmOwogICAgY29uc3QgRmNDaGFyTWFwICptYXA7CiAgICBpbnQJCSAgICBvOwogICAgaW50CQkgICAgaTsKICAgIEZUX1VJbnQJICAgIGdseXBoOwoKICAgIGZjcyA9IEZjQ2hhclNldENyZWF0ZSAoKTsKICAgIGlmICghZmNzKQoJZ290byBiYWlsMDsKICAgIAogICAgZm9yIChvID0gMDsgbyA8IE5VTV9ERUNPREU7IG8rKykKICAgIHsKCWlmIChGVF9TZWxlY3RfQ2hhcm1hcCAoZmFjZSwgZmNGb250RGVjb2RlcnNbb10uZW5jb2RpbmcpICE9IDApCgkgICAgY29udGludWU7CgltYXAgPSBmY0ZvbnREZWNvZGVyc1tvXS5tYXA7CglpZiAobWFwKQoJewoJICAgIC8qCgkgICAgICogTm9uLVVuaWNvZGUgdGFibGVzIGFyZSBlYXN5OyB0aGVyZSdzIGEgbGlzdCBvZiBhbGwgcG9zc2libGUKCSAgICAgKiBjaGFyYWN0ZXJzCgkgICAgICovCgkgICAgZm9yIChpID0gMDsgaSA8IG1hcC0+bmVudDsgaSsrKQoJICAgIHsKCQl1Y3M0ID0gbWFwLT5lbnRbaV0uYm1wOwoJCWdseXBoID0gRlRfR2V0X0NoYXJfSW5kZXggKGZhY2UsIG1hcC0+ZW50W2ldLmVuY29kZSk7CgkJaWYgKGdseXBoICYmIEZjRnJlZVR5cGVDaGVja0dseXBoIChmYWNlLCB1Y3M0LCBnbHlwaCwgYmxhbmtzKSkKCQl7CgkJICAgIGxlYWYgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoZmNzLCB1Y3M0KTsKCQkgICAgaWYgKCFsZWFmKQoJCQlnb3RvIGJhaWwxOwoJCSAgICBsZWFmLT5tYXBbKHVjczQgJiAweGZmKSA+PiA1XSB8PSAoMSA8PCAodWNzNCAmIDB4MWYpKTsKI2lmZGVmIENIRUNLCgkJICAgIGlmICh1Y3M0ID4gZm9udF9tYXgpCgkJCWZvbnRfbWF4ID0gdWNzNDsKI2VuZGlmCgkJfQoJICAgIH0KCX0KCWVsc2UKCXsKCSAgICBGVF9VSW50IGdpbmRleDsKCSAgCgkgICAgbWF4ID0gZmNGb250RGVjb2RlcnNbb10ubWF4OwoJICAgIC8qCgkgICAgICogRmluZCB0aGUgZmlyc3QgZW5jb2RlZCBjaGFyYWN0ZXIgaW4gdGhlIGZvbnQKCSAgICAgKi8KCSAgICBpZiAoRlRfR2V0X0NoYXJfSW5kZXggKGZhY2UsIDApKQoJICAgIHsKCQl1Y3M0ID0gMDsKCQlnaW5kZXggPSAxOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCXVjczQgPSBGVF9HZXRfTmV4dF9DaGFyIChmYWNlLCAwLCAmZ2luZGV4KTsKCQlpZiAoIXVjczQpCgkJICAgIGdpbmRleCA9IDA7CgkgICAgfQoKCSAgICB3aGlsZSAoZ2luZGV4KQoJICAgIHsKCQlwYWdlID0gdWNzNCA+PiA4OwoJCWxlYWYgPSAwOwoJCXdoaWxlICgodWNzNCA+PiA4KSA9PSBwYWdlKQoJCXsKCQkgICAgZ2x5cGggPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgdWNzNCk7CgkJICAgIGlmIChnbHlwaCAmJiBGY0ZyZWVUeXBlQ2hlY2tHbHlwaCAoZmFjZSwgdWNzNCwgCgkJCQkJCSAgICAgICBnbHlwaCwgYmxhbmtzKSkKCQkgICAgewoJCQlpZiAoIWxlYWYpCgkJCXsKCQkJICAgIGxlYWYgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoZmNzLCB1Y3M0KTsKCQkJICAgIGlmICghbGVhZikKCQkJCWdvdG8gYmFpbDE7CgkJCX0KCQkJb2ZmID0gdWNzNCAmIDB4ZmY7CgkJCWxlYWYtPm1hcFtvZmYgPj4gNV0gfD0gKDEgPDwgKG9mZiAmIDB4MWYpKTsKI2lmZGVmIENIRUNLCgkJCWlmICh1Y3M0ID4gZm9udF9tYXgpCgkJCSAgICBmb250X21heCA9IHVjczQ7CiNlbmRpZgoJCSAgICB9CgkJICAgIHVjczQrKzsKCQl9CgkJdWNzNCA9IEZUX0dldF9OZXh0X0NoYXIgKGZhY2UsIHVjczQgLSAxLCAmZ2luZGV4KTsKCQlpZiAoIXVjczQpCgkJICAgIGdpbmRleCA9IDA7CgkgICAgfQojaWZkZWYgQ0hFQ0sKCSAgICBmb3IgKHVjczQgPSAwOyB1Y3M0IDwgMHgxMDAwMDsgdWNzNCsrKQoJICAgIHsKCQlGY0Jvb2wJICAgIEZUX0hhcywgRkNfSGFzOwoKCQlGVF9IYXMgPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgdWNzNCkgIT0gMDsKCQlGQ19IYXMgPSBGY0NoYXJTZXRIYXNDaGFyIChmY3MsIHVjczQpOwoJCWlmIChGVF9IYXMgIT0gRkNfSGFzKQoJCXsKCQkgICAgcHJpbnRmICgiMHglMDh4IEZUIHNheXMgJWQgRkMgc2F5cyAlZFxuIiwgdWNzNCwgRlRfSGFzLCBGQ19IYXMpOwoJCX0KCSAgICB9CiNlbmRpZgoJfQogICAgfQojaWZkZWYgQ0hFQ0sKICAgIHByaW50ZiAoIiVkIGdseXBocyAlZCBlbmNvZGVkXG4iLCAoaW50KSBmYWNlLT5udW1fZ2x5cGhzLCBGY0NoYXJTZXRDb3VudCAoZmNzKSk7CiAgICBmb3IgKHVjczQgPSAwOyB1Y3M0IDw9IGZvbnRfbWF4OyB1Y3M0KyspCiAgICB7CglGY0Jvb2wJaGFzX2NoYXIgPSBGY0ZyZWVUeXBlQ2hhckluZGV4IChmYWNlLCB1Y3M0KSAhPSAwOwoJRmNCb29sCWhhc19iaXQgPSBGY0NoYXJTZXRIYXNDaGFyIChmY3MsIHVjczQpOwoKCWlmIChoYXNfY2hhciAmJiAhaGFzX2JpdCkKCSAgICBwcmludGYgKCJCaXRtYXAgbWlzc2luZyBjaGFyIDB4JXhcbiIsIHVjczQpOwoJZWxzZSBpZiAoIWhhc19jaGFyICYmIGhhc19iaXQpCgkgICAgcHJpbnRmICgiQml0bWFwIGV4dHJhIGNoYXIgMHgleFxuIiwgdWNzNCk7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIGZjczsKYmFpbDE6CiAgICBGY0NoYXJTZXREZXN0cm95IChmY3MpOwpiYWlsMDoKICAgIHJldHVybiAwOwp9Cgo=