LyoJQ29weXJpZ2h0OiAJqSBDb3B5cmlnaHQgMjAwNCBBcHBsZSBDb21wdXRlciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCURpc2NsYWltZXI6CUlNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuCgkJCSgiQXBwbGUiKSBpbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyCgkJCXVzZSwgaW5zdGFsbGF0aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZQoJCQljb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLAoJCQlwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yIHJlZGlzdHJpYnV0ZSB0aGlzIEFwcGxlIHNvZnR3YXJlLgoKCQkJSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgc3ViamVjdAoJCQl0byB0aGVzZSB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMKCQkJY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIEFwcGxlIHNvZnR3YXJlICh0aGUgIkFwcGxlIFNvZnR3YXJlIiksIHRvIHVzZSwKCQkJcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dAoJCQltb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlCgkJCXRoZSBBcHBsZSBTb2Z0d2FyZSBpbiBpdHMgZW50aXJldHkgYW5kIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgeW91IG11c3QgcmV0YWluCgkJCXRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbCBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZgoJCQl0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG9yIGxvZ29zIG9mCgkJCUFwcGxlIENvbXB1dGVyLCBJbmMuIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCgkJCUFwcGxlIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gQXBwbGUuICBFeGNlcHQgYXMKCQkJZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzIG9yIGltcGxpZWQsCgkJCWFyZSBncmFudGVkIGJ5IEFwcGxlIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0CgkJCW1heSBiZSBpbmZyaW5nZWQgYnkgeW91ciBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZQoJCQlTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLgoKCQkJVGhlIEFwcGxlIFNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEFwcGxlIG9uIGFuICJBUyBJUyIgYmFzaXMuICBBUFBMRSBNQUtFUyBOTwoJCQlXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQKCQkJV0FSUkFOVElFUyBPRiBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgoJCQlQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEFQUExFIFNPRlRXQVJFIE9SIElUUyBVU0UgQU5EIE9QRVJBVElPTiBBTE9ORSBPUiBJTgoJCQlDT01CSU5BVElPTiBXSVRIIFlPVVIgUFJPRFVDVFMuCgoJCQlJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCBPUgoJCQlDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCgkJCUdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQoJCQlBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04KCQkJT0YgVEhFIEFQUExFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQgV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsIFRPUlQKCQkJKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4KCQkJQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCUF1ZGlvRGV2aWNlLmNwcAoJCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiNpbmNsdWRlICJBdWRpb0RldmljZS5oIgoKdm9pZAlBdWRpb0RldmljZTo6SW5pdChBdWRpb0RldmljZUlEIGRldmlkLCBib29sIGlzSW5wdXQpCnsKCW1JRCA9IGRldmlkOwoJbUlzSW5wdXQgPSBpc0lucHV0OwoJaWYgKG1JRCA9PSBrQXVkaW9EZXZpY2VVbmtub3duKSByZXR1cm47CgkKCVVJbnQzMiBwcm9wc2l6ZTsKCQoJcHJvcHNpemUgPSBzaXplb2YoVUludDMyKTsKCXZlcmlmeV9ub2VycihBdWRpb0RldmljZUdldFByb3BlcnR5KG1JRCwgMCwgbUlzSW5wdXQsIGtBdWRpb0RldmljZVByb3BlcnR5U2FmZXR5T2Zmc2V0LCAmcHJvcHNpemUsICZtU2FmZXR5T2Zmc2V0KSk7CgkKCXByb3BzaXplID0gc2l6ZW9mKFVJbnQzMik7Cgl2ZXJpZnlfbm9lcnIoQXVkaW9EZXZpY2VHZXRQcm9wZXJ0eShtSUQsIDAsIG1Jc0lucHV0LCBrQXVkaW9EZXZpY2VQcm9wZXJ0eUJ1ZmZlckZyYW1lU2l6ZSwgJnByb3BzaXplLCAmbUJ1ZmZlclNpemVGcmFtZXMpKTsKCQoJcHJvcHNpemUgPSBzaXplb2YoQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uKTsKCXZlcmlmeV9ub2VycihBdWRpb0RldmljZUdldFByb3BlcnR5KG1JRCwgMCwgbUlzSW5wdXQsIGtBdWRpb0RldmljZVByb3BlcnR5U3RyZWFtRm9ybWF0LCAmcHJvcHNpemUsICZtRm9ybWF0KSk7Cgp9Cgp2b2lkCUF1ZGlvRGV2aWNlOjpTZXRCdWZmZXJTaXplKFVJbnQzMiBzaXplKQp7CglVSW50MzIgcHJvcHNpemUgPSBzaXplb2YoVUludDMyKTsKCXZlcmlmeV9ub2VycihBdWRpb0RldmljZVNldFByb3BlcnR5KG1JRCwgTlVMTCwgMCwgbUlzSW5wdXQsIGtBdWRpb0RldmljZVByb3BlcnR5QnVmZmVyRnJhbWVTaXplLCBwcm9wc2l6ZSwgJnNpemUpKTsKCglwcm9wc2l6ZSA9IHNpemVvZihVSW50MzIpOwoJdmVyaWZ5X25vZXJyKEF1ZGlvRGV2aWNlR2V0UHJvcGVydHkobUlELCAwLCBtSXNJbnB1dCwga0F1ZGlvRGV2aWNlUHJvcGVydHlCdWZmZXJGcmFtZVNpemUsICZwcm9wc2l6ZSwgJm1CdWZmZXJTaXplRnJhbWVzKSk7Cn0KCmludAkJQXVkaW9EZXZpY2U6OkNvdW50Q2hhbm5lbHMoKQp7CglPU1N0YXR1cyBlcnI7CglVSW50MzIgcHJvcFNpemU7CglpbnQgcmVzdWx0ID0gMDsKCQoJZXJyID0gQXVkaW9EZXZpY2VHZXRQcm9wZXJ0eUluZm8obUlELCAwLCBtSXNJbnB1dCwga0F1ZGlvRGV2aWNlUHJvcGVydHlTdHJlYW1Db25maWd1cmF0aW9uLCAmcHJvcFNpemUsIE5VTEwpOwoJaWYgKGVycikgcmV0dXJuIDA7CgoJQXVkaW9CdWZmZXJMaXN0ICpidWZsaXN0ID0gKEF1ZGlvQnVmZmVyTGlzdCAqKW1hbGxvYyhwcm9wU2l6ZSk7CgllcnIgPSBBdWRpb0RldmljZUdldFByb3BlcnR5KG1JRCwgMCwgbUlzSW5wdXQsIGtBdWRpb0RldmljZVByb3BlcnR5U3RyZWFtQ29uZmlndXJhdGlvbiwgJnByb3BTaXplLCBidWZsaXN0KTsKCWlmICghZXJyKSB7CgkJZm9yIChVSW50MzIgaSA9IDA7IGkgPCBidWZsaXN0LT5tTnVtYmVyQnVmZmVyczsgKytpKSB7CgkJCXJlc3VsdCArPSBidWZsaXN0LT5tQnVmZmVyc1tpXS5tTnVtYmVyQ2hhbm5lbHM7CgkJfQoJfQoJZnJlZShidWZsaXN0KTsKCXJldHVybiByZXN1bHQ7Cn0KCmNoYXIgKglBdWRpb0RldmljZTo6R2V0TmFtZShjaGFyICpidWYsIFVJbnQzMiBtYXhsZW4pCnsKCXZlcmlmeV9ub2VycihBdWRpb0RldmljZUdldFByb3BlcnR5KG1JRCwgMCwgbUlzSW5wdXQsIGtBdWRpb0RldmljZVByb3BlcnR5RGV2aWNlTmFtZSwgJm1heGxlbiwgYnVmKSk7CglyZXR1cm4gYnVmOwp9Cg==