LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJtb2QuYwogKiBWZXJzaW9uOiAgICAgICAwLjkKICogRGVzY3JpcHRpb246ICAgSXJEQSBzdGFjayBtYWluIGVudHJ5IHBvaW50cwogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgTW9uIERlYyAxNSAxMzo1NTozOSAxOTk3CiAqIE1vZGlmaWVkIGF0OiAgIFdlZCBKYW4gIDUgMTU6MTI6NDEgMjAwMAogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIAogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk5LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CiAqICAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKiAgCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICogICAgIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gZW50cnkgcG9pbnRzIG9mIHRoZSBJckRBIHN0YWNrLgogKiBUaGV5IGFyZSBpbiB0aGlzIGZpbGUgYW5kIG5vdCBhZl9pcmRhLmMgYmVjYXVzZSBzb21lIGRldmVsb3BwZXJzCiAqIGFyZSB1c2luZyB0aGUgSXJEQSBzdGFjayB3aXRob3V0IHRoZSBzb2NrZXQgQVBJIChjb21waWxpbmcgb3V0CiAqIGFmX2lyZGEuYykuCiAqIEplYW4gSUkKICovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4JCS8qIG5vdGlmeV90ICovCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgkJLyogaXJsYXBfaW5pdCAqLwojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4JCS8qIGlybG1wX2luaXQgKi8KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CQkvKiBpcmlhcF9pbml0ICovCiNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgkJLyogaXJ0dHBfaW5pdCAqLwojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4JLyogaXJkYV9kZXZpY2VfaW5pdCAqLwoKLyogaXJwcm9jLmMgKi8KZXh0ZXJuIHZvaWQgaXJkYV9wcm9jX3JlZ2lzdGVyKHZvaWQpOwpleHRlcm4gdm9pZCBpcmRhX3Byb2NfdW5yZWdpc3Rlcih2b2lkKTsKLyogaXJzeXNjdGwuYyAqLwpleHRlcm4gaW50ICBpcmRhX3N5c2N0bF9yZWdpc3Rlcih2b2lkKTsKZXh0ZXJuIHZvaWQgaXJkYV9zeXNjdGxfdW5yZWdpc3Rlcih2b2lkKTsKLyogYWZfaXJkYS5jICovCmV4dGVybiBpbnQgIGlyc29ja19pbml0KHZvaWQpOwpleHRlcm4gdm9pZCBpcnNvY2tfY2xlYW51cCh2b2lkKTsKLyogaXJsYXBfZnJhbWUuYyAqLwpleHRlcm4gaW50ICBpcmxhcF9kcml2ZXJfcmN2KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICosIAoJCQkgICAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKCi8qCiAqIE1vZHVsZSBwYXJhbWV0ZXJzCiAqLwojaWZkZWYgQ09ORklHX0lSREFfREVCVUcKdW5zaWduZWQgaW50IGlyZGFfZGVidWcgPSBJUkRBX0RFQlVHX0xFVkVMOwptb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGlyZGFfZGVidWcsIHVpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiSVJEQSBkZWJ1Z2dpbmcgbGV2ZWwiKTsKRVhQT1JUX1NZTUJPTChpcmRhX2RlYnVnKTsKI2VuZGlmCgovKiBQYWNrZXQgdHlwZSBoYW5kbGVyLgogKiBUZWxsIHRoZSBrZXJuZWwgaG93IElyREEgcGFja2V0cyBzaG91bGQgYmUgaGFuZGxlZC4KICovCnN0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgaXJkYV9wYWNrZXRfdHlwZSA9IHsKCS50eXBlCT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUkRBKSwKCS5mdW5jCT0gaXJsYXBfZHJpdmVyX3JjdiwJLyogUGFja2V0IHR5cGUgaGFuZGxlciBpcmxhcF9mcmFtZS5jICovCn07CgovKgogKiBGdW5jdGlvbiBpcmRhX25vdGlmeV9pbml0IChub3RpZnkpCiAqCiAqICAgIFVzZWQgZm9yIGluaXRpYWxpemluZyB0aGUgbm90aWZ5IHN0cnVjdHVyZQogKgogKi8Kdm9pZCBpcmRhX25vdGlmeV9pbml0KG5vdGlmeV90ICpub3RpZnkpCnsKCW5vdGlmeS0+ZGF0YV9pbmRpY2F0aW9uID0gTlVMTDsKCW5vdGlmeS0+dWRhdGFfaW5kaWNhdGlvbiA9IE5VTEw7Cglub3RpZnktPmNvbm5lY3RfY29uZmlybSA9IE5VTEw7Cglub3RpZnktPmNvbm5lY3RfaW5kaWNhdGlvbiA9IE5VTEw7Cglub3RpZnktPmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IE5VTEw7Cglub3RpZnktPmZsb3dfaW5kaWNhdGlvbiA9IE5VTEw7Cglub3RpZnktPnN0YXR1c19pbmRpY2F0aW9uID0gTlVMTDsKCW5vdGlmeS0+aW5zdGFuY2UgPSBOVUxMOwoJc3RybGNweShub3RpZnktPm5hbWUsICJVbmtub3duIiwgc2l6ZW9mKG5vdGlmeS0+bmFtZSkpOwp9CkVYUE9SVF9TWU1CT0woaXJkYV9ub3RpZnlfaW5pdCk7CgovKgogKiBGdW5jdGlvbiBpcmRhX2luaXQgKHZvaWQpCiAqCiAqICBQcm90b2NvbCBzdGFjayBpbml0aWFsaXNhdGlvbiBlbnRyeSBwb2ludC4KICogIEluaXRpYWxpc2UgdGhlIHZhcmlvdXMgY29tcG9uZW50cyBvZiB0aGUgSXJEQSBzdGFjawogKi8Kc3RhdGljIGludCBfX2luaXQgaXJkYV9pbml0KHZvaWQpCnsKCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJLyogTG93ZXIgbGF5ZXIgb2YgdGhlIHN0YWNrICovCiAJaXJsbXBfaW5pdCgpOwoJaXJsYXBfaW5pdCgpOwoJCgkvKiBIaWdoZXIgbGF5ZXJzIG9mIHRoZSBzdGFjayAqLwoJaXJpYXBfaW5pdCgpOwogCWlydHRwX2luaXQoKTsKCWlyc29ja19pbml0KCk7CgkKCS8qIEFkZCBJckRBIHBhY2tldCB0eXBlIChTdGFydCByZWNlaXZpbmcgcGFja2V0cykgKi8KICAgICAgICBkZXZfYWRkX3BhY2soJmlyZGFfcGFja2V0X3R5cGUpOwoKCS8qIEV4dGVybmFsIEFQSXMgKi8KI2lmZGVmIENPTkZJR19QUk9DX0ZTCglpcmRhX3Byb2NfcmVnaXN0ZXIoKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfU1lTQ1RMCglpcmRhX3N5c2N0bF9yZWdpc3RlcigpOwojZW5kaWYKCgkvKiBEcml2ZXIvZG9uZ2xlIHN1cHBvcnQgKi8KIAlpcmRhX2RldmljZV9pbml0KCk7CgoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyZGFfY2xlYW51cCAodm9pZCkKICoKICogIFByb3RvY29sIHN0YWNrIGNsZWFudXAvcmVtb3ZhbCBlbnRyeSBwb2ludC4KICogIENsZWFudXAgdGhlIHZhcmlvdXMgY29tcG9uZW50cyBvZiB0aGUgSXJEQSBzdGFjawogKi8Kc3RhdGljIHZvaWQgX19leGl0IGlyZGFfY2xlYW51cCh2b2lkKQp7CgkvKiBSZW1vdmUgRXh0ZXJuYWwgQVBJcyAqLwojaWZkZWYgQ09ORklHX1NZU0NUTAoJaXJkYV9zeXNjdGxfdW5yZWdpc3RlcigpOwojZW5kaWYJCiNpZmRlZiBDT05GSUdfUFJPQ19GUwoJaXJkYV9wcm9jX3VucmVnaXN0ZXIoKTsKI2VuZGlmCgoJLyogUmVtb3ZlIElyREEgcGFja2V0IHR5cGUgKHN0b3AgcmVjZWl2aW5nIHBhY2tldHMpICovCiAgICAgICAgZGV2X3JlbW92ZV9wYWNrKCZpcmRhX3BhY2tldF90eXBlKTsKCQoJLyogUmVtb3ZlIGhpZ2hlciBsYXllcnMgKi8KCWlyc29ja19jbGVhbnVwKCk7CglpcnR0cF9jbGVhbnVwKCk7CglpcmlhcF9jbGVhbnVwKCk7CgoJLyogUmVtb3ZlIGxvd2VyIGxheWVycyAqLwoJaXJkYV9kZXZpY2VfY2xlYW51cCgpOwoJaXJsYXBfY2xlYW51cCgpOyAvKiBNdXN0IGJlIGRvbmUgYmVmb3JlIGlybG1wX2NsZWFudXAoKSEgREIgKi8KCgkvKiBSZW1vdmUgbWlkZGxlIGxheWVyICovCglpcmxtcF9jbGVhbnVwKCk7Cn0KCi8qCiAqIFRoZSBJckRBIHN0YWNrIG11c3QgYmUgaW5pdGlhbGlzZWQgKmJlZm9yZSogZHJpdmVycyBnZXQgaW5pdGlhbGlzZWQsCiAqIGFuZCAqYmVmb3JlKiBoaWdoZXIgcHJvdG9jb2xzIChJckxBTi9JckNPTU0vSXJORVQpIGdldCBpbml0aWFsaXNlZCwKICogb3RoZXJ3aXNlIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gKGhhc2hiaW5zIHdpbGwgYmUgTlVMTCBmb3IgZXhhbXBsZSkuCiAqIFRob3NlIG1vZHVsZXMgYXJlIGF0IG1vZHVsZV9pbml0KCkvZGV2aWNlX2luaXRjYWxsKCkgbGV2ZWwuCiAqCiAqIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBuZWVkcyB0byBiZSBpbml0aWFsaXNlZCAqYWZ0ZXIqIHRoZSBiYXNpYwogKiBuZXR3b3JraW5nLCB0aGUgL3Byb2MvbmV0IGZpbGVzeXN0ZW0gYW5kIHN5c2N0bCBtb2R1bGUuIFRob3NlIGFyZQogKiBjdXJyZW50bHkgaW5pdGlhbGlzZWQgaW4gLi4uL2luaXQvbWFpbi5jIChiZWZvcmUgaW5pdGNhbGxzKS4KICogQWxzbywgSXJEQSBkcml2ZXJzIG5lZWRzIHRvIGJlIGluaXRpYWxpc2VkICphZnRlciogdGhlIHJhbmRvbSBudW1iZXIKICogZ2VuZXJhdG9yIChtYWluIHN0YWNrIGFuZCBoaWdoZXIgbGF5ZXIgaW5pdCBkb24ndCBuZWVkIGl0IGFueW1vcmUpLgogKgogKiBKZWFuIElJCiAqLwpzdWJzeXNfaW5pdGNhbGwoaXJkYV9pbml0KTsKbW9kdWxlX2V4aXQoaXJkYV9jbGVhbnVwKTsKIApNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+ICYgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBMaW51eCBJckRBIFByb3RvY29sIFN0YWNrIik7IApNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9JUkRBKTsK