LyoKICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wY2kuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgojaW5jbHVkZSA8YXNtL2ljL3BjaS5oPgojaW5jbHVkZSA8YWxpNTEyeC5oPgojaW5jbHVkZSA8c3BpLmg+CiNpbmNsdWRlIDxuZXRkZXYuaD4KCkRFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoKI3VuZGVmIFNDNTIwX0NEUF9ERUJVRwoKI2lmZGVmCVNDNTIwX0NEUF9ERUJVRwojZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKI2Vsc2UKI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCiNlbmRpZgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCi8qCiAqIFRoZW9yeToKICogV2UgZmlyc3Qgc2V0IHVwIGFsbCBJUlFzIHRvIGJlIG5vbi1wY2ksIGVkZ2UgdHJpZ2dlcmVkLAogKiB3aGVuIHdlIGxhdGVyIGVudW1lcmF0ZSB0aGUgcGNpIGJ1cyBhbmQgcGNpX3NjNTIwX2ZpeHVwX2lycSgpIGdldHMKICogY2FsbGVkIHdlIHJlYWxsb2NhdGUgaXJxcyB0byB0aGUgcGNpIGJ1cyB3aXRoIHNjNTIwX3BjaV9zZXRfaXJxKCkKICogYXMgbmVlZGVkLiBXaGUgY2hvb3NlIHRoZSBpcnFzIHRvIGdyYW0gZnJvbSBhIGNvbmZpZ3VyYWJsZSBsaXN0CiAqIGluc2lkZSBwY2lfc2M1MjBfZml4dXBfaXJxKCkgKElmIHRoaXMgbGlzdCBjb250YWlucyBzdHVwaWQgaXJxJ3MKICogc3VjaCBhcyAwIHRobmdhcyB3aWxsIG5vdCB3b3JrKQogKi8KCnN0YXRpYyB2b2lkIGlycV9pbml0KHZvaWQpCnsKCS8qIGRpc2FibGUgZ2xvYmFsIGludGVycnVwdCBtb2RlICovCglzYzUyMF9tbWNyLT5waWNpY3IgPSAweDQwOwoKCS8qIHNldCBhbGwgaXJxcyB0byBlZGdlICovCglzYzUyMF9tbWNyLT5waWNfbW9kZVswXSA9IDB4MDA7CglzYzUyMF9tbWNyLT5waWNfbW9kZVsxXSA9IDB4MDA7CglzYzUyMF9tbWNyLT5waWNfbW9kZVsyXSA9IDB4MDA7CgoJLyogYWN0aXZlIGxvdyBwb2xhcml0eSBvbiBQSUMgaW50ZXJydXB0IHBpbnMsCgkgKiAgYWN0aXZlIGhpZ2ggcG9sYXJpdHkgb24gYWxsIG90aGVyIGlycSBwaW5zICovCglzYzUyMF9tbWNyLT5pbnRwaW5wb2wgPSAweDAwMDA7CgoJLyogc2V0IGlycSBudW1iZXIgbWFwcGluZyAqLwoJc2M1MjBfbW1jci0+Z3BfdG1yX2ludF9tYXBbMF0gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgR1AgdGltZXIgMCBJTlQgKi8KCXNjNTIwX21tY3ItPmdwX3Rtcl9pbnRfbWFwWzFdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIEdQIHRpbWVyIDEgSU5UICovCglzYzUyMF9tbWNyLT5ncF90bXJfaW50X21hcFsyXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBHUCB0aW1lciAyIElOVCAqLwoJc2M1MjBfbW1jci0+cGl0X2ludF9tYXBbMF0gPSBTQzUyMF9JUlEwOwkJLyogU2V0IFBJVCB0aW1lciAwIElOVCB0byBJUlEwICovCglzYzUyMF9tbWNyLT5waXRfaW50X21hcFsxXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBQSVQgdGltZXIgMSBJTlQgKi8KCXNjNTIwX21tY3ItPnBpdF9pbnRfbWFwWzJdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIFBJVCB0aW1lciAyIElOVCAqLwoJc2M1MjBfbW1jci0+cGNpX2ludF9tYXBbMF0gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgUENJIElOVCBBICovCglzYzUyMF9tbWNyLT5wY2lfaW50X21hcFsxXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBQQ0kgSU5UIEIgKi8KCXNjNTIwX21tY3ItPnBjaV9pbnRfbWFwWzJdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIFBDSSBJTlQgQyAqLwoJc2M1MjBfbW1jci0+cGNpX2ludF9tYXBbM10gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgUENJIElOVCBEICovCglzYzUyMF9tbWNyLT5kbWFiY2ludG1hcCA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJCS8qIGRpc2FibGUgRE1BIElOVCAqLwoJc2M1MjBfbW1jci0+c3NpbWFwID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkJLyogZGlzYWJsZSBTeW5jaHJvbml1cyBzZXJpYWwgSU5UICovCglzYzUyMF9tbWNyLT53ZHRtYXAgPSBTQzUyMF9JUlFfRElTQUJMRUQ7CQkvKiBkaXNhYmxlIFdhdGNoZG9nIElOVCAqLwoJc2M1MjBfbW1jci0+cnRjbWFwID0gU0M1MjBfSVJRODsJCQkvKiBTZXQgUlRDIGludCB0byA4ICovCglzYzUyMF9tbWNyLT53cHZtYXAgPSBTQzUyMF9JUlFfRElTQUJMRUQ7CQkvKiBkaXNhYmxlIHdyaXRlIHByb3RlY3QgSU5UICovCglzYzUyMF9tbWNyLT5pY2VtYXAgPSBTQzUyMF9JUlExOwkJCS8qIFNldCBJQ0UgRGVidWcgU2VyaWVscG9ydCBJTlQgdG8gSVJRMSAqLwoJc2M1MjBfbW1jci0+ZmVycm1hcCA9IFNDNTIwX0lSUTEzOyAJCQkvKiBTZXQgRlAgZXJyb3IgSU5UIHRvIElSUTEzICovCgoJaWYgKENPTkZJR19TWVNfVVNFX1NJT19VQVJUKSB7CgkJc2M1MjBfbW1jci0+dWFydF9pbnRfbWFwWzBdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIGludGVybmFsIFVBUlQxIElOVCAqLwoJCXNjNTIwX21tY3ItPnVhcnRfaW50X21hcFsxXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBpbnRlcm5hbCBVQVJUMiBJTlQgKi8KCQlzYzUyMF9tbWNyLT5ncF9pbnRfbWFwWzNdID0gU0M1MjBfSVJRMzsJCS8qIFNldCBHUElSUTMgKElTQSBJUlEzKSB0byBJUlEzICovCgkJc2M1MjBfbW1jci0+Z3BfaW50X21hcFs0XSA9IFNDNTIwX0lSUTQ7CQkvKiBTZXQgR1BJUlE0IChJU0EgSVJRNCkgdG8gSVJRNCAqLwoJfSBlbHNlIHsKCQlzYzUyMF9tbWNyLT51YXJ0X2ludF9tYXBbMF0gPSBTQzUyMF9JUlE0OwkJLyogU2V0IGludGVybmFsIFVBUlQyIElOVCB0byBJUlE0ICovCgkJc2M1MjBfbW1jci0+dWFydF9pbnRfbWFwWzFdID0gU0M1MjBfSVJRMzsJCS8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRMyAqLwoJCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbM10gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgR1BJUlEzIChJU0EgSVJRMykgKi8KCQlzYzUyMF9tbWNyLT5ncF9pbnRfbWFwWzRdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIEdQSVJRNCAoSVNBIElSUTQpICovCgl9CgoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFsxXSA9IFNDNTIwX0lSUTE7CQkJLyogU2V0IEdQSVJRMSAoU0lPIElSUTEpIHRvIElSUTEgKi8KCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbNV0gPSBTQzUyMF9JUlE1OwkJCS8qIFNldCBHUElSUTUgKElTQSBJUlE1KSB0byBJUlE1ICovCglzYzUyMF9tbWNyLT5ncF9pbnRfbWFwWzZdID0gU0M1MjBfSVJRNjsJCQkvKiBTZXQgR1BJUlE2IChJU0EgSVJRNikgdG8gSVJRNiAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFs3XSA9IFNDNTIwX0lSUTc7CQkJLyogU2V0IEdQSVJRNyAoSVNBIElSUTcpIHRvIElSUTcgKi8KCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbOF0gPSBTQzUyMF9JUlE4OwkJCS8qIFNldCBHUElSUTggKFNJTyBJUlE4KSB0byBJUlE4ICovCglzYzUyMF9tbWNyLT5ncF9pbnRfbWFwWzldID0gU0M1MjBfSVJROTsJCQkvKiBTZXQgR1BJUlE5IChJU0EgSVJRMikgdG8gSVJROSAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFswXSA9IFNDNTIwX0lSUTExOwkJLyogU2V0IEdQSVJRMCAoSVNBIElSUTExKSB0byBJUlExMCAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFsyXSA9IFNDNTIwX0lSUTEyOwkJLyogU2V0IEdQSVJRMiAoSVNBIElSUTEyKSB0byBJUlExMiAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFsxMF0gPSBTQzUyMF9JUlExNDsJCS8qIFNldCBHUElSUTEwIChJU0EgSVJRMTQpIHRvIElSUTE0ICovCgoJc2M1MjBfbW1jci0+cGNpaG9zdG1hcCA9IDB4MTFmOwkJCQkvKiBNYXAgUENJIGhvc3RicmlkZ2UgSU5UIHRvIE5NSSAqLwoJc2M1MjBfbW1jci0+ZWNjbWFwID0gMHgxMDA7CQkJCS8qIE1hcCBTRFJBTSBFQ0MgZmFpbHVyZSBJTlQgdG8gTk1JICovCn0KCiNpZmRlZiBDT05GSUdfUENJCi8qIFBDSSBzdHVmZiAqLwpzdGF0aWMgdm9pZCBwY2lfc2M1MjBfY2RwX2ZpeHVwX2lycShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYpCnsKCS8qIGEgY29uZmlndXJhYmxlIGxpc3RzIG9mIGlycXMgdG8gc3RlYWwKCSAqIHdoZW4gd2UgbmVlZCBvbmUgKGEgYm9hcmQgd2l0aCBtb3JlIHBjaSBpbnRlcnJ1cHQgcGlucwoJICogd291bGQgdXNlIGEgbGFyZ2VyIHRhYmxlICovCglzdGF0aWMgaW50IGlycV9saXN0W10gPSB7CgkJQ09ORklHX1NZU19GSVJTVF9QQ0lfSVJRLAoJCUNPTkZJR19TWVNfU0VDT05EX1BDSV9JUlEsCgkJQ09ORklHX1NZU19USElSRF9QQ0lfSVJRLAoJCUNPTkZJR19TWVNfRk9SVEhfUENJX0lSUQoJfTsKCXN0YXRpYyBpbnQgbmV4dF9pcnFfaW5kZXg9MDsKCgl1Y2hhciB0bXBfcGluOwoJaW50IHBpbjsKCglwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZ0bXBfcGluKTsKCXBpbiA9IHRtcF9waW47CgoJcGluLT0xOyAvKiBwY2kgY29uZmlnIHNwYWNlIHVzZSAxLWJhc2VkIG51bWJlcmluZyAqLwoJaWYgKC0xID09IHBpbikgewoJCXJldHVybjsgLyogZGV2aWNlIHVzZSBubyBpcnEgKi8KCX0KCgoJLyogbWFwIGRldmljZSBudW1iZXIgKyAgcGluIHRvIGEgcGluIG9uIHRoZSBzYzUyMCAqLwoJc3dpdGNoIChQQ0lfREVWKGRldikpIHsKCWNhc2UgMjA6CgkJcGluKz1TQzUyMF9QQ0lfSU5UQTsKCQlicmVhazsKCgljYXNlIDE5OgoJCXBpbis9U0M1MjBfUENJX0lOVEI7CgkJYnJlYWs7CgoJY2FzZSAxODoKCQlwaW4rPVNDNTIwX1BDSV9JTlRDOwoJCWJyZWFrOwoKCWNhc2UgMTc6CgkJcGluKz1TQzUyMF9QQ0lfSU5URDsKCQlicmVhazsKCglkZWZhdWx0OgoJCXJldHVybjsKCX0KCglwaW4mPTM7IC8qIHdyYXAgYXJvdW5kICovCgoJaWYgKHNjNTIwX3BjaV9pbnRzW3Bpbl0gPT0gLTEpIHsKCQkvKiByZS1yb3V0ZSBvbmUgaW50ZXJydXB0IGZvciB1cyAqLwoJCWlmIChuZXh0X2lycV9pbmRleCA+IDMpIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAocGNpX3NjNTIwX3NldF9pcnEocGluLCBpcnFfbGlzdFtuZXh0X2lycV9pbmRleF0pKSB7CgkJCXJldHVybjsKCQl9CgkJbmV4dF9pcnFfaW5kZXgrKzsKCX0KCgoJaWYgKC0xICE9IHNjNTIwX3BjaV9pbnRzW3Bpbl0pIHsKCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwKCQkJCQkgICBzYzUyMF9wY2lfaW50c1twaW5dKTsKCX0KCVBSSU5URigiZml4dXBfaXJxOiBkZXZpY2UgJWQgcGluICVjIGlycSAlZFxuIiwKCSAgICAgICBQQ0lfREVWKGRldiksICdBJyArIHBpbiwgc2M1MjBfcGNpX2ludHNbcGluXSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgc2M1MjBfY2RwX2hvc2UgPSB7CglmaXh1cF9pcnE6IHBjaV9zYzUyMF9jZHBfZml4dXBfaXJxLAp9OwoKdm9pZCBwY2lfaW5pdF9ib2FyZCh2b2lkKQp7CglwY2lfc2M1MjBfaW5pdCgmc2M1MjBfY2RwX2hvc2UpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgc2lsZW5jZV91YXJ0KGludCBwb3J0KQp7CglvdXRiKDAsIHBvcnQrMSk7Cn0KCnZvaWQgc2V0dXBfYWxpX3NpbyhpbnQgdWFydF9wcmltYXJ5KQp7CglhbGk1MTJ4X2luaXQoKTsKCglhbGk1MTJ4X3NldF9mZGMoQUxJX0VOQUJMRUQsIDB4M2YyLCA2LCAwKTsKCWFsaTUxMnhfc2V0X3BwKEFMSV9FTkFCTEVELCAweDI3OCwgNywgMyk7CglhbGk1MTJ4X3NldF91YXJ0KEFMSV9FTkFCTEVELCBBTElfVUFSVDEsIHVhcnRfcHJpbWFyeT8weDNmODoweDNlOCwgNCk7CglhbGk1MTJ4X3NldF91YXJ0KEFMSV9FTkFCTEVELCBBTElfVUFSVDIsIHVhcnRfcHJpbWFyeT8weDJmODoweDJlOCwgMyk7CglhbGk1MTJ4X3NldF9ydGMoQUxJX0RJU0FCTEVELCAwLCAwKTsKCWFsaTUxMnhfc2V0X2tiYyhBTElfRU5BQkxFRCwgMSwgMTIpOwoJYWxpNTEyeF9zZXRfY2lvKEFMSV9FTkFCTEVEKTsKCgkvKiBJckRhIHBpbnMgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDEyLCAxLCAwLCAwKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDEzLCAxLCAwLCAwKTsKCgkvKiBTU0kgY2hpcCBzZWxlY3QgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTQsIDAsIDAsIDApOyAgLyogU1NJX0NTICovCglhbGk1MTJ4X2Npb19mdW5jdGlvbigxNSwgMCwgMCwgMCk7ICAvKiBTU0lfTVYgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDE2LCAwLCAwLCAwKTsgIC8qIFNTSV9TUEkjICovCgoJLyogQm9hcmQgUkVWIHBpbnMgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIwLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIxLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIyLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIzLCAwLCAwLCAxKTsKfQoKCi8qIHNldCB1cCB0aGUgSVNBIGJ1cyB0aW1pbmcgYW5kIHN5c3RlbSBhZGRyZXNzIG1hcHBpbmdzICovCnN0YXRpYyB2b2lkIGJ1c19pbml0KHZvaWQpCnsKCgkvKiBzZXQgdXAgdGhlIEdQIElPIHBpbnMgKi8KCXNjNTIwX21tY3ItPnBpb3BmczMxXzE2ID0gMHhmN2ZmOwkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDMxLTE2IHJlZyAqLwoJc2M1MjBfbW1jci0+cGlvcGZzMTVfMCA9IDB4ZmZmZjsJLyogc2V0IHRoZSBHUElPIHBpbiBmdW5jdGlvbiAxNS0wIHJlZyAqLwoJc2M1MjBfbW1jci0+Y3NwZnMgPSAweGY4OwkJLyogc2V0IHRoZSBDUyBwaW4gZnVuY3Rpb24gIHJlZyAqLwoJc2M1MjBfbW1jci0+Y2xrc2VsID0gMHg3MDsKCglzYzUyMF9tbWNyLT5ncGNzcnQgPSAxOyAgIAkJLyogc2V0IHRoZSBHUCBDUyBvZmZzZXQgKi8KCXNjNTIwX21tY3ItPmdwY3NwdyA9IDM7ICAgCQkvKiBzZXQgdGhlIEdQIENTIHB1bHNlIHdpZHRoICovCglzYzUyMF9tbWNyLT5ncGNzb2ZmID0gMTsgIAkJLyogc2V0IHRoZSBHUCBDUyBvZmZzZXQgKi8KCXNjNTIwX21tY3ItPmdwcmR3ID0gMzsgICAgCQkvKiBzZXQgdGhlIFJEIHB1bHNlIHdpZHRoICovCglzYzUyMF9tbWNyLT5ncHJkb2ZmID0gMTsgIAkJLyogc2V0IHRoZSBHUCBSRCBvZmZzZXQgKi8KCXNjNTIwX21tY3ItPmdwd3J3ID0gMzsgICAJCSAvKiBzZXQgdGhlIEdQIFdSIHB1bHNlIHdpZHRoICovCglzYzUyMF9tbWNyLT5ncHdyb2ZmID0gMTsgCQkgLyogc2V0IHRoZSBHUCBXUiBvZmZzZXQgKi8KCglzYzUyMF9tbWNyLT5ib290Y3NjdGwgPSAweDE4MjM7CQkvKiBzZXQgdXAgdGltaW5nIG9mIEJPT1RDUyAqLwoJc2M1MjBfbW1jci0+cm9tY3MxY3RsID0gMHgxODIzOwkJLyogc2V0IHVwIHRpbWluZyBvZiBST01DUzEgKi8KCXNjNTIwX21tY3ItPnJvbWNzMmN0bCA9IDB4MTgyMzsJCS8qIHNldCB1cCB0aW1pbmcgb2YgUk9NQ1MyICovCgoJLyogYWRqdXN0IHRoZSBtZW1vcnkgbWFwOgoJICogYnkgZGVmYXVsdCB0aGUgZmlyc3QgMjU2TUIgKDB4MDAwMDAwMDAgLSAweDBmZmZmZmZmKSBpcyBtYXBwZWQgdG8gU0RSQU0KCSAqIGFuZCAyNTZNQiB0byAxRy0xMjhrICAoMHgxMDAwMDAwIC0gMHgzN2ZmZmZmZikgaXMgbWFwcGVkIHRvIFBDSSBtbWlvCgkgKiB3ZSBuZWVkIHRvIG1hcCAxRy0xMjhrIC0gMUcgKDB4MzgwMDAwMDAgLSAweDNmZmZmZmZmKSB0byBDUzEgKi8KCgoJLyogU1JBTSA9IEdQQ1MzIDEyOGsgQCBkMDAwMC1lZmZmZiovCglzYzUyMF9tbWNyLT5wYXJbMl0gPSAweDRlMDA0MDBkOwoKCS8qIElERTAgPSBHUENTNiAxZjAtMWY3ICovCglzYzUyMF9tbWNyLT5wYXJbM10gPSAweDM4MDgwMWYwOwoKCS8qIElERTEgPSBHUENTNyAzZjYgKi8KCXNjNTIwX21tY3ItPnBhcls0XSA9IDB4M2MwMDAzZjY7CgkvKiBib290Y3MgKi8KCXNjNTIwX21tY3ItPnBhclsxMl0gPSAweDhiZmZlODAwOwoJLyogcm9tY3MyICovCglzYzUyMF9tbWNyLT5wYXJbMTNdID0gMHhjYmZmZjAwMDsKCS8qIHJvbWNzMSAqLwoJc2M1MjBfbW1jci0+cGFyWzE0XSA9IDB4YWJmZmY4MDA7CgkvKiA2ODAgTEVEUyAqLwoJc2M1MjBfbW1jci0+cGFyWzE1XSA9IDB4MzAwMDA2NDA7CgoJc2M1MjBfbW1jci0+YWRkZGVjY3RsID0gMDsKCglhc20gKCJ3YmludmRcbiIpOyAvKiBGbHVzaCBjYWNoZSwgcmVxLiBhZnRlciBzZXR0aW5nIHRoZSB1bmNoYWNoZWQgYXR0cmlidXRlIG9uYSBQQVIgKi8KCglpZiAoQ09ORklHX1NZU19VU0VfU0lPX1VBUlQpIHsKCQlzYzUyMF9tbWNyLT5hZGRkZWNjdGwgPSBzYzUyMF9tbWNyLT5hZGRkZWNjdGwgfCBVQVJUMl9ESVMgfCBVQVJUMV9ESVM7CgkJc2V0dXBfYWxpX3NpbygxKTsKCX0gZWxzZSB7CgkJc2M1MjBfbW1jci0+YWRkZGVjY3RsID0gc2M1MjBfbW1jci0+YWRkZGVjY3RsICYgfihVQVJUMl9ESVN8VUFSVDFfRElTKTsKCQlzZXR1cF9hbGlfc2lvKDApOwoJCXNpbGVuY2VfdWFydCgweDNlOCk7CgkJc2lsZW5jZV91YXJ0KDB4MmU4KTsKCX0KCn0KCi8qIEdQQ1MgdXNhZ2UKICogR1BDUzAgICAgICAgUElPMjcgKE5NSSkKICogR1BDUzEgICAgICAgUk9NQ1MxCiAqIEdQQ1MyICAgICAgIFJPTUNTMgogKiBHUENTMyAgICAgICBTUkFNQ1MgICAgICAgUEFSMgogKiBHUENTNCAgICAgICB1bnVzZWQgICAgICAgUEFSMwogKiBHUENTNSAgICAgICB1bnVzZWQgICAgICAgUEFSNAogKiBHUENTNiAgICAgICBJREUKICogR1BDUzcgICAgICAgSURFCiAqLwoKCi8qIHBhciB1c2FnZToKICogUEFSMCAgIGxlZ2FjeV92aWRlbwogKiBQQVIxICAgUENJIFJPTSBtYXBwaW5nCiAqIFBBUjIgICBTUkFNCiAqIFBBUjMgICBJREUKICogUEFSNCAgIElERQogKiBQQVI1ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjYgICBsZWdhY3lfdmlkZW8KICogUEFSNyAgIGxlZ2FjeV92aWRlbwogKiBQQVI4ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjkgICBsZWdhY3lfdmlkZW8KICogUEFSMTAgIGxlZ2FjeV92aWRlbwogKiBQQVIxMSAgSVNBUk9NCiAqIFBBUjEyICBCT09UQ1MKICogUEFSMTMgIFJPTUNTMQogKiBQQVIxNCAgUk9NQ1MyCiAqIFBBUjE1ICBQb3J0IDB4NjgwIExFRCBkaXNwbGF5CiAqLwoKLyoKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbWFwIGEgY2h1bmsgb2Ygc2l6ZSBieXRlcwogKiBvZiB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UgdG8gdGhlIElTQSBidXMKICoKICogVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBtZW1vcnkgYWRkcmVzcwogKiBhcyBzZWVuIGJ5IHRoZSBob3N0ICh3aGljaCBtYXkgdmVyeSB3aWxsIGJlIHRoZQogKiBzYW1lIGFzIHRoZSBidXMgYWRkcmVzcykKICovCnUzMiBpc2FfbWFwX3JvbSh1MzIgYnVzX2FkZHIsIGludCBzaXplKQp7Cgl1MzIgcGFyOwoKCVBSSU5URigiaXNhX21hcF9yb20gYXNrZWQgdG8gbWFwICVkIGJ5dGVzIGF0ICV4XG4iLAoJICAgICAgIHNpemUsIGJ1c19hZGRyKTsKCglwYXIgPSBzaXplOwoJaWYgKHBhciA8IDB4ODAwMDApIHsKCQlwYXIgPSAweDgwMDAwOwoJfQoJcGFyID4+PSAxMjsKCXBhci0tOwoJcGFyJj0weDdmOwoJcGFyIDw8PSAxODsKCXBhciB8PSAoYnVzX2FkZHI+PjEyKTsKCXBhciB8PSAweDUwMDAwMDAwOwoKCVBSSU5URiAoInNldHRpbmcgUEFSMTEgdG8gJXhcbiIsIHBhcik7CgoJLyogTWFwIHJvbSAweDEwMDAwIHdpdGggUEFSMSAqLwoJc2M1MjBfbW1jci0+cGFyWzExXSA9IHBhcjsKCglyZXR1cm4gYnVzX2FkZHI7Cn0KCi8qCiAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlZCBhbnkgbWFwcGluZyBjcmVhdGVkCiAqIHdpdGggcGNpX2dldF9yb21fd2luZG93KCkKICovCnZvaWQgaXNhX3VubWFwX3JvbSh1MzIgYWRkcikKewoJUFJJTlRGKCJpc2FfdW5tYXBfcm9tIGFza2VkIHRvIHVubWFwICV4IiwgYWRkcik7CglpZiAoKGFkZHI+PjEyKSA9PSAoc2M1MjBfbW1jci0+cGFyWzExXSAmIDB4M2ZmZmYpKSB7CgkJc2M1MjBfbW1jci0+cGFyWzExXSA9IDA7CgkJUFJJTlRGKCIgZG9uZVxuIik7CgkJcmV0dXJuOwoJfQoJUFJJTlRGKCIgbm90IG91cnNcbiIpOwp9CgojaWZkZWYgQ09ORklHX1BDSQojZGVmaW5lIFBDSV9ST01fVEVNUF9TUEFDRSAweDEwMDAwCi8qCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG1hcCBhIGNodW5rIG9mIHNpemUgYnl0ZXMKICogb2YgdGhlIHN5c3RlbSBhZGRyZXNzIHNwYWNlIHRvIHRoZSBQQ0kgYnVzLAogKiBzdWl0YWJsZSB0byBtYXAgUENJIFJPTVMgKGJ1cyBhZGRyZXNzIDwgMTZNKQogKiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGhvc3QgbWVtb3J5IGFkZHJlc3MKICogd2hpY2ggc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIGEgYnVzIGFkZHJlc3MKICogYmVmb3JlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBQQ0kgcm9tIGFkZHJlc3MKICogZGVjb2RlcgogKi8KdTMyIHBjaV9nZXRfcm9tX3dpbmRvdyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBzaXplKQp7Cgl1MzIgcGFyOwoKCXBhciA9IHNpemU7CglpZiAocGFyIDwgMHg4MDAwMCkgewoJCXBhciA9IDB4ODAwMDA7Cgl9CglwYXIgPj49IDE2OwoJcGFyLS07CglwYXImPTB4N2ZmOwoJcGFyIDw8PSAxNDsKCXBhciB8PSAoUENJX1JPTV9URU1QX1NQQUNFPj4xNik7CglwYXIgfD0gMHg3MjAwMDAwMDsKCglQUklOVEYgKCJzZXR0aW5nIFBBUjEgdG8gJXhcbiIsIHBhcik7CgoJLyogTWFwIHJvbSAweDEwMDAwIHdpdGggUEFSMSAqLwoJc2M1MjBfbW1jci0+cGFyWzFdID0gcGFyOwoKCXJldHVybiBQQ0lfUk9NX1RFTVBfU1BBQ0U7Cn0KCi8qCiAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlZCBhbnkgbWFwcGluZyBjcmVhdGVkCiAqIHdpdGggcGNpX2dldF9yb21fd2luZG93KCkKICovCnZvaWQgcGNpX3JlbW92ZV9yb21fd2luZG93KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdTMyIGFkZHIpCnsKCVBSSU5URigicGNpX3JlbW92ZV9yb21fd2luZG93OiAleCIsIGFkZHIpOwoJaWYgKGFkZHIgPT0gUENJX1JPTV9URU1QX1NQQUNFKSB7CgkJc2M1MjBfbW1jci0+cGFyWzFdID0gMDsKCQlQUklOVEYoIiBkb25lXG4iKTsKCQlyZXR1cm47Cgl9CglQUklOVEYoIiBub3Qgb3Vyc1xuIik7Cgp9CgovKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBwcm92aWRlIGFjY2VzIHRvIHRoZQogKiBsZWdhY3kgdmlkZW8gSS9PIHBvcnRzIG9uIHRoZSBQQ0kgYnVzLgogKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGFjY2Vzc2VzIHRvIEkvTyBwb3J0cyAweDNiMC0weDNiYiBhbmQKICogMHgzYzAtMHgzZGYgc2h1bGQgcmVzdWx0IGluIHRyYW5zYWN0aW9ucyBvbiB0aGUgUENJIGJ1cy4KICoKICovCmludCBwY2lfZW5hYmxlX2xlZ2FjeV92aWRlb19wb3J0cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCnsKCS8qIE1hcCB2aWRlbyBtZW1vcnkgdG8gMHhhMDAwMCovCglzYzUyMF9tbWNyLT5wYXJbMF0gPSAweDcyMDA0MDBhOwoKCS8qIGZvcndhcmQgYWxsIEkvTyBhY2Nlc3NlcyB0byBQQ0kgKi8KCXNjNTIwX21tY3ItPmFkZGRlY2N0bCA9IHNjNTIwX21tY3ItPmFkZGRlY2N0bCB8IElPX0hPTEVfREVTVF9QQ0k7CgoKCS8qIHNvIHdlIG1hcCBhd2F5IGFsbCBpbyBwb3J0cyB0byBwY2kgKG9ubHkgd2F5IHRvIGFjY2VzcyBwY2kgaW8KCSAqIGJlbG93IDB4NDAwLiBCdXQgdGhlbiB3ZSBoYXZlIHRvIG1hcCBiYWNrIHRoZSBwb3J0aW9ucyB0aGF0IHdlIGRvbnQKCSAqIHVzZSBzbyB0aGF0IHRoZSBnZW5lcmF0ZSBjeWNsZXMgb24gdGhlIEdQSU8gYnVzIHdoZXJlIHRoZSBzaW8gYW5kCgkgKiBJU0Egc2xvdHMgYXJlIGNvbm5lY3RlZCwgdGhpcyByZXF1cmUgdGhlIHVzZSBvZiBzZXZlcmFsIFBBUiByZWdpc3RlcnMKCSAqLwoKCS8qIGJyaW5nIDB4MTAwIC0gMHgxZWYgYmFjayB0byBJU0EgdXNpbmcgUEFSNSAqLwoJc2M1MjBfbW1jci0+cGFyWzVdID0gMHgzMGVmMDEwMDsKCgkvKiBJREUgdXNlIDFmMC0xZjcgKi8KCgkvKiBicmluZyAweDFmOCAtIDB4MmY3IGJhY2sgdG8gSVNBIHVzaW5nIFBBUjYgKi8KCXNjNTIwX21tY3ItPnBhcls2XSA9IDB4MzBmZjAxZjg7CgoJLyogY29tMiB1c2UgMmY4LTJmZiAqLwoKCS8qIGJyaW5nIDB4MzAwIC0gMHgzYWYgYmFjayB0byBJU0EgdXNpbmcgUEFSNyAqLwoJc2M1MjBfbW1jci0+cGFyWzddID0gMHgzMGFmMDMwMDsKCgkvKiB2Z2EgdXNlIDNiMC0zYmIgKi8KCgkvKiBicmluZyAweDNiYyAtIDB4M2JmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjggKi8KCXNjNTIwX21tY3ItPnBhcls4XSA9IDB4MzAwMzAzYmM7CgoJLyogdmdhIHVzZSAzYzAtM2RmICovCgoJLyogYnJpbmcgMHgzZTAgLSAweDNmNSBiYWNrIHRvIElTQSB1c2luZyBQQVI5ICovCglzYzUyMF9tbWNyLT5wYXJbOV0gPSAweDMwMTUwM2UwOwoKCS8qIGlkZSB1c2UgM2Y2ICovCgoJLyogYnJpbmcgMHgzZjcgIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjEwICovCglzYzUyMF9tbWNyLT5wYXJbMTBdID0gMHgzMDAwMDNmNzsKCgkvKiBjb20xIHVzZSAzZjgtM2ZmICovCgoJcmV0dXJuIDA7Cn0KI2VuZGlmCgovKgogKiBNaXNjZWxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucwogKi8KCmludCBib2FyZF9pbml0KHZvaWQpCnsKCWluaXRfc2M1MjAoKTsKCWJ1c19pbml0KCk7CglpcnFfaW5pdCgpOwoKCS8qIG1heCBkcml2ZSBjdXJyZW50IG9uIFNEUkFNICovCglzYzUyMF9tbWNyLT5kc2N0bCA9IDB4MDEwMDsKCgkvKiBlbnRlciBkZWJ1ZyBtb2RlIGFmdGVyIG5leHQgcmVzZXQgKG9ubHkgaWYganVtcGVyIGlzIGFsc28gc2V0KSAqLwoJc2M1MjBfbW1jci0+cmVzY2ZnID0gMHgwODsKCS8qIGNvbmZpZ3VyZSB0aGUgc29mdHdhcmUgdGltZXIgdG8gMzMuMzMzTUh6ICovCglzYzUyMF9tbWNyLT5zd3RtcmNmZyA9IDA7CglnZC0+YnVzX2NsayA9IDMzMzMzMDAwOwoKCXJldHVybiAwOwp9CgppbnQgZHJhbV9pbml0KHZvaWQpCnsKCWluaXRfc2M1MjBfZHJhbSgpOwoJcmV0dXJuIDA7Cn0KCnZvaWQgc2hvd19ib290X3Byb2dyZXNzKGludCB2YWwpCnsKCWlmICh2YWwgPCAtMzIpIHZhbCA9IC0xOyAgLyogbGV0IHRoaW5ncyBjb21wYXRpYmxlICovCglvdXRiKHZhbCYweGZmLCAweDgwKTsKCW91dGIoKHZhbCYweGZmMDApPj44LCAweDY4MCk7Cn0KCgppbnQgbGFzdF9zdGFnZV9pbml0KHZvaWQpCnsKCWludCBtaW5vcjsKCWludCBtYWpvcjsKCgltYWpvciA9IG1pbm9yID0gMDsKCW1ham9yIHw9IGFsaTUxMnhfY2lvX2luKDIzKT8yOjA7CgltYWpvciB8PSBhbGk1MTJ4X2Npb19pbigyMik/MTowOwoJbWlub3IgfD0gYWxpNTEyeF9jaW9faW4oMjEpPzI6MDsKCW1pbm9yIHw9IGFsaTUxMnhfY2lvX2luKDIwKT8xOjA7CgoJcHJpbnRmKCJBTUQgU0M1MjAgQ0RQIHJldmlzaW9uICVkLiVkXG4iLCBtYWpvciwgbWlub3IpOwoKCXJldHVybiAwOwp9CgoKdm9pZCBzc2lfY2hpcF9zZWxlY3QoaW50IGRldikKewoKCS8qIFNwdW5rIGJvYXJkOiBTUEkgRUVQUk9NIGlzIGFjdGl2ZS1sb3csIE1XIEVFUFJPTSBhbmQgQVVYIGFyZSBhY3RpdmUgaGlnaCAqLwoJc3dpdGNoIChkZXYpIHsKCWNhc2UgMTogLyogU1BJIEVFUFJPTSAqLwoJCWFsaTUxMnhfY2lvX291dCgxNiwgMCk7CgkJYnJlYWs7CgoJY2FzZSAyOiAvKiBNVyBFRVBST00gKi8KCQlhbGk1MTJ4X2Npb19vdXQoMTUsIDEpOwoJCWJyZWFrOwoKCWNhc2UgMzogLyogQVVYICovCgkJYWxpNTEyeF9jaW9fb3V0KDE0LCAxKTsKCQlicmVhazsKCgljYXNlIDA6CgkJYWxpNTEyeF9jaW9fb3V0KDE2LCAxKTsKCQlhbGk1MTJ4X2Npb19vdXQoMTUsIDApOwoJCWFsaTUxMnhfY2lvX291dCgxNCwgMCk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlwcmludGYoIklsbGVnYWwgU1NJIGRldmljZSByZXF1ZXN0ZWQ6ICVkXG4iLCBkZXYpOwoJfQp9Cgp2b2lkIHNwaV9lZXByb21fcHJvYmUoaW50IHgpCnsKfQoKaW50IHNwaV9lZXByb21fcmVhZChpbnQgeCwgaW50IG9mZnNldCwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewogICAgICAgcmV0dXJuIDA7Cn0KCmludCBzcGlfZWVwcm9tX3dyaXRlKGludCB4LCBpbnQgb2Zmc2V0LCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQp7CiAgICAgICByZXR1cm4gMDsKfQoKdm9pZCBzcGlfaW5pdF9mKHZvaWQpCnsKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfQ0RQX1VTRV9TUEkKCXNwaV9lZXByb21fcHJvYmUoMSk7CiNlbmRpZgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XCgltd19lZXByb21fcHJvYmUoMik7CiNlbmRpZgp9Cgpzc2l6ZV90IHNwaV9yZWFkKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewoJaW50IG9mZnNldDsKCWludCBpOwoJc3NpemVfdCByZXM7CgoJb2Zmc2V0ID0gMDsKCWZvciAoaT0wO2k8YWxlbjtpKyspIHsKCQlvZmZzZXQgPDw9IDg7CgkJb2Zmc2V0IHw9IGFkZHJbaV07Cgl9CgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSQoJcmVzID0gc3BpX2VlcHJvbV9yZWFkKDEsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwojZW5kaWYKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfQ0RQX1VTRV9NVwoJcmVzID0gbXdfZWVwcm9tX3JlYWQoMiwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSSkgJiYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XKQoJcmVzID0gMDsKI2VuZGlmCglyZXR1cm4gcmVzOwp9Cgpzc2l6ZV90IHNwaV93cml0ZSh1Y2hhciAqYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCnsKCWludCBvZmZzZXQ7CglpbnQgaTsKCXNzaXplX3QgcmVzOwoKCW9mZnNldCA9IDA7Cglmb3IgKGk9MDtpPGFsZW47aSsrKSB7CgkJb2Zmc2V0IDw8PSA4OwoJCW9mZnNldCB8PSBhZGRyW2ldOwoJfQoKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfQ0RQX1VTRV9TUEkKCXJlcyA9IHNwaV9lZXByb21fd3JpdGUoMSwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XCglyZXMgPSBtd19lZXByb21fd3JpdGUoMiwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSSkgJiYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XKQoJcmVzID0gMDsKI2VuZGlmCglyZXR1cm4gcmVzOwp9CgppbnQgYm9hcmRfZXRoX2luaXQoYmRfdCAqYmlzKQp7CglyZXR1cm4gcGNpX2V0aF9pbml0KGJpcyk7Cn0K