LyoKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwogKgogKiBDb3B5cmlnaHQgqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIGV0MTMxMF9wbS5oIC0gRGVmaW5lcywgc3RydWN0cywgZW51bXMsIHByb3RvdHlwZXMsIGV0Yy4gcGVydGFpbmluZyB0byBwb3dlcgogKiAgICAgICAgICAgICAgIG1hbmFnZW1lbnQuCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFNPRlRXQVJFIExJQ0VOU0UKICoKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCiAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbwogKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCiAqCiAqIENvcHlyaWdodCCpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICoKICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqICAgIGRpc3RyaWJ1dGlvbi4KICoKICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRGlzY2xhaW1lcgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCiAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCiAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwogKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICiAqIERBTUFHRS4KICoKICovCgojaWZuZGVmIF9FVDEzMTBfUE1fSF8KI2RlZmluZSBfRVQxMzEwX1BNX0hfCgojaW5jbHVkZSAiZXQxMzEwX2FkZHJlc3NfbWFwLmgiCgojZGVmaW5lIE1BWF9XT0xfUEFDS0VUX1NJWkUgICAgMHg4MAojZGVmaW5lIE1BWF9XT0xfTUFTS19TSVpFICAgICAgKCBNQVhfV09MX1BBQ0tFVF9TSVpFIC8gOCApCiNkZWZpbmUgTlVNX1dPTF9QQVRURVJOUyAgICAgICAweDUKI2RlZmluZSBDUkMxNl9QT0xZICAgICAgICAgICAgIDB4MTAyMQoKLyogRGVmaW5pdGlvbiBvZiBORElTX0RFVklDRV9QT1dFUl9TVEFURSAqLwp0eXBlZGVmIGVudW0gewoJTmRpc0RldmljZVN0YXRlVW5zcGVjaWZpZWQgPSAwLAoJTmRpc0RldmljZVN0YXRlRDAsCglOZGlzRGV2aWNlU3RhdGVEMSwKCU5kaXNEZXZpY2VTdGF0ZUQyLAoJTmRpc0RldmljZVN0YXRlRDMKfSBORElTX0RFVklDRV9QT1dFUl9TVEFURTsKCnR5cGVkZWYgc3RydWN0IF9NUF9QT1dFUl9NR01UIHsKCS8qIHZhcmlhYmxlIHB1dHRpbmcgdGhlIHBoeSBpbnRvIGNvbWEgbW9kZSB3aGVuIGJvb3QgdXAgd2l0aCBubyBjYWJsZQoJICogcGx1Z2dlZCBpbiBhZnRlciA1IHNlY29uZHMKCSAqLwoJdTggVHJhbnNQaHlDb21hTW9kZU9uQm9vdDsKCgkvKiBBcnJheSBob2xkaW5nIHRoZSBmaXZlIENSQyB2YWx1ZXMgdGhhdCB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseQoJICogdXNpbmcgZm9yIFdPTC4gIFRoaXMgd2lsbCBiZSBxdWVyaWVkIHdoZW4gYSBwYXR0ZXJuIGlzIHRvIGJlCgkgKiByZW1vdmVkLgoJICovCgl1MzIgbG9jYWxXb2xBbmRDcmMwOwoJdTE2IFdPTFBhdHRlcm5MaXN0W05VTV9XT0xfUEFUVEVSTlNdOwoJdTggV09MTWFza0xpc3RbTlVNX1dPTF9QQVRURVJOU11bTUFYX1dPTF9NQVNLX1NJWkVdOwoJdTMyIFdPTE1hc2tTaXplW05VTV9XT0xfUEFUVEVSTlNdOwoKCS8qIElQIGFkZHJlc3MgKi8KCXVuaW9uIHsKCQl1MzIgdTMyOwoJCXU4IHU4WzRdOwoJfSBJUEFkZHJlc3M7CgoJLyogQ3VycmVudCBQb3dlciBzdGF0ZSBvZiB0aGUgYWRhcHRlci4gKi8KCU5ESVNfREVWSUNFX1BPV0VSX1NUQVRFIFBvd2VyU3RhdGU7Cglib29sIFdPTFN0YXRlOwoJYm9vbCBXT0xFbmFibGVkOwoJYm9vbCBGYWlsZWQxMEhhbGY7Cglib29sIGJGYWlsZWRTdGF0ZVRyYW5zaXRpb247CgoJLyogTmV4dCB0d28gdXNlZCB0byBzYXZlIHBvd2VyIGluZm9ybWF0aW9uIGF0IHBvd2VyIGRvd24uIFRoaXMKCSAqIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBkdXJpbmcgcG93ZXIgdXAgdG8gc2V0IHVwIHBhcnRzIG9mIFBvd2VyCgkgKiBNYW5hZ2VtZW50IGluIEpBR0NvcmUKCSAqLwoJdTMyIHR4X2VuOwoJdTMyIHJ4X2VuOwoJdTE2IFBvd2VyRG93blNwZWVkOwoJdTggUG93ZXJEb3duRHVwbGV4Owp9IE1QX1BPV0VSX01HTVQsICpQTVBfUE9XRVJfTUdNVDsKCi8qIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICogKCBJUyBUSEVSRSBBIFdBWSBUTyBETyBUSElTIFdJVEggQSBUWVBFREVGPz8/ICkKICovCnN0cnVjdCBldDEzMXhfYWRhcHRlcjsKCnUxNiBDYWxjdWxhdGVDQ0lUQ1JDMTYodTggKlBhdHRlcm4sIHU4ICpNYXNrLCB1MzIgTWFza1NpemUpOwp2b2lkIEVuYWJsZVBoeUNvbWEoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKdm9pZCBEaXNhYmxlUGh5Q29tYShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwoKI2VuZGlmIC8qIF9FVDEzMTBfUE1fSF8gKi8K