LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAiZmNpbnQuaCIKCi8qICNkZWZpbmUgQ0hFQ0sgKi8KCnN0YXRpYyBpbnQKRmNDaGFyU2V0TGV2ZWxzIChGY0NoYXIzMiB1Y3M0KQp7CiAgICBpZiAodWNzNCA8PSAweGZmKQoJcmV0dXJuIDE7CiAgICBpZiAodWNzNCA8PSAweGZmZmYpCglyZXR1cm4gMjsKICAgIGlmICh1Y3M0IDw9IDB4ZmZmZmZmKQoJcmV0dXJuIDM7CiAgICByZXR1cm4gNDsKfQoKc3RhdGljIEZjQm9vbApGY0NoYXJTZXRDaGVja0xldmVsIChGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCkKewogICAgaW50CWxldmVsID0gRmNDaGFyU2V0TGV2ZWxzICh1Y3M0KTsKICAgIAogICAgaWYgKGxldmVsIDw9IGZjcy0+bGV2ZWxzKQoJcmV0dXJuIEZjVHJ1ZTsKICAgIHdoaWxlIChmY3MtPmxldmVscyA8IGxldmVsKQogICAgewoJaWYgKGZjcy0+bGV2ZWxzID09IDApCgl7CgkgICAgRmNDaGFyTGVhZgkgICAgKmxlYWY7CgoJICAgIGxlYWYgPSAoRmNDaGFyTGVhZiAqKSBjYWxsb2MgKDEsIHNpemVvZiAoRmNDaGFyTGVhZikpOwoJICAgIGlmICghbGVhZikKCQlyZXR1cm4gRmNGYWxzZTsKCSAgICBGY01lbUFsbG9jIChGQ19NRU1fQ0hBUk5PREUsIHNpemVvZiAoRmNDaGFyTGVhZikpOwoJICAgIGZjcy0+bm9kZS5sZWFmID0gbGVhZjsKCX0KCWVsc2UKCXsKCSAgICBGY0NoYXJCcmFuY2ggICAgKmJyYW5jaDsKICAgIAoJICAgIGJyYW5jaCA9IChGY0NoYXJCcmFuY2ggKikgY2FsbG9jICgxLCBzaXplb2YgKEZjQ2hhckJyYW5jaCkpOwoJICAgIGlmICghYnJhbmNoKQoJCXJldHVybiBGY0ZhbHNlOwoJICAgIEZjTWVtQWxsb2MgKEZDX01FTV9DSEFSTk9ERSwgc2l6ZW9mIChGY0NoYXJCcmFuY2gpKTsKCSAgICBicmFuY2gtPm5vZGVzWzBdID0gZmNzLT5ub2RlOwoJICAgIGZjcy0+bm9kZS5icmFuY2ggPSBicmFuY2g7Cgl9CgkrK2Zjcy0+bGV2ZWxzOwogICAgfQogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0Q3JlYXRlICh2b2lkKQp7CiAgICBGY0NoYXJTZXQJKmZjczsKCiAgICBmY3MgPSAoRmNDaGFyU2V0ICopIG1hbGxvYyAoc2l6ZW9mIChGY0NoYXJTZXQpKTsKICAgIGlmICghZmNzKQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fQ0hBUlNFVCwgc2l6ZW9mIChGY0NoYXJTZXQpKTsKICAgIGZjcy0+cmVmID0gMTsKICAgIGZjcy0+bGV2ZWxzID0gMDsKICAgIGZjcy0+bm9kZS5sZWFmID0gMDsKICAgIGZjcy0+Y29uc3RhbnQgPSBGY0ZhbHNlOwogICAgcmV0dXJuIGZjczsKfQoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0TmV3ICh2b2lkKTsKICAgIApGY0NoYXJTZXQgKgpGY0NoYXJTZXROZXcgKHZvaWQpCnsKICAgIHJldHVybiBGY0NoYXJTZXRDcmVhdGUgKCk7Cn0KCnN0YXRpYyB2b2lkCkZjQ2hhck5vZGVEZXN0cm95IChGY0NoYXJOb2RlIG5vZGUsIGludCBsZXZlbCkKewogICAgaW50CWk7CgogICAgc3dpdGNoIChsZXZlbCkgewogICAgY2FzZSAwOgoJYnJlYWs7CiAgICBjYXNlIDE6CglGY01lbUZyZWUgKEZDX01FTV9DSEFSTk9ERSwgc2l6ZW9mIChGY0NoYXJMZWFmKSk7CglmcmVlIChub2RlLmxlYWYpOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoJICAgIGlmIChub2RlLmJyYW5jaC0+bm9kZXNbaV0uYnJhbmNoKQoJCUZjQ2hhck5vZGVEZXN0cm95IChub2RlLmJyYW5jaC0+bm9kZXNbaV0sIGxldmVsIC0gMSk7CiAgICAgICAgRmNNZW1GcmVlIChGQ19NRU1fQ0hBUk5PREUsIHNpemVvZiAoRmNDaGFyQnJhbmNoKSk7CglmcmVlIChub2RlLmJyYW5jaCk7CiAgICB9Cn0KCnZvaWQKRmNDaGFyU2V0RGVzdHJveSAoRmNDaGFyU2V0ICpmY3MpCnsKICAgIGlmIChmY3MtPmNvbnN0YW50KQoJcmV0dXJuOwogICAgaWYgKC0tZmNzLT5yZWYgPD0gMCkKICAgIHsKCUZjQ2hhck5vZGVEZXN0cm95IChmY3MtPm5vZGUsIGZjcy0+bGV2ZWxzKTsKCUZjTWVtRnJlZSAoRkNfTUVNX0NIQVJTRVQsIHNpemVvZiAoRmNDaGFyU2V0KSk7CglmcmVlIChmY3MpOwogICAgfQp9CgovKgogKiBMb2NhdGUgdGhlIGxlYWYgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGNoYXIsIHJldHVybmluZwogKiBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QKICovCgpzdGF0aWMgRmNDaGFyTGVhZiAqCkZjQ2hhclNldEZpbmRMZWFmIChjb25zdCBGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCkKewogICAgaW50CQkJbDsKICAgIGNvbnN0IEZjQ2hhck5vZGUJKnByZXY7CiAgICBGY0NoYXJOb2RlCQlub2RlOwogICAgRmNDaGFyOAkJaTsKCiAgICBwcmV2ID0gJmZjcy0+bm9kZTsKICAgIGwgPSBmY3MtPmxldmVsczsKICAgIHdoaWxlICgtLWwgPiAwKQogICAgewoJbm9kZSA9ICpwcmV2OwoJaWYgKCFub2RlLmJyYW5jaCkKCSAgICByZXR1cm4gMDsKCWkgPSAodWNzNCA+PiAobCA8PCAzKSkgJiAweGZmOwoJcHJldiA9ICZub2RlLmJyYW5jaC0+bm9kZXNbaV07CiAgICB9CiAgICByZXR1cm4gcHJldi0+bGVhZjsKfQoKLyoKICogTG9jYXRlIHRoZSBsZWFmIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBjaGFyLCBjcmVhdGluZyBpdAogKiBpZiBkZXNpcmVkCiAqLwoKc3RhdGljIEZjQ2hhckxlYWYgKgpGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoRmNDaGFyU2V0ICpmY3MsIEZjQ2hhcjMyIHVjczQpCnsKICAgIGludAkJbDsKICAgIEZjQ2hhck5vZGUgICpwcmV2LCBub2RlOwogICAgRmNDaGFyOAlpOwoKICAgIGlmICghRmNDaGFyU2V0Q2hlY2tMZXZlbCAoZmNzLCB1Y3M0KSkKCXJldHVybiBGY0ZhbHNlOwogICAgcHJldiA9ICZmY3MtPm5vZGU7CiAgICBsID0gZmNzLT5sZXZlbHM7CiAgICB3aGlsZSAoLS1sID4gMCkKICAgIHsKCW5vZGUgPSAqcHJldjsKCWlmICghbm9kZS5icmFuY2gpCgl7CgkgICAgbm9kZS5icmFuY2ggPSBjYWxsb2MgKDEsIHNpemVvZiAoRmNDaGFyQnJhbmNoKSk7CgkgICAgaWYgKCFub2RlLmJyYW5jaCkKCQlyZXR1cm4gMDsKCSAgICBGY01lbUFsbG9jIChGQ19NRU1fQ0hBUk5PREUsIHNpemVvZiAoRmNDaGFyQnJhbmNoKSk7CgkgICAgKnByZXYgPSBub2RlOwoJfQoJaSA9ICh1Y3M0ID4+IChsIDw8IDMpKSAmIDB4ZmY7CglwcmV2ID0gJm5vZGUuYnJhbmNoLT5ub2Rlc1tpXTsKICAgIH0KICAgIG5vZGUgPSAqcHJldjsKICAgIGlmICghbm9kZS5sZWFmKQogICAgewoJbm9kZS5sZWFmID0gY2FsbG9jICgxLCBzaXplb2YgKEZjQ2hhckxlYWYpKTsKCWlmICghbm9kZS5sZWFmKQoJICAgIHJldHVybiAwOwoJRmNNZW1BbGxvYyAoRkNfTUVNX0NIQVJOT0RFLCBzaXplb2YgKEZjQ2hhckxlYWYpKTsKCSpwcmV2ID0gbm9kZTsKICAgIH0KICAgIHJldHVybiBub2RlLmxlYWY7Cn0KCkZjQm9vbApGY0NoYXJTZXRBZGRDaGFyIChGY0NoYXJTZXQgKmZjcywgRmNDaGFyMzIgdWNzNCkKewogICAgRmNDaGFyTGVhZgkqbGVhZjsKICAgIEZjQ2hhcjMyCSpiOwogICAgCiAgICBpZiAoZmNzLT5jb25zdGFudCkKCXJldHVybiBGY0ZhbHNlOwogICAgbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOwogICAgaWYgKCFsZWFmKQoJcmV0dXJuIEZjRmFsc2U7CiAgICBiID0gJmxlYWYtPm1hcFsodWNzNCAmIDB4ZmYpID4+IDVdOwogICAgKmIgfD0gKDEgPDwgKHVjczQgJiAweDFmKSk7CiAgICByZXR1cm4gRmNUcnVlOwp9CgovKgogKiBBbiBpdGVyYXRvciBmb3IgdGhlIGxlYXZlcyBvZiBhIGNoYXJzZXQKICovCgp0eXBlZGVmIHN0cnVjdCBfZmNDaGFyU2V0SXRlciB7CiAgICBGY0NoYXJMZWFmCSAgICAqbGVhZjsKICAgIEZjQ2hhcjMyCSAgICB1Y3M0Owp9IEZjQ2hhclNldEl0ZXI7CgovKgogKiBGaW5kIHRoZSBuZWFyZXN0IGxlYWYgYXQgb3IgYmV5b25kICp1Y3M0LCByZXR1cm4gMCBpZiBubyBsZWFmCiAqIGV4aXN0cwogKi8Kc3RhdGljIEZjQ2hhckxlYWYgKgpGY0NoYXJTZXRJdGVyTGVhZiAoRmNDaGFyTm9kZSBub2RlLCBpbnQgbGV2ZWwsIEZjQ2hhcjMyICp1Y3M0KQp7CiAgICBpZiAobGV2ZWwgPD0gMSkKICAgICAgICByZXR1cm4gbm9kZS5sZWFmOwogICAgZWxzZSBpZiAoIW5vZGUuYnJhbmNoKQoJcmV0dXJuIDA7CiAgICBlbHNlCiAgICB7CglpbnQJICAgIHNoaWZ0ID0gKChsZXZlbCAtIDEpIDw8IDMpOwoJRmNDaGFyMzIgICAgaW5jID0gMSA8PCBzaGlmdDsKCUZjQ2hhcjMyICAgIG1hc2sgPSB+KGluYyAtIDEpOwoJRmNDaGFyOAkgICAgYnl0ZSA9ICgqdWNzNCA+PiBzaGlmdCkgJiAweGZmOwoJRmNDaGFyTGVhZiAgKmxlYWY7CgoJZm9yICg7OykKCXsKCSAgICBsZWFmID0gRmNDaGFyU2V0SXRlckxlYWYgKG5vZGUuYnJhbmNoLT5ub2Rlc1tieXRlXSwgCgkJCQkgICAgICBsZXZlbCAtIDEsIAoJCQkJICAgICAgdWNzNCk7CgkgICAgaWYgKGxlYWYpCgkJYnJlYWs7CgkgICAgLyogc3RlcCB0byBuZXh0IGJyYW5jaCwgcmVzZXR0aW5nIGxvd2VyIGluZGljZXMgKi8KCSAgICAqdWNzNCA9ICgqdWNzNCAmIG1hc2spICsgaW5jOwoJICAgIGJ5dGUrKzsKCSAgICBpZiAoYnl0ZSA9PSAwKQoJCWJyZWFrOwoJfQoJcmV0dXJuIGxlYWY7CiAgICB9Cn0KCnN0YXRpYyB2b2lkCkZjQ2hhclNldEl0ZXJTZXQgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXJTZXRJdGVyICppdGVyKQp7CiAgICBpZiAoRmNDaGFyU2V0TGV2ZWxzIChpdGVyLT51Y3M0KSA+IGZjcy0+bGV2ZWxzKQoJaXRlci0+bGVhZiA9IDA7CiAgICBlbHNlCglpdGVyLT5sZWFmID0gRmNDaGFyU2V0SXRlckxlYWYgKGZjcy0+bm9kZSwgZmNzLT5sZXZlbHMsCgkJCQkJJml0ZXItPnVjczQpOwogICAgaWYgKCFpdGVyLT5sZWFmKQoJaXRlci0+dWNzNCA9IH4wOwp9CgpzdGF0aWMgdm9pZApGY0NoYXJTZXRJdGVyTmV4dCAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhclNldEl0ZXIgKml0ZXIpCnsKICAgIGl0ZXItPnVjczQgKz0gMHgxMDA7CiAgICBGY0NoYXJTZXRJdGVyU2V0IChmY3MsIGl0ZXIpOwp9CgpzdGF0aWMgdm9pZApGY0NoYXJTZXRJdGVyU3RhcnQgKGNvbnN0IEZjQ2hhclNldCAqZmNzLCBGY0NoYXJTZXRJdGVyICppdGVyKQp7CiAgICBpdGVyLT51Y3M0ID0gMDsKICAgIEZjQ2hhclNldEl0ZXJTZXQgKGZjcywgaXRlcik7Cn0KCkZjQ2hhclNldCAqCkZjQ2hhclNldENvcHkgKEZjQ2hhclNldCAqc3JjKQp7CiAgICBzcmMtPnJlZisrOwogICAgcmV0dXJuIHNyYzsKfQoKRmNCb29sCkZjQ2hhclNldEVxdWFsIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKewogICAgRmNDaGFyU2V0SXRlciAgIGFpLCBiaTsKICAgIGludAkJICAgIGk7CiAgICAKICAgIGlmIChhID09IGIpCglyZXR1cm4gRmNUcnVlOwogICAgZm9yIChGY0NoYXJTZXRJdGVyU3RhcnQgKGEsICZhaSksIEZjQ2hhclNldEl0ZXJTdGFydCAoYiwgJmJpKTsKCSBhaS5sZWFmICYmIGJpLmxlYWY7CgkgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSksIEZjQ2hhclNldEl0ZXJOZXh0IChiLCAmYmkpKQogICAgewoJaWYgKGFpLnVjczQgIT0gYmkudWNzNCkKCSAgICByZXR1cm4gRmNGYWxzZTsKCWZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCSAgICBpZiAoYWkubGVhZi0+bWFwW2ldICE9IGJpLmxlYWYtPm1hcFtpXSkKCQlyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldHVybiBhaS5sZWFmID09IGJpLmxlYWY7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDaGFyU2V0QWRkTGVhZiAoRmNDaGFyU2V0CSpmY3MsCgkJICBGY0NoYXIzMgl1Y3M0LAoJCSAgRmNDaGFyTGVhZgkqbGVhZikKewogICAgRmNDaGFyTGVhZiAgICpuZXcgPSBGY0NoYXJTZXRGaW5kTGVhZkNyZWF0ZSAoZmNzLCB1Y3M0KTsKICAgIGlmICghbmV3KQoJcmV0dXJuIEZjRmFsc2U7CiAgICAqbmV3ID0gKmxlYWY7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNDaGFyU2V0ICoKRmNDaGFyU2V0T3BlcmF0ZSAoY29uc3QgRmNDaGFyU2V0ICAgKmEsCgkJICBjb25zdCBGY0NoYXJTZXQgICAqYiwKCQkgIEZjQm9vbAkgICAgKCpvdmVybGFwKSAoRmNDaGFyTGVhZgkgICAgKnJlc3VsdCwKCQkJCQkJY29uc3QgRmNDaGFyTGVhZiAgICAqYWwsCgkJCQkJCWNvbnN0IEZjQ2hhckxlYWYgICAgKmJsKSwKCQkgIEZjQm9vbAlhb25seSwKCQkgIEZjQm9vbAlib25seSkKewogICAgRmNDaGFyU2V0CSAgICAqZmNzOwogICAgRmNDaGFyU2V0SXRlciAgIGFpLCBiaTsKCiAgICBmY3MgPSBGY0NoYXJTZXRDcmVhdGUgKCk7CiAgICBpZiAoIWZjcykKCWdvdG8gYmFpbDA7CiAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGEsICZhaSk7CiAgICBGY0NoYXJTZXRJdGVyU3RhcnQgKGIsICZiaSk7CiAgICB3aGlsZSAoKGFpLmxlYWYgfHwgYm9ubHkpICYmIChiaS5sZWFmIHx8IGFvbmx5KSkKICAgIHsKCWlmIChhaS51Y3M0IDwgYmkudWNzNCkKCXsKCSAgICBpZiAoYW9ubHkpCgkgICAgewoJCWlmICghRmNDaGFyU2V0QWRkTGVhZiAoZmNzLCBhaS51Y3M0LCBhaS5sZWFmKSkKCQkgICAgZ290byBiYWlsMTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQlhaS51Y3M0ID0gYmkudWNzNDsKCQlGY0NoYXJTZXRJdGVyU2V0IChhLCAmYWkpOwoJICAgIH0KCX0KCWVsc2UgaWYgKGJpLnVjczQgPCBhaS51Y3M0ICkKCXsKCSAgICBpZiAoYm9ubHkpCgkgICAgewoJCWlmICghRmNDaGFyU2V0QWRkTGVhZiAoZmNzLCBiaS51Y3M0LCBiaS5sZWFmKSkKCQkgICAgZ290byBiYWlsMTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoYiwgJmJpKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQliaS51Y3M0ID0gYWkudWNzNDsKCQlGY0NoYXJTZXRJdGVyU2V0IChiLCAmYmkpOwoJICAgIH0KCX0KCWVsc2UKCXsKCSAgICBGY0NoYXJMZWFmICBsZWFmOwoKCSAgICBpZiAoKCpvdmVybGFwKSAoJmxlYWYsIGFpLmxlYWYsIGJpLmxlYWYpKQoJICAgIHsKCQlpZiAoIUZjQ2hhclNldEFkZExlYWYgKGZjcywgYWkudWNzNCwgJmxlYWYpKQoJCSAgICBnb3RvIGJhaWwxOwoJICAgIH0KCSAgICBGY0NoYXJTZXRJdGVyTmV4dCAoYSwgJmFpKTsKCSAgICBGY0NoYXJTZXRJdGVyTmV4dCAoYiwgJmJpKTsKCX0KICAgIH0KICAgIHJldHVybiBmY3M7CmJhaWwxOgogICAgRmNDaGFyU2V0RGVzdHJveSAoZmNzKTsKYmFpbDA6CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIEZjQm9vbApGY0NoYXJTZXRJbnRlcnNlY3RMZWFmIChGY0NoYXJMZWFmICpyZXN1bHQsCgkJCWNvbnN0IEZjQ2hhckxlYWYgKmFsLAoJCQljb25zdCBGY0NoYXJMZWFmICpibCkKewogICAgaW50CSAgICBpOwogICAgRmNCb29sICBub25lbXB0eSA9IEZjRmFsc2U7CgogICAgZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJaWYgKChyZXN1bHQtPm1hcFtpXSA9IGFsLT5tYXBbaV0gJiBibC0+bWFwW2ldKSkKCSAgICBub25lbXB0eSA9IEZjVHJ1ZTsKICAgIHJldHVybiBub25lbXB0eTsKfQoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0SW50ZXJzZWN0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKewogICAgcmV0dXJuIEZjQ2hhclNldE9wZXJhdGUgKGEsIGIsIEZjQ2hhclNldEludGVyc2VjdExlYWYsIEZjRmFsc2UsIEZjRmFsc2UpOwp9CgpzdGF0aWMgRmNCb29sCkZjQ2hhclNldFVuaW9uTGVhZiAoRmNDaGFyTGVhZiAqcmVzdWx0LAoJCSAgICBjb25zdCBGY0NoYXJMZWFmICphbCwKCQkgICAgY29uc3QgRmNDaGFyTGVhZiAqYmwpCnsKICAgIGludAlpOwoKICAgIGZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCXJlc3VsdC0+bWFwW2ldID0gYWwtPm1hcFtpXSB8IGJsLT5tYXBbaV07CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0NoYXJTZXQgKgpGY0NoYXJTZXRVbmlvbiAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpCnsKICAgIHJldHVybiBGY0NoYXJTZXRPcGVyYXRlIChhLCBiLCBGY0NoYXJTZXRVbmlvbkxlYWYsIEZjVHJ1ZSwgRmNUcnVlKTsKfQoKc3RhdGljIEZjQm9vbApGY0NoYXJTZXRTdWJ0cmFjdExlYWYgKEZjQ2hhckxlYWYgKnJlc3VsdCwKCQkgICAgICAgY29uc3QgRmNDaGFyTGVhZiAqYWwsCgkJICAgICAgIGNvbnN0IEZjQ2hhckxlYWYgKmJsKQp7CiAgICBpbnQJICAgIGk7CiAgICBGY0Jvb2wgIG5vbmVtcHR5ID0gRmNGYWxzZTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgMjU2LzMyOyBpKyspCglpZiAoKHJlc3VsdC0+bWFwW2ldID0gYWwtPm1hcFtpXSAmIH5ibC0+bWFwW2ldKSkKCSAgICBub25lbXB0eSA9IEZjVHJ1ZTsKICAgIHJldHVybiBub25lbXB0eTsKfQoKRmNDaGFyU2V0ICoKRmNDaGFyU2V0U3VidHJhY3QgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQp7CiAgICByZXR1cm4gRmNDaGFyU2V0T3BlcmF0ZSAoYSwgYiwgRmNDaGFyU2V0U3VidHJhY3RMZWFmLCBGY1RydWUsIEZjRmFsc2UpOwp9CgpGY0Jvb2wKRmNDaGFyU2V0SGFzQ2hhciAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhcjMyIHVjczQpCnsKICAgIEZjQ2hhckxlYWYJKmxlYWYgPSBGY0NoYXJTZXRGaW5kTGVhZiAoZmNzLCB1Y3M0KTsKICAgIGlmICghbGVhZikKCXJldHVybiBGY0ZhbHNlOwogICAgcmV0dXJuIChsZWFmLT5tYXBbKHVjczQgJiAweGZmKSA+PiA1XSAmICgxIDw8ICh1Y3M0ICYgMHgxZikpKSAhPSAwOwp9CgpzdGF0aWMgRmNDaGFyMzIKRmNDaGFyU2V0UG9wQ291bnQgKEZjQ2hhcjMyIGMxKQp7CiAgICAvKiBoYWNrbWVtIDE2OSAqLwogICAgRmNDaGFyMzIJYzIgPSAoYzEgPj4gMSkgJiAwMzMzMzMzMzMzMzM7CiAgICBjMiA9IGMxIC0gYzIgLSAoKGMyID4+IDEpICYgMDMzMzMzMzMzMzMzKTsKICAgIHJldHVybiAoKChjMiArIChjMiA+PiAzKSkgJiAwMzA3MDcwNzA3MDcpICUgMDc3KTsKfQoKRmNDaGFyMzIKRmNDaGFyU2V0SW50ZXJzZWN0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQp7CiAgICBGY0NoYXJTZXRJdGVyICAgYWksIGJpOwogICAgRmNDaGFyMzIJICAgIGNvdW50ID0gMDsKICAgIAogICAgRmNDaGFyU2V0SXRlclN0YXJ0IChhLCAmYWkpOwogICAgRmNDaGFyU2V0SXRlclN0YXJ0IChiLCAmYmkpOwogICAgd2hpbGUgKGFpLmxlYWYgJiYgYmkubGVhZikKICAgIHsKCWlmIChhaS51Y3M0ID09IGJpLnVjczQpCgl7CgkgICAgRmNDaGFyMzIJKmFtID0gYWkubGVhZi0+bWFwOwoJICAgIEZjQ2hhcjMyCSpibSA9IGJpLmxlYWYtPm1hcDsKCSAgICBpbnQJCWkgPSAyNTYvMzI7CgkgICAgd2hpbGUgKGktLSkKCQljb3VudCArPSBGY0NoYXJTZXRQb3BDb3VudCAoKmFtKysgJiAqYm0rKyk7CgkgICAgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSk7Cgl9IAoJZWxzZSBpZiAoYWkudWNzNCA8IGJpLnVjczQpCgl7CgkgICAgYWkudWNzNCA9IGJpLnVjczQ7CgkgICAgRmNDaGFyU2V0SXRlclNldCAoYSwgJmFpKTsKCX0KCWlmIChiaS51Y3M0IDwgYWkudWNzNCkKCXsKCSAgICBiaS51Y3M0ID0gYWkudWNzNDsKCSAgICBGY0NoYXJTZXRJdGVyU2V0IChiLCAmYmkpOwoJfQogICAgfQogICAgcmV0dXJuIGNvdW50Owp9CgpGY0NoYXIzMgpGY0NoYXJTZXRDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphKQp7CiAgICBGY0NoYXJTZXRJdGVyICAgYWk7CiAgICBGY0NoYXIzMgkgICAgY291bnQgPSAwOwogICAgCiAgICBmb3IgKEZjQ2hhclNldEl0ZXJTdGFydCAoYSwgJmFpKTsgYWkubGVhZjsgRmNDaGFyU2V0SXRlck5leHQgKGEsICZhaSkpCiAgICB7CglpbnQJCSAgICBpID0gMjU2LzMyOwoJRmNDaGFyMzIJICAgICphbSA9IGFpLmxlYWYtPm1hcDsKCgl3aGlsZSAoaS0tKQoJICAgIGNvdW50ICs9IEZjQ2hhclNldFBvcENvdW50ICgqYW0rKyk7CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KCkZjQ2hhcjMyCkZjQ2hhclNldFN1YnRyYWN0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQp7CiAgICBGY0NoYXJTZXRJdGVyICAgYWksIGJpOwogICAgRmNDaGFyMzIJICAgIGNvdW50ID0gMDsKICAgIAogICAgRmNDaGFyU2V0SXRlclN0YXJ0IChhLCAmYWkpOwogICAgRmNDaGFyU2V0SXRlclN0YXJ0IChiLCAmYmkpOwogICAgd2hpbGUgKGFpLmxlYWYpCiAgICB7CglpZiAoYWkudWNzNCA8PSBiaS51Y3M0KQoJewoJICAgIEZjQ2hhcjMyCSphbSA9IGFpLmxlYWYtPm1hcDsKCSAgICBpbnQJCWkgPSAyNTYvMzI7CgkgICAgaWYgKGFpLnVjczQgPT0gYmkudWNzNCkKCSAgICB7CgkJRmNDaGFyMzIJKmJtID0gYmkubGVhZi0+bWFwOzsKCQl3aGlsZSAoaS0tKQoJCSAgICBjb3VudCArPSBGY0NoYXJTZXRQb3BDb3VudCAoKmFtKysgJiB+KmJtKyspOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCXdoaWxlIChpLS0pCgkJICAgIGNvdW50ICs9IEZjQ2hhclNldFBvcENvdW50ICgqYW0rKyk7CgkgICAgfQoJICAgIEZjQ2hhclNldEl0ZXJOZXh0IChhLCAmYWkpOwoJfQoJZWxzZSBpZiAoYmkubGVhZikKCXsKCSAgICBiaS51Y3M0ID0gYWkudWNzNDsKCSAgICBGY0NoYXJTZXRJdGVyU2V0IChiLCAmYmkpOwoJfQogICAgfQogICAgcmV0dXJuIGNvdW50Owp9CgovKgogKiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBjaGFyc2V0cy4KICogCiAqIEVhY2ggbGVhZiBpcyByZXByZXNlbnRlZCBhcyA5IDMyLWJpdCB2YWx1ZXMsIHRoZSBjb2RlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZm9sbG93ZWQKICogYnkgOCAzMiBiaXQgdmFsdWVzIGZvciB0aGUgbGVhZiBpdHNlbGYuICBFYWNoIHZhbHVlIGlzIGVuY29kZWQgYXMgNSBBU0NJSSBjaGFyYWN0ZXJzLAogKiBvbmx5IDg1IGRpZmZlcmVudCB2YWx1ZXMgYXJlIHVzZWQgdG8gYXZvaWQgY29udHJvbCBjaGFyYWN0ZXJzIGFzIHdlbGwgYXMgdGhlIG90aGVyCiAqIGNoYXJhY3RlcnMgdXNlZCB0byBlbmNvZGUgZm9udCBuYW1lcy4gIDg1Kio1ID4gMl4zMiBzbyB0aGluZ3Mgd29yayBvdXQsIGJ1dAogKiBpdCdzIG5vdCBleGFjdGx5IGh1bWFuIHJlYWRhYmxlIG91dHB1dC4gIEFzIGEgc3BlY2lhbCBjYXNlLCAwIGlzIGVuY29kZWQgYXMgYSBzcGFjZQogKi8KCnN0YXRpYyBGY0NoYXI4CWNoYXJUb1ZhbHVlWzI1Nl0gPSB7CiAgICAvKiAgICAgIiIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogICAiXGIiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMDIwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDAzMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogICAgIiAiICovIDB4ZmYsICAweDAwLCAgMHhmZiwgIDB4MDEsICAweDAyLCAgMHgwMywgIDB4MDQsICAweGZmLCAKICAgIC8qICAgICIoIiAqLyAweDA1LCAgMHgwNiwgIDB4MDcsICAweDA4LCAgMHhmZiwgIDB4ZmYsICAweDA5LCAgMHgwYSwgCiAgICAvKiAgICAiMCIgKi8gMHgwYiwgIDB4MGMsICAweDBkLCAgMHgwZSwgIDB4MGYsICAweDEwLCAgMHgxMSwgIDB4MTIsIAogICAgLyogICAgIjgiICovIDB4MTMsICAweDE0LCAgMHhmZiwgIDB4MTUsICAweDE2LCAgMHhmZiwgIDB4MTcsICAweDE4LCAKICAgIC8qICAgICJAIiAqLyAweDE5LCAgMHgxYSwgIDB4MWIsICAweDFjLCAgMHgxZCwgIDB4MWUsICAweDFmLCAgMHgyMCwgCiAgICAvKiAgICAiSCIgKi8gMHgyMSwgIDB4MjIsICAweDIzLCAgMHgyNCwgIDB4MjUsICAweDI2LCAgMHgyNywgIDB4MjgsIAogICAgLyogICAgIlAiICovIDB4MjksICAweDJhLCAgMHgyYiwgIDB4MmMsICAweDJkLCAgMHgyZSwgIDB4MmYsICAweDMwLCAKICAgIC8qICAgICJYIiAqLyAweDMxLCAgMHgzMiwgIDB4MzMsICAweDM0LCAgMHhmZiwgIDB4MzUsICAweDM2LCAgMHhmZiwgCiAgICAvKiAgICAiYCIgKi8gMHhmZiwgIDB4MzcsICAweDM4LCAgMHgzOSwgIDB4M2EsICAweDNiLCAgMHgzYywgIDB4M2QsIAogICAgLyogICAgImgiICovIDB4M2UsICAweDNmLCAgMHg0MCwgIDB4NDEsICAweDQyLCAgMHg0MywgIDB4NDQsICAweDQ1LCAKICAgIC8qICAgICJwIiAqLyAweDQ2LCAgMHg0NywgIDB4NDgsICAweDQ5LCAgMHg0YSwgIDB4NGIsICAweDRjLCAgMHg0ZCwgCiAgICAvKiAgICAieCIgKi8gMHg0ZSwgIDB4NGYsICAweDUwLCAgMHg1MSwgIDB4NTIsICAweDUzLCAgMHg1NCwgIDB4ZmYsIAogICAgLyogIlwyMDAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjEwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDIyMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyMzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjQwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDI1MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwyNjAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMjcwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDMwMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzMTAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzIwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDMzMCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzNDAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKICAgIC8qICJcMzUwIiAqLyAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgCiAgICAvKiAiXDM2MCIgKi8gMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsIAogICAgLyogIlwzNzAiICovIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAgMHhmZiwgIDB4ZmYsICAweGZmLCAKfTsKCnN0YXRpYyBGY0NoYXI4IHZhbHVlVG9DaGFyWzB4NTVdID0gewogICAgLyogMHgwMCAqLyAnIScsICcjJywgJyQnLCAnJScsICcmJywgJygnLCAnKScsICcqJywKICAgIC8qIDB4MDggKi8gJysnLCAnLicsICcvJywgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsCiAgICAvKiAweDEwICovICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnOycsICc8JywgJz4nLAogICAgLyogMHgxOCAqLyAnPycsICdAJywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywKICAgIC8qIDB4MjAgKi8gJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsCiAgICAvKiAweDI4ICovICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLAogICAgLyogMHgzMCAqLyAnVycsICdYJywgJ1knLCAnWicsICdbJywgJ10nLCAnXicsICdhJywKICAgIC8qIDB4MzggKi8gJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsCiAgICAvKiAweDQwICovICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLAogICAgLyogMHg0OCAqLyAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywKICAgIC8qIDB4NTAgKi8gJ3onLCAneycsICd8JywgJ30nLCAnficsCn07CgpzdGF0aWMgRmNDaGFyOCAqCkZjQ2hhclNldFBhcnNlVmFsdWUgKEZjQ2hhcjggKnN0cmluZywgRmNDaGFyMzIgKnZhbHVlKQp7CiAgICBpbnQJCWk7CiAgICBGY0NoYXIzMgl2OwogICAgRmNDaGFyOAljOwogICAgCiAgICBpZiAoKnN0cmluZyA9PSAnICcpCiAgICB7Cgl2ID0gMDsKCXN0cmluZysrOwogICAgfQogICAgZWxzZQogICAgewoJdiA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQoJewoJICAgIGlmICghKGMgPSAqc3RyaW5nKyspKQoJCXJldHVybiAwOwoJICAgIGMgPSBjaGFyVG9WYWx1ZVtjXTsKCSAgICBpZiAoYyA9PSAweGZmKQoJCXJldHVybiAwOwoJICAgIHYgPSB2ICogODUgKyBjOwoJfQogICAgfQogICAgKnZhbHVlID0gdjsKICAgIHJldHVybiBzdHJpbmc7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNDaGFyU2V0VW5wYXJzZVZhbHVlIChGY05hbWVCdWYgKmJ1ZiwgRmNDaGFyMzIgdmFsdWUpCnsKICAgIGludAkgICAgaTsKICAgIGlmICh2YWx1ZSA9PSAwKQogICAgewoJcmV0dXJuIEZjTmFtZUJ1ZkNoYXIgKGJ1ZiwgJyAnKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCUZjQ2hhcjgJc3RyaW5nWzZdOwoJRmNDaGFyOAkqcyA9IHN0cmluZyArIDU7CglzdHJpbmdbNV0gPSAnXDAnOwoJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKCXsKCSAgICAqLS1zID0gdmFsdWVUb0NoYXJbdmFsdWUgJSA4NV07CgkgICAgdmFsdWUgLz0gODU7Cgl9Cglmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQoJICAgIGlmICghRmNOYW1lQnVmQ2hhciAoYnVmLCAqcysrKSkKCQlyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQ2hhclNldCAqCkZjTmFtZVBhcnNlQ2hhclNldCAoRmNDaGFyOCAqc3RyaW5nKQp7CiAgICBGY0NoYXJTZXQJKmM7CiAgICBGY0NoYXIzMgl1Y3M0OwogICAgRmNDaGFyTGVhZgkqbGVhZjsKICAgIGludAkJaTsKCiAgICBjID0gRmNDaGFyU2V0Q3JlYXRlICgpOwogICAgaWYgKCFjKQoJZ290byBiYWlsMDsKICAgIHdoaWxlICgqc3RyaW5nKQogICAgewoJc3RyaW5nID0gRmNDaGFyU2V0UGFyc2VWYWx1ZSAoc3RyaW5nLCAmdWNzNCk7CglpZiAoIXN0cmluZykKCSAgICBnb3RvIGJhaWwxOwoJbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChjLCB1Y3M0KTsKCWlmICghbGVhZikKCSAgICBnb3RvIGJhaWwxOwoJZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJewoJICAgIHN0cmluZyA9IEZjQ2hhclNldFBhcnNlVmFsdWUgKHN0cmluZywgJmxlYWYtPm1hcFtpXSk7CgkgICAgaWYgKCFzdHJpbmcpCgkJZ290byBiYWlsMTsKCX0KICAgIH0KICAgIHJldHVybiBjOwpiYWlsMToKICAgIEZjQ2hhclNldERlc3Ryb3kgKGMpOwpiYWlsMDoKICAgIHJldHVybiAwOwp9CgpGY0Jvb2wKRmNOYW1lVW5wYXJzZUNoYXJTZXQgKEZjTmFtZUJ1ZiAqYnVmLCBjb25zdCBGY0NoYXJTZXQgKmMpCnsKICAgIEZjQ2hhclNldEl0ZXIgICBjaTsKICAgIGludAkJICAgIGk7CiNpZmRlZiBDSEVDSwogICAgaW50CQkgICAgbGVuID0gYnVmLT5sZW47CiNlbmRpZgoKICAgIGZvciAoRmNDaGFyU2V0SXRlclN0YXJ0IChjLCAmY2kpOwoJIGNpLmxlYWY7CgkgRmNDaGFyU2V0SXRlck5leHQgKGMsICZjaSkpCiAgICB7CglpZiAoIUZjQ2hhclNldFVucGFyc2VWYWx1ZSAoYnVmLCBjaS51Y3M0KSkKCSAgICByZXR1cm4gRmNGYWxzZTsKCWZvciAoaSA9IDA7IGkgPCAyNTYvMzI7IGkrKykKCSAgICBpZiAoIUZjQ2hhclNldFVucGFyc2VWYWx1ZSAoYnVmLCBjaS5sZWFmLT5tYXBbaV0pKQoJCXJldHVybiBGY0ZhbHNlOwogICAgfQojaWZkZWYgQ0hFQ0sKICAgIHsKCUZjQ2hhclNldAkqY2hlY2s7CglGY0NoYXIzMgltaXNzaW5nOwoJRmNDaGFyU2V0SXRlcgljaSwgY2hlY2tpOwoJCgkvKiBudWxsIHRlcm1pbmF0ZSBmb3IgcGFyc2VyICovCglGY05hbWVCdWZDaGFyIChidWYsICdcMCcpOwoJLyogc3RlcCBiYWNrIG92ZXIgbnVsbCBmb3IgbGlmZSBhZnRlciB0ZXN0ICovCglidWYtPmxlbi0tOwoJY2hlY2sgPSBGY05hbWVQYXJzZUNoYXJTZXQgKGJ1Zi0+YnVmICsgbGVuKTsKCUZjQ2hhclNldEl0ZXJTdGFydCAoYywgJmNpKTsKCUZjQ2hhclNldEl0ZXJTdGFydCAoY2hlY2ssICZjaGVja2kpOwoJd2hpbGUgKGNpLmxlYWYgfHwgY2hlY2tpLmxlYWYpCgl7CgkgICAgaWYgKGNpLnVjczQgPCBjaGVja2kudWNzNCkKCSAgICB7CgkJcHJpbnRmICgiTWlzc2luZyBsZWFmIG5vZGUgYXQgMHgleFxuIiwgY2kudWNzNCk7CgkJRmNDaGFyU2V0SXRlck5leHQgKGMsICZjaSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKGNoZWNraS51Y3M0IDwgY2kudWNzNCkKCSAgICB7CgkJcHJpbnRmICgiRXh0cmEgbGVhZiBub2RlIGF0IDB4JXhcbiIsIGNoZWNraS51Y3M0KTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoY2hlY2ssICZjaGVja2kpOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWludAkgICAgaSA9IDI1Ni8zMjsKCQlGY0NoYXIzMiAgICAqY20gPSBjaS5sZWFmLT5tYXA7CgkJRmNDaGFyMzIgICAgKmNoZWNrbSA9IGNoZWNraS5sZWFmLT5tYXA7CgoJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gMzIpCgkJewoJCSAgICBpZiAoKmNtICE9ICpjaGVja20pCgkJCXByaW50ZiAoIk1pc21hdGNoaW5nIHNldHMgYXQgMHglMDh4OiAweCUwOHggIT0gMHglMDh4XG4iLAoJCQkJY2kudWNzNCArIGksICpjbSwgKmNoZWNrbSk7CgkJICAgIGNtKys7CgkJICAgIGNoZWNrbSsrOwoJCX0KCQlGY0NoYXJTZXRJdGVyTmV4dCAoYywgJmNpKTsKCQlGY0NoYXJTZXRJdGVyTmV4dCAoY2hlY2ssICZjaGVja2kpOwoJICAgIH0KCX0KCWlmICgobWlzc2luZyA9IEZjQ2hhclNldFN1YnRyYWN0Q291bnQgKGMsIGNoZWNrKSkpCgkgICAgcHJpbnRmICgiJWQgbWlzc2luZyBpbiByZXBhcnNlZCByZXN1bHRcbiIsIG1pc3NpbmcpOwoJaWYgKChtaXNzaW5nID0gRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoY2hlY2ssIGMpKSkKCSAgICBwcmludGYgKCIlZCBleHRyYSBpbiByZXBhcnNlZCByZXN1bHRcbiIsIG1pc3NpbmcpOwoJRmNDaGFyU2V0RGVzdHJveSAoY2hlY2spOwogICAgfQojZW5kaWYKICAgIAogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CiNpbmNsdWRlIDxmb250Y29uZmlnL2ZjZnJlZXR5cGUuaD4KCi8qCiAqIEZpZ3VyZSBvdXQgd2hldGhlciB0aGUgYXZhaWxhYmxlIGZyZWV0eXBlIGhhcyBGVF9HZXRfTmV4dF9DaGFyCiAqLwoKI2lmIEZSRUVUWVBFX01BSk9SID4gMgojIGRlZmluZSBIQVNfTkVYVF9DSEFSCiNlbHNlCiMgaWYgRlJFRVRZUEVfTUFKT1IgPT0gMgojICBpZiBGUkVFVFlQRV9NSU5PUiA+IDAKIyAgIGRlZmluZSBIQVNfTkVYVF9DSEFSCiMgIGVsc2UKIyAgIGlmIEZSRUVUWVBFX01JTk9SID09IDAKIyAgICBpZiBGUkVFVFlQRV9QQVRDSCA+PSA4CiMgICAgIGRlZmluZSBIQVNfTkVYVF9DSEFSCiMgICAgZW5kaWYKIyAgIGVuZGlmCiMgIGVuZGlmCiMgZW5kaWYKI2VuZGlmCgovKgogKiBGb3Igb3VyIHB1cnBvc2VzLCB0aGlzIGFwcHJveGltYXRpb24gaXMgc3VmZmljaWVudAogKi8KI2lmbmRlZiBIQVNfTkVYVF9DSEFSCiNkZWZpbmUgRlRfR2V0X05leHRfQ2hhcihmYWNlLCB1Y3M0KSAoKHVjczQpID49IDB4ZmZmZmZmID8gMCA6ICh1Y3M0KSArIDEpCiN3YXJuaW5nICJObyBGVF9HZXRfTmV4dF9DaGFyIgojZW5kaWYKCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJFbnQgewogICAgRmNDaGFyMTYJYm1wOwogICAgRmNDaGFyOAllbmNvZGU7Cn0gRmNDaGFyRW50OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjQ2hhck1hcCB7CiAgICBjb25zdCBGY0NoYXJFbnQgKmVudDsKICAgIGludAkJICAgIG5lbnQ7Cn0gRmNDaGFyTWFwOwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjRm9udERlY29kZSB7CiAgICBGVF9FbmNvZGluZwkgICAgZW5jb2Rpbmc7CiAgICBjb25zdCBGY0NoYXJNYXAgKm1hcDsKICAgIEZjQ2hhcjMyCSAgICBtYXg7Cn0gRmNGb250RGVjb2RlOwoKc3RhdGljIGNvbnN0IEZjQ2hhck1hcCBBcHBsZVJvbWFuOwpzdGF0aWMgY29uc3QgRmNDaGFyTWFwIEFkb2JlU3ltYm9sOwogICAgCnN0YXRpYyBjb25zdCBGY0ZvbnREZWNvZGUgZmNGb250RGVjb2RlcnNbXSA9IHsKICAgIHsgZnRfZW5jb2RpbmdfdW5pY29kZSwJMCwJCSgxIDw8IDIxKSAtIDEgfSwKICAgIHsgZnRfZW5jb2Rpbmdfc3ltYm9sLAkmQWRvYmVTeW1ib2wsCSgxIDw8IDE2KSAtIDEgfSwKICAgIHsgZnRfZW5jb2RpbmdfYXBwbGVfcm9tYW4sCSZBcHBsZVJvbWFuLAkoMSA8PCAxNikgLSAxIH0sCn07CgojZGVmaW5lIE5VTV9ERUNPREUgIChzaXplb2YgKGZjRm9udERlY29kZXJzKSAvIHNpemVvZiAoZmNGb250RGVjb2RlcnNbMF0pKQoKc3RhdGljIEZUX1VMb25nCkZjRnJlZVR5cGVNYXBDaGFyIChGY0NoYXIzMiB1Y3M0LCBjb25zdCBGY0NoYXJNYXAgKm1hcCkKewogICAgaW50CQlsb3csIGhpZ2gsIG1pZDsKICAgIEZjQ2hhcjE2CWJtcDsKCiAgICBsb3cgPSAwOwogICAgaGlnaCA9IG1hcC0+bmVudCAtIDE7CiAgICBpZiAodWNzNCA8IG1hcC0+ZW50W2xvd10uYm1wIHx8IG1hcC0+ZW50W2hpZ2hdLmJtcCA8IHVjczQpCglyZXR1cm4gfjA7CiAgICB3aGlsZSAoaGlnaCAtIGxvdyA+IDEpCiAgICB7CgltaWQgPSAoaGlnaCArIGxvdykgPj4gMTsKCWJtcCA9IG1hcC0+ZW50W21pZF0uYm1wOwoJaWYgKHVjczQgPT0gYm1wKQoJICAgIHJldHVybiAoRlRfVUxvbmcpIG1hcC0+ZW50W21pZF0uZW5jb2RlOwoJaWYgKHVjczQgPCBibXApCgkgICAgaGlnaCA9IG1pZDsKCWVsc2UKCSAgICBsb3cgPSBtaWQ7CiAgICB9CiAgICBmb3IgKG1pZCA9IGxvdzsgbWlkIDw9IGhpZ2g7IG1pZCsrKQogICAgewoJaWYgKHVjczQgPT0gbWFwLT5lbnRbbWlkXS5ibXApCgkgICAgcmV0dXJuIChGVF9VTG9uZykgbWFwLT5lbnRbbWlkXS5lbmNvZGU7CiAgICB9CiAgICByZXR1cm4gfjA7Cn0KCi8qCiAqIE1hcCBhIFVDUzQgZ2x5cGggdG8gYSBnbHlwaCBpbmRleC4gIFVzZSBhbGwgYXZhaWxhYmxlIGVuY29kaW5nCiAqIHRhYmxlcyB0byB0cnkgYW5kIGZpbmQgb25lIHRoYXQgd29ya3MuICBUaGlzIGluZm9ybWF0aW9uIGlzIGV4cGVjdGVkCiAqIHRvIGJlIGNhY2hlZCBieSBoaWdoZXIgbGV2ZWxzLCBzbyBwZXJmb3JtYW5jZSBpc24ndCBjcml0aWNhbAogKi8KCkZUX1VJbnQKRmNGcmVlVHlwZUNoYXJJbmRleCAoRlRfRmFjZSBmYWNlLCBGY0NoYXIzMiB1Y3M0KQp7CiAgICBpbnQJCSAgICBpbml0aWFsLCBvZmZzZXQsIGRlY29kZTsKICAgIEZUX1VJbnQJICAgIGdseXBoaW5kZXg7CiAgICBGVF9VTG9uZwkgICAgY2hhcmNvZGU7CgogICAgaW5pdGlhbCA9IDA7CiAgICAvKgogICAgICogRmluZCB0aGUgY3VycmVudCBlbmNvZGluZwogICAgICovCiAgICBpZiAoZmFjZS0+Y2hhcm1hcCkKICAgIHsKCWZvciAoOyBpbml0aWFsIDwgTlVNX0RFQ09ERTsgaW5pdGlhbCsrKQoJICAgIGlmIChmY0ZvbnREZWNvZGVyc1tpbml0aWFsXS5lbmNvZGluZyA9PSBmYWNlLT5jaGFybWFwLT5lbmNvZGluZykKCQlicmVhazsKCWlmIChpbml0aWFsID09IE5VTV9ERUNPREUpCgkgICAgaW5pdGlhbCA9IDA7CiAgICB9CiAgICAvKgogICAgICogQ2hlY2sgZWFjaCBlbmNvZGluZyBmb3IgdGhlIGdseXBoLCBzdGFydGluZyB3aXRoIHRoZSBjdXJyZW50IG9uZQogICAgICovCiAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IE5VTV9ERUNPREU7IG9mZnNldCsrKQogICAgewoJZGVjb2RlID0gKGluaXRpYWwgKyBvZmZzZXQpICUgTlVNX0RFQ09ERTsKCWlmICghZmFjZS0+Y2hhcm1hcCB8fCBmYWNlLT5jaGFybWFwLT5lbmNvZGluZyAhPSBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLmVuY29kaW5nKQoJICAgIGlmIChGVF9TZWxlY3RfQ2hhcm1hcCAoZmFjZSwgZmNGb250RGVjb2RlcnNbZGVjb2RlXS5lbmNvZGluZykgIT0gMCkKCQljb250aW51ZTsKCWlmIChmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLm1hcCkKCXsKCSAgICBjaGFyY29kZSA9IEZjRnJlZVR5cGVNYXBDaGFyICh1Y3M0LCBmY0ZvbnREZWNvZGVyc1tkZWNvZGVdLm1hcCk7CgkgICAgaWYgKGNoYXJjb2RlID09IH4wKQoJCWNvbnRpbnVlOwoJfQoJZWxzZQoJICAgIGNoYXJjb2RlID0gKEZUX1VMb25nKSB1Y3M0OwoJZ2x5cGhpbmRleCA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCBjaGFyY29kZSk7CglpZiAoZ2x5cGhpbmRleCkKCSAgICByZXR1cm4gZ2x5cGhpbmRleDsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdGF0aWMgRmNCb29sCkZjRnJlZVR5cGVDaGVja0dseXBoIChGVF9GYWNlIGZhY2UsIEZjQ2hhcjMyIHVjczQsIAoJCSAgICAgIEZUX1VJbnQgZ2x5cGgsIEZjQmxhbmtzICpibGFua3MpCnsKICAgIEZUX0ludAkgICAgbG9hZF9mbGFncyA9IEZUX0xPQURfTk9fU0NBTEUgfCBGVF9MT0FEX05PX0hJTlRJTkc7CiAgICBGVF9HbHlwaFNsb3QgICAgc2xvdDsKICAgIAogICAgLyoKICAgICAqIFdoZW4gdXNpbmcgc2NhbGFibGUgZm9udHMsIG9ubHkgcmVwb3J0IHRob3NlIGdseXBocwogICAgICogd2hpY2ggY2FuIGJlIHNjYWxlZDsgb3RoZXJ3aXNlIHRob3NlIGZvbnRzIHdpbGwKICAgICAqIG9ubHkgYmUgYXZhaWxhYmxlIGF0IHNvbWUgc2l6ZXMsIGFuZCBuZXZlciB3aGVuCiAgICAgKiB0cmFuc2Zvcm1lZC4gIEF2b2lkIHRoaXMgYnkgc2ltcGx5IHJlcG9ydGluZyBiaXRtYXAtb25seQogICAgICogZ2x5cGhzIGFzIG1pc3NpbmcKICAgICAqLwogICAgaWYgKGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUpCglsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fQklUTUFQOwogICAgCiAgICBpZiAoRlRfTG9hZF9HbHlwaCAoZmFjZSwgZ2x5cGgsIGxvYWRfZmxhZ3MpKQoJcmV0dXJuIEZjRmFsc2U7CiAgICAKICAgIHNsb3QgPSBmYWNlLT5nbHlwaDsKICAgIGlmICghZ2x5cGgpCglyZXR1cm4gRmNGYWxzZTsKICAgIAogICAgc3dpdGNoIChzbG90LT5mb3JtYXQpIHsKICAgIGNhc2UgZnRfZ2x5cGhfZm9ybWF0X2JpdG1hcDoKCS8qCgkgKiBCaXRtYXBzIGFyZSBhc3N1bWVkIHRvIGJlIHJlYXNvbmFibGU7IGlmCgkgKiB0aGlzIHByb3ZlcyB0byBiZSBhIHJhc2ggYXNzdW1wdGlvbiwgdGhpcwoJICogY29kZSBjYW4gYmUgZWFzaWx5IG1vZGlmaWVkCgkgKi8KCXJldHVybiBGY1RydWU7CiAgICBjYXNlIGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lOgoJLyoKCSAqIEdseXBocyB3aXRoIGNvbnRvdXJzIGFyZSBhbHdheXMgT0sKCSAqLwoJaWYgKHNsb3QtPm91dGxpbmUubl9jb250b3VycyAhPSAwKQoJICAgIHJldHVybiBGY1RydWU7CgkvKgoJICogR2x5cGhzIHdpdGggbm8gY29udG91cnMgYXJlIG9ubHkgT0sgaWYKCSAqIHRoZXkncmUgbWVtYmVycyBvZiB0aGUgQmxhbmtzIHNldCBzcGVjaWZpZWQKCSAqIGluIHRoZSBjb25maWd1cmF0aW9uLiAgSWYgYmxhbmtzIGlzbid0IHNldCwKCSAqIHRoZW4gYWxsb3cgYW55IGdseXBoIHRvIGJlIGJsYW5rCgkgKi8KCWlmICghYmxhbmtzIHx8IEZjQmxhbmtzSXNNZW1iZXIgKGJsYW5rcywgdWNzNCkpCgkgICAgcmV0dXJuIEZjVHJ1ZTsKCS8qIGZhbGwgdGhyb3VnaCAuLi4gKi8KICAgIGRlZmF1bHQ6CiAgICB9CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKRmNDaGFyU2V0ICoKRmNGcmVlVHlwZUNoYXJTZXQgKEZUX0ZhY2UgZmFjZSwgRmNCbGFua3MgKmJsYW5rcykKewogICAgRmNDaGFyMzIJICAgIHBhZ2UsIG9mZiwgbWF4LCB1Y3M0OwojaWZkZWYgQ0hFQ0sKICAgIEZjQ2hhcjMyCSAgICBmb250X21heCA9IDA7CiNlbmRpZgogICAgRmNDaGFyU2V0CSAgICAqZmNzOwogICAgRmNDaGFyTGVhZgkgICAgKmxlYWY7CiAgICBjb25zdCBGY0NoYXJNYXAgKm1hcDsKICAgIGludAkJICAgIG87CiAgICBpbnQJCSAgICBpOwogICAgRlRfVUludAkgICAgZ2x5cGg7CgogICAgZmNzID0gRmNDaGFyU2V0Q3JlYXRlICgpOwogICAgaWYgKCFmY3MpCglnb3RvIGJhaWwwOwogICAgCiAgICBmb3IgKG8gPSAwOyBvIDwgTlVNX0RFQ09ERTsgbysrKQogICAgewoJaWYgKEZUX1NlbGVjdF9DaGFybWFwIChmYWNlLCBmY0ZvbnREZWNvZGVyc1tvXS5lbmNvZGluZykgIT0gMCkKCSAgICBjb250aW51ZTsKCW1hcCA9IGZjRm9udERlY29kZXJzW29dLm1hcDsKCWlmIChtYXApCgl7CgkgICAgLyoKCSAgICAgKiBOb24tVW5pY29kZSB0YWJsZXMgYXJlIGVhc3k7IHRoZXJlJ3MgYSBsaXN0IG9mIGFsbCBwb3NzaWJsZQoJICAgICAqIGNoYXJhY3RlcnMKCSAgICAgKi8KCSAgICBmb3IgKGkgPSAwOyBpIDwgbWFwLT5uZW50OyBpKyspCgkgICAgewoJCXVjczQgPSBtYXAtPmVudFtpXS5ibXA7CgkJZ2x5cGggPSBGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgbWFwLT5lbnRbaV0uZW5jb2RlKTsKCQlpZiAoZ2x5cGggJiYgRmNGcmVlVHlwZUNoZWNrR2x5cGggKGZhY2UsIHVjczQsIGdseXBoLCBibGFua3MpKQoJCXsKCQkgICAgbGVhZiA9IEZjQ2hhclNldEZpbmRMZWFmQ3JlYXRlIChmY3MsIHVjczQpOwoJCSAgICBpZiAoIWxlYWYpCgkJCWdvdG8gYmFpbDE7CgkJICAgIGxlYWYtPm1hcFsodWNzNCAmIDB4ZmYpID4+IDVdIHw9ICgxIDw8ICh1Y3M0ICYgMHgxZikpOwojaWZkZWYgQ0hFQ0sKCQkgICAgaWYgKHVjczQgPiBmb250X21heCkKCQkJZm9udF9tYXggPSB1Y3M0OwojZW5kaWYKCQl9CgkgICAgfQoJfQoJZWxzZQoJewoJICAgIG1heCA9IGZjRm9udERlY29kZXJzW29dLm1heDsKCSAgCgkgICAgLyoKCSAgICAgKiBGaW5kIHRoZSBmaXJzdCBlbmNvZGVkIGNoYXJhY3RlciBpbiB0aGUgZm9udAoJICAgICAqLwoJICAgIHVjczQgPSAwOwoJICAgIGlmIChGVF9HZXRfQ2hhcl9JbmRleCAoZmFjZSwgMCkpCgkJdWNzNCA9IDA7CgkgICAgZWxzZQoJCXVjczQgPSBGVF9HZXRfTmV4dF9DaGFyIChmYWNlLCAwKTsKCgkgICAgZm9yICg7OykKCSAgICB7CgkJcGFnZSA9IHVjczQgPj4gODsKCQlsZWFmID0gMDsKCQl3aGlsZSAoKHVjczQgPj4gOCkgPT0gcGFnZSkKCQl7CgkJICAgIGdseXBoID0gRlRfR2V0X0NoYXJfSW5kZXggKGZhY2UsIHVjczQpOwoJCSAgICBpZiAoZ2x5cGggJiYgRmNGcmVlVHlwZUNoZWNrR2x5cGggKGZhY2UsIHVjczQsIAoJCQkJCQkgICAgICAgZ2x5cGgsIGJsYW5rcykpCgkJICAgIHsKCQkJaWYgKCFsZWFmKQoJCQl7CgkJCSAgICBsZWFmID0gRmNDaGFyU2V0RmluZExlYWZDcmVhdGUgKGZjcywgdWNzNCk7CgkJCSAgICBpZiAoIWxlYWYpCgkJCQlnb3RvIGJhaWwxOwoJCQl9CgkJCW9mZiA9IHVjczQgJiAweGZmOwoJCQlsZWFmLT5tYXBbb2ZmID4+IDVdIHw9ICgxIDw8IChvZmYgJiAweDFmKSk7CiNpZmRlZiBDSEVDSwoJCQlpZiAodWNzNCA+IGZvbnRfbWF4KQoJCQkgICAgZm9udF9tYXggPSB1Y3M0OwojZW5kaWYKCQkgICAgfQoJCSAgICB1Y3M0Kys7CgkJfQoJCXVjczQgPSBGVF9HZXRfTmV4dF9DaGFyIChmYWNlLCB1Y3M0IC0gMSk7CgkJaWYgKCF1Y3M0KQoJCSAgICBicmVhazsKCSAgICB9CiNpZmRlZiBDSEVDSwoJICAgIGZvciAodWNzNCA9IDA7IHVjczQgPCAweDEwMDAwOyB1Y3M0KyspCgkgICAgewoJCUZjQm9vbAkgICAgRlRfSGFzLCBGQ19IYXM7CgoJCUZUX0hhcyA9IEZUX0dldF9DaGFyX0luZGV4IChmYWNlLCB1Y3M0KSAhPSAwOwoJCUZDX0hhcyA9IEZjQ2hhclNldEhhc0NoYXIgKGZjcywgdWNzNCk7CgkJaWYgKEZUX0hhcyAhPSBGQ19IYXMpCgkJewoJCSAgICBwcmludGYgKCIweCUwOHggRlQgc2F5cyAlZCBGQyBzYXlzICVkXG4iLCB1Y3M0LCBGVF9IYXMsIEZDX0hhcyk7CgkJfQoJICAgIH0KI2VuZGlmCgl9CiAgICB9CiNpZmRlZiBDSEVDSwogICAgcHJpbnRmICgiJWQgZ2x5cGhzICVkIGVuY29kZWRcbiIsIChpbnQpIGZhY2UtPm51bV9nbHlwaHMsIEZjQ2hhclNldENvdW50IChmY3MpKTsKICAgIGZvciAodWNzNCA9IDA7IHVjczQgPD0gZm9udF9tYXg7IHVjczQrKykKICAgIHsKCUZjQm9vbAloYXNfY2hhciA9IEZjRnJlZVR5cGVDaGFySW5kZXggKGZhY2UsIHVjczQpICE9IDA7CglGY0Jvb2wJaGFzX2JpdCA9IEZjQ2hhclNldEhhc0NoYXIgKGZjcywgdWNzNCk7CgoJaWYgKGhhc19jaGFyICYmICFoYXNfYml0KQoJICAgIHByaW50ZiAoIkJpdG1hcCBtaXNzaW5nIGNoYXIgMHgleFxuIiwgdWNzNCk7CgllbHNlIGlmICghaGFzX2NoYXIgJiYgaGFzX2JpdCkKCSAgICBwcmludGYgKCJCaXRtYXAgZXh0cmEgY2hhciAweCV4XG4iLCB1Y3M0KTsKICAgIH0KI2VuZGlmCiAgICByZXR1cm4gZmNzOwpiYWlsMToKICAgIEZjQ2hhclNldERlc3Ryb3kgKGZjcyk7CmJhaWwwOgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBGY0NoYXJFbnQgQXBwbGVSb21hbkVudFtdID0gewogICAgeyAweDAwMjAsIDB4MjAgfSwgLyogU1BBQ0UgKi8KICAgIHsgMHgwMDIxLCAweDIxIH0sIC8qIEVYQ0xBTUFUSU9OIE1BUksgKi8KICAgIHsgMHgwMDIyLCAweDIyIH0sIC8qIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MDAyMywgMHgyMyB9LCAvKiBOVU1CRVIgU0lHTiAqLwogICAgeyAweDAwMjQsIDB4MjQgfSwgLyogRE9MTEFSIFNJR04gKi8KICAgIHsgMHgwMDI1LCAweDI1IH0sIC8qIFBFUkNFTlQgU0lHTiAqLwogICAgeyAweDAwMjYsIDB4MjYgfSwgLyogQU1QRVJTQU5EICovCiAgICB7IDB4MDAyNywgMHgyNyB9LCAvKiBBUE9TVFJPUEhFICovCiAgICB7IDB4MDAyOCwgMHgyOCB9LCAvKiBMRUZUIFBBUkVOVEhFU0lTICovCiAgICB7IDB4MDAyOSwgMHgyOSB9LCAvKiBSSUdIVCBQQVJFTlRIRVNJUyAqLwogICAgeyAweDAwMkEsIDB4MkEgfSwgLyogQVNURVJJU0sgKi8KICAgIHsgMHgwMDJCLCAweDJCIH0sIC8qIFBMVVMgU0lHTiAqLwogICAgeyAweDAwMkMsIDB4MkMgfSwgLyogQ09NTUEgKi8KICAgIHsgMHgwMDJELCAweDJEIH0sIC8qIEhZUEhFTi1NSU5VUyAqLwogICAgeyAweDAwMkUsIDB4MkUgfSwgLyogRlVMTCBTVE9QICovCiAgICB7IDB4MDAyRiwgMHgyRiB9LCAvKiBTT0xJRFVTICovCiAgICB7IDB4MDAzMCwgMHgzMCB9LCAvKiBESUdJVCBaRVJPICovCiAgICB7IDB4MDAzMSwgMHgzMSB9LCAvKiBESUdJVCBPTkUgKi8KICAgIHsgMHgwMDMyLCAweDMyIH0sIC8qIERJR0lUIFRXTyAqLwogICAgeyAweDAwMzMsIDB4MzMgfSwgLyogRElHSVQgVEhSRUUgKi8KICAgIHsgMHgwMDM0LCAweDM0IH0sIC8qIERJR0lUIEZPVVIgKi8KICAgIHsgMHgwMDM1LCAweDM1IH0sIC8qIERJR0lUIEZJVkUgKi8KICAgIHsgMHgwMDM2LCAweDM2IH0sIC8qIERJR0lUIFNJWCAqLwogICAgeyAweDAwMzcsIDB4MzcgfSwgLyogRElHSVQgU0VWRU4gKi8KICAgIHsgMHgwMDM4LCAweDM4IH0sIC8qIERJR0lUIEVJR0hUICovCiAgICB7IDB4MDAzOSwgMHgzOSB9LCAvKiBESUdJVCBOSU5FICovCiAgICB7IDB4MDAzQSwgMHgzQSB9LCAvKiBDT0xPTiAqLwogICAgeyAweDAwM0IsIDB4M0IgfSwgLyogU0VNSUNPTE9OICovCiAgICB7IDB4MDAzQywgMHgzQyB9LCAvKiBMRVNTLVRIQU4gU0lHTiAqLwogICAgeyAweDAwM0QsIDB4M0QgfSwgLyogRVFVQUxTIFNJR04gKi8KICAgIHsgMHgwMDNFLCAweDNFIH0sIC8qIEdSRUFURVItVEhBTiBTSUdOICovCiAgICB7IDB4MDAzRiwgMHgzRiB9LCAvKiBRVUVTVElPTiBNQVJLICovCiAgICB7IDB4MDA0MCwgMHg0MCB9LCAvKiBDT01NRVJDSUFMIEFUICovCiAgICB7IDB4MDA0MSwgMHg0MSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBICovCiAgICB7IDB4MDA0MiwgMHg0MiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCICovCiAgICB7IDB4MDA0MywgMHg0MyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDICovCiAgICB7IDB4MDA0NCwgMHg0NCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEICovCiAgICB7IDB4MDA0NSwgMHg0NSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFICovCiAgICB7IDB4MDA0NiwgMHg0NiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGICovCiAgICB7IDB4MDA0NywgMHg0NyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHICovCiAgICB7IDB4MDA0OCwgMHg0OCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBIICovCiAgICB7IDB4MDA0OSwgMHg0OSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJICovCiAgICB7IDB4MDA0QSwgMHg0QSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKICovCiAgICB7IDB4MDA0QiwgMHg0QiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLICovCiAgICB7IDB4MDA0QywgMHg0QyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMICovCiAgICB7IDB4MDA0RCwgMHg0RCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNICovCiAgICB7IDB4MDA0RSwgMHg0RSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOICovCiAgICB7IDB4MDA0RiwgMHg0RiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPICovCiAgICB7IDB4MDA1MCwgMHg1MCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQICovCiAgICB7IDB4MDA1MSwgMHg1MSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRICovCiAgICB7IDB4MDA1MiwgMHg1MiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSICovCiAgICB7IDB4MDA1MywgMHg1MyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTICovCiAgICB7IDB4MDA1NCwgMHg1NCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUICovCiAgICB7IDB4MDA1NSwgMHg1NSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVICovCiAgICB7IDB4MDA1NiwgMHg1NiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWICovCiAgICB7IDB4MDA1NywgMHg1NyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXICovCiAgICB7IDB4MDA1OCwgMHg1OCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYICovCiAgICB7IDB4MDA1OSwgMHg1OSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZICovCiAgICB7IDB4MDA1QSwgMHg1QSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaICovCiAgICB7IDB4MDA1QiwgMHg1QiB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUICovCiAgICB7IDB4MDA1QywgMHg1QyB9LCAvKiBSRVZFUlNFIFNPTElEVVMgKi8KICAgIHsgMHgwMDVELCAweDVEIH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUICovCiAgICB7IDB4MDA1RSwgMHg1RSB9LCAvKiBDSVJDVU1GTEVYIEFDQ0VOVCAqLwogICAgeyAweDAwNUYsIDB4NUYgfSwgLyogTE9XIExJTkUgKi8KICAgIHsgMHgwMDYwLCAweDYwIH0sIC8qIEdSQVZFIEFDQ0VOVCAqLwogICAgeyAweDAwNjEsIDB4NjEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgKi8KICAgIHsgMHgwMDYyLCAweDYyIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBCICovCiAgICB7IDB4MDA2MywgMHg2MyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQyAqLwogICAgeyAweDAwNjQsIDB4NjQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEQgKi8KICAgIHsgMHgwMDY1LCAweDY1IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFICovCiAgICB7IDB4MDA2NiwgMHg2NiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgRiAqLwogICAgeyAweDAwNjcsIDB4NjcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEcgKi8KICAgIHsgMHgwMDY4LCAweDY4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBIICovCiAgICB7IDB4MDA2OSwgMHg2OSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgSSAqLwogICAgeyAweDAwNkEsIDB4NkEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEogKi8KICAgIHsgMHgwMDZCLCAweDZCIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBLICovCiAgICB7IDB4MDA2QywgMHg2QyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTCAqLwogICAgeyAweDAwNkQsIDB4NkQgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE0gKi8KICAgIHsgMHgwMDZFLCAweDZFIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBOICovCiAgICB7IDB4MDA2RiwgMHg2RiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgTyAqLwogICAgeyAweDAwNzAsIDB4NzAgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFAgKi8KICAgIHsgMHgwMDcxLCAweDcxIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBRICovCiAgICB7IDB4MDA3MiwgMHg3MiB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgUiAqLwogICAgeyAweDAwNzMsIDB4NzMgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFMgKi8KICAgIHsgMHgwMDc0LCAweDc0IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBUICovCiAgICB7IDB4MDA3NSwgMHg3NSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSAqLwogICAgeyAweDAwNzYsIDB4NzYgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFYgKi8KICAgIHsgMHgwMDc3LCAweDc3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBXICovCiAgICB7IDB4MDA3OCwgMHg3OCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWCAqLwogICAgeyAweDAwNzksIDB4NzkgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFkgKi8KICAgIHsgMHgwMDdBLCAweDdBIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBaICovCiAgICB7IDB4MDA3QiwgMHg3QiB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQgKi8KICAgIHsgMHgwMDdDLCAweDdDIH0sIC8qIFZFUlRJQ0FMIExJTkUgKi8KICAgIHsgMHgwMDdELCAweDdEIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQgKi8KICAgIHsgMHgwMDdFLCAweDdFIH0sIC8qIFRJTERFICovCiAgICB7IDB4MDBBMCwgMHhDQSB9LCAvKiBOTy1CUkVBSyBTUEFDRSAqLwogICAgeyAweDAwQTEsIDB4QzEgfSwgLyogSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSyAqLwogICAgeyAweDAwQTIsIDB4QTIgfSwgLyogQ0VOVCBTSUdOICovCiAgICB7IDB4MDBBMywgMHhBMyB9LCAvKiBQT1VORCBTSUdOICovCiAgICB7IDB4MDBBNSwgMHhCNCB9LCAvKiBZRU4gU0lHTiAqLwogICAgeyAweDAwQTcsIDB4QTQgfSwgLyogU0VDVElPTiBTSUdOICovCiAgICB7IDB4MDBBOCwgMHhBQyB9LCAvKiBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEE5LCAweEE5IH0sIC8qIENPUFlSSUdIVCBTSUdOICovCiAgICB7IDB4MDBBQSwgMHhCQiB9LCAvKiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUiAqLwogICAgeyAweDAwQUIsIDB4QzcgfSwgLyogTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgwMEFDLCAweEMyIH0sIC8qIE5PVCBTSUdOICovCiAgICB7IDB4MDBBRSwgMHhBOCB9LCAvKiBSRUdJU1RFUkVEIFNJR04gKi8KICAgIHsgMHgwMEFGLCAweEY4IH0sIC8qIE1BQ1JPTiAqLwogICAgeyAweDAwQjAsIDB4QTEgfSwgLyogREVHUkVFIFNJR04gKi8KICAgIHsgMHgwMEIxLCAweEIxIH0sIC8qIFBMVVMtTUlOVVMgU0lHTiAqLwogICAgeyAweDAwQjQsIDB4QUIgfSwgLyogQUNVVEUgQUNDRU5UICovCiAgICB7IDB4MDBCNSwgMHhCNSB9LCAvKiBNSUNSTyBTSUdOICovCiAgICB7IDB4MDBCNiwgMHhBNiB9LCAvKiBQSUxDUk9XIFNJR04gKi8KICAgIHsgMHgwMEI3LCAweEUxIH0sIC8qIE1JRERMRSBET1QgKi8KICAgIHsgMHgwMEI4LCAweEZDIH0sIC8qIENFRElMTEEgKi8KICAgIHsgMHgwMEJBLCAweEJDIH0sIC8qIE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUiAqLwogICAgeyAweDAwQkIsIDB4QzggfSwgLyogUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MDBCRiwgMHhDMCB9LCAvKiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLICovCiAgICB7IDB4MDBDMCwgMHhDQiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEMxLCAweEU3IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwQzIsIDB4RTUgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEMzLCAweENDIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERSAqLwogICAgeyAweDAwQzQsIDB4ODAgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwQzUsIDB4ODEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi8KICAgIHsgMHgwMEM2LCAweEFFIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEFFICovCiAgICB7IDB4MDBDNywgMHg4MiB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqLwogICAgeyAweDAwQzgsIDB4RTkgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBDOSwgMHg4MyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMENBLCAweEU2IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBDQiwgMHhFOCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBDQywgMHhFRCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMENELCAweEVBIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqLwogICAgeyAweDAwQ0UsIDB4RUIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMENGLCAweEVDIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEQxLCAweDg0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERSAqLwogICAgeyAweDAwRDIsIDB4RjEgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBEMywgMHhFRSB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEQ0LCAweEVGIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYICovCiAgICB7IDB4MDBENSwgMHhDRCB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEQ2LCAweDg1IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEQ4LCAweEFGIH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KICAgIHsgMHgwMEQ5LCAweEY0IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRSAqLwogICAgeyAweDAwREEsIDB4RjIgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBEQiwgMHhGMyB9LCAvKiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwREMsIDB4ODYgfSwgLyogTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAwREYsIDB4QTcgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKi8KICAgIHsgMHgwMEUwLCAweDg4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEUxLCAweDg3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEUyLCAweDg5IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRTMsIDB4OEIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERSAqLwogICAgeyAweDAwRTQsIDB4OEEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEU1LCAweDhDIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqLwogICAgeyAweDAwRTYsIDB4QkUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEFFICovCiAgICB7IDB4MDBFNywgMHg4RCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEgKi8KICAgIHsgMHgwMEU4LCAweDhGIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEU5LCAweDhFIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEVBLCAweDkwIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRUIsIDB4OTEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEVDLCAweDkzIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEVELCAweDkyIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEVFLCAweDk0IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRUYsIDB4OTUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEYxLCAweDk2IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUgKi8KICAgIHsgMHgwMEYyLCAweDk4IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUgKi8KICAgIHsgMHgwMEYzLCAweDk3IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUgKi8KICAgIHsgMHgwMEY0LCAweDk5IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCAqLwogICAgeyAweDAwRjUsIDB4OUIgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERSAqLwogICAgeyAweDAwRjYsIDB4OUEgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMEY3LCAweEQ2IH0sIC8qIERJVklTSU9OIFNJR04gKi8KICAgIHsgMHgwMEY4LCAweEJGIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFICovCiAgICB7IDB4MDBGOSwgMHg5RCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCiAgICB7IDB4MDBGQSwgMHg5QyB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFICovCiAgICB7IDB4MDBGQiwgMHg5RSB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVggKi8KICAgIHsgMHgwMEZDLCAweDlGIH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTICovCiAgICB7IDB4MDBGRiwgMHhEOCB9LCAvKiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUyAqLwogICAgeyAweDAxMzEsIDB4RjUgfSwgLyogTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSSAqLwogICAgeyAweDAxNTIsIDB4Q0UgfSwgLyogTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRSAqLwogICAgeyAweDAxNTMsIDB4Q0YgfSwgLyogTEFUSU4gU01BTEwgTElHQVRVUkUgT0UgKi8KICAgIHsgMHgwMTc4LCAweEQ5IH0sIC8qIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMgKi8KICAgIHsgMHgwMTkyLCAweEM0IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSyAqLwogICAgeyAweDAyQzYsIDB4RjYgfSwgLyogTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UICovCiAgICB7IDB4MDJDNywgMHhGRiB9LCAvKiBDQVJPTiAqLwogICAgeyAweDAyRDgsIDB4RjkgfSwgLyogQlJFVkUgKi8KICAgIHsgMHgwMkQ5LCAweEZBIH0sIC8qIERPVCBBQk9WRSAqLwogICAgeyAweDAyREEsIDB4RkIgfSwgLyogUklORyBBQk9WRSAqLwogICAgeyAweDAyREIsIDB4RkUgfSwgLyogT0dPTkVLICovCiAgICB7IDB4MDJEQywgMHhGNyB9LCAvKiBTTUFMTCBUSUxERSAqLwogICAgeyAweDAyREQsIDB4RkQgfSwgLyogRE9VQkxFIEFDVVRFIEFDQ0VOVCAqLwogICAgeyAweDAzQTksIDB4QkQgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgKi8KICAgIHsgMHgwM0MwLCAweEI5IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBQSSAqLwogICAgeyAweDIwMTMsIDB4RDAgfSwgLyogRU4gREFTSCAqLwogICAgeyAweDIwMTQsIDB4RDEgfSwgLyogRU0gREFTSCAqLwogICAgeyAweDIwMTgsIDB4RDQgfSwgLyogTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDE5LCAweEQ1IH0sIC8qIFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMUEsIDB4RTIgfSwgLyogU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxQywgMHhEMiB9LCAvKiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwMUQsIDB4RDMgfSwgLyogUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLICovCiAgICB7IDB4MjAxRSwgMHhFMyB9LCAvKiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDIwLCAweEEwIH0sIC8qIERBR0dFUiAqLwogICAgeyAweDIwMjEsIDB4RTAgfSwgLyogRE9VQkxFIERBR0dFUiAqLwogICAgeyAweDIwMjIsIDB4QTUgfSwgLyogQlVMTEVUICovCiAgICB7IDB4MjAyNiwgMHhDOSB9LCAvKiBIT1JJWk9OVEFMIEVMTElQU0lTICovCiAgICB7IDB4MjAzMCwgMHhFNCB9LCAvKiBQRVIgTUlMTEUgU0lHTiAqLwogICAgeyAweDIwMzksIDB4REMgfSwgLyogU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KICAgIHsgMHgyMDNBLCAweEREIH0sIC8qIFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAqLwogICAgeyAweDIwNDQsIDB4REEgfSwgLyogRlJBQ1RJT04gU0xBU0ggKi8KICAgIHsgMHgyMEFDLCAweERCIH0sIC8qIEVVUk8gU0lHTiAqLwogICAgeyAweDIxMjIsIDB4QUEgfSwgLyogVFJBREUgTUFSSyBTSUdOICovCiAgICB7IDB4MjIwMiwgMHhCNiB9LCAvKiBQQVJUSUFMIERJRkZFUkVOVElBTCAqLwogICAgeyAweDIyMDYsIDB4QzYgfSwgLyogSU5DUkVNRU5UICovCiAgICB7IDB4MjIwRiwgMHhCOCB9LCAvKiBOLUFSWSBQUk9EVUNUICovCiAgICB7IDB4MjIxMSwgMHhCNyB9LCAvKiBOLUFSWSBTVU1NQVRJT04gKi8KICAgIHsgMHgyMjFBLCAweEMzIH0sIC8qIFNRVUFSRSBST09UICovCiAgICB7IDB4MjIxRSwgMHhCMCB9LCAvKiBJTkZJTklUWSAqLwogICAgeyAweDIyMkIsIDB4QkEgfSwgLyogSU5URUdSQUwgKi8KICAgIHsgMHgyMjQ4LCAweEM1IH0sIC8qIEFMTU9TVCBFUVVBTCBUTyAqLwogICAgeyAweDIyNjAsIDB4QUQgfSwgLyogTk9UIEVRVUFMIFRPICovCiAgICB7IDB4MjI2NCwgMHhCMiB9LCAvKiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8gKi8KICAgIHsgMHgyMjY1LCAweEIzIH0sIC8qIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTyAqLwogICAgeyAweDI1Q0EsIDB4RDcgfSwgLyogTE9aRU5HRSAqLwogICAgeyAweEY4RkYsIDB4RjAgfSwgLyogQXBwbGUgbG9nbyAqLwogICAgeyAweEZCMDEsIDB4REUgfSwgLyogTEFUSU4gU01BTEwgTElHQVRVUkUgRkkgKi8KICAgIHsgMHhGQjAyLCAweERGIH0sIC8qIExBVElOIFNNQUxMIExJR0FUVVJFIEZMICovCn07CgpzdGF0aWMgY29uc3QgRmNDaGFyTWFwIEFwcGxlUm9tYW4gPSB7CiAgICBBcHBsZVJvbWFuRW50LAogICAgc2l6ZW9mIChBcHBsZVJvbWFuRW50KSAvIHNpemVvZiAoQXBwbGVSb21hbkVudFswXSkKfTsKCnN0YXRpYyBjb25zdCBGY0NoYXJFbnQgQWRvYmVTeW1ib2xFbnRbXSA9IHsKICAgIHsgMHgwMDIwLCAweDIwIH0sIC8qIFNQQUNFCSMgc3BhY2UgKi8KICAgIHsgMHgwMDIxLCAweDIxIH0sIC8qIEVYQ0xBTUFUSU9OIE1BUksJIyBleGNsYW0gKi8KICAgIHsgMHgwMDIzLCAweDIzIH0sIC8qIE5VTUJFUiBTSUdOCSMgbnVtYmVyc2lnbiAqLwogICAgeyAweDAwMjUsIDB4MjUgfSwgLyogUEVSQ0VOVCBTSUdOCSMgcGVyY2VudCAqLwogICAgeyAweDAwMjYsIDB4MjYgfSwgLyogQU1QRVJTQU5ECSMgYW1wZXJzYW5kICovCiAgICB7IDB4MDAyOCwgMHgyOCB9LCAvKiBMRUZUIFBBUkVOVEhFU0lTCSMgcGFyZW5sZWZ0ICovCiAgICB7IDB4MDAyOSwgMHgyOSB9LCAvKiBSSUdIVCBQQVJFTlRIRVNJUwkjIHBhcmVucmlnaHQgKi8KICAgIHsgMHgwMDJCLCAweDJCIH0sIC8qIFBMVVMgU0lHTgkjIHBsdXMgKi8KICAgIHsgMHgwMDJDLCAweDJDIH0sIC8qIENPTU1BCSMgY29tbWEgKi8KICAgIHsgMHgwMDJFLCAweDJFIH0sIC8qIEZVTEwgU1RPUAkjIHBlcmlvZCAqLwogICAgeyAweDAwMkYsIDB4MkYgfSwgLyogU09MSURVUwkjIHNsYXNoICovCiAgICB7IDB4MDAzMCwgMHgzMCB9LCAvKiBESUdJVCBaRVJPCSMgemVybyAqLwogICAgeyAweDAwMzEsIDB4MzEgfSwgLyogRElHSVQgT05FCSMgb25lICovCiAgICB7IDB4MDAzMiwgMHgzMiB9LCAvKiBESUdJVCBUV08JIyB0d28gKi8KICAgIHsgMHgwMDMzLCAweDMzIH0sIC8qIERJR0lUIFRIUkVFCSMgdGhyZWUgKi8KICAgIHsgMHgwMDM0LCAweDM0IH0sIC8qIERJR0lUIEZPVVIJIyBmb3VyICovCiAgICB7IDB4MDAzNSwgMHgzNSB9LCAvKiBESUdJVCBGSVZFCSMgZml2ZSAqLwogICAgeyAweDAwMzYsIDB4MzYgfSwgLyogRElHSVQgU0lYCSMgc2l4ICovCiAgICB7IDB4MDAzNywgMHgzNyB9LCAvKiBESUdJVCBTRVZFTgkjIHNldmVuICovCiAgICB7IDB4MDAzOCwgMHgzOCB9LCAvKiBESUdJVCBFSUdIVAkjIGVpZ2h0ICovCiAgICB7IDB4MDAzOSwgMHgzOSB9LCAvKiBESUdJVCBOSU5FCSMgbmluZSAqLwogICAgeyAweDAwM0EsIDB4M0EgfSwgLyogQ09MT04JIyBjb2xvbiAqLwogICAgeyAweDAwM0IsIDB4M0IgfSwgLyogU0VNSUNPTE9OCSMgc2VtaWNvbG9uICovCiAgICB7IDB4MDAzQywgMHgzQyB9LCAvKiBMRVNTLVRIQU4gU0lHTgkjIGxlc3MgKi8KICAgIHsgMHgwMDNELCAweDNEIH0sIC8qIEVRVUFMUyBTSUdOCSMgZXF1YWwgKi8KICAgIHsgMHgwMDNFLCAweDNFIH0sIC8qIEdSRUFURVItVEhBTiBTSUdOCSMgZ3JlYXRlciAqLwogICAgeyAweDAwM0YsIDB4M0YgfSwgLyogUVVFU1RJT04gTUFSSwkjIHF1ZXN0aW9uICovCiAgICB7IDB4MDA1QiwgMHg1QiB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUCSMgYnJhY2tldGxlZnQgKi8KICAgIHsgMHgwMDVELCAweDVEIH0sIC8qIFJJR0hUIFNRVUFSRSBCUkFDS0VUCSMgYnJhY2tldHJpZ2h0ICovCiAgICB7IDB4MDA1RiwgMHg1RiB9LCAvKiBMT1cgTElORQkjIHVuZGVyc2NvcmUgKi8KICAgIHsgMHgwMDdCLCAweDdCIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVAkjIGJyYWNlbGVmdCAqLwogICAgeyAweDAwN0MsIDB4N0MgfSwgLyogVkVSVElDQUwgTElORQkjIGJhciAqLwogICAgeyAweDAwN0QsIDB4N0QgfSwgLyogUklHSFQgQ1VSTFkgQlJBQ0tFVAkjIGJyYWNlcmlnaHQgKi8KICAgIHsgMHgwMEEwLCAweDIwIH0sIC8qIE5PLUJSRUFLIFNQQUNFCSMgc3BhY2UgKi8KICAgIHsgMHgwMEFDLCAweEQ4IH0sIC8qIE5PVCBTSUdOCSMgbG9naWNhbG5vdCAqLwogICAgeyAweDAwQjAsIDB4QjAgfSwgLyogREVHUkVFIFNJR04JIyBkZWdyZWUgKi8KICAgIHsgMHgwMEIxLCAweEIxIH0sIC8qIFBMVVMtTUlOVVMgU0lHTgkjIHBsdXNtaW51cyAqLwogICAgeyAweDAwQjUsIDB4NkQgfSwgLyogTUlDUk8gU0lHTgkjIG11ICovCiAgICB7IDB4MDBENywgMHhCNCB9LCAvKiBNVUxUSVBMSUNBVElPTiBTSUdOCSMgbXVsdGlwbHkgKi8KICAgIHsgMHgwMEY3LCAweEI4IH0sIC8qIERJVklTSU9OIFNJR04JIyBkaXZpZGUgKi8KICAgIHsgMHgwMTkyLCAweEE2IH0sIC8qIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSwkjIGZsb3JpbiAqLwogICAgeyAweDAzOTEsIDB4NDEgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEJIyBBbHBoYSAqLwogICAgeyAweDAzOTIsIDB4NDIgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQkjIEJldGEgKi8KICAgIHsgMHgwMzkzLCAweDQ3IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCSMgR2FtbWEgKi8KICAgIHsgMHgwMzk0LCAweDQ0IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBCSMgRGVsdGEgKi8KICAgIHsgMHgwMzk1LCAweDQ1IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04JIyBFcHNpbG9uICovCiAgICB7IDB4MDM5NiwgMHg1QSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBaRVRBCSMgWmV0YSAqLwogICAgeyAweDAzOTcsIDB4NDggfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBCSMgRXRhICovCiAgICB7IDB4MDM5OCwgMHg1MSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQkjIFRoZXRhICovCiAgICB7IDB4MDM5OSwgMHg0OSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBCSMgSW90YSAqLwogICAgeyAweDAzOUEsIDB4NEIgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEJIyBLYXBwYSAqLwogICAgeyAweDAzOUIsIDB4NEMgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEJIyBMYW1iZGEgKi8KICAgIHsgMHgwMzlDLCAweDREIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIE1VCSMgTXUgKi8KICAgIHsgMHgwMzlELCAweDRFIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIE5VCSMgTnUgKi8KICAgIHsgMHgwMzlFLCAweDU4IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCSMgWGkgKi8KICAgIHsgMHgwMzlGLCAweDRGIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04JIyBPbWljcm9uICovCiAgICB7IDB4MDNBMCwgMHg1MCB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQkjIFBpICovCiAgICB7IDB4MDNBMSwgMHg1MiB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8JIyBSaG8gKi8KICAgIHsgMHgwM0EzLCAweDUzIH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCSMgU2lnbWEgKi8KICAgIHsgMHgwM0E0LCAweDU0IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFRBVQkjIFRhdSAqLwogICAgeyAweDAzQTUsIDB4NTUgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTgkjIFVwc2lsb24gKi8KICAgIHsgMHgwM0E2LCAweDQ2IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQkjIFBoaSAqLwogICAgeyAweDAzQTcsIDB4NDMgfSwgLyogR1JFRUsgQ0FQSVRBTCBMRVRURVIgQ0hJCSMgQ2hpICovCiAgICB7IDB4MDNBOCwgMHg1OSB9LCAvKiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kJIyBQc2kgKi8KICAgIHsgMHgwM0E5LCAweDU3IH0sIC8qIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCSMgT21lZ2EgKi8KICAgIHsgMHgwM0IxLCAweDYxIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQkjIGFscGhhICovCiAgICB7IDB4MDNCMiwgMHg2MiB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQQkjIGJldGEgKi8KICAgIHsgMHgwM0IzLCAweDY3IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQkjIGdhbW1hICovCiAgICB7IDB4MDNCNCwgMHg2NCB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEJIyBkZWx0YSAqLwogICAgeyAweDAzQjUsIDB4NjUgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04JIyBlcHNpbG9uICovCiAgICB7IDB4MDNCNiwgMHg3QSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQkjIHpldGEgKi8KICAgIHsgMHgwM0I3LCAweDY4IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEJIyBldGEgKi8KICAgIHsgMHgwM0I4LCAweDcxIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQkjIHRoZXRhICovCiAgICB7IDB4MDNCOSwgMHg2OSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQQkjIGlvdGEgKi8KICAgIHsgMHgwM0JBLCAweDZCIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQkjIGthcHBhICovCiAgICB7IDB4MDNCQiwgMHg2QyB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgTEFNREEJIyBsYW1iZGEgKi8KICAgIHsgMHgwM0JDLCAweDZEIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBNVQkjIG11ICovCiAgICB7IDB4MDNCRCwgMHg2RSB9LCAvKiBHUkVFSyBTTUFMTCBMRVRURVIgTlUJIyBudSAqLwogICAgeyAweDAzQkUsIDB4NzggfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFhJCSMgeGkgKi8KICAgIHsgMHgwM0JGLCAweDZGIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCSMgb21pY3JvbiAqLwogICAgeyAweDAzQzAsIDB4NzAgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFBJCSMgcGkgKi8KICAgIHsgMHgwM0MxLCAweDcyIH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBSSE8JIyByaG8gKi8KICAgIHsgMHgwM0MyLCAweDU2IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQkjIHNpZ21hMSAqLwogICAgeyAweDAzQzMsIDB4NzMgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCSMgc2lnbWEgKi8KICAgIHsgMHgwM0M0LCAweDc0IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUJIyB0YXUgKi8KICAgIHsgMHgwM0M1LCAweDc1IH0sIC8qIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OCSMgdXBzaWxvbiAqLwogICAgeyAweDAzQzYsIDB4NjYgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFBISQkjIHBoaSAqLwogICAgeyAweDAzQzcsIDB4NjMgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIENISQkjIGNoaSAqLwogICAgeyAweDAzQzgsIDB4NzkgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIFBTSQkjIHBzaSAqLwogICAgeyAweDAzQzksIDB4NzcgfSwgLyogR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBCSMgb21lZ2EgKi8KICAgIHsgMHgwM0QxLCAweDRBIH0sIC8qIEdSRUVLIFRIRVRBIFNZTUJPTAkjIHRoZXRhMSAqLwogICAgeyAweDAzRDIsIDB4QTEgfSwgLyogR1JFRUsgVVBTSUxPTiBXSVRIIEhPT0sgU1lNQk9MCSMgVXBzaWxvbjEgKi8KICAgIHsgMHgwM0Q1LCAweDZBIH0sIC8qIEdSRUVLIFBISSBTWU1CT0wJIyBwaGkxICovCiAgICB7IDB4MDNENiwgMHg3NiB9LCAvKiBHUkVFSyBQSSBTWU1CT0wJIyBvbWVnYTEgKi8KICAgIHsgMHgyMDIyLCAweEI3IH0sIC8qIEJVTExFVAkjIGJ1bGxldCAqLwogICAgeyAweDIwMjYsIDB4QkMgfSwgLyogSE9SSVpPTlRBTCBFTExJUFNJUwkjIGVsbGlwc2lzICovCiAgICB7IDB4MjAzMiwgMHhBMiB9LCAvKiBQUklNRQkjIG1pbnV0ZSAqLwogICAgeyAweDIwMzMsIDB4QjIgfSwgLyogRE9VQkxFIFBSSU1FCSMgc2Vjb25kICovCiAgICB7IDB4MjA0NCwgMHhBNCB9LCAvKiBGUkFDVElPTiBTTEFTSAkjIGZyYWN0aW9uICovCiAgICB7IDB4MjBBQywgMHhBMCB9LCAvKiBFVVJPIFNJR04JIyBFdXJvICovCiAgICB7IDB4MjExMSwgMHhDMSB9LCAvKiBCTEFDSy1MRVRURVIgQ0FQSVRBTCBJCSMgSWZyYWt0dXIgKi8KICAgIHsgMHgyMTE4LCAweEMzIH0sIC8qIFNDUklQVCBDQVBJVEFMIFAJIyB3ZWllcnN0cmFzcyAqLwogICAgeyAweDIxMUMsIDB4QzIgfSwgLyogQkxBQ0stTEVUVEVSIENBUElUQUwgUgkjIFJmcmFrdHVyICovCiAgICB7IDB4MjEyNiwgMHg1NyB9LCAvKiBPSE0gU0lHTgkjIE9tZWdhICovCiAgICB7IDB4MjEzNSwgMHhDMCB9LCAvKiBBTEVGIFNZTUJPTAkjIGFsZXBoICovCiAgICB7IDB4MjE5MCwgMHhBQyB9LCAvKiBMRUZUV0FSRFMgQVJST1cJIyBhcnJvd2xlZnQgKi8KICAgIHsgMHgyMTkxLCAweEFEIH0sIC8qIFVQV0FSRFMgQVJST1cJIyBhcnJvd3VwICovCiAgICB7IDB4MjE5MiwgMHhBRSB9LCAvKiBSSUdIVFdBUkRTIEFSUk9XCSMgYXJyb3dyaWdodCAqLwogICAgeyAweDIxOTMsIDB4QUYgfSwgLyogRE9XTldBUkRTIEFSUk9XCSMgYXJyb3dkb3duICovCiAgICB7IDB4MjE5NCwgMHhBQiB9LCAvKiBMRUZUIFJJR0hUIEFSUk9XCSMgYXJyb3dib3RoICovCiAgICB7IDB4MjFCNSwgMHhCRiB9LCAvKiBET1dOV0FSRFMgQVJST1cgV0lUSCBDT1JORVIgTEVGVFdBUkRTCSMgY2FycmlhZ2VyZXR1cm4gKi8KICAgIHsgMHgyMUQwLCAweERDIH0sIC8qIExFRlRXQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibGxlZnQgKi8KICAgIHsgMHgyMUQxLCAweEREIH0sIC8qIFVQV0FSRFMgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmx1cCAqLwogICAgeyAweDIxRDIsIDB4REUgfSwgLyogUklHSFRXQVJEUyBET1VCTEUgQVJST1cJIyBhcnJvd2RibHJpZ2h0ICovCiAgICB7IDB4MjFEMywgMHhERiB9LCAvKiBET1dOV0FSRFMgRE9VQkxFIEFSUk9XCSMgYXJyb3dkYmxkb3duICovCiAgICB7IDB4MjFENCwgMHhEQiB9LCAvKiBMRUZUIFJJR0hUIERPVUJMRSBBUlJPVwkjIGFycm93ZGJsYm90aCAqLwogICAgeyAweDIyMDAsIDB4MjIgfSwgLyogRk9SIEFMTAkjIHVuaXZlcnNhbCAqLwogICAgeyAweDIyMDIsIDB4QjYgfSwgLyogUEFSVElBTCBESUZGRVJFTlRJQUwJIyBwYXJ0aWFsZGlmZiAqLwogICAgeyAweDIyMDMsIDB4MjQgfSwgLyogVEhFUkUgRVhJU1RTCSMgZXhpc3RlbnRpYWwgKi8KICAgIHsgMHgyMjA1LCAweEM2IH0sIC8qIEVNUFRZIFNFVAkjIGVtcHR5c2V0ICovCiAgICB7IDB4MjIwNiwgMHg0NCB9LCAvKiBJTkNSRU1FTlQJIyBEZWx0YSAqLwogICAgeyAweDIyMDcsIDB4RDEgfSwgLyogTkFCTEEJIyBncmFkaWVudCAqLwogICAgeyAweDIyMDgsIDB4Q0UgfSwgLyogRUxFTUVOVCBPRgkjIGVsZW1lbnQgKi8KICAgIHsgMHgyMjA5LCAweENGIH0sIC8qIE5PVCBBTiBFTEVNRU5UIE9GCSMgbm90ZWxlbWVudCAqLwogICAgeyAweDIyMEIsIDB4MjcgfSwgLyogQ09OVEFJTlMgQVMgTUVNQkVSCSMgc3VjaHRoYXQgKi8KICAgIHsgMHgyMjBGLCAweEQ1IH0sIC8qIE4tQVJZIFBST0RVQ1QJIyBwcm9kdWN0ICovCiAgICB7IDB4MjIxMSwgMHhFNSB9LCAvKiBOLUFSWSBTVU1NQVRJT04JIyBzdW1tYXRpb24gKi8KICAgIHsgMHgyMjEyLCAweDJEIH0sIC8qIE1JTlVTIFNJR04JIyBtaW51cyAqLwogICAgeyAweDIyMTUsIDB4QTQgfSwgLyogRElWSVNJT04gU0xBU0gJIyBmcmFjdGlvbiAqLwogICAgeyAweDIyMTcsIDB4MkEgfSwgLyogQVNURVJJU0sgT1BFUkFUT1IJIyBhc3Rlcmlza21hdGggKi8KICAgIHsgMHgyMjFBLCAweEQ2IH0sIC8qIFNRVUFSRSBST09UCSMgcmFkaWNhbCAqLwogICAgeyAweDIyMUQsIDB4QjUgfSwgLyogUFJPUE9SVElPTkFMIFRPCSMgcHJvcG9ydGlvbmFsICovCiAgICB7IDB4MjIxRSwgMHhBNSB9LCAvKiBJTkZJTklUWQkjIGluZmluaXR5ICovCiAgICB7IDB4MjIyMCwgMHhEMCB9LCAvKiBBTkdMRQkjIGFuZ2xlICovCiAgICB7IDB4MjIyNywgMHhEOSB9LCAvKiBMT0dJQ0FMIEFORAkjIGxvZ2ljYWxhbmQgKi8KICAgIHsgMHgyMjI4LCAweERBIH0sIC8qIExPR0lDQUwgT1IJIyBsb2dpY2Fsb3IgKi8KICAgIHsgMHgyMjI5LCAweEM3IH0sIC8qIElOVEVSU0VDVElPTgkjIGludGVyc2VjdGlvbiAqLwogICAgeyAweDIyMkEsIDB4QzggfSwgLyogVU5JT04JIyB1bmlvbiAqLwogICAgeyAweDIyMkIsIDB4RjIgfSwgLyogSU5URUdSQUwJIyBpbnRlZ3JhbCAqLwogICAgeyAweDIyMzQsIDB4NUMgfSwgLyogVEhFUkVGT1JFCSMgdGhlcmVmb3JlICovCiAgICB7IDB4MjIzQywgMHg3RSB9LCAvKiBUSUxERSBPUEVSQVRPUgkjIHNpbWlsYXIgKi8KICAgIHsgMHgyMjQ1LCAweDQwIH0sIC8qIEFQUFJPWElNQVRFTFkgRVFVQUwgVE8JIyBjb25ncnVlbnQgKi8KICAgIHsgMHgyMjQ4LCAweEJCIH0sIC8qIEFMTU9TVCBFUVVBTCBUTwkjIGFwcHJveGVxdWFsICovCiAgICB7IDB4MjI2MCwgMHhCOSB9LCAvKiBOT1QgRVFVQUwgVE8JIyBub3RlcXVhbCAqLwogICAgeyAweDIyNjEsIDB4QkEgfSwgLyogSURFTlRJQ0FMIFRPCSMgZXF1aXZhbGVuY2UgKi8KICAgIHsgMHgyMjY0LCAweEEzIH0sIC8qIExFU1MtVEhBTiBPUiBFUVVBTCBUTwkjIGxlc3NlcXVhbCAqLwogICAgeyAweDIyNjUsIDB4QjMgfSwgLyogR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCSMgZ3JlYXRlcmVxdWFsICovCiAgICB7IDB4MjI4MiwgMHhDQyB9LCAvKiBTVUJTRVQgT0YJIyBwcm9wZXJzdWJzZXQgKi8KICAgIHsgMHgyMjgzLCAweEM5IH0sIC8qIFNVUEVSU0VUIE9GCSMgcHJvcGVyc3VwZXJzZXQgKi8KICAgIHsgMHgyMjg0LCAweENCIH0sIC8qIE5PVCBBIFNVQlNFVCBPRgkjIG5vdHN1YnNldCAqLwogICAgeyAweDIyODYsIDB4Q0QgfSwgLyogU1VCU0VUIE9GIE9SIEVRVUFMIFRPCSMgcmVmbGV4c3Vic2V0ICovCiAgICB7IDB4MjI4NywgMHhDQSB9LCAvKiBTVVBFUlNFVCBPRiBPUiBFUVVBTCBUTwkjIHJlZmxleHN1cGVyc2V0ICovCiAgICB7IDB4MjI5NSwgMHhDNSB9LCAvKiBDSVJDTEVEIFBMVVMJIyBjaXJjbGVwbHVzICovCiAgICB7IDB4MjI5NywgMHhDNCB9LCAvKiBDSVJDTEVEIFRJTUVTCSMgY2lyY2xlbXVsdGlwbHkgKi8KICAgIHsgMHgyMkE1LCAweDVFIH0sIC8qIFVQIFRBQ0sJIyBwZXJwZW5kaWN1bGFyICovCiAgICB7IDB4MjJDNSwgMHhENyB9LCAvKiBET1QgT1BFUkFUT1IJIyBkb3RtYXRoICovCiAgICB7IDB4MjMyMCwgMHhGMyB9LCAvKiBUT1AgSEFMRiBJTlRFR1JBTAkjIGludGVncmFsdHAgKi8KICAgIHsgMHgyMzIxLCAweEY1IH0sIC8qIEJPVFRPTSBIQUxGIElOVEVHUkFMCSMgaW50ZWdyYWxidCAqLwogICAgeyAweDIzMjksIDB4RTEgfSwgLyogTEVGVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUCSMgYW5nbGVsZWZ0ICovCiAgICB7IDB4MjMyQSwgMHhGMSB9LCAvKiBSSUdIVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUCSMgYW5nbGVyaWdodCAqLwogICAgeyAweDI1Q0EsIDB4RTAgfSwgLyogTE9aRU5HRQkjIGxvemVuZ2UgKi8KICAgIHsgMHgyNjYwLCAweEFBIH0sIC8qIEJMQUNLIFNQQURFIFNVSVQJIyBzcGFkZSAqLwogICAgeyAweDI2NjMsIDB4QTcgfSwgLyogQkxBQ0sgQ0xVQiBTVUlUCSMgY2x1YiAqLwogICAgeyAweDI2NjUsIDB4QTkgfSwgLyogQkxBQ0sgSEVBUlQgU1VJVAkjIGhlYXJ0ICovCiAgICB7IDB4MjY2NiwgMHhBOCB9LCAvKiBCTEFDSyBESUFNT05EIFNVSVQJIyBkaWFtb25kICovCiAgICB7IDB4RjZEOSwgMHhEMyB9LCAvKiBDT1BZUklHSFQgU0lHTiBTRVJJRgkjIGNvcHlyaWdodHNlcmlmIChDVVMpICovCiAgICB7IDB4RjZEQSwgMHhEMiB9LCAvKiBSRUdJU1RFUkVEIFNJR04gU0VSSUYJIyByZWdpc3RlcnNlcmlmIChDVVMpICovCiAgICB7IDB4RjZEQiwgMHhENCB9LCAvKiBUUkFERSBNQVJLIFNJR04gU0VSSUYJIyB0cmFkZW1hcmtzZXJpZiAoQ1VTKSAqLwogICAgeyAweEY4RTUsIDB4NjAgfSwgLyogUkFESUNBTCBFWFRFTkRFUgkjIHJhZGljYWxleCAoQ1VTKSAqLwogICAgeyAweEY4RTYsIDB4QkQgfSwgLyogVkVSVElDQUwgQVJST1cgRVhURU5ERVIJIyBhcnJvd3ZlcnRleCAoQ1VTKSAqLwogICAgeyAweEY4RTcsIDB4QkUgfSwgLyogSE9SSVpPTlRBTCBBUlJPVyBFWFRFTkRFUgkjIGFycm93aG9yaXpleCAoQ1VTKSAqLwogICAgeyAweEY4RTgsIDB4RTIgfSwgLyogUkVHSVNURVJFRCBTSUdOIFNBTlMgU0VSSUYJIyByZWdpc3RlcnNhbnMgKENVUykgKi8KICAgIHsgMHhGOEU5LCAweEUzIH0sIC8qIENPUFlSSUdIVCBTSUdOIFNBTlMgU0VSSUYJIyBjb3B5cmlnaHRzYW5zIChDVVMpICovCiAgICB7IDB4RjhFQSwgMHhFNCB9LCAvKiBUUkFERSBNQVJLIFNJR04gU0FOUyBTRVJJRgkjIHRyYWRlbWFya3NhbnMgKENVUykgKi8KICAgIHsgMHhGOEVCLCAweEU2IH0sIC8qIExFRlQgUEFSRU4gVE9QCSMgcGFyZW5sZWZ0dHAgKENVUykgKi8KICAgIHsgMHhGOEVDLCAweEU3IH0sIC8qIExFRlQgUEFSRU4gRVhURU5ERVIJIyBwYXJlbmxlZnRleCAoQ1VTKSAqLwogICAgeyAweEY4RUQsIDB4RTggfSwgLyogTEVGVCBQQVJFTiBCT1RUT00JIyBwYXJlbmxlZnRidCAoQ1VTKSAqLwogICAgeyAweEY4RUUsIDB4RTkgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVCBUT1AJIyBicmFja2V0bGVmdHRwIChDVVMpICovCiAgICB7IDB4RjhFRiwgMHhFQSB9LCAvKiBMRUZUIFNRVUFSRSBCUkFDS0VUIEVYVEVOREVSCSMgYnJhY2tldGxlZnRleCAoQ1VTKSAqLwogICAgeyAweEY4RjAsIDB4RUIgfSwgLyogTEVGVCBTUVVBUkUgQlJBQ0tFVCBCT1RUT00JIyBicmFja2V0bGVmdGJ0IChDVVMpICovCiAgICB7IDB4RjhGMSwgMHhFQyB9LCAvKiBMRUZUIENVUkxZIEJSQUNLRVQgVE9QCSMgYnJhY2VsZWZ0dHAgKENVUykgKi8KICAgIHsgMHhGOEYyLCAweEVEIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVCBNSUQJIyBicmFjZWxlZnRtaWQgKENVUykgKi8KICAgIHsgMHhGOEYzLCAweEVFIH0sIC8qIExFRlQgQ1VSTFkgQlJBQ0tFVCBCT1RUT00JIyBicmFjZWxlZnRidCAoQ1VTKSAqLwogICAgeyAweEY4RjQsIDB4RUYgfSwgLyogQ1VSTFkgQlJBQ0tFVCBFWFRFTkRFUgkjIGJyYWNlZXggKENVUykgKi8KICAgIHsgMHhGOEY1LCAweEY0IH0sIC8qIElOVEVHUkFMIEVYVEVOREVSCSMgaW50ZWdyYWxleCAoQ1VTKSAqLwogICAgeyAweEY4RjYsIDB4RjYgfSwgLyogUklHSFQgUEFSRU4gVE9QCSMgcGFyZW5yaWdodHRwIChDVVMpICovCiAgICB7IDB4RjhGNywgMHhGNyB9LCAvKiBSSUdIVCBQQVJFTiBFWFRFTkRFUgkjIHBhcmVucmlnaHRleCAoQ1VTKSAqLwogICAgeyAweEY4RjgsIDB4RjggfSwgLyogUklHSFQgUEFSRU4gQk9UVE9NCSMgcGFyZW5yaWdodGJ0IChDVVMpICovCiAgICB7IDB4RjhGOSwgMHhGOSB9LCAvKiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCBUT1AJIyBicmFja2V0cmlnaHR0cCAoQ1VTKSAqLwogICAgeyAweEY4RkEsIDB4RkEgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQgRVhURU5ERVIJIyBicmFja2V0cmlnaHRleCAoQ1VTKSAqLwogICAgeyAweEY4RkIsIDB4RkIgfSwgLyogUklHSFQgU1FVQVJFIEJSQUNLRVQgQk9UVE9NCSMgYnJhY2tldHJpZ2h0YnQgKENVUykgKi8KICAgIHsgMHhGOEZDLCAweEZDIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQgVE9QCSMgYnJhY2VyaWdodHRwIChDVVMpICovCiAgICB7IDB4RjhGRCwgMHhGRCB9LCAvKiBSSUdIVCBDVVJMWSBCUkFDS0VUIE1JRAkjIGJyYWNlcmlnaHRtaWQgKENVUykgKi8KICAgIHsgMHhGOEZFLCAweEZFIH0sIC8qIFJJR0hUIENVUkxZIEJSQUNLRVQgQk9UVE9NCSMgYnJhY2VyaWdodGJ0IChDVVMpICovCn07CgpzdGF0aWMgY29uc3QgRmNDaGFyTWFwIEFkb2JlU3ltYm9sID0gewogICAgQWRvYmVTeW1ib2xFbnQsCiAgICBzaXplb2YgKEFkb2JlU3ltYm9sRW50KSAvIHNpemVvZiAoQWRvYmVTeW1ib2xFbnRbMF0pLAp9Owo=