LyoKICogQ29weXJpZ2h0IDIwMDIgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaWZuZGVmIF9fTVNSTEUzMl9QUklWQVRFX0gKI2RlZmluZSBfX01TUkxFMzJfUFJJVkFURV9ICgojaWZuZGVmIFJDX0lOVk9LRUQKI2luY2x1ZGUgPHN0ZGFyZy5oPgojZW5kaWYKCiNkZWZpbmUgQ09NX05PX1dJTkRPV1NfSAojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJtbXN5c3RlbS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ2ZncuaCIKCiNkZWZpbmUgSURTX05BTUUgICAgICAgIDEwMAojZGVmaW5lIElEU19ERVNDUklQVElPTiAxMDEKI2RlZmluZSBJRFNfQUJPVVQgICAgICAgMTAyCgojZGVmaW5lIE1TUkxFMzJfVkVSU0lPTiAgMHgwMDAxMDAwMCAvKiBWZXJzaW9uIDEuMCBidWlsZCAwICovCiNkZWZpbmUgTVNSTEUzMl9ERUZBVUxUUVVBTElUWSAoNzUgKiBJQ1FVQUxJVFlfSElHSCkgLyAxMDAKCiNkZWZpbmUgRk9VUkNDX1JMRSAgIG1taW9GT1VSQ0MoJ1InLCdMJywnRScsJyAnKQojZGVmaW5lIEZPVVJDQ19STEU0ICBtbWlvRk9VUkNDKCdSJywnTCcsJ0UnLCc0JykKI2RlZmluZSBGT1VSQ0NfUkxFOCAgbW1pb0ZPVVJDQygnUicsJ0wnLCdFJywnOCcpCiNkZWZpbmUgRk9VUkNDX01STEUgIG1taW9GT1VSQ0MoJ00nLCdSJywnTCcsJ0UnKQoKI2RlZmluZSBXSURUSEJZVEVTKGkpICAgICAoKFdPUkQpKChpKzMxdSkmKH4zMXUpKS84dSkgLyogVUxPTkcgYWxpZ25lZCAhICovCiNkZWZpbmUgRElCV0lEVEhCWVRFUyhiaSkgV0lEVEhCWVRFUygoV09SRCkoYmkpLmJpV2lkdGggKiAoV09SRCkoYmkpLmJpQml0Q291bnQpCgp0eXBlZGVmIHN0cnVjdCBfQ29kZWNJbmZvIHsKICBGT1VSQ0MgIGZjY0hhbmRsZXI7CiAgRFdPUkQgICBkd1F1YWxpdHk7CgogIEJPT0wgICAgYkNvbXByZXNzOwogIExPTkcgICAgblByZXZGcmFtZTsKICBMUFdPUkQgIHBQcmV2RnJhbWU7CiAgTFBXT1JEICBwQ3VyRnJhbWU7CgogIEJPT0wgICAgYkRlY29tcHJlc3M7CiAgTFBCWVRFICBwYWxldHRlX21hcDsKfSBDb2RlY0luZm87Cgp0eXBlZGVmIGNvbnN0IEJJVE1BUElORk9IRUFERVIgKiBMUENCSVRNQVBJTkZPSEVBREVSOwoKI2VuZGlmCg==