LyoKICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMi9pby5jCiAqCiAqIE9NQVAyIEkvTyBtYXBwaW5nIGNvZGUKICoKICogQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCiAqIEF1dGhvcjogSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KICogVXBkYXRlZCBtYXAgZGVzYyB0byBhZGQgMjQzMCBzdXBwb3J0IDogPHgwa2hhc2ltQHRpLmNvbT4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CgojaW5jbHVkZSA8YXNtL3RsYi5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CgojaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CgojaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CiNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KCmV4dGVybiB2b2lkIG9tYXBfc3JhbV9pbml0KHZvaWQpOwpleHRlcm4gaW50IG9tYXAyX2Nsa19pbml0KHZvaWQpOwpleHRlcm4gdm9pZCBvbWFwMl9jaGVja19yZXZpc2lvbih2b2lkKTsKZXh0ZXJuIHZvaWQgb21hcDJfaW5pdF9tZW1vcnkodm9pZCk7CmV4dGVybiB2b2lkIGdwbWNfaW5pdCh2b2lkKTsKZXh0ZXJuIHZvaWQgb21hcGZiX3Jlc2VydmVfc2RyYW0odm9pZCk7CgovKgogKiBUaGUgbWFjaGluZSBzcGVjaWZpYyBjb2RlIG1heSBwcm92aWRlIHRoZSBleHRyYSBtYXBwaW5nIGJlc2lkZXMgdGhlCiAqIGRlZmF1bHQgbWFwcGluZyBwcm92aWRlZCBoZXJlLgogKi8Kc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKCXsKCQkudmlydHVhbAk9IEwzXzI0WFhfVklSVCwKCQkucGZuCQk9IF9fcGh5c190b19wZm4oTDNfMjRYWF9QSFlTKSwKCQkubGVuZ3RoCQk9IEwzXzI0WFhfU0laRSwKCQkudHlwZQkJPSBNVF9ERVZJQ0UKCX0sCgl7CgkJLnZpcnR1YWwgICAgICAgID0gTDRfMjRYWF9WSVJULAoJCS5wZm4gICAgICAgICAgICA9IF9fcGh5c190b19wZm4oTDRfMjRYWF9QSFlTKSwKCQkubGVuZ3RoICAgICAgICAgPSBMNF8yNFhYX1NJWkUsCgkJLnR5cGUgICAgICAgICAgID0gTVRfREVWSUNFCgl9LAojaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0MzAKCXsKCQkudmlydHVhbAk9IEw0X1dLXzI0M1hfVklSVCwKCQkucGZuCQk9IF9fcGh5c190b19wZm4oTDRfV0tfMjQzWF9QSFlTKSwKCQkubGVuZ3RoCQk9IEw0X1dLXzI0M1hfU0laRSwKCQkudHlwZQkJPSBNVF9ERVZJQ0UKCX0sCgl7CgkJLnZpcnR1YWwJPSBPTUFQMjQzWF9HUE1DX1ZJUlQsCgkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKE9NQVAyNDNYX0dQTUNfUEhZUyksCgkJLmxlbmd0aAkJPSBPTUFQMjQzWF9HUE1DX1NJWkUsCgkJLnR5cGUJCT0gTVRfREVWSUNFCgl9LAojZW5kaWYKCXsKCQkudmlydHVhbAk9IERTUF9NRU1fMjRYWF9WSVJULAoJCS5wZm4JCT0gX19waHlzX3RvX3BmbihEU1BfTUVNXzI0WFhfUEhZUyksCgkJLmxlbmd0aAkJPSBEU1BfTUVNXzI0WFhfU0laRSwKCQkudHlwZQkJPSBNVF9ERVZJQ0UKCX0sCgl7CgkJLnZpcnR1YWwJPSBEU1BfSVBJXzI0WFhfVklSVCwKCQkucGZuCQk9IF9fcGh5c190b19wZm4oRFNQX0lQSV8yNFhYX1BIWVMpLAoJCS5sZW5ndGgJCT0gRFNQX0lQSV8yNFhYX1NJWkUsCgkJLnR5cGUJCT0gTVRfREVWSUNFCgl9LAoJewoJCS52aXJ0dWFsCT0gRFNQX01NVV8yNFhYX1ZJUlQsCgkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKERTUF9NTVVfMjRYWF9QSFlTKSwKCQkubGVuZ3RoCQk9IERTUF9NTVVfMjRYWF9TSVpFLAoJCS50eXBlCQk9IE1UX0RFVklDRQoJfQp9OwoKdm9pZCBfX2luaXQgb21hcDJfbWFwX2NvbW1vbl9pbyh2b2lkKQp7Cglpb3RhYmxlX2luaXQob21hcDJfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMl9pb19kZXNjKSk7CgoJLyogTm9ybWFsbHkgZGV2aWNlbWFwc19pbml0KCkgd291bGQgZmx1c2ggY2FjaGVzIGFuZCB0bGIgYWZ0ZXIKCSAqIG1kZXNjLT5tYXBfaW8oKSwgYnV0IHdlIG11c3QgYWxzbyBkbyBpdCBoZXJlIGJlY2F1c2Ugb2YgdGhlIENQVQoJICogcmV2aXNpb24gY2hlY2sgYmVsb3cuCgkgKi8KCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKCWZsdXNoX2NhY2hlX2FsbCgpOwoKCW9tYXAyX2NoZWNrX3JldmlzaW9uKCk7CglvbWFwX3NyYW1faW5pdCgpOwoJb21hcGZiX3Jlc2VydmVfc2RyYW0oKTsKfQoKdm9pZCBfX2luaXQgb21hcDJfaW5pdF9jb21tb25faHcodm9pZCkKewoJb21hcDJfbXV4X2luaXQoKTsKCW9tYXAyX2Nsa19pbml0KCk7Ci8qCiAqIE5lZWQgdG8gRml4IHRoaXMgZm9yIDI0MzAKICovCiNpZm5kZWYgQ09ORklHX0FSQ0hfT01BUDI0MzAKCW9tYXAyX2luaXRfbWVtb3J5KCk7CiNlbmRpZgoJZ3BtY19pbml0KCk7Cn0K