LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8bWFsbG9jLmg+CgojaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKCiNpbmNsdWRlICJkb3MuaCIKI2luY2x1ZGUgImZkb3MuaCIKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGZhdF9kZWNvZGUgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KdW5zaWduZWQgaW50IGZhdF9kZWNvZGUgKEZzX3QgKmZzLCB1bnNpZ25lZCBpbnQgbnVtKQp7CiAgICB1bnNpZ25lZCBpbnQgc3RhcnQgPSBudW0gKiAzIC8gMjsKICAgIHVuc2lnbmVkIGNoYXIgKmFkZHJlc3MgPSBmcyAtPiBmYXRfYnVmICsgc3RhcnQ7CgogICAgaWYgKG51bSA8IDIgfHwgc3RhcnQgKyAxID4gKGZzIC0+IGZhdF9sZW4gKiBTWl9TVERfU0VDVE9SKSkKCXJldHVybiAxOwoKICAgIGlmIChudW0gJiAxKQoJcmV0dXJuICgoYWRkcmVzcyBbMV0gJiAweGZmKSA8PCA0KSB8ICgoYWRkcmVzcyBbMF0gJiAweGYwICkgPj4gNCk7CiAgICBlbHNlCglyZXR1cm4gKChhZGRyZXNzIFsxXSAmIDB4ZikgPDwgOCkgfCAoYWRkcmVzcyBbMF0gJiAweGZmICk7Cn0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBjaGVja19mYXQgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIGludCBjaGVja19mYXQgKEZzX3QgKmZzKQp7CiAgICBpbnQgaSwgZjsKCiAgICAvKiBDbHVzdGVyIHZlcmlmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGZvciAoaSA9IDMgOyBpIDwgZnMgLT4gbnVtX2NsdXM7IGkrKyl7CglmID0gZmF0X2RlY29kZSAoZnMsIGkpOwoJaWYgKGYgPCBGQVQxMl9MQVNUICYmIGYgPiBmcyAtPiBudW1fY2x1cyl7CgkgICAgLyogV3JvbmcgY2x1c3RlciBudW1iZXIgZGV0ZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJICAgIHJldHVybiAoLTEpOwoJfQogICAgfQogICAgcmV0dXJuICgwKTsKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHJlYWRfb25lX2ZhdCAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgaW50IHJlYWRfb25lX2ZhdCAoQm9vdFNlY3Rvcl90ICpib290LCBGc190ICpmcywgaW50IG5mYXQpCnsKICAgIGlmIChkZXZfcmVhZCAoZnMgLT4gZmF0X2J1ZiwKCQkgIChmcyAtPiBmYXRfc3RhcnQgKyBuZmF0ICogZnMgLT4gZmF0X2xlbiksCgkJICBmcyAtPiBmYXRfbGVuKSA8IDApIHsKCXJldHVybiAoLTEpOwogICAgfQoKICAgIGlmIChmcyAtPiBmYXRfYnVmIFswXSB8fCBmcyAtPiBmYXRfYnVmIFsxXSB8fCBmcyAtPiBmYXRfYnVmIFsyXSkgewoJaWYgKChmcyAtPiBmYXRfYnVmIFswXSAhPSBib290IC0+IGRlc2NyICYmCgkgICAgIChmcyAtPiBmYXRfYnVmIFswXSAhPSAweGY5IHx8IGJvb3QgLT4gZGVzY3IgIT0gTUVESUFfU1REKSkgfHwKCSAgICBmcyAtPiBmYXRfYnVmIFswXSA8IE1FRElBX1NURCl7CgkgICAgLyogVW5rbm93biBNZWRpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJICAgIHJldHVybiAoLTEpOwoJfQoJaWYgKGZzIC0+IGZhdF9idWYgWzFdICE9IDB4ZmYgfHwgZnMgLT4gZmF0X2J1ZiBbMl0gIT0gMHhmZil7CgkgICAgLyogRkFUIGRvZXNuJ3Qgc3RhcnQgd2l0aCBnb29kIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJICAgIHJldHVybiAoLTEpOwoJfQogICAgfQoKICAgIGlmIChmcyAtPiBudW1fY2x1cyA+PSBGQVQxMl9NQVhfTkIpIHsKCS8qIFRvbyBtdWNoIGNsdXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglyZXR1cm4gKC0xKTsKICAgIH0KCiAgICByZXR1cm4gY2hlY2tfZmF0IChmcyk7Cn0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiByZWFkX2ZhdCAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwppbnQgcmVhZF9mYXQgKEJvb3RTZWN0b3JfdCAqYm9vdCwgRnNfdCAqZnMpCnsKICAgIHVuc2lnbmVkIGludCBidWZsZW47CiAgICBpbnQgaTsKCiAgICAvKiBBbGxvY2F0ZSBGYXQgQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGJ1ZmxlbiA9IGZzIC0+IGZhdF9sZW4gKiBTWl9TVERfU0VDVE9SOwogICAgaWYgKGZzIC0+IGZhdF9idWYpIHsKCWZyZWUgKGZzIC0+IGZhdF9idWYpOwogICAgfQoKICAgIGlmICgoZnMgLT4gZmF0X2J1ZiA9IG1hbGxvYyAoYnVmbGVuKSkgPT0gTlVMTCkgewoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgLyogVHJ5IHRvIHJlYWQgZWFjaCBGYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBmb3IgKGkgPSAwOyBpPCBmcyAtPiBuYl9mYXQ7IGkrKyl7CglpZiAocmVhZF9vbmVfZmF0IChib290LCBmcywgaSkgPT0gMCkgewoJICAgIC8qIEZhdCBpcyBPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCSAgICBmcyAtPiBudW1fZmF0ID0gaTsKCSAgICBicmVhazsKCX0KICAgIH0KCiAgICBpZiAoaSA9PSBmcyAtPiBuYl9mYXQpewoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgaWYgKGZzIC0+IGZhdF9sZW4gPiAoKChmcyAtPiBudW1fY2x1cyArIDIpICoKCQkJICAoRkFUX0JJVFMgLyA0KSAtMSApIC8gMiAvCgkJCSBTWl9TVERfU0VDVE9SICsgMSkpIHsKCXJldHVybiAoLTEpOwogICAgfQogICAgcmV0dXJuICgwKTsKfQoKI2VuZGlmCg==