LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RPU0VYRV9ICiNkZWZpbmUgX19XSU5FX0RPU0VYRV9ICgojaW5jbHVkZSAid2luZS93aW5kZWYxNi5oIgojaW5jbHVkZSAid2luYmFzZS5oIiAgIC8qIGZvciBMUFNUQVJUVVBJTkZPMzJBICovCiNpbmNsdWRlICJ3aW5udC5oIiAgICAgLyogZm9yIFBDT05URVhUICovCiNpbmNsdWRlICJ3aW5jb24uaCIgICAgLyogZm9yIE1PVVNFX0VWRU5UX1JFQ09SRCAqLwojaW5jbHVkZSAibWlzY2VtdS5oIgoKc3RydWN0IF9ET1NFVkVOVDsKc3RydWN0IF9TVEFDSzE2RlJBTUU7CgovKiBhbW91bnQgb2Ygc3BhY2UgcmVzZXJ2ZWQgZm9yIHJlbGF5IHN0YWNrICovCiNkZWZpbmUgRE9TVk1fUkVMQVlfREFUQV9TSVpFIDQwOTYKCi8qIHZhcmlvdXMgcmVhbC1tb2RlIGNvZGUgc3R1YnMgKi8Kc3RydWN0IERQTUlfc2VnbWVudHMKewogICAgV09SRCB3cmFwX3NlZzsKICAgIFdPUkQgeG1zX3NlZzsKICAgIFdPUkQgZHBtaV9zZWc7CiAgICBXT1JEIGRwbWlfc2VsOwogICAgV09SRCBpbnQ0OF9zZWw7CiAgICBXT1JEIGludDE2X3NlbDsKICAgIFdPUkQgcmVsYXlfY29kZV9zZWw7CiAgICBXT1JEIHJlbGF5X2RhdGFfc2VsOwp9OwoKLyogNDgtYml0IHNlZ21lbnRlZCBwb2ludGVycyBmb3IgRE9TIERQTUkzMiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgV09SRCAgc2VsZWN0b3I7CiAgRFdPUkQgb2Zmc2V0Owp9IFNFR1BUUjQ4LCBGQVJQUk9DNDg7CgojZGVmaW5lIERPU0NPTkZfTUVNX0hJR0ggICAgICAgIDB4MDAwMQojZGVmaW5lIERPU0NPTkZfTUVNX1VNQiAgICAgICAgIDB4MDAwMgojZGVmaW5lIERPU0NPTkZfTlVNTE9DSyAgICAgICAgIDB4MDAwNAojZGVmaW5lIERPU0NPTkZfS0VZQl9DT05WICAgICAgIDB4MDAwOAoKdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciBsYXN0ZHJpdmU7CiAgICBpbnQgYnJrX2ZsYWc7CiAgICBpbnQgZmlsZXM7CiAgICBpbnQgc3RhY2tzX25yOwogICAgaW50IHN0YWNrc19zejsKICAgIGludCBidWY7CiAgICBpbnQgYnVmMjsKICAgIGludCBmY2JzOwogICAgaW50IGZsYWdzOwogICAgY2hhciAqc2hlbGw7CiAgICBjaGFyICpjb3VudHJ5Owp9IERPU0NPTkY7Cgp0eXBlZGVmIHZvaWQgKCpET1NSRUxBWSkoQ09OVEVYVDg2Kix2b2lkKik7CnR5cGVkZWYgdm9pZCAoV0lOQVBJICpSTUNCUFJPQykoQ09OVEVYVDg2Kik7CnR5cGVkZWYgdm9pZCAoV0lOQVBJICpJTlRQUk9DKShDT05URVhUODYqKTsKCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1JFQUxUSU1FIDAgIC8qIElSUTAgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfS0VZQk9BUkQgMSAgLyogSVJRMSAqLwojZGVmaW5lIERPU19QUklPUklUWV9WR0EgICAgICAyICAvKiBJUlE5ICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX01PVVNFICAgIDUgIC8qIElSUTEyICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1NFUklBTCAgIDEwIC8qIElSUTQgKi8KCmV4dGVybiBXT1JEIERPU1ZNX3BzcDsgICAgIC8qIHBzcCBvZiBjdXJyZW50IERPUyB0YXNrICovCmV4dGVybiBXT1JEIERPU1ZNX3JldHZhbDsgIC8qIHJldHVybiB2YWx1ZSBvZiBwcmV2aW91cyBET1MgdGFzayAqLwpleHRlcm4gc3RydWN0IERQTUlfc2VnbWVudHMgKkRPU1ZNX2RwbWlfc2VnbWVudHM7CgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChIQVZFX1NZU19WTTg2X0gpCiMgZGVmaW5lIE1aX1NVUFBPUlRFRAojZW5kaWYgLyogbGludXgtaTM4NiAqLwoKI2RlZmluZSBWODZfRkxBRyAweDAwMDIwMDAwCgojZGVmaW5lIEJJT1NfREFUQSAoKHZvaWQgKikweDQwMCkKCiNkZWZpbmUgQUREX0xPV09SRChkdyx2YWwpICAoKGR3KSA9ICgoZHcpICYgMHhmZmZmMDAwMCkgfCBMT1dPUkQoKERXT1JEKShkdykrKHZhbCkpKQoKLyogbW9kdWxlLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIE1aX0xvYWRJbWFnZSggTFBDU1RSIGZpbGVuYW1lLCBIQU5ETEUgaEZpbGUgKTsKZXh0ZXJuIEJPT0wgV0lOQVBJIE1aX0V4ZWMoIENPTlRFWFQ4NiAqY29udGV4dCwgTFBDU1RSIGZpbGVuYW1lLCBCWVRFIGZ1bmMsIExQVk9JRCBwYXJhbWJsayApOwpleHRlcm4gdm9pZCBXSU5BUEkgTVpfRXhpdCggQ09OVEVYVDg2ICpjb250ZXh0LCBCT09MIGNzX3BzcCwgV09SRCByZXR2YWwgKTsKZXh0ZXJuIEJPT0wgV0lOQVBJIE1aX0N1cnJlbnQoIHZvaWQgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIE1aX0FsbG9jRFBNSVRhc2soIHZvaWQgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIE1aX1J1bkluVGhyZWFkKCBQQVBDRlVOQyBwcm9jLCBVTE9OR19QVFIgYXJnICk7CmV4dGVybiBCT09MIERPU1ZNX0lzV2luMTYodm9pZCk7CgovKiBkb3N2bS5jICovCmV4dGVybiB2b2lkIERPU1ZNX1NlbmRRdWV1ZWRFdmVudHMoIENPTlRFWFQ4NiAqICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9BY2tub3dsZWRnZUlSUSggQ09OVEVYVDg2ICogKTsKZXh0ZXJuIElOVCBXSU5BUEkgRE9TVk1fRW50ZXIoIENPTlRFWFQ4NiAqY29udGV4dCApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fV2FpdCggQ09OVEVYVDg2ICogKTsKZXh0ZXJuIERXT1JEIFdJTkFQSSBET1NWTV9Mb29wKCBIQU5ETEUgaFRocmVhZCApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fUXVldWVFdmVudCggSU5UIGlycSwgSU5UIHByaW9yaXR5LCBET1NSRUxBWSByZWxheSwgTFBWT0lEIGRhdGEgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1BJQ19pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9TZXRUaW1lciggVUlOVCB0aWNrcyApOwpleHRlcm4gVUlOVCBXSU5BUEkgRE9TVk1fR2V0VGltZXIoIHZvaWQgKTsKCi8qIGRldmljZXMuYyAqLwpleHRlcm4gdm9pZCBET1NERVZfSW5zdGFsbERPU0RldmljZXModm9pZCk7CmV4dGVybiBEV09SRCBET1NERVZfQ29uc29sZSh2b2lkKTsKZXh0ZXJuIERXT1JEIERPU0RFVl9GaW5kQ2hhckRldmljZShjaGFyKm5hbWUpOwpleHRlcm4gaW50IERPU0RFVl9QZWVrKERXT1JEIGRldiwgQllURSpkYXRhKTsKZXh0ZXJuIGludCBET1NERVZfUmVhZChEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1Zmxlbik7CmV4dGVybiBpbnQgRE9TREVWX1dyaXRlKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuLCBpbnQgdmVyaWZ5KTsKZXh0ZXJuIGludCBET1NERVZfSW9jdGxSZWFkKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuKTsKZXh0ZXJuIGludCBET1NERVZfSW9jdGxXcml0ZShEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1Zmxlbik7CmV4dGVybiBzdHJ1Y3QgX0RPU19MSVNUT0ZMSVNUUyAqIERPU01FTV9MT0woKTsKCi8qIGRtYS5jICovCmV4dGVybiBpbnQgRE1BX1RyYW5zZmVyKGludCBjaGFubmVsLGludCByZXFsZW5ndGgsdm9pZCogYnVmZmVyKTsKZXh0ZXJuIHZvaWQgRE1BX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwgKTsKZXh0ZXJuIEJZVEUgRE1BX2lvcG9ydF9pbiggV09SRCBwb3J0ICk7CgovKiBkb3Nhc3BpLmMgKi8Kdm9pZCBXSU5BUEkgRE9TVk1fQVNQSUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBkb3Njb25mLmMgKi8KRE9TQ09ORiAqRE9TQ09ORl9HZXRDb25maWcoIHZvaWQgKTsKCi8qIGZwdS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzNEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzNUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzNkhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzN0hhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzOEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzOUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzYUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzYkhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzY0hhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzZEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzZUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBoaW1lbS5jICovCmV4dGVybiB2b2lkIERPU1ZNX0luaXRTZWdtZW50cyh2b2lkKTsKZXh0ZXJuIExQVk9JRCBET1NWTV9BbGxvY1VNQihEV09SRCk7CmV4dGVybiBMUFZPSUQgRE9TVk1fQWxsb2NDb2RlVU1CKERXT1JELCBXT1JEICosIFdPUkQgKik7CmV4dGVybiBMUFZPSUQgRE9TVk1fQWxsb2NEYXRhVU1CKERXT1JELCBXT1JEICosIFdPUkQgKik7CgovKiBpbnQwOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQwOUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQwOVNlbmRTY2FuKEJZVEUgc2NhbixCWVRFIGFzY2lpKTsKZXh0ZXJuIEJZVEUgV0lOQVBJIERPU1ZNX0ludDA5UmVhZFNjYW4oQllURSphc2NpaSk7CgovKiBpbnQxMC5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxMEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9QdXRDaGFyKEJZVEUgYXNjaWkpOwoKLyogaW50MTEuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTFIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTIuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTJIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTMuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTNIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTUuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTVIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MWEuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MWFIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTYuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTZIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gQk9PTCBXSU5BUEkgRE9TVk1fSW50MTZSZWFkQ2hhciggQllURSAqLCBCWVRFICosIENPTlRFWFQ4NiAqICk7CmV4dGVybiBpbnQgV0lOQVBJIERPU1ZNX0ludDE2QWRkQ2hhcihCWVRFIGFzY2lpLEJZVEUgc2Nhbik7CgovKiBpbnQxNy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxN0hhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQxOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxOUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyMC5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyMEhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyMS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyMUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyNS5jICovCkJPT0wgRE9TVk1fUmF3UmVhZCggQllURSwgRFdPUkQsIERXT1JELCBCWVRFICosIEJPT0wgKTsKdm9pZCBXSU5BUEkgRE9TVk1fSW50MjVIYW5kbGVyKCBDT05URVhUODYgKiApOwoKLyogaW50MjYuYyAqLwpCT09MIERPU1ZNX1Jhd1dyaXRlKCBCWVRFLCBEV09SRCwgRFdPUkQsIEJZVEUgKiwgQk9PTCApOwp2b2lkIFdJTkFQSSBET1NWTV9JbnQyNkhhbmRsZXIoIENPTlRFWFQ4NiAqICk7CgovKiBpbnQyOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyOUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyYS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyYUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyZi5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyZkhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQzMS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzMUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9SYXdNb2RlU3dpdGNoSGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIEJPT0wgRE9TVk1fSXNEb3MzMih2b2lkKTsKZXh0ZXJuIEZBUlBST0MxNiBXSU5BUEkgRFBNSV9BbGxvY0ludGVybmFsUk1DQihSTUNCUFJPQyk7CmV4dGVybiB2b2lkIFdJTkFQSSBEUE1JX0ZyZWVJbnRlcm5hbFJNQ0IoRkFSUFJPQzE2KTsKZXh0ZXJuIGludCBEUE1JX0NhbGxSTVByb2MoQ09OVEVYVDg2KixMUFdPUkQsaW50LGludCk7CmV4dGVybiBCT09MIERPU1ZNX0NoZWNrV3JhcHBlcnMoQ09OVEVYVDg2Kik7CgovKiBpbnQzMy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzM0hhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzM01lc3NhZ2UoVUlOVCxXUEFSQU0sTFBBUkFNKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDMzQ29uc29sZShNT1VTRV9FVkVOVF9SRUNPUkQqKTsKCi8qIGludDQxLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDQxSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDRiLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDRiSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDVjLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDVjSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDY3LmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDY3SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIEVNU19Jb2N0bF9IYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50ZXJydXB0cy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9DYWxsQnVpbHRpbkhhbmRsZXIoIENPTlRFWFQ4NiAqLCBCWVRFICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9FbXVsYXRlSW50ZXJydXB0UE0oIENPTlRFWFQ4NiAqLCBCWVRFICk7CmV4dGVybiBCT09MIFdJTkFQSSBET1NWTV9FbXVsYXRlSW50ZXJydXB0Uk0oIENPTlRFWFQ4NiAqLCBCWVRFICk7CmV4dGVybiBGQVJQUk9DMTYgICBET1NWTV9HZXRQTUhhbmRsZXIxNiggQllURSApOwpleHRlcm4gRkFSUFJPQzQ4ICAgRE9TVk1fR2V0UE1IYW5kbGVyNDgoIEJZVEUgKTsKZXh0ZXJuIEZBUlBST0MxNiAgIERPU1ZNX0dldFJNSGFuZGxlciggQllURSApOwpleHRlcm4gdm9pZCAgICAgICAgRE9TVk1fSGFyZHdhcmVJbnRlcnJ1cHRQTSggQ09OVEVYVDg2ICosIEJZVEUgKTsKZXh0ZXJuIHZvaWQgICAgICAgIERPU1ZNX0hhcmR3YXJlSW50ZXJydXB0Uk0oIENPTlRFWFQ4NiAqLCBCWVRFICk7CmV4dGVybiB2b2lkICAgICAgICBET1NWTV9TZXRQTUhhbmRsZXIxNiggQllURSwgRkFSUFJPQzE2ICk7CmV4dGVybiB2b2lkICAgICAgICBET1NWTV9TZXRQTUhhbmRsZXI0OCggQllURSwgRkFSUFJPQzQ4ICk7CmV4dGVybiB2b2lkICAgICAgICBET1NWTV9TZXRSTUhhbmRsZXIoIEJZVEUsIEZBUlBST0MxNiApOwoKLyogcmVsYXkuYyAqLwp2b2lkIERPU1ZNX1JlbGF5SGFuZGxlciggQ09OVEVYVDg2ICogKTsKdm9pZCBET1NWTV9TYXZlQ2FsbEZyYW1lKCBDT05URVhUODYgKiwgc3RydWN0IF9TVEFDSzE2RlJBTUUgKiApOwp2b2lkIERPU1ZNX1Jlc3RvcmVDYWxsRnJhbWUoIENPTlRFWFQ4NiAqLCBzdHJ1Y3QgX1NUQUNLMTZGUkFNRSAqICk7CnZvaWQgRE9TVk1fQnVpbGRDYWxsRnJhbWUoIENPTlRFWFQ4NiAqLCBET1NSRUxBWSwgTFBWT0lEICk7CgovKiBzb3VuZGJsYXN0ZXIuYyAqLwpleHRlcm4gdm9pZCBTQl9pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICk7CmV4dGVybiBCWVRFIFNCX2lvcG9ydF9pbiggV09SRCBwb3J0ICk7CgovKiB0aW1lci5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQwOEhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiB4bXMuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgWE1TX0hhbmRsZXIoQ09OVEVYVDg2Kik7CgojZW5kaWYgLyogX19XSU5FX0RPU0VYRV9IICovCg==