Name: series-workflowqzl57 Phase: Failed StartedAt: 2026-08-15 06:49:10 +0000 UTC FinishedAt: 2026-08-15 06:51:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqzl57[0] Phase: Succeeded StartedAt: 2026-08-15 06:49:10 +0000 UTC FinishedAt: 2026-08-15 06:51:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqzl57[0].run-triage Phase: Succeeded StartedAt: 2026-08-15 06:49:10 +0000 UTC FinishedAt: 2026-08-15 06:51:31 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDA2OjUwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBmaXJtd2FyZSBmbGFzaCBzdXBwb3J0IGZvciB0aGUgTWF4TGluZWFyIE14TDg2Mnh4IERTQSBzd2l0Y2ggdmlhIGRldmxpbmssIGFsb25nIHdpdGggYSBuZXcgY29yZSBkcml2ZXIgbW9kZWwgZnVuY3Rpb24gYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYC4gVGhlIGBteGw4NjJ4eGAgZHJpdmVyIHJlcXVpcmVzIHBoeXNpY2FsIGhhcmR3YXJlIGNvbm5lY3RlZCB2aWEgTURJTyB0byBwcm9iZSBzdWNjZXNzZnVsbHkgYW5kIGlzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLiBUaGUgbmV3IGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgQVBJIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGhpcyB1bnJlYWNoYWJsZSBkcml2ZXIuIFRoZSBhZGRpdGlvbnMgdG8gdGhlIERTQSBkZXZsaW5rIGNvcmUgYXJlIHRyaXZpYWwgd3JhcHBlcnMgdGhhdCByZXR1cm4gYC1FT1BOT1RTVVBQYCBmb3IgYWxsIG90aGVyIHN3aXRjaGVzLiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBkZXZpY2Vfc2h1dGRvd25gIG1lcmVseSBzZXRzIGEgYm9vbGVhbiBmbGFnIGR1cmluZyBzeXN0ZW0gdGVhcmRvd24uIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50LCByZWFjaGFibGUgY29kZSB0byBmdXp6LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAwNjo1MDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDI5YjAxMTZlMDU1OWNjY2ExNDhhZTY5YTBhYWQ2Mjc0MjYxZTNiZDNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IEF1ZyAxNSAwNjo1MDo0MyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3RcbmluZGV4IDQ3NDUxNDhmZWNmNGYuLjA1ODk5OWQwZGM1NmYgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdFxuQEAgLTk0LDYgJiM0Mzs5NCw3IEBAIHBhcmFtZXRlcnMsIGluZm8gdmVyc2lvbnMsIGFuZCBvdGhlciBmZWF0dXJlcyBpdCBzdXBwb3J0cy5cbiAgICBtbHg1XG4gICAgbWx4c3dcbiAgICBtdjg4ZTZ4eHhcbiYjNDM7ICAgbXhsODYyeHhcbiAgICBuZXRkZXZzaW1cbiAgICBuZnBcbiAgICBvY3Rlb250eDJcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3QgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3Rcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi41YjI0ZDhjYjU3YmM5XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3RcbkBAIC0wLDAgJiM0MzsxLDc0IEBAXG4mIzQzOy4uIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzO1xuJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7bXhsODYyeHggZGV2bGluayBzdXBwb3J0XG4mIzQzOz09PT09PT09PT09PT09PT09PT09PT09PVxuJiM0MztcbiYjNDM7VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGRldmxpbmsgZmVhdHVyZXMgaW1wbGVtZW50ZWQgYnkgdGhlXG4mIzQzO2BgbXhsODYyeHhgYCBkZXZpY2UgZHJpdmVyLlxuJiM0MztcbiYjNDM7SW5mbyB2ZXJzaW9uc1xuJiM0Mzs9PT09PT09PT09PT09XG4mIzQzO1xuJiM0MztUaGUgYGBteGw4NjJ4eGBgIGRyaXZlciByZXBvcnRzIHRoZSBmb2xsb3dpbmcgdmVyc2lvbnNcbiYjNDM7XG4mIzQzOy4uIGxpc3QtdGFibGU6OiBkZXZsaW5rIGluZm8gdmVyc2lvbnMgaW1wbGVtZW50ZWRcbiYjNDM7ICAgOndpZHRoczogNSA1IDUgODVcbiYjNDM7XG4mIzQzOyAgICogLSBOYW1lXG4mIzQzOyAgICAgLSBUeXBlXG4mIzQzOyAgICAgLSBFeGFtcGxlXG4mIzQzOyAgICAgLSBEZXNjcmlwdGlvblxuJiM0MzsgICAqIC0gYGBhc2ljLmlkYGBcbiYjNDM7ICAgICAtIGZpeGVkXG4mIzQzOyAgICAgLSA4NjI4XG4mIzQzOyAgICAgLSBUaGUgY2hpcCBwYXJ0IG51bWJlciByZWFkIGZyb20gdGhlIENISVAgSUQgcmVnaXN0ZXJzLiBPbWl0dGVkXG4mIzQzOyAgICAgICB3aGVuIHRoZSBwYXJ0IG51bWJlciByZWFkcyBhcyB6ZXJvLCB3aGljaCBoYXBwZW5zIGZvciBhIHN3aXRjaFxuJiM0MzsgICAgICAgc2l0dGluZyBpbiBNQ1Vib290IHJlc2N1ZSBtb2RlICh0aGUgcmVnaXN0ZXJzIG5lZWQgYSBydW5uaW5nXG4mIzQzOyAgICAgICBmaXJtd2FyZSksIGZvciBhbiB1bmZ1c2VkIHBhcnQsIGFuZCBhZnRlciBhIGZhaWxlZCBmbGFzaC5cbiYjNDM7ICAgKiAtIGBgYXNpYy5yZXZgYFxuJiM0MzsgICAgIC0gZml4ZWRcbiYjNDM7ICAgICAtIDBcbiYjNDM7ICAgICAtIFRoZSBjaGlwIHZlcnNpb24gcmVhZCBmcm9tIHRoZSBzYW1lIHJlZ2lzdGVyIHdvcmQsIHNvIGl0IGlzXG4mIzQzOyAgICAgICBvbWl0dGVkIHdoZW5ldmVyIGBgYXNpYy5pZGBgIGlzLlxuJiM0MzsgICAqIC0gYGBmd2BgXG4mIzQzOyAgICAgLSBydW5uaW5nLCBzdG9yZWRcbiYjNDM7ICAgICAtIDEuMC43MFxuJiM0MzsgICAgIC0gVmVyc2lvbiBvZiB0aGUgZmlybXdhcmUgcnVubmluZyBvbiB0aGUgc3dpdGNoLCByZXBvcnRlZCBhcyBib3RoXG4mIzQzOyAgICAgICBydW5uaW5nIGFuZCBzdG9yZWQgc2luY2UgdGhlIHN3aXRjaCBib290cyBpdCBmcm9tIGl0cyBvd24gZmxhc2guXG4mIzQzOyAgICAgICBJdCBpcyBvbWl0dGVkIHdoaWxlIG5vIGZpcm13YXJlIHZlcnNpb24gaXMga25vd246IGFmdGVyIGEgZmFpbGVkXG4mIzQzOyAgICAgICBmbGFzaCwgYW5kIGluIE1DVWJvb3QgcmVzY3VlIG1vZGUgd2hpbGUgYW4gaW50ZXJydXB0ZWQgZG93bmxvYWRcbiYjNDM7ICAgICAgIGlzIHN0aWxsIGJlaW5nIHJlY292ZXJlZCBpbiB0aGUgYmFja2dyb3VuZC4gT25jZSB0aGUgbG9hZGVyIGlzXG4mIzQzOyAgICAgICByZWFkeSB0byBhY2NlcHQgYSBuZXcgaW1hZ2UgdGhlIHZlcnNpb24gYXBwZWFycyBhcyBcJiMzNDswLjAuMFwmIzM0OyxcbiYjNDM7ICAgICAgIHdoaWNoIG5vIHJlbGVhc2VkIGZpcm13YXJlIHJlcG9ydHMsIHNvIHZlcnNpb24tY29tcGFyaW5nIHRvb2xzXG4mIzQzOyAgICAgICBvZmZlciBhbnkgYXZhaWxhYmxlIHJlbGVhc2UgYXMgYW4gdXBncmFkZS4gVXNlIGBgZGV2bGluayBkZXZcbiYjNDM7ICAgICAgIGZsYXNoYGAgdG8gdGVsbCBhIHJlY292ZXJpbmcgc3dpdGNoIGZyb20gYSByZWFkeSBvbmUsIHNlZSBiZWxvdztcbiYjNDM7ICAgICAgIGEgbWlzc2luZyB2ZXJzaW9uIG9uIGl0cyBvd24gZG9lcyBub3Qgc2F5IHdoeS5cbiYjNDM7XG4mIzQzO0ZsYXNoIHVwZGF0ZVxuJiM0Mzs9PT09PT09PT09PT1cbiYjNDM7XG4mIzQzO1RoZSBgYG14bDg2Mnh4YGAgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgYGBkZXZsaW5rIGRldiBmbGFzaGBgLlxuJiM0MztUaGUgc2lnbmVkIGZpcm13YXJlIGltYWdlIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBzd2l0Y2ggb3ZlciB0aGUgc2FtZVxuJiM0MztNRElPIGJ1cyB3aGljaCBpcyBhbHNvIHVzZWQgdG8gbWFuYWdlIHRoZSBzd2l0Y2gsIHRoZW4gdmVyaWZpZWQgYW5kXG4mIzQzO2luc3RhbGxlZCBieSB0aGUgTUNVYm9vdCBib290bG9hZGVyIHJ1bm5pbmcgb24gdGhlIHN3aXRjaC4gQWxsIHBvcnRzXG4mIzQzO29mIHRoZSBzd2l0Y2ggYXJlIGNsb3NlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1cGRhdGUgYW5kIHRoZSBkcml2ZXJcbiYjNDM7cmVwcm9iZXMgdGhlIHN3aXRjaCBhZnRlciBpdCBoYXMgcmVib290ZWQgaW50byB0aGUgbmV3IGZpcm13YXJlLiBBXG4mIzQzO2NvbXBsZXRlIGZsYXNoIGFuZCByZXByb2JlIGN5Y2xlIHRha2VzIGFib3V0IG9uZSBtaW51dGUuXG4mIzQzO1xuJiM0MztBIHN3aXRjaCBzdHVjayBpbiBNQ1Vib290IHJlc2N1ZSBtb2RlLCBlLmcuIGFmdGVyIGFuIGludGVycnVwdGVkXG4mIzQzO3VwZGF0ZSwgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHVzZXIgcG9ydHMuIElmIHRoZSBwcmV2aW91cyBkb3dubG9hZCB3YXNcbiYjNDM7aW50ZXJydXB0ZWQgbWlkLXRyYW5zZmVyIHRoZSBsb2FkZXIgaXMgd2VkZ2VkOyB0aGUgZHJpdmVyIGRyYWlucyBpdFxuJiM0MztiYWNrIHRvIGEgY2xlYW4gcmVhZHkgc3RhdGUgaW4gdGhlIGJhY2tncm91bmQsIG9uZSBieXRlIGF0IGEgdGltZSxcbiYjNDM7d2hpY2ggdGFrZXMgdGVucyBvZiBtaW51dGVzIGZvciBhIGxhcmdlIGltYWdlIGFuZCBpcyByZXBvcnRlZCB0aHJvdWdoXG4mIzQzO3RoZSBrZXJuZWwgbG9nIGFzIGl0IHByb2dyZXNzZXMuIER1cmluZyB0aGF0IHJlY292ZXJ5IGBgZGV2bGluayBkZXZcbiYjNDM7Zmxhc2hgYCByZXR1cm5zIGBgLUVCVVNZYGAgd2l0aCBhbiBleHRhY2sgbWVzc2FnZSBzYXlpbmcgc28sIGFuZFxuJiM0MztgYGRldmxpbmsgZGV2IGluZm9gYCByZXBvcnRzIG5vIGZpcm13YXJlIHZlcnNpb24uIE9uY2UgdGhlIGxvYWRlciBpc1xuJiM0MztyZWFkeSB0aGUgZmlybXdhcmUgdmVyc2lvbiBhcHBlYXJzIGFuZCBmbGFzaGluZyBhIGZpcm13YXJlIGltYWdlXG4mIzQzO3Rocm91Z2ggdGhlIHJlZ3VsYXIgdXBkYXRlIGZsb3cgcmVjb3ZlcnMgdGhlIHN3aXRjaC5cbiYjNDM7XG4mIzQzO0lmIHRoZSByZWNvdmVyeSBmYWlscywgdGhlIGxvYWRlciBuZWVkcyBhIHBvd2VyIGN5Y2xlOiBgYGRldmxpbmsgZGV2XG4mIzQzO2ZsYXNoYGAgdGhlbiByZXR1cm5zIGBgLUVJT2BgIGFuZCBzYXlzIHNvIGluIGl0cyBleHRhY2sgbWVzc2FnZS4gVGhlXG4mIzQzO2RyaXZlciBvbmx5IHJlLWV4YW1pbmVzIHRoZSBzd2l0Y2ggd2hlbiBpdCBiaW5kcywgc28gb24gYSBib2FyZCB3aGVyZVxuJiM0Mzt0aGUgc3dpdGNoIGNhbiBiZSBwb3dlciBjeWNsZWQgb24gaXRzIG93biwgdW5iaW5kIGFuZCByZWJpbmQgdGhlIGRyaXZlclxuJiM0MzthZnRlcndhcmRzIHRvIGhhdmUgdGhlIHJlY292ZXJlZCBzd2l0Y2ggcmVjb2duaXNlZC5cbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCA5OTE0NjAwNTBkYTc0Li5lM2Y3ZGVkNTY5YmY3IDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTXG5AQCAtMTYxMDYsNiAmIzQzOzE2MTA2LDcgQEAgTTpcdERhbmllbCBHb2xsZSBcdTAwM2NkYW5pZWxAbWFrcm90b3BpYS5vcmdcdTAwM2VcbiBMOlx0bmV0ZGV2QHZnZXIua2VybmVsLm9yZ1xuIFM6XHRNYWludGFpbmVkXG4gRjpcdERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZHNhL21heGxpbmVhcixteGw4NjJ4eC55YW1sXG4mIzQzO0Y6XHREb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3RcbiBGOlx0ZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L1xuIEY6XHRuZXQvZHNhL3RhZ19teGw4NjJ4eC5jXG4gXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Jhc2UuaCBiL2RyaXZlcnMvYmFzZS9iYXNlLmhcbmluZGV4IGE1YjdhYmMxMGZmMDIuLjYyMzRlMzdkZTdlOTkgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Jhc2UvYmFzZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oXG5AQCAtMTA2LDYgJiM0MzsxMDYsMTAgQEAgc3RydWN0IGRyaXZlcl9wcml2YXRlIHtcbiAgKiBAZGVhZDogVGhpcyBkZXZpY2UgaXMgY3VycmVudGx5IGVpdGhlciBpbiB0aGUgcHJvY2VzcyBvZiBvciBoYXMgYmVlblxuICAqXHQgIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLiBBbnkgYXN5bmNocm9ub3VzIGV2ZW50cyBzY2hlZHVsZWQgZm9yIHRoaXNcbiAgKlx0ICBkZXZpY2Ugc2hvdWxkIGV4aXQgd2l0aG91dCB0YWtpbmcgYW55IGFjdGlvbi5cbiYjNDM7ICogQHNodXRkb3duX2RvbmU6IFNldCBvbmNlIGRldmljZV9zaHV0ZG93bigpIGhhcyByZWFjaGVkIHRoaXMgZGV2aWNlLCB1bmRlclxuJiM0MzsgKlx0ICB0aGUgZGV2aWNlIGxvY2ssIGJlZm9yZSBhbnkgc2h1dGRvd24gY2FsbGJhY2sgcnVucy4gUmVhZCB1bmRlciB0aGVcbiYjNDM7ICpcdCAgZGV2aWNlIGxvY2suIEEgZGVmZXJyZWQgcmUtcHJvYmUgc2NoZWR1bGVkIHdpdGhcbiYjNDM7ICpcdCAgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoKSBtdXN0IG5vdCBkZXRhY2ggdGhlIGRldmljZSBhbnltb3JlLlxuICAqXG4gICogTm90aGluZyBvdXRzaWRlIG9mIHRoZSBkcml2ZXIgY29yZSBzaG91bGQgZXZlciB0b3VjaCB0aGVzZSBmaWVsZHMuXG4gICovXG5AQCAtMTIwLDYgJiM0MzsxMjQsNyBAQCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUge1xuIFx0Y2hhciAqZGVmZXJyZWRfcHJvYmVfcmVhc29uO1xuIFx0c3RydWN0IGRldmljZSAqZGV2aWNlO1xuIFx0dTggZGVhZDoxO1xuJiM0MztcdHU4IHNodXRkb3duX2RvbmU6MTtcbiB9O1xuICNkZWZpbmUgdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG9iailcdFxcXG4gXHRjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUsIGtub2RlX3BhcmVudClcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuY1xuaW5kZXggNGQwMjY2ODI5NDRmMi4uOGE3ZGJlNGU4MzYyYiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvYmFzZS9jb3JlLmNcbkBAIC00OTA2LDYgJiM0Mzs0OTA2LDkgQEAgdm9pZCBkZXZpY2Vfc2h1dGRvd24odm9pZClcbiBcdFx0XHRkZXZpY2VfbG9jayhwYXJlbnQpO1xuIFx0XHRkZXZpY2VfbG9jayhkZXYpO1xuIFxuJiM0MztcdFx0aWYgKGRldi1cdTAwM2VwKVxuJiM0MztcdFx0XHRkZXYtXHUwMDNlcC1cdTAwM2VzaHV0ZG93bl9kb25lID0gdHJ1ZTtcbiYjNDM7XG4gXHRcdC8qIERvbiYjMzk7dCBhbGxvdyBhbnkgbW9yZSBydW50aW1lIHN1c3BlbmRzICovXG4gXHRcdHBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7XG4gXHRcdHBtX3J1bnRpbWVfYmFycmllcihkZXYpO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmNcbmluZGV4IDYwYzAwNTIyMzg0NGQuLmJiOGIzNGFjZGUwMGQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Jhc2UvZGQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9iYXNlL2RkLmNcbkBAIC0xNDM2LDMgJiM0MzsxNDM2LDg1IEBAIHZvaWQgZHJpdmVyX2RldGFjaChjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KVxuIFx0XHRwdXRfZGV2aWNlKGRldik7XG4gXHR9XG4gfVxuJiM0MztcbiYjNDM7c3RydWN0IGRldmljZV9yZXByb2JlIHtcbiYjNDM7XHRzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7XG4mIzQzO1x0c3RydWN0IGRldmljZSAqZGV2O1xuJiM0MztcdGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBkZXZpY2VfcmVwcm9iZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBkZXZpY2VfcmVwcm9iZSAqcnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRldmljZV9yZXByb2JlLFxuJiM0MztcdFx0XHRcdFx0XHQgd29yay53b3JrKTtcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBycC1cdTAwM2VkZXY7XG4mIzQzO1x0c3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LVx1MDAzZXBhcmVudDtcbiYjNDM7XHRib29sIGRldGFjaGVkID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdF9fZGV2aWNlX2RyaXZlcl9sb2NrKGRldiwgcGFyZW50KTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIHJwLVx1MDAzZWRydiBpcyBvbmx5IGV2ZXIgY29tcGFyZWQsIG5ldmVyIGRlcmVmZXJlbmNlZDogdGhlIGRyaXZlciBpdFxuJiM0MztcdCAqIHBvaW50cyB0byBtYXkgaGF2ZSBiZWVuIHVucmVnaXN0ZXJlZCBhbmQgZnJlZWQgYnkgbm93LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghZGV2LVx1MDAzZXAtXHUwMDNlZGVhZCBcdTAwMjZcdTAwMjYgIWRldi1cdTAwM2VwLVx1MDAzZXNodXRkb3duX2RvbmUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGRldi1cdTAwM2Vkcml2ZXIgXHUwMDI2XHUwMDI2IGRldi1cdTAwM2Vkcml2ZXIgPT0gcnAtXHUwMDNlZHJ2KSB7XG4mIzQzO1x0XHRfX2RldmljZV9yZWxlYXNlX2RyaXZlcihkZXYsIHBhcmVudCk7XG4mIzQzO1x0XHRkZXRhY2hlZCA9IHRydWU7XG4mIzQzO1x0fVxuJiM0MztcdF9fZGV2aWNlX2RyaXZlcl91bmxvY2soZGV2LCBwYXJlbnQpO1xuJiM0MztcbiYjNDM7XHRpZiAoZGV0YWNoZWQgXHUwMDI2XHUwMDI2IGRldmljZV9hdHRhY2goZGV2KSBcdTAwM2MgMClcbiYjNDM7XHRcdGRldl9lcnIoZGV2LCBcJiMzNDtyZS1wcm9iZSBmYWlsZWQsIGRldmljZSBsZWZ0IHVuYm91bmRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRwdXRfZGV2aWNlKGRldik7XG4mIzQzO1x0a2ZyZWUocnApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUgLSBzY2hlZHVsZSBhIGRlZmVycmVkIGRldGFjaCBhbmQgcmUtcHJvYmVcbiYjNDM7ICogQGRldjogZGV2aWNlIHRvIGRldGFjaCBhbmQgcmUtcHJvYmVcbiYjNDM7ICogQGRlbGF5X21zOiBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSByZS1wcm9iZSBydW5zXG4mIzQzOyAqXG4mIzQzOyAqIFNjaGVkdWxlIGEgZGV0YWNoIGFuZCByZS1wcm9iZSBvZiBAZGV2IGFmdGVyIEBkZWxheV9tcyBtaWxsaXNlY29uZHMuXG4mIzQzOyAqIFRoZSByZS1wcm9iZSBpcyBza2lwcGVkIGlmLCBieSB0aGUgdGltZSB0aGUgc2NoZWR1bGVkIHdvcmsgcnVucywgdGhlXG4mIzQzOyAqIGRldmljZSBoYXMgYmVlbiByZW1vdmVkLCB0aGUgc3lzdGVtIHNodXRkb3duIHNlcXVlbmNlIGhhcyByZWFjaGVkIHRoZVxuJiM0MzsgKiBkZXZpY2UsIG9yIEBkZXYgaXMgbm8gbG9uZ2VyIGJvdW5kIHRvIHRoZSBkcml2ZXIgdGhhdCB3YXMgYm91bmQgYXRcbiYjNDM7ICogc2NoZWR1bGluZyB0aW1lLiBJbiBwYXJ0aWN1bGFyIGFuIGFkbWluaXN0cmF0aXZlIHVuYmluZCBpcyBuZXZlclxuJiM0MzsgKiB1bmRvbmUgYnkgYSBzdGFsZSByZS1wcm9iZS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHdvcmsgZnVuY3Rpb24gaXMgYnVpbHQtaW4gdGV4dCwgc28gdGhlIGJvdW5kIGRyaXZlciBtYXkgY2FsbCB0aGlzXG4mIzQzOyAqIGZyb20gaXRzIG93biBjb2RlIHdpdGhvdXQgaG9sZGluZyBhIG1vZHVsZSByZWZlcmVuY2UuIElmIHRoZSBkcml2ZXJcbiYjNDM7ICogbW9kdWxlIGlzIHVubG9hZGVkIGJlZm9yZSB0aGUgd29yayBydW5zLCBkcml2ZXIgdW5yZWdpc3RyYXRpb24gdW5iaW5kc1xuJiM0MzsgKiBAZGV2IGZpcnN0IGFuZCB0aGUgc2NoZWR1bGVkIHdvcmsgZG9lcyBub3RoaW5nLlxuJiM0MzsgKlxuJiM0MzsgKiBNdWx0aXBsZSBwZW5kaW5nIHJlLXByb2JlcyBmb3IgdGhlIHNhbWUgZGV2aWNlIGFyZSBpbmRpdmlkdWFsbHkgc2FmZTtcbiYjNDM7ICogYSBjYWxsZXIgdGhhdCB3YW50cyBhdCBtb3N0IG9uZSBwZW5kaW5nIHJlLXByb2JlIG11c3QgZ2F0ZSBzY2hlZHVsaW5nXG4mIzQzOyAqIGl0c2VsZi5cbiYjNDM7ICpcbiYjNDM7ICogTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgQGRldiBpcyBub3QgYSByZWdpc3RlcmVkIGRldmljZVxuJiM0MzsgKiBib3VuZCB0byBhIGRyaXZlciwgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztpbnQgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlX3JlcHJvYmUgKnJwO1xuJiM0MztcbiYjNDM7XHRpZiAoIWRldi1cdTAwM2VidXMgfHwgIWRldi1cdTAwM2VwIHx8ICFkZXZpY2VfaXNfcmVnaXN0ZXJlZChkZXYpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0aWYgKCFkZXYtXHUwMDNlZHJpdmVyKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdHJwID0ga3phbGxvY19vYmooKnJwKTtcbiYjNDM7XHRpZiAoIXJwKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHJwLVx1MDAzZWRldiA9IGdldF9kZXZpY2UoZGV2KTtcbiYjNDM7XHRycC1cdTAwM2VkcnYgPSBSRUFEX09OQ0UoZGV2LVx1MDAzZWRyaXZlcik7XG4mIzQzO1x0SU5JVF9ERUxBWUVEX1dPUksoXHUwMDI2cnAtXHUwMDNld29yaywgZGV2aWNlX3JlcHJvYmVfd29ya19mbik7XG4mIzQzO1x0cXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9kZmxfd3EsIFx1MDAyNnJwLVx1MDAzZXdvcmssXG4mIzQzO1x0XHRcdCAgIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXlfbXMpKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUpO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZVxuaW5kZXggYTdiZTBlNjY2OWRmYS4uYmNjYWMwZDBmNzAzZiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L01ha2VmaWxlXG5AQCAtMSwzICYjNDM7MSwzIEBAXG4gIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIG9iai0kKENPTkZJR19ORVRfRFNBX01YTDg2MikgJiM0Mzs9IG14bDg2Mnh4X2RzYS5vXG4tbXhsODYyeHhfZHNhLXkgOj0gbXhsODYyeHgubyBteGw4NjJ4eC1ob3N0Lm8gbXhsODYyeHgtcGh5bGluay5vXG4mIzQzO214bDg2Mnh4X2RzYS15IDo9IG14bDg2Mnh4Lm8gbXhsODYyeHgtaG9zdC5vIG14bDg2Mnh4LXBoeWxpbmsubyBteGw4NjJ4eC1mdy5vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oXG5pbmRleCBhMTgwYTVkZWNmZmMwLi42Zjc3MTg5NTk4NGNiIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtYXBpLmhcbkBAIC0xMjI0LDYgJiM0MzsxMjI0LDE2IEBAIHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB7XG4gXHRfX2xlMzIgaXZfYnVpbGRfbnVtO1xuIH0gX19wYWNrZWQ7XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBzdHJ1Y3QgbXhsODYyeHhfc3lzX3JlZ19ydyAtIFN5c3RlbSByZWdpc3RlciByZWFkL3dyaXRlXG4mIzQzOyAqIEBhZGRyOiAzMi1iaXQgcmVnaXN0ZXIgYWRkcmVzc1xuJiM0MzsgKiBAdmFsOiByZWdpc3RlciB2YWx1ZVxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IG14bDg2Mnh4X3N5c19yZWdfcncge1xuJiM0MztcdF9fbGUzMiBhZGRyO1xuJiM0MztcdF9fbGUzMiB2YWw7XG4mIzQzO30gX19wYWNrZWQ7XG4mIzQzO1xuIC8qKlxuICAqIGVudW0gbXhsODYyeHhfcG9ydF90eXBlIC0gUG9ydCBUeXBlXG4gICogQE1YTDg2MlhYX0xPR0lDQUxfUE9SVDogTG9naWNhbCBQb3J0XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oXG5pbmRleCBjODdhOTU1YzEzYzQ4Li5hODY1NDI1YWE2MWUxIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtY21kLmhcbkBAIC03MCw3ICYjNDM7NzAsOSBAQFxuICNkZWZpbmUgSU5UX0dQSFlfUkVBRFx0XHRcdChHUFlfR1BZMlhYX01BR0lDICYjNDM7IDB4MSlcbiAjZGVmaW5lIElOVF9HUEhZX1dSSVRFXHRcdFx0KEdQWV9HUFkyWFhfTUFHSUMgJiM0MzsgMHgyKVxuIFxuJiM0MzsjZGVmaW5lIFNZU19NSVNDX0ZXX1VQREFURVx0XHQoU1lTX01JU0NfTUFHSUMgJiM0MzsgMHgxKVxuICNkZWZpbmUgU1lTX01JU0NfRldfVkVSU0lPTlx0XHQoU1lTX01JU0NfTUFHSUMgJiM0MzsgMHgyKVxuJiM0MzsjZGVmaW5lIFNZU19NSVNDX1JFR19SRFx0XHRcdChTWVNfTUlTQ19NQUdJQyAmIzQzOyAweDgpXG4gXG4gI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19DT05GSUdcdChNWEw4NjJYWF9YUENTX01BR0lDICYjNDM7IDB4MSlcbiAjZGVmaW5lIE1YTDg2MlhYX1hQQ1NfUENTX0dFVF9TVEFURVx0KE1YTDg2MlhYX1hQQ1NfTUFHSUMgJiM0MzsgMHgyKVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iNmUwMzdkOTU2NDBiXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuY1xuQEAgLTAsMCAmIzQzOzEsMTA1NCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxuJiM0MzsvKlxuJiM0MzsgKiBGaXJtd2FyZSBmbGFzaCBhbmQgZGV2bGluayBzdXBwb3J0IGZvciBNYXhMaW5lYXIgTXhMODYyeHhcbiYjNDM7ICpcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI1IERhbmllbCBHb2xsZSBcdTAwM2NkYW5pZWxAbWFrcm90b3BpYS5vcmdcdTAwM2VcbiYjNDM7ICpcbiYjNDM7ICogU0IgUERJIC0gZmlybXdhcmUgZG93bmxvYWQgaW50ZXJmYWNlIG92ZXIgY2xhdXNlLTIyIFNNRElPXG4mIzQzOyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgTXhMODYyeHggTUNVYm9vdCBsb2FkZXIgYWNjZXB0cyBhIGZpcm13YXJlIGltYWdlIHRocm91Z2ggZm91ciBcJiMzNDtTQiBQRElcJiMzNDtcbiYjNDM7ICogcmVnaXN0ZXJzIGluIHRoZSBzd2l0Y2ggU01ESU8gcmVnaXN0ZXIgc3BhY2UuIEl0IHJ1bnMgd2hlbmV2ZXIgbm8gV1NQXG4mIzQzOyAqIGZpcm13YXJlIGlzIGFjdGl2ZTogdGhlIG5vcm1hbCBmaXJtd2FyZSB1cGRhdGUgZW50ZXJzIGl0IGRlbGliZXJhdGVseSAtIHRoZVxuJiM0MzsgKiBTWVNfTUlTQ19GV19VUERBVEUgQVBJIGNvbW1hbmQgc2V0cyBhIHN0aWNreSByZXNjdWUgYml0IGFuZCByZWJvb3RzIGludG9cbiYjNDM7ICogTUNVYm9vdCAtIGFuZCB0aGUgbG9hZGVyIGFsc28gc3RheXMgaGVyZSB3aGVuIHRoZSBzdG9yZWQgV1NQIGZpcm13YXJlIGZhaWxzXG4mIzQzOyAqIGl0cyBib290LXRpbWUgaW50ZWdyaXR5IGNoZWNrLiBUaGlzIGRyaXZlciBkcml2ZXMgdGhlIGxvYWRlciYjMzk7cyAweGM1NWNcbiYjNDM7ICogXCYjMzQ7Y29uc29sZVwmIzM0OyBkb3dubG9hZCBwYXRoLlxuJiM0MzsgKlxuJiM0MzsgKiBTTURJTyByZWdpc3RlciBhY2Nlc3MgKG14bDg2Mnh4X3NtZGlvX3JlYWQvd3JpdGUpOlxuJiM0MzsgKiAgIE1JSSByZWcgMHgxZiA6PSAoXHUwMDNjc2JfcGRpX3JlZ1x1MDAzZSBcdTAwMjYgMHhmZmYwKSAgIDsgcGFnZSBsYXRjaFxuJiM0MzsgKiAgIE1JSSByZWcgKFx1MDAzY3NiX3BkaV9yZWdcdTAwM2UgXHUwMDI2IDB4MDAwZikgOj0gLyA9XHUwMDNlIFx1MDAzY3UxNiBkYXRhXHUwMDNlXG4mIzQzOyAqIHNvIENUUkwvQUREUi9EQVRBL1NUQVQgKDB4ZTEwMC4uMHhlMTAzKSBhcmUgTUlJIHJlZ3MgMC8xLzIvMyBvZiBwYWdlXG4mIzQzOyAqIDB4ZTEwMCwgbm90IGFsbCByZWcgMHgwMC5cbiYjNDM7ICpcbiYjNDM7ICogU0IgUERJIHJlZ2lzdGVycyAoaG9zdCBuYW1lL2FkZHIgIC1cdTAwM2UgIE1DVSBtYWlsYm94KTpcbiYjNDM7ICogICBDVFJMIDB4ZTEwMCAtXHUwMDNlIDB4YzA5Mzg0MDAgICBtb2RlOiBSU1Q9MHgwMCAgUkQ9MHgwMSAgV1I9MHgwMlxuJiM0MzsgKiAgIEFERFIgMHhlMTAxIC1cdTAwM2UgMHhjMDkzODQwNCAgIFNCIHRhcmdldCB3b3JkIGFkZHJlc3MgKFNCMSBiYW5rID0gMHg3ODAwKVxuJiM0MzsgKiAgIERBVEEgMHhlMTAyIC1cdTAwM2UgMHhjMDkzODQwOCAgIDE2LWJpdCBkYXRhIC8gcmVwbHkgd29yZFxuJiM0MzsgKiAgIFNUQVQgMHhlMTAzIC1cdTAwM2UgMHhjMDkzODQwYyAgIGhhbmRzaGFrZTogYSBtYWdpYyAoYmVsb3cpIG9yIGEgYnl0ZSBjb3VudFxuJiM0MzsgKlxuJiM0MzsgKiBTVEFUIG1hZ2ljczpcbiYjNDM7ICogICBSRUFEWSAgMHhjNTVjICAgbG9hZGVyIGlkbGUgaW4gdGhlIGNvbnNvbGUgbG9vcCAgICAgICAgKHRoaXMgZHJpdmVyKVxuJiM0MzsgKiAgIERMX1JEWSAweGMzM2MgICBsb2FkZXIgaWRsZSBpbiB0aGUgZmxhc2hsZXNzIGxvb3BcbiYjNDM7ICogICBTVEFSVCAgMHhmNDhmICAgaG9zdCAgIC1cdTAwM2UgYmVnaW4gZG93bmxvYWQgc2Vzc2lvblxuJiM0MzsgKiAgIEFDSyAgICAweGY0OTAgICBsb2FkZXIgLVx1MDAzZSBTVEFSVCBhY2tub3dsZWRnZWQgKFNUQVJUICYjNDM7IDEpXG4mIzQzOyAqICAgRU5EICAgIDB4M2NjMyAgIGhvc3QgICAtXHUwMDNlIGZpbmFsaXNlIG5vdyAob3B0aW9uYWwsIHNlZSBiZWxvdylcbiYjNDM7ICogICBSRFJFRyAgMHhlMmMwICAgaG9zdCAgIC1cdTAwM2UgcmVnaXN0ZXItcmVhZCBjb21tYW5kICh8IGluZGV4KSwgc2VlIGJlbG93XG4mIzQzOyAqXG4mIzQzOyAqIENvbnNvbGUgZmxhc2ggcGF0aCAoU1RBVD0weGM1NWMpIC0gbXhsODYyeHhfZmxhc2hfZmlybXdhcmUoKTpcbiYjNDM7ICpcbiYjNDM7ICogICBob3N0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXJcbiYjNDM7ICogICAtLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS1cbiYjNDM7ICogICByZXNldCAoQ1RSTD1BRERSPURBVEE9MClcbiYjNDM7ICogICByZWFkIFNUQVQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAweGM1NWMgICAoUkVBRFksIGlkbGUpXG4mIzQzOyAqICAgU1RBVCA6PSBTVEFSVCgweGY0OGYpICAtLS0tLS0tLS0tLS0tLVx1MDAzZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXHUwMDNjLS0tLS0tLS0tLS0tLS0gU1RBVCA9IDB4ZjQ5MCAoQUNLKVxuJiM0MzsgKiAgIENUUkwgOj0gV1JcbiYjNDM7ICogICBEQVRBIDo9IGhkclswLi45XSAgKDIwLWJ5dGUgaGVhZGVyOiB0eXBlLHNpemUxLGNyYzEsc2l6ZTIsY3JjMilcbiYjNDM7ICogICByZXNldDsgU1RBVCA6PSAyMCAoaGVhZGVyIGxlbikgIC0tLS0tXHUwMDNlIHBhcnNlIGhkcjsgcl9yZW1haW49c2l6ZTEmIzQzO3NpemUyO1xuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSQVNFIHRhcmdldCByZWdpb24ocylcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzYy0tLS0tLS0tLS0tLS0tIFNUQVQ9MjEgKGxlbiYjNDM7MSksIHRoZW4gU1RBVD0wXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVyYXNlZClcbiYjNDM7ICogICAtLSBwYXlsb2FkLCBzdHJlYW1lZCBpbiBzbGljZXM6IC0tXG4mIzQzOyAqICAgQ1RSTCA6PSBXUlxuJiM0MzsgKiAgIERBVEEgOj0gd29yZCB4IE4gLi4uXG4mIzQzOyAqICAgICBhdCB3b3JkIDE2Mzg0OiBDVFJMOj1SU1Q7IEFERFI6PTB4NzgwMDsgQ1RSTDo9V1IgIChoYWxmLWJhbmsgLVx1MDAzZSBTQjEpXG4mIzQzOyAqICAgICBhdCB3b3JkIDMyNzYwOiBmbHVzaCBzbGljZTpcbiYjNDM7ICogICAgICAgIHJlc2V0OyBTVEFUIDo9IFx1MDAzY2J5dGVzX3RoaXNfc2xpY2VcdTAwM2UgLS0tXHUwMDNlIHJfcmVtYWluIC09IGJ5dGVzOyBwcm9ncmFtXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBcdTAwM2MtLS0tLS0tLS0tLS0tLS0tLS0tIFNUQVQ9MCAgKHJlYWR5IGZvciBuZXh0IHNsaWNlKVxuJiM0MzsgKiAgIC4uLiByZXBlYXQgdW50aWwgdGhlIHdob2xlIHBheWxvYWQgaXMgc2VudCAuLi5cbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzYy0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBVD0wICBpbWFnZSB2ZXJpZmllZFxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNUQVQ9MTogaW1hZ2UgcmVqZWN0ZWQpXG4mIzQzOyAqICAgU1RBVCA6PSBFTkQoMHgzY2MzKSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHUwMDNlIGZpbmFsaXNlIGFuZCBib290XG4mIzQzOyAqXG4mIzQzOyAqIFRoZSByX3JlbWFpbiA9PSAwIHJ1bGUgKGNyaXRpY2FsKTpcbiYjNDM7ICogICBFdmVyeSBob3N0IFNUQVQgd3JpdGUgaW4gdGhlIHBheWxvYWQgcGhhc2UgaXMgYSBieXRlIGNvdW50OyB0aGUgbG9hZGVyXG4mIzQzOyAqICAgZG9lcyByX3JlbWFpbiAtPSBjb3VudCBhbmQgc3RheXMgaW4gdGhlIHJlY2VpdmUgbG9vcCB3aGlsZSByX3JlbWFpbiAhPSAwLlxuJiM0MzsgKiAgIEl0IGxlYXZlcyB0aGUgbG9vcCBPTkxZIHdoZW4gcl9yZW1haW4gaGl0cyBFWEFDVExZIDAsIGFuZCBhIGNvdW50IGxhcmdlclxuJiM0MzsgKiAgIHRoYW4gcl9yZW1haW4gdW5kZXJmbG93cyB0aGUgMzItYml0IGNvdW50ZXIgYW5kIHdlZGdlcyB0aGUgbG9hZGVyIHVudGlsIGFcbiYjNDM7ICogICBwb3dlciBjeWNsZS4gSGF2aW5nIGxlZnQgaXQsIHRoZSBsb2FkZXIgdmVyaWZpZXMgdGhlIGltYWdlLCBwdWJsaXNoZXMgdGhlXG4mIzQzOyAqICAgdmVyZGljdCBpbiBTVEFUICgwIGdvb2QsIDEgcmVqZWN0ZWQpIGFuZCB3YWl0cyAyIHMgZm9yIEVORCBiZWZvcmVcbiYjNDM7ICogICBmaW5hbGlzaW5nIHJlZ2FyZGxlc3MgLS0gY2xlYXJpbmcgaXRzIHJlc2N1ZS1lbmFibGUgYml0IHNvIGJvb3RfZ28gYm9vdHNcbiYjNDM7ICogICB0aGUgbmV3IGltYWdlIC0tIHNvIEVORCBvbmx5IHNhdmVzIHRoYXQgd2FpdC4gSGVuY2U6XG4mIzQzOyAqICAgICAtIG5ldmVyIHNlbmQgYSBzbGljZS9jaHVuayBjb3VudCBsYXJnZXIgdGhhbiB3aGF0IGlzIG91dHN0YW5kaW5nO1xuJiM0MzsgKiAgICAgLSBhIFNUQVQgd3JpdGUgaXMgYSBjb21tYW5kIG9ubHkgb25jZSB0aGUgbG9hZGVyIGhhcyBsZWZ0IHRoZSBsb29wO1xuJiM0MzsgKiAgICAgLSB0aGUgbG9hZGVyIGxlYXZlcyB0aGUgY291bnQgaW4gU1RBVCB3aGlsZSBpdCBwcm9ncmFtcyB0aGUgY2h1bmssIHNvXG4mIzQzOyAqICAgICAgIGEgbGluZ2VyaW5nIGNvdW50IGRvZXMgbm90IGRpc3Rpbmd1aXNoIFwmIzM0O2J1c3lcJiMzNDsgZnJvbSBcJiMzNDt2ZXJkaWN0XCYjMzQ7O1xuJiM0MzsgKiAgICAgLSBpbnRlcnJ1cHRlZC1kb3dubG9hZCByZWNvdmVyeSBmZWVkcyAxIGJ5dGUgYXQgYSB0aW1lIChzZWUgYmVsb3cpLlxuJiM0MzsgKlxuJiM0MzsgKiBJbnRlcnJ1cHRlZC1mbGFzaCByZWNvdmVyeSAobXhsODYyeHhfcmVzY3VlX2RyYWluKTpcbiYjNDM7ICogICBBIGhvc3QgdGhhdCBkaWVzIG1pZC1wYXlsb2FkIGxlYXZlcyB0aGUgbG9hZGVyIGluIHRoZSByZWNlaXZlIGxvb3AgaG9sZGluZ1xuJiM0MzsgKiAgIFNUQVQ9MC4gRmVlZCBzaW5nbGUgMS1ieXRlIGNodW5rcyAob25lIERBVEEgd29yZCAmIzQzOyBTVEFUPTEpIHVudGlsIHJfcmVtYWluXG4mIzQzOyAqICAgcmVhY2hlcyAwOyB0aGUgbG9hZGVyIHRoZW4gdmVyaWZpZXMgdGhlIChub3cgY29ycnVwdCkgaW1hZ2UsIHB1Ymxpc2hlcyBpdHNcbiYjNDM7ICogICB2ZXJkaWN0IGFuZCBjb21lcyBiYWNrIHRvIFJFQURZIGJ5IGl0c2VsZi4gRU5EIGlzIG5ldmVyIHNlbnQgaGVyZTogd2hpbGVcbiYjNDM7ICogICByX3JlbWFpbiBpcyBub24temVybyBpdCB3b3VsZCBiZSBjb25zdW1lZCBhcyBhIDE1NTU1LWJ5dGUgY291bnQsIGFuZCBhXG4mIzQzOyAqICAgbGluZ2VyaW5nIFNUQVQ9MSBjYW5ub3QgYmUgdG9sZCBmcm9tIGEgY2h1bmsgc3RpbGwgYmVpbmcgcHJvZ3JhbW1lZC5cbiYjNDM7ICpcbiYjNDM7ICogUmVnaXN0ZXItcmVhZCBjaGFsbGVuZ2UgKG5vbi1kZXN0cnVjdGl2ZSBsaXZlbmVzcyBwcm9vZik6XG4mIzQzOyAqICAgREFUQSA6PSAweDdjMjMgKG1hcmtlcik7IFNUQVQgOj0gMHhlMmMwfGlkeFxuJiM0MzsgKiAgICAgLVx1MDAzZSBsb2FkZXIgcmV0dXJucyBhIHJ1bnRpbWUgd29yZCBpbiBEQVRBIGFuZCByZS1hcm1zIFNUQVQ9MHhjNTVjLlxuJiM0MzsgKiAgIFRoZSByZXBseSBzb3VyY2UgaXMgbG9hZGVyIEJTUywgbm90IGEgY2hpcCBpZDsgdXNlZCBvbmx5IHRvIHByb3ZlIGEgbGl2ZVxuJiM0MzsgKiAgIG1haWxib3ggaW4gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KCkuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBvdGhlciBTVEFUIHJlYWR5IG1hZ2ljLCAweGMzM2MsIG1hcmtzIHRoZSBsb2FkZXImIzM5O3MgZmxhc2hsZXNzXG4mIzQzOyAqIGNoaXAtdG8tY2hpcCBkb3dubG9hZCBtb2RlIChNeEw4NjI4MVMgMTYtcG9ydCB0aWVyKTsgdGhpcyBkcml2ZXIgZG9lcyBub3RcbiYjNDM7ICogdXNlIGl0LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXNjdWUgbGlmZWN5Y2xlIChkZXZsaW5rKTogcHJvYmUgcnVucyBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QoKTsgYVxuJiM0MzsgKiB3ZWRnZWQgbG9hZGVyIGlzIGRyYWluZWQgYmFjayB0byBSRUFEWSBieSBhIGJhY2tncm91bmQgc2VsZi1oZWFsXG4mIzQzOyAqIChyZXNjdWVfaGVhbF93b3JrKSwgc28gdGhlIGxvbmcgcmVjb3ZlcnkgbmV2ZXIgaG9sZHMgdGhlIGRldmxpbmsgbG9jay5cbiYjNDM7ICogZGV2bGluayBkZXYgaW5mbyBleHBvc2VzIHRoZSBmdyB2ZXJzaW9uICh0aGUgXCYjMzQ7Zmxhc2hhYmxlXCYjMzQ7IHNpZ25hbCkgb25seSBvbmNlIGF0XG4mIzQzOyAqIFJFQURZOyBmbGFzaF91cGRhdGUgcmV0dXJucyAtRUJVU1kgdW50aWwgdGhlbiwgYW5kIHJlcHJvYmVzIHRvIFdTUCBmaXJtd2FyZVxuJiM0MzsgKiBvbiBzdWNjZXNzLlxuJiM0MzsgKlxuJiM0MzsgKiBOb3RlczpcbiYjNDM7ICogICAtIENoaXAgaWQvcmV2aXNpb24gKDB4YzBkMjg4ODQvODgpIGFyZSBOT1QgcmVhY2hhYmxlIG9uIHRoaXMgY2hhbm5lbDsgdGhleVxuJiM0MzsgKiAgICAgbmVlZCB0aGUgY2xhdXNlLTQ1IE1NRCBmaXJtd2FyZSBtYWlsYm94LCB3aGljaCBpcyBkZWFkIHVuZGVyIE1DVWJvb3QuXG4mIzQzOyAqICAgICBSZXNjdWUgaWRlbnRpdHkgaXMgYnkgU0IgUERJIGJlaGF2aW91ciBvbmx5IChteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QpLlxuJiM0MzsgKiAgIC0gVGhlIFNNRElPIFBIWSBhZGRyZXNzIGNvbWVzIGZyb20gdGhlIGRldmljZSB0cmVlOyB0aGUgMHhlMXh4IHJlZ2lzdGVyXG4mIzQzOyAqICAgICBvZmZzZXRzIGFyZSB0aGUgT1RQIHJlc2V0IGRlZmF1bHRzIGFuZCB0aGUgb25seSBsYXlvdXQgc3VwcG9ydGVkIGhlcmUuXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvY3JjMzIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWxheS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2RldmljZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lvcG9sbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L25ldGRldmljZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L292ZXJmbG93LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcnRuZXRsaW5rLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbmV0L2RzYS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY25ldC9zd2l0Y2hkZXYuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bXhsODYyeHguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1hcGkuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1jbWQuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1mdy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LWhvc3QuaFwmIzM0O1xuJiM0MztcbiYjNDM7LyogU0IgUERJIHJlZ2lzdGVycyAoY2xhdXNlLTIyIFNNRElPIGFkZHJlc3Mgc3BhY2UpICovXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxcdFx0MHhlMTAwXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0FERFJcdFx0MHhlMTAxXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0RBVEFcdFx0MHhlMTAyXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1NUQVRcdFx0MHhlMTAzXG4mIzQzO1xuJiM0MzsvKiBTQiBQREkgQ1RSTCBtb2RlcyAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVFx0MHgwMFxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSXHRcdDB4MDJcbiYjNDM7XG4mIzQzOy8qIFNCIFBESSBoYW5kc2hha2UgbWFnaWMgKHB1Ymxpc2hlZC9jb25zdW1lZCB2aWEgU1RBVCkgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfUkVBRFlcdFx0MHhjNTVjXHQvKiBsb2FkZXIgaWRsZSwgY29uc29sZSBsb29wICovXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0RMX1JFQURZXHQweGMzM2NcdC8qIGxvYWRlciBpZGxlLCBmbGFzaGxlc3MgbG9vcCAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEFSVFx0XHQweGY0OGZcbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfRU5EXHRcdDB4M2NjM1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9SRFJFR1x0XHQweGUyYzBcdC8qIHJlZ2lzdGVyLXJlYWQgY21kICh8IGluZGV4KSAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9SRFJFR19NQVJLXHQweDdjMjNcdC8qIG1hcmtlciBwbGFjZWQgaW4gREFUQSBmb3IgUkRSRUcgKi9cbiYjNDM7XG4mIzQzOy8qIEJlaGF2aW91cmFsIHByZXNlbmNlIHByb2JlOiB0d28gZGlzdGluY3QgMTYtYml0IGxhdGNoZXMgb24gQUREUi9EQVRBLiAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9QUk9CRV9BXHRcdDB4NWE1YVxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9QUk9CRV9EXHRcdDB4YTVhNVxuJiM0MztcbiYjNDM7LyogSW1hZ2UgdmVyaWZpY2F0aW9uIHZlcmRpY3QgcHVibGlzaGVkIGluIFNUQVQgb25jZSB0aGUgcmVjZWl2ZSBsb29wIGVuZHMgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX09LXHQwXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1ZFUklGWV9CQURcdDFcbiYjNDM7XG4mIzQzOy8qIEZpcm13YXJlIHRyYW5zZmVyIGdlb21ldHJ5ICovXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfSERSX1NJWkVcdFx0MjBcbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX0hBTEZcdFx0MTYzODRcdC8qIHdvcmRzIHBlciBoYWxmLWJhbmsgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX1NMSUNFXHRcdDMyNzYwXHQvKiB3b3JkcyBwZXIgZnVsbCBzbGljZSAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0ZXX1NCMV9BRERSXHRcdDB4NzgwMFx0LyogU0IxIHdvcmQgYWRkcmVzcyAqL1xuJiM0MztcbiYjNDM7LyogVGltZW91dHMgKGdlbmVyb3VzIHVwcGVyIGJvdW5kcykgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19SRUFEWV9USU1FT1VUX01TXHQzMDAwXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfQUNLX1RJTUVPVVRfTVNcdDUwMDBcbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19FUkFTRV9USU1FT1VUX01TXHQzMDAwMDBcbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19XUklURV9USU1FT1VUX01TXHQ2MDAwMFxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0ZXX1JFQk9PVF9ERUxBWV9NU1x0NTAwMFxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVNcdDUwMFxuJiM0MzsvKiBPbmUgbG9hZGVyIG1haWxib3ggc3RlcDogcHJvZ3JhbSBhIDEtYnl0ZSBjaHVuayBvciBzZXJ2aWNlIGEgY29tbWFuZCAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TXHRcdDIwMDBcbiYjNDM7LyogQ292ZXJzIHRoZSBsb2FkZXImIzM5O3MgRU5EIHdhaXQsIHZlcmlmaWNhdGlvbiBhbmQgdGhlIHJlc2V0IGludG8gUkVBRFkgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TXHQxNTAwMFxuJiM0MztcbiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfcmVzZXQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbiYjNDM7XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUixcbiYjNDM7XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsXG4mIzQzO1x0XHRcdFx0ICAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGV4cGVjdGVkLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0X21zKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCwgdmFsO1xuJiM0MztcbiYjNDM7XHRyZXQgPSByZWFkX3BvbGxfdGltZW91dChteGw4NjJ4eF9zbWRpb19yZWFkLCB2YWwsXG4mIzQzO1x0XHRcdFx0dmFsIFx1MDAzYyAwIHx8ICh1MTYpdmFsID09IGV4cGVjdGVkLFxuJiM0MztcdFx0XHRcdDEwMDAwLCB0aW1lb3V0X21zICogMTAwMCwgZmFsc2UsXG4mIzQzO1x0XHRcdFx0cHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQpO1xuJiM0MztcdGlmICh2YWwgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gdmFsO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX2ZsdXNoX3NsaWNlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LFxuJiM0MztcdFx0XHRcdCAgICAgICB1MzIgZGF0YV93cml0dGVuKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwgZGF0YV93cml0dGVuKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgMCxcbiYjNDM7XHRcdFx0XHRcdCBNWEw4NjJYWF9GV19XUklURV9USU1FT1VUX01TKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRmx1c2ggdGhlIGxhc3Qgc2xpY2UsIHdoaWNoIGVuZHMgdGhlIHJlY2VpdmUgbG9vcDogdGhlIGxvYWRlciB2ZXJpZmllcyB0aGVcbiYjNDM7ICogaW1hZ2UgYW5kIHJlcGxhY2VzIHRoZSBjb3VudCBpbiBTVEFUIHdpdGggaXRzIHZlcmRpY3QsIHNvIHdhaXQgZm9yIHRoZSBjb3VudFxuJiM0MzsgKiB0byBnbyByYXRoZXIgdGhhbiBmb3IgYSBmaXhlZCB2YWx1ZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX2ZsdXNoX2xhc3Qoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsXG4mIzQzO1x0XHRcdFx0ICAgICAgdTMyIGRhdGFfd3JpdHRlbilcbiYjNDM7e1xuJiM0MztcdGludCByZXQsIHZhbDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwgZGF0YV93cml0dGVuKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcmVhZF9wb2xsX3RpbWVvdXQobXhsODYyeHhfc21kaW9fcmVhZCwgdmFsLFxuJiM0MztcdFx0XHRcdHZhbCBcdTAwM2MgMCB8fCAodTE2KXZhbCAhPSAodTE2KWRhdGFfd3JpdHRlbixcbiYjNDM7XHRcdFx0XHQxMDAwMCwgKE1YTDg2MlhYX0ZXX1dSSVRFX1RJTUVPVVRfTVMgJiM0MztcbiYjNDM7XHRcdFx0XHRcdE1YTDg2MlhYX1NCX1BESV9WRVJJRllfTVMpICogMTAwMCxcbiYjNDM7XHRcdFx0XHRmYWxzZSwgcHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQpO1xuJiM0MztcdGlmICh2YWwgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gdmFsO1xuJiM0MztcbiYjNDM7XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1ZFUklGWV9PSylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHQvKiBBIGZpbmFsIGNvdW50IG9mIDEgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgcmVqZWN0IHZlcmRpY3QsIHNvXG4mIzQzO1x0ICogYSB0aW1lb3V0IHN0aWxsIGhvbGRpbmcgaXQgbGFuZHMgaGVyZSB0b28uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCh1MTYpdmFsID09IE1YTDg2MlhYX1NCX1BESV9WRVJJRllfQkFEKSB7XG4mIzQzO1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdFwmIzM0O2ZsYXNoOiBsb2FkZXIgcmVqZWN0ZWQgdGhlIGltYWdlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtRUJBRE1TRztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQgPyByZXQgOiAtRVBST1RPO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBteGw4NjJ4eF9mbGFzaF9ub3RpZnkoc3RydWN0IGRldmxpbmsgKmRsLCBjb25zdCBjaGFyICpzdGF0dXMsXG4mIzQzO1x0XHRcdFx0ICB1MzIgZG9uZSwgdTMyIHRvdGFsKVxuJiM0Mzt7XG4mIzQzO1x0ZGV2bGlua19mbGFzaF91cGRhdGVfc3RhdHVzX25vdGlmeShkbCwgc3RhdHVzLCBOVUxMLCBkb25lLCB0b3RhbCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIEJ5dGUtY291bnQgb2YgZWFjaCBjaHVuayBmZWQgdG8gdGhlIGxvYWRlciBkdXJpbmcgZHJhaW4uIEl0IE1VU1QgYmUgMTogdGhlXG4mIzQzOyAqIGxvYWRlciBvbmx5IGxldHMgdXMgb2JzZXJ2ZSBcJiMzNDtjb3VudGVyID09IDBcJiMzNDssIG5ldmVyIFwmIzM0O2NvdW50ZXIgXHUwMDNjIHN0ZXBcJiMzNDssIHNvIGFueVxuJiM0MzsgKiBzdGVwIFx1MDAzZSAxIGNhbiBzdWJ0cmFjdCBwYXN0IHplcm8sIHVuZGVyZmxvdyB0aGUgMzItYml0IGNvdW50ZXIgYW5kIHdlZGdlIHRoZVxuJiM0MzsgKiBsb2FkZXIgZm9yIH4yXjMyIG1vcmUgYnl0ZXMgKGEgc3RhdGUgb25seSBhIHBvd2VyIGN5Y2xlIGNsZWFycykuIFN0ZXBwaW5nIGJ5XG4mIzQzOyAqIDEgd2Fsa3MgdGhlIGNvdW50ZXIgdGhyb3VnaCBldmVyeSB2YWx1ZSBhbmQgaXMgZ3VhcmFudGVlZCB0byBsYW5kIG9uIHplcm9cbiYjNDM7ICogd2hhdGV2ZXIgaXRzIChwb3NzaWJseSBvZGQpIHN0YXJ0LiBBIDEtYnl0ZSBjaHVuayBpcyBhIHBhdGggdGhlIGxvYWRlclxuJiM0MzsgKiBhbHJlYWR5IGhhbmRsZXM6IHRoZSBub3JtYWwgdHJhbnNmZXIgZW5kcyB3aXRoIGEgc2luZ2xlIHRyYWlsaW5nIGJ5dGUgZm9yXG4mIzQzOyAqIG9kZC1zaXplZCBpbWFnZXMgKHNlZSBTdGVwIDYpLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFU1x0MVxuJiM0MztcbiYjNDM7LyogTG9nIHRoZSBkcmFpbiYjMzk7cyBwcm9ncmVzcyBldmVyeSBzbyBtYW55IGJ5dGVzOyBpdCBjYW4gcnVuIGZvciBhIGxvbmcgdGltZSAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFU1x0KDEyOCAqIDEwMjQpXG4mIzQzO1xuJiM0MzsvKiBXYWl0IGZvciB0aGUgbG9hZGVyIHRvIGFzayBmb3IgdGhlIG5leHQgY2h1bmsgKFNUQVQgMCkgb3IgdG8gY29tZSBiYWNrIHRvIGl0c1xuJiM0MzsgKiBjb21tYW5kIGxvb3AgKFNUQVQgUkVBRFkpLCBhbmQgcmV0dXJuIHRoZSBTVEFUIHZhbHVlIGVpdGhlciB3YXkuIE9uIHRpbWVvdXRcbiYjNDM7ICogdGhhdCBpcyB3aGF0ZXZlciBTVEFUIHN0aWxsIGhvbGRzLCB3aGljaCBjYXJyaWVzIG5vIGZ1cnRoZXIgaW5mb3JtYXRpb246IHRoZVxuJiM0MzsgKiBsb2FkZXIga2VlcHMgdGhlIGNvdW50IHdlIHdyb3RlIHZpc2libGUgd2hpbGUgaXQgcHJvZ3JhbXMgdGhlIGNodW5rLCBhbmQgdGhhdFxuJiM0MzsgKiBpcyB0aGUgc2FtZSB2YWx1ZSBpdCBwdWJsaXNoZXMgYXMgdGhlIFwmIzM0O2ltYWdlIHJlamVjdGVkXCYjMzQ7IHZlcmRpY3Qgb25jZSB0aGVcbiYjNDM7ICogY291bnRlciByZWFjaGVzIHplcm8uXG4mIzQzOyAqXG4mIzQzOyAqIFNUQVQgMCBpcyB1bmFtYmlndW91cyBoZXJlIGV2ZW4gdGhvdWdoIGl0IGlzIGFsc28gdGhlIFwmIzM0O2ltYWdlIHZlcmlmaWVkXCYjMzQ7XG4mIzQzOyAqIHZlcmRpY3Q6IGJ5IHRoZSByX3JlbWFpbiA9PSAwIHJ1bGUgdGhlIGxvYWRlciBsZWF2ZXMgdGhlIHJlY2VpdmUgbG9vcCB0aGVcbiYjNDM7ICogbW9tZW50IHRoZSBjb3VudGVyIHJlYWNoZXMgemVybywgc28gaXQgaXMgbmV2ZXIgYm90aCBpbnNpZGUgdGhlIGxvb3AgYXNraW5nXG4mIzQzOyAqIGZvciBhIGNodW5rIGFuZCBwdWJsaXNoaW5nIGEgdmVyZGljdC4gT25jZSBpdCBoYXMgbGVmdCwgdGhlIG5leHQgU1RBVCB3cml0ZVxuJiM0MzsgKiBpcyBhIGNvbW1hbmQgcmF0aGVyIHRoYW4gYSBjb3VudCwgc28gZmVlZGluZyBvbmUgbW9yZSBjaHVuayBhZnRlciBhIHZlcmRpY3RcbiYjNDM7ICogY2Fubm90IHVuZGVyZmxvdyBhbnl0aGluZyBlaXRoZXIuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IG14bDg2Mnh4X3NiX3BkaV9wb2xsX2RyYWluKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcylcbiYjNDM7e1xuJiM0MztcdGludCB2YWw7XG4mIzQzO1xuJiM0MztcdHJlYWRfcG9sbF90aW1lb3V0KG14bDg2Mnh4X3NtZGlvX3JlYWQsIHZhbCxcbiYjNDM7XHRcdFx0ICB2YWwgXHUwMDNjIDAgfHwgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZIHx8XG4mIzQzO1x0XHRcdCAgKHUxNil2YWwgPT0gMCxcbiYjNDM7XHRcdFx0ICA1MCwgdGltZW91dF9tcyAqIDEwMDAsIGZhbHNlLFxuJiM0MztcdFx0XHQgIHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFUKTtcbiYjNDM7XHRpZiAodmFsIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHZhbDtcbiYjNDM7XHRyZXR1cm4gKHUxNil2YWw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFRoZSBsb2FkZXIgaXMgbm90IGFza2luZyBmb3IgYSBjaHVuazogaXQgbWF5IHN0aWxsIGJlIHByb2dyYW1taW5nIHRoZSBsYXN0XG4mIzQzOyAqIG9uZSwgb3IgdGhlIGNvdW50ZXIgaGFzIHJlYWNoZWQgemVybyBhbmQgaXQgaXMgdmVyaWZ5aW5nIHRoZSBpbWFnZSBhbmRcbiYjNDM7ICogcmVzZXR0aW5nIGludG8gUkVBRFkuIFdhaXQgdGhhdCBvdXQgLS0gU1RBVCBjYW5ub3QgdGVsbCB0aGUgdHdvIGFwYXJ0LCBhbmRcbiYjNDM7ICogZ3Vlc3Npbmcgd291bGQgbWVhbiB3cml0aW5nIEVORCBpbnRvIGEgbGl2ZSByZWNlaXZlIGxvb3AuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbmNlIHRoZSBsb2FkZXIgaGFzIGxlZnQgdGhlIGxvb3AsIC1FQUdBSU4gaWYgaXQgYXNrcyBmb3IgYW5vdGhlclxuJiM0MzsgKiBjaHVuayBhZnRlciBhbGwsIC1FSU8gZm9yIGEgbG9hZGVyIHN0aWxsIGhvbGRpbmcgdGhlIGNvdW50IHdoZW4gdGhlIHZlcmlmeVxuJiM0MzsgKiB3aW5kb3cgZXhwaXJlcywgb3IgYW4gU01ESU8gYnVzIGVycm9yLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9yZXNjdWVfZHJhaW5fZmluaXNoKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgY2h1bmspXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2O1xuJiM0MztcdGludCBzdGF0O1xuJiM0MztcbiYjNDM7XHRzdGF0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfZHJhaW4ocHJpdiwgTVhMODYyWFhfU0JfUERJX1ZFUklGWV9NUyk7XG4mIzQzO1x0aWYgKHN0YXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gc3RhdDtcbiYjNDM7XHRpZiAoc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfUkVBRFkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAoc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX0JBRCkge1xuJiM0MztcdFx0ZGV2X2VycihkZXYsXG4mIzQzO1x0XHRcdFwmIzM0O2ZsYXNoOiBsb2FkZXIgc3R1Y2sgYWZ0ZXIgJXUgY2h1bmtzLCBwb3dlciBjeWNsZSBpdFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0Y2h1bmspO1xuJiM0MztcdFx0cmV0dXJuIC1FSU87XG4mIzQzO1x0fVxuJiM0MztcdGlmIChzdGF0KSB7XG4mIzQzO1x0XHQvKiBBIGZpcm13YXJlIGlzIGFuc3dlcmluZywgbm90IHRoZSBsb2FkZXI6IGFuIGltYWdlIHN1cnZpdmVkXG4mIzQzO1x0XHQgKiBpbiBmbGFzaCBhbmQgYm9vdGVkLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRkZXZfaW5mbyhkZXYsIFwmIzM0O2ZsYXNoOiBmaXJtd2FyZSBib290ZWQgd2hpbGUgZHJhaW5pbmdcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gLUVBR0FJTjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUmVjb3ZlciBhIHN3aXRjaCB3aG9zZSBTQiBQREkgZG93bmxvYWQgd2FzIGludGVycnVwdGVkIG1pZC10cmFuc2ZlciAtIHRoZVxuJiM0MzsgKiBob3N0IGRpZWQgYWZ0ZXIgTUNVYm9vdCBiZWdhbiBlcmFzaW5nIGZsYXNoLCB3aGV0aGVyIGl0IGFib3J0ZWQgbWlkIGVyYXNlIG9yXG4mIzQzOyAqIG1pZCBpbWFnZS13cml0ZSwgYm90aCBlbmQgdXAgaW4gdGhlIHNhbWUgcGxhY2U6IHRoZSBwYXlsb2FkIHJlY2VpdmUgbG9vcC5cbiYjNDM7ICogVGhlcmUgdGhlIGxvYWRlciBwdWJsaXNoZXMgU1RBVD0wLCB3YWl0cyBmb3IgdGhlIGhvc3QgdG8gd3JpdGUgYSBieXRlLWNvdW50XG4mIzQzOyAqIHRvIFNUQVQsIERNQXMgdGhhdCBtYW55IGJ5dGVzIGFuZCBzdWJ0cmFjdHMgdGhlIGNvdW50IGZyb20gYSByZW1haW5pbmctYnl0ZXNcbiYjNDM7ICogY291bnRlciwgbGVhdmluZyB0aGUgbG9vcCBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgcmVhY2hlcyBleGFjdGx5IHplcm8uIFRoZVxuJiM0MzsgKiBpbWFnZSBzaXplIGRpZWQgd2l0aCB0aGUgaG9zdCwgc28gd2UgZmVlZCBzaW5nbGUtYnl0ZSBjaHVua3MgKHNlZVxuJiM0MzsgKiBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUykgdG8gd2FsayB0aGUgY291bnRlciB0byB6ZXJvIHdpdGhvdXQgdW5kZXJmbG93LlxuJiM0MzsgKiBUaGUgbG9hZGVyIHRoZW4gdmVyaWZpZXMgdGhlIChub3cgY29ycnVwdCkgaW1hZ2UgYW5kIHJldHVybnMgdG8gUkVBRFkgYnlcbiYjNDM7ICogaXRzZWxmLCBvciBib290cyBhIHZhbGlkIGltYWdlIHRoYXQgaGFwcGVuZWQgdG8gc3Vydml2ZSBpbiBmbGFzaDsgZWl0aGVyIHdheVxuJiM0MzsgKiB0aGUgY2FsbGVyJiMzOTtzIHJlcHJvYmUgY2xhc3NpZmllcyB0aGUgcmVzdWx0LiBFdmVyeSBieXRlIGNvc3RzIGFib3V0IGEgZG96ZW5cbiYjNDM7ICogTURJTyBmcmFtZXMsIHNvIGEgbXVsdGktTWlCIG91dHN0YW5kaW5nIGNvdW50IHRha2VzIHRlbnMgb2YgbWludXRlcy5cbiYjNDM7ICogUmV0dXJucyAwIG9uY2UgdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgcmVjZWl2ZSBsb29wLCBcdTAwM2MwIG9uIGVycm9yLiBEb2VzIE5PVFxuJiM0MzsgKiByZWNvdmVyIGEgY291bnRlciBhbHJlYWR5IHVuZGVyZmxvd2VkIGJ5IGFuIGVhcmxpZXIgb3ZlcnNpemVkLWNodW5rIGF0dGVtcHRcbiYjNDM7ICogLSB0aGF0IG5lZWRzIGEgcG93ZXIgY3ljbGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbihzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXY7XG4mIzQzO1x0LyogQm91bmQ6IHR3aWNlIHRoZSBsb2FkZXImIzM5O3MgMTYgTWlCIGltYWdlIGNhcCwgb25lIGJ5dGUgcGVyIGNodW5rLiAqL1xuJiM0MztcdHUzMiBtYXhfY2h1bmtzID0gMnUgKiAoMTZ1IFx1MDAzY1x1MDAzYyAyMCkgLyBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUztcbiYjNDM7XHR1MzIgY2h1bmsgPSAwO1xuJiM0MztcdGludCByZXQsIHN0YXQ7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChjaHVuayBcdTAwM2MgbWF4X2NodW5rcykge1xuJiM0MztcdFx0LyogVGVhcmRvd24gY2FuIGludGVycnVwdCB0aGlzIGxvbmcgZHJhaW4uICovXG4mIzQzO1x0XHRpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFx1MDAyNnByaXYtXHUwMDNlZmxhZ3MpKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVDQU5DRUxFRDtcbiYjNDM7XG4mIzQzO1x0XHRzdGF0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfZHJhaW4ocHJpdiwgTVhMODYyWFhfU0JfUERJX1NURVBfTVMpO1xuJiM0MztcdFx0aWYgKHN0YXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiBzdGF0O1xuJiM0MztcdFx0aWYgKHN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKVxuJiM0MztcdFx0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoc3RhdCkge1xuJiM0MztcdFx0XHRyZXQgPSBteGw4NjJ4eF9yZXNjdWVfZHJhaW5fZmluaXNoKHByaXYsIGNodW5rKTtcbiYjNDM7XHRcdFx0aWYgKHJldCAhPSAtRUFHQUlOKVxuJiM0MztcdFx0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0LyogRmVlZCBvbmUgemVybyBieXRlOyByZXNldCBjbGVhcmVkIHRoZSB3cml0ZSBsYXRjaC4gKi9cbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCAweDAwMDApO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcbiYjNDM7XHRcdFx0XHRcdCAgIE1YTDg2MlhYX0RSQUlOX0NIVU5LX0JZVEVTKTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHRjaHVuayYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRpZiAoIShjaHVuayAlIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFUykpXG4mIzQzO1x0XHRcdGRldl9pbmZvKGRldiwgXCYjMzQ7Zmxhc2g6IGRyYWluZWQgJXUgS2lCIHNvIGZhclxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgY2h1bmsgLyAxMDI0KTtcbiYjNDM7XHRcdGNvbmRfcmVzY2hlZCgpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZGV2X2VycihkZXYsXG4mIzQzO1x0XHRcJiMzNDtmbGFzaDogaW50ZXJydXB0ZWQgZG93bmxvYWQgZGlkIG5vdCBkcmFpbiBhZnRlciAldSBjaHVua3NcXG5cJiMzNDssXG4mIzQzO1x0XHRjaHVuayk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAtRVRJTUVET1VUO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBCYWNrZ3JvdW5kIHNlbGYtaGVhbDogZHJhaW4gYSB3ZWRnZWQgZG93bmxvYWQgb2ZmIHRoZSBkZXZsaW5rIGZsYXNoIHBhdGgsIHNvXG4mIzQzOyAqIHRoZSBsb25nIHJlY292ZXJ5IG5ldmVyIGhvbGRzIHRoZSBkZXZsaW5rIGxvY2suIFNjaGVkdWxlZCBmcm9tIHByb2JlO1xuJiM0MzsgKiByZXByb2JlcyBvbiBzdWNjZXNzIHNvIHRoZSBwcm9iZS10aW1lIGRldGVjdGlvbiByZS1jbGFzc2lmaWVzIHRoZSBzd2l0Y2guXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPVxuJiM0MztcdFx0Y29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBteGw4NjJ4eF9wcml2LCByZXNjdWVfaGVhbF93b3JrKTtcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbihwcml2KTtcbiYjNDM7XHRpZiAocmV0ID09IC1FQ0FOQ0VMRUQpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0LyogTm90aGluZyByZXRyaWVzIHRoaXMsIHNvIHNheSBzbzogcmVzY3VlX3JlYWR5IHN0YXlzIGNsZWFyXG4mIzQzO1x0XHQgKiBhbmQgZGV2bGluayBkZXYgZmxhc2ggcmVwb3J0cyB3aHkgaXQgcmVmdXNlcy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0ZGV2X2VycihkZXYsIFwmIzM0O2ZsYXNoOiBkb3dubG9hZCByZWNvdmVyeSBmYWlsZWQ6ICVwZVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0RVJSX1BUUihyZXQpKTtcbiYjNDM7XHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfZmFpbGVkLCB0cnVlKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBpbnRlcnJ1cHRlZCB0cmFuc2ZlciBpcyBmaW5hbGlzZWQ7IHJlcHJvYmUgc28gdGhlIHByb2JlLXRpbWVcbiYjNDM7XHQgKiBkZXRlY3Rpb24gYnJpbmdzIHRoZSBkcml2ZXIgdXAgLS0gZmxhc2hhYmxlIGluIHJlc2N1ZSBtb2RlIGlmIHRoZVxuJiM0MztcdCAqIGxvYWRlciBpcyBhdCBSRUFEWSwgb3Igbm9ybWFsbHkgaWYgYSB2YWxpZCBpbWFnZSBib290ZWQuIFRoZSBjb3JlXG4mIzQzO1x0ICogc2tpcHMgdGhlIHJlLXByb2JlIG9uIGl0cyBvd24gaWYgdGhlIGRldmljZSBpcyB1bmJvdW5kIGZpcnN0OyB0aGVcbiYjNDM7XHQgKiBmbGFnIHRlc3Qgb25seSBhdm9pZHMgc2NoZWR1bGluZyBvbmUgY2VydGFpbiB0byBiZSBza2lwcGVkLiBBXG4mIzQzO1x0ICogZmFpbGVkIGhhbmQtb2ZmIGxlYXZlcyBub3RoaW5nIHRvIHJlY2xhc3NpZnkgdGhlIHN3aXRjaCwgc28gbWFya1xuJiM0MztcdCAqIHJlY292ZXJ5IGZhaWxlZCByYXRoZXIgdGhhbiBwcm9taXNlIGEgcmV0cnkgdGhhdCBjYW5ub3Qgc3VjY2VlZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFx1MDAyNnByaXYtXHUwMDNlZmxhZ3MpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAoZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZGV2LCBNWEw4NjJYWF9GV19SRVBST0JFX0RFTEFZX01TKSlcbiYjNDM7XHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfZmFpbGVkLCB0cnVlKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRGV0ZWN0IE1DVWJvb3QgcmVzY3VlIG1vZGUgb3ZlciBjbGF1c2UtMjIgU01ESU8gYWxvbmUsIHNvIHRoZSBjYWxsZXIgY2FuIHJ1bGVcbiYjNDM7ICogdGhlIGxvYWRlciBvdXQgYmVmb3JlIGFueSBDNDUgQVBJIHJlcXVlc3QgKHdoaWNoIHNwZXdzIENSQyBlcnJvcnMgd2hlbiBubyBXU1BcbiYjNDM7ICogZmlybXdhcmUgYW5zd2VycykuIEEgc2NyYXRjaCB3cml0ZSB0byBBRERSL0RBVEEgbXVzdCBsYXRjaCBvciB0aGUgY2hpcCBpc1xuJiM0MzsgKiBhYnNlbnQgKC1FTk9ERVYpOyB0aGUgbWFpbGJveCBpcyByZXNldCBmaXJzdCwgb3IgYSB0cmFuc2ZlciBpbnRlcnJ1cHRlZCB3aXRoXG4mIzQzOyAqIENUUkw9V1Igd291bGQgdGFrZSB0aGF0IHdyaXRlIGFzIGEgcGF5bG9hZCB3b3JkIGluc3RlYWQgb2YgbGF0Y2hpbmcgaXQuIFNUQVRcbiYjNDM7ICogdGhlbiBjbGFzc2lmaWVzIHRoZSBzdGF0ZSwgcG9rZWQgZGVzdHJ1Y3RpdmVseSBvbmx5IHdoZW4gMCwgdGhlIG9uZSB2YWx1ZSBhXG4mIzQzOyAqIHJ1bm5pbmcgZmlybXdhcmUgbmV2ZXIgaG9sZHM6XG4mIzQzOyAqXG4mIzQzOyAqICAtIDB4YzMzYzogZmxhc2hsZXNzIGxvb3A7IHJlY29nbmlzZWQgYnV0IG5vdCBzdXBwb3J0ZWQgaGVyZS5cbiYjNDM7ICogIC0gMHhjNTVjOiBjb25zb2xlIGxvb3AsIGlmIHRoZSByZWdpc3Rlci1yZWFkIGNoYWxsZW5nZSBpcyBzZXJ2aWNlZC5cbiYjNDM7ICogIC0gb3RoZXIgbm9uLXplcm86IHJ1bm5pbmcgZmlybXdhcmUsIGxlZnQgdW5wb2tlZC5cbiYjNDM7ICogIC0gMDogd2VkZ2VkIHJlY2VpdmUgbG9vcDsgdGhlIDEtYnl0ZSBzbGljZS1hZHZhbmNlIHRoZW4gc2F5cyB3aGV0aGVyIGl0XG4mIzQzOyAqICAgIHN0aWxsIG5lZWRzIGRyYWluaW5nIG9yIGhhcyBqdXN0IGZpbmlzaGVkLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgc2NyYXRjaCB3cml0ZSByZWFjaGVzIGEgcnVubmluZyBmaXJtd2FyZSB0b28sIGJ1dCBsYW5kcyBpbiBtYWlsYm94XG4mIzQzOyAqIHJlZ2lzdGVycyBpdCBkb2VzIG5vdCByZWFkLCBzbyBpdCBpcyBpbmVydCB0aGVyZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBNWEw4NjJYWF9JTl9SRVNDVUUsIE1YTDg2MlhYX05PVF9SRVNDVUUsIC1FTk9ERVYgd2hlbiB0aGUgc2NyYXRjaFxuJiM0MzsgKiB3cml0ZSBkb2VzIG5vdCBsYXRjaCwgd2hpY2ggaXMgYSBzd2l0Y2ggdGhhdCBkb2VzIG5vdCBhbnN3ZXIgYXQgYWxsIG9yIG9uZVxuJiM0MzsgKiB3aG9zZSBTQiBQREkgd2luZG93IGlzIG5vdCBhdCB0aGUgb2Zmc2V0cyBhYm92ZSwgLUVPUE5PVFNVUFAgZm9yIHRoZVxuJiM0MzsgKiBmbGFzaGxlc3MgbG9vcCwgLUVOWElPIGZvciBhIFJFQURZIGxvYWRlciB3aG9zZSBtYWlsYm94IGZhaWxzIHRoZSBjaGFsbGVuZ2UsXG4mIzQzOyAqIG9yIGFuIFNNRElPIGJ1cyBlcnJvci5cbiYjNDM7ICovXG4mIzQzO2ludCBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3Qoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc3RhdCwgZGF0LCByZXQsIHJiLCBhLCBkO1xuJiM0MztcbiYjNDM7XHQvKiByZXNjdWVfcmVhZHkgZ2F0ZXMgZmxhc2hpbmc7IGEgd2VkZ2VkIGxvYWRlciBuZWVkcyB0aGUgZHJhaW4gZmlyc3QuICovXG4mIzQzO1x0V1JJVEVfT05DRShwcml2LVx1MDAzZXJlc2N1ZV9yZWFkeSwgZmFsc2UpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIFByZXNlbmNlOiBhIGxpdmUgY2hpcCBsYXRjaGVzIHRoZSBzY3JhdGNoIHdyaXRlLCBhbiBhYnNlbnQgb25lIGZsb2F0cy4gKi9cbiYjNDM7XHRhID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsXG4mIzQzO1x0XHRcdFx0IE1YTDg2MlhYX1NCX1BESV9QUk9CRV9BKTtcbiYjNDM7XHRpZiAoYSBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiBhO1xuJiM0MztcdGQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSxcbiYjNDM7XHRcdFx0XHQgTVhMODYyWFhfU0JfUERJX1BST0JFX0QpO1xuJiM0MztcdGlmIChkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIGQ7XG4mIzQzO1x0YSA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIpO1xuJiM0MztcdGlmIChhIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIGE7XG4mIzQzO1x0ZCA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEpO1xuJiM0MztcdGlmIChkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIGQ7XG4mIzQzO1x0aWYgKCh1MTYpYSAhPSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSB8fFxuJiM0MztcdCAgICAodTE2KWQgIT0gTVhMODYyWFhfU0JfUERJX1BST0JFX0QpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0RFVjtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRzdGF0ID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XG4mIzQzO1x0aWYgKHN0YXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gc3RhdDtcbiYjNDM7XG4mIzQzO1x0LyogRmxhc2hsZXNzLWRvd25sb2FkIGxvb3AgKE14TDg2MjgxIHRpZXIpOiB1bnN1cHBvcnRlZC4gKi9cbiYjNDM7XHRpZiAoKHUxNilzdGF0ID09IE1YTDg2MlhYX1NCX1BESV9ETF9SRUFEWSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0LyogQ29uc29sZSBsb29wIGF0IFJFQURZOiBjb25maXJtIHRoZSBsaXZlIG1haWxib3ggd2l0aCB0aGUgcmVnaXN0ZXItcmVhZFxuJiM0MztcdCAqIGNoYWxsZW5nZSAoY29uc3VtZXMgdGhlIG1hcmtlciBmcm9tIERBVEEgYW5kIHJlLWFybXMgUkVBRFkpLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICgodTE2KXN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKSB7XG4mIzQzO1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSxcbiYjNDM7XHRcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9SRFJFR19NQVJLKTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcbiYjNDM7XHRcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9SRFJFRyk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0cmIgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIE1YTDg2MlhYX1NCX1BESV9SRUFEWSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBNWEw4NjJYWF9TQl9QRElfU1RFUF9NUyk7XG4mIzQzO1x0XHRkYXQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBKTtcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcbiYjNDM7XHRcdC8qIE5ldmVyIHJlLWFybWluZyBSRUFEWSBmYWlscyB0aGUgY2hhbGxlbmdlIGxpa2UgYW55IG90aGVyXG4mIzQzO1x0XHQgKiB1bnNlcnZpY2VkIGNvbW1hbmQ7IHJlcG9ydCBpdCBhcyBzdWNoIHJhdGhlciB0aGFuIGFzIGEgYnVzXG4mIzQzO1x0XHQgKiB0aW1lb3V0IHRoZSBidXMgbmV2ZXIgc2F3LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAocmIgPT0gLUVUSU1FRE9VVClcbiYjNDM7XHRcdFx0cmIgPSAtRU5YSU87XG4mIzQzO1x0XHRpZiAocmIgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByYjtcbiYjNDM7XHRcdGlmIChkYXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiBkYXQ7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0aWYgKCh1MTYpZGF0ICE9IE1YTDg2MlhYX1NCX1BESV9SRFJFR19NQVJLKSB7XG4mIzQzO1x0XHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHksIHRydWUpO1xuJiM0MztcdFx0XHRyZXR1cm4gTVhMODYyWFhfSU5fUkVTQ1VFO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0LyogUkVBRFkgYnV0IHRoZSBtYXJrZXIgaXMgdW50b3VjaGVkLCBzbyBub3RoaW5nIGlzIHNlcnZpY2luZyB0aGVcbiYjNDM7XHRcdCAqIG1haWxib3guIEEgZmlybXdhcmUgcHVibGlzaGluZyAweGM1NWMgYXMgaXRzIHN0YXR1cyB3b3JkIGxvb2tzXG4mIzQzO1x0XHQgKiBleGFjdGx5IGxpa2UgdGhpcywgYW5kIGZsYXNoaW5nIG9uZSB3b3VsZCBiZSBmYXIgd29yc2UgdGhhblxuJiM0MztcdFx0ICogcmVmdXNpbmcgdG8gYmluZCwgc28gdHJlYXQgaXQgYXMgdW51c2FibGUuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBBbnkgb3RoZXIgbm9uLXplcm8gdmFsdWUgaXMgYSBydW5uaW5nIGZpcm13YXJlLCBub3QgYSBsb2FkZXIuICovXG4mIzQzO1x0aWYgKHN0YXQpXG4mIzQzO1x0XHRyZXR1cm4gTVhMODYyWFhfTk9UX1JFU0NVRTtcbiYjNDM7XG4mIzQzO1x0LyogU1RBVCA9PSAwOiBhIHdlZGdlZCByZWNlaXZlIGxvb3AgdGFrZXMgYSAxLWJ5dGUgc2xpY2UtYWR2YW5jZSAoZmVlZFxuJiM0MztcdCAqIG9uZSBEQVRBIHdvcmQgZmlyc3QsIGxpa2UgYSBkcmFpbiBjaHVuaykgYW5kIGFza3MgZm9yIHRoZSBuZXh0IGNodW5rXG4mIzQzO1x0ICogYnkgcHVibGlzaGluZyAwIGFnYWluLiBIYWQgdGhhdCBieXRlIGJlZW4gdGhlIGxhc3Qgb25lIG91dHN0YW5kaW5nLFxuJiM0MztcdCAqIHRoZSBsb2FkZXIgbGVhdmVzIHRoZSBsb29wIGluc3RlYWQgYW5kIHJldHVybnMgdG8gUkVBRFksIGhhdmluZ1xuJiM0MztcdCAqIGNvbnN1bWVkIHRoZSBhZHZhbmNlIC0tIHByb29mIGVub3VnaCBvZiBhIGxpdmUgbWFpbGJveCB0byBza2lwIHRoZVxuJiM0MztcdCAqIGNoYWxsZW5nZS4gQW55dGhpbmcgZWxzZSBtZWFucyBpdCBpcyBzdGlsbCB3b3JraW5nIG9uIGl0LiBBbGwgdGhyZWVcbiYjNDM7XHQgKiBhcmUgcmVzY3VlLCBzbyB0aGlzIG5ldmVyIGZhaWxzIHByb2JlOyBvbmx5IHRoZSBkcmFpbiBkb2VzLlxuJiM0MztcdCAqL1xuJiM0MztcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgMHgwMDAwKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsXG4mIzQzO1x0XHRcdFx0ICAgTVhMODYyWFhfRFJBSU5fQ0hVTktfQllURVMpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyYiA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX2RyYWluKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TKTtcbiYjNDM7XHRpZiAocmIgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmI7XG4mIzQzO1x0aWYgKHJiID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSlcbiYjNDM7XHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHksIHRydWUpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gTVhMODYyWFhfSU5fUkVTQ1VFO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBNQ1Vib290IGZpcm13YXJlIGltYWdlIGhlYWRlciAqL1xuJiM0MztzdHJ1Y3QgbXhsODYyeHhfZndfaGRyIHtcbiYjNDM7XHRfX2xlMzIgaW1hZ2VfdHlwZTtcbiYjNDM7XHRfX2xlMzIgaW1hZ2Vfc2l6ZV8xO1xuJiM0MztcdF9fbGUzMiBpbWFnZV9jaGVja3N1bV8xO1xuJiM0MztcdF9fbGUzMiBpbWFnZV9zaXplXzI7XG4mIzQzO1x0X19sZTMyIGltYWdlX2NoZWNrc3VtXzI7XG4mIzQzO30gX19wYWNrZWQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IG14bDg2Mnh4X2ZsYXNoX3ZhbGlkYXRlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LFxuJiM0MztcdFx0XHRcdCAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsXG4mIzQzO1x0XHRcdFx0ICAgdTMyICpwYXlsb2FkX3NpemUpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICpoZHI7XG4mIzQzO1x0dTMyIHNpemUxLCBzaXplMiwgdG90YWw7XG4mIzQzO1x0Y29uc3QgdTggKnBheWxvYWQ7XG4mIzQzO1x0dTMyIGNyYztcbiYjNDM7XG4mIzQzO1x0aWYgKGZ3LVx1MDAzZXNpemUgXHUwMDNjIE1YTDg2MlhYX0ZXX0hEUl9TSVpFKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdGhkciA9IChjb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICopZnctXHUwMDNlZGF0YTtcbiYjNDM7XHRwYXlsb2FkID0gZnctXHUwMDNlZGF0YSAmIzQzOyBNWEw4NjJYWF9GV19IRFJfU0laRTtcbiYjNDM7XHRzaXplMSA9IGxlMzJfdG9fY3B1KGhkci1cdTAwM2VpbWFnZV9zaXplXzEpO1xuJiM0MztcdHNpemUyID0gbGUzMl90b19jcHUoaGRyLVx1MDAzZWltYWdlX3NpemVfMik7XG4mIzQzO1xuJiM0MztcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coc2l6ZTEsIHNpemUyLCBcdTAwMjZ0b3RhbCkgfHxcbiYjNDM7XHQgICAgdG90YWwgXHUwMDNlIGZ3LVx1MDAzZXNpemUgLSBNWEw4NjJYWF9GV19IRFJfU0laRSkge1xuJiM0MztcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcJiMzNDtmbGFzaDogZmlybXdhcmUgZmlsZSB0b28gc21hbGwgZm9yIGRlY2xhcmVkIHNpemVcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIXRvdGFsKSB7XG4mIzQzO1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdFwmIzM0O2ZsYXNoOiBmaXJtd2FyZSBmaWxlIHdpdGggZW1wdHkgcGF5bG9hZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChzaXplMSkge1xuJiM0MztcdFx0Y3JjID0gfmNyYzMyX2xlKH4wVSwgcGF5bG9hZCwgc2l6ZTEpO1xuJiM0MztcdFx0aWYgKGNyYyAhPSBsZTMyX3RvX2NwdShoZHItXHUwMDNlaW1hZ2VfY2hlY2tzdW1fMSkpIHtcbiYjNDM7XHRcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcdFwmIzM0O2ZsYXNoOiBpbWFnZSAxIENSQyBtaXNtYXRjaCAoZ290ICUwOHgsIGV4cGVjdGVkICUwOHgpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdGNyYywgbGUzMl90b19jcHUoaGRyLVx1MDAzZWltYWdlX2NoZWNrc3VtXzEpKTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoc2l6ZTIpIHtcbiYjNDM7XHRcdGNyYyA9IH5jcmMzMl9sZSh+MFUsIHBheWxvYWQgJiM0Mzsgc2l6ZTEsIHNpemUyKTtcbiYjNDM7XHRcdGlmIChjcmMgIT0gbGUzMl90b19jcHUoaGRyLVx1MDAzZWltYWdlX2NoZWNrc3VtXzIpKSB7XG4mIzQzO1x0XHRcdGRldl9lcnIoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldixcbiYjNDM7XHRcdFx0XHRcJiMzNDtmbGFzaDogaW1hZ2UgMiBDUkMgbWlzbWF0Y2ggKGdvdCAlMDh4LCBleHBlY3RlZCAlMDh4KVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRjcmMsIGxlMzJfdG9fY3B1KGhkci1cdTAwM2VpbWFnZV9jaGVja3N1bV8yKSk7XG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0KnBheWxvYWRfc2l6ZSA9IHRvdGFsO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9mbGFzaF9maXJtd2FyZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcbiYjNDM7XHRcdFx0XHQgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LFxuJiM0MztcdFx0XHRcdCAgIHUzMiBwYXlsb2FkX3NpemUsIHN0cnVjdCBkZXZsaW5rICpkbClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHU4ICpwYXlsb2FkID0gZnctXHUwMDNlZGF0YSAmIzQzOyBNWEw4NjJYWF9GV19IRFJfU0laRTtcbiYjNDM7XHR1MzIgd29yZF9pZHggPSAwLCBkYXRhX3dyaXR0ZW4gPSAwLCBpZHggPSAwO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbmV4dF9ub3RpZnkgPSBqaWZmaWVzIC0gMTtcbiYjNDM7XHR1MTYgd29yZCwgZmRhdGE7XG4mIzQzO1x0aW50IHJldCwgaTtcbiYjNDM7XG4mIzQzO1x0LyogU3RlcCAxOiByZWJvb3QgdGhlIGZpcm13YXJlIGludG8gTUNVYm9vdCByZXNjdWUgbW9kZSAqL1xuJiM0MztcdGlmICghcHJpdi1cdTAwM2VyZXNjdWVfbW9kZSkge1xuJiM0MztcdFx0cmV0ID0gbXhsODYyeHhfYXBpX3dyYXAocHJpdiwgU1lTX01JU0NfRldfVVBEQVRFLCBOVUxMLCAwLFxuJiM0MztcdFx0XHRcdFx0ZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRcdGlmIChyZXQpIHtcbiYjNDM7XHRcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcdFwmIzM0O2ZsYXNoOiBGV19VUERBVEUgY29tbWFuZCBmYWlsZWQ6ICVwZVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRFUlJfUFRSKHJldCkpO1xuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogU3RlcCAyOiB3YWl0IGZvciBib290bG9hZGVyIHJlYWR5ICovXG4mIzQzO1x0bXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCBcJiMzNDtXYWl0aW5nIGZvciBib290bG9hZGVyXCYjMzQ7LCAwLCAwKTtcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gd3JpdGVfZXJyO1xuJiM0MztcbiYjNDM7XHQvKiBGYWlsdXJlcyBmcm9tIGhlcmUgb24gZW5kIHVwIGF0IG5vX2VuZCwgd2hpY2ggcmV0dXJucyB0aGUgZXJyb3JcbiYjNDM7XHQgKiB3aXRob3V0IHNpZ25hbGxpbmcgRU5EIC0tIHNlZSB0aGVyZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIE1YTDg2MlhYX1NCX1BESV9SRUFEWSxcbiYjNDM7XHRcdFx0XHRcdE1YTDg2MlhYX0ZXX1JFQURZX1RJTUVPVVRfTVMpO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdGRldl9lcnIoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldixcbiYjNDM7XHRcdFx0XCYjMzQ7Zmxhc2g6IGJvb3Rsb2FkZXIgbm90IHJlYWR5OiAlcGVcXG5cJiMzNDssIEVSUl9QVFIocmV0KSk7XG4mIzQzO1x0XHRnb3RvIG5vX2VuZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFN0ZXAgMzogc3RhcnQgaGFuZHNoYWtlICovXG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsXG4mIzQzO1x0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX1NUQVJUKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0Z290byB3cml0ZV9lcnI7XG4mIzQzO1xuJiM0MztcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVJUICYjNDM7IDEsXG4mIzQzO1x0XHRcdFx0XHRNWEw4NjJYWF9GV19BQ0tfVElNRU9VVF9NUyk7XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcJiMzNDtmbGFzaDogc3RhcnQgaGFuZHNoYWtlIGZhaWxlZDogJXBlXFxuXCYjMzQ7LCBFUlJfUFRSKHJldCkpO1xuJiM0MztcdFx0Z290byBub19lbmQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBTdGVwIDQ6IHRyYW5zZmVyIGltYWdlIGhlYWRlciAqL1xuJiM0MztcdG14bDg2Mnh4X2ZsYXNoX25vdGlmeShkbCwgXCYjMzQ7RXJhc2luZyBmbGFzaFwmIzM0OywgMCwgMCk7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsXG4mIzQzO1x0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRnb3RvIHdyaXRlX2VycjtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTVhMODYyWFhfRldfSERSX1NJWkUgLyAyOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0d29yZCA9IGZ3LVx1MDAzZWRhdGFbaSAqIDJdIHxcbiYjNDM7XHRcdCAgICAgICAoKHUxNilmdy1cdTAwM2VkYXRhW2kgKiAyICYjNDM7IDFdIFx1MDAzY1x1MDAzYyA4KTtcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCB3b3JkKTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGdvdG8gd3JpdGVfZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRnb3RvIHdyaXRlX2VycjtcbiYjNDM7XG4mIzQzO1x0LyogdGhlIGJ5dGUgY291bnQgaW4gU1RBVCB0cmlnZ2VycyB0aGUgZXJhc2UgKi9cbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcbiYjNDM7XHRcdFx0XHQgICBNWEw4NjJYWF9GV19IRFJfU0laRSk7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gd3JpdGVfZXJyO1xuJiM0MztcbiYjNDM7XHQvKiBBQ0sgaXMgYnl0ZSBjb3VudCAmIzQzOyAxICovXG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCBNWEw4NjJYWF9GV19IRFJfU0laRSAmIzQzOyAxLFxuJiM0MztcdFx0XHRcdFx0TVhMODYyWFhfRldfQUNLX1RJTUVPVVRfTVMpO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdGRldl9lcnIoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldixcbiYjNDM7XHRcdFx0XCYjMzQ7Zmxhc2g6IGhlYWRlciBBQ0sgZmFpbGVkOiAlcGVcXG5cJiMzNDssIEVSUl9QVFIocmV0KSk7XG4mIzQzO1x0XHRnb3RvIG5vX2VuZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFN0ZXAgNTogd2FpdCBmb3IgZXJhc2UgdG8gY29tcGxldGUgKi9cbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIDAsXG4mIzQzO1x0XHRcdFx0XHRNWEw4NjJYWF9GV19FUkFTRV9USU1FT1VUX01TKTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdFwmIzM0O2ZsYXNoOiBlcmFzZSB0aW1lb3V0OiAlcGVcXG5cJiMzNDssIEVSUl9QVFIocmV0KSk7XG4mIzQzO1x0XHRnb3RvIG5vX2VuZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFN0ZXAgNjogdHJhbnNmZXIgcGF5bG9hZCAqL1xuJiM0MztcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0Z290byB3cml0ZV9lcnI7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChpZHggXHUwMDNjIHBheWxvYWRfc2l6ZSkge1xuJiM0MztcdFx0Y29uZF9yZXNjaGVkKCk7XG4mIzQzO1x0XHRpZiAoaWR4ICYjNDM7IDEgXHUwMDNjIHBheWxvYWRfc2l6ZSkge1xuJiM0MztcdFx0XHRmZGF0YSA9IHBheWxvYWRbaWR4XSB8XG4mIzQzO1x0XHRcdFx0KCh1MTYpcGF5bG9hZFtpZHggJiM0MzsgMV0gXHUwMDNjXHUwMDNjIDgpO1xuJiM0MztcdFx0XHRpZHggJiM0Mzs9IDI7XG4mIzQzO1x0XHRcdGRhdGFfd3JpdHRlbiAmIzQzOz0gMjtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdGZkYXRhID0gcGF5bG9hZFtpZHhdO1xuJiM0MztcdFx0XHRpZHgmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRkYXRhX3dyaXR0ZW4mIzQzOyYjNDM7O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCBmZGF0YSk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIHdyaXRlX2VycjtcbiYjNDM7XHRcdHdvcmRfaWR4JiM0MzsmIzQzOztcbiYjNDM7XG4mIzQzO1x0XHRpZiAoaWR4IFx1MDAzZT0gcGF5bG9hZF9zaXplKSB7XG4mIzQzO1x0XHRcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9mbHVzaF9sYXN0KHByaXYsIGRhdGFfd3JpdHRlbik7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIEhhbGYtYmFuayBib3VuZGFyeTogc3dpdGNoIHRvIFNCMSBhZGRyZXNzICovXG4mIzQzO1x0XHRpZiAod29yZF9pZHggPT0gTVhMODYyWFhfRldfQkFOS19IQUxGKSB7XG4mIzQzO1x0XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpO1xuJiM0MztcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRcdGdvdG8gd3JpdGVfZXJyO1xuJiM0MztcbiYjNDM7XHRcdFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsXG4mIzQzO1x0XHRcdFx0XHRcdCAgIE1YTDg2MlhYX0ZXX1NCMV9BRERSKTtcbiYjNDM7XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0XHRnb3RvIHdyaXRlX2VycjtcbiYjNDM7XG4mIzQzO1x0XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XG4mIzQzO1x0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdFx0Z290byB3cml0ZV9lcnI7XG4mIzQzO1x0XHR9IGVsc2UgaWYgKHdvcmRfaWR4IFx1MDAzZT0gTVhMODYyWFhfRldfQkFOS19TTElDRSkge1xuJiM0MztcdFx0XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2UocHJpdiwgZGF0YV93cml0dGVuKTtcbiYjNDM7XHRcdFx0aWYgKHJldCkge1xuJiM0MztcdFx0XHRcdGRldl9lcnIoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldixcbiYjNDM7XHRcdFx0XHRcdFwmIzM0O2ZsYXNoOiB3cml0ZSB0aW1lb3V0IGF0ICV1LyV1OiAlcGVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHRpZHgsIHBheWxvYWRfc2l6ZSwgRVJSX1BUUihyZXQpKTtcbiYjNDM7XHRcdFx0XHRnb3RvIG5vX2VuZDtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHR3b3JkX2lkeCA9IDA7XG4mIzQzO1x0XHRcdGRhdGFfd3JpdHRlbiA9IDA7XG4mIzQzO1x0XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XG4mIzQzO1x0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdFx0Z290byB3cml0ZV9lcnI7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAodGltZV9hZnRlcihqaWZmaWVzLCBuZXh0X25vdGlmeSkpIHtcbiYjNDM7XHRcdFx0XHRteGw4NjJ4eF9mbGFzaF9ub3RpZnkoZGwsIFwmIzM0O0ZsYXNoaW5nXCYjMzQ7LCBpZHgsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIHBheWxvYWRfc2l6ZSk7XG4mIzQzO1x0XHRcdFx0bmV4dF9ub3RpZnkgPSBqaWZmaWVzICYjNDM7IG1zZWNzX3RvX2ppZmZpZXMoNTAwKTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcJiMzNDtmbGFzaDogZmluYWwgc2xpY2UgZmFpbGVkOiAlcGVcXG5cJiMzNDssIEVSUl9QVFIocmV0KSk7XG4mIzQzO1x0XHRnb3RvIG5vX2VuZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG14bDg2Mnh4X2ZsYXNoX25vdGlmeShkbCwgXCYjMzQ7Rmxhc2hpbmdcJiMzNDssIHBheWxvYWRfc2l6ZSwgcGF5bG9hZF9zaXplKTtcbiYjNDM7XG4mIzQzO1x0LyogU3VjY2VzczogdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgcmVjZWl2ZSBsb29wIGF0IHJfcmVtYWluID09IDAgYW5kXG4mIzQzO1x0ICogdmVyaWZpZWQgdGhlIGltYWdlLCBzbyBFTkQoMHgzY2MzKSBpcyBhIGZpbmFsaXNlL2Jvb3QgcmVxdWVzdCByYXRoZXJcbiYjNDM7XHQgKiB0aGFuIGEgYnl0ZSBjb3VudC4gU2lnbmFsIGl0IGhlcmUgLS0gYW5kIG9ubHkgaGVyZSAtLSB0byBib290IHRoZSBuZXdcbiYjNDM7XHQgKiBpbWFnZSB3aXRob3V0IHdhaXRpbmcgb3V0IHRoZSBsb2FkZXImIzM5O3MgMiBzIEVORCB0aW1lb3V0LlxuJiM0MztcdCAqL1xuJiM0MztcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULFxuJiM0MztcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9FTkQpO1xuJiM0MztcdG1zbGVlcChNWEw4NjJYWF9GV19SRUJPT1RfREVMQVlfTVMpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0Mzt3cml0ZV9lcnI6XG4mIzQzO1x0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LCBcJiMzNDtmbGFzaDogU01ESU8gd3JpdGUgZmFpbGVkOiAlcGVcXG5cJiMzNDssXG4mIzQzO1x0XHRFUlJfUFRSKHJldCkpO1xuJiM0Mztub19lbmQ6XG4mIzQzO1x0LyogQSBmYWlsdXJlIGxlYXZlcyB0aGUgbG9hZGVyIG1pZCB0cmFuc2ZlcjsgZG8gbm90IHNpZ25hbCBFTkQgKGEgU1RBVFxuJiM0MztcdCAqIHdyaXRlIGlzIGEgYnl0ZSBjb3VudCB0aGVuLCBhbmQgRU5EIHdvdWxkIGJlIG1pc3JlYWQgYXMgb25lLCByaXNraW5nXG4mIzQzO1x0ICogYSByZWNlaXZlLWNvdW50ZXIgdW5kZXJmbG93KS4gUmV0dXJuIHRoZSBlcnJvcjsgdGhlIGNhbGxlciByZXByb2Jlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgbXhsODYyeHhfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsXG4mIzQzO1x0XHRcdCAgICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsXG4mIzQzO1x0XHRcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID0gZHMtXHUwMDNlcHJpdjtcbiYjNDM7XHRjaGFyIGJ1ZlsxNl07XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0LyogTm8gY2hpcC1pZC9yZXZpc2lvbiBpbiBNQ1Vib290IChuZWVkcyB0aGUgZmlybXdhcmUgTU1EIG1haWxib3gpLiBUaGVcbiYjNDM7XHQgKiBmdyB2ZXJzaW9uIGRvdWJsZXMgYXMgdGhlIFwmIzM0O3JlYWR5IHRvIGZsYXNoXCYjMzQ7IHNpZ25hbDogcmVwb3J0IGl0IG9ubHlcbiYjNDM7XHQgKiBvbmNlIHRoZSBsb2FkZXIgaXMgYXQgYSBjbGVhbiBSRUFEWSwgbm90aGluZyB3aGlsZSBzdGlsbCBkcmFpbmluZy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSkge1xuJiM0MztcdFx0aWYgKCFSRUFEX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHkpKVxuJiM0MztcdFx0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0XHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcJiMzNDsldS4ldS4ldVwmIzM0OyxcbiYjNDM7XHRcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5tYWpvciwgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yLFxuJiM0MztcdFx0XHQgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uKTtcbiYjNDM7XHRcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX3J1bm5pbmdfcHV0KHJlcSxcbiYjNDM7XHRcdFx0XHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdHJldHVybiBkZXZsaW5rX2luZm9fdmVyc2lvbl9zdG9yZWRfcHV0KHJlcSxcbiYjNDM7XHRcdFx0XHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogQSAwIHBhcnQgbnVtYmVyIG1lYW5zIHRoZSBDSElQIElEIHJlYWQgZmFpbGVkIG9yIHRoZSBwYXJ0IGlzXG4mIzQzO1x0ICogdW5mdXNlZDsgb21pdCBpdCByYXRoZXIgdGhhbiBwdWJsaXNoIGEgYm9ndXMgXCYjMzQ7MDAwMFwmIzM0OyB0aGF0IGZ3dXBkXG4mIzQzO1x0ICogd291bGQgbWF0Y2ggZmlybXdhcmUgYWdhaW5zdCAtLSBpdCB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlIGRyaXZlclxuJiM0MztcdCAqIG5hbWUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHByaXYtXHUwMDNlYXNpY19pZCkge1xuJiM0MztcdFx0c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgXCYjMzQ7JTA0WFwmIzM0OywgcHJpdi1cdTAwM2Vhc2ljX2lkKTtcbiYjNDM7XHRcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19BU0lDX0lELFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIGJ1Zik7XG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwmIzM0OyV1XCYjMzQ7LCBwcml2LVx1MDAzZWFzaWNfcmV2KTtcbiYjNDM7XHRcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19BU0lDX1JFVixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBidWYpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEFuIGFsbC16ZXJvIHZlcnNpb24gaXMgdGhlIGNhY2hlIGEgZmFpbGVkIGZsYXNoIGxlZnQgYmVoaW5kLCBub3QgYVxuJiM0MztcdCAqIHJlbGVhc2VkIGZpcm13YXJlOyBvbWl0IGl0IGxpa2UgdGhlIHBhcnQgbnVtYmVyIGFib3ZlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1ham9yIFx1MDAyNlx1MDAyNiAhcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhcHJpdi1cdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwmIzM0OyV1LiV1LiV1XCYjMzQ7LFxuJiM0MztcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5tYWpvciwgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yLFxuJiM0MztcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbik7XG4mIzQzO1xuJiM0MztcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX3J1bm5pbmdfcHV0KHJlcSxcbiYjNDM7XHRcdFx0REVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19GVywgYnVmKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0LyogYm9vdHMgdGhpcyBpbWFnZSBmcm9tIGl0cyBvd24gZmxhc2g6IHN0b3JlZCA9PSBydW5uaW5nICovXG4mIzQzO1x0cmV0dXJuIGRldmxpbmtfaW5mb192ZXJzaW9uX3N0b3JlZF9wdXQocmVxLFxuJiM0MztcdFx0XHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuJiM0MztcdFx0XHRcdCAgc3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLFxuJiM0MztcdFx0XHRcdCAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cdTAwM2Vwcml2O1xuJiM0MztcdHN0cnVjdCBkc2FfcG9ydCAqZHA7XG4mIzQzO1x0dTMyIHBheWxvYWRfc2l6ZTtcbiYjNDM7XHRpbnQgcmV0LCBlcnIsIGk7XG4mIzQzO1xuJiM0MztcdGlmIChwYXJhbXMtXHUwMDNlY29tcG9uZW50KSB7XG4mIzQzO1x0XHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcJiMzNDtjb21wb25lbnQgaXMgbm90IHN1cHBvcnRlZFwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBBIHByZXZpb3VzIGZsYXNoIGlzIHN0aWxsIHdhaXRpbmcgZm9yIGl0cyByZXByb2JlOiB0aGUgZmlybXdhcmUgQVBJXG4mIzQzO1x0ICogaXMgc2hvcnQtY2lyY3VpdGVkLCBzbyB0aGUgcmF3IFNCIFBESSB3cml0ZXMgYmVsb3cgd291bGQgcnVuIGFnYWluc3RcbiYjNDM7XHQgKiBhIHN3aXRjaCB0aGlzIGRyaXZlciBubyBsb25nZXIgdHJhY2tzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChwcml2LVx1MDAzZXNraXBfdGVhcmRvd24pIHtcbiYjNDM7XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXG4mIzQzO1x0XHRcdFx0ICAgXCYjMzQ7ZGV2aWNlIGlzIHJlaW5pdGlhbGl6aW5nLCByZXRyeSBsYXRlclwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfZmxhc2hfdmFsaWRhdGUocHJpdiwgcGFyYW1zLVx1MDAzZWZ3LCBcdTAwMjZwYXlsb2FkX3NpemUpO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwmIzM0O2Zpcm13YXJlIGltYWdlIHZhbGlkYXRpb24gZmFpbGVkXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBSZWZ1c2UgdG8gZmxhc2ggd2hpbGUgdGhlIGJhY2tncm91bmQgc2VsZi1oZWFsIGlzIHN0aWxsIGRyYWluaW5nLCBhbmRcbiYjNDM7XHQgKiBmb3IgZ29vZCBvbmNlIGl0IGhhcyBnaXZlbiB1cCBvbiB0aGUgbG9hZGVyLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChSRUFEX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfZmFpbGVkKSkge1xuJiM0MztcdFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjayxcbiYjNDM7XHRcdFx0XHQgICBcJiMzNDtkb3dubG9hZCByZWNvdmVyeSBmYWlsZWQsIHBvd2VyIGN5Y2xlIHRoZSBzd2l0Y2hcJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FSU87XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSBcdTAwMjZcdTAwMjYgIVJFQURfT05DRShwcml2LVx1MDAzZXJlc2N1ZV9yZWFkeSkpIHtcbiYjNDM7XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXG4mIzQzO1x0XHRcdFx0ICAgXCYjMzQ7c3dpdGNoIGlzIHJlY292ZXJpbmcgYW4gaW50ZXJydXB0ZWQgZG93bmxvYWQsIHJldHJ5IHNob3J0bHlcJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKVxuJiM0MztcdFx0ZGV2X2luZm8oZHMtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHQgXCYjMzQ7Zmxhc2g6IGZsYXNoaW5nIHN3aXRjaCB2aWEgTUNVYm9vdCByZXNjdWUgbW9kZVxcblwmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZGV2X2luZm8oZHMtXHUwMDNlZGV2LCBcJiMzNDtmbGFzaDogcnVubmluZyBmaXJtd2FyZSAldS4ldS4ldVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5tYWpvciwgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yLFxuJiM0MztcdFx0XHQgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uKTtcbiYjNDM7XG4mIzQzO1x0LyogQ2xvc2UgcG9ydHMgd2hpbGUgdGhlIGZpcm13YXJlIGlzIHN0aWxsIGFsaXZlIHNvIHRoZSBEU0EgY29yZSYjMzk7c1xuJiM0MztcdCAqIE1EQi9GREIgdHJhY2tpbmcgaXMgZHJhaW5lZCwgYW5kIGRldGFjaCB1c2VyIHBvcnRzIHNvIHVzZXJzcGFjZVxuJiM0MztcdCAqIGNhbm5vdCByZW9wZW4gdGhlbSBkdXJpbmcgdGhlIGZsYXNoLiBUaGUgY29uZHVpdCBpcyBvbmx5IGNsb3NlZCxcbiYjNDM7XHQgKiBub3QgZGV0YWNoZWQ6IGl0IGJlbG9uZ3MgdG8gdGhlIE1BQyBkcml2ZXIuIFRoaXMgZHJpdmVyIGJpbmRzIGFcbiYjNDM7XHQgKiBzaW5nbGUgc3dpdGNoIHdpdGggYSBkaXJlY3QgaG9zdCBsaW5rIGFuZCBubyBjYXNjYWRlIHBvcnRzLCBzbyB0aGVcbiYjNDM7XHQgKiBjb25kdWl0IHNlcnZlcyBvbmx5IHRoaXMgc3dpdGNoLCBhbmQgZmxhc2hpbmcgaXQgcmVib290cyB0aGUgc3dpdGNoLFxuJiM0MztcdCAqIHdoaWNoIHRha2VzIHRoZSB0cmVlIGRvd24gcmVnYXJkbGVzcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRydG5sX2xvY2soKTtcbiYjNDM7XHRkc2Ffc3dpdGNoX2Zvcl9lYWNoX3VzZXJfcG9ydChkcCwgZHMpIHtcbiYjNDM7XHRcdGlmIChkcC1cdTAwM2V1c2VyKSB7XG4mIzQzO1x0XHRcdGRldl9jbG9zZShkcC1cdTAwM2V1c2VyKTtcbiYjNDM7XHRcdFx0bmV0aWZfZGV2aWNlX2RldGFjaChkcC1cdTAwM2V1c2VyKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0ZHNhX3N3aXRjaF9mb3JfZWFjaF9jcHVfcG9ydChkcCwgZHMpXG4mIzQzO1x0XHRkZXZfY2xvc2UoZHAtXHUwMDNlY29uZHVpdCk7XG4mIzQzO1x0LyogVGhlIGJyaWRnZSBkZWZlcnMgdGhlIFNUUCBzdGF0ZSBjaGFuZ2VzIHRyaWdnZXJlZCBieSBjbG9zaW5nXG4mIzQzO1x0ICogdGhlIHBvcnRzOyBsZXQgdGhlbSByZWFjaCB0aGUgZmlybXdhcmUgd2hpbGUgaXQgaXMgc3RpbGwgYWxpdmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0c3dpdGNoZGV2X2RlZmVycmVkX3Byb2Nlc3MoKTtcbiYjNDM7XHRydG5sX3VubG9jaygpO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrX25lc3RlZChcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzLVx1MDAzZW1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpO1xuJiM0MztcdHByaXYtXHUwMDNlYmxvY2tfaG9zdCA9IHRydWU7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrKTtcbiYjNDM7XG4mIzQzO1x0c2V0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgXHUwMDI2cHJpdi1cdTAwM2VmbGFncyk7XG4mIzQzO1x0Y2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKFx1MDAyNnByaXYtXHUwMDNlc3RhdHNfd29yayk7XG4mIzQzO1x0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZwcml2LVx1MDAzZWNyY19lcnJfd29yayk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgZHMtXHUwMDNlbnVtX3BvcnRzOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGNhbmNlbF93b3JrX3N5bmMoXHUwMDI2cHJpdi1cdTAwM2Vwb3J0c1tpXS5ob3N0X2Zsb29kX3dvcmspO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9mbGFzaF9maXJtd2FyZShwcml2LCBwYXJhbXMtXHUwMDNlZncsIHBheWxvYWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHQgICAgICBkcy1cdTAwM2VkZXZsaW5rKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgXCYjMzQ7ZmlybXdhcmUgdHJhbnNmZXIgZmFpbGVkXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFyZXQpIHtcbiYjNDM7XHRcdG11dGV4X2xvY2tfbmVzdGVkKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrLFxuJiM0MztcdFx0XHRcdCAgTURJT19NVVRFWF9ORVNURUQpO1xuJiM0MztcdFx0cHJpdi1cdTAwM2VibG9ja19ob3N0ID0gZmFsc2U7XG4mIzQzO1x0XHRwcml2LVx1MDAzZXJlc2N1ZV9tb2RlID0gZmFsc2U7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWJ1cy1cdTAwM2VtZGlvX2xvY2spO1xuJiM0MztcbiYjNDM7XHRcdC8qIFJlZnJlc2ggdGhlIGNhY2hlZCB2ZXJzaW9ucyBzbyB0aGUgZmxhc2ggdXBkYXRlIG9ubHlcbiYjNDM7XHRcdCAqIGNvbXBsZXRlcyBvbmNlIHRoZSBuZXcgZmlybXdhcmUgaXMgY29uZmlybWVkIHJ1bm5pbmcgYW5kXG4mIzQzO1x0XHQgKiBkZXZsaW5rIGRldiBpbmZvIHJlcG9ydHMgaXQuIE11c3QgaGFwcGVuIGJlZm9yZSBzZXR0aW5nXG4mIzQzO1x0XHQgKiBza2lwX3RlYXJkb3duLCB3aGljaCBkaXNjYXJkcyBhbGwgZmlybXdhcmUgQVBJIHJlYWRzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXG4mIzQzO1x0XHRcdFx0XHQgICBcJiMzNDtuZXcgZmlybXdhcmUgZGlkIG5vdCBiZWNvbWUgcmVhZHlcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0LyogVGhlIHN3aXRjaCBpcyBpbiBNQ1Vib290IHdpdGggZXJhc2VkIG9yIHBhcnRseSB3cml0dGVuIGZsYXNoO1xuJiM0MztcdFx0ICogZHJvcCB0aGUgY2FjaGVkIGlkZW50aXR5IHNvIGRldmxpbmsgZGV2IGluZm8gc3RvcHMgcmVwb3J0aW5nXG4mIzQzO1x0XHQgKiB0aGUgcHJlLWZsYXNoIHZlcnNpb24gdW50aWwgdGhlIHJlcHJvYmUgcmUtcmVhZHMgdGhlIHRydXRoLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRtZW1zZXQoXHUwMDI2cHJpdi1cdTAwM2Vmd192ZXJzaW9uLCAwLCBzaXplb2YocHJpdi1cdTAwM2Vmd192ZXJzaW9uKSk7XG4mIzQzO1x0XHRwcml2LVx1MDAzZWFzaWNfaWQgPSAwO1xuJiM0MztcdFx0cHJpdi1cdTAwM2Vhc2ljX3JldiA9IDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrX25lc3RlZChcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzLVx1MDAzZW1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpO1xuJiM0MztcdHByaXYtXHUwMDNlc2tpcF90ZWFyZG93biA9IHRydWU7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrKTtcbiYjNDM7XG4mIzQzO1x0LyogUmVpbml0aWFsaXNlIHRocm91Z2ggYSBkZWZlcnJlZCByZS1wcm9iZTogcmVtb3ZlKCkgcnVucyB3aXRoXG4mIzQzO1x0ICogc2tpcF90ZWFyZG93biBzZXQsIHRoZW4gYSBmcmVzaCBwcm9iZSgpIHN0YXJ0cyBhZ2FpbnN0IHdoYXRldmVyXG4mIzQzO1x0ICogdGhlIHN3aXRjaCBub3cgcnVucy4gVGhlIGNvcmUgc2tpcHMgdGhlIHJlLXByb2JlIGlmIHRoZSBkZXZpY2VcbiYjNDM7XHQgKiBpcyB1bmJvdW5kIG9yIHNodXQgZG93biBiZWZvcmUgaXQgZmlyZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0ZXJyID0gZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZHMtXHUwMDNlZGV2LCBNWEw4NjJYWF9GV19SRVBST0JFX0RFTEFZX01TKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldCA/IHJldCA6IGVycjtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3Lmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43Y2Q4N2M3YWQ4NzE2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuaFxuQEAgLTAsMCAmIzQzOzEsMjAgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19NWEw4NjJYWF9GV19IXG4mIzQzOyNkZWZpbmUgX19NWEw4NjJYWF9GV19IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NuZXQvZHNhLmhcdTAwM2VcbiYjNDM7XG4mIzQzO3N0cnVjdCBteGw4NjJ4eF9wcml2O1xuJiM0MztzdHJ1Y3Qgd29ya19zdHJ1Y3Q7XG4mIzQzO1xuJiM0MztpbnQgbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KTtcbiYjNDM7dm9pZCBteGw4NjJ4eF9yZXNjdWVfaGVhbF93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7XG4mIzQzO2ludCBteGw4NjJ4eF9kZXZsaW5rX2luZm9fZ2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcbiYjNDM7XHRcdFx0ICAgICAgc3RydWN0IGRldmxpbmtfaW5mb19yZXEgKnJlcSxcbiYjNDM7XHRcdFx0ICAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKTtcbiYjNDM7aW50IG14bDg2Mnh4X2RldmxpbmtfZmxhc2hfdXBkYXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcbiYjNDM7XHRcdFx0XHQgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX19NWEw4NjJYWF9GV19IICovXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuYyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmNcbmluZGV4IDRhY2QyMTZmN2NjMDAuLjRkZjdjODM4MDhmNjAgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jXG5AQCAtMTUsNiAmIzQzOzE1LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91bmFsaWduZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9kc2EuaFx1MDAzZVxuICNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bXhsODYyeHgtY21kLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bXhsODYyeHgtZncuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LWhvc3QuaFwmIzM0O1xuIFxuICNkZWZpbmUgQ1RSTF9CVVNZX01BU0tcdFx0XHRCSVQoMTUpXG5AQCAtMzQwLDYgJiM0MzszNDIsMjEgQEAgaW50IG14bDg2Mnh4X2FwaV93cmFwKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MTYgY21kLCB2b2lkICpfZGF0YSxcbiBcbiBcdG11dGV4X2xvY2tfbmVzdGVkKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7XG4gXG4mIzQzO1x0aWYgKHByaXYtXHUwMDNlc2tpcF90ZWFyZG93bikge1xuJiM0MztcdFx0cmV0ID0gcmVhZCA/IC1FTk9ERVYgOiAwO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSkge1xuJiM0MztcdFx0cmV0ID0gLUVOT0RFVjtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHByaXYtXHUwMDNlYmxvY2tfaG9zdCBcdTAwMjZcdTAwMjYgY21kICE9IFNZU19NSVNDX0ZXX1VQREFURSkge1xuJiM0MztcdFx0cmV0ID0gLUVCVVNZO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiBcdG1heCA9IChzaXplICYjNDM7IDEpIC8gMjtcbiBcbiBcdHJldCA9IG14bDg2Mnh4X2J1c3lfd2FpdChwcml2KTtcbkBAIC00OTUsMTIgJiM0Mzs1MTIsNTQgQEAgaW50IG14bDg2Mnh4X3Jlc2V0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU01ESU9fQUREUl9SRUdcdFx0MHgxZlxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTS1x0MHhmZmYwXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU01ESU9fT0ZGX01BU0tcdFx0MHgwMDBmXG4mIzQzO1xuJiM0MzsvKiBQYWdlZCBjbGF1c2UtMjIgd2luZG93OiB0aGUgcGFnZSBnb2VzIGludG8gTUlJIHJlZ2lzdGVyIDB4MWYsIHRoZSBsb3cgbmliYmxlXG4mIzQzOyAqIG9mIGFkZHIgc2VsZWN0cyBvbmUgb2YgdGhlIDE2IHJlZ2lzdGVycyB3aXRoaW4gaXQuIEJvdGggaGVscGVycyB0YWtlIHRoZSBNRElPXG4mIzQzOyAqIGJ1cyBsb2NrIHBlciB0cmFuc2FjdGlvbiwgc28gY2FsbGVycyBtdXN0IG5vdCBhbHJlYWR5IGhvbGQgaXQgLS0gdW5saWtlXG4mIzQzOyAqIG14bDg2Mnh4X2FwaV93cmFwKCksIHdoaWNoIGhvbGRzIGl0IGFjcm9zcyBhIHdob2xlIGZpcm13YXJlIGNvbW1hbmQuXG4mIzQzOyAqL1xuJiM0MztpbnQgbXhsODYyeHhfc21kaW9fcmVhZChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGFkZHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWlpX2J1cyAqYnVzID0gcHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWJ1cztcbiYjNDM7XHRpbnQgcGh5ID0gcHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWFkZHI7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZidXMtXHUwMDNlbWRpb19sb2NrKTtcbiYjNDM7XHRyZXQgPSBfX21kaW9idXNfd3JpdGUoYnVzLCBwaHksIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHLFxuJiM0MztcdFx0XHQgICAgICBhZGRyIFx1MDAyNiBNWEw4NjJYWF9TTURJT19QQUdFX01BU0spO1xuJiM0MztcdGlmIChyZXQgXHUwMDNlPSAwKVxuJiM0MztcdFx0cmV0ID0gX19tZGlvYnVzX3JlYWQoYnVzLCBwaHksIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX09GRl9NQVNLKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2YnVzLVx1MDAzZW1kaW9fbG9jayk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgYWRkciwgdTE2IHZhbClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtaWlfYnVzICpidXMgPSBwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzO1xuJiM0MztcdGludCBwaHkgPSBwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYWRkcjtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNmJ1cy1cdTAwM2VtZGlvX2xvY2spO1xuJiM0MztcdHJldCA9IF9fbWRpb2J1c193cml0ZShidXMsIHBoeSwgTVhMODYyWFhfU01ESU9fQUREUl9SRUcsXG4mIzQzO1x0XHRcdCAgICAgIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTSyk7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2U9IDApXG4mIzQzO1x0XHRyZXQgPSBfX21kaW9idXNfd3JpdGUoYnVzLCBwaHksIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX09GRl9NQVNLLFxuJiM0MztcdFx0XHRcdCAgICAgIHZhbCk7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNmJ1cy1cdTAwM2VtZGlvX2xvY2spO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4gdm9pZCBteGw4NjJ4eF9ob3N0X2luaXQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4ge1xuIFx0SU5JVF9XT1JLKFx1MDAyNnByaXYtXHUwMDNlY3JjX2Vycl93b3JrLCBteGw4NjJ4eF9jcmNfZXJyX3dvcmtfZm4pO1xuJiM0MztcdElOSVRfV09SSyhcdTAwMjZwcml2LVx1MDAzZXJlc2N1ZV9oZWFsX3dvcmssIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4pO1xuIH1cbiBcbiB2b2lkIG14bDg2Mnh4X2hvc3Rfc2h1dGRvd24oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4ge1xuIFx0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZwcml2LVx1MDAzZWNyY19lcnJfd29yayk7XG4mIzQzO1x0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZwcml2LVx1MDAzZXJlc2N1ZV9oZWFsX3dvcmspO1xuIH1cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaFxuaW5kZXggNjZkNmFlMTk4YWZmNC4uNGUwNTRjNmU0YzBlNCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmhcbkBAIC0xOCw1ICYjNDM7MTgsNyBAQCBpbnQgbXhsODYyeHhfYXBpX3dyYXAoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUxNiBjbWQsIHZvaWQgKmRhdGEsIHUxNiBzaXplLFxuIFx0bXhsODYyeHhfYXBpX3dyYXAoZGV2LCBjbWQsIFx1MDAyNihkYXRhKSwgc2l6ZW9mKChkYXRhKSksIHRydWUsIHRydWUpXG4gXG4gaW50IG14bDg2Mnh4X3Jlc2V0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KTtcbiYjNDM7aW50IG14bDg2Mnh4X3NtZGlvX3JlYWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyKTtcbiYjNDM7aW50IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgYWRkciwgdTE2IHZhbCk7XG4gXG4gI2VuZGlmIC8qIF9fTVhMODYyWFhfSE9TVF9IICovXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LXBoeWxpbmsuYyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1waHlsaW5rLmNcbmluZGV4IGI2ODk2NTJhYTliOTIuLmE1YjY5NDBiNTUyZTkgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jXG5AQCAtNDA2LDYgJiM0Mzs0MDYsOCBAQCBteGw4NjJ4eF9waHlsaW5rX21hY19zZWxlY3RfcGNzKHN0cnVjdCBwaHlsaW5rX2NvbmZpZyAqY29uZmlnLFxuIFxuIFx0c3dpdGNoIChwb3J0KSB7XG4gXHRjYXNlIDkgLi4uIDE2OlxuJiM0MztcdFx0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpXG4mIzQzO1x0XHRcdHJldHVybiBOVUxMO1xuIFx0XHRpZiAoIU1YTDg2MlhYX0ZXX1ZFUl9NSU4ocHJpdiwgMSwgMCwgODQpKSB7XG4gXHRcdFx0ZGV2X3dhcm5fb25jZShkcC1cdTAwM2Vkcy1cdTAwM2VkZXYsXG4gXHRcdFx0XHQgICAgICBcJiMzNDtTZXJEZXMgUENTIHVuc3VwcG9ydGVkIG9uIG9sZCBmaXJtd2FyZS5cXG5cJiMzNDspO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmNcbmluZGV4IDQ1ZDIzN2IzYTQwZjEuLjBlMTc5Y2FlOTdmMzggMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmNcbkBAIC0yMSw2ICYjNDM7MjEsNyBAQFxuICNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1hcGkuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LWNtZC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LWZ3LmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1ob3N0LmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1waHlsaW5rLmhcJiMzNDtcbiBcbkBAIC03MSw2ICYjNDM7NzIsMTMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX3Jtb25faGlzdF9yYW5nZSBteGw4NjJ4eF9ybW9uX3Jhbmdlc1tdID0ge1xuICNkZWZpbmUgTVhMODYyWFhfUkVBRFlfVElNRU9VVF9NU1x0MTAwMDBcbiAjZGVmaW5lIE1YTDg2MlhYX1JFQURZX1BPTExfTVNcdFx0MTAwXG4gXG4mIzQzOy8qIENoaXAgSUQgcmVnaXN0ZXJzLCByZWFkIHZpYSBTWVNfTUlTQ19SRUdfUkQgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9DSElQSURfTFx0XHQweGMwZDI4ODg0XG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01cdFx0MHhjMGQyODg4OFxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0NISVBJRF9MX1BOVU1MXHRcdEdFTk1BU0soMTUsIDEyKVxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0NISVBJRF9NX1BOVU1NXHRcdEdFTk1BU0soMTEsIDApXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01fVkVSU0lPTlx0R0VOTUFTSygxNCwgMTIpXG4mIzQzO1xuICNkZWZpbmUgTVhMODYyWFhfVENNX0lOU1RfU0VMXHRcdDB4ZTAwXG4gI2RlZmluZSBNWEw4NjJYWF9UQ01fQ0JTXHRcdDB4ZTEyXG4gI2RlZmluZSBNWEw4NjJYWF9UQ01fRUJTXHRcdDB4ZTEzXG5AQCAtMjIyLDcgJiM0MzsyMzAsNDYgQEAgc3RhdGljIGludCBteGw4NjJ4eF9waHlfd3JpdGVfYzQ1X21paV9idXMoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IGFkZHIsXG4gXHRyZXR1cm4gbXhsODYyeHhfcGh5X3dyaXRlX21tZChidXMtXHUwMDNlcHJpdiwgYWRkciwgZGV2YWRkLCByZWdudW0sIHZhbCk7XG4gfVxuIFxuLXN0YXRpYyBpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpXG4mIzQzOy8qIFJlYWQgdGhlIHN0YXRpYyBjaGlwIHBhcnQgbnVtYmVyIGFuZCB2ZXJzaW9uIGZyb20gdGhlIENISVAgSURcbiYjNDM7ICogcmVnaXN0ZXJzLiBPbmx5IHBvc3NpYmxlIHdpdGggYSBydW5uaW5nIGZpcm13YXJlLCBzbyB0aGUgdmFsdWVzIGFyZVxuJiM0MzsgKiBjYWNoZWQgYXQgc2V0dXAgYW5kIGxlZnQgemVybyB3aGVuIHRoZSBzd2l0Y2ggaXMgaW4gcmVzY3VlIG1vZGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IG14bDg2Mnh4X3JlYWRfY2hpcF9pZChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBteGw4NjJ4eF9zeXNfcmVnX3J3IHJlZyA9IHt9O1xuJiM0MztcdHUxNiBjaGlwaWRfbCwgY2hpcGlkX207XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cmVnLmFkZHIgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9DSElQSURfTCk7XG4mIzQzO1x0cmV0ID0gTVhMODYyWFhfQVBJX1JFQUQocHJpdiwgU1lTX01JU0NfUkVHX1JELCByZWcpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcdGNoaXBpZF9sID0gbGUzMl90b19jcHUocmVnLnZhbCk7XG4mIzQzO1xuJiM0MztcdHJlZy5hZGRyID0gY3B1X3RvX2xlMzIoTVhMODYyWFhfQ0hJUElEX00pO1xuJiM0MztcdHJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIFNZU19NSVNDX1JFR19SRCwgcmVnKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRjaGlwaWRfbSA9IGxlMzJfdG9fY3B1KHJlZy52YWwpO1xuJiM0MztcbiYjNDM7XHRwcml2LVx1MDAzZWFzaWNfaWQgPSBGSUVMRF9HRVQoTVhMODYyWFhfQ0hJUElEX0xfUE5VTUwsIGNoaXBpZF9sKSB8XG4mIzQzO1x0XHRcdEZJRUxEX0dFVChNWEw4NjJYWF9DSElQSURfTV9QTlVNTSwgY2hpcGlkX20pIFx1MDAzY1x1MDAzYyA0O1xuJiM0MztcdHByaXYtXHUwMDNlYXNpY19yZXYgPSBGSUVMRF9HRVQoTVhMODYyWFhfQ0hJUElEX01fVkVSU0lPTiwgY2hpcGlkX20pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG14bDg2Mnh4X3dhaXRfcmVhZHkgLSB3YWl0IGZvciB0aGUgc3dpdGNoIGZpcm13YXJlIHRvIGJlY29tZSBvcGVyYXRpb25hbFxuJiM0MzsgKiBAZHM6IERTQSBzd2l0Y2ggaW5zdGFuY2VcbiYjNDM7ICpcbiYjNDM7ICogUG9sbCB0aGUgZmlybXdhcmUgdW50aWwgaXQgcmVwb3J0cyBpdHMgdmVyc2lvbiBhbmQgYWNjZXB0c1xuJiM0MzsgKiBjb25maWd1cmF0aW9uIGNvbW1hbmRzLCB0aGVuIGNhY2hlIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIGFuZCBjaGlwIElELlxuJiM0MzsgKiBUYWtlcyBhdCBsZWFzdCB0d28gc2Vjb25kcy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLlxuJiM0MzsgKi9cbiYjNDM7aW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKVxuIHtcbiBcdHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB2ZXIgPSB7fTtcbiBcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzLCB0aW1lb3V0O1xuQEAgLTI1NCw2ICYjNDM7MzAxLDExIEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpXG4gXHRcdHByaXYtXHUwMDNlZndfdmVyc2lvbi5tYWpvciA9IHZlci5pdl9tYWpvcjtcbiBcdFx0cHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yID0gdmVyLml2X21pbm9yO1xuIFx0XHRwcml2LVx1MDAzZWZ3X3ZlcnNpb24ucmV2aXNpb24gPSBsZTE2X3RvX2NwdSh2ZXIuaXZfcmV2aXNpb24pO1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3JlYWRfY2hpcF9pZChwcml2KTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdGRldl93YXJuKGRzLVx1MDAzZWRldiwgXCYjMzQ7ZmFpbGVkIHRvIHJlYWQgY2hpcCBJRDogJXBlXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCBFUlJfUFRSKHJldCkpO1xuIFx0XHRyZXR1cm4gMDtcbiBcbiBub3RfcmVhZHlfeWV0OlxuQEAgLTYyMiwyMSAmIzQzOzY3NCw2NiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcylcbiBcdGludCBuX3VzZXJfcG9ydHMgPSAwLCBtYXhfdmxhbnM7XG4gXHRpbnQgaW5ncmVzc19maW5hbHMsIHZpZF9ydWxlcztcbiBcdHN0cnVjdCBkc2FfcG9ydCAqZHA7XG4tXHRpbnQgcmV0LCBpO1xuLVxuLVx0cmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7XG4tXHRpZiAocmV0KVxuLVx0XHRyZXR1cm4gcmV0O1xuLVxuLVx0cmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7XG4tXHRpZiAocmV0KVxuLVx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdGludCByZXQsIGksIHJlc2N1ZTtcbiBcbiYjNDM7XHQvKiBUaGUgU2VyRGVzIHN0YXRlIGlzIHNvZnR3YXJlLW9ubHkgYW5kIG11c3QgZXhpc3QgYmVmb3JlIGFueXRoaW5nIGNhblxuJiM0MztcdCAqIHJlYWNoIHBoeWxpbmssIGluY2x1ZGluZyBhIHJlc2N1ZS1tb2RlIGZsYXNoIGNsZWFyaW5nIHJlc2N1ZV9tb2RlXG4mIzQzO1x0ICogYWhlYWQgb2YgdGhlIHJlcHJvYmUuXG4mIzQzO1x0ICovXG4gXHRtdXRleF9pbml0KFx1MDAyNnByaXYtXHUwMDNlc2VyZGVzX2xvY2spO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShwcml2LVx1MDAzZXNlcmRlc19wb3J0cyk7IGkmIzQzOyYjNDM7KVxuIFx0XHRteGw4NjJ4eF9zZXR1cF9wY3MocHJpdiwgXHUwMDI2cHJpdi1cdTAwM2VzZXJkZXNfcG9ydHNbaV0sXG4gXHRcdFx0XHQgICBpICYjNDM7IE1YTDg2MlhYX0ZJUlNUX1NFUkRFU19QT1JUKTtcbiBcbiYjNDM7XHQvKiBEZXRlY3QgdGhlIGxvYWRlciBvdmVyIFNCIFBESSBmaXJzdDogaXQgbmVlZHMgbm8gZmlybXdhcmUsIHVubGlrZSB0aGVcbiYjNDM7XHQgKiBDNDUgQVBJIChteGw4NjJ4eF9yZXNldC93YWl0X3JlYWR5KSB3aGljaCBzcGV3cyBDUkMgZXJyb3JzIHdoZW4gbm9uZVxuJiM0MztcdCAqIGFuc3dlcnMuIFRvdWNoIEM0NSBvbmx5IG9uY2UgcmVzY3VlIGlzIHJ1bGVkIG91dC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRyZXNjdWUgPSBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QocHJpdik7XG4mIzQzO1x0aWYgKHJlc2N1ZSBcdTAwM2MgMCkge1xuJiM0MztcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsIFwmIzM0O3N3aXRjaCBzdGF0ZSBkZXRlY3Rpb24gZmFpbGVkOiAlcGVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdEVSUl9QVFIocmVzY3VlKSk7XG4mIzQzO1x0XHRyZXR1cm4gcmVzY3VlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHJlc2N1ZSA9PSBNWEw4NjJYWF9OT1RfUkVTQ1VFKSB7XG4mIzQzO1x0XHRyZXQgPSBteGw4NjJ4eF9yZXNldChwcml2KTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7XG4mIzQzO1x0XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRcdC8qIHRoZSByZXNldCBtYXkgb25seSBub3cgaGF2ZSB0cmlnZ2VyZWQgcmVzY3VlIG1vZGUgKi9cbiYjNDM7XHRcdFx0cmVzY3VlID0gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHByaXYpO1xuJiM0MztcdFx0XHRpZiAocmVzY3VlIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdFx0XHRcJiMzNDtzd2l0Y2ggbm90IHJlc3BvbmRpbmcgYWZ0ZXIgcmVzZXQ6ICVwZVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdEVSUl9QVFIocmVzY3VlKSk7XG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJlc2N1ZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpZiAocmVzY3VlID09IE1YTDg2MlhYX05PVF9SRVNDVUUpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHByaXYtXHUwMDNlcmVzY3VlX21vZGUgPSByZXNjdWU7XG4mIzQzO1xuJiM0MztcdGlmIChwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKSB7XG4mIzQzO1x0XHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHkpIHtcbiYjNDM7XHRcdFx0ZGV2X3dhcm4oZHMtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcdCBcJiMzNDtzd2l0Y2ggaW4gTUNVYm9vdCByZXNjdWUgbW9kZSwgdXNlIGRldmxpbmsgdG8gZmxhc2ggbmV3IGZpcm13YXJlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdC8qIERyYWluIHRoZSB3ZWRnZWQgZG93bmxvYWQgaW4gdGhlIGJhY2tncm91bmQgc28gaXRcbiYjNDM7XHRcdFx0ICogbmV2ZXIgaG9sZHMgdGhlIGRldmxpbmsgbG9jazsgaW5mbyBhbmQgZmxhc2ggYmVjb21lXG4mIzQzO1x0XHRcdCAqIGF2YWlsYWJsZSBvbmNlIHJlYWR5LlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0ZGV2X3dhcm4oZHMtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcdCBcJiMzNDtzd2l0Y2ggaW4gTUNVYm9vdCB3aXRoIGFuIGludGVycnVwdGVkIGRvd25sb2FkLCByZWNvdmVyaW5nIGluIGJhY2tncm91bmRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRxdWV1ZV93b3JrKHN5c3RlbV9sb25nX3dxLCBcdTAwMjZwcml2LVx1MDAzZXJlc2N1ZV9oZWFsX3dvcmspO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuJiM0MztcbiBcdC8qIENhbGN1bGF0ZSBFeHRlbmRlZCBWTEFOIGJsb2NrIHNpemVzLlxuIFx0ICogV2l0aCBWTEFOIEZpbHRlciBoYW5kbGluZyBWSUQgbWVtYmVyc2hpcCBjaGVja3M6XG4gXHQgKiAgIEluZ3Jlc3M6IG9ubHkgZmluYWwgY2F0Y2hhbGwgcnVsZXMgKFBWSUQgaW5zZXJ0aW9uLCA4MDIuMVFcbkBAIC03MTUsMTEgJiM0Mzs4MTIsMjEgQEAgc3RhdGljIGludCBteGw4NjJ4eF9wb3J0X3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGJvb2wgZW5hYmxlKVxuIHN0YXRpYyBpbnQgbXhsODYyeHhfcG9ydF9lbmFibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCxcbiBcdFx0XHRcdHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpXG4ge1xuJiM0MztcdHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID0gZHMtXHUwMDNlcHJpdjtcbiYjNDM7XG4mIzQzO1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4gXHRyZXR1cm4gbXhsODYyeHhfcG9ydF9zdGF0ZShkcywgcG9ydCwgdHJ1ZSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3BvcnRfZGlzYWJsZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KVxuIHtcbiYjNDM7XHRzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLVx1MDAzZXByaXY7XG4mIzQzO1xuJiM0MztcdGlmIChwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiBcdGlmIChteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSkpXG4gXHRcdGRldl9lcnIoZHMtXHUwMDNlZGV2LCBcJiMzNDtmYWlsZWQgdG8gZGlzYWJsZSBwb3J0ICVkXFxuXCYjMzQ7LCBwb3J0KTtcbiB9XG5AQCAtMTMzNyw2ICYjNDM7MTQ0NCwxNyBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcbiBcdGJvb2wgaXNfY3B1X3BvcnQgPSBkc2FfcG9ydF9pc19jcHUoZHApO1xuIFx0aW50IHJldDtcbiBcbiYjNDM7XHRpZiAoZHNhX3BvcnRfaXNfZHNhKGRwKSkge1xuJiM0MztcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsIFwmIzM0O3BvcnQgJWQ6IERTQSBsaW5rcyBub3Qgc3VwcG9ydGVkXFxuXCYjMzQ7LCBwb3J0KTtcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIERTQSByZWluaXRzIGZhaWxlZCB1c2VyIHBvcnRzIGFzIHVudXNlZDsgc2hhcmVkIHBvcnRzIG11c3RcbiYjNDM7XHQgKiBzdWNjZWVkIGZvciB0aGUgdHJlZSB0byByZWdpc3Rlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSlcbiYjNDM7XHRcdHJldHVybiBkc2FfcG9ydF9pc191c2VyKGRwKSA/IC1FTk9ERVYgOiAwO1xuJiM0MztcbiBcdHJldCA9IG14bDg2Mnh4X3BvcnRfc3RhdGUoZHMsIHBvcnQsIGZhbHNlKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG5AQCAtMTM0NiwxMSAmIzQzOzE0NjQsNiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcbiBcdGlmIChkc2FfcG9ydF9pc191bnVzZWQoZHApKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdGlmIChkc2FfcG9ydF9pc19kc2EoZHApKSB7XG4tXHRcdGRldl9lcnIoZHMtXHUwMDNlZGV2LCBcJiMzNDtwb3J0ICVkOiBEU0EgbGlua3Mgbm90IHN1cHBvcnRlZFxcblwmIzM0OywgcG9ydCk7XG4tXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbi1cdH1cbi1cbiBcdHJldCA9IG14bDg2Mnh4X2NvbmZpZ3VyZV9zcF90YWdfcHJvdG8oZHMsIHBvcnQsIGlzX2NwdV9wb3J0KTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG5AQCAtMTU3Miw2ICYjNDM7MTY4NSwxMiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfbWRiX2RlbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LFxuIFx0ZXRoZXJfYWRkcl9jb3B5KHFwYXJhbS5tYWMsIG1kYi1cdTAwM2VhZGRyKTtcbiBcbiBcdHJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIE1YTDg2MlhYX01BQ19UQUJMRUVOVFJZUVVFUlksIHFwYXJhbSk7XG4mIzQzO1x0LyogUG9zdC1mbGFzaCB0ZWFyZG93biBvciBNQ1Vib290OiB0aGUgZmlybXdhcmUgYW5kIGl0cyBNQUMgdGFibGUgYXJlXG4mIzQzO1x0ICogZ29uZSwgc28gdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIGRlbGV0ZS4gT3V0c2lkZSB0aG9zZSwgLUVOT0RFViBpcyBhXG4mIzQzO1x0ICogYnVzIGVycm9yIGFuZCBtdXN0IGJlIHJlcG9ydGVkLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChyZXQgPT0gLUVOT0RFViBcdTAwMjZcdTAwMjYgKHByaXYtXHUwMDNlc2tpcF90ZWFyZG93biB8fCBwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0xNjI4LDYgJiM0MzsxNzQ3LDkgQEAgc3RhdGljIHZvaWQgbXhsODYyeHhfcG9ydF9zdHBfc3RhdGVfc2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsXG4gXHRzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLVx1MDAzZXByaXY7XG4gXHRpbnQgcmV0O1xuIFxuJiM0MztcdGlmIChwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiBcdHN3aXRjaCAoc3RhdGUpIHtcbiBcdGNhc2UgQlJfU1RBVEVfRElTQUJMRUQ6XG4gXHRcdHBhcmFtLnBvcnRfc3RhdGUgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9TVFBfUE9SVF9TVEFURV9ESVNBQkxFKTtcbkBAIC0yMDE1LDYgJiM0MzsyMTM3LDEyIEBAIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3N0YXRzX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuIFx0c3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcHJpdi1cdTAwM2VkcztcbiBcdHN0cnVjdCBkc2FfcG9ydCAqZHA7XG4gXG4mIzQzO1x0LyogQSBnZXRfc3RhdHM2NCgpIHJlLWFybSBjYW4gcmFjZSB0aGUgZmxhc2ggdGVhcmRvd24mIzM5O3MgV09SS19TVE9QUEVEXG4mIzQzO1x0ICogc2V0IGFuZCBjYW5jZWw7IGJhaWwgaGVyZSBzbyBhIHN0cmF5IHBvbGwgbmV2ZXIgcnVucyBkdXJpbmcgYSBmbGFzaC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFx1MDAyNnByaXYtXHUwMDNlZmxhZ3MpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiBcdGRzYV9zd2l0Y2hfZm9yX2VhY2hfYXZhaWxhYmxlX3BvcnQoZHAsIGRzKVxuIFx0XHRteGw4NjJ4eF9zdGF0c19wb2xsKGRzLCBkcC1cdTAwM2VpbmRleCk7XG4gXG5AQCAtMjA4Niw2ICYjNDM7MjIxNCw4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMgbXhsODYyeHhfc3dpdGNoX29wcyA9IHtcbiBcdC5nZXRfcGF1c2Vfc3RhdHMgPSBteGw4NjJ4eF9nZXRfcGF1c2Vfc3RhdHMsXG4gXHQuZ2V0X3Jtb25fc3RhdHMgPSBteGw4NjJ4eF9nZXRfcm1vbl9zdGF0cyxcbiBcdC5nZXRfc3RhdHM2NCA9IG14bDg2Mnh4X2dldF9zdGF0czY0LFxuJiM0MztcdC5kZXZsaW5rX2luZm9fZ2V0ID0gbXhsODYyeHhfZGV2bGlua19pbmZvX2dldCxcbiYjNDM7XHQuZGV2bGlua19mbGFzaF91cGRhdGUgPSBteGw4NjJ4eF9kZXZsaW5rX2ZsYXNoX3VwZGF0ZSxcbiB9O1xuIFxuIHN0YXRpYyBpbnQgbXhsODYyeHhfcHJvYmUoc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2KVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmhcbmluZGV4IDQzMmE1ZjNmMmUwOGUuLjk5MWIyNGFhOTVhZmQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmhcbkBAIC00LDcgJiM0Mzs0LDkgQEBcbiAjZGVmaW5lIF9fTVhMODYyWFhfSFxuIFxuICNpbmNsdWRlIFx1MDAzY2FzbS9ieXRlb3JkZXIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRvcHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21kaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tdXRleC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NuZXQvZHNhLmhcdTAwM2VcbiBcbkBAIC0xNCw2ICYjNDM7MTYsMTAgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXY7XG4gI2RlZmluZSBNWEw4NjJYWF9GSVJTVF9TRVJERVNfUE9SVFx0OVxuICNkZWZpbmUgTVhMODYyWFhfU0VSREVTX1NMT1RTXHRcdDRcbiBcbiYjNDM7LyogbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KCkgcmV0dXJuIGNvZGVzIChuZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9ycykgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9OT1RfUkVTQ1VFXHRcdDBcbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9JTl9SRVNDVUVcdFx0MVxuJiM0MztcbiAjZGVmaW5lIE1YTDg2MlhYX0RFRkFVTFRfQlJJREdFXHRcdDBcbiAjZGVmaW5lIE1YTDg2MlhYX01BWF9CUklER0VTXHRcdDQ4XG4gI2RlZmluZSBNWEw4NjJYWF9NQVhfQlJJREdFX1BPUlRTXHQxMjhcbkBAIC0zMDMsNiAmIzQzOzMwOSwxMCBAQCBzdHJ1Y3QgbXhsODYyeHhfZndfdmVyc2lvbiB7XG4gICogICAgICAgICAgICAgICAgICAgICAgZmxvb2RpbmcpXG4gICogQGZ3X3ZlcnNpb246ICAgICAgICAgY2FjaGVkIGZpcm13YXJlIHZlcnNpb24sIHBvcHVsYXRlZCBhdCBwcm9iZSBhbmRcbiAgKiAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZCB3aXRoIE1YTDg2MlhYX0ZXX1ZFUl9NSU4oKVxuJiM0MzsgKiBAYXNpY19pZDogICAgICAgICAgICBjaGlwIHBhcnQgbnVtYmVyIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMsXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGFzIHRoZSBkZXZsaW5rIFwmIzM0O2FzaWMuaWRcJiMzNDsgZml4ZWQgdmVyc2lvblxuJiM0MzsgKiBAYXNpY19yZXY6ICAgICAgICAgICBjaGlwIHZlcnNpb24gcmVhZCBmcm9tIHRoZSBDSElQIElEIHJlZ2lzdGVycyxcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYXMgdGhlIGRldmxpbmsgXCYjMzQ7YXNpYy5yZXZcJiMzNDsgZml4ZWQgdmVyc2lvblxuICAqIEBzZXJkZXNfcG9ydHM6ICAgICAgIFNlckRlcyBpbnRlcmZhY2VzIGluY2wuIHN1Yi1pbnRlcmZhY2VzIGluIGNhc2Ugb2ZcbiAgKiAgICAgICAgICAgICAgICAgICAgICAxMEdfUVhHTUlJIG9yIFFTR01JSVxuICAqIEBzZXJkZXNfcmVmY291bnQ6ICAgIHBlci1YUENTIGNvdW50IG9mIHN1Yi1wb3J0cyBlbmFibGVkIGJ5IHBoeWxpbms7XG5AQCAtMzE5LDYgJiM0MzszMjksMjAgQEAgc3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24ge1xuICAqIEBldmxhbl9pbmdyZXNzX3NpemU6IHBlci1wb3J0IGluZ3Jlc3MgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplXG4gICogQGV2bGFuX2VncmVzc19zaXplOiAgcGVyLXBvcnQgZWdyZXNzIEV4dGVuZGVkIFZMQU4gYmxvY2sgc2l6ZVxuICAqIEB2Zl9ibG9ja19zaXplOiAgICAgIHBlci1wb3J0IFZMQU4gRmlsdGVyIGJsb2NrIHNpemVcbiYjNDM7ICogQGJsb2NrX2hvc3Q6ICAgICAgICAgcmVqZWN0IGZpcm13YXJlIEFQSSBjb21tYW5kcyAoZXhjZXB0IEZXX1VQREFURSlcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGEgZmlybXdhcmUgZmxhc2hcbiYjNDM7ICogQHNraXBfdGVhcmRvd246ICAgICAgZGlzY2FyZCBmaXJtd2FyZSBBUEkgY29tbWFuZHMgZHVyaW5nIHRoZSB0ZWFyZG93blxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQgYnkgdGhlIHBvc3QtZmxhc2ggcmVwcm9iZVxuJiM0MzsgKiBAcmVzY3VlX21vZGU6ICAgICAgICBzd2l0Y2ggaXMgaW4gTUNVYm9vdDsgZmlybXdhcmUgQVBJIGNvbW1hbmRzIGZhaWwgZmFzdCxcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgb25seSBjbGF1c2UtMjIgU01ESU8gd29ya3MuIFNldCBmcm9tIHNldHVwKCkgYmVmb3JlIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggaXMgcmVnaXN0ZXJlZCBhbmQgY2xlYXJlZCB1bmRlciB0aGUgTURJTyBidXMgbG9ja1xuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGJlbmVmaXQgb2YgbXhsODYyeHhfYXBpX3dyYXAoKTsgb3RoZXIgcmVhZGVyc1xuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IG5lZWQgaXQgdG8gYmUgYSBzdGFibGUgc2luZ2xlIGZsYWcuXG4mIzQzOyAqIEByZXNjdWVfcmVhZHk6ICAgICAgIChyZXNjdWVfbW9kZSkgbG9hZGVyIGlzIGF0IGEgY2xlYW4gUkVBRFkgYW5kIHdpbGwgYWNjZXB0XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgIGEgZmxhc2g7IGZhbHNlIHdoaWxlIHJlc2N1ZV9oZWFsX3dvcmsgaXMgZHJhaW5pbmdcbiYjNDM7ICogQHJlc2N1ZV9mYWlsZWQ6ICAgICAgKHJlc2N1ZV9tb2RlKSB0aGUgc2VsZi1oZWFsIGdhdmUgdXA7IHRoZSBsb2FkZXIgbmVlZHMgYVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBwb3dlciBjeWNsZSBhbmQgbm8gZmxhc2ggY2FuIGJlIGFjY2VwdGVkXG4mIzQzOyAqIEByZXNjdWVfaGVhbF93b3JrOiAgIGJhY2tncm91bmQgc2VsZi1oZWFsIGRyYWluaW5nIGEgd2VkZ2VkIGRvd25sb2FkIHRvIFJFQURZXG4gICogQHN0YXRzX3dvcms6ICAgICAgICAgcGVyaW9kaWMgd29yayBpdGVtIHRoYXQgcG9sbHMgUk1PTiBoYXJkd2FyZSBjb3VudGVyc1xuICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBhY2N1bXVsYXRlcyB0aGVtIGludG8gNjQtYml0IHBlci1wb3J0IHN0YXRzXG4gICovXG5AQCAtMzI2LDkgJiM0MzszNTAsMTIgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXYge1xuIFx0c3RydWN0IGRzYV9zd2l0Y2ggKmRzO1xuIFx0c3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2O1xuIFx0c3RydWN0IHdvcmtfc3RydWN0IGNyY19lcnJfd29yaztcbiYjNDM7XHRzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzY3VlX2hlYWxfd29yaztcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG4gXHR1MTYgZHJvcF9tZXRlcjtcbiBcdHN0cnVjdCBteGw4NjJ4eF9md192ZXJzaW9uIGZ3X3ZlcnNpb247XG4mIzQzO1x0dTE2IGFzaWNfaWQ7XG4mIzQzO1x0dTggYXNpY19yZXY7XG4gXHRzdHJ1Y3QgbXhsODYyeHhfcGNzIHNlcmRlc19wb3J0c1s4XTtcbiBcdGludCBzZXJkZXNfcmVmY291bnRbMl07XG4gXHRzdHJ1Y3QgbXV0ZXggc2VyZGVzX2xvY2s7XG5AQCAtMzM3LDcgJiM0MzszNjQsMTQgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXYge1xuIFx0dTE2IGV2bGFuX2luZ3Jlc3Nfc2l6ZTtcbiBcdHUxNiBldmxhbl9lZ3Jlc3Nfc2l6ZTtcbiBcdHUxNiB2Zl9ibG9ja19zaXplO1xuJiM0MztcdGJvb2wgYmxvY2tfaG9zdDtcbiYjNDM7XHRib29sIHNraXBfdGVhcmRvd247XG4mIzQzO1x0Ym9vbCByZXNjdWVfbW9kZTtcbiYjNDM7XHRib29sIHJlc2N1ZV9yZWFkeTtcbiYjNDM7XHRib29sIHJlc2N1ZV9mYWlsZWQ7XG4gXHRzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXRzX3dvcms7XG4gfTtcbiBcbiYjNDM7aW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTtcbiYjNDM7XG4gI2VuZGlmIC8qIF9fTVhMODYyWFhfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oXG5pbmRleCBhZWU3OWZkNmIzMmI0Li43YTk5MTY5NTA1NzcyIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaFxuQEAgLTEzMTQsNiAmIzQzOzEzMTQsOCBAQCBpbnQgIF9fbXVzdF9jaGVjayBkZXZpY2VfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldik7XG4gaW50IF9fbXVzdF9jaGVjayBkcml2ZXJfYXR0YWNoKGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpO1xuIHZvaWQgZGV2aWNlX2luaXRpYWxfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTtcbiBpbnQgX19tdXN0X2NoZWNrIGRldmljZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7XG4mIzQzO2ludCBfX211c3RfY2hlY2sgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LFxuJiM0MztcdFx0XHRcdFx0IHVuc2lnbmVkIGludCBkZWxheV9tcyk7XG4gXG4gYm9vbCBkZXZpY2VfaXNfYm91bmQoc3RydWN0IGRldmljZSAqZGV2KTtcbiBcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc2EuaCBiL2luY2x1ZGUvbmV0L2RzYS5oXG5pbmRleCA2ZjdmNWMxN2I1MzIwLi41ODU5N2IxNGU1OTJhIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9uZXQvZHNhLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbmV0L2RzYS5oXG5AQCAtMTE3Miw2ICYjNDM7MTE3Miw5IEBAIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyB7XG4gXHRpbnRcdCgqZGV2bGlua19pbmZvX2dldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuIFx0XHRcdFx0ICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsXG4gXHRcdFx0XHQgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKTtcbiYjNDM7XHRpbnRcdCgqZGV2bGlua19mbGFzaF91cGRhdGUpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcbiYjNDM7XHRcdFx0XHRcdHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcbiYjNDM7XHRcdFx0XHRcdHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4gXHRpbnRcdCgqZGV2bGlua19zYl9wb29sX2dldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuIFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBzYl9pbmRleCwgdTE2IHBvb2xfaW5kZXgsXG4gXHRcdFx0XHQgICAgICAgc3RydWN0IGRldmxpbmtfc2JfcG9vbF9pbmZvICpwb29sX2luZm8pO1xuZGlmZiAtLWdpdCBhL25ldC9kc2EvZGV2bGluay5jIGIvbmV0L2RzYS9kZXZsaW5rLmNcbmluZGV4IGVkMzQyZjM0NTY5MmIuLjI1MzExYTg3Y2JjNTYgMTAwNjQ0XG4tLS0gYS9uZXQvZHNhL2RldmxpbmsuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2RzYS9kZXZsaW5rLmNcbkBAIC0yMCw2ICYjNDM7MjAsMTggQEAgc3RhdGljIGludCBkc2FfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZGV2bGluayAqZGwsXG4gXHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IGRzYV9kZXZsaW5rX2ZsYXNoX3VwZGF0ZShzdHJ1Y3QgZGV2bGluayAqZGwsXG4mIzQzO1x0XHRcdFx0ICAgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZHNhX2RldmxpbmtfdG9fZHMoZGwpO1xuJiM0MztcbiYjNDM7XHRpZiAoIWRzLVx1MDAzZW9wcy1cdTAwM2VkZXZsaW5rX2ZsYXNoX3VwZGF0ZSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRzLVx1MDAzZW9wcy1cdTAwM2VkZXZsaW5rX2ZsYXNoX3VwZGF0ZShkcywgcGFyYW1zLCBleHRhY2spO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgZHNhX2Rldmxpbmtfc2JfcG9vbF9nZXQoc3RydWN0IGRldmxpbmsgKmRsLFxuIFx0XHRcdFx0ICAgdW5zaWduZWQgaW50IHNiX2luZGV4LCB1MTYgcG9vbF9pbmRleCxcbiBcdFx0XHRcdCAgIHN0cnVjdCBkZXZsaW5rX3NiX3Bvb2xfaW5mbyAqcG9vbF9pbmZvKVxuQEAgLTE2OSw2ICYjNDM7MTgxLDcgQEAgZHNhX2Rldmxpbmtfc2Jfb2NjX3RjX3BvcnRfYmluZF9nZXQoc3RydWN0IGRldmxpbmtfcG9ydCAqZGxwLFxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2bGlua19vcHMgZHNhX2Rldmxpbmtfb3BzID0ge1xuIFx0LmluZm9fZ2V0XHRcdFx0PSBkc2FfZGV2bGlua19pbmZvX2dldCxcbiYjNDM7XHQuZmxhc2hfdXBkYXRlXHRcdFx0PSBkc2FfZGV2bGlua19mbGFzaF91cGRhdGUsXG4gXHQuc2JfcG9vbF9nZXRcdFx0XHQ9IGRzYV9kZXZsaW5rX3NiX3Bvb2xfZ2V0LFxuIFx0LnNiX3Bvb2xfc2V0XHRcdFx0PSBkc2FfZGV2bGlua19zYl9wb29sX3NldCxcbiBcdC5zYl9wb3J0X3Bvb2xfZ2V0XHRcdD0gZHNhX2Rldmxpbmtfc2JfcG9ydF9wb29sX2dldCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAwNjo1MDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBmaXJtd2FyZSBmbGFzaCBzdXBwb3J0IGZvciB0aGUgTWF4TGluZWFyIE14TDg2Mnh4IERTQSBzd2l0Y2ggdmlhIGRldmxpbmssIGFsb25nIHdpdGggYSBuZXcgY29yZSBkcml2ZXIgbW9kZWwgZnVuY3Rpb24gYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYC4gVGhlIGBteGw4NjJ4eGAgZHJpdmVyIHJlcXVpcmVzIHBoeXNpY2FsIGhhcmR3YXJlIGNvbm5lY3RlZCB2aWEgTURJTyB0byBwcm9iZSBzdWNjZXNzZnVsbHkgYW5kIGlzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLiBUaGUgbmV3IGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgQVBJIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGhpcyB1bnJlYWNoYWJsZSBkcml2ZXIuIFRoZSBhZGRpdGlvbnMgdG8gdGhlIERTQSBkZXZsaW5rIGNvcmUgYXJlIHRyaXZpYWwgd3JhcHBlcnMgdGhhdCByZXR1cm4gYC1FT1BOT1RTVVBQYCBmb3IgYWxsIG90aGVyIHN3aXRjaGVzLiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBkZXZpY2Vfc2h1dGRvd25gIG1lcmVseSBzZXRzIGEgYm9vbGVhbiBmbGFnIGR1cmluZyBzeXN0ZW0gdGVhcmRvd24uIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50LCByZWFjaGFibGUgY29kZSB0byBmdXp6LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDI5YjAxMTZlMDU1OWNjY2ExNDhhZTY5YTBhYWQ2Mjc0MjYxZTNiZDMKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAxNSAwNjo1MDo0MyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdAppbmRleCA0NzQ1MTQ4ZmVjZjRmLi4wNTg5OTlkMGRjNTZmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RldmxpbmsvaW5kZXgucnN0CkBAIC05NCw2ICYjNDM7OTQsNyBAQCBwYXJhbWV0ZXJzLCBpbmZvIHZlcnNpb25zLCBhbmQgb3RoZXIgZmVhdHVyZXMgaXQgc3VwcG9ydHMuCiAgICBtbHg1CiAgICBtbHhzdwogICAgbXY4OGU2eHh4CiYjNDM7ICAgbXhsODYyeHgKICAgIG5ldGRldnNpbQogICAgbmZwCiAgICBvY3Rlb250eDIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL214bDg2Mnh4LnJzdCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL214bDg2Mnh4LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi41YjI0ZDhjYjU3YmM5Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RldmxpbmsvbXhsODYyeHgucnN0CkBAIC0wLDAgJiM0MzsxLDc0IEBACiYjNDM7Li4gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsKJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PT0KJiM0MztteGw4NjJ4eCBkZXZsaW5rIHN1cHBvcnQKJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PT0KJiM0MzsKJiM0MztUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgZGV2bGluayBmZWF0dXJlcyBpbXBsZW1lbnRlZCBieSB0aGUKJiM0MztgYG14bDg2Mnh4YGAgZGV2aWNlIGRyaXZlci4KJiM0MzsKJiM0MztJbmZvIHZlcnNpb25zCiYjNDM7PT09PT09PT09PT09PQomIzQzOwomIzQzO1RoZSBgYG14bDg2Mnh4YGAgZHJpdmVyIHJlcG9ydHMgdGhlIGZvbGxvd2luZyB2ZXJzaW9ucwomIzQzOwomIzQzOy4uIGxpc3QtdGFibGU6OiBkZXZsaW5rIGluZm8gdmVyc2lvbnMgaW1wbGVtZW50ZWQKJiM0MzsgICA6d2lkdGhzOiA1IDUgNSA4NQomIzQzOwomIzQzOyAgICogLSBOYW1lCiYjNDM7ICAgICAtIFR5cGUKJiM0MzsgICAgIC0gRXhhbXBsZQomIzQzOyAgICAgLSBEZXNjcmlwdGlvbgomIzQzOyAgICogLSBgYGFzaWMuaWRgYAomIzQzOyAgICAgLSBmaXhlZAomIzQzOyAgICAgLSA4NjI4CiYjNDM7ICAgICAtIFRoZSBjaGlwIHBhcnQgbnVtYmVyIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMuIE9taXR0ZWQKJiM0MzsgICAgICAgd2hlbiB0aGUgcGFydCBudW1iZXIgcmVhZHMgYXMgemVybywgd2hpY2ggaGFwcGVucyBmb3IgYSBzd2l0Y2gKJiM0MzsgICAgICAgc2l0dGluZyBpbiBNQ1Vib290IHJlc2N1ZSBtb2RlICh0aGUgcmVnaXN0ZXJzIG5lZWQgYSBydW5uaW5nCiYjNDM7ICAgICAgIGZpcm13YXJlKSwgZm9yIGFuIHVuZnVzZWQgcGFydCwgYW5kIGFmdGVyIGEgZmFpbGVkIGZsYXNoLgomIzQzOyAgICogLSBgYGFzaWMucmV2YGAKJiM0MzsgICAgIC0gZml4ZWQKJiM0MzsgICAgIC0gMAomIzQzOyAgICAgLSBUaGUgY2hpcCB2ZXJzaW9uIHJlYWQgZnJvbSB0aGUgc2FtZSByZWdpc3RlciB3b3JkLCBzbyBpdCBpcwomIzQzOyAgICAgICBvbWl0dGVkIHdoZW5ldmVyIGBgYXNpYy5pZGBgIGlzLgomIzQzOyAgICogLSBgYGZ3YGAKJiM0MzsgICAgIC0gcnVubmluZywgc3RvcmVkCiYjNDM7ICAgICAtIDEuMC43MAomIzQzOyAgICAgLSBWZXJzaW9uIG9mIHRoZSBmaXJtd2FyZSBydW5uaW5nIG9uIHRoZSBzd2l0Y2gsIHJlcG9ydGVkIGFzIGJvdGgKJiM0MzsgICAgICAgcnVubmluZyBhbmQgc3RvcmVkIHNpbmNlIHRoZSBzd2l0Y2ggYm9vdHMgaXQgZnJvbSBpdHMgb3duIGZsYXNoLgomIzQzOyAgICAgICBJdCBpcyBvbWl0dGVkIHdoaWxlIG5vIGZpcm13YXJlIHZlcnNpb24gaXMga25vd246IGFmdGVyIGEgZmFpbGVkCiYjNDM7ICAgICAgIGZsYXNoLCBhbmQgaW4gTUNVYm9vdCByZXNjdWUgbW9kZSB3aGlsZSBhbiBpbnRlcnJ1cHRlZCBkb3dubG9hZAomIzQzOyAgICAgICBpcyBzdGlsbCBiZWluZyByZWNvdmVyZWQgaW4gdGhlIGJhY2tncm91bmQuIE9uY2UgdGhlIGxvYWRlciBpcwomIzQzOyAgICAgICByZWFkeSB0byBhY2NlcHQgYSBuZXcgaW1hZ2UgdGhlIHZlcnNpb24gYXBwZWFycyBhcyAmIzM0OzAuMC4wJiMzNDssCiYjNDM7ICAgICAgIHdoaWNoIG5vIHJlbGVhc2VkIGZpcm13YXJlIHJlcG9ydHMsIHNvIHZlcnNpb24tY29tcGFyaW5nIHRvb2xzCiYjNDM7ICAgICAgIG9mZmVyIGFueSBhdmFpbGFibGUgcmVsZWFzZSBhcyBhbiB1cGdyYWRlLiBVc2UgYGBkZXZsaW5rIGRldgomIzQzOyAgICAgICBmbGFzaGBgIHRvIHRlbGwgYSByZWNvdmVyaW5nIHN3aXRjaCBmcm9tIGEgcmVhZHkgb25lLCBzZWUgYmVsb3c7CiYjNDM7ICAgICAgIGEgbWlzc2luZyB2ZXJzaW9uIG9uIGl0cyBvd24gZG9lcyBub3Qgc2F5IHdoeS4KJiM0MzsKJiM0MztGbGFzaCB1cGRhdGUKJiM0Mzs9PT09PT09PT09PT0KJiM0MzsKJiM0MztUaGUgYGBteGw4NjJ4eGBgIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIGBgZGV2bGluayBkZXYgZmxhc2hgYC4KJiM0MztUaGUgc2lnbmVkIGZpcm13YXJlIGltYWdlIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBzd2l0Y2ggb3ZlciB0aGUgc2FtZQomIzQzO01ESU8gYnVzIHdoaWNoIGlzIGFsc28gdXNlZCB0byBtYW5hZ2UgdGhlIHN3aXRjaCwgdGhlbiB2ZXJpZmllZCBhbmQKJiM0MztpbnN0YWxsZWQgYnkgdGhlIE1DVWJvb3QgYm9vdGxvYWRlciBydW5uaW5nIG9uIHRoZSBzd2l0Y2guIEFsbCBwb3J0cwomIzQzO29mIHRoZSBzd2l0Y2ggYXJlIGNsb3NlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1cGRhdGUgYW5kIHRoZSBkcml2ZXIKJiM0MztyZXByb2JlcyB0aGUgc3dpdGNoIGFmdGVyIGl0IGhhcyByZWJvb3RlZCBpbnRvIHRoZSBuZXcgZmlybXdhcmUuIEEKJiM0Mztjb21wbGV0ZSBmbGFzaCBhbmQgcmVwcm9iZSBjeWNsZSB0YWtlcyBhYm91dCBvbmUgbWludXRlLgomIzQzOwomIzQzO0Egc3dpdGNoIHN0dWNrIGluIE1DVWJvb3QgcmVzY3VlIG1vZGUsIGUuZy4gYWZ0ZXIgYW4gaW50ZXJydXB0ZWQKJiM0Mzt1cGRhdGUsIGlzIHJlZ2lzdGVyZWQgd2l0aG91dCB1c2VyIHBvcnRzLiBJZiB0aGUgcHJldmlvdXMgZG93bmxvYWQgd2FzCiYjNDM7aW50ZXJydXB0ZWQgbWlkLXRyYW5zZmVyIHRoZSBsb2FkZXIgaXMgd2VkZ2VkOyB0aGUgZHJpdmVyIGRyYWlucyBpdAomIzQzO2JhY2sgdG8gYSBjbGVhbiByZWFkeSBzdGF0ZSBpbiB0aGUgYmFja2dyb3VuZCwgb25lIGJ5dGUgYXQgYSB0aW1lLAomIzQzO3doaWNoIHRha2VzIHRlbnMgb2YgbWludXRlcyBmb3IgYSBsYXJnZSBpbWFnZSBhbmQgaXMgcmVwb3J0ZWQgdGhyb3VnaAomIzQzO3RoZSBrZXJuZWwgbG9nIGFzIGl0IHByb2dyZXNzZXMuIER1cmluZyB0aGF0IHJlY292ZXJ5IGBgZGV2bGluayBkZXYKJiM0MztmbGFzaGBgIHJldHVybnMgYGAtRUJVU1lgYCB3aXRoIGFuIGV4dGFjayBtZXNzYWdlIHNheWluZyBzbywgYW5kCiYjNDM7YGBkZXZsaW5rIGRldiBpbmZvYGAgcmVwb3J0cyBubyBmaXJtd2FyZSB2ZXJzaW9uLiBPbmNlIHRoZSBsb2FkZXIgaXMKJiM0MztyZWFkeSB0aGUgZmlybXdhcmUgdmVyc2lvbiBhcHBlYXJzIGFuZCBmbGFzaGluZyBhIGZpcm13YXJlIGltYWdlCiYjNDM7dGhyb3VnaCB0aGUgcmVndWxhciB1cGRhdGUgZmxvdyByZWNvdmVycyB0aGUgc3dpdGNoLgomIzQzOwomIzQzO0lmIHRoZSByZWNvdmVyeSBmYWlscywgdGhlIGxvYWRlciBuZWVkcyBhIHBvd2VyIGN5Y2xlOiBgYGRldmxpbmsgZGV2CiYjNDM7Zmxhc2hgYCB0aGVuIHJldHVybnMgYGAtRUlPYGAgYW5kIHNheXMgc28gaW4gaXRzIGV4dGFjayBtZXNzYWdlLiBUaGUKJiM0Mztkcml2ZXIgb25seSByZS1leGFtaW5lcyB0aGUgc3dpdGNoIHdoZW4gaXQgYmluZHMsIHNvIG9uIGEgYm9hcmQgd2hlcmUKJiM0Mzt0aGUgc3dpdGNoIGNhbiBiZSBwb3dlciBjeWNsZWQgb24gaXRzIG93biwgdW5iaW5kIGFuZCByZWJpbmQgdGhlIGRyaXZlcgomIzQzO2FmdGVyd2FyZHMgdG8gaGF2ZSB0aGUgcmVjb3ZlcmVkIHN3aXRjaCByZWNvZ25pc2VkLgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCA5OTE0NjAwNTBkYTc0Li5lM2Y3ZGVkNTY5YmY3IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUwomIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSUwpAQCAtMTYxMDYsNiAmIzQzOzE2MTA2LDcgQEAgTToJRGFuaWVsIEdvbGxlICZsdDtkYW5pZWxAbWFrcm90b3BpYS5vcmcmZ3Q7CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2RzYS9tYXhsaW5lYXIsbXhsODYyeHgueWFtbAomIzQzO0Y6CURvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL214bDg2Mnh4LnJzdAogRjoJZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4LwogRjoJbmV0L2RzYS90YWdfbXhsODYyeHguYwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaAppbmRleCBhNWI3YWJjMTBmZjAyLi42MjM0ZTM3ZGU3ZTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYmFzZS5oCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKQEAgLTEwNiw2ICYjNDM7MTA2LDEwIEBAIHN0cnVjdCBkcml2ZXJfcHJpdmF0ZSB7CiAgKiBAZGVhZDogVGhpcyBkZXZpY2UgaXMgY3VycmVudGx5IGVpdGhlciBpbiB0aGUgcHJvY2VzcyBvZiBvciBoYXMgYmVlbgogICoJICByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4gQW55IGFzeW5jaHJvbm91cyBldmVudHMgc2NoZWR1bGVkIGZvciB0aGlzCiAgKgkgIGRldmljZSBzaG91bGQgZXhpdCB3aXRob3V0IHRha2luZyBhbnkgYWN0aW9uLgomIzQzOyAqIEBzaHV0ZG93bl9kb25lOiBTZXQgb25jZSBkZXZpY2Vfc2h1dGRvd24oKSBoYXMgcmVhY2hlZCB0aGlzIGRldmljZSwgdW5kZXIKJiM0MzsgKgkgIHRoZSBkZXZpY2UgbG9jaywgYmVmb3JlIGFueSBzaHV0ZG93biBjYWxsYmFjayBydW5zLiBSZWFkIHVuZGVyIHRoZQomIzQzOyAqCSAgZGV2aWNlIGxvY2suIEEgZGVmZXJyZWQgcmUtcHJvYmUgc2NoZWR1bGVkIHdpdGgKJiM0MzsgKgkgIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKCkgbXVzdCBub3QgZGV0YWNoIHRoZSBkZXZpY2UgYW55bW9yZS4KICAqCiAgKiBOb3RoaW5nIG91dHNpZGUgb2YgdGhlIGRyaXZlciBjb3JlIHNob3VsZCBldmVyIHRvdWNoIHRoZXNlIGZpZWxkcy4KICAqLwpAQCAtMTIwLDYgJiM0MzsxMjQsNyBAQCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgewogCWNoYXIgKmRlZmVycmVkX3Byb2JlX3JlYXNvbjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7CiAJdTggZGVhZDoxOwomIzQzOwl1OCBzaHV0ZG93bl9kb25lOjE7CiB9OwogI2RlZmluZSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQob2JqKQlcCiAJY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9wYXJlbnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCA0ZDAyNjY4Mjk0NGYyLi44YTdkYmU0ZTgzNjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTQ5MDYsNiAmIzQzOzQ5MDYsOSBAQCB2b2lkIGRldmljZV9zaHV0ZG93bih2b2lkKQogCQkJZGV2aWNlX2xvY2socGFyZW50KTsKIAkJZGV2aWNlX2xvY2soZGV2KTsKIAomIzQzOwkJaWYgKGRldi0mZ3Q7cCkKJiM0MzsJCQlkZXYtJmd0O3AtJmd0O3NodXRkb3duX2RvbmUgPSB0cnVlOwomIzQzOwogCQkvKiBEb24mIzM5O3QgYWxsb3cgYW55IG1vcmUgcnVudGltZSBzdXNwZW5kcyAqLwogCQlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShkZXYpOwogCQlwbV9ydW50aW1lX2JhcnJpZXIoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmMKaW5kZXggNjBjMDA1MjIzODQ0ZC4uYmI4YjM0YWNkZTAwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RkLmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9iYXNlL2RkLmMKQEAgLTE0MzYsMyAmIzQzOzE0MzYsODUgQEAgdm9pZCBkcml2ZXJfZGV0YWNoKGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCiAJCXB1dF9kZXZpY2UoZGV2KTsKIAl9CiB9CiYjNDM7CiYjNDM7c3RydWN0IGRldmljZV9yZXByb2JlIHsKJiM0MzsJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiYjNDM7CWNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBkZXZpY2VfcmVwcm9iZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZXZpY2VfcmVwcm9iZSAqcnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRldmljZV9yZXByb2JlLAomIzQzOwkJCQkJCSB3b3JrLndvcmspOwomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBycC0mZ3Q7ZGV2OwomIzQzOwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBkZXYtJmd0O3BhcmVudDsKJiM0MzsJYm9vbCBkZXRhY2hlZCA9IGZhbHNlOwomIzQzOwomIzQzOwlfX2RldmljZV9kcml2ZXJfbG9jayhkZXYsIHBhcmVudCk7CiYjNDM7CS8qCiYjNDM7CSAqIHJwLSZndDtkcnYgaXMgb25seSBldmVyIGNvbXBhcmVkLCBuZXZlciBkZXJlZmVyZW5jZWQ6IHRoZSBkcml2ZXIgaXQKJiM0MzsJICogcG9pbnRzIHRvIG1heSBoYXZlIGJlZW4gdW5yZWdpc3RlcmVkIGFuZCBmcmVlZCBieSBub3cuCiYjNDM7CSAqLwomIzQzOwlpZiAoIWRldi0mZ3Q7cC0mZ3Q7ZGVhZCAmYW1wOyZhbXA7ICFkZXYtJmd0O3AtJmd0O3NodXRkb3duX2RvbmUgJmFtcDsmYW1wOwomIzQzOwkgICAgZGV2LSZndDtkcml2ZXIgJmFtcDsmYW1wOyBkZXYtJmd0O2RyaXZlciA9PSBycC0mZ3Q7ZHJ2KSB7CiYjNDM7CQlfX2RldmljZV9yZWxlYXNlX2RyaXZlcihkZXYsIHBhcmVudCk7CiYjNDM7CQlkZXRhY2hlZCA9IHRydWU7CiYjNDM7CX0KJiM0MzsJX19kZXZpY2VfZHJpdmVyX3VubG9jayhkZXYsIHBhcmVudCk7CiYjNDM7CiYjNDM7CWlmIChkZXRhY2hlZCAmYW1wOyZhbXA7IGRldmljZV9hdHRhY2goZGV2KSAmbHQ7IDApCiYjNDM7CQlkZXZfZXJyKGRldiwgJiMzNDtyZS1wcm9iZSBmYWlsZWQsIGRldmljZSBsZWZ0IHVuYm91bmRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcHV0X2RldmljZShkZXYpOwomIzQzOwlrZnJlZShycCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGRldmljZV9zY2hlZHVsZV9yZXByb2JlIC0gc2NoZWR1bGUgYSBkZWZlcnJlZCBkZXRhY2ggYW5kIHJlLXByb2JlCiYjNDM7ICogQGRldjogZGV2aWNlIHRvIGRldGFjaCBhbmQgcmUtcHJvYmUKJiM0MzsgKiBAZGVsYXlfbXM6IGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHJlLXByb2JlIHJ1bnMKJiM0MzsgKgomIzQzOyAqIFNjaGVkdWxlIGEgZGV0YWNoIGFuZCByZS1wcm9iZSBvZiBAZGV2IGFmdGVyIEBkZWxheV9tcyBtaWxsaXNlY29uZHMuCiYjNDM7ICogVGhlIHJlLXByb2JlIGlzIHNraXBwZWQgaWYsIGJ5IHRoZSB0aW1lIHRoZSBzY2hlZHVsZWQgd29yayBydW5zLCB0aGUKJiM0MzsgKiBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCwgdGhlIHN5c3RlbSBzaHV0ZG93biBzZXF1ZW5jZSBoYXMgcmVhY2hlZCB0aGUKJiM0MzsgKiBkZXZpY2UsIG9yIEBkZXYgaXMgbm8gbG9uZ2VyIGJvdW5kIHRvIHRoZSBkcml2ZXIgdGhhdCB3YXMgYm91bmQgYXQKJiM0MzsgKiBzY2hlZHVsaW5nIHRpbWUuIEluIHBhcnRpY3VsYXIgYW4gYWRtaW5pc3RyYXRpdmUgdW5iaW5kIGlzIG5ldmVyCiYjNDM7ICogdW5kb25lIGJ5IGEgc3RhbGUgcmUtcHJvYmUuCiYjNDM7ICoKJiM0MzsgKiBUaGUgd29yayBmdW5jdGlvbiBpcyBidWlsdC1pbiB0ZXh0LCBzbyB0aGUgYm91bmQgZHJpdmVyIG1heSBjYWxsIHRoaXMKJiM0MzsgKiBmcm9tIGl0cyBvd24gY29kZSB3aXRob3V0IGhvbGRpbmcgYSBtb2R1bGUgcmVmZXJlbmNlLiBJZiB0aGUgZHJpdmVyCiYjNDM7ICogbW9kdWxlIGlzIHVubG9hZGVkIGJlZm9yZSB0aGUgd29yayBydW5zLCBkcml2ZXIgdW5yZWdpc3RyYXRpb24gdW5iaW5kcwomIzQzOyAqIEBkZXYgZmlyc3QgYW5kIHRoZSBzY2hlZHVsZWQgd29yayBkb2VzIG5vdGhpbmcuCiYjNDM7ICoKJiM0MzsgKiBNdWx0aXBsZSBwZW5kaW5nIHJlLXByb2JlcyBmb3IgdGhlIHNhbWUgZGV2aWNlIGFyZSBpbmRpdmlkdWFsbHkgc2FmZTsKJiM0MzsgKiBhIGNhbGxlciB0aGF0IHdhbnRzIGF0IG1vc3Qgb25lIHBlbmRpbmcgcmUtcHJvYmUgbXVzdCBnYXRlIHNjaGVkdWxpbmcKJiM0MzsgKiBpdHNlbGYuCiYjNDM7ICoKJiM0MzsgKiBNYXkgb25seSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgQGRldiBpcyBub3QgYSByZWdpc3RlcmVkIGRldmljZQomIzQzOyAqIGJvdW5kIHRvIGEgZHJpdmVyLCAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztpbnQgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZGV2aWNlX3JlcHJvYmUgKnJwOwomIzQzOwomIzQzOwlpZiAoIWRldi0mZ3Q7YnVzIHx8ICFkZXYtJmd0O3AgfHwgIWRldmljZV9pc19yZWdpc3RlcmVkKGRldikpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJaWYgKCFkZXYtJmd0O2RyaXZlcikKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlycCA9IGt6YWxsb2Nfb2JqKCpycCk7CiYjNDM7CWlmICghcnApCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJcnAtJmd0O2RldiA9IGdldF9kZXZpY2UoZGV2KTsKJiM0MzsJcnAtJmd0O2RydiA9IFJFQURfT05DRShkZXYtJmd0O2RyaXZlcik7CiYjNDM7CUlOSVRfREVMQVlFRF9XT1JLKCZhbXA7cnAtJmd0O3dvcmssIGRldmljZV9yZXByb2JlX3dvcmtfZm4pOwomIzQzOwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX2RmbF93cSwgJmFtcDtycC0mZ3Q7d29yaywKJiM0MzsJCQkgICBtc2Vjc190b19qaWZmaWVzKGRlbGF5X21zKSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvTWFrZWZpbGUKaW5kZXggYTdiZTBlNjY2OWRmYS4uYmNjYWMwZDBmNzAzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZQpAQCAtMSwzICYjNDM7MSwzIEBACiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiBvYmotJChDT05GSUdfTkVUX0RTQV9NWEw4NjIpICYjNDM7PSBteGw4NjJ4eF9kc2EubwotbXhsODYyeHhfZHNhLXkgOj0gbXhsODYyeHgubyBteGw4NjJ4eC1ob3N0Lm8gbXhsODYyeHgtcGh5bGluay5vCiYjNDM7bXhsODYyeHhfZHNhLXkgOj0gbXhsODYyeHgubyBteGw4NjJ4eC1ob3N0Lm8gbXhsODYyeHgtcGh5bGluay5vIG14bDg2Mnh4LWZ3Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1hcGkuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1hcGkuaAppbmRleCBhMTgwYTVkZWNmZmMwLi42Zjc3MTg5NTk4NGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtYXBpLmgKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oCkBAIC0xMjI0LDYgJiM0MzsxMjI0LDE2IEBAIHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB7CiAJX19sZTMyIGl2X2J1aWxkX251bTsKIH0gX19wYWNrZWQ7CiAKJiM0MzsvKioKJiM0MzsgKiBzdHJ1Y3QgbXhsODYyeHhfc3lzX3JlZ19ydyAtIFN5c3RlbSByZWdpc3RlciByZWFkL3dyaXRlCiYjNDM7ICogQGFkZHI6IDMyLWJpdCByZWdpc3RlciBhZGRyZXNzCiYjNDM7ICogQHZhbDogcmVnaXN0ZXIgdmFsdWUKJiM0MzsgKi8KJiM0MztzdHJ1Y3QgbXhsODYyeHhfc3lzX3JlZ19ydyB7CiYjNDM7CV9fbGUzMiBhZGRyOwomIzQzOwlfX2xlMzIgdmFsOwomIzQzO30gX19wYWNrZWQ7CiYjNDM7CiAvKioKICAqIGVudW0gbXhsODYyeHhfcG9ydF90eXBlIC0gUG9ydCBUeXBlCiAgKiBATVhMODYyWFhfTE9HSUNBTF9QT1JUOiBMb2dpY2FsIFBvcnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1jbWQuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1jbWQuaAppbmRleCBjODdhOTU1YzEzYzQ4Li5hODY1NDI1YWE2MWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtY21kLmgKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oCkBAIC03MCw3ICYjNDM7NzAsOSBAQAogI2RlZmluZSBJTlRfR1BIWV9SRUFECQkJKEdQWV9HUFkyWFhfTUFHSUMgJiM0MzsgMHgxKQogI2RlZmluZSBJTlRfR1BIWV9XUklURQkJCShHUFlfR1BZMlhYX01BR0lDICYjNDM7IDB4MikKIAomIzQzOyNkZWZpbmUgU1lTX01JU0NfRldfVVBEQVRFCQkoU1lTX01JU0NfTUFHSUMgJiM0MzsgMHgxKQogI2RlZmluZSBTWVNfTUlTQ19GV19WRVJTSU9OCQkoU1lTX01JU0NfTUFHSUMgJiM0MzsgMHgyKQomIzQzOyNkZWZpbmUgU1lTX01JU0NfUkVHX1JECQkJKFNZU19NSVNDX01BR0lDICYjNDM7IDB4OCkKIAogI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19DT05GSUcJKE1YTDg2MlhYX1hQQ1NfTUFHSUMgJiM0MzsgMHgxKQogI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19HRVRfU1RBVEUJKE1YTDg2MlhYX1hQQ1NfTUFHSUMgJiM0MzsgMHgyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5iNmUwMzdkOTU2NDBiCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMKQEAgLTAsMCAmIzQzOzEsMTA1NCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCiYjNDM7LyoKJiM0MzsgKiBGaXJtd2FyZSBmbGFzaCBhbmQgZGV2bGluayBzdXBwb3J0IGZvciBNYXhMaW5lYXIgTXhMODYyeHgKJiM0MzsgKgomIzQzOyAqIENvcHlyaWdodCAoQykgMjAyNSBEYW5pZWwgR29sbGUgJmx0O2RhbmllbEBtYWtyb3RvcGlhLm9yZyZndDsKJiM0MzsgKgomIzQzOyAqIFNCIFBESSAtIGZpcm13YXJlIGRvd25sb2FkIGludGVyZmFjZSBvdmVyIGNsYXVzZS0yMiBTTURJTwomIzQzOyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQomIzQzOyAqCiYjNDM7ICogVGhlIE14TDg2Mnh4IE1DVWJvb3QgbG9hZGVyIGFjY2VwdHMgYSBmaXJtd2FyZSBpbWFnZSB0aHJvdWdoIGZvdXIgJiMzNDtTQiBQREkmIzM0OwomIzQzOyAqIHJlZ2lzdGVycyBpbiB0aGUgc3dpdGNoIFNNRElPIHJlZ2lzdGVyIHNwYWNlLiBJdCBydW5zIHdoZW5ldmVyIG5vIFdTUAomIzQzOyAqIGZpcm13YXJlIGlzIGFjdGl2ZTogdGhlIG5vcm1hbCBmaXJtd2FyZSB1cGRhdGUgZW50ZXJzIGl0IGRlbGliZXJhdGVseSAtIHRoZQomIzQzOyAqIFNZU19NSVNDX0ZXX1VQREFURSBBUEkgY29tbWFuZCBzZXRzIGEgc3RpY2t5IHJlc2N1ZSBiaXQgYW5kIHJlYm9vdHMgaW50bwomIzQzOyAqIE1DVWJvb3QgLSBhbmQgdGhlIGxvYWRlciBhbHNvIHN0YXlzIGhlcmUgd2hlbiB0aGUgc3RvcmVkIFdTUCBmaXJtd2FyZSBmYWlscwomIzQzOyAqIGl0cyBib290LXRpbWUgaW50ZWdyaXR5IGNoZWNrLiBUaGlzIGRyaXZlciBkcml2ZXMgdGhlIGxvYWRlciYjMzk7cyAweGM1NWMKJiM0MzsgKiAmIzM0O2NvbnNvbGUmIzM0OyBkb3dubG9hZCBwYXRoLgomIzQzOyAqCiYjNDM7ICogU01ESU8gcmVnaXN0ZXIgYWNjZXNzIChteGw4NjJ4eF9zbWRpb19yZWFkL3dyaXRlKToKJiM0MzsgKiAgIE1JSSByZWcgMHgxZiA6PSAoJmx0O3NiX3BkaV9yZWcmZ3Q7ICZhbXA7IDB4ZmZmMCkgICA7IHBhZ2UgbGF0Y2gKJiM0MzsgKiAgIE1JSSByZWcgKCZsdDtzYl9wZGlfcmVnJmd0OyAmYW1wOyAweDAwMGYpIDo9IC8gPSZndDsgJmx0O3UxNiBkYXRhJmd0OwomIzQzOyAqIHNvIENUUkwvQUREUi9EQVRBL1NUQVQgKDB4ZTEwMC4uMHhlMTAzKSBhcmUgTUlJIHJlZ3MgMC8xLzIvMyBvZiBwYWdlCiYjNDM7ICogMHhlMTAwLCBub3QgYWxsIHJlZyAweDAwLgomIzQzOyAqCiYjNDM7ICogU0IgUERJIHJlZ2lzdGVycyAoaG9zdCBuYW1lL2FkZHIgIC0mZ3Q7ICBNQ1UgbWFpbGJveCk6CiYjNDM7ICogICBDVFJMIDB4ZTEwMCAtJmd0OyAweGMwOTM4NDAwICAgbW9kZTogUlNUPTB4MDAgIFJEPTB4MDEgIFdSPTB4MDIKJiM0MzsgKiAgIEFERFIgMHhlMTAxIC0mZ3Q7IDB4YzA5Mzg0MDQgICBTQiB0YXJnZXQgd29yZCBhZGRyZXNzIChTQjEgYmFuayA9IDB4NzgwMCkKJiM0MzsgKiAgIERBVEEgMHhlMTAyIC0mZ3Q7IDB4YzA5Mzg0MDggICAxNi1iaXQgZGF0YSAvIHJlcGx5IHdvcmQKJiM0MzsgKiAgIFNUQVQgMHhlMTAzIC0mZ3Q7IDB4YzA5Mzg0MGMgICBoYW5kc2hha2U6IGEgbWFnaWMgKGJlbG93KSBvciBhIGJ5dGUgY291bnQKJiM0MzsgKgomIzQzOyAqIFNUQVQgbWFnaWNzOgomIzQzOyAqICAgUkVBRFkgIDB4YzU1YyAgIGxvYWRlciBpZGxlIGluIHRoZSBjb25zb2xlIGxvb3AgICAgICAgICh0aGlzIGRyaXZlcikKJiM0MzsgKiAgIERMX1JEWSAweGMzM2MgICBsb2FkZXIgaWRsZSBpbiB0aGUgZmxhc2hsZXNzIGxvb3AKJiM0MzsgKiAgIFNUQVJUICAweGY0OGYgICBob3N0ICAgLSZndDsgYmVnaW4gZG93bmxvYWQgc2Vzc2lvbgomIzQzOyAqICAgQUNLICAgIDB4ZjQ5MCAgIGxvYWRlciAtJmd0OyBTVEFSVCBhY2tub3dsZWRnZWQgKFNUQVJUICYjNDM7IDEpCiYjNDM7ICogICBFTkQgICAgMHgzY2MzICAgaG9zdCAgIC0mZ3Q7IGZpbmFsaXNlIG5vdyAob3B0aW9uYWwsIHNlZSBiZWxvdykKJiM0MzsgKiAgIFJEUkVHICAweGUyYzAgICBob3N0ICAgLSZndDsgcmVnaXN0ZXItcmVhZCBjb21tYW5kICh8IGluZGV4KSwgc2VlIGJlbG93CiYjNDM7ICoKJiM0MzsgKiBDb25zb2xlIGZsYXNoIHBhdGggKFNUQVQ9MHhjNTVjKSAtIG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKCk6CiYjNDM7ICoKJiM0MzsgKiAgIGhvc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcgomIzQzOyAqICAgLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tCiYjNDM7ICogICByZXNldCAoQ1RSTD1BRERSPURBVEE9MCkKJiM0MzsgKiAgIHJlYWQgU1RBVCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDB4YzU1YyAgIChSRUFEWSwgaWRsZSkKJiM0MzsgKiAgIFNUQVQgOj0gU1RBUlQoMHhmNDhmKSAgLS0tLS0tLS0tLS0tLS0mZ3Q7CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICZsdDstLS0tLS0tLS0tLS0tLSBTVEFUID0gMHhmNDkwIChBQ0spCiYjNDM7ICogICBDVFJMIDo9IFdSCiYjNDM7ICogICBEQVRBIDo9IGhkclswLi45XSAgKDIwLWJ5dGUgaGVhZGVyOiB0eXBlLHNpemUxLGNyYzEsc2l6ZTIsY3JjMikKJiM0MzsgKiAgIHJlc2V0OyBTVEFUIDo9IDIwIChoZWFkZXIgbGVuKSAgLS0tLS0mZ3Q7IHBhcnNlIGhkcjsgcl9yZW1haW49c2l6ZTEmIzQzO3NpemUyOwomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJBU0UgdGFyZ2V0IHJlZ2lvbihzKQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7LS0tLS0tLS0tLS0tLS0gU1RBVD0yMSAobGVuJiM0MzsxKSwgdGhlbiBTVEFUPTAKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcmFzZWQpCiYjNDM7ICogICAtLSBwYXlsb2FkLCBzdHJlYW1lZCBpbiBzbGljZXM6IC0tCiYjNDM7ICogICBDVFJMIDo9IFdSCiYjNDM7ICogICBEQVRBIDo9IHdvcmQgeCBOIC4uLgomIzQzOyAqICAgICBhdCB3b3JkIDE2Mzg0OiBDVFJMOj1SU1Q7IEFERFI6PTB4NzgwMDsgQ1RSTDo9V1IgIChoYWxmLWJhbmsgLSZndDsgU0IxKQomIzQzOyAqICAgICBhdCB3b3JkIDMyNzYwOiBmbHVzaCBzbGljZToKJiM0MzsgKiAgICAgICAgcmVzZXQ7IFNUQVQgOj0gJmx0O2J5dGVzX3RoaXNfc2xpY2UmZ3Q7IC0tLSZndDsgcl9yZW1haW4gLT0gYnl0ZXM7IHByb2dyYW0KJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0Oy0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBVD0wICAocmVhZHkgZm9yIG5leHQgc2xpY2UpCiYjNDM7ICogICAuLi4gcmVwZWF0IHVudGlsIHRoZSB3aG9sZSBwYXlsb2FkIGlzIHNlbnQgLi4uCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICZsdDstLS0tLS0tLS0tLS0tLS0tLS0tIFNUQVQ9MCAgaW1hZ2UgdmVyaWZpZWQKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNUQVQ9MTogaW1hZ2UgcmVqZWN0ZWQpCiYjNDM7ICogICBTVEFUIDo9IEVORCgweDNjYzMpICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0mZ3Q7IGZpbmFsaXNlIGFuZCBib290CiYjNDM7ICoKJiM0MzsgKiBUaGUgcl9yZW1haW4gPT0gMCBydWxlIChjcml0aWNhbCk6CiYjNDM7ICogICBFdmVyeSBob3N0IFNUQVQgd3JpdGUgaW4gdGhlIHBheWxvYWQgcGhhc2UgaXMgYSBieXRlIGNvdW50OyB0aGUgbG9hZGVyCiYjNDM7ICogICBkb2VzIHJfcmVtYWluIC09IGNvdW50IGFuZCBzdGF5cyBpbiB0aGUgcmVjZWl2ZSBsb29wIHdoaWxlIHJfcmVtYWluICE9IDAuCiYjNDM7ICogICBJdCBsZWF2ZXMgdGhlIGxvb3AgT05MWSB3aGVuIHJfcmVtYWluIGhpdHMgRVhBQ1RMWSAwLCBhbmQgYSBjb3VudCBsYXJnZXIKJiM0MzsgKiAgIHRoYW4gcl9yZW1haW4gdW5kZXJmbG93cyB0aGUgMzItYml0IGNvdW50ZXIgYW5kIHdlZGdlcyB0aGUgbG9hZGVyIHVudGlsIGEKJiM0MzsgKiAgIHBvd2VyIGN5Y2xlLiBIYXZpbmcgbGVmdCBpdCwgdGhlIGxvYWRlciB2ZXJpZmllcyB0aGUgaW1hZ2UsIHB1Ymxpc2hlcyB0aGUKJiM0MzsgKiAgIHZlcmRpY3QgaW4gU1RBVCAoMCBnb29kLCAxIHJlamVjdGVkKSBhbmQgd2FpdHMgMiBzIGZvciBFTkQgYmVmb3JlCiYjNDM7ICogICBmaW5hbGlzaW5nIHJlZ2FyZGxlc3MgLS0gY2xlYXJpbmcgaXRzIHJlc2N1ZS1lbmFibGUgYml0IHNvIGJvb3RfZ28gYm9vdHMKJiM0MzsgKiAgIHRoZSBuZXcgaW1hZ2UgLS0gc28gRU5EIG9ubHkgc2F2ZXMgdGhhdCB3YWl0LiBIZW5jZToKJiM0MzsgKiAgICAgLSBuZXZlciBzZW5kIGEgc2xpY2UvY2h1bmsgY291bnQgbGFyZ2VyIHRoYW4gd2hhdCBpcyBvdXRzdGFuZGluZzsKJiM0MzsgKiAgICAgLSBhIFNUQVQgd3JpdGUgaXMgYSBjb21tYW5kIG9ubHkgb25jZSB0aGUgbG9hZGVyIGhhcyBsZWZ0IHRoZSBsb29wOwomIzQzOyAqICAgICAtIHRoZSBsb2FkZXIgbGVhdmVzIHRoZSBjb3VudCBpbiBTVEFUIHdoaWxlIGl0IHByb2dyYW1zIHRoZSBjaHVuaywgc28KJiM0MzsgKiAgICAgICBhIGxpbmdlcmluZyBjb3VudCBkb2VzIG5vdCBkaXN0aW5ndWlzaCAmIzM0O2J1c3kmIzM0OyBmcm9tICYjMzQ7dmVyZGljdCYjMzQ7OwomIzQzOyAqICAgICAtIGludGVycnVwdGVkLWRvd25sb2FkIHJlY292ZXJ5IGZlZWRzIDEgYnl0ZSBhdCBhIHRpbWUgKHNlZSBiZWxvdykuCiYjNDM7ICoKJiM0MzsgKiBJbnRlcnJ1cHRlZC1mbGFzaCByZWNvdmVyeSAobXhsODYyeHhfcmVzY3VlX2RyYWluKToKJiM0MzsgKiAgIEEgaG9zdCB0aGF0IGRpZXMgbWlkLXBheWxvYWQgbGVhdmVzIHRoZSBsb2FkZXIgaW4gdGhlIHJlY2VpdmUgbG9vcCBob2xkaW5nCiYjNDM7ICogICBTVEFUPTAuIEZlZWQgc2luZ2xlIDEtYnl0ZSBjaHVua3MgKG9uZSBEQVRBIHdvcmQgJiM0MzsgU1RBVD0xKSB1bnRpbCByX3JlbWFpbgomIzQzOyAqICAgcmVhY2hlcyAwOyB0aGUgbG9hZGVyIHRoZW4gdmVyaWZpZXMgdGhlIChub3cgY29ycnVwdCkgaW1hZ2UsIHB1Ymxpc2hlcyBpdHMKJiM0MzsgKiAgIHZlcmRpY3QgYW5kIGNvbWVzIGJhY2sgdG8gUkVBRFkgYnkgaXRzZWxmLiBFTkQgaXMgbmV2ZXIgc2VudCBoZXJlOiB3aGlsZQomIzQzOyAqICAgcl9yZW1haW4gaXMgbm9uLXplcm8gaXQgd291bGQgYmUgY29uc3VtZWQgYXMgYSAxNTU1NS1ieXRlIGNvdW50LCBhbmQgYQomIzQzOyAqICAgbGluZ2VyaW5nIFNUQVQ9MSBjYW5ub3QgYmUgdG9sZCBmcm9tIGEgY2h1bmsgc3RpbGwgYmVpbmcgcHJvZ3JhbW1lZC4KJiM0MzsgKgomIzQzOyAqIFJlZ2lzdGVyLXJlYWQgY2hhbGxlbmdlIChub24tZGVzdHJ1Y3RpdmUgbGl2ZW5lc3MgcHJvb2YpOgomIzQzOyAqICAgREFUQSA6PSAweDdjMjMgKG1hcmtlcik7IFNUQVQgOj0gMHhlMmMwfGlkeAomIzQzOyAqICAgICAtJmd0OyBsb2FkZXIgcmV0dXJucyBhIHJ1bnRpbWUgd29yZCBpbiBEQVRBIGFuZCByZS1hcm1zIFNUQVQ9MHhjNTVjLgomIzQzOyAqICAgVGhlIHJlcGx5IHNvdXJjZSBpcyBsb2FkZXIgQlNTLCBub3QgYSBjaGlwIGlkOyB1c2VkIG9ubHkgdG8gcHJvdmUgYSBsaXZlCiYjNDM7ICogICBtYWlsYm94IGluIG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdCgpLgomIzQzOyAqCiYjNDM7ICogVGhlIG90aGVyIFNUQVQgcmVhZHkgbWFnaWMsIDB4YzMzYywgbWFya3MgdGhlIGxvYWRlciYjMzk7cyBmbGFzaGxlc3MKJiM0MzsgKiBjaGlwLXRvLWNoaXAgZG93bmxvYWQgbW9kZSAoTXhMODYyODFTIDE2LXBvcnQgdGllcik7IHRoaXMgZHJpdmVyIGRvZXMgbm90CiYjNDM7ICogdXNlIGl0LgomIzQzOyAqCiYjNDM7ICogUmVzY3VlIGxpZmVjeWNsZSAoZGV2bGluayk6IHByb2JlIHJ1bnMgbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KCk7IGEKJiM0MzsgKiB3ZWRnZWQgbG9hZGVyIGlzIGRyYWluZWQgYmFjayB0byBSRUFEWSBieSBhIGJhY2tncm91bmQgc2VsZi1oZWFsCiYjNDM7ICogKHJlc2N1ZV9oZWFsX3dvcmspLCBzbyB0aGUgbG9uZyByZWNvdmVyeSBuZXZlciBob2xkcyB0aGUgZGV2bGluayBsb2NrLgomIzQzOyAqIGRldmxpbmsgZGV2IGluZm8gZXhwb3NlcyB0aGUgZncgdmVyc2lvbiAodGhlICYjMzQ7Zmxhc2hhYmxlJiMzNDsgc2lnbmFsKSBvbmx5IG9uY2UgYXQKJiM0MzsgKiBSRUFEWTsgZmxhc2hfdXBkYXRlIHJldHVybnMgLUVCVVNZIHVudGlsIHRoZW4sIGFuZCByZXByb2JlcyB0byBXU1AgZmlybXdhcmUKJiM0MzsgKiBvbiBzdWNjZXNzLgomIzQzOyAqCiYjNDM7ICogTm90ZXM6CiYjNDM7ICogICAtIENoaXAgaWQvcmV2aXNpb24gKDB4YzBkMjg4ODQvODgpIGFyZSBOT1QgcmVhY2hhYmxlIG9uIHRoaXMgY2hhbm5lbDsgdGhleQomIzQzOyAqICAgICBuZWVkIHRoZSBjbGF1c2UtNDUgTU1EIGZpcm13YXJlIG1haWxib3gsIHdoaWNoIGlzIGRlYWQgdW5kZXIgTUNVYm9vdC4KJiM0MzsgKiAgICAgUmVzY3VlIGlkZW50aXR5IGlzIGJ5IFNCIFBESSBiZWhhdmlvdXIgb25seSAobXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KS4KJiM0MzsgKiAgIC0gVGhlIFNNRElPIFBIWSBhZGRyZXNzIGNvbWVzIGZyb20gdGhlIGRldmljZSB0cmVlOyB0aGUgMHhlMXh4IHJlZ2lzdGVyCiYjNDM7ICogICAgIG9mZnNldHMgYXJlIHRoZSBPVFAgcmVzZXQgZGVmYXVsdHMgYW5kIHRoZSBvbmx5IGxheW91dCBzdXBwb3J0ZWQgaGVyZS4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY3JjMzIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZGVsYXkuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZGV2aWNlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2lvcG9sbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9uZXRkZXZpY2UuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvb3ZlcmZsb3cuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcnRuZXRsaW5rLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3dvcmtxdWV1ZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtuZXQvZHNhLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O25ldC9zd2l0Y2hkZXYuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O214bDg2Mnh4LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7bXhsODYyeHgtYXBpLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7bXhsODYyeHgtY21kLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7bXhsODYyeHgtZncuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1ob3N0LmgmIzM0OwomIzQzOwomIzQzOy8qIFNCIFBESSByZWdpc3RlcnMgKGNsYXVzZS0yMiBTTURJTyBhZGRyZXNzIHNwYWNlKSAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkwJCTB4ZTEwMAomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0FERFIJCTB4ZTEwMQomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0RBVEEJCTB4ZTEwMgomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1NUQVQJCTB4ZTEwMwomIzQzOwomIzQzOy8qIFNCIFBESSBDVFJMIG1vZGVzICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QJMHgwMAomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IJCTB4MDIKJiM0MzsKJiM0MzsvKiBTQiBQREkgaGFuZHNoYWtlIG1hZ2ljIChwdWJsaXNoZWQvY29uc3VtZWQgdmlhIFNUQVQpICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfUkVBRFkJCTB4YzU1YwkvKiBsb2FkZXIgaWRsZSwgY29uc29sZSBsb29wICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfRExfUkVBRFkJMHhjMzNjCS8qIGxvYWRlciBpZGxlLCBmbGFzaGxlc3MgbG9vcCAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1NUQVJUCQkweGY0OGYKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9FTkQJCTB4M2NjMwomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1JEUkVHCQkweGUyYzAJLyogcmVnaXN0ZXItcmVhZCBjbWQgKHwgaW5kZXgpICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfUkRSRUdfTUFSSwkweDdjMjMJLyogbWFya2VyIHBsYWNlZCBpbiBEQVRBIGZvciBSRFJFRyAqLwomIzQzOwomIzQzOy8qIEJlaGF2aW91cmFsIHByZXNlbmNlIHByb2JlOiB0d28gZGlzdGluY3QgMTYtYml0IGxhdGNoZXMgb24gQUREUi9EQVRBLiAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1BST0JFX0EJCTB4NWE1YQomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1BST0JFX0QJCTB4YTVhNQomIzQzOwomIzQzOy8qIEltYWdlIHZlcmlmaWNhdGlvbiB2ZXJkaWN0IHB1Ymxpc2hlZCBpbiBTVEFUIG9uY2UgdGhlIHJlY2VpdmUgbG9vcCBlbmRzICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX09LCTAKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9WRVJJRllfQkFECTEKJiM0MzsKJiM0MzsvKiBGaXJtd2FyZSB0cmFuc2ZlciBnZW9tZXRyeSAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfSERSX1NJWkUJCTIwCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX0hBTEYJCTE2Mzg0CS8qIHdvcmRzIHBlciBoYWxmLWJhbmsgKi8KJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0ZXX0JBTktfU0xJQ0UJCTMyNzYwCS8qIHdvcmRzIHBlciBmdWxsIHNsaWNlICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19TQjFfQUREUgkJMHg3ODAwCS8qIFNCMSB3b3JkIGFkZHJlc3MgKi8KJiM0MzsKJiM0MzsvKiBUaW1lb3V0cyAoZ2VuZXJvdXMgdXBwZXIgYm91bmRzKSAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfUkVBRFlfVElNRU9VVF9NUwkzMDAwCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19BQ0tfVElNRU9VVF9NUwk1MDAwCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19FUkFTRV9USU1FT1VUX01TCTMwMDAwMAomIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfV1JJVEVfVElNRU9VVF9NUwk2MDAwMAomIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfUkVCT09UX0RFTEFZX01TCTUwMDAKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVMJNTAwCiYjNDM7LyogT25lIGxvYWRlciBtYWlsYm94IHN0ZXA6IHByb2dyYW0gYSAxLWJ5dGUgY2h1bmsgb3Igc2VydmljZSBhIGNvbW1hbmQgKi8KJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TCQkyMDAwCiYjNDM7LyogQ292ZXJzIHRoZSBsb2FkZXImIzM5O3MgRU5EIHdhaXQsIHZlcmlmaWNhdGlvbiBhbmQgdGhlIHJlc2V0IGludG8gUkVBRFkgKi8KJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9WRVJJRllfTVMJMTUwMDAKJiM0MzsKJiM0MztzdGF0aWMgaW50IG14bDg2Mnh4X3NiX3BkaV9yZXNldChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdikKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLAomIzQzOwkJCQkgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9BRERSLAomIzQzOwkJCQkgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldHVybiBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwKJiM0MzsJCQkJICAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGV4cGVjdGVkLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcykKJiM0Mzt7CiYjNDM7CWludCByZXQsIHZhbDsKJiM0MzsKJiM0MzsJcmV0ID0gcmVhZF9wb2xsX3RpbWVvdXQobXhsODYyeHhfc21kaW9fcmVhZCwgdmFsLAomIzQzOwkJCQl2YWwgJmx0OyAwIHx8ICh1MTYpdmFsID09IGV4cGVjdGVkLAomIzQzOwkJCQkxMDAwMCwgdGltZW91dF9tcyAqIDEwMDAsIGZhbHNlLAomIzQzOwkJCQlwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7CiYjNDM7CWlmICh2YWwgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHZhbDsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2Uoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsCiYjNDM7CQkJCSAgICAgICB1MzIgZGF0YV93cml0dGVuKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULCBkYXRhX3dyaXR0ZW4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldHVybiBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIDAsCiYjNDM7CQkJCQkgTVhMODYyWFhfRldfV1JJVEVfVElNRU9VVF9NUyk7CiYjNDM7fQomIzQzOwomIzQzOy8qIEZsdXNoIHRoZSBsYXN0IHNsaWNlLCB3aGljaCBlbmRzIHRoZSByZWNlaXZlIGxvb3A6IHRoZSBsb2FkZXIgdmVyaWZpZXMgdGhlCiYjNDM7ICogaW1hZ2UgYW5kIHJlcGxhY2VzIHRoZSBjb3VudCBpbiBTVEFUIHdpdGggaXRzIHZlcmRpY3QsIHNvIHdhaXQgZm9yIHRoZSBjb3VudAomIzQzOyAqIHRvIGdvIHJhdGhlciB0aGFuIGZvciBhIGZpeGVkIHZhbHVlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX2ZsdXNoX2xhc3Qoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsCiYjNDM7CQkJCSAgICAgIHUzMiBkYXRhX3dyaXR0ZW4pCiYjNDM7ewomIzQzOwlpbnQgcmV0LCB2YWw7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwgZGF0YV93cml0dGVuKTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSByZWFkX3BvbGxfdGltZW91dChteGw4NjJ4eF9zbWRpb19yZWFkLCB2YWwsCiYjNDM7CQkJCXZhbCAmbHQ7IDAgfHwgKHUxNil2YWwgIT0gKHUxNilkYXRhX3dyaXR0ZW4sCiYjNDM7CQkJCTEwMDAwLCAoTVhMODYyWFhfRldfV1JJVEVfVElNRU9VVF9NUyAmIzQzOwomIzQzOwkJCQkJTVhMODYyWFhfU0JfUERJX1ZFUklGWV9NUykgKiAxMDAwLAomIzQzOwkJCQlmYWxzZSwgcHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQpOwomIzQzOwlpZiAodmFsICZsdDsgMCkKJiM0MzsJCXJldHVybiB2YWw7CiYjNDM7CiYjNDM7CWlmICghcmV0ICZhbXA7JmFtcDsgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1ZFUklGWV9PSykKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwkvKiBBIGZpbmFsIGNvdW50IG9mIDEgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgcmVqZWN0IHZlcmRpY3QsIHNvCiYjNDM7CSAqIGEgdGltZW91dCBzdGlsbCBob2xkaW5nIGl0IGxhbmRzIGhlcmUgdG9vLgomIzQzOwkgKi8KJiM0MzsJaWYgKCh1MTYpdmFsID09IE1YTDg2MlhYX1NCX1BESV9WRVJJRllfQkFEKSB7CiYjNDM7CQlkZXZfZXJyKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7ZGV2LAomIzQzOwkJCSYjMzQ7Zmxhc2g6IGxvYWRlciByZWplY3RlZCB0aGUgaW1hZ2VcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRUJBRE1TRzsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gcmV0ID8gcmV0IDogLUVQUk9UTzsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgbXhsODYyeHhfZmxhc2hfbm90aWZ5KHN0cnVjdCBkZXZsaW5rICpkbCwgY29uc3QgY2hhciAqc3RhdHVzLAomIzQzOwkJCQkgIHUzMiBkb25lLCB1MzIgdG90YWwpCiYjNDM7ewomIzQzOwlkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9zdGF0dXNfbm90aWZ5KGRsLCBzdGF0dXMsIE5VTEwsIGRvbmUsIHRvdGFsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQnl0ZS1jb3VudCBvZiBlYWNoIGNodW5rIGZlZCB0byB0aGUgbG9hZGVyIGR1cmluZyBkcmFpbi4gSXQgTVVTVCBiZSAxOiB0aGUKJiM0MzsgKiBsb2FkZXIgb25seSBsZXRzIHVzIG9ic2VydmUgJiMzNDtjb3VudGVyID09IDAmIzM0OywgbmV2ZXIgJiMzNDtjb3VudGVyICZsdDsgc3RlcCYjMzQ7LCBzbyBhbnkKJiM0MzsgKiBzdGVwICZndDsgMSBjYW4gc3VidHJhY3QgcGFzdCB6ZXJvLCB1bmRlcmZsb3cgdGhlIDMyLWJpdCBjb3VudGVyIGFuZCB3ZWRnZSB0aGUKJiM0MzsgKiBsb2FkZXIgZm9yIH4yXjMyIG1vcmUgYnl0ZXMgKGEgc3RhdGUgb25seSBhIHBvd2VyIGN5Y2xlIGNsZWFycykuIFN0ZXBwaW5nIGJ5CiYjNDM7ICogMSB3YWxrcyB0aGUgY291bnRlciB0aHJvdWdoIGV2ZXJ5IHZhbHVlIGFuZCBpcyBndWFyYW50ZWVkIHRvIGxhbmQgb24gemVybwomIzQzOyAqIHdoYXRldmVyIGl0cyAocG9zc2libHkgb2RkKSBzdGFydC4gQSAxLWJ5dGUgY2h1bmsgaXMgYSBwYXRoIHRoZSBsb2FkZXIKJiM0MzsgKiBhbHJlYWR5IGhhbmRsZXM6IHRoZSBub3JtYWwgdHJhbnNmZXIgZW5kcyB3aXRoIGEgc2luZ2xlIHRyYWlsaW5nIGJ5dGUgZm9yCiYjNDM7ICogb2RkLXNpemVkIGltYWdlcyAoc2VlIFN0ZXAgNikuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUwkxCiYjNDM7CiYjNDM7LyogTG9nIHRoZSBkcmFpbiYjMzk7cyBwcm9ncmVzcyBldmVyeSBzbyBtYW55IGJ5dGVzOyBpdCBjYW4gcnVuIGZvciBhIGxvbmcgdGltZSAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfRFJBSU5fTE9HX0JZVEVTCSgxMjggKiAxMDI0KQomIzQzOwomIzQzOy8qIFdhaXQgZm9yIHRoZSBsb2FkZXIgdG8gYXNrIGZvciB0aGUgbmV4dCBjaHVuayAoU1RBVCAwKSBvciB0byBjb21lIGJhY2sgdG8gaXRzCiYjNDM7ICogY29tbWFuZCBsb29wIChTVEFUIFJFQURZKSwgYW5kIHJldHVybiB0aGUgU1RBVCB2YWx1ZSBlaXRoZXIgd2F5LiBPbiB0aW1lb3V0CiYjNDM7ICogdGhhdCBpcyB3aGF0ZXZlciBTVEFUIHN0aWxsIGhvbGRzLCB3aGljaCBjYXJyaWVzIG5vIGZ1cnRoZXIgaW5mb3JtYXRpb246IHRoZQomIzQzOyAqIGxvYWRlciBrZWVwcyB0aGUgY291bnQgd2Ugd3JvdGUgdmlzaWJsZSB3aGlsZSBpdCBwcm9ncmFtcyB0aGUgY2h1bmssIGFuZCB0aGF0CiYjNDM7ICogaXMgdGhlIHNhbWUgdmFsdWUgaXQgcHVibGlzaGVzIGFzIHRoZSAmIzM0O2ltYWdlIHJlamVjdGVkJiMzNDsgdmVyZGljdCBvbmNlIHRoZQomIzQzOyAqIGNvdW50ZXIgcmVhY2hlcyB6ZXJvLgomIzQzOyAqCiYjNDM7ICogU1RBVCAwIGlzIHVuYW1iaWd1b3VzIGhlcmUgZXZlbiB0aG91Z2ggaXQgaXMgYWxzbyB0aGUgJiMzNDtpbWFnZSB2ZXJpZmllZCYjMzQ7CiYjNDM7ICogdmVyZGljdDogYnkgdGhlIHJfcmVtYWluID09IDAgcnVsZSB0aGUgbG9hZGVyIGxlYXZlcyB0aGUgcmVjZWl2ZSBsb29wIHRoZQomIzQzOyAqIG1vbWVudCB0aGUgY291bnRlciByZWFjaGVzIHplcm8sIHNvIGl0IGlzIG5ldmVyIGJvdGggaW5zaWRlIHRoZSBsb29wIGFza2luZwomIzQzOyAqIGZvciBhIGNodW5rIGFuZCBwdWJsaXNoaW5nIGEgdmVyZGljdC4gT25jZSBpdCBoYXMgbGVmdCwgdGhlIG5leHQgU1RBVCB3cml0ZQomIzQzOyAqIGlzIGEgY29tbWFuZCByYXRoZXIgdGhhbiBhIGNvdW50LCBzbyBmZWVkaW5nIG9uZSBtb3JlIGNodW5rIGFmdGVyIGEgdmVyZGljdAomIzQzOyAqIGNhbm5vdCB1bmRlcmZsb3cgYW55dGhpbmcgZWl0aGVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX3BvbGxfZHJhaW4oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcykKJiM0Mzt7CiYjNDM7CWludCB2YWw7CiYjNDM7CiYjNDM7CXJlYWRfcG9sbF90aW1lb3V0KG14bDg2Mnh4X3NtZGlvX3JlYWQsIHZhbCwKJiM0MzsJCQkgIHZhbCAmbHQ7IDAgfHwgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZIHx8CiYjNDM7CQkJICAodTE2KXZhbCA9PSAwLAomIzQzOwkJCSAgNTAsIHRpbWVvdXRfbXMgKiAxMDAwLCBmYWxzZSwKJiM0MzsJCQkgIHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFUKTsKJiM0MzsJaWYgKHZhbCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gdmFsOwomIzQzOwlyZXR1cm4gKHUxNil2YWw7CiYjNDM7fQomIzQzOwomIzQzOy8qIFRoZSBsb2FkZXIgaXMgbm90IGFza2luZyBmb3IgYSBjaHVuazogaXQgbWF5IHN0aWxsIGJlIHByb2dyYW1taW5nIHRoZSBsYXN0CiYjNDM7ICogb25lLCBvciB0aGUgY291bnRlciBoYXMgcmVhY2hlZCB6ZXJvIGFuZCBpdCBpcyB2ZXJpZnlpbmcgdGhlIGltYWdlIGFuZAomIzQzOyAqIHJlc2V0dGluZyBpbnRvIFJFQURZLiBXYWl0IHRoYXQgb3V0IC0tIFNUQVQgY2Fubm90IHRlbGwgdGhlIHR3byBhcGFydCwgYW5kCiYjNDM7ICogZ3Vlc3Npbmcgd291bGQgbWVhbiB3cml0aW5nIEVORCBpbnRvIGEgbGl2ZSByZWNlaXZlIGxvb3AuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb25jZSB0aGUgbG9hZGVyIGhhcyBsZWZ0IHRoZSBsb29wLCAtRUFHQUlOIGlmIGl0IGFza3MgZm9yIGFub3RoZXIKJiM0MzsgKiBjaHVuayBhZnRlciBhbGwsIC1FSU8gZm9yIGEgbG9hZGVyIHN0aWxsIGhvbGRpbmcgdGhlIGNvdW50IHdoZW4gdGhlIHZlcmlmeQomIzQzOyAqIHdpbmRvdyBleHBpcmVzLCBvciBhbiBTTURJTyBidXMgZXJyb3IuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9yZXNjdWVfZHJhaW5fZmluaXNoKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgY2h1bmspCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2RldjsKJiM0MzsJaW50IHN0YXQ7CiYjNDM7CiYjNDM7CXN0YXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TKTsKJiM0MzsJaWYgKHN0YXQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHN0YXQ7CiYjNDM7CWlmIChzdGF0ID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlpZiAoc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX0JBRCkgewomIzQzOwkJZGV2X2VycihkZXYsCiYjNDM7CQkJJiMzNDtmbGFzaDogbG9hZGVyIHN0dWNrIGFmdGVyICV1IGNodW5rcywgcG93ZXIgY3ljbGUgaXRcbiYjMzQ7LAomIzQzOwkJCWNodW5rKTsKJiM0MzsJCXJldHVybiAtRUlPOwomIzQzOwl9CiYjNDM7CWlmIChzdGF0KSB7CiYjNDM7CQkvKiBBIGZpcm13YXJlIGlzIGFuc3dlcmluZywgbm90IHRoZSBsb2FkZXI6IGFuIGltYWdlIHN1cnZpdmVkCiYjNDM7CQkgKiBpbiBmbGFzaCBhbmQgYm9vdGVkLgomIzQzOwkJICovCiYjNDM7CQlkZXZfaW5mbyhkZXYsICYjMzQ7Zmxhc2g6IGZpcm13YXJlIGJvb3RlZCB3aGlsZSBkcmFpbmluZ1xuJiMzNDspOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIC1FQUdBSU47CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlY292ZXIgYSBzd2l0Y2ggd2hvc2UgU0IgUERJIGRvd25sb2FkIHdhcyBpbnRlcnJ1cHRlZCBtaWQtdHJhbnNmZXIgLSB0aGUKJiM0MzsgKiBob3N0IGRpZWQgYWZ0ZXIgTUNVYm9vdCBiZWdhbiBlcmFzaW5nIGZsYXNoLCB3aGV0aGVyIGl0IGFib3J0ZWQgbWlkIGVyYXNlIG9yCiYjNDM7ICogbWlkIGltYWdlLXdyaXRlLCBib3RoIGVuZCB1cCBpbiB0aGUgc2FtZSBwbGFjZTogdGhlIHBheWxvYWQgcmVjZWl2ZSBsb29wLgomIzQzOyAqIFRoZXJlIHRoZSBsb2FkZXIgcHVibGlzaGVzIFNUQVQ9MCwgd2FpdHMgZm9yIHRoZSBob3N0IHRvIHdyaXRlIGEgYnl0ZS1jb3VudAomIzQzOyAqIHRvIFNUQVQsIERNQXMgdGhhdCBtYW55IGJ5dGVzIGFuZCBzdWJ0cmFjdHMgdGhlIGNvdW50IGZyb20gYSByZW1haW5pbmctYnl0ZXMKJiM0MzsgKiBjb3VudGVyLCBsZWF2aW5nIHRoZSBsb29wIG9ubHkgd2hlbiB0aGUgY291bnRlciByZWFjaGVzIGV4YWN0bHkgemVyby4gVGhlCiYjNDM7ICogaW1hZ2Ugc2l6ZSBkaWVkIHdpdGggdGhlIGhvc3QsIHNvIHdlIGZlZWQgc2luZ2xlLWJ5dGUgY2h1bmtzIChzZWUKJiM0MzsgKiBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUykgdG8gd2FsayB0aGUgY291bnRlciB0byB6ZXJvIHdpdGhvdXQgdW5kZXJmbG93LgomIzQzOyAqIFRoZSBsb2FkZXIgdGhlbiB2ZXJpZmllcyB0aGUgKG5vdyBjb3JydXB0KSBpbWFnZSBhbmQgcmV0dXJucyB0byBSRUFEWSBieQomIzQzOyAqIGl0c2VsZiwgb3IgYm9vdHMgYSB2YWxpZCBpbWFnZSB0aGF0IGhhcHBlbmVkIHRvIHN1cnZpdmUgaW4gZmxhc2g7IGVpdGhlciB3YXkKJiM0MzsgKiB0aGUgY2FsbGVyJiMzOTtzIHJlcHJvYmUgY2xhc3NpZmllcyB0aGUgcmVzdWx0LiBFdmVyeSBieXRlIGNvc3RzIGFib3V0IGEgZG96ZW4KJiM0MzsgKiBNRElPIGZyYW1lcywgc28gYSBtdWx0aS1NaUIgb3V0c3RhbmRpbmcgY291bnQgdGFrZXMgdGVucyBvZiBtaW51dGVzLgomIzQzOyAqIFJldHVybnMgMCBvbmNlIHRoZSBsb2FkZXIgaGFzIGxlZnQgdGhlIHJlY2VpdmUgbG9vcCwgJmx0OzAgb24gZXJyb3IuIERvZXMgTk9UCiYjNDM7ICogcmVjb3ZlciBhIGNvdW50ZXIgYWxyZWFkeSB1bmRlcmZsb3dlZCBieSBhbiBlYXJsaWVyIG92ZXJzaXplZC1jaHVuayBhdHRlbXB0CiYjNDM7ICogLSB0aGF0IG5lZWRzIGEgcG93ZXIgY3ljbGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9yZXNjdWVfZHJhaW4oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2RldjsKJiM0MzsJLyogQm91bmQ6IHR3aWNlIHRoZSBsb2FkZXImIzM5O3MgMTYgTWlCIGltYWdlIGNhcCwgb25lIGJ5dGUgcGVyIGNodW5rLiAqLwomIzQzOwl1MzIgbWF4X2NodW5rcyA9IDJ1ICogKDE2dSAmbHQ7Jmx0OyAyMCkgLyBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUzsKJiM0MzsJdTMyIGNodW5rID0gMDsKJiM0MzsJaW50IHJldCwgc3RhdDsKJiM0MzsKJiM0MzsJd2hpbGUgKGNodW5rICZsdDsgbWF4X2NodW5rcykgewomIzQzOwkJLyogVGVhcmRvd24gY2FuIGludGVycnVwdCB0aGlzIGxvbmcgZHJhaW4uICovCiYjNDM7CQlpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsICZhbXA7cHJpdi0mZ3Q7ZmxhZ3MpKQomIzQzOwkJCXJldHVybiAtRUNBTkNFTEVEOwomIzQzOwomIzQzOwkJc3RhdCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX2RyYWluKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TKTsKJiM0MzsJCWlmIChzdGF0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gc3RhdDsKJiM0MzsJCWlmIChzdGF0ID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSkKJiM0MzsJCQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJCWlmIChzdGF0KSB7CiYjNDM7CQkJcmV0ID0gbXhsODYyeHhfcmVzY3VlX2RyYWluX2ZpbmlzaChwcml2LCBjaHVuayk7CiYjNDM7CQkJaWYgKHJldCAhPSAtRUFHQUlOKQomIzQzOwkJCQlyZXR1cm4gcmV0OwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyogRmVlZCBvbmUgemVybyBieXRlOyByZXNldCBjbGVhcmVkIHRoZSB3cml0ZSBsYXRjaC4gKi8KJiM0MzsJCXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLAomIzQzOwkJCQkJICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCAweDAwMDApOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCXJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwKJiM0MzsJCQkJCSAgIE1YTDg2MlhYX0RSQUlOX0NIVU5LX0JZVEVTKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQljaHVuayYjNDM7JiM0Mzs7CiYjNDM7CQlpZiAoIShjaHVuayAlIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFUykpCiYjNDM7CQkJZGV2X2luZm8oZGV2LCAmIzM0O2ZsYXNoOiBkcmFpbmVkICV1IEtpQiBzbyBmYXJcbiYjMzQ7LAomIzQzOwkJCQkgY2h1bmsgLyAxMDI0KTsKJiM0MzsJCWNvbmRfcmVzY2hlZCgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWRldl9lcnIoZGV2LAomIzQzOwkJJiMzNDtmbGFzaDogaW50ZXJydXB0ZWQgZG93bmxvYWQgZGlkIG5vdCBkcmFpbiBhZnRlciAldSBjaHVua3NcbiYjMzQ7LAomIzQzOwkJY2h1bmspOwomIzQzOwomIzQzOwlyZXR1cm4gLUVUSU1FRE9VVDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQmFja2dyb3VuZCBzZWxmLWhlYWw6IGRyYWluIGEgd2VkZ2VkIGRvd25sb2FkIG9mZiB0aGUgZGV2bGluayBmbGFzaCBwYXRoLCBzbwomIzQzOyAqIHRoZSBsb25nIHJlY292ZXJ5IG5ldmVyIGhvbGRzIHRoZSBkZXZsaW5rIGxvY2suIFNjaGVkdWxlZCBmcm9tIHByb2JlOwomIzQzOyAqIHJlcHJvYmVzIG9uIHN1Y2Nlc3Mgc28gdGhlIHByb2JlLXRpbWUgZGV0ZWN0aW9uIHJlLWNsYXNzaWZpZXMgdGhlIHN3aXRjaC4KJiM0MzsgKi8KJiM0Mzt2b2lkIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQomIzQzO3sKJiM0MzsJc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPQomIzQzOwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBteGw4NjJ4eF9wcml2LCByZXNjdWVfaGVhbF93b3JrKTsKJiM0MzsJc3RydWN0IGRldmljZSAqZGV2ID0gJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXY7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbihwcml2KTsKJiM0MzsJaWYgKHJldCA9PSAtRUNBTkNFTEVEKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQkvKiBOb3RoaW5nIHJldHJpZXMgdGhpcywgc28gc2F5IHNvOiByZXNjdWVfcmVhZHkgc3RheXMgY2xlYXIKJiM0MzsJCSAqIGFuZCBkZXZsaW5rIGRldiBmbGFzaCByZXBvcnRzIHdoeSBpdCByZWZ1c2VzLgomIzQzOwkJICovCiYjNDM7CQlkZXZfZXJyKGRldiwgJiMzNDtmbGFzaDogZG93bmxvYWQgcmVjb3ZlcnkgZmFpbGVkOiAlcGVcbiYjMzQ7LAomIzQzOwkJCUVSUl9QVFIocmV0KSk7CiYjNDM7CQlXUklURV9PTkNFKHByaXYtJmd0O3Jlc2N1ZV9mYWlsZWQsIHRydWUpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFRoZSBpbnRlcnJ1cHRlZCB0cmFuc2ZlciBpcyBmaW5hbGlzZWQ7IHJlcHJvYmUgc28gdGhlIHByb2JlLXRpbWUKJiM0MzsJICogZGV0ZWN0aW9uIGJyaW5ncyB0aGUgZHJpdmVyIHVwIC0tIGZsYXNoYWJsZSBpbiByZXNjdWUgbW9kZSBpZiB0aGUKJiM0MzsJICogbG9hZGVyIGlzIGF0IFJFQURZLCBvciBub3JtYWxseSBpZiBhIHZhbGlkIGltYWdlIGJvb3RlZC4gVGhlIGNvcmUKJiM0MzsJICogc2tpcHMgdGhlIHJlLXByb2JlIG9uIGl0cyBvd24gaWYgdGhlIGRldmljZSBpcyB1bmJvdW5kIGZpcnN0OyB0aGUKJiM0MzsJICogZmxhZyB0ZXN0IG9ubHkgYXZvaWRzIHNjaGVkdWxpbmcgb25lIGNlcnRhaW4gdG8gYmUgc2tpcHBlZC4gQQomIzQzOwkgKiBmYWlsZWQgaGFuZC1vZmYgbGVhdmVzIG5vdGhpbmcgdG8gcmVjbGFzc2lmeSB0aGUgc3dpdGNoLCBzbyBtYXJrCiYjNDM7CSAqIHJlY292ZXJ5IGZhaWxlZCByYXRoZXIgdGhhbiBwcm9taXNlIGEgcmV0cnkgdGhhdCBjYW5ub3Qgc3VjY2VlZC4KJiM0MzsJICovCiYjNDM7CWlmICh0ZXN0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgJmFtcDtwcml2LSZndDtmbGFncykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmIChkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZShkZXYsIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVMpKQomIzQzOwkJV1JJVEVfT05DRShwcml2LSZndDtyZXNjdWVfZmFpbGVkLCB0cnVlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRGV0ZWN0IE1DVWJvb3QgcmVzY3VlIG1vZGUgb3ZlciBjbGF1c2UtMjIgU01ESU8gYWxvbmUsIHNvIHRoZSBjYWxsZXIgY2FuIHJ1bGUKJiM0MzsgKiB0aGUgbG9hZGVyIG91dCBiZWZvcmUgYW55IEM0NSBBUEkgcmVxdWVzdCAod2hpY2ggc3Bld3MgQ1JDIGVycm9ycyB3aGVuIG5vIFdTUAomIzQzOyAqIGZpcm13YXJlIGFuc3dlcnMpLiBBIHNjcmF0Y2ggd3JpdGUgdG8gQUREUi9EQVRBIG11c3QgbGF0Y2ggb3IgdGhlIGNoaXAgaXMKJiM0MzsgKiBhYnNlbnQgKC1FTk9ERVYpOyB0aGUgbWFpbGJveCBpcyByZXNldCBmaXJzdCwgb3IgYSB0cmFuc2ZlciBpbnRlcnJ1cHRlZCB3aXRoCiYjNDM7ICogQ1RSTD1XUiB3b3VsZCB0YWtlIHRoYXQgd3JpdGUgYXMgYSBwYXlsb2FkIHdvcmQgaW5zdGVhZCBvZiBsYXRjaGluZyBpdC4gU1RBVAomIzQzOyAqIHRoZW4gY2xhc3NpZmllcyB0aGUgc3RhdGUsIHBva2VkIGRlc3RydWN0aXZlbHkgb25seSB3aGVuIDAsIHRoZSBvbmUgdmFsdWUgYQomIzQzOyAqIHJ1bm5pbmcgZmlybXdhcmUgbmV2ZXIgaG9sZHM6CiYjNDM7ICoKJiM0MzsgKiAgLSAweGMzM2M6IGZsYXNobGVzcyBsb29wOyByZWNvZ25pc2VkIGJ1dCBub3Qgc3VwcG9ydGVkIGhlcmUuCiYjNDM7ICogIC0gMHhjNTVjOiBjb25zb2xlIGxvb3AsIGlmIHRoZSByZWdpc3Rlci1yZWFkIGNoYWxsZW5nZSBpcyBzZXJ2aWNlZC4KJiM0MzsgKiAgLSBvdGhlciBub24temVybzogcnVubmluZyBmaXJtd2FyZSwgbGVmdCB1bnBva2VkLgomIzQzOyAqICAtIDA6IHdlZGdlZCByZWNlaXZlIGxvb3A7IHRoZSAxLWJ5dGUgc2xpY2UtYWR2YW5jZSB0aGVuIHNheXMgd2hldGhlciBpdAomIzQzOyAqICAgIHN0aWxsIG5lZWRzIGRyYWluaW5nIG9yIGhhcyBqdXN0IGZpbmlzaGVkLgomIzQzOyAqCiYjNDM7ICogVGhlIHNjcmF0Y2ggd3JpdGUgcmVhY2hlcyBhIHJ1bm5pbmcgZmlybXdhcmUgdG9vLCBidXQgbGFuZHMgaW4gbWFpbGJveAomIzQzOyAqIHJlZ2lzdGVycyBpdCBkb2VzIG5vdCByZWFkLCBzbyBpdCBpcyBpbmVydCB0aGVyZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogTVhMODYyWFhfSU5fUkVTQ1VFLCBNWEw4NjJYWF9OT1RfUkVTQ1VFLCAtRU5PREVWIHdoZW4gdGhlIHNjcmF0Y2gKJiM0MzsgKiB3cml0ZSBkb2VzIG5vdCBsYXRjaCwgd2hpY2ggaXMgYSBzd2l0Y2ggdGhhdCBkb2VzIG5vdCBhbnN3ZXIgYXQgYWxsIG9yIG9uZQomIzQzOyAqIHdob3NlIFNCIFBESSB3aW5kb3cgaXMgbm90IGF0IHRoZSBvZmZzZXRzIGFib3ZlLCAtRU9QTk9UU1VQUCBmb3IgdGhlCiYjNDM7ICogZmxhc2hsZXNzIGxvb3AsIC1FTlhJTyBmb3IgYSBSRUFEWSBsb2FkZXIgd2hvc2UgbWFpbGJveCBmYWlscyB0aGUgY2hhbGxlbmdlLAomIzQzOyAqIG9yIGFuIFNNRElPIGJ1cyBlcnJvci4KJiM0MzsgKi8KJiM0MztpbnQgbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KQomIzQzO3sKJiM0MzsJaW50IHN0YXQsIGRhdCwgcmV0LCByYiwgYSwgZDsKJiM0MzsKJiM0MzsJLyogcmVzY3VlX3JlYWR5IGdhdGVzIGZsYXNoaW5nOyBhIHdlZGdlZCBsb2FkZXIgbmVlZHMgdGhlIGRyYWluIGZpcnN0LiAqLwomIzQzOwlXUklURV9PTkNFKHByaXYtJmd0O3Jlc2N1ZV9yZWFkeSwgZmFsc2UpOwomIzQzOwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7CiYjNDM7CWlmIChyZXQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyogUHJlc2VuY2U6IGEgbGl2ZSBjaGlwIGxhdGNoZXMgdGhlIHNjcmF0Y2ggd3JpdGUsIGFuIGFic2VudCBvbmUgZmxvYXRzLiAqLwomIzQzOwlhID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsCiYjNDM7CQkJCSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSk7CiYjNDM7CWlmIChhICZsdDsgMCkKJiM0MzsJCXJldHVybiBhOwomIzQzOwlkID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsCiYjNDM7CQkJCSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfRCk7CiYjNDM7CWlmIChkICZsdDsgMCkKJiM0MzsJCXJldHVybiBkOwomIzQzOwlhID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUik7CiYjNDM7CWlmIChhICZsdDsgMCkKJiM0MzsJCXJldHVybiBhOwomIzQzOwlkID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSk7CiYjNDM7CWlmIChkICZsdDsgMCkKJiM0MzsJCXJldHVybiBkOwomIzQzOwlpZiAoKHUxNilhICE9IE1YTDg2MlhYX1NCX1BESV9QUk9CRV9BIHx8CiYjNDM7CSAgICAodTE2KWQgIT0gTVhMODYyWFhfU0JfUERJX1BST0JFX0QpCiYjNDM7CQlyZXR1cm4gLUVOT0RFVjsKJiM0MzsKJiM0MzsJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXN0YXQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFUKTsKJiM0MzsJaWYgKHN0YXQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHN0YXQ7CiYjNDM7CiYjNDM7CS8qIEZsYXNobGVzcy1kb3dubG9hZCBsb29wIChNeEw4NjI4MSB0aWVyKTogdW5zdXBwb3J0ZWQuICovCiYjNDM7CWlmICgodTE2KXN0YXQgPT0gTVhMODYyWFhfU0JfUERJX0RMX1JFQURZKQomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwomIzQzOwkvKiBDb25zb2xlIGxvb3AgYXQgUkVBRFk6IGNvbmZpcm0gdGhlIGxpdmUgbWFpbGJveCB3aXRoIHRoZSByZWdpc3Rlci1yZWFkCiYjNDM7CSAqIGNoYWxsZW5nZSAoY29uc3VtZXMgdGhlIG1hcmtlciBmcm9tIERBVEEgYW5kIHJlLWFybXMgUkVBRFkpLgomIzQzOwkgKi8KJiM0MzsJaWYgKCh1MTYpc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfUkVBRFkpIHsKJiM0MzsJCXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLAomIzQzOwkJCQkJICAgTVhMODYyWFhfU0JfUERJX1JEUkVHX01BUkspOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULAomIzQzOwkJCQkJICAgTVhMODYyWFhfU0JfUERJX1JEUkVHKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQlyYiA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfU0JfUERJX1JFQURZLAomIzQzOwkJCQkJICAgICAgIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TKTsKJiM0MzsJCWRhdCA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEpOwomIzQzOwkJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpOwomIzQzOwkJLyogTmV2ZXIgcmUtYXJtaW5nIFJFQURZIGZhaWxzIHRoZSBjaGFsbGVuZ2UgbGlrZSBhbnkgb3RoZXIKJiM0MzsJCSAqIHVuc2VydmljZWQgY29tbWFuZDsgcmVwb3J0IGl0IGFzIHN1Y2ggcmF0aGVyIHRoYW4gYXMgYSBidXMKJiM0MzsJCSAqIHRpbWVvdXQgdGhlIGJ1cyBuZXZlciBzYXcuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChyYiA9PSAtRVRJTUVET1VUKQomIzQzOwkJCXJiID0gLUVOWElPOwomIzQzOwkJaWYgKHJiICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gcmI7CiYjNDM7CQlpZiAoZGF0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gZGF0OwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCWlmICgodTE2KWRhdCAhPSBNWEw4NjJYWF9TQl9QRElfUkRSRUdfTUFSSykgewomIzQzOwkJCVdSSVRFX09OQ0UocHJpdi0mZ3Q7cmVzY3VlX3JlYWR5LCB0cnVlKTsKJiM0MzsJCQlyZXR1cm4gTVhMODYyWFhfSU5fUkVTQ1VFOwomIzQzOwkJfQomIzQzOwkJLyogUkVBRFkgYnV0IHRoZSBtYXJrZXIgaXMgdW50b3VjaGVkLCBzbyBub3RoaW5nIGlzIHNlcnZpY2luZyB0aGUKJiM0MzsJCSAqIG1haWxib3guIEEgZmlybXdhcmUgcHVibGlzaGluZyAweGM1NWMgYXMgaXRzIHN0YXR1cyB3b3JkIGxvb2tzCiYjNDM7CQkgKiBleGFjdGx5IGxpa2UgdGhpcywgYW5kIGZsYXNoaW5nIG9uZSB3b3VsZCBiZSBmYXIgd29yc2UgdGhhbgomIzQzOwkJICogcmVmdXNpbmcgdG8gYmluZCwgc28gdHJlYXQgaXQgYXMgdW51c2FibGUuCiYjNDM7CQkgKi8KJiM0MzsJCXJldHVybiAtRU5YSU87CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogQW55IG90aGVyIG5vbi16ZXJvIHZhbHVlIGlzIGEgcnVubmluZyBmaXJtd2FyZSwgbm90IGEgbG9hZGVyLiAqLwomIzQzOwlpZiAoc3RhdCkKJiM0MzsJCXJldHVybiBNWEw4NjJYWF9OT1RfUkVTQ1VFOwomIzQzOwomIzQzOwkvKiBTVEFUID09IDA6IGEgd2VkZ2VkIHJlY2VpdmUgbG9vcCB0YWtlcyBhIDEtYnl0ZSBzbGljZS1hZHZhbmNlIChmZWVkCiYjNDM7CSAqIG9uZSBEQVRBIHdvcmQgZmlyc3QsIGxpa2UgYSBkcmFpbiBjaHVuaykgYW5kIGFza3MgZm9yIHRoZSBuZXh0IGNodW5rCiYjNDM7CSAqIGJ5IHB1Ymxpc2hpbmcgMCBhZ2Fpbi4gSGFkIHRoYXQgYnl0ZSBiZWVuIHRoZSBsYXN0IG9uZSBvdXRzdGFuZGluZywKJiM0MzsJICogdGhlIGxvYWRlciBsZWF2ZXMgdGhlIGxvb3AgaW5zdGVhZCBhbmQgcmV0dXJucyB0byBSRUFEWSwgaGF2aW5nCiYjNDM7CSAqIGNvbnN1bWVkIHRoZSBhZHZhbmNlIC0tIHByb29mIGVub3VnaCBvZiBhIGxpdmUgbWFpbGJveCB0byBza2lwIHRoZQomIzQzOwkgKiBjaGFsbGVuZ2UuIEFueXRoaW5nIGVsc2UgbWVhbnMgaXQgaXMgc3RpbGwgd29ya2luZyBvbiBpdC4gQWxsIHRocmVlCiYjNDM7CSAqIGFyZSByZXNjdWUsIHNvIHRoaXMgbmV2ZXIgZmFpbHMgcHJvYmU7IG9ubHkgdGhlIGRyYWluIGRvZXMuCiYjNDM7CSAqLwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCwKJiM0MzsJCQkJICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCAweDAwMDApOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwKJiM0MzsJCQkJICAgTVhMODYyWFhfRFJBSU5fQ0hVTktfQllURVMpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJiID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfZHJhaW4ocHJpdiwgTVhMODYyWFhfU0JfUERJX1NURVBfTVMpOwomIzQzOwlpZiAocmIgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHJiOwomIzQzOwlpZiAocmIgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKQomIzQzOwkJV1JJVEVfT05DRShwcml2LSZndDtyZXNjdWVfcmVhZHksIHRydWUpOwomIzQzOwomIzQzOwlyZXR1cm4gTVhMODYyWFhfSU5fUkVTQ1VFOwomIzQzO30KJiM0MzsKJiM0MzsvKiBNQ1Vib290IGZpcm13YXJlIGltYWdlIGhlYWRlciAqLwomIzQzO3N0cnVjdCBteGw4NjJ4eF9md19oZHIgewomIzQzOwlfX2xlMzIgaW1hZ2VfdHlwZTsKJiM0MzsJX19sZTMyIGltYWdlX3NpemVfMTsKJiM0MzsJX19sZTMyIGltYWdlX2NoZWNrc3VtXzE7CiYjNDM7CV9fbGUzMiBpbWFnZV9zaXplXzI7CiYjNDM7CV9fbGUzMiBpbWFnZV9jaGVja3N1bV8yOwomIzQzO30gX19wYWNrZWQ7CiYjNDM7CiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9mbGFzaF92YWxpZGF0ZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwKJiM0MzsJCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKJiM0MzsJCQkJICAgdTMyICpwYXlsb2FkX3NpemUpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICpoZHI7CiYjNDM7CXUzMiBzaXplMSwgc2l6ZTIsIHRvdGFsOwomIzQzOwljb25zdCB1OCAqcGF5bG9hZDsKJiM0MzsJdTMyIGNyYzsKJiM0MzsKJiM0MzsJaWYgKGZ3LSZndDtzaXplICZsdDsgTVhMODYyWFhfRldfSERSX1NJWkUpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJaGRyID0gKGNvbnN0IHN0cnVjdCBteGw4NjJ4eF9md19oZHIgKilmdy0mZ3Q7ZGF0YTsKJiM0MzsJcGF5bG9hZCA9IGZ3LSZndDtkYXRhICYjNDM7IE1YTDg2MlhYX0ZXX0hEUl9TSVpFOwomIzQzOwlzaXplMSA9IGxlMzJfdG9fY3B1KGhkci0mZ3Q7aW1hZ2Vfc2l6ZV8xKTsKJiM0MzsJc2l6ZTIgPSBsZTMyX3RvX2NwdShoZHItJmd0O2ltYWdlX3NpemVfMik7CiYjNDM7CiYjNDM7CWlmIChjaGVja19hZGRfb3ZlcmZsb3coc2l6ZTEsIHNpemUyLCAmYW1wO3RvdGFsKSB8fAomIzQzOwkgICAgdG90YWwgJmd0OyBmdy0mZ3Q7c2l6ZSAtIE1YTDg2MlhYX0ZXX0hEUl9TSVpFKSB7CiYjNDM7CQlkZXZfZXJyKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7ZGV2LAomIzQzOwkJCSYjMzQ7Zmxhc2g6IGZpcm13YXJlIGZpbGUgdG9vIHNtYWxsIGZvciBkZWNsYXJlZCBzaXplXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXRvdGFsKSB7CiYjNDM7CQlkZXZfZXJyKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7ZGV2LAomIzQzOwkJCSYjMzQ7Zmxhc2g6IGZpcm13YXJlIGZpbGUgd2l0aCBlbXB0eSBwYXlsb2FkXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2l6ZTEpIHsKJiM0MzsJCWNyYyA9IH5jcmMzMl9sZSh+MFUsIHBheWxvYWQsIHNpemUxKTsKJiM0MzsJCWlmIChjcmMgIT0gbGUzMl90b19jcHUoaGRyLSZndDtpbWFnZV9jaGVja3N1bV8xKSkgewomIzQzOwkJCWRldl9lcnIoJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXYsCiYjNDM7CQkJCSYjMzQ7Zmxhc2g6IGltYWdlIDEgQ1JDIG1pc21hdGNoIChnb3QgJTA4eCwgZXhwZWN0ZWQgJTA4eClcbiYjMzQ7LAomIzQzOwkJCQljcmMsIGxlMzJfdG9fY3B1KGhkci0mZ3Q7aW1hZ2VfY2hlY2tzdW1fMSkpOwomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChzaXplMikgewomIzQzOwkJY3JjID0gfmNyYzMyX2xlKH4wVSwgcGF5bG9hZCAmIzQzOyBzaXplMSwgc2l6ZTIpOwomIzQzOwkJaWYgKGNyYyAhPSBsZTMyX3RvX2NwdShoZHItJmd0O2ltYWdlX2NoZWNrc3VtXzIpKSB7CiYjNDM7CQkJZGV2X2VycigmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2RldiwKJiM0MzsJCQkJJiMzNDtmbGFzaDogaW1hZ2UgMiBDUkMgbWlzbWF0Y2ggKGdvdCAlMDh4LCBleHBlY3RlZCAlMDh4KVxuJiMzNDssCiYjNDM7CQkJCWNyYywgbGUzMl90b19jcHUoaGRyLSZndDtpbWFnZV9jaGVja3N1bV8yKSk7CiYjNDM7CQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJKnBheWxvYWRfc2l6ZSA9IHRvdGFsOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9mbGFzaF9maXJtd2FyZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwKJiM0MzsJCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKJiM0MzsJCQkJICAgdTMyIHBheWxvYWRfc2l6ZSwgc3RydWN0IGRldmxpbmsgKmRsKQomIzQzO3sKJiM0MzsJY29uc3QgdTggKnBheWxvYWQgPSBmdy0mZ3Q7ZGF0YSAmIzQzOyBNWEw4NjJYWF9GV19IRFJfU0laRTsKJiM0MzsJdTMyIHdvcmRfaWR4ID0gMCwgZGF0YV93cml0dGVuID0gMCwgaWR4ID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyBuZXh0X25vdGlmeSA9IGppZmZpZXMgLSAxOwomIzQzOwl1MTYgd29yZCwgZmRhdGE7CiYjNDM7CWludCByZXQsIGk7CiYjNDM7CiYjNDM7CS8qIFN0ZXAgMTogcmVib290IHRoZSBmaXJtd2FyZSBpbnRvIE1DVWJvb3QgcmVzY3VlIG1vZGUgKi8KJiM0MzsJaWYgKCFwcml2LSZndDtyZXNjdWVfbW9kZSkgewomIzQzOwkJcmV0ID0gbXhsODYyeHhfYXBpX3dyYXAocHJpdiwgU1lTX01JU0NfRldfVVBEQVRFLCBOVUxMLCAwLAomIzQzOwkJCQkJZmFsc2UsIGZhbHNlKTsKJiM0MzsJCWlmIChyZXQpIHsKJiM0MzsJCQlkZXZfZXJyKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7ZGV2LAomIzQzOwkJCQkmIzM0O2ZsYXNoOiBGV19VUERBVEUgY29tbWFuZCBmYWlsZWQ6ICVwZVxuJiMzNDssCiYjNDM7CQkJCUVSUl9QVFIocmV0KSk7CiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwkvKiBTdGVwIDI6IHdhaXQgZm9yIGJvb3Rsb2FkZXIgcmVhZHkgKi8KJiM0MzsJbXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCAmIzM0O1dhaXRpbmcgZm9yIGJvb3Rsb2FkZXImIzM0OywgMCwgMCk7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQlnb3RvIHdyaXRlX2VycjsKJiM0MzsKJiM0MzsJLyogRmFpbHVyZXMgZnJvbSBoZXJlIG9uIGVuZCB1cCBhdCBub19lbmQsIHdoaWNoIHJldHVybnMgdGhlIGVycm9yCiYjNDM7CSAqIHdpdGhvdXQgc2lnbmFsbGluZyBFTkQgLS0gc2VlIHRoZXJlLgomIzQzOwkgKi8KJiM0MzsJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCBNWEw4NjJYWF9TQl9QRElfUkVBRFksCiYjNDM7CQkJCQlNWEw4NjJYWF9GV19SRUFEWV9USU1FT1VUX01TKTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJZGV2X2VycigmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2RldiwKJiM0MzsJCQkmIzM0O2ZsYXNoOiBib290bG9hZGVyIG5vdCByZWFkeTogJXBlXG4mIzM0OywgRVJSX1BUUihyZXQpKTsKJiM0MzsJCWdvdG8gbm9fZW5kOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFN0ZXAgMzogc3RhcnQgaGFuZHNoYWtlICovCiYjNDM7CXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULAomIzQzOwkJCQkgICBNWEw4NjJYWF9TQl9QRElfU1RBUlQpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFSVCAmIzQzOyAxLAomIzQzOwkJCQkJTVhMODYyWFhfRldfQUNLX1RJTUVPVVRfTVMpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlkZXZfZXJyKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7ZGV2LAomIzQzOwkJCSYjMzQ7Zmxhc2g6IHN0YXJ0IGhhbmRzaGFrZSBmYWlsZWQ6ICVwZVxuJiMzNDssIEVSUl9QVFIocmV0KSk7CiYjNDM7CQlnb3RvIG5vX2VuZDsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBTdGVwIDQ6IHRyYW5zZmVyIGltYWdlIGhlYWRlciAqLwomIzQzOwlteGw4NjJ4eF9mbGFzaF9ub3RpZnkoZGwsICYjMzQ7RXJhc2luZyBmbGFzaCYjMzQ7LCAwLCAwKTsKJiM0MzsJcmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsCiYjNDM7CQkJCSAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQlnb3RvIHdyaXRlX2VycjsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE1YTDg2MlhYX0ZXX0hEUl9TSVpFIC8gMjsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXdvcmQgPSBmdy0mZ3Q7ZGF0YVtpICogMl0gfAomIzQzOwkJICAgICAgICgodTE2KWZ3LSZndDtkYXRhW2kgKiAyICYjNDM7IDFdICZsdDsmbHQ7IDgpOwomIzQzOwkJcmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsIHdvcmQpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJZ290byB3cml0ZV9lcnI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwkvKiB0aGUgYnl0ZSBjb3VudCBpbiBTVEFUIHRyaWdnZXJzIHRoZSBlcmFzZSAqLwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwKJiM0MzsJCQkJICAgTVhMODYyWFhfRldfSERSX1NJWkUpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwkvKiBBQ0sgaXMgYnl0ZSBjb3VudCAmIzQzOyAxICovCiYjNDM7CXJldCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfRldfSERSX1NJWkUgJiM0MzsgMSwKJiM0MzsJCQkJCU1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TKTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJZGV2X2VycigmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2RldiwKJiM0MzsJCQkmIzM0O2ZsYXNoOiBoZWFkZXIgQUNLIGZhaWxlZDogJXBlXG4mIzM0OywgRVJSX1BUUihyZXQpKTsKJiM0MzsJCWdvdG8gbm9fZW5kOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFN0ZXAgNTogd2FpdCBmb3IgZXJhc2UgdG8gY29tcGxldGUgKi8KJiM0MzsJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCAwLAomIzQzOwkJCQkJTVhMODYyWFhfRldfRVJBU0VfVElNRU9VVF9NUyk7CiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWRldl9lcnIoJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXYsCiYjNDM7CQkJJiMzNDtmbGFzaDogZXJhc2UgdGltZW91dDogJXBlXG4mIzM0OywgRVJSX1BUUihyZXQpKTsKJiM0MzsJCWdvdG8gbm9fZW5kOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFN0ZXAgNjogdHJhbnNmZXIgcGF5bG9hZCAqLwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCwKJiM0MzsJCQkJICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwl3aGlsZSAoaWR4ICZsdDsgcGF5bG9hZF9zaXplKSB7CiYjNDM7CQljb25kX3Jlc2NoZWQoKTsKJiM0MzsJCWlmIChpZHggJiM0MzsgMSAmbHQ7IHBheWxvYWRfc2l6ZSkgewomIzQzOwkJCWZkYXRhID0gcGF5bG9hZFtpZHhdIHwKJiM0MzsJCQkJKCh1MTYpcGF5bG9hZFtpZHggJiM0MzsgMV0gJmx0OyZsdDsgOCk7CiYjNDM7CQkJaWR4ICYjNDM7PSAyOwomIzQzOwkJCWRhdGFfd3JpdHRlbiAmIzQzOz0gMjsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJZmRhdGEgPSBwYXlsb2FkW2lkeF07CiYjNDM7CQkJaWR4JiM0MzsmIzQzOzsKJiM0MzsJCQlkYXRhX3dyaXR0ZW4mIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwomIzQzOwkJcmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsIGZkYXRhKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwkJd29yZF9pZHgmIzQzOyYjNDM7OwomIzQzOwomIzQzOwkJaWYgKGlkeCAmZ3Q7PSBwYXlsb2FkX3NpemUpIHsKJiM0MzsJCQlyZXQgPSBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfbGFzdChwcml2LCBkYXRhX3dyaXR0ZW4pOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyogSGFsZi1iYW5rIGJvdW5kYXJ5OiBzd2l0Y2ggdG8gU0IxIGFkZHJlc3MgKi8KJiM0MzsJCWlmICh3b3JkX2lkeCA9PSBNWEw4NjJYWF9GV19CQU5LX0hBTEYpIHsKJiM0MzsJCQlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCwKJiM0MzsJCQkJCQkgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpOwomIzQzOwkJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCQlnb3RvIHdyaXRlX2VycjsKJiM0MzsKJiM0MzsJCQlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUiwKJiM0MzsJCQkJCQkgICBNWEw4NjJYWF9GV19TQjFfQUREUik7CiYjNDM7CQkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwkJCXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLAomIzQzOwkJCQkJCSAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTsKJiM0MzsJCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQkJZ290byB3cml0ZV9lcnI7CiYjNDM7CQl9IGVsc2UgaWYgKHdvcmRfaWR4ICZndDs9IE1YTDg2MlhYX0ZXX0JBTktfU0xJQ0UpIHsKJiM0MzsJCQlyZXQgPSBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2UocHJpdiwgZGF0YV93cml0dGVuKTsKJiM0MzsJCQlpZiAocmV0KSB7CiYjNDM7CQkJCWRldl9lcnIoJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXYsCiYjNDM7CQkJCQkmIzM0O2ZsYXNoOiB3cml0ZSB0aW1lb3V0IGF0ICV1LyV1OiAlcGVcbiYjMzQ7LAomIzQzOwkJCQkJaWR4LCBwYXlsb2FkX3NpemUsIEVSUl9QVFIocmV0KSk7CiYjNDM7CQkJCWdvdG8gbm9fZW5kOwomIzQzOwkJCX0KJiM0MzsJCQl3b3JkX2lkeCA9IDA7CiYjNDM7CQkJZGF0YV93cml0dGVuID0gMDsKJiM0MzsJCQlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCwKJiM0MzsJCQkJCQkgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7CiYjNDM7CQkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG5leHRfbm90aWZ5KSkgewomIzQzOwkJCQlteGw4NjJ4eF9mbGFzaF9ub3RpZnkoZGwsICYjMzQ7Rmxhc2hpbmcmIzM0OywgaWR4LAomIzQzOwkJCQkJCSAgICAgIHBheWxvYWRfc2l6ZSk7CiYjNDM7CQkJCW5leHRfbm90aWZ5ID0gamlmZmllcyAmIzQzOyBtc2Vjc190b19qaWZmaWVzKDUwMCk7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWRldl9lcnIoJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXYsCiYjNDM7CQkJJiMzNDtmbGFzaDogZmluYWwgc2xpY2UgZmFpbGVkOiAlcGVcbiYjMzQ7LCBFUlJfUFRSKHJldCkpOwomIzQzOwkJZ290byBub19lbmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCAmIzM0O0ZsYXNoaW5nJiMzNDssIHBheWxvYWRfc2l6ZSwgcGF5bG9hZF9zaXplKTsKJiM0MzsKJiM0MzsJLyogU3VjY2VzczogdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgcmVjZWl2ZSBsb29wIGF0IHJfcmVtYWluID09IDAgYW5kCiYjNDM7CSAqIHZlcmlmaWVkIHRoZSBpbWFnZSwgc28gRU5EKDB4M2NjMykgaXMgYSBmaW5hbGlzZS9ib290IHJlcXVlc3QgcmF0aGVyCiYjNDM7CSAqIHRoYW4gYSBieXRlIGNvdW50LiBTaWduYWwgaXQgaGVyZSAtLSBhbmQgb25seSBoZXJlIC0tIHRvIGJvb3QgdGhlIG5ldwomIzQzOwkgKiBpbWFnZSB3aXRob3V0IHdhaXRpbmcgb3V0IHRoZSBsb2FkZXImIzM5O3MgMiBzIEVORCB0aW1lb3V0LgomIzQzOwkgKi8KJiM0MzsJcmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsCiYjNDM7CQkJCSAgIE1YTDg2MlhYX1NCX1BESV9FTkQpOwomIzQzOwltc2xlZXAoTVhMODYyWFhfRldfUkVCT09UX0RFTEFZX01TKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0MzsKJiM0Mzt3cml0ZV9lcnI6CiYjNDM7CWRldl9lcnIoJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXYsICYjMzQ7Zmxhc2g6IFNNRElPIHdyaXRlIGZhaWxlZDogJXBlXG4mIzM0OywKJiM0MzsJCUVSUl9QVFIocmV0KSk7CiYjNDM7bm9fZW5kOgomIzQzOwkvKiBBIGZhaWx1cmUgbGVhdmVzIHRoZSBsb2FkZXIgbWlkIHRyYW5zZmVyOyBkbyBub3Qgc2lnbmFsIEVORCAoYSBTVEFUCiYjNDM7CSAqIHdyaXRlIGlzIGEgYnl0ZSBjb3VudCB0aGVuLCBhbmQgRU5EIHdvdWxkIGJlIG1pc3JlYWQgYXMgb25lLCByaXNraW5nCiYjNDM7CSAqIGEgcmVjZWl2ZS1jb3VudGVyIHVuZGVyZmxvdykuIFJldHVybiB0aGUgZXJyb3I7IHRoZSBjYWxsZXIgcmVwcm9iZXMuCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztpbnQgbXhsODYyeHhfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiYjNDM7CQkJICAgICAgc3RydWN0IGRldmxpbmtfaW5mb19yZXEgKnJlcSwKJiM0MzsJCQkgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLSZndDtwcml2OwomIzQzOwljaGFyIGJ1ZlsxNl07CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CS8qIE5vIGNoaXAtaWQvcmV2aXNpb24gaW4gTUNVYm9vdCAobmVlZHMgdGhlIGZpcm13YXJlIE1NRCBtYWlsYm94KS4gVGhlCiYjNDM7CSAqIGZ3IHZlcnNpb24gZG91YmxlcyBhcyB0aGUgJiMzNDtyZWFkeSB0byBmbGFzaCYjMzQ7IHNpZ25hbDogcmVwb3J0IGl0IG9ubHkKJiM0MzsJICogb25jZSB0aGUgbG9hZGVyIGlzIGF0IGEgY2xlYW4gUkVBRFksIG5vdGhpbmcgd2hpbGUgc3RpbGwgZHJhaW5pbmcuCiYjNDM7CSAqLwomIzQzOwlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpIHsKJiM0MzsJCWlmICghUkVBRF9PTkNFKHByaXYtJmd0O3Jlc2N1ZV9yZWFkeSkpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAmIzM0OyV1LiV1LiV1JiMzNDssCiYjNDM7CQkJIHByaXYtJmd0O2Z3X3ZlcnNpb24ubWFqb3IsIHByaXYtJmd0O2Z3X3ZlcnNpb24ubWlub3IsCiYjNDM7CQkJIHByaXYtJmd0O2Z3X3ZlcnNpb24ucmV2aXNpb24pOwomIzQzOwkJcmV0ID0gZGV2bGlua19pbmZvX3ZlcnNpb25fcnVubmluZ19wdXQocmVxLAomIzQzOwkJCQlERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJcmV0dXJuIGRldmxpbmtfaW5mb192ZXJzaW9uX3N0b3JlZF9wdXQocmVxLAomIzQzOwkJCQlERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEEgMCBwYXJ0IG51bWJlciBtZWFucyB0aGUgQ0hJUCBJRCByZWFkIGZhaWxlZCBvciB0aGUgcGFydCBpcwomIzQzOwkgKiB1bmZ1c2VkOyBvbWl0IGl0IHJhdGhlciB0aGFuIHB1Ymxpc2ggYSBib2d1cyAmIzM0OzAwMDAmIzM0OyB0aGF0IGZ3dXBkCiYjNDM7CSAqIHdvdWxkIG1hdGNoIGZpcm13YXJlIGFnYWluc3QgLS0gaXQgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBkcml2ZXIKJiM0MzsJICogbmFtZS4KJiM0MzsJICovCiYjNDM7CWlmIChwcml2LSZndDthc2ljX2lkKSB7CiYjNDM7CQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAmIzM0OyUwNFgmIzM0OywgcHJpdi0mZ3Q7YXNpY19pZCk7CiYjNDM7CQlyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9maXhlZF9wdXQocmVxLAomIzQzOwkJCQkJCSAgICAgREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19BU0lDX0lELAomIzQzOwkJCQkJCSAgICAgYnVmKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXUmIzM0OywgcHJpdi0mZ3Q7YXNpY19yZXYpOwomIzQzOwkJcmV0ID0gZGV2bGlua19pbmZvX3ZlcnNpb25fZml4ZWRfcHV0KHJlcSwKJiM0MzsJCQkJCQkgICAgIERFVkxJTktfSU5GT19WRVJTSU9OX0dFTkVSSUNfQVNJQ19SRVYsCiYjNDM7CQkJCQkJICAgICBidWYpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEFuIGFsbC16ZXJvIHZlcnNpb24gaXMgdGhlIGNhY2hlIGEgZmFpbGVkIGZsYXNoIGxlZnQgYmVoaW5kLCBub3QgYQomIzQzOwkgKiByZWxlYXNlZCBmaXJtd2FyZTsgb21pdCBpdCBsaWtlIHRoZSBwYXJ0IG51bWJlciBhYm92ZS4KJiM0MzsJICovCiYjNDM7CWlmICghcHJpdi0mZ3Q7ZndfdmVyc2lvbi5tYWpvciAmYW1wOyZhbXA7ICFwcml2LSZndDtmd192ZXJzaW9uLm1pbm9yICZhbXA7JmFtcDsKJiM0MzsJICAgICFwcml2LSZndDtmd192ZXJzaW9uLnJldmlzaW9uKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXUuJXUuJXUmIzM0OywKJiM0MzsJCSBwcml2LSZndDtmd192ZXJzaW9uLm1ham9yLCBwcml2LSZndDtmd192ZXJzaW9uLm1pbm9yLAomIzQzOwkJIHByaXYtJmd0O2Z3X3ZlcnNpb24ucmV2aXNpb24pOwomIzQzOwomIzQzOwlyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9ydW5uaW5nX3B1dChyZXEsCiYjNDM7CQkJREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19GVywgYnVmKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CS8qIGJvb3RzIHRoaXMgaW1hZ2UgZnJvbSBpdHMgb3duIGZsYXNoOiBzdG9yZWQgPT0gcnVubmluZyAqLwomIzQzOwlyZXR1cm4gZGV2bGlua19pbmZvX3ZlcnNpb25fc3RvcmVkX3B1dChyZXEsCiYjNDM7CQkJREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19GVywgYnVmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG14bDg2Mnh4X2RldmxpbmtfZmxhc2hfdXBkYXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKJiM0MzsJCQkJICBzdHJ1Y3QgZGV2bGlua19mbGFzaF91cGRhdGVfcGFyYW1zICpwYXJhbXMsCiYjNDM7CQkJCSAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQomIzQzO3sKJiM0MzsJc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy0mZ3Q7cHJpdjsKJiM0MzsJc3RydWN0IGRzYV9wb3J0ICpkcDsKJiM0MzsJdTMyIHBheWxvYWRfc2l6ZTsKJiM0MzsJaW50IHJldCwgZXJyLCBpOwomIzQzOwomIzQzOwlpZiAocGFyYW1zLSZndDtjb21wb25lbnQpIHsKJiM0MzsJCU5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssICYjMzQ7Y29tcG9uZW50IGlzIG5vdCBzdXBwb3J0ZWQmIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogQSBwcmV2aW91cyBmbGFzaCBpcyBzdGlsbCB3YWl0aW5nIGZvciBpdHMgcmVwcm9iZTogdGhlIGZpcm13YXJlIEFQSQomIzQzOwkgKiBpcyBzaG9ydC1jaXJjdWl0ZWQsIHNvIHRoZSByYXcgU0IgUERJIHdyaXRlcyBiZWxvdyB3b3VsZCBydW4gYWdhaW5zdAomIzQzOwkgKiBhIHN3aXRjaCB0aGlzIGRyaXZlciBubyBsb25nZXIgdHJhY2tzLgomIzQzOwkgKi8KJiM0MzsJaWYgKHByaXYtJmd0O3NraXBfdGVhcmRvd24pIHsKJiM0MzsJCU5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssCiYjNDM7CQkJCSAgICYjMzQ7ZGV2aWNlIGlzIHJlaW5pdGlhbGl6aW5nLCByZXRyeSBsYXRlciYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gbXhsODYyeHhfZmxhc2hfdmFsaWRhdGUocHJpdiwgcGFyYW1zLSZndDtmdywgJmFtcDtwYXlsb2FkX3NpemUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlOTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCAmIzM0O2Zpcm13YXJlIGltYWdlIHZhbGlkYXRpb24gZmFpbGVkJiMzNDspOwomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBSZWZ1c2UgdG8gZmxhc2ggd2hpbGUgdGhlIGJhY2tncm91bmQgc2VsZi1oZWFsIGlzIHN0aWxsIGRyYWluaW5nLCBhbmQKJiM0MzsJICogZm9yIGdvb2Qgb25jZSBpdCBoYXMgZ2l2ZW4gdXAgb24gdGhlIGxvYWRlci4KJiM0MzsJICovCiYjNDM7CWlmIChSRUFEX09OQ0UocHJpdi0mZ3Q7cmVzY3VlX2ZhaWxlZCkpIHsKJiM0MzsJCU5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssCiYjNDM7CQkJCSAgICYjMzQ7ZG93bmxvYWQgcmVjb3ZlcnkgZmFpbGVkLCBwb3dlciBjeWNsZSB0aGUgc3dpdGNoJiMzNDspOwomIzQzOwkJcmV0dXJuIC1FSU87CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKHByaXYtJmd0O3Jlc2N1ZV9tb2RlICZhbXA7JmFtcDsgIVJFQURfT05DRShwcml2LSZndDtyZXNjdWVfcmVhZHkpKSB7CiYjNDM7CQlOTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLAomIzQzOwkJCQkgICAmIzM0O3N3aXRjaCBpcyByZWNvdmVyaW5nIGFuIGludGVycnVwdGVkIGRvd25sb2FkLCByZXRyeSBzaG9ydGx5JiMzNDspOwomIzQzOwkJcmV0dXJuIC1FQlVTWTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpCiYjNDM7CQlkZXZfaW5mbyhkcy0mZ3Q7ZGV2LAomIzQzOwkJCSAmIzM0O2ZsYXNoOiBmbGFzaGluZyBzd2l0Y2ggdmlhIE1DVWJvb3QgcmVzY3VlIG1vZGVcbiYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZGV2X2luZm8oZHMtJmd0O2RldiwgJiMzNDtmbGFzaDogcnVubmluZyBmaXJtd2FyZSAldS4ldS4ldVxuJiMzNDssCiYjNDM7CQkJIHByaXYtJmd0O2Z3X3ZlcnNpb24ubWFqb3IsIHByaXYtJmd0O2Z3X3ZlcnNpb24ubWlub3IsCiYjNDM7CQkJIHByaXYtJmd0O2Z3X3ZlcnNpb24ucmV2aXNpb24pOwomIzQzOwomIzQzOwkvKiBDbG9zZSBwb3J0cyB3aGlsZSB0aGUgZmlybXdhcmUgaXMgc3RpbGwgYWxpdmUgc28gdGhlIERTQSBjb3JlJiMzOTtzCiYjNDM7CSAqIE1EQi9GREIgdHJhY2tpbmcgaXMgZHJhaW5lZCwgYW5kIGRldGFjaCB1c2VyIHBvcnRzIHNvIHVzZXJzcGFjZQomIzQzOwkgKiBjYW5ub3QgcmVvcGVuIHRoZW0gZHVyaW5nIHRoZSBmbGFzaC4gVGhlIGNvbmR1aXQgaXMgb25seSBjbG9zZWQsCiYjNDM7CSAqIG5vdCBkZXRhY2hlZDogaXQgYmVsb25ncyB0byB0aGUgTUFDIGRyaXZlci4gVGhpcyBkcml2ZXIgYmluZHMgYQomIzQzOwkgKiBzaW5nbGUgc3dpdGNoIHdpdGggYSBkaXJlY3QgaG9zdCBsaW5rIGFuZCBubyBjYXNjYWRlIHBvcnRzLCBzbyB0aGUKJiM0MzsJICogY29uZHVpdCBzZXJ2ZXMgb25seSB0aGlzIHN3aXRjaCwgYW5kIGZsYXNoaW5nIGl0IHJlYm9vdHMgdGhlIHN3aXRjaCwKJiM0MzsJICogd2hpY2ggdGFrZXMgdGhlIHRyZWUgZG93biByZWdhcmRsZXNzLgomIzQzOwkgKi8KJiM0MzsJcnRubF9sb2NrKCk7CiYjNDM7CWRzYV9zd2l0Y2hfZm9yX2VhY2hfdXNlcl9wb3J0KGRwLCBkcykgewomIzQzOwkJaWYgKGRwLSZndDt1c2VyKSB7CiYjNDM7CQkJZGV2X2Nsb3NlKGRwLSZndDt1c2VyKTsKJiM0MzsJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRwLSZndDt1c2VyKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlkc2Ffc3dpdGNoX2Zvcl9lYWNoX2NwdV9wb3J0KGRwLCBkcykKJiM0MzsJCWRldl9jbG9zZShkcC0mZ3Q7Y29uZHVpdCk7CiYjNDM7CS8qIFRoZSBicmlkZ2UgZGVmZXJzIHRoZSBTVFAgc3RhdGUgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgY2xvc2luZwomIzQzOwkgKiB0aGUgcG9ydHM7IGxldCB0aGVtIHJlYWNoIHRoZSBmaXJtd2FyZSB3aGlsZSBpdCBpcyBzdGlsbCBhbGl2ZS4KJiM0MzsJICovCiYjNDM7CXN3aXRjaGRldl9kZWZlcnJlZF9wcm9jZXNzKCk7CiYjNDM7CXJ0bmxfdW5sb2NrKCk7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2tfbmVzdGVkKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7YnVzLSZndDttZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTsKJiM0MzsJcHJpdi0mZ3Q7YmxvY2tfaG9zdCA9IHRydWU7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2J1cy0mZ3Q7bWRpb19sb2NrKTsKJiM0MzsKJiM0MzsJc2V0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgJmFtcDtwcml2LSZndDtmbGFncyk7CiYjNDM7CWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYW1wO3ByaXYtJmd0O3N0YXRzX3dvcmspOwomIzQzOwljYW5jZWxfd29ya19zeW5jKCZhbXA7cHJpdi0mZ3Q7Y3JjX2Vycl93b3JrKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGRzLSZndDtudW1fcG9ydHM7IGkmIzQzOyYjNDM7KQomIzQzOwkJY2FuY2VsX3dvcmtfc3luYygmYW1wO3ByaXYtJmd0O3BvcnRzW2ldLmhvc3RfZmxvb2Rfd29yayk7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKHByaXYsIHBhcmFtcy0mZ3Q7ZncsIHBheWxvYWRfc2l6ZSwKJiM0MzsJCQkJICAgICAgZHMtJmd0O2RldmxpbmspOwomIzQzOwlpZiAocmV0KQomIzQzOwkJTkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgJiMzNDtmaXJtd2FyZSB0cmFuc2ZlciBmYWlsZWQmIzM0Oyk7CiYjNDM7CiYjNDM7CWlmICghcmV0KSB7CiYjNDM7CQltdXRleF9sb2NrX25lc3RlZCgmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2J1cy0mZ3Q7bWRpb19sb2NrLAomIzQzOwkJCQkgIE1ESU9fTVVURVhfTkVTVEVEKTsKJiM0MzsJCXByaXYtJmd0O2Jsb2NrX2hvc3QgPSBmYWxzZTsKJiM0MzsJCXByaXYtJmd0O3Jlc2N1ZV9tb2RlID0gZmFsc2U7CiYjNDM7CQltdXRleF91bmxvY2soJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtidXMtJmd0O21kaW9fbG9jayk7CiYjNDM7CiYjNDM7CQkvKiBSZWZyZXNoIHRoZSBjYWNoZWQgdmVyc2lvbnMgc28gdGhlIGZsYXNoIHVwZGF0ZSBvbmx5CiYjNDM7CQkgKiBjb21wbGV0ZXMgb25jZSB0aGUgbmV3IGZpcm13YXJlIGlzIGNvbmZpcm1lZCBydW5uaW5nIGFuZAomIzQzOwkJICogZGV2bGluayBkZXYgaW5mbyByZXBvcnRzIGl0LiBNdXN0IGhhcHBlbiBiZWZvcmUgc2V0dGluZwomIzQzOwkJICogc2tpcF90ZWFyZG93biwgd2hpY2ggZGlzY2FyZHMgYWxsIGZpcm13YXJlIEFQSSByZWFkcy4KJiM0MzsJCSAqLwomIzQzOwkJcmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCU5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssCiYjNDM7CQkJCQkgICAmIzM0O25ldyBmaXJtd2FyZSBkaWQgbm90IGJlY29tZSByZWFkeSYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQkvKiBUaGUgc3dpdGNoIGlzIGluIE1DVWJvb3Qgd2l0aCBlcmFzZWQgb3IgcGFydGx5IHdyaXR0ZW4gZmxhc2g7CiYjNDM7CQkgKiBkcm9wIHRoZSBjYWNoZWQgaWRlbnRpdHkgc28gZGV2bGluayBkZXYgaW5mbyBzdG9wcyByZXBvcnRpbmcKJiM0MzsJCSAqIHRoZSBwcmUtZmxhc2ggdmVyc2lvbiB1bnRpbCB0aGUgcmVwcm9iZSByZS1yZWFkcyB0aGUgdHJ1dGguCiYjNDM7CQkgKi8KJiM0MzsJCW1lbXNldCgmYW1wO3ByaXYtJmd0O2Z3X3ZlcnNpb24sIDAsIHNpemVvZihwcml2LSZndDtmd192ZXJzaW9uKSk7CiYjNDM7CQlwcml2LSZndDthc2ljX2lkID0gMDsKJiM0MzsJCXByaXYtJmd0O2FzaWNfcmV2ID0gMDsKJiM0MzsJfQomIzQzOwomIzQzOwltdXRleF9sb2NrX25lc3RlZCgmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2J1cy0mZ3Q7bWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7CiYjNDM7CXByaXYtJmd0O3NraXBfdGVhcmRvd24gPSB0cnVlOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtidXMtJmd0O21kaW9fbG9jayk7CiYjNDM7CiYjNDM7CS8qIFJlaW5pdGlhbGlzZSB0aHJvdWdoIGEgZGVmZXJyZWQgcmUtcHJvYmU6IHJlbW92ZSgpIHJ1bnMgd2l0aAomIzQzOwkgKiBza2lwX3RlYXJkb3duIHNldCwgdGhlbiBhIGZyZXNoIHByb2JlKCkgc3RhcnRzIGFnYWluc3Qgd2hhdGV2ZXIKJiM0MzsJICogdGhlIHN3aXRjaCBub3cgcnVucy4gVGhlIGNvcmUgc2tpcHMgdGhlIHJlLXByb2JlIGlmIHRoZSBkZXZpY2UKJiM0MzsJICogaXMgdW5ib3VuZCBvciBzaHV0IGRvd24gYmVmb3JlIGl0IGZpcmVzLgomIzQzOwkgKi8KJiM0MzsJZXJyID0gZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZHMtJmd0O2RldiwgTVhMODYyWFhfRldfUkVQUk9CRV9ERUxBWV9NUyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQgPyByZXQgOiBlcnI7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi43Y2Q4N2M3YWQ4NzE2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmgKQEAgLTAsMCAmIzQzOzEsMjAgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqLwomIzQzOwomIzQzOyNpZm5kZWYgX19NWEw4NjJYWF9GV19ICiYjNDM7I2RlZmluZSBfX01YTDg2MlhYX0ZXX0gKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bmV0L2RzYS5oJmd0OwomIzQzOwomIzQzO3N0cnVjdCBteGw4NjJ4eF9wcml2OwomIzQzO3N0cnVjdCB3b3JrX3N0cnVjdDsKJiM0MzsKJiM0MztpbnQgbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KTsKJiM0Mzt2b2lkIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKJiM0MztpbnQgbXhsODYyeHhfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiYjNDM7CQkJICAgICAgc3RydWN0IGRldmxpbmtfaW5mb19yZXEgKnJlcSwKJiM0MzsJCQkgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spOwomIzQzO2ludCBteGw4NjJ4eF9kZXZsaW5rX2ZsYXNoX3VwZGF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiYjNDM7CQkJCSAgc3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLAomIzQzOwkJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7CiYjNDM7CiYjNDM7I2VuZGlmIC8qIF9fTVhMODYyWFhfRldfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuYyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmMKaW5kZXggNGFjZDIxNmY3Y2MwMC4uNGRmN2M4MzgwOGY2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuYwomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jCkBAIC0xNSw2ICYjNDM7MTUsOCBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L3VuYWxpZ25lZC5oJmd0OwogI2luY2x1ZGUgJmx0O25ldC9kc2EuaCZndDsKICNpbmNsdWRlICYjMzQ7bXhsODYyeHguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1jbWQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1mdy5oJiMzNDsKICNpbmNsdWRlICYjMzQ7bXhsODYyeHgtaG9zdC5oJiMzNDsKIAogI2RlZmluZSBDVFJMX0JVU1lfTUFTSwkJCUJJVCgxNSkKQEAgLTM0MCw2ICYjNDM7MzQyLDIxIEBAIGludCBteGw4NjJ4eF9hcGlfd3JhcChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGNtZCwgdm9pZCAqX2RhdGEsCiAKIAltdXRleF9sb2NrX25lc3RlZCgmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2J1cy0mZ3Q7bWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7CiAKJiM0MzsJaWYgKHByaXYtJmd0O3NraXBfdGVhcmRvd24pIHsKJiM0MzsJCXJldCA9IHJlYWQgPyAtRU5PREVWIDogMDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChwcml2LSZndDtyZXNjdWVfbW9kZSkgewomIzQzOwkJcmV0ID0gLUVOT0RFVjsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChwcml2LSZndDtibG9ja19ob3N0ICZhbXA7JmFtcDsgY21kICE9IFNZU19NSVNDX0ZXX1VQREFURSkgewomIzQzOwkJcmV0ID0gLUVCVVNZOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKIAltYXggPSAoc2l6ZSAmIzQzOyAxKSAvIDI7CiAKIAlyZXQgPSBteGw4NjJ4eF9idXN5X3dhaXQocHJpdik7CkBAIC00OTUsMTIgJiM0Mzs1MTIsNTQgQEAgaW50IG14bDg2Mnh4X3Jlc2V0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KQogCXJldHVybiByZXQ7CiB9CiAKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHCQkweDFmCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TTURJT19QQUdFX01BU0sJMHhmZmYwCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TTURJT19PRkZfTUFTSwkJMHgwMDBmCiYjNDM7CiYjNDM7LyogUGFnZWQgY2xhdXNlLTIyIHdpbmRvdzogdGhlIHBhZ2UgZ29lcyBpbnRvIE1JSSByZWdpc3RlciAweDFmLCB0aGUgbG93IG5pYmJsZQomIzQzOyAqIG9mIGFkZHIgc2VsZWN0cyBvbmUgb2YgdGhlIDE2IHJlZ2lzdGVycyB3aXRoaW4gaXQuIEJvdGggaGVscGVycyB0YWtlIHRoZSBNRElPCiYjNDM7ICogYnVzIGxvY2sgcGVyIHRyYW5zYWN0aW9uLCBzbyBjYWxsZXJzIG11c3Qgbm90IGFscmVhZHkgaG9sZCBpdCAtLSB1bmxpa2UKJiM0MzsgKiBteGw4NjJ4eF9hcGlfd3JhcCgpLCB3aGljaCBob2xkcyBpdCBhY3Jvc3MgYSB3aG9sZSBmaXJtd2FyZSBjb21tYW5kLgomIzQzOyAqLwomIzQzO2ludCBteGw4NjJ4eF9zbWRpb19yZWFkKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgYWRkcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtaWlfYnVzICpidXMgPSBwcml2LSZndDttZGlvZGV2LSZndDtidXM7CiYjNDM7CWludCBwaHkgPSBwcml2LSZndDttZGlvZGV2LSZndDthZGRyOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7YnVzLSZndDttZGlvX2xvY2spOwomIzQzOwlyZXQgPSBfX21kaW9idXNfd3JpdGUoYnVzLCBwaHksIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHLAomIzQzOwkJCSAgICAgIGFkZHIgJmFtcDsgTVhMODYyWFhfU01ESU9fUEFHRV9NQVNLKTsKJiM0MzsJaWYgKHJldCAmZ3Q7PSAwKQomIzQzOwkJcmV0ID0gX19tZGlvYnVzX3JlYWQoYnVzLCBwaHksIGFkZHIgJmFtcDsgTVhMODYyWFhfU01ESU9fT0ZGX01BU0spOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtidXMtJmd0O21kaW9fbG9jayk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO2ludCBteGw4NjJ4eF9zbWRpb193cml0ZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHUxNiB2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWlpX2J1cyAqYnVzID0gcHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7YnVzOwomIzQzOwlpbnQgcGh5ID0gcHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7YWRkcjsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO2J1cy0mZ3Q7bWRpb19sb2NrKTsKJiM0MzsJcmV0ID0gX19tZGlvYnVzX3dyaXRlKGJ1cywgcGh5LCBNWEw4NjJYWF9TTURJT19BRERSX1JFRywKJiM0MzsJCQkgICAgICBhZGRyICZhbXA7IE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTSyk7CiYjNDM7CWlmIChyZXQgJmd0Oz0gMCkKJiM0MzsJCXJldCA9IF9fbWRpb2J1c193cml0ZShidXMsIHBoeSwgYWRkciAmYW1wOyBNWEw4NjJYWF9TTURJT19PRkZfTUFTSywKJiM0MzsJCQkJICAgICAgdmFsKTsKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7YnVzLSZndDttZGlvX2xvY2spOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKIHZvaWQgbXhsODYyeHhfaG9zdF9pbml0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KQogewogCUlOSVRfV09SSygmYW1wO3ByaXYtJmd0O2NyY19lcnJfd29yaywgbXhsODYyeHhfY3JjX2Vycl93b3JrX2ZuKTsKJiM0MzsJSU5JVF9XT1JLKCZhbXA7cHJpdi0mZ3Q7cmVzY3VlX2hlYWxfd29yaywgbXhsODYyeHhfcmVzY3VlX2hlYWxfd29ya19mbik7CiB9CiAKIHZvaWQgbXhsODYyeHhfaG9zdF9zaHV0ZG93bihzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdikKIHsKIAljYW5jZWxfd29ya19zeW5jKCZhbXA7cHJpdi0mZ3Q7Y3JjX2Vycl93b3JrKTsKJiM0MzsJY2FuY2VsX3dvcmtfc3luYygmYW1wO3ByaXYtJmd0O3Jlc2N1ZV9oZWFsX3dvcmspOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmgKaW5kZXggNjZkNmFlMTk4YWZmNC4uNGUwNTRjNmU0YzBlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5oCkBAIC0xOCw1ICYjNDM7MTgsNyBAQCBpbnQgbXhsODYyeHhfYXBpX3dyYXAoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUxNiBjbWQsIHZvaWQgKmRhdGEsIHUxNiBzaXplLAogCW14bDg2Mnh4X2FwaV93cmFwKGRldiwgY21kLCAmYW1wOyhkYXRhKSwgc2l6ZW9mKChkYXRhKSksIHRydWUsIHRydWUpCiAKIGludCBteGw4NjJ4eF9yZXNldChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdik7CiYjNDM7aW50IG14bDg2Mnh4X3NtZGlvX3JlYWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyKTsKJiM0MztpbnQgbXhsODYyeHhfc21kaW9fd3JpdGUoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1MTYgdmFsKTsKIAogI2VuZGlmIC8qIF9fTVhMODYyWFhfSE9TVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LXBoeWxpbmsuYwppbmRleCBiNjg5NjUyYWE5YjkyLi5hNWI2OTQwYjU1MmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1waHlsaW5rLmMKQEAgLTQwNiw2ICYjNDM7NDA2LDggQEAgbXhsODYyeHhfcGh5bGlua19tYWNfc2VsZWN0X3BjcyhzdHJ1Y3QgcGh5bGlua19jb25maWcgKmNvbmZpZywKIAogCXN3aXRjaCAocG9ydCkgewogCWNhc2UgOSAuLi4gMTY6CiYjNDM7CQlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpCiYjNDM7CQkJcmV0dXJuIE5VTEw7CiAJCWlmICghTVhMODYyWFhfRldfVkVSX01JTihwcml2LCAxLCAwLCA4NCkpIHsKIAkJCWRldl93YXJuX29uY2UoZHAtJmd0O2RzLSZndDtkZXYsCiAJCQkJICAgICAgJiMzNDtTZXJEZXMgUENTIHVuc3VwcG9ydGVkIG9uIG9sZCBmaXJtd2FyZS5cbiYjMzQ7KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmMKaW5kZXggNDVkMjM3YjNhNDBmMS4uMGUxNzljYWU5N2YzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmMKQEAgLTIxLDYgJiM0MzsyMSw3IEBACiAjaW5jbHVkZSAmIzM0O214bDg2Mnh4LmgmIzM0OwogI2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1hcGkuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O214bDg2Mnh4LWNtZC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O214bDg2Mnh4LWZ3LmgmIzM0OwogI2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1ob3N0LmgmIzM0OwogI2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1waHlsaW5rLmgmIzM0OwogCkBAIC03MSw2ICYjNDM7NzIsMTMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX3Jtb25faGlzdF9yYW5nZSBteGw4NjJ4eF9ybW9uX3Jhbmdlc1tdID0gewogI2RlZmluZSBNWEw4NjJYWF9SRUFEWV9USU1FT1VUX01TCTEwMDAwCiAjZGVmaW5lIE1YTDg2MlhYX1JFQURZX1BPTExfTVMJCTEwMAogCiYjNDM7LyogQ2hpcCBJRCByZWdpc3RlcnMsIHJlYWQgdmlhIFNZU19NSVNDX1JFR19SRCAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX0wJCTB4YzBkMjg4ODQKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0NISVBJRF9NCQkweGMwZDI4ODg4CiYjNDM7I2RlZmluZSBNWEw4NjJYWF9DSElQSURfTF9QTlVNTAkJR0VOTUFTSygxNSwgMTIpCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9DSElQSURfTV9QTlVNTQkJR0VOTUFTSygxMSwgMCkKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0NISVBJRF9NX1ZFUlNJT04JR0VOTUFTSygxNCwgMTIpCiYjNDM7CiAjZGVmaW5lIE1YTDg2MlhYX1RDTV9JTlNUX1NFTAkJMHhlMDAKICNkZWZpbmUgTVhMODYyWFhfVENNX0NCUwkJMHhlMTIKICNkZWZpbmUgTVhMODYyWFhfVENNX0VCUwkJMHhlMTMKQEAgLTIyMiw3ICYjNDM7MjMwLDQ2IEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcGh5X3dyaXRlX2M0NV9taWlfYnVzKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLAogCXJldHVybiBteGw4NjJ4eF9waHlfd3JpdGVfbW1kKGJ1cy0mZ3Q7cHJpdiwgYWRkciwgZGV2YWRkLCByZWdudW0sIHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiYjNDM7LyogUmVhZCB0aGUgc3RhdGljIGNoaXAgcGFydCBudW1iZXIgYW5kIHZlcnNpb24gZnJvbSB0aGUgQ0hJUCBJRAomIzQzOyAqIHJlZ2lzdGVycy4gT25seSBwb3NzaWJsZSB3aXRoIGEgcnVubmluZyBmaXJtd2FyZSwgc28gdGhlIHZhbHVlcyBhcmUKJiM0MzsgKiBjYWNoZWQgYXQgc2V0dXAgYW5kIGxlZnQgemVybyB3aGVuIHRoZSBzd2l0Y2ggaXMgaW4gcmVzY3VlIG1vZGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9yZWFkX2NoaXBfaWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbXhsODYyeHhfc3lzX3JlZ19ydyByZWcgPSB7fTsKJiM0MzsJdTE2IGNoaXBpZF9sLCBjaGlwaWRfbTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmVnLmFkZHIgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9DSElQSURfTCk7CiYjNDM7CXJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIFNZU19NSVNDX1JFR19SRCwgcmVnKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CWNoaXBpZF9sID0gbGUzMl90b19jcHUocmVnLnZhbCk7CiYjNDM7CiYjNDM7CXJlZy5hZGRyID0gY3B1X3RvX2xlMzIoTVhMODYyWFhfQ0hJUElEX00pOwomIzQzOwlyZXQgPSBNWEw4NjJYWF9BUElfUkVBRChwcml2LCBTWVNfTUlTQ19SRUdfUkQsIHJlZyk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwljaGlwaWRfbSA9IGxlMzJfdG9fY3B1KHJlZy52YWwpOwomIzQzOwomIzQzOwlwcml2LSZndDthc2ljX2lkID0gRklFTERfR0VUKE1YTDg2MlhYX0NISVBJRF9MX1BOVU1MLCBjaGlwaWRfbCkgfAomIzQzOwkJCUZJRUxEX0dFVChNWEw4NjJYWF9DSElQSURfTV9QTlVNTSwgY2hpcGlkX20pICZsdDsmbHQ7IDQ7CiYjNDM7CXByaXYtJmd0O2FzaWNfcmV2ID0gRklFTERfR0VUKE1YTDg2MlhYX0NISVBJRF9NX1ZFUlNJT04sIGNoaXBpZF9tKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIG14bDg2Mnh4X3dhaXRfcmVhZHkgLSB3YWl0IGZvciB0aGUgc3dpdGNoIGZpcm13YXJlIHRvIGJlY29tZSBvcGVyYXRpb25hbAomIzQzOyAqIEBkczogRFNBIHN3aXRjaCBpbnN0YW5jZQomIzQzOyAqCiYjNDM7ICogUG9sbCB0aGUgZmlybXdhcmUgdW50aWwgaXQgcmVwb3J0cyBpdHMgdmVyc2lvbiBhbmQgYWNjZXB0cwomIzQzOyAqIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMsIHRoZW4gY2FjaGUgdGhlIGZpcm13YXJlIHZlcnNpb24gYW5kIGNoaXAgSUQuCiYjNDM7ICogVGFrZXMgYXQgbGVhc3QgdHdvIHNlY29uZHMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiYjNDM7ICovCiYjNDM7aW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewogCXN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB2ZXIgPSB7fTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllcywgdGltZW91dDsKQEAgLTI1NCw2ICYjNDM7MzAxLDExIEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiAJCXByaXYtJmd0O2Z3X3ZlcnNpb24ubWFqb3IgPSB2ZXIuaXZfbWFqb3I7CiAJCXByaXYtJmd0O2Z3X3ZlcnNpb24ubWlub3IgPSB2ZXIuaXZfbWlub3I7CiAJCXByaXYtJmd0O2Z3X3ZlcnNpb24ucmV2aXNpb24gPSBsZTE2X3RvX2NwdSh2ZXIuaXZfcmV2aXNpb24pOwomIzQzOwomIzQzOwkJcmV0ID0gbXhsODYyeHhfcmVhZF9jaGlwX2lkKHByaXYpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlkZXZfd2Fybihkcy0mZ3Q7ZGV2LCAmIzM0O2ZhaWxlZCB0byByZWFkIGNoaXAgSUQ6ICVwZVxuJiMzNDssCiYjNDM7CQkJCSBFUlJfUFRSKHJldCkpOwogCQlyZXR1cm4gMDsKIAogbm90X3JlYWR5X3lldDoKQEAgLTYyMiwyMSAmIzQzOzY3NCw2NiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIAlpbnQgbl91c2VyX3BvcnRzID0gMCwgbWF4X3ZsYW5zOwogCWludCBpbmdyZXNzX2ZpbmFscywgdmlkX3J1bGVzOwogCXN0cnVjdCBkc2FfcG9ydCAqZHA7Ci0JaW50IHJldCwgaTsKLQotCXJldCA9IG14bDg2Mnh4X3Jlc2V0KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwomIzQzOwlpbnQgcmV0LCBpLCByZXNjdWU7CiAKJiM0MzsJLyogVGhlIFNlckRlcyBzdGF0ZSBpcyBzb2Z0d2FyZS1vbmx5IGFuZCBtdXN0IGV4aXN0IGJlZm9yZSBhbnl0aGluZyBjYW4KJiM0MzsJICogcmVhY2ggcGh5bGluaywgaW5jbHVkaW5nIGEgcmVzY3VlLW1vZGUgZmxhc2ggY2xlYXJpbmcgcmVzY3VlX21vZGUKJiM0MzsJICogYWhlYWQgb2YgdGhlIHJlcHJvYmUuCiYjNDM7CSAqLwogCW11dGV4X2luaXQoJmFtcDtwcml2LSZndDtzZXJkZXNfbG9jayk7CiAJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUocHJpdi0mZ3Q7c2VyZGVzX3BvcnRzKTsgaSYjNDM7JiM0MzspCiAJCW14bDg2Mnh4X3NldHVwX3Bjcyhwcml2LCAmYW1wO3ByaXYtJmd0O3NlcmRlc19wb3J0c1tpXSwKIAkJCQkgICBpICYjNDM7IE1YTDg2MlhYX0ZJUlNUX1NFUkRFU19QT1JUKTsKIAomIzQzOwkvKiBEZXRlY3QgdGhlIGxvYWRlciBvdmVyIFNCIFBESSBmaXJzdDogaXQgbmVlZHMgbm8gZmlybXdhcmUsIHVubGlrZSB0aGUKJiM0MzsJICogQzQ1IEFQSSAobXhsODYyeHhfcmVzZXQvd2FpdF9yZWFkeSkgd2hpY2ggc3Bld3MgQ1JDIGVycm9ycyB3aGVuIG5vbmUKJiM0MzsJICogYW5zd2Vycy4gVG91Y2ggQzQ1IG9ubHkgb25jZSByZXNjdWUgaXMgcnVsZWQgb3V0LgomIzQzOwkgKi8KJiM0MzsJcmVzY3VlID0gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHByaXYpOwomIzQzOwlpZiAocmVzY3VlICZsdDsgMCkgewomIzQzOwkJZGV2X2Vycihkcy0mZ3Q7ZGV2LCAmIzM0O3N3aXRjaCBzdGF0ZSBkZXRlY3Rpb24gZmFpbGVkOiAlcGVcbiYjMzQ7LAomIzQzOwkJCUVSUl9QVFIocmVzY3VlKSk7CiYjNDM7CQlyZXR1cm4gcmVzY3VlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChyZXNjdWUgPT0gTVhMODYyWFhfTk9UX1JFU0NVRSkgewomIzQzOwkJcmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CQlyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTsKJiM0MzsJCWlmIChyZXQpIHsKJiM0MzsJCQkvKiB0aGUgcmVzZXQgbWF5IG9ubHkgbm93IGhhdmUgdHJpZ2dlcmVkIHJlc2N1ZSBtb2RlICovCiYjNDM7CQkJcmVzY3VlID0gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHByaXYpOwomIzQzOwkJCWlmIChyZXNjdWUgJmx0OyAwKSB7CiYjNDM7CQkJCWRldl9lcnIoZHMtJmd0O2RldiwKJiM0MzsJCQkJCSYjMzQ7c3dpdGNoIG5vdCByZXNwb25kaW5nIGFmdGVyIHJlc2V0OiAlcGVcbiYjMzQ7LAomIzQzOwkJCQkJRVJSX1BUUihyZXNjdWUpKTsKJiM0MzsJCQkJcmV0dXJuIHJlc2N1ZTsKJiM0MzsJCQl9CiYjNDM7CQkJaWYgKHJlc2N1ZSA9PSBNWEw4NjJYWF9OT1RfUkVTQ1VFKQomIzQzOwkJCQlyZXR1cm4gcmV0OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXByaXYtJmd0O3Jlc2N1ZV9tb2RlID0gcmVzY3VlOwomIzQzOwomIzQzOwlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpIHsKJiM0MzsJCWlmIChwcml2LSZndDtyZXNjdWVfcmVhZHkpIHsKJiM0MzsJCQlkZXZfd2Fybihkcy0mZ3Q7ZGV2LAomIzQzOwkJCQkgJiMzNDtzd2l0Y2ggaW4gTUNVYm9vdCByZXNjdWUgbW9kZSwgdXNlIGRldmxpbmsgdG8gZmxhc2ggbmV3IGZpcm13YXJlXG4mIzM0Oyk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCS8qIERyYWluIHRoZSB3ZWRnZWQgZG93bmxvYWQgaW4gdGhlIGJhY2tncm91bmQgc28gaXQKJiM0MzsJCQkgKiBuZXZlciBob2xkcyB0aGUgZGV2bGluayBsb2NrOyBpbmZvIGFuZCBmbGFzaCBiZWNvbWUKJiM0MzsJCQkgKiBhdmFpbGFibGUgb25jZSByZWFkeS4KJiM0MzsJCQkgKi8KJiM0MzsJCQlkZXZfd2Fybihkcy0mZ3Q7ZGV2LAomIzQzOwkJCQkgJiMzNDtzd2l0Y2ggaW4gTUNVYm9vdCB3aXRoIGFuIGludGVycnVwdGVkIGRvd25sb2FkLCByZWNvdmVyaW5nIGluIGJhY2tncm91bmRcbiYjMzQ7KTsKJiM0MzsJCQlxdWV1ZV93b3JrKHN5c3RlbV9sb25nX3dxLCAmYW1wO3ByaXYtJmd0O3Jlc2N1ZV9oZWFsX3dvcmspOwomIzQzOwkJfQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKIAkvKiBDYWxjdWxhdGUgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplcy4KIAkgKiBXaXRoIFZMQU4gRmlsdGVyIGhhbmRsaW5nIFZJRCBtZW1iZXJzaGlwIGNoZWNrczoKIAkgKiAgIEluZ3Jlc3M6IG9ubHkgZmluYWwgY2F0Y2hhbGwgcnVsZXMgKFBWSUQgaW5zZXJ0aW9uLCA4MDIuMVEKQEAgLTcxNSwxMSAmIzQzOzgxMiwyMSBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc3RhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgYm9vbCBlbmFibGUpCiBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfZW5hYmxlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKJiM0MzsJc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy0mZ3Q7cHJpdjsKJiM0MzsKJiM0MzsJaWYgKHByaXYtJmd0O3Jlc2N1ZV9tb2RlKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiAJcmV0dXJuIG14bDg2Mnh4X3BvcnRfc3RhdGUoZHMsIHBvcnQsIHRydWUpOwogfQogCiBzdGF0aWMgdm9pZCBteGw4NjJ4eF9wb3J0X2Rpc2FibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKIHsKJiM0MzsJc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy0mZ3Q7cHJpdjsKJiM0MzsKJiM0MzsJaWYgKHByaXYtJmd0O3Jlc2N1ZV9tb2RlKQomIzQzOwkJcmV0dXJuOwomIzQzOwogCWlmIChteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSkpCiAJCWRldl9lcnIoZHMtJmd0O2RldiwgJiMzNDtmYWlsZWQgdG8gZGlzYWJsZSBwb3J0ICVkXG4mIzM0OywgcG9ydCk7CiB9CkBAIC0xMzM3LDYgJiM0MzsxNDQ0LDE3IEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcG9ydF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQogCWJvb2wgaXNfY3B1X3BvcnQgPSBkc2FfcG9ydF9pc19jcHUoZHApOwogCWludCByZXQ7CiAKJiM0MzsJaWYgKGRzYV9wb3J0X2lzX2RzYShkcCkpIHsKJiM0MzsJCWRldl9lcnIoZHMtJmd0O2RldiwgJiMzNDtwb3J0ICVkOiBEU0EgbGlua3Mgbm90IHN1cHBvcnRlZFxuJiMzNDssIHBvcnQpOwomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIERTQSByZWluaXRzIGZhaWxlZCB1c2VyIHBvcnRzIGFzIHVudXNlZDsgc2hhcmVkIHBvcnRzIG11c3QKJiM0MzsJICogc3VjY2VlZCBmb3IgdGhlIHRyZWUgdG8gcmVnaXN0ZXIuCiYjNDM7CSAqLwomIzQzOwlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpCiYjNDM7CQlyZXR1cm4gZHNhX3BvcnRfaXNfdXNlcihkcCkgPyAtRU5PREVWIDogMDsKJiM0MzsKIAlyZXQgPSBteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTEzNDYsMTEgJiM0MzsxNDY0LDYgQEAgc3RhdGljIGludCBteGw4NjJ4eF9wb3J0X3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCiAJaWYgKGRzYV9wb3J0X2lzX3VudXNlZChkcCkpCiAJCXJldHVybiAwOwogCi0JaWYgKGRzYV9wb3J0X2lzX2RzYShkcCkpIHsKLQkJZGV2X2Vycihkcy0mZ3Q7ZGV2LCAmIzM0O3BvcnQgJWQ6IERTQSBsaW5rcyBub3Qgc3VwcG9ydGVkXG4mIzM0OywgcG9ydCk7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KIAlyZXQgPSBteGw4NjJ4eF9jb25maWd1cmVfc3BfdGFnX3Byb3RvKGRzLCBwb3J0LCBpc19jcHVfcG9ydCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTE1NzIsNiAmIzQzOzE2ODUsMTIgQEAgc3RhdGljIGludCBteGw4NjJ4eF9wb3J0X21kYl9kZWwoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAlldGhlcl9hZGRyX2NvcHkocXBhcmFtLm1hYywgbWRiLSZndDthZGRyKTsKIAogCXJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIE1YTDg2MlhYX01BQ19UQUJMRUVOVFJZUVVFUlksIHFwYXJhbSk7CiYjNDM7CS8qIFBvc3QtZmxhc2ggdGVhcmRvd24gb3IgTUNVYm9vdDogdGhlIGZpcm13YXJlIGFuZCBpdHMgTUFDIHRhYmxlIGFyZQomIzQzOwkgKiBnb25lLCBzbyB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gZGVsZXRlLiBPdXRzaWRlIHRob3NlLCAtRU5PREVWIGlzIGEKJiM0MzsJICogYnVzIGVycm9yIGFuZCBtdXN0IGJlIHJlcG9ydGVkLgomIzQzOwkgKi8KJiM0MzsJaWYgKHJldCA9PSAtRU5PREVWICZhbXA7JmFtcDsgKHByaXYtJmd0O3NraXBfdGVhcmRvd24gfHwgcHJpdi0mZ3Q7cmVzY3VlX21vZGUpKQomIzQzOwkJcmV0dXJuIDA7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTYyOCw2ICYjNDM7MTc0Nyw5IEBAIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3BvcnRfc3RwX3N0YXRlX3NldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCXN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID0gZHMtJmd0O3ByaXY7CiAJaW50IHJldDsKIAomIzQzOwlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgQlJfU1RBVEVfRElTQUJMRUQ6CiAJCXBhcmFtLnBvcnRfc3RhdGUgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9TVFBfUE9SVF9TVEFURV9ESVNBQkxFKTsKQEAgLTIwMTUsNiAmIzQzOzIxMzcsMTIgQEAgc3RhdGljIHZvaWQgbXhsODYyeHhfc3RhdHNfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcHJpdi0mZ3Q7ZHM7CiAJc3RydWN0IGRzYV9wb3J0ICpkcDsKIAomIzQzOwkvKiBBIGdldF9zdGF0czY0KCkgcmUtYXJtIGNhbiByYWNlIHRoZSBmbGFzaCB0ZWFyZG93biYjMzk7cyBXT1JLX1NUT1BQRUQKJiM0MzsJICogc2V0IGFuZCBjYW5jZWw7IGJhaWwgaGVyZSBzbyBhIHN0cmF5IHBvbGwgbmV2ZXIgcnVucyBkdXJpbmcgYSBmbGFzaC4KJiM0MzsJICovCiYjNDM7CWlmICh0ZXN0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgJmFtcDtwcml2LSZndDtmbGFncykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiAJZHNhX3N3aXRjaF9mb3JfZWFjaF9hdmFpbGFibGVfcG9ydChkcCwgZHMpCiAJCW14bDg2Mnh4X3N0YXRzX3BvbGwoZHMsIGRwLSZndDtpbmRleCk7CiAKQEAgLTIwODYsNiAmIzQzOzIyMTQsOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRzYV9zd2l0Y2hfb3BzIG14bDg2Mnh4X3N3aXRjaF9vcHMgPSB7CiAJLmdldF9wYXVzZV9zdGF0cyA9IG14bDg2Mnh4X2dldF9wYXVzZV9zdGF0cywKIAkuZ2V0X3Jtb25fc3RhdHMgPSBteGw4NjJ4eF9nZXRfcm1vbl9zdGF0cywKIAkuZ2V0X3N0YXRzNjQgPSBteGw4NjJ4eF9nZXRfc3RhdHM2NCwKJiM0MzsJLmRldmxpbmtfaW5mb19nZXQgPSBteGw4NjJ4eF9kZXZsaW5rX2luZm9fZ2V0LAomIzQzOwkuZGV2bGlua19mbGFzaF91cGRhdGUgPSBteGw4NjJ4eF9kZXZsaW5rX2ZsYXNoX3VwZGF0ZSwKIH07CiAKIHN0YXRpYyBpbnQgbXhsODYyeHhfcHJvYmUoc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaAppbmRleCA0MzJhNWYzZjJlMDhlLi45OTFiMjRhYTk1YWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaApAQCAtNCw3ICYjNDM7NCw5IEBACiAjZGVmaW5lIF9fTVhMODYyWFhfSAogCiAjaW5jbHVkZSAmbHQ7YXNtL2J5dGVvcmRlci5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRvcHMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L211dGV4LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvd29ya3F1ZXVlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L2RzYS5oJmd0OwogCkBAIC0xNCw2ICYjNDM7MTYsMTAgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXY7CiAjZGVmaW5lIE1YTDg2MlhYX0ZJUlNUX1NFUkRFU19QT1JUCTkKICNkZWZpbmUgTVhMODYyWFhfU0VSREVTX1NMT1RTCQk0CiAKJiM0MzsvKiBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QoKSByZXR1cm4gY29kZXMgKG5lZ2F0aXZlIHZhbHVlcyBhcmUgZXJyb3JzKSAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfTk9UX1JFU0NVRQkJMAomIzQzOyNkZWZpbmUgTVhMODYyWFhfSU5fUkVTQ1VFCQkxCiYjNDM7CiAjZGVmaW5lIE1YTDg2MlhYX0RFRkFVTFRfQlJJREdFCQkwCiAjZGVmaW5lIE1YTDg2MlhYX01BWF9CUklER0VTCQk0OAogI2RlZmluZSBNWEw4NjJYWF9NQVhfQlJJREdFX1BPUlRTCTEyOApAQCAtMzAzLDYgJiM0MzszMDksMTAgQEAgc3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24gewogICogICAgICAgICAgICAgICAgICAgICAgZmxvb2RpbmcpCiAgKiBAZndfdmVyc2lvbjogICAgICAgICBjYWNoZWQgZmlybXdhcmUgdmVyc2lvbiwgcG9wdWxhdGVkIGF0IHByb2JlIGFuZAogICogICAgICAgICAgICAgICAgICAgICAgY29tcGFyZWQgd2l0aCBNWEw4NjJYWF9GV19WRVJfTUlOKCkKJiM0MzsgKiBAYXNpY19pZDogICAgICAgICAgICBjaGlwIHBhcnQgbnVtYmVyIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMsCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYXMgdGhlIGRldmxpbmsgJiMzNDthc2ljLmlkJiMzNDsgZml4ZWQgdmVyc2lvbgomIzQzOyAqIEBhc2ljX3JldjogICAgICAgICAgIGNoaXAgdmVyc2lvbiByZWFkIGZyb20gdGhlIENISVAgSUQgcmVnaXN0ZXJzLAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGFzIHRoZSBkZXZsaW5rICYjMzQ7YXNpYy5yZXYmIzM0OyBmaXhlZCB2ZXJzaW9uCiAgKiBAc2VyZGVzX3BvcnRzOiAgICAgICBTZXJEZXMgaW50ZXJmYWNlcyBpbmNsLiBzdWItaW50ZXJmYWNlcyBpbiBjYXNlIG9mCiAgKiAgICAgICAgICAgICAgICAgICAgICAxMEdfUVhHTUlJIG9yIFFTR01JSQogICogQHNlcmRlc19yZWZjb3VudDogICAgcGVyLVhQQ1MgY291bnQgb2Ygc3ViLXBvcnRzIGVuYWJsZWQgYnkgcGh5bGluazsKQEAgLTMxOSw2ICYjNDM7MzI5LDIwIEBAIHN0cnVjdCBteGw4NjJ4eF9md192ZXJzaW9uIHsKICAqIEBldmxhbl9pbmdyZXNzX3NpemU6IHBlci1wb3J0IGluZ3Jlc3MgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplCiAgKiBAZXZsYW5fZWdyZXNzX3NpemU6ICBwZXItcG9ydCBlZ3Jlc3MgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplCiAgKiBAdmZfYmxvY2tfc2l6ZTogICAgICBwZXItcG9ydCBWTEFOIEZpbHRlciBibG9jayBzaXplCiYjNDM7ICogQGJsb2NrX2hvc3Q6ICAgICAgICAgcmVqZWN0IGZpcm13YXJlIEFQSSBjb21tYW5kcyAoZXhjZXB0IEZXX1VQREFURSkKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYSBmaXJtd2FyZSBmbGFzaAomIzQzOyAqIEBza2lwX3RlYXJkb3duOiAgICAgIGRpc2NhcmQgZmlybXdhcmUgQVBJIGNvbW1hbmRzIGR1cmluZyB0aGUgdGVhcmRvd24KJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQgYnkgdGhlIHBvc3QtZmxhc2ggcmVwcm9iZQomIzQzOyAqIEByZXNjdWVfbW9kZTogICAgICAgIHN3aXRjaCBpcyBpbiBNQ1Vib290OyBmaXJtd2FyZSBBUEkgY29tbWFuZHMgZmFpbCBmYXN0LAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgY2xhdXNlLTIyIFNNRElPIHdvcmtzLiBTZXQgZnJvbSBzZXR1cCgpIGJlZm9yZSB0aGUKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggaXMgcmVnaXN0ZXJlZCBhbmQgY2xlYXJlZCB1bmRlciB0aGUgTURJTyBidXMgbG9jawomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgYmVuZWZpdCBvZiBteGw4NjJ4eF9hcGlfd3JhcCgpOyBvdGhlciByZWFkZXJzCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgb25seSBuZWVkIGl0IHRvIGJlIGEgc3RhYmxlIHNpbmdsZSBmbGFnLgomIzQzOyAqIEByZXNjdWVfcmVhZHk6ICAgICAgIChyZXNjdWVfbW9kZSkgbG9hZGVyIGlzIGF0IGEgY2xlYW4gUkVBRFkgYW5kIHdpbGwgYWNjZXB0CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgYSBmbGFzaDsgZmFsc2Ugd2hpbGUgcmVzY3VlX2hlYWxfd29yayBpcyBkcmFpbmluZwomIzQzOyAqIEByZXNjdWVfZmFpbGVkOiAgICAgIChyZXNjdWVfbW9kZSkgdGhlIHNlbGYtaGVhbCBnYXZlIHVwOyB0aGUgbG9hZGVyIG5lZWRzIGEKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBwb3dlciBjeWNsZSBhbmQgbm8gZmxhc2ggY2FuIGJlIGFjY2VwdGVkCiYjNDM7ICogQHJlc2N1ZV9oZWFsX3dvcms6ICAgYmFja2dyb3VuZCBzZWxmLWhlYWwgZHJhaW5pbmcgYSB3ZWRnZWQgZG93bmxvYWQgdG8gUkVBRFkKICAqIEBzdGF0c193b3JrOiAgICAgICAgIHBlcmlvZGljIHdvcmsgaXRlbSB0aGF0IHBvbGxzIFJNT04gaGFyZHdhcmUgY291bnRlcnMKICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBhY2N1bXVsYXRlcyB0aGVtIGludG8gNjQtYml0IHBlci1wb3J0IHN0YXRzCiAgKi8KQEAgLTMyNiw5ICYjNDM7MzUwLDEyIEBAIHN0cnVjdCBteGw4NjJ4eF9wcml2IHsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHM7CiAJc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2OwogCXN0cnVjdCB3b3JrX3N0cnVjdCBjcmNfZXJyX3dvcms7CiYjNDM7CXN0cnVjdCB3b3JrX3N0cnVjdCByZXNjdWVfaGVhbF93b3JrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IGRyb3BfbWV0ZXI7CiAJc3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24gZndfdmVyc2lvbjsKJiM0MzsJdTE2IGFzaWNfaWQ7CiYjNDM7CXU4IGFzaWNfcmV2OwogCXN0cnVjdCBteGw4NjJ4eF9wY3Mgc2VyZGVzX3BvcnRzWzhdOwogCWludCBzZXJkZXNfcmVmY291bnRbMl07CiAJc3RydWN0IG11dGV4IHNlcmRlc19sb2NrOwpAQCAtMzM3LDcgJiM0MzszNjQsMTQgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXYgewogCXUxNiBldmxhbl9pbmdyZXNzX3NpemU7CiAJdTE2IGV2bGFuX2VncmVzc19zaXplOwogCXUxNiB2Zl9ibG9ja19zaXplOwomIzQzOwlib29sIGJsb2NrX2hvc3Q7CiYjNDM7CWJvb2wgc2tpcF90ZWFyZG93bjsKJiM0MzsJYm9vbCByZXNjdWVfbW9kZTsKJiM0MzsJYm9vbCByZXNjdWVfcmVhZHk7CiYjNDM7CWJvb2wgcmVzY3VlX2ZhaWxlZDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXRzX3dvcms7CiB9OwogCiYjNDM7aW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKJiM0MzsKICNlbmRpZiAvKiBfX01YTDg2MlhYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IGFlZTc5ZmQ2YjMyYjQuLjdhOTkxNjk1MDU3NzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMTMxNCw2ICYjNDM7MTMxNCw4IEBAIGludCAgX19tdXN0X2NoZWNrIGRldmljZV9hdHRhY2goc3RydWN0IGRldmljZSAqZGV2KTsKIGludCBfX211c3RfY2hlY2sgZHJpdmVyX2F0dGFjaChjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KTsKIHZvaWQgZGV2aWNlX2luaXRpYWxfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKIGludCBfX211c3RfY2hlY2sgZGV2aWNlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKJiM0MztpbnQgX19tdXN0X2NoZWNrIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwKJiM0MzsJCQkJCSB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpOwogCiBib29sIGRldmljZV9pc19ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc2EuaCBiL2luY2x1ZGUvbmV0L2RzYS5oCmluZGV4IDZmN2Y1YzE3YjUzMjAuLjU4NTk3YjE0ZTU5MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RzYS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbmV0L2RzYS5oCkBAIC0xMTcyLDYgJiM0MzsxMTcyLDkgQEAgc3RydWN0IGRzYV9zd2l0Y2hfb3BzIHsKIAlpbnQJKCpkZXZsaW5rX2luZm9fZ2V0KShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiAJCQkJICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsCiAJCQkJICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7CiYjNDM7CWludAkoKmRldmxpbmtfZmxhc2hfdXBkYXRlKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiYjNDM7CQkJCQlzdHJ1Y3QgZGV2bGlua19mbGFzaF91cGRhdGVfcGFyYW1zICpwYXJhbXMsCiYjNDM7CQkJCQlzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spOwogCWludAkoKmRldmxpbmtfc2JfcG9vbF9nZXQpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IHNiX2luZGV4LCB1MTYgcG9vbF9pbmRleCwKIAkJCQkgICAgICAgc3RydWN0IGRldmxpbmtfc2JfcG9vbF9pbmZvICpwb29sX2luZm8pOwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9kZXZsaW5rLmMgYi9uZXQvZHNhL2RldmxpbmsuYwppbmRleCBlZDM0MmYzNDU2OTJiLi4yNTMxMWE4N2NiYzU2IDEwMDY0NAotLS0gYS9uZXQvZHNhL2RldmxpbmsuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvZHNhL2RldmxpbmsuYwpAQCAtMjAsNiAmIzQzOzIwLDE4IEBAIHN0YXRpYyBpbnQgZHNhX2RldmxpbmtfaW5mb19nZXQoc3RydWN0IGRldmxpbmsgKmRsLAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAomIzQzO3N0YXRpYyBpbnQgZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlKHN0cnVjdCBkZXZsaW5rICpkbCwKJiM0MzsJCQkJICAgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcywKJiM0MzsJCQkJICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRzYV9kZXZsaW5rX3RvX2RzKGRsKTsKJiM0MzsKJiM0MzsJaWYgKCFkcy0mZ3Q7b3BzLSZndDtkZXZsaW5rX2ZsYXNoX3VwZGF0ZSkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsKJiM0MzsJcmV0dXJuIGRzLSZndDtvcHMtJmd0O2RldmxpbmtfZmxhc2hfdXBkYXRlKGRzLCBwYXJhbXMsIGV4dGFjayk7CiYjNDM7fQomIzQzOwogc3RhdGljIGludCBkc2FfZGV2bGlua19zYl9wb29sX2dldChzdHJ1Y3QgZGV2bGluayAqZGwsCiAJCQkJICAgdW5zaWduZWQgaW50IHNiX2luZGV4LCB1MTYgcG9vbF9pbmRleCwKIAkJCQkgICBzdHJ1Y3QgZGV2bGlua19zYl9wb29sX2luZm8gKnBvb2xfaW5mbykKQEAgLTE2OSw2ICYjNDM7MTgxLDcgQEAgZHNhX2Rldmxpbmtfc2Jfb2NjX3RjX3BvcnRfYmluZF9nZXQoc3RydWN0IGRldmxpbmtfcG9ydCAqZGxwLAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldmxpbmtfb3BzIGRzYV9kZXZsaW5rX29wcyA9IHsKIAkuaW5mb19nZXQJCQk9IGRzYV9kZXZsaW5rX2luZm9fZ2V0LAomIzQzOwkuZmxhc2hfdXBkYXRlCQkJPSBkc2FfZGV2bGlua19mbGFzaF91cGRhdGUsCiAJLnNiX3Bvb2xfZ2V0CQkJPSBkc2FfZGV2bGlua19zYl9wb29sX2dldCwKIAkuc2JfcG9vbF9zZXQJCQk9IGRzYV9kZXZsaW5rX3NiX3Bvb2xfc2V0LAogCS5zYl9wb3J0X3Bvb2xfZ2V0CQk9IGRzYV9kZXZsaW5rX3NiX3BvcnRfcG9vbF9nZXQsCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDA2OjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4NjE4CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMTMyNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIEFuYWx5c2lzOiBgbXhsODYyeHhgIGFuZCBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBkZXZsaW5rIGZsYXNoIHVwZGF0ZSBzdXBwb3J0IHRvIHRoZSBgbXhsODYyeHhgIERTQSBzd2l0Y2ggZHJpdmVyIGFuZCBhIG5ldyBmdW5jdGlvbiwgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCwgaW4gYGRyaXZlcnMvYmFzZS9kZC5jYC4gTGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHRoZSBgbXhsODYyeHhgIGRyaXZlci4gSXQmIzM5O3MgYSBEU0Egc3dpdGNoIGRyaXZlciwgbWVhbmluZyBpdCB0eXBpY2FsbHkgcmVxdWlyZXMgcGh5c2ljYWwgaGFyZHdhcmUgb3IgYSB2ZXJ5IHNwZWNpZmljIGVtdWxhdGlvbiBzZXR1cCwgdXN1YWxseSBpbnZvbHZpbmcgTURJTywgSTJDLCBvciBTUEkgaW50ZXJmYWNlcy4gV2UgZ2VuZXJhbGx5IGRvbiYjMzk7dCB0YXJnZXQgaGFyZHdhcmUtc3BlY2lmaWMgRFNBIGRyaXZlcnMgdW5sZXNzIHRoZXkmIzM5O3JlIHdpZGVseSBlbXVsYXRlZCwgd2hpY2ggaXNuJiMzOTt0IHR5cGljYWxseSB0aGUgY2FzZS4gVGhlIGluc3RydWN0aW9ucyBleHBsaWNpdGx5IHNheSB0byBleGNsdWRlIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCBkcml2ZXJzLCBidXQgYG14bDg2Mnh4YCBpcyBhbiBNRElPLWJhc2VkIHN3aXRjaCwgc28gdGhhdCBleGNsdXNpb24gZG9lc24mIzM5O3QgZGlyZWN0bHkgYXBwbHkuCgpOb3csIHRoZSBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIGZ1bmN0aW9uIGluIGNvcmUga2VybmVsIGNvZGUgaW4gYGRyaXZlcnMvYmFzZS9kZC5jYC4gVGhpcyBpcyBwb3RlbnRpYWxseSBtb3JlIGludGVyZXN0aW5nIGJlY2F1c2UgaXQmIzM5O3MgKmNvcmUqIGtlcm5lbCBsb2dpYyBhbmQgaXMgZXhwb3J0ZWQuIExvb2tpbmcgYXQgdGhlIGNvZGUsIGl0IHNjaGVkdWxlcyBhIHJlcHJvYmUgb3BlcmF0aW9uIGZvciBhIGRldmljZSwgcHJvdmlkZWQgaXQmIzM5O3MgcmVnaXN0ZXJlZCwgaGFzIGEgYnVzLCBhIHBhcmVudCwgYW5kIGEgZHJpdmVyLiBJdCB1c2VzIGRlbGF5ZWQgd29yaywgYW5kIHRoZSBjb2RlIGxvb2tzIGNsZWFuLiBDcnVjaWFsbHksIGl0JiMzOTtzIG5vdyBhIG5ldyBjb3JlIEFQSSwgd2hpY2ggbWVhbnMgKmFueSogZHJpdmVyIGNvdWxkIHBvdGVudGlhbGx5IHVzZSBpdC4gSXQgaXMgYWxzbyBleHBvcnRlZCwgbWVhbmluZyBpdCAqY2FuKiBiZSBjYWxsZWQgYnkgb3RoZXIgZHJpdmVycy4KCkhvd2V2ZXIsIGN1cnJlbnRseSwgb25seSBgbXhsODYyeHhgIGNhbGxzIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAuIEJlY2F1c2UgYG14bDg2Mnh4YCBpcyBhbiBNRElPIGRyaXZlciwgd2hpY2ggbWVhbnMgaXQgbGlrZWx5IGlzbiYjMzk7dCBnb2luZyB0byBiZSBmdXp6ZWQgdW5sZXNzIHRoZXJlIGlzIHNwZWNpZmljIHNldHVwIGluc3RydWN0aW9ucy4gIFN5emthbGxlciBtaWdodCBub3QgYXV0b21hdGljYWxseSBpbnN0YW50aWF0ZSB0aGVzZSBNRElPIGRldmljZXMgdW5sZXNzIHRoZXJlJiMzOTtzIGEgc3BlY2lmaWMgc3l6bGFuZyBkZXNjcmlwdGlvbi4KClRoZSBvdGhlciBjaGFuZ2UgaXMgYGRzYV9kZXZsaW5rX2ZsYXNoX3VwZGF0ZWAgaW4gYG5ldC9kc2EvZGV2bGluay5jYC4gVGhpcyBpcyByZWFjaGFibGUgdmlhIHRoZSBkZXZsaW5rIG5ldGxpbmsgaW50ZXJmYWNlLCAqaWYqIHRoZSBEU0Egc3dpdGNoIHN1cHBvcnRzIGRldmxpbmsgZmxhc2ggdXBkYXRlcy4gQ3VycmVudGx5LCBvbmx5IGBteGw4NjJ4eGAgaW1wbGVtZW50cyB0aGlzLiBGb3Igb3RoZXIgRFNBIHN3aXRjaGVzLCBpdCB3aWxsIHJldHVybiBgLUVPUE5PVFNVUFBgLgoKU28sIHRoZSByZWFsIHF1ZXN0aW9uIGlzIHdoZXRoZXIgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCBpcyB3b3J0aCBmdXp6aW5nLiBXaGlsZSBpdCAqY291bGQqIGJlIHVzZWQgYnkgbW9yZSBkcml2ZXJzIGluIHRoZSBmdXR1cmUsIGl0cyBjdXJyZW50IHNvbGUgY2FsbGVyIGlzIGBteGw4NjJ4eGAuIFNpbmNlIGBteGw4NjJ4eGAgaXMgYW4gTURJTyBkcml2ZXIsIHdoaWNoIGFyZSBub3QgY29tbW9ubHkgZnV6emVkIHdpdGhvdXQgZGVkaWNhdGVkIHNldHVwLCBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIHdpbGwgbGlrZWx5IGJlIHVucmVhY2hhYmxlIGluIG1vc3QgZnV6emluZyBzZXR1cHMgdW5sZXNzIHRoaXMgZHJpdmVyIGlzIHNwZWNpZmljYWxseSBlbmFibGVkLgoKTXkgbmV4dCBzdGVwIHdvdWxkIGJlIHRvIHBlcmZvcm0gYSBgZGVmYXVsdF9hcGk6Z3JlcHBlcmAgc2VhcmNoIHRvIGNoZWNrIGZvciBvdGhlciBjYWxsZXJzIG9mIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAsIGFsdGhvdWdoIEkgc3VzcGVjdCB0aGUgY3VycmVudCBjYWxsIGlzIHRoZSBvbmx5IG9uZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAwNjo1MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2Jhc2UvYmFzZS5oPTgwPXN0cnVjdCBkcml2ZXJfcHJpdmF0ZSB7XG4tLVxuZHJpdmVycy9iYXNlL2Jhc2UuaC0xMTEtICpcdCAgZGV2aWNlIGxvY2suIEEgZGVmZXJyZWQgcmUtcHJvYmUgc2NoZWR1bGVkIHdpdGhcbmRyaXZlcnMvYmFzZS9iYXNlLmg6MTEyOiAqXHQgIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKCkgbXVzdCBub3QgZGV0YWNoIHRoZSBkZXZpY2UgYW55bW9yZS5cbmRyaXZlcnMvYmFzZS9iYXNlLmgtMTEzLSAqXG4tLVxuZHJpdmVycy9iYXNlL2RkLmM9MTQ0Nj1zdGF0aWMgdm9pZCBkZXZpY2VfcmVwcm9iZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbi0tXG5kcml2ZXJzL2Jhc2UvZGQuYy0xNDczLS8qKlxuZHJpdmVycy9iYXNlL2RkLmM6MTQ3NDogKiBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSAtIHNjaGVkdWxlIGEgZGVmZXJyZWQgZGV0YWNoIGFuZCByZS1wcm9iZVxuZHJpdmVycy9iYXNlL2RkLmMtMTQ3NS0gKiBAZGV2OiBkZXZpY2UgdG8gZGV0YWNoIGFuZCByZS1wcm9iZVxuLS1cbmRyaXZlcnMvYmFzZS9kZC5jLTE0OTgtICovXG5kcml2ZXJzL2Jhc2UvZGQuYzoxNDk5OmludCBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBkZWxheV9tcylcbmRyaXZlcnMvYmFzZS9kZC5jLTE1MDAte1xuLS1cbmRyaXZlcnMvYmFzZS9kZC5jLTE1MTktfVxuZHJpdmVycy9iYXNlL2RkLmM6MTUyMDpFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSk7XG4tLVxuZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmM9NDIxPXZvaWQgbXhsODYyeHhfcmVzY3VlX2hlYWxfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4tLVxuZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMtNDUxLVxuZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmM6NDUyOlx0aWYgKGRldmljZV9zY2hlZHVsZV9yZXByb2JlKGRldiwgTVhMODYyWFhfRldfUkVQUk9CRV9ERUxBWV9NUykpXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYy00NTMtXHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfZmFpbGVkLCB0cnVlKTtcbi0tXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYz05MjM9aW50IG14bDg2Mnh4X2RldmxpbmtfZmxhc2hfdXBkYXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcbi0tXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYy0xMDUwLVx0ICovXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYzoxMDUxOlx0ZXJyID0gZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZHMtXHUwMDNlZGV2LCBNWEw4NjJYWF9GV19SRVBST0JFX0RFTEFZX01TKTtcbmRyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jLTEwNTItXG4tLVxuaW5jbHVkZS9saW51eC9kZXZpY2UuaD0xMzE2PWludCBfX211c3RfY2hlY2sgZGV2aWNlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTtcbmluY2x1ZGUvbGludXgvZGV2aWNlLmg6MTMxNzppbnQgX19tdXN0X2NoZWNrIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldixcbmluY2x1ZGUvbGludXgvZGV2aWNlLmgtMTMxOC1cdFx0XHRcdFx0IHVuc2lnbmVkIGludCBkZWxheV9tcyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDY6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzEzNTgKCQkJCQkJCW91dHB1dDogMTc2CgkJCQkJCQl0aG91Z2h0czogMTU3MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBGdXp6aW5nIFBvdGVudGlhbCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBzb21lIGNoYW5nZXMgcmVsYXRlZCB0byBmaXJtd2FyZSBmbGFzaGluZyBmb3IgYSBNYXhMaW5lYXIgTXhMODYyeHggRFNBIHN3aXRjaCwgYSBkZXZpY2UgZHJpdmVyIGZvciBhIGhhcmR3YXJlLXNwZWNpZmljIHN3aXRjaC4gVGhlIGtleSBxdWVzdGlvbiBpcyB3aGV0aGVyIGFueSBvZiB0aGlzIGlzIGZydWl0ZnVsbHkgZnV6emFibGUgd2l0aGluIGEgc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudCwgd2hpY2ggaXMgd2hhdCBTeXprYWxsZXIgcHJpbWFyaWx5IG9wZXJhdGVzIGluLgoKRmlyc3QsIHRoZSBvbmx5IGNhbGwgc2l0ZSBmb3IgdGhpcyBwYXRjaCBpcyB0aGUgYG14bDg2Mnh4YCBkcml2ZXIsIHdoaWNoIGlzIGFuIE1ESU8gZGV2aWNlIGRyaXZlci4gU3l6a2FsbGVyIGRvZXNuJiMzOTt0IGhhdmUgYSByZWxpYWJsZSwgZ2VuZXJpYyBtZWNoYW5pc20gdG8gaW5zdGFudGlhdGUgTURJTyBkZXZpY2VzLiBJdCBuZWVkcyBhIHNwZWNpZmljIGludGVyZmFjZSBsaWtlIGBtZGlvLWdwaW9gIG9yIHNpbWlsYXIsIHdoaWNoIHdvdWxkIHJlcXVpcmUgdGFyZ2V0ZWQgZGVzY3JpcHRpb25zLCB3aGljaCB3ZSBkb24mIzM5O3QgaGF2ZS4gRXZlbiBpZiB3ZSBjb3VsZCBnZXQgdGhlIGRyaXZlciBsb2FkZWQsIGl0IHJlcXVpcmVzIHNwZWNpZmljIGhhcmR3YXJlLgoKVGhlIHBhdGNoIGludHJvZHVjZXMgYGRzYV9kZXZsaW5rX2ZsYXNoX3VwZGF0ZWAsIHJlYWNoYWJsZSB2aWEgdGhlIGRldmxpbmsgbmV0bGluayBpbnRlcmZhY2UuIFRoZSBwcm9ibGVtIGlzIHRoYXQgZnV6emluZyBgZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlYCB3b3VsZCBqdXN0IHJlc3VsdCBpbiBhIGAtRU9QTk9UU1VQUGAgZXJyb3IgKnVubGVzcyogd2UgaGF2ZSBhIERTQSBzd2l0Y2ggdGhhdCBpbXBsZW1lbnRzIHRoaXMgZnVuY3Rpb25hbGl0eSwgYW5kIGN1cnJlbnRseSwgKm9ubHkqIGBteGw4NjJ4eGAgZG9lcy4gU28sIHRyaWdnZXJpbmcgdGhpcyB0aHJvdWdoIGEgZ2VuZXJpYyBEU0Egc3dpdGNoIGlzIGEgZGVhZCBlbmQuIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSB3cmFwcGVyOgoKYGBgYwpzdGF0aWMgaW50IGRzYV9kZXZsaW5rX2ZsYXNoX3VwZGF0ZShzdHJ1Y3QgZGV2bGluayAqZGwsCgkJCQkgICAgc3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLAoJCQkJICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKewoJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZHNhX2RldmxpbmtfdG9fZHMoZGwpOwoKCWlmICghZHMtJmd0O29wcy0mZ3Q7ZGV2bGlua19mbGFzaF91cGRhdGUpCgkJcmV0dXJuIC1FT1BOT1RTVVBQOwoKCXJldHVybiBkcy0mZ3Q7b3BzLSZndDtkZXZsaW5rX2ZsYXNoX3VwZGF0ZShkcywgcGFyYW1zLCBleHRhY2spOwp9CmBgYAoKVGhlIGNvcmUgbG9naWMgbGllcyBpbiBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIGFuZCB3aXRoaW4gYG14bDg2Mnh4YCBpdHNlbGYuIFNpbmNlIGBteGw4NjJ4eGAgaXMgZm9yIGEgc3BlY2lmaWMsIGhhcmR3YXJlIHN3aXRjaCwgaXQgaXMgbm90IGVtdWxhdGVkIGluIFFFTVUuIFRoaXMgc2VlbXMgdG8gdmlvbGF0ZSB0aGUgcnVsZSBvZiByZXF1aXJpbmcgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcy4KClRoZSBjb2RlIGluc3RydWN0aW9ucyBzYXkgdG8gc2V0IFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgY2hhbmdlcyBhcmUgZm9yIGEgdmVuZG9yLXNwZWNpZmljIGRyaXZlciB0aGF0IHJlcXVpcmVzIHNwZWNpZmljIFBDSWUgaGFyZHdhcmUgbm90IGVtdWxhdGVkIGJ5IFFFTVUuIFRoYXQgaXMgdGhpcyBjYXNlLiBUaGUgTURJTyBjb21tdW5pY2F0aW9uIGlzIHZlcnkgc3BlY2lmaWMsIGFuZCB0aGUgcHJvYmUgd2lsbCBmYWlsIGlmIGl0IGRvZXNuJiMzOTt0IGdldCB0aGUgY29ycmVjdCByZXNwb25zZXMgZnJvbSB0aGUgaGFyZHdhcmU6CmBgYGMKCWEgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9BRERSKTsKCWQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBKTsKCWlmICgodTE2KWEgIT0gTVhMODYyWFhfU0JfUERJX1BST0JFX0EgfHwKCSAgICAodTE2KWQgIT0gTVhMODYyWFhfU0JfUERJX1BST0JFX0QpCgkJcmV0dXJuIC1FTk9ERVY7CmBgYAoKV2UgY2hlY2tlZCBpZiBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIGNvdWxkIGJlIGNhbGxlZCBmcm9tIGFueXdoZXJlIGVsc2UsIGJ1dCBpdCYjMzk7cyBvbmx5IGNhbGxlZCBieSBgbXhsODYyeHhgLiBTbywgdGhlIGNvcmUgY2hhbmdlcyBhcmUsIGZ1bmN0aW9uYWxseSwgaW1wb3NzaWJsZSB0byB0cmlnZ2VyIHdpdGhvdXQgdGhlIGhhcmR3YXJlLCBvciBhcmUgdHJpdmlhbC4KClRoZXJlIGlzIGEgbWlub3IgYWRkaXRpb24gdG8gYGRyaXZlcnMvYmFzZS9jb3JlLmNgIHRoYXQgc2V0cyBgc2h1dGRvd25fZG9uZSA9IHRydWVgIHdpdGhpbiBgZGV2aWNlX3NodXRkb3duYC4gVGhpcyBoYXBwZW5zIGR1cmluZyBzeXN0ZW0gc2h1dGRvd24sIHRyaWdnZXJlZCBieSBTeXprYWxsZXImIzM5O3MgcmVib290IHNlcXVlbmNlLCBhbmQgdGhpcyBhY3Rpb24gaXMgdHJpdmlhbCBhbmQgdW5saWtlbHkgdG8gYmUgdGhlIHRhcmdldCBvZiBhIGZ1enouCgpUaHVzLCB0aGUgYWRkZWQgY29kZSBpcyB1bnJlYWNoYWJsZSBvciB0cml2aWFsLCBhbmQgdGhlIHJldHVybiBpcyBXb3J0aEZ1enppbmc9ZmFsc2UuCgpUaGUgcmVhc29uaW5nIGlzIHRoYXQgdGhlIGNoYW5nZXMgYXJlIGxhcmdlbHkgY29uZmluZWQgdG8gYSB2ZW5kb3Itc3BlY2lmaWMgZHJpdmVyIHJlcXVpcmluZyBoYXJkd2FyZSBub3QgZW11bGF0ZWQgYnkgUUVNVSwgdGhlIG5ldyBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIEFQSSBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IHRoaXMgdW5yZWFjaGFibGUgZHJpdmVyLCBhbmQgdGhlIERTQSBkZXZsaW5rIGNoYW5nZXMgYXJlIHRyaXZpYWwgd3JhcHBlcnMuIFRoZSBgZGV2aWNlX3NodXRkb3duYCBjaGFuZ2Ugc2V0cyBhIGJvb2xlYW4gaW4gYSBzaHV0ZG93biByb3V0aW5lLiBBbGwgb2YgdGhpcyBpbmRpY2F0ZXMgdGhlcmUmIzM5O3Mgbm90aGluZyBmdW5jdGlvbmFsbHkgc2lnbmlmaWNhbnQgYW5kIHJlYWNoYWJsZSB0aGF0IGlzIGEgZ29vZCB0YXJnZXQgZm9yIGZ1enppbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDY6NTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGZpcm13YXJlIGZsYXNoIHN1cHBvcnQgZm9yIHRoZSBNYXhMaW5lYXIgTXhMODYyeHggRFNBIHN3aXRjaCB2aWEgZGV2bGluaywgYWxvbmcgd2l0aCBhIG5ldyBjb3JlIGRyaXZlciBtb2RlbCBmdW5jdGlvbiBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgLiBUaGUgYG14bDg2Mnh4YCBkcml2ZXIgcmVxdWlyZXMgcGh5c2ljYWwgaGFyZHdhcmUgY29ubmVjdGVkIHZpYSBNRElPIHRvIHByb2JlIHN1Y2Nlc3NmdWxseSBhbmQgaXMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuIFRoZSBuZXcgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCBBUEkgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieSB0aGlzIHVucmVhY2hhYmxlIGRyaXZlci4gVGhlIGFkZGl0aW9ucyB0byB0aGUgRFNBIGRldmxpbmsgY29yZSBhcmUgdHJpdmlhbCB3cmFwcGVycyB0aGF0IHJldHVybiBgLUVPUE5PVFNVUFBgIGZvciBhbGwgb3RoZXIgc3dpdGNoZXMuIFRoZSBtb2RpZmljYXRpb24gdG8gYGRldmljZV9zaHV0ZG93bmAgbWVyZWx5IHNldHMgYSBib29sZWFuIGZsYWcgZHVyaW5nIHN5c3RlbSB0ZWFyZG93bi4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBmdW5jdGlvbmFsbHkgc2lnbmlmaWNhbnQsIHJlYWNoYWJsZSBjb2RlIHRvIGZ1enouJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGZpcm13YXJlIGZsYXNoIHN1cHBvcnQgZm9yIHRoZSBNYXhMaW5lYXIgTXhMODYyeHggRFNBIHN3aXRjaCB2aWEgZGV2bGluaywgYWxvbmcgd2l0aCBhIG5ldyBjb3JlIGRyaXZlciBtb2RlbCBmdW5jdGlvbiBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgLiBUaGUgYG14bDg2Mnh4YCBkcml2ZXIgcmVxdWlyZXMgcGh5c2ljYWwgaGFyZHdhcmUgY29ubmVjdGVkIHZpYSBNRElPIHRvIHByb2JlIHN1Y2Nlc3NmdWxseSBhbmQgaXMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuIFRoZSBuZXcgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCBBUEkgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieSB0aGlzIHVucmVhY2hhYmxlIGRyaXZlci4gVGhlIGFkZGl0aW9ucyB0byB0aGUgRFNBIGRldmxpbmsgY29yZSBhcmUgdHJpdmlhbCB3cmFwcGVycyB0aGF0IHJldHVybiBgLUVPUE5PVFNVUFBgIGZvciBhbGwgb3RoZXIgc3dpdGNoZXMuIFRoZSBtb2RpZmljYXRpb24gdG8gYGRldmljZV9zaHV0ZG93bmAgbWVyZWx5IHNldHMgYSBib29sZWFuIGZsYWcgZHVyaW5nIHN5c3RlbSB0ZWFyZG93bi4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBmdW5jdGlvbmFsbHkgc2lnbmlmaWNhbnQsIHJlYWNoYWJsZSBjb2RlIHRvIGZ1enouJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDA2OjUxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0xNVQwNjo1MDo0NC40NDMzMTYxNDdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNTU1MjEwODEzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgZmlybXdhcmUgZmxhc2ggc3VwcG9ydCBmb3IgdGhlIE1heExpbmVhciBNeEw4NjJ4eCBEU0Egc3dpdGNoIHZpYSBkZXZsaW5rLCBhbG9uZyB3aXRoIGEgbmV3IGNvcmUgZHJpdmVyIG1vZGVsIGZ1bmN0aW9uIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAuIFRoZSBgbXhsODYyeHhgIGRyaXZlciByZXF1aXJlcyBwaHlzaWNhbCBoYXJkd2FyZSBjb25uZWN0ZWQgdmlhIE1ESU8gdG8gcHJvYmUgc3VjY2Vzc2Z1bGx5IGFuZCBpcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4gVGhlIG5ldyBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIEFQSSBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IHRoaXMgdW5yZWFjaGFibGUgZHJpdmVyLiBUaGUgYWRkaXRpb25zIHRvIHRoZSBEU0EgZGV2bGluayBjb3JlIGFyZSB0cml2aWFsIHdyYXBwZXJzIHRoYXQgcmV0dXJuIGAtRU9QTk9UU1VQUGAgZm9yIGFsbCBvdGhlciBzd2l0Y2hlcy4gVGhlIG1vZGlmaWNhdGlvbiB0byBgZGV2aWNlX3NodXRkb3duYCBtZXJlbHkgc2V0cyBhIGJvb2xlYW4gZmxhZyBkdXJpbmcgc3lzdGVtIHRlYXJkb3duLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCwgcmVhY2hhYmxlIGNvZGUgdG8gZnV6ei5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDA2OjUwOjQ0LjQ0MzMyMTczN1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTE3MjcyMTI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMjliMDExNmUwNTU5Y2NjYTE0OGFlNjlhMGFhZDYyNzQyNjFlM2JkM1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU2F0IEF1ZyAxNSAwNjo1MDo0MyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3RcXG5pbmRleCA0NzQ1MTQ4ZmVjZjRmLi4wNTg5OTlkMGRjNTZmIDEwMDY0NFxcbi0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdFxcbisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdFxcbkBAIC05NCw2ICs5NCw3IEBAIHBhcmFtZXRlcnMsIGluZm8gdmVyc2lvbnMsIGFuZCBvdGhlciBmZWF0dXJlcyBpdCBzdXBwb3J0cy5cXG4gICAgbWx4NVxcbiAgICBtbHhzd1xcbiAgICBtdjg4ZTZ4eHhcXG4rICAgbXhsODYyeHhcXG4gICAgbmV0ZGV2c2ltXFxuICAgIG5mcFxcbiAgICBvY3Rlb250eDJcXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RldmxpbmsvbXhsODYyeHgucnN0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RldmxpbmsvbXhsODYyeHgucnN0XFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi41YjI0ZDhjYjU3YmM5XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL214bDg2Mnh4LnJzdFxcbkBAIC0wLDAgKzEsNzQgQEBcXG4rLi4gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKz09PT09PT09PT09PT09PT09PT09PT09PVxcbitteGw4NjJ4eCBkZXZsaW5rIHN1cHBvcnRcXG4rPT09PT09PT09PT09PT09PT09PT09PT09XFxuK1xcbitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgZGV2bGluayBmZWF0dXJlcyBpbXBsZW1lbnRlZCBieSB0aGVcXG4rYGBteGw4NjJ4eGBgIGRldmljZSBkcml2ZXIuXFxuK1xcbitJbmZvIHZlcnNpb25zXFxuKz09PT09PT09PT09PT1cXG4rXFxuK1RoZSBgYG14bDg2Mnh4YGAgZHJpdmVyIHJlcG9ydHMgdGhlIGZvbGxvd2luZyB2ZXJzaW9uc1xcbitcXG4rLi4gbGlzdC10YWJsZTo6IGRldmxpbmsgaW5mbyB2ZXJzaW9ucyBpbXBsZW1lbnRlZFxcbisgICA6d2lkdGhzOiA1IDUgNSA4NVxcbitcXG4rICAgKiAtIE5hbWVcXG4rICAgICAtIFR5cGVcXG4rICAgICAtIEV4YW1wbGVcXG4rICAgICAtIERlc2NyaXB0aW9uXFxuKyAgICogLSBgYGFzaWMuaWRgYFxcbisgICAgIC0gZml4ZWRcXG4rICAgICAtIDg2MjhcXG4rICAgICAtIFRoZSBjaGlwIHBhcnQgbnVtYmVyIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMuIE9taXR0ZWRcXG4rICAgICAgIHdoZW4gdGhlIHBhcnQgbnVtYmVyIHJlYWRzIGFzIHplcm8sIHdoaWNoIGhhcHBlbnMgZm9yIGEgc3dpdGNoXFxuKyAgICAgICBzaXR0aW5nIGluIE1DVWJvb3QgcmVzY3VlIG1vZGUgKHRoZSByZWdpc3RlcnMgbmVlZCBhIHJ1bm5pbmdcXG4rICAgICAgIGZpcm13YXJlKSwgZm9yIGFuIHVuZnVzZWQgcGFydCwgYW5kIGFmdGVyIGEgZmFpbGVkIGZsYXNoLlxcbisgICAqIC0gYGBhc2ljLnJldmBgXFxuKyAgICAgLSBmaXhlZFxcbisgICAgIC0gMFxcbisgICAgIC0gVGhlIGNoaXAgdmVyc2lvbiByZWFkIGZyb20gdGhlIHNhbWUgcmVnaXN0ZXIgd29yZCwgc28gaXQgaXNcXG4rICAgICAgIG9taXR0ZWQgd2hlbmV2ZXIgYGBhc2ljLmlkYGAgaXMuXFxuKyAgICogLSBgYGZ3YGBcXG4rICAgICAtIHJ1bm5pbmcsIHN0b3JlZFxcbisgICAgIC0gMS4wLjcwXFxuKyAgICAgLSBWZXJzaW9uIG9mIHRoZSBmaXJtd2FyZSBydW5uaW5nIG9uIHRoZSBzd2l0Y2gsIHJlcG9ydGVkIGFzIGJvdGhcXG4rICAgICAgIHJ1bm5pbmcgYW5kIHN0b3JlZCBzaW5jZSB0aGUgc3dpdGNoIGJvb3RzIGl0IGZyb20gaXRzIG93biBmbGFzaC5cXG4rICAgICAgIEl0IGlzIG9taXR0ZWQgd2hpbGUgbm8gZmlybXdhcmUgdmVyc2lvbiBpcyBrbm93bjogYWZ0ZXIgYSBmYWlsZWRcXG4rICAgICAgIGZsYXNoLCBhbmQgaW4gTUNVYm9vdCByZXNjdWUgbW9kZSB3aGlsZSBhbiBpbnRlcnJ1cHRlZCBkb3dubG9hZFxcbisgICAgICAgaXMgc3RpbGwgYmVpbmcgcmVjb3ZlcmVkIGluIHRoZSBiYWNrZ3JvdW5kLiBPbmNlIHRoZSBsb2FkZXIgaXNcXG4rICAgICAgIHJlYWR5IHRvIGFjY2VwdCBhIG5ldyBpbWFnZSB0aGUgdmVyc2lvbiBhcHBlYXJzIGFzIFxcXCIwLjAuMFxcXCIsXFxuKyAgICAgICB3aGljaCBubyByZWxlYXNlZCBmaXJtd2FyZSByZXBvcnRzLCBzbyB2ZXJzaW9uLWNvbXBhcmluZyB0b29sc1xcbisgICAgICAgb2ZmZXIgYW55IGF2YWlsYWJsZSByZWxlYXNlIGFzIGFuIHVwZ3JhZGUuIFVzZSBgYGRldmxpbmsgZGV2XFxuKyAgICAgICBmbGFzaGBgIHRvIHRlbGwgYSByZWNvdmVyaW5nIHN3aXRjaCBmcm9tIGEgcmVhZHkgb25lLCBzZWUgYmVsb3c7XFxuKyAgICAgICBhIG1pc3NpbmcgdmVyc2lvbiBvbiBpdHMgb3duIGRvZXMgbm90IHNheSB3aHkuXFxuK1xcbitGbGFzaCB1cGRhdGVcXG4rPT09PT09PT09PT09XFxuK1xcbitUaGUgYGBteGw4NjJ4eGBgIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIGBgZGV2bGluayBkZXYgZmxhc2hgYC5cXG4rVGhlIHNpZ25lZCBmaXJtd2FyZSBpbWFnZSBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgc3dpdGNoIG92ZXIgdGhlIHNhbWVcXG4rTURJTyBidXMgd2hpY2ggaXMgYWxzbyB1c2VkIHRvIG1hbmFnZSB0aGUgc3dpdGNoLCB0aGVuIHZlcmlmaWVkIGFuZFxcbitpbnN0YWxsZWQgYnkgdGhlIE1DVWJvb3QgYm9vdGxvYWRlciBydW5uaW5nIG9uIHRoZSBzd2l0Y2guIEFsbCBwb3J0c1xcbitvZiB0aGUgc3dpdGNoIGFyZSBjbG9zZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdXBkYXRlIGFuZCB0aGUgZHJpdmVyXFxuK3JlcHJvYmVzIHRoZSBzd2l0Y2ggYWZ0ZXIgaXQgaGFzIHJlYm9vdGVkIGludG8gdGhlIG5ldyBmaXJtd2FyZS4gQVxcbitjb21wbGV0ZSBmbGFzaCBhbmQgcmVwcm9iZSBjeWNsZSB0YWtlcyBhYm91dCBvbmUgbWludXRlLlxcbitcXG4rQSBzd2l0Y2ggc3R1Y2sgaW4gTUNVYm9vdCByZXNjdWUgbW9kZSwgZS5nLiBhZnRlciBhbiBpbnRlcnJ1cHRlZFxcbit1cGRhdGUsIGlzIHJlZ2lzdGVyZWQgd2l0aG91dCB1c2VyIHBvcnRzLiBJZiB0aGUgcHJldmlvdXMgZG93bmxvYWQgd2FzXFxuK2ludGVycnVwdGVkIG1pZC10cmFuc2ZlciB0aGUgbG9hZGVyIGlzIHdlZGdlZDsgdGhlIGRyaXZlciBkcmFpbnMgaXRcXG4rYmFjayB0byBhIGNsZWFuIHJlYWR5IHN0YXRlIGluIHRoZSBiYWNrZ3JvdW5kLCBvbmUgYnl0ZSBhdCBhIHRpbWUsXFxuK3doaWNoIHRha2VzIHRlbnMgb2YgbWludXRlcyBmb3IgYSBsYXJnZSBpbWFnZSBhbmQgaXMgcmVwb3J0ZWQgdGhyb3VnaFxcbit0aGUga2VybmVsIGxvZyBhcyBpdCBwcm9ncmVzc2VzLiBEdXJpbmcgdGhhdCByZWNvdmVyeSBgYGRldmxpbmsgZGV2XFxuK2ZsYXNoYGAgcmV0dXJucyBgYC1FQlVTWWBgIHdpdGggYW4gZXh0YWNrIG1lc3NhZ2Ugc2F5aW5nIHNvLCBhbmRcXG4rYGBkZXZsaW5rIGRldiBpbmZvYGAgcmVwb3J0cyBubyBmaXJtd2FyZSB2ZXJzaW9uLiBPbmNlIHRoZSBsb2FkZXIgaXNcXG4rcmVhZHkgdGhlIGZpcm13YXJlIHZlcnNpb24gYXBwZWFycyBhbmQgZmxhc2hpbmcgYSBmaXJtd2FyZSBpbWFnZVxcbit0aHJvdWdoIHRoZSByZWd1bGFyIHVwZGF0ZSBmbG93IHJlY292ZXJzIHRoZSBzd2l0Y2guXFxuK1xcbitJZiB0aGUgcmVjb3ZlcnkgZmFpbHMsIHRoZSBsb2FkZXIgbmVlZHMgYSBwb3dlciBjeWNsZTogYGBkZXZsaW5rIGRldlxcbitmbGFzaGBgIHRoZW4gcmV0dXJucyBgYC1FSU9gYCBhbmQgc2F5cyBzbyBpbiBpdHMgZXh0YWNrIG1lc3NhZ2UuIFRoZVxcbitkcml2ZXIgb25seSByZS1leGFtaW5lcyB0aGUgc3dpdGNoIHdoZW4gaXQgYmluZHMsIHNvIG9uIGEgYm9hcmQgd2hlcmVcXG4rdGhlIHN3aXRjaCBjYW4gYmUgcG93ZXIgY3ljbGVkIG9uIGl0cyBvd24sIHVuYmluZCBhbmQgcmViaW5kIHRoZSBkcml2ZXJcXG4rYWZ0ZXJ3YXJkcyB0byBoYXZlIHRoZSByZWNvdmVyZWQgc3dpdGNoIHJlY29nbmlzZWQuXFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcXG5pbmRleCA5OTE0NjAwNTBkYTc0Li5lM2Y3ZGVkNTY5YmY3IDEwMDY0NFxcbi0tLSBhL01BSU5UQUlORVJTXFxuKysrIGIvTUFJTlRBSU5FUlNcXG5AQCAtMTYxMDYsNiArMTYxMDYsNyBAQCBNOlxcdERhbmllbCBHb2xsZSBcXHUwMDNjZGFuaWVsQG1ha3JvdG9waWEub3JnXFx1MDAzZVxcbiBMOlxcdG5ldGRldkB2Z2VyLmtlcm5lbC5vcmdcXG4gUzpcXHRNYWludGFpbmVkXFxuIEY6XFx0RG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9kc2EvbWF4bGluZWFyLG14bDg2Mnh4LnlhbWxcXG4rRjpcXHREb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3RcXG4gRjpcXHRkcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvXFxuIEY6XFx0bmV0L2RzYS90YWdfbXhsODYyeHguY1xcbiBcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Jhc2UuaCBiL2RyaXZlcnMvYmFzZS9iYXNlLmhcXG5pbmRleCBhNWI3YWJjMTBmZjAyLi42MjM0ZTM3ZGU3ZTk5IDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvYmFzZS9iYXNlLmhcXG4rKysgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oXFxuQEAgLTEwNiw2ICsxMDYsMTAgQEAgc3RydWN0IGRyaXZlcl9wcml2YXRlIHtcXG4gICogQGRlYWQ6IFRoaXMgZGV2aWNlIGlzIGN1cnJlbnRseSBlaXRoZXIgaW4gdGhlIHByb2Nlc3Mgb2Ygb3IgaGFzIGJlZW5cXG4gICpcXHQgIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLiBBbnkgYXN5bmNocm9ub3VzIGV2ZW50cyBzY2hlZHVsZWQgZm9yIHRoaXNcXG4gICpcXHQgIGRldmljZSBzaG91bGQgZXhpdCB3aXRob3V0IHRha2luZyBhbnkgYWN0aW9uLlxcbisgKiBAc2h1dGRvd25fZG9uZTogU2V0IG9uY2UgZGV2aWNlX3NodXRkb3duKCkgaGFzIHJlYWNoZWQgdGhpcyBkZXZpY2UsIHVuZGVyXFxuKyAqXFx0ICB0aGUgZGV2aWNlIGxvY2ssIGJlZm9yZSBhbnkgc2h1dGRvd24gY2FsbGJhY2sgcnVucy4gUmVhZCB1bmRlciB0aGVcXG4rICpcXHQgIGRldmljZSBsb2NrLiBBIGRlZmVycmVkIHJlLXByb2JlIHNjaGVkdWxlZCB3aXRoXFxuKyAqXFx0ICBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSgpIG11c3Qgbm90IGRldGFjaCB0aGUgZGV2aWNlIGFueW1vcmUuXFxuICAqXFxuICAqIE5vdGhpbmcgb3V0c2lkZSBvZiB0aGUgZHJpdmVyIGNvcmUgc2hvdWxkIGV2ZXIgdG91Y2ggdGhlc2UgZmllbGRzLlxcbiAgKi9cXG5AQCAtMTIwLDYgKzEyNCw3IEBAIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSB7XFxuIFxcdGNoYXIgKmRlZmVycmVkX3Byb2JlX3JlYXNvbjtcXG4gXFx0c3RydWN0IGRldmljZSAqZGV2aWNlO1xcbiBcXHR1OCBkZWFkOjE7XFxuK1xcdHU4IHNodXRkb3duX2RvbmU6MTtcXG4gfTtcXG4gI2RlZmluZSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQob2JqKVxcdFxcXFxcXG4gXFx0Y29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9wYXJlbnQpXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jXFxuaW5kZXggNGQwMjY2ODI5NDRmMi4uOGE3ZGJlNGU4MzYyYiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jXFxuKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuY1xcbkBAIC00OTA2LDYgKzQ5MDYsOSBAQCB2b2lkIGRldmljZV9zaHV0ZG93bih2b2lkKVxcbiBcXHRcXHRcXHRkZXZpY2VfbG9jayhwYXJlbnQpO1xcbiBcXHRcXHRkZXZpY2VfbG9jayhkZXYpO1xcbiBcXG4rXFx0XFx0aWYgKGRldi1cXHUwMDNlcClcXG4rXFx0XFx0XFx0ZGV2LVxcdTAwM2VwLVxcdTAwM2VzaHV0ZG93bl9kb25lID0gdHJ1ZTtcXG4rXFxuIFxcdFxcdC8qIERvbid0IGFsbG93IGFueSBtb3JlIHJ1bnRpbWUgc3VzcGVuZHMgKi9cXG4gXFx0XFx0cG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTtcXG4gXFx0XFx0cG1fcnVudGltZV9iYXJyaWVyKGRldik7XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmNcXG5pbmRleCA2MGMwMDUyMjM4NDRkLi5iYjhiMzRhY2RlMDBkIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jXFxuKysrIGIvZHJpdmVycy9iYXNlL2RkLmNcXG5AQCAtMTQzNiwzICsxNDM2LDg1IEBAIHZvaWQgZHJpdmVyX2RldGFjaChjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KVxcbiBcXHRcXHRwdXRfZGV2aWNlKGRldik7XFxuIFxcdH1cXG4gfVxcbitcXG4rc3RydWN0IGRldmljZV9yZXByb2JlIHtcXG4rXFx0c3RydWN0IGRlbGF5ZWRfd29yayB3b3JrO1xcbitcXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XFxuK1xcdGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7XFxuK307XFxuK1xcbitzdGF0aWMgdm9pZCBkZXZpY2VfcmVwcm9iZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHRzdHJ1Y3QgZGV2aWNlX3JlcHJvYmUgKnJwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZXZpY2VfcmVwcm9iZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHdvcmsud29yayk7XFxuK1xcdHN0cnVjdCBkZXZpY2UgKmRldiA9IHJwLVxcdTAwM2VkZXY7XFxuK1xcdHN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGRldi1cXHUwMDNlcGFyZW50O1xcbitcXHRib29sIGRldGFjaGVkID0gZmFsc2U7XFxuK1xcbitcXHRfX2RldmljZV9kcml2ZXJfbG9jayhkZXYsIHBhcmVudCk7XFxuK1xcdC8qXFxuK1xcdCAqIHJwLVxcdTAwM2VkcnYgaXMgb25seSBldmVyIGNvbXBhcmVkLCBuZXZlciBkZXJlZmVyZW5jZWQ6IHRoZSBkcml2ZXIgaXRcXG4rXFx0ICogcG9pbnRzIHRvIG1heSBoYXZlIGJlZW4gdW5yZWdpc3RlcmVkIGFuZCBmcmVlZCBieSBub3cuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWRldi1cXHUwMDNlcC1cXHUwMDNlZGVhZCBcXHUwMDI2XFx1MDAyNiAhZGV2LVxcdTAwM2VwLVxcdTAwM2VzaHV0ZG93bl9kb25lIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBkZXYtXFx1MDAzZWRyaXZlciBcXHUwMDI2XFx1MDAyNiBkZXYtXFx1MDAzZWRyaXZlciA9PSBycC1cXHUwMDNlZHJ2KSB7XFxuK1xcdFxcdF9fZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldiwgcGFyZW50KTtcXG4rXFx0XFx0ZGV0YWNoZWQgPSB0cnVlO1xcbitcXHR9XFxuK1xcdF9fZGV2aWNlX2RyaXZlcl91bmxvY2soZGV2LCBwYXJlbnQpO1xcbitcXG4rXFx0aWYgKGRldGFjaGVkIFxcdTAwMjZcXHUwMDI2IGRldmljZV9hdHRhY2goZGV2KSBcXHUwMDNjIDApXFxuK1xcdFxcdGRldl9lcnIoZGV2LCBcXFwicmUtcHJvYmUgZmFpbGVkLCBkZXZpY2UgbGVmdCB1bmJvdW5kXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHB1dF9kZXZpY2UoZGV2KTtcXG4rXFx0a2ZyZWUocnApO1xcbit9XFxuK1xcbisvKipcXG4rICogZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUgLSBzY2hlZHVsZSBhIGRlZmVycmVkIGRldGFjaCBhbmQgcmUtcHJvYmVcXG4rICogQGRldjogZGV2aWNlIHRvIGRldGFjaCBhbmQgcmUtcHJvYmVcXG4rICogQGRlbGF5X21zOiBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSByZS1wcm9iZSBydW5zXFxuKyAqXFxuKyAqIFNjaGVkdWxlIGEgZGV0YWNoIGFuZCByZS1wcm9iZSBvZiBAZGV2IGFmdGVyIEBkZWxheV9tcyBtaWxsaXNlY29uZHMuXFxuKyAqIFRoZSByZS1wcm9iZSBpcyBza2lwcGVkIGlmLCBieSB0aGUgdGltZSB0aGUgc2NoZWR1bGVkIHdvcmsgcnVucywgdGhlXFxuKyAqIGRldmljZSBoYXMgYmVlbiByZW1vdmVkLCB0aGUgc3lzdGVtIHNodXRkb3duIHNlcXVlbmNlIGhhcyByZWFjaGVkIHRoZVxcbisgKiBkZXZpY2UsIG9yIEBkZXYgaXMgbm8gbG9uZ2VyIGJvdW5kIHRvIHRoZSBkcml2ZXIgdGhhdCB3YXMgYm91bmQgYXRcXG4rICogc2NoZWR1bGluZyB0aW1lLiBJbiBwYXJ0aWN1bGFyIGFuIGFkbWluaXN0cmF0aXZlIHVuYmluZCBpcyBuZXZlclxcbisgKiB1bmRvbmUgYnkgYSBzdGFsZSByZS1wcm9iZS5cXG4rICpcXG4rICogVGhlIHdvcmsgZnVuY3Rpb24gaXMgYnVpbHQtaW4gdGV4dCwgc28gdGhlIGJvdW5kIGRyaXZlciBtYXkgY2FsbCB0aGlzXFxuKyAqIGZyb20gaXRzIG93biBjb2RlIHdpdGhvdXQgaG9sZGluZyBhIG1vZHVsZSByZWZlcmVuY2UuIElmIHRoZSBkcml2ZXJcXG4rICogbW9kdWxlIGlzIHVubG9hZGVkIGJlZm9yZSB0aGUgd29yayBydW5zLCBkcml2ZXIgdW5yZWdpc3RyYXRpb24gdW5iaW5kc1xcbisgKiBAZGV2IGZpcnN0IGFuZCB0aGUgc2NoZWR1bGVkIHdvcmsgZG9lcyBub3RoaW5nLlxcbisgKlxcbisgKiBNdWx0aXBsZSBwZW5kaW5nIHJlLXByb2JlcyBmb3IgdGhlIHNhbWUgZGV2aWNlIGFyZSBpbmRpdmlkdWFsbHkgc2FmZTtcXG4rICogYSBjYWxsZXIgdGhhdCB3YW50cyBhdCBtb3N0IG9uZSBwZW5kaW5nIHJlLXByb2JlIG11c3QgZ2F0ZSBzY2hlZHVsaW5nXFxuKyAqIGl0c2VsZi5cXG4rICpcXG4rICogTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0LlxcbisgKlxcbisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgQGRldiBpcyBub3QgYSByZWdpc3RlcmVkIGRldmljZVxcbisgKiBib3VuZCB0byBhIGRyaXZlciwgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXFxuKyAqL1xcbitpbnQgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpXFxuK3tcXG4rXFx0c3RydWN0IGRldmljZV9yZXByb2JlICpycDtcXG4rXFxuK1xcdGlmICghZGV2LVxcdTAwM2VidXMgfHwgIWRldi1cXHUwMDNlcCB8fCAhZGV2aWNlX2lzX3JlZ2lzdGVyZWQoZGV2KSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdGlmICghZGV2LVxcdTAwM2Vkcml2ZXIpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0cnAgPSBremFsbG9jX29iaigqcnApO1xcbitcXHRpZiAoIXJwKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdHJwLVxcdTAwM2VkZXYgPSBnZXRfZGV2aWNlKGRldik7XFxuK1xcdHJwLVxcdTAwM2VkcnYgPSBSRUFEX09OQ0UoZGV2LVxcdTAwM2Vkcml2ZXIpO1xcbitcXHRJTklUX0RFTEFZRURfV09SSyhcXHUwMDI2cnAtXFx1MDAzZXdvcmssIGRldmljZV9yZXByb2JlX3dvcmtfZm4pO1xcbitcXHRxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX2RmbF93cSwgXFx1MDAyNnJwLVxcdTAwM2V3b3JrLFxcbitcXHRcXHRcXHQgICBtc2Vjc190b19qaWZmaWVzKGRlbGF5X21zKSk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSk7XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZVxcbmluZGV4IGE3YmUwZTY2NjlkZmEuLmJjY2FjMGQwZjcwM2YgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L01ha2VmaWxlXFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L01ha2VmaWxlXFxuQEAgLTEsMyArMSwzIEBAXFxuICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gb2JqLSQoQ09ORklHX05FVF9EU0FfTVhMODYyKSArPSBteGw4NjJ4eF9kc2Eub1xcbi1teGw4NjJ4eF9kc2EteSA6PSBteGw4NjJ4eC5vIG14bDg2Mnh4LWhvc3QubyBteGw4NjJ4eC1waHlsaW5rLm9cXG4rbXhsODYyeHhfZHNhLXkgOj0gbXhsODYyeHgubyBteGw4NjJ4eC1ob3N0Lm8gbXhsODYyeHgtcGh5bGluay5vIG14bDg2Mnh4LWZ3Lm9cXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oXFxuaW5kZXggYTE4MGE1ZGVjZmZjMC4uNmY3NzE4OTU5ODRjYiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtYXBpLmhcXG4rKysgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtYXBpLmhcXG5AQCAtMTIyNCw2ICsxMjI0LDE2IEBAIHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB7XFxuIFxcdF9fbGUzMiBpdl9idWlsZF9udW07XFxuIH0gX19wYWNrZWQ7XFxuIFxcbisvKipcXG4rICogc3RydWN0IG14bDg2Mnh4X3N5c19yZWdfcncgLSBTeXN0ZW0gcmVnaXN0ZXIgcmVhZC93cml0ZVxcbisgKiBAYWRkcjogMzItYml0IHJlZ2lzdGVyIGFkZHJlc3NcXG4rICogQHZhbDogcmVnaXN0ZXIgdmFsdWVcXG4rICovXFxuK3N0cnVjdCBteGw4NjJ4eF9zeXNfcmVnX3J3IHtcXG4rXFx0X19sZTMyIGFkZHI7XFxuK1xcdF9fbGUzMiB2YWw7XFxuK30gX19wYWNrZWQ7XFxuK1xcbiAvKipcXG4gICogZW51bSBteGw4NjJ4eF9wb3J0X3R5cGUgLSBQb3J0IFR5cGVcXG4gICogQE1YTDg2MlhYX0xPR0lDQUxfUE9SVDogTG9naWNhbCBQb3J0XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1jbWQuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1jbWQuaFxcbmluZGV4IGM4N2E5NTVjMTNjNDguLmE4NjU0MjVhYTYxZTEgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oXFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oXFxuQEAgLTcwLDcgKzcwLDkgQEBcXG4gI2RlZmluZSBJTlRfR1BIWV9SRUFEXFx0XFx0XFx0KEdQWV9HUFkyWFhfTUFHSUMgKyAweDEpXFxuICNkZWZpbmUgSU5UX0dQSFlfV1JJVEVcXHRcXHRcXHQoR1BZX0dQWTJYWF9NQUdJQyArIDB4MilcXG4gXFxuKyNkZWZpbmUgU1lTX01JU0NfRldfVVBEQVRFXFx0XFx0KFNZU19NSVNDX01BR0lDICsgMHgxKVxcbiAjZGVmaW5lIFNZU19NSVNDX0ZXX1ZFUlNJT05cXHRcXHQoU1lTX01JU0NfTUFHSUMgKyAweDIpXFxuKyNkZWZpbmUgU1lTX01JU0NfUkVHX1JEXFx0XFx0XFx0KFNZU19NSVNDX01BR0lDICsgMHg4KVxcbiBcXG4gI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19DT05GSUdcXHQoTVhMODYyWFhfWFBDU19NQUdJQyArIDB4MSlcXG4gI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19HRVRfU1RBVEVcXHQoTVhMODYyWFhfWFBDU19NQUdJQyArIDB4MilcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjZlMDM3ZDk1NjQwYlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuY1xcbkBAIC0wLDAgKzEsMTA1NCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxcbisvKlxcbisgKiBGaXJtd2FyZSBmbGFzaCBhbmQgZGV2bGluayBzdXBwb3J0IGZvciBNYXhMaW5lYXIgTXhMODYyeHhcXG4rICpcXG4rICogQ29weXJpZ2h0IChDKSAyMDI1IERhbmllbCBHb2xsZSBcXHUwMDNjZGFuaWVsQG1ha3JvdG9waWEub3JnXFx1MDAzZVxcbisgKlxcbisgKiBTQiBQREkgLSBmaXJtd2FyZSBkb3dubG9hZCBpbnRlcmZhY2Ugb3ZlciBjbGF1c2UtMjIgU01ESU9cXG4rICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuKyAqXFxuKyAqIFRoZSBNeEw4NjJ4eCBNQ1Vib290IGxvYWRlciBhY2NlcHRzIGEgZmlybXdhcmUgaW1hZ2UgdGhyb3VnaCBmb3VyIFxcXCJTQiBQRElcXFwiXFxuKyAqIHJlZ2lzdGVycyBpbiB0aGUgc3dpdGNoIFNNRElPIHJlZ2lzdGVyIHNwYWNlLiBJdCBydW5zIHdoZW5ldmVyIG5vIFdTUFxcbisgKiBmaXJtd2FyZSBpcyBhY3RpdmU6IHRoZSBub3JtYWwgZmlybXdhcmUgdXBkYXRlIGVudGVycyBpdCBkZWxpYmVyYXRlbHkgLSB0aGVcXG4rICogU1lTX01JU0NfRldfVVBEQVRFIEFQSSBjb21tYW5kIHNldHMgYSBzdGlja3kgcmVzY3VlIGJpdCBhbmQgcmVib290cyBpbnRvXFxuKyAqIE1DVWJvb3QgLSBhbmQgdGhlIGxvYWRlciBhbHNvIHN0YXlzIGhlcmUgd2hlbiB0aGUgc3RvcmVkIFdTUCBmaXJtd2FyZSBmYWlsc1xcbisgKiBpdHMgYm9vdC10aW1lIGludGVncml0eSBjaGVjay4gVGhpcyBkcml2ZXIgZHJpdmVzIHRoZSBsb2FkZXIncyAweGM1NWNcXG4rICogXFxcImNvbnNvbGVcXFwiIGRvd25sb2FkIHBhdGguXFxuKyAqXFxuKyAqIFNNRElPIHJlZ2lzdGVyIGFjY2VzcyAobXhsODYyeHhfc21kaW9fcmVhZC93cml0ZSk6XFxuKyAqICAgTUlJIHJlZyAweDFmIDo9IChcXHUwMDNjc2JfcGRpX3JlZ1xcdTAwM2UgXFx1MDAyNiAweGZmZjApICAgOyBwYWdlIGxhdGNoXFxuKyAqICAgTUlJIHJlZyAoXFx1MDAzY3NiX3BkaV9yZWdcXHUwMDNlIFxcdTAwMjYgMHgwMDBmKSA6PSAvID1cXHUwMDNlIFxcdTAwM2N1MTYgZGF0YVxcdTAwM2VcXG4rICogc28gQ1RSTC9BRERSL0RBVEEvU1RBVCAoMHhlMTAwLi4weGUxMDMpIGFyZSBNSUkgcmVncyAwLzEvMi8zIG9mIHBhZ2VcXG4rICogMHhlMTAwLCBub3QgYWxsIHJlZyAweDAwLlxcbisgKlxcbisgKiBTQiBQREkgcmVnaXN0ZXJzIChob3N0IG5hbWUvYWRkciAgLVxcdTAwM2UgIE1DVSBtYWlsYm94KTpcXG4rICogICBDVFJMIDB4ZTEwMCAtXFx1MDAzZSAweGMwOTM4NDAwICAgbW9kZTogUlNUPTB4MDAgIFJEPTB4MDEgIFdSPTB4MDJcXG4rICogICBBRERSIDB4ZTEwMSAtXFx1MDAzZSAweGMwOTM4NDA0ICAgU0IgdGFyZ2V0IHdvcmQgYWRkcmVzcyAoU0IxIGJhbmsgPSAweDc4MDApXFxuKyAqICAgREFUQSAweGUxMDIgLVxcdTAwM2UgMHhjMDkzODQwOCAgIDE2LWJpdCBkYXRhIC8gcmVwbHkgd29yZFxcbisgKiAgIFNUQVQgMHhlMTAzIC1cXHUwMDNlIDB4YzA5Mzg0MGMgICBoYW5kc2hha2U6IGEgbWFnaWMgKGJlbG93KSBvciBhIGJ5dGUgY291bnRcXG4rICpcXG4rICogU1RBVCBtYWdpY3M6XFxuKyAqICAgUkVBRFkgIDB4YzU1YyAgIGxvYWRlciBpZGxlIGluIHRoZSBjb25zb2xlIGxvb3AgICAgICAgICh0aGlzIGRyaXZlcilcXG4rICogICBETF9SRFkgMHhjMzNjICAgbG9hZGVyIGlkbGUgaW4gdGhlIGZsYXNobGVzcyBsb29wXFxuKyAqICAgU1RBUlQgIDB4ZjQ4ZiAgIGhvc3QgICAtXFx1MDAzZSBiZWdpbiBkb3dubG9hZCBzZXNzaW9uXFxuKyAqICAgQUNLICAgIDB4ZjQ5MCAgIGxvYWRlciAtXFx1MDAzZSBTVEFSVCBhY2tub3dsZWRnZWQgKFNUQVJUICsgMSlcXG4rICogICBFTkQgICAgMHgzY2MzICAgaG9zdCAgIC1cXHUwMDNlIGZpbmFsaXNlIG5vdyAob3B0aW9uYWwsIHNlZSBiZWxvdylcXG4rICogICBSRFJFRyAgMHhlMmMwICAgaG9zdCAgIC1cXHUwMDNlIHJlZ2lzdGVyLXJlYWQgY29tbWFuZCAofCBpbmRleCksIHNlZSBiZWxvd1xcbisgKlxcbisgKiBDb25zb2xlIGZsYXNoIHBhdGggKFNUQVQ9MHhjNTVjKSAtIG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKCk6XFxuKyAqXFxuKyAqICAgaG9zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyXFxuKyAqICAgLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tXFxuKyAqICAgcmVzZXQgKENUUkw9QUREUj1EQVRBPTApXFxuKyAqICAgcmVhZCBTVEFUIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMHhjNTVjICAgKFJFQURZLCBpZGxlKVxcbisgKiAgIFNUQVQgOj0gU1RBUlQoMHhmNDhmKSAgLS0tLS0tLS0tLS0tLS1cXHUwMDNlXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBcXHUwMDNjLS0tLS0tLS0tLS0tLS0gU1RBVCA9IDB4ZjQ5MCAoQUNLKVxcbisgKiAgIENUUkwgOj0gV1JcXG4rICogICBEQVRBIDo9IGhkclswLi45XSAgKDIwLWJ5dGUgaGVhZGVyOiB0eXBlLHNpemUxLGNyYzEsc2l6ZTIsY3JjMilcXG4rICogICByZXNldDsgU1RBVCA6PSAyMCAoaGVhZGVyIGxlbikgIC0tLS0tXFx1MDAzZSBwYXJzZSBoZHI7IHJfcmVtYWluPXNpemUxK3NpemUyO1xcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSQVNFIHRhcmdldCByZWdpb24ocylcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgIFxcdTAwM2MtLS0tLS0tLS0tLS0tLSBTVEFUPTIxIChsZW4rMSksIHRoZW4gU1RBVD0wXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVyYXNlZClcXG4rICogICAtLSBwYXlsb2FkLCBzdHJlYW1lZCBpbiBzbGljZXM6IC0tXFxuKyAqICAgQ1RSTCA6PSBXUlxcbisgKiAgIERBVEEgOj0gd29yZCB4IE4gLi4uXFxuKyAqICAgICBhdCB3b3JkIDE2Mzg0OiBDVFJMOj1SU1Q7IEFERFI6PTB4NzgwMDsgQ1RSTDo9V1IgIChoYWxmLWJhbmsgLVxcdTAwM2UgU0IxKVxcbisgKiAgICAgYXQgd29yZCAzMjc2MDogZmx1c2ggc2xpY2U6XFxuKyAqICAgICAgICByZXNldDsgU1RBVCA6PSBcXHUwMDNjYnl0ZXNfdGhpc19zbGljZVxcdTAwM2UgLS0tXFx1MDAzZSByX3JlbWFpbiAtPSBieXRlczsgcHJvZ3JhbVxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXFx1MDAzYy0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBVD0wICAocmVhZHkgZm9yIG5leHQgc2xpY2UpXFxuKyAqICAgLi4uIHJlcGVhdCB1bnRpbCB0aGUgd2hvbGUgcGF5bG9hZCBpcyBzZW50IC4uLlxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXFx1MDAzYy0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBVD0wICBpbWFnZSB2ZXJpZmllZFxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNUQVQ9MTogaW1hZ2UgcmVqZWN0ZWQpXFxuKyAqICAgU1RBVCA6PSBFTkQoMHgzY2MzKSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFx1MDAzZSBmaW5hbGlzZSBhbmQgYm9vdFxcbisgKlxcbisgKiBUaGUgcl9yZW1haW4gPT0gMCBydWxlIChjcml0aWNhbCk6XFxuKyAqICAgRXZlcnkgaG9zdCBTVEFUIHdyaXRlIGluIHRoZSBwYXlsb2FkIHBoYXNlIGlzIGEgYnl0ZSBjb3VudDsgdGhlIGxvYWRlclxcbisgKiAgIGRvZXMgcl9yZW1haW4gLT0gY291bnQgYW5kIHN0YXlzIGluIHRoZSByZWNlaXZlIGxvb3Agd2hpbGUgcl9yZW1haW4gIT0gMC5cXG4rICogICBJdCBsZWF2ZXMgdGhlIGxvb3AgT05MWSB3aGVuIHJfcmVtYWluIGhpdHMgRVhBQ1RMWSAwLCBhbmQgYSBjb3VudCBsYXJnZXJcXG4rICogICB0aGFuIHJfcmVtYWluIHVuZGVyZmxvd3MgdGhlIDMyLWJpdCBjb3VudGVyIGFuZCB3ZWRnZXMgdGhlIGxvYWRlciB1bnRpbCBhXFxuKyAqICAgcG93ZXIgY3ljbGUuIEhhdmluZyBsZWZ0IGl0LCB0aGUgbG9hZGVyIHZlcmlmaWVzIHRoZSBpbWFnZSwgcHVibGlzaGVzIHRoZVxcbisgKiAgIHZlcmRpY3QgaW4gU1RBVCAoMCBnb29kLCAxIHJlamVjdGVkKSBhbmQgd2FpdHMgMiBzIGZvciBFTkQgYmVmb3JlXFxuKyAqICAgZmluYWxpc2luZyByZWdhcmRsZXNzIC0tIGNsZWFyaW5nIGl0cyByZXNjdWUtZW5hYmxlIGJpdCBzbyBib290X2dvIGJvb3RzXFxuKyAqICAgdGhlIG5ldyBpbWFnZSAtLSBzbyBFTkQgb25seSBzYXZlcyB0aGF0IHdhaXQuIEhlbmNlOlxcbisgKiAgICAgLSBuZXZlciBzZW5kIGEgc2xpY2UvY2h1bmsgY291bnQgbGFyZ2VyIHRoYW4gd2hhdCBpcyBvdXRzdGFuZGluZztcXG4rICogICAgIC0gYSBTVEFUIHdyaXRlIGlzIGEgY29tbWFuZCBvbmx5IG9uY2UgdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgbG9vcDtcXG4rICogICAgIC0gdGhlIGxvYWRlciBsZWF2ZXMgdGhlIGNvdW50IGluIFNUQVQgd2hpbGUgaXQgcHJvZ3JhbXMgdGhlIGNodW5rLCBzb1xcbisgKiAgICAgICBhIGxpbmdlcmluZyBjb3VudCBkb2VzIG5vdCBkaXN0aW5ndWlzaCBcXFwiYnVzeVxcXCIgZnJvbSBcXFwidmVyZGljdFxcXCI7XFxuKyAqICAgICAtIGludGVycnVwdGVkLWRvd25sb2FkIHJlY292ZXJ5IGZlZWRzIDEgYnl0ZSBhdCBhIHRpbWUgKHNlZSBiZWxvdykuXFxuKyAqXFxuKyAqIEludGVycnVwdGVkLWZsYXNoIHJlY292ZXJ5IChteGw4NjJ4eF9yZXNjdWVfZHJhaW4pOlxcbisgKiAgIEEgaG9zdCB0aGF0IGRpZXMgbWlkLXBheWxvYWQgbGVhdmVzIHRoZSBsb2FkZXIgaW4gdGhlIHJlY2VpdmUgbG9vcCBob2xkaW5nXFxuKyAqICAgU1RBVD0wLiBGZWVkIHNpbmdsZSAxLWJ5dGUgY2h1bmtzIChvbmUgREFUQSB3b3JkICsgU1RBVD0xKSB1bnRpbCByX3JlbWFpblxcbisgKiAgIHJlYWNoZXMgMDsgdGhlIGxvYWRlciB0aGVuIHZlcmlmaWVzIHRoZSAobm93IGNvcnJ1cHQpIGltYWdlLCBwdWJsaXNoZXMgaXRzXFxuKyAqICAgdmVyZGljdCBhbmQgY29tZXMgYmFjayB0byBSRUFEWSBieSBpdHNlbGYuIEVORCBpcyBuZXZlciBzZW50IGhlcmU6IHdoaWxlXFxuKyAqICAgcl9yZW1haW4gaXMgbm9uLXplcm8gaXQgd291bGQgYmUgY29uc3VtZWQgYXMgYSAxNTU1NS1ieXRlIGNvdW50LCBhbmQgYVxcbisgKiAgIGxpbmdlcmluZyBTVEFUPTEgY2Fubm90IGJlIHRvbGQgZnJvbSBhIGNodW5rIHN0aWxsIGJlaW5nIHByb2dyYW1tZWQuXFxuKyAqXFxuKyAqIFJlZ2lzdGVyLXJlYWQgY2hhbGxlbmdlIChub24tZGVzdHJ1Y3RpdmUgbGl2ZW5lc3MgcHJvb2YpOlxcbisgKiAgIERBVEEgOj0gMHg3YzIzIChtYXJrZXIpOyBTVEFUIDo9IDB4ZTJjMHxpZHhcXG4rICogICAgIC1cXHUwMDNlIGxvYWRlciByZXR1cm5zIGEgcnVudGltZSB3b3JkIGluIERBVEEgYW5kIHJlLWFybXMgU1RBVD0weGM1NWMuXFxuKyAqICAgVGhlIHJlcGx5IHNvdXJjZSBpcyBsb2FkZXIgQlNTLCBub3QgYSBjaGlwIGlkOyB1c2VkIG9ubHkgdG8gcHJvdmUgYSBsaXZlXFxuKyAqICAgbWFpbGJveCBpbiBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QoKS5cXG4rICpcXG4rICogVGhlIG90aGVyIFNUQVQgcmVhZHkgbWFnaWMsIDB4YzMzYywgbWFya3MgdGhlIGxvYWRlcidzIGZsYXNobGVzc1xcbisgKiBjaGlwLXRvLWNoaXAgZG93bmxvYWQgbW9kZSAoTXhMODYyODFTIDE2LXBvcnQgdGllcik7IHRoaXMgZHJpdmVyIGRvZXMgbm90XFxuKyAqIHVzZSBpdC5cXG4rICpcXG4rICogUmVzY3VlIGxpZmVjeWNsZSAoZGV2bGluayk6IHByb2JlIHJ1bnMgbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KCk7IGFcXG4rICogd2VkZ2VkIGxvYWRlciBpcyBkcmFpbmVkIGJhY2sgdG8gUkVBRFkgYnkgYSBiYWNrZ3JvdW5kIHNlbGYtaGVhbFxcbisgKiAocmVzY3VlX2hlYWxfd29yayksIHNvIHRoZSBsb25nIHJlY292ZXJ5IG5ldmVyIGhvbGRzIHRoZSBkZXZsaW5rIGxvY2suXFxuKyAqIGRldmxpbmsgZGV2IGluZm8gZXhwb3NlcyB0aGUgZncgdmVyc2lvbiAodGhlIFxcXCJmbGFzaGFibGVcXFwiIHNpZ25hbCkgb25seSBvbmNlIGF0XFxuKyAqIFJFQURZOyBmbGFzaF91cGRhdGUgcmV0dXJucyAtRUJVU1kgdW50aWwgdGhlbiwgYW5kIHJlcHJvYmVzIHRvIFdTUCBmaXJtd2FyZVxcbisgKiBvbiBzdWNjZXNzLlxcbisgKlxcbisgKiBOb3RlczpcXG4rICogICAtIENoaXAgaWQvcmV2aXNpb24gKDB4YzBkMjg4ODQvODgpIGFyZSBOT1QgcmVhY2hhYmxlIG9uIHRoaXMgY2hhbm5lbDsgdGhleVxcbisgKiAgICAgbmVlZCB0aGUgY2xhdXNlLTQ1IE1NRCBmaXJtd2FyZSBtYWlsYm94LCB3aGljaCBpcyBkZWFkIHVuZGVyIE1DVWJvb3QuXFxuKyAqICAgICBSZXNjdWUgaWRlbnRpdHkgaXMgYnkgU0IgUERJIGJlaGF2aW91ciBvbmx5IChteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QpLlxcbisgKiAgIC0gVGhlIFNNRElPIFBIWSBhZGRyZXNzIGNvbWVzIGZyb20gdGhlIGRldmljZSB0cmVlOyB0aGUgMHhlMXh4IHJlZ2lzdGVyXFxuKyAqICAgICBvZmZzZXRzIGFyZSB0aGUgT1RQIHJlc2V0IGRlZmF1bHRzIGFuZCB0aGUgb25seSBsYXlvdXQgc3VwcG9ydGVkIGhlcmUuXFxuKyAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NyYzMyLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9kZWxheS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZGV2aWNlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pb3BvbGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25ldGRldmljZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvb3ZlcmZsb3cuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3J0bmV0bGluay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NuZXQvZHNhLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NuZXQvc3dpdGNoZGV2LmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwibXhsODYyeHguaFxcXCJcXG4rI2luY2x1ZGUgXFxcIm14bDg2Mnh4LWFwaS5oXFxcIlxcbisjaW5jbHVkZSBcXFwibXhsODYyeHgtY21kLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJteGw4NjJ4eC1mdy5oXFxcIlxcbisjaW5jbHVkZSBcXFwibXhsODYyeHgtaG9zdC5oXFxcIlxcbitcXG4rLyogU0IgUERJIHJlZ2lzdGVycyAoY2xhdXNlLTIyIFNNRElPIGFkZHJlc3Mgc3BhY2UpICovXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxcXHRcXHQweGUxMDBcXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfQUREUlxcdFxcdDB4ZTEwMVxcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9EQVRBXFx0XFx0MHhlMTAyXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1NUQVRcXHRcXHQweGUxMDNcXG4rXFxuKy8qIFNCIFBESSBDVFJMIG1vZGVzICovXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxfUlNUXFx0MHgwMFxcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSXFx0XFx0MHgwMlxcbitcXG4rLyogU0IgUERJIGhhbmRzaGFrZSBtYWdpYyAocHVibGlzaGVkL2NvbnN1bWVkIHZpYSBTVEFUKSAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9SRUFEWVxcdFxcdDB4YzU1Y1xcdC8qIGxvYWRlciBpZGxlLCBjb25zb2xlIGxvb3AgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfRExfUkVBRFlcXHQweGMzM2NcXHQvKiBsb2FkZXIgaWRsZSwgZmxhc2hsZXNzIGxvb3AgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfU1RBUlRcXHRcXHQweGY0OGZcXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfRU5EXFx0XFx0MHgzY2MzXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1JEUkVHXFx0XFx0MHhlMmMwXFx0LyogcmVnaXN0ZXItcmVhZCBjbWQgKHwgaW5kZXgpICovXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1JEUkVHX01BUktcXHQweDdjMjNcXHQvKiBtYXJrZXIgcGxhY2VkIGluIERBVEEgZm9yIFJEUkVHICovXFxuK1xcbisvKiBCZWhhdmlvdXJhbCBwcmVzZW5jZSBwcm9iZTogdHdvIGRpc3RpbmN0IDE2LWJpdCBsYXRjaGVzIG9uIEFERFIvREFUQS4gKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQVxcdFxcdDB4NWE1YVxcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9QUk9CRV9EXFx0XFx0MHhhNWE1XFxuK1xcbisvKiBJbWFnZSB2ZXJpZmljYXRpb24gdmVyZGljdCBwdWJsaXNoZWQgaW4gU1RBVCBvbmNlIHRoZSByZWNlaXZlIGxvb3AgZW5kcyAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9WRVJJRllfT0tcXHQwXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1ZFUklGWV9CQURcXHQxXFxuK1xcbisvKiBGaXJtd2FyZSB0cmFuc2ZlciBnZW9tZXRyeSAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0hEUl9TSVpFXFx0XFx0MjBcXG4rI2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX0hBTEZcXHRcXHQxNjM4NFxcdC8qIHdvcmRzIHBlciBoYWxmLWJhbmsgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX1NMSUNFXFx0XFx0MzI3NjBcXHQvKiB3b3JkcyBwZXIgZnVsbCBzbGljZSAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX1NCMV9BRERSXFx0XFx0MHg3ODAwXFx0LyogU0IxIHdvcmQgYWRkcmVzcyAqL1xcbitcXG4rLyogVGltZW91dHMgKGdlbmVyb3VzIHVwcGVyIGJvdW5kcykgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9GV19SRUFEWV9USU1FT1VUX01TXFx0MzAwMFxcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TXFx0NTAwMFxcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0VSQVNFX1RJTUVPVVRfTVNcXHQzMDAwMDBcXG4rI2RlZmluZSBNWEw4NjJYWF9GV19XUklURV9USU1FT1VUX01TXFx0NjAwMDBcXG4rI2RlZmluZSBNWEw4NjJYWF9GV19SRUJPT1RfREVMQVlfTVNcXHQ1MDAwXFxuKyNkZWZpbmUgTVhMODYyWFhfRldfUkVQUk9CRV9ERUxBWV9NU1xcdDUwMFxcbisvKiBPbmUgbG9hZGVyIG1haWxib3ggc3RlcDogcHJvZ3JhbSBhIDEtYnl0ZSBjaHVuayBvciBzZXJ2aWNlIGEgY29tbWFuZCAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TXFx0XFx0MjAwMFxcbisvKiBDb3ZlcnMgdGhlIGxvYWRlcidzIEVORCB3YWl0LCB2ZXJpZmljYXRpb24gYW5kIHRoZSByZXNldCBpbnRvIFJFQURZICovXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1ZFUklGWV9NU1xcdDE1MDAwXFxuK1xcbitzdGF0aWMgaW50IG14bDg2Mnh4X3NiX3BkaV9yZXNldChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsXFxuK1xcdFxcdFxcdFxcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsXFxuK1xcdFxcdFxcdFxcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0dXJuIG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLFxcbitcXHRcXHRcXHRcXHQgICAgTVhMODYyWFhfU0JfUERJX0NUUkxfUlNUKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MTYgZXhwZWN0ZWQsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0X21zKVxcbit7XFxuK1xcdGludCByZXQsIHZhbDtcXG4rXFxuK1xcdHJldCA9IHJlYWRfcG9sbF90aW1lb3V0KG14bDg2Mnh4X3NtZGlvX3JlYWQsIHZhbCxcXG4rXFx0XFx0XFx0XFx0dmFsIFxcdTAwM2MgMCB8fCAodTE2KXZhbCA9PSBleHBlY3RlZCxcXG4rXFx0XFx0XFx0XFx0MTAwMDAsIHRpbWVvdXRfbXMgKiAxMDAwLCBmYWxzZSxcXG4rXFx0XFx0XFx0XFx0cHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQpO1xcbitcXHRpZiAodmFsIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIHZhbDtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2Uoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1MzIgZGF0YV93cml0dGVuKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsIGRhdGFfd3JpdHRlbik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0dXJuIG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgMCxcXG4rXFx0XFx0XFx0XFx0XFx0IE1YTDg2MlhYX0ZXX1dSSVRFX1RJTUVPVVRfTVMpO1xcbit9XFxuK1xcbisvKiBGbHVzaCB0aGUgbGFzdCBzbGljZSwgd2hpY2ggZW5kcyB0aGUgcmVjZWl2ZSBsb29wOiB0aGUgbG9hZGVyIHZlcmlmaWVzIHRoZVxcbisgKiBpbWFnZSBhbmQgcmVwbGFjZXMgdGhlIGNvdW50IGluIFNUQVQgd2l0aCBpdHMgdmVyZGljdCwgc28gd2FpdCBmb3IgdGhlIGNvdW50XFxuKyAqIHRvIGdvIHJhdGhlciB0aGFuIGZvciBhIGZpeGVkIHZhbHVlLlxcbisgKi9cXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfbGFzdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcXG4rXFx0XFx0XFx0XFx0ICAgICAgdTMyIGRhdGFfd3JpdHRlbilcXG4re1xcbitcXHRpbnQgcmV0LCB2YWw7XFxuK1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsIGRhdGFfd3JpdHRlbik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gcmVhZF9wb2xsX3RpbWVvdXQobXhsODYyeHhfc21kaW9fcmVhZCwgdmFsLFxcbitcXHRcXHRcXHRcXHR2YWwgXFx1MDAzYyAwIHx8ICh1MTYpdmFsICE9ICh1MTYpZGF0YV93cml0dGVuLFxcbitcXHRcXHRcXHRcXHQxMDAwMCwgKE1YTDg2MlhYX0ZXX1dSSVRFX1RJTUVPVVRfTVMgK1xcbitcXHRcXHRcXHRcXHRcXHRNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TKSAqIDEwMDAsXFxuK1xcdFxcdFxcdFxcdGZhbHNlLCBwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XFxuK1xcdGlmICh2YWwgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gdmFsO1xcbitcXG4rXFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1ZFUklGWV9PSylcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHQvKiBBIGZpbmFsIGNvdW50IG9mIDEgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgcmVqZWN0IHZlcmRpY3QsIHNvXFxuK1xcdCAqIGEgdGltZW91dCBzdGlsbCBob2xkaW5nIGl0IGxhbmRzIGhlcmUgdG9vLlxcbitcXHQgKi9cXG4rXFx0aWYgKCh1MTYpdmFsID09IE1YTDg2MlhYX1NCX1BESV9WRVJJRllfQkFEKSB7XFxuK1xcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFxcImZsYXNoOiBsb2FkZXIgcmVqZWN0ZWQgdGhlIGltYWdlXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIC1FQkFETVNHO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gcmV0ID8gcmV0IDogLUVQUk9UTztcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgbXhsODYyeHhfZmxhc2hfbm90aWZ5KHN0cnVjdCBkZXZsaW5rICpkbCwgY29uc3QgY2hhciAqc3RhdHVzLFxcbitcXHRcXHRcXHRcXHQgIHUzMiBkb25lLCB1MzIgdG90YWwpXFxuK3tcXG4rXFx0ZGV2bGlua19mbGFzaF91cGRhdGVfc3RhdHVzX25vdGlmeShkbCwgc3RhdHVzLCBOVUxMLCBkb25lLCB0b3RhbCk7XFxuK31cXG4rXFxuKy8qIEJ5dGUtY291bnQgb2YgZWFjaCBjaHVuayBmZWQgdG8gdGhlIGxvYWRlciBkdXJpbmcgZHJhaW4uIEl0IE1VU1QgYmUgMTogdGhlXFxuKyAqIGxvYWRlciBvbmx5IGxldHMgdXMgb2JzZXJ2ZSBcXFwiY291bnRlciA9PSAwXFxcIiwgbmV2ZXIgXFxcImNvdW50ZXIgXFx1MDAzYyBzdGVwXFxcIiwgc28gYW55XFxuKyAqIHN0ZXAgXFx1MDAzZSAxIGNhbiBzdWJ0cmFjdCBwYXN0IHplcm8sIHVuZGVyZmxvdyB0aGUgMzItYml0IGNvdW50ZXIgYW5kIHdlZGdlIHRoZVxcbisgKiBsb2FkZXIgZm9yIH4yXjMyIG1vcmUgYnl0ZXMgKGEgc3RhdGUgb25seSBhIHBvd2VyIGN5Y2xlIGNsZWFycykuIFN0ZXBwaW5nIGJ5XFxuKyAqIDEgd2Fsa3MgdGhlIGNvdW50ZXIgdGhyb3VnaCBldmVyeSB2YWx1ZSBhbmQgaXMgZ3VhcmFudGVlZCB0byBsYW5kIG9uIHplcm9cXG4rICogd2hhdGV2ZXIgaXRzIChwb3NzaWJseSBvZGQpIHN0YXJ0LiBBIDEtYnl0ZSBjaHVuayBpcyBhIHBhdGggdGhlIGxvYWRlclxcbisgKiBhbHJlYWR5IGhhbmRsZXM6IHRoZSBub3JtYWwgdHJhbnNmZXIgZW5kcyB3aXRoIGEgc2luZ2xlIHRyYWlsaW5nIGJ5dGUgZm9yXFxuKyAqIG9kZC1zaXplZCBpbWFnZXMgKHNlZSBTdGVwIDYpLlxcbisgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFU1xcdDFcXG4rXFxuKy8qIExvZyB0aGUgZHJhaW4ncyBwcm9ncmVzcyBldmVyeSBzbyBtYW55IGJ5dGVzOyBpdCBjYW4gcnVuIGZvciBhIGxvbmcgdGltZSAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFU1xcdCgxMjggKiAxMDI0KVxcbitcXG4rLyogV2FpdCBmb3IgdGhlIGxvYWRlciB0byBhc2sgZm9yIHRoZSBuZXh0IGNodW5rIChTVEFUIDApIG9yIHRvIGNvbWUgYmFjayB0byBpdHNcXG4rICogY29tbWFuZCBsb29wIChTVEFUIFJFQURZKSwgYW5kIHJldHVybiB0aGUgU1RBVCB2YWx1ZSBlaXRoZXIgd2F5LiBPbiB0aW1lb3V0XFxuKyAqIHRoYXQgaXMgd2hhdGV2ZXIgU1RBVCBzdGlsbCBob2xkcywgd2hpY2ggY2FycmllcyBubyBmdXJ0aGVyIGluZm9ybWF0aW9uOiB0aGVcXG4rICogbG9hZGVyIGtlZXBzIHRoZSBjb3VudCB3ZSB3cm90ZSB2aXNpYmxlIHdoaWxlIGl0IHByb2dyYW1zIHRoZSBjaHVuaywgYW5kIHRoYXRcXG4rICogaXMgdGhlIHNhbWUgdmFsdWUgaXQgcHVibGlzaGVzIGFzIHRoZSBcXFwiaW1hZ2UgcmVqZWN0ZWRcXFwiIHZlcmRpY3Qgb25jZSB0aGVcXG4rICogY291bnRlciByZWFjaGVzIHplcm8uXFxuKyAqXFxuKyAqIFNUQVQgMCBpcyB1bmFtYmlndW91cyBoZXJlIGV2ZW4gdGhvdWdoIGl0IGlzIGFsc28gdGhlIFxcXCJpbWFnZSB2ZXJpZmllZFxcXCJcXG4rICogdmVyZGljdDogYnkgdGhlIHJfcmVtYWluID09IDAgcnVsZSB0aGUgbG9hZGVyIGxlYXZlcyB0aGUgcmVjZWl2ZSBsb29wIHRoZVxcbisgKiBtb21lbnQgdGhlIGNvdW50ZXIgcmVhY2hlcyB6ZXJvLCBzbyBpdCBpcyBuZXZlciBib3RoIGluc2lkZSB0aGUgbG9vcCBhc2tpbmdcXG4rICogZm9yIGEgY2h1bmsgYW5kIHB1Ymxpc2hpbmcgYSB2ZXJkaWN0LiBPbmNlIGl0IGhhcyBsZWZ0LCB0aGUgbmV4dCBTVEFUIHdyaXRlXFxuKyAqIGlzIGEgY29tbWFuZCByYXRoZXIgdGhhbiBhIGNvdW50LCBzbyBmZWVkaW5nIG9uZSBtb3JlIGNodW5rIGFmdGVyIGEgdmVyZGljdFxcbisgKiBjYW5ub3QgdW5kZXJmbG93IGFueXRoaW5nIGVpdGhlci5cXG4rICovXFxuK3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX3BvbGxfZHJhaW4oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcylcXG4re1xcbitcXHRpbnQgdmFsO1xcbitcXG4rXFx0cmVhZF9wb2xsX3RpbWVvdXQobXhsODYyeHhfc21kaW9fcmVhZCwgdmFsLFxcbitcXHRcXHRcXHQgIHZhbCBcXHUwMDNjIDAgfHwgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZIHx8XFxuK1xcdFxcdFxcdCAgKHUxNil2YWwgPT0gMCxcXG4rXFx0XFx0XFx0ICA1MCwgdGltZW91dF9tcyAqIDEwMDAsIGZhbHNlLFxcbitcXHRcXHRcXHQgIHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFUKTtcXG4rXFx0aWYgKHZhbCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiB2YWw7XFxuK1xcdHJldHVybiAodTE2KXZhbDtcXG4rfVxcbitcXG4rLyogVGhlIGxvYWRlciBpcyBub3QgYXNraW5nIGZvciBhIGNodW5rOiBpdCBtYXkgc3RpbGwgYmUgcHJvZ3JhbW1pbmcgdGhlIGxhc3RcXG4rICogb25lLCBvciB0aGUgY291bnRlciBoYXMgcmVhY2hlZCB6ZXJvIGFuZCBpdCBpcyB2ZXJpZnlpbmcgdGhlIGltYWdlIGFuZFxcbisgKiByZXNldHRpbmcgaW50byBSRUFEWS4gV2FpdCB0aGF0IG91dCAtLSBTVEFUIGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQsIGFuZFxcbisgKiBndWVzc2luZyB3b3VsZCBtZWFuIHdyaXRpbmcgRU5EIGludG8gYSBsaXZlIHJlY2VpdmUgbG9vcC5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uY2UgdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgbG9vcCwgLUVBR0FJTiBpZiBpdCBhc2tzIGZvciBhbm90aGVyXFxuKyAqIGNodW5rIGFmdGVyIGFsbCwgLUVJTyBmb3IgYSBsb2FkZXIgc3RpbGwgaG9sZGluZyB0aGUgY291bnQgd2hlbiB0aGUgdmVyaWZ5XFxuKyAqIHdpbmRvdyBleHBpcmVzLCBvciBhbiBTTURJTyBidXMgZXJyb3IuXFxuKyAqL1xcbitzdGF0aWMgaW50IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbl9maW5pc2goc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBjaHVuaylcXG4re1xcbitcXHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlZGV2O1xcbitcXHRpbnQgc3RhdDtcXG4rXFxuK1xcdHN0YXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TKTtcXG4rXFx0aWYgKHN0YXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gc3RhdDtcXG4rXFx0aWYgKHN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0aWYgKHN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1ZFUklGWV9CQUQpIHtcXG4rXFx0XFx0ZGV2X2VycihkZXYsXFxuK1xcdFxcdFxcdFxcXCJmbGFzaDogbG9hZGVyIHN0dWNrIGFmdGVyICV1IGNodW5rcywgcG93ZXIgY3ljbGUgaXRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdGNodW5rKTtcXG4rXFx0XFx0cmV0dXJuIC1FSU87XFxuK1xcdH1cXG4rXFx0aWYgKHN0YXQpIHtcXG4rXFx0XFx0LyogQSBmaXJtd2FyZSBpcyBhbnN3ZXJpbmcsIG5vdCB0aGUgbG9hZGVyOiBhbiBpbWFnZSBzdXJ2aXZlZFxcbitcXHRcXHQgKiBpbiBmbGFzaCBhbmQgYm9vdGVkLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0ZGV2X2luZm8oZGV2LCBcXFwiZmxhc2g6IGZpcm13YXJlIGJvb3RlZCB3aGlsZSBkcmFpbmluZ1xcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gLUVBR0FJTjtcXG4rfVxcbitcXG4rLyogUmVjb3ZlciBhIHN3aXRjaCB3aG9zZSBTQiBQREkgZG93bmxvYWQgd2FzIGludGVycnVwdGVkIG1pZC10cmFuc2ZlciAtIHRoZVxcbisgKiBob3N0IGRpZWQgYWZ0ZXIgTUNVYm9vdCBiZWdhbiBlcmFzaW5nIGZsYXNoLCB3aGV0aGVyIGl0IGFib3J0ZWQgbWlkIGVyYXNlIG9yXFxuKyAqIG1pZCBpbWFnZS13cml0ZSwgYm90aCBlbmQgdXAgaW4gdGhlIHNhbWUgcGxhY2U6IHRoZSBwYXlsb2FkIHJlY2VpdmUgbG9vcC5cXG4rICogVGhlcmUgdGhlIGxvYWRlciBwdWJsaXNoZXMgU1RBVD0wLCB3YWl0cyBmb3IgdGhlIGhvc3QgdG8gd3JpdGUgYSBieXRlLWNvdW50XFxuKyAqIHRvIFNUQVQsIERNQXMgdGhhdCBtYW55IGJ5dGVzIGFuZCBzdWJ0cmFjdHMgdGhlIGNvdW50IGZyb20gYSByZW1haW5pbmctYnl0ZXNcXG4rICogY291bnRlciwgbGVhdmluZyB0aGUgbG9vcCBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgcmVhY2hlcyBleGFjdGx5IHplcm8uIFRoZVxcbisgKiBpbWFnZSBzaXplIGRpZWQgd2l0aCB0aGUgaG9zdCwgc28gd2UgZmVlZCBzaW5nbGUtYnl0ZSBjaHVua3MgKHNlZVxcbisgKiBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUykgdG8gd2FsayB0aGUgY291bnRlciB0byB6ZXJvIHdpdGhvdXQgdW5kZXJmbG93LlxcbisgKiBUaGUgbG9hZGVyIHRoZW4gdmVyaWZpZXMgdGhlIChub3cgY29ycnVwdCkgaW1hZ2UgYW5kIHJldHVybnMgdG8gUkVBRFkgYnlcXG4rICogaXRzZWxmLCBvciBib290cyBhIHZhbGlkIGltYWdlIHRoYXQgaGFwcGVuZWQgdG8gc3Vydml2ZSBpbiBmbGFzaDsgZWl0aGVyIHdheVxcbisgKiB0aGUgY2FsbGVyJ3MgcmVwcm9iZSBjbGFzc2lmaWVzIHRoZSByZXN1bHQuIEV2ZXJ5IGJ5dGUgY29zdHMgYWJvdXQgYSBkb3plblxcbisgKiBNRElPIGZyYW1lcywgc28gYSBtdWx0aS1NaUIgb3V0c3RhbmRpbmcgY291bnQgdGFrZXMgdGVucyBvZiBtaW51dGVzLlxcbisgKiBSZXR1cm5zIDAgb25jZSB0aGUgbG9hZGVyIGhhcyBsZWZ0IHRoZSByZWNlaXZlIGxvb3AsIFxcdTAwM2MwIG9uIGVycm9yLiBEb2VzIE5PVFxcbisgKiByZWNvdmVyIGEgY291bnRlciBhbHJlYWR5IHVuZGVyZmxvd2VkIGJ5IGFuIGVhcmxpZXIgb3ZlcnNpemVkLWNodW5rIGF0dGVtcHRcXG4rICogLSB0aGF0IG5lZWRzIGEgcG93ZXIgY3ljbGUuXFxuKyAqL1xcbitzdGF0aWMgaW50IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbihzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcXG4re1xcbitcXHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlZGV2O1xcbitcXHQvKiBCb3VuZDogdHdpY2UgdGhlIGxvYWRlcidzIDE2IE1pQiBpbWFnZSBjYXAsIG9uZSBieXRlIHBlciBjaHVuay4gKi9cXG4rXFx0dTMyIG1heF9jaHVua3MgPSAydSAqICgxNnUgXFx1MDAzY1xcdTAwM2MgMjApIC8gTVhMODYyWFhfRFJBSU5fQ0hVTktfQllURVM7XFxuK1xcdHUzMiBjaHVuayA9IDA7XFxuK1xcdGludCByZXQsIHN0YXQ7XFxuK1xcbitcXHR3aGlsZSAoY2h1bmsgXFx1MDAzYyBtYXhfY2h1bmtzKSB7XFxuK1xcdFxcdC8qIFRlYXJkb3duIGNhbiBpbnRlcnJ1cHQgdGhpcyBsb25nIGRyYWluLiAqL1xcbitcXHRcXHRpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFxcdTAwMjZwcml2LVxcdTAwM2VmbGFncykpXFxuK1xcdFxcdFxcdHJldHVybiAtRUNBTkNFTEVEO1xcbitcXG4rXFx0XFx0c3RhdCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX2RyYWluKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TKTtcXG4rXFx0XFx0aWYgKHN0YXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gc3RhdDtcXG4rXFx0XFx0aWYgKHN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKVxcbitcXHRcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdFxcdGlmIChzdGF0KSB7XFxuK1xcdFxcdFxcdHJldCA9IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbl9maW5pc2gocHJpdiwgY2h1bmspO1xcbitcXHRcXHRcXHRpZiAocmV0ICE9IC1FQUdBSU4pXFxuK1xcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdC8qIEZlZWQgb25lIHplcm8gYnl0ZTsgcmVzZXQgY2xlYXJlZCB0aGUgd3JpdGUgbGF0Y2guICovXFxuK1xcdFxcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxcbitcXHRcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgMHgwMDAwKTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULFxcbitcXHRcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUyk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRjaHVuaysrO1xcbitcXHRcXHRpZiAoIShjaHVuayAlIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFUykpXFxuK1xcdFxcdFxcdGRldl9pbmZvKGRldiwgXFxcImZsYXNoOiBkcmFpbmVkICV1IEtpQiBzbyBmYXJcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCBjaHVuayAvIDEwMjQpO1xcbitcXHRcXHRjb25kX3Jlc2NoZWQoKTtcXG4rXFx0fVxcbitcXG4rXFx0ZGV2X2VycihkZXYsXFxuK1xcdFxcdFxcXCJmbGFzaDogaW50ZXJydXB0ZWQgZG93bmxvYWQgZGlkIG5vdCBkcmFpbiBhZnRlciAldSBjaHVua3NcXFxcblxcXCIsXFxuK1xcdFxcdGNodW5rKTtcXG4rXFxuK1xcdHJldHVybiAtRVRJTUVET1VUO1xcbit9XFxuK1xcbisvKiBCYWNrZ3JvdW5kIHNlbGYtaGVhbDogZHJhaW4gYSB3ZWRnZWQgZG93bmxvYWQgb2ZmIHRoZSBkZXZsaW5rIGZsYXNoIHBhdGgsIHNvXFxuKyAqIHRoZSBsb25nIHJlY292ZXJ5IG5ldmVyIGhvbGRzIHRoZSBkZXZsaW5rIGxvY2suIFNjaGVkdWxlZCBmcm9tIHByb2JlO1xcbisgKiByZXByb2JlcyBvbiBzdWNjZXNzIHNvIHRoZSBwcm9iZS10aW1lIGRldGVjdGlvbiByZS1jbGFzc2lmaWVzIHRoZSBzd2l0Y2guXFxuKyAqL1xcbit2b2lkIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbit7XFxuK1xcdHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID1cXG4rXFx0XFx0Y29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBteGw4NjJ4eF9wcml2LCByZXNjdWVfaGVhbF93b3JrKTtcXG4rXFx0c3RydWN0IGRldmljZSAqZGV2ID0gXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldjtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbihwcml2KTtcXG4rXFx0aWYgKHJldCA9PSAtRUNBTkNFTEVEKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0LyogTm90aGluZyByZXRyaWVzIHRoaXMsIHNvIHNheSBzbzogcmVzY3VlX3JlYWR5IHN0YXlzIGNsZWFyXFxuK1xcdFxcdCAqIGFuZCBkZXZsaW5rIGRldiBmbGFzaCByZXBvcnRzIHdoeSBpdCByZWZ1c2VzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0ZGV2X2VycihkZXYsIFxcXCJmbGFzaDogZG93bmxvYWQgcmVjb3ZlcnkgZmFpbGVkOiAlcGVcXFxcblxcXCIsXFxuK1xcdFxcdFxcdEVSUl9QVFIocmV0KSk7XFxuK1xcdFxcdFdSSVRFX09OQ0UocHJpdi1cXHUwMDNlcmVzY3VlX2ZhaWxlZCwgdHJ1ZSk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0LyogVGhlIGludGVycnVwdGVkIHRyYW5zZmVyIGlzIGZpbmFsaXNlZDsgcmVwcm9iZSBzbyB0aGUgcHJvYmUtdGltZVxcbitcXHQgKiBkZXRlY3Rpb24gYnJpbmdzIHRoZSBkcml2ZXIgdXAgLS0gZmxhc2hhYmxlIGluIHJlc2N1ZSBtb2RlIGlmIHRoZVxcbitcXHQgKiBsb2FkZXIgaXMgYXQgUkVBRFksIG9yIG5vcm1hbGx5IGlmIGEgdmFsaWQgaW1hZ2UgYm9vdGVkLiBUaGUgY29yZVxcbitcXHQgKiBza2lwcyB0aGUgcmUtcHJvYmUgb24gaXRzIG93biBpZiB0aGUgZGV2aWNlIGlzIHVuYm91bmQgZmlyc3Q7IHRoZVxcbitcXHQgKiBmbGFnIHRlc3Qgb25seSBhdm9pZHMgc2NoZWR1bGluZyBvbmUgY2VydGFpbiB0byBiZSBza2lwcGVkLiBBXFxuK1xcdCAqIGZhaWxlZCBoYW5kLW9mZiBsZWF2ZXMgbm90aGluZyB0byByZWNsYXNzaWZ5IHRoZSBzd2l0Y2gsIHNvIG1hcmtcXG4rXFx0ICogcmVjb3ZlcnkgZmFpbGVkIHJhdGhlciB0aGFuIHByb21pc2UgYSByZXRyeSB0aGF0IGNhbm5vdCBzdWNjZWVkLlxcbitcXHQgKi9cXG4rXFx0aWYgKHRlc3RfYml0KE1YTDg2MlhYX0ZMQUdfV09SS19TVE9QUEVELCBcXHUwMDI2cHJpdi1cXHUwMDNlZmxhZ3MpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRpZiAoZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZGV2LCBNWEw4NjJYWF9GV19SRVBST0JFX0RFTEFZX01TKSlcXG4rXFx0XFx0V1JJVEVfT05DRShwcml2LVxcdTAwM2VyZXNjdWVfZmFpbGVkLCB0cnVlKTtcXG4rfVxcbitcXG4rLyogRGV0ZWN0IE1DVWJvb3QgcmVzY3VlIG1vZGUgb3ZlciBjbGF1c2UtMjIgU01ESU8gYWxvbmUsIHNvIHRoZSBjYWxsZXIgY2FuIHJ1bGVcXG4rICogdGhlIGxvYWRlciBvdXQgYmVmb3JlIGFueSBDNDUgQVBJIHJlcXVlc3QgKHdoaWNoIHNwZXdzIENSQyBlcnJvcnMgd2hlbiBubyBXU1BcXG4rICogZmlybXdhcmUgYW5zd2VycykuIEEgc2NyYXRjaCB3cml0ZSB0byBBRERSL0RBVEEgbXVzdCBsYXRjaCBvciB0aGUgY2hpcCBpc1xcbisgKiBhYnNlbnQgKC1FTk9ERVYpOyB0aGUgbWFpbGJveCBpcyByZXNldCBmaXJzdCwgb3IgYSB0cmFuc2ZlciBpbnRlcnJ1cHRlZCB3aXRoXFxuKyAqIENUUkw9V1Igd291bGQgdGFrZSB0aGF0IHdyaXRlIGFzIGEgcGF5bG9hZCB3b3JkIGluc3RlYWQgb2YgbGF0Y2hpbmcgaXQuIFNUQVRcXG4rICogdGhlbiBjbGFzc2lmaWVzIHRoZSBzdGF0ZSwgcG9rZWQgZGVzdHJ1Y3RpdmVseSBvbmx5IHdoZW4gMCwgdGhlIG9uZSB2YWx1ZSBhXFxuKyAqIHJ1bm5pbmcgZmlybXdhcmUgbmV2ZXIgaG9sZHM6XFxuKyAqXFxuKyAqICAtIDB4YzMzYzogZmxhc2hsZXNzIGxvb3A7IHJlY29nbmlzZWQgYnV0IG5vdCBzdXBwb3J0ZWQgaGVyZS5cXG4rICogIC0gMHhjNTVjOiBjb25zb2xlIGxvb3AsIGlmIHRoZSByZWdpc3Rlci1yZWFkIGNoYWxsZW5nZSBpcyBzZXJ2aWNlZC5cXG4rICogIC0gb3RoZXIgbm9uLXplcm86IHJ1bm5pbmcgZmlybXdhcmUsIGxlZnQgdW5wb2tlZC5cXG4rICogIC0gMDogd2VkZ2VkIHJlY2VpdmUgbG9vcDsgdGhlIDEtYnl0ZSBzbGljZS1hZHZhbmNlIHRoZW4gc2F5cyB3aGV0aGVyIGl0XFxuKyAqICAgIHN0aWxsIG5lZWRzIGRyYWluaW5nIG9yIGhhcyBqdXN0IGZpbmlzaGVkLlxcbisgKlxcbisgKiBUaGUgc2NyYXRjaCB3cml0ZSByZWFjaGVzIGEgcnVubmluZyBmaXJtd2FyZSB0b28sIGJ1dCBsYW5kcyBpbiBtYWlsYm94XFxuKyAqIHJlZ2lzdGVycyBpdCBkb2VzIG5vdCByZWFkLCBzbyBpdCBpcyBpbmVydCB0aGVyZS5cXG4rICpcXG4rICogUmV0dXJuOiBNWEw4NjJYWF9JTl9SRVNDVUUsIE1YTDg2MlhYX05PVF9SRVNDVUUsIC1FTk9ERVYgd2hlbiB0aGUgc2NyYXRjaFxcbisgKiB3cml0ZSBkb2VzIG5vdCBsYXRjaCwgd2hpY2ggaXMgYSBzd2l0Y2ggdGhhdCBkb2VzIG5vdCBhbnN3ZXIgYXQgYWxsIG9yIG9uZVxcbisgKiB3aG9zZSBTQiBQREkgd2luZG93IGlzIG5vdCBhdCB0aGUgb2Zmc2V0cyBhYm92ZSwgLUVPUE5PVFNVUFAgZm9yIHRoZVxcbisgKiBmbGFzaGxlc3MgbG9vcCwgLUVOWElPIGZvciBhIFJFQURZIGxvYWRlciB3aG9zZSBtYWlsYm94IGZhaWxzIHRoZSBjaGFsbGVuZ2UsXFxuKyAqIG9yIGFuIFNNRElPIGJ1cyBlcnJvci5cXG4rICovXFxuK2ludCBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3Qoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXFxuK3tcXG4rXFx0aW50IHN0YXQsIGRhdCwgcmV0LCByYiwgYSwgZDtcXG4rXFxuK1xcdC8qIHJlc2N1ZV9yZWFkeSBnYXRlcyBmbGFzaGluZzsgYSB3ZWRnZWQgbG9hZGVyIG5lZWRzIHRoZSBkcmFpbiBmaXJzdC4gKi9cXG4rXFx0V1JJVEVfT05DRShwcml2LVxcdTAwM2VyZXNjdWVfcmVhZHksIGZhbHNlKTtcXG4rXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKiBQcmVzZW5jZTogYSBsaXZlIGNoaXAgbGF0Y2hlcyB0aGUgc2NyYXRjaCB3cml0ZSwgYW4gYWJzZW50IG9uZSBmbG9hdHMuICovXFxuK1xcdGEgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUixcXG4rXFx0XFx0XFx0XFx0IE1YTDg2MlhYX1NCX1BESV9QUk9CRV9BKTtcXG4rXFx0aWYgKGEgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gYTtcXG4rXFx0ZCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLFxcbitcXHRcXHRcXHRcXHQgTVhMODYyWFhfU0JfUERJX1BST0JFX0QpO1xcbitcXHRpZiAoZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiBkO1xcbitcXHRhID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUik7XFxuK1xcdGlmIChhIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIGE7XFxuK1xcdGQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBKTtcXG4rXFx0aWYgKGQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gZDtcXG4rXFx0aWYgKCh1MTYpYSAhPSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSB8fFxcbitcXHQgICAgKHUxNilkICE9IE1YTDg2MlhYX1NCX1BESV9QUk9CRV9EKVxcbitcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG4rXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRzdGF0ID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XFxuK1xcdGlmIChzdGF0IFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIHN0YXQ7XFxuK1xcbitcXHQvKiBGbGFzaGxlc3MtZG93bmxvYWQgbG9vcCAoTXhMODYyODEgdGllcik6IHVuc3VwcG9ydGVkLiAqL1xcbitcXHRpZiAoKHUxNilzdGF0ID09IE1YTDg2MlhYX1NCX1BESV9ETF9SRUFEWSlcXG4rXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXG4rXFx0LyogQ29uc29sZSBsb29wIGF0IFJFQURZOiBjb25maXJtIHRoZSBsaXZlIG1haWxib3ggd2l0aCB0aGUgcmVnaXN0ZXItcmVhZFxcbitcXHQgKiBjaGFsbGVuZ2UgKGNvbnN1bWVzIHRoZSBtYXJrZXIgZnJvbSBEQVRBIGFuZCByZS1hcm1zIFJFQURZKS5cXG4rXFx0ICovXFxuK1xcdGlmICgodTE2KXN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKSB7XFxuK1xcdFxcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLFxcbitcXHRcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9TQl9QRElfUkRSRUdfTUFSSyk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgTVhMODYyWFhfU0JfUERJX1JEUkVHKTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJiID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCBNWEw4NjJYWF9TQl9QRElfUkVBRFksXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBNWEw4NjJYWF9TQl9QRElfU1RFUF9NUyk7XFxuK1xcdFxcdGRhdCA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEpO1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XFxuK1xcdFxcdC8qIE5ldmVyIHJlLWFybWluZyBSRUFEWSBmYWlscyB0aGUgY2hhbGxlbmdlIGxpa2UgYW55IG90aGVyXFxuK1xcdFxcdCAqIHVuc2VydmljZWQgY29tbWFuZDsgcmVwb3J0IGl0IGFzIHN1Y2ggcmF0aGVyIHRoYW4gYXMgYSBidXNcXG4rXFx0XFx0ICogdGltZW91dCB0aGUgYnVzIG5ldmVyIHNhdy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChyYiA9PSAtRVRJTUVET1VUKVxcbitcXHRcXHRcXHRyYiA9IC1FTlhJTztcXG4rXFx0XFx0aWYgKHJiIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIHJiO1xcbitcXHRcXHRpZiAoZGF0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIGRhdDtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdGlmICgodTE2KWRhdCAhPSBNWEw4NjJYWF9TQl9QRElfUkRSRUdfTUFSSykge1xcbitcXHRcXHRcXHRXUklURV9PTkNFKHByaXYtXFx1MDAzZXJlc2N1ZV9yZWFkeSwgdHJ1ZSk7XFxuK1xcdFxcdFxcdHJldHVybiBNWEw4NjJYWF9JTl9SRVNDVUU7XFxuK1xcdFxcdH1cXG4rXFx0XFx0LyogUkVBRFkgYnV0IHRoZSBtYXJrZXIgaXMgdW50b3VjaGVkLCBzbyBub3RoaW5nIGlzIHNlcnZpY2luZyB0aGVcXG4rXFx0XFx0ICogbWFpbGJveC4gQSBmaXJtd2FyZSBwdWJsaXNoaW5nIDB4YzU1YyBhcyBpdHMgc3RhdHVzIHdvcmQgbG9va3NcXG4rXFx0XFx0ICogZXhhY3RseSBsaWtlIHRoaXMsIGFuZCBmbGFzaGluZyBvbmUgd291bGQgYmUgZmFyIHdvcnNlIHRoYW5cXG4rXFx0XFx0ICogcmVmdXNpbmcgdG8gYmluZCwgc28gdHJlYXQgaXQgYXMgdW51c2FibGUuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHR9XFxuK1xcbitcXHQvKiBBbnkgb3RoZXIgbm9uLXplcm8gdmFsdWUgaXMgYSBydW5uaW5nIGZpcm13YXJlLCBub3QgYSBsb2FkZXIuICovXFxuK1xcdGlmIChzdGF0KVxcbitcXHRcXHRyZXR1cm4gTVhMODYyWFhfTk9UX1JFU0NVRTtcXG4rXFxuK1xcdC8qIFNUQVQgPT0gMDogYSB3ZWRnZWQgcmVjZWl2ZSBsb29wIHRha2VzIGEgMS1ieXRlIHNsaWNlLWFkdmFuY2UgKGZlZWRcXG4rXFx0ICogb25lIERBVEEgd29yZCBmaXJzdCwgbGlrZSBhIGRyYWluIGNodW5rKSBhbmQgYXNrcyBmb3IgdGhlIG5leHQgY2h1bmtcXG4rXFx0ICogYnkgcHVibGlzaGluZyAwIGFnYWluLiBIYWQgdGhhdCBieXRlIGJlZW4gdGhlIGxhc3Qgb25lIG91dHN0YW5kaW5nLFxcbitcXHQgKiB0aGUgbG9hZGVyIGxlYXZlcyB0aGUgbG9vcCBpbnN0ZWFkIGFuZCByZXR1cm5zIHRvIFJFQURZLCBoYXZpbmdcXG4rXFx0ICogY29uc3VtZWQgdGhlIGFkdmFuY2UgLS0gcHJvb2YgZW5vdWdoIG9mIGEgbGl2ZSBtYWlsYm94IHRvIHNraXAgdGhlXFxuK1xcdCAqIGNoYWxsZW5nZS4gQW55dGhpbmcgZWxzZSBtZWFucyBpdCBpcyBzdGlsbCB3b3JraW5nIG9uIGl0LiBBbGwgdGhyZWVcXG4rXFx0ICogYXJlIHJlc2N1ZSwgc28gdGhpcyBuZXZlciBmYWlscyBwcm9iZTsgb25seSB0aGUgZHJhaW4gZG9lcy5cXG4rXFx0ICovXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxcbitcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgMHgwMDAwKTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULFxcbitcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUyk7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmIgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RFUF9NUyk7XFxuK1xcdGlmIChyYiBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByYjtcXG4rXFx0aWYgKHJiID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSlcXG4rXFx0XFx0V1JJVEVfT05DRShwcml2LVxcdTAwM2VyZXNjdWVfcmVhZHksIHRydWUpO1xcbitcXG4rXFx0cmV0dXJuIE1YTDg2MlhYX0lOX1JFU0NVRTtcXG4rfVxcbitcXG4rLyogTUNVYm9vdCBmaXJtd2FyZSBpbWFnZSBoZWFkZXIgKi9cXG4rc3RydWN0IG14bDg2Mnh4X2Z3X2hkciB7XFxuK1xcdF9fbGUzMiBpbWFnZV90eXBlO1xcbitcXHRfX2xlMzIgaW1hZ2Vfc2l6ZV8xO1xcbitcXHRfX2xlMzIgaW1hZ2VfY2hlY2tzdW1fMTtcXG4rXFx0X19sZTMyIGltYWdlX3NpemVfMjtcXG4rXFx0X19sZTMyIGltYWdlX2NoZWNrc3VtXzI7XFxuK30gX19wYWNrZWQ7XFxuK1xcbitzdGF0aWMgaW50IG14bDg2Mnh4X2ZsYXNoX3ZhbGlkYXRlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LFxcbitcXHRcXHRcXHRcXHQgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LFxcbitcXHRcXHRcXHRcXHQgICB1MzIgKnBheWxvYWRfc2l6ZSlcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICpoZHI7XFxuK1xcdHUzMiBzaXplMSwgc2l6ZTIsIHRvdGFsO1xcbitcXHRjb25zdCB1OCAqcGF5bG9hZDtcXG4rXFx0dTMyIGNyYztcXG4rXFxuK1xcdGlmIChmdy1cXHUwMDNlc2l6ZSBcXHUwMDNjIE1YTDg2MlhYX0ZXX0hEUl9TSVpFKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGhkciA9IChjb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICopZnctXFx1MDAzZWRhdGE7XFxuK1xcdHBheWxvYWQgPSBmdy1cXHUwMDNlZGF0YSArIE1YTDg2MlhYX0ZXX0hEUl9TSVpFO1xcbitcXHRzaXplMSA9IGxlMzJfdG9fY3B1KGhkci1cXHUwMDNlaW1hZ2Vfc2l6ZV8xKTtcXG4rXFx0c2l6ZTIgPSBsZTMyX3RvX2NwdShoZHItXFx1MDAzZWltYWdlX3NpemVfMik7XFxuK1xcbitcXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KHNpemUxLCBzaXplMiwgXFx1MDAyNnRvdGFsKSB8fFxcbitcXHQgICAgdG90YWwgXFx1MDAzZSBmdy1cXHUwMDNlc2l6ZSAtIE1YTDg2MlhYX0ZXX0hEUl9TSVpFKSB7XFxuK1xcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFxcImZsYXNoOiBmaXJtd2FyZSBmaWxlIHRvbyBzbWFsbCBmb3IgZGVjbGFyZWQgc2l6ZVxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIXRvdGFsKSB7XFxuK1xcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFxcImZsYXNoOiBmaXJtd2FyZSBmaWxlIHdpdGggZW1wdHkgcGF5bG9hZFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoc2l6ZTEpIHtcXG4rXFx0XFx0Y3JjID0gfmNyYzMyX2xlKH4wVSwgcGF5bG9hZCwgc2l6ZTEpO1xcbitcXHRcXHRpZiAoY3JjICE9IGxlMzJfdG9fY3B1KGhkci1cXHUwMDNlaW1hZ2VfY2hlY2tzdW1fMSkpIHtcXG4rXFx0XFx0XFx0ZGV2X2VycihcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHRcXHRcXFwiZmxhc2g6IGltYWdlIDEgQ1JDIG1pc21hdGNoIChnb3QgJTA4eCwgZXhwZWN0ZWQgJTA4eClcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdGNyYywgbGUzMl90b19jcHUoaGRyLVxcdTAwM2VpbWFnZV9jaGVja3N1bV8xKSk7XFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChzaXplMikge1xcbitcXHRcXHRjcmMgPSB+Y3JjMzJfbGUofjBVLCBwYXlsb2FkICsgc2l6ZTEsIHNpemUyKTtcXG4rXFx0XFx0aWYgKGNyYyAhPSBsZTMyX3RvX2NwdShoZHItXFx1MDAzZWltYWdlX2NoZWNrc3VtXzIpKSB7XFxuK1xcdFxcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFx0XFxcImZsYXNoOiBpbWFnZSAyIENSQyBtaXNtYXRjaCAoZ290ICUwOHgsIGV4cGVjdGVkICUwOHgpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRjcmMsIGxlMzJfdG9fY3B1KGhkci1cXHUwMDNlaW1hZ2VfY2hlY2tzdW1fMikpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHQqcGF5bG9hZF9zaXplID0gdG90YWw7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBteGw4NjJ4eF9mbGFzaF9maXJtd2FyZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcXG4rXFx0XFx0XFx0XFx0ICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyxcXG4rXFx0XFx0XFx0XFx0ICAgdTMyIHBheWxvYWRfc2l6ZSwgc3RydWN0IGRldmxpbmsgKmRsKVxcbit7XFxuK1xcdGNvbnN0IHU4ICpwYXlsb2FkID0gZnctXFx1MDAzZWRhdGEgKyBNWEw4NjJYWF9GV19IRFJfU0laRTtcXG4rXFx0dTMyIHdvcmRfaWR4ID0gMCwgZGF0YV93cml0dGVuID0gMCwgaWR4ID0gMDtcXG4rXFx0dW5zaWduZWQgbG9uZyBuZXh0X25vdGlmeSA9IGppZmZpZXMgLSAxO1xcbitcXHR1MTYgd29yZCwgZmRhdGE7XFxuK1xcdGludCByZXQsIGk7XFxuK1xcbitcXHQvKiBTdGVwIDE6IHJlYm9vdCB0aGUgZmlybXdhcmUgaW50byBNQ1Vib290IHJlc2N1ZSBtb2RlICovXFxuK1xcdGlmICghcHJpdi1cXHUwMDNlcmVzY3VlX21vZGUpIHtcXG4rXFx0XFx0cmV0ID0gbXhsODYyeHhfYXBpX3dyYXAocHJpdiwgU1lTX01JU0NfRldfVVBEQVRFLCBOVUxMLCAwLFxcbitcXHRcXHRcXHRcXHRcXHRmYWxzZSwgZmFsc2UpO1xcbitcXHRcXHRpZiAocmV0KSB7XFxuK1xcdFxcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFx0XFxcImZsYXNoOiBGV19VUERBVEUgY29tbWFuZCBmYWlsZWQ6ICVwZVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0RVJSX1BUUihyZXQpKTtcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHQvKiBTdGVwIDI6IHdhaXQgZm9yIGJvb3Rsb2FkZXIgcmVhZHkgKi9cXG4rXFx0bXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCBcXFwiV2FpdGluZyBmb3IgYm9vdGxvYWRlclxcXCIsIDAsIDApO1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRnb3RvIHdyaXRlX2VycjtcXG4rXFxuK1xcdC8qIEZhaWx1cmVzIGZyb20gaGVyZSBvbiBlbmQgdXAgYXQgbm9fZW5kLCB3aGljaCByZXR1cm5zIHRoZSBlcnJvclxcbitcXHQgKiB3aXRob3V0IHNpZ25hbGxpbmcgRU5EIC0tIHNlZSB0aGVyZS5cXG4rXFx0ICovXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfU0JfUERJX1JFQURZLFxcbitcXHRcXHRcXHRcXHRcXHRNWEw4NjJYWF9GV19SRUFEWV9USU1FT1VUX01TKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRkZXZfZXJyKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VkZXYsXFxuK1xcdFxcdFxcdFxcXCJmbGFzaDogYm9vdGxvYWRlciBub3QgcmVhZHk6ICVwZVxcXFxuXFxcIiwgRVJSX1BUUihyZXQpKTtcXG4rXFx0XFx0Z290byBub19lbmQ7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFN0ZXAgMzogc3RhcnQgaGFuZHNoYWtlICovXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULFxcbitcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9TQl9QRElfU1RBUlQpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byB3cml0ZV9lcnI7XFxuK1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFSVCArIDEsXFxuK1xcdFxcdFxcdFxcdFxcdE1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRkZXZfZXJyKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VkZXYsXFxuK1xcdFxcdFxcdFxcXCJmbGFzaDogc3RhcnQgaGFuZHNoYWtlIGZhaWxlZDogJXBlXFxcXG5cXFwiLCBFUlJfUFRSKHJldCkpO1xcbitcXHRcXHRnb3RvIG5vX2VuZDtcXG4rXFx0fVxcbitcXG4rXFx0LyogU3RlcCA0OiB0cmFuc2ZlciBpbWFnZSBoZWFkZXIgKi9cXG4rXFx0bXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCBcXFwiRXJhc2luZyBmbGFzaFxcXCIsIDAsIDApO1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcXG4rXFx0XFx0XFx0XFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byB3cml0ZV9lcnI7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTVhMODYyWFhfRldfSERSX1NJWkUgLyAyOyBpKyspIHtcXG4rXFx0XFx0d29yZCA9IGZ3LVxcdTAwM2VkYXRhW2kgKiAyXSB8XFxuK1xcdFxcdCAgICAgICAoKHUxNilmdy1cXHUwMDNlZGF0YVtpICogMiArIDFdIFxcdTAwM2NcXHUwMDNjIDgpO1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgd29yZCk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRnb3RvIHdyaXRlX2VycjtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byB3cml0ZV9lcnI7XFxuK1xcbitcXHQvKiB0aGUgYnl0ZSBjb3VudCBpbiBTVEFUIHRyaWdnZXJzIHRoZSBlcmFzZSAqL1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcXG4rXFx0XFx0XFx0XFx0ICAgTVhMODYyWFhfRldfSERSX1NJWkUpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byB3cml0ZV9lcnI7XFxuK1xcbitcXHQvKiBBQ0sgaXMgYnl0ZSBjb3VudCArIDEgKi9cXG4rXFx0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCBNWEw4NjJYWF9GV19IRFJfU0laRSArIDEsXFxuK1xcdFxcdFxcdFxcdFxcdE1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRkZXZfZXJyKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VkZXYsXFxuK1xcdFxcdFxcdFxcXCJmbGFzaDogaGVhZGVyIEFDSyBmYWlsZWQ6ICVwZVxcXFxuXFxcIiwgRVJSX1BUUihyZXQpKTtcXG4rXFx0XFx0Z290byBub19lbmQ7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFN0ZXAgNTogd2FpdCBmb3IgZXJhc2UgdG8gY29tcGxldGUgKi9cXG4rXFx0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCAwLFxcbitcXHRcXHRcXHRcXHRcXHRNWEw4NjJYWF9GV19FUkFTRV9USU1FT1VUX01TKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRkZXZfZXJyKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VkZXYsXFxuK1xcdFxcdFxcdFxcXCJmbGFzaDogZXJhc2UgdGltZW91dDogJXBlXFxcXG5cXFwiLCBFUlJfUFRSKHJldCkpO1xcbitcXHRcXHRnb3RvIG5vX2VuZDtcXG4rXFx0fVxcbitcXG4rXFx0LyogU3RlcCA2OiB0cmFuc2ZlciBwYXlsb2FkICovXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxcbitcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRnb3RvIHdyaXRlX2VycjtcXG4rXFxuK1xcdHdoaWxlIChpZHggXFx1MDAzYyBwYXlsb2FkX3NpemUpIHtcXG4rXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuK1xcdFxcdGlmIChpZHggKyAxIFxcdTAwM2MgcGF5bG9hZF9zaXplKSB7XFxuK1xcdFxcdFxcdGZkYXRhID0gcGF5bG9hZFtpZHhdIHxcXG4rXFx0XFx0XFx0XFx0KCh1MTYpcGF5bG9hZFtpZHggKyAxXSBcXHUwMDNjXFx1MDAzYyA4KTtcXG4rXFx0XFx0XFx0aWR4ICs9IDI7XFxuK1xcdFxcdFxcdGRhdGFfd3JpdHRlbiArPSAyO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRmZGF0YSA9IHBheWxvYWRbaWR4XTtcXG4rXFx0XFx0XFx0aWR4Kys7XFxuK1xcdFxcdFxcdGRhdGFfd3JpdHRlbisrO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgZmRhdGEpO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byB3cml0ZV9lcnI7XFxuK1xcdFxcdHdvcmRfaWR4Kys7XFxuK1xcbitcXHRcXHRpZiAoaWR4IFxcdTAwM2U9IHBheWxvYWRfc2l6ZSkge1xcbitcXHRcXHRcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfbGFzdChwcml2LCBkYXRhX3dyaXR0ZW4pO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LyogSGFsZi1iYW5rIGJvdW5kYXJ5OiBzd2l0Y2ggdG8gU0IxIGFkZHJlc3MgKi9cXG4rXFx0XFx0aWYgKHdvcmRfaWR4ID09IE1YTDg2MlhYX0ZXX0JBTktfSEFMRikge1xcbitcXHRcXHRcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfUlNUKTtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdGdvdG8gd3JpdGVfZXJyO1xcbitcXG4rXFx0XFx0XFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIE1YTDg2MlhYX0ZXX1NCMV9BRERSKTtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdGdvdG8gd3JpdGVfZXJyO1xcbitcXG4rXFx0XFx0XFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdGdvdG8gd3JpdGVfZXJyO1xcbitcXHRcXHR9IGVsc2UgaWYgKHdvcmRfaWR4IFxcdTAwM2U9IE1YTDg2MlhYX0ZXX0JBTktfU0xJQ0UpIHtcXG4rXFx0XFx0XFx0cmV0ID0gbXhsODYyeHhfc2JfcGRpX2ZsdXNoX3NsaWNlKHByaXYsIGRhdGFfd3JpdHRlbik7XFxuK1xcdFxcdFxcdGlmIChyZXQpIHtcXG4rXFx0XFx0XFx0XFx0ZGV2X2VycihcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHRcXHRcXHRcXFwiZmxhc2g6IHdyaXRlIHRpbWVvdXQgYXQgJXUvJXU6ICVwZVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0aWR4LCBwYXlsb2FkX3NpemUsIEVSUl9QVFIocmV0KSk7XFxuK1xcdFxcdFxcdFxcdGdvdG8gbm9fZW5kO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdHdvcmRfaWR4ID0gMDtcXG4rXFx0XFx0XFx0ZGF0YV93cml0dGVuID0gMDtcXG4rXFx0XFx0XFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdGdvdG8gd3JpdGVfZXJyO1xcbitcXG4rXFx0XFx0XFx0aWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbmV4dF9ub3RpZnkpKSB7XFxuK1xcdFxcdFxcdFxcdG14bDg2Mnh4X2ZsYXNoX25vdGlmeShkbCwgXFxcIkZsYXNoaW5nXFxcIiwgaWR4LFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBwYXlsb2FkX3NpemUpO1xcbitcXHRcXHRcXHRcXHRuZXh0X25vdGlmeSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFxcImZsYXNoOiBmaW5hbCBzbGljZSBmYWlsZWQ6ICVwZVxcXFxuXFxcIiwgRVJSX1BUUihyZXQpKTtcXG4rXFx0XFx0Z290byBub19lbmQ7XFxuK1xcdH1cXG4rXFxuK1xcdG14bDg2Mnh4X2ZsYXNoX25vdGlmeShkbCwgXFxcIkZsYXNoaW5nXFxcIiwgcGF5bG9hZF9zaXplLCBwYXlsb2FkX3NpemUpO1xcbitcXG4rXFx0LyogU3VjY2VzczogdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgcmVjZWl2ZSBsb29wIGF0IHJfcmVtYWluID09IDAgYW5kXFxuK1xcdCAqIHZlcmlmaWVkIHRoZSBpbWFnZSwgc28gRU5EKDB4M2NjMykgaXMgYSBmaW5hbGlzZS9ib290IHJlcXVlc3QgcmF0aGVyXFxuK1xcdCAqIHRoYW4gYSBieXRlIGNvdW50LiBTaWduYWwgaXQgaGVyZSAtLSBhbmQgb25seSBoZXJlIC0tIHRvIGJvb3QgdGhlIG5ld1xcbitcXHQgKiBpbWFnZSB3aXRob3V0IHdhaXRpbmcgb3V0IHRoZSBsb2FkZXIncyAyIHMgRU5EIHRpbWVvdXQuXFxuK1xcdCAqL1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcXG4rXFx0XFx0XFx0XFx0ICAgTVhMODYyWFhfU0JfUERJX0VORCk7XFxuK1xcdG1zbGVlcChNWEw4NjJYWF9GV19SRUJPT1RfREVMQVlfTVMpO1xcbitcXHRyZXR1cm4gcmV0O1xcbitcXG4rd3JpdGVfZXJyOlxcbitcXHRkZXZfZXJyKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VkZXYsIFxcXCJmbGFzaDogU01ESU8gd3JpdGUgZmFpbGVkOiAlcGVcXFxcblxcXCIsXFxuK1xcdFxcdEVSUl9QVFIocmV0KSk7XFxuK25vX2VuZDpcXG4rXFx0LyogQSBmYWlsdXJlIGxlYXZlcyB0aGUgbG9hZGVyIG1pZCB0cmFuc2ZlcjsgZG8gbm90IHNpZ25hbCBFTkQgKGEgU1RBVFxcbitcXHQgKiB3cml0ZSBpcyBhIGJ5dGUgY291bnQgdGhlbiwgYW5kIEVORCB3b3VsZCBiZSBtaXNyZWFkIGFzIG9uZSwgcmlza2luZ1xcbitcXHQgKiBhIHJlY2VpdmUtY291bnRlciB1bmRlcmZsb3cpLiBSZXR1cm4gdGhlIGVycm9yOyB0aGUgY2FsbGVyIHJlcHJvYmVzLlxcbitcXHQgKi9cXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4raW50IG14bDg2Mnh4X2RldmxpbmtfaW5mb19nZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxcbitcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZGV2bGlua19pbmZvX3JlcSAqcmVxLFxcbitcXHRcXHRcXHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuK3tcXG4rXFx0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cXHUwMDNlcHJpdjtcXG4rXFx0Y2hhciBidWZbMTZdO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0LyogTm8gY2hpcC1pZC9yZXZpc2lvbiBpbiBNQ1Vib290IChuZWVkcyB0aGUgZmlybXdhcmUgTU1EIG1haWxib3gpLiBUaGVcXG4rXFx0ICogZncgdmVyc2lvbiBkb3VibGVzIGFzIHRoZSBcXFwicmVhZHkgdG8gZmxhc2hcXFwiIHNpZ25hbDogcmVwb3J0IGl0IG9ubHlcXG4rXFx0ICogb25jZSB0aGUgbG9hZGVyIGlzIGF0IGEgY2xlYW4gUkVBRFksIG5vdGhpbmcgd2hpbGUgc3RpbGwgZHJhaW5pbmcuXFxuK1xcdCAqL1xcbitcXHRpZiAocHJpdi1cXHUwMDNlcmVzY3VlX21vZGUpIHtcXG4rXFx0XFx0aWYgKCFSRUFEX09OQ0UocHJpdi1cXHUwMDNlcmVzY3VlX3JlYWR5KSlcXG4rXFx0XFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRcXHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcXFwiJXUuJXUuJXVcXFwiLFxcbitcXHRcXHRcXHQgcHJpdi1cXHUwMDNlZndfdmVyc2lvbi5tYWpvciwgcHJpdi1cXHUwMDNlZndfdmVyc2lvbi5taW5vcixcXG4rXFx0XFx0XFx0IHByaXYtXFx1MDAzZWZ3X3ZlcnNpb24ucmV2aXNpb24pO1xcbitcXHRcXHRyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9ydW5uaW5nX3B1dChyZXEsXFxuK1xcdFxcdFxcdFxcdERFVkxJTktfSU5GT19WRVJTSU9OX0dFTkVSSUNfRlcsIGJ1Zik7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJldHVybiBkZXZsaW5rX2luZm9fdmVyc2lvbl9zdG9yZWRfcHV0KHJlcSxcXG4rXFx0XFx0XFx0XFx0REVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19GVywgYnVmKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogQSAwIHBhcnQgbnVtYmVyIG1lYW5zIHRoZSBDSElQIElEIHJlYWQgZmFpbGVkIG9yIHRoZSBwYXJ0IGlzXFxuK1xcdCAqIHVuZnVzZWQ7IG9taXQgaXQgcmF0aGVyIHRoYW4gcHVibGlzaCBhIGJvZ3VzIFxcXCIwMDAwXFxcIiB0aGF0IGZ3dXBkXFxuK1xcdCAqIHdvdWxkIG1hdGNoIGZpcm13YXJlIGFnYWluc3QgLS0gaXQgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBkcml2ZXJcXG4rXFx0ICogbmFtZS5cXG4rXFx0ICovXFxuK1xcdGlmIChwcml2LVxcdTAwM2Vhc2ljX2lkKSB7XFxuK1xcdFxcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFxcXCIlMDRYXFxcIiwgcHJpdi1cXHUwMDNlYXNpY19pZCk7XFxuK1xcdFxcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19BU0lDX0lELFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGJ1Zik7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRcXHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcXFwiJXVcXFwiLCBwcml2LVxcdTAwM2Vhc2ljX3Jldik7XFxuK1xcdFxcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19BU0lDX1JFVixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBidWYpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHQvKiBBbiBhbGwtemVybyB2ZXJzaW9uIGlzIHRoZSBjYWNoZSBhIGZhaWxlZCBmbGFzaCBsZWZ0IGJlaGluZCwgbm90IGFcXG4rXFx0ICogcmVsZWFzZWQgZmlybXdhcmU7IG9taXQgaXQgbGlrZSB0aGUgcGFydCBudW1iZXIgYWJvdmUuXFxuK1xcdCAqL1xcbitcXHRpZiAoIXByaXYtXFx1MDAzZWZ3X3ZlcnNpb24ubWFqb3IgXFx1MDAyNlxcdTAwMjYgIXByaXYtXFx1MDAzZWZ3X3ZlcnNpb24ubWlub3IgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFwcml2LVxcdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFxcXCIldS4ldS4ldVxcXCIsXFxuK1xcdFxcdCBwcml2LVxcdTAwM2Vmd192ZXJzaW9uLm1ham9yLCBwcml2LVxcdTAwM2Vmd192ZXJzaW9uLm1pbm9yLFxcbitcXHRcXHQgcHJpdi1cXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbik7XFxuK1xcbitcXHRyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9ydW5uaW5nX3B1dChyZXEsXFxuK1xcdFxcdFxcdERFVkxJTktfSU5GT19WRVJTSU9OX0dFTkVSSUNfRlcsIGJ1Zik7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKiBib290cyB0aGlzIGltYWdlIGZyb20gaXRzIG93biBmbGFzaDogc3RvcmVkID09IHJ1bm5pbmcgKi9cXG4rXFx0cmV0dXJuIGRldmxpbmtfaW5mb192ZXJzaW9uX3N0b3JlZF9wdXQocmVxLFxcbitcXHRcXHRcXHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xcbit9XFxuK1xcbitpbnQgbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcXG4rXFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuK3tcXG4rXFx0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cXHUwMDNlcHJpdjtcXG4rXFx0c3RydWN0IGRzYV9wb3J0ICpkcDtcXG4rXFx0dTMyIHBheWxvYWRfc2l6ZTtcXG4rXFx0aW50IHJldCwgZXJyLCBpO1xcbitcXG4rXFx0aWYgKHBhcmFtcy1cXHUwMDNlY29tcG9uZW50KSB7XFxuK1xcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJjb21wb25lbnQgaXMgbm90IHN1cHBvcnRlZFxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIEEgcHJldmlvdXMgZmxhc2ggaXMgc3RpbGwgd2FpdGluZyBmb3IgaXRzIHJlcHJvYmU6IHRoZSBmaXJtd2FyZSBBUElcXG4rXFx0ICogaXMgc2hvcnQtY2lyY3VpdGVkLCBzbyB0aGUgcmF3IFNCIFBESSB3cml0ZXMgYmVsb3cgd291bGQgcnVuIGFnYWluc3RcXG4rXFx0ICogYSBzd2l0Y2ggdGhpcyBkcml2ZXIgbm8gbG9uZ2VyIHRyYWNrcy5cXG4rXFx0ICovXFxuK1xcdGlmIChwcml2LVxcdTAwM2Vza2lwX3RlYXJkb3duKSB7XFxuK1xcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXFxuK1xcdFxcdFxcdFxcdCAgIFxcXCJkZXZpY2UgaXMgcmVpbml0aWFsaXppbmcsIHJldHJ5IGxhdGVyXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IG14bDg2Mnh4X2ZsYXNoX3ZhbGlkYXRlKHByaXYsIHBhcmFtcy1cXHUwMDNlZncsIFxcdTAwMjZwYXlsb2FkX3NpemUpO1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJmaXJtd2FyZSBpbWFnZSB2YWxpZGF0aW9uIGZhaWxlZFxcXCIpO1xcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHQvKiBSZWZ1c2UgdG8gZmxhc2ggd2hpbGUgdGhlIGJhY2tncm91bmQgc2VsZi1oZWFsIGlzIHN0aWxsIGRyYWluaW5nLCBhbmRcXG4rXFx0ICogZm9yIGdvb2Qgb25jZSBpdCBoYXMgZ2l2ZW4gdXAgb24gdGhlIGxvYWRlci5cXG4rXFx0ICovXFxuK1xcdGlmIChSRUFEX09OQ0UocHJpdi1cXHUwMDNlcmVzY3VlX2ZhaWxlZCkpIHtcXG4rXFx0XFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjayxcXG4rXFx0XFx0XFx0XFx0ICAgXFxcImRvd25sb2FkIHJlY292ZXJ5IGZhaWxlZCwgcG93ZXIgY3ljbGUgdGhlIHN3aXRjaFxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVJTztcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlIFxcdTAwMjZcXHUwMDI2ICFSRUFEX09OQ0UocHJpdi1cXHUwMDNlcmVzY3VlX3JlYWR5KSkge1xcbitcXHRcXHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLFxcbitcXHRcXHRcXHRcXHQgICBcXFwic3dpdGNoIGlzIHJlY292ZXJpbmcgYW4gaW50ZXJydXB0ZWQgZG93bmxvYWQsIHJldHJ5IHNob3J0bHlcXFwiKTtcXG4rXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlKVxcbitcXHRcXHRkZXZfaW5mbyhkcy1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHQgXFxcImZsYXNoOiBmbGFzaGluZyBzd2l0Y2ggdmlhIE1DVWJvb3QgcmVzY3VlIG1vZGVcXFxcblxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGRldl9pbmZvKGRzLVxcdTAwM2VkZXYsIFxcXCJmbGFzaDogcnVubmluZyBmaXJtd2FyZSAldS4ldS4ldVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0IHByaXYtXFx1MDAzZWZ3X3ZlcnNpb24ubWFqb3IsIHByaXYtXFx1MDAzZWZ3X3ZlcnNpb24ubWlub3IsXFxuK1xcdFxcdFxcdCBwcml2LVxcdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uKTtcXG4rXFxuK1xcdC8qIENsb3NlIHBvcnRzIHdoaWxlIHRoZSBmaXJtd2FyZSBpcyBzdGlsbCBhbGl2ZSBzbyB0aGUgRFNBIGNvcmUnc1xcbitcXHQgKiBNREIvRkRCIHRyYWNraW5nIGlzIGRyYWluZWQsIGFuZCBkZXRhY2ggdXNlciBwb3J0cyBzbyB1c2Vyc3BhY2VcXG4rXFx0ICogY2Fubm90IHJlb3BlbiB0aGVtIGR1cmluZyB0aGUgZmxhc2guIFRoZSBjb25kdWl0IGlzIG9ubHkgY2xvc2VkLFxcbitcXHQgKiBub3QgZGV0YWNoZWQ6IGl0IGJlbG9uZ3MgdG8gdGhlIE1BQyBkcml2ZXIuIFRoaXMgZHJpdmVyIGJpbmRzIGFcXG4rXFx0ICogc2luZ2xlIHN3aXRjaCB3aXRoIGEgZGlyZWN0IGhvc3QgbGluayBhbmQgbm8gY2FzY2FkZSBwb3J0cywgc28gdGhlXFxuK1xcdCAqIGNvbmR1aXQgc2VydmVzIG9ubHkgdGhpcyBzd2l0Y2gsIGFuZCBmbGFzaGluZyBpdCByZWJvb3RzIHRoZSBzd2l0Y2gsXFxuK1xcdCAqIHdoaWNoIHRha2VzIHRoZSB0cmVlIGRvd24gcmVnYXJkbGVzcy5cXG4rXFx0ICovXFxuK1xcdHJ0bmxfbG9jaygpO1xcbitcXHRkc2Ffc3dpdGNoX2Zvcl9lYWNoX3VzZXJfcG9ydChkcCwgZHMpIHtcXG4rXFx0XFx0aWYgKGRwLVxcdTAwM2V1c2VyKSB7XFxuK1xcdFxcdFxcdGRldl9jbG9zZShkcC1cXHUwMDNldXNlcik7XFxuK1xcdFxcdFxcdG5ldGlmX2RldmljZV9kZXRhY2goZHAtXFx1MDAzZXVzZXIpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0ZHNhX3N3aXRjaF9mb3JfZWFjaF9jcHVfcG9ydChkcCwgZHMpXFxuK1xcdFxcdGRldl9jbG9zZShkcC1cXHUwMDNlY29uZHVpdCk7XFxuK1xcdC8qIFRoZSBicmlkZ2UgZGVmZXJzIHRoZSBTVFAgc3RhdGUgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgY2xvc2luZ1xcbitcXHQgKiB0aGUgcG9ydHM7IGxldCB0aGVtIHJlYWNoIHRoZSBmaXJtd2FyZSB3aGlsZSBpdCBpcyBzdGlsbCBhbGl2ZS5cXG4rXFx0ICovXFxuK1xcdHN3aXRjaGRldl9kZWZlcnJlZF9wcm9jZXNzKCk7XFxuK1xcdHJ0bmxfdW5sb2NrKCk7XFxuK1xcbitcXHRtdXRleF9sb2NrX25lc3RlZChcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzLVxcdTAwM2VtZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTtcXG4rXFx0cHJpdi1cXHUwMDNlYmxvY2tfaG9zdCA9IHRydWU7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzLVxcdTAwM2VtZGlvX2xvY2spO1xcbitcXG4rXFx0c2V0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgXFx1MDAyNnByaXYtXFx1MDAzZWZsYWdzKTtcXG4rXFx0Y2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKFxcdTAwMjZwcml2LVxcdTAwM2VzdGF0c193b3JrKTtcXG4rXFx0Y2FuY2VsX3dvcmtfc3luYyhcXHUwMDI2cHJpdi1cXHUwMDNlY3JjX2Vycl93b3JrKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGRzLVxcdTAwM2VudW1fcG9ydHM7IGkrKylcXG4rXFx0XFx0Y2FuY2VsX3dvcmtfc3luYyhcXHUwMDI2cHJpdi1cXHUwMDNlcG9ydHNbaV0uaG9zdF9mbG9vZF93b3JrKTtcXG4rXFxuK1xcdHJldCA9IG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKHByaXYsIHBhcmFtcy1cXHUwMDNlZncsIHBheWxvYWRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgZHMtXFx1MDAzZWRldmxpbmspO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcXFwiZmlybXdhcmUgdHJhbnNmZXIgZmFpbGVkXFxcIik7XFxuK1xcbitcXHRpZiAoIXJldCkge1xcbitcXHRcXHRtdXRleF9sb2NrX25lc3RlZChcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzLVxcdTAwM2VtZGlvX2xvY2ssXFxuK1xcdFxcdFxcdFxcdCAgTURJT19NVVRFWF9ORVNURUQpO1xcbitcXHRcXHRwcml2LVxcdTAwM2VibG9ja19ob3N0ID0gZmFsc2U7XFxuK1xcdFxcdHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlID0gZmFsc2U7XFxuK1xcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzLVxcdTAwM2VtZGlvX2xvY2spO1xcbitcXG4rXFx0XFx0LyogUmVmcmVzaCB0aGUgY2FjaGVkIHZlcnNpb25zIHNvIHRoZSBmbGFzaCB1cGRhdGUgb25seVxcbitcXHRcXHQgKiBjb21wbGV0ZXMgb25jZSB0aGUgbmV3IGZpcm13YXJlIGlzIGNvbmZpcm1lZCBydW5uaW5nIGFuZFxcbitcXHRcXHQgKiBkZXZsaW5rIGRldiBpbmZvIHJlcG9ydHMgaXQuIE11c3QgaGFwcGVuIGJlZm9yZSBzZXR0aW5nXFxuK1xcdFxcdCAqIHNraXBfdGVhcmRvd24sIHdoaWNoIGRpc2NhcmRzIGFsbCBmaXJtd2FyZSBBUEkgcmVhZHMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjayxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgXFxcIm5ldyBmaXJtd2FyZSBkaWQgbm90IGJlY29tZSByZWFkeVxcXCIpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdC8qIFRoZSBzd2l0Y2ggaXMgaW4gTUNVYm9vdCB3aXRoIGVyYXNlZCBvciBwYXJ0bHkgd3JpdHRlbiBmbGFzaDtcXG4rXFx0XFx0ICogZHJvcCB0aGUgY2FjaGVkIGlkZW50aXR5IHNvIGRldmxpbmsgZGV2IGluZm8gc3RvcHMgcmVwb3J0aW5nXFxuK1xcdFxcdCAqIHRoZSBwcmUtZmxhc2ggdmVyc2lvbiB1bnRpbCB0aGUgcmVwcm9iZSByZS1yZWFkcyB0aGUgdHJ1dGguXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRtZW1zZXQoXFx1MDAyNnByaXYtXFx1MDAzZWZ3X3ZlcnNpb24sIDAsIHNpemVvZihwcml2LVxcdTAwM2Vmd192ZXJzaW9uKSk7XFxuK1xcdFxcdHByaXYtXFx1MDAzZWFzaWNfaWQgPSAwO1xcbitcXHRcXHRwcml2LVxcdTAwM2Vhc2ljX3JldiA9IDA7XFxuK1xcdH1cXG4rXFxuK1xcdG11dGV4X2xvY2tfbmVzdGVkKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VidXMtXFx1MDAzZW1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpO1xcbitcXHRwcml2LVxcdTAwM2Vza2lwX3RlYXJkb3duID0gdHJ1ZTtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VidXMtXFx1MDAzZW1kaW9fbG9jayk7XFxuK1xcbitcXHQvKiBSZWluaXRpYWxpc2UgdGhyb3VnaCBhIGRlZmVycmVkIHJlLXByb2JlOiByZW1vdmUoKSBydW5zIHdpdGhcXG4rXFx0ICogc2tpcF90ZWFyZG93biBzZXQsIHRoZW4gYSBmcmVzaCBwcm9iZSgpIHN0YXJ0cyBhZ2FpbnN0IHdoYXRldmVyXFxuK1xcdCAqIHRoZSBzd2l0Y2ggbm93IHJ1bnMuIFRoZSBjb3JlIHNraXBzIHRoZSByZS1wcm9iZSBpZiB0aGUgZGV2aWNlXFxuK1xcdCAqIGlzIHVuYm91bmQgb3Igc2h1dCBkb3duIGJlZm9yZSBpdCBmaXJlcy5cXG4rXFx0ICovXFxuK1xcdGVyciA9IGRldmljZV9zY2hlZHVsZV9yZXByb2JlKGRzLVxcdTAwM2VkZXYsIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVMpO1xcbitcXG4rXFx0cmV0dXJuIHJldCA/IHJldCA6IGVycjtcXG4rfVxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi43Y2Q4N2M3YWQ4NzE2XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5oXFxuQEAgLTAsMCArMSwyMCBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xcbitcXG4rI2lmbmRlZiBfX01YTDg2MlhYX0ZXX0hcXG4rI2RlZmluZSBfX01YTDg2MlhYX0ZXX0hcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NuZXQvZHNhLmhcXHUwMDNlXFxuK1xcbitzdHJ1Y3QgbXhsODYyeHhfcHJpdjtcXG4rc3RydWN0IHdvcmtfc3RydWN0O1xcbitcXG4raW50IG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdik7XFxuK3ZvaWQgbXhsODYyeHhfcmVzY3VlX2hlYWxfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspO1xcbitpbnQgbXhsODYyeHhfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsXFxuK1xcdFxcdFxcdCAgICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsXFxuK1xcdFxcdFxcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XFxuK2ludCBteGw4NjJ4eF9kZXZsaW5rX2ZsYXNoX3VwZGF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XFxuK1xcbisjZW5kaWYgLyogX19NWEw4NjJYWF9GV19IICovXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmMgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jXFxuaW5kZXggNGFjZDIxNmY3Y2MwMC4uNGRmN2M4MzgwOGY2MCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jXFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuY1xcbkBAIC0xNSw2ICsxNSw4IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC91bmFsaWduZWQuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY25ldC9kc2EuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFxcIm14bDg2Mnh4LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJteGw4NjJ4eC1jbWQuaFxcXCJcXG4rI2luY2x1ZGUgXFxcIm14bDg2Mnh4LWZ3LmhcXFwiXFxuICNpbmNsdWRlIFxcXCJteGw4NjJ4eC1ob3N0LmhcXFwiXFxuIFxcbiAjZGVmaW5lIENUUkxfQlVTWV9NQVNLXFx0XFx0XFx0QklUKDE1KVxcbkBAIC0zNDAsNiArMzQyLDIxIEBAIGludCBteGw4NjJ4eF9hcGlfd3JhcChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGNtZCwgdm9pZCAqX2RhdGEsXFxuIFxcbiBcXHRtdXRleF9sb2NrX25lc3RlZChcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzLVxcdTAwM2VtZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTtcXG4gXFxuK1xcdGlmIChwcml2LVxcdTAwM2Vza2lwX3RlYXJkb3duKSB7XFxuK1xcdFxcdHJldCA9IHJlYWQgPyAtRU5PREVWIDogMDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChwcml2LVxcdTAwM2VyZXNjdWVfbW9kZSkge1xcbitcXHRcXHRyZXQgPSAtRU5PREVWO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHByaXYtXFx1MDAzZWJsb2NrX2hvc3QgXFx1MDAyNlxcdTAwMjYgY21kICE9IFNZU19NSVNDX0ZXX1VQREFURSkge1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbiBcXHRtYXggPSAoc2l6ZSArIDEpIC8gMjtcXG4gXFxuIFxcdHJldCA9IG14bDg2Mnh4X2J1c3lfd2FpdChwcml2KTtcXG5AQCAtNDk1LDEyICs1MTIsNTQgQEAgaW50IG14bDg2Mnh4X3Jlc2V0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbisjZGVmaW5lIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHXFx0XFx0MHgxZlxcbisjZGVmaW5lIE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTS1xcdDB4ZmZmMFxcbisjZGVmaW5lIE1YTDg2MlhYX1NNRElPX09GRl9NQVNLXFx0XFx0MHgwMDBmXFxuK1xcbisvKiBQYWdlZCBjbGF1c2UtMjIgd2luZG93OiB0aGUgcGFnZSBnb2VzIGludG8gTUlJIHJlZ2lzdGVyIDB4MWYsIHRoZSBsb3cgbmliYmxlXFxuKyAqIG9mIGFkZHIgc2VsZWN0cyBvbmUgb2YgdGhlIDE2IHJlZ2lzdGVycyB3aXRoaW4gaXQuIEJvdGggaGVscGVycyB0YWtlIHRoZSBNRElPXFxuKyAqIGJ1cyBsb2NrIHBlciB0cmFuc2FjdGlvbiwgc28gY2FsbGVycyBtdXN0IG5vdCBhbHJlYWR5IGhvbGQgaXQgLS0gdW5saWtlXFxuKyAqIG14bDg2Mnh4X2FwaV93cmFwKCksIHdoaWNoIGhvbGRzIGl0IGFjcm9zcyBhIHdob2xlIGZpcm13YXJlIGNvbW1hbmQuXFxuKyAqL1xcbitpbnQgbXhsODYyeHhfc21kaW9fcmVhZChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGFkZHIpXFxuK3tcXG4rXFx0c3RydWN0IG1paV9idXMgKmJ1cyA9IHByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWJ1cztcXG4rXFx0aW50IHBoeSA9IHByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWFkZHI7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZidXMtXFx1MDAzZW1kaW9fbG9jayk7XFxuK1xcdHJldCA9IF9fbWRpb2J1c193cml0ZShidXMsIHBoeSwgTVhMODYyWFhfU01ESU9fQUREUl9SRUcsXFxuK1xcdFxcdFxcdCAgICAgIGFkZHIgXFx1MDAyNiBNWEw4NjJYWF9TTURJT19QQUdFX01BU0spO1xcbitcXHRpZiAocmV0IFxcdTAwM2U9IDApXFxuK1xcdFxcdHJldCA9IF9fbWRpb2J1c19yZWFkKGJ1cywgcGh5LCBhZGRyIFxcdTAwMjYgTVhMODYyWFhfU01ESU9fT0ZGX01BU0spO1xcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNmJ1cy1cXHUwMDNlbWRpb19sb2NrKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4raW50IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgYWRkciwgdTE2IHZhbClcXG4re1xcbitcXHRzdHJ1Y3QgbWlpX2J1cyAqYnVzID0gcHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzO1xcbitcXHRpbnQgcGh5ID0gcHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYWRkcjtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNmJ1cy1cXHUwMDNlbWRpb19sb2NrKTtcXG4rXFx0cmV0ID0gX19tZGlvYnVzX3dyaXRlKGJ1cywgcGh5LCBNWEw4NjJYWF9TTURJT19BRERSX1JFRyxcXG4rXFx0XFx0XFx0ICAgICAgYWRkciBcXHUwMDI2IE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTSyk7XFxuK1xcdGlmIChyZXQgXFx1MDAzZT0gMClcXG4rXFx0XFx0cmV0ID0gX19tZGlvYnVzX3dyaXRlKGJ1cywgcGh5LCBhZGRyIFxcdTAwMjYgTVhMODYyWFhfU01ESU9fT0ZGX01BU0ssXFxuK1xcdFxcdFxcdFxcdCAgICAgIHZhbCk7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2YnVzLVxcdTAwM2VtZGlvX2xvY2spO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbiB2b2lkIG14bDg2Mnh4X2hvc3RfaW5pdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcXG4ge1xcbiBcXHRJTklUX1dPUksoXFx1MDAyNnByaXYtXFx1MDAzZWNyY19lcnJfd29yaywgbXhsODYyeHhfY3JjX2Vycl93b3JrX2ZuKTtcXG4rXFx0SU5JVF9XT1JLKFxcdTAwMjZwcml2LVxcdTAwM2VyZXNjdWVfaGVhbF93b3JrLCBteGw4NjJ4eF9yZXNjdWVfaGVhbF93b3JrX2ZuKTtcXG4gfVxcbiBcXG4gdm9pZCBteGw4NjJ4eF9ob3N0X3NodXRkb3duKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxcbiB7XFxuIFxcdGNhbmNlbF93b3JrX3N5bmMoXFx1MDAyNnByaXYtXFx1MDAzZWNyY19lcnJfd29yayk7XFxuK1xcdGNhbmNlbF93b3JrX3N5bmMoXFx1MDAyNnByaXYtXFx1MDAzZXJlc2N1ZV9oZWFsX3dvcmspO1xcbiB9XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5oXFxuaW5kZXggNjZkNmFlMTk4YWZmNC4uNGUwNTRjNmU0YzBlNCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5oXFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaFxcbkBAIC0xOCw1ICsxOCw3IEBAIGludCBteGw4NjJ4eF9hcGlfd3JhcChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGNtZCwgdm9pZCAqZGF0YSwgdTE2IHNpemUsXFxuIFxcdG14bDg2Mnh4X2FwaV93cmFwKGRldiwgY21kLCBcXHUwMDI2KGRhdGEpLCBzaXplb2YoKGRhdGEpKSwgdHJ1ZSwgdHJ1ZSlcXG4gXFxuIGludCBteGw4NjJ4eF9yZXNldChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdik7XFxuK2ludCBteGw4NjJ4eF9zbWRpb19yZWFkKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgYWRkcik7XFxuK2ludCBteGw4NjJ4eF9zbWRpb193cml0ZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHUxNiB2YWwpO1xcbiBcXG4gI2VuZGlmIC8qIF9fTVhMODYyWFhfSE9TVF9IICovXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1waHlsaW5rLmMgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jXFxuaW5kZXggYjY4OTY1MmFhOWI5Mi4uYTViNjk0MGI1NTJlOSAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jXFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LXBoeWxpbmsuY1xcbkBAIC00MDYsNiArNDA2LDggQEAgbXhsODYyeHhfcGh5bGlua19tYWNfc2VsZWN0X3BjcyhzdHJ1Y3QgcGh5bGlua19jb25maWcgKmNvbmZpZyxcXG4gXFxuIFxcdHN3aXRjaCAocG9ydCkge1xcbiBcXHRjYXNlIDkgLi4uIDE2OlxcbitcXHRcXHRpZiAocHJpdi1cXHUwMDNlcmVzY3VlX21vZGUpXFxuK1xcdFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXHRcXHRpZiAoIU1YTDg2MlhYX0ZXX1ZFUl9NSU4ocHJpdiwgMSwgMCwgODQpKSB7XFxuIFxcdFxcdFxcdGRldl93YXJuX29uY2UoZHAtXFx1MDAzZWRzLVxcdTAwM2VkZXYsXFxuIFxcdFxcdFxcdFxcdCAgICAgIFxcXCJTZXJEZXMgUENTIHVuc3VwcG9ydGVkIG9uIG9sZCBmaXJtd2FyZS5cXFxcblxcXCIpO1xcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguYyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5jXFxuaW5kZXggNDVkMjM3YjNhNDBmMS4uMGUxNzljYWU5N2YzOCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguY1xcbisrKyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5jXFxuQEAgLTIxLDYgKzIxLDcgQEBcXG4gI2luY2x1ZGUgXFxcIm14bDg2Mnh4LmhcXFwiXFxuICNpbmNsdWRlIFxcXCJteGw4NjJ4eC1hcGkuaFxcXCJcXG4gI2luY2x1ZGUgXFxcIm14bDg2Mnh4LWNtZC5oXFxcIlxcbisjaW5jbHVkZSBcXFwibXhsODYyeHgtZncuaFxcXCJcXG4gI2luY2x1ZGUgXFxcIm14bDg2Mnh4LWhvc3QuaFxcXCJcXG4gI2luY2x1ZGUgXFxcIm14bDg2Mnh4LXBoeWxpbmsuaFxcXCJcXG4gXFxuQEAgLTcxLDYgKzcyLDEzIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9ybW9uX2hpc3RfcmFuZ2UgbXhsODYyeHhfcm1vbl9yYW5nZXNbXSA9IHtcXG4gI2RlZmluZSBNWEw4NjJYWF9SRUFEWV9USU1FT1VUX01TXFx0MTAwMDBcXG4gI2RlZmluZSBNWEw4NjJYWF9SRUFEWV9QT0xMX01TXFx0XFx0MTAwXFxuIFxcbisvKiBDaGlwIElEIHJlZ2lzdGVycywgcmVhZCB2aWEgU1lTX01JU0NfUkVHX1JEICovXFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX0xcXHRcXHQweGMwZDI4ODg0XFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01cXHRcXHQweGMwZDI4ODg4XFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX0xfUE5VTUxcXHRcXHRHRU5NQVNLKDE1LCAxMilcXG4rI2RlZmluZSBNWEw4NjJYWF9DSElQSURfTV9QTlVNTVxcdFxcdEdFTk1BU0soMTEsIDApXFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01fVkVSU0lPTlxcdEdFTk1BU0soMTQsIDEyKVxcbitcXG4gI2RlZmluZSBNWEw4NjJYWF9UQ01fSU5TVF9TRUxcXHRcXHQweGUwMFxcbiAjZGVmaW5lIE1YTDg2MlhYX1RDTV9DQlNcXHRcXHQweGUxMlxcbiAjZGVmaW5lIE1YTDg2MlhYX1RDTV9FQlNcXHRcXHQweGUxM1xcbkBAIC0yMjIsNyArMjMwLDQ2IEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcGh5X3dyaXRlX2M0NV9taWlfYnVzKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLFxcbiBcXHRyZXR1cm4gbXhsODYyeHhfcGh5X3dyaXRlX21tZChidXMtXFx1MDAzZXByaXYsIGFkZHIsIGRldmFkZCwgcmVnbnVtLCB2YWwpO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKVxcbisvKiBSZWFkIHRoZSBzdGF0aWMgY2hpcCBwYXJ0IG51bWJlciBhbmQgdmVyc2lvbiBmcm9tIHRoZSBDSElQIElEXFxuKyAqIHJlZ2lzdGVycy4gT25seSBwb3NzaWJsZSB3aXRoIGEgcnVubmluZyBmaXJtd2FyZSwgc28gdGhlIHZhbHVlcyBhcmVcXG4rICogY2FjaGVkIGF0IHNldHVwIGFuZCBsZWZ0IHplcm8gd2hlbiB0aGUgc3dpdGNoIGlzIGluIHJlc2N1ZSBtb2RlLlxcbisgKi9cXG4rc3RhdGljIGludCBteGw4NjJ4eF9yZWFkX2NoaXBfaWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXFxuK3tcXG4rXFx0c3RydWN0IG14bDg2Mnh4X3N5c19yZWdfcncgcmVnID0ge307XFxuK1xcdHUxNiBjaGlwaWRfbCwgY2hpcGlkX207XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZWcuYWRkciA9IGNwdV90b19sZTMyKE1YTDg2MlhYX0NISVBJRF9MKTtcXG4rXFx0cmV0ID0gTVhMODYyWFhfQVBJX1JFQUQocHJpdiwgU1lTX01JU0NfUkVHX1JELCByZWcpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRjaGlwaWRfbCA9IGxlMzJfdG9fY3B1KHJlZy52YWwpO1xcbitcXG4rXFx0cmVnLmFkZHIgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9DSElQSURfTSk7XFxuK1xcdHJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIFNZU19NSVNDX1JFR19SRCwgcmVnKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0Y2hpcGlkX20gPSBsZTMyX3RvX2NwdShyZWcudmFsKTtcXG4rXFxuK1xcdHByaXYtXFx1MDAzZWFzaWNfaWQgPSBGSUVMRF9HRVQoTVhMODYyWFhfQ0hJUElEX0xfUE5VTUwsIGNoaXBpZF9sKSB8XFxuK1xcdFxcdFxcdEZJRUxEX0dFVChNWEw4NjJYWF9DSElQSURfTV9QTlVNTSwgY2hpcGlkX20pIFxcdTAwM2NcXHUwMDNjIDQ7XFxuK1xcdHByaXYtXFx1MDAzZWFzaWNfcmV2ID0gRklFTERfR0VUKE1YTDg2MlhYX0NISVBJRF9NX1ZFUlNJT04sIGNoaXBpZF9tKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogbXhsODYyeHhfd2FpdF9yZWFkeSAtIHdhaXQgZm9yIHRoZSBzd2l0Y2ggZmlybXdhcmUgdG8gYmVjb21lIG9wZXJhdGlvbmFsXFxuKyAqIEBkczogRFNBIHN3aXRjaCBpbnN0YW5jZVxcbisgKlxcbisgKiBQb2xsIHRoZSBmaXJtd2FyZSB1bnRpbCBpdCByZXBvcnRzIGl0cyB2ZXJzaW9uIGFuZCBhY2NlcHRzXFxuKyAqIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMsIHRoZW4gY2FjaGUgdGhlIGZpcm13YXJlIHZlcnNpb24gYW5kIGNoaXAgSUQuXFxuKyAqIFRha2VzIGF0IGxlYXN0IHR3byBzZWNvbmRzLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuXFxuKyAqL1xcbitpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpXFxuIHtcXG4gXFx0c3RydWN0IG14bDg2Mnh4X3N5c19md19pbWFnZV92ZXJzaW9uIHZlciA9IHt9O1xcbiBcXHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllcywgdGltZW91dDtcXG5AQCAtMjU0LDYgKzMwMSwxMSBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKVxcbiBcXHRcXHRwcml2LVxcdTAwM2Vmd192ZXJzaW9uLm1ham9yID0gdmVyLml2X21ham9yO1xcbiBcXHRcXHRwcml2LVxcdTAwM2Vmd192ZXJzaW9uLm1pbm9yID0gdmVyLml2X21pbm9yO1xcbiBcXHRcXHRwcml2LVxcdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uID0gbGUxNl90b19jcHUodmVyLml2X3JldmlzaW9uKTtcXG4rXFxuK1xcdFxcdHJldCA9IG14bDg2Mnh4X3JlYWRfY2hpcF9pZChwcml2KTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0ZGV2X3dhcm4oZHMtXFx1MDAzZWRldiwgXFxcImZhaWxlZCB0byByZWFkIGNoaXAgSUQ6ICVwZVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0IEVSUl9QVFIocmV0KSk7XFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4gbm90X3JlYWR5X3lldDpcXG5AQCAtNjIyLDIxICs2NzQsNjYgQEAgc3RhdGljIGludCBteGw4NjJ4eF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpXFxuIFxcdGludCBuX3VzZXJfcG9ydHMgPSAwLCBtYXhfdmxhbnM7XFxuIFxcdGludCBpbmdyZXNzX2ZpbmFscywgdmlkX3J1bGVzO1xcbiBcXHRzdHJ1Y3QgZHNhX3BvcnQgKmRwO1xcbi1cXHRpbnQgcmV0LCBpO1xcbi1cXG4tXFx0cmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7XFxuLVxcdGlmIChyZXQpXFxuLVxcdFxcdHJldHVybiByZXQ7XFxuLVxcbi1cXHRyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTtcXG4tXFx0aWYgKHJldClcXG4tXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0aW50IHJldCwgaSwgcmVzY3VlO1xcbiBcXG4rXFx0LyogVGhlIFNlckRlcyBzdGF0ZSBpcyBzb2Z0d2FyZS1vbmx5IGFuZCBtdXN0IGV4aXN0IGJlZm9yZSBhbnl0aGluZyBjYW5cXG4rXFx0ICogcmVhY2ggcGh5bGluaywgaW5jbHVkaW5nIGEgcmVzY3VlLW1vZGUgZmxhc2ggY2xlYXJpbmcgcmVzY3VlX21vZGVcXG4rXFx0ICogYWhlYWQgb2YgdGhlIHJlcHJvYmUuXFxuK1xcdCAqL1xcbiBcXHRtdXRleF9pbml0KFxcdTAwMjZwcml2LVxcdTAwM2VzZXJkZXNfbG9jayk7XFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKHByaXYtXFx1MDAzZXNlcmRlc19wb3J0cyk7IGkrKylcXG4gXFx0XFx0bXhsODYyeHhfc2V0dXBfcGNzKHByaXYsIFxcdTAwMjZwcml2LVxcdTAwM2VzZXJkZXNfcG9ydHNbaV0sXFxuIFxcdFxcdFxcdFxcdCAgIGkgKyBNWEw4NjJYWF9GSVJTVF9TRVJERVNfUE9SVCk7XFxuIFxcbitcXHQvKiBEZXRlY3QgdGhlIGxvYWRlciBvdmVyIFNCIFBESSBmaXJzdDogaXQgbmVlZHMgbm8gZmlybXdhcmUsIHVubGlrZSB0aGVcXG4rXFx0ICogQzQ1IEFQSSAobXhsODYyeHhfcmVzZXQvd2FpdF9yZWFkeSkgd2hpY2ggc3Bld3MgQ1JDIGVycm9ycyB3aGVuIG5vbmVcXG4rXFx0ICogYW5zd2Vycy4gVG91Y2ggQzQ1IG9ubHkgb25jZSByZXNjdWUgaXMgcnVsZWQgb3V0LlxcbitcXHQgKi9cXG4rXFx0cmVzY3VlID0gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHByaXYpO1xcbitcXHRpZiAocmVzY3VlIFxcdTAwM2MgMCkge1xcbitcXHRcXHRkZXZfZXJyKGRzLVxcdTAwM2VkZXYsIFxcXCJzd2l0Y2ggc3RhdGUgZGV0ZWN0aW9uIGZhaWxlZDogJXBlXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRFUlJfUFRSKHJlc2N1ZSkpO1xcbitcXHRcXHRyZXR1cm4gcmVzY3VlO1xcbitcXHR9XFxuK1xcbitcXHRpZiAocmVzY3VlID09IE1YTDg2MlhYX05PVF9SRVNDVUUpIHtcXG4rXFx0XFx0cmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTtcXG4rXFx0XFx0aWYgKHJldCkge1xcbitcXHRcXHRcXHQvKiB0aGUgcmVzZXQgbWF5IG9ubHkgbm93IGhhdmUgdHJpZ2dlcmVkIHJlc2N1ZSBtb2RlICovXFxuK1xcdFxcdFxcdHJlc2N1ZSA9IG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdChwcml2KTtcXG4rXFx0XFx0XFx0aWYgKHJlc2N1ZSBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0XFx0ZGV2X2Vycihkcy1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHRcXHRcXHRcXFwic3dpdGNoIG5vdCByZXNwb25kaW5nIGFmdGVyIHJlc2V0OiAlcGVcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdEVSUl9QVFIocmVzY3VlKSk7XFxuK1xcdFxcdFxcdFxcdHJldHVybiByZXNjdWU7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0aWYgKHJlc2N1ZSA9PSBNWEw4NjJYWF9OT1RfUkVTQ1VFKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlID0gcmVzY3VlO1xcbitcXG4rXFx0aWYgKHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlKSB7XFxuK1xcdFxcdGlmIChwcml2LVxcdTAwM2VyZXNjdWVfcmVhZHkpIHtcXG4rXFx0XFx0XFx0ZGV2X3dhcm4oZHMtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFx0IFxcXCJzd2l0Y2ggaW4gTUNVYm9vdCByZXNjdWUgbW9kZSwgdXNlIGRldmxpbmsgdG8gZmxhc2ggbmV3IGZpcm13YXJlXFxcXG5cXFwiKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0LyogRHJhaW4gdGhlIHdlZGdlZCBkb3dubG9hZCBpbiB0aGUgYmFja2dyb3VuZCBzbyBpdFxcbitcXHRcXHRcXHQgKiBuZXZlciBob2xkcyB0aGUgZGV2bGluayBsb2NrOyBpbmZvIGFuZCBmbGFzaCBiZWNvbWVcXG4rXFx0XFx0XFx0ICogYXZhaWxhYmxlIG9uY2UgcmVhZHkuXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRkZXZfd2Fybihkcy1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHRcXHQgXFxcInN3aXRjaCBpbiBNQ1Vib290IHdpdGggYW4gaW50ZXJydXB0ZWQgZG93bmxvYWQsIHJlY292ZXJpbmcgaW4gYmFja2dyb3VuZFxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHF1ZXVlX3dvcmsoc3lzdGVtX2xvbmdfd3EsIFxcdTAwMjZwcml2LVxcdTAwM2VyZXNjdWVfaGVhbF93b3JrKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4gXFx0LyogQ2FsY3VsYXRlIEV4dGVuZGVkIFZMQU4gYmxvY2sgc2l6ZXMuXFxuIFxcdCAqIFdpdGggVkxBTiBGaWx0ZXIgaGFuZGxpbmcgVklEIG1lbWJlcnNoaXAgY2hlY2tzOlxcbiBcXHQgKiAgIEluZ3Jlc3M6IG9ubHkgZmluYWwgY2F0Y2hhbGwgcnVsZXMgKFBWSUQgaW5zZXJ0aW9uLCA4MDIuMVFcXG5AQCAtNzE1LDExICs4MTIsMjEgQEAgc3RhdGljIGludCBteGw4NjJ4eF9wb3J0X3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGJvb2wgZW5hYmxlKVxcbiBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfZW5hYmxlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsXFxuIFxcdFxcdFxcdFxcdHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpXFxuIHtcXG4rXFx0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cXHUwMDNlcHJpdjtcXG4rXFxuK1xcdGlmIChwcml2LVxcdTAwM2VyZXNjdWVfbW9kZSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbiBcXHRyZXR1cm4gbXhsODYyeHhfcG9ydF9zdGF0ZShkcywgcG9ydCwgdHJ1ZSk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3BvcnRfZGlzYWJsZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KVxcbiB7XFxuK1xcdHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID0gZHMtXFx1MDAzZXByaXY7XFxuK1xcbitcXHRpZiAocHJpdi1cXHUwMDNlcmVzY3VlX21vZGUpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuIFxcdGlmIChteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSkpXFxuIFxcdFxcdGRldl9lcnIoZHMtXFx1MDAzZWRldiwgXFxcImZhaWxlZCB0byBkaXNhYmxlIHBvcnQgJWRcXFxcblxcXCIsIHBvcnQpO1xcbiB9XFxuQEAgLTEzMzcsNiArMTQ0NCwxNyBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcXG4gXFx0Ym9vbCBpc19jcHVfcG9ydCA9IGRzYV9wb3J0X2lzX2NwdShkcCk7XFxuIFxcdGludCByZXQ7XFxuIFxcbitcXHRpZiAoZHNhX3BvcnRfaXNfZHNhKGRwKSkge1xcbitcXHRcXHRkZXZfZXJyKGRzLVxcdTAwM2VkZXYsIFxcXCJwb3J0ICVkOiBEU0EgbGlua3Mgbm90IHN1cHBvcnRlZFxcXFxuXFxcIiwgcG9ydCk7XFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFx0fVxcbitcXG4rXFx0LyogRFNBIHJlaW5pdHMgZmFpbGVkIHVzZXIgcG9ydHMgYXMgdW51c2VkOyBzaGFyZWQgcG9ydHMgbXVzdFxcbitcXHQgKiBzdWNjZWVkIGZvciB0aGUgdHJlZSB0byByZWdpc3Rlci5cXG4rXFx0ICovXFxuK1xcdGlmIChwcml2LVxcdTAwM2VyZXNjdWVfbW9kZSlcXG4rXFx0XFx0cmV0dXJuIGRzYV9wb3J0X2lzX3VzZXIoZHApID8gLUVOT0RFViA6IDA7XFxuK1xcbiBcXHRyZXQgPSBteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuQEAgLTEzNDYsMTEgKzE0NjQsNiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcXG4gXFx0aWYgKGRzYV9wb3J0X2lzX3VudXNlZChkcCkpXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0aWYgKGRzYV9wb3J0X2lzX2RzYShkcCkpIHtcXG4tXFx0XFx0ZGV2X2Vycihkcy1cXHUwMDNlZGV2LCBcXFwicG9ydCAlZDogRFNBIGxpbmtzIG5vdCBzdXBwb3J0ZWRcXFxcblxcXCIsIHBvcnQpO1xcbi1cXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuLVxcdH1cXG4tXFxuIFxcdHJldCA9IG14bDg2Mnh4X2NvbmZpZ3VyZV9zcF90YWdfcHJvdG8oZHMsIHBvcnQsIGlzX2NwdV9wb3J0KTtcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG5AQCAtMTU3Miw2ICsxNjg1LDEyIEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcG9ydF9tZGJfZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsXFxuIFxcdGV0aGVyX2FkZHJfY29weShxcGFyYW0ubWFjLCBtZGItXFx1MDAzZWFkZHIpO1xcbiBcXG4gXFx0cmV0ID0gTVhMODYyWFhfQVBJX1JFQUQocHJpdiwgTVhMODYyWFhfTUFDX1RBQkxFRU5UUllRVUVSWSwgcXBhcmFtKTtcXG4rXFx0LyogUG9zdC1mbGFzaCB0ZWFyZG93biBvciBNQ1Vib290OiB0aGUgZmlybXdhcmUgYW5kIGl0cyBNQUMgdGFibGUgYXJlXFxuK1xcdCAqIGdvbmUsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkZWxldGUuIE91dHNpZGUgdGhvc2UsIC1FTk9ERVYgaXMgYVxcbitcXHQgKiBidXMgZXJyb3IgYW5kIG11c3QgYmUgcmVwb3J0ZWQuXFxuK1xcdCAqL1xcbitcXHRpZiAocmV0ID09IC1FTk9ERVYgXFx1MDAyNlxcdTAwMjYgKHByaXYtXFx1MDAzZXNraXBfdGVhcmRvd24gfHwgcHJpdi1cXHUwMDNlcmVzY3VlX21vZGUpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuQEAgLTE2MjgsNiArMTc0Nyw5IEBAIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3BvcnRfc3RwX3N0YXRlX3NldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LFxcbiBcXHRzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLVxcdTAwM2Vwcml2O1xcbiBcXHRpbnQgcmV0O1xcbiBcXG4rXFx0aWYgKHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbiBcXHRzd2l0Y2ggKHN0YXRlKSB7XFxuIFxcdGNhc2UgQlJfU1RBVEVfRElTQUJMRUQ6XFxuIFxcdFxcdHBhcmFtLnBvcnRfc3RhdGUgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9TVFBfUE9SVF9TVEFURV9ESVNBQkxFKTtcXG5AQCAtMjAxNSw2ICsyMTM3LDEyIEBAIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3N0YXRzX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbiBcXHRzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwcml2LVxcdTAwM2VkcztcXG4gXFx0c3RydWN0IGRzYV9wb3J0ICpkcDtcXG4gXFxuK1xcdC8qIEEgZ2V0X3N0YXRzNjQoKSByZS1hcm0gY2FuIHJhY2UgdGhlIGZsYXNoIHRlYXJkb3duJ3MgV09SS19TVE9QUEVEXFxuK1xcdCAqIHNldCBhbmQgY2FuY2VsOyBiYWlsIGhlcmUgc28gYSBzdHJheSBwb2xsIG5ldmVyIHJ1bnMgZHVyaW5nIGEgZmxhc2guXFxuK1xcdCAqL1xcbitcXHRpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFxcdTAwMjZwcml2LVxcdTAwM2VmbGFncykpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuIFxcdGRzYV9zd2l0Y2hfZm9yX2VhY2hfYXZhaWxhYmxlX3BvcnQoZHAsIGRzKVxcbiBcXHRcXHRteGw4NjJ4eF9zdGF0c19wb2xsKGRzLCBkcC1cXHUwMDNlaW5kZXgpO1xcbiBcXG5AQCAtMjA4Niw2ICsyMjE0LDggQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkc2Ffc3dpdGNoX29wcyBteGw4NjJ4eF9zd2l0Y2hfb3BzID0ge1xcbiBcXHQuZ2V0X3BhdXNlX3N0YXRzID0gbXhsODYyeHhfZ2V0X3BhdXNlX3N0YXRzLFxcbiBcXHQuZ2V0X3Jtb25fc3RhdHMgPSBteGw4NjJ4eF9nZXRfcm1vbl9zdGF0cyxcXG4gXFx0LmdldF9zdGF0czY0ID0gbXhsODYyeHhfZ2V0X3N0YXRzNjQsXFxuK1xcdC5kZXZsaW5rX2luZm9fZ2V0ID0gbXhsODYyeHhfZGV2bGlua19pbmZvX2dldCxcXG4rXFx0LmRldmxpbmtfZmxhc2hfdXBkYXRlID0gbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUsXFxuIH07XFxuIFxcbiBzdGF0aWMgaW50IG14bDg2Mnh4X3Byb2JlKHN0cnVjdCBtZGlvX2RldmljZSAqbWRpb2RldilcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaFxcbmluZGV4IDQzMmE1ZjNmMmUwOGUuLjk5MWIyNGFhOTVhZmQgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmhcXG4rKysgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaFxcbkBAIC00LDcgKzQsOSBAQFxcbiAjZGVmaW5lIF9fTVhMODYyWFhfSFxcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9ieXRlb3JkZXIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpdG9wcy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbXV0ZXguaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbmV0L2RzYS5oXFx1MDAzZVxcbiBcXG5AQCAtMTQsNiArMTYsMTAgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXY7XFxuICNkZWZpbmUgTVhMODYyWFhfRklSU1RfU0VSREVTX1BPUlRcXHQ5XFxuICNkZWZpbmUgTVhMODYyWFhfU0VSREVTX1NMT1RTXFx0XFx0NFxcbiBcXG4rLyogbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KCkgcmV0dXJuIGNvZGVzIChuZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9ycykgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9OT1RfUkVTQ1VFXFx0XFx0MFxcbisjZGVmaW5lIE1YTDg2MlhYX0lOX1JFU0NVRVxcdFxcdDFcXG4rXFxuICNkZWZpbmUgTVhMODYyWFhfREVGQVVMVF9CUklER0VcXHRcXHQwXFxuICNkZWZpbmUgTVhMODYyWFhfTUFYX0JSSURHRVNcXHRcXHQ0OFxcbiAjZGVmaW5lIE1YTDg2MlhYX01BWF9CUklER0VfUE9SVFNcXHQxMjhcXG5AQCAtMzAzLDYgKzMwOSwxMCBAQCBzdHJ1Y3QgbXhsODYyeHhfZndfdmVyc2lvbiB7XFxuICAqICAgICAgICAgICAgICAgICAgICAgIGZsb29kaW5nKVxcbiAgKiBAZndfdmVyc2lvbjogICAgICAgICBjYWNoZWQgZmlybXdhcmUgdmVyc2lvbiwgcG9wdWxhdGVkIGF0IHByb2JlIGFuZFxcbiAgKiAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZCB3aXRoIE1YTDg2MlhYX0ZXX1ZFUl9NSU4oKVxcbisgKiBAYXNpY19pZDogICAgICAgICAgICBjaGlwIHBhcnQgbnVtYmVyIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMsXFxuKyAqICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGFzIHRoZSBkZXZsaW5rIFxcXCJhc2ljLmlkXFxcIiBmaXhlZCB2ZXJzaW9uXFxuKyAqIEBhc2ljX3JldjogICAgICAgICAgIGNoaXAgdmVyc2lvbiByZWFkIGZyb20gdGhlIENISVAgSUQgcmVnaXN0ZXJzLFxcbisgKiAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBhcyB0aGUgZGV2bGluayBcXFwiYXNpYy5yZXZcXFwiIGZpeGVkIHZlcnNpb25cXG4gICogQHNlcmRlc19wb3J0czogICAgICAgU2VyRGVzIGludGVyZmFjZXMgaW5jbC4gc3ViLWludGVyZmFjZXMgaW4gY2FzZSBvZlxcbiAgKiAgICAgICAgICAgICAgICAgICAgICAxMEdfUVhHTUlJIG9yIFFTR01JSVxcbiAgKiBAc2VyZGVzX3JlZmNvdW50OiAgICBwZXItWFBDUyBjb3VudCBvZiBzdWItcG9ydHMgZW5hYmxlZCBieSBwaHlsaW5rO1xcbkBAIC0zMTksNiArMzI5LDIwIEBAIHN0cnVjdCBteGw4NjJ4eF9md192ZXJzaW9uIHtcXG4gICogQGV2bGFuX2luZ3Jlc3Nfc2l6ZTogcGVyLXBvcnQgaW5ncmVzcyBFeHRlbmRlZCBWTEFOIGJsb2NrIHNpemVcXG4gICogQGV2bGFuX2VncmVzc19zaXplOiAgcGVyLXBvcnQgZWdyZXNzIEV4dGVuZGVkIFZMQU4gYmxvY2sgc2l6ZVxcbiAgKiBAdmZfYmxvY2tfc2l6ZTogICAgICBwZXItcG9ydCBWTEFOIEZpbHRlciBibG9jayBzaXplXFxuKyAqIEBibG9ja19ob3N0OiAgICAgICAgIHJlamVjdCBmaXJtd2FyZSBBUEkgY29tbWFuZHMgKGV4Y2VwdCBGV19VUERBVEUpXFxuKyAqICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyBhIGZpcm13YXJlIGZsYXNoXFxuKyAqIEBza2lwX3RlYXJkb3duOiAgICAgIGRpc2NhcmQgZmlybXdhcmUgQVBJIGNvbW1hbmRzIGR1cmluZyB0aGUgdGVhcmRvd25cXG4rICogICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkIGJ5IHRoZSBwb3N0LWZsYXNoIHJlcHJvYmVcXG4rICogQHJlc2N1ZV9tb2RlOiAgICAgICAgc3dpdGNoIGlzIGluIE1DVWJvb3Q7IGZpcm13YXJlIEFQSSBjb21tYW5kcyBmYWlsIGZhc3QsXFxuKyAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgY2xhdXNlLTIyIFNNRElPIHdvcmtzLiBTZXQgZnJvbSBzZXR1cCgpIGJlZm9yZSB0aGVcXG4rICogICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIGlzIHJlZ2lzdGVyZWQgYW5kIGNsZWFyZWQgdW5kZXIgdGhlIE1ESU8gYnVzIGxvY2tcXG4rICogICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBiZW5lZml0IG9mIG14bDg2Mnh4X2FwaV93cmFwKCk7IG90aGVyIHJlYWRlcnNcXG4rICogICAgICAgICAgICAgICAgICAgICAgb25seSBuZWVkIGl0IHRvIGJlIGEgc3RhYmxlIHNpbmdsZSBmbGFnLlxcbisgKiBAcmVzY3VlX3JlYWR5OiAgICAgICAocmVzY3VlX21vZGUpIGxvYWRlciBpcyBhdCBhIGNsZWFuIFJFQURZIGFuZCB3aWxsIGFjY2VwdFxcbisgKiAgICAgICAgICAgICAgICAgICAgICBhIGZsYXNoOyBmYWxzZSB3aGlsZSByZXNjdWVfaGVhbF93b3JrIGlzIGRyYWluaW5nXFxuKyAqIEByZXNjdWVfZmFpbGVkOiAgICAgIChyZXNjdWVfbW9kZSkgdGhlIHNlbGYtaGVhbCBnYXZlIHVwOyB0aGUgbG9hZGVyIG5lZWRzIGFcXG4rICogICAgICAgICAgICAgICAgICAgICAgcG93ZXIgY3ljbGUgYW5kIG5vIGZsYXNoIGNhbiBiZSBhY2NlcHRlZFxcbisgKiBAcmVzY3VlX2hlYWxfd29yazogICBiYWNrZ3JvdW5kIHNlbGYtaGVhbCBkcmFpbmluZyBhIHdlZGdlZCBkb3dubG9hZCB0byBSRUFEWVxcbiAgKiBAc3RhdHNfd29yazogICAgICAgICBwZXJpb2RpYyB3b3JrIGl0ZW0gdGhhdCBwb2xscyBSTU9OIGhhcmR3YXJlIGNvdW50ZXJzXFxuICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBhY2N1bXVsYXRlcyB0aGVtIGludG8gNjQtYml0IHBlci1wb3J0IHN0YXRzXFxuICAqL1xcbkBAIC0zMjYsOSArMzUwLDEyIEBAIHN0cnVjdCBteGw4NjJ4eF9wcml2IHtcXG4gXFx0c3RydWN0IGRzYV9zd2l0Y2ggKmRzO1xcbiBcXHRzdHJ1Y3QgbWRpb19kZXZpY2UgKm1kaW9kZXY7XFxuIFxcdHN0cnVjdCB3b3JrX3N0cnVjdCBjcmNfZXJyX3dvcms7XFxuK1xcdHN0cnVjdCB3b3JrX3N0cnVjdCByZXNjdWVfaGVhbF93b3JrO1xcbiBcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbiBcXHR1MTYgZHJvcF9tZXRlcjtcXG4gXFx0c3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24gZndfdmVyc2lvbjtcXG4rXFx0dTE2IGFzaWNfaWQ7XFxuK1xcdHU4IGFzaWNfcmV2O1xcbiBcXHRzdHJ1Y3QgbXhsODYyeHhfcGNzIHNlcmRlc19wb3J0c1s4XTtcXG4gXFx0aW50IHNlcmRlc19yZWZjb3VudFsyXTtcXG4gXFx0c3RydWN0IG11dGV4IHNlcmRlc19sb2NrO1xcbkBAIC0zMzcsNyArMzY0LDE0IEBAIHN0cnVjdCBteGw4NjJ4eF9wcml2IHtcXG4gXFx0dTE2IGV2bGFuX2luZ3Jlc3Nfc2l6ZTtcXG4gXFx0dTE2IGV2bGFuX2VncmVzc19zaXplO1xcbiBcXHR1MTYgdmZfYmxvY2tfc2l6ZTtcXG4rXFx0Ym9vbCBibG9ja19ob3N0O1xcbitcXHRib29sIHNraXBfdGVhcmRvd247XFxuK1xcdGJvb2wgcmVzY3VlX21vZGU7XFxuK1xcdGJvb2wgcmVzY3VlX3JlYWR5O1xcbitcXHRib29sIHJlc2N1ZV9mYWlsZWQ7XFxuIFxcdHN0cnVjdCBkZWxheWVkX3dvcmsgc3RhdHNfd29yaztcXG4gfTtcXG4gXFxuK2ludCBteGw4NjJ4eF93YWl0X3JlYWR5KHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7XFxuK1xcbiAjZW5kaWYgLyogX19NWEw4NjJYWF9IICovXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oXFxuaW5kZXggYWVlNzlmZDZiMzJiNC4uN2E5OTE2OTUwNTc3MiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaFxcbkBAIC0xMzE0LDYgKzEzMTQsOCBAQCBpbnQgIF9fbXVzdF9jaGVjayBkZXZpY2VfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldik7XFxuIGludCBfX211c3RfY2hlY2sgZHJpdmVyX2F0dGFjaChjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KTtcXG4gdm9pZCBkZXZpY2VfaW5pdGlhbF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpO1xcbiBpbnQgX19tdXN0X2NoZWNrIGRldmljZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7XFxuK2ludCBfX211c3RfY2hlY2sgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LFxcbitcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgaW50IGRlbGF5X21zKTtcXG4gXFxuIGJvb2wgZGV2aWNlX2lzX2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldik7XFxuIFxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc2EuaCBiL2luY2x1ZGUvbmV0L2RzYS5oXFxuaW5kZXggNmY3ZjVjMTdiNTMyMC4uNTg1OTdiMTRlNTkyYSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL25ldC9kc2EuaFxcbisrKyBiL2luY2x1ZGUvbmV0L2RzYS5oXFxuQEAgLTExNzIsNiArMTE3Miw5IEBAIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyB7XFxuIFxcdGludFxcdCgqZGV2bGlua19pbmZvX2dldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxcbiBcXHRcXHRcXHRcXHQgICAgc3RydWN0IGRldmxpbmtfaW5mb19yZXEgKnJlcSxcXG4gXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XFxuK1xcdGludFxcdCgqZGV2bGlua19mbGFzaF91cGRhdGUpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcXG4rXFx0XFx0XFx0XFx0XFx0c3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLFxcbitcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spO1xcbiBcXHRpbnRcXHQoKmRldmxpbmtfc2JfcG9vbF9nZXQpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBzYl9pbmRleCwgdTE2IHBvb2xfaW5kZXgsXFxuIFxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZGV2bGlua19zYl9wb29sX2luZm8gKnBvb2xfaW5mbyk7XFxuZGlmZiAtLWdpdCBhL25ldC9kc2EvZGV2bGluay5jIGIvbmV0L2RzYS9kZXZsaW5rLmNcXG5pbmRleCBlZDM0MmYzNDU2OTJiLi4yNTMxMWE4N2NiYzU2IDEwMDY0NFxcbi0tLSBhL25ldC9kc2EvZGV2bGluay5jXFxuKysrIGIvbmV0L2RzYS9kZXZsaW5rLmNcXG5AQCAtMjAsNiArMjAsMTggQEAgc3RhdGljIGludCBkc2FfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZGV2bGluayAqZGwsXFxuIFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gfVxcbiBcXG4rc3RhdGljIGludCBkc2FfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRldmxpbmsgKmRsLFxcbitcXHRcXHRcXHRcXHQgICAgc3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxcbit7XFxuK1xcdHN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRzYV9kZXZsaW5rX3RvX2RzKGRsKTtcXG4rXFxuK1xcdGlmICghZHMtXFx1MDAzZW9wcy1cXHUwMDNlZGV2bGlua19mbGFzaF91cGRhdGUpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuK1xcdHJldHVybiBkcy1cXHUwMDNlb3BzLVxcdTAwM2VkZXZsaW5rX2ZsYXNoX3VwZGF0ZShkcywgcGFyYW1zLCBleHRhY2spO1xcbit9XFxuK1xcbiBzdGF0aWMgaW50IGRzYV9kZXZsaW5rX3NiX3Bvb2xfZ2V0KHN0cnVjdCBkZXZsaW5rICpkbCxcXG4gXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgaW50IHNiX2luZGV4LCB1MTYgcG9vbF9pbmRleCxcXG4gXFx0XFx0XFx0XFx0ICAgc3RydWN0IGRldmxpbmtfc2JfcG9vbF9pbmZvICpwb29sX2luZm8pXFxuQEAgLTE2OSw2ICsxODEsNyBAQCBkc2FfZGV2bGlua19zYl9vY2NfdGNfcG9ydF9iaW5kX2dldChzdHJ1Y3QgZGV2bGlua19wb3J0ICpkbHAsXFxuIFxcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldmxpbmtfb3BzIGRzYV9kZXZsaW5rX29wcyA9IHtcXG4gXFx0LmluZm9fZ2V0XFx0XFx0XFx0PSBkc2FfZGV2bGlua19pbmZvX2dldCxcXG4rXFx0LmZsYXNoX3VwZGF0ZVxcdFxcdFxcdD0gZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlLFxcbiBcXHQuc2JfcG9vbF9nZXRcXHRcXHRcXHQ9IGRzYV9kZXZsaW5rX3NiX3Bvb2xfZ2V0LFxcbiBcXHQuc2JfcG9vbF9zZXRcXHRcXHRcXHQ9IGRzYV9kZXZsaW5rX3NiX3Bvb2xfc2V0LFxcbiBcXHQuc2JfcG9ydF9wb29sX2dldFxcdFxcdD0gZHNhX2Rldmxpbmtfc2JfcG9ydF9wb29sX2dldCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMDY6NTA6NDQuOTYxMjY4ODQzWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MzUwMzQwNDU1NTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgZmlybXdhcmUgZmxhc2ggc3VwcG9ydCBmb3IgdGhlIE1heExpbmVhciBNeEw4NjJ4eCBEU0Egc3dpdGNoIHZpYSBkZXZsaW5rLCBhbG9uZyB3aXRoIGEgbmV3IGNvcmUgZHJpdmVyIG1vZGVsIGZ1bmN0aW9uIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAuIFRoZSBgbXhsODYyeHhgIGRyaXZlciByZXF1aXJlcyBwaHlzaWNhbCBoYXJkd2FyZSBjb25uZWN0ZWQgdmlhIE1ESU8gdG8gcHJvYmUgc3VjY2Vzc2Z1bGx5IGFuZCBpcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4gVGhlIG5ldyBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIEFQSSBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IHRoaXMgdW5yZWFjaGFibGUgZHJpdmVyLiBUaGUgYWRkaXRpb25zIHRvIHRoZSBEU0EgZGV2bGluayBjb3JlIGFyZSB0cml2aWFsIHdyYXBwZXJzIHRoYXQgcmV0dXJuIGAtRU9QTk9UU1VQUGAgZm9yIGFsbCBvdGhlciBzd2l0Y2hlcy4gVGhlIG1vZGlmaWNhdGlvbiB0byBgZGV2aWNlX3NodXRkb3duYCBtZXJlbHkgc2V0cyBhIGJvb2xlYW4gZmxhZyBkdXJpbmcgc3lzdGVtIHRlYXJkb3duLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCwgcmVhY2hhYmxlIGNvZGUgdG8gZnV6ei5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDI5YjAxMTZlMDU1OWNjY2ExNDhhZTY5YTBhYWQ2Mjc0MjYxZTNiZDNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IEF1ZyAxNSAwNjo1MDo0MyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdFxuaW5kZXggNDc0NTE0OGZlY2Y0Zi4uMDU4OTk5ZDBkYzU2ZiAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RldmxpbmsvaW5kZXgucnN0XG5AQCAtOTQsNiArOTQsNyBAQCBwYXJhbWV0ZXJzLCBpbmZvIHZlcnNpb25zLCBhbmQgb3RoZXIgZmVhdHVyZXMgaXQgc3VwcG9ydHMuXG4gICAgbWx4NVxuICAgIG1seHN3XG4gICAgbXY4OGU2eHh4XG4rICAgbXhsODYyeHhcbiAgICBuZXRkZXZzaW1cbiAgICBuZnBcbiAgICBvY3Rlb250eDJcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3QgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3Rcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi41YjI0ZDhjYjU3YmM5XG4tLS0gL2Rldi9udWxsXG4rKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3RcbkBAIC0wLDAgKzEsNzQgQEBcbisuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKz09PT09PT09PT09PT09PT09PT09PT09PVxuK214bDg2Mnh4IGRldmxpbmsgc3VwcG9ydFxuKz09PT09PT09PT09PT09PT09PT09PT09PVxuK1xuK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBkZXZsaW5rIGZlYXR1cmVzIGltcGxlbWVudGVkIGJ5IHRoZVxuK2BgbXhsODYyeHhgYCBkZXZpY2UgZHJpdmVyLlxuK1xuK0luZm8gdmVyc2lvbnNcbis9PT09PT09PT09PT09XG4rXG4rVGhlIGBgbXhsODYyeHhgYCBkcml2ZXIgcmVwb3J0cyB0aGUgZm9sbG93aW5nIHZlcnNpb25zXG4rXG4rLi4gbGlzdC10YWJsZTo6IGRldmxpbmsgaW5mbyB2ZXJzaW9ucyBpbXBsZW1lbnRlZFxuKyAgIDp3aWR0aHM6IDUgNSA1IDg1XG4rXG4rICAgKiAtIE5hbWVcbisgICAgIC0gVHlwZVxuKyAgICAgLSBFeGFtcGxlXG4rICAgICAtIERlc2NyaXB0aW9uXG4rICAgKiAtIGBgYXNpYy5pZGBgXG4rICAgICAtIGZpeGVkXG4rICAgICAtIDg2MjhcbisgICAgIC0gVGhlIGNoaXAgcGFydCBudW1iZXIgcmVhZCBmcm9tIHRoZSBDSElQIElEIHJlZ2lzdGVycy4gT21pdHRlZFxuKyAgICAgICB3aGVuIHRoZSBwYXJ0IG51bWJlciByZWFkcyBhcyB6ZXJvLCB3aGljaCBoYXBwZW5zIGZvciBhIHN3aXRjaFxuKyAgICAgICBzaXR0aW5nIGluIE1DVWJvb3QgcmVzY3VlIG1vZGUgKHRoZSByZWdpc3RlcnMgbmVlZCBhIHJ1bm5pbmdcbisgICAgICAgZmlybXdhcmUpLCBmb3IgYW4gdW5mdXNlZCBwYXJ0LCBhbmQgYWZ0ZXIgYSBmYWlsZWQgZmxhc2guXG4rICAgKiAtIGBgYXNpYy5yZXZgYFxuKyAgICAgLSBmaXhlZFxuKyAgICAgLSAwXG4rICAgICAtIFRoZSBjaGlwIHZlcnNpb24gcmVhZCBmcm9tIHRoZSBzYW1lIHJlZ2lzdGVyIHdvcmQsIHNvIGl0IGlzXG4rICAgICAgIG9taXR0ZWQgd2hlbmV2ZXIgYGBhc2ljLmlkYGAgaXMuXG4rICAgKiAtIGBgZndgYFxuKyAgICAgLSBydW5uaW5nLCBzdG9yZWRcbisgICAgIC0gMS4wLjcwXG4rICAgICAtIFZlcnNpb24gb2YgdGhlIGZpcm13YXJlIHJ1bm5pbmcgb24gdGhlIHN3aXRjaCwgcmVwb3J0ZWQgYXMgYm90aFxuKyAgICAgICBydW5uaW5nIGFuZCBzdG9yZWQgc2luY2UgdGhlIHN3aXRjaCBib290cyBpdCBmcm9tIGl0cyBvd24gZmxhc2guXG4rICAgICAgIEl0IGlzIG9taXR0ZWQgd2hpbGUgbm8gZmlybXdhcmUgdmVyc2lvbiBpcyBrbm93bjogYWZ0ZXIgYSBmYWlsZWRcbisgICAgICAgZmxhc2gsIGFuZCBpbiBNQ1Vib290IHJlc2N1ZSBtb2RlIHdoaWxlIGFuIGludGVycnVwdGVkIGRvd25sb2FkXG4rICAgICAgIGlzIHN0aWxsIGJlaW5nIHJlY292ZXJlZCBpbiB0aGUgYmFja2dyb3VuZC4gT25jZSB0aGUgbG9hZGVyIGlzXG4rICAgICAgIHJlYWR5IHRvIGFjY2VwdCBhIG5ldyBpbWFnZSB0aGUgdmVyc2lvbiBhcHBlYXJzIGFzIFwiMC4wLjBcIixcbisgICAgICAgd2hpY2ggbm8gcmVsZWFzZWQgZmlybXdhcmUgcmVwb3J0cywgc28gdmVyc2lvbi1jb21wYXJpbmcgdG9vbHNcbisgICAgICAgb2ZmZXIgYW55IGF2YWlsYWJsZSByZWxlYXNlIGFzIGFuIHVwZ3JhZGUuIFVzZSBgYGRldmxpbmsgZGV2XG4rICAgICAgIGZsYXNoYGAgdG8gdGVsbCBhIHJlY292ZXJpbmcgc3dpdGNoIGZyb20gYSByZWFkeSBvbmUsIHNlZSBiZWxvdztcbisgICAgICAgYSBtaXNzaW5nIHZlcnNpb24gb24gaXRzIG93biBkb2VzIG5vdCBzYXkgd2h5LlxuK1xuK0ZsYXNoIHVwZGF0ZVxuKz09PT09PT09PT09PVxuK1xuK1RoZSBgYG14bDg2Mnh4YGAgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgYGBkZXZsaW5rIGRldiBmbGFzaGBgLlxuK1RoZSBzaWduZWQgZmlybXdhcmUgaW1hZ2UgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHN3aXRjaCBvdmVyIHRoZSBzYW1lXG4rTURJTyBidXMgd2hpY2ggaXMgYWxzbyB1c2VkIHRvIG1hbmFnZSB0aGUgc3dpdGNoLCB0aGVuIHZlcmlmaWVkIGFuZFxuK2luc3RhbGxlZCBieSB0aGUgTUNVYm9vdCBib290bG9hZGVyIHJ1bm5pbmcgb24gdGhlIHN3aXRjaC4gQWxsIHBvcnRzXG4rb2YgdGhlIHN3aXRjaCBhcmUgY2xvc2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHVwZGF0ZSBhbmQgdGhlIGRyaXZlclxuK3JlcHJvYmVzIHRoZSBzd2l0Y2ggYWZ0ZXIgaXQgaGFzIHJlYm9vdGVkIGludG8gdGhlIG5ldyBmaXJtd2FyZS4gQVxuK2NvbXBsZXRlIGZsYXNoIGFuZCByZXByb2JlIGN5Y2xlIHRha2VzIGFib3V0IG9uZSBtaW51dGUuXG4rXG4rQSBzd2l0Y2ggc3R1Y2sgaW4gTUNVYm9vdCByZXNjdWUgbW9kZSwgZS5nLiBhZnRlciBhbiBpbnRlcnJ1cHRlZFxuK3VwZGF0ZSwgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHVzZXIgcG9ydHMuIElmIHRoZSBwcmV2aW91cyBkb3dubG9hZCB3YXNcbitpbnRlcnJ1cHRlZCBtaWQtdHJhbnNmZXIgdGhlIGxvYWRlciBpcyB3ZWRnZWQ7IHRoZSBkcml2ZXIgZHJhaW5zIGl0XG4rYmFjayB0byBhIGNsZWFuIHJlYWR5IHN0YXRlIGluIHRoZSBiYWNrZ3JvdW5kLCBvbmUgYnl0ZSBhdCBhIHRpbWUsXG4rd2hpY2ggdGFrZXMgdGVucyBvZiBtaW51dGVzIGZvciBhIGxhcmdlIGltYWdlIGFuZCBpcyByZXBvcnRlZCB0aHJvdWdoXG4rdGhlIGtlcm5lbCBsb2cgYXMgaXQgcHJvZ3Jlc3Nlcy4gRHVyaW5nIHRoYXQgcmVjb3ZlcnkgYGBkZXZsaW5rIGRldlxuK2ZsYXNoYGAgcmV0dXJucyBgYC1FQlVTWWBgIHdpdGggYW4gZXh0YWNrIG1lc3NhZ2Ugc2F5aW5nIHNvLCBhbmRcbitgYGRldmxpbmsgZGV2IGluZm9gYCByZXBvcnRzIG5vIGZpcm13YXJlIHZlcnNpb24uIE9uY2UgdGhlIGxvYWRlciBpc1xuK3JlYWR5IHRoZSBmaXJtd2FyZSB2ZXJzaW9uIGFwcGVhcnMgYW5kIGZsYXNoaW5nIGEgZmlybXdhcmUgaW1hZ2Vcbit0aHJvdWdoIHRoZSByZWd1bGFyIHVwZGF0ZSBmbG93IHJlY292ZXJzIHRoZSBzd2l0Y2guXG4rXG4rSWYgdGhlIHJlY292ZXJ5IGZhaWxzLCB0aGUgbG9hZGVyIG5lZWRzIGEgcG93ZXIgY3ljbGU6IGBgZGV2bGluayBkZXZcbitmbGFzaGBgIHRoZW4gcmV0dXJucyBgYC1FSU9gYCBhbmQgc2F5cyBzbyBpbiBpdHMgZXh0YWNrIG1lc3NhZ2UuIFRoZVxuK2RyaXZlciBvbmx5IHJlLWV4YW1pbmVzIHRoZSBzd2l0Y2ggd2hlbiBpdCBiaW5kcywgc28gb24gYSBib2FyZCB3aGVyZVxuK3RoZSBzd2l0Y2ggY2FuIGJlIHBvd2VyIGN5Y2xlZCBvbiBpdHMgb3duLCB1bmJpbmQgYW5kIHJlYmluZCB0aGUgZHJpdmVyXG4rYWZ0ZXJ3YXJkcyB0byBoYXZlIHRoZSByZWNvdmVyZWQgc3dpdGNoIHJlY29nbmlzZWQuXG5kaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSU1xuaW5kZXggOTkxNDYwMDUwZGE3NC4uZTNmN2RlZDU2OWJmNyAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4rKysgYi9NQUlOVEFJTkVSU1xuQEAgLTE2MTA2LDYgKzE2MTA2LDcgQEAgTTpcdERhbmllbCBHb2xsZSBcdTAwM2NkYW5pZWxAbWFrcm90b3BpYS5vcmdcdTAwM2VcbiBMOlx0bmV0ZGV2QHZnZXIua2VybmVsLm9yZ1xuIFM6XHRNYWludGFpbmVkXG4gRjpcdERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZHNhL21heGxpbmVhcixteGw4NjJ4eC55YW1sXG4rRjpcdERvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL214bDg2Mnh4LnJzdFxuIEY6XHRkcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvXG4gRjpcdG5ldC9kc2EvdGFnX214bDg2Mnh4LmNcbiBcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaFxuaW5kZXggYTViN2FiYzEwZmYwMi4uNjIzNGUzN2RlN2U5OSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvYmFzZS9iYXNlLmhcbisrKyBiL2RyaXZlcnMvYmFzZS9iYXNlLmhcbkBAIC0xMDYsNiArMTA2LDEwIEBAIHN0cnVjdCBkcml2ZXJfcHJpdmF0ZSB7XG4gICogQGRlYWQ6IFRoaXMgZGV2aWNlIGlzIGN1cnJlbnRseSBlaXRoZXIgaW4gdGhlIHByb2Nlc3Mgb2Ygb3IgaGFzIGJlZW5cbiAgKlx0ICByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4gQW55IGFzeW5jaHJvbm91cyBldmVudHMgc2NoZWR1bGVkIGZvciB0aGlzXG4gICpcdCAgZGV2aWNlIHNob3VsZCBleGl0IHdpdGhvdXQgdGFraW5nIGFueSBhY3Rpb24uXG4rICogQHNodXRkb3duX2RvbmU6IFNldCBvbmNlIGRldmljZV9zaHV0ZG93bigpIGhhcyByZWFjaGVkIHRoaXMgZGV2aWNlLCB1bmRlclxuKyAqXHQgIHRoZSBkZXZpY2UgbG9jaywgYmVmb3JlIGFueSBzaHV0ZG93biBjYWxsYmFjayBydW5zLiBSZWFkIHVuZGVyIHRoZVxuKyAqXHQgIGRldmljZSBsb2NrLiBBIGRlZmVycmVkIHJlLXByb2JlIHNjaGVkdWxlZCB3aXRoXG4rICpcdCAgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoKSBtdXN0IG5vdCBkZXRhY2ggdGhlIGRldmljZSBhbnltb3JlLlxuICAqXG4gICogTm90aGluZyBvdXRzaWRlIG9mIHRoZSBkcml2ZXIgY29yZSBzaG91bGQgZXZlciB0b3VjaCB0aGVzZSBmaWVsZHMuXG4gICovXG5AQCAtMTIwLDYgKzEyNCw3IEBAIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSB7XG4gXHRjaGFyICpkZWZlcnJlZF9wcm9iZV9yZWFzb247XG4gXHRzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7XG4gXHR1OCBkZWFkOjE7XG4rXHR1OCBzaHV0ZG93bl9kb25lOjE7XG4gfTtcbiAjZGVmaW5lIHRvX2RldmljZV9wcml2YXRlX3BhcmVudChvYmopXHRcXFxuIFx0Y29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9wYXJlbnQpXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmNcbmluZGV4IDRkMDI2NjgyOTQ0ZjIuLjhhN2RiZTRlODM2MmIgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jXG4rKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jXG5AQCAtNDkwNiw2ICs0OTA2LDkgQEAgdm9pZCBkZXZpY2Vfc2h1dGRvd24odm9pZClcbiBcdFx0XHRkZXZpY2VfbG9jayhwYXJlbnQpO1xuIFx0XHRkZXZpY2VfbG9jayhkZXYpO1xuIFxuK1x0XHRpZiAoZGV2LVx1MDAzZXApXG4rXHRcdFx0ZGV2LVx1MDAzZXAtXHUwMDNlc2h1dGRvd25fZG9uZSA9IHRydWU7XG4rXG4gXHRcdC8qIERvbid0IGFsbG93IGFueSBtb3JlIHJ1bnRpbWUgc3VzcGVuZHMgKi9cbiBcdFx0cG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTtcbiBcdFx0cG1fcnVudGltZV9iYXJyaWVyKGRldik7XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RkLmMgYi9kcml2ZXJzL2Jhc2UvZGQuY1xuaW5kZXggNjBjMDA1MjIzODQ0ZC4uYmI4YjM0YWNkZTAwZCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jXG4rKysgYi9kcml2ZXJzL2Jhc2UvZGQuY1xuQEAgLTE0MzYsMyArMTQzNiw4NSBAQCB2b2lkIGRyaXZlcl9kZXRhY2goY29uc3Qgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydilcbiBcdFx0cHV0X2RldmljZShkZXYpO1xuIFx0fVxuIH1cbitcbitzdHJ1Y3QgZGV2aWNlX3JlcHJvYmUge1xuK1x0c3RydWN0IGRlbGF5ZWRfd29yayB3b3JrO1xuK1x0c3RydWN0IGRldmljZSAqZGV2O1xuK1x0Y29uc3Qgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjtcbit9O1xuK1xuK3N0YXRpYyB2b2lkIGRldmljZV9yZXByb2JlX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuK3tcbitcdHN0cnVjdCBkZXZpY2VfcmVwcm9iZSAqcnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRldmljZV9yZXByb2JlLFxuK1x0XHRcdFx0XHRcdCB3b3JrLndvcmspO1xuK1x0c3RydWN0IGRldmljZSAqZGV2ID0gcnAtXHUwMDNlZGV2O1xuK1x0c3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LVx1MDAzZXBhcmVudDtcbitcdGJvb2wgZGV0YWNoZWQgPSBmYWxzZTtcbitcbitcdF9fZGV2aWNlX2RyaXZlcl9sb2NrKGRldiwgcGFyZW50KTtcbitcdC8qXG4rXHQgKiBycC1cdTAwM2VkcnYgaXMgb25seSBldmVyIGNvbXBhcmVkLCBuZXZlciBkZXJlZmVyZW5jZWQ6IHRoZSBkcml2ZXIgaXRcbitcdCAqIHBvaW50cyB0byBtYXkgaGF2ZSBiZWVuIHVucmVnaXN0ZXJlZCBhbmQgZnJlZWQgYnkgbm93LlxuK1x0ICovXG4rXHRpZiAoIWRldi1cdTAwM2VwLVx1MDAzZWRlYWQgXHUwMDI2XHUwMDI2ICFkZXYtXHUwMDNlcC1cdTAwM2VzaHV0ZG93bl9kb25lIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGRldi1cdTAwM2Vkcml2ZXIgXHUwMDI2XHUwMDI2IGRldi1cdTAwM2Vkcml2ZXIgPT0gcnAtXHUwMDNlZHJ2KSB7XG4rXHRcdF9fZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldiwgcGFyZW50KTtcbitcdFx0ZGV0YWNoZWQgPSB0cnVlO1xuK1x0fVxuK1x0X19kZXZpY2VfZHJpdmVyX3VubG9jayhkZXYsIHBhcmVudCk7XG4rXG4rXHRpZiAoZGV0YWNoZWQgXHUwMDI2XHUwMDI2IGRldmljZV9hdHRhY2goZGV2KSBcdTAwM2MgMClcbitcdFx0ZGV2X2VycihkZXYsIFwicmUtcHJvYmUgZmFpbGVkLCBkZXZpY2UgbGVmdCB1bmJvdW5kXFxuXCIpO1xuK1xuK1x0cHV0X2RldmljZShkZXYpO1xuK1x0a2ZyZWUocnApO1xuK31cbitcbisvKipcbisgKiBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSAtIHNjaGVkdWxlIGEgZGVmZXJyZWQgZGV0YWNoIGFuZCByZS1wcm9iZVxuKyAqIEBkZXY6IGRldmljZSB0byBkZXRhY2ggYW5kIHJlLXByb2JlXG4rICogQGRlbGF5X21zOiBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSByZS1wcm9iZSBydW5zXG4rICpcbisgKiBTY2hlZHVsZSBhIGRldGFjaCBhbmQgcmUtcHJvYmUgb2YgQGRldiBhZnRlciBAZGVsYXlfbXMgbWlsbGlzZWNvbmRzLlxuKyAqIFRoZSByZS1wcm9iZSBpcyBza2lwcGVkIGlmLCBieSB0aGUgdGltZSB0aGUgc2NoZWR1bGVkIHdvcmsgcnVucywgdGhlXG4rICogZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQsIHRoZSBzeXN0ZW0gc2h1dGRvd24gc2VxdWVuY2UgaGFzIHJlYWNoZWQgdGhlXG4rICogZGV2aWNlLCBvciBAZGV2IGlzIG5vIGxvbmdlciBib3VuZCB0byB0aGUgZHJpdmVyIHRoYXQgd2FzIGJvdW5kIGF0XG4rICogc2NoZWR1bGluZyB0aW1lLiBJbiBwYXJ0aWN1bGFyIGFuIGFkbWluaXN0cmF0aXZlIHVuYmluZCBpcyBuZXZlclxuKyAqIHVuZG9uZSBieSBhIHN0YWxlIHJlLXByb2JlLlxuKyAqXG4rICogVGhlIHdvcmsgZnVuY3Rpb24gaXMgYnVpbHQtaW4gdGV4dCwgc28gdGhlIGJvdW5kIGRyaXZlciBtYXkgY2FsbCB0aGlzXG4rICogZnJvbSBpdHMgb3duIGNvZGUgd2l0aG91dCBob2xkaW5nIGEgbW9kdWxlIHJlZmVyZW5jZS4gSWYgdGhlIGRyaXZlclxuKyAqIG1vZHVsZSBpcyB1bmxvYWRlZCBiZWZvcmUgdGhlIHdvcmsgcnVucywgZHJpdmVyIHVucmVnaXN0cmF0aW9uIHVuYmluZHNcbisgKiBAZGV2IGZpcnN0IGFuZCB0aGUgc2NoZWR1bGVkIHdvcmsgZG9lcyBub3RoaW5nLlxuKyAqXG4rICogTXVsdGlwbGUgcGVuZGluZyByZS1wcm9iZXMgZm9yIHRoZSBzYW1lIGRldmljZSBhcmUgaW5kaXZpZHVhbGx5IHNhZmU7XG4rICogYSBjYWxsZXIgdGhhdCB3YW50cyBhdCBtb3N0IG9uZSBwZW5kaW5nIHJlLXByb2JlIG11c3QgZ2F0ZSBzY2hlZHVsaW5nXG4rICogaXRzZWxmLlxuKyAqXG4rICogTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0LlxuKyAqXG4rICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIEBkZXYgaXMgbm90IGEgcmVnaXN0ZXJlZCBkZXZpY2VcbisgKiBib3VuZCB0byBhIGRyaXZlciwgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXG4rICovXG4raW50IGRldmljZV9zY2hlZHVsZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGRlbGF5X21zKVxuK3tcbitcdHN0cnVjdCBkZXZpY2VfcmVwcm9iZSAqcnA7XG4rXG4rXHRpZiAoIWRldi1cdTAwM2VidXMgfHwgIWRldi1cdTAwM2VwIHx8ICFkZXZpY2VfaXNfcmVnaXN0ZXJlZChkZXYpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdGlmICghZGV2LVx1MDAzZWRyaXZlcilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRycCA9IGt6YWxsb2Nfb2JqKCpycCk7XG4rXHRpZiAoIXJwKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdHJwLVx1MDAzZWRldiA9IGdldF9kZXZpY2UoZGV2KTtcbitcdHJwLVx1MDAzZWRydiA9IFJFQURfT05DRShkZXYtXHUwMDNlZHJpdmVyKTtcbitcdElOSVRfREVMQVlFRF9XT1JLKFx1MDAyNnJwLVx1MDAzZXdvcmssIGRldmljZV9yZXByb2JlX3dvcmtfZm4pO1xuK1x0cXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9kZmxfd3EsIFx1MDAyNnJwLVx1MDAzZXdvcmssXG4rXHRcdFx0ICAgbXNlY3NfdG9famlmZmllcyhkZWxheV9tcykpO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9zY2hlZHVsZV9yZXByb2JlKTtcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvTWFrZWZpbGVcbmluZGV4IGE3YmUwZTY2NjlkZmEuLmJjY2FjMGQwZjcwM2YgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvTWFrZWZpbGVcbisrKyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZVxuQEAgLTEsMyArMSwzIEBAXG4gIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIG9iai0kKENPTkZJR19ORVRfRFNBX01YTDg2MikgKz0gbXhsODYyeHhfZHNhLm9cbi1teGw4NjJ4eF9kc2EteSA6PSBteGw4NjJ4eC5vIG14bDg2Mnh4LWhvc3QubyBteGw4NjJ4eC1waHlsaW5rLm9cbitteGw4NjJ4eF9kc2EteSA6PSBteGw4NjJ4eC5vIG14bDg2Mnh4LWhvc3QubyBteGw4NjJ4eC1waHlsaW5rLm8gbXhsODYyeHgtZncub1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1hcGkuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1hcGkuaFxuaW5kZXggYTE4MGE1ZGVjZmZjMC4uNmY3NzE4OTU5ODRjYiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1hcGkuaFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oXG5AQCAtMTIyNCw2ICsxMjI0LDE2IEBAIHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB7XG4gXHRfX2xlMzIgaXZfYnVpbGRfbnVtO1xuIH0gX19wYWNrZWQ7XG4gXG4rLyoqXG4rICogc3RydWN0IG14bDg2Mnh4X3N5c19yZWdfcncgLSBTeXN0ZW0gcmVnaXN0ZXIgcmVhZC93cml0ZVxuKyAqIEBhZGRyOiAzMi1iaXQgcmVnaXN0ZXIgYWRkcmVzc1xuKyAqIEB2YWw6IHJlZ2lzdGVyIHZhbHVlXG4rICovXG4rc3RydWN0IG14bDg2Mnh4X3N5c19yZWdfcncge1xuK1x0X19sZTMyIGFkZHI7XG4rXHRfX2xlMzIgdmFsO1xuK30gX19wYWNrZWQ7XG4rXG4gLyoqXG4gICogZW51bSBteGw4NjJ4eF9wb3J0X3R5cGUgLSBQb3J0IFR5cGVcbiAgKiBATVhMODYyWFhfTE9HSUNBTF9QT1JUOiBMb2dpY2FsIFBvcnRcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtY21kLmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtY21kLmhcbmluZGV4IGM4N2E5NTVjMTNjNDguLmE4NjU0MjVhYTYxZTEgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtY21kLmhcbisrKyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1jbWQuaFxuQEAgLTcwLDcgKzcwLDkgQEBcbiAjZGVmaW5lIElOVF9HUEhZX1JFQURcdFx0XHQoR1BZX0dQWTJYWF9NQUdJQyArIDB4MSlcbiAjZGVmaW5lIElOVF9HUEhZX1dSSVRFXHRcdFx0KEdQWV9HUFkyWFhfTUFHSUMgKyAweDIpXG4gXG4rI2RlZmluZSBTWVNfTUlTQ19GV19VUERBVEVcdFx0KFNZU19NSVNDX01BR0lDICsgMHgxKVxuICNkZWZpbmUgU1lTX01JU0NfRldfVkVSU0lPTlx0XHQoU1lTX01JU0NfTUFHSUMgKyAweDIpXG4rI2RlZmluZSBTWVNfTUlTQ19SRUdfUkRcdFx0XHQoU1lTX01JU0NfTUFHSUMgKyAweDgpXG4gXG4gI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19DT05GSUdcdChNWEw4NjJYWF9YUENTX01BR0lDICsgMHgxKVxuICNkZWZpbmUgTVhMODYyWFhfWFBDU19QQ1NfR0VUX1NUQVRFXHQoTVhMODYyWFhfWFBDU19NQUdJQyArIDB4MilcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjZlMDM3ZDk1NjQwYlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmNcbkBAIC0wLDAgKzEsMTA1NCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4rLypcbisgKiBGaXJtd2FyZSBmbGFzaCBhbmQgZGV2bGluayBzdXBwb3J0IGZvciBNYXhMaW5lYXIgTXhMODYyeHhcbisgKlxuKyAqIENvcHlyaWdodCAoQykgMjAyNSBEYW5pZWwgR29sbGUgXHUwMDNjZGFuaWVsQG1ha3JvdG9waWEub3JnXHUwMDNlXG4rICpcbisgKiBTQiBQREkgLSBmaXJtd2FyZSBkb3dubG9hZCBpbnRlcmZhY2Ugb3ZlciBjbGF1c2UtMjIgU01ESU9cbisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbisgKlxuKyAqIFRoZSBNeEw4NjJ4eCBNQ1Vib290IGxvYWRlciBhY2NlcHRzIGEgZmlybXdhcmUgaW1hZ2UgdGhyb3VnaCBmb3VyIFwiU0IgUERJXCJcbisgKiByZWdpc3RlcnMgaW4gdGhlIHN3aXRjaCBTTURJTyByZWdpc3RlciBzcGFjZS4gSXQgcnVucyB3aGVuZXZlciBubyBXU1BcbisgKiBmaXJtd2FyZSBpcyBhY3RpdmU6IHRoZSBub3JtYWwgZmlybXdhcmUgdXBkYXRlIGVudGVycyBpdCBkZWxpYmVyYXRlbHkgLSB0aGVcbisgKiBTWVNfTUlTQ19GV19VUERBVEUgQVBJIGNvbW1hbmQgc2V0cyBhIHN0aWNreSByZXNjdWUgYml0IGFuZCByZWJvb3RzIGludG9cbisgKiBNQ1Vib290IC0gYW5kIHRoZSBsb2FkZXIgYWxzbyBzdGF5cyBoZXJlIHdoZW4gdGhlIHN0b3JlZCBXU1AgZmlybXdhcmUgZmFpbHNcbisgKiBpdHMgYm9vdC10aW1lIGludGVncml0eSBjaGVjay4gVGhpcyBkcml2ZXIgZHJpdmVzIHRoZSBsb2FkZXIncyAweGM1NWNcbisgKiBcImNvbnNvbGVcIiBkb3dubG9hZCBwYXRoLlxuKyAqXG4rICogU01ESU8gcmVnaXN0ZXIgYWNjZXNzIChteGw4NjJ4eF9zbWRpb19yZWFkL3dyaXRlKTpcbisgKiAgIE1JSSByZWcgMHgxZiA6PSAoXHUwMDNjc2JfcGRpX3JlZ1x1MDAzZSBcdTAwMjYgMHhmZmYwKSAgIDsgcGFnZSBsYXRjaFxuKyAqICAgTUlJIHJlZyAoXHUwMDNjc2JfcGRpX3JlZ1x1MDAzZSBcdTAwMjYgMHgwMDBmKSA6PSAvID1cdTAwM2UgXHUwMDNjdTE2IGRhdGFcdTAwM2VcbisgKiBzbyBDVFJML0FERFIvREFUQS9TVEFUICgweGUxMDAuLjB4ZTEwMykgYXJlIE1JSSByZWdzIDAvMS8yLzMgb2YgcGFnZVxuKyAqIDB4ZTEwMCwgbm90IGFsbCByZWcgMHgwMC5cbisgKlxuKyAqIFNCIFBESSByZWdpc3RlcnMgKGhvc3QgbmFtZS9hZGRyICAtXHUwMDNlICBNQ1UgbWFpbGJveCk6XG4rICogICBDVFJMIDB4ZTEwMCAtXHUwMDNlIDB4YzA5Mzg0MDAgICBtb2RlOiBSU1Q9MHgwMCAgUkQ9MHgwMSAgV1I9MHgwMlxuKyAqICAgQUREUiAweGUxMDEgLVx1MDAzZSAweGMwOTM4NDA0ICAgU0IgdGFyZ2V0IHdvcmQgYWRkcmVzcyAoU0IxIGJhbmsgPSAweDc4MDApXG4rICogICBEQVRBIDB4ZTEwMiAtXHUwMDNlIDB4YzA5Mzg0MDggICAxNi1iaXQgZGF0YSAvIHJlcGx5IHdvcmRcbisgKiAgIFNUQVQgMHhlMTAzIC1cdTAwM2UgMHhjMDkzODQwYyAgIGhhbmRzaGFrZTogYSBtYWdpYyAoYmVsb3cpIG9yIGEgYnl0ZSBjb3VudFxuKyAqXG4rICogU1RBVCBtYWdpY3M6XG4rICogICBSRUFEWSAgMHhjNTVjICAgbG9hZGVyIGlkbGUgaW4gdGhlIGNvbnNvbGUgbG9vcCAgICAgICAgKHRoaXMgZHJpdmVyKVxuKyAqICAgRExfUkRZIDB4YzMzYyAgIGxvYWRlciBpZGxlIGluIHRoZSBmbGFzaGxlc3MgbG9vcFxuKyAqICAgU1RBUlQgIDB4ZjQ4ZiAgIGhvc3QgICAtXHUwMDNlIGJlZ2luIGRvd25sb2FkIHNlc3Npb25cbisgKiAgIEFDSyAgICAweGY0OTAgICBsb2FkZXIgLVx1MDAzZSBTVEFSVCBhY2tub3dsZWRnZWQgKFNUQVJUICsgMSlcbisgKiAgIEVORCAgICAweDNjYzMgICBob3N0ICAgLVx1MDAzZSBmaW5hbGlzZSBub3cgKG9wdGlvbmFsLCBzZWUgYmVsb3cpXG4rICogICBSRFJFRyAgMHhlMmMwICAgaG9zdCAgIC1cdTAwM2UgcmVnaXN0ZXItcmVhZCBjb21tYW5kICh8IGluZGV4KSwgc2VlIGJlbG93XG4rICpcbisgKiBDb25zb2xlIGZsYXNoIHBhdGggKFNUQVQ9MHhjNTVjKSAtIG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKCk6XG4rICpcbisgKiAgIGhvc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlclxuKyAqICAgLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tXG4rICogICByZXNldCAoQ1RSTD1BRERSPURBVEE9MClcbisgKiAgIHJlYWQgU1RBVCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDB4YzU1YyAgIChSRUFEWSwgaWRsZSlcbisgKiAgIFNUQVQgOj0gU1RBUlQoMHhmNDhmKSAgLS0tLS0tLS0tLS0tLS1cdTAwM2VcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXHUwMDNjLS0tLS0tLS0tLS0tLS0gU1RBVCA9IDB4ZjQ5MCAoQUNLKVxuKyAqICAgQ1RSTCA6PSBXUlxuKyAqICAgREFUQSA6PSBoZHJbMC4uOV0gICgyMC1ieXRlIGhlYWRlcjogdHlwZSxzaXplMSxjcmMxLHNpemUyLGNyYzIpXG4rICogICByZXNldDsgU1RBVCA6PSAyMCAoaGVhZGVyIGxlbikgIC0tLS0tXHUwMDNlIHBhcnNlIGhkcjsgcl9yZW1haW49c2l6ZTErc2l6ZTI7XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUkFTRSB0YXJnZXQgcmVnaW9uKHMpXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzYy0tLS0tLS0tLS0tLS0tIFNUQVQ9MjEgKGxlbisxKSwgdGhlbiBTVEFUPTBcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcmFzZWQpXG4rICogICAtLSBwYXlsb2FkLCBzdHJlYW1lZCBpbiBzbGljZXM6IC0tXG4rICogICBDVFJMIDo9IFdSXG4rICogICBEQVRBIDo9IHdvcmQgeCBOIC4uLlxuKyAqICAgICBhdCB3b3JkIDE2Mzg0OiBDVFJMOj1SU1Q7IEFERFI6PTB4NzgwMDsgQ1RSTDo9V1IgIChoYWxmLWJhbmsgLVx1MDAzZSBTQjEpXG4rICogICAgIGF0IHdvcmQgMzI3NjA6IGZsdXNoIHNsaWNlOlxuKyAqICAgICAgICByZXNldDsgU1RBVCA6PSBcdTAwM2NieXRlc190aGlzX3NsaWNlXHUwMDNlIC0tLVx1MDAzZSByX3JlbWFpbiAtPSBieXRlczsgcHJvZ3JhbVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBcdTAwM2MtLS0tLS0tLS0tLS0tLS0tLS0tIFNUQVQ9MCAgKHJlYWR5IGZvciBuZXh0IHNsaWNlKVxuKyAqICAgLi4uIHJlcGVhdCB1bnRpbCB0aGUgd2hvbGUgcGF5bG9hZCBpcyBzZW50IC4uLlxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBcdTAwM2MtLS0tLS0tLS0tLS0tLS0tLS0tIFNUQVQ9MCAgaW1hZ2UgdmVyaWZpZWRcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNUQVQ9MTogaW1hZ2UgcmVqZWN0ZWQpXG4rICogICBTVEFUIDo9IEVORCgweDNjYzMpICAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cdTAwM2UgZmluYWxpc2UgYW5kIGJvb3RcbisgKlxuKyAqIFRoZSByX3JlbWFpbiA9PSAwIHJ1bGUgKGNyaXRpY2FsKTpcbisgKiAgIEV2ZXJ5IGhvc3QgU1RBVCB3cml0ZSBpbiB0aGUgcGF5bG9hZCBwaGFzZSBpcyBhIGJ5dGUgY291bnQ7IHRoZSBsb2FkZXJcbisgKiAgIGRvZXMgcl9yZW1haW4gLT0gY291bnQgYW5kIHN0YXlzIGluIHRoZSByZWNlaXZlIGxvb3Agd2hpbGUgcl9yZW1haW4gIT0gMC5cbisgKiAgIEl0IGxlYXZlcyB0aGUgbG9vcCBPTkxZIHdoZW4gcl9yZW1haW4gaGl0cyBFWEFDVExZIDAsIGFuZCBhIGNvdW50IGxhcmdlclxuKyAqICAgdGhhbiByX3JlbWFpbiB1bmRlcmZsb3dzIHRoZSAzMi1iaXQgY291bnRlciBhbmQgd2VkZ2VzIHRoZSBsb2FkZXIgdW50aWwgYVxuKyAqICAgcG93ZXIgY3ljbGUuIEhhdmluZyBsZWZ0IGl0LCB0aGUgbG9hZGVyIHZlcmlmaWVzIHRoZSBpbWFnZSwgcHVibGlzaGVzIHRoZVxuKyAqICAgdmVyZGljdCBpbiBTVEFUICgwIGdvb2QsIDEgcmVqZWN0ZWQpIGFuZCB3YWl0cyAyIHMgZm9yIEVORCBiZWZvcmVcbisgKiAgIGZpbmFsaXNpbmcgcmVnYXJkbGVzcyAtLSBjbGVhcmluZyBpdHMgcmVzY3VlLWVuYWJsZSBiaXQgc28gYm9vdF9nbyBib290c1xuKyAqICAgdGhlIG5ldyBpbWFnZSAtLSBzbyBFTkQgb25seSBzYXZlcyB0aGF0IHdhaXQuIEhlbmNlOlxuKyAqICAgICAtIG5ldmVyIHNlbmQgYSBzbGljZS9jaHVuayBjb3VudCBsYXJnZXIgdGhhbiB3aGF0IGlzIG91dHN0YW5kaW5nO1xuKyAqICAgICAtIGEgU1RBVCB3cml0ZSBpcyBhIGNvbW1hbmQgb25seSBvbmNlIHRoZSBsb2FkZXIgaGFzIGxlZnQgdGhlIGxvb3A7XG4rICogICAgIC0gdGhlIGxvYWRlciBsZWF2ZXMgdGhlIGNvdW50IGluIFNUQVQgd2hpbGUgaXQgcHJvZ3JhbXMgdGhlIGNodW5rLCBzb1xuKyAqICAgICAgIGEgbGluZ2VyaW5nIGNvdW50IGRvZXMgbm90IGRpc3Rpbmd1aXNoIFwiYnVzeVwiIGZyb20gXCJ2ZXJkaWN0XCI7XG4rICogICAgIC0gaW50ZXJydXB0ZWQtZG93bmxvYWQgcmVjb3ZlcnkgZmVlZHMgMSBieXRlIGF0IGEgdGltZSAoc2VlIGJlbG93KS5cbisgKlxuKyAqIEludGVycnVwdGVkLWZsYXNoIHJlY292ZXJ5IChteGw4NjJ4eF9yZXNjdWVfZHJhaW4pOlxuKyAqICAgQSBob3N0IHRoYXQgZGllcyBtaWQtcGF5bG9hZCBsZWF2ZXMgdGhlIGxvYWRlciBpbiB0aGUgcmVjZWl2ZSBsb29wIGhvbGRpbmdcbisgKiAgIFNUQVQ9MC4gRmVlZCBzaW5nbGUgMS1ieXRlIGNodW5rcyAob25lIERBVEEgd29yZCArIFNUQVQ9MSkgdW50aWwgcl9yZW1haW5cbisgKiAgIHJlYWNoZXMgMDsgdGhlIGxvYWRlciB0aGVuIHZlcmlmaWVzIHRoZSAobm93IGNvcnJ1cHQpIGltYWdlLCBwdWJsaXNoZXMgaXRzXG4rICogICB2ZXJkaWN0IGFuZCBjb21lcyBiYWNrIHRvIFJFQURZIGJ5IGl0c2VsZi4gRU5EIGlzIG5ldmVyIHNlbnQgaGVyZTogd2hpbGVcbisgKiAgIHJfcmVtYWluIGlzIG5vbi16ZXJvIGl0IHdvdWxkIGJlIGNvbnN1bWVkIGFzIGEgMTU1NTUtYnl0ZSBjb3VudCwgYW5kIGFcbisgKiAgIGxpbmdlcmluZyBTVEFUPTEgY2Fubm90IGJlIHRvbGQgZnJvbSBhIGNodW5rIHN0aWxsIGJlaW5nIHByb2dyYW1tZWQuXG4rICpcbisgKiBSZWdpc3Rlci1yZWFkIGNoYWxsZW5nZSAobm9uLWRlc3RydWN0aXZlIGxpdmVuZXNzIHByb29mKTpcbisgKiAgIERBVEEgOj0gMHg3YzIzIChtYXJrZXIpOyBTVEFUIDo9IDB4ZTJjMHxpZHhcbisgKiAgICAgLVx1MDAzZSBsb2FkZXIgcmV0dXJucyBhIHJ1bnRpbWUgd29yZCBpbiBEQVRBIGFuZCByZS1hcm1zIFNUQVQ9MHhjNTVjLlxuKyAqICAgVGhlIHJlcGx5IHNvdXJjZSBpcyBsb2FkZXIgQlNTLCBub3QgYSBjaGlwIGlkOyB1c2VkIG9ubHkgdG8gcHJvdmUgYSBsaXZlXG4rICogICBtYWlsYm94IGluIG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdCgpLlxuKyAqXG4rICogVGhlIG90aGVyIFNUQVQgcmVhZHkgbWFnaWMsIDB4YzMzYywgbWFya3MgdGhlIGxvYWRlcidzIGZsYXNobGVzc1xuKyAqIGNoaXAtdG8tY2hpcCBkb3dubG9hZCBtb2RlIChNeEw4NjI4MVMgMTYtcG9ydCB0aWVyKTsgdGhpcyBkcml2ZXIgZG9lcyBub3RcbisgKiB1c2UgaXQuXG4rICpcbisgKiBSZXNjdWUgbGlmZWN5Y2xlIChkZXZsaW5rKTogcHJvYmUgcnVucyBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QoKTsgYVxuKyAqIHdlZGdlZCBsb2FkZXIgaXMgZHJhaW5lZCBiYWNrIHRvIFJFQURZIGJ5IGEgYmFja2dyb3VuZCBzZWxmLWhlYWxcbisgKiAocmVzY3VlX2hlYWxfd29yayksIHNvIHRoZSBsb25nIHJlY292ZXJ5IG5ldmVyIGhvbGRzIHRoZSBkZXZsaW5rIGxvY2suXG4rICogZGV2bGluayBkZXYgaW5mbyBleHBvc2VzIHRoZSBmdyB2ZXJzaW9uICh0aGUgXCJmbGFzaGFibGVcIiBzaWduYWwpIG9ubHkgb25jZSBhdFxuKyAqIFJFQURZOyBmbGFzaF91cGRhdGUgcmV0dXJucyAtRUJVU1kgdW50aWwgdGhlbiwgYW5kIHJlcHJvYmVzIHRvIFdTUCBmaXJtd2FyZVxuKyAqIG9uIHN1Y2Nlc3MuXG4rICpcbisgKiBOb3RlczpcbisgKiAgIC0gQ2hpcCBpZC9yZXZpc2lvbiAoMHhjMGQyODg4NC84OCkgYXJlIE5PVCByZWFjaGFibGUgb24gdGhpcyBjaGFubmVsOyB0aGV5XG4rICogICAgIG5lZWQgdGhlIGNsYXVzZS00NSBNTUQgZmlybXdhcmUgbWFpbGJveCwgd2hpY2ggaXMgZGVhZCB1bmRlciBNQ1Vib290LlxuKyAqICAgICBSZXNjdWUgaWRlbnRpdHkgaXMgYnkgU0IgUERJIGJlaGF2aW91ciBvbmx5IChteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QpLlxuKyAqICAgLSBUaGUgU01ESU8gUEhZIGFkZHJlc3MgY29tZXMgZnJvbSB0aGUgZGV2aWNlIHRyZWU7IHRoZSAweGUxeHggcmVnaXN0ZXJcbisgKiAgICAgb2Zmc2V0cyBhcmUgdGhlIE9UUCByZXNldCBkZWZhdWx0cyBhbmQgdGhlIG9ubHkgbGF5b3V0IHN1cHBvcnRlZCBoZXJlLlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyYzMyLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWxheS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZGV2aWNlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pb3BvbGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L25ldGRldmljZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvb3ZlcmZsb3cuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3J0bmV0bGluay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvZHNhLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvc3dpdGNoZGV2LmhcdTAwM2VcbitcbisjaW5jbHVkZSBcIm14bDg2Mnh4LmhcIlxuKyNpbmNsdWRlIFwibXhsODYyeHgtYXBpLmhcIlxuKyNpbmNsdWRlIFwibXhsODYyeHgtY21kLmhcIlxuKyNpbmNsdWRlIFwibXhsODYyeHgtZncuaFwiXG4rI2luY2x1ZGUgXCJteGw4NjJ4eC1ob3N0LmhcIlxuK1xuKy8qIFNCIFBESSByZWdpc3RlcnMgKGNsYXVzZS0yMiBTTURJTyBhZGRyZXNzIHNwYWNlKSAqL1xuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxcdFx0MHhlMTAwXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfQUREUlx0XHQweGUxMDFcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9EQVRBXHRcdDB4ZTEwMlxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1NUQVRcdFx0MHhlMTAzXG4rXG4rLyogU0IgUERJIENUUkwgbW9kZXMgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVFx0MHgwMFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxfV1JcdFx0MHgwMlxuK1xuKy8qIFNCIFBESSBoYW5kc2hha2UgbWFnaWMgKHB1Ymxpc2hlZC9jb25zdW1lZCB2aWEgU1RBVCkgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9SRUFEWVx0XHQweGM1NWNcdC8qIGxvYWRlciBpZGxlLCBjb25zb2xlIGxvb3AgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9ETF9SRUFEWVx0MHhjMzNjXHQvKiBsb2FkZXIgaWRsZSwgZmxhc2hsZXNzIGxvb3AgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEFSVFx0XHQweGY0OGZcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9FTkRcdFx0MHgzY2MzXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfUkRSRUdcdFx0MHhlMmMwXHQvKiByZWdpc3Rlci1yZWFkIGNtZCAofCBpbmRleCkgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9SRFJFR19NQVJLXHQweDdjMjNcdC8qIG1hcmtlciBwbGFjZWQgaW4gREFUQSBmb3IgUkRSRUcgKi9cbitcbisvKiBCZWhhdmlvdXJhbCBwcmVzZW5jZSBwcm9iZTogdHdvIGRpc3RpbmN0IDE2LWJpdCBsYXRjaGVzIG9uIEFERFIvREFUQS4gKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9QUk9CRV9BXHRcdDB4NWE1YVxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1BST0JFX0RcdFx0MHhhNWE1XG4rXG4rLyogSW1hZ2UgdmVyaWZpY2F0aW9uIHZlcmRpY3QgcHVibGlzaGVkIGluIFNUQVQgb25jZSB0aGUgcmVjZWl2ZSBsb29wIGVuZHMgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9WRVJJRllfT0tcdDBcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9WRVJJRllfQkFEXHQxXG4rXG4rLyogRmlybXdhcmUgdHJhbnNmZXIgZ2VvbWV0cnkgKi9cbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0hEUl9TSVpFXHRcdDIwXG4rI2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX0hBTEZcdFx0MTYzODRcdC8qIHdvcmRzIHBlciBoYWxmLWJhbmsgKi9cbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0JBTktfU0xJQ0VcdFx0MzI3NjBcdC8qIHdvcmRzIHBlciBmdWxsIHNsaWNlICovXG4rI2RlZmluZSBNWEw4NjJYWF9GV19TQjFfQUREUlx0XHQweDc4MDBcdC8qIFNCMSB3b3JkIGFkZHJlc3MgKi9cbitcbisvKiBUaW1lb3V0cyAoZ2VuZXJvdXMgdXBwZXIgYm91bmRzKSAqL1xuKyNkZWZpbmUgTVhMODYyWFhfRldfUkVBRFlfVElNRU9VVF9NU1x0MzAwMFxuKyNkZWZpbmUgTVhMODYyWFhfRldfQUNLX1RJTUVPVVRfTVNcdDUwMDBcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0VSQVNFX1RJTUVPVVRfTVNcdDMwMDAwMFxuKyNkZWZpbmUgTVhMODYyWFhfRldfV1JJVEVfVElNRU9VVF9NU1x0NjAwMDBcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX1JFQk9PVF9ERUxBWV9NU1x0NTAwMFxuKyNkZWZpbmUgTVhMODYyWFhfRldfUkVQUk9CRV9ERUxBWV9NU1x0NTAwXG4rLyogT25lIGxvYWRlciBtYWlsYm94IHN0ZXA6IHByb2dyYW0gYSAxLWJ5dGUgY2h1bmsgb3Igc2VydmljZSBhIGNvbW1hbmQgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TXHRcdDIwMDBcbisvKiBDb3ZlcnMgdGhlIGxvYWRlcidzIEVORCB3YWl0LCB2ZXJpZmljYXRpb24gYW5kIHRoZSByZXNldCBpbnRvIFJFQURZICovXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TXHQxNTAwMFxuK1xuK3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxuK3tcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbitcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsXG4rXHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldHVybiBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSxcbitcdFx0XHRcdCAgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpO1xuK31cbitcbitzdGF0aWMgaW50IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUxNiBleHBlY3RlZCxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0X21zKVxuK3tcbitcdGludCByZXQsIHZhbDtcbitcbitcdHJldCA9IHJlYWRfcG9sbF90aW1lb3V0KG14bDg2Mnh4X3NtZGlvX3JlYWQsIHZhbCxcbitcdFx0XHRcdHZhbCBcdTAwM2MgMCB8fCAodTE2KXZhbCA9PSBleHBlY3RlZCxcbitcdFx0XHRcdDEwMDAwLCB0aW1lb3V0X21zICogMTAwMCwgZmFsc2UsXG4rXHRcdFx0XHRwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XG4rXHRpZiAodmFsIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gdmFsO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2Uoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsXG4rXHRcdFx0XHQgICAgICAgdTMyIGRhdGFfd3JpdHRlbilcbit7XG4rXHRpbnQgcmV0O1xuK1xuK1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULCBkYXRhX3dyaXR0ZW4pO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldHVybiBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIDAsXG4rXHRcdFx0XHRcdCBNWEw4NjJYWF9GV19XUklURV9USU1FT1VUX01TKTtcbit9XG4rXG4rLyogRmx1c2ggdGhlIGxhc3Qgc2xpY2UsIHdoaWNoIGVuZHMgdGhlIHJlY2VpdmUgbG9vcDogdGhlIGxvYWRlciB2ZXJpZmllcyB0aGVcbisgKiBpbWFnZSBhbmQgcmVwbGFjZXMgdGhlIGNvdW50IGluIFNUQVQgd2l0aCBpdHMgdmVyZGljdCwgc28gd2FpdCBmb3IgdGhlIGNvdW50XG4rICogdG8gZ28gcmF0aGVyIHRoYW4gZm9yIGEgZml4ZWQgdmFsdWUuXG4rICovXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfbGFzdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcbitcdFx0XHRcdCAgICAgIHUzMiBkYXRhX3dyaXR0ZW4pXG4re1xuK1x0aW50IHJldCwgdmFsO1xuK1xuK1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULCBkYXRhX3dyaXR0ZW4pO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IHJlYWRfcG9sbF90aW1lb3V0KG14bDg2Mnh4X3NtZGlvX3JlYWQsIHZhbCxcbitcdFx0XHRcdHZhbCBcdTAwM2MgMCB8fCAodTE2KXZhbCAhPSAodTE2KWRhdGFfd3JpdHRlbixcbitcdFx0XHRcdDEwMDAwLCAoTVhMODYyWFhfRldfV1JJVEVfVElNRU9VVF9NUyArXG4rXHRcdFx0XHRcdE1YTDg2MlhYX1NCX1BESV9WRVJJRllfTVMpICogMTAwMCxcbitcdFx0XHRcdGZhbHNlLCBwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XG4rXHRpZiAodmFsIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gdmFsO1xuK1xuK1x0aWYgKCFyZXQgXHUwMDI2XHUwMDI2ICh1MTYpdmFsID09IE1YTDg2MlhYX1NCX1BESV9WRVJJRllfT0spXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0LyogQSBmaW5hbCBjb3VudCBvZiAxIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIHJlamVjdCB2ZXJkaWN0LCBzb1xuK1x0ICogYSB0aW1lb3V0IHN0aWxsIGhvbGRpbmcgaXQgbGFuZHMgaGVyZSB0b28uXG4rXHQgKi9cbitcdGlmICgodTE2KXZhbCA9PSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX0JBRCkge1xuK1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XCJmbGFzaDogbG9hZGVyIHJlamVjdGVkIHRoZSBpbWFnZVxcblwiKTtcbitcdFx0cmV0dXJuIC1FQkFETVNHO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHJldCA/IHJldCA6IC1FUFJPVE87XG4rfVxuK1xuK3N0YXRpYyB2b2lkIG14bDg2Mnh4X2ZsYXNoX25vdGlmeShzdHJ1Y3QgZGV2bGluayAqZGwsIGNvbnN0IGNoYXIgKnN0YXR1cyxcbitcdFx0XHRcdCAgdTMyIGRvbmUsIHUzMiB0b3RhbClcbit7XG4rXHRkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9zdGF0dXNfbm90aWZ5KGRsLCBzdGF0dXMsIE5VTEwsIGRvbmUsIHRvdGFsKTtcbit9XG4rXG4rLyogQnl0ZS1jb3VudCBvZiBlYWNoIGNodW5rIGZlZCB0byB0aGUgbG9hZGVyIGR1cmluZyBkcmFpbi4gSXQgTVVTVCBiZSAxOiB0aGVcbisgKiBsb2FkZXIgb25seSBsZXRzIHVzIG9ic2VydmUgXCJjb3VudGVyID09IDBcIiwgbmV2ZXIgXCJjb3VudGVyIFx1MDAzYyBzdGVwXCIsIHNvIGFueVxuKyAqIHN0ZXAgXHUwMDNlIDEgY2FuIHN1YnRyYWN0IHBhc3QgemVybywgdW5kZXJmbG93IHRoZSAzMi1iaXQgY291bnRlciBhbmQgd2VkZ2UgdGhlXG4rICogbG9hZGVyIGZvciB+Ml4zMiBtb3JlIGJ5dGVzIChhIHN0YXRlIG9ubHkgYSBwb3dlciBjeWNsZSBjbGVhcnMpLiBTdGVwcGluZyBieVxuKyAqIDEgd2Fsa3MgdGhlIGNvdW50ZXIgdGhyb3VnaCBldmVyeSB2YWx1ZSBhbmQgaXMgZ3VhcmFudGVlZCB0byBsYW5kIG9uIHplcm9cbisgKiB3aGF0ZXZlciBpdHMgKHBvc3NpYmx5IG9kZCkgc3RhcnQuIEEgMS1ieXRlIGNodW5rIGlzIGEgcGF0aCB0aGUgbG9hZGVyXG4rICogYWxyZWFkeSBoYW5kbGVzOiB0aGUgbm9ybWFsIHRyYW5zZmVyIGVuZHMgd2l0aCBhIHNpbmdsZSB0cmFpbGluZyBieXRlIGZvclxuKyAqIG9kZC1zaXplZCBpbWFnZXMgKHNlZSBTdGVwIDYpLlxuKyAqL1xuKyNkZWZpbmUgTVhMODYyWFhfRFJBSU5fQ0hVTktfQllURVNcdDFcbitcbisvKiBMb2cgdGhlIGRyYWluJ3MgcHJvZ3Jlc3MgZXZlcnkgc28gbWFueSBieXRlczsgaXQgY2FuIHJ1biBmb3IgYSBsb25nIHRpbWUgKi9cbisjZGVmaW5lIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFU1x0KDEyOCAqIDEwMjQpXG4rXG4rLyogV2FpdCBmb3IgdGhlIGxvYWRlciB0byBhc2sgZm9yIHRoZSBuZXh0IGNodW5rIChTVEFUIDApIG9yIHRvIGNvbWUgYmFjayB0byBpdHNcbisgKiBjb21tYW5kIGxvb3AgKFNUQVQgUkVBRFkpLCBhbmQgcmV0dXJuIHRoZSBTVEFUIHZhbHVlIGVpdGhlciB3YXkuIE9uIHRpbWVvdXRcbisgKiB0aGF0IGlzIHdoYXRldmVyIFNUQVQgc3RpbGwgaG9sZHMsIHdoaWNoIGNhcnJpZXMgbm8gZnVydGhlciBpbmZvcm1hdGlvbjogdGhlXG4rICogbG9hZGVyIGtlZXBzIHRoZSBjb3VudCB3ZSB3cm90ZSB2aXNpYmxlIHdoaWxlIGl0IHByb2dyYW1zIHRoZSBjaHVuaywgYW5kIHRoYXRcbisgKiBpcyB0aGUgc2FtZSB2YWx1ZSBpdCBwdWJsaXNoZXMgYXMgdGhlIFwiaW1hZ2UgcmVqZWN0ZWRcIiB2ZXJkaWN0IG9uY2UgdGhlXG4rICogY291bnRlciByZWFjaGVzIHplcm8uXG4rICpcbisgKiBTVEFUIDAgaXMgdW5hbWJpZ3VvdXMgaGVyZSBldmVuIHRob3VnaCBpdCBpcyBhbHNvIHRoZSBcImltYWdlIHZlcmlmaWVkXCJcbisgKiB2ZXJkaWN0OiBieSB0aGUgcl9yZW1haW4gPT0gMCBydWxlIHRoZSBsb2FkZXIgbGVhdmVzIHRoZSByZWNlaXZlIGxvb3AgdGhlXG4rICogbW9tZW50IHRoZSBjb3VudGVyIHJlYWNoZXMgemVybywgc28gaXQgaXMgbmV2ZXIgYm90aCBpbnNpZGUgdGhlIGxvb3AgYXNraW5nXG4rICogZm9yIGEgY2h1bmsgYW5kIHB1Ymxpc2hpbmcgYSB2ZXJkaWN0LiBPbmNlIGl0IGhhcyBsZWZ0LCB0aGUgbmV4dCBTVEFUIHdyaXRlXG4rICogaXMgYSBjb21tYW5kIHJhdGhlciB0aGFuIGEgY291bnQsIHNvIGZlZWRpbmcgb25lIG1vcmUgY2h1bmsgYWZ0ZXIgYSB2ZXJkaWN0XG4rICogY2Fubm90IHVuZGVyZmxvdyBhbnl0aGluZyBlaXRoZXIuXG4rICovXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcylcbit7XG4rXHRpbnQgdmFsO1xuK1xuK1x0cmVhZF9wb2xsX3RpbWVvdXQobXhsODYyeHhfc21kaW9fcmVhZCwgdmFsLFxuK1x0XHRcdCAgdmFsIFx1MDAzYyAwIHx8ICh1MTYpdmFsID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSB8fFxuK1x0XHRcdCAgKHUxNil2YWwgPT0gMCxcbitcdFx0XHQgIDUwLCB0aW1lb3V0X21zICogMTAwMCwgZmFsc2UsXG4rXHRcdFx0ICBwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XG4rXHRpZiAodmFsIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gdmFsO1xuK1x0cmV0dXJuICh1MTYpdmFsO1xuK31cbitcbisvKiBUaGUgbG9hZGVyIGlzIG5vdCBhc2tpbmcgZm9yIGEgY2h1bms6IGl0IG1heSBzdGlsbCBiZSBwcm9ncmFtbWluZyB0aGUgbGFzdFxuKyAqIG9uZSwgb3IgdGhlIGNvdW50ZXIgaGFzIHJlYWNoZWQgemVybyBhbmQgaXQgaXMgdmVyaWZ5aW5nIHRoZSBpbWFnZSBhbmRcbisgKiByZXNldHRpbmcgaW50byBSRUFEWS4gV2FpdCB0aGF0IG91dCAtLSBTVEFUIGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQsIGFuZFxuKyAqIGd1ZXNzaW5nIHdvdWxkIG1lYW4gd3JpdGluZyBFTkQgaW50byBhIGxpdmUgcmVjZWl2ZSBsb29wLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uY2UgdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgbG9vcCwgLUVBR0FJTiBpZiBpdCBhc2tzIGZvciBhbm90aGVyXG4rICogY2h1bmsgYWZ0ZXIgYWxsLCAtRUlPIGZvciBhIGxvYWRlciBzdGlsbCBob2xkaW5nIHRoZSBjb3VudCB3aGVuIHRoZSB2ZXJpZnlcbisgKiB3aW5kb3cgZXhwaXJlcywgb3IgYW4gU01ESU8gYnVzIGVycm9yLlxuKyAqL1xuK3N0YXRpYyBpbnQgbXhsODYyeHhfcmVzY3VlX2RyYWluX2ZpbmlzaChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGNodW5rKVxuK3tcbitcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXY7XG4rXHRpbnQgc3RhdDtcbitcbitcdHN0YXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TKTtcbitcdGlmIChzdGF0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gc3RhdDtcbitcdGlmIChzdGF0ID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSlcbitcdFx0cmV0dXJuIDA7XG4rXHRpZiAoc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX0JBRCkge1xuK1x0XHRkZXZfZXJyKGRldixcbitcdFx0XHRcImZsYXNoOiBsb2FkZXIgc3R1Y2sgYWZ0ZXIgJXUgY2h1bmtzLCBwb3dlciBjeWNsZSBpdFxcblwiLFxuK1x0XHRcdGNodW5rKTtcbitcdFx0cmV0dXJuIC1FSU87XG4rXHR9XG4rXHRpZiAoc3RhdCkge1xuK1x0XHQvKiBBIGZpcm13YXJlIGlzIGFuc3dlcmluZywgbm90IHRoZSBsb2FkZXI6IGFuIGltYWdlIHN1cnZpdmVkXG4rXHRcdCAqIGluIGZsYXNoIGFuZCBib290ZWQuXG4rXHRcdCAqL1xuK1x0XHRkZXZfaW5mbyhkZXYsIFwiZmxhc2g6IGZpcm13YXJlIGJvb3RlZCB3aGlsZSBkcmFpbmluZ1xcblwiKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHRyZXR1cm4gLUVBR0FJTjtcbit9XG4rXG4rLyogUmVjb3ZlciBhIHN3aXRjaCB3aG9zZSBTQiBQREkgZG93bmxvYWQgd2FzIGludGVycnVwdGVkIG1pZC10cmFuc2ZlciAtIHRoZVxuKyAqIGhvc3QgZGllZCBhZnRlciBNQ1Vib290IGJlZ2FuIGVyYXNpbmcgZmxhc2gsIHdoZXRoZXIgaXQgYWJvcnRlZCBtaWQgZXJhc2Ugb3JcbisgKiBtaWQgaW1hZ2Utd3JpdGUsIGJvdGggZW5kIHVwIGluIHRoZSBzYW1lIHBsYWNlOiB0aGUgcGF5bG9hZCByZWNlaXZlIGxvb3AuXG4rICogVGhlcmUgdGhlIGxvYWRlciBwdWJsaXNoZXMgU1RBVD0wLCB3YWl0cyBmb3IgdGhlIGhvc3QgdG8gd3JpdGUgYSBieXRlLWNvdW50XG4rICogdG8gU1RBVCwgRE1BcyB0aGF0IG1hbnkgYnl0ZXMgYW5kIHN1YnRyYWN0cyB0aGUgY291bnQgZnJvbSBhIHJlbWFpbmluZy1ieXRlc1xuKyAqIGNvdW50ZXIsIGxlYXZpbmcgdGhlIGxvb3Agb25seSB3aGVuIHRoZSBjb3VudGVyIHJlYWNoZXMgZXhhY3RseSB6ZXJvLiBUaGVcbisgKiBpbWFnZSBzaXplIGRpZWQgd2l0aCB0aGUgaG9zdCwgc28gd2UgZmVlZCBzaW5nbGUtYnl0ZSBjaHVua3MgKHNlZVxuKyAqIE1YTDg2MlhYX0RSQUlOX0NIVU5LX0JZVEVTKSB0byB3YWxrIHRoZSBjb3VudGVyIHRvIHplcm8gd2l0aG91dCB1bmRlcmZsb3cuXG4rICogVGhlIGxvYWRlciB0aGVuIHZlcmlmaWVzIHRoZSAobm93IGNvcnJ1cHQpIGltYWdlIGFuZCByZXR1cm5zIHRvIFJFQURZIGJ5XG4rICogaXRzZWxmLCBvciBib290cyBhIHZhbGlkIGltYWdlIHRoYXQgaGFwcGVuZWQgdG8gc3Vydml2ZSBpbiBmbGFzaDsgZWl0aGVyIHdheVxuKyAqIHRoZSBjYWxsZXIncyByZXByb2JlIGNsYXNzaWZpZXMgdGhlIHJlc3VsdC4gRXZlcnkgYnl0ZSBjb3N0cyBhYm91dCBhIGRvemVuXG4rICogTURJTyBmcmFtZXMsIHNvIGEgbXVsdGktTWlCIG91dHN0YW5kaW5nIGNvdW50IHRha2VzIHRlbnMgb2YgbWludXRlcy5cbisgKiBSZXR1cm5zIDAgb25jZSB0aGUgbG9hZGVyIGhhcyBsZWZ0IHRoZSByZWNlaXZlIGxvb3AsIFx1MDAzYzAgb24gZXJyb3IuIERvZXMgTk9UXG4rICogcmVjb3ZlciBhIGNvdW50ZXIgYWxyZWFkeSB1bmRlcmZsb3dlZCBieSBhbiBlYXJsaWVyIG92ZXJzaXplZC1jaHVuayBhdHRlbXB0XG4rICogLSB0aGF0IG5lZWRzIGEgcG93ZXIgY3ljbGUuXG4rICovXG4rc3RhdGljIGludCBteGw4NjJ4eF9yZXNjdWVfZHJhaW4oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4re1xuK1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldjtcbitcdC8qIEJvdW5kOiB0d2ljZSB0aGUgbG9hZGVyJ3MgMTYgTWlCIGltYWdlIGNhcCwgb25lIGJ5dGUgcGVyIGNodW5rLiAqL1xuK1x0dTMyIG1heF9jaHVua3MgPSAydSAqICgxNnUgXHUwMDNjXHUwMDNjIDIwKSAvIE1YTDg2MlhYX0RSQUlOX0NIVU5LX0JZVEVTO1xuK1x0dTMyIGNodW5rID0gMDtcbitcdGludCByZXQsIHN0YXQ7XG4rXG4rXHR3aGlsZSAoY2h1bmsgXHUwMDNjIG1heF9jaHVua3MpIHtcbitcdFx0LyogVGVhcmRvd24gY2FuIGludGVycnVwdCB0aGlzIGxvbmcgZHJhaW4uICovXG4rXHRcdGlmICh0ZXN0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgXHUwMDI2cHJpdi1cdTAwM2VmbGFncykpXG4rXHRcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4rXG4rXHRcdHN0YXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RFUF9NUyk7XG4rXHRcdGlmIChzdGF0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiBzdGF0O1xuK1x0XHRpZiAoc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfUkVBRFkpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXG4rXHRcdGlmIChzdGF0KSB7XG4rXHRcdFx0cmV0ID0gbXhsODYyeHhfcmVzY3VlX2RyYWluX2ZpbmlzaChwcml2LCBjaHVuayk7XG4rXHRcdFx0aWYgKHJldCAhPSAtRUFHQUlOKVxuK1x0XHRcdFx0cmV0dXJuIHJldDtcbitcdFx0fVxuK1xuK1x0XHQvKiBGZWVkIG9uZSB6ZXJvIGJ5dGU7IHJlc2V0IGNsZWFyZWQgdGhlIHdyaXRlIGxhdGNoLiAqL1xuK1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbitcdFx0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCAweDAwMDApO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcbitcdFx0XHRcdFx0ICAgTVhMODYyWFhfRFJBSU5fQ0hVTktfQllURVMpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdGNodW5rKys7XG4rXHRcdGlmICghKGNodW5rICUgTVhMODYyWFhfRFJBSU5fTE9HX0JZVEVTKSlcbitcdFx0XHRkZXZfaW5mbyhkZXYsIFwiZmxhc2g6IGRyYWluZWQgJXUgS2lCIHNvIGZhclxcblwiLFxuK1x0XHRcdFx0IGNodW5rIC8gMTAyNCk7XG4rXHRcdGNvbmRfcmVzY2hlZCgpO1xuK1x0fVxuK1xuK1x0ZGV2X2VycihkZXYsXG4rXHRcdFwiZmxhc2g6IGludGVycnVwdGVkIGRvd25sb2FkIGRpZCBub3QgZHJhaW4gYWZ0ZXIgJXUgY2h1bmtzXFxuXCIsXG4rXHRcdGNodW5rKTtcbitcbitcdHJldHVybiAtRVRJTUVET1VUO1xuK31cbitcbisvKiBCYWNrZ3JvdW5kIHNlbGYtaGVhbDogZHJhaW4gYSB3ZWRnZWQgZG93bmxvYWQgb2ZmIHRoZSBkZXZsaW5rIGZsYXNoIHBhdGgsIHNvXG4rICogdGhlIGxvbmcgcmVjb3ZlcnkgbmV2ZXIgaG9sZHMgdGhlIGRldmxpbmsgbG9jay4gU2NoZWR1bGVkIGZyb20gcHJvYmU7XG4rICogcmVwcm9iZXMgb24gc3VjY2VzcyBzbyB0aGUgcHJvYmUtdGltZSBkZXRlY3Rpb24gcmUtY2xhc3NpZmllcyB0aGUgc3dpdGNoLlxuKyAqL1xuK3ZvaWQgbXhsODYyeHhfcmVzY3VlX2hlYWxfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4re1xuK1x0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPVxuK1x0XHRjb250YWluZXJfb2Yod29yaywgc3RydWN0IG14bDg2Mnh4X3ByaXYsIHJlc2N1ZV9oZWFsX3dvcmspO1xuK1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldjtcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBteGw4NjJ4eF9yZXNjdWVfZHJhaW4ocHJpdik7XG4rXHRpZiAocmV0ID09IC1FQ0FOQ0VMRUQpXG4rXHRcdHJldHVybjtcbitcdGlmIChyZXQpIHtcbitcdFx0LyogTm90aGluZyByZXRyaWVzIHRoaXMsIHNvIHNheSBzbzogcmVzY3VlX3JlYWR5IHN0YXlzIGNsZWFyXG4rXHRcdCAqIGFuZCBkZXZsaW5rIGRldiBmbGFzaCByZXBvcnRzIHdoeSBpdCByZWZ1c2VzLlxuK1x0XHQgKi9cbitcdFx0ZGV2X2VycihkZXYsIFwiZmxhc2g6IGRvd25sb2FkIHJlY292ZXJ5IGZhaWxlZDogJXBlXFxuXCIsXG4rXHRcdFx0RVJSX1BUUihyZXQpKTtcbitcdFx0V1JJVEVfT05DRShwcml2LVx1MDAzZXJlc2N1ZV9mYWlsZWQsIHRydWUpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHQvKiBUaGUgaW50ZXJydXB0ZWQgdHJhbnNmZXIgaXMgZmluYWxpc2VkOyByZXByb2JlIHNvIHRoZSBwcm9iZS10aW1lXG4rXHQgKiBkZXRlY3Rpb24gYnJpbmdzIHRoZSBkcml2ZXIgdXAgLS0gZmxhc2hhYmxlIGluIHJlc2N1ZSBtb2RlIGlmIHRoZVxuK1x0ICogbG9hZGVyIGlzIGF0IFJFQURZLCBvciBub3JtYWxseSBpZiBhIHZhbGlkIGltYWdlIGJvb3RlZC4gVGhlIGNvcmVcbitcdCAqIHNraXBzIHRoZSByZS1wcm9iZSBvbiBpdHMgb3duIGlmIHRoZSBkZXZpY2UgaXMgdW5ib3VuZCBmaXJzdDsgdGhlXG4rXHQgKiBmbGFnIHRlc3Qgb25seSBhdm9pZHMgc2NoZWR1bGluZyBvbmUgY2VydGFpbiB0byBiZSBza2lwcGVkLiBBXG4rXHQgKiBmYWlsZWQgaGFuZC1vZmYgbGVhdmVzIG5vdGhpbmcgdG8gcmVjbGFzc2lmeSB0aGUgc3dpdGNoLCBzbyBtYXJrXG4rXHQgKiByZWNvdmVyeSBmYWlsZWQgcmF0aGVyIHRoYW4gcHJvbWlzZSBhIHJldHJ5IHRoYXQgY2Fubm90IHN1Y2NlZWQuXG4rXHQgKi9cbitcdGlmICh0ZXN0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgXHUwMDI2cHJpdi1cdTAwM2VmbGFncykpXG4rXHRcdHJldHVybjtcbitcbitcdGlmIChkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZShkZXYsIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVMpKVxuK1x0XHRXUklURV9PTkNFKHByaXYtXHUwMDNlcmVzY3VlX2ZhaWxlZCwgdHJ1ZSk7XG4rfVxuK1xuKy8qIERldGVjdCBNQ1Vib290IHJlc2N1ZSBtb2RlIG92ZXIgY2xhdXNlLTIyIFNNRElPIGFsb25lLCBzbyB0aGUgY2FsbGVyIGNhbiBydWxlXG4rICogdGhlIGxvYWRlciBvdXQgYmVmb3JlIGFueSBDNDUgQVBJIHJlcXVlc3QgKHdoaWNoIHNwZXdzIENSQyBlcnJvcnMgd2hlbiBubyBXU1BcbisgKiBmaXJtd2FyZSBhbnN3ZXJzKS4gQSBzY3JhdGNoIHdyaXRlIHRvIEFERFIvREFUQSBtdXN0IGxhdGNoIG9yIHRoZSBjaGlwIGlzXG4rICogYWJzZW50ICgtRU5PREVWKTsgdGhlIG1haWxib3ggaXMgcmVzZXQgZmlyc3QsIG9yIGEgdHJhbnNmZXIgaW50ZXJydXB0ZWQgd2l0aFxuKyAqIENUUkw9V1Igd291bGQgdGFrZSB0aGF0IHdyaXRlIGFzIGEgcGF5bG9hZCB3b3JkIGluc3RlYWQgb2YgbGF0Y2hpbmcgaXQuIFNUQVRcbisgKiB0aGVuIGNsYXNzaWZpZXMgdGhlIHN0YXRlLCBwb2tlZCBkZXN0cnVjdGl2ZWx5IG9ubHkgd2hlbiAwLCB0aGUgb25lIHZhbHVlIGFcbisgKiBydW5uaW5nIGZpcm13YXJlIG5ldmVyIGhvbGRzOlxuKyAqXG4rICogIC0gMHhjMzNjOiBmbGFzaGxlc3MgbG9vcDsgcmVjb2duaXNlZCBidXQgbm90IHN1cHBvcnRlZCBoZXJlLlxuKyAqICAtIDB4YzU1YzogY29uc29sZSBsb29wLCBpZiB0aGUgcmVnaXN0ZXItcmVhZCBjaGFsbGVuZ2UgaXMgc2VydmljZWQuXG4rICogIC0gb3RoZXIgbm9uLXplcm86IHJ1bm5pbmcgZmlybXdhcmUsIGxlZnQgdW5wb2tlZC5cbisgKiAgLSAwOiB3ZWRnZWQgcmVjZWl2ZSBsb29wOyB0aGUgMS1ieXRlIHNsaWNlLWFkdmFuY2UgdGhlbiBzYXlzIHdoZXRoZXIgaXRcbisgKiAgICBzdGlsbCBuZWVkcyBkcmFpbmluZyBvciBoYXMganVzdCBmaW5pc2hlZC5cbisgKlxuKyAqIFRoZSBzY3JhdGNoIHdyaXRlIHJlYWNoZXMgYSBydW5uaW5nIGZpcm13YXJlIHRvbywgYnV0IGxhbmRzIGluIG1haWxib3hcbisgKiByZWdpc3RlcnMgaXQgZG9lcyBub3QgcmVhZCwgc28gaXQgaXMgaW5lcnQgdGhlcmUuXG4rICpcbisgKiBSZXR1cm46IE1YTDg2MlhYX0lOX1JFU0NVRSwgTVhMODYyWFhfTk9UX1JFU0NVRSwgLUVOT0RFViB3aGVuIHRoZSBzY3JhdGNoXG4rICogd3JpdGUgZG9lcyBub3QgbGF0Y2gsIHdoaWNoIGlzIGEgc3dpdGNoIHRoYXQgZG9lcyBub3QgYW5zd2VyIGF0IGFsbCBvciBvbmVcbisgKiB3aG9zZSBTQiBQREkgd2luZG93IGlzIG5vdCBhdCB0aGUgb2Zmc2V0cyBhYm92ZSwgLUVPUE5PVFNVUFAgZm9yIHRoZVxuKyAqIGZsYXNobGVzcyBsb29wLCAtRU5YSU8gZm9yIGEgUkVBRFkgbG9hZGVyIHdob3NlIG1haWxib3ggZmFpbHMgdGhlIGNoYWxsZW5nZSxcbisgKiBvciBhbiBTTURJTyBidXMgZXJyb3IuXG4rICovXG4raW50IG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcbit7XG4rXHRpbnQgc3RhdCwgZGF0LCByZXQsIHJiLCBhLCBkO1xuK1xuK1x0LyogcmVzY3VlX3JlYWR5IGdhdGVzIGZsYXNoaW5nOyBhIHdlZGdlZCBsb2FkZXIgbmVlZHMgdGhlIGRyYWluIGZpcnN0LiAqL1xuK1x0V1JJVEVfT05DRShwcml2LVx1MDAzZXJlc2N1ZV9yZWFkeSwgZmFsc2UpO1xuK1xuK1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdC8qIFByZXNlbmNlOiBhIGxpdmUgY2hpcCBsYXRjaGVzIHRoZSBzY3JhdGNoIHdyaXRlLCBhbiBhYnNlbnQgb25lIGZsb2F0cy4gKi9cbitcdGEgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUixcbitcdFx0XHRcdCBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSk7XG4rXHRpZiAoYSBcdTAwM2MgMClcbitcdFx0cmV0dXJuIGE7XG4rXHRkID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsXG4rXHRcdFx0XHQgTVhMODYyWFhfU0JfUERJX1BST0JFX0QpO1xuK1x0aWYgKGQgXHUwMDNjIDApXG4rXHRcdHJldHVybiBkO1xuK1x0YSA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIpO1xuK1x0aWYgKGEgXHUwMDNjIDApXG4rXHRcdHJldHVybiBhO1xuK1x0ZCA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEpO1xuK1x0aWYgKGQgXHUwMDNjIDApXG4rXHRcdHJldHVybiBkO1xuK1x0aWYgKCh1MTYpYSAhPSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSB8fFxuK1x0ICAgICh1MTYpZCAhPSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfRClcbitcdFx0cmV0dXJuIC1FTk9ERVY7XG4rXG4rXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0c3RhdCA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQpO1xuK1x0aWYgKHN0YXQgXHUwMDNjIDApXG4rXHRcdHJldHVybiBzdGF0O1xuK1xuK1x0LyogRmxhc2hsZXNzLWRvd25sb2FkIGxvb3AgKE14TDg2MjgxIHRpZXIpOiB1bnN1cHBvcnRlZC4gKi9cbitcdGlmICgodTE2KXN0YXQgPT0gTVhMODYyWFhfU0JfUERJX0RMX1JFQURZKVxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4rXHQvKiBDb25zb2xlIGxvb3AgYXQgUkVBRFk6IGNvbmZpcm0gdGhlIGxpdmUgbWFpbGJveCB3aXRoIHRoZSByZWdpc3Rlci1yZWFkXG4rXHQgKiBjaGFsbGVuZ2UgKGNvbnN1bWVzIHRoZSBtYXJrZXIgZnJvbSBEQVRBIGFuZCByZS1hcm1zIFJFQURZKS5cbitcdCAqL1xuK1x0aWYgKCh1MTYpc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfUkVBRFkpIHtcbitcdFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsXG4rXHRcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9SRFJFR19NQVJLKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcbitcdFx0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX1JEUkVHKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRyYiA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfU0JfUERJX1JFQURZLFxuK1x0XHRcdFx0XHQgICAgICAgTVhMODYyWFhfU0JfUERJX1NURVBfTVMpO1xuK1x0XHRkYXQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBKTtcbitcdFx0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuK1x0XHQvKiBOZXZlciByZS1hcm1pbmcgUkVBRFkgZmFpbHMgdGhlIGNoYWxsZW5nZSBsaWtlIGFueSBvdGhlclxuK1x0XHQgKiB1bnNlcnZpY2VkIGNvbW1hbmQ7IHJlcG9ydCBpdCBhcyBzdWNoIHJhdGhlciB0aGFuIGFzIGEgYnVzXG4rXHRcdCAqIHRpbWVvdXQgdGhlIGJ1cyBuZXZlciBzYXcuXG4rXHRcdCAqL1xuK1x0XHRpZiAocmIgPT0gLUVUSU1FRE9VVClcbitcdFx0XHRyYiA9IC1FTlhJTztcbitcdFx0aWYgKHJiIFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByYjtcbitcdFx0aWYgKGRhdCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gZGF0O1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdGlmICgodTE2KWRhdCAhPSBNWEw4NjJYWF9TQl9QRElfUkRSRUdfTUFSSykge1xuK1x0XHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHksIHRydWUpO1xuK1x0XHRcdHJldHVybiBNWEw4NjJYWF9JTl9SRVNDVUU7XG4rXHRcdH1cbitcdFx0LyogUkVBRFkgYnV0IHRoZSBtYXJrZXIgaXMgdW50b3VjaGVkLCBzbyBub3RoaW5nIGlzIHNlcnZpY2luZyB0aGVcbitcdFx0ICogbWFpbGJveC4gQSBmaXJtd2FyZSBwdWJsaXNoaW5nIDB4YzU1YyBhcyBpdHMgc3RhdHVzIHdvcmQgbG9va3NcbitcdFx0ICogZXhhY3RseSBsaWtlIHRoaXMsIGFuZCBmbGFzaGluZyBvbmUgd291bGQgYmUgZmFyIHdvcnNlIHRoYW5cbitcdFx0ICogcmVmdXNpbmcgdG8gYmluZCwgc28gdHJlYXQgaXQgYXMgdW51c2FibGUuXG4rXHRcdCAqL1xuK1x0XHRyZXR1cm4gLUVOWElPO1xuK1x0fVxuK1xuK1x0LyogQW55IG90aGVyIG5vbi16ZXJvIHZhbHVlIGlzIGEgcnVubmluZyBmaXJtd2FyZSwgbm90IGEgbG9hZGVyLiAqL1xuK1x0aWYgKHN0YXQpXG4rXHRcdHJldHVybiBNWEw4NjJYWF9OT1RfUkVTQ1VFO1xuK1xuK1x0LyogU1RBVCA9PSAwOiBhIHdlZGdlZCByZWNlaXZlIGxvb3AgdGFrZXMgYSAxLWJ5dGUgc2xpY2UtYWR2YW5jZSAoZmVlZFxuK1x0ICogb25lIERBVEEgd29yZCBmaXJzdCwgbGlrZSBhIGRyYWluIGNodW5rKSBhbmQgYXNrcyBmb3IgdGhlIG5leHQgY2h1bmtcbitcdCAqIGJ5IHB1Ymxpc2hpbmcgMCBhZ2Fpbi4gSGFkIHRoYXQgYnl0ZSBiZWVuIHRoZSBsYXN0IG9uZSBvdXRzdGFuZGluZyxcbitcdCAqIHRoZSBsb2FkZXIgbGVhdmVzIHRoZSBsb29wIGluc3RlYWQgYW5kIHJldHVybnMgdG8gUkVBRFksIGhhdmluZ1xuK1x0ICogY29uc3VtZWQgdGhlIGFkdmFuY2UgLS0gcHJvb2YgZW5vdWdoIG9mIGEgbGl2ZSBtYWlsYm94IHRvIHNraXAgdGhlXG4rXHQgKiBjaGFsbGVuZ2UuIEFueXRoaW5nIGVsc2UgbWVhbnMgaXQgaXMgc3RpbGwgd29ya2luZyBvbiBpdC4gQWxsIHRocmVlXG4rXHQgKiBhcmUgcmVzY3VlLCBzbyB0aGlzIG5ldmVyIGZhaWxzIHByb2JlOyBvbmx5IHRoZSBkcmFpbiBkb2VzLlxuK1x0ICovXG4rXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbitcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcbitcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdHJldHVybiByZXQ7XG4rXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgMHgwMDAwKTtcbitcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdHJldHVybiByZXQ7XG4rXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsXG4rXHRcdFx0XHQgICBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUyk7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmIgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RFUF9NUyk7XG4rXHRpZiAocmIgXHUwMDNjIDApXG4rXHRcdHJldHVybiByYjtcbitcdGlmIChyYiA9PSBNWEw4NjJYWF9TQl9QRElfUkVBRFkpXG4rXHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHksIHRydWUpO1xuK1xuK1x0cmV0dXJuIE1YTDg2MlhYX0lOX1JFU0NVRTtcbit9XG4rXG4rLyogTUNVYm9vdCBmaXJtd2FyZSBpbWFnZSBoZWFkZXIgKi9cbitzdHJ1Y3QgbXhsODYyeHhfZndfaGRyIHtcbitcdF9fbGUzMiBpbWFnZV90eXBlO1xuK1x0X19sZTMyIGltYWdlX3NpemVfMTtcbitcdF9fbGUzMiBpbWFnZV9jaGVja3N1bV8xO1xuK1x0X19sZTMyIGltYWdlX3NpemVfMjtcbitcdF9fbGUzMiBpbWFnZV9jaGVja3N1bV8yO1xuK30gX19wYWNrZWQ7XG4rXG4rc3RhdGljIGludCBteGw4NjJ4eF9mbGFzaF92YWxpZGF0ZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcbitcdFx0XHRcdCAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsXG4rXHRcdFx0XHQgICB1MzIgKnBheWxvYWRfc2l6ZSlcbit7XG4rXHRjb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICpoZHI7XG4rXHR1MzIgc2l6ZTEsIHNpemUyLCB0b3RhbDtcbitcdGNvbnN0IHU4ICpwYXlsb2FkO1xuK1x0dTMyIGNyYztcbitcbitcdGlmIChmdy1cdTAwM2VzaXplIFx1MDAzYyBNWEw4NjJYWF9GV19IRFJfU0laRSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRoZHIgPSAoY29uc3Qgc3RydWN0IG14bDg2Mnh4X2Z3X2hkciAqKWZ3LVx1MDAzZWRhdGE7XG4rXHRwYXlsb2FkID0gZnctXHUwMDNlZGF0YSArIE1YTDg2MlhYX0ZXX0hEUl9TSVpFO1xuK1x0c2l6ZTEgPSBsZTMyX3RvX2NwdShoZHItXHUwMDNlaW1hZ2Vfc2l6ZV8xKTtcbitcdHNpemUyID0gbGUzMl90b19jcHUoaGRyLVx1MDAzZWltYWdlX3NpemVfMik7XG4rXG4rXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KHNpemUxLCBzaXplMiwgXHUwMDI2dG90YWwpIHx8XG4rXHQgICAgdG90YWwgXHUwMDNlIGZ3LVx1MDAzZXNpemUgLSBNWEw4NjJYWF9GV19IRFJfU0laRSkge1xuK1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XCJmbGFzaDogZmlybXdhcmUgZmlsZSB0b28gc21hbGwgZm9yIGRlY2xhcmVkIHNpemVcXG5cIik7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0aWYgKCF0b3RhbCkge1xuK1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XCJmbGFzaDogZmlybXdhcmUgZmlsZSB3aXRoIGVtcHR5IHBheWxvYWRcXG5cIik7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0aWYgKHNpemUxKSB7XG4rXHRcdGNyYyA9IH5jcmMzMl9sZSh+MFUsIHBheWxvYWQsIHNpemUxKTtcbitcdFx0aWYgKGNyYyAhPSBsZTMyX3RvX2NwdShoZHItXHUwMDNlaW1hZ2VfY2hlY2tzdW1fMSkpIHtcbitcdFx0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XHRcImZsYXNoOiBpbWFnZSAxIENSQyBtaXNtYXRjaCAoZ290ICUwOHgsIGV4cGVjdGVkICUwOHgpXFxuXCIsXG4rXHRcdFx0XHRjcmMsIGxlMzJfdG9fY3B1KGhkci1cdTAwM2VpbWFnZV9jaGVja3N1bV8xKSk7XG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChzaXplMikge1xuK1x0XHRjcmMgPSB+Y3JjMzJfbGUofjBVLCBwYXlsb2FkICsgc2l6ZTEsIHNpemUyKTtcbitcdFx0aWYgKGNyYyAhPSBsZTMyX3RvX2NwdShoZHItXHUwMDNlaW1hZ2VfY2hlY2tzdW1fMikpIHtcbitcdFx0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XHRcImZsYXNoOiBpbWFnZSAyIENSQyBtaXNtYXRjaCAoZ290ICUwOHgsIGV4cGVjdGVkICUwOHgpXFxuXCIsXG4rXHRcdFx0XHRjcmMsIGxlMzJfdG9fY3B1KGhkci1cdTAwM2VpbWFnZV9jaGVja3N1bV8yKSk7XG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdH1cbitcdH1cbitcbitcdCpwYXlsb2FkX3NpemUgPSB0b3RhbDtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LFxuK1x0XHRcdFx0ICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyxcbitcdFx0XHRcdCAgIHUzMiBwYXlsb2FkX3NpemUsIHN0cnVjdCBkZXZsaW5rICpkbClcbit7XG4rXHRjb25zdCB1OCAqcGF5bG9hZCA9IGZ3LVx1MDAzZWRhdGEgKyBNWEw4NjJYWF9GV19IRFJfU0laRTtcbitcdHUzMiB3b3JkX2lkeCA9IDAsIGRhdGFfd3JpdHRlbiA9IDAsIGlkeCA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIG5leHRfbm90aWZ5ID0gamlmZmllcyAtIDE7XG4rXHR1MTYgd29yZCwgZmRhdGE7XG4rXHRpbnQgcmV0LCBpO1xuK1xuK1x0LyogU3RlcCAxOiByZWJvb3QgdGhlIGZpcm13YXJlIGludG8gTUNVYm9vdCByZXNjdWUgbW9kZSAqL1xuK1x0aWYgKCFwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKSB7XG4rXHRcdHJldCA9IG14bDg2Mnh4X2FwaV93cmFwKHByaXYsIFNZU19NSVNDX0ZXX1VQREFURSwgTlVMTCwgMCxcbitcdFx0XHRcdFx0ZmFsc2UsIGZhbHNlKTtcbitcdFx0aWYgKHJldCkge1xuK1x0XHRcdGRldl9lcnIoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldixcbitcdFx0XHRcdFwiZmxhc2g6IEZXX1VQREFURSBjb21tYW5kIGZhaWxlZDogJXBlXFxuXCIsXG4rXHRcdFx0XHRFUlJfUFRSKHJldCkpO1xuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdH1cbitcdH1cbitcbitcdC8qIFN0ZXAgMjogd2FpdCBmb3IgYm9vdGxvYWRlciByZWFkeSAqL1xuK1x0bXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCBcIldhaXRpbmcgZm9yIGJvb3Rsb2FkZXJcIiwgMCwgMCk7XG4rXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRnb3RvIHdyaXRlX2VycjtcbitcbitcdC8qIEZhaWx1cmVzIGZyb20gaGVyZSBvbiBlbmQgdXAgYXQgbm9fZW5kLCB3aGljaCByZXR1cm5zIHRoZSBlcnJvclxuK1x0ICogd2l0aG91dCBzaWduYWxsaW5nIEVORCAtLSBzZWUgdGhlcmUuXG4rXHQgKi9cbitcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfU0JfUERJX1JFQURZLFxuK1x0XHRcdFx0XHRNWEw4NjJYWF9GV19SRUFEWV9USU1FT1VUX01TKTtcbitcdGlmIChyZXQpIHtcbitcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuK1x0XHRcdFwiZmxhc2g6IGJvb3Rsb2FkZXIgbm90IHJlYWR5OiAlcGVcXG5cIiwgRVJSX1BUUihyZXQpKTtcbitcdFx0Z290byBub19lbmQ7XG4rXHR9XG4rXG4rXHQvKiBTdGVwIDM6IHN0YXJ0IGhhbmRzaGFrZSAqL1xuK1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsXG4rXHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfU1RBUlQpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0Z290byB3cml0ZV9lcnI7XG4rXG4rXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFSVCArIDEsXG4rXHRcdFx0XHRcdE1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TKTtcbitcdGlmIChyZXQpIHtcbitcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuK1x0XHRcdFwiZmxhc2g6IHN0YXJ0IGhhbmRzaGFrZSBmYWlsZWQ6ICVwZVxcblwiLCBFUlJfUFRSKHJldCkpO1xuK1x0XHRnb3RvIG5vX2VuZDtcbitcdH1cbitcbitcdC8qIFN0ZXAgNDogdHJhbnNmZXIgaW1hZ2UgaGVhZGVyICovXG4rXHRteGw4NjJ4eF9mbGFzaF9ub3RpZnkoZGwsIFwiRXJhc2luZyBmbGFzaFwiLCAwLCAwKTtcbitcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuK1x0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0Z290byB3cml0ZV9lcnI7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBNWEw4NjJYWF9GV19IRFJfU0laRSAvIDI7IGkrKykge1xuK1x0XHR3b3JkID0gZnctXHUwMDNlZGF0YVtpICogMl0gfFxuK1x0XHQgICAgICAgKCh1MTYpZnctXHUwMDNlZGF0YVtpICogMiArIDFdIFx1MDAzY1x1MDAzYyA4KTtcbitcdFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsIHdvcmQpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gd3JpdGVfZXJyO1xuK1x0fVxuK1xuK1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0Z290byB3cml0ZV9lcnI7XG4rXG4rXHQvKiB0aGUgYnl0ZSBjb3VudCBpbiBTVEFUIHRyaWdnZXJzIHRoZSBlcmFzZSAqL1xuK1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsXG4rXHRcdFx0XHQgICBNWEw4NjJYWF9GV19IRFJfU0laRSk7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRnb3RvIHdyaXRlX2VycjtcbitcbitcdC8qIEFDSyBpcyBieXRlIGNvdW50ICsgMSAqL1xuK1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCBNWEw4NjJYWF9GV19IRFJfU0laRSArIDEsXG4rXHRcdFx0XHRcdE1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TKTtcbitcdGlmIChyZXQpIHtcbitcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuK1x0XHRcdFwiZmxhc2g6IGhlYWRlciBBQ0sgZmFpbGVkOiAlcGVcXG5cIiwgRVJSX1BUUihyZXQpKTtcbitcdFx0Z290byBub19lbmQ7XG4rXHR9XG4rXG4rXHQvKiBTdGVwIDU6IHdhaXQgZm9yIGVyYXNlIHRvIGNvbXBsZXRlICovXG4rXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIDAsXG4rXHRcdFx0XHRcdE1YTDg2MlhYX0ZXX0VSQVNFX1RJTUVPVVRfTVMpO1xuK1x0aWYgKHJldCkge1xuK1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XCJmbGFzaDogZXJhc2UgdGltZW91dDogJXBlXFxuXCIsIEVSUl9QVFIocmV0KSk7XG4rXHRcdGdvdG8gbm9fZW5kO1xuK1x0fVxuK1xuK1x0LyogU3RlcCA2OiB0cmFuc2ZlciBwYXlsb2FkICovXG4rXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbitcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcbitcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdGdvdG8gd3JpdGVfZXJyO1xuK1xuK1x0d2hpbGUgKGlkeCBcdTAwM2MgcGF5bG9hZF9zaXplKSB7XG4rXHRcdGNvbmRfcmVzY2hlZCgpO1xuK1x0XHRpZiAoaWR4ICsgMSBcdTAwM2MgcGF5bG9hZF9zaXplKSB7XG4rXHRcdFx0ZmRhdGEgPSBwYXlsb2FkW2lkeF0gfFxuK1x0XHRcdFx0KCh1MTYpcGF5bG9hZFtpZHggKyAxXSBcdTAwM2NcdTAwM2MgOCk7XG4rXHRcdFx0aWR4ICs9IDI7XG4rXHRcdFx0ZGF0YV93cml0dGVuICs9IDI7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0ZmRhdGEgPSBwYXlsb2FkW2lkeF07XG4rXHRcdFx0aWR4Kys7XG4rXHRcdFx0ZGF0YV93cml0dGVuKys7XG4rXHRcdH1cbitcbitcdFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsIGZkYXRhKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRnb3RvIHdyaXRlX2VycjtcbitcdFx0d29yZF9pZHgrKztcbitcbitcdFx0aWYgKGlkeCBcdTAwM2U9IHBheWxvYWRfc2l6ZSkge1xuK1x0XHRcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9mbHVzaF9sYXN0KHByaXYsIGRhdGFfd3JpdHRlbik7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcbitcdFx0LyogSGFsZi1iYW5rIGJvdW5kYXJ5OiBzd2l0Y2ggdG8gU0IxIGFkZHJlc3MgKi9cbitcdFx0aWYgKHdvcmRfaWR4ID09IE1YTDg2MlhYX0ZXX0JBTktfSEFMRikge1xuK1x0XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuK1x0XHRcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7XG4rXHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRcdGdvdG8gd3JpdGVfZXJyO1xuK1xuK1x0XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9BRERSLFxuK1x0XHRcdFx0XHRcdCAgIE1YTDg2MlhYX0ZXX1NCMV9BRERSKTtcbitcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdFx0Z290byB3cml0ZV9lcnI7XG4rXG4rXHRcdFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsXG4rXHRcdFx0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xuK1x0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0XHRnb3RvIHdyaXRlX2VycjtcbitcdFx0fSBlbHNlIGlmICh3b3JkX2lkeCBcdTAwM2U9IE1YTDg2MlhYX0ZXX0JBTktfU0xJQ0UpIHtcbitcdFx0XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2UocHJpdiwgZGF0YV93cml0dGVuKTtcbitcdFx0XHRpZiAocmV0KSB7XG4rXHRcdFx0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XHRcdFwiZmxhc2g6IHdyaXRlIHRpbWVvdXQgYXQgJXUvJXU6ICVwZVxcblwiLFxuK1x0XHRcdFx0XHRpZHgsIHBheWxvYWRfc2l6ZSwgRVJSX1BUUihyZXQpKTtcbitcdFx0XHRcdGdvdG8gbm9fZW5kO1xuK1x0XHRcdH1cbitcdFx0XHR3b3JkX2lkeCA9IDA7XG4rXHRcdFx0ZGF0YV93cml0dGVuID0gMDtcbitcdFx0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbitcdFx0XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XG4rXHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRcdGdvdG8gd3JpdGVfZXJyO1xuK1xuK1x0XHRcdGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG5leHRfbm90aWZ5KSkge1xuK1x0XHRcdFx0bXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCBcIkZsYXNoaW5nXCIsIGlkeCxcbitcdFx0XHRcdFx0XHQgICAgICBwYXlsb2FkX3NpemUpO1xuK1x0XHRcdFx0bmV4dF9ub3RpZnkgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0fVxuK1xuK1x0aWYgKHJldCkge1xuK1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XCJmbGFzaDogZmluYWwgc2xpY2UgZmFpbGVkOiAlcGVcXG5cIiwgRVJSX1BUUihyZXQpKTtcbitcdFx0Z290byBub19lbmQ7XG4rXHR9XG4rXG4rXHRteGw4NjJ4eF9mbGFzaF9ub3RpZnkoZGwsIFwiRmxhc2hpbmdcIiwgcGF5bG9hZF9zaXplLCBwYXlsb2FkX3NpemUpO1xuK1xuK1x0LyogU3VjY2VzczogdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgcmVjZWl2ZSBsb29wIGF0IHJfcmVtYWluID09IDAgYW5kXG4rXHQgKiB2ZXJpZmllZCB0aGUgaW1hZ2UsIHNvIEVORCgweDNjYzMpIGlzIGEgZmluYWxpc2UvYm9vdCByZXF1ZXN0IHJhdGhlclxuK1x0ICogdGhhbiBhIGJ5dGUgY291bnQuIFNpZ25hbCBpdCBoZXJlIC0tIGFuZCBvbmx5IGhlcmUgLS0gdG8gYm9vdCB0aGUgbmV3XG4rXHQgKiBpbWFnZSB3aXRob3V0IHdhaXRpbmcgb3V0IHRoZSBsb2FkZXIncyAyIHMgRU5EIHRpbWVvdXQuXG4rXHQgKi9cbitcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULFxuK1x0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0VORCk7XG4rXHRtc2xlZXAoTVhMODYyWFhfRldfUkVCT09UX0RFTEFZX01TKTtcbitcdHJldHVybiByZXQ7XG4rXG4rd3JpdGVfZXJyOlxuK1x0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LCBcImZsYXNoOiBTTURJTyB3cml0ZSBmYWlsZWQ6ICVwZVxcblwiLFxuK1x0XHRFUlJfUFRSKHJldCkpO1xuK25vX2VuZDpcbitcdC8qIEEgZmFpbHVyZSBsZWF2ZXMgdGhlIGxvYWRlciBtaWQgdHJhbnNmZXI7IGRvIG5vdCBzaWduYWwgRU5EIChhIFNUQVRcbitcdCAqIHdyaXRlIGlzIGEgYnl0ZSBjb3VudCB0aGVuLCBhbmQgRU5EIHdvdWxkIGJlIG1pc3JlYWQgYXMgb25lLCByaXNraW5nXG4rXHQgKiBhIHJlY2VpdmUtY291bnRlciB1bmRlcmZsb3cpLiBSZXR1cm4gdGhlIGVycm9yOyB0aGUgY2FsbGVyIHJlcHJvYmVzLlxuK1x0ICovXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitpbnQgbXhsODYyeHhfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsXG4rXHRcdFx0ICAgICAgc3RydWN0IGRldmxpbmtfaW5mb19yZXEgKnJlcSxcbitcdFx0XHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4re1xuK1x0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cdTAwM2Vwcml2O1xuK1x0Y2hhciBidWZbMTZdO1xuK1x0aW50IHJldDtcbitcbitcdC8qIE5vIGNoaXAtaWQvcmV2aXNpb24gaW4gTUNVYm9vdCAobmVlZHMgdGhlIGZpcm13YXJlIE1NRCBtYWlsYm94KS4gVGhlXG4rXHQgKiBmdyB2ZXJzaW9uIGRvdWJsZXMgYXMgdGhlIFwicmVhZHkgdG8gZmxhc2hcIiBzaWduYWw6IHJlcG9ydCBpdCBvbmx5XG4rXHQgKiBvbmNlIHRoZSBsb2FkZXIgaXMgYXQgYSBjbGVhbiBSRUFEWSwgbm90aGluZyB3aGlsZSBzdGlsbCBkcmFpbmluZy5cbitcdCAqL1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpIHtcbitcdFx0aWYgKCFSRUFEX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHkpKVxuK1x0XHRcdHJldHVybiAwO1xuK1xuK1x0XHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcIiV1LiV1LiV1XCIsXG4rXHRcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5tYWpvciwgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yLFxuK1x0XHRcdCBwcml2LVx1MDAzZWZ3X3ZlcnNpb24ucmV2aXNpb24pO1xuK1x0XHRyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9ydW5uaW5nX3B1dChyZXEsXG4rXHRcdFx0XHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdHJldHVybiBkZXZsaW5rX2luZm9fdmVyc2lvbl9zdG9yZWRfcHV0KHJlcSxcbitcdFx0XHRcdERFVkxJTktfSU5GT19WRVJTSU9OX0dFTkVSSUNfRlcsIGJ1Zik7XG4rXHR9XG4rXG4rXHQvKiBBIDAgcGFydCBudW1iZXIgbWVhbnMgdGhlIENISVAgSUQgcmVhZCBmYWlsZWQgb3IgdGhlIHBhcnQgaXNcbitcdCAqIHVuZnVzZWQ7IG9taXQgaXQgcmF0aGVyIHRoYW4gcHVibGlzaCBhIGJvZ3VzIFwiMDAwMFwiIHRoYXQgZnd1cGRcbitcdCAqIHdvdWxkIG1hdGNoIGZpcm13YXJlIGFnYWluc3QgLS0gaXQgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBkcml2ZXJcbitcdCAqIG5hbWUuXG4rXHQgKi9cbitcdGlmIChwcml2LVx1MDAzZWFzaWNfaWQpIHtcbitcdFx0c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgXCIlMDRYXCIsIHByaXYtXHUwMDNlYXNpY19pZCk7XG4rXHRcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXG4rXHRcdFx0XHRcdFx0ICAgICBERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0FTSUNfSUQsXG4rXHRcdFx0XHRcdFx0ICAgICBidWYpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXG4rXHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJXVcIiwgcHJpdi1cdTAwM2Vhc2ljX3Jldik7XG4rXHRcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXG4rXHRcdFx0XHRcdFx0ICAgICBERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0FTSUNfUkVWLFxuK1x0XHRcdFx0XHRcdCAgICAgYnVmKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0fVxuK1xuK1x0LyogQW4gYWxsLXplcm8gdmVyc2lvbiBpcyB0aGUgY2FjaGUgYSBmYWlsZWQgZmxhc2ggbGVmdCBiZWhpbmQsIG5vdCBhXG4rXHQgKiByZWxlYXNlZCBmaXJtd2FyZTsgb21pdCBpdCBsaWtlIHRoZSBwYXJ0IG51bWJlciBhYm92ZS5cbitcdCAqL1xuK1x0aWYgKCFwcml2LVx1MDAzZWZ3X3ZlcnNpb24ubWFqb3IgXHUwMDI2XHUwMDI2ICFwcml2LVx1MDAzZWZ3X3ZlcnNpb24ubWlub3IgXHUwMDI2XHUwMDI2XG4rXHQgICAgIXByaXYtXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbilcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcIiV1LiV1LiV1XCIsXG4rXHRcdCBwcml2LVx1MDAzZWZ3X3ZlcnNpb24ubWFqb3IsIHByaXYtXHUwMDNlZndfdmVyc2lvbi5taW5vcixcbitcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbik7XG4rXG4rXHRyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9ydW5uaW5nX3B1dChyZXEsXG4rXHRcdFx0REVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19GVywgYnVmKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKiBib290cyB0aGlzIGltYWdlIGZyb20gaXRzIG93biBmbGFzaDogc3RvcmVkID09IHJ1bm5pbmcgKi9cbitcdHJldHVybiBkZXZsaW5rX2luZm9fdmVyc2lvbl9zdG9yZWRfcHV0KHJlcSxcbitcdFx0XHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xuK31cbitcbitpbnQgbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuK1x0XHRcdFx0ICBzdHJ1Y3QgZGV2bGlua19mbGFzaF91cGRhdGVfcGFyYW1zICpwYXJhbXMsXG4rXHRcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbit7XG4rXHRzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLVx1MDAzZXByaXY7XG4rXHRzdHJ1Y3QgZHNhX3BvcnQgKmRwO1xuK1x0dTMyIHBheWxvYWRfc2l6ZTtcbitcdGludCByZXQsIGVyciwgaTtcbitcbitcdGlmIChwYXJhbXMtXHUwMDNlY29tcG9uZW50KSB7XG4rXHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwiY29tcG9uZW50IGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcdH1cbitcbitcdC8qIEEgcHJldmlvdXMgZmxhc2ggaXMgc3RpbGwgd2FpdGluZyBmb3IgaXRzIHJlcHJvYmU6IHRoZSBmaXJtd2FyZSBBUElcbitcdCAqIGlzIHNob3J0LWNpcmN1aXRlZCwgc28gdGhlIHJhdyBTQiBQREkgd3JpdGVzIGJlbG93IHdvdWxkIHJ1biBhZ2FpbnN0XG4rXHQgKiBhIHN3aXRjaCB0aGlzIGRyaXZlciBubyBsb25nZXIgdHJhY2tzLlxuK1x0ICovXG4rXHRpZiAocHJpdi1cdTAwM2Vza2lwX3RlYXJkb3duKSB7XG4rXHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXG4rXHRcdFx0XHQgICBcImRldmljZSBpcyByZWluaXRpYWxpemluZywgcmV0cnkgbGF0ZXJcIik7XG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXHR9XG4rXG4rXHRyZXQgPSBteGw4NjJ4eF9mbGFzaF92YWxpZGF0ZShwcml2LCBwYXJhbXMtXHUwMDNlZncsIFx1MDAyNnBheWxvYWRfc2l6ZSk7XG4rXHRpZiAocmV0KSB7XG4rXHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwiZmlybXdhcmUgaW1hZ2UgdmFsaWRhdGlvbiBmYWlsZWRcIik7XG4rXHRcdHJldHVybiByZXQ7XG4rXHR9XG4rXG4rXHQvKiBSZWZ1c2UgdG8gZmxhc2ggd2hpbGUgdGhlIGJhY2tncm91bmQgc2VsZi1oZWFsIGlzIHN0aWxsIGRyYWluaW5nLCBhbmRcbitcdCAqIGZvciBnb29kIG9uY2UgaXQgaGFzIGdpdmVuIHVwIG9uIHRoZSBsb2FkZXIuXG4rXHQgKi9cbitcdGlmIChSRUFEX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfZmFpbGVkKSkge1xuK1x0XHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLFxuK1x0XHRcdFx0ICAgXCJkb3dubG9hZCByZWNvdmVyeSBmYWlsZWQsIHBvd2VyIGN5Y2xlIHRoZSBzd2l0Y2hcIik7XG4rXHRcdHJldHVybiAtRUlPO1xuK1x0fVxuK1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUgXHUwMDI2XHUwMDI2ICFSRUFEX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHkpKSB7XG4rXHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXG4rXHRcdFx0XHQgICBcInN3aXRjaCBpcyByZWNvdmVyaW5nIGFuIGludGVycnVwdGVkIGRvd25sb2FkLCByZXRyeSBzaG9ydGx5XCIpO1xuK1x0XHRyZXR1cm4gLUVCVVNZO1xuK1x0fVxuK1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpXG4rXHRcdGRldl9pbmZvKGRzLVx1MDAzZWRldixcbitcdFx0XHQgXCJmbGFzaDogZmxhc2hpbmcgc3dpdGNoIHZpYSBNQ1Vib290IHJlc2N1ZSBtb2RlXFxuXCIpO1xuK1x0ZWxzZVxuK1x0XHRkZXZfaW5mbyhkcy1cdTAwM2VkZXYsIFwiZmxhc2g6IHJ1bm5pbmcgZmlybXdhcmUgJXUuJXUuJXVcXG5cIixcbitcdFx0XHQgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1ham9yLCBwcml2LVx1MDAzZWZ3X3ZlcnNpb24ubWlub3IsXG4rXHRcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbik7XG4rXG4rXHQvKiBDbG9zZSBwb3J0cyB3aGlsZSB0aGUgZmlybXdhcmUgaXMgc3RpbGwgYWxpdmUgc28gdGhlIERTQSBjb3JlJ3NcbitcdCAqIE1EQi9GREIgdHJhY2tpbmcgaXMgZHJhaW5lZCwgYW5kIGRldGFjaCB1c2VyIHBvcnRzIHNvIHVzZXJzcGFjZVxuK1x0ICogY2Fubm90IHJlb3BlbiB0aGVtIGR1cmluZyB0aGUgZmxhc2guIFRoZSBjb25kdWl0IGlzIG9ubHkgY2xvc2VkLFxuK1x0ICogbm90IGRldGFjaGVkOiBpdCBiZWxvbmdzIHRvIHRoZSBNQUMgZHJpdmVyLiBUaGlzIGRyaXZlciBiaW5kcyBhXG4rXHQgKiBzaW5nbGUgc3dpdGNoIHdpdGggYSBkaXJlY3QgaG9zdCBsaW5rIGFuZCBubyBjYXNjYWRlIHBvcnRzLCBzbyB0aGVcbitcdCAqIGNvbmR1aXQgc2VydmVzIG9ubHkgdGhpcyBzd2l0Y2gsIGFuZCBmbGFzaGluZyBpdCByZWJvb3RzIHRoZSBzd2l0Y2gsXG4rXHQgKiB3aGljaCB0YWtlcyB0aGUgdHJlZSBkb3duIHJlZ2FyZGxlc3MuXG4rXHQgKi9cbitcdHJ0bmxfbG9jaygpO1xuK1x0ZHNhX3N3aXRjaF9mb3JfZWFjaF91c2VyX3BvcnQoZHAsIGRzKSB7XG4rXHRcdGlmIChkcC1cdTAwM2V1c2VyKSB7XG4rXHRcdFx0ZGV2X2Nsb3NlKGRwLVx1MDAzZXVzZXIpO1xuK1x0XHRcdG5ldGlmX2RldmljZV9kZXRhY2goZHAtXHUwMDNldXNlcik7XG4rXHRcdH1cbitcdH1cbitcdGRzYV9zd2l0Y2hfZm9yX2VhY2hfY3B1X3BvcnQoZHAsIGRzKVxuK1x0XHRkZXZfY2xvc2UoZHAtXHUwMDNlY29uZHVpdCk7XG4rXHQvKiBUaGUgYnJpZGdlIGRlZmVycyB0aGUgU1RQIHN0YXRlIGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IGNsb3NpbmdcbitcdCAqIHRoZSBwb3J0czsgbGV0IHRoZW0gcmVhY2ggdGhlIGZpcm13YXJlIHdoaWxlIGl0IGlzIHN0aWxsIGFsaXZlLlxuK1x0ICovXG4rXHRzd2l0Y2hkZXZfZGVmZXJyZWRfcHJvY2VzcygpO1xuK1x0cnRubF91bmxvY2soKTtcbitcbitcdG11dGV4X2xvY2tfbmVzdGVkKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7XG4rXHRwcml2LVx1MDAzZWJsb2NrX2hvc3QgPSB0cnVlO1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrKTtcbitcbitcdHNldF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFx1MDAyNnByaXYtXHUwMDNlZmxhZ3MpO1xuK1x0Y2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKFx1MDAyNnByaXYtXHUwMDNlc3RhdHNfd29yayk7XG4rXHRjYW5jZWxfd29ya19zeW5jKFx1MDAyNnByaXYtXHUwMDNlY3JjX2Vycl93b3JrKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRzLVx1MDAzZW51bV9wb3J0czsgaSsrKVxuK1x0XHRjYW5jZWxfd29ya19zeW5jKFx1MDAyNnByaXYtXHUwMDNlcG9ydHNbaV0uaG9zdF9mbG9vZF93b3JrKTtcbitcbitcdHJldCA9IG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKHByaXYsIHBhcmFtcy1cdTAwM2VmdywgcGF5bG9hZF9zaXplLFxuK1x0XHRcdFx0ICAgICAgZHMtXHUwMDNlZGV2bGluayk7XG4rXHRpZiAocmV0KVxuK1x0XHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcImZpcm13YXJlIHRyYW5zZmVyIGZhaWxlZFwiKTtcbitcbitcdGlmICghcmV0KSB7XG4rXHRcdG11dGV4X2xvY2tfbmVzdGVkKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrLFxuK1x0XHRcdFx0ICBNRElPX01VVEVYX05FU1RFRCk7XG4rXHRcdHByaXYtXHUwMDNlYmxvY2tfaG9zdCA9IGZhbHNlO1xuK1x0XHRwcml2LVx1MDAzZXJlc2N1ZV9tb2RlID0gZmFsc2U7XG4rXHRcdG11dGV4X3VubG9jayhcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzLVx1MDAzZW1kaW9fbG9jayk7XG4rXG4rXHRcdC8qIFJlZnJlc2ggdGhlIGNhY2hlZCB2ZXJzaW9ucyBzbyB0aGUgZmxhc2ggdXBkYXRlIG9ubHlcbitcdFx0ICogY29tcGxldGVzIG9uY2UgdGhlIG5ldyBmaXJtd2FyZSBpcyBjb25maXJtZWQgcnVubmluZyBhbmRcbitcdFx0ICogZGV2bGluayBkZXYgaW5mbyByZXBvcnRzIGl0LiBNdXN0IGhhcHBlbiBiZWZvcmUgc2V0dGluZ1xuK1x0XHQgKiBza2lwX3RlYXJkb3duLCB3aGljaCBkaXNjYXJkcyBhbGwgZmlybXdhcmUgQVBJIHJlYWRzLlxuK1x0XHQgKi9cbitcdFx0cmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjayxcbitcdFx0XHRcdFx0ICAgXCJuZXcgZmlybXdhcmUgZGlkIG5vdCBiZWNvbWUgcmVhZHlcIik7XG4rXHR9XG4rXG4rXHRpZiAocmV0KSB7XG4rXHRcdC8qIFRoZSBzd2l0Y2ggaXMgaW4gTUNVYm9vdCB3aXRoIGVyYXNlZCBvciBwYXJ0bHkgd3JpdHRlbiBmbGFzaDtcbitcdFx0ICogZHJvcCB0aGUgY2FjaGVkIGlkZW50aXR5IHNvIGRldmxpbmsgZGV2IGluZm8gc3RvcHMgcmVwb3J0aW5nXG4rXHRcdCAqIHRoZSBwcmUtZmxhc2ggdmVyc2lvbiB1bnRpbCB0aGUgcmVwcm9iZSByZS1yZWFkcyB0aGUgdHJ1dGguXG4rXHRcdCAqL1xuK1x0XHRtZW1zZXQoXHUwMDI2cHJpdi1cdTAwM2Vmd192ZXJzaW9uLCAwLCBzaXplb2YocHJpdi1cdTAwM2Vmd192ZXJzaW9uKSk7XG4rXHRcdHByaXYtXHUwMDNlYXNpY19pZCA9IDA7XG4rXHRcdHByaXYtXHUwMDNlYXNpY19yZXYgPSAwO1xuK1x0fVxuK1xuK1x0bXV0ZXhfbG9ja19uZXN0ZWQoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWJ1cy1cdTAwM2VtZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTtcbitcdHByaXYtXHUwMDNlc2tpcF90ZWFyZG93biA9IHRydWU7XG4rXHRtdXRleF91bmxvY2soXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWJ1cy1cdTAwM2VtZGlvX2xvY2spO1xuK1xuK1x0LyogUmVpbml0aWFsaXNlIHRocm91Z2ggYSBkZWZlcnJlZCByZS1wcm9iZTogcmVtb3ZlKCkgcnVucyB3aXRoXG4rXHQgKiBza2lwX3RlYXJkb3duIHNldCwgdGhlbiBhIGZyZXNoIHByb2JlKCkgc3RhcnRzIGFnYWluc3Qgd2hhdGV2ZXJcbitcdCAqIHRoZSBzd2l0Y2ggbm93IHJ1bnMuIFRoZSBjb3JlIHNraXBzIHRoZSByZS1wcm9iZSBpZiB0aGUgZGV2aWNlXG4rXHQgKiBpcyB1bmJvdW5kIG9yIHNodXQgZG93biBiZWZvcmUgaXQgZmlyZXMuXG4rXHQgKi9cbitcdGVyciA9IGRldmljZV9zY2hlZHVsZV9yZXByb2JlKGRzLVx1MDAzZWRldiwgTVhMODYyWFhfRldfUkVQUk9CRV9ERUxBWV9NUyk7XG4rXG4rXHRyZXR1cm4gcmV0ID8gcmV0IDogZXJyO1xuK31cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uN2NkODdjN2FkODcxNlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmhcbkBAIC0wLDAgKzEsMjAgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xuK1xuKyNpZm5kZWYgX19NWEw4NjJYWF9GV19IXG4rI2RlZmluZSBfX01YTDg2MlhYX0ZXX0hcbitcbisjaW5jbHVkZSBcdTAwM2NuZXQvZHNhLmhcdTAwM2VcbitcbitzdHJ1Y3QgbXhsODYyeHhfcHJpdjtcbitzdHJ1Y3Qgd29ya19zdHJ1Y3Q7XG4rXG4raW50IG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdik7XG4rdm9pZCBteGw4NjJ4eF9yZXNjdWVfaGVhbF93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7XG4raW50IG14bDg2Mnh4X2RldmxpbmtfaW5mb19nZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuK1x0XHRcdCAgICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsXG4rXHRcdFx0ICAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKTtcbitpbnQgbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuK1x0XHRcdFx0ICBzdHJ1Y3QgZGV2bGlua19mbGFzaF91cGRhdGVfcGFyYW1zICpwYXJhbXMsXG4rXHRcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4rXG4rI2VuZGlmIC8qIF9fTVhMODYyWFhfRldfSCAqL1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmMgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jXG5pbmRleCA0YWNkMjE2ZjdjYzAwLi40ZGY3YzgzODA4ZjYwIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuY1xuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuY1xuQEAgLTE1LDYgKzE1LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91bmFsaWduZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9kc2EuaFx1MDAzZVxuICNpbmNsdWRlIFwibXhsODYyeHguaFwiXG4rI2luY2x1ZGUgXCJteGw4NjJ4eC1jbWQuaFwiXG4rI2luY2x1ZGUgXCJteGw4NjJ4eC1mdy5oXCJcbiAjaW5jbHVkZSBcIm14bDg2Mnh4LWhvc3QuaFwiXG4gXG4gI2RlZmluZSBDVFJMX0JVU1lfTUFTS1x0XHRcdEJJVCgxNSlcbkBAIC0zNDAsNiArMzQyLDIxIEBAIGludCBteGw4NjJ4eF9hcGlfd3JhcChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGNtZCwgdm9pZCAqX2RhdGEsXG4gXG4gXHRtdXRleF9sb2NrX25lc3RlZChcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzLVx1MDAzZW1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpO1xuIFxuK1x0aWYgKHByaXYtXHUwMDNlc2tpcF90ZWFyZG93bikge1xuK1x0XHRyZXQgPSByZWFkID8gLUVOT0RFViA6IDA7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpIHtcbitcdFx0cmV0ID0gLUVOT0RFVjtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAocHJpdi1cdTAwM2VibG9ja19ob3N0IFx1MDAyNlx1MDAyNiBjbWQgIT0gU1lTX01JU0NfRldfVVBEQVRFKSB7XG4rXHRcdHJldCA9IC1FQlVTWTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4gXHRtYXggPSAoc2l6ZSArIDEpIC8gMjtcbiBcbiBcdHJldCA9IG14bDg2Mnh4X2J1c3lfd2FpdChwcml2KTtcbkBAIC00OTUsMTIgKzUxMiw1NCBAQCBpbnQgbXhsODYyeHhfcmVzZXQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbisjZGVmaW5lIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHXHRcdDB4MWZcbisjZGVmaW5lIE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTS1x0MHhmZmYwXG4rI2RlZmluZSBNWEw4NjJYWF9TTURJT19PRkZfTUFTS1x0XHQweDAwMGZcbitcbisvKiBQYWdlZCBjbGF1c2UtMjIgd2luZG93OiB0aGUgcGFnZSBnb2VzIGludG8gTUlJIHJlZ2lzdGVyIDB4MWYsIHRoZSBsb3cgbmliYmxlXG4rICogb2YgYWRkciBzZWxlY3RzIG9uZSBvZiB0aGUgMTYgcmVnaXN0ZXJzIHdpdGhpbiBpdC4gQm90aCBoZWxwZXJzIHRha2UgdGhlIE1ESU9cbisgKiBidXMgbG9jayBwZXIgdHJhbnNhY3Rpb24sIHNvIGNhbGxlcnMgbXVzdCBub3QgYWxyZWFkeSBob2xkIGl0IC0tIHVubGlrZVxuKyAqIG14bDg2Mnh4X2FwaV93cmFwKCksIHdoaWNoIGhvbGRzIGl0IGFjcm9zcyBhIHdob2xlIGZpcm13YXJlIGNvbW1hbmQuXG4rICovXG4raW50IG14bDg2Mnh4X3NtZGlvX3JlYWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyKVxuK3tcbitcdHN0cnVjdCBtaWlfYnVzICpidXMgPSBwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzO1xuK1x0aW50IHBoeSA9IHByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VhZGRyO1xuK1x0aW50IHJldDtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2YnVzLVx1MDAzZW1kaW9fbG9jayk7XG4rXHRyZXQgPSBfX21kaW9idXNfd3JpdGUoYnVzLCBwaHksIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHLFxuK1x0XHRcdCAgICAgIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTSyk7XG4rXHRpZiAocmV0IFx1MDAzZT0gMClcbitcdFx0cmV0ID0gX19tZGlvYnVzX3JlYWQoYnVzLCBwaHksIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX09GRl9NQVNLKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZidXMtXHUwMDNlbWRpb19sb2NrKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK2ludCBteGw4NjJ4eF9zbWRpb193cml0ZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHUxNiB2YWwpXG4re1xuK1x0c3RydWN0IG1paV9idXMgKmJ1cyA9IHByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXM7XG4rXHRpbnQgcGh5ID0gcHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWFkZHI7XG4rXHRpbnQgcmV0O1xuK1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZidXMtXHUwMDNlbWRpb19sb2NrKTtcbitcdHJldCA9IF9fbWRpb2J1c193cml0ZShidXMsIHBoeSwgTVhMODYyWFhfU01ESU9fQUREUl9SRUcsXG4rXHRcdFx0ICAgICAgYWRkciBcdTAwMjYgTVhMODYyWFhfU01ESU9fUEFHRV9NQVNLKTtcbitcdGlmIChyZXQgXHUwMDNlPSAwKVxuK1x0XHRyZXQgPSBfX21kaW9idXNfd3JpdGUoYnVzLCBwaHksIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX09GRl9NQVNLLFxuK1x0XHRcdFx0ICAgICAgdmFsKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZidXMtXHUwMDNlbWRpb19sb2NrKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuIHZvaWQgbXhsODYyeHhfaG9zdF9pbml0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxuIHtcbiBcdElOSVRfV09SSyhcdTAwMjZwcml2LVx1MDAzZWNyY19lcnJfd29yaywgbXhsODYyeHhfY3JjX2Vycl93b3JrX2ZuKTtcbitcdElOSVRfV09SSyhcdTAwMjZwcml2LVx1MDAzZXJlc2N1ZV9oZWFsX3dvcmssIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4pO1xuIH1cbiBcbiB2b2lkIG14bDg2Mnh4X2hvc3Rfc2h1dGRvd24oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4ge1xuIFx0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZwcml2LVx1MDAzZWNyY19lcnJfd29yayk7XG4rXHRjYW5jZWxfd29ya19zeW5jKFx1MDAyNnByaXYtXHUwMDNlcmVzY3VlX2hlYWxfd29yayk7XG4gfVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5oXG5pbmRleCA2NmQ2YWUxOThhZmY0Li40ZTA1NGM2ZTRjMGU0IDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaFxuQEAgLTE4LDUgKzE4LDcgQEAgaW50IG14bDg2Mnh4X2FwaV93cmFwKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MTYgY21kLCB2b2lkICpkYXRhLCB1MTYgc2l6ZSxcbiBcdG14bDg2Mnh4X2FwaV93cmFwKGRldiwgY21kLCBcdTAwMjYoZGF0YSksIHNpemVvZigoZGF0YSkpLCB0cnVlLCB0cnVlKVxuIFxuIGludCBteGw4NjJ4eF9yZXNldChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdik7XG4raW50IG14bDg2Mnh4X3NtZGlvX3JlYWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyKTtcbitpbnQgbXhsODYyeHhfc21kaW9fd3JpdGUoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1MTYgdmFsKTtcbiBcbiAjZW5kaWYgLyogX19NWEw4NjJYWF9IT1NUX0ggKi9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LXBoeWxpbmsuY1xuaW5kZXggYjY4OTY1MmFhOWI5Mi4uYTViNjk0MGI1NTJlOSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1waHlsaW5rLmNcbisrKyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1waHlsaW5rLmNcbkBAIC00MDYsNiArNDA2LDggQEAgbXhsODYyeHhfcGh5bGlua19tYWNfc2VsZWN0X3BjcyhzdHJ1Y3QgcGh5bGlua19jb25maWcgKmNvbmZpZyxcbiBcbiBcdHN3aXRjaCAocG9ydCkge1xuIFx0Y2FzZSA5IC4uLiAxNjpcbitcdFx0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpXG4rXHRcdFx0cmV0dXJuIE5VTEw7XG4gXHRcdGlmICghTVhMODYyWFhfRldfVkVSX01JTihwcml2LCAxLCAwLCA4NCkpIHtcbiBcdFx0XHRkZXZfd2Fybl9vbmNlKGRwLVx1MDAzZWRzLVx1MDAzZWRldixcbiBcdFx0XHRcdCAgICAgIFwiU2VyRGVzIFBDUyB1bnN1cHBvcnRlZCBvbiBvbGQgZmlybXdhcmUuXFxuXCIpO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmNcbmluZGV4IDQ1ZDIzN2IzYTQwZjEuLjBlMTc5Y2FlOTdmMzggMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguY1xuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmNcbkBAIC0yMSw2ICsyMSw3IEBAXG4gI2luY2x1ZGUgXCJteGw4NjJ4eC5oXCJcbiAjaW5jbHVkZSBcIm14bDg2Mnh4LWFwaS5oXCJcbiAjaW5jbHVkZSBcIm14bDg2Mnh4LWNtZC5oXCJcbisjaW5jbHVkZSBcIm14bDg2Mnh4LWZ3LmhcIlxuICNpbmNsdWRlIFwibXhsODYyeHgtaG9zdC5oXCJcbiAjaW5jbHVkZSBcIm14bDg2Mnh4LXBoeWxpbmsuaFwiXG4gXG5AQCAtNzEsNiArNzIsMTMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX3Jtb25faGlzdF9yYW5nZSBteGw4NjJ4eF9ybW9uX3Jhbmdlc1tdID0ge1xuICNkZWZpbmUgTVhMODYyWFhfUkVBRFlfVElNRU9VVF9NU1x0MTAwMDBcbiAjZGVmaW5lIE1YTDg2MlhYX1JFQURZX1BPTExfTVNcdFx0MTAwXG4gXG4rLyogQ2hpcCBJRCByZWdpc3RlcnMsIHJlYWQgdmlhIFNZU19NSVNDX1JFR19SRCAqL1xuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX0xcdFx0MHhjMGQyODg4NFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01cdFx0MHhjMGQyODg4OFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX0xfUE5VTUxcdFx0R0VOTUFTSygxNSwgMTIpXG4rI2RlZmluZSBNWEw4NjJYWF9DSElQSURfTV9QTlVNTVx0XHRHRU5NQVNLKDExLCAwKVxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01fVkVSU0lPTlx0R0VOTUFTSygxNCwgMTIpXG4rXG4gI2RlZmluZSBNWEw4NjJYWF9UQ01fSU5TVF9TRUxcdFx0MHhlMDBcbiAjZGVmaW5lIE1YTDg2MlhYX1RDTV9DQlNcdFx0MHhlMTJcbiAjZGVmaW5lIE1YTDg2MlhYX1RDTV9FQlNcdFx0MHhlMTNcbkBAIC0yMjIsNyArMjMwLDQ2IEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcGh5X3dyaXRlX2M0NV9taWlfYnVzKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLFxuIFx0cmV0dXJuIG14bDg2Mnh4X3BoeV93cml0ZV9tbWQoYnVzLVx1MDAzZXByaXYsIGFkZHIsIGRldmFkZCwgcmVnbnVtLCB2YWwpO1xuIH1cbiBcbi1zdGF0aWMgaW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKVxuKy8qIFJlYWQgdGhlIHN0YXRpYyBjaGlwIHBhcnQgbnVtYmVyIGFuZCB2ZXJzaW9uIGZyb20gdGhlIENISVAgSURcbisgKiByZWdpc3RlcnMuIE9ubHkgcG9zc2libGUgd2l0aCBhIHJ1bm5pbmcgZmlybXdhcmUsIHNvIHRoZSB2YWx1ZXMgYXJlXG4rICogY2FjaGVkIGF0IHNldHVwIGFuZCBsZWZ0IHplcm8gd2hlbiB0aGUgc3dpdGNoIGlzIGluIHJlc2N1ZSBtb2RlLlxuKyAqL1xuK3N0YXRpYyBpbnQgbXhsODYyeHhfcmVhZF9jaGlwX2lkKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxuK3tcbitcdHN0cnVjdCBteGw4NjJ4eF9zeXNfcmVnX3J3IHJlZyA9IHt9O1xuK1x0dTE2IGNoaXBpZF9sLCBjaGlwaWRfbTtcbitcdGludCByZXQ7XG4rXG4rXHRyZWcuYWRkciA9IGNwdV90b19sZTMyKE1YTDg2MlhYX0NISVBJRF9MKTtcbitcdHJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIFNZU19NSVNDX1JFR19SRCwgcmVnKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXHRjaGlwaWRfbCA9IGxlMzJfdG9fY3B1KHJlZy52YWwpO1xuK1xuK1x0cmVnLmFkZHIgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9DSElQSURfTSk7XG4rXHRyZXQgPSBNWEw4NjJYWF9BUElfUkVBRChwcml2LCBTWVNfTUlTQ19SRUdfUkQsIHJlZyk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1x0Y2hpcGlkX20gPSBsZTMyX3RvX2NwdShyZWcudmFsKTtcbitcbitcdHByaXYtXHUwMDNlYXNpY19pZCA9IEZJRUxEX0dFVChNWEw4NjJYWF9DSElQSURfTF9QTlVNTCwgY2hpcGlkX2wpIHxcbitcdFx0XHRGSUVMRF9HRVQoTVhMODYyWFhfQ0hJUElEX01fUE5VTU0sIGNoaXBpZF9tKSBcdTAwM2NcdTAwM2MgNDtcbitcdHByaXYtXHUwMDNlYXNpY19yZXYgPSBGSUVMRF9HRVQoTVhMODYyWFhfQ0hJUElEX01fVkVSU0lPTiwgY2hpcGlkX20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIG14bDg2Mnh4X3dhaXRfcmVhZHkgLSB3YWl0IGZvciB0aGUgc3dpdGNoIGZpcm13YXJlIHRvIGJlY29tZSBvcGVyYXRpb25hbFxuKyAqIEBkczogRFNBIHN3aXRjaCBpbnN0YW5jZVxuKyAqXG4rICogUG9sbCB0aGUgZmlybXdhcmUgdW50aWwgaXQgcmVwb3J0cyBpdHMgdmVyc2lvbiBhbmQgYWNjZXB0c1xuKyAqIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMsIHRoZW4gY2FjaGUgdGhlIGZpcm13YXJlIHZlcnNpb24gYW5kIGNoaXAgSUQuXG4rICogVGFrZXMgYXQgbGVhc3QgdHdvIHNlY29uZHMuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4rICovXG4raW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKVxuIHtcbiBcdHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB2ZXIgPSB7fTtcbiBcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzLCB0aW1lb3V0O1xuQEAgLTI1NCw2ICszMDEsMTEgQEAgc3RhdGljIGludCBteGw4NjJ4eF93YWl0X3JlYWR5KHN0cnVjdCBkc2Ffc3dpdGNoICpkcylcbiBcdFx0cHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1ham9yID0gdmVyLml2X21ham9yO1xuIFx0XHRwcml2LVx1MDAzZWZ3X3ZlcnNpb24ubWlub3IgPSB2ZXIuaXZfbWlub3I7XG4gXHRcdHByaXYtXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbiA9IGxlMTZfdG9fY3B1KHZlci5pdl9yZXZpc2lvbik7XG4rXG4rXHRcdHJldCA9IG14bDg2Mnh4X3JlYWRfY2hpcF9pZChwcml2KTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRkZXZfd2Fybihkcy1cdTAwM2VkZXYsIFwiZmFpbGVkIHRvIHJlYWQgY2hpcCBJRDogJXBlXFxuXCIsXG4rXHRcdFx0XHQgRVJSX1BUUihyZXQpKTtcbiBcdFx0cmV0dXJuIDA7XG4gXG4gbm90X3JlYWR5X3lldDpcbkBAIC02MjIsMjEgKzY3NCw2NiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcylcbiBcdGludCBuX3VzZXJfcG9ydHMgPSAwLCBtYXhfdmxhbnM7XG4gXHRpbnQgaW5ncmVzc19maW5hbHMsIHZpZF9ydWxlcztcbiBcdHN0cnVjdCBkc2FfcG9ydCAqZHA7XG4tXHRpbnQgcmV0LCBpO1xuLVxuLVx0cmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7XG4tXHRpZiAocmV0KVxuLVx0XHRyZXR1cm4gcmV0O1xuLVxuLVx0cmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7XG4tXHRpZiAocmV0KVxuLVx0XHRyZXR1cm4gcmV0O1xuK1x0aW50IHJldCwgaSwgcmVzY3VlO1xuIFxuK1x0LyogVGhlIFNlckRlcyBzdGF0ZSBpcyBzb2Z0d2FyZS1vbmx5IGFuZCBtdXN0IGV4aXN0IGJlZm9yZSBhbnl0aGluZyBjYW5cbitcdCAqIHJlYWNoIHBoeWxpbmssIGluY2x1ZGluZyBhIHJlc2N1ZS1tb2RlIGZsYXNoIGNsZWFyaW5nIHJlc2N1ZV9tb2RlXG4rXHQgKiBhaGVhZCBvZiB0aGUgcmVwcm9iZS5cbitcdCAqL1xuIFx0bXV0ZXhfaW5pdChcdTAwMjZwcml2LVx1MDAzZXNlcmRlc19sb2NrKTtcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUocHJpdi1cdTAwM2VzZXJkZXNfcG9ydHMpOyBpKyspXG4gXHRcdG14bDg2Mnh4X3NldHVwX3Bjcyhwcml2LCBcdTAwMjZwcml2LVx1MDAzZXNlcmRlc19wb3J0c1tpXSxcbiBcdFx0XHRcdCAgIGkgKyBNWEw4NjJYWF9GSVJTVF9TRVJERVNfUE9SVCk7XG4gXG4rXHQvKiBEZXRlY3QgdGhlIGxvYWRlciBvdmVyIFNCIFBESSBmaXJzdDogaXQgbmVlZHMgbm8gZmlybXdhcmUsIHVubGlrZSB0aGVcbitcdCAqIEM0NSBBUEkgKG14bDg2Mnh4X3Jlc2V0L3dhaXRfcmVhZHkpIHdoaWNoIHNwZXdzIENSQyBlcnJvcnMgd2hlbiBub25lXG4rXHQgKiBhbnN3ZXJzLiBUb3VjaCBDNDUgb25seSBvbmNlIHJlc2N1ZSBpcyBydWxlZCBvdXQuXG4rXHQgKi9cbitcdHJlc2N1ZSA9IG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdChwcml2KTtcbitcdGlmIChyZXNjdWUgXHUwMDNjIDApIHtcbitcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsIFwic3dpdGNoIHN0YXRlIGRldGVjdGlvbiBmYWlsZWQ6ICVwZVxcblwiLFxuK1x0XHRcdEVSUl9QVFIocmVzY3VlKSk7XG4rXHRcdHJldHVybiByZXNjdWU7XG4rXHR9XG4rXG4rXHRpZiAocmVzY3VlID09IE1YTDg2MlhYX05PVF9SRVNDVUUpIHtcbitcdFx0cmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcbitcdFx0cmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7XG4rXHRcdGlmIChyZXQpIHtcbitcdFx0XHQvKiB0aGUgcmVzZXQgbWF5IG9ubHkgbm93IGhhdmUgdHJpZ2dlcmVkIHJlc2N1ZSBtb2RlICovXG4rXHRcdFx0cmVzY3VlID0gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHByaXYpO1xuK1x0XHRcdGlmIChyZXNjdWUgXHUwMDNjIDApIHtcbitcdFx0XHRcdGRldl9lcnIoZHMtXHUwMDNlZGV2LFxuK1x0XHRcdFx0XHRcInN3aXRjaCBub3QgcmVzcG9uZGluZyBhZnRlciByZXNldDogJXBlXFxuXCIsXG4rXHRcdFx0XHRcdEVSUl9QVFIocmVzY3VlKSk7XG4rXHRcdFx0XHRyZXR1cm4gcmVzY3VlO1xuK1x0XHRcdH1cbitcdFx0XHRpZiAocmVzY3VlID09IE1YTDg2MlhYX05PVF9SRVNDVUUpXG4rXHRcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRwcml2LVx1MDAzZXJlc2N1ZV9tb2RlID0gcmVzY3VlO1xuK1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpIHtcbitcdFx0aWYgKHByaXYtXHUwMDNlcmVzY3VlX3JlYWR5KSB7XG4rXHRcdFx0ZGV2X3dhcm4oZHMtXHUwMDNlZGV2LFxuK1x0XHRcdFx0IFwic3dpdGNoIGluIE1DVWJvb3QgcmVzY3VlIG1vZGUsIHVzZSBkZXZsaW5rIHRvIGZsYXNoIG5ldyBmaXJtd2FyZVxcblwiKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHQvKiBEcmFpbiB0aGUgd2VkZ2VkIGRvd25sb2FkIGluIHRoZSBiYWNrZ3JvdW5kIHNvIGl0XG4rXHRcdFx0ICogbmV2ZXIgaG9sZHMgdGhlIGRldmxpbmsgbG9jazsgaW5mbyBhbmQgZmxhc2ggYmVjb21lXG4rXHRcdFx0ICogYXZhaWxhYmxlIG9uY2UgcmVhZHkuXG4rXHRcdFx0ICovXG4rXHRcdFx0ZGV2X3dhcm4oZHMtXHUwMDNlZGV2LFxuK1x0XHRcdFx0IFwic3dpdGNoIGluIE1DVWJvb3Qgd2l0aCBhbiBpbnRlcnJ1cHRlZCBkb3dubG9hZCwgcmVjb3ZlcmluZyBpbiBiYWNrZ3JvdW5kXFxuXCIpO1xuK1x0XHRcdHF1ZXVlX3dvcmsoc3lzdGVtX2xvbmdfd3EsIFx1MDAyNnByaXYtXHUwMDNlcmVzY3VlX2hlYWxfd29yayk7XG4rXHRcdH1cbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4gXHQvKiBDYWxjdWxhdGUgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplcy5cbiBcdCAqIFdpdGggVkxBTiBGaWx0ZXIgaGFuZGxpbmcgVklEIG1lbWJlcnNoaXAgY2hlY2tzOlxuIFx0ICogICBJbmdyZXNzOiBvbmx5IGZpbmFsIGNhdGNoYWxsIHJ1bGVzIChQVklEIGluc2VydGlvbiwgODAyLjFRXG5AQCAtNzE1LDExICs4MTIsMjEgQEAgc3RhdGljIGludCBteGw4NjJ4eF9wb3J0X3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGJvb2wgZW5hYmxlKVxuIHN0YXRpYyBpbnQgbXhsODYyeHhfcG9ydF9lbmFibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCxcbiBcdFx0XHRcdHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpXG4ge1xuK1x0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cdTAwM2Vwcml2O1xuK1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpXG4rXHRcdHJldHVybiAwO1xuK1xuIFx0cmV0dXJuIG14bDg2Mnh4X3BvcnRfc3RhdGUoZHMsIHBvcnQsIHRydWUpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBteGw4NjJ4eF9wb3J0X2Rpc2FibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcbiB7XG4rXHRzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLVx1MDAzZXByaXY7XG4rXG4rXHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSlcbitcdFx0cmV0dXJuO1xuK1xuIFx0aWYgKG14bDg2Mnh4X3BvcnRfc3RhdGUoZHMsIHBvcnQsIGZhbHNlKSlcbiBcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsIFwiZmFpbGVkIHRvIGRpc2FibGUgcG9ydCAlZFxcblwiLCBwb3J0KTtcbiB9XG5AQCAtMTMzNyw2ICsxNDQ0LDE3IEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcG9ydF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KVxuIFx0Ym9vbCBpc19jcHVfcG9ydCA9IGRzYV9wb3J0X2lzX2NwdShkcCk7XG4gXHRpbnQgcmV0O1xuIFxuK1x0aWYgKGRzYV9wb3J0X2lzX2RzYShkcCkpIHtcbitcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsIFwicG9ydCAlZDogRFNBIGxpbmtzIG5vdCBzdXBwb3J0ZWRcXG5cIiwgcG9ydCk7XG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcdH1cbitcbitcdC8qIERTQSByZWluaXRzIGZhaWxlZCB1c2VyIHBvcnRzIGFzIHVudXNlZDsgc2hhcmVkIHBvcnRzIG11c3RcbitcdCAqIHN1Y2NlZWQgZm9yIHRoZSB0cmVlIHRvIHJlZ2lzdGVyLlxuK1x0ICovXG4rXHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSlcbitcdFx0cmV0dXJuIGRzYV9wb3J0X2lzX3VzZXIoZHApID8gLUVOT0RFViA6IDA7XG4rXG4gXHRyZXQgPSBteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSk7XG4gXHRpZiAocmV0KVxuIFx0XHRyZXR1cm4gcmV0O1xuQEAgLTEzNDYsMTEgKzE0NjQsNiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcbiBcdGlmIChkc2FfcG9ydF9pc191bnVzZWQoZHApKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdGlmIChkc2FfcG9ydF9pc19kc2EoZHApKSB7XG4tXHRcdGRldl9lcnIoZHMtXHUwMDNlZGV2LCBcInBvcnQgJWQ6IERTQSBsaW5rcyBub3Qgc3VwcG9ydGVkXFxuXCIsIHBvcnQpO1xuLVx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4tXHR9XG4tXG4gXHRyZXQgPSBteGw4NjJ4eF9jb25maWd1cmVfc3BfdGFnX3Byb3RvKGRzLCBwb3J0LCBpc19jcHVfcG9ydCk7XG4gXHRpZiAocmV0KVxuIFx0XHRyZXR1cm4gcmV0O1xuQEAgLTE1NzIsNiArMTY4NSwxMiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfbWRiX2RlbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LFxuIFx0ZXRoZXJfYWRkcl9jb3B5KHFwYXJhbS5tYWMsIG1kYi1cdTAwM2VhZGRyKTtcbiBcbiBcdHJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIE1YTDg2MlhYX01BQ19UQUJMRUVOVFJZUVVFUlksIHFwYXJhbSk7XG4rXHQvKiBQb3N0LWZsYXNoIHRlYXJkb3duIG9yIE1DVWJvb3Q6IHRoZSBmaXJtd2FyZSBhbmQgaXRzIE1BQyB0YWJsZSBhcmVcbitcdCAqIGdvbmUsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkZWxldGUuIE91dHNpZGUgdGhvc2UsIC1FTk9ERVYgaXMgYVxuK1x0ICogYnVzIGVycm9yIGFuZCBtdXN0IGJlIHJlcG9ydGVkLlxuK1x0ICovXG4rXHRpZiAocmV0ID09IC1FTk9ERVYgXHUwMDI2XHUwMDI2IChwcml2LVx1MDAzZXNraXBfdGVhcmRvd24gfHwgcHJpdi1cdTAwM2VyZXNjdWVfbW9kZSkpXG4rXHRcdHJldHVybiAwO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0xNjI4LDYgKzE3NDcsOSBAQCBzdGF0aWMgdm9pZCBteGw4NjJ4eF9wb3J0X3N0cF9zdGF0ZV9zZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCxcbiBcdHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID0gZHMtXHUwMDNlcHJpdjtcbiBcdGludCByZXQ7XG4gXG4rXHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSlcbitcdFx0cmV0dXJuO1xuK1xuIFx0c3dpdGNoIChzdGF0ZSkge1xuIFx0Y2FzZSBCUl9TVEFURV9ESVNBQkxFRDpcbiBcdFx0cGFyYW0ucG9ydF9zdGF0ZSA9IGNwdV90b19sZTMyKE1YTDg2MlhYX1NUUF9QT1JUX1NUQVRFX0RJU0FCTEUpO1xuQEAgLTIwMTUsNiArMjEzNywxMiBAQCBzdGF0aWMgdm9pZCBteGw4NjJ4eF9zdGF0c193b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiBcdHN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHByaXYtXHUwMDNlZHM7XG4gXHRzdHJ1Y3QgZHNhX3BvcnQgKmRwO1xuIFxuK1x0LyogQSBnZXRfc3RhdHM2NCgpIHJlLWFybSBjYW4gcmFjZSB0aGUgZmxhc2ggdGVhcmRvd24ncyBXT1JLX1NUT1BQRURcbitcdCAqIHNldCBhbmQgY2FuY2VsOyBiYWlsIGhlcmUgc28gYSBzdHJheSBwb2xsIG5ldmVyIHJ1bnMgZHVyaW5nIGEgZmxhc2guXG4rXHQgKi9cbitcdGlmICh0ZXN0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgXHUwMDI2cHJpdi1cdTAwM2VmbGFncykpXG4rXHRcdHJldHVybjtcbitcbiBcdGRzYV9zd2l0Y2hfZm9yX2VhY2hfYXZhaWxhYmxlX3BvcnQoZHAsIGRzKVxuIFx0XHRteGw4NjJ4eF9zdGF0c19wb2xsKGRzLCBkcC1cdTAwM2VpbmRleCk7XG4gXG5AQCAtMjA4Niw2ICsyMjE0LDggQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkc2Ffc3dpdGNoX29wcyBteGw4NjJ4eF9zd2l0Y2hfb3BzID0ge1xuIFx0LmdldF9wYXVzZV9zdGF0cyA9IG14bDg2Mnh4X2dldF9wYXVzZV9zdGF0cyxcbiBcdC5nZXRfcm1vbl9zdGF0cyA9IG14bDg2Mnh4X2dldF9ybW9uX3N0YXRzLFxuIFx0LmdldF9zdGF0czY0ID0gbXhsODYyeHhfZ2V0X3N0YXRzNjQsXG4rXHQuZGV2bGlua19pbmZvX2dldCA9IG14bDg2Mnh4X2RldmxpbmtfaW5mb19nZXQsXG4rXHQuZGV2bGlua19mbGFzaF91cGRhdGUgPSBteGw4NjJ4eF9kZXZsaW5rX2ZsYXNoX3VwZGF0ZSxcbiB9O1xuIFxuIHN0YXRpYyBpbnQgbXhsODYyeHhfcHJvYmUoc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2KVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmhcbmluZGV4IDQzMmE1ZjNmMmUwOGUuLjk5MWIyNGFhOTVhZmQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmhcbkBAIC00LDcgKzQsOSBAQFxuICNkZWZpbmUgX19NWEw4NjJYWF9IXG4gXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2J5dGVvcmRlci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0b3BzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tdXRleC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NuZXQvZHNhLmhcdTAwM2VcbiBcbkBAIC0xNCw2ICsxNiwxMCBAQCBzdHJ1Y3QgbXhsODYyeHhfcHJpdjtcbiAjZGVmaW5lIE1YTDg2MlhYX0ZJUlNUX1NFUkRFU19QT1JUXHQ5XG4gI2RlZmluZSBNWEw4NjJYWF9TRVJERVNfU0xPVFNcdFx0NFxuIFxuKy8qIG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdCgpIHJldHVybiBjb2RlcyAobmVnYXRpdmUgdmFsdWVzIGFyZSBlcnJvcnMpICovXG4rI2RlZmluZSBNWEw4NjJYWF9OT1RfUkVTQ1VFXHRcdDBcbisjZGVmaW5lIE1YTDg2MlhYX0lOX1JFU0NVRVx0XHQxXG4rXG4gI2RlZmluZSBNWEw4NjJYWF9ERUZBVUxUX0JSSURHRVx0XHQwXG4gI2RlZmluZSBNWEw4NjJYWF9NQVhfQlJJREdFU1x0XHQ0OFxuICNkZWZpbmUgTVhMODYyWFhfTUFYX0JSSURHRV9QT1JUU1x0MTI4XG5AQCAtMzAzLDYgKzMwOSwxMCBAQCBzdHJ1Y3QgbXhsODYyeHhfZndfdmVyc2lvbiB7XG4gICogICAgICAgICAgICAgICAgICAgICAgZmxvb2RpbmcpXG4gICogQGZ3X3ZlcnNpb246ICAgICAgICAgY2FjaGVkIGZpcm13YXJlIHZlcnNpb24sIHBvcHVsYXRlZCBhdCBwcm9iZSBhbmRcbiAgKiAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZCB3aXRoIE1YTDg2MlhYX0ZXX1ZFUl9NSU4oKVxuKyAqIEBhc2ljX2lkOiAgICAgICAgICAgIGNoaXAgcGFydCBudW1iZXIgcmVhZCBmcm9tIHRoZSBDSElQIElEIHJlZ2lzdGVycyxcbisgKiAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBhcyB0aGUgZGV2bGluayBcImFzaWMuaWRcIiBmaXhlZCB2ZXJzaW9uXG4rICogQGFzaWNfcmV2OiAgICAgICAgICAgY2hpcCB2ZXJzaW9uIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMsXG4rICogICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYXMgdGhlIGRldmxpbmsgXCJhc2ljLnJldlwiIGZpeGVkIHZlcnNpb25cbiAgKiBAc2VyZGVzX3BvcnRzOiAgICAgICBTZXJEZXMgaW50ZXJmYWNlcyBpbmNsLiBzdWItaW50ZXJmYWNlcyBpbiBjYXNlIG9mXG4gICogICAgICAgICAgICAgICAgICAgICAgMTBHX1FYR01JSSBvciBRU0dNSUlcbiAgKiBAc2VyZGVzX3JlZmNvdW50OiAgICBwZXItWFBDUyBjb3VudCBvZiBzdWItcG9ydHMgZW5hYmxlZCBieSBwaHlsaW5rO1xuQEAgLTMxOSw2ICszMjksMjAgQEAgc3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24ge1xuICAqIEBldmxhbl9pbmdyZXNzX3NpemU6IHBlci1wb3J0IGluZ3Jlc3MgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplXG4gICogQGV2bGFuX2VncmVzc19zaXplOiAgcGVyLXBvcnQgZWdyZXNzIEV4dGVuZGVkIFZMQU4gYmxvY2sgc2l6ZVxuICAqIEB2Zl9ibG9ja19zaXplOiAgICAgIHBlci1wb3J0IFZMQU4gRmlsdGVyIGJsb2NrIHNpemVcbisgKiBAYmxvY2tfaG9zdDogICAgICAgICByZWplY3QgZmlybXdhcmUgQVBJIGNvbW1hbmRzIChleGNlcHQgRldfVVBEQVRFKVxuKyAqICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyBhIGZpcm13YXJlIGZsYXNoXG4rICogQHNraXBfdGVhcmRvd246ICAgICAgZGlzY2FyZCBmaXJtd2FyZSBBUEkgY29tbWFuZHMgZHVyaW5nIHRoZSB0ZWFyZG93blxuKyAqICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZCBieSB0aGUgcG9zdC1mbGFzaCByZXByb2JlXG4rICogQHJlc2N1ZV9tb2RlOiAgICAgICAgc3dpdGNoIGlzIGluIE1DVWJvb3Q7IGZpcm13YXJlIEFQSSBjb21tYW5kcyBmYWlsIGZhc3QsXG4rICogICAgICAgICAgICAgICAgICAgICAgb25seSBjbGF1c2UtMjIgU01ESU8gd29ya3MuIFNldCBmcm9tIHNldHVwKCkgYmVmb3JlIHRoZVxuKyAqICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCBpcyByZWdpc3RlcmVkIGFuZCBjbGVhcmVkIHVuZGVyIHRoZSBNRElPIGJ1cyBsb2NrXG4rICogICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBiZW5lZml0IG9mIG14bDg2Mnh4X2FwaV93cmFwKCk7IG90aGVyIHJlYWRlcnNcbisgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IG5lZWQgaXQgdG8gYmUgYSBzdGFibGUgc2luZ2xlIGZsYWcuXG4rICogQHJlc2N1ZV9yZWFkeTogICAgICAgKHJlc2N1ZV9tb2RlKSBsb2FkZXIgaXMgYXQgYSBjbGVhbiBSRUFEWSBhbmQgd2lsbCBhY2NlcHRcbisgKiAgICAgICAgICAgICAgICAgICAgICBhIGZsYXNoOyBmYWxzZSB3aGlsZSByZXNjdWVfaGVhbF93b3JrIGlzIGRyYWluaW5nXG4rICogQHJlc2N1ZV9mYWlsZWQ6ICAgICAgKHJlc2N1ZV9tb2RlKSB0aGUgc2VsZi1oZWFsIGdhdmUgdXA7IHRoZSBsb2FkZXIgbmVlZHMgYVxuKyAqICAgICAgICAgICAgICAgICAgICAgIHBvd2VyIGN5Y2xlIGFuZCBubyBmbGFzaCBjYW4gYmUgYWNjZXB0ZWRcbisgKiBAcmVzY3VlX2hlYWxfd29yazogICBiYWNrZ3JvdW5kIHNlbGYtaGVhbCBkcmFpbmluZyBhIHdlZGdlZCBkb3dubG9hZCB0byBSRUFEWVxuICAqIEBzdGF0c193b3JrOiAgICAgICAgIHBlcmlvZGljIHdvcmsgaXRlbSB0aGF0IHBvbGxzIFJNT04gaGFyZHdhcmUgY291bnRlcnNcbiAgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgYWNjdW11bGF0ZXMgdGhlbSBpbnRvIDY0LWJpdCBwZXItcG9ydCBzdGF0c1xuICAqL1xuQEAgLTMyNiw5ICszNTAsMTIgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXYge1xuIFx0c3RydWN0IGRzYV9zd2l0Y2ggKmRzO1xuIFx0c3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2O1xuIFx0c3RydWN0IHdvcmtfc3RydWN0IGNyY19lcnJfd29yaztcbitcdHN0cnVjdCB3b3JrX3N0cnVjdCByZXNjdWVfaGVhbF93b3JrO1xuIFx0dW5zaWduZWQgbG9uZyBmbGFncztcbiBcdHUxNiBkcm9wX21ldGVyO1xuIFx0c3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24gZndfdmVyc2lvbjtcbitcdHUxNiBhc2ljX2lkO1xuK1x0dTggYXNpY19yZXY7XG4gXHRzdHJ1Y3QgbXhsODYyeHhfcGNzIHNlcmRlc19wb3J0c1s4XTtcbiBcdGludCBzZXJkZXNfcmVmY291bnRbMl07XG4gXHRzdHJ1Y3QgbXV0ZXggc2VyZGVzX2xvY2s7XG5AQCAtMzM3LDcgKzM2NCwxNCBAQCBzdHJ1Y3QgbXhsODYyeHhfcHJpdiB7XG4gXHR1MTYgZXZsYW5faW5ncmVzc19zaXplO1xuIFx0dTE2IGV2bGFuX2VncmVzc19zaXplO1xuIFx0dTE2IHZmX2Jsb2NrX3NpemU7XG4rXHRib29sIGJsb2NrX2hvc3Q7XG4rXHRib29sIHNraXBfdGVhcmRvd247XG4rXHRib29sIHJlc2N1ZV9tb2RlO1xuK1x0Ym9vbCByZXNjdWVfcmVhZHk7XG4rXHRib29sIHJlc2N1ZV9mYWlsZWQ7XG4gXHRzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXRzX3dvcms7XG4gfTtcbiBcbitpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpO1xuK1xuICNlbmRpZiAvKiBfX01YTDg2MlhYX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaFxuaW5kZXggYWVlNzlmZDZiMzJiNC4uN2E5OTE2OTUwNTc3MiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmhcbisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmhcbkBAIC0xMzE0LDYgKzEzMTQsOCBAQCBpbnQgIF9fbXVzdF9jaGVjayBkZXZpY2VfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldik7XG4gaW50IF9fbXVzdF9jaGVjayBkcml2ZXJfYXR0YWNoKGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpO1xuIHZvaWQgZGV2aWNlX2luaXRpYWxfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTtcbiBpbnQgX19tdXN0X2NoZWNrIGRldmljZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7XG4raW50IF9fbXVzdF9jaGVjayBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsXG4rXHRcdFx0XHRcdCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpO1xuIFxuIGJvb2wgZGV2aWNlX2lzX2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldik7XG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZHNhLmggYi9pbmNsdWRlL25ldC9kc2EuaFxuaW5kZXggNmY3ZjVjMTdiNTMyMC4uNTg1OTdiMTRlNTkyYSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbmV0L2RzYS5oXG4rKysgYi9pbmNsdWRlL25ldC9kc2EuaFxuQEAgLTExNzIsNiArMTE3Miw5IEBAIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyB7XG4gXHRpbnRcdCgqZGV2bGlua19pbmZvX2dldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuIFx0XHRcdFx0ICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsXG4gXHRcdFx0XHQgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKTtcbitcdGludFx0KCpkZXZsaW5rX2ZsYXNoX3VwZGF0ZSkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuK1x0XHRcdFx0XHRzdHJ1Y3QgZGV2bGlua19mbGFzaF91cGRhdGVfcGFyYW1zICpwYXJhbXMsXG4rXHRcdFx0XHRcdHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4gXHRpbnRcdCgqZGV2bGlua19zYl9wb29sX2dldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuIFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBzYl9pbmRleCwgdTE2IHBvb2xfaW5kZXgsXG4gXHRcdFx0XHQgICAgICAgc3RydWN0IGRldmxpbmtfc2JfcG9vbF9pbmZvICpwb29sX2luZm8pO1xuZGlmZiAtLWdpdCBhL25ldC9kc2EvZGV2bGluay5jIGIvbmV0L2RzYS9kZXZsaW5rLmNcbmluZGV4IGVkMzQyZjM0NTY5MmIuLjI1MzExYTg3Y2JjNTYgMTAwNjQ0XG4tLS0gYS9uZXQvZHNhL2RldmxpbmsuY1xuKysrIGIvbmV0L2RzYS9kZXZsaW5rLmNcbkBAIC0yMCw2ICsyMCwxOCBAQCBzdGF0aWMgaW50IGRzYV9kZXZsaW5rX2luZm9fZ2V0KHN0cnVjdCBkZXZsaW5rICpkbCxcbiBcdHJldHVybiAtRU9QTk9UU1VQUDtcbiB9XG4gXG4rc3RhdGljIGludCBkc2FfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRldmxpbmsgKmRsLFxuK1x0XHRcdFx0ICAgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcbitcdFx0XHRcdCAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4re1xuK1x0c3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZHNhX2RldmxpbmtfdG9fZHMoZGwpO1xuK1xuK1x0aWYgKCFkcy1cdTAwM2VvcHMtXHUwMDNlZGV2bGlua19mbGFzaF91cGRhdGUpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdHJldHVybiBkcy1cdTAwM2VvcHMtXHUwMDNlZGV2bGlua19mbGFzaF91cGRhdGUoZHMsIHBhcmFtcywgZXh0YWNrKTtcbit9XG4rXG4gc3RhdGljIGludCBkc2FfZGV2bGlua19zYl9wb29sX2dldChzdHJ1Y3QgZGV2bGluayAqZGwsXG4gXHRcdFx0XHQgICB1bnNpZ25lZCBpbnQgc2JfaW5kZXgsIHUxNiBwb29sX2luZGV4LFxuIFx0XHRcdFx0ICAgc3RydWN0IGRldmxpbmtfc2JfcG9vbF9pbmZvICpwb29sX2luZm8pXG5AQCAtMTY5LDYgKzE4MSw3IEBAIGRzYV9kZXZsaW5rX3NiX29jY190Y19wb3J0X2JpbmRfZ2V0KHN0cnVjdCBkZXZsaW5rX3BvcnQgKmRscCxcbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldmxpbmtfb3BzIGRzYV9kZXZsaW5rX29wcyA9IHtcbiBcdC5pbmZvX2dldFx0XHRcdD0gZHNhX2RldmxpbmtfaW5mb19nZXQsXG4rXHQuZmxhc2hfdXBkYXRlXHRcdFx0PSBkc2FfZGV2bGlua19mbGFzaF91cGRhdGUsXG4gXHQuc2JfcG9vbF9nZXRcdFx0XHQ9IGRzYV9kZXZsaW5rX3NiX3Bvb2xfZ2V0LFxuIFx0LnNiX3Bvb2xfc2V0XHRcdFx0PSBkc2FfZGV2bGlua19zYl9wb29sX3NldCxcbiBcdC5zYl9wb3J0X3Bvb2xfZ2V0XHRcdD0gZHNhX2Rldmxpbmtfc2JfcG9ydF9wb29sX2dldCxcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDA2OjUwOjQ0Ljk2MTI3MTAzM1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE0NTI5MzkyODc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgQW5hbHlzaXM6IGBteGw4NjJ4eGAgYW5kIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGludHJvZHVjZXMgZGV2bGluayBmbGFzaCB1cGRhdGUgc3VwcG9ydCB0byB0aGUgYG14bDg2Mnh4YCBEU0Egc3dpdGNoIGRyaXZlciBhbmQgYSBuZXcgZnVuY3Rpb24sIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAsIGluIGBkcml2ZXJzL2Jhc2UvZGQuY2AuIExldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHRoZSBgbXhsODYyeHhgIGRyaXZlci4gSXQncyBhIERTQSBzd2l0Y2ggZHJpdmVyLCBtZWFuaW5nIGl0IHR5cGljYWxseSByZXF1aXJlcyBwaHlzaWNhbCBoYXJkd2FyZSBvciBhIHZlcnkgc3BlY2lmaWMgZW11bGF0aW9uIHNldHVwLCB1c3VhbGx5IGludm9sdmluZyBNRElPLCBJMkMsIG9yIFNQSSBpbnRlcmZhY2VzLiBXZSBnZW5lcmFsbHkgZG9uJ3QgdGFyZ2V0IGhhcmR3YXJlLXNwZWNpZmljIERTQSBkcml2ZXJzIHVubGVzcyB0aGV5J3JlIHdpZGVseSBlbXVsYXRlZCwgd2hpY2ggaXNuJ3QgdHlwaWNhbGx5IHRoZSBjYXNlLiBUaGUgaW5zdHJ1Y3Rpb25zIGV4cGxpY2l0bHkgc2F5IHRvIGV4Y2x1ZGUgdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoIGRyaXZlcnMsIGJ1dCBgbXhsODYyeHhgIGlzIGFuIE1ESU8tYmFzZWQgc3dpdGNoLCBzbyB0aGF0IGV4Y2x1c2lvbiBkb2Vzbid0IGRpcmVjdGx5IGFwcGx5LlxuXG5Ob3csIHRoZSBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIGZ1bmN0aW9uIGluIGNvcmUga2VybmVsIGNvZGUgaW4gYGRyaXZlcnMvYmFzZS9kZC5jYC4gVGhpcyBpcyBwb3RlbnRpYWxseSBtb3JlIGludGVyZXN0aW5nIGJlY2F1c2UgaXQncyAqY29yZSoga2VybmVsIGxvZ2ljIGFuZCBpcyBleHBvcnRlZC4gTG9va2luZyBhdCB0aGUgY29kZSwgaXQgc2NoZWR1bGVzIGEgcmVwcm9iZSBvcGVyYXRpb24gZm9yIGEgZGV2aWNlLCBwcm92aWRlZCBpdCdzIHJlZ2lzdGVyZWQsIGhhcyBhIGJ1cywgYSBwYXJlbnQsIGFuZCBhIGRyaXZlci4gSXQgdXNlcyBkZWxheWVkIHdvcmssIGFuZCB0aGUgY29kZSBsb29rcyBjbGVhbi4gQ3J1Y2lhbGx5LCBpdCdzIG5vdyBhIG5ldyBjb3JlIEFQSSwgd2hpY2ggbWVhbnMgKmFueSogZHJpdmVyIGNvdWxkIHBvdGVudGlhbGx5IHVzZSBpdC4gSXQgaXMgYWxzbyBleHBvcnRlZCwgbWVhbmluZyBpdCAqY2FuKiBiZSBjYWxsZWQgYnkgb3RoZXIgZHJpdmVycy5cblxuSG93ZXZlciwgY3VycmVudGx5LCBvbmx5IGBteGw4NjJ4eGAgY2FsbHMgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYC4gQmVjYXVzZSBgbXhsODYyeHhgIGlzIGFuIE1ESU8gZHJpdmVyLCB3aGljaCBtZWFucyBpdCBsaWtlbHkgaXNuJ3QgZ29pbmcgdG8gYmUgZnV6emVkIHVubGVzcyB0aGVyZSBpcyBzcGVjaWZpYyBzZXR1cCBpbnN0cnVjdGlvbnMuICBTeXprYWxsZXIgbWlnaHQgbm90IGF1dG9tYXRpY2FsbHkgaW5zdGFudGlhdGUgdGhlc2UgTURJTyBkZXZpY2VzIHVubGVzcyB0aGVyZSdzIGEgc3BlY2lmaWMgc3l6bGFuZyBkZXNjcmlwdGlvbi5cblxuVGhlIG90aGVyIGNoYW5nZSBpcyBgZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlYCBpbiBgbmV0L2RzYS9kZXZsaW5rLmNgLiBUaGlzIGlzIHJlYWNoYWJsZSB2aWEgdGhlIGRldmxpbmsgbmV0bGluayBpbnRlcmZhY2UsICppZiogdGhlIERTQSBzd2l0Y2ggc3VwcG9ydHMgZGV2bGluayBmbGFzaCB1cGRhdGVzLiBDdXJyZW50bHksIG9ubHkgYG14bDg2Mnh4YCBpbXBsZW1lbnRzIHRoaXMuIEZvciBvdGhlciBEU0Egc3dpdGNoZXMsIGl0IHdpbGwgcmV0dXJuIGAtRU9QTk9UU1VQUGAuXG5cblNvLCB0aGUgcmVhbCBxdWVzdGlvbiBpcyB3aGV0aGVyIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgaXMgd29ydGggZnV6emluZy4gV2hpbGUgaXQgKmNvdWxkKiBiZSB1c2VkIGJ5IG1vcmUgZHJpdmVycyBpbiB0aGUgZnV0dXJlLCBpdHMgY3VycmVudCBzb2xlIGNhbGxlciBpcyBgbXhsODYyeHhgLiBTaW5jZSBgbXhsODYyeHhgIGlzIGFuIE1ESU8gZHJpdmVyLCB3aGljaCBhcmUgbm90IGNvbW1vbmx5IGZ1enplZCB3aXRob3V0IGRlZGljYXRlZCBzZXR1cCwgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCB3aWxsIGxpa2VseSBiZSB1bnJlYWNoYWJsZSBpbiBtb3N0IGZ1enppbmcgc2V0dXBzIHVubGVzcyB0aGlzIGRyaXZlciBpcyBzcGVjaWZpY2FsbHkgZW5hYmxlZC5cblxuTXkgbmV4dCBzdGVwIHdvdWxkIGJlIHRvIHBlcmZvcm0gYSBgZGVmYXVsdF9hcGk6Z3JlcHBlcmAgc2VhcmNoIHRvIGNoZWNrIGZvciBvdGhlciBjYWxsZXJzIG9mIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAsIGFsdGhvdWdoIEkgc3VzcGVjdCB0aGUgY3VycmVudCBjYWxsIGlzIHRoZSBvbmx5IG9uZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg2MTgsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzI3LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMDY6NTA6NTkuNDkwNjc5NDAyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5MjY0MjEwMDEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9iYXNlL2Jhc2UuaD04MD1zdHJ1Y3QgZHJpdmVyX3ByaXZhdGUge1xcbi0tXFxuZHJpdmVycy9iYXNlL2Jhc2UuaC0xMTEtICpcXHQgIGRldmljZSBsb2NrLiBBIGRlZmVycmVkIHJlLXByb2JlIHNjaGVkdWxlZCB3aXRoXFxuZHJpdmVycy9iYXNlL2Jhc2UuaDoxMTI6ICpcXHQgIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKCkgbXVzdCBub3QgZGV0YWNoIHRoZSBkZXZpY2UgYW55bW9yZS5cXG5kcml2ZXJzL2Jhc2UvYmFzZS5oLTExMy0gKlxcbi0tXFxuZHJpdmVycy9iYXNlL2RkLmM9MTQ0Nj1zdGF0aWMgdm9pZCBkZXZpY2VfcmVwcm9iZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4tLVxcbmRyaXZlcnMvYmFzZS9kZC5jLTE0NzMtLyoqXFxuZHJpdmVycy9iYXNlL2RkLmM6MTQ3NDogKiBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSAtIHNjaGVkdWxlIGEgZGVmZXJyZWQgZGV0YWNoIGFuZCByZS1wcm9iZVxcbmRyaXZlcnMvYmFzZS9kZC5jLTE0NzUtICogQGRldjogZGV2aWNlIHRvIGRldGFjaCBhbmQgcmUtcHJvYmVcXG4tLVxcbmRyaXZlcnMvYmFzZS9kZC5jLTE0OTgtICovXFxuZHJpdmVycy9iYXNlL2RkLmM6MTQ5OTppbnQgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpXFxuZHJpdmVycy9iYXNlL2RkLmMtMTUwMC17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvZGQuYy0xNTE5LX1cXG5kcml2ZXJzL2Jhc2UvZGQuYzoxNTIwOkVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9zY2hlZHVsZV9yZXByb2JlKTtcXG4tLVxcbmRyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jPTQyMT12b2lkIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbi0tXFxuZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMtNDUxLVxcbmRyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jOjQ1MjpcXHRpZiAoZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZGV2LCBNWEw4NjJYWF9GV19SRVBST0JFX0RFTEFZX01TKSlcXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYy00NTMtXFx0XFx0V1JJVEVfT05DRShwcml2LVxcdTAwM2VyZXNjdWVfZmFpbGVkLCB0cnVlKTtcXG4tLVxcbmRyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jPTkyMz1pbnQgbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxcbi0tXFxuZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMtMTA1MC1cXHQgKi9cXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYzoxMDUxOlxcdGVyciA9IGRldmljZV9zY2hlZHVsZV9yZXByb2JlKGRzLVxcdTAwM2VkZXYsIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVMpO1xcbmRyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jLTEwNTItXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2RldmljZS5oPTEzMTY9aW50IF9fbXVzdF9jaGVjayBkZXZpY2VfcmVwcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpO1xcbmluY2x1ZGUvbGludXgvZGV2aWNlLmg6MTMxNzppbnQgX19tdXN0X2NoZWNrIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldixcXG5pbmNsdWRlL2xpbnV4L2RldmljZS5oLTEzMTgtXFx0XFx0XFx0XFx0XFx0IHVuc2lnbmVkIGludCBkZWxheV9tcyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDA2OjUxOjAxLjQxNzEwNDYwM1oiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE4NTc4MTQ5MDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBzb21lIGNoYW5nZXMgcmVsYXRlZCB0byBmaXJtd2FyZSBmbGFzaGluZyBmb3IgYSBNYXhMaW5lYXIgTXhMODYyeHggRFNBIHN3aXRjaCwgYSBkZXZpY2UgZHJpdmVyIGZvciBhIGhhcmR3YXJlLXNwZWNpZmljIHN3aXRjaC4gVGhlIGtleSBxdWVzdGlvbiBpcyB3aGV0aGVyIGFueSBvZiB0aGlzIGlzIGZydWl0ZnVsbHkgZnV6emFibGUgd2l0aGluIGEgc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudCwgd2hpY2ggaXMgd2hhdCBTeXprYWxsZXIgcHJpbWFyaWx5IG9wZXJhdGVzIGluLlxuXG5GaXJzdCwgdGhlIG9ubHkgY2FsbCBzaXRlIGZvciB0aGlzIHBhdGNoIGlzIHRoZSBgbXhsODYyeHhgIGRyaXZlciwgd2hpY2ggaXMgYW4gTURJTyBkZXZpY2UgZHJpdmVyLiBTeXprYWxsZXIgZG9lc24ndCBoYXZlIGEgcmVsaWFibGUsIGdlbmVyaWMgbWVjaGFuaXNtIHRvIGluc3RhbnRpYXRlIE1ESU8gZGV2aWNlcy4gSXQgbmVlZHMgYSBzcGVjaWZpYyBpbnRlcmZhY2UgbGlrZSBgbWRpby1ncGlvYCBvciBzaW1pbGFyLCB3aGljaCB3b3VsZCByZXF1aXJlIHRhcmdldGVkIGRlc2NyaXB0aW9ucywgd2hpY2ggd2UgZG9uJ3QgaGF2ZS4gRXZlbiBpZiB3ZSBjb3VsZCBnZXQgdGhlIGRyaXZlciBsb2FkZWQsIGl0IHJlcXVpcmVzIHNwZWNpZmljIGhhcmR3YXJlLlxuXG5UaGUgcGF0Y2ggaW50cm9kdWNlcyBgZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlYCwgcmVhY2hhYmxlIHZpYSB0aGUgZGV2bGluayBuZXRsaW5rIGludGVyZmFjZS4gVGhlIHByb2JsZW0gaXMgdGhhdCBmdXp6aW5nIGBkc2FfZGV2bGlua19mbGFzaF91cGRhdGVgIHdvdWxkIGp1c3QgcmVzdWx0IGluIGEgYC1FT1BOT1RTVVBQYCBlcnJvciAqdW5sZXNzKiB3ZSBoYXZlIGEgRFNBIHN3aXRjaCB0aGF0IGltcGxlbWVudHMgdGhpcyBmdW5jdGlvbmFsaXR5LCBhbmQgY3VycmVudGx5LCAqb25seSogYG14bDg2Mnh4YCBkb2VzLiBTbywgdHJpZ2dlcmluZyB0aGlzIHRocm91Z2ggYSBnZW5lcmljIERTQSBzd2l0Y2ggaXMgYSBkZWFkIGVuZC4gVGhpcyBpcyBhIHZlcnkgc2ltcGxlIHdyYXBwZXI6XG5cbmBgYGNcbnN0YXRpYyBpbnQgZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlKHN0cnVjdCBkZXZsaW5rICpkbCxcblx0XHRcdFx0ICAgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcblx0XHRcdFx0ICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbntcblx0c3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZHNhX2RldmxpbmtfdG9fZHMoZGwpO1xuXG5cdGlmICghZHMtXHUwMDNlb3BzLVx1MDAzZWRldmxpbmtfZmxhc2hfdXBkYXRlKVxuXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcblxuXHRyZXR1cm4gZHMtXHUwMDNlb3BzLVx1MDAzZWRldmxpbmtfZmxhc2hfdXBkYXRlKGRzLCBwYXJhbXMsIGV4dGFjayk7XG59XG5gYGBcblxuVGhlIGNvcmUgbG9naWMgbGllcyBpbiBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIGFuZCB3aXRoaW4gYG14bDg2Mnh4YCBpdHNlbGYuIFNpbmNlIGBteGw4NjJ4eGAgaXMgZm9yIGEgc3BlY2lmaWMsIGhhcmR3YXJlIHN3aXRjaCwgaXQgaXMgbm90IGVtdWxhdGVkIGluIFFFTVUuIFRoaXMgc2VlbXMgdG8gdmlvbGF0ZSB0aGUgcnVsZSBvZiByZXF1aXJpbmcgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcy5cblxuVGhlIGNvZGUgaW5zdHJ1Y3Rpb25zIHNheSB0byBzZXQgV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBjaGFuZ2VzIGFyZSBmb3IgYSB2ZW5kb3Itc3BlY2lmaWMgZHJpdmVyIHRoYXQgcmVxdWlyZXMgc3BlY2lmaWMgUENJZSBoYXJkd2FyZSBub3QgZW11bGF0ZWQgYnkgUUVNVS4gVGhhdCBpcyB0aGlzIGNhc2UuIFRoZSBNRElPIGNvbW11bmljYXRpb24gaXMgdmVyeSBzcGVjaWZpYywgYW5kIHRoZSBwcm9iZSB3aWxsIGZhaWwgaWYgaXQgZG9lc24ndCBnZXQgdGhlIGNvcnJlY3QgcmVzcG9uc2VzIGZyb20gdGhlIGhhcmR3YXJlOlxuYGBgY1xuXHRhID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUik7XG5cdGQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBKTtcblx0aWYgKCh1MTYpYSAhPSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSB8fFxuXHQgICAgKHUxNilkICE9IE1YTDg2MlhYX1NCX1BESV9QUk9CRV9EKVxuXHRcdHJldHVybiAtRU5PREVWO1xuYGBgXG5cbldlIGNoZWNrZWQgaWYgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCBjb3VsZCBiZSBjYWxsZWQgZnJvbSBhbnl3aGVyZSBlbHNlLCBidXQgaXQncyBvbmx5IGNhbGxlZCBieSBgbXhsODYyeHhgLiBTbywgdGhlIGNvcmUgY2hhbmdlcyBhcmUsIGZ1bmN0aW9uYWxseSwgaW1wb3NzaWJsZSB0byB0cmlnZ2VyIHdpdGhvdXQgdGhlIGhhcmR3YXJlLCBvciBhcmUgdHJpdmlhbC5cblxuVGhlcmUgaXMgYSBtaW5vciBhZGRpdGlvbiB0byBgZHJpdmVycy9iYXNlL2NvcmUuY2AgdGhhdCBzZXRzIGBzaHV0ZG93bl9kb25lID0gdHJ1ZWAgd2l0aGluIGBkZXZpY2Vfc2h1dGRvd25gLiBUaGlzIGhhcHBlbnMgZHVyaW5nIHN5c3RlbSBzaHV0ZG93biwgdHJpZ2dlcmVkIGJ5IFN5emthbGxlcidzIHJlYm9vdCBzZXF1ZW5jZSwgYW5kIHRoaXMgYWN0aW9uIGlzIHRyaXZpYWwgYW5kIHVubGlrZWx5IHRvIGJlIHRoZSB0YXJnZXQgb2YgYSBmdXp6LlxuXG5UaHVzLCB0aGUgYWRkZWQgY29kZSBpcyB1bnJlYWNoYWJsZSBvciB0cml2aWFsLCBhbmQgdGhlIHJldHVybiBpcyBXb3J0aEZ1enppbmc9ZmFsc2UuXG5cblRoZSByZWFzb25pbmcgaXMgdGhhdCB0aGUgY2hhbmdlcyBhcmUgbGFyZ2VseSBjb25maW5lZCB0byBhIHZlbmRvci1zcGVjaWZpYyBkcml2ZXIgcmVxdWlyaW5nIGhhcmR3YXJlIG5vdCBlbXVsYXRlZCBieSBRRU1VLCB0aGUgbmV3IGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgQVBJIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGhpcyB1bnJlYWNoYWJsZSBkcml2ZXIsIGFuZCB0aGUgRFNBIGRldmxpbmsgY2hhbmdlcyBhcmUgdHJpdmlhbCB3cmFwcGVycy4gVGhlIGBkZXZpY2Vfc2h1dGRvd25gIGNoYW5nZSBzZXRzIGEgYm9vbGVhbiBpbiBhIHNodXRkb3duIHJvdXRpbmUuIEFsbCBvZiB0aGlzIGluZGljYXRlcyB0aGVyZSdzIG5vdGhpbmcgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGFuZCByZWFjaGFibGUgdGhhdCBpcyBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMTM1OCwiT3V0cHV0VG9rZW5zIjoxNzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTczLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDA2OjUxOjE5Ljk5NTI1NjQ1MloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTU0ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBmaXJtd2FyZSBmbGFzaCBzdXBwb3J0IGZvciB0aGUgTWF4TGluZWFyIE14TDg2Mnh4IERTQSBzd2l0Y2ggdmlhIGRldmxpbmssIGFsb25nIHdpdGggYSBuZXcgY29yZSBkcml2ZXIgbW9kZWwgZnVuY3Rpb24gYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYC4gVGhlIGBteGw4NjJ4eGAgZHJpdmVyIHJlcXVpcmVzIHBoeXNpY2FsIGhhcmR3YXJlIGNvbm5lY3RlZCB2aWEgTURJTyB0byBwcm9iZSBzdWNjZXNzZnVsbHkgYW5kIGlzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLiBUaGUgbmV3IGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgQVBJIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGhpcyB1bnJlYWNoYWJsZSBkcml2ZXIuIFRoZSBhZGRpdGlvbnMgdG8gdGhlIERTQSBkZXZsaW5rIGNvcmUgYXJlIHRyaXZpYWwgd3JhcHBlcnMgdGhhdCByZXR1cm4gYC1FT1BOT1RTVVBQYCBmb3IgYWxsIG90aGVyIHN3aXRjaGVzLiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBkZXZpY2Vfc2h1dGRvd25gIG1lcmVseSBzZXRzIGEgYm9vbGVhbiBmbGFnIGR1cmluZyBzeXN0ZW0gdGVhcmRvd24uIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50LCByZWFjaGFibGUgY29kZSB0byBmdXp6LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBmaXJtd2FyZSBmbGFzaCBzdXBwb3J0IGZvciB0aGUgTWF4TGluZWFyIE14TDg2Mnh4IERTQSBzd2l0Y2ggdmlhIGRldmxpbmssIGFsb25nIHdpdGggYSBuZXcgY29yZSBkcml2ZXIgbW9kZWwgZnVuY3Rpb24gYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYC4gVGhlIGBteGw4NjJ4eGAgZHJpdmVyIHJlcXVpcmVzIHBoeXNpY2FsIGhhcmR3YXJlIGNvbm5lY3RlZCB2aWEgTURJTyB0byBwcm9iZSBzdWNjZXNzZnVsbHkgYW5kIGlzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLiBUaGUgbmV3IGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgQVBJIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGhpcyB1bnJlYWNoYWJsZSBkcml2ZXIuIFRoZSBhZGRpdGlvbnMgdG8gdGhlIERTQSBkZXZsaW5rIGNvcmUgYXJlIHRyaXZpYWwgd3JhcHBlcnMgdGhhdCByZXR1cm4gYC1FT1BOT1RTVVBQYCBmb3IgYWxsIG90aGVyIHN3aXRjaGVzLiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBkZXZpY2Vfc2h1dGRvd25gIG1lcmVseSBzZXRzIGEgYm9vbGVhbiBmbGFnIGR1cmluZyBzeXN0ZW0gdGVhcmRvd24uIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50LCByZWFjaGFibGUgY29kZSB0byBmdXp6LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMDY6NTE6MTkuOTk1MzE3MDEyWiIsIlNlcSI6NywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM4MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowqzl57[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-15 06:49:10 +0000 UTC FinishedAt: 2026-08-15 06:51:21 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDA2OjUwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBmaXJtd2FyZSBmbGFzaCBzdXBwb3J0IGZvciB0aGUgTWF4TGluZWFyIE14TDg2Mnh4IERTQSBzd2l0Y2ggdmlhIGRldmxpbmssIGFsb25nIHdpdGggYSBuZXcgY29yZSBkcml2ZXIgbW9kZWwgZnVuY3Rpb24gYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYC4gVGhlIGBteGw4NjJ4eGAgZHJpdmVyIHJlcXVpcmVzIHBoeXNpY2FsIGhhcmR3YXJlIGNvbm5lY3RlZCB2aWEgTURJTyB0byBwcm9iZSBzdWNjZXNzZnVsbHkgYW5kIGlzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLiBUaGUgbmV3IGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgQVBJIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGhpcyB1bnJlYWNoYWJsZSBkcml2ZXIuIFRoZSBhZGRpdGlvbnMgdG8gdGhlIERTQSBkZXZsaW5rIGNvcmUgYXJlIHRyaXZpYWwgd3JhcHBlcnMgdGhhdCByZXR1cm4gYC1FT1BOT1RTVVBQYCBmb3IgYWxsIG90aGVyIHN3aXRjaGVzLiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBkZXZpY2Vfc2h1dGRvd25gIG1lcmVseSBzZXRzIGEgYm9vbGVhbiBmbGFnIGR1cmluZyBzeXN0ZW0gdGVhcmRvd24uIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50LCByZWFjaGFibGUgY29kZSB0byBmdXp6LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAwNjo1MDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDI5YjAxMTZlMDU1OWNjY2ExNDhhZTY5YTBhYWQ2Mjc0MjYxZTNiZDNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IEF1ZyAxNSAwNjo1MDo0MyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3RcbmluZGV4IDQ3NDUxNDhmZWNmNGYuLjA1ODk5OWQwZGM1NmYgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdFxuQEAgLTk0LDYgJiM0Mzs5NCw3IEBAIHBhcmFtZXRlcnMsIGluZm8gdmVyc2lvbnMsIGFuZCBvdGhlciBmZWF0dXJlcyBpdCBzdXBwb3J0cy5cbiAgICBtbHg1XG4gICAgbWx4c3dcbiAgICBtdjg4ZTZ4eHhcbiYjNDM7ICAgbXhsODYyeHhcbiAgICBuZXRkZXZzaW1cbiAgICBuZnBcbiAgICBvY3Rlb250eDJcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3QgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3Rcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi41YjI0ZDhjYjU3YmM5XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3RcbkBAIC0wLDAgJiM0MzsxLDc0IEBAXG4mIzQzOy4uIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzO1xuJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7bXhsODYyeHggZGV2bGluayBzdXBwb3J0XG4mIzQzOz09PT09PT09PT09PT09PT09PT09PT09PVxuJiM0MztcbiYjNDM7VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGRldmxpbmsgZmVhdHVyZXMgaW1wbGVtZW50ZWQgYnkgdGhlXG4mIzQzO2BgbXhsODYyeHhgYCBkZXZpY2UgZHJpdmVyLlxuJiM0MztcbiYjNDM7SW5mbyB2ZXJzaW9uc1xuJiM0Mzs9PT09PT09PT09PT09XG4mIzQzO1xuJiM0MztUaGUgYGBteGw4NjJ4eGBgIGRyaXZlciByZXBvcnRzIHRoZSBmb2xsb3dpbmcgdmVyc2lvbnNcbiYjNDM7XG4mIzQzOy4uIGxpc3QtdGFibGU6OiBkZXZsaW5rIGluZm8gdmVyc2lvbnMgaW1wbGVtZW50ZWRcbiYjNDM7ICAgOndpZHRoczogNSA1IDUgODVcbiYjNDM7XG4mIzQzOyAgICogLSBOYW1lXG4mIzQzOyAgICAgLSBUeXBlXG4mIzQzOyAgICAgLSBFeGFtcGxlXG4mIzQzOyAgICAgLSBEZXNjcmlwdGlvblxuJiM0MzsgICAqIC0gYGBhc2ljLmlkYGBcbiYjNDM7ICAgICAtIGZpeGVkXG4mIzQzOyAgICAgLSA4NjI4XG4mIzQzOyAgICAgLSBUaGUgY2hpcCBwYXJ0IG51bWJlciByZWFkIGZyb20gdGhlIENISVAgSUQgcmVnaXN0ZXJzLiBPbWl0dGVkXG4mIzQzOyAgICAgICB3aGVuIHRoZSBwYXJ0IG51bWJlciByZWFkcyBhcyB6ZXJvLCB3aGljaCBoYXBwZW5zIGZvciBhIHN3aXRjaFxuJiM0MzsgICAgICAgc2l0dGluZyBpbiBNQ1Vib290IHJlc2N1ZSBtb2RlICh0aGUgcmVnaXN0ZXJzIG5lZWQgYSBydW5uaW5nXG4mIzQzOyAgICAgICBmaXJtd2FyZSksIGZvciBhbiB1bmZ1c2VkIHBhcnQsIGFuZCBhZnRlciBhIGZhaWxlZCBmbGFzaC5cbiYjNDM7ICAgKiAtIGBgYXNpYy5yZXZgYFxuJiM0MzsgICAgIC0gZml4ZWRcbiYjNDM7ICAgICAtIDBcbiYjNDM7ICAgICAtIFRoZSBjaGlwIHZlcnNpb24gcmVhZCBmcm9tIHRoZSBzYW1lIHJlZ2lzdGVyIHdvcmQsIHNvIGl0IGlzXG4mIzQzOyAgICAgICBvbWl0dGVkIHdoZW5ldmVyIGBgYXNpYy5pZGBgIGlzLlxuJiM0MzsgICAqIC0gYGBmd2BgXG4mIzQzOyAgICAgLSBydW5uaW5nLCBzdG9yZWRcbiYjNDM7ICAgICAtIDEuMC43MFxuJiM0MzsgICAgIC0gVmVyc2lvbiBvZiB0aGUgZmlybXdhcmUgcnVubmluZyBvbiB0aGUgc3dpdGNoLCByZXBvcnRlZCBhcyBib3RoXG4mIzQzOyAgICAgICBydW5uaW5nIGFuZCBzdG9yZWQgc2luY2UgdGhlIHN3aXRjaCBib290cyBpdCBmcm9tIGl0cyBvd24gZmxhc2guXG4mIzQzOyAgICAgICBJdCBpcyBvbWl0dGVkIHdoaWxlIG5vIGZpcm13YXJlIHZlcnNpb24gaXMga25vd246IGFmdGVyIGEgZmFpbGVkXG4mIzQzOyAgICAgICBmbGFzaCwgYW5kIGluIE1DVWJvb3QgcmVzY3VlIG1vZGUgd2hpbGUgYW4gaW50ZXJydXB0ZWQgZG93bmxvYWRcbiYjNDM7ICAgICAgIGlzIHN0aWxsIGJlaW5nIHJlY292ZXJlZCBpbiB0aGUgYmFja2dyb3VuZC4gT25jZSB0aGUgbG9hZGVyIGlzXG4mIzQzOyAgICAgICByZWFkeSB0byBhY2NlcHQgYSBuZXcgaW1hZ2UgdGhlIHZlcnNpb24gYXBwZWFycyBhcyBcJiMzNDswLjAuMFwmIzM0OyxcbiYjNDM7ICAgICAgIHdoaWNoIG5vIHJlbGVhc2VkIGZpcm13YXJlIHJlcG9ydHMsIHNvIHZlcnNpb24tY29tcGFyaW5nIHRvb2xzXG4mIzQzOyAgICAgICBvZmZlciBhbnkgYXZhaWxhYmxlIHJlbGVhc2UgYXMgYW4gdXBncmFkZS4gVXNlIGBgZGV2bGluayBkZXZcbiYjNDM7ICAgICAgIGZsYXNoYGAgdG8gdGVsbCBhIHJlY292ZXJpbmcgc3dpdGNoIGZyb20gYSByZWFkeSBvbmUsIHNlZSBiZWxvdztcbiYjNDM7ICAgICAgIGEgbWlzc2luZyB2ZXJzaW9uIG9uIGl0cyBvd24gZG9lcyBub3Qgc2F5IHdoeS5cbiYjNDM7XG4mIzQzO0ZsYXNoIHVwZGF0ZVxuJiM0Mzs9PT09PT09PT09PT1cbiYjNDM7XG4mIzQzO1RoZSBgYG14bDg2Mnh4YGAgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgYGBkZXZsaW5rIGRldiBmbGFzaGBgLlxuJiM0MztUaGUgc2lnbmVkIGZpcm13YXJlIGltYWdlIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBzd2l0Y2ggb3ZlciB0aGUgc2FtZVxuJiM0MztNRElPIGJ1cyB3aGljaCBpcyBhbHNvIHVzZWQgdG8gbWFuYWdlIHRoZSBzd2l0Y2gsIHRoZW4gdmVyaWZpZWQgYW5kXG4mIzQzO2luc3RhbGxlZCBieSB0aGUgTUNVYm9vdCBib290bG9hZGVyIHJ1bm5pbmcgb24gdGhlIHN3aXRjaC4gQWxsIHBvcnRzXG4mIzQzO29mIHRoZSBzd2l0Y2ggYXJlIGNsb3NlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1cGRhdGUgYW5kIHRoZSBkcml2ZXJcbiYjNDM7cmVwcm9iZXMgdGhlIHN3aXRjaCBhZnRlciBpdCBoYXMgcmVib290ZWQgaW50byB0aGUgbmV3IGZpcm13YXJlLiBBXG4mIzQzO2NvbXBsZXRlIGZsYXNoIGFuZCByZXByb2JlIGN5Y2xlIHRha2VzIGFib3V0IG9uZSBtaW51dGUuXG4mIzQzO1xuJiM0MztBIHN3aXRjaCBzdHVjayBpbiBNQ1Vib290IHJlc2N1ZSBtb2RlLCBlLmcuIGFmdGVyIGFuIGludGVycnVwdGVkXG4mIzQzO3VwZGF0ZSwgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHVzZXIgcG9ydHMuIElmIHRoZSBwcmV2aW91cyBkb3dubG9hZCB3YXNcbiYjNDM7aW50ZXJydXB0ZWQgbWlkLXRyYW5zZmVyIHRoZSBsb2FkZXIgaXMgd2VkZ2VkOyB0aGUgZHJpdmVyIGRyYWlucyBpdFxuJiM0MztiYWNrIHRvIGEgY2xlYW4gcmVhZHkgc3RhdGUgaW4gdGhlIGJhY2tncm91bmQsIG9uZSBieXRlIGF0IGEgdGltZSxcbiYjNDM7d2hpY2ggdGFrZXMgdGVucyBvZiBtaW51dGVzIGZvciBhIGxhcmdlIGltYWdlIGFuZCBpcyByZXBvcnRlZCB0aHJvdWdoXG4mIzQzO3RoZSBrZXJuZWwgbG9nIGFzIGl0IHByb2dyZXNzZXMuIER1cmluZyB0aGF0IHJlY292ZXJ5IGBgZGV2bGluayBkZXZcbiYjNDM7Zmxhc2hgYCByZXR1cm5zIGBgLUVCVVNZYGAgd2l0aCBhbiBleHRhY2sgbWVzc2FnZSBzYXlpbmcgc28sIGFuZFxuJiM0MztgYGRldmxpbmsgZGV2IGluZm9gYCByZXBvcnRzIG5vIGZpcm13YXJlIHZlcnNpb24uIE9uY2UgdGhlIGxvYWRlciBpc1xuJiM0MztyZWFkeSB0aGUgZmlybXdhcmUgdmVyc2lvbiBhcHBlYXJzIGFuZCBmbGFzaGluZyBhIGZpcm13YXJlIGltYWdlXG4mIzQzO3Rocm91Z2ggdGhlIHJlZ3VsYXIgdXBkYXRlIGZsb3cgcmVjb3ZlcnMgdGhlIHN3aXRjaC5cbiYjNDM7XG4mIzQzO0lmIHRoZSByZWNvdmVyeSBmYWlscywgdGhlIGxvYWRlciBuZWVkcyBhIHBvd2VyIGN5Y2xlOiBgYGRldmxpbmsgZGV2XG4mIzQzO2ZsYXNoYGAgdGhlbiByZXR1cm5zIGBgLUVJT2BgIGFuZCBzYXlzIHNvIGluIGl0cyBleHRhY2sgbWVzc2FnZS4gVGhlXG4mIzQzO2RyaXZlciBvbmx5IHJlLWV4YW1pbmVzIHRoZSBzd2l0Y2ggd2hlbiBpdCBiaW5kcywgc28gb24gYSBib2FyZCB3aGVyZVxuJiM0Mzt0aGUgc3dpdGNoIGNhbiBiZSBwb3dlciBjeWNsZWQgb24gaXRzIG93biwgdW5iaW5kIGFuZCByZWJpbmQgdGhlIGRyaXZlclxuJiM0MzthZnRlcndhcmRzIHRvIGhhdmUgdGhlIHJlY292ZXJlZCBzd2l0Y2ggcmVjb2duaXNlZC5cbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCA5OTE0NjAwNTBkYTc0Li5lM2Y3ZGVkNTY5YmY3IDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTXG5AQCAtMTYxMDYsNiAmIzQzOzE2MTA2LDcgQEAgTTpcdERhbmllbCBHb2xsZSBcdTAwM2NkYW5pZWxAbWFrcm90b3BpYS5vcmdcdTAwM2VcbiBMOlx0bmV0ZGV2QHZnZXIua2VybmVsLm9yZ1xuIFM6XHRNYWludGFpbmVkXG4gRjpcdERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZHNhL21heGxpbmVhcixteGw4NjJ4eC55YW1sXG4mIzQzO0Y6XHREb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3RcbiBGOlx0ZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L1xuIEY6XHRuZXQvZHNhL3RhZ19teGw4NjJ4eC5jXG4gXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Jhc2UuaCBiL2RyaXZlcnMvYmFzZS9iYXNlLmhcbmluZGV4IGE1YjdhYmMxMGZmMDIuLjYyMzRlMzdkZTdlOTkgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Jhc2UvYmFzZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oXG5AQCAtMTA2LDYgJiM0MzsxMDYsMTAgQEAgc3RydWN0IGRyaXZlcl9wcml2YXRlIHtcbiAgKiBAZGVhZDogVGhpcyBkZXZpY2UgaXMgY3VycmVudGx5IGVpdGhlciBpbiB0aGUgcHJvY2VzcyBvZiBvciBoYXMgYmVlblxuICAqXHQgIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLiBBbnkgYXN5bmNocm9ub3VzIGV2ZW50cyBzY2hlZHVsZWQgZm9yIHRoaXNcbiAgKlx0ICBkZXZpY2Ugc2hvdWxkIGV4aXQgd2l0aG91dCB0YWtpbmcgYW55IGFjdGlvbi5cbiYjNDM7ICogQHNodXRkb3duX2RvbmU6IFNldCBvbmNlIGRldmljZV9zaHV0ZG93bigpIGhhcyByZWFjaGVkIHRoaXMgZGV2aWNlLCB1bmRlclxuJiM0MzsgKlx0ICB0aGUgZGV2aWNlIGxvY2ssIGJlZm9yZSBhbnkgc2h1dGRvd24gY2FsbGJhY2sgcnVucy4gUmVhZCB1bmRlciB0aGVcbiYjNDM7ICpcdCAgZGV2aWNlIGxvY2suIEEgZGVmZXJyZWQgcmUtcHJvYmUgc2NoZWR1bGVkIHdpdGhcbiYjNDM7ICpcdCAgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoKSBtdXN0IG5vdCBkZXRhY2ggdGhlIGRldmljZSBhbnltb3JlLlxuICAqXG4gICogTm90aGluZyBvdXRzaWRlIG9mIHRoZSBkcml2ZXIgY29yZSBzaG91bGQgZXZlciB0b3VjaCB0aGVzZSBmaWVsZHMuXG4gICovXG5AQCAtMTIwLDYgJiM0MzsxMjQsNyBAQCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUge1xuIFx0Y2hhciAqZGVmZXJyZWRfcHJvYmVfcmVhc29uO1xuIFx0c3RydWN0IGRldmljZSAqZGV2aWNlO1xuIFx0dTggZGVhZDoxO1xuJiM0MztcdHU4IHNodXRkb3duX2RvbmU6MTtcbiB9O1xuICNkZWZpbmUgdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG9iailcdFxcXG4gXHRjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUsIGtub2RlX3BhcmVudClcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuY1xuaW5kZXggNGQwMjY2ODI5NDRmMi4uOGE3ZGJlNGU4MzYyYiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvYmFzZS9jb3JlLmNcbkBAIC00OTA2LDYgJiM0Mzs0OTA2LDkgQEAgdm9pZCBkZXZpY2Vfc2h1dGRvd24odm9pZClcbiBcdFx0XHRkZXZpY2VfbG9jayhwYXJlbnQpO1xuIFx0XHRkZXZpY2VfbG9jayhkZXYpO1xuIFxuJiM0MztcdFx0aWYgKGRldi1cdTAwM2VwKVxuJiM0MztcdFx0XHRkZXYtXHUwMDNlcC1cdTAwM2VzaHV0ZG93bl9kb25lID0gdHJ1ZTtcbiYjNDM7XG4gXHRcdC8qIERvbiYjMzk7dCBhbGxvdyBhbnkgbW9yZSBydW50aW1lIHN1c3BlbmRzICovXG4gXHRcdHBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7XG4gXHRcdHBtX3J1bnRpbWVfYmFycmllcihkZXYpO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmNcbmluZGV4IDYwYzAwNTIyMzg0NGQuLmJiOGIzNGFjZGUwMGQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Jhc2UvZGQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9iYXNlL2RkLmNcbkBAIC0xNDM2LDMgJiM0MzsxNDM2LDg1IEBAIHZvaWQgZHJpdmVyX2RldGFjaChjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KVxuIFx0XHRwdXRfZGV2aWNlKGRldik7XG4gXHR9XG4gfVxuJiM0MztcbiYjNDM7c3RydWN0IGRldmljZV9yZXByb2JlIHtcbiYjNDM7XHRzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7XG4mIzQzO1x0c3RydWN0IGRldmljZSAqZGV2O1xuJiM0MztcdGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBkZXZpY2VfcmVwcm9iZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBkZXZpY2VfcmVwcm9iZSAqcnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRldmljZV9yZXByb2JlLFxuJiM0MztcdFx0XHRcdFx0XHQgd29yay53b3JrKTtcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBycC1cdTAwM2VkZXY7XG4mIzQzO1x0c3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LVx1MDAzZXBhcmVudDtcbiYjNDM7XHRib29sIGRldGFjaGVkID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdF9fZGV2aWNlX2RyaXZlcl9sb2NrKGRldiwgcGFyZW50KTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIHJwLVx1MDAzZWRydiBpcyBvbmx5IGV2ZXIgY29tcGFyZWQsIG5ldmVyIGRlcmVmZXJlbmNlZDogdGhlIGRyaXZlciBpdFxuJiM0MztcdCAqIHBvaW50cyB0byBtYXkgaGF2ZSBiZWVuIHVucmVnaXN0ZXJlZCBhbmQgZnJlZWQgYnkgbm93LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghZGV2LVx1MDAzZXAtXHUwMDNlZGVhZCBcdTAwMjZcdTAwMjYgIWRldi1cdTAwM2VwLVx1MDAzZXNodXRkb3duX2RvbmUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGRldi1cdTAwM2Vkcml2ZXIgXHUwMDI2XHUwMDI2IGRldi1cdTAwM2Vkcml2ZXIgPT0gcnAtXHUwMDNlZHJ2KSB7XG4mIzQzO1x0XHRfX2RldmljZV9yZWxlYXNlX2RyaXZlcihkZXYsIHBhcmVudCk7XG4mIzQzO1x0XHRkZXRhY2hlZCA9IHRydWU7XG4mIzQzO1x0fVxuJiM0MztcdF9fZGV2aWNlX2RyaXZlcl91bmxvY2soZGV2LCBwYXJlbnQpO1xuJiM0MztcbiYjNDM7XHRpZiAoZGV0YWNoZWQgXHUwMDI2XHUwMDI2IGRldmljZV9hdHRhY2goZGV2KSBcdTAwM2MgMClcbiYjNDM7XHRcdGRldl9lcnIoZGV2LCBcJiMzNDtyZS1wcm9iZSBmYWlsZWQsIGRldmljZSBsZWZ0IHVuYm91bmRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRwdXRfZGV2aWNlKGRldik7XG4mIzQzO1x0a2ZyZWUocnApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUgLSBzY2hlZHVsZSBhIGRlZmVycmVkIGRldGFjaCBhbmQgcmUtcHJvYmVcbiYjNDM7ICogQGRldjogZGV2aWNlIHRvIGRldGFjaCBhbmQgcmUtcHJvYmVcbiYjNDM7ICogQGRlbGF5X21zOiBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSByZS1wcm9iZSBydW5zXG4mIzQzOyAqXG4mIzQzOyAqIFNjaGVkdWxlIGEgZGV0YWNoIGFuZCByZS1wcm9iZSBvZiBAZGV2IGFmdGVyIEBkZWxheV9tcyBtaWxsaXNlY29uZHMuXG4mIzQzOyAqIFRoZSByZS1wcm9iZSBpcyBza2lwcGVkIGlmLCBieSB0aGUgdGltZSB0aGUgc2NoZWR1bGVkIHdvcmsgcnVucywgdGhlXG4mIzQzOyAqIGRldmljZSBoYXMgYmVlbiByZW1vdmVkLCB0aGUgc3lzdGVtIHNodXRkb3duIHNlcXVlbmNlIGhhcyByZWFjaGVkIHRoZVxuJiM0MzsgKiBkZXZpY2UsIG9yIEBkZXYgaXMgbm8gbG9uZ2VyIGJvdW5kIHRvIHRoZSBkcml2ZXIgdGhhdCB3YXMgYm91bmQgYXRcbiYjNDM7ICogc2NoZWR1bGluZyB0aW1lLiBJbiBwYXJ0aWN1bGFyIGFuIGFkbWluaXN0cmF0aXZlIHVuYmluZCBpcyBuZXZlclxuJiM0MzsgKiB1bmRvbmUgYnkgYSBzdGFsZSByZS1wcm9iZS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHdvcmsgZnVuY3Rpb24gaXMgYnVpbHQtaW4gdGV4dCwgc28gdGhlIGJvdW5kIGRyaXZlciBtYXkgY2FsbCB0aGlzXG4mIzQzOyAqIGZyb20gaXRzIG93biBjb2RlIHdpdGhvdXQgaG9sZGluZyBhIG1vZHVsZSByZWZlcmVuY2UuIElmIHRoZSBkcml2ZXJcbiYjNDM7ICogbW9kdWxlIGlzIHVubG9hZGVkIGJlZm9yZSB0aGUgd29yayBydW5zLCBkcml2ZXIgdW5yZWdpc3RyYXRpb24gdW5iaW5kc1xuJiM0MzsgKiBAZGV2IGZpcnN0IGFuZCB0aGUgc2NoZWR1bGVkIHdvcmsgZG9lcyBub3RoaW5nLlxuJiM0MzsgKlxuJiM0MzsgKiBNdWx0aXBsZSBwZW5kaW5nIHJlLXByb2JlcyBmb3IgdGhlIHNhbWUgZGV2aWNlIGFyZSBpbmRpdmlkdWFsbHkgc2FmZTtcbiYjNDM7ICogYSBjYWxsZXIgdGhhdCB3YW50cyBhdCBtb3N0IG9uZSBwZW5kaW5nIHJlLXByb2JlIG11c3QgZ2F0ZSBzY2hlZHVsaW5nXG4mIzQzOyAqIGl0c2VsZi5cbiYjNDM7ICpcbiYjNDM7ICogTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgQGRldiBpcyBub3QgYSByZWdpc3RlcmVkIGRldmljZVxuJiM0MzsgKiBib3VuZCB0byBhIGRyaXZlciwgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXG4mIzQzOyAqL1xuJiM0MztpbnQgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlX3JlcHJvYmUgKnJwO1xuJiM0MztcbiYjNDM7XHRpZiAoIWRldi1cdTAwM2VidXMgfHwgIWRldi1cdTAwM2VwIHx8ICFkZXZpY2VfaXNfcmVnaXN0ZXJlZChkZXYpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0aWYgKCFkZXYtXHUwMDNlZHJpdmVyKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdHJwID0ga3phbGxvY19vYmooKnJwKTtcbiYjNDM7XHRpZiAoIXJwKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHJwLVx1MDAzZWRldiA9IGdldF9kZXZpY2UoZGV2KTtcbiYjNDM7XHRycC1cdTAwM2VkcnYgPSBSRUFEX09OQ0UoZGV2LVx1MDAzZWRyaXZlcik7XG4mIzQzO1x0SU5JVF9ERUxBWUVEX1dPUksoXHUwMDI2cnAtXHUwMDNld29yaywgZGV2aWNlX3JlcHJvYmVfd29ya19mbik7XG4mIzQzO1x0cXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9kZmxfd3EsIFx1MDAyNnJwLVx1MDAzZXdvcmssXG4mIzQzO1x0XHRcdCAgIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXlfbXMpKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUpO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZVxuaW5kZXggYTdiZTBlNjY2OWRmYS4uYmNjYWMwZDBmNzAzZiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L01ha2VmaWxlXG5AQCAtMSwzICYjNDM7MSwzIEBAXG4gIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIG9iai0kKENPTkZJR19ORVRfRFNBX01YTDg2MikgJiM0Mzs9IG14bDg2Mnh4X2RzYS5vXG4tbXhsODYyeHhfZHNhLXkgOj0gbXhsODYyeHgubyBteGw4NjJ4eC1ob3N0Lm8gbXhsODYyeHgtcGh5bGluay5vXG4mIzQzO214bDg2Mnh4X2RzYS15IDo9IG14bDg2Mnh4Lm8gbXhsODYyeHgtaG9zdC5vIG14bDg2Mnh4LXBoeWxpbmsubyBteGw4NjJ4eC1mdy5vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oXG5pbmRleCBhMTgwYTVkZWNmZmMwLi42Zjc3MTg5NTk4NGNiIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtYXBpLmhcbkBAIC0xMjI0LDYgJiM0MzsxMjI0LDE2IEBAIHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB7XG4gXHRfX2xlMzIgaXZfYnVpbGRfbnVtO1xuIH0gX19wYWNrZWQ7XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBzdHJ1Y3QgbXhsODYyeHhfc3lzX3JlZ19ydyAtIFN5c3RlbSByZWdpc3RlciByZWFkL3dyaXRlXG4mIzQzOyAqIEBhZGRyOiAzMi1iaXQgcmVnaXN0ZXIgYWRkcmVzc1xuJiM0MzsgKiBAdmFsOiByZWdpc3RlciB2YWx1ZVxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IG14bDg2Mnh4X3N5c19yZWdfcncge1xuJiM0MztcdF9fbGUzMiBhZGRyO1xuJiM0MztcdF9fbGUzMiB2YWw7XG4mIzQzO30gX19wYWNrZWQ7XG4mIzQzO1xuIC8qKlxuICAqIGVudW0gbXhsODYyeHhfcG9ydF90eXBlIC0gUG9ydCBUeXBlXG4gICogQE1YTDg2MlhYX0xPR0lDQUxfUE9SVDogTG9naWNhbCBQb3J0XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oXG5pbmRleCBjODdhOTU1YzEzYzQ4Li5hODY1NDI1YWE2MWUxIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtY21kLmhcbkBAIC03MCw3ICYjNDM7NzAsOSBAQFxuICNkZWZpbmUgSU5UX0dQSFlfUkVBRFx0XHRcdChHUFlfR1BZMlhYX01BR0lDICYjNDM7IDB4MSlcbiAjZGVmaW5lIElOVF9HUEhZX1dSSVRFXHRcdFx0KEdQWV9HUFkyWFhfTUFHSUMgJiM0MzsgMHgyKVxuIFxuJiM0MzsjZGVmaW5lIFNZU19NSVNDX0ZXX1VQREFURVx0XHQoU1lTX01JU0NfTUFHSUMgJiM0MzsgMHgxKVxuICNkZWZpbmUgU1lTX01JU0NfRldfVkVSU0lPTlx0XHQoU1lTX01JU0NfTUFHSUMgJiM0MzsgMHgyKVxuJiM0MzsjZGVmaW5lIFNZU19NSVNDX1JFR19SRFx0XHRcdChTWVNfTUlTQ19NQUdJQyAmIzQzOyAweDgpXG4gXG4gI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19DT05GSUdcdChNWEw4NjJYWF9YUENTX01BR0lDICYjNDM7IDB4MSlcbiAjZGVmaW5lIE1YTDg2MlhYX1hQQ1NfUENTX0dFVF9TVEFURVx0KE1YTDg2MlhYX1hQQ1NfTUFHSUMgJiM0MzsgMHgyKVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iNmUwMzdkOTU2NDBiXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuY1xuQEAgLTAsMCAmIzQzOzEsMTA1NCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxuJiM0MzsvKlxuJiM0MzsgKiBGaXJtd2FyZSBmbGFzaCBhbmQgZGV2bGluayBzdXBwb3J0IGZvciBNYXhMaW5lYXIgTXhMODYyeHhcbiYjNDM7ICpcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI1IERhbmllbCBHb2xsZSBcdTAwM2NkYW5pZWxAbWFrcm90b3BpYS5vcmdcdTAwM2VcbiYjNDM7ICpcbiYjNDM7ICogU0IgUERJIC0gZmlybXdhcmUgZG93bmxvYWQgaW50ZXJmYWNlIG92ZXIgY2xhdXNlLTIyIFNNRElPXG4mIzQzOyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgTXhMODYyeHggTUNVYm9vdCBsb2FkZXIgYWNjZXB0cyBhIGZpcm13YXJlIGltYWdlIHRocm91Z2ggZm91ciBcJiMzNDtTQiBQRElcJiMzNDtcbiYjNDM7ICogcmVnaXN0ZXJzIGluIHRoZSBzd2l0Y2ggU01ESU8gcmVnaXN0ZXIgc3BhY2UuIEl0IHJ1bnMgd2hlbmV2ZXIgbm8gV1NQXG4mIzQzOyAqIGZpcm13YXJlIGlzIGFjdGl2ZTogdGhlIG5vcm1hbCBmaXJtd2FyZSB1cGRhdGUgZW50ZXJzIGl0IGRlbGliZXJhdGVseSAtIHRoZVxuJiM0MzsgKiBTWVNfTUlTQ19GV19VUERBVEUgQVBJIGNvbW1hbmQgc2V0cyBhIHN0aWNreSByZXNjdWUgYml0IGFuZCByZWJvb3RzIGludG9cbiYjNDM7ICogTUNVYm9vdCAtIGFuZCB0aGUgbG9hZGVyIGFsc28gc3RheXMgaGVyZSB3aGVuIHRoZSBzdG9yZWQgV1NQIGZpcm13YXJlIGZhaWxzXG4mIzQzOyAqIGl0cyBib290LXRpbWUgaW50ZWdyaXR5IGNoZWNrLiBUaGlzIGRyaXZlciBkcml2ZXMgdGhlIGxvYWRlciYjMzk7cyAweGM1NWNcbiYjNDM7ICogXCYjMzQ7Y29uc29sZVwmIzM0OyBkb3dubG9hZCBwYXRoLlxuJiM0MzsgKlxuJiM0MzsgKiBTTURJTyByZWdpc3RlciBhY2Nlc3MgKG14bDg2Mnh4X3NtZGlvX3JlYWQvd3JpdGUpOlxuJiM0MzsgKiAgIE1JSSByZWcgMHgxZiA6PSAoXHUwMDNjc2JfcGRpX3JlZ1x1MDAzZSBcdTAwMjYgMHhmZmYwKSAgIDsgcGFnZSBsYXRjaFxuJiM0MzsgKiAgIE1JSSByZWcgKFx1MDAzY3NiX3BkaV9yZWdcdTAwM2UgXHUwMDI2IDB4MDAwZikgOj0gLyA9XHUwMDNlIFx1MDAzY3UxNiBkYXRhXHUwMDNlXG4mIzQzOyAqIHNvIENUUkwvQUREUi9EQVRBL1NUQVQgKDB4ZTEwMC4uMHhlMTAzKSBhcmUgTUlJIHJlZ3MgMC8xLzIvMyBvZiBwYWdlXG4mIzQzOyAqIDB4ZTEwMCwgbm90IGFsbCByZWcgMHgwMC5cbiYjNDM7ICpcbiYjNDM7ICogU0IgUERJIHJlZ2lzdGVycyAoaG9zdCBuYW1lL2FkZHIgIC1cdTAwM2UgIE1DVSBtYWlsYm94KTpcbiYjNDM7ICogICBDVFJMIDB4ZTEwMCAtXHUwMDNlIDB4YzA5Mzg0MDAgICBtb2RlOiBSU1Q9MHgwMCAgUkQ9MHgwMSAgV1I9MHgwMlxuJiM0MzsgKiAgIEFERFIgMHhlMTAxIC1cdTAwM2UgMHhjMDkzODQwNCAgIFNCIHRhcmdldCB3b3JkIGFkZHJlc3MgKFNCMSBiYW5rID0gMHg3ODAwKVxuJiM0MzsgKiAgIERBVEEgMHhlMTAyIC1cdTAwM2UgMHhjMDkzODQwOCAgIDE2LWJpdCBkYXRhIC8gcmVwbHkgd29yZFxuJiM0MzsgKiAgIFNUQVQgMHhlMTAzIC1cdTAwM2UgMHhjMDkzODQwYyAgIGhhbmRzaGFrZTogYSBtYWdpYyAoYmVsb3cpIG9yIGEgYnl0ZSBjb3VudFxuJiM0MzsgKlxuJiM0MzsgKiBTVEFUIG1hZ2ljczpcbiYjNDM7ICogICBSRUFEWSAgMHhjNTVjICAgbG9hZGVyIGlkbGUgaW4gdGhlIGNvbnNvbGUgbG9vcCAgICAgICAgKHRoaXMgZHJpdmVyKVxuJiM0MzsgKiAgIERMX1JEWSAweGMzM2MgICBsb2FkZXIgaWRsZSBpbiB0aGUgZmxhc2hsZXNzIGxvb3BcbiYjNDM7ICogICBTVEFSVCAgMHhmNDhmICAgaG9zdCAgIC1cdTAwM2UgYmVnaW4gZG93bmxvYWQgc2Vzc2lvblxuJiM0MzsgKiAgIEFDSyAgICAweGY0OTAgICBsb2FkZXIgLVx1MDAzZSBTVEFSVCBhY2tub3dsZWRnZWQgKFNUQVJUICYjNDM7IDEpXG4mIzQzOyAqICAgRU5EICAgIDB4M2NjMyAgIGhvc3QgICAtXHUwMDNlIGZpbmFsaXNlIG5vdyAob3B0aW9uYWwsIHNlZSBiZWxvdylcbiYjNDM7ICogICBSRFJFRyAgMHhlMmMwICAgaG9zdCAgIC1cdTAwM2UgcmVnaXN0ZXItcmVhZCBjb21tYW5kICh8IGluZGV4KSwgc2VlIGJlbG93XG4mIzQzOyAqXG4mIzQzOyAqIENvbnNvbGUgZmxhc2ggcGF0aCAoU1RBVD0weGM1NWMpIC0gbXhsODYyeHhfZmxhc2hfZmlybXdhcmUoKTpcbiYjNDM7ICpcbiYjNDM7ICogICBob3N0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXJcbiYjNDM7ICogICAtLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS1cbiYjNDM7ICogICByZXNldCAoQ1RSTD1BRERSPURBVEE9MClcbiYjNDM7ICogICByZWFkIFNUQVQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAweGM1NWMgICAoUkVBRFksIGlkbGUpXG4mIzQzOyAqICAgU1RBVCA6PSBTVEFSVCgweGY0OGYpICAtLS0tLS0tLS0tLS0tLVx1MDAzZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXHUwMDNjLS0tLS0tLS0tLS0tLS0gU1RBVCA9IDB4ZjQ5MCAoQUNLKVxuJiM0MzsgKiAgIENUUkwgOj0gV1JcbiYjNDM7ICogICBEQVRBIDo9IGhkclswLi45XSAgKDIwLWJ5dGUgaGVhZGVyOiB0eXBlLHNpemUxLGNyYzEsc2l6ZTIsY3JjMilcbiYjNDM7ICogICByZXNldDsgU1RBVCA6PSAyMCAoaGVhZGVyIGxlbikgIC0tLS0tXHUwMDNlIHBhcnNlIGhkcjsgcl9yZW1haW49c2l6ZTEmIzQzO3NpemUyO1xuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSQVNFIHRhcmdldCByZWdpb24ocylcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzYy0tLS0tLS0tLS0tLS0tIFNUQVQ9MjEgKGxlbiYjNDM7MSksIHRoZW4gU1RBVD0wXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVyYXNlZClcbiYjNDM7ICogICAtLSBwYXlsb2FkLCBzdHJlYW1lZCBpbiBzbGljZXM6IC0tXG4mIzQzOyAqICAgQ1RSTCA6PSBXUlxuJiM0MzsgKiAgIERBVEEgOj0gd29yZCB4IE4gLi4uXG4mIzQzOyAqICAgICBhdCB3b3JkIDE2Mzg0OiBDVFJMOj1SU1Q7IEFERFI6PTB4NzgwMDsgQ1RSTDo9V1IgIChoYWxmLWJhbmsgLVx1MDAzZSBTQjEpXG4mIzQzOyAqICAgICBhdCB3b3JkIDMyNzYwOiBmbHVzaCBzbGljZTpcbiYjNDM7ICogICAgICAgIHJlc2V0OyBTVEFUIDo9IFx1MDAzY2J5dGVzX3RoaXNfc2xpY2VcdTAwM2UgLS0tXHUwMDNlIHJfcmVtYWluIC09IGJ5dGVzOyBwcm9ncmFtXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBcdTAwM2MtLS0tLS0tLS0tLS0tLS0tLS0tIFNUQVQ9MCAgKHJlYWR5IGZvciBuZXh0IHNsaWNlKVxuJiM0MzsgKiAgIC4uLiByZXBlYXQgdW50aWwgdGhlIHdob2xlIHBheWxvYWQgaXMgc2VudCAuLi5cbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzYy0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBVD0wICBpbWFnZSB2ZXJpZmllZFxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNUQVQ9MTogaW1hZ2UgcmVqZWN0ZWQpXG4mIzQzOyAqICAgU1RBVCA6PSBFTkQoMHgzY2MzKSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHUwMDNlIGZpbmFsaXNlIGFuZCBib290XG4mIzQzOyAqXG4mIzQzOyAqIFRoZSByX3JlbWFpbiA9PSAwIHJ1bGUgKGNyaXRpY2FsKTpcbiYjNDM7ICogICBFdmVyeSBob3N0IFNUQVQgd3JpdGUgaW4gdGhlIHBheWxvYWQgcGhhc2UgaXMgYSBieXRlIGNvdW50OyB0aGUgbG9hZGVyXG4mIzQzOyAqICAgZG9lcyByX3JlbWFpbiAtPSBjb3VudCBhbmQgc3RheXMgaW4gdGhlIHJlY2VpdmUgbG9vcCB3aGlsZSByX3JlbWFpbiAhPSAwLlxuJiM0MzsgKiAgIEl0IGxlYXZlcyB0aGUgbG9vcCBPTkxZIHdoZW4gcl9yZW1haW4gaGl0cyBFWEFDVExZIDAsIGFuZCBhIGNvdW50IGxhcmdlclxuJiM0MzsgKiAgIHRoYW4gcl9yZW1haW4gdW5kZXJmbG93cyB0aGUgMzItYml0IGNvdW50ZXIgYW5kIHdlZGdlcyB0aGUgbG9hZGVyIHVudGlsIGFcbiYjNDM7ICogICBwb3dlciBjeWNsZS4gSGF2aW5nIGxlZnQgaXQsIHRoZSBsb2FkZXIgdmVyaWZpZXMgdGhlIGltYWdlLCBwdWJsaXNoZXMgdGhlXG4mIzQzOyAqICAgdmVyZGljdCBpbiBTVEFUICgwIGdvb2QsIDEgcmVqZWN0ZWQpIGFuZCB3YWl0cyAyIHMgZm9yIEVORCBiZWZvcmVcbiYjNDM7ICogICBmaW5hbGlzaW5nIHJlZ2FyZGxlc3MgLS0gY2xlYXJpbmcgaXRzIHJlc2N1ZS1lbmFibGUgYml0IHNvIGJvb3RfZ28gYm9vdHNcbiYjNDM7ICogICB0aGUgbmV3IGltYWdlIC0tIHNvIEVORCBvbmx5IHNhdmVzIHRoYXQgd2FpdC4gSGVuY2U6XG4mIzQzOyAqICAgICAtIG5ldmVyIHNlbmQgYSBzbGljZS9jaHVuayBjb3VudCBsYXJnZXIgdGhhbiB3aGF0IGlzIG91dHN0YW5kaW5nO1xuJiM0MzsgKiAgICAgLSBhIFNUQVQgd3JpdGUgaXMgYSBjb21tYW5kIG9ubHkgb25jZSB0aGUgbG9hZGVyIGhhcyBsZWZ0IHRoZSBsb29wO1xuJiM0MzsgKiAgICAgLSB0aGUgbG9hZGVyIGxlYXZlcyB0aGUgY291bnQgaW4gU1RBVCB3aGlsZSBpdCBwcm9ncmFtcyB0aGUgY2h1bmssIHNvXG4mIzQzOyAqICAgICAgIGEgbGluZ2VyaW5nIGNvdW50IGRvZXMgbm90IGRpc3Rpbmd1aXNoIFwmIzM0O2J1c3lcJiMzNDsgZnJvbSBcJiMzNDt2ZXJkaWN0XCYjMzQ7O1xuJiM0MzsgKiAgICAgLSBpbnRlcnJ1cHRlZC1kb3dubG9hZCByZWNvdmVyeSBmZWVkcyAxIGJ5dGUgYXQgYSB0aW1lIChzZWUgYmVsb3cpLlxuJiM0MzsgKlxuJiM0MzsgKiBJbnRlcnJ1cHRlZC1mbGFzaCByZWNvdmVyeSAobXhsODYyeHhfcmVzY3VlX2RyYWluKTpcbiYjNDM7ICogICBBIGhvc3QgdGhhdCBkaWVzIG1pZC1wYXlsb2FkIGxlYXZlcyB0aGUgbG9hZGVyIGluIHRoZSByZWNlaXZlIGxvb3AgaG9sZGluZ1xuJiM0MzsgKiAgIFNUQVQ9MC4gRmVlZCBzaW5nbGUgMS1ieXRlIGNodW5rcyAob25lIERBVEEgd29yZCAmIzQzOyBTVEFUPTEpIHVudGlsIHJfcmVtYWluXG4mIzQzOyAqICAgcmVhY2hlcyAwOyB0aGUgbG9hZGVyIHRoZW4gdmVyaWZpZXMgdGhlIChub3cgY29ycnVwdCkgaW1hZ2UsIHB1Ymxpc2hlcyBpdHNcbiYjNDM7ICogICB2ZXJkaWN0IGFuZCBjb21lcyBiYWNrIHRvIFJFQURZIGJ5IGl0c2VsZi4gRU5EIGlzIG5ldmVyIHNlbnQgaGVyZTogd2hpbGVcbiYjNDM7ICogICByX3JlbWFpbiBpcyBub24temVybyBpdCB3b3VsZCBiZSBjb25zdW1lZCBhcyBhIDE1NTU1LWJ5dGUgY291bnQsIGFuZCBhXG4mIzQzOyAqICAgbGluZ2VyaW5nIFNUQVQ9MSBjYW5ub3QgYmUgdG9sZCBmcm9tIGEgY2h1bmsgc3RpbGwgYmVpbmcgcHJvZ3JhbW1lZC5cbiYjNDM7ICpcbiYjNDM7ICogUmVnaXN0ZXItcmVhZCBjaGFsbGVuZ2UgKG5vbi1kZXN0cnVjdGl2ZSBsaXZlbmVzcyBwcm9vZik6XG4mIzQzOyAqICAgREFUQSA6PSAweDdjMjMgKG1hcmtlcik7IFNUQVQgOj0gMHhlMmMwfGlkeFxuJiM0MzsgKiAgICAgLVx1MDAzZSBsb2FkZXIgcmV0dXJucyBhIHJ1bnRpbWUgd29yZCBpbiBEQVRBIGFuZCByZS1hcm1zIFNUQVQ9MHhjNTVjLlxuJiM0MzsgKiAgIFRoZSByZXBseSBzb3VyY2UgaXMgbG9hZGVyIEJTUywgbm90IGEgY2hpcCBpZDsgdXNlZCBvbmx5IHRvIHByb3ZlIGEgbGl2ZVxuJiM0MzsgKiAgIG1haWxib3ggaW4gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KCkuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBvdGhlciBTVEFUIHJlYWR5IG1hZ2ljLCAweGMzM2MsIG1hcmtzIHRoZSBsb2FkZXImIzM5O3MgZmxhc2hsZXNzXG4mIzQzOyAqIGNoaXAtdG8tY2hpcCBkb3dubG9hZCBtb2RlIChNeEw4NjI4MVMgMTYtcG9ydCB0aWVyKTsgdGhpcyBkcml2ZXIgZG9lcyBub3RcbiYjNDM7ICogdXNlIGl0LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXNjdWUgbGlmZWN5Y2xlIChkZXZsaW5rKTogcHJvYmUgcnVucyBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QoKTsgYVxuJiM0MzsgKiB3ZWRnZWQgbG9hZGVyIGlzIGRyYWluZWQgYmFjayB0byBSRUFEWSBieSBhIGJhY2tncm91bmQgc2VsZi1oZWFsXG4mIzQzOyAqIChyZXNjdWVfaGVhbF93b3JrKSwgc28gdGhlIGxvbmcgcmVjb3ZlcnkgbmV2ZXIgaG9sZHMgdGhlIGRldmxpbmsgbG9jay5cbiYjNDM7ICogZGV2bGluayBkZXYgaW5mbyBleHBvc2VzIHRoZSBmdyB2ZXJzaW9uICh0aGUgXCYjMzQ7Zmxhc2hhYmxlXCYjMzQ7IHNpZ25hbCkgb25seSBvbmNlIGF0XG4mIzQzOyAqIFJFQURZOyBmbGFzaF91cGRhdGUgcmV0dXJucyAtRUJVU1kgdW50aWwgdGhlbiwgYW5kIHJlcHJvYmVzIHRvIFdTUCBmaXJtd2FyZVxuJiM0MzsgKiBvbiBzdWNjZXNzLlxuJiM0MzsgKlxuJiM0MzsgKiBOb3RlczpcbiYjNDM7ICogICAtIENoaXAgaWQvcmV2aXNpb24gKDB4YzBkMjg4ODQvODgpIGFyZSBOT1QgcmVhY2hhYmxlIG9uIHRoaXMgY2hhbm5lbDsgdGhleVxuJiM0MzsgKiAgICAgbmVlZCB0aGUgY2xhdXNlLTQ1IE1NRCBmaXJtd2FyZSBtYWlsYm94LCB3aGljaCBpcyBkZWFkIHVuZGVyIE1DVWJvb3QuXG4mIzQzOyAqICAgICBSZXNjdWUgaWRlbnRpdHkgaXMgYnkgU0IgUERJIGJlaGF2aW91ciBvbmx5IChteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QpLlxuJiM0MzsgKiAgIC0gVGhlIFNNRElPIFBIWSBhZGRyZXNzIGNvbWVzIGZyb20gdGhlIGRldmljZSB0cmVlOyB0aGUgMHhlMXh4IHJlZ2lzdGVyXG4mIzQzOyAqICAgICBvZmZzZXRzIGFyZSB0aGUgT1RQIHJlc2V0IGRlZmF1bHRzIGFuZCB0aGUgb25seSBsYXlvdXQgc3VwcG9ydGVkIGhlcmUuXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvY3JjMzIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWxheS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2RldmljZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2lvcG9sbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L25ldGRldmljZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L292ZXJmbG93LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcnRuZXRsaW5rLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbmV0L2RzYS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY25ldC9zd2l0Y2hkZXYuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bXhsODYyeHguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1hcGkuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1jbWQuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1mdy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LWhvc3QuaFwmIzM0O1xuJiM0MztcbiYjNDM7LyogU0IgUERJIHJlZ2lzdGVycyAoY2xhdXNlLTIyIFNNRElPIGFkZHJlc3Mgc3BhY2UpICovXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxcdFx0MHhlMTAwXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0FERFJcdFx0MHhlMTAxXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0RBVEFcdFx0MHhlMTAyXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1NUQVRcdFx0MHhlMTAzXG4mIzQzO1xuJiM0MzsvKiBTQiBQREkgQ1RSTCBtb2RlcyAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVFx0MHgwMFxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSXHRcdDB4MDJcbiYjNDM7XG4mIzQzOy8qIFNCIFBESSBoYW5kc2hha2UgbWFnaWMgKHB1Ymxpc2hlZC9jb25zdW1lZCB2aWEgU1RBVCkgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfUkVBRFlcdFx0MHhjNTVjXHQvKiBsb2FkZXIgaWRsZSwgY29uc29sZSBsb29wICovXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0RMX1JFQURZXHQweGMzM2NcdC8qIGxvYWRlciBpZGxlLCBmbGFzaGxlc3MgbG9vcCAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEFSVFx0XHQweGY0OGZcbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfRU5EXHRcdDB4M2NjM1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9SRFJFR1x0XHQweGUyYzBcdC8qIHJlZ2lzdGVyLXJlYWQgY21kICh8IGluZGV4KSAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9SRFJFR19NQVJLXHQweDdjMjNcdC8qIG1hcmtlciBwbGFjZWQgaW4gREFUQSBmb3IgUkRSRUcgKi9cbiYjNDM7XG4mIzQzOy8qIEJlaGF2aW91cmFsIHByZXNlbmNlIHByb2JlOiB0d28gZGlzdGluY3QgMTYtYml0IGxhdGNoZXMgb24gQUREUi9EQVRBLiAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9QUk9CRV9BXHRcdDB4NWE1YVxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9QUk9CRV9EXHRcdDB4YTVhNVxuJiM0MztcbiYjNDM7LyogSW1hZ2UgdmVyaWZpY2F0aW9uIHZlcmRpY3QgcHVibGlzaGVkIGluIFNUQVQgb25jZSB0aGUgcmVjZWl2ZSBsb29wIGVuZHMgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX09LXHQwXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1ZFUklGWV9CQURcdDFcbiYjNDM7XG4mIzQzOy8qIEZpcm13YXJlIHRyYW5zZmVyIGdlb21ldHJ5ICovXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfSERSX1NJWkVcdFx0MjBcbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX0hBTEZcdFx0MTYzODRcdC8qIHdvcmRzIHBlciBoYWxmLWJhbmsgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX1NMSUNFXHRcdDMyNzYwXHQvKiB3b3JkcyBwZXIgZnVsbCBzbGljZSAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0ZXX1NCMV9BRERSXHRcdDB4NzgwMFx0LyogU0IxIHdvcmQgYWRkcmVzcyAqL1xuJiM0MztcbiYjNDM7LyogVGltZW91dHMgKGdlbmVyb3VzIHVwcGVyIGJvdW5kcykgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19SRUFEWV9USU1FT1VUX01TXHQzMDAwXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfQUNLX1RJTUVPVVRfTVNcdDUwMDBcbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19FUkFTRV9USU1FT1VUX01TXHQzMDAwMDBcbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19XUklURV9USU1FT1VUX01TXHQ2MDAwMFxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0ZXX1JFQk9PVF9ERUxBWV9NU1x0NTAwMFxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVNcdDUwMFxuJiM0MzsvKiBPbmUgbG9hZGVyIG1haWxib3ggc3RlcDogcHJvZ3JhbSBhIDEtYnl0ZSBjaHVuayBvciBzZXJ2aWNlIGEgY29tbWFuZCAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TXHRcdDIwMDBcbiYjNDM7LyogQ292ZXJzIHRoZSBsb2FkZXImIzM5O3MgRU5EIHdhaXQsIHZlcmlmaWNhdGlvbiBhbmQgdGhlIHJlc2V0IGludG8gUkVBRFkgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TXHQxNTAwMFxuJiM0MztcbiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfcmVzZXQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbiYjNDM7XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUixcbiYjNDM7XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsXG4mIzQzO1x0XHRcdFx0ICAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGV4cGVjdGVkLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0X21zKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCwgdmFsO1xuJiM0MztcbiYjNDM7XHRyZXQgPSByZWFkX3BvbGxfdGltZW91dChteGw4NjJ4eF9zbWRpb19yZWFkLCB2YWwsXG4mIzQzO1x0XHRcdFx0dmFsIFx1MDAzYyAwIHx8ICh1MTYpdmFsID09IGV4cGVjdGVkLFxuJiM0MztcdFx0XHRcdDEwMDAwLCB0aW1lb3V0X21zICogMTAwMCwgZmFsc2UsXG4mIzQzO1x0XHRcdFx0cHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQpO1xuJiM0MztcdGlmICh2YWwgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gdmFsO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX2ZsdXNoX3NsaWNlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LFxuJiM0MztcdFx0XHRcdCAgICAgICB1MzIgZGF0YV93cml0dGVuKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwgZGF0YV93cml0dGVuKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgMCxcbiYjNDM7XHRcdFx0XHRcdCBNWEw4NjJYWF9GV19XUklURV9USU1FT1VUX01TKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRmx1c2ggdGhlIGxhc3Qgc2xpY2UsIHdoaWNoIGVuZHMgdGhlIHJlY2VpdmUgbG9vcDogdGhlIGxvYWRlciB2ZXJpZmllcyB0aGVcbiYjNDM7ICogaW1hZ2UgYW5kIHJlcGxhY2VzIHRoZSBjb3VudCBpbiBTVEFUIHdpdGggaXRzIHZlcmRpY3QsIHNvIHdhaXQgZm9yIHRoZSBjb3VudFxuJiM0MzsgKiB0byBnbyByYXRoZXIgdGhhbiBmb3IgYSBmaXhlZCB2YWx1ZS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX2ZsdXNoX2xhc3Qoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsXG4mIzQzO1x0XHRcdFx0ICAgICAgdTMyIGRhdGFfd3JpdHRlbilcbiYjNDM7e1xuJiM0MztcdGludCByZXQsIHZhbDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwgZGF0YV93cml0dGVuKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcmVhZF9wb2xsX3RpbWVvdXQobXhsODYyeHhfc21kaW9fcmVhZCwgdmFsLFxuJiM0MztcdFx0XHRcdHZhbCBcdTAwM2MgMCB8fCAodTE2KXZhbCAhPSAodTE2KWRhdGFfd3JpdHRlbixcbiYjNDM7XHRcdFx0XHQxMDAwMCwgKE1YTDg2MlhYX0ZXX1dSSVRFX1RJTUVPVVRfTVMgJiM0MztcbiYjNDM7XHRcdFx0XHRcdE1YTDg2MlhYX1NCX1BESV9WRVJJRllfTVMpICogMTAwMCxcbiYjNDM7XHRcdFx0XHRmYWxzZSwgcHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQpO1xuJiM0MztcdGlmICh2YWwgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gdmFsO1xuJiM0MztcbiYjNDM7XHRpZiAoIXJldCBcdTAwMjZcdTAwMjYgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1ZFUklGWV9PSylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHQvKiBBIGZpbmFsIGNvdW50IG9mIDEgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgcmVqZWN0IHZlcmRpY3QsIHNvXG4mIzQzO1x0ICogYSB0aW1lb3V0IHN0aWxsIGhvbGRpbmcgaXQgbGFuZHMgaGVyZSB0b28uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCh1MTYpdmFsID09IE1YTDg2MlhYX1NCX1BESV9WRVJJRllfQkFEKSB7XG4mIzQzO1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdFwmIzM0O2ZsYXNoOiBsb2FkZXIgcmVqZWN0ZWQgdGhlIGltYWdlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtRUJBRE1TRztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQgPyByZXQgOiAtRVBST1RPO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBteGw4NjJ4eF9mbGFzaF9ub3RpZnkoc3RydWN0IGRldmxpbmsgKmRsLCBjb25zdCBjaGFyICpzdGF0dXMsXG4mIzQzO1x0XHRcdFx0ICB1MzIgZG9uZSwgdTMyIHRvdGFsKVxuJiM0Mzt7XG4mIzQzO1x0ZGV2bGlua19mbGFzaF91cGRhdGVfc3RhdHVzX25vdGlmeShkbCwgc3RhdHVzLCBOVUxMLCBkb25lLCB0b3RhbCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIEJ5dGUtY291bnQgb2YgZWFjaCBjaHVuayBmZWQgdG8gdGhlIGxvYWRlciBkdXJpbmcgZHJhaW4uIEl0IE1VU1QgYmUgMTogdGhlXG4mIzQzOyAqIGxvYWRlciBvbmx5IGxldHMgdXMgb2JzZXJ2ZSBcJiMzNDtjb3VudGVyID09IDBcJiMzNDssIG5ldmVyIFwmIzM0O2NvdW50ZXIgXHUwMDNjIHN0ZXBcJiMzNDssIHNvIGFueVxuJiM0MzsgKiBzdGVwIFx1MDAzZSAxIGNhbiBzdWJ0cmFjdCBwYXN0IHplcm8sIHVuZGVyZmxvdyB0aGUgMzItYml0IGNvdW50ZXIgYW5kIHdlZGdlIHRoZVxuJiM0MzsgKiBsb2FkZXIgZm9yIH4yXjMyIG1vcmUgYnl0ZXMgKGEgc3RhdGUgb25seSBhIHBvd2VyIGN5Y2xlIGNsZWFycykuIFN0ZXBwaW5nIGJ5XG4mIzQzOyAqIDEgd2Fsa3MgdGhlIGNvdW50ZXIgdGhyb3VnaCBldmVyeSB2YWx1ZSBhbmQgaXMgZ3VhcmFudGVlZCB0byBsYW5kIG9uIHplcm9cbiYjNDM7ICogd2hhdGV2ZXIgaXRzIChwb3NzaWJseSBvZGQpIHN0YXJ0LiBBIDEtYnl0ZSBjaHVuayBpcyBhIHBhdGggdGhlIGxvYWRlclxuJiM0MzsgKiBhbHJlYWR5IGhhbmRsZXM6IHRoZSBub3JtYWwgdHJhbnNmZXIgZW5kcyB3aXRoIGEgc2luZ2xlIHRyYWlsaW5nIGJ5dGUgZm9yXG4mIzQzOyAqIG9kZC1zaXplZCBpbWFnZXMgKHNlZSBTdGVwIDYpLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFU1x0MVxuJiM0MztcbiYjNDM7LyogTG9nIHRoZSBkcmFpbiYjMzk7cyBwcm9ncmVzcyBldmVyeSBzbyBtYW55IGJ5dGVzOyBpdCBjYW4gcnVuIGZvciBhIGxvbmcgdGltZSAqL1xuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFU1x0KDEyOCAqIDEwMjQpXG4mIzQzO1xuJiM0MzsvKiBXYWl0IGZvciB0aGUgbG9hZGVyIHRvIGFzayBmb3IgdGhlIG5leHQgY2h1bmsgKFNUQVQgMCkgb3IgdG8gY29tZSBiYWNrIHRvIGl0c1xuJiM0MzsgKiBjb21tYW5kIGxvb3AgKFNUQVQgUkVBRFkpLCBhbmQgcmV0dXJuIHRoZSBTVEFUIHZhbHVlIGVpdGhlciB3YXkuIE9uIHRpbWVvdXRcbiYjNDM7ICogdGhhdCBpcyB3aGF0ZXZlciBTVEFUIHN0aWxsIGhvbGRzLCB3aGljaCBjYXJyaWVzIG5vIGZ1cnRoZXIgaW5mb3JtYXRpb246IHRoZVxuJiM0MzsgKiBsb2FkZXIga2VlcHMgdGhlIGNvdW50IHdlIHdyb3RlIHZpc2libGUgd2hpbGUgaXQgcHJvZ3JhbXMgdGhlIGNodW5rLCBhbmQgdGhhdFxuJiM0MzsgKiBpcyB0aGUgc2FtZSB2YWx1ZSBpdCBwdWJsaXNoZXMgYXMgdGhlIFwmIzM0O2ltYWdlIHJlamVjdGVkXCYjMzQ7IHZlcmRpY3Qgb25jZSB0aGVcbiYjNDM7ICogY291bnRlciByZWFjaGVzIHplcm8uXG4mIzQzOyAqXG4mIzQzOyAqIFNUQVQgMCBpcyB1bmFtYmlndW91cyBoZXJlIGV2ZW4gdGhvdWdoIGl0IGlzIGFsc28gdGhlIFwmIzM0O2ltYWdlIHZlcmlmaWVkXCYjMzQ7XG4mIzQzOyAqIHZlcmRpY3Q6IGJ5IHRoZSByX3JlbWFpbiA9PSAwIHJ1bGUgdGhlIGxvYWRlciBsZWF2ZXMgdGhlIHJlY2VpdmUgbG9vcCB0aGVcbiYjNDM7ICogbW9tZW50IHRoZSBjb3VudGVyIHJlYWNoZXMgemVybywgc28gaXQgaXMgbmV2ZXIgYm90aCBpbnNpZGUgdGhlIGxvb3AgYXNraW5nXG4mIzQzOyAqIGZvciBhIGNodW5rIGFuZCBwdWJsaXNoaW5nIGEgdmVyZGljdC4gT25jZSBpdCBoYXMgbGVmdCwgdGhlIG5leHQgU1RBVCB3cml0ZVxuJiM0MzsgKiBpcyBhIGNvbW1hbmQgcmF0aGVyIHRoYW4gYSBjb3VudCwgc28gZmVlZGluZyBvbmUgbW9yZSBjaHVuayBhZnRlciBhIHZlcmRpY3RcbiYjNDM7ICogY2Fubm90IHVuZGVyZmxvdyBhbnl0aGluZyBlaXRoZXIuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IG14bDg2Mnh4X3NiX3BkaV9wb2xsX2RyYWluKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcylcbiYjNDM7e1xuJiM0MztcdGludCB2YWw7XG4mIzQzO1xuJiM0MztcdHJlYWRfcG9sbF90aW1lb3V0KG14bDg2Mnh4X3NtZGlvX3JlYWQsIHZhbCxcbiYjNDM7XHRcdFx0ICB2YWwgXHUwMDNjIDAgfHwgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZIHx8XG4mIzQzO1x0XHRcdCAgKHUxNil2YWwgPT0gMCxcbiYjNDM7XHRcdFx0ICA1MCwgdGltZW91dF9tcyAqIDEwMDAsIGZhbHNlLFxuJiM0MztcdFx0XHQgIHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFUKTtcbiYjNDM7XHRpZiAodmFsIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHZhbDtcbiYjNDM7XHRyZXR1cm4gKHUxNil2YWw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFRoZSBsb2FkZXIgaXMgbm90IGFza2luZyBmb3IgYSBjaHVuazogaXQgbWF5IHN0aWxsIGJlIHByb2dyYW1taW5nIHRoZSBsYXN0XG4mIzQzOyAqIG9uZSwgb3IgdGhlIGNvdW50ZXIgaGFzIHJlYWNoZWQgemVybyBhbmQgaXQgaXMgdmVyaWZ5aW5nIHRoZSBpbWFnZSBhbmRcbiYjNDM7ICogcmVzZXR0aW5nIGludG8gUkVBRFkuIFdhaXQgdGhhdCBvdXQgLS0gU1RBVCBjYW5ub3QgdGVsbCB0aGUgdHdvIGFwYXJ0LCBhbmRcbiYjNDM7ICogZ3Vlc3Npbmcgd291bGQgbWVhbiB3cml0aW5nIEVORCBpbnRvIGEgbGl2ZSByZWNlaXZlIGxvb3AuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbmNlIHRoZSBsb2FkZXIgaGFzIGxlZnQgdGhlIGxvb3AsIC1FQUdBSU4gaWYgaXQgYXNrcyBmb3IgYW5vdGhlclxuJiM0MzsgKiBjaHVuayBhZnRlciBhbGwsIC1FSU8gZm9yIGEgbG9hZGVyIHN0aWxsIGhvbGRpbmcgdGhlIGNvdW50IHdoZW4gdGhlIHZlcmlmeVxuJiM0MzsgKiB3aW5kb3cgZXhwaXJlcywgb3IgYW4gU01ESU8gYnVzIGVycm9yLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9yZXNjdWVfZHJhaW5fZmluaXNoKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgY2h1bmspXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2O1xuJiM0MztcdGludCBzdGF0O1xuJiM0MztcbiYjNDM7XHRzdGF0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfZHJhaW4ocHJpdiwgTVhMODYyWFhfU0JfUERJX1ZFUklGWV9NUyk7XG4mIzQzO1x0aWYgKHN0YXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gc3RhdDtcbiYjNDM7XHRpZiAoc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfUkVBRFkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAoc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX0JBRCkge1xuJiM0MztcdFx0ZGV2X2VycihkZXYsXG4mIzQzO1x0XHRcdFwmIzM0O2ZsYXNoOiBsb2FkZXIgc3R1Y2sgYWZ0ZXIgJXUgY2h1bmtzLCBwb3dlciBjeWNsZSBpdFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0Y2h1bmspO1xuJiM0MztcdFx0cmV0dXJuIC1FSU87XG4mIzQzO1x0fVxuJiM0MztcdGlmIChzdGF0KSB7XG4mIzQzO1x0XHQvKiBBIGZpcm13YXJlIGlzIGFuc3dlcmluZywgbm90IHRoZSBsb2FkZXI6IGFuIGltYWdlIHN1cnZpdmVkXG4mIzQzO1x0XHQgKiBpbiBmbGFzaCBhbmQgYm9vdGVkLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRkZXZfaW5mbyhkZXYsIFwmIzM0O2ZsYXNoOiBmaXJtd2FyZSBib290ZWQgd2hpbGUgZHJhaW5pbmdcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gLUVBR0FJTjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUmVjb3ZlciBhIHN3aXRjaCB3aG9zZSBTQiBQREkgZG93bmxvYWQgd2FzIGludGVycnVwdGVkIG1pZC10cmFuc2ZlciAtIHRoZVxuJiM0MzsgKiBob3N0IGRpZWQgYWZ0ZXIgTUNVYm9vdCBiZWdhbiBlcmFzaW5nIGZsYXNoLCB3aGV0aGVyIGl0IGFib3J0ZWQgbWlkIGVyYXNlIG9yXG4mIzQzOyAqIG1pZCBpbWFnZS13cml0ZSwgYm90aCBlbmQgdXAgaW4gdGhlIHNhbWUgcGxhY2U6IHRoZSBwYXlsb2FkIHJlY2VpdmUgbG9vcC5cbiYjNDM7ICogVGhlcmUgdGhlIGxvYWRlciBwdWJsaXNoZXMgU1RBVD0wLCB3YWl0cyBmb3IgdGhlIGhvc3QgdG8gd3JpdGUgYSBieXRlLWNvdW50XG4mIzQzOyAqIHRvIFNUQVQsIERNQXMgdGhhdCBtYW55IGJ5dGVzIGFuZCBzdWJ0cmFjdHMgdGhlIGNvdW50IGZyb20gYSByZW1haW5pbmctYnl0ZXNcbiYjNDM7ICogY291bnRlciwgbGVhdmluZyB0aGUgbG9vcCBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgcmVhY2hlcyBleGFjdGx5IHplcm8uIFRoZVxuJiM0MzsgKiBpbWFnZSBzaXplIGRpZWQgd2l0aCB0aGUgaG9zdCwgc28gd2UgZmVlZCBzaW5nbGUtYnl0ZSBjaHVua3MgKHNlZVxuJiM0MzsgKiBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUykgdG8gd2FsayB0aGUgY291bnRlciB0byB6ZXJvIHdpdGhvdXQgdW5kZXJmbG93LlxuJiM0MzsgKiBUaGUgbG9hZGVyIHRoZW4gdmVyaWZpZXMgdGhlIChub3cgY29ycnVwdCkgaW1hZ2UgYW5kIHJldHVybnMgdG8gUkVBRFkgYnlcbiYjNDM7ICogaXRzZWxmLCBvciBib290cyBhIHZhbGlkIGltYWdlIHRoYXQgaGFwcGVuZWQgdG8gc3Vydml2ZSBpbiBmbGFzaDsgZWl0aGVyIHdheVxuJiM0MzsgKiB0aGUgY2FsbGVyJiMzOTtzIHJlcHJvYmUgY2xhc3NpZmllcyB0aGUgcmVzdWx0LiBFdmVyeSBieXRlIGNvc3RzIGFib3V0IGEgZG96ZW5cbiYjNDM7ICogTURJTyBmcmFtZXMsIHNvIGEgbXVsdGktTWlCIG91dHN0YW5kaW5nIGNvdW50IHRha2VzIHRlbnMgb2YgbWludXRlcy5cbiYjNDM7ICogUmV0dXJucyAwIG9uY2UgdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgcmVjZWl2ZSBsb29wLCBcdTAwM2MwIG9uIGVycm9yLiBEb2VzIE5PVFxuJiM0MzsgKiByZWNvdmVyIGEgY291bnRlciBhbHJlYWR5IHVuZGVyZmxvd2VkIGJ5IGFuIGVhcmxpZXIgb3ZlcnNpemVkLWNodW5rIGF0dGVtcHRcbiYjNDM7ICogLSB0aGF0IG5lZWRzIGEgcG93ZXIgY3ljbGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbihzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXY7XG4mIzQzO1x0LyogQm91bmQ6IHR3aWNlIHRoZSBsb2FkZXImIzM5O3MgMTYgTWlCIGltYWdlIGNhcCwgb25lIGJ5dGUgcGVyIGNodW5rLiAqL1xuJiM0MztcdHUzMiBtYXhfY2h1bmtzID0gMnUgKiAoMTZ1IFx1MDAzY1x1MDAzYyAyMCkgLyBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUztcbiYjNDM7XHR1MzIgY2h1bmsgPSAwO1xuJiM0MztcdGludCByZXQsIHN0YXQ7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChjaHVuayBcdTAwM2MgbWF4X2NodW5rcykge1xuJiM0MztcdFx0LyogVGVhcmRvd24gY2FuIGludGVycnVwdCB0aGlzIGxvbmcgZHJhaW4uICovXG4mIzQzO1x0XHRpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFx1MDAyNnByaXYtXHUwMDNlZmxhZ3MpKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVDQU5DRUxFRDtcbiYjNDM7XG4mIzQzO1x0XHRzdGF0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfZHJhaW4ocHJpdiwgTVhMODYyWFhfU0JfUERJX1NURVBfTVMpO1xuJiM0MztcdFx0aWYgKHN0YXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiBzdGF0O1xuJiM0MztcdFx0aWYgKHN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKVxuJiM0MztcdFx0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoc3RhdCkge1xuJiM0MztcdFx0XHRyZXQgPSBteGw4NjJ4eF9yZXNjdWVfZHJhaW5fZmluaXNoKHByaXYsIGNodW5rKTtcbiYjNDM7XHRcdFx0aWYgKHJldCAhPSAtRUFHQUlOKVxuJiM0MztcdFx0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0LyogRmVlZCBvbmUgemVybyBieXRlOyByZXNldCBjbGVhcmVkIHRoZSB3cml0ZSBsYXRjaC4gKi9cbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCAweDAwMDApO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcbiYjNDM7XHRcdFx0XHRcdCAgIE1YTDg2MlhYX0RSQUlOX0NIVU5LX0JZVEVTKTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHRjaHVuayYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRpZiAoIShjaHVuayAlIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFUykpXG4mIzQzO1x0XHRcdGRldl9pbmZvKGRldiwgXCYjMzQ7Zmxhc2g6IGRyYWluZWQgJXUgS2lCIHNvIGZhclxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgY2h1bmsgLyAxMDI0KTtcbiYjNDM7XHRcdGNvbmRfcmVzY2hlZCgpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZGV2X2VycihkZXYsXG4mIzQzO1x0XHRcJiMzNDtmbGFzaDogaW50ZXJydXB0ZWQgZG93bmxvYWQgZGlkIG5vdCBkcmFpbiBhZnRlciAldSBjaHVua3NcXG5cJiMzNDssXG4mIzQzO1x0XHRjaHVuayk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAtRVRJTUVET1VUO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBCYWNrZ3JvdW5kIHNlbGYtaGVhbDogZHJhaW4gYSB3ZWRnZWQgZG93bmxvYWQgb2ZmIHRoZSBkZXZsaW5rIGZsYXNoIHBhdGgsIHNvXG4mIzQzOyAqIHRoZSBsb25nIHJlY292ZXJ5IG5ldmVyIGhvbGRzIHRoZSBkZXZsaW5rIGxvY2suIFNjaGVkdWxlZCBmcm9tIHByb2JlO1xuJiM0MzsgKiByZXByb2JlcyBvbiBzdWNjZXNzIHNvIHRoZSBwcm9iZS10aW1lIGRldGVjdGlvbiByZS1jbGFzc2lmaWVzIHRoZSBzd2l0Y2guXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPVxuJiM0MztcdFx0Y29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBteGw4NjJ4eF9wcml2LCByZXNjdWVfaGVhbF93b3JrKTtcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbihwcml2KTtcbiYjNDM7XHRpZiAocmV0ID09IC1FQ0FOQ0VMRUQpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0LyogTm90aGluZyByZXRyaWVzIHRoaXMsIHNvIHNheSBzbzogcmVzY3VlX3JlYWR5IHN0YXlzIGNsZWFyXG4mIzQzO1x0XHQgKiBhbmQgZGV2bGluayBkZXYgZmxhc2ggcmVwb3J0cyB3aHkgaXQgcmVmdXNlcy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0ZGV2X2VycihkZXYsIFwmIzM0O2ZsYXNoOiBkb3dubG9hZCByZWNvdmVyeSBmYWlsZWQ6ICVwZVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0RVJSX1BUUihyZXQpKTtcbiYjNDM7XHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfZmFpbGVkLCB0cnVlKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBpbnRlcnJ1cHRlZCB0cmFuc2ZlciBpcyBmaW5hbGlzZWQ7IHJlcHJvYmUgc28gdGhlIHByb2JlLXRpbWVcbiYjNDM7XHQgKiBkZXRlY3Rpb24gYnJpbmdzIHRoZSBkcml2ZXIgdXAgLS0gZmxhc2hhYmxlIGluIHJlc2N1ZSBtb2RlIGlmIHRoZVxuJiM0MztcdCAqIGxvYWRlciBpcyBhdCBSRUFEWSwgb3Igbm9ybWFsbHkgaWYgYSB2YWxpZCBpbWFnZSBib290ZWQuIFRoZSBjb3JlXG4mIzQzO1x0ICogc2tpcHMgdGhlIHJlLXByb2JlIG9uIGl0cyBvd24gaWYgdGhlIGRldmljZSBpcyB1bmJvdW5kIGZpcnN0OyB0aGVcbiYjNDM7XHQgKiBmbGFnIHRlc3Qgb25seSBhdm9pZHMgc2NoZWR1bGluZyBvbmUgY2VydGFpbiB0byBiZSBza2lwcGVkLiBBXG4mIzQzO1x0ICogZmFpbGVkIGhhbmQtb2ZmIGxlYXZlcyBub3RoaW5nIHRvIHJlY2xhc3NpZnkgdGhlIHN3aXRjaCwgc28gbWFya1xuJiM0MztcdCAqIHJlY292ZXJ5IGZhaWxlZCByYXRoZXIgdGhhbiBwcm9taXNlIGEgcmV0cnkgdGhhdCBjYW5ub3Qgc3VjY2VlZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFx1MDAyNnByaXYtXHUwMDNlZmxhZ3MpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAoZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZGV2LCBNWEw4NjJYWF9GV19SRVBST0JFX0RFTEFZX01TKSlcbiYjNDM7XHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfZmFpbGVkLCB0cnVlKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogRGV0ZWN0IE1DVWJvb3QgcmVzY3VlIG1vZGUgb3ZlciBjbGF1c2UtMjIgU01ESU8gYWxvbmUsIHNvIHRoZSBjYWxsZXIgY2FuIHJ1bGVcbiYjNDM7ICogdGhlIGxvYWRlciBvdXQgYmVmb3JlIGFueSBDNDUgQVBJIHJlcXVlc3QgKHdoaWNoIHNwZXdzIENSQyBlcnJvcnMgd2hlbiBubyBXU1BcbiYjNDM7ICogZmlybXdhcmUgYW5zd2VycykuIEEgc2NyYXRjaCB3cml0ZSB0byBBRERSL0RBVEEgbXVzdCBsYXRjaCBvciB0aGUgY2hpcCBpc1xuJiM0MzsgKiBhYnNlbnQgKC1FTk9ERVYpOyB0aGUgbWFpbGJveCBpcyByZXNldCBmaXJzdCwgb3IgYSB0cmFuc2ZlciBpbnRlcnJ1cHRlZCB3aXRoXG4mIzQzOyAqIENUUkw9V1Igd291bGQgdGFrZSB0aGF0IHdyaXRlIGFzIGEgcGF5bG9hZCB3b3JkIGluc3RlYWQgb2YgbGF0Y2hpbmcgaXQuIFNUQVRcbiYjNDM7ICogdGhlbiBjbGFzc2lmaWVzIHRoZSBzdGF0ZSwgcG9rZWQgZGVzdHJ1Y3RpdmVseSBvbmx5IHdoZW4gMCwgdGhlIG9uZSB2YWx1ZSBhXG4mIzQzOyAqIHJ1bm5pbmcgZmlybXdhcmUgbmV2ZXIgaG9sZHM6XG4mIzQzOyAqXG4mIzQzOyAqICAtIDB4YzMzYzogZmxhc2hsZXNzIGxvb3A7IHJlY29nbmlzZWQgYnV0IG5vdCBzdXBwb3J0ZWQgaGVyZS5cbiYjNDM7ICogIC0gMHhjNTVjOiBjb25zb2xlIGxvb3AsIGlmIHRoZSByZWdpc3Rlci1yZWFkIGNoYWxsZW5nZSBpcyBzZXJ2aWNlZC5cbiYjNDM7ICogIC0gb3RoZXIgbm9uLXplcm86IHJ1bm5pbmcgZmlybXdhcmUsIGxlZnQgdW5wb2tlZC5cbiYjNDM7ICogIC0gMDogd2VkZ2VkIHJlY2VpdmUgbG9vcDsgdGhlIDEtYnl0ZSBzbGljZS1hZHZhbmNlIHRoZW4gc2F5cyB3aGV0aGVyIGl0XG4mIzQzOyAqICAgIHN0aWxsIG5lZWRzIGRyYWluaW5nIG9yIGhhcyBqdXN0IGZpbmlzaGVkLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgc2NyYXRjaCB3cml0ZSByZWFjaGVzIGEgcnVubmluZyBmaXJtd2FyZSB0b28sIGJ1dCBsYW5kcyBpbiBtYWlsYm94XG4mIzQzOyAqIHJlZ2lzdGVycyBpdCBkb2VzIG5vdCByZWFkLCBzbyBpdCBpcyBpbmVydCB0aGVyZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBNWEw4NjJYWF9JTl9SRVNDVUUsIE1YTDg2MlhYX05PVF9SRVNDVUUsIC1FTk9ERVYgd2hlbiB0aGUgc2NyYXRjaFxuJiM0MzsgKiB3cml0ZSBkb2VzIG5vdCBsYXRjaCwgd2hpY2ggaXMgYSBzd2l0Y2ggdGhhdCBkb2VzIG5vdCBhbnN3ZXIgYXQgYWxsIG9yIG9uZVxuJiM0MzsgKiB3aG9zZSBTQiBQREkgd2luZG93IGlzIG5vdCBhdCB0aGUgb2Zmc2V0cyBhYm92ZSwgLUVPUE5PVFNVUFAgZm9yIHRoZVxuJiM0MzsgKiBmbGFzaGxlc3MgbG9vcCwgLUVOWElPIGZvciBhIFJFQURZIGxvYWRlciB3aG9zZSBtYWlsYm94IGZhaWxzIHRoZSBjaGFsbGVuZ2UsXG4mIzQzOyAqIG9yIGFuIFNNRElPIGJ1cyBlcnJvci5cbiYjNDM7ICovXG4mIzQzO2ludCBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3Qoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc3RhdCwgZGF0LCByZXQsIHJiLCBhLCBkO1xuJiM0MztcbiYjNDM7XHQvKiByZXNjdWVfcmVhZHkgZ2F0ZXMgZmxhc2hpbmc7IGEgd2VkZ2VkIGxvYWRlciBuZWVkcyB0aGUgZHJhaW4gZmlyc3QuICovXG4mIzQzO1x0V1JJVEVfT05DRShwcml2LVx1MDAzZXJlc2N1ZV9yZWFkeSwgZmFsc2UpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIFByZXNlbmNlOiBhIGxpdmUgY2hpcCBsYXRjaGVzIHRoZSBzY3JhdGNoIHdyaXRlLCBhbiBhYnNlbnQgb25lIGZsb2F0cy4gKi9cbiYjNDM7XHRhID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsXG4mIzQzO1x0XHRcdFx0IE1YTDg2MlhYX1NCX1BESV9QUk9CRV9BKTtcbiYjNDM7XHRpZiAoYSBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiBhO1xuJiM0MztcdGQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSxcbiYjNDM7XHRcdFx0XHQgTVhMODYyWFhfU0JfUERJX1BST0JFX0QpO1xuJiM0MztcdGlmIChkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIGQ7XG4mIzQzO1x0YSA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIpO1xuJiM0MztcdGlmIChhIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIGE7XG4mIzQzO1x0ZCA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEpO1xuJiM0MztcdGlmIChkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIGQ7XG4mIzQzO1x0aWYgKCh1MTYpYSAhPSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSB8fFxuJiM0MztcdCAgICAodTE2KWQgIT0gTVhMODYyWFhfU0JfUERJX1BST0JFX0QpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0RFVjtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRzdGF0ID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XG4mIzQzO1x0aWYgKHN0YXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gc3RhdDtcbiYjNDM7XG4mIzQzO1x0LyogRmxhc2hsZXNzLWRvd25sb2FkIGxvb3AgKE14TDg2MjgxIHRpZXIpOiB1bnN1cHBvcnRlZC4gKi9cbiYjNDM7XHRpZiAoKHUxNilzdGF0ID09IE1YTDg2MlhYX1NCX1BESV9ETF9SRUFEWSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0LyogQ29uc29sZSBsb29wIGF0IFJFQURZOiBjb25maXJtIHRoZSBsaXZlIG1haWxib3ggd2l0aCB0aGUgcmVnaXN0ZXItcmVhZFxuJiM0MztcdCAqIGNoYWxsZW5nZSAoY29uc3VtZXMgdGhlIG1hcmtlciBmcm9tIERBVEEgYW5kIHJlLWFybXMgUkVBRFkpLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICgodTE2KXN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKSB7XG4mIzQzO1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSxcbiYjNDM7XHRcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9SRFJFR19NQVJLKTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcbiYjNDM7XHRcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9SRFJFRyk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0cmIgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIE1YTDg2MlhYX1NCX1BESV9SRUFEWSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBNWEw4NjJYWF9TQl9QRElfU1RFUF9NUyk7XG4mIzQzO1x0XHRkYXQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBKTtcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcbiYjNDM7XHRcdC8qIE5ldmVyIHJlLWFybWluZyBSRUFEWSBmYWlscyB0aGUgY2hhbGxlbmdlIGxpa2UgYW55IG90aGVyXG4mIzQzO1x0XHQgKiB1bnNlcnZpY2VkIGNvbW1hbmQ7IHJlcG9ydCBpdCBhcyBzdWNoIHJhdGhlciB0aGFuIGFzIGEgYnVzXG4mIzQzO1x0XHQgKiB0aW1lb3V0IHRoZSBidXMgbmV2ZXIgc2F3LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAocmIgPT0gLUVUSU1FRE9VVClcbiYjNDM7XHRcdFx0cmIgPSAtRU5YSU87XG4mIzQzO1x0XHRpZiAocmIgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByYjtcbiYjNDM7XHRcdGlmIChkYXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiBkYXQ7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0aWYgKCh1MTYpZGF0ICE9IE1YTDg2MlhYX1NCX1BESV9SRFJFR19NQVJLKSB7XG4mIzQzO1x0XHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHksIHRydWUpO1xuJiM0MztcdFx0XHRyZXR1cm4gTVhMODYyWFhfSU5fUkVTQ1VFO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0LyogUkVBRFkgYnV0IHRoZSBtYXJrZXIgaXMgdW50b3VjaGVkLCBzbyBub3RoaW5nIGlzIHNlcnZpY2luZyB0aGVcbiYjNDM7XHRcdCAqIG1haWxib3guIEEgZmlybXdhcmUgcHVibGlzaGluZyAweGM1NWMgYXMgaXRzIHN0YXR1cyB3b3JkIGxvb2tzXG4mIzQzO1x0XHQgKiBleGFjdGx5IGxpa2UgdGhpcywgYW5kIGZsYXNoaW5nIG9uZSB3b3VsZCBiZSBmYXIgd29yc2UgdGhhblxuJiM0MztcdFx0ICogcmVmdXNpbmcgdG8gYmluZCwgc28gdHJlYXQgaXQgYXMgdW51c2FibGUuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBBbnkgb3RoZXIgbm9uLXplcm8gdmFsdWUgaXMgYSBydW5uaW5nIGZpcm13YXJlLCBub3QgYSBsb2FkZXIuICovXG4mIzQzO1x0aWYgKHN0YXQpXG4mIzQzO1x0XHRyZXR1cm4gTVhMODYyWFhfTk9UX1JFU0NVRTtcbiYjNDM7XG4mIzQzO1x0LyogU1RBVCA9PSAwOiBhIHdlZGdlZCByZWNlaXZlIGxvb3AgdGFrZXMgYSAxLWJ5dGUgc2xpY2UtYWR2YW5jZSAoZmVlZFxuJiM0MztcdCAqIG9uZSBEQVRBIHdvcmQgZmlyc3QsIGxpa2UgYSBkcmFpbiBjaHVuaykgYW5kIGFza3MgZm9yIHRoZSBuZXh0IGNodW5rXG4mIzQzO1x0ICogYnkgcHVibGlzaGluZyAwIGFnYWluLiBIYWQgdGhhdCBieXRlIGJlZW4gdGhlIGxhc3Qgb25lIG91dHN0YW5kaW5nLFxuJiM0MztcdCAqIHRoZSBsb2FkZXIgbGVhdmVzIHRoZSBsb29wIGluc3RlYWQgYW5kIHJldHVybnMgdG8gUkVBRFksIGhhdmluZ1xuJiM0MztcdCAqIGNvbnN1bWVkIHRoZSBhZHZhbmNlIC0tIHByb29mIGVub3VnaCBvZiBhIGxpdmUgbWFpbGJveCB0byBza2lwIHRoZVxuJiM0MztcdCAqIGNoYWxsZW5nZS4gQW55dGhpbmcgZWxzZSBtZWFucyBpdCBpcyBzdGlsbCB3b3JraW5nIG9uIGl0LiBBbGwgdGhyZWVcbiYjNDM7XHQgKiBhcmUgcmVzY3VlLCBzbyB0aGlzIG5ldmVyIGZhaWxzIHByb2JlOyBvbmx5IHRoZSBkcmFpbiBkb2VzLlxuJiM0MztcdCAqL1xuJiM0MztcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgMHgwMDAwKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsXG4mIzQzO1x0XHRcdFx0ICAgTVhMODYyWFhfRFJBSU5fQ0hVTktfQllURVMpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyYiA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX2RyYWluKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TKTtcbiYjNDM7XHRpZiAocmIgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcmI7XG4mIzQzO1x0aWYgKHJiID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSlcbiYjNDM7XHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHksIHRydWUpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gTVhMODYyWFhfSU5fUkVTQ1VFO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBNQ1Vib290IGZpcm13YXJlIGltYWdlIGhlYWRlciAqL1xuJiM0MztzdHJ1Y3QgbXhsODYyeHhfZndfaGRyIHtcbiYjNDM7XHRfX2xlMzIgaW1hZ2VfdHlwZTtcbiYjNDM7XHRfX2xlMzIgaW1hZ2Vfc2l6ZV8xO1xuJiM0MztcdF9fbGUzMiBpbWFnZV9jaGVja3N1bV8xO1xuJiM0MztcdF9fbGUzMiBpbWFnZV9zaXplXzI7XG4mIzQzO1x0X19sZTMyIGltYWdlX2NoZWNrc3VtXzI7XG4mIzQzO30gX19wYWNrZWQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IG14bDg2Mnh4X2ZsYXNoX3ZhbGlkYXRlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LFxuJiM0MztcdFx0XHRcdCAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsXG4mIzQzO1x0XHRcdFx0ICAgdTMyICpwYXlsb2FkX3NpemUpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICpoZHI7XG4mIzQzO1x0dTMyIHNpemUxLCBzaXplMiwgdG90YWw7XG4mIzQzO1x0Y29uc3QgdTggKnBheWxvYWQ7XG4mIzQzO1x0dTMyIGNyYztcbiYjNDM7XG4mIzQzO1x0aWYgKGZ3LVx1MDAzZXNpemUgXHUwMDNjIE1YTDg2MlhYX0ZXX0hEUl9TSVpFKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdGhkciA9IChjb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICopZnctXHUwMDNlZGF0YTtcbiYjNDM7XHRwYXlsb2FkID0gZnctXHUwMDNlZGF0YSAmIzQzOyBNWEw4NjJYWF9GV19IRFJfU0laRTtcbiYjNDM7XHRzaXplMSA9IGxlMzJfdG9fY3B1KGhkci1cdTAwM2VpbWFnZV9zaXplXzEpO1xuJiM0MztcdHNpemUyID0gbGUzMl90b19jcHUoaGRyLVx1MDAzZWltYWdlX3NpemVfMik7XG4mIzQzO1xuJiM0MztcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coc2l6ZTEsIHNpemUyLCBcdTAwMjZ0b3RhbCkgfHxcbiYjNDM7XHQgICAgdG90YWwgXHUwMDNlIGZ3LVx1MDAzZXNpemUgLSBNWEw4NjJYWF9GV19IRFJfU0laRSkge1xuJiM0MztcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcJiMzNDtmbGFzaDogZmlybXdhcmUgZmlsZSB0b28gc21hbGwgZm9yIGRlY2xhcmVkIHNpemVcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIXRvdGFsKSB7XG4mIzQzO1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdFwmIzM0O2ZsYXNoOiBmaXJtd2FyZSBmaWxlIHdpdGggZW1wdHkgcGF5bG9hZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChzaXplMSkge1xuJiM0MztcdFx0Y3JjID0gfmNyYzMyX2xlKH4wVSwgcGF5bG9hZCwgc2l6ZTEpO1xuJiM0MztcdFx0aWYgKGNyYyAhPSBsZTMyX3RvX2NwdShoZHItXHUwMDNlaW1hZ2VfY2hlY2tzdW1fMSkpIHtcbiYjNDM7XHRcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcdFwmIzM0O2ZsYXNoOiBpbWFnZSAxIENSQyBtaXNtYXRjaCAoZ290ICUwOHgsIGV4cGVjdGVkICUwOHgpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdGNyYywgbGUzMl90b19jcHUoaGRyLVx1MDAzZWltYWdlX2NoZWNrc3VtXzEpKTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoc2l6ZTIpIHtcbiYjNDM7XHRcdGNyYyA9IH5jcmMzMl9sZSh+MFUsIHBheWxvYWQgJiM0Mzsgc2l6ZTEsIHNpemUyKTtcbiYjNDM7XHRcdGlmIChjcmMgIT0gbGUzMl90b19jcHUoaGRyLVx1MDAzZWltYWdlX2NoZWNrc3VtXzIpKSB7XG4mIzQzO1x0XHRcdGRldl9lcnIoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldixcbiYjNDM7XHRcdFx0XHRcJiMzNDtmbGFzaDogaW1hZ2UgMiBDUkMgbWlzbWF0Y2ggKGdvdCAlMDh4LCBleHBlY3RlZCAlMDh4KVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRjcmMsIGxlMzJfdG9fY3B1KGhkci1cdTAwM2VpbWFnZV9jaGVja3N1bV8yKSk7XG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0KnBheWxvYWRfc2l6ZSA9IHRvdGFsO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9mbGFzaF9maXJtd2FyZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcbiYjNDM7XHRcdFx0XHQgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LFxuJiM0MztcdFx0XHRcdCAgIHUzMiBwYXlsb2FkX3NpemUsIHN0cnVjdCBkZXZsaW5rICpkbClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHU4ICpwYXlsb2FkID0gZnctXHUwMDNlZGF0YSAmIzQzOyBNWEw4NjJYWF9GV19IRFJfU0laRTtcbiYjNDM7XHR1MzIgd29yZF9pZHggPSAwLCBkYXRhX3dyaXR0ZW4gPSAwLCBpZHggPSAwO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbmV4dF9ub3RpZnkgPSBqaWZmaWVzIC0gMTtcbiYjNDM7XHR1MTYgd29yZCwgZmRhdGE7XG4mIzQzO1x0aW50IHJldCwgaTtcbiYjNDM7XG4mIzQzO1x0LyogU3RlcCAxOiByZWJvb3QgdGhlIGZpcm13YXJlIGludG8gTUNVYm9vdCByZXNjdWUgbW9kZSAqL1xuJiM0MztcdGlmICghcHJpdi1cdTAwM2VyZXNjdWVfbW9kZSkge1xuJiM0MztcdFx0cmV0ID0gbXhsODYyeHhfYXBpX3dyYXAocHJpdiwgU1lTX01JU0NfRldfVVBEQVRFLCBOVUxMLCAwLFxuJiM0MztcdFx0XHRcdFx0ZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRcdGlmIChyZXQpIHtcbiYjNDM7XHRcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcdFwmIzM0O2ZsYXNoOiBGV19VUERBVEUgY29tbWFuZCBmYWlsZWQ6ICVwZVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRFUlJfUFRSKHJldCkpO1xuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogU3RlcCAyOiB3YWl0IGZvciBib290bG9hZGVyIHJlYWR5ICovXG4mIzQzO1x0bXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCBcJiMzNDtXYWl0aW5nIGZvciBib290bG9hZGVyXCYjMzQ7LCAwLCAwKTtcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gd3JpdGVfZXJyO1xuJiM0MztcbiYjNDM7XHQvKiBGYWlsdXJlcyBmcm9tIGhlcmUgb24gZW5kIHVwIGF0IG5vX2VuZCwgd2hpY2ggcmV0dXJucyB0aGUgZXJyb3JcbiYjNDM7XHQgKiB3aXRob3V0IHNpZ25hbGxpbmcgRU5EIC0tIHNlZSB0aGVyZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIE1YTDg2MlhYX1NCX1BESV9SRUFEWSxcbiYjNDM7XHRcdFx0XHRcdE1YTDg2MlhYX0ZXX1JFQURZX1RJTUVPVVRfTVMpO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdGRldl9lcnIoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldixcbiYjNDM7XHRcdFx0XCYjMzQ7Zmxhc2g6IGJvb3Rsb2FkZXIgbm90IHJlYWR5OiAlcGVcXG5cJiMzNDssIEVSUl9QVFIocmV0KSk7XG4mIzQzO1x0XHRnb3RvIG5vX2VuZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFN0ZXAgMzogc3RhcnQgaGFuZHNoYWtlICovXG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsXG4mIzQzO1x0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX1NUQVJUKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0Z290byB3cml0ZV9lcnI7XG4mIzQzO1xuJiM0MztcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVJUICYjNDM7IDEsXG4mIzQzO1x0XHRcdFx0XHRNWEw4NjJYWF9GV19BQ0tfVElNRU9VVF9NUyk7XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcJiMzNDtmbGFzaDogc3RhcnQgaGFuZHNoYWtlIGZhaWxlZDogJXBlXFxuXCYjMzQ7LCBFUlJfUFRSKHJldCkpO1xuJiM0MztcdFx0Z290byBub19lbmQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBTdGVwIDQ6IHRyYW5zZmVyIGltYWdlIGhlYWRlciAqL1xuJiM0MztcdG14bDg2Mnh4X2ZsYXNoX25vdGlmeShkbCwgXCYjMzQ7RXJhc2luZyBmbGFzaFwmIzM0OywgMCwgMCk7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsXG4mIzQzO1x0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRnb3RvIHdyaXRlX2VycjtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTVhMODYyWFhfRldfSERSX1NJWkUgLyAyOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0d29yZCA9IGZ3LVx1MDAzZWRhdGFbaSAqIDJdIHxcbiYjNDM7XHRcdCAgICAgICAoKHUxNilmdy1cdTAwM2VkYXRhW2kgKiAyICYjNDM7IDFdIFx1MDAzY1x1MDAzYyA4KTtcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCB3b3JkKTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGdvdG8gd3JpdGVfZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuJiM0MztcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRnb3RvIHdyaXRlX2VycjtcbiYjNDM7XG4mIzQzO1x0LyogdGhlIGJ5dGUgY291bnQgaW4gU1RBVCB0cmlnZ2VycyB0aGUgZXJhc2UgKi9cbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcbiYjNDM7XHRcdFx0XHQgICBNWEw4NjJYWF9GV19IRFJfU0laRSk7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdGdvdG8gd3JpdGVfZXJyO1xuJiM0MztcbiYjNDM7XHQvKiBBQ0sgaXMgYnl0ZSBjb3VudCAmIzQzOyAxICovXG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCBNWEw4NjJYWF9GV19IRFJfU0laRSAmIzQzOyAxLFxuJiM0MztcdFx0XHRcdFx0TVhMODYyWFhfRldfQUNLX1RJTUVPVVRfTVMpO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdGRldl9lcnIoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldixcbiYjNDM7XHRcdFx0XCYjMzQ7Zmxhc2g6IGhlYWRlciBBQ0sgZmFpbGVkOiAlcGVcXG5cJiMzNDssIEVSUl9QVFIocmV0KSk7XG4mIzQzO1x0XHRnb3RvIG5vX2VuZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFN0ZXAgNTogd2FpdCBmb3IgZXJhc2UgdG8gY29tcGxldGUgKi9cbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIDAsXG4mIzQzO1x0XHRcdFx0XHRNWEw4NjJYWF9GV19FUkFTRV9USU1FT1VUX01TKTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdFwmIzM0O2ZsYXNoOiBlcmFzZSB0aW1lb3V0OiAlcGVcXG5cJiMzNDssIEVSUl9QVFIocmV0KSk7XG4mIzQzO1x0XHRnb3RvIG5vX2VuZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFN0ZXAgNjogdHJhbnNmZXIgcGF5bG9hZCAqL1xuJiM0MztcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0Z290byB3cml0ZV9lcnI7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChpZHggXHUwMDNjIHBheWxvYWRfc2l6ZSkge1xuJiM0MztcdFx0Y29uZF9yZXNjaGVkKCk7XG4mIzQzO1x0XHRpZiAoaWR4ICYjNDM7IDEgXHUwMDNjIHBheWxvYWRfc2l6ZSkge1xuJiM0MztcdFx0XHRmZGF0YSA9IHBheWxvYWRbaWR4XSB8XG4mIzQzO1x0XHRcdFx0KCh1MTYpcGF5bG9hZFtpZHggJiM0MzsgMV0gXHUwMDNjXHUwMDNjIDgpO1xuJiM0MztcdFx0XHRpZHggJiM0Mzs9IDI7XG4mIzQzO1x0XHRcdGRhdGFfd3JpdHRlbiAmIzQzOz0gMjtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdGZkYXRhID0gcGF5bG9hZFtpZHhdO1xuJiM0MztcdFx0XHRpZHgmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRkYXRhX3dyaXR0ZW4mIzQzOyYjNDM7O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCBmZGF0YSk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIHdyaXRlX2VycjtcbiYjNDM7XHRcdHdvcmRfaWR4JiM0MzsmIzQzOztcbiYjNDM7XG4mIzQzO1x0XHRpZiAoaWR4IFx1MDAzZT0gcGF5bG9hZF9zaXplKSB7XG4mIzQzO1x0XHRcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9mbHVzaF9sYXN0KHByaXYsIGRhdGFfd3JpdHRlbik7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIEhhbGYtYmFuayBib3VuZGFyeTogc3dpdGNoIHRvIFNCMSBhZGRyZXNzICovXG4mIzQzO1x0XHRpZiAod29yZF9pZHggPT0gTVhMODYyWFhfRldfQkFOS19IQUxGKSB7XG4mIzQzO1x0XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpO1xuJiM0MztcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRcdGdvdG8gd3JpdGVfZXJyO1xuJiM0MztcbiYjNDM7XHRcdFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsXG4mIzQzO1x0XHRcdFx0XHRcdCAgIE1YTDg2MlhYX0ZXX1NCMV9BRERSKTtcbiYjNDM7XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0XHRnb3RvIHdyaXRlX2VycjtcbiYjNDM7XG4mIzQzO1x0XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XG4mIzQzO1x0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdFx0Z290byB3cml0ZV9lcnI7XG4mIzQzO1x0XHR9IGVsc2UgaWYgKHdvcmRfaWR4IFx1MDAzZT0gTVhMODYyWFhfRldfQkFOS19TTElDRSkge1xuJiM0MztcdFx0XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2UocHJpdiwgZGF0YV93cml0dGVuKTtcbiYjNDM7XHRcdFx0aWYgKHJldCkge1xuJiM0MztcdFx0XHRcdGRldl9lcnIoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldixcbiYjNDM7XHRcdFx0XHRcdFwmIzM0O2ZsYXNoOiB3cml0ZSB0aW1lb3V0IGF0ICV1LyV1OiAlcGVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHRpZHgsIHBheWxvYWRfc2l6ZSwgRVJSX1BUUihyZXQpKTtcbiYjNDM7XHRcdFx0XHRnb3RvIG5vX2VuZDtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHR3b3JkX2lkeCA9IDA7XG4mIzQzO1x0XHRcdGRhdGFfd3JpdHRlbiA9IDA7XG4mIzQzO1x0XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuJiM0MztcdFx0XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XG4mIzQzO1x0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdFx0Z290byB3cml0ZV9lcnI7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAodGltZV9hZnRlcihqaWZmaWVzLCBuZXh0X25vdGlmeSkpIHtcbiYjNDM7XHRcdFx0XHRteGw4NjJ4eF9mbGFzaF9ub3RpZnkoZGwsIFwmIzM0O0ZsYXNoaW5nXCYjMzQ7LCBpZHgsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIHBheWxvYWRfc2l6ZSk7XG4mIzQzO1x0XHRcdFx0bmV4dF9ub3RpZnkgPSBqaWZmaWVzICYjNDM7IG1zZWNzX3RvX2ppZmZpZXMoNTAwKTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcJiMzNDtmbGFzaDogZmluYWwgc2xpY2UgZmFpbGVkOiAlcGVcXG5cJiMzNDssIEVSUl9QVFIocmV0KSk7XG4mIzQzO1x0XHRnb3RvIG5vX2VuZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG14bDg2Mnh4X2ZsYXNoX25vdGlmeShkbCwgXCYjMzQ7Rmxhc2hpbmdcJiMzNDssIHBheWxvYWRfc2l6ZSwgcGF5bG9hZF9zaXplKTtcbiYjNDM7XG4mIzQzO1x0LyogU3VjY2VzczogdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgcmVjZWl2ZSBsb29wIGF0IHJfcmVtYWluID09IDAgYW5kXG4mIzQzO1x0ICogdmVyaWZpZWQgdGhlIGltYWdlLCBzbyBFTkQoMHgzY2MzKSBpcyBhIGZpbmFsaXNlL2Jvb3QgcmVxdWVzdCByYXRoZXJcbiYjNDM7XHQgKiB0aGFuIGEgYnl0ZSBjb3VudC4gU2lnbmFsIGl0IGhlcmUgLS0gYW5kIG9ubHkgaGVyZSAtLSB0byBib290IHRoZSBuZXdcbiYjNDM7XHQgKiBpbWFnZSB3aXRob3V0IHdhaXRpbmcgb3V0IHRoZSBsb2FkZXImIzM5O3MgMiBzIEVORCB0aW1lb3V0LlxuJiM0MztcdCAqL1xuJiM0MztcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULFxuJiM0MztcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9FTkQpO1xuJiM0MztcdG1zbGVlcChNWEw4NjJYWF9GV19SRUJPT1RfREVMQVlfTVMpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0Mzt3cml0ZV9lcnI6XG4mIzQzO1x0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LCBcJiMzNDtmbGFzaDogU01ESU8gd3JpdGUgZmFpbGVkOiAlcGVcXG5cJiMzNDssXG4mIzQzO1x0XHRFUlJfUFRSKHJldCkpO1xuJiM0Mztub19lbmQ6XG4mIzQzO1x0LyogQSBmYWlsdXJlIGxlYXZlcyB0aGUgbG9hZGVyIG1pZCB0cmFuc2ZlcjsgZG8gbm90IHNpZ25hbCBFTkQgKGEgU1RBVFxuJiM0MztcdCAqIHdyaXRlIGlzIGEgYnl0ZSBjb3VudCB0aGVuLCBhbmQgRU5EIHdvdWxkIGJlIG1pc3JlYWQgYXMgb25lLCByaXNraW5nXG4mIzQzO1x0ICogYSByZWNlaXZlLWNvdW50ZXIgdW5kZXJmbG93KS4gUmV0dXJuIHRoZSBlcnJvcjsgdGhlIGNhbGxlciByZXByb2Jlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgbXhsODYyeHhfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsXG4mIzQzO1x0XHRcdCAgICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsXG4mIzQzO1x0XHRcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID0gZHMtXHUwMDNlcHJpdjtcbiYjNDM7XHRjaGFyIGJ1ZlsxNl07XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0LyogTm8gY2hpcC1pZC9yZXZpc2lvbiBpbiBNQ1Vib290IChuZWVkcyB0aGUgZmlybXdhcmUgTU1EIG1haWxib3gpLiBUaGVcbiYjNDM7XHQgKiBmdyB2ZXJzaW9uIGRvdWJsZXMgYXMgdGhlIFwmIzM0O3JlYWR5IHRvIGZsYXNoXCYjMzQ7IHNpZ25hbDogcmVwb3J0IGl0IG9ubHlcbiYjNDM7XHQgKiBvbmNlIHRoZSBsb2FkZXIgaXMgYXQgYSBjbGVhbiBSRUFEWSwgbm90aGluZyB3aGlsZSBzdGlsbCBkcmFpbmluZy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSkge1xuJiM0MztcdFx0aWYgKCFSRUFEX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHkpKVxuJiM0MztcdFx0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0XHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcJiMzNDsldS4ldS4ldVwmIzM0OyxcbiYjNDM7XHRcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5tYWpvciwgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yLFxuJiM0MztcdFx0XHQgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uKTtcbiYjNDM7XHRcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX3J1bm5pbmdfcHV0KHJlcSxcbiYjNDM7XHRcdFx0XHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdHJldHVybiBkZXZsaW5rX2luZm9fdmVyc2lvbl9zdG9yZWRfcHV0KHJlcSxcbiYjNDM7XHRcdFx0XHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogQSAwIHBhcnQgbnVtYmVyIG1lYW5zIHRoZSBDSElQIElEIHJlYWQgZmFpbGVkIG9yIHRoZSBwYXJ0IGlzXG4mIzQzO1x0ICogdW5mdXNlZDsgb21pdCBpdCByYXRoZXIgdGhhbiBwdWJsaXNoIGEgYm9ndXMgXCYjMzQ7MDAwMFwmIzM0OyB0aGF0IGZ3dXBkXG4mIzQzO1x0ICogd291bGQgbWF0Y2ggZmlybXdhcmUgYWdhaW5zdCAtLSBpdCB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlIGRyaXZlclxuJiM0MztcdCAqIG5hbWUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHByaXYtXHUwMDNlYXNpY19pZCkge1xuJiM0MztcdFx0c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgXCYjMzQ7JTA0WFwmIzM0OywgcHJpdi1cdTAwM2Vhc2ljX2lkKTtcbiYjNDM7XHRcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19BU0lDX0lELFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIGJ1Zik7XG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwmIzM0OyV1XCYjMzQ7LCBwcml2LVx1MDAzZWFzaWNfcmV2KTtcbiYjNDM7XHRcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19BU0lDX1JFVixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBidWYpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEFuIGFsbC16ZXJvIHZlcnNpb24gaXMgdGhlIGNhY2hlIGEgZmFpbGVkIGZsYXNoIGxlZnQgYmVoaW5kLCBub3QgYVxuJiM0MztcdCAqIHJlbGVhc2VkIGZpcm13YXJlOyBvbWl0IGl0IGxpa2UgdGhlIHBhcnQgbnVtYmVyIGFib3ZlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1ham9yIFx1MDAyNlx1MDAyNiAhcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhcHJpdi1cdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwmIzM0OyV1LiV1LiV1XCYjMzQ7LFxuJiM0MztcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5tYWpvciwgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yLFxuJiM0MztcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbik7XG4mIzQzO1xuJiM0MztcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX3J1bm5pbmdfcHV0KHJlcSxcbiYjNDM7XHRcdFx0REVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19GVywgYnVmKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0LyogYm9vdHMgdGhpcyBpbWFnZSBmcm9tIGl0cyBvd24gZmxhc2g6IHN0b3JlZCA9PSBydW5uaW5nICovXG4mIzQzO1x0cmV0dXJuIGRldmxpbmtfaW5mb192ZXJzaW9uX3N0b3JlZF9wdXQocmVxLFxuJiM0MztcdFx0XHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuJiM0MztcdFx0XHRcdCAgc3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLFxuJiM0MztcdFx0XHRcdCAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cdTAwM2Vwcml2O1xuJiM0MztcdHN0cnVjdCBkc2FfcG9ydCAqZHA7XG4mIzQzO1x0dTMyIHBheWxvYWRfc2l6ZTtcbiYjNDM7XHRpbnQgcmV0LCBlcnIsIGk7XG4mIzQzO1xuJiM0MztcdGlmIChwYXJhbXMtXHUwMDNlY29tcG9uZW50KSB7XG4mIzQzO1x0XHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcJiMzNDtjb21wb25lbnQgaXMgbm90IHN1cHBvcnRlZFwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBBIHByZXZpb3VzIGZsYXNoIGlzIHN0aWxsIHdhaXRpbmcgZm9yIGl0cyByZXByb2JlOiB0aGUgZmlybXdhcmUgQVBJXG4mIzQzO1x0ICogaXMgc2hvcnQtY2lyY3VpdGVkLCBzbyB0aGUgcmF3IFNCIFBESSB3cml0ZXMgYmVsb3cgd291bGQgcnVuIGFnYWluc3RcbiYjNDM7XHQgKiBhIHN3aXRjaCB0aGlzIGRyaXZlciBubyBsb25nZXIgdHJhY2tzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChwcml2LVx1MDAzZXNraXBfdGVhcmRvd24pIHtcbiYjNDM7XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXG4mIzQzO1x0XHRcdFx0ICAgXCYjMzQ7ZGV2aWNlIGlzIHJlaW5pdGlhbGl6aW5nLCByZXRyeSBsYXRlclwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gbXhsODYyeHhfZmxhc2hfdmFsaWRhdGUocHJpdiwgcGFyYW1zLVx1MDAzZWZ3LCBcdTAwMjZwYXlsb2FkX3NpemUpO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwmIzM0O2Zpcm13YXJlIGltYWdlIHZhbGlkYXRpb24gZmFpbGVkXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBSZWZ1c2UgdG8gZmxhc2ggd2hpbGUgdGhlIGJhY2tncm91bmQgc2VsZi1oZWFsIGlzIHN0aWxsIGRyYWluaW5nLCBhbmRcbiYjNDM7XHQgKiBmb3IgZ29vZCBvbmNlIGl0IGhhcyBnaXZlbiB1cCBvbiB0aGUgbG9hZGVyLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChSRUFEX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfZmFpbGVkKSkge1xuJiM0MztcdFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjayxcbiYjNDM7XHRcdFx0XHQgICBcJiMzNDtkb3dubG9hZCByZWNvdmVyeSBmYWlsZWQsIHBvd2VyIGN5Y2xlIHRoZSBzd2l0Y2hcJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FSU87XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSBcdTAwMjZcdTAwMjYgIVJFQURfT05DRShwcml2LVx1MDAzZXJlc2N1ZV9yZWFkeSkpIHtcbiYjNDM7XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXG4mIzQzO1x0XHRcdFx0ICAgXCYjMzQ7c3dpdGNoIGlzIHJlY292ZXJpbmcgYW4gaW50ZXJydXB0ZWQgZG93bmxvYWQsIHJldHJ5IHNob3J0bHlcJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKVxuJiM0MztcdFx0ZGV2X2luZm8oZHMtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHQgXCYjMzQ7Zmxhc2g6IGZsYXNoaW5nIHN3aXRjaCB2aWEgTUNVYm9vdCByZXNjdWUgbW9kZVxcblwmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZGV2X2luZm8oZHMtXHUwMDNlZGV2LCBcJiMzNDtmbGFzaDogcnVubmluZyBmaXJtd2FyZSAldS4ldS4ldVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5tYWpvciwgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yLFxuJiM0MztcdFx0XHQgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uKTtcbiYjNDM7XG4mIzQzO1x0LyogQ2xvc2UgcG9ydHMgd2hpbGUgdGhlIGZpcm13YXJlIGlzIHN0aWxsIGFsaXZlIHNvIHRoZSBEU0EgY29yZSYjMzk7c1xuJiM0MztcdCAqIE1EQi9GREIgdHJhY2tpbmcgaXMgZHJhaW5lZCwgYW5kIGRldGFjaCB1c2VyIHBvcnRzIHNvIHVzZXJzcGFjZVxuJiM0MztcdCAqIGNhbm5vdCByZW9wZW4gdGhlbSBkdXJpbmcgdGhlIGZsYXNoLiBUaGUgY29uZHVpdCBpcyBvbmx5IGNsb3NlZCxcbiYjNDM7XHQgKiBub3QgZGV0YWNoZWQ6IGl0IGJlbG9uZ3MgdG8gdGhlIE1BQyBkcml2ZXIuIFRoaXMgZHJpdmVyIGJpbmRzIGFcbiYjNDM7XHQgKiBzaW5nbGUgc3dpdGNoIHdpdGggYSBkaXJlY3QgaG9zdCBsaW5rIGFuZCBubyBjYXNjYWRlIHBvcnRzLCBzbyB0aGVcbiYjNDM7XHQgKiBjb25kdWl0IHNlcnZlcyBvbmx5IHRoaXMgc3dpdGNoLCBhbmQgZmxhc2hpbmcgaXQgcmVib290cyB0aGUgc3dpdGNoLFxuJiM0MztcdCAqIHdoaWNoIHRha2VzIHRoZSB0cmVlIGRvd24gcmVnYXJkbGVzcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRydG5sX2xvY2soKTtcbiYjNDM7XHRkc2Ffc3dpdGNoX2Zvcl9lYWNoX3VzZXJfcG9ydChkcCwgZHMpIHtcbiYjNDM7XHRcdGlmIChkcC1cdTAwM2V1c2VyKSB7XG4mIzQzO1x0XHRcdGRldl9jbG9zZShkcC1cdTAwM2V1c2VyKTtcbiYjNDM7XHRcdFx0bmV0aWZfZGV2aWNlX2RldGFjaChkcC1cdTAwM2V1c2VyKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0ZHNhX3N3aXRjaF9mb3JfZWFjaF9jcHVfcG9ydChkcCwgZHMpXG4mIzQzO1x0XHRkZXZfY2xvc2UoZHAtXHUwMDNlY29uZHVpdCk7XG4mIzQzO1x0LyogVGhlIGJyaWRnZSBkZWZlcnMgdGhlIFNUUCBzdGF0ZSBjaGFuZ2VzIHRyaWdnZXJlZCBieSBjbG9zaW5nXG4mIzQzO1x0ICogdGhlIHBvcnRzOyBsZXQgdGhlbSByZWFjaCB0aGUgZmlybXdhcmUgd2hpbGUgaXQgaXMgc3RpbGwgYWxpdmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0c3dpdGNoZGV2X2RlZmVycmVkX3Byb2Nlc3MoKTtcbiYjNDM7XHRydG5sX3VubG9jaygpO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrX25lc3RlZChcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzLVx1MDAzZW1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpO1xuJiM0MztcdHByaXYtXHUwMDNlYmxvY2tfaG9zdCA9IHRydWU7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrKTtcbiYjNDM7XG4mIzQzO1x0c2V0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgXHUwMDI2cHJpdi1cdTAwM2VmbGFncyk7XG4mIzQzO1x0Y2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKFx1MDAyNnByaXYtXHUwMDNlc3RhdHNfd29yayk7XG4mIzQzO1x0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZwcml2LVx1MDAzZWNyY19lcnJfd29yayk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgZHMtXHUwMDNlbnVtX3BvcnRzOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGNhbmNlbF93b3JrX3N5bmMoXHUwMDI2cHJpdi1cdTAwM2Vwb3J0c1tpXS5ob3N0X2Zsb29kX3dvcmspO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBteGw4NjJ4eF9mbGFzaF9maXJtd2FyZShwcml2LCBwYXJhbXMtXHUwMDNlZncsIHBheWxvYWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHQgICAgICBkcy1cdTAwM2VkZXZsaW5rKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgXCYjMzQ7ZmlybXdhcmUgdHJhbnNmZXIgZmFpbGVkXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFyZXQpIHtcbiYjNDM7XHRcdG11dGV4X2xvY2tfbmVzdGVkKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrLFxuJiM0MztcdFx0XHRcdCAgTURJT19NVVRFWF9ORVNURUQpO1xuJiM0MztcdFx0cHJpdi1cdTAwM2VibG9ja19ob3N0ID0gZmFsc2U7XG4mIzQzO1x0XHRwcml2LVx1MDAzZXJlc2N1ZV9tb2RlID0gZmFsc2U7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWJ1cy1cdTAwM2VtZGlvX2xvY2spO1xuJiM0MztcbiYjNDM7XHRcdC8qIFJlZnJlc2ggdGhlIGNhY2hlZCB2ZXJzaW9ucyBzbyB0aGUgZmxhc2ggdXBkYXRlIG9ubHlcbiYjNDM7XHRcdCAqIGNvbXBsZXRlcyBvbmNlIHRoZSBuZXcgZmlybXdhcmUgaXMgY29uZmlybWVkIHJ1bm5pbmcgYW5kXG4mIzQzO1x0XHQgKiBkZXZsaW5rIGRldiBpbmZvIHJlcG9ydHMgaXQuIE11c3QgaGFwcGVuIGJlZm9yZSBzZXR0aW5nXG4mIzQzO1x0XHQgKiBza2lwX3RlYXJkb3duLCB3aGljaCBkaXNjYXJkcyBhbGwgZmlybXdhcmUgQVBJIHJlYWRzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXG4mIzQzO1x0XHRcdFx0XHQgICBcJiMzNDtuZXcgZmlybXdhcmUgZGlkIG5vdCBiZWNvbWUgcmVhZHlcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHJldCkge1xuJiM0MztcdFx0LyogVGhlIHN3aXRjaCBpcyBpbiBNQ1Vib290IHdpdGggZXJhc2VkIG9yIHBhcnRseSB3cml0dGVuIGZsYXNoO1xuJiM0MztcdFx0ICogZHJvcCB0aGUgY2FjaGVkIGlkZW50aXR5IHNvIGRldmxpbmsgZGV2IGluZm8gc3RvcHMgcmVwb3J0aW5nXG4mIzQzO1x0XHQgKiB0aGUgcHJlLWZsYXNoIHZlcnNpb24gdW50aWwgdGhlIHJlcHJvYmUgcmUtcmVhZHMgdGhlIHRydXRoLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRtZW1zZXQoXHUwMDI2cHJpdi1cdTAwM2Vmd192ZXJzaW9uLCAwLCBzaXplb2YocHJpdi1cdTAwM2Vmd192ZXJzaW9uKSk7XG4mIzQzO1x0XHRwcml2LVx1MDAzZWFzaWNfaWQgPSAwO1xuJiM0MztcdFx0cHJpdi1cdTAwM2Vhc2ljX3JldiA9IDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrX25lc3RlZChcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzLVx1MDAzZW1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpO1xuJiM0MztcdHByaXYtXHUwMDNlc2tpcF90ZWFyZG93biA9IHRydWU7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrKTtcbiYjNDM7XG4mIzQzO1x0LyogUmVpbml0aWFsaXNlIHRocm91Z2ggYSBkZWZlcnJlZCByZS1wcm9iZTogcmVtb3ZlKCkgcnVucyB3aXRoXG4mIzQzO1x0ICogc2tpcF90ZWFyZG93biBzZXQsIHRoZW4gYSBmcmVzaCBwcm9iZSgpIHN0YXJ0cyBhZ2FpbnN0IHdoYXRldmVyXG4mIzQzO1x0ICogdGhlIHN3aXRjaCBub3cgcnVucy4gVGhlIGNvcmUgc2tpcHMgdGhlIHJlLXByb2JlIGlmIHRoZSBkZXZpY2VcbiYjNDM7XHQgKiBpcyB1bmJvdW5kIG9yIHNodXQgZG93biBiZWZvcmUgaXQgZmlyZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0ZXJyID0gZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZHMtXHUwMDNlZGV2LCBNWEw4NjJYWF9GV19SRVBST0JFX0RFTEFZX01TKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldCA/IHJldCA6IGVycjtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3Lmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43Y2Q4N2M3YWQ4NzE2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuaFxuQEAgLTAsMCAmIzQzOzEsMjAgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19NWEw4NjJYWF9GV19IXG4mIzQzOyNkZWZpbmUgX19NWEw4NjJYWF9GV19IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NuZXQvZHNhLmhcdTAwM2VcbiYjNDM7XG4mIzQzO3N0cnVjdCBteGw4NjJ4eF9wcml2O1xuJiM0MztzdHJ1Y3Qgd29ya19zdHJ1Y3Q7XG4mIzQzO1xuJiM0MztpbnQgbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KTtcbiYjNDM7dm9pZCBteGw4NjJ4eF9yZXNjdWVfaGVhbF93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7XG4mIzQzO2ludCBteGw4NjJ4eF9kZXZsaW5rX2luZm9fZ2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcbiYjNDM7XHRcdFx0ICAgICAgc3RydWN0IGRldmxpbmtfaW5mb19yZXEgKnJlcSxcbiYjNDM7XHRcdFx0ICAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKTtcbiYjNDM7aW50IG14bDg2Mnh4X2RldmxpbmtfZmxhc2hfdXBkYXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcbiYjNDM7XHRcdFx0XHQgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4mIzQzO1xuJiM0MzsjZW5kaWYgLyogX19NWEw4NjJYWF9GV19IICovXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuYyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmNcbmluZGV4IDRhY2QyMTZmN2NjMDAuLjRkZjdjODM4MDhmNjAgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jXG5AQCAtMTUsNiAmIzQzOzE1LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91bmFsaWduZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9kc2EuaFx1MDAzZVxuICNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bXhsODYyeHgtY21kLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7bXhsODYyeHgtZncuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LWhvc3QuaFwmIzM0O1xuIFxuICNkZWZpbmUgQ1RSTF9CVVNZX01BU0tcdFx0XHRCSVQoMTUpXG5AQCAtMzQwLDYgJiM0MzszNDIsMjEgQEAgaW50IG14bDg2Mnh4X2FwaV93cmFwKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MTYgY21kLCB2b2lkICpfZGF0YSxcbiBcbiBcdG11dGV4X2xvY2tfbmVzdGVkKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7XG4gXG4mIzQzO1x0aWYgKHByaXYtXHUwMDNlc2tpcF90ZWFyZG93bikge1xuJiM0MztcdFx0cmV0ID0gcmVhZCA/IC1FTk9ERVYgOiAwO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSkge1xuJiM0MztcdFx0cmV0ID0gLUVOT0RFVjtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHByaXYtXHUwMDNlYmxvY2tfaG9zdCBcdTAwMjZcdTAwMjYgY21kICE9IFNZU19NSVNDX0ZXX1VQREFURSkge1xuJiM0MztcdFx0cmV0ID0gLUVCVVNZO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiBcdG1heCA9IChzaXplICYjNDM7IDEpIC8gMjtcbiBcbiBcdHJldCA9IG14bDg2Mnh4X2J1c3lfd2FpdChwcml2KTtcbkBAIC00OTUsMTIgJiM0Mzs1MTIsNTQgQEAgaW50IG14bDg2Mnh4X3Jlc2V0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU01ESU9fQUREUl9SRUdcdFx0MHgxZlxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTS1x0MHhmZmYwXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfU01ESU9fT0ZGX01BU0tcdFx0MHgwMDBmXG4mIzQzO1xuJiM0MzsvKiBQYWdlZCBjbGF1c2UtMjIgd2luZG93OiB0aGUgcGFnZSBnb2VzIGludG8gTUlJIHJlZ2lzdGVyIDB4MWYsIHRoZSBsb3cgbmliYmxlXG4mIzQzOyAqIG9mIGFkZHIgc2VsZWN0cyBvbmUgb2YgdGhlIDE2IHJlZ2lzdGVycyB3aXRoaW4gaXQuIEJvdGggaGVscGVycyB0YWtlIHRoZSBNRElPXG4mIzQzOyAqIGJ1cyBsb2NrIHBlciB0cmFuc2FjdGlvbiwgc28gY2FsbGVycyBtdXN0IG5vdCBhbHJlYWR5IGhvbGQgaXQgLS0gdW5saWtlXG4mIzQzOyAqIG14bDg2Mnh4X2FwaV93cmFwKCksIHdoaWNoIGhvbGRzIGl0IGFjcm9zcyBhIHdob2xlIGZpcm13YXJlIGNvbW1hbmQuXG4mIzQzOyAqL1xuJiM0MztpbnQgbXhsODYyeHhfc21kaW9fcmVhZChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGFkZHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWlpX2J1cyAqYnVzID0gcHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWJ1cztcbiYjNDM7XHRpbnQgcGh5ID0gcHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWFkZHI7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZidXMtXHUwMDNlbWRpb19sb2NrKTtcbiYjNDM7XHRyZXQgPSBfX21kaW9idXNfd3JpdGUoYnVzLCBwaHksIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHLFxuJiM0MztcdFx0XHQgICAgICBhZGRyIFx1MDAyNiBNWEw4NjJYWF9TTURJT19QQUdFX01BU0spO1xuJiM0MztcdGlmIChyZXQgXHUwMDNlPSAwKVxuJiM0MztcdFx0cmV0ID0gX19tZGlvYnVzX3JlYWQoYnVzLCBwaHksIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX09GRl9NQVNLKTtcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2YnVzLVx1MDAzZW1kaW9fbG9jayk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgYWRkciwgdTE2IHZhbClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtaWlfYnVzICpidXMgPSBwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzO1xuJiM0MztcdGludCBwaHkgPSBwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYWRkcjtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNmJ1cy1cdTAwM2VtZGlvX2xvY2spO1xuJiM0MztcdHJldCA9IF9fbWRpb2J1c193cml0ZShidXMsIHBoeSwgTVhMODYyWFhfU01ESU9fQUREUl9SRUcsXG4mIzQzO1x0XHRcdCAgICAgIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTSyk7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2U9IDApXG4mIzQzO1x0XHRyZXQgPSBfX21kaW9idXNfd3JpdGUoYnVzLCBwaHksIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX09GRl9NQVNLLFxuJiM0MztcdFx0XHRcdCAgICAgIHZhbCk7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNmJ1cy1cdTAwM2VtZGlvX2xvY2spO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4gdm9pZCBteGw4NjJ4eF9ob3N0X2luaXQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4ge1xuIFx0SU5JVF9XT1JLKFx1MDAyNnByaXYtXHUwMDNlY3JjX2Vycl93b3JrLCBteGw4NjJ4eF9jcmNfZXJyX3dvcmtfZm4pO1xuJiM0MztcdElOSVRfV09SSyhcdTAwMjZwcml2LVx1MDAzZXJlc2N1ZV9oZWFsX3dvcmssIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4pO1xuIH1cbiBcbiB2b2lkIG14bDg2Mnh4X2hvc3Rfc2h1dGRvd24oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4ge1xuIFx0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZwcml2LVx1MDAzZWNyY19lcnJfd29yayk7XG4mIzQzO1x0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZwcml2LVx1MDAzZXJlc2N1ZV9oZWFsX3dvcmspO1xuIH1cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaFxuaW5kZXggNjZkNmFlMTk4YWZmNC4uNGUwNTRjNmU0YzBlNCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmhcbkBAIC0xOCw1ICYjNDM7MTgsNyBAQCBpbnQgbXhsODYyeHhfYXBpX3dyYXAoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUxNiBjbWQsIHZvaWQgKmRhdGEsIHUxNiBzaXplLFxuIFx0bXhsODYyeHhfYXBpX3dyYXAoZGV2LCBjbWQsIFx1MDAyNihkYXRhKSwgc2l6ZW9mKChkYXRhKSksIHRydWUsIHRydWUpXG4gXG4gaW50IG14bDg2Mnh4X3Jlc2V0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KTtcbiYjNDM7aW50IG14bDg2Mnh4X3NtZGlvX3JlYWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyKTtcbiYjNDM7aW50IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgYWRkciwgdTE2IHZhbCk7XG4gXG4gI2VuZGlmIC8qIF9fTVhMODYyWFhfSE9TVF9IICovXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LXBoeWxpbmsuYyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1waHlsaW5rLmNcbmluZGV4IGI2ODk2NTJhYTliOTIuLmE1YjY5NDBiNTUyZTkgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jXG5AQCAtNDA2LDYgJiM0Mzs0MDYsOCBAQCBteGw4NjJ4eF9waHlsaW5rX21hY19zZWxlY3RfcGNzKHN0cnVjdCBwaHlsaW5rX2NvbmZpZyAqY29uZmlnLFxuIFxuIFx0c3dpdGNoIChwb3J0KSB7XG4gXHRjYXNlIDkgLi4uIDE2OlxuJiM0MztcdFx0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpXG4mIzQzO1x0XHRcdHJldHVybiBOVUxMO1xuIFx0XHRpZiAoIU1YTDg2MlhYX0ZXX1ZFUl9NSU4ocHJpdiwgMSwgMCwgODQpKSB7XG4gXHRcdFx0ZGV2X3dhcm5fb25jZShkcC1cdTAwM2Vkcy1cdTAwM2VkZXYsXG4gXHRcdFx0XHQgICAgICBcJiMzNDtTZXJEZXMgUENTIHVuc3VwcG9ydGVkIG9uIG9sZCBmaXJtd2FyZS5cXG5cJiMzNDspO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmNcbmluZGV4IDQ1ZDIzN2IzYTQwZjEuLjBlMTc5Y2FlOTdmMzggMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmNcbkBAIC0yMSw2ICYjNDM7MjEsNyBAQFxuICNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1hcGkuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LWNtZC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O214bDg2Mnh4LWZ3LmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1ob3N0LmhcJiMzNDtcbiAjaW5jbHVkZSBcJiMzNDtteGw4NjJ4eC1waHlsaW5rLmhcJiMzNDtcbiBcbkBAIC03MSw2ICYjNDM7NzIsMTMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX3Jtb25faGlzdF9yYW5nZSBteGw4NjJ4eF9ybW9uX3Jhbmdlc1tdID0ge1xuICNkZWZpbmUgTVhMODYyWFhfUkVBRFlfVElNRU9VVF9NU1x0MTAwMDBcbiAjZGVmaW5lIE1YTDg2MlhYX1JFQURZX1BPTExfTVNcdFx0MTAwXG4gXG4mIzQzOy8qIENoaXAgSUQgcmVnaXN0ZXJzLCByZWFkIHZpYSBTWVNfTUlTQ19SRUdfUkQgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9DSElQSURfTFx0XHQweGMwZDI4ODg0XG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01cdFx0MHhjMGQyODg4OFxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0NISVBJRF9MX1BOVU1MXHRcdEdFTk1BU0soMTUsIDEyKVxuJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0NISVBJRF9NX1BOVU1NXHRcdEdFTk1BU0soMTEsIDApXG4mIzQzOyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01fVkVSU0lPTlx0R0VOTUFTSygxNCwgMTIpXG4mIzQzO1xuICNkZWZpbmUgTVhMODYyWFhfVENNX0lOU1RfU0VMXHRcdDB4ZTAwXG4gI2RlZmluZSBNWEw4NjJYWF9UQ01fQ0JTXHRcdDB4ZTEyXG4gI2RlZmluZSBNWEw4NjJYWF9UQ01fRUJTXHRcdDB4ZTEzXG5AQCAtMjIyLDcgJiM0MzsyMzAsNDYgQEAgc3RhdGljIGludCBteGw4NjJ4eF9waHlfd3JpdGVfYzQ1X21paV9idXMoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IGFkZHIsXG4gXHRyZXR1cm4gbXhsODYyeHhfcGh5X3dyaXRlX21tZChidXMtXHUwMDNlcHJpdiwgYWRkciwgZGV2YWRkLCByZWdudW0sIHZhbCk7XG4gfVxuIFxuLXN0YXRpYyBpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpXG4mIzQzOy8qIFJlYWQgdGhlIHN0YXRpYyBjaGlwIHBhcnQgbnVtYmVyIGFuZCB2ZXJzaW9uIGZyb20gdGhlIENISVAgSURcbiYjNDM7ICogcmVnaXN0ZXJzLiBPbmx5IHBvc3NpYmxlIHdpdGggYSBydW5uaW5nIGZpcm13YXJlLCBzbyB0aGUgdmFsdWVzIGFyZVxuJiM0MzsgKiBjYWNoZWQgYXQgc2V0dXAgYW5kIGxlZnQgemVybyB3aGVuIHRoZSBzd2l0Y2ggaXMgaW4gcmVzY3VlIG1vZGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IG14bDg2Mnh4X3JlYWRfY2hpcF9pZChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBteGw4NjJ4eF9zeXNfcmVnX3J3IHJlZyA9IHt9O1xuJiM0MztcdHUxNiBjaGlwaWRfbCwgY2hpcGlkX207XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cmVnLmFkZHIgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9DSElQSURfTCk7XG4mIzQzO1x0cmV0ID0gTVhMODYyWFhfQVBJX1JFQUQocHJpdiwgU1lTX01JU0NfUkVHX1JELCByZWcpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcdGNoaXBpZF9sID0gbGUzMl90b19jcHUocmVnLnZhbCk7XG4mIzQzO1xuJiM0MztcdHJlZy5hZGRyID0gY3B1X3RvX2xlMzIoTVhMODYyWFhfQ0hJUElEX00pO1xuJiM0MztcdHJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIFNZU19NSVNDX1JFR19SRCwgcmVnKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRjaGlwaWRfbSA9IGxlMzJfdG9fY3B1KHJlZy52YWwpO1xuJiM0MztcbiYjNDM7XHRwcml2LVx1MDAzZWFzaWNfaWQgPSBGSUVMRF9HRVQoTVhMODYyWFhfQ0hJUElEX0xfUE5VTUwsIGNoaXBpZF9sKSB8XG4mIzQzO1x0XHRcdEZJRUxEX0dFVChNWEw4NjJYWF9DSElQSURfTV9QTlVNTSwgY2hpcGlkX20pIFx1MDAzY1x1MDAzYyA0O1xuJiM0MztcdHByaXYtXHUwMDNlYXNpY19yZXYgPSBGSUVMRF9HRVQoTVhMODYyWFhfQ0hJUElEX01fVkVSU0lPTiwgY2hpcGlkX20pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIG14bDg2Mnh4X3dhaXRfcmVhZHkgLSB3YWl0IGZvciB0aGUgc3dpdGNoIGZpcm13YXJlIHRvIGJlY29tZSBvcGVyYXRpb25hbFxuJiM0MzsgKiBAZHM6IERTQSBzd2l0Y2ggaW5zdGFuY2VcbiYjNDM7ICpcbiYjNDM7ICogUG9sbCB0aGUgZmlybXdhcmUgdW50aWwgaXQgcmVwb3J0cyBpdHMgdmVyc2lvbiBhbmQgYWNjZXB0c1xuJiM0MzsgKiBjb25maWd1cmF0aW9uIGNvbW1hbmRzLCB0aGVuIGNhY2hlIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIGFuZCBjaGlwIElELlxuJiM0MzsgKiBUYWtlcyBhdCBsZWFzdCB0d28gc2Vjb25kcy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLlxuJiM0MzsgKi9cbiYjNDM7aW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKVxuIHtcbiBcdHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB2ZXIgPSB7fTtcbiBcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzLCB0aW1lb3V0O1xuQEAgLTI1NCw2ICYjNDM7MzAxLDExIEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpXG4gXHRcdHByaXYtXHUwMDNlZndfdmVyc2lvbi5tYWpvciA9IHZlci5pdl9tYWpvcjtcbiBcdFx0cHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yID0gdmVyLml2X21pbm9yO1xuIFx0XHRwcml2LVx1MDAzZWZ3X3ZlcnNpb24ucmV2aXNpb24gPSBsZTE2X3RvX2NwdSh2ZXIuaXZfcmV2aXNpb24pO1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IG14bDg2Mnh4X3JlYWRfY2hpcF9pZChwcml2KTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdGRldl93YXJuKGRzLVx1MDAzZWRldiwgXCYjMzQ7ZmFpbGVkIHRvIHJlYWQgY2hpcCBJRDogJXBlXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCBFUlJfUFRSKHJldCkpO1xuIFx0XHRyZXR1cm4gMDtcbiBcbiBub3RfcmVhZHlfeWV0OlxuQEAgLTYyMiwyMSAmIzQzOzY3NCw2NiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcylcbiBcdGludCBuX3VzZXJfcG9ydHMgPSAwLCBtYXhfdmxhbnM7XG4gXHRpbnQgaW5ncmVzc19maW5hbHMsIHZpZF9ydWxlcztcbiBcdHN0cnVjdCBkc2FfcG9ydCAqZHA7XG4tXHRpbnQgcmV0LCBpO1xuLVxuLVx0cmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7XG4tXHRpZiAocmV0KVxuLVx0XHRyZXR1cm4gcmV0O1xuLVxuLVx0cmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7XG4tXHRpZiAocmV0KVxuLVx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdGludCByZXQsIGksIHJlc2N1ZTtcbiBcbiYjNDM7XHQvKiBUaGUgU2VyRGVzIHN0YXRlIGlzIHNvZnR3YXJlLW9ubHkgYW5kIG11c3QgZXhpc3QgYmVmb3JlIGFueXRoaW5nIGNhblxuJiM0MztcdCAqIHJlYWNoIHBoeWxpbmssIGluY2x1ZGluZyBhIHJlc2N1ZS1tb2RlIGZsYXNoIGNsZWFyaW5nIHJlc2N1ZV9tb2RlXG4mIzQzO1x0ICogYWhlYWQgb2YgdGhlIHJlcHJvYmUuXG4mIzQzO1x0ICovXG4gXHRtdXRleF9pbml0KFx1MDAyNnByaXYtXHUwMDNlc2VyZGVzX2xvY2spO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShwcml2LVx1MDAzZXNlcmRlc19wb3J0cyk7IGkmIzQzOyYjNDM7KVxuIFx0XHRteGw4NjJ4eF9zZXR1cF9wY3MocHJpdiwgXHUwMDI2cHJpdi1cdTAwM2VzZXJkZXNfcG9ydHNbaV0sXG4gXHRcdFx0XHQgICBpICYjNDM7IE1YTDg2MlhYX0ZJUlNUX1NFUkRFU19QT1JUKTtcbiBcbiYjNDM7XHQvKiBEZXRlY3QgdGhlIGxvYWRlciBvdmVyIFNCIFBESSBmaXJzdDogaXQgbmVlZHMgbm8gZmlybXdhcmUsIHVubGlrZSB0aGVcbiYjNDM7XHQgKiBDNDUgQVBJIChteGw4NjJ4eF9yZXNldC93YWl0X3JlYWR5KSB3aGljaCBzcGV3cyBDUkMgZXJyb3JzIHdoZW4gbm9uZVxuJiM0MztcdCAqIGFuc3dlcnMuIFRvdWNoIEM0NSBvbmx5IG9uY2UgcmVzY3VlIGlzIHJ1bGVkIG91dC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRyZXNjdWUgPSBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QocHJpdik7XG4mIzQzO1x0aWYgKHJlc2N1ZSBcdTAwM2MgMCkge1xuJiM0MztcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsIFwmIzM0O3N3aXRjaCBzdGF0ZSBkZXRlY3Rpb24gZmFpbGVkOiAlcGVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdEVSUl9QVFIocmVzY3VlKSk7XG4mIzQzO1x0XHRyZXR1cm4gcmVzY3VlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHJlc2N1ZSA9PSBNWEw4NjJYWF9OT1RfUkVTQ1VFKSB7XG4mIzQzO1x0XHRyZXQgPSBteGw4NjJ4eF9yZXNldChwcml2KTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7XG4mIzQzO1x0XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRcdC8qIHRoZSByZXNldCBtYXkgb25seSBub3cgaGF2ZSB0cmlnZ2VyZWQgcmVzY3VlIG1vZGUgKi9cbiYjNDM7XHRcdFx0cmVzY3VlID0gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHByaXYpO1xuJiM0MztcdFx0XHRpZiAocmVzY3VlIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdFx0XHRcJiMzNDtzd2l0Y2ggbm90IHJlc3BvbmRpbmcgYWZ0ZXIgcmVzZXQ6ICVwZVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdEVSUl9QVFIocmVzY3VlKSk7XG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJlc2N1ZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpZiAocmVzY3VlID09IE1YTDg2MlhYX05PVF9SRVNDVUUpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHByaXYtXHUwMDNlcmVzY3VlX21vZGUgPSByZXNjdWU7XG4mIzQzO1xuJiM0MztcdGlmIChwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKSB7XG4mIzQzO1x0XHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHkpIHtcbiYjNDM7XHRcdFx0ZGV2X3dhcm4oZHMtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcdCBcJiMzNDtzd2l0Y2ggaW4gTUNVYm9vdCByZXNjdWUgbW9kZSwgdXNlIGRldmxpbmsgdG8gZmxhc2ggbmV3IGZpcm13YXJlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdC8qIERyYWluIHRoZSB3ZWRnZWQgZG93bmxvYWQgaW4gdGhlIGJhY2tncm91bmQgc28gaXRcbiYjNDM7XHRcdFx0ICogbmV2ZXIgaG9sZHMgdGhlIGRldmxpbmsgbG9jazsgaW5mbyBhbmQgZmxhc2ggYmVjb21lXG4mIzQzO1x0XHRcdCAqIGF2YWlsYWJsZSBvbmNlIHJlYWR5LlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0ZGV2X3dhcm4oZHMtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHRcdCBcJiMzNDtzd2l0Y2ggaW4gTUNVYm9vdCB3aXRoIGFuIGludGVycnVwdGVkIGRvd25sb2FkLCByZWNvdmVyaW5nIGluIGJhY2tncm91bmRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRxdWV1ZV93b3JrKHN5c3RlbV9sb25nX3dxLCBcdTAwMjZwcml2LVx1MDAzZXJlc2N1ZV9oZWFsX3dvcmspO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuJiM0MztcbiBcdC8qIENhbGN1bGF0ZSBFeHRlbmRlZCBWTEFOIGJsb2NrIHNpemVzLlxuIFx0ICogV2l0aCBWTEFOIEZpbHRlciBoYW5kbGluZyBWSUQgbWVtYmVyc2hpcCBjaGVja3M6XG4gXHQgKiAgIEluZ3Jlc3M6IG9ubHkgZmluYWwgY2F0Y2hhbGwgcnVsZXMgKFBWSUQgaW5zZXJ0aW9uLCA4MDIuMVFcbkBAIC03MTUsMTEgJiM0Mzs4MTIsMjEgQEAgc3RhdGljIGludCBteGw4NjJ4eF9wb3J0X3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGJvb2wgZW5hYmxlKVxuIHN0YXRpYyBpbnQgbXhsODYyeHhfcG9ydF9lbmFibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCxcbiBcdFx0XHRcdHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpXG4ge1xuJiM0MztcdHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID0gZHMtXHUwMDNlcHJpdjtcbiYjNDM7XG4mIzQzO1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4gXHRyZXR1cm4gbXhsODYyeHhfcG9ydF9zdGF0ZShkcywgcG9ydCwgdHJ1ZSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3BvcnRfZGlzYWJsZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KVxuIHtcbiYjNDM7XHRzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLVx1MDAzZXByaXY7XG4mIzQzO1xuJiM0MztcdGlmIChwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiBcdGlmIChteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSkpXG4gXHRcdGRldl9lcnIoZHMtXHUwMDNlZGV2LCBcJiMzNDtmYWlsZWQgdG8gZGlzYWJsZSBwb3J0ICVkXFxuXCYjMzQ7LCBwb3J0KTtcbiB9XG5AQCAtMTMzNyw2ICYjNDM7MTQ0NCwxNyBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcbiBcdGJvb2wgaXNfY3B1X3BvcnQgPSBkc2FfcG9ydF9pc19jcHUoZHApO1xuIFx0aW50IHJldDtcbiBcbiYjNDM7XHRpZiAoZHNhX3BvcnRfaXNfZHNhKGRwKSkge1xuJiM0MztcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsIFwmIzM0O3BvcnQgJWQ6IERTQSBsaW5rcyBub3Qgc3VwcG9ydGVkXFxuXCYjMzQ7LCBwb3J0KTtcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIERTQSByZWluaXRzIGZhaWxlZCB1c2VyIHBvcnRzIGFzIHVudXNlZDsgc2hhcmVkIHBvcnRzIG11c3RcbiYjNDM7XHQgKiBzdWNjZWVkIGZvciB0aGUgdHJlZSB0byByZWdpc3Rlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSlcbiYjNDM7XHRcdHJldHVybiBkc2FfcG9ydF9pc191c2VyKGRwKSA/IC1FTk9ERVYgOiAwO1xuJiM0MztcbiBcdHJldCA9IG14bDg2Mnh4X3BvcnRfc3RhdGUoZHMsIHBvcnQsIGZhbHNlKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG5AQCAtMTM0NiwxMSAmIzQzOzE0NjQsNiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcbiBcdGlmIChkc2FfcG9ydF9pc191bnVzZWQoZHApKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdGlmIChkc2FfcG9ydF9pc19kc2EoZHApKSB7XG4tXHRcdGRldl9lcnIoZHMtXHUwMDNlZGV2LCBcJiMzNDtwb3J0ICVkOiBEU0EgbGlua3Mgbm90IHN1cHBvcnRlZFxcblwmIzM0OywgcG9ydCk7XG4tXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbi1cdH1cbi1cbiBcdHJldCA9IG14bDg2Mnh4X2NvbmZpZ3VyZV9zcF90YWdfcHJvdG8oZHMsIHBvcnQsIGlzX2NwdV9wb3J0KTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG5AQCAtMTU3Miw2ICYjNDM7MTY4NSwxMiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfbWRiX2RlbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LFxuIFx0ZXRoZXJfYWRkcl9jb3B5KHFwYXJhbS5tYWMsIG1kYi1cdTAwM2VhZGRyKTtcbiBcbiBcdHJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIE1YTDg2MlhYX01BQ19UQUJMRUVOVFJZUVVFUlksIHFwYXJhbSk7XG4mIzQzO1x0LyogUG9zdC1mbGFzaCB0ZWFyZG93biBvciBNQ1Vib290OiB0aGUgZmlybXdhcmUgYW5kIGl0cyBNQUMgdGFibGUgYXJlXG4mIzQzO1x0ICogZ29uZSwgc28gdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIGRlbGV0ZS4gT3V0c2lkZSB0aG9zZSwgLUVOT0RFViBpcyBhXG4mIzQzO1x0ICogYnVzIGVycm9yIGFuZCBtdXN0IGJlIHJlcG9ydGVkLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChyZXQgPT0gLUVOT0RFViBcdTAwMjZcdTAwMjYgKHByaXYtXHUwMDNlc2tpcF90ZWFyZG93biB8fCBwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0xNjI4LDYgJiM0MzsxNzQ3LDkgQEAgc3RhdGljIHZvaWQgbXhsODYyeHhfcG9ydF9zdHBfc3RhdGVfc2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsXG4gXHRzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLVx1MDAzZXByaXY7XG4gXHRpbnQgcmV0O1xuIFxuJiM0MztcdGlmIChwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiBcdHN3aXRjaCAoc3RhdGUpIHtcbiBcdGNhc2UgQlJfU1RBVEVfRElTQUJMRUQ6XG4gXHRcdHBhcmFtLnBvcnRfc3RhdGUgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9TVFBfUE9SVF9TVEFURV9ESVNBQkxFKTtcbkBAIC0yMDE1LDYgJiM0MzsyMTM3LDEyIEBAIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3N0YXRzX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuIFx0c3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcHJpdi1cdTAwM2VkcztcbiBcdHN0cnVjdCBkc2FfcG9ydCAqZHA7XG4gXG4mIzQzO1x0LyogQSBnZXRfc3RhdHM2NCgpIHJlLWFybSBjYW4gcmFjZSB0aGUgZmxhc2ggdGVhcmRvd24mIzM5O3MgV09SS19TVE9QUEVEXG4mIzQzO1x0ICogc2V0IGFuZCBjYW5jZWw7IGJhaWwgaGVyZSBzbyBhIHN0cmF5IHBvbGwgbmV2ZXIgcnVucyBkdXJpbmcgYSBmbGFzaC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFx1MDAyNnByaXYtXHUwMDNlZmxhZ3MpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiBcdGRzYV9zd2l0Y2hfZm9yX2VhY2hfYXZhaWxhYmxlX3BvcnQoZHAsIGRzKVxuIFx0XHRteGw4NjJ4eF9zdGF0c19wb2xsKGRzLCBkcC1cdTAwM2VpbmRleCk7XG4gXG5AQCAtMjA4Niw2ICYjNDM7MjIxNCw4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMgbXhsODYyeHhfc3dpdGNoX29wcyA9IHtcbiBcdC5nZXRfcGF1c2Vfc3RhdHMgPSBteGw4NjJ4eF9nZXRfcGF1c2Vfc3RhdHMsXG4gXHQuZ2V0X3Jtb25fc3RhdHMgPSBteGw4NjJ4eF9nZXRfcm1vbl9zdGF0cyxcbiBcdC5nZXRfc3RhdHM2NCA9IG14bDg2Mnh4X2dldF9zdGF0czY0LFxuJiM0MztcdC5kZXZsaW5rX2luZm9fZ2V0ID0gbXhsODYyeHhfZGV2bGlua19pbmZvX2dldCxcbiYjNDM7XHQuZGV2bGlua19mbGFzaF91cGRhdGUgPSBteGw4NjJ4eF9kZXZsaW5rX2ZsYXNoX3VwZGF0ZSxcbiB9O1xuIFxuIHN0YXRpYyBpbnQgbXhsODYyeHhfcHJvYmUoc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2KVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmhcbmluZGV4IDQzMmE1ZjNmMmUwOGUuLjk5MWIyNGFhOTVhZmQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmhcbkBAIC00LDcgJiM0Mzs0LDkgQEBcbiAjZGVmaW5lIF9fTVhMODYyWFhfSFxuIFxuICNpbmNsdWRlIFx1MDAzY2FzbS9ieXRlb3JkZXIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRvcHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21kaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tdXRleC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NuZXQvZHNhLmhcdTAwM2VcbiBcbkBAIC0xNCw2ICYjNDM7MTYsMTAgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXY7XG4gI2RlZmluZSBNWEw4NjJYWF9GSVJTVF9TRVJERVNfUE9SVFx0OVxuICNkZWZpbmUgTVhMODYyWFhfU0VSREVTX1NMT1RTXHRcdDRcbiBcbiYjNDM7LyogbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KCkgcmV0dXJuIGNvZGVzIChuZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9ycykgKi9cbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9OT1RfUkVTQ1VFXHRcdDBcbiYjNDM7I2RlZmluZSBNWEw4NjJYWF9JTl9SRVNDVUVcdFx0MVxuJiM0MztcbiAjZGVmaW5lIE1YTDg2MlhYX0RFRkFVTFRfQlJJREdFXHRcdDBcbiAjZGVmaW5lIE1YTDg2MlhYX01BWF9CUklER0VTXHRcdDQ4XG4gI2RlZmluZSBNWEw4NjJYWF9NQVhfQlJJREdFX1BPUlRTXHQxMjhcbkBAIC0zMDMsNiAmIzQzOzMwOSwxMCBAQCBzdHJ1Y3QgbXhsODYyeHhfZndfdmVyc2lvbiB7XG4gICogICAgICAgICAgICAgICAgICAgICAgZmxvb2RpbmcpXG4gICogQGZ3X3ZlcnNpb246ICAgICAgICAgY2FjaGVkIGZpcm13YXJlIHZlcnNpb24sIHBvcHVsYXRlZCBhdCBwcm9iZSBhbmRcbiAgKiAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZCB3aXRoIE1YTDg2MlhYX0ZXX1ZFUl9NSU4oKVxuJiM0MzsgKiBAYXNpY19pZDogICAgICAgICAgICBjaGlwIHBhcnQgbnVtYmVyIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMsXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGFzIHRoZSBkZXZsaW5rIFwmIzM0O2FzaWMuaWRcJiMzNDsgZml4ZWQgdmVyc2lvblxuJiM0MzsgKiBAYXNpY19yZXY6ICAgICAgICAgICBjaGlwIHZlcnNpb24gcmVhZCBmcm9tIHRoZSBDSElQIElEIHJlZ2lzdGVycyxcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYXMgdGhlIGRldmxpbmsgXCYjMzQ7YXNpYy5yZXZcJiMzNDsgZml4ZWQgdmVyc2lvblxuICAqIEBzZXJkZXNfcG9ydHM6ICAgICAgIFNlckRlcyBpbnRlcmZhY2VzIGluY2wuIHN1Yi1pbnRlcmZhY2VzIGluIGNhc2Ugb2ZcbiAgKiAgICAgICAgICAgICAgICAgICAgICAxMEdfUVhHTUlJIG9yIFFTR01JSVxuICAqIEBzZXJkZXNfcmVmY291bnQ6ICAgIHBlci1YUENTIGNvdW50IG9mIHN1Yi1wb3J0cyBlbmFibGVkIGJ5IHBoeWxpbms7XG5AQCAtMzE5LDYgJiM0MzszMjksMjAgQEAgc3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24ge1xuICAqIEBldmxhbl9pbmdyZXNzX3NpemU6IHBlci1wb3J0IGluZ3Jlc3MgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplXG4gICogQGV2bGFuX2VncmVzc19zaXplOiAgcGVyLXBvcnQgZWdyZXNzIEV4dGVuZGVkIFZMQU4gYmxvY2sgc2l6ZVxuICAqIEB2Zl9ibG9ja19zaXplOiAgICAgIHBlci1wb3J0IFZMQU4gRmlsdGVyIGJsb2NrIHNpemVcbiYjNDM7ICogQGJsb2NrX2hvc3Q6ICAgICAgICAgcmVqZWN0IGZpcm13YXJlIEFQSSBjb21tYW5kcyAoZXhjZXB0IEZXX1VQREFURSlcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGEgZmlybXdhcmUgZmxhc2hcbiYjNDM7ICogQHNraXBfdGVhcmRvd246ICAgICAgZGlzY2FyZCBmaXJtd2FyZSBBUEkgY29tbWFuZHMgZHVyaW5nIHRoZSB0ZWFyZG93blxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQgYnkgdGhlIHBvc3QtZmxhc2ggcmVwcm9iZVxuJiM0MzsgKiBAcmVzY3VlX21vZGU6ICAgICAgICBzd2l0Y2ggaXMgaW4gTUNVYm9vdDsgZmlybXdhcmUgQVBJIGNvbW1hbmRzIGZhaWwgZmFzdCxcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgb25seSBjbGF1c2UtMjIgU01ESU8gd29ya3MuIFNldCBmcm9tIHNldHVwKCkgYmVmb3JlIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggaXMgcmVnaXN0ZXJlZCBhbmQgY2xlYXJlZCB1bmRlciB0aGUgTURJTyBidXMgbG9ja1xuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGJlbmVmaXQgb2YgbXhsODYyeHhfYXBpX3dyYXAoKTsgb3RoZXIgcmVhZGVyc1xuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IG5lZWQgaXQgdG8gYmUgYSBzdGFibGUgc2luZ2xlIGZsYWcuXG4mIzQzOyAqIEByZXNjdWVfcmVhZHk6ICAgICAgIChyZXNjdWVfbW9kZSkgbG9hZGVyIGlzIGF0IGEgY2xlYW4gUkVBRFkgYW5kIHdpbGwgYWNjZXB0XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgIGEgZmxhc2g7IGZhbHNlIHdoaWxlIHJlc2N1ZV9oZWFsX3dvcmsgaXMgZHJhaW5pbmdcbiYjNDM7ICogQHJlc2N1ZV9mYWlsZWQ6ICAgICAgKHJlc2N1ZV9tb2RlKSB0aGUgc2VsZi1oZWFsIGdhdmUgdXA7IHRoZSBsb2FkZXIgbmVlZHMgYVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBwb3dlciBjeWNsZSBhbmQgbm8gZmxhc2ggY2FuIGJlIGFjY2VwdGVkXG4mIzQzOyAqIEByZXNjdWVfaGVhbF93b3JrOiAgIGJhY2tncm91bmQgc2VsZi1oZWFsIGRyYWluaW5nIGEgd2VkZ2VkIGRvd25sb2FkIHRvIFJFQURZXG4gICogQHN0YXRzX3dvcms6ICAgICAgICAgcGVyaW9kaWMgd29yayBpdGVtIHRoYXQgcG9sbHMgUk1PTiBoYXJkd2FyZSBjb3VudGVyc1xuICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBhY2N1bXVsYXRlcyB0aGVtIGludG8gNjQtYml0IHBlci1wb3J0IHN0YXRzXG4gICovXG5AQCAtMzI2LDkgJiM0MzszNTAsMTIgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXYge1xuIFx0c3RydWN0IGRzYV9zd2l0Y2ggKmRzO1xuIFx0c3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2O1xuIFx0c3RydWN0IHdvcmtfc3RydWN0IGNyY19lcnJfd29yaztcbiYjNDM7XHRzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzY3VlX2hlYWxfd29yaztcbiBcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG4gXHR1MTYgZHJvcF9tZXRlcjtcbiBcdHN0cnVjdCBteGw4NjJ4eF9md192ZXJzaW9uIGZ3X3ZlcnNpb247XG4mIzQzO1x0dTE2IGFzaWNfaWQ7XG4mIzQzO1x0dTggYXNpY19yZXY7XG4gXHRzdHJ1Y3QgbXhsODYyeHhfcGNzIHNlcmRlc19wb3J0c1s4XTtcbiBcdGludCBzZXJkZXNfcmVmY291bnRbMl07XG4gXHRzdHJ1Y3QgbXV0ZXggc2VyZGVzX2xvY2s7XG5AQCAtMzM3LDcgJiM0MzszNjQsMTQgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXYge1xuIFx0dTE2IGV2bGFuX2luZ3Jlc3Nfc2l6ZTtcbiBcdHUxNiBldmxhbl9lZ3Jlc3Nfc2l6ZTtcbiBcdHUxNiB2Zl9ibG9ja19zaXplO1xuJiM0MztcdGJvb2wgYmxvY2tfaG9zdDtcbiYjNDM7XHRib29sIHNraXBfdGVhcmRvd247XG4mIzQzO1x0Ym9vbCByZXNjdWVfbW9kZTtcbiYjNDM7XHRib29sIHJlc2N1ZV9yZWFkeTtcbiYjNDM7XHRib29sIHJlc2N1ZV9mYWlsZWQ7XG4gXHRzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXRzX3dvcms7XG4gfTtcbiBcbiYjNDM7aW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTtcbiYjNDM7XG4gI2VuZGlmIC8qIF9fTVhMODYyWFhfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oXG5pbmRleCBhZWU3OWZkNmIzMmI0Li43YTk5MTY5NTA1NzcyIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaFxuQEAgLTEzMTQsNiAmIzQzOzEzMTQsOCBAQCBpbnQgIF9fbXVzdF9jaGVjayBkZXZpY2VfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldik7XG4gaW50IF9fbXVzdF9jaGVjayBkcml2ZXJfYXR0YWNoKGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpO1xuIHZvaWQgZGV2aWNlX2luaXRpYWxfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTtcbiBpbnQgX19tdXN0X2NoZWNrIGRldmljZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7XG4mIzQzO2ludCBfX211c3RfY2hlY2sgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LFxuJiM0MztcdFx0XHRcdFx0IHVuc2lnbmVkIGludCBkZWxheV9tcyk7XG4gXG4gYm9vbCBkZXZpY2VfaXNfYm91bmQoc3RydWN0IGRldmljZSAqZGV2KTtcbiBcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc2EuaCBiL2luY2x1ZGUvbmV0L2RzYS5oXG5pbmRleCA2ZjdmNWMxN2I1MzIwLi41ODU5N2IxNGU1OTJhIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9uZXQvZHNhLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbmV0L2RzYS5oXG5AQCAtMTE3Miw2ICYjNDM7MTE3Miw5IEBAIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyB7XG4gXHRpbnRcdCgqZGV2bGlua19pbmZvX2dldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuIFx0XHRcdFx0ICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsXG4gXHRcdFx0XHQgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKTtcbiYjNDM7XHRpbnRcdCgqZGV2bGlua19mbGFzaF91cGRhdGUpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcbiYjNDM7XHRcdFx0XHRcdHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcbiYjNDM7XHRcdFx0XHRcdHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4gXHRpbnRcdCgqZGV2bGlua19zYl9wb29sX2dldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuIFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBzYl9pbmRleCwgdTE2IHBvb2xfaW5kZXgsXG4gXHRcdFx0XHQgICAgICAgc3RydWN0IGRldmxpbmtfc2JfcG9vbF9pbmZvICpwb29sX2luZm8pO1xuZGlmZiAtLWdpdCBhL25ldC9kc2EvZGV2bGluay5jIGIvbmV0L2RzYS9kZXZsaW5rLmNcbmluZGV4IGVkMzQyZjM0NTY5MmIuLjI1MzExYTg3Y2JjNTYgMTAwNjQ0XG4tLS0gYS9uZXQvZHNhL2RldmxpbmsuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2RzYS9kZXZsaW5rLmNcbkBAIC0yMCw2ICYjNDM7MjAsMTggQEAgc3RhdGljIGludCBkc2FfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZGV2bGluayAqZGwsXG4gXHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IGRzYV9kZXZsaW5rX2ZsYXNoX3VwZGF0ZShzdHJ1Y3QgZGV2bGluayAqZGwsXG4mIzQzO1x0XHRcdFx0ICAgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZHNhX2RldmxpbmtfdG9fZHMoZGwpO1xuJiM0MztcbiYjNDM7XHRpZiAoIWRzLVx1MDAzZW9wcy1cdTAwM2VkZXZsaW5rX2ZsYXNoX3VwZGF0ZSlcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRzLVx1MDAzZW9wcy1cdTAwM2VkZXZsaW5rX2ZsYXNoX3VwZGF0ZShkcywgcGFyYW1zLCBleHRhY2spO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgZHNhX2Rldmxpbmtfc2JfcG9vbF9nZXQoc3RydWN0IGRldmxpbmsgKmRsLFxuIFx0XHRcdFx0ICAgdW5zaWduZWQgaW50IHNiX2luZGV4LCB1MTYgcG9vbF9pbmRleCxcbiBcdFx0XHRcdCAgIHN0cnVjdCBkZXZsaW5rX3NiX3Bvb2xfaW5mbyAqcG9vbF9pbmZvKVxuQEAgLTE2OSw2ICYjNDM7MTgxLDcgQEAgZHNhX2Rldmxpbmtfc2Jfb2NjX3RjX3BvcnRfYmluZF9nZXQoc3RydWN0IGRldmxpbmtfcG9ydCAqZGxwLFxuIFxuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2bGlua19vcHMgZHNhX2Rldmxpbmtfb3BzID0ge1xuIFx0LmluZm9fZ2V0XHRcdFx0PSBkc2FfZGV2bGlua19pbmZvX2dldCxcbiYjNDM7XHQuZmxhc2hfdXBkYXRlXHRcdFx0PSBkc2FfZGV2bGlua19mbGFzaF91cGRhdGUsXG4gXHQuc2JfcG9vbF9nZXRcdFx0XHQ9IGRzYV9kZXZsaW5rX3NiX3Bvb2xfZ2V0LFxuIFx0LnNiX3Bvb2xfc2V0XHRcdFx0PSBkc2FfZGV2bGlua19zYl9wb29sX3NldCxcbiBcdC5zYl9wb3J0X3Bvb2xfZ2V0XHRcdD0gZHNhX2Rldmxpbmtfc2JfcG9ydF9wb29sX2dldCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAwNjo1MDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBmaXJtd2FyZSBmbGFzaCBzdXBwb3J0IGZvciB0aGUgTWF4TGluZWFyIE14TDg2Mnh4IERTQSBzd2l0Y2ggdmlhIGRldmxpbmssIGFsb25nIHdpdGggYSBuZXcgY29yZSBkcml2ZXIgbW9kZWwgZnVuY3Rpb24gYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYC4gVGhlIGBteGw4NjJ4eGAgZHJpdmVyIHJlcXVpcmVzIHBoeXNpY2FsIGhhcmR3YXJlIGNvbm5lY3RlZCB2aWEgTURJTyB0byBwcm9iZSBzdWNjZXNzZnVsbHkgYW5kIGlzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLiBUaGUgbmV3IGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgQVBJIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGhpcyB1bnJlYWNoYWJsZSBkcml2ZXIuIFRoZSBhZGRpdGlvbnMgdG8gdGhlIERTQSBkZXZsaW5rIGNvcmUgYXJlIHRyaXZpYWwgd3JhcHBlcnMgdGhhdCByZXR1cm4gYC1FT1BOT1RTVVBQYCBmb3IgYWxsIG90aGVyIHN3aXRjaGVzLiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBkZXZpY2Vfc2h1dGRvd25gIG1lcmVseSBzZXRzIGEgYm9vbGVhbiBmbGFnIGR1cmluZyBzeXN0ZW0gdGVhcmRvd24uIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50LCByZWFjaGFibGUgY29kZSB0byBmdXp6LiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDI5YjAxMTZlMDU1OWNjY2ExNDhhZTY5YTBhYWQ2Mjc0MjYxZTNiZDMKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAxNSAwNjo1MDo0MyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdAppbmRleCA0NzQ1MTQ4ZmVjZjRmLi4wNTg5OTlkMGRjNTZmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RldmxpbmsvaW5kZXgucnN0CkBAIC05NCw2ICYjNDM7OTQsNyBAQCBwYXJhbWV0ZXJzLCBpbmZvIHZlcnNpb25zLCBhbmQgb3RoZXIgZmVhdHVyZXMgaXQgc3VwcG9ydHMuCiAgICBtbHg1CiAgICBtbHhzdwogICAgbXY4OGU2eHh4CiYjNDM7ICAgbXhsODYyeHgKICAgIG5ldGRldnNpbQogICAgbmZwCiAgICBvY3Rlb250eDIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL214bDg2Mnh4LnJzdCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL214bDg2Mnh4LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi41YjI0ZDhjYjU3YmM5Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RldmxpbmsvbXhsODYyeHgucnN0CkBAIC0wLDAgJiM0MzsxLDc0IEBACiYjNDM7Li4gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsKJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PT0KJiM0MztteGw4NjJ4eCBkZXZsaW5rIHN1cHBvcnQKJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PT0KJiM0MzsKJiM0MztUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgZGV2bGluayBmZWF0dXJlcyBpbXBsZW1lbnRlZCBieSB0aGUKJiM0MztgYG14bDg2Mnh4YGAgZGV2aWNlIGRyaXZlci4KJiM0MzsKJiM0MztJbmZvIHZlcnNpb25zCiYjNDM7PT09PT09PT09PT09PQomIzQzOwomIzQzO1RoZSBgYG14bDg2Mnh4YGAgZHJpdmVyIHJlcG9ydHMgdGhlIGZvbGxvd2luZyB2ZXJzaW9ucwomIzQzOwomIzQzOy4uIGxpc3QtdGFibGU6OiBkZXZsaW5rIGluZm8gdmVyc2lvbnMgaW1wbGVtZW50ZWQKJiM0MzsgICA6d2lkdGhzOiA1IDUgNSA4NQomIzQzOwomIzQzOyAgICogLSBOYW1lCiYjNDM7ICAgICAtIFR5cGUKJiM0MzsgICAgIC0gRXhhbXBsZQomIzQzOyAgICAgLSBEZXNjcmlwdGlvbgomIzQzOyAgICogLSBgYGFzaWMuaWRgYAomIzQzOyAgICAgLSBmaXhlZAomIzQzOyAgICAgLSA4NjI4CiYjNDM7ICAgICAtIFRoZSBjaGlwIHBhcnQgbnVtYmVyIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMuIE9taXR0ZWQKJiM0MzsgICAgICAgd2hlbiB0aGUgcGFydCBudW1iZXIgcmVhZHMgYXMgemVybywgd2hpY2ggaGFwcGVucyBmb3IgYSBzd2l0Y2gKJiM0MzsgICAgICAgc2l0dGluZyBpbiBNQ1Vib290IHJlc2N1ZSBtb2RlICh0aGUgcmVnaXN0ZXJzIG5lZWQgYSBydW5uaW5nCiYjNDM7ICAgICAgIGZpcm13YXJlKSwgZm9yIGFuIHVuZnVzZWQgcGFydCwgYW5kIGFmdGVyIGEgZmFpbGVkIGZsYXNoLgomIzQzOyAgICogLSBgYGFzaWMucmV2YGAKJiM0MzsgICAgIC0gZml4ZWQKJiM0MzsgICAgIC0gMAomIzQzOyAgICAgLSBUaGUgY2hpcCB2ZXJzaW9uIHJlYWQgZnJvbSB0aGUgc2FtZSByZWdpc3RlciB3b3JkLCBzbyBpdCBpcwomIzQzOyAgICAgICBvbWl0dGVkIHdoZW5ldmVyIGBgYXNpYy5pZGBgIGlzLgomIzQzOyAgICogLSBgYGZ3YGAKJiM0MzsgICAgIC0gcnVubmluZywgc3RvcmVkCiYjNDM7ICAgICAtIDEuMC43MAomIzQzOyAgICAgLSBWZXJzaW9uIG9mIHRoZSBmaXJtd2FyZSBydW5uaW5nIG9uIHRoZSBzd2l0Y2gsIHJlcG9ydGVkIGFzIGJvdGgKJiM0MzsgICAgICAgcnVubmluZyBhbmQgc3RvcmVkIHNpbmNlIHRoZSBzd2l0Y2ggYm9vdHMgaXQgZnJvbSBpdHMgb3duIGZsYXNoLgomIzQzOyAgICAgICBJdCBpcyBvbWl0dGVkIHdoaWxlIG5vIGZpcm13YXJlIHZlcnNpb24gaXMga25vd246IGFmdGVyIGEgZmFpbGVkCiYjNDM7ICAgICAgIGZsYXNoLCBhbmQgaW4gTUNVYm9vdCByZXNjdWUgbW9kZSB3aGlsZSBhbiBpbnRlcnJ1cHRlZCBkb3dubG9hZAomIzQzOyAgICAgICBpcyBzdGlsbCBiZWluZyByZWNvdmVyZWQgaW4gdGhlIGJhY2tncm91bmQuIE9uY2UgdGhlIGxvYWRlciBpcwomIzQzOyAgICAgICByZWFkeSB0byBhY2NlcHQgYSBuZXcgaW1hZ2UgdGhlIHZlcnNpb24gYXBwZWFycyBhcyAmIzM0OzAuMC4wJiMzNDssCiYjNDM7ICAgICAgIHdoaWNoIG5vIHJlbGVhc2VkIGZpcm13YXJlIHJlcG9ydHMsIHNvIHZlcnNpb24tY29tcGFyaW5nIHRvb2xzCiYjNDM7ICAgICAgIG9mZmVyIGFueSBhdmFpbGFibGUgcmVsZWFzZSBhcyBhbiB1cGdyYWRlLiBVc2UgYGBkZXZsaW5rIGRldgomIzQzOyAgICAgICBmbGFzaGBgIHRvIHRlbGwgYSByZWNvdmVyaW5nIHN3aXRjaCBmcm9tIGEgcmVhZHkgb25lLCBzZWUgYmVsb3c7CiYjNDM7ICAgICAgIGEgbWlzc2luZyB2ZXJzaW9uIG9uIGl0cyBvd24gZG9lcyBub3Qgc2F5IHdoeS4KJiM0MzsKJiM0MztGbGFzaCB1cGRhdGUKJiM0Mzs9PT09PT09PT09PT0KJiM0MzsKJiM0MztUaGUgYGBteGw4NjJ4eGBgIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIGBgZGV2bGluayBkZXYgZmxhc2hgYC4KJiM0MztUaGUgc2lnbmVkIGZpcm13YXJlIGltYWdlIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBzd2l0Y2ggb3ZlciB0aGUgc2FtZQomIzQzO01ESU8gYnVzIHdoaWNoIGlzIGFsc28gdXNlZCB0byBtYW5hZ2UgdGhlIHN3aXRjaCwgdGhlbiB2ZXJpZmllZCBhbmQKJiM0MztpbnN0YWxsZWQgYnkgdGhlIE1DVWJvb3QgYm9vdGxvYWRlciBydW5uaW5nIG9uIHRoZSBzd2l0Y2guIEFsbCBwb3J0cwomIzQzO29mIHRoZSBzd2l0Y2ggYXJlIGNsb3NlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB1cGRhdGUgYW5kIHRoZSBkcml2ZXIKJiM0MztyZXByb2JlcyB0aGUgc3dpdGNoIGFmdGVyIGl0IGhhcyByZWJvb3RlZCBpbnRvIHRoZSBuZXcgZmlybXdhcmUuIEEKJiM0Mztjb21wbGV0ZSBmbGFzaCBhbmQgcmVwcm9iZSBjeWNsZSB0YWtlcyBhYm91dCBvbmUgbWludXRlLgomIzQzOwomIzQzO0Egc3dpdGNoIHN0dWNrIGluIE1DVWJvb3QgcmVzY3VlIG1vZGUsIGUuZy4gYWZ0ZXIgYW4gaW50ZXJydXB0ZWQKJiM0Mzt1cGRhdGUsIGlzIHJlZ2lzdGVyZWQgd2l0aG91dCB1c2VyIHBvcnRzLiBJZiB0aGUgcHJldmlvdXMgZG93bmxvYWQgd2FzCiYjNDM7aW50ZXJydXB0ZWQgbWlkLXRyYW5zZmVyIHRoZSBsb2FkZXIgaXMgd2VkZ2VkOyB0aGUgZHJpdmVyIGRyYWlucyBpdAomIzQzO2JhY2sgdG8gYSBjbGVhbiByZWFkeSBzdGF0ZSBpbiB0aGUgYmFja2dyb3VuZCwgb25lIGJ5dGUgYXQgYSB0aW1lLAomIzQzO3doaWNoIHRha2VzIHRlbnMgb2YgbWludXRlcyBmb3IgYSBsYXJnZSBpbWFnZSBhbmQgaXMgcmVwb3J0ZWQgdGhyb3VnaAomIzQzO3RoZSBrZXJuZWwgbG9nIGFzIGl0IHByb2dyZXNzZXMuIER1cmluZyB0aGF0IHJlY292ZXJ5IGBgZGV2bGluayBkZXYKJiM0MztmbGFzaGBgIHJldHVybnMgYGAtRUJVU1lgYCB3aXRoIGFuIGV4dGFjayBtZXNzYWdlIHNheWluZyBzbywgYW5kCiYjNDM7YGBkZXZsaW5rIGRldiBpbmZvYGAgcmVwb3J0cyBubyBmaXJtd2FyZSB2ZXJzaW9uLiBPbmNlIHRoZSBsb2FkZXIgaXMKJiM0MztyZWFkeSB0aGUgZmlybXdhcmUgdmVyc2lvbiBhcHBlYXJzIGFuZCBmbGFzaGluZyBhIGZpcm13YXJlIGltYWdlCiYjNDM7dGhyb3VnaCB0aGUgcmVndWxhciB1cGRhdGUgZmxvdyByZWNvdmVycyB0aGUgc3dpdGNoLgomIzQzOwomIzQzO0lmIHRoZSByZWNvdmVyeSBmYWlscywgdGhlIGxvYWRlciBuZWVkcyBhIHBvd2VyIGN5Y2xlOiBgYGRldmxpbmsgZGV2CiYjNDM7Zmxhc2hgYCB0aGVuIHJldHVybnMgYGAtRUlPYGAgYW5kIHNheXMgc28gaW4gaXRzIGV4dGFjayBtZXNzYWdlLiBUaGUKJiM0Mztkcml2ZXIgb25seSByZS1leGFtaW5lcyB0aGUgc3dpdGNoIHdoZW4gaXQgYmluZHMsIHNvIG9uIGEgYm9hcmQgd2hlcmUKJiM0Mzt0aGUgc3dpdGNoIGNhbiBiZSBwb3dlciBjeWNsZWQgb24gaXRzIG93biwgdW5iaW5kIGFuZCByZWJpbmQgdGhlIGRyaXZlcgomIzQzO2FmdGVyd2FyZHMgdG8gaGF2ZSB0aGUgcmVjb3ZlcmVkIHN3aXRjaCByZWNvZ25pc2VkLgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCA5OTE0NjAwNTBkYTc0Li5lM2Y3ZGVkNTY5YmY3IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUwomIzQzOyYjNDM7JiM0MzsgYi9NQUlOVEFJTkVSUwpAQCAtMTYxMDYsNiAmIzQzOzE2MTA2LDcgQEAgTToJRGFuaWVsIEdvbGxlICZsdDtkYW5pZWxAbWFrcm90b3BpYS5vcmcmZ3Q7CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2RzYS9tYXhsaW5lYXIsbXhsODYyeHgueWFtbAomIzQzO0Y6CURvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL214bDg2Mnh4LnJzdAogRjoJZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4LwogRjoJbmV0L2RzYS90YWdfbXhsODYyeHguYwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaAppbmRleCBhNWI3YWJjMTBmZjAyLi42MjM0ZTM3ZGU3ZTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYmFzZS5oCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKQEAgLTEwNiw2ICYjNDM7MTA2LDEwIEBAIHN0cnVjdCBkcml2ZXJfcHJpdmF0ZSB7CiAgKiBAZGVhZDogVGhpcyBkZXZpY2UgaXMgY3VycmVudGx5IGVpdGhlciBpbiB0aGUgcHJvY2VzcyBvZiBvciBoYXMgYmVlbgogICoJICByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4gQW55IGFzeW5jaHJvbm91cyBldmVudHMgc2NoZWR1bGVkIGZvciB0aGlzCiAgKgkgIGRldmljZSBzaG91bGQgZXhpdCB3aXRob3V0IHRha2luZyBhbnkgYWN0aW9uLgomIzQzOyAqIEBzaHV0ZG93bl9kb25lOiBTZXQgb25jZSBkZXZpY2Vfc2h1dGRvd24oKSBoYXMgcmVhY2hlZCB0aGlzIGRldmljZSwgdW5kZXIKJiM0MzsgKgkgIHRoZSBkZXZpY2UgbG9jaywgYmVmb3JlIGFueSBzaHV0ZG93biBjYWxsYmFjayBydW5zLiBSZWFkIHVuZGVyIHRoZQomIzQzOyAqCSAgZGV2aWNlIGxvY2suIEEgZGVmZXJyZWQgcmUtcHJvYmUgc2NoZWR1bGVkIHdpdGgKJiM0MzsgKgkgIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKCkgbXVzdCBub3QgZGV0YWNoIHRoZSBkZXZpY2UgYW55bW9yZS4KICAqCiAgKiBOb3RoaW5nIG91dHNpZGUgb2YgdGhlIGRyaXZlciBjb3JlIHNob3VsZCBldmVyIHRvdWNoIHRoZXNlIGZpZWxkcy4KICAqLwpAQCAtMTIwLDYgJiM0MzsxMjQsNyBAQCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgewogCWNoYXIgKmRlZmVycmVkX3Byb2JlX3JlYXNvbjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7CiAJdTggZGVhZDoxOwomIzQzOwl1OCBzaHV0ZG93bl9kb25lOjE7CiB9OwogI2RlZmluZSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQob2JqKQlcCiAJY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9wYXJlbnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCA0ZDAyNjY4Mjk0NGYyLi44YTdkYmU0ZTgzNjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTQ5MDYsNiAmIzQzOzQ5MDYsOSBAQCB2b2lkIGRldmljZV9zaHV0ZG93bih2b2lkKQogCQkJZGV2aWNlX2xvY2socGFyZW50KTsKIAkJZGV2aWNlX2xvY2soZGV2KTsKIAomIzQzOwkJaWYgKGRldi0mZ3Q7cCkKJiM0MzsJCQlkZXYtJmd0O3AtJmd0O3NodXRkb3duX2RvbmUgPSB0cnVlOwomIzQzOwogCQkvKiBEb24mIzM5O3QgYWxsb3cgYW55IG1vcmUgcnVudGltZSBzdXNwZW5kcyAqLwogCQlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShkZXYpOwogCQlwbV9ydW50aW1lX2JhcnJpZXIoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmMKaW5kZXggNjBjMDA1MjIzODQ0ZC4uYmI4YjM0YWNkZTAwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RkLmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9iYXNlL2RkLmMKQEAgLTE0MzYsMyAmIzQzOzE0MzYsODUgQEAgdm9pZCBkcml2ZXJfZGV0YWNoKGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCiAJCXB1dF9kZXZpY2UoZGV2KTsKIAl9CiB9CiYjNDM7CiYjNDM7c3RydWN0IGRldmljZV9yZXByb2JlIHsKJiM0MzsJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiYjNDM7CWNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBkZXZpY2VfcmVwcm9iZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZXZpY2VfcmVwcm9iZSAqcnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRldmljZV9yZXByb2JlLAomIzQzOwkJCQkJCSB3b3JrLndvcmspOwomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBycC0mZ3Q7ZGV2OwomIzQzOwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBkZXYtJmd0O3BhcmVudDsKJiM0MzsJYm9vbCBkZXRhY2hlZCA9IGZhbHNlOwomIzQzOwomIzQzOwlfX2RldmljZV9kcml2ZXJfbG9jayhkZXYsIHBhcmVudCk7CiYjNDM7CS8qCiYjNDM7CSAqIHJwLSZndDtkcnYgaXMgb25seSBldmVyIGNvbXBhcmVkLCBuZXZlciBkZXJlZmVyZW5jZWQ6IHRoZSBkcml2ZXIgaXQKJiM0MzsJICogcG9pbnRzIHRvIG1heSBoYXZlIGJlZW4gdW5yZWdpc3RlcmVkIGFuZCBmcmVlZCBieSBub3cuCiYjNDM7CSAqLwomIzQzOwlpZiAoIWRldi0mZ3Q7cC0mZ3Q7ZGVhZCAmYW1wOyZhbXA7ICFkZXYtJmd0O3AtJmd0O3NodXRkb3duX2RvbmUgJmFtcDsmYW1wOwomIzQzOwkgICAgZGV2LSZndDtkcml2ZXIgJmFtcDsmYW1wOyBkZXYtJmd0O2RyaXZlciA9PSBycC0mZ3Q7ZHJ2KSB7CiYjNDM7CQlfX2RldmljZV9yZWxlYXNlX2RyaXZlcihkZXYsIHBhcmVudCk7CiYjNDM7CQlkZXRhY2hlZCA9IHRydWU7CiYjNDM7CX0KJiM0MzsJX19kZXZpY2VfZHJpdmVyX3VubG9jayhkZXYsIHBhcmVudCk7CiYjNDM7CiYjNDM7CWlmIChkZXRhY2hlZCAmYW1wOyZhbXA7IGRldmljZV9hdHRhY2goZGV2KSAmbHQ7IDApCiYjNDM7CQlkZXZfZXJyKGRldiwgJiMzNDtyZS1wcm9iZSBmYWlsZWQsIGRldmljZSBsZWZ0IHVuYm91bmRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcHV0X2RldmljZShkZXYpOwomIzQzOwlrZnJlZShycCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGRldmljZV9zY2hlZHVsZV9yZXByb2JlIC0gc2NoZWR1bGUgYSBkZWZlcnJlZCBkZXRhY2ggYW5kIHJlLXByb2JlCiYjNDM7ICogQGRldjogZGV2aWNlIHRvIGRldGFjaCBhbmQgcmUtcHJvYmUKJiM0MzsgKiBAZGVsYXlfbXM6IGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHJlLXByb2JlIHJ1bnMKJiM0MzsgKgomIzQzOyAqIFNjaGVkdWxlIGEgZGV0YWNoIGFuZCByZS1wcm9iZSBvZiBAZGV2IGFmdGVyIEBkZWxheV9tcyBtaWxsaXNlY29uZHMuCiYjNDM7ICogVGhlIHJlLXByb2JlIGlzIHNraXBwZWQgaWYsIGJ5IHRoZSB0aW1lIHRoZSBzY2hlZHVsZWQgd29yayBydW5zLCB0aGUKJiM0MzsgKiBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCwgdGhlIHN5c3RlbSBzaHV0ZG93biBzZXF1ZW5jZSBoYXMgcmVhY2hlZCB0aGUKJiM0MzsgKiBkZXZpY2UsIG9yIEBkZXYgaXMgbm8gbG9uZ2VyIGJvdW5kIHRvIHRoZSBkcml2ZXIgdGhhdCB3YXMgYm91bmQgYXQKJiM0MzsgKiBzY2hlZHVsaW5nIHRpbWUuIEluIHBhcnRpY3VsYXIgYW4gYWRtaW5pc3RyYXRpdmUgdW5iaW5kIGlzIG5ldmVyCiYjNDM7ICogdW5kb25lIGJ5IGEgc3RhbGUgcmUtcHJvYmUuCiYjNDM7ICoKJiM0MzsgKiBUaGUgd29yayBmdW5jdGlvbiBpcyBidWlsdC1pbiB0ZXh0LCBzbyB0aGUgYm91bmQgZHJpdmVyIG1heSBjYWxsIHRoaXMKJiM0MzsgKiBmcm9tIGl0cyBvd24gY29kZSB3aXRob3V0IGhvbGRpbmcgYSBtb2R1bGUgcmVmZXJlbmNlLiBJZiB0aGUgZHJpdmVyCiYjNDM7ICogbW9kdWxlIGlzIHVubG9hZGVkIGJlZm9yZSB0aGUgd29yayBydW5zLCBkcml2ZXIgdW5yZWdpc3RyYXRpb24gdW5iaW5kcwomIzQzOyAqIEBkZXYgZmlyc3QgYW5kIHRoZSBzY2hlZHVsZWQgd29yayBkb2VzIG5vdGhpbmcuCiYjNDM7ICoKJiM0MzsgKiBNdWx0aXBsZSBwZW5kaW5nIHJlLXByb2JlcyBmb3IgdGhlIHNhbWUgZGV2aWNlIGFyZSBpbmRpdmlkdWFsbHkgc2FmZTsKJiM0MzsgKiBhIGNhbGxlciB0aGF0IHdhbnRzIGF0IG1vc3Qgb25lIHBlbmRpbmcgcmUtcHJvYmUgbXVzdCBnYXRlIHNjaGVkdWxpbmcKJiM0MzsgKiBpdHNlbGYuCiYjNDM7ICoKJiM0MzsgKiBNYXkgb25seSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgQGRldiBpcyBub3QgYSByZWdpc3RlcmVkIGRldmljZQomIzQzOyAqIGJvdW5kIHRvIGEgZHJpdmVyLCAtRU5PTUVNIG9uIGFsbG9jYXRpb24gZmFpbHVyZS4KJiM0MzsgKi8KJiM0MztpbnQgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZGV2aWNlX3JlcHJvYmUgKnJwOwomIzQzOwomIzQzOwlpZiAoIWRldi0mZ3Q7YnVzIHx8ICFkZXYtJmd0O3AgfHwgIWRldmljZV9pc19yZWdpc3RlcmVkKGRldikpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJaWYgKCFkZXYtJmd0O2RyaXZlcikKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlycCA9IGt6YWxsb2Nfb2JqKCpycCk7CiYjNDM7CWlmICghcnApCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJcnAtJmd0O2RldiA9IGdldF9kZXZpY2UoZGV2KTsKJiM0MzsJcnAtJmd0O2RydiA9IFJFQURfT05DRShkZXYtJmd0O2RyaXZlcik7CiYjNDM7CUlOSVRfREVMQVlFRF9XT1JLKCZhbXA7cnAtJmd0O3dvcmssIGRldmljZV9yZXByb2JlX3dvcmtfZm4pOwomIzQzOwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX2RmbF93cSwgJmFtcDtycC0mZ3Q7d29yaywKJiM0MzsJCQkgICBtc2Vjc190b19qaWZmaWVzKGRlbGF5X21zKSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvTWFrZWZpbGUKaW5kZXggYTdiZTBlNjY2OWRmYS4uYmNjYWMwZDBmNzAzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZQpAQCAtMSwzICYjNDM7MSwzIEBACiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiBvYmotJChDT05GSUdfTkVUX0RTQV9NWEw4NjIpICYjNDM7PSBteGw4NjJ4eF9kc2EubwotbXhsODYyeHhfZHNhLXkgOj0gbXhsODYyeHgubyBteGw4NjJ4eC1ob3N0Lm8gbXhsODYyeHgtcGh5bGluay5vCiYjNDM7bXhsODYyeHhfZHNhLXkgOj0gbXhsODYyeHgubyBteGw4NjJ4eC1ob3N0Lm8gbXhsODYyeHgtcGh5bGluay5vIG14bDg2Mnh4LWZ3Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1hcGkuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1hcGkuaAppbmRleCBhMTgwYTVkZWNmZmMwLi42Zjc3MTg5NTk4NGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtYXBpLmgKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oCkBAIC0xMjI0LDYgJiM0MzsxMjI0LDE2IEBAIHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB7CiAJX19sZTMyIGl2X2J1aWxkX251bTsKIH0gX19wYWNrZWQ7CiAKJiM0MzsvKioKJiM0MzsgKiBzdHJ1Y3QgbXhsODYyeHhfc3lzX3JlZ19ydyAtIFN5c3RlbSByZWdpc3RlciByZWFkL3dyaXRlCiYjNDM7ICogQGFkZHI6IDMyLWJpdCByZWdpc3RlciBhZGRyZXNzCiYjNDM7ICogQHZhbDogcmVnaXN0ZXIgdmFsdWUKJiM0MzsgKi8KJiM0MztzdHJ1Y3QgbXhsODYyeHhfc3lzX3JlZ19ydyB7CiYjNDM7CV9fbGUzMiBhZGRyOwomIzQzOwlfX2xlMzIgdmFsOwomIzQzO30gX19wYWNrZWQ7CiYjNDM7CiAvKioKICAqIGVudW0gbXhsODYyeHhfcG9ydF90eXBlIC0gUG9ydCBUeXBlCiAgKiBATVhMODYyWFhfTE9HSUNBTF9QT1JUOiBMb2dpY2FsIFBvcnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1jbWQuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1jbWQuaAppbmRleCBjODdhOTU1YzEzYzQ4Li5hODY1NDI1YWE2MWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtY21kLmgKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oCkBAIC03MCw3ICYjNDM7NzAsOSBAQAogI2RlZmluZSBJTlRfR1BIWV9SRUFECQkJKEdQWV9HUFkyWFhfTUFHSUMgJiM0MzsgMHgxKQogI2RlZmluZSBJTlRfR1BIWV9XUklURQkJCShHUFlfR1BZMlhYX01BR0lDICYjNDM7IDB4MikKIAomIzQzOyNkZWZpbmUgU1lTX01JU0NfRldfVVBEQVRFCQkoU1lTX01JU0NfTUFHSUMgJiM0MzsgMHgxKQogI2RlZmluZSBTWVNfTUlTQ19GV19WRVJTSU9OCQkoU1lTX01JU0NfTUFHSUMgJiM0MzsgMHgyKQomIzQzOyNkZWZpbmUgU1lTX01JU0NfUkVHX1JECQkJKFNZU19NSVNDX01BR0lDICYjNDM7IDB4OCkKIAogI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19DT05GSUcJKE1YTDg2MlhYX1hQQ1NfTUFHSUMgJiM0MzsgMHgxKQogI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19HRVRfU1RBVEUJKE1YTDg2MlhYX1hQQ1NfTUFHSUMgJiM0MzsgMHgyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5iNmUwMzdkOTU2NDBiCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMKQEAgLTAsMCAmIzQzOzEsMTA1NCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCiYjNDM7LyoKJiM0MzsgKiBGaXJtd2FyZSBmbGFzaCBhbmQgZGV2bGluayBzdXBwb3J0IGZvciBNYXhMaW5lYXIgTXhMODYyeHgKJiM0MzsgKgomIzQzOyAqIENvcHlyaWdodCAoQykgMjAyNSBEYW5pZWwgR29sbGUgJmx0O2RhbmllbEBtYWtyb3RvcGlhLm9yZyZndDsKJiM0MzsgKgomIzQzOyAqIFNCIFBESSAtIGZpcm13YXJlIGRvd25sb2FkIGludGVyZmFjZSBvdmVyIGNsYXVzZS0yMiBTTURJTwomIzQzOyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQomIzQzOyAqCiYjNDM7ICogVGhlIE14TDg2Mnh4IE1DVWJvb3QgbG9hZGVyIGFjY2VwdHMgYSBmaXJtd2FyZSBpbWFnZSB0aHJvdWdoIGZvdXIgJiMzNDtTQiBQREkmIzM0OwomIzQzOyAqIHJlZ2lzdGVycyBpbiB0aGUgc3dpdGNoIFNNRElPIHJlZ2lzdGVyIHNwYWNlLiBJdCBydW5zIHdoZW5ldmVyIG5vIFdTUAomIzQzOyAqIGZpcm13YXJlIGlzIGFjdGl2ZTogdGhlIG5vcm1hbCBmaXJtd2FyZSB1cGRhdGUgZW50ZXJzIGl0IGRlbGliZXJhdGVseSAtIHRoZQomIzQzOyAqIFNZU19NSVNDX0ZXX1VQREFURSBBUEkgY29tbWFuZCBzZXRzIGEgc3RpY2t5IHJlc2N1ZSBiaXQgYW5kIHJlYm9vdHMgaW50bwomIzQzOyAqIE1DVWJvb3QgLSBhbmQgdGhlIGxvYWRlciBhbHNvIHN0YXlzIGhlcmUgd2hlbiB0aGUgc3RvcmVkIFdTUCBmaXJtd2FyZSBmYWlscwomIzQzOyAqIGl0cyBib290LXRpbWUgaW50ZWdyaXR5IGNoZWNrLiBUaGlzIGRyaXZlciBkcml2ZXMgdGhlIGxvYWRlciYjMzk7cyAweGM1NWMKJiM0MzsgKiAmIzM0O2NvbnNvbGUmIzM0OyBkb3dubG9hZCBwYXRoLgomIzQzOyAqCiYjNDM7ICogU01ESU8gcmVnaXN0ZXIgYWNjZXNzIChteGw4NjJ4eF9zbWRpb19yZWFkL3dyaXRlKToKJiM0MzsgKiAgIE1JSSByZWcgMHgxZiA6PSAoJmx0O3NiX3BkaV9yZWcmZ3Q7ICZhbXA7IDB4ZmZmMCkgICA7IHBhZ2UgbGF0Y2gKJiM0MzsgKiAgIE1JSSByZWcgKCZsdDtzYl9wZGlfcmVnJmd0OyAmYW1wOyAweDAwMGYpIDo9IC8gPSZndDsgJmx0O3UxNiBkYXRhJmd0OwomIzQzOyAqIHNvIENUUkwvQUREUi9EQVRBL1NUQVQgKDB4ZTEwMC4uMHhlMTAzKSBhcmUgTUlJIHJlZ3MgMC8xLzIvMyBvZiBwYWdlCiYjNDM7ICogMHhlMTAwLCBub3QgYWxsIHJlZyAweDAwLgomIzQzOyAqCiYjNDM7ICogU0IgUERJIHJlZ2lzdGVycyAoaG9zdCBuYW1lL2FkZHIgIC0mZ3Q7ICBNQ1UgbWFpbGJveCk6CiYjNDM7ICogICBDVFJMIDB4ZTEwMCAtJmd0OyAweGMwOTM4NDAwICAgbW9kZTogUlNUPTB4MDAgIFJEPTB4MDEgIFdSPTB4MDIKJiM0MzsgKiAgIEFERFIgMHhlMTAxIC0mZ3Q7IDB4YzA5Mzg0MDQgICBTQiB0YXJnZXQgd29yZCBhZGRyZXNzIChTQjEgYmFuayA9IDB4NzgwMCkKJiM0MzsgKiAgIERBVEEgMHhlMTAyIC0mZ3Q7IDB4YzA5Mzg0MDggICAxNi1iaXQgZGF0YSAvIHJlcGx5IHdvcmQKJiM0MzsgKiAgIFNUQVQgMHhlMTAzIC0mZ3Q7IDB4YzA5Mzg0MGMgICBoYW5kc2hha2U6IGEgbWFnaWMgKGJlbG93KSBvciBhIGJ5dGUgY291bnQKJiM0MzsgKgomIzQzOyAqIFNUQVQgbWFnaWNzOgomIzQzOyAqICAgUkVBRFkgIDB4YzU1YyAgIGxvYWRlciBpZGxlIGluIHRoZSBjb25zb2xlIGxvb3AgICAgICAgICh0aGlzIGRyaXZlcikKJiM0MzsgKiAgIERMX1JEWSAweGMzM2MgICBsb2FkZXIgaWRsZSBpbiB0aGUgZmxhc2hsZXNzIGxvb3AKJiM0MzsgKiAgIFNUQVJUICAweGY0OGYgICBob3N0ICAgLSZndDsgYmVnaW4gZG93bmxvYWQgc2Vzc2lvbgomIzQzOyAqICAgQUNLICAgIDB4ZjQ5MCAgIGxvYWRlciAtJmd0OyBTVEFSVCBhY2tub3dsZWRnZWQgKFNUQVJUICYjNDM7IDEpCiYjNDM7ICogICBFTkQgICAgMHgzY2MzICAgaG9zdCAgIC0mZ3Q7IGZpbmFsaXNlIG5vdyAob3B0aW9uYWwsIHNlZSBiZWxvdykKJiM0MzsgKiAgIFJEUkVHICAweGUyYzAgICBob3N0ICAgLSZndDsgcmVnaXN0ZXItcmVhZCBjb21tYW5kICh8IGluZGV4KSwgc2VlIGJlbG93CiYjNDM7ICoKJiM0MzsgKiBDb25zb2xlIGZsYXNoIHBhdGggKFNUQVQ9MHhjNTVjKSAtIG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKCk6CiYjNDM7ICoKJiM0MzsgKiAgIGhvc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcgomIzQzOyAqICAgLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tCiYjNDM7ICogICByZXNldCAoQ1RSTD1BRERSPURBVEE9MCkKJiM0MzsgKiAgIHJlYWQgU1RBVCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDB4YzU1YyAgIChSRUFEWSwgaWRsZSkKJiM0MzsgKiAgIFNUQVQgOj0gU1RBUlQoMHhmNDhmKSAgLS0tLS0tLS0tLS0tLS0mZ3Q7CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICZsdDstLS0tLS0tLS0tLS0tLSBTVEFUID0gMHhmNDkwIChBQ0spCiYjNDM7ICogICBDVFJMIDo9IFdSCiYjNDM7ICogICBEQVRBIDo9IGhkclswLi45XSAgKDIwLWJ5dGUgaGVhZGVyOiB0eXBlLHNpemUxLGNyYzEsc2l6ZTIsY3JjMikKJiM0MzsgKiAgIHJlc2V0OyBTVEFUIDo9IDIwIChoZWFkZXIgbGVuKSAgLS0tLS0mZ3Q7IHBhcnNlIGhkcjsgcl9yZW1haW49c2l6ZTEmIzQzO3NpemUyOwomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJBU0UgdGFyZ2V0IHJlZ2lvbihzKQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7LS0tLS0tLS0tLS0tLS0gU1RBVD0yMSAobGVuJiM0MzsxKSwgdGhlbiBTVEFUPTAKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcmFzZWQpCiYjNDM7ICogICAtLSBwYXlsb2FkLCBzdHJlYW1lZCBpbiBzbGljZXM6IC0tCiYjNDM7ICogICBDVFJMIDo9IFdSCiYjNDM7ICogICBEQVRBIDo9IHdvcmQgeCBOIC4uLgomIzQzOyAqICAgICBhdCB3b3JkIDE2Mzg0OiBDVFJMOj1SU1Q7IEFERFI6PTB4NzgwMDsgQ1RSTDo9V1IgIChoYWxmLWJhbmsgLSZndDsgU0IxKQomIzQzOyAqICAgICBhdCB3b3JkIDMyNzYwOiBmbHVzaCBzbGljZToKJiM0MzsgKiAgICAgICAgcmVzZXQ7IFNUQVQgOj0gJmx0O2J5dGVzX3RoaXNfc2xpY2UmZ3Q7IC0tLSZndDsgcl9yZW1haW4gLT0gYnl0ZXM7IHByb2dyYW0KJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0Oy0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBVD0wICAocmVhZHkgZm9yIG5leHQgc2xpY2UpCiYjNDM7ICogICAuLi4gcmVwZWF0IHVudGlsIHRoZSB3aG9sZSBwYXlsb2FkIGlzIHNlbnQgLi4uCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgICZsdDstLS0tLS0tLS0tLS0tLS0tLS0tIFNUQVQ9MCAgaW1hZ2UgdmVyaWZpZWQKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNUQVQ9MTogaW1hZ2UgcmVqZWN0ZWQpCiYjNDM7ICogICBTVEFUIDo9IEVORCgweDNjYzMpICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0mZ3Q7IGZpbmFsaXNlIGFuZCBib290CiYjNDM7ICoKJiM0MzsgKiBUaGUgcl9yZW1haW4gPT0gMCBydWxlIChjcml0aWNhbCk6CiYjNDM7ICogICBFdmVyeSBob3N0IFNUQVQgd3JpdGUgaW4gdGhlIHBheWxvYWQgcGhhc2UgaXMgYSBieXRlIGNvdW50OyB0aGUgbG9hZGVyCiYjNDM7ICogICBkb2VzIHJfcmVtYWluIC09IGNvdW50IGFuZCBzdGF5cyBpbiB0aGUgcmVjZWl2ZSBsb29wIHdoaWxlIHJfcmVtYWluICE9IDAuCiYjNDM7ICogICBJdCBsZWF2ZXMgdGhlIGxvb3AgT05MWSB3aGVuIHJfcmVtYWluIGhpdHMgRVhBQ1RMWSAwLCBhbmQgYSBjb3VudCBsYXJnZXIKJiM0MzsgKiAgIHRoYW4gcl9yZW1haW4gdW5kZXJmbG93cyB0aGUgMzItYml0IGNvdW50ZXIgYW5kIHdlZGdlcyB0aGUgbG9hZGVyIHVudGlsIGEKJiM0MzsgKiAgIHBvd2VyIGN5Y2xlLiBIYXZpbmcgbGVmdCBpdCwgdGhlIGxvYWRlciB2ZXJpZmllcyB0aGUgaW1hZ2UsIHB1Ymxpc2hlcyB0aGUKJiM0MzsgKiAgIHZlcmRpY3QgaW4gU1RBVCAoMCBnb29kLCAxIHJlamVjdGVkKSBhbmQgd2FpdHMgMiBzIGZvciBFTkQgYmVmb3JlCiYjNDM7ICogICBmaW5hbGlzaW5nIHJlZ2FyZGxlc3MgLS0gY2xlYXJpbmcgaXRzIHJlc2N1ZS1lbmFibGUgYml0IHNvIGJvb3RfZ28gYm9vdHMKJiM0MzsgKiAgIHRoZSBuZXcgaW1hZ2UgLS0gc28gRU5EIG9ubHkgc2F2ZXMgdGhhdCB3YWl0LiBIZW5jZToKJiM0MzsgKiAgICAgLSBuZXZlciBzZW5kIGEgc2xpY2UvY2h1bmsgY291bnQgbGFyZ2VyIHRoYW4gd2hhdCBpcyBvdXRzdGFuZGluZzsKJiM0MzsgKiAgICAgLSBhIFNUQVQgd3JpdGUgaXMgYSBjb21tYW5kIG9ubHkgb25jZSB0aGUgbG9hZGVyIGhhcyBsZWZ0IHRoZSBsb29wOwomIzQzOyAqICAgICAtIHRoZSBsb2FkZXIgbGVhdmVzIHRoZSBjb3VudCBpbiBTVEFUIHdoaWxlIGl0IHByb2dyYW1zIHRoZSBjaHVuaywgc28KJiM0MzsgKiAgICAgICBhIGxpbmdlcmluZyBjb3VudCBkb2VzIG5vdCBkaXN0aW5ndWlzaCAmIzM0O2J1c3kmIzM0OyBmcm9tICYjMzQ7dmVyZGljdCYjMzQ7OwomIzQzOyAqICAgICAtIGludGVycnVwdGVkLWRvd25sb2FkIHJlY292ZXJ5IGZlZWRzIDEgYnl0ZSBhdCBhIHRpbWUgKHNlZSBiZWxvdykuCiYjNDM7ICoKJiM0MzsgKiBJbnRlcnJ1cHRlZC1mbGFzaCByZWNvdmVyeSAobXhsODYyeHhfcmVzY3VlX2RyYWluKToKJiM0MzsgKiAgIEEgaG9zdCB0aGF0IGRpZXMgbWlkLXBheWxvYWQgbGVhdmVzIHRoZSBsb2FkZXIgaW4gdGhlIHJlY2VpdmUgbG9vcCBob2xkaW5nCiYjNDM7ICogICBTVEFUPTAuIEZlZWQgc2luZ2xlIDEtYnl0ZSBjaHVua3MgKG9uZSBEQVRBIHdvcmQgJiM0MzsgU1RBVD0xKSB1bnRpbCByX3JlbWFpbgomIzQzOyAqICAgcmVhY2hlcyAwOyB0aGUgbG9hZGVyIHRoZW4gdmVyaWZpZXMgdGhlIChub3cgY29ycnVwdCkgaW1hZ2UsIHB1Ymxpc2hlcyBpdHMKJiM0MzsgKiAgIHZlcmRpY3QgYW5kIGNvbWVzIGJhY2sgdG8gUkVBRFkgYnkgaXRzZWxmLiBFTkQgaXMgbmV2ZXIgc2VudCBoZXJlOiB3aGlsZQomIzQzOyAqICAgcl9yZW1haW4gaXMgbm9uLXplcm8gaXQgd291bGQgYmUgY29uc3VtZWQgYXMgYSAxNTU1NS1ieXRlIGNvdW50LCBhbmQgYQomIzQzOyAqICAgbGluZ2VyaW5nIFNUQVQ9MSBjYW5ub3QgYmUgdG9sZCBmcm9tIGEgY2h1bmsgc3RpbGwgYmVpbmcgcHJvZ3JhbW1lZC4KJiM0MzsgKgomIzQzOyAqIFJlZ2lzdGVyLXJlYWQgY2hhbGxlbmdlIChub24tZGVzdHJ1Y3RpdmUgbGl2ZW5lc3MgcHJvb2YpOgomIzQzOyAqICAgREFUQSA6PSAweDdjMjMgKG1hcmtlcik7IFNUQVQgOj0gMHhlMmMwfGlkeAomIzQzOyAqICAgICAtJmd0OyBsb2FkZXIgcmV0dXJucyBhIHJ1bnRpbWUgd29yZCBpbiBEQVRBIGFuZCByZS1hcm1zIFNUQVQ9MHhjNTVjLgomIzQzOyAqICAgVGhlIHJlcGx5IHNvdXJjZSBpcyBsb2FkZXIgQlNTLCBub3QgYSBjaGlwIGlkOyB1c2VkIG9ubHkgdG8gcHJvdmUgYSBsaXZlCiYjNDM7ICogICBtYWlsYm94IGluIG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdCgpLgomIzQzOyAqCiYjNDM7ICogVGhlIG90aGVyIFNUQVQgcmVhZHkgbWFnaWMsIDB4YzMzYywgbWFya3MgdGhlIGxvYWRlciYjMzk7cyBmbGFzaGxlc3MKJiM0MzsgKiBjaGlwLXRvLWNoaXAgZG93bmxvYWQgbW9kZSAoTXhMODYyODFTIDE2LXBvcnQgdGllcik7IHRoaXMgZHJpdmVyIGRvZXMgbm90CiYjNDM7ICogdXNlIGl0LgomIzQzOyAqCiYjNDM7ICogUmVzY3VlIGxpZmVjeWNsZSAoZGV2bGluayk6IHByb2JlIHJ1bnMgbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KCk7IGEKJiM0MzsgKiB3ZWRnZWQgbG9hZGVyIGlzIGRyYWluZWQgYmFjayB0byBSRUFEWSBieSBhIGJhY2tncm91bmQgc2VsZi1oZWFsCiYjNDM7ICogKHJlc2N1ZV9oZWFsX3dvcmspLCBzbyB0aGUgbG9uZyByZWNvdmVyeSBuZXZlciBob2xkcyB0aGUgZGV2bGluayBsb2NrLgomIzQzOyAqIGRldmxpbmsgZGV2IGluZm8gZXhwb3NlcyB0aGUgZncgdmVyc2lvbiAodGhlICYjMzQ7Zmxhc2hhYmxlJiMzNDsgc2lnbmFsKSBvbmx5IG9uY2UgYXQKJiM0MzsgKiBSRUFEWTsgZmxhc2hfdXBkYXRlIHJldHVybnMgLUVCVVNZIHVudGlsIHRoZW4sIGFuZCByZXByb2JlcyB0byBXU1AgZmlybXdhcmUKJiM0MzsgKiBvbiBzdWNjZXNzLgomIzQzOyAqCiYjNDM7ICogTm90ZXM6CiYjNDM7ICogICAtIENoaXAgaWQvcmV2aXNpb24gKDB4YzBkMjg4ODQvODgpIGFyZSBOT1QgcmVhY2hhYmxlIG9uIHRoaXMgY2hhbm5lbDsgdGhleQomIzQzOyAqICAgICBuZWVkIHRoZSBjbGF1c2UtNDUgTU1EIGZpcm13YXJlIG1haWxib3gsIHdoaWNoIGlzIGRlYWQgdW5kZXIgTUNVYm9vdC4KJiM0MzsgKiAgICAgUmVzY3VlIGlkZW50aXR5IGlzIGJ5IFNCIFBESSBiZWhhdmlvdXIgb25seSAobXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KS4KJiM0MzsgKiAgIC0gVGhlIFNNRElPIFBIWSBhZGRyZXNzIGNvbWVzIGZyb20gdGhlIGRldmljZSB0cmVlOyB0aGUgMHhlMXh4IHJlZ2lzdGVyCiYjNDM7ICogICAgIG9mZnNldHMgYXJlIHRoZSBPVFAgcmVzZXQgZGVmYXVsdHMgYW5kIHRoZSBvbmx5IGxheW91dCBzdXBwb3J0ZWQgaGVyZS4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY3JjMzIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZGVsYXkuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZGV2aWNlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2lvcG9sbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9uZXRkZXZpY2UuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvb3ZlcmZsb3cuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcnRuZXRsaW5rLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3dvcmtxdWV1ZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtuZXQvZHNhLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O25ldC9zd2l0Y2hkZXYuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O214bDg2Mnh4LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7bXhsODYyeHgtYXBpLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7bXhsODYyeHgtY21kLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7bXhsODYyeHgtZncuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1ob3N0LmgmIzM0OwomIzQzOwomIzQzOy8qIFNCIFBESSByZWdpc3RlcnMgKGNsYXVzZS0yMiBTTURJTyBhZGRyZXNzIHNwYWNlKSAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkwJCTB4ZTEwMAomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0FERFIJCTB4ZTEwMQomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0RBVEEJCTB4ZTEwMgomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1NUQVQJCTB4ZTEwMwomIzQzOwomIzQzOy8qIFNCIFBESSBDVFJMIG1vZGVzICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QJMHgwMAomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IJCTB4MDIKJiM0MzsKJiM0MzsvKiBTQiBQREkgaGFuZHNoYWtlIG1hZ2ljIChwdWJsaXNoZWQvY29uc3VtZWQgdmlhIFNUQVQpICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfUkVBRFkJCTB4YzU1YwkvKiBsb2FkZXIgaWRsZSwgY29uc29sZSBsb29wICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfRExfUkVBRFkJMHhjMzNjCS8qIGxvYWRlciBpZGxlLCBmbGFzaGxlc3MgbG9vcCAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1NUQVJUCQkweGY0OGYKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9FTkQJCTB4M2NjMwomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1JEUkVHCQkweGUyYzAJLyogcmVnaXN0ZXItcmVhZCBjbWQgKHwgaW5kZXgpICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfUkRSRUdfTUFSSwkweDdjMjMJLyogbWFya2VyIHBsYWNlZCBpbiBEQVRBIGZvciBSRFJFRyAqLwomIzQzOwomIzQzOy8qIEJlaGF2aW91cmFsIHByZXNlbmNlIHByb2JlOiB0d28gZGlzdGluY3QgMTYtYml0IGxhdGNoZXMgb24gQUREUi9EQVRBLiAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1BST0JFX0EJCTB4NWE1YQomIzQzOyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1BST0JFX0QJCTB4YTVhNQomIzQzOwomIzQzOy8qIEltYWdlIHZlcmlmaWNhdGlvbiB2ZXJkaWN0IHB1Ymxpc2hlZCBpbiBTVEFUIG9uY2UgdGhlIHJlY2VpdmUgbG9vcCBlbmRzICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX09LCTAKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9WRVJJRllfQkFECTEKJiM0MzsKJiM0MzsvKiBGaXJtd2FyZSB0cmFuc2ZlciBnZW9tZXRyeSAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfSERSX1NJWkUJCTIwCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX0hBTEYJCTE2Mzg0CS8qIHdvcmRzIHBlciBoYWxmLWJhbmsgKi8KJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0ZXX0JBTktfU0xJQ0UJCTMyNzYwCS8qIHdvcmRzIHBlciBmdWxsIHNsaWNlICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19TQjFfQUREUgkJMHg3ODAwCS8qIFNCMSB3b3JkIGFkZHJlc3MgKi8KJiM0MzsKJiM0MzsvKiBUaW1lb3V0cyAoZ2VuZXJvdXMgdXBwZXIgYm91bmRzKSAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfUkVBRFlfVElNRU9VVF9NUwkzMDAwCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19BQ0tfVElNRU9VVF9NUwk1MDAwCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9GV19FUkFTRV9USU1FT1VUX01TCTMwMDAwMAomIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfV1JJVEVfVElNRU9VVF9NUwk2MDAwMAomIzQzOyNkZWZpbmUgTVhMODYyWFhfRldfUkVCT09UX0RFTEFZX01TCTUwMDAKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVMJNTAwCiYjNDM7LyogT25lIGxvYWRlciBtYWlsYm94IHN0ZXA6IHByb2dyYW0gYSAxLWJ5dGUgY2h1bmsgb3Igc2VydmljZSBhIGNvbW1hbmQgKi8KJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TCQkyMDAwCiYjNDM7LyogQ292ZXJzIHRoZSBsb2FkZXImIzM5O3MgRU5EIHdhaXQsIHZlcmlmaWNhdGlvbiBhbmQgdGhlIHJlc2V0IGludG8gUkVBRFkgKi8KJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9WRVJJRllfTVMJMTUwMDAKJiM0MzsKJiM0MztzdGF0aWMgaW50IG14bDg2Mnh4X3NiX3BkaV9yZXNldChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdikKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLAomIzQzOwkJCQkgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9BRERSLAomIzQzOwkJCQkgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldHVybiBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwKJiM0MzsJCQkJICAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGV4cGVjdGVkLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcykKJiM0Mzt7CiYjNDM7CWludCByZXQsIHZhbDsKJiM0MzsKJiM0MzsJcmV0ID0gcmVhZF9wb2xsX3RpbWVvdXQobXhsODYyeHhfc21kaW9fcmVhZCwgdmFsLAomIzQzOwkJCQl2YWwgJmx0OyAwIHx8ICh1MTYpdmFsID09IGV4cGVjdGVkLAomIzQzOwkJCQkxMDAwMCwgdGltZW91dF9tcyAqIDEwMDAsIGZhbHNlLAomIzQzOwkJCQlwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7CiYjNDM7CWlmICh2YWwgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHZhbDsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2Uoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsCiYjNDM7CQkJCSAgICAgICB1MzIgZGF0YV93cml0dGVuKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULCBkYXRhX3dyaXR0ZW4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldHVybiBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIDAsCiYjNDM7CQkJCQkgTVhMODYyWFhfRldfV1JJVEVfVElNRU9VVF9NUyk7CiYjNDM7fQomIzQzOwomIzQzOy8qIEZsdXNoIHRoZSBsYXN0IHNsaWNlLCB3aGljaCBlbmRzIHRoZSByZWNlaXZlIGxvb3A6IHRoZSBsb2FkZXIgdmVyaWZpZXMgdGhlCiYjNDM7ICogaW1hZ2UgYW5kIHJlcGxhY2VzIHRoZSBjb3VudCBpbiBTVEFUIHdpdGggaXRzIHZlcmRpY3QsIHNvIHdhaXQgZm9yIHRoZSBjb3VudAomIzQzOyAqIHRvIGdvIHJhdGhlciB0aGFuIGZvciBhIGZpeGVkIHZhbHVlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX2ZsdXNoX2xhc3Qoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsCiYjNDM7CQkJCSAgICAgIHUzMiBkYXRhX3dyaXR0ZW4pCiYjNDM7ewomIzQzOwlpbnQgcmV0LCB2YWw7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwgZGF0YV93cml0dGVuKTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSByZWFkX3BvbGxfdGltZW91dChteGw4NjJ4eF9zbWRpb19yZWFkLCB2YWwsCiYjNDM7CQkJCXZhbCAmbHQ7IDAgfHwgKHUxNil2YWwgIT0gKHUxNilkYXRhX3dyaXR0ZW4sCiYjNDM7CQkJCTEwMDAwLCAoTVhMODYyWFhfRldfV1JJVEVfVElNRU9VVF9NUyAmIzQzOwomIzQzOwkJCQkJTVhMODYyWFhfU0JfUERJX1ZFUklGWV9NUykgKiAxMDAwLAomIzQzOwkJCQlmYWxzZSwgcHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQpOwomIzQzOwlpZiAodmFsICZsdDsgMCkKJiM0MzsJCXJldHVybiB2YWw7CiYjNDM7CiYjNDM7CWlmICghcmV0ICZhbXA7JmFtcDsgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1ZFUklGWV9PSykKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwkvKiBBIGZpbmFsIGNvdW50IG9mIDEgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgcmVqZWN0IHZlcmRpY3QsIHNvCiYjNDM7CSAqIGEgdGltZW91dCBzdGlsbCBob2xkaW5nIGl0IGxhbmRzIGhlcmUgdG9vLgomIzQzOwkgKi8KJiM0MzsJaWYgKCh1MTYpdmFsID09IE1YTDg2MlhYX1NCX1BESV9WRVJJRllfQkFEKSB7CiYjNDM7CQlkZXZfZXJyKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7ZGV2LAomIzQzOwkJCSYjMzQ7Zmxhc2g6IGxvYWRlciByZWplY3RlZCB0aGUgaW1hZ2VcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRUJBRE1TRzsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gcmV0ID8gcmV0IDogLUVQUk9UTzsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgbXhsODYyeHhfZmxhc2hfbm90aWZ5KHN0cnVjdCBkZXZsaW5rICpkbCwgY29uc3QgY2hhciAqc3RhdHVzLAomIzQzOwkJCQkgIHUzMiBkb25lLCB1MzIgdG90YWwpCiYjNDM7ewomIzQzOwlkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9zdGF0dXNfbm90aWZ5KGRsLCBzdGF0dXMsIE5VTEwsIGRvbmUsIHRvdGFsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQnl0ZS1jb3VudCBvZiBlYWNoIGNodW5rIGZlZCB0byB0aGUgbG9hZGVyIGR1cmluZyBkcmFpbi4gSXQgTVVTVCBiZSAxOiB0aGUKJiM0MzsgKiBsb2FkZXIgb25seSBsZXRzIHVzIG9ic2VydmUgJiMzNDtjb3VudGVyID09IDAmIzM0OywgbmV2ZXIgJiMzNDtjb3VudGVyICZsdDsgc3RlcCYjMzQ7LCBzbyBhbnkKJiM0MzsgKiBzdGVwICZndDsgMSBjYW4gc3VidHJhY3QgcGFzdCB6ZXJvLCB1bmRlcmZsb3cgdGhlIDMyLWJpdCBjb3VudGVyIGFuZCB3ZWRnZSB0aGUKJiM0MzsgKiBsb2FkZXIgZm9yIH4yXjMyIG1vcmUgYnl0ZXMgKGEgc3RhdGUgb25seSBhIHBvd2VyIGN5Y2xlIGNsZWFycykuIFN0ZXBwaW5nIGJ5CiYjNDM7ICogMSB3YWxrcyB0aGUgY291bnRlciB0aHJvdWdoIGV2ZXJ5IHZhbHVlIGFuZCBpcyBndWFyYW50ZWVkIHRvIGxhbmQgb24gemVybwomIzQzOyAqIHdoYXRldmVyIGl0cyAocG9zc2libHkgb2RkKSBzdGFydC4gQSAxLWJ5dGUgY2h1bmsgaXMgYSBwYXRoIHRoZSBsb2FkZXIKJiM0MzsgKiBhbHJlYWR5IGhhbmRsZXM6IHRoZSBub3JtYWwgdHJhbnNmZXIgZW5kcyB3aXRoIGEgc2luZ2xlIHRyYWlsaW5nIGJ5dGUgZm9yCiYjNDM7ICogb2RkLXNpemVkIGltYWdlcyAoc2VlIFN0ZXAgNikuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUwkxCiYjNDM7CiYjNDM7LyogTG9nIHRoZSBkcmFpbiYjMzk7cyBwcm9ncmVzcyBldmVyeSBzbyBtYW55IGJ5dGVzOyBpdCBjYW4gcnVuIGZvciBhIGxvbmcgdGltZSAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfRFJBSU5fTE9HX0JZVEVTCSgxMjggKiAxMDI0KQomIzQzOwomIzQzOy8qIFdhaXQgZm9yIHRoZSBsb2FkZXIgdG8gYXNrIGZvciB0aGUgbmV4dCBjaHVuayAoU1RBVCAwKSBvciB0byBjb21lIGJhY2sgdG8gaXRzCiYjNDM7ICogY29tbWFuZCBsb29wIChTVEFUIFJFQURZKSwgYW5kIHJldHVybiB0aGUgU1RBVCB2YWx1ZSBlaXRoZXIgd2F5LiBPbiB0aW1lb3V0CiYjNDM7ICogdGhhdCBpcyB3aGF0ZXZlciBTVEFUIHN0aWxsIGhvbGRzLCB3aGljaCBjYXJyaWVzIG5vIGZ1cnRoZXIgaW5mb3JtYXRpb246IHRoZQomIzQzOyAqIGxvYWRlciBrZWVwcyB0aGUgY291bnQgd2Ugd3JvdGUgdmlzaWJsZSB3aGlsZSBpdCBwcm9ncmFtcyB0aGUgY2h1bmssIGFuZCB0aGF0CiYjNDM7ICogaXMgdGhlIHNhbWUgdmFsdWUgaXQgcHVibGlzaGVzIGFzIHRoZSAmIzM0O2ltYWdlIHJlamVjdGVkJiMzNDsgdmVyZGljdCBvbmNlIHRoZQomIzQzOyAqIGNvdW50ZXIgcmVhY2hlcyB6ZXJvLgomIzQzOyAqCiYjNDM7ICogU1RBVCAwIGlzIHVuYW1iaWd1b3VzIGhlcmUgZXZlbiB0aG91Z2ggaXQgaXMgYWxzbyB0aGUgJiMzNDtpbWFnZSB2ZXJpZmllZCYjMzQ7CiYjNDM7ICogdmVyZGljdDogYnkgdGhlIHJfcmVtYWluID09IDAgcnVsZSB0aGUgbG9hZGVyIGxlYXZlcyB0aGUgcmVjZWl2ZSBsb29wIHRoZQomIzQzOyAqIG1vbWVudCB0aGUgY291bnRlciByZWFjaGVzIHplcm8sIHNvIGl0IGlzIG5ldmVyIGJvdGggaW5zaWRlIHRoZSBsb29wIGFza2luZwomIzQzOyAqIGZvciBhIGNodW5rIGFuZCBwdWJsaXNoaW5nIGEgdmVyZGljdC4gT25jZSBpdCBoYXMgbGVmdCwgdGhlIG5leHQgU1RBVCB3cml0ZQomIzQzOyAqIGlzIGEgY29tbWFuZCByYXRoZXIgdGhhbiBhIGNvdW50LCBzbyBmZWVkaW5nIG9uZSBtb3JlIGNodW5rIGFmdGVyIGEgdmVyZGljdAomIzQzOyAqIGNhbm5vdCB1bmRlcmZsb3cgYW55dGhpbmcgZWl0aGVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX3BvbGxfZHJhaW4oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcykKJiM0Mzt7CiYjNDM7CWludCB2YWw7CiYjNDM7CiYjNDM7CXJlYWRfcG9sbF90aW1lb3V0KG14bDg2Mnh4X3NtZGlvX3JlYWQsIHZhbCwKJiM0MzsJCQkgIHZhbCAmbHQ7IDAgfHwgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZIHx8CiYjNDM7CQkJICAodTE2KXZhbCA9PSAwLAomIzQzOwkJCSAgNTAsIHRpbWVvdXRfbXMgKiAxMDAwLCBmYWxzZSwKJiM0MzsJCQkgIHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFUKTsKJiM0MzsJaWYgKHZhbCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gdmFsOwomIzQzOwlyZXR1cm4gKHUxNil2YWw7CiYjNDM7fQomIzQzOwomIzQzOy8qIFRoZSBsb2FkZXIgaXMgbm90IGFza2luZyBmb3IgYSBjaHVuazogaXQgbWF5IHN0aWxsIGJlIHByb2dyYW1taW5nIHRoZSBsYXN0CiYjNDM7ICogb25lLCBvciB0aGUgY291bnRlciBoYXMgcmVhY2hlZCB6ZXJvIGFuZCBpdCBpcyB2ZXJpZnlpbmcgdGhlIGltYWdlIGFuZAomIzQzOyAqIHJlc2V0dGluZyBpbnRvIFJFQURZLiBXYWl0IHRoYXQgb3V0IC0tIFNUQVQgY2Fubm90IHRlbGwgdGhlIHR3byBhcGFydCwgYW5kCiYjNDM7ICogZ3Vlc3Npbmcgd291bGQgbWVhbiB3cml0aW5nIEVORCBpbnRvIGEgbGl2ZSByZWNlaXZlIGxvb3AuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb25jZSB0aGUgbG9hZGVyIGhhcyBsZWZ0IHRoZSBsb29wLCAtRUFHQUlOIGlmIGl0IGFza3MgZm9yIGFub3RoZXIKJiM0MzsgKiBjaHVuayBhZnRlciBhbGwsIC1FSU8gZm9yIGEgbG9hZGVyIHN0aWxsIGhvbGRpbmcgdGhlIGNvdW50IHdoZW4gdGhlIHZlcmlmeQomIzQzOyAqIHdpbmRvdyBleHBpcmVzLCBvciBhbiBTTURJTyBidXMgZXJyb3IuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9yZXNjdWVfZHJhaW5fZmluaXNoKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgY2h1bmspCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2RldjsKJiM0MzsJaW50IHN0YXQ7CiYjNDM7CiYjNDM7CXN0YXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TKTsKJiM0MzsJaWYgKHN0YXQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHN0YXQ7CiYjNDM7CWlmIChzdGF0ID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlpZiAoc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX0JBRCkgewomIzQzOwkJZGV2X2VycihkZXYsCiYjNDM7CQkJJiMzNDtmbGFzaDogbG9hZGVyIHN0dWNrIGFmdGVyICV1IGNodW5rcywgcG93ZXIgY3ljbGUgaXRcbiYjMzQ7LAomIzQzOwkJCWNodW5rKTsKJiM0MzsJCXJldHVybiAtRUlPOwomIzQzOwl9CiYjNDM7CWlmIChzdGF0KSB7CiYjNDM7CQkvKiBBIGZpcm13YXJlIGlzIGFuc3dlcmluZywgbm90IHRoZSBsb2FkZXI6IGFuIGltYWdlIHN1cnZpdmVkCiYjNDM7CQkgKiBpbiBmbGFzaCBhbmQgYm9vdGVkLgomIzQzOwkJICovCiYjNDM7CQlkZXZfaW5mbyhkZXYsICYjMzQ7Zmxhc2g6IGZpcm13YXJlIGJvb3RlZCB3aGlsZSBkcmFpbmluZ1xuJiMzNDspOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIC1FQUdBSU47CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlY292ZXIgYSBzd2l0Y2ggd2hvc2UgU0IgUERJIGRvd25sb2FkIHdhcyBpbnRlcnJ1cHRlZCBtaWQtdHJhbnNmZXIgLSB0aGUKJiM0MzsgKiBob3N0IGRpZWQgYWZ0ZXIgTUNVYm9vdCBiZWdhbiBlcmFzaW5nIGZsYXNoLCB3aGV0aGVyIGl0IGFib3J0ZWQgbWlkIGVyYXNlIG9yCiYjNDM7ICogbWlkIGltYWdlLXdyaXRlLCBib3RoIGVuZCB1cCBpbiB0aGUgc2FtZSBwbGFjZTogdGhlIHBheWxvYWQgcmVjZWl2ZSBsb29wLgomIzQzOyAqIFRoZXJlIHRoZSBsb2FkZXIgcHVibGlzaGVzIFNUQVQ9MCwgd2FpdHMgZm9yIHRoZSBob3N0IHRvIHdyaXRlIGEgYnl0ZS1jb3VudAomIzQzOyAqIHRvIFNUQVQsIERNQXMgdGhhdCBtYW55IGJ5dGVzIGFuZCBzdWJ0cmFjdHMgdGhlIGNvdW50IGZyb20gYSByZW1haW5pbmctYnl0ZXMKJiM0MzsgKiBjb3VudGVyLCBsZWF2aW5nIHRoZSBsb29wIG9ubHkgd2hlbiB0aGUgY291bnRlciByZWFjaGVzIGV4YWN0bHkgemVyby4gVGhlCiYjNDM7ICogaW1hZ2Ugc2l6ZSBkaWVkIHdpdGggdGhlIGhvc3QsIHNvIHdlIGZlZWQgc2luZ2xlLWJ5dGUgY2h1bmtzIChzZWUKJiM0MzsgKiBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUykgdG8gd2FsayB0aGUgY291bnRlciB0byB6ZXJvIHdpdGhvdXQgdW5kZXJmbG93LgomIzQzOyAqIFRoZSBsb2FkZXIgdGhlbiB2ZXJpZmllcyB0aGUgKG5vdyBjb3JydXB0KSBpbWFnZSBhbmQgcmV0dXJucyB0byBSRUFEWSBieQomIzQzOyAqIGl0c2VsZiwgb3IgYm9vdHMgYSB2YWxpZCBpbWFnZSB0aGF0IGhhcHBlbmVkIHRvIHN1cnZpdmUgaW4gZmxhc2g7IGVpdGhlciB3YXkKJiM0MzsgKiB0aGUgY2FsbGVyJiMzOTtzIHJlcHJvYmUgY2xhc3NpZmllcyB0aGUgcmVzdWx0LiBFdmVyeSBieXRlIGNvc3RzIGFib3V0IGEgZG96ZW4KJiM0MzsgKiBNRElPIGZyYW1lcywgc28gYSBtdWx0aS1NaUIgb3V0c3RhbmRpbmcgY291bnQgdGFrZXMgdGVucyBvZiBtaW51dGVzLgomIzQzOyAqIFJldHVybnMgMCBvbmNlIHRoZSBsb2FkZXIgaGFzIGxlZnQgdGhlIHJlY2VpdmUgbG9vcCwgJmx0OzAgb24gZXJyb3IuIERvZXMgTk9UCiYjNDM7ICogcmVjb3ZlciBhIGNvdW50ZXIgYWxyZWFkeSB1bmRlcmZsb3dlZCBieSBhbiBlYXJsaWVyIG92ZXJzaXplZC1jaHVuayBhdHRlbXB0CiYjNDM7ICogLSB0aGF0IG5lZWRzIGEgcG93ZXIgY3ljbGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9yZXNjdWVfZHJhaW4oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2RldjsKJiM0MzsJLyogQm91bmQ6IHR3aWNlIHRoZSBsb2FkZXImIzM5O3MgMTYgTWlCIGltYWdlIGNhcCwgb25lIGJ5dGUgcGVyIGNodW5rLiAqLwomIzQzOwl1MzIgbWF4X2NodW5rcyA9IDJ1ICogKDE2dSAmbHQ7Jmx0OyAyMCkgLyBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUzsKJiM0MzsJdTMyIGNodW5rID0gMDsKJiM0MzsJaW50IHJldCwgc3RhdDsKJiM0MzsKJiM0MzsJd2hpbGUgKGNodW5rICZsdDsgbWF4X2NodW5rcykgewomIzQzOwkJLyogVGVhcmRvd24gY2FuIGludGVycnVwdCB0aGlzIGxvbmcgZHJhaW4uICovCiYjNDM7CQlpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsICZhbXA7cHJpdi0mZ3Q7ZmxhZ3MpKQomIzQzOwkJCXJldHVybiAtRUNBTkNFTEVEOwomIzQzOwomIzQzOwkJc3RhdCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX2RyYWluKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TKTsKJiM0MzsJCWlmIChzdGF0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gc3RhdDsKJiM0MzsJCWlmIChzdGF0ID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSkKJiM0MzsJCQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJCWlmIChzdGF0KSB7CiYjNDM7CQkJcmV0ID0gbXhsODYyeHhfcmVzY3VlX2RyYWluX2ZpbmlzaChwcml2LCBjaHVuayk7CiYjNDM7CQkJaWYgKHJldCAhPSAtRUFHQUlOKQomIzQzOwkJCQlyZXR1cm4gcmV0OwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyogRmVlZCBvbmUgemVybyBieXRlOyByZXNldCBjbGVhcmVkIHRoZSB3cml0ZSBsYXRjaC4gKi8KJiM0MzsJCXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLAomIzQzOwkJCQkJICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCAweDAwMDApOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCXJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwKJiM0MzsJCQkJCSAgIE1YTDg2MlhYX0RSQUlOX0NIVU5LX0JZVEVTKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQljaHVuayYjNDM7JiM0Mzs7CiYjNDM7CQlpZiAoIShjaHVuayAlIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFUykpCiYjNDM7CQkJZGV2X2luZm8oZGV2LCAmIzM0O2ZsYXNoOiBkcmFpbmVkICV1IEtpQiBzbyBmYXJcbiYjMzQ7LAomIzQzOwkJCQkgY2h1bmsgLyAxMDI0KTsKJiM0MzsJCWNvbmRfcmVzY2hlZCgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWRldl9lcnIoZGV2LAomIzQzOwkJJiMzNDtmbGFzaDogaW50ZXJydXB0ZWQgZG93bmxvYWQgZGlkIG5vdCBkcmFpbiBhZnRlciAldSBjaHVua3NcbiYjMzQ7LAomIzQzOwkJY2h1bmspOwomIzQzOwomIzQzOwlyZXR1cm4gLUVUSU1FRE9VVDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQmFja2dyb3VuZCBzZWxmLWhlYWw6IGRyYWluIGEgd2VkZ2VkIGRvd25sb2FkIG9mZiB0aGUgZGV2bGluayBmbGFzaCBwYXRoLCBzbwomIzQzOyAqIHRoZSBsb25nIHJlY292ZXJ5IG5ldmVyIGhvbGRzIHRoZSBkZXZsaW5rIGxvY2suIFNjaGVkdWxlZCBmcm9tIHByb2JlOwomIzQzOyAqIHJlcHJvYmVzIG9uIHN1Y2Nlc3Mgc28gdGhlIHByb2JlLXRpbWUgZGV0ZWN0aW9uIHJlLWNsYXNzaWZpZXMgdGhlIHN3aXRjaC4KJiM0MzsgKi8KJiM0Mzt2b2lkIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQomIzQzO3sKJiM0MzsJc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPQomIzQzOwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBteGw4NjJ4eF9wcml2LCByZXNjdWVfaGVhbF93b3JrKTsKJiM0MzsJc3RydWN0IGRldmljZSAqZGV2ID0gJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXY7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbihwcml2KTsKJiM0MzsJaWYgKHJldCA9PSAtRUNBTkNFTEVEKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQkvKiBOb3RoaW5nIHJldHJpZXMgdGhpcywgc28gc2F5IHNvOiByZXNjdWVfcmVhZHkgc3RheXMgY2xlYXIKJiM0MzsJCSAqIGFuZCBkZXZsaW5rIGRldiBmbGFzaCByZXBvcnRzIHdoeSBpdCByZWZ1c2VzLgomIzQzOwkJICovCiYjNDM7CQlkZXZfZXJyKGRldiwgJiMzNDtmbGFzaDogZG93bmxvYWQgcmVjb3ZlcnkgZmFpbGVkOiAlcGVcbiYjMzQ7LAomIzQzOwkJCUVSUl9QVFIocmV0KSk7CiYjNDM7CQlXUklURV9PTkNFKHByaXYtJmd0O3Jlc2N1ZV9mYWlsZWQsIHRydWUpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFRoZSBpbnRlcnJ1cHRlZCB0cmFuc2ZlciBpcyBmaW5hbGlzZWQ7IHJlcHJvYmUgc28gdGhlIHByb2JlLXRpbWUKJiM0MzsJICogZGV0ZWN0aW9uIGJyaW5ncyB0aGUgZHJpdmVyIHVwIC0tIGZsYXNoYWJsZSBpbiByZXNjdWUgbW9kZSBpZiB0aGUKJiM0MzsJICogbG9hZGVyIGlzIGF0IFJFQURZLCBvciBub3JtYWxseSBpZiBhIHZhbGlkIGltYWdlIGJvb3RlZC4gVGhlIGNvcmUKJiM0MzsJICogc2tpcHMgdGhlIHJlLXByb2JlIG9uIGl0cyBvd24gaWYgdGhlIGRldmljZSBpcyB1bmJvdW5kIGZpcnN0OyB0aGUKJiM0MzsJICogZmxhZyB0ZXN0IG9ubHkgYXZvaWRzIHNjaGVkdWxpbmcgb25lIGNlcnRhaW4gdG8gYmUgc2tpcHBlZC4gQQomIzQzOwkgKiBmYWlsZWQgaGFuZC1vZmYgbGVhdmVzIG5vdGhpbmcgdG8gcmVjbGFzc2lmeSB0aGUgc3dpdGNoLCBzbyBtYXJrCiYjNDM7CSAqIHJlY292ZXJ5IGZhaWxlZCByYXRoZXIgdGhhbiBwcm9taXNlIGEgcmV0cnkgdGhhdCBjYW5ub3Qgc3VjY2VlZC4KJiM0MzsJICovCiYjNDM7CWlmICh0ZXN0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgJmFtcDtwcml2LSZndDtmbGFncykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmIChkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZShkZXYsIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVMpKQomIzQzOwkJV1JJVEVfT05DRShwcml2LSZndDtyZXNjdWVfZmFpbGVkLCB0cnVlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRGV0ZWN0IE1DVWJvb3QgcmVzY3VlIG1vZGUgb3ZlciBjbGF1c2UtMjIgU01ESU8gYWxvbmUsIHNvIHRoZSBjYWxsZXIgY2FuIHJ1bGUKJiM0MzsgKiB0aGUgbG9hZGVyIG91dCBiZWZvcmUgYW55IEM0NSBBUEkgcmVxdWVzdCAod2hpY2ggc3Bld3MgQ1JDIGVycm9ycyB3aGVuIG5vIFdTUAomIzQzOyAqIGZpcm13YXJlIGFuc3dlcnMpLiBBIHNjcmF0Y2ggd3JpdGUgdG8gQUREUi9EQVRBIG11c3QgbGF0Y2ggb3IgdGhlIGNoaXAgaXMKJiM0MzsgKiBhYnNlbnQgKC1FTk9ERVYpOyB0aGUgbWFpbGJveCBpcyByZXNldCBmaXJzdCwgb3IgYSB0cmFuc2ZlciBpbnRlcnJ1cHRlZCB3aXRoCiYjNDM7ICogQ1RSTD1XUiB3b3VsZCB0YWtlIHRoYXQgd3JpdGUgYXMgYSBwYXlsb2FkIHdvcmQgaW5zdGVhZCBvZiBsYXRjaGluZyBpdC4gU1RBVAomIzQzOyAqIHRoZW4gY2xhc3NpZmllcyB0aGUgc3RhdGUsIHBva2VkIGRlc3RydWN0aXZlbHkgb25seSB3aGVuIDAsIHRoZSBvbmUgdmFsdWUgYQomIzQzOyAqIHJ1bm5pbmcgZmlybXdhcmUgbmV2ZXIgaG9sZHM6CiYjNDM7ICoKJiM0MzsgKiAgLSAweGMzM2M6IGZsYXNobGVzcyBsb29wOyByZWNvZ25pc2VkIGJ1dCBub3Qgc3VwcG9ydGVkIGhlcmUuCiYjNDM7ICogIC0gMHhjNTVjOiBjb25zb2xlIGxvb3AsIGlmIHRoZSByZWdpc3Rlci1yZWFkIGNoYWxsZW5nZSBpcyBzZXJ2aWNlZC4KJiM0MzsgKiAgLSBvdGhlciBub24temVybzogcnVubmluZyBmaXJtd2FyZSwgbGVmdCB1bnBva2VkLgomIzQzOyAqICAtIDA6IHdlZGdlZCByZWNlaXZlIGxvb3A7IHRoZSAxLWJ5dGUgc2xpY2UtYWR2YW5jZSB0aGVuIHNheXMgd2hldGhlciBpdAomIzQzOyAqICAgIHN0aWxsIG5lZWRzIGRyYWluaW5nIG9yIGhhcyBqdXN0IGZpbmlzaGVkLgomIzQzOyAqCiYjNDM7ICogVGhlIHNjcmF0Y2ggd3JpdGUgcmVhY2hlcyBhIHJ1bm5pbmcgZmlybXdhcmUgdG9vLCBidXQgbGFuZHMgaW4gbWFpbGJveAomIzQzOyAqIHJlZ2lzdGVycyBpdCBkb2VzIG5vdCByZWFkLCBzbyBpdCBpcyBpbmVydCB0aGVyZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogTVhMODYyWFhfSU5fUkVTQ1VFLCBNWEw4NjJYWF9OT1RfUkVTQ1VFLCAtRU5PREVWIHdoZW4gdGhlIHNjcmF0Y2gKJiM0MzsgKiB3cml0ZSBkb2VzIG5vdCBsYXRjaCwgd2hpY2ggaXMgYSBzd2l0Y2ggdGhhdCBkb2VzIG5vdCBhbnN3ZXIgYXQgYWxsIG9yIG9uZQomIzQzOyAqIHdob3NlIFNCIFBESSB3aW5kb3cgaXMgbm90IGF0IHRoZSBvZmZzZXRzIGFib3ZlLCAtRU9QTk9UU1VQUCBmb3IgdGhlCiYjNDM7ICogZmxhc2hsZXNzIGxvb3AsIC1FTlhJTyBmb3IgYSBSRUFEWSBsb2FkZXIgd2hvc2UgbWFpbGJveCBmYWlscyB0aGUgY2hhbGxlbmdlLAomIzQzOyAqIG9yIGFuIFNNRElPIGJ1cyBlcnJvci4KJiM0MzsgKi8KJiM0MztpbnQgbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KQomIzQzO3sKJiM0MzsJaW50IHN0YXQsIGRhdCwgcmV0LCByYiwgYSwgZDsKJiM0MzsKJiM0MzsJLyogcmVzY3VlX3JlYWR5IGdhdGVzIGZsYXNoaW5nOyBhIHdlZGdlZCBsb2FkZXIgbmVlZHMgdGhlIGRyYWluIGZpcnN0LiAqLwomIzQzOwlXUklURV9PTkNFKHByaXYtJmd0O3Jlc2N1ZV9yZWFkeSwgZmFsc2UpOwomIzQzOwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7CiYjNDM7CWlmIChyZXQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyogUHJlc2VuY2U6IGEgbGl2ZSBjaGlwIGxhdGNoZXMgdGhlIHNjcmF0Y2ggd3JpdGUsIGFuIGFic2VudCBvbmUgZmxvYXRzLiAqLwomIzQzOwlhID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsCiYjNDM7CQkJCSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSk7CiYjNDM7CWlmIChhICZsdDsgMCkKJiM0MzsJCXJldHVybiBhOwomIzQzOwlkID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsCiYjNDM7CQkJCSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfRCk7CiYjNDM7CWlmIChkICZsdDsgMCkKJiM0MzsJCXJldHVybiBkOwomIzQzOwlhID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUik7CiYjNDM7CWlmIChhICZsdDsgMCkKJiM0MzsJCXJldHVybiBhOwomIzQzOwlkID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSk7CiYjNDM7CWlmIChkICZsdDsgMCkKJiM0MzsJCXJldHVybiBkOwomIzQzOwlpZiAoKHUxNilhICE9IE1YTDg2MlhYX1NCX1BESV9QUk9CRV9BIHx8CiYjNDM7CSAgICAodTE2KWQgIT0gTVhMODYyWFhfU0JfUERJX1BST0JFX0QpCiYjNDM7CQlyZXR1cm4gLUVOT0RFVjsKJiM0MzsKJiM0MzsJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXN0YXQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFUKTsKJiM0MzsJaWYgKHN0YXQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHN0YXQ7CiYjNDM7CiYjNDM7CS8qIEZsYXNobGVzcy1kb3dubG9hZCBsb29wIChNeEw4NjI4MSB0aWVyKTogdW5zdXBwb3J0ZWQuICovCiYjNDM7CWlmICgodTE2KXN0YXQgPT0gTVhMODYyWFhfU0JfUERJX0RMX1JFQURZKQomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwomIzQzOwkvKiBDb25zb2xlIGxvb3AgYXQgUkVBRFk6IGNvbmZpcm0gdGhlIGxpdmUgbWFpbGJveCB3aXRoIHRoZSByZWdpc3Rlci1yZWFkCiYjNDM7CSAqIGNoYWxsZW5nZSAoY29uc3VtZXMgdGhlIG1hcmtlciBmcm9tIERBVEEgYW5kIHJlLWFybXMgUkVBRFkpLgomIzQzOwkgKi8KJiM0MzsJaWYgKCh1MTYpc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfUkVBRFkpIHsKJiM0MzsJCXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLAomIzQzOwkJCQkJICAgTVhMODYyWFhfU0JfUERJX1JEUkVHX01BUkspOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULAomIzQzOwkJCQkJICAgTVhMODYyWFhfU0JfUERJX1JEUkVHKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQlyYiA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfU0JfUERJX1JFQURZLAomIzQzOwkJCQkJICAgICAgIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TKTsKJiM0MzsJCWRhdCA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEpOwomIzQzOwkJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpOwomIzQzOwkJLyogTmV2ZXIgcmUtYXJtaW5nIFJFQURZIGZhaWxzIHRoZSBjaGFsbGVuZ2UgbGlrZSBhbnkgb3RoZXIKJiM0MzsJCSAqIHVuc2VydmljZWQgY29tbWFuZDsgcmVwb3J0IGl0IGFzIHN1Y2ggcmF0aGVyIHRoYW4gYXMgYSBidXMKJiM0MzsJCSAqIHRpbWVvdXQgdGhlIGJ1cyBuZXZlciBzYXcuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChyYiA9PSAtRVRJTUVET1VUKQomIzQzOwkJCXJiID0gLUVOWElPOwomIzQzOwkJaWYgKHJiICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gcmI7CiYjNDM7CQlpZiAoZGF0ICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gZGF0OwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCWlmICgodTE2KWRhdCAhPSBNWEw4NjJYWF9TQl9QRElfUkRSRUdfTUFSSykgewomIzQzOwkJCVdSSVRFX09OQ0UocHJpdi0mZ3Q7cmVzY3VlX3JlYWR5LCB0cnVlKTsKJiM0MzsJCQlyZXR1cm4gTVhMODYyWFhfSU5fUkVTQ1VFOwomIzQzOwkJfQomIzQzOwkJLyogUkVBRFkgYnV0IHRoZSBtYXJrZXIgaXMgdW50b3VjaGVkLCBzbyBub3RoaW5nIGlzIHNlcnZpY2luZyB0aGUKJiM0MzsJCSAqIG1haWxib3guIEEgZmlybXdhcmUgcHVibGlzaGluZyAweGM1NWMgYXMgaXRzIHN0YXR1cyB3b3JkIGxvb2tzCiYjNDM7CQkgKiBleGFjdGx5IGxpa2UgdGhpcywgYW5kIGZsYXNoaW5nIG9uZSB3b3VsZCBiZSBmYXIgd29yc2UgdGhhbgomIzQzOwkJICogcmVmdXNpbmcgdG8gYmluZCwgc28gdHJlYXQgaXQgYXMgdW51c2FibGUuCiYjNDM7CQkgKi8KJiM0MzsJCXJldHVybiAtRU5YSU87CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogQW55IG90aGVyIG5vbi16ZXJvIHZhbHVlIGlzIGEgcnVubmluZyBmaXJtd2FyZSwgbm90IGEgbG9hZGVyLiAqLwomIzQzOwlpZiAoc3RhdCkKJiM0MzsJCXJldHVybiBNWEw4NjJYWF9OT1RfUkVTQ1VFOwomIzQzOwomIzQzOwkvKiBTVEFUID09IDA6IGEgd2VkZ2VkIHJlY2VpdmUgbG9vcCB0YWtlcyBhIDEtYnl0ZSBzbGljZS1hZHZhbmNlIChmZWVkCiYjNDM7CSAqIG9uZSBEQVRBIHdvcmQgZmlyc3QsIGxpa2UgYSBkcmFpbiBjaHVuaykgYW5kIGFza3MgZm9yIHRoZSBuZXh0IGNodW5rCiYjNDM7CSAqIGJ5IHB1Ymxpc2hpbmcgMCBhZ2Fpbi4gSGFkIHRoYXQgYnl0ZSBiZWVuIHRoZSBsYXN0IG9uZSBvdXRzdGFuZGluZywKJiM0MzsJICogdGhlIGxvYWRlciBsZWF2ZXMgdGhlIGxvb3AgaW5zdGVhZCBhbmQgcmV0dXJucyB0byBSRUFEWSwgaGF2aW5nCiYjNDM7CSAqIGNvbnN1bWVkIHRoZSBhZHZhbmNlIC0tIHByb29mIGVub3VnaCBvZiBhIGxpdmUgbWFpbGJveCB0byBza2lwIHRoZQomIzQzOwkgKiBjaGFsbGVuZ2UuIEFueXRoaW5nIGVsc2UgbWVhbnMgaXQgaXMgc3RpbGwgd29ya2luZyBvbiBpdC4gQWxsIHRocmVlCiYjNDM7CSAqIGFyZSByZXNjdWUsIHNvIHRoaXMgbmV2ZXIgZmFpbHMgcHJvYmU7IG9ubHkgdGhlIGRyYWluIGRvZXMuCiYjNDM7CSAqLwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCwKJiM0MzsJCQkJICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCAweDAwMDApOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwKJiM0MzsJCQkJICAgTVhMODYyWFhfRFJBSU5fQ0hVTktfQllURVMpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJiID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfZHJhaW4ocHJpdiwgTVhMODYyWFhfU0JfUERJX1NURVBfTVMpOwomIzQzOwlpZiAocmIgJmx0OyAwKQomIzQzOwkJcmV0dXJuIHJiOwomIzQzOwlpZiAocmIgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKQomIzQzOwkJV1JJVEVfT05DRShwcml2LSZndDtyZXNjdWVfcmVhZHksIHRydWUpOwomIzQzOwomIzQzOwlyZXR1cm4gTVhMODYyWFhfSU5fUkVTQ1VFOwomIzQzO30KJiM0MzsKJiM0MzsvKiBNQ1Vib290IGZpcm13YXJlIGltYWdlIGhlYWRlciAqLwomIzQzO3N0cnVjdCBteGw4NjJ4eF9md19oZHIgewomIzQzOwlfX2xlMzIgaW1hZ2VfdHlwZTsKJiM0MzsJX19sZTMyIGltYWdlX3NpemVfMTsKJiM0MzsJX19sZTMyIGltYWdlX2NoZWNrc3VtXzE7CiYjNDM7CV9fbGUzMiBpbWFnZV9zaXplXzI7CiYjNDM7CV9fbGUzMiBpbWFnZV9jaGVja3N1bV8yOwomIzQzO30gX19wYWNrZWQ7CiYjNDM7CiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9mbGFzaF92YWxpZGF0ZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwKJiM0MzsJCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKJiM0MzsJCQkJICAgdTMyICpwYXlsb2FkX3NpemUpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICpoZHI7CiYjNDM7CXUzMiBzaXplMSwgc2l6ZTIsIHRvdGFsOwomIzQzOwljb25zdCB1OCAqcGF5bG9hZDsKJiM0MzsJdTMyIGNyYzsKJiM0MzsKJiM0MzsJaWYgKGZ3LSZndDtzaXplICZsdDsgTVhMODYyWFhfRldfSERSX1NJWkUpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJaGRyID0gKGNvbnN0IHN0cnVjdCBteGw4NjJ4eF9md19oZHIgKilmdy0mZ3Q7ZGF0YTsKJiM0MzsJcGF5bG9hZCA9IGZ3LSZndDtkYXRhICYjNDM7IE1YTDg2MlhYX0ZXX0hEUl9TSVpFOwomIzQzOwlzaXplMSA9IGxlMzJfdG9fY3B1KGhkci0mZ3Q7aW1hZ2Vfc2l6ZV8xKTsKJiM0MzsJc2l6ZTIgPSBsZTMyX3RvX2NwdShoZHItJmd0O2ltYWdlX3NpemVfMik7CiYjNDM7CiYjNDM7CWlmIChjaGVja19hZGRfb3ZlcmZsb3coc2l6ZTEsIHNpemUyLCAmYW1wO3RvdGFsKSB8fAomIzQzOwkgICAgdG90YWwgJmd0OyBmdy0mZ3Q7c2l6ZSAtIE1YTDg2MlhYX0ZXX0hEUl9TSVpFKSB7CiYjNDM7CQlkZXZfZXJyKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7ZGV2LAomIzQzOwkJCSYjMzQ7Zmxhc2g6IGZpcm13YXJlIGZpbGUgdG9vIHNtYWxsIGZvciBkZWNsYXJlZCBzaXplXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXRvdGFsKSB7CiYjNDM7CQlkZXZfZXJyKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7ZGV2LAomIzQzOwkJCSYjMzQ7Zmxhc2g6IGZpcm13YXJlIGZpbGUgd2l0aCBlbXB0eSBwYXlsb2FkXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2l6ZTEpIHsKJiM0MzsJCWNyYyA9IH5jcmMzMl9sZSh+MFUsIHBheWxvYWQsIHNpemUxKTsKJiM0MzsJCWlmIChjcmMgIT0gbGUzMl90b19jcHUoaGRyLSZndDtpbWFnZV9jaGVja3N1bV8xKSkgewomIzQzOwkJCWRldl9lcnIoJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXYsCiYjNDM7CQkJCSYjMzQ7Zmxhc2g6IGltYWdlIDEgQ1JDIG1pc21hdGNoIChnb3QgJTA4eCwgZXhwZWN0ZWQgJTA4eClcbiYjMzQ7LAomIzQzOwkJCQljcmMsIGxlMzJfdG9fY3B1KGhkci0mZ3Q7aW1hZ2VfY2hlY2tzdW1fMSkpOwomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChzaXplMikgewomIzQzOwkJY3JjID0gfmNyYzMyX2xlKH4wVSwgcGF5bG9hZCAmIzQzOyBzaXplMSwgc2l6ZTIpOwomIzQzOwkJaWYgKGNyYyAhPSBsZTMyX3RvX2NwdShoZHItJmd0O2ltYWdlX2NoZWNrc3VtXzIpKSB7CiYjNDM7CQkJZGV2X2VycigmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2RldiwKJiM0MzsJCQkJJiMzNDtmbGFzaDogaW1hZ2UgMiBDUkMgbWlzbWF0Y2ggKGdvdCAlMDh4LCBleHBlY3RlZCAlMDh4KVxuJiMzNDssCiYjNDM7CQkJCWNyYywgbGUzMl90b19jcHUoaGRyLSZndDtpbWFnZV9jaGVja3N1bV8yKSk7CiYjNDM7CQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJKnBheWxvYWRfc2l6ZSA9IHRvdGFsOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9mbGFzaF9maXJtd2FyZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwKJiM0MzsJCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKJiM0MzsJCQkJICAgdTMyIHBheWxvYWRfc2l6ZSwgc3RydWN0IGRldmxpbmsgKmRsKQomIzQzO3sKJiM0MzsJY29uc3QgdTggKnBheWxvYWQgPSBmdy0mZ3Q7ZGF0YSAmIzQzOyBNWEw4NjJYWF9GV19IRFJfU0laRTsKJiM0MzsJdTMyIHdvcmRfaWR4ID0gMCwgZGF0YV93cml0dGVuID0gMCwgaWR4ID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyBuZXh0X25vdGlmeSA9IGppZmZpZXMgLSAxOwomIzQzOwl1MTYgd29yZCwgZmRhdGE7CiYjNDM7CWludCByZXQsIGk7CiYjNDM7CiYjNDM7CS8qIFN0ZXAgMTogcmVib290IHRoZSBmaXJtd2FyZSBpbnRvIE1DVWJvb3QgcmVzY3VlIG1vZGUgKi8KJiM0MzsJaWYgKCFwcml2LSZndDtyZXNjdWVfbW9kZSkgewomIzQzOwkJcmV0ID0gbXhsODYyeHhfYXBpX3dyYXAocHJpdiwgU1lTX01JU0NfRldfVVBEQVRFLCBOVUxMLCAwLAomIzQzOwkJCQkJZmFsc2UsIGZhbHNlKTsKJiM0MzsJCWlmIChyZXQpIHsKJiM0MzsJCQlkZXZfZXJyKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7ZGV2LAomIzQzOwkJCQkmIzM0O2ZsYXNoOiBGV19VUERBVEUgY29tbWFuZCBmYWlsZWQ6ICVwZVxuJiMzNDssCiYjNDM7CQkJCUVSUl9QVFIocmV0KSk7CiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwkvKiBTdGVwIDI6IHdhaXQgZm9yIGJvb3Rsb2FkZXIgcmVhZHkgKi8KJiM0MzsJbXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCAmIzM0O1dhaXRpbmcgZm9yIGJvb3Rsb2FkZXImIzM0OywgMCwgMCk7CiYjNDM7CXJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQlnb3RvIHdyaXRlX2VycjsKJiM0MzsKJiM0MzsJLyogRmFpbHVyZXMgZnJvbSBoZXJlIG9uIGVuZCB1cCBhdCBub19lbmQsIHdoaWNoIHJldHVybnMgdGhlIGVycm9yCiYjNDM7CSAqIHdpdGhvdXQgc2lnbmFsbGluZyBFTkQgLS0gc2VlIHRoZXJlLgomIzQzOwkgKi8KJiM0MzsJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCBNWEw4NjJYWF9TQl9QRElfUkVBRFksCiYjNDM7CQkJCQlNWEw4NjJYWF9GV19SRUFEWV9USU1FT1VUX01TKTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJZGV2X2VycigmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2RldiwKJiM0MzsJCQkmIzM0O2ZsYXNoOiBib290bG9hZGVyIG5vdCByZWFkeTogJXBlXG4mIzM0OywgRVJSX1BUUihyZXQpKTsKJiM0MzsJCWdvdG8gbm9fZW5kOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFN0ZXAgMzogc3RhcnQgaGFuZHNoYWtlICovCiYjNDM7CXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULAomIzQzOwkJCQkgICBNWEw4NjJYWF9TQl9QRElfU1RBUlQpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFSVCAmIzQzOyAxLAomIzQzOwkJCQkJTVhMODYyWFhfRldfQUNLX1RJTUVPVVRfTVMpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlkZXZfZXJyKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7ZGV2LAomIzQzOwkJCSYjMzQ7Zmxhc2g6IHN0YXJ0IGhhbmRzaGFrZSBmYWlsZWQ6ICVwZVxuJiMzNDssIEVSUl9QVFIocmV0KSk7CiYjNDM7CQlnb3RvIG5vX2VuZDsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBTdGVwIDQ6IHRyYW5zZmVyIGltYWdlIGhlYWRlciAqLwomIzQzOwlteGw4NjJ4eF9mbGFzaF9ub3RpZnkoZGwsICYjMzQ7RXJhc2luZyBmbGFzaCYjMzQ7LCAwLCAwKTsKJiM0MzsJcmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsCiYjNDM7CQkJCSAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQlnb3RvIHdyaXRlX2VycjsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE1YTDg2MlhYX0ZXX0hEUl9TSVpFIC8gMjsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXdvcmQgPSBmdy0mZ3Q7ZGF0YVtpICogMl0gfAomIzQzOwkJICAgICAgICgodTE2KWZ3LSZndDtkYXRhW2kgKiAyICYjNDM7IDFdICZsdDsmbHQ7IDgpOwomIzQzOwkJcmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsIHdvcmQpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJZ290byB3cml0ZV9lcnI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwkvKiB0aGUgYnl0ZSBjb3VudCBpbiBTVEFUIHRyaWdnZXJzIHRoZSBlcmFzZSAqLwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCwKJiM0MzsJCQkJICAgTVhMODYyWFhfRldfSERSX1NJWkUpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwkvKiBBQ0sgaXMgYnl0ZSBjb3VudCAmIzQzOyAxICovCiYjNDM7CXJldCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfRldfSERSX1NJWkUgJiM0MzsgMSwKJiM0MzsJCQkJCU1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TKTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJZGV2X2VycigmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2RldiwKJiM0MzsJCQkmIzM0O2ZsYXNoOiBoZWFkZXIgQUNLIGZhaWxlZDogJXBlXG4mIzM0OywgRVJSX1BUUihyZXQpKTsKJiM0MzsJCWdvdG8gbm9fZW5kOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFN0ZXAgNTogd2FpdCBmb3IgZXJhc2UgdG8gY29tcGxldGUgKi8KJiM0MzsJcmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCAwLAomIzQzOwkJCQkJTVhMODYyWFhfRldfRVJBU0VfVElNRU9VVF9NUyk7CiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWRldl9lcnIoJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXYsCiYjNDM7CQkJJiMzNDtmbGFzaDogZXJhc2UgdGltZW91dDogJXBlXG4mIzM0OywgRVJSX1BUUihyZXQpKTsKJiM0MzsJCWdvdG8gbm9fZW5kOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFN0ZXAgNjogdHJhbnNmZXIgcGF5bG9hZCAqLwomIzQzOwlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCwKJiM0MzsJCQkJICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwl3aGlsZSAoaWR4ICZsdDsgcGF5bG9hZF9zaXplKSB7CiYjNDM7CQljb25kX3Jlc2NoZWQoKTsKJiM0MzsJCWlmIChpZHggJiM0MzsgMSAmbHQ7IHBheWxvYWRfc2l6ZSkgewomIzQzOwkJCWZkYXRhID0gcGF5bG9hZFtpZHhdIHwKJiM0MzsJCQkJKCh1MTYpcGF5bG9hZFtpZHggJiM0MzsgMV0gJmx0OyZsdDsgOCk7CiYjNDM7CQkJaWR4ICYjNDM7PSAyOwomIzQzOwkJCWRhdGFfd3JpdHRlbiAmIzQzOz0gMjsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJZmRhdGEgPSBwYXlsb2FkW2lkeF07CiYjNDM7CQkJaWR4JiM0MzsmIzQzOzsKJiM0MzsJCQlkYXRhX3dyaXR0ZW4mIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwomIzQzOwkJcmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsIGZkYXRhKTsKJiM0MzsJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwkJd29yZF9pZHgmIzQzOyYjNDM7OwomIzQzOwomIzQzOwkJaWYgKGlkeCAmZ3Q7PSBwYXlsb2FkX3NpemUpIHsKJiM0MzsJCQlyZXQgPSBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfbGFzdChwcml2LCBkYXRhX3dyaXR0ZW4pOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyogSGFsZi1iYW5rIGJvdW5kYXJ5OiBzd2l0Y2ggdG8gU0IxIGFkZHJlc3MgKi8KJiM0MzsJCWlmICh3b3JkX2lkeCA9PSBNWEw4NjJYWF9GV19CQU5LX0hBTEYpIHsKJiM0MzsJCQlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCwKJiM0MzsJCQkJCQkgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpOwomIzQzOwkJCWlmIChyZXQgJmx0OyAwKQomIzQzOwkJCQlnb3RvIHdyaXRlX2VycjsKJiM0MzsKJiM0MzsJCQlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUiwKJiM0MzsJCQkJCQkgICBNWEw4NjJYWF9GV19TQjFfQUREUik7CiYjNDM7CQkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwkJCXJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLAomIzQzOwkJCQkJCSAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTsKJiM0MzsJCQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQkJZ290byB3cml0ZV9lcnI7CiYjNDM7CQl9IGVsc2UgaWYgKHdvcmRfaWR4ICZndDs9IE1YTDg2MlhYX0ZXX0JBTktfU0xJQ0UpIHsKJiM0MzsJCQlyZXQgPSBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2UocHJpdiwgZGF0YV93cml0dGVuKTsKJiM0MzsJCQlpZiAocmV0KSB7CiYjNDM7CQkJCWRldl9lcnIoJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXYsCiYjNDM7CQkJCQkmIzM0O2ZsYXNoOiB3cml0ZSB0aW1lb3V0IGF0ICV1LyV1OiAlcGVcbiYjMzQ7LAomIzQzOwkJCQkJaWR4LCBwYXlsb2FkX3NpemUsIEVSUl9QVFIocmV0KSk7CiYjNDM7CQkJCWdvdG8gbm9fZW5kOwomIzQzOwkJCX0KJiM0MzsJCQl3b3JkX2lkeCA9IDA7CiYjNDM7CQkJZGF0YV93cml0dGVuID0gMDsKJiM0MzsJCQlyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCwKJiM0MzsJCQkJCQkgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7CiYjNDM7CQkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJCWdvdG8gd3JpdGVfZXJyOwomIzQzOwomIzQzOwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG5leHRfbm90aWZ5KSkgewomIzQzOwkJCQlteGw4NjJ4eF9mbGFzaF9ub3RpZnkoZGwsICYjMzQ7Rmxhc2hpbmcmIzM0OywgaWR4LAomIzQzOwkJCQkJCSAgICAgIHBheWxvYWRfc2l6ZSk7CiYjNDM7CQkJCW5leHRfbm90aWZ5ID0gamlmZmllcyAmIzQzOyBtc2Vjc190b19qaWZmaWVzKDUwMCk7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWRldl9lcnIoJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXYsCiYjNDM7CQkJJiMzNDtmbGFzaDogZmluYWwgc2xpY2UgZmFpbGVkOiAlcGVcbiYjMzQ7LCBFUlJfUFRSKHJldCkpOwomIzQzOwkJZ290byBub19lbmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCAmIzM0O0ZsYXNoaW5nJiMzNDssIHBheWxvYWRfc2l6ZSwgcGF5bG9hZF9zaXplKTsKJiM0MzsKJiM0MzsJLyogU3VjY2VzczogdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgcmVjZWl2ZSBsb29wIGF0IHJfcmVtYWluID09IDAgYW5kCiYjNDM7CSAqIHZlcmlmaWVkIHRoZSBpbWFnZSwgc28gRU5EKDB4M2NjMykgaXMgYSBmaW5hbGlzZS9ib290IHJlcXVlc3QgcmF0aGVyCiYjNDM7CSAqIHRoYW4gYSBieXRlIGNvdW50LiBTaWduYWwgaXQgaGVyZSAtLSBhbmQgb25seSBoZXJlIC0tIHRvIGJvb3QgdGhlIG5ldwomIzQzOwkgKiBpbWFnZSB3aXRob3V0IHdhaXRpbmcgb3V0IHRoZSBsb2FkZXImIzM5O3MgMiBzIEVORCB0aW1lb3V0LgomIzQzOwkgKi8KJiM0MzsJcmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsCiYjNDM7CQkJCSAgIE1YTDg2MlhYX1NCX1BESV9FTkQpOwomIzQzOwltc2xlZXAoTVhMODYyWFhfRldfUkVCT09UX0RFTEFZX01TKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0MzsKJiM0Mzt3cml0ZV9lcnI6CiYjNDM7CWRldl9lcnIoJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtkZXYsICYjMzQ7Zmxhc2g6IFNNRElPIHdyaXRlIGZhaWxlZDogJXBlXG4mIzM0OywKJiM0MzsJCUVSUl9QVFIocmV0KSk7CiYjNDM7bm9fZW5kOgomIzQzOwkvKiBBIGZhaWx1cmUgbGVhdmVzIHRoZSBsb2FkZXIgbWlkIHRyYW5zZmVyOyBkbyBub3Qgc2lnbmFsIEVORCAoYSBTVEFUCiYjNDM7CSAqIHdyaXRlIGlzIGEgYnl0ZSBjb3VudCB0aGVuLCBhbmQgRU5EIHdvdWxkIGJlIG1pc3JlYWQgYXMgb25lLCByaXNraW5nCiYjNDM7CSAqIGEgcmVjZWl2ZS1jb3VudGVyIHVuZGVyZmxvdykuIFJldHVybiB0aGUgZXJyb3I7IHRoZSBjYWxsZXIgcmVwcm9iZXMuCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztpbnQgbXhsODYyeHhfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiYjNDM7CQkJICAgICAgc3RydWN0IGRldmxpbmtfaW5mb19yZXEgKnJlcSwKJiM0MzsJCQkgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLSZndDtwcml2OwomIzQzOwljaGFyIGJ1ZlsxNl07CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CS8qIE5vIGNoaXAtaWQvcmV2aXNpb24gaW4gTUNVYm9vdCAobmVlZHMgdGhlIGZpcm13YXJlIE1NRCBtYWlsYm94KS4gVGhlCiYjNDM7CSAqIGZ3IHZlcnNpb24gZG91YmxlcyBhcyB0aGUgJiMzNDtyZWFkeSB0byBmbGFzaCYjMzQ7IHNpZ25hbDogcmVwb3J0IGl0IG9ubHkKJiM0MzsJICogb25jZSB0aGUgbG9hZGVyIGlzIGF0IGEgY2xlYW4gUkVBRFksIG5vdGhpbmcgd2hpbGUgc3RpbGwgZHJhaW5pbmcuCiYjNDM7CSAqLwomIzQzOwlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpIHsKJiM0MzsJCWlmICghUkVBRF9PTkNFKHByaXYtJmd0O3Jlc2N1ZV9yZWFkeSkpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAmIzM0OyV1LiV1LiV1JiMzNDssCiYjNDM7CQkJIHByaXYtJmd0O2Z3X3ZlcnNpb24ubWFqb3IsIHByaXYtJmd0O2Z3X3ZlcnNpb24ubWlub3IsCiYjNDM7CQkJIHByaXYtJmd0O2Z3X3ZlcnNpb24ucmV2aXNpb24pOwomIzQzOwkJcmV0ID0gZGV2bGlua19pbmZvX3ZlcnNpb25fcnVubmluZ19wdXQocmVxLAomIzQzOwkJCQlERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwkJcmV0dXJuIGRldmxpbmtfaW5mb192ZXJzaW9uX3N0b3JlZF9wdXQocmVxLAomIzQzOwkJCQlERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEEgMCBwYXJ0IG51bWJlciBtZWFucyB0aGUgQ0hJUCBJRCByZWFkIGZhaWxlZCBvciB0aGUgcGFydCBpcwomIzQzOwkgKiB1bmZ1c2VkOyBvbWl0IGl0IHJhdGhlciB0aGFuIHB1Ymxpc2ggYSBib2d1cyAmIzM0OzAwMDAmIzM0OyB0aGF0IGZ3dXBkCiYjNDM7CSAqIHdvdWxkIG1hdGNoIGZpcm13YXJlIGFnYWluc3QgLS0gaXQgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBkcml2ZXIKJiM0MzsJICogbmFtZS4KJiM0MzsJICovCiYjNDM7CWlmIChwcml2LSZndDthc2ljX2lkKSB7CiYjNDM7CQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAmIzM0OyUwNFgmIzM0OywgcHJpdi0mZ3Q7YXNpY19pZCk7CiYjNDM7CQlyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9maXhlZF9wdXQocmVxLAomIzQzOwkJCQkJCSAgICAgREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19BU0lDX0lELAomIzQzOwkJCQkJCSAgICAgYnVmKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXUmIzM0OywgcHJpdi0mZ3Q7YXNpY19yZXYpOwomIzQzOwkJcmV0ID0gZGV2bGlua19pbmZvX3ZlcnNpb25fZml4ZWRfcHV0KHJlcSwKJiM0MzsJCQkJCQkgICAgIERFVkxJTktfSU5GT19WRVJTSU9OX0dFTkVSSUNfQVNJQ19SRVYsCiYjNDM7CQkJCQkJICAgICBidWYpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEFuIGFsbC16ZXJvIHZlcnNpb24gaXMgdGhlIGNhY2hlIGEgZmFpbGVkIGZsYXNoIGxlZnQgYmVoaW5kLCBub3QgYQomIzQzOwkgKiByZWxlYXNlZCBmaXJtd2FyZTsgb21pdCBpdCBsaWtlIHRoZSBwYXJ0IG51bWJlciBhYm92ZS4KJiM0MzsJICovCiYjNDM7CWlmICghcHJpdi0mZ3Q7ZndfdmVyc2lvbi5tYWpvciAmYW1wOyZhbXA7ICFwcml2LSZndDtmd192ZXJzaW9uLm1pbm9yICZhbXA7JmFtcDsKJiM0MzsJICAgICFwcml2LSZndDtmd192ZXJzaW9uLnJldmlzaW9uKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICYjMzQ7JXUuJXUuJXUmIzM0OywKJiM0MzsJCSBwcml2LSZndDtmd192ZXJzaW9uLm1ham9yLCBwcml2LSZndDtmd192ZXJzaW9uLm1pbm9yLAomIzQzOwkJIHByaXYtJmd0O2Z3X3ZlcnNpb24ucmV2aXNpb24pOwomIzQzOwomIzQzOwlyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9ydW5uaW5nX3B1dChyZXEsCiYjNDM7CQkJREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19GVywgYnVmKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CS8qIGJvb3RzIHRoaXMgaW1hZ2UgZnJvbSBpdHMgb3duIGZsYXNoOiBzdG9yZWQgPT0gcnVubmluZyAqLwomIzQzOwlyZXR1cm4gZGV2bGlua19pbmZvX3ZlcnNpb25fc3RvcmVkX3B1dChyZXEsCiYjNDM7CQkJREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19GVywgYnVmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG14bDg2Mnh4X2RldmxpbmtfZmxhc2hfdXBkYXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKJiM0MzsJCQkJICBzdHJ1Y3QgZGV2bGlua19mbGFzaF91cGRhdGVfcGFyYW1zICpwYXJhbXMsCiYjNDM7CQkJCSAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQomIzQzO3sKJiM0MzsJc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy0mZ3Q7cHJpdjsKJiM0MzsJc3RydWN0IGRzYV9wb3J0ICpkcDsKJiM0MzsJdTMyIHBheWxvYWRfc2l6ZTsKJiM0MzsJaW50IHJldCwgZXJyLCBpOwomIzQzOwomIzQzOwlpZiAocGFyYW1zLSZndDtjb21wb25lbnQpIHsKJiM0MzsJCU5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssICYjMzQ7Y29tcG9uZW50IGlzIG5vdCBzdXBwb3J0ZWQmIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogQSBwcmV2aW91cyBmbGFzaCBpcyBzdGlsbCB3YWl0aW5nIGZvciBpdHMgcmVwcm9iZTogdGhlIGZpcm13YXJlIEFQSQomIzQzOwkgKiBpcyBzaG9ydC1jaXJjdWl0ZWQsIHNvIHRoZSByYXcgU0IgUERJIHdyaXRlcyBiZWxvdyB3b3VsZCBydW4gYWdhaW5zdAomIzQzOwkgKiBhIHN3aXRjaCB0aGlzIGRyaXZlciBubyBsb25nZXIgdHJhY2tzLgomIzQzOwkgKi8KJiM0MzsJaWYgKHByaXYtJmd0O3NraXBfdGVhcmRvd24pIHsKJiM0MzsJCU5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssCiYjNDM7CQkJCSAgICYjMzQ7ZGV2aWNlIGlzIHJlaW5pdGlhbGl6aW5nLCByZXRyeSBsYXRlciYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gbXhsODYyeHhfZmxhc2hfdmFsaWRhdGUocHJpdiwgcGFyYW1zLSZndDtmdywgJmFtcDtwYXlsb2FkX3NpemUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlOTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCAmIzM0O2Zpcm13YXJlIGltYWdlIHZhbGlkYXRpb24gZmFpbGVkJiMzNDspOwomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBSZWZ1c2UgdG8gZmxhc2ggd2hpbGUgdGhlIGJhY2tncm91bmQgc2VsZi1oZWFsIGlzIHN0aWxsIGRyYWluaW5nLCBhbmQKJiM0MzsJICogZm9yIGdvb2Qgb25jZSBpdCBoYXMgZ2l2ZW4gdXAgb24gdGhlIGxvYWRlci4KJiM0MzsJICovCiYjNDM7CWlmIChSRUFEX09OQ0UocHJpdi0mZ3Q7cmVzY3VlX2ZhaWxlZCkpIHsKJiM0MzsJCU5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssCiYjNDM7CQkJCSAgICYjMzQ7ZG93bmxvYWQgcmVjb3ZlcnkgZmFpbGVkLCBwb3dlciBjeWNsZSB0aGUgc3dpdGNoJiMzNDspOwomIzQzOwkJcmV0dXJuIC1FSU87CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKHByaXYtJmd0O3Jlc2N1ZV9tb2RlICZhbXA7JmFtcDsgIVJFQURfT05DRShwcml2LSZndDtyZXNjdWVfcmVhZHkpKSB7CiYjNDM7CQlOTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLAomIzQzOwkJCQkgICAmIzM0O3N3aXRjaCBpcyByZWNvdmVyaW5nIGFuIGludGVycnVwdGVkIGRvd25sb2FkLCByZXRyeSBzaG9ydGx5JiMzNDspOwomIzQzOwkJcmV0dXJuIC1FQlVTWTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpCiYjNDM7CQlkZXZfaW5mbyhkcy0mZ3Q7ZGV2LAomIzQzOwkJCSAmIzM0O2ZsYXNoOiBmbGFzaGluZyBzd2l0Y2ggdmlhIE1DVWJvb3QgcmVzY3VlIG1vZGVcbiYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZGV2X2luZm8oZHMtJmd0O2RldiwgJiMzNDtmbGFzaDogcnVubmluZyBmaXJtd2FyZSAldS4ldS4ldVxuJiMzNDssCiYjNDM7CQkJIHByaXYtJmd0O2Z3X3ZlcnNpb24ubWFqb3IsIHByaXYtJmd0O2Z3X3ZlcnNpb24ubWlub3IsCiYjNDM7CQkJIHByaXYtJmd0O2Z3X3ZlcnNpb24ucmV2aXNpb24pOwomIzQzOwomIzQzOwkvKiBDbG9zZSBwb3J0cyB3aGlsZSB0aGUgZmlybXdhcmUgaXMgc3RpbGwgYWxpdmUgc28gdGhlIERTQSBjb3JlJiMzOTtzCiYjNDM7CSAqIE1EQi9GREIgdHJhY2tpbmcgaXMgZHJhaW5lZCwgYW5kIGRldGFjaCB1c2VyIHBvcnRzIHNvIHVzZXJzcGFjZQomIzQzOwkgKiBjYW5ub3QgcmVvcGVuIHRoZW0gZHVyaW5nIHRoZSBmbGFzaC4gVGhlIGNvbmR1aXQgaXMgb25seSBjbG9zZWQsCiYjNDM7CSAqIG5vdCBkZXRhY2hlZDogaXQgYmVsb25ncyB0byB0aGUgTUFDIGRyaXZlci4gVGhpcyBkcml2ZXIgYmluZHMgYQomIzQzOwkgKiBzaW5nbGUgc3dpdGNoIHdpdGggYSBkaXJlY3QgaG9zdCBsaW5rIGFuZCBubyBjYXNjYWRlIHBvcnRzLCBzbyB0aGUKJiM0MzsJICogY29uZHVpdCBzZXJ2ZXMgb25seSB0aGlzIHN3aXRjaCwgYW5kIGZsYXNoaW5nIGl0IHJlYm9vdHMgdGhlIHN3aXRjaCwKJiM0MzsJICogd2hpY2ggdGFrZXMgdGhlIHRyZWUgZG93biByZWdhcmRsZXNzLgomIzQzOwkgKi8KJiM0MzsJcnRubF9sb2NrKCk7CiYjNDM7CWRzYV9zd2l0Y2hfZm9yX2VhY2hfdXNlcl9wb3J0KGRwLCBkcykgewomIzQzOwkJaWYgKGRwLSZndDt1c2VyKSB7CiYjNDM7CQkJZGV2X2Nsb3NlKGRwLSZndDt1c2VyKTsKJiM0MzsJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRwLSZndDt1c2VyKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlkc2Ffc3dpdGNoX2Zvcl9lYWNoX2NwdV9wb3J0KGRwLCBkcykKJiM0MzsJCWRldl9jbG9zZShkcC0mZ3Q7Y29uZHVpdCk7CiYjNDM7CS8qIFRoZSBicmlkZ2UgZGVmZXJzIHRoZSBTVFAgc3RhdGUgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgY2xvc2luZwomIzQzOwkgKiB0aGUgcG9ydHM7IGxldCB0aGVtIHJlYWNoIHRoZSBmaXJtd2FyZSB3aGlsZSBpdCBpcyBzdGlsbCBhbGl2ZS4KJiM0MzsJICovCiYjNDM7CXN3aXRjaGRldl9kZWZlcnJlZF9wcm9jZXNzKCk7CiYjNDM7CXJ0bmxfdW5sb2NrKCk7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2tfbmVzdGVkKCZhbXA7cHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7YnVzLSZndDttZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTsKJiM0MzsJcHJpdi0mZ3Q7YmxvY2tfaG9zdCA9IHRydWU7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2J1cy0mZ3Q7bWRpb19sb2NrKTsKJiM0MzsKJiM0MzsJc2V0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgJmFtcDtwcml2LSZndDtmbGFncyk7CiYjNDM7CWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYW1wO3ByaXYtJmd0O3N0YXRzX3dvcmspOwomIzQzOwljYW5jZWxfd29ya19zeW5jKCZhbXA7cHJpdi0mZ3Q7Y3JjX2Vycl93b3JrKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGRzLSZndDtudW1fcG9ydHM7IGkmIzQzOyYjNDM7KQomIzQzOwkJY2FuY2VsX3dvcmtfc3luYygmYW1wO3ByaXYtJmd0O3BvcnRzW2ldLmhvc3RfZmxvb2Rfd29yayk7CiYjNDM7CiYjNDM7CXJldCA9IG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKHByaXYsIHBhcmFtcy0mZ3Q7ZncsIHBheWxvYWRfc2l6ZSwKJiM0MzsJCQkJICAgICAgZHMtJmd0O2RldmxpbmspOwomIzQzOwlpZiAocmV0KQomIzQzOwkJTkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywgJiMzNDtmaXJtd2FyZSB0cmFuc2ZlciBmYWlsZWQmIzM0Oyk7CiYjNDM7CiYjNDM7CWlmICghcmV0KSB7CiYjNDM7CQltdXRleF9sb2NrX25lc3RlZCgmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2J1cy0mZ3Q7bWRpb19sb2NrLAomIzQzOwkJCQkgIE1ESU9fTVVURVhfTkVTVEVEKTsKJiM0MzsJCXByaXYtJmd0O2Jsb2NrX2hvc3QgPSBmYWxzZTsKJiM0MzsJCXByaXYtJmd0O3Jlc2N1ZV9tb2RlID0gZmFsc2U7CiYjNDM7CQltdXRleF91bmxvY2soJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtidXMtJmd0O21kaW9fbG9jayk7CiYjNDM7CiYjNDM7CQkvKiBSZWZyZXNoIHRoZSBjYWNoZWQgdmVyc2lvbnMgc28gdGhlIGZsYXNoIHVwZGF0ZSBvbmx5CiYjNDM7CQkgKiBjb21wbGV0ZXMgb25jZSB0aGUgbmV3IGZpcm13YXJlIGlzIGNvbmZpcm1lZCBydW5uaW5nIGFuZAomIzQzOwkJICogZGV2bGluayBkZXYgaW5mbyByZXBvcnRzIGl0LiBNdXN0IGhhcHBlbiBiZWZvcmUgc2V0dGluZwomIzQzOwkJICogc2tpcF90ZWFyZG93biwgd2hpY2ggZGlzY2FyZHMgYWxsIGZpcm13YXJlIEFQSSByZWFkcy4KJiM0MzsJCSAqLwomIzQzOwkJcmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCU5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssCiYjNDM7CQkJCQkgICAmIzM0O25ldyBmaXJtd2FyZSBkaWQgbm90IGJlY29tZSByZWFkeSYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQkvKiBUaGUgc3dpdGNoIGlzIGluIE1DVWJvb3Qgd2l0aCBlcmFzZWQgb3IgcGFydGx5IHdyaXR0ZW4gZmxhc2g7CiYjNDM7CQkgKiBkcm9wIHRoZSBjYWNoZWQgaWRlbnRpdHkgc28gZGV2bGluayBkZXYgaW5mbyBzdG9wcyByZXBvcnRpbmcKJiM0MzsJCSAqIHRoZSBwcmUtZmxhc2ggdmVyc2lvbiB1bnRpbCB0aGUgcmVwcm9iZSByZS1yZWFkcyB0aGUgdHJ1dGguCiYjNDM7CQkgKi8KJiM0MzsJCW1lbXNldCgmYW1wO3ByaXYtJmd0O2Z3X3ZlcnNpb24sIDAsIHNpemVvZihwcml2LSZndDtmd192ZXJzaW9uKSk7CiYjNDM7CQlwcml2LSZndDthc2ljX2lkID0gMDsKJiM0MzsJCXByaXYtJmd0O2FzaWNfcmV2ID0gMDsKJiM0MzsJfQomIzQzOwomIzQzOwltdXRleF9sb2NrX25lc3RlZCgmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2J1cy0mZ3Q7bWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7CiYjNDM7CXByaXYtJmd0O3NraXBfdGVhcmRvd24gPSB0cnVlOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtwcml2LSZndDttZGlvZGV2LSZndDtidXMtJmd0O21kaW9fbG9jayk7CiYjNDM7CiYjNDM7CS8qIFJlaW5pdGlhbGlzZSB0aHJvdWdoIGEgZGVmZXJyZWQgcmUtcHJvYmU6IHJlbW92ZSgpIHJ1bnMgd2l0aAomIzQzOwkgKiBza2lwX3RlYXJkb3duIHNldCwgdGhlbiBhIGZyZXNoIHByb2JlKCkgc3RhcnRzIGFnYWluc3Qgd2hhdGV2ZXIKJiM0MzsJICogdGhlIHN3aXRjaCBub3cgcnVucy4gVGhlIGNvcmUgc2tpcHMgdGhlIHJlLXByb2JlIGlmIHRoZSBkZXZpY2UKJiM0MzsJICogaXMgdW5ib3VuZCBvciBzaHV0IGRvd24gYmVmb3JlIGl0IGZpcmVzLgomIzQzOwkgKi8KJiM0MzsJZXJyID0gZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZHMtJmd0O2RldiwgTVhMODYyWFhfRldfUkVQUk9CRV9ERUxBWV9NUyk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQgPyByZXQgOiBlcnI7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi43Y2Q4N2M3YWQ4NzE2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmgKQEAgLTAsMCAmIzQzOzEsMjAgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqLwomIzQzOwomIzQzOyNpZm5kZWYgX19NWEw4NjJYWF9GV19ICiYjNDM7I2RlZmluZSBfX01YTDg2MlhYX0ZXX0gKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bmV0L2RzYS5oJmd0OwomIzQzOwomIzQzO3N0cnVjdCBteGw4NjJ4eF9wcml2OwomIzQzO3N0cnVjdCB3b3JrX3N0cnVjdDsKJiM0MzsKJiM0MztpbnQgbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KTsKJiM0Mzt2b2lkIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKJiM0MztpbnQgbXhsODYyeHhfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiYjNDM7CQkJICAgICAgc3RydWN0IGRldmxpbmtfaW5mb19yZXEgKnJlcSwKJiM0MzsJCQkgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spOwomIzQzO2ludCBteGw4NjJ4eF9kZXZsaW5rX2ZsYXNoX3VwZGF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiYjNDM7CQkJCSAgc3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLAomIzQzOwkJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7CiYjNDM7CiYjNDM7I2VuZGlmIC8qIF9fTVhMODYyWFhfRldfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuYyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmMKaW5kZXggNGFjZDIxNmY3Y2MwMC4uNGRmN2M4MzgwOGY2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuYwomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jCkBAIC0xNSw2ICYjNDM7MTUsOCBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L3VuYWxpZ25lZC5oJmd0OwogI2luY2x1ZGUgJmx0O25ldC9kc2EuaCZndDsKICNpbmNsdWRlICYjMzQ7bXhsODYyeHguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1jbWQuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1mdy5oJiMzNDsKICNpbmNsdWRlICYjMzQ7bXhsODYyeHgtaG9zdC5oJiMzNDsKIAogI2RlZmluZSBDVFJMX0JVU1lfTUFTSwkJCUJJVCgxNSkKQEAgLTM0MCw2ICYjNDM7MzQyLDIxIEBAIGludCBteGw4NjJ4eF9hcGlfd3JhcChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGNtZCwgdm9pZCAqX2RhdGEsCiAKIAltdXRleF9sb2NrX25lc3RlZCgmYW1wO3ByaXYtJmd0O21kaW9kZXYtJmd0O2J1cy0mZ3Q7bWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7CiAKJiM0MzsJaWYgKHByaXYtJmd0O3NraXBfdGVhcmRvd24pIHsKJiM0MzsJCXJldCA9IHJlYWQgPyAtRU5PREVWIDogMDsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChwcml2LSZndDtyZXNjdWVfbW9kZSkgewomIzQzOwkJcmV0ID0gLUVOT0RFVjsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChwcml2LSZndDtibG9ja19ob3N0ICZhbXA7JmFtcDsgY21kICE9IFNZU19NSVNDX0ZXX1VQREFURSkgewomIzQzOwkJcmV0ID0gLUVCVVNZOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKIAltYXggPSAoc2l6ZSAmIzQzOyAxKSAvIDI7CiAKIAlyZXQgPSBteGw4NjJ4eF9idXN5X3dhaXQocHJpdik7CkBAIC00OTUsMTIgJiM0Mzs1MTIsNTQgQEAgaW50IG14bDg2Mnh4X3Jlc2V0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KQogCXJldHVybiByZXQ7CiB9CiAKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHCQkweDFmCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TTURJT19QQUdFX01BU0sJMHhmZmYwCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9TTURJT19PRkZfTUFTSwkJMHgwMDBmCiYjNDM7CiYjNDM7LyogUGFnZWQgY2xhdXNlLTIyIHdpbmRvdzogdGhlIHBhZ2UgZ29lcyBpbnRvIE1JSSByZWdpc3RlciAweDFmLCB0aGUgbG93IG5pYmJsZQomIzQzOyAqIG9mIGFkZHIgc2VsZWN0cyBvbmUgb2YgdGhlIDE2IHJlZ2lzdGVycyB3aXRoaW4gaXQuIEJvdGggaGVscGVycyB0YWtlIHRoZSBNRElPCiYjNDM7ICogYnVzIGxvY2sgcGVyIHRyYW5zYWN0aW9uLCBzbyBjYWxsZXJzIG11c3Qgbm90IGFscmVhZHkgaG9sZCBpdCAtLSB1bmxpa2UKJiM0MzsgKiBteGw4NjJ4eF9hcGlfd3JhcCgpLCB3aGljaCBob2xkcyBpdCBhY3Jvc3MgYSB3aG9sZSBmaXJtd2FyZSBjb21tYW5kLgomIzQzOyAqLwomIzQzO2ludCBteGw4NjJ4eF9zbWRpb19yZWFkKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgYWRkcikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtaWlfYnVzICpidXMgPSBwcml2LSZndDttZGlvZGV2LSZndDtidXM7CiYjNDM7CWludCBwaHkgPSBwcml2LSZndDttZGlvZGV2LSZndDthZGRyOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7YnVzLSZndDttZGlvX2xvY2spOwomIzQzOwlyZXQgPSBfX21kaW9idXNfd3JpdGUoYnVzLCBwaHksIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHLAomIzQzOwkJCSAgICAgIGFkZHIgJmFtcDsgTVhMODYyWFhfU01ESU9fUEFHRV9NQVNLKTsKJiM0MzsJaWYgKHJldCAmZ3Q7PSAwKQomIzQzOwkJcmV0ID0gX19tZGlvYnVzX3JlYWQoYnVzLCBwaHksIGFkZHIgJmFtcDsgTVhMODYyWFhfU01ESU9fT0ZGX01BU0spOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtidXMtJmd0O21kaW9fbG9jayk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO2ludCBteGw4NjJ4eF9zbWRpb193cml0ZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHUxNiB2YWwpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWlpX2J1cyAqYnVzID0gcHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7YnVzOwomIzQzOwlpbnQgcGh5ID0gcHJpdi0mZ3Q7bWRpb2Rldi0mZ3Q7YWRkcjsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJbXV0ZXhfbG9jaygmYW1wO2J1cy0mZ3Q7bWRpb19sb2NrKTsKJiM0MzsJcmV0ID0gX19tZGlvYnVzX3dyaXRlKGJ1cywgcGh5LCBNWEw4NjJYWF9TTURJT19BRERSX1JFRywKJiM0MzsJCQkgICAgICBhZGRyICZhbXA7IE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTSyk7CiYjNDM7CWlmIChyZXQgJmd0Oz0gMCkKJiM0MzsJCXJldCA9IF9fbWRpb2J1c193cml0ZShidXMsIHBoeSwgYWRkciAmYW1wOyBNWEw4NjJYWF9TTURJT19PRkZfTUFTSywKJiM0MzsJCQkJICAgICAgdmFsKTsKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7YnVzLSZndDttZGlvX2xvY2spOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKIHZvaWQgbXhsODYyeHhfaG9zdF9pbml0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KQogewogCUlOSVRfV09SSygmYW1wO3ByaXYtJmd0O2NyY19lcnJfd29yaywgbXhsODYyeHhfY3JjX2Vycl93b3JrX2ZuKTsKJiM0MzsJSU5JVF9XT1JLKCZhbXA7cHJpdi0mZ3Q7cmVzY3VlX2hlYWxfd29yaywgbXhsODYyeHhfcmVzY3VlX2hlYWxfd29ya19mbik7CiB9CiAKIHZvaWQgbXhsODYyeHhfaG9zdF9zaHV0ZG93bihzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdikKIHsKIAljYW5jZWxfd29ya19zeW5jKCZhbXA7cHJpdi0mZ3Q7Y3JjX2Vycl93b3JrKTsKJiM0MzsJY2FuY2VsX3dvcmtfc3luYygmYW1wO3ByaXYtJmd0O3Jlc2N1ZV9oZWFsX3dvcmspOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmgKaW5kZXggNjZkNmFlMTk4YWZmNC4uNGUwNTRjNmU0YzBlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5oCkBAIC0xOCw1ICYjNDM7MTgsNyBAQCBpbnQgbXhsODYyeHhfYXBpX3dyYXAoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUxNiBjbWQsIHZvaWQgKmRhdGEsIHUxNiBzaXplLAogCW14bDg2Mnh4X2FwaV93cmFwKGRldiwgY21kLCAmYW1wOyhkYXRhKSwgc2l6ZW9mKChkYXRhKSksIHRydWUsIHRydWUpCiAKIGludCBteGw4NjJ4eF9yZXNldChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdik7CiYjNDM7aW50IG14bDg2Mnh4X3NtZGlvX3JlYWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyKTsKJiM0MztpbnQgbXhsODYyeHhfc21kaW9fd3JpdGUoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1MTYgdmFsKTsKIAogI2VuZGlmIC8qIF9fTVhMODYyWFhfSE9TVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LXBoeWxpbmsuYwppbmRleCBiNjg5NjUyYWE5YjkyLi5hNWI2OTQwYjU1MmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1waHlsaW5rLmMKQEAgLTQwNiw2ICYjNDM7NDA2LDggQEAgbXhsODYyeHhfcGh5bGlua19tYWNfc2VsZWN0X3BjcyhzdHJ1Y3QgcGh5bGlua19jb25maWcgKmNvbmZpZywKIAogCXN3aXRjaCAocG9ydCkgewogCWNhc2UgOSAuLi4gMTY6CiYjNDM7CQlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpCiYjNDM7CQkJcmV0dXJuIE5VTEw7CiAJCWlmICghTVhMODYyWFhfRldfVkVSX01JTihwcml2LCAxLCAwLCA4NCkpIHsKIAkJCWRldl93YXJuX29uY2UoZHAtJmd0O2RzLSZndDtkZXYsCiAJCQkJICAgICAgJiMzNDtTZXJEZXMgUENTIHVuc3VwcG9ydGVkIG9uIG9sZCBmaXJtd2FyZS5cbiYjMzQ7KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmMKaW5kZXggNDVkMjM3YjNhNDBmMS4uMGUxNzljYWU5N2YzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmMKQEAgLTIxLDYgJiM0MzsyMSw3IEBACiAjaW5jbHVkZSAmIzM0O214bDg2Mnh4LmgmIzM0OwogI2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1hcGkuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O214bDg2Mnh4LWNtZC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O214bDg2Mnh4LWZ3LmgmIzM0OwogI2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1ob3N0LmgmIzM0OwogI2luY2x1ZGUgJiMzNDtteGw4NjJ4eC1waHlsaW5rLmgmIzM0OwogCkBAIC03MSw2ICYjNDM7NzIsMTMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX3Jtb25faGlzdF9yYW5nZSBteGw4NjJ4eF9ybW9uX3Jhbmdlc1tdID0gewogI2RlZmluZSBNWEw4NjJYWF9SRUFEWV9USU1FT1VUX01TCTEwMDAwCiAjZGVmaW5lIE1YTDg2MlhYX1JFQURZX1BPTExfTVMJCTEwMAogCiYjNDM7LyogQ2hpcCBJRCByZWdpc3RlcnMsIHJlYWQgdmlhIFNZU19NSVNDX1JFR19SRCAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX0wJCTB4YzBkMjg4ODQKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0NISVBJRF9NCQkweGMwZDI4ODg4CiYjNDM7I2RlZmluZSBNWEw4NjJYWF9DSElQSURfTF9QTlVNTAkJR0VOTUFTSygxNSwgMTIpCiYjNDM7I2RlZmluZSBNWEw4NjJYWF9DSElQSURfTV9QTlVNTQkJR0VOTUFTSygxMSwgMCkKJiM0MzsjZGVmaW5lIE1YTDg2MlhYX0NISVBJRF9NX1ZFUlNJT04JR0VOTUFTSygxNCwgMTIpCiYjNDM7CiAjZGVmaW5lIE1YTDg2MlhYX1RDTV9JTlNUX1NFTAkJMHhlMDAKICNkZWZpbmUgTVhMODYyWFhfVENNX0NCUwkJMHhlMTIKICNkZWZpbmUgTVhMODYyWFhfVENNX0VCUwkJMHhlMTMKQEAgLTIyMiw3ICYjNDM7MjMwLDQ2IEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcGh5X3dyaXRlX2M0NV9taWlfYnVzKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLAogCXJldHVybiBteGw4NjJ4eF9waHlfd3JpdGVfbW1kKGJ1cy0mZ3Q7cHJpdiwgYWRkciwgZGV2YWRkLCByZWdudW0sIHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiYjNDM7LyogUmVhZCB0aGUgc3RhdGljIGNoaXAgcGFydCBudW1iZXIgYW5kIHZlcnNpb24gZnJvbSB0aGUgQ0hJUCBJRAomIzQzOyAqIHJlZ2lzdGVycy4gT25seSBwb3NzaWJsZSB3aXRoIGEgcnVubmluZyBmaXJtd2FyZSwgc28gdGhlIHZhbHVlcyBhcmUKJiM0MzsgKiBjYWNoZWQgYXQgc2V0dXAgYW5kIGxlZnQgemVybyB3aGVuIHRoZSBzd2l0Y2ggaXMgaW4gcmVzY3VlIG1vZGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBteGw4NjJ4eF9yZWFkX2NoaXBfaWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbXhsODYyeHhfc3lzX3JlZ19ydyByZWcgPSB7fTsKJiM0MzsJdTE2IGNoaXBpZF9sLCBjaGlwaWRfbTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmVnLmFkZHIgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9DSElQSURfTCk7CiYjNDM7CXJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIFNZU19NSVNDX1JFR19SRCwgcmVnKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CWNoaXBpZF9sID0gbGUzMl90b19jcHUocmVnLnZhbCk7CiYjNDM7CiYjNDM7CXJlZy5hZGRyID0gY3B1X3RvX2xlMzIoTVhMODYyWFhfQ0hJUElEX00pOwomIzQzOwlyZXQgPSBNWEw4NjJYWF9BUElfUkVBRChwcml2LCBTWVNfTUlTQ19SRUdfUkQsIHJlZyk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwljaGlwaWRfbSA9IGxlMzJfdG9fY3B1KHJlZy52YWwpOwomIzQzOwomIzQzOwlwcml2LSZndDthc2ljX2lkID0gRklFTERfR0VUKE1YTDg2MlhYX0NISVBJRF9MX1BOVU1MLCBjaGlwaWRfbCkgfAomIzQzOwkJCUZJRUxEX0dFVChNWEw4NjJYWF9DSElQSURfTV9QTlVNTSwgY2hpcGlkX20pICZsdDsmbHQ7IDQ7CiYjNDM7CXByaXYtJmd0O2FzaWNfcmV2ID0gRklFTERfR0VUKE1YTDg2MlhYX0NISVBJRF9NX1ZFUlNJT04sIGNoaXBpZF9tKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIG14bDg2Mnh4X3dhaXRfcmVhZHkgLSB3YWl0IGZvciB0aGUgc3dpdGNoIGZpcm13YXJlIHRvIGJlY29tZSBvcGVyYXRpb25hbAomIzQzOyAqIEBkczogRFNBIHN3aXRjaCBpbnN0YW5jZQomIzQzOyAqCiYjNDM7ICogUG9sbCB0aGUgZmlybXdhcmUgdW50aWwgaXQgcmVwb3J0cyBpdHMgdmVyc2lvbiBhbmQgYWNjZXB0cwomIzQzOyAqIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMsIHRoZW4gY2FjaGUgdGhlIGZpcm13YXJlIHZlcnNpb24gYW5kIGNoaXAgSUQuCiYjNDM7ICogVGFrZXMgYXQgbGVhc3QgdHdvIHNlY29uZHMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiYjNDM7ICovCiYjNDM7aW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewogCXN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB2ZXIgPSB7fTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllcywgdGltZW91dDsKQEAgLTI1NCw2ICYjNDM7MzAxLDExIEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiAJCXByaXYtJmd0O2Z3X3ZlcnNpb24ubWFqb3IgPSB2ZXIuaXZfbWFqb3I7CiAJCXByaXYtJmd0O2Z3X3ZlcnNpb24ubWlub3IgPSB2ZXIuaXZfbWlub3I7CiAJCXByaXYtJmd0O2Z3X3ZlcnNpb24ucmV2aXNpb24gPSBsZTE2X3RvX2NwdSh2ZXIuaXZfcmV2aXNpb24pOwomIzQzOwomIzQzOwkJcmV0ID0gbXhsODYyeHhfcmVhZF9jaGlwX2lkKHByaXYpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlkZXZfd2Fybihkcy0mZ3Q7ZGV2LCAmIzM0O2ZhaWxlZCB0byByZWFkIGNoaXAgSUQ6ICVwZVxuJiMzNDssCiYjNDM7CQkJCSBFUlJfUFRSKHJldCkpOwogCQlyZXR1cm4gMDsKIAogbm90X3JlYWR5X3lldDoKQEAgLTYyMiwyMSAmIzQzOzY3NCw2NiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIAlpbnQgbl91c2VyX3BvcnRzID0gMCwgbWF4X3ZsYW5zOwogCWludCBpbmdyZXNzX2ZpbmFscywgdmlkX3J1bGVzOwogCXN0cnVjdCBkc2FfcG9ydCAqZHA7Ci0JaW50IHJldCwgaTsKLQotCXJldCA9IG14bDg2Mnh4X3Jlc2V0KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwomIzQzOwlpbnQgcmV0LCBpLCByZXNjdWU7CiAKJiM0MzsJLyogVGhlIFNlckRlcyBzdGF0ZSBpcyBzb2Z0d2FyZS1vbmx5IGFuZCBtdXN0IGV4aXN0IGJlZm9yZSBhbnl0aGluZyBjYW4KJiM0MzsJICogcmVhY2ggcGh5bGluaywgaW5jbHVkaW5nIGEgcmVzY3VlLW1vZGUgZmxhc2ggY2xlYXJpbmcgcmVzY3VlX21vZGUKJiM0MzsJICogYWhlYWQgb2YgdGhlIHJlcHJvYmUuCiYjNDM7CSAqLwogCW11dGV4X2luaXQoJmFtcDtwcml2LSZndDtzZXJkZXNfbG9jayk7CiAJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkUocHJpdi0mZ3Q7c2VyZGVzX3BvcnRzKTsgaSYjNDM7JiM0MzspCiAJCW14bDg2Mnh4X3NldHVwX3Bjcyhwcml2LCAmYW1wO3ByaXYtJmd0O3NlcmRlc19wb3J0c1tpXSwKIAkJCQkgICBpICYjNDM7IE1YTDg2MlhYX0ZJUlNUX1NFUkRFU19QT1JUKTsKIAomIzQzOwkvKiBEZXRlY3QgdGhlIGxvYWRlciBvdmVyIFNCIFBESSBmaXJzdDogaXQgbmVlZHMgbm8gZmlybXdhcmUsIHVubGlrZSB0aGUKJiM0MzsJICogQzQ1IEFQSSAobXhsODYyeHhfcmVzZXQvd2FpdF9yZWFkeSkgd2hpY2ggc3Bld3MgQ1JDIGVycm9ycyB3aGVuIG5vbmUKJiM0MzsJICogYW5zd2Vycy4gVG91Y2ggQzQ1IG9ubHkgb25jZSByZXNjdWUgaXMgcnVsZWQgb3V0LgomIzQzOwkgKi8KJiM0MzsJcmVzY3VlID0gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHByaXYpOwomIzQzOwlpZiAocmVzY3VlICZsdDsgMCkgewomIzQzOwkJZGV2X2Vycihkcy0mZ3Q7ZGV2LCAmIzM0O3N3aXRjaCBzdGF0ZSBkZXRlY3Rpb24gZmFpbGVkOiAlcGVcbiYjMzQ7LAomIzQzOwkJCUVSUl9QVFIocmVzY3VlKSk7CiYjNDM7CQlyZXR1cm4gcmVzY3VlOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChyZXNjdWUgPT0gTVhMODYyWFhfTk9UX1JFU0NVRSkgewomIzQzOwkJcmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CQlyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTsKJiM0MzsJCWlmIChyZXQpIHsKJiM0MzsJCQkvKiB0aGUgcmVzZXQgbWF5IG9ubHkgbm93IGhhdmUgdHJpZ2dlcmVkIHJlc2N1ZSBtb2RlICovCiYjNDM7CQkJcmVzY3VlID0gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHByaXYpOwomIzQzOwkJCWlmIChyZXNjdWUgJmx0OyAwKSB7CiYjNDM7CQkJCWRldl9lcnIoZHMtJmd0O2RldiwKJiM0MzsJCQkJCSYjMzQ7c3dpdGNoIG5vdCByZXNwb25kaW5nIGFmdGVyIHJlc2V0OiAlcGVcbiYjMzQ7LAomIzQzOwkJCQkJRVJSX1BUUihyZXNjdWUpKTsKJiM0MzsJCQkJcmV0dXJuIHJlc2N1ZTsKJiM0MzsJCQl9CiYjNDM7CQkJaWYgKHJlc2N1ZSA9PSBNWEw4NjJYWF9OT1RfUkVTQ1VFKQomIzQzOwkJCQlyZXR1cm4gcmV0OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXByaXYtJmd0O3Jlc2N1ZV9tb2RlID0gcmVzY3VlOwomIzQzOwomIzQzOwlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpIHsKJiM0MzsJCWlmIChwcml2LSZndDtyZXNjdWVfcmVhZHkpIHsKJiM0MzsJCQlkZXZfd2Fybihkcy0mZ3Q7ZGV2LAomIzQzOwkJCQkgJiMzNDtzd2l0Y2ggaW4gTUNVYm9vdCByZXNjdWUgbW9kZSwgdXNlIGRldmxpbmsgdG8gZmxhc2ggbmV3IGZpcm13YXJlXG4mIzM0Oyk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCS8qIERyYWluIHRoZSB3ZWRnZWQgZG93bmxvYWQgaW4gdGhlIGJhY2tncm91bmQgc28gaXQKJiM0MzsJCQkgKiBuZXZlciBob2xkcyB0aGUgZGV2bGluayBsb2NrOyBpbmZvIGFuZCBmbGFzaCBiZWNvbWUKJiM0MzsJCQkgKiBhdmFpbGFibGUgb25jZSByZWFkeS4KJiM0MzsJCQkgKi8KJiM0MzsJCQlkZXZfd2Fybihkcy0mZ3Q7ZGV2LAomIzQzOwkJCQkgJiMzNDtzd2l0Y2ggaW4gTUNVYm9vdCB3aXRoIGFuIGludGVycnVwdGVkIGRvd25sb2FkLCByZWNvdmVyaW5nIGluIGJhY2tncm91bmRcbiYjMzQ7KTsKJiM0MzsJCQlxdWV1ZV93b3JrKHN5c3RlbV9sb25nX3dxLCAmYW1wO3ByaXYtJmd0O3Jlc2N1ZV9oZWFsX3dvcmspOwomIzQzOwkJfQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKIAkvKiBDYWxjdWxhdGUgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplcy4KIAkgKiBXaXRoIFZMQU4gRmlsdGVyIGhhbmRsaW5nIFZJRCBtZW1iZXJzaGlwIGNoZWNrczoKIAkgKiAgIEluZ3Jlc3M6IG9ubHkgZmluYWwgY2F0Y2hhbGwgcnVsZXMgKFBWSUQgaW5zZXJ0aW9uLCA4MDIuMVEKQEAgLTcxNSwxMSAmIzQzOzgxMiwyMSBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc3RhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgYm9vbCBlbmFibGUpCiBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfZW5hYmxlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKJiM0MzsJc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy0mZ3Q7cHJpdjsKJiM0MzsKJiM0MzsJaWYgKHByaXYtJmd0O3Jlc2N1ZV9tb2RlKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiAJcmV0dXJuIG14bDg2Mnh4X3BvcnRfc3RhdGUoZHMsIHBvcnQsIHRydWUpOwogfQogCiBzdGF0aWMgdm9pZCBteGw4NjJ4eF9wb3J0X2Rpc2FibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKIHsKJiM0MzsJc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy0mZ3Q7cHJpdjsKJiM0MzsKJiM0MzsJaWYgKHByaXYtJmd0O3Jlc2N1ZV9tb2RlKQomIzQzOwkJcmV0dXJuOwomIzQzOwogCWlmIChteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSkpCiAJCWRldl9lcnIoZHMtJmd0O2RldiwgJiMzNDtmYWlsZWQgdG8gZGlzYWJsZSBwb3J0ICVkXG4mIzM0OywgcG9ydCk7CiB9CkBAIC0xMzM3LDYgJiM0MzsxNDQ0LDE3IEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcG9ydF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQogCWJvb2wgaXNfY3B1X3BvcnQgPSBkc2FfcG9ydF9pc19jcHUoZHApOwogCWludCByZXQ7CiAKJiM0MzsJaWYgKGRzYV9wb3J0X2lzX2RzYShkcCkpIHsKJiM0MzsJCWRldl9lcnIoZHMtJmd0O2RldiwgJiMzNDtwb3J0ICVkOiBEU0EgbGlua3Mgbm90IHN1cHBvcnRlZFxuJiMzNDssIHBvcnQpOwomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIERTQSByZWluaXRzIGZhaWxlZCB1c2VyIHBvcnRzIGFzIHVudXNlZDsgc2hhcmVkIHBvcnRzIG11c3QKJiM0MzsJICogc3VjY2VlZCBmb3IgdGhlIHRyZWUgdG8gcmVnaXN0ZXIuCiYjNDM7CSAqLwomIzQzOwlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpCiYjNDM7CQlyZXR1cm4gZHNhX3BvcnRfaXNfdXNlcihkcCkgPyAtRU5PREVWIDogMDsKJiM0MzsKIAlyZXQgPSBteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTEzNDYsMTEgJiM0MzsxNDY0LDYgQEAgc3RhdGljIGludCBteGw4NjJ4eF9wb3J0X3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCiAJaWYgKGRzYV9wb3J0X2lzX3VudXNlZChkcCkpCiAJCXJldHVybiAwOwogCi0JaWYgKGRzYV9wb3J0X2lzX2RzYShkcCkpIHsKLQkJZGV2X2Vycihkcy0mZ3Q7ZGV2LCAmIzM0O3BvcnQgJWQ6IERTQSBsaW5rcyBub3Qgc3VwcG9ydGVkXG4mIzM0OywgcG9ydCk7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KIAlyZXQgPSBteGw4NjJ4eF9jb25maWd1cmVfc3BfdGFnX3Byb3RvKGRzLCBwb3J0LCBpc19jcHVfcG9ydCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTE1NzIsNiAmIzQzOzE2ODUsMTIgQEAgc3RhdGljIGludCBteGw4NjJ4eF9wb3J0X21kYl9kZWwoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAlldGhlcl9hZGRyX2NvcHkocXBhcmFtLm1hYywgbWRiLSZndDthZGRyKTsKIAogCXJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIE1YTDg2MlhYX01BQ19UQUJMRUVOVFJZUVVFUlksIHFwYXJhbSk7CiYjNDM7CS8qIFBvc3QtZmxhc2ggdGVhcmRvd24gb3IgTUNVYm9vdDogdGhlIGZpcm13YXJlIGFuZCBpdHMgTUFDIHRhYmxlIGFyZQomIzQzOwkgKiBnb25lLCBzbyB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gZGVsZXRlLiBPdXRzaWRlIHRob3NlLCAtRU5PREVWIGlzIGEKJiM0MzsJICogYnVzIGVycm9yIGFuZCBtdXN0IGJlIHJlcG9ydGVkLgomIzQzOwkgKi8KJiM0MzsJaWYgKHJldCA9PSAtRU5PREVWICZhbXA7JmFtcDsgKHByaXYtJmd0O3NraXBfdGVhcmRvd24gfHwgcHJpdi0mZ3Q7cmVzY3VlX21vZGUpKQomIzQzOwkJcmV0dXJuIDA7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTYyOCw2ICYjNDM7MTc0Nyw5IEBAIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3BvcnRfc3RwX3N0YXRlX3NldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCXN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID0gZHMtJmd0O3ByaXY7CiAJaW50IHJldDsKIAomIzQzOwlpZiAocHJpdi0mZ3Q7cmVzY3VlX21vZGUpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgQlJfU1RBVEVfRElTQUJMRUQ6CiAJCXBhcmFtLnBvcnRfc3RhdGUgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9TVFBfUE9SVF9TVEFURV9ESVNBQkxFKTsKQEAgLTIwMTUsNiAmIzQzOzIxMzcsMTIgQEAgc3RhdGljIHZvaWQgbXhsODYyeHhfc3RhdHNfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcHJpdi0mZ3Q7ZHM7CiAJc3RydWN0IGRzYV9wb3J0ICpkcDsKIAomIzQzOwkvKiBBIGdldF9zdGF0czY0KCkgcmUtYXJtIGNhbiByYWNlIHRoZSBmbGFzaCB0ZWFyZG93biYjMzk7cyBXT1JLX1NUT1BQRUQKJiM0MzsJICogc2V0IGFuZCBjYW5jZWw7IGJhaWwgaGVyZSBzbyBhIHN0cmF5IHBvbGwgbmV2ZXIgcnVucyBkdXJpbmcgYSBmbGFzaC4KJiM0MzsJICovCiYjNDM7CWlmICh0ZXN0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgJmFtcDtwcml2LSZndDtmbGFncykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiAJZHNhX3N3aXRjaF9mb3JfZWFjaF9hdmFpbGFibGVfcG9ydChkcCwgZHMpCiAJCW14bDg2Mnh4X3N0YXRzX3BvbGwoZHMsIGRwLSZndDtpbmRleCk7CiAKQEAgLTIwODYsNiAmIzQzOzIyMTQsOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRzYV9zd2l0Y2hfb3BzIG14bDg2Mnh4X3N3aXRjaF9vcHMgPSB7CiAJLmdldF9wYXVzZV9zdGF0cyA9IG14bDg2Mnh4X2dldF9wYXVzZV9zdGF0cywKIAkuZ2V0X3Jtb25fc3RhdHMgPSBteGw4NjJ4eF9nZXRfcm1vbl9zdGF0cywKIAkuZ2V0X3N0YXRzNjQgPSBteGw4NjJ4eF9nZXRfc3RhdHM2NCwKJiM0MzsJLmRldmxpbmtfaW5mb19nZXQgPSBteGw4NjJ4eF9kZXZsaW5rX2luZm9fZ2V0LAomIzQzOwkuZGV2bGlua19mbGFzaF91cGRhdGUgPSBteGw4NjJ4eF9kZXZsaW5rX2ZsYXNoX3VwZGF0ZSwKIH07CiAKIHN0YXRpYyBpbnQgbXhsODYyeHhfcHJvYmUoc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaAppbmRleCA0MzJhNWYzZjJlMDhlLi45OTFiMjRhYTk1YWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaApAQCAtNCw3ICYjNDM7NCw5IEBACiAjZGVmaW5lIF9fTVhMODYyWFhfSAogCiAjaW5jbHVkZSAmbHQ7YXNtL2J5dGVvcmRlci5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9iaXRvcHMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L211dGV4LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvd29ya3F1ZXVlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L2RzYS5oJmd0OwogCkBAIC0xNCw2ICYjNDM7MTYsMTAgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXY7CiAjZGVmaW5lIE1YTDg2MlhYX0ZJUlNUX1NFUkRFU19QT1JUCTkKICNkZWZpbmUgTVhMODYyWFhfU0VSREVTX1NMT1RTCQk0CiAKJiM0MzsvKiBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QoKSByZXR1cm4gY29kZXMgKG5lZ2F0aXZlIHZhbHVlcyBhcmUgZXJyb3JzKSAqLwomIzQzOyNkZWZpbmUgTVhMODYyWFhfTk9UX1JFU0NVRQkJMAomIzQzOyNkZWZpbmUgTVhMODYyWFhfSU5fUkVTQ1VFCQkxCiYjNDM7CiAjZGVmaW5lIE1YTDg2MlhYX0RFRkFVTFRfQlJJREdFCQkwCiAjZGVmaW5lIE1YTDg2MlhYX01BWF9CUklER0VTCQk0OAogI2RlZmluZSBNWEw4NjJYWF9NQVhfQlJJREdFX1BPUlRTCTEyOApAQCAtMzAzLDYgJiM0MzszMDksMTAgQEAgc3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24gewogICogICAgICAgICAgICAgICAgICAgICAgZmxvb2RpbmcpCiAgKiBAZndfdmVyc2lvbjogICAgICAgICBjYWNoZWQgZmlybXdhcmUgdmVyc2lvbiwgcG9wdWxhdGVkIGF0IHByb2JlIGFuZAogICogICAgICAgICAgICAgICAgICAgICAgY29tcGFyZWQgd2l0aCBNWEw4NjJYWF9GV19WRVJfTUlOKCkKJiM0MzsgKiBAYXNpY19pZDogICAgICAgICAgICBjaGlwIHBhcnQgbnVtYmVyIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMsCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYXMgdGhlIGRldmxpbmsgJiMzNDthc2ljLmlkJiMzNDsgZml4ZWQgdmVyc2lvbgomIzQzOyAqIEBhc2ljX3JldjogICAgICAgICAgIGNoaXAgdmVyc2lvbiByZWFkIGZyb20gdGhlIENISVAgSUQgcmVnaXN0ZXJzLAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGFzIHRoZSBkZXZsaW5rICYjMzQ7YXNpYy5yZXYmIzM0OyBmaXhlZCB2ZXJzaW9uCiAgKiBAc2VyZGVzX3BvcnRzOiAgICAgICBTZXJEZXMgaW50ZXJmYWNlcyBpbmNsLiBzdWItaW50ZXJmYWNlcyBpbiBjYXNlIG9mCiAgKiAgICAgICAgICAgICAgICAgICAgICAxMEdfUVhHTUlJIG9yIFFTR01JSQogICogQHNlcmRlc19yZWZjb3VudDogICAgcGVyLVhQQ1MgY291bnQgb2Ygc3ViLXBvcnRzIGVuYWJsZWQgYnkgcGh5bGluazsKQEAgLTMxOSw2ICYjNDM7MzI5LDIwIEBAIHN0cnVjdCBteGw4NjJ4eF9md192ZXJzaW9uIHsKICAqIEBldmxhbl9pbmdyZXNzX3NpemU6IHBlci1wb3J0IGluZ3Jlc3MgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplCiAgKiBAZXZsYW5fZWdyZXNzX3NpemU6ICBwZXItcG9ydCBlZ3Jlc3MgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplCiAgKiBAdmZfYmxvY2tfc2l6ZTogICAgICBwZXItcG9ydCBWTEFOIEZpbHRlciBibG9jayBzaXplCiYjNDM7ICogQGJsb2NrX2hvc3Q6ICAgICAgICAgcmVqZWN0IGZpcm13YXJlIEFQSSBjb21tYW5kcyAoZXhjZXB0IEZXX1VQREFURSkKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYSBmaXJtd2FyZSBmbGFzaAomIzQzOyAqIEBza2lwX3RlYXJkb3duOiAgICAgIGRpc2NhcmQgZmlybXdhcmUgQVBJIGNvbW1hbmRzIGR1cmluZyB0aGUgdGVhcmRvd24KJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQgYnkgdGhlIHBvc3QtZmxhc2ggcmVwcm9iZQomIzQzOyAqIEByZXNjdWVfbW9kZTogICAgICAgIHN3aXRjaCBpcyBpbiBNQ1Vib290OyBmaXJtd2FyZSBBUEkgY29tbWFuZHMgZmFpbCBmYXN0LAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgY2xhdXNlLTIyIFNNRElPIHdvcmtzLiBTZXQgZnJvbSBzZXR1cCgpIGJlZm9yZSB0aGUKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggaXMgcmVnaXN0ZXJlZCBhbmQgY2xlYXJlZCB1bmRlciB0aGUgTURJTyBidXMgbG9jawomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgYmVuZWZpdCBvZiBteGw4NjJ4eF9hcGlfd3JhcCgpOyBvdGhlciByZWFkZXJzCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgb25seSBuZWVkIGl0IHRvIGJlIGEgc3RhYmxlIHNpbmdsZSBmbGFnLgomIzQzOyAqIEByZXNjdWVfcmVhZHk6ICAgICAgIChyZXNjdWVfbW9kZSkgbG9hZGVyIGlzIGF0IGEgY2xlYW4gUkVBRFkgYW5kIHdpbGwgYWNjZXB0CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgYSBmbGFzaDsgZmFsc2Ugd2hpbGUgcmVzY3VlX2hlYWxfd29yayBpcyBkcmFpbmluZwomIzQzOyAqIEByZXNjdWVfZmFpbGVkOiAgICAgIChyZXNjdWVfbW9kZSkgdGhlIHNlbGYtaGVhbCBnYXZlIHVwOyB0aGUgbG9hZGVyIG5lZWRzIGEKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICBwb3dlciBjeWNsZSBhbmQgbm8gZmxhc2ggY2FuIGJlIGFjY2VwdGVkCiYjNDM7ICogQHJlc2N1ZV9oZWFsX3dvcms6ICAgYmFja2dyb3VuZCBzZWxmLWhlYWwgZHJhaW5pbmcgYSB3ZWRnZWQgZG93bmxvYWQgdG8gUkVBRFkKICAqIEBzdGF0c193b3JrOiAgICAgICAgIHBlcmlvZGljIHdvcmsgaXRlbSB0aGF0IHBvbGxzIFJNT04gaGFyZHdhcmUgY291bnRlcnMKICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBhY2N1bXVsYXRlcyB0aGVtIGludG8gNjQtYml0IHBlci1wb3J0IHN0YXRzCiAgKi8KQEAgLTMyNiw5ICYjNDM7MzUwLDEyIEBAIHN0cnVjdCBteGw4NjJ4eF9wcml2IHsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHM7CiAJc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2OwogCXN0cnVjdCB3b3JrX3N0cnVjdCBjcmNfZXJyX3dvcms7CiYjNDM7CXN0cnVjdCB3b3JrX3N0cnVjdCByZXNjdWVfaGVhbF93b3JrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IGRyb3BfbWV0ZXI7CiAJc3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24gZndfdmVyc2lvbjsKJiM0MzsJdTE2IGFzaWNfaWQ7CiYjNDM7CXU4IGFzaWNfcmV2OwogCXN0cnVjdCBteGw4NjJ4eF9wY3Mgc2VyZGVzX3BvcnRzWzhdOwogCWludCBzZXJkZXNfcmVmY291bnRbMl07CiAJc3RydWN0IG11dGV4IHNlcmRlc19sb2NrOwpAQCAtMzM3LDcgJiM0MzszNjQsMTQgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXYgewogCXUxNiBldmxhbl9pbmdyZXNzX3NpemU7CiAJdTE2IGV2bGFuX2VncmVzc19zaXplOwogCXUxNiB2Zl9ibG9ja19zaXplOwomIzQzOwlib29sIGJsb2NrX2hvc3Q7CiYjNDM7CWJvb2wgc2tpcF90ZWFyZG93bjsKJiM0MzsJYm9vbCByZXNjdWVfbW9kZTsKJiM0MzsJYm9vbCByZXNjdWVfcmVhZHk7CiYjNDM7CWJvb2wgcmVzY3VlX2ZhaWxlZDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXRzX3dvcms7CiB9OwogCiYjNDM7aW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKJiM0MzsKICNlbmRpZiAvKiBfX01YTDg2MlhYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IGFlZTc5ZmQ2YjMyYjQuLjdhOTkxNjk1MDU3NzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMTMxNCw2ICYjNDM7MTMxNCw4IEBAIGludCAgX19tdXN0X2NoZWNrIGRldmljZV9hdHRhY2goc3RydWN0IGRldmljZSAqZGV2KTsKIGludCBfX211c3RfY2hlY2sgZHJpdmVyX2F0dGFjaChjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KTsKIHZvaWQgZGV2aWNlX2luaXRpYWxfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKIGludCBfX211c3RfY2hlY2sgZGV2aWNlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKJiM0MztpbnQgX19tdXN0X2NoZWNrIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwKJiM0MzsJCQkJCSB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpOwogCiBib29sIGRldmljZV9pc19ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc2EuaCBiL2luY2x1ZGUvbmV0L2RzYS5oCmluZGV4IDZmN2Y1YzE3YjUzMjAuLjU4NTk3YjE0ZTU5MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RzYS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbmV0L2RzYS5oCkBAIC0xMTcyLDYgJiM0MzsxMTcyLDkgQEAgc3RydWN0IGRzYV9zd2l0Y2hfb3BzIHsKIAlpbnQJKCpkZXZsaW5rX2luZm9fZ2V0KShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiAJCQkJICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsCiAJCQkJICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7CiYjNDM7CWludAkoKmRldmxpbmtfZmxhc2hfdXBkYXRlKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiYjNDM7CQkJCQlzdHJ1Y3QgZGV2bGlua19mbGFzaF91cGRhdGVfcGFyYW1zICpwYXJhbXMsCiYjNDM7CQkJCQlzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spOwogCWludAkoKmRldmxpbmtfc2JfcG9vbF9nZXQpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IHNiX2luZGV4LCB1MTYgcG9vbF9pbmRleCwKIAkJCQkgICAgICAgc3RydWN0IGRldmxpbmtfc2JfcG9vbF9pbmZvICpwb29sX2luZm8pOwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9kZXZsaW5rLmMgYi9uZXQvZHNhL2RldmxpbmsuYwppbmRleCBlZDM0MmYzNDU2OTJiLi4yNTMxMWE4N2NiYzU2IDEwMDY0NAotLS0gYS9uZXQvZHNhL2RldmxpbmsuYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvZHNhL2RldmxpbmsuYwpAQCAtMjAsNiAmIzQzOzIwLDE4IEBAIHN0YXRpYyBpbnQgZHNhX2RldmxpbmtfaW5mb19nZXQoc3RydWN0IGRldmxpbmsgKmRsLAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAomIzQzO3N0YXRpYyBpbnQgZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlKHN0cnVjdCBkZXZsaW5rICpkbCwKJiM0MzsJCQkJICAgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcywKJiM0MzsJCQkJICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRzYV9kZXZsaW5rX3RvX2RzKGRsKTsKJiM0MzsKJiM0MzsJaWYgKCFkcy0mZ3Q7b3BzLSZndDtkZXZsaW5rX2ZsYXNoX3VwZGF0ZSkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsKJiM0MzsJcmV0dXJuIGRzLSZndDtvcHMtJmd0O2RldmxpbmtfZmxhc2hfdXBkYXRlKGRzLCBwYXJhbXMsIGV4dGFjayk7CiYjNDM7fQomIzQzOwogc3RhdGljIGludCBkc2FfZGV2bGlua19zYl9wb29sX2dldChzdHJ1Y3QgZGV2bGluayAqZGwsCiAJCQkJICAgdW5zaWduZWQgaW50IHNiX2luZGV4LCB1MTYgcG9vbF9pbmRleCwKIAkJCQkgICBzdHJ1Y3QgZGV2bGlua19zYl9wb29sX2luZm8gKnBvb2xfaW5mbykKQEAgLTE2OSw2ICYjNDM7MTgxLDcgQEAgZHNhX2Rldmxpbmtfc2Jfb2NjX3RjX3BvcnRfYmluZF9nZXQoc3RydWN0IGRldmxpbmtfcG9ydCAqZGxwLAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldmxpbmtfb3BzIGRzYV9kZXZsaW5rX29wcyA9IHsKIAkuaW5mb19nZXQJCQk9IGRzYV9kZXZsaW5rX2luZm9fZ2V0LAomIzQzOwkuZmxhc2hfdXBkYXRlCQkJPSBkc2FfZGV2bGlua19mbGFzaF91cGRhdGUsCiAJLnNiX3Bvb2xfZ2V0CQkJPSBkc2FfZGV2bGlua19zYl9wb29sX2dldCwKIAkuc2JfcG9vbF9zZXQJCQk9IGRzYV9kZXZsaW5rX3NiX3Bvb2xfc2V0LAogCS5zYl9wb3J0X3Bvb2xfZ2V0CQk9IGRzYV9kZXZsaW5rX3NiX3BvcnRfcG9vbF9nZXQsCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDA2OjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4NjE4CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMTMyNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIEFuYWx5c2lzOiBgbXhsODYyeHhgIGFuZCBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBkZXZsaW5rIGZsYXNoIHVwZGF0ZSBzdXBwb3J0IHRvIHRoZSBgbXhsODYyeHhgIERTQSBzd2l0Y2ggZHJpdmVyIGFuZCBhIG5ldyBmdW5jdGlvbiwgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCwgaW4gYGRyaXZlcnMvYmFzZS9kZC5jYC4gTGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHRoZSBgbXhsODYyeHhgIGRyaXZlci4gSXQmIzM5O3MgYSBEU0Egc3dpdGNoIGRyaXZlciwgbWVhbmluZyBpdCB0eXBpY2FsbHkgcmVxdWlyZXMgcGh5c2ljYWwgaGFyZHdhcmUgb3IgYSB2ZXJ5IHNwZWNpZmljIGVtdWxhdGlvbiBzZXR1cCwgdXN1YWxseSBpbnZvbHZpbmcgTURJTywgSTJDLCBvciBTUEkgaW50ZXJmYWNlcy4gV2UgZ2VuZXJhbGx5IGRvbiYjMzk7dCB0YXJnZXQgaGFyZHdhcmUtc3BlY2lmaWMgRFNBIGRyaXZlcnMgdW5sZXNzIHRoZXkmIzM5O3JlIHdpZGVseSBlbXVsYXRlZCwgd2hpY2ggaXNuJiMzOTt0IHR5cGljYWxseSB0aGUgY2FzZS4gVGhlIGluc3RydWN0aW9ucyBleHBsaWNpdGx5IHNheSB0byBleGNsdWRlIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCBkcml2ZXJzLCBidXQgYG14bDg2Mnh4YCBpcyBhbiBNRElPLWJhc2VkIHN3aXRjaCwgc28gdGhhdCBleGNsdXNpb24gZG9lc24mIzM5O3QgZGlyZWN0bHkgYXBwbHkuCgpOb3csIHRoZSBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIGZ1bmN0aW9uIGluIGNvcmUga2VybmVsIGNvZGUgaW4gYGRyaXZlcnMvYmFzZS9kZC5jYC4gVGhpcyBpcyBwb3RlbnRpYWxseSBtb3JlIGludGVyZXN0aW5nIGJlY2F1c2UgaXQmIzM5O3MgKmNvcmUqIGtlcm5lbCBsb2dpYyBhbmQgaXMgZXhwb3J0ZWQuIExvb2tpbmcgYXQgdGhlIGNvZGUsIGl0IHNjaGVkdWxlcyBhIHJlcHJvYmUgb3BlcmF0aW9uIGZvciBhIGRldmljZSwgcHJvdmlkZWQgaXQmIzM5O3MgcmVnaXN0ZXJlZCwgaGFzIGEgYnVzLCBhIHBhcmVudCwgYW5kIGEgZHJpdmVyLiBJdCB1c2VzIGRlbGF5ZWQgd29yaywgYW5kIHRoZSBjb2RlIGxvb2tzIGNsZWFuLiBDcnVjaWFsbHksIGl0JiMzOTtzIG5vdyBhIG5ldyBjb3JlIEFQSSwgd2hpY2ggbWVhbnMgKmFueSogZHJpdmVyIGNvdWxkIHBvdGVudGlhbGx5IHVzZSBpdC4gSXQgaXMgYWxzbyBleHBvcnRlZCwgbWVhbmluZyBpdCAqY2FuKiBiZSBjYWxsZWQgYnkgb3RoZXIgZHJpdmVycy4KCkhvd2V2ZXIsIGN1cnJlbnRseSwgb25seSBgbXhsODYyeHhgIGNhbGxzIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAuIEJlY2F1c2UgYG14bDg2Mnh4YCBpcyBhbiBNRElPIGRyaXZlciwgd2hpY2ggbWVhbnMgaXQgbGlrZWx5IGlzbiYjMzk7dCBnb2luZyB0byBiZSBmdXp6ZWQgdW5sZXNzIHRoZXJlIGlzIHNwZWNpZmljIHNldHVwIGluc3RydWN0aW9ucy4gIFN5emthbGxlciBtaWdodCBub3QgYXV0b21hdGljYWxseSBpbnN0YW50aWF0ZSB0aGVzZSBNRElPIGRldmljZXMgdW5sZXNzIHRoZXJlJiMzOTtzIGEgc3BlY2lmaWMgc3l6bGFuZyBkZXNjcmlwdGlvbi4KClRoZSBvdGhlciBjaGFuZ2UgaXMgYGRzYV9kZXZsaW5rX2ZsYXNoX3VwZGF0ZWAgaW4gYG5ldC9kc2EvZGV2bGluay5jYC4gVGhpcyBpcyByZWFjaGFibGUgdmlhIHRoZSBkZXZsaW5rIG5ldGxpbmsgaW50ZXJmYWNlLCAqaWYqIHRoZSBEU0Egc3dpdGNoIHN1cHBvcnRzIGRldmxpbmsgZmxhc2ggdXBkYXRlcy4gQ3VycmVudGx5LCBvbmx5IGBteGw4NjJ4eGAgaW1wbGVtZW50cyB0aGlzLiBGb3Igb3RoZXIgRFNBIHN3aXRjaGVzLCBpdCB3aWxsIHJldHVybiBgLUVPUE5PVFNVUFBgLgoKU28sIHRoZSByZWFsIHF1ZXN0aW9uIGlzIHdoZXRoZXIgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCBpcyB3b3J0aCBmdXp6aW5nLiBXaGlsZSBpdCAqY291bGQqIGJlIHVzZWQgYnkgbW9yZSBkcml2ZXJzIGluIHRoZSBmdXR1cmUsIGl0cyBjdXJyZW50IHNvbGUgY2FsbGVyIGlzIGBteGw4NjJ4eGAuIFNpbmNlIGBteGw4NjJ4eGAgaXMgYW4gTURJTyBkcml2ZXIsIHdoaWNoIGFyZSBub3QgY29tbW9ubHkgZnV6emVkIHdpdGhvdXQgZGVkaWNhdGVkIHNldHVwLCBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIHdpbGwgbGlrZWx5IGJlIHVucmVhY2hhYmxlIGluIG1vc3QgZnV6emluZyBzZXR1cHMgdW5sZXNzIHRoaXMgZHJpdmVyIGlzIHNwZWNpZmljYWxseSBlbmFibGVkLgoKTXkgbmV4dCBzdGVwIHdvdWxkIGJlIHRvIHBlcmZvcm0gYSBgZGVmYXVsdF9hcGk6Z3JlcHBlcmAgc2VhcmNoIHRvIGNoZWNrIGZvciBvdGhlciBjYWxsZXJzIG9mIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAsIGFsdGhvdWdoIEkgc3VzcGVjdCB0aGUgY3VycmVudCBjYWxsIGlzIHRoZSBvbmx5IG9uZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAwNjo1MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2Jhc2UvYmFzZS5oPTgwPXN0cnVjdCBkcml2ZXJfcHJpdmF0ZSB7XG4tLVxuZHJpdmVycy9iYXNlL2Jhc2UuaC0xMTEtICpcdCAgZGV2aWNlIGxvY2suIEEgZGVmZXJyZWQgcmUtcHJvYmUgc2NoZWR1bGVkIHdpdGhcbmRyaXZlcnMvYmFzZS9iYXNlLmg6MTEyOiAqXHQgIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKCkgbXVzdCBub3QgZGV0YWNoIHRoZSBkZXZpY2UgYW55bW9yZS5cbmRyaXZlcnMvYmFzZS9iYXNlLmgtMTEzLSAqXG4tLVxuZHJpdmVycy9iYXNlL2RkLmM9MTQ0Nj1zdGF0aWMgdm9pZCBkZXZpY2VfcmVwcm9iZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbi0tXG5kcml2ZXJzL2Jhc2UvZGQuYy0xNDczLS8qKlxuZHJpdmVycy9iYXNlL2RkLmM6MTQ3NDogKiBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSAtIHNjaGVkdWxlIGEgZGVmZXJyZWQgZGV0YWNoIGFuZCByZS1wcm9iZVxuZHJpdmVycy9iYXNlL2RkLmMtMTQ3NS0gKiBAZGV2OiBkZXZpY2UgdG8gZGV0YWNoIGFuZCByZS1wcm9iZVxuLS1cbmRyaXZlcnMvYmFzZS9kZC5jLTE0OTgtICovXG5kcml2ZXJzL2Jhc2UvZGQuYzoxNDk5OmludCBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBkZWxheV9tcylcbmRyaXZlcnMvYmFzZS9kZC5jLTE1MDAte1xuLS1cbmRyaXZlcnMvYmFzZS9kZC5jLTE1MTktfVxuZHJpdmVycy9iYXNlL2RkLmM6MTUyMDpFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSk7XG4tLVxuZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmM9NDIxPXZvaWQgbXhsODYyeHhfcmVzY3VlX2hlYWxfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4tLVxuZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMtNDUxLVxuZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmM6NDUyOlx0aWYgKGRldmljZV9zY2hlZHVsZV9yZXByb2JlKGRldiwgTVhMODYyWFhfRldfUkVQUk9CRV9ERUxBWV9NUykpXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYy00NTMtXHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfZmFpbGVkLCB0cnVlKTtcbi0tXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYz05MjM9aW50IG14bDg2Mnh4X2RldmxpbmtfZmxhc2hfdXBkYXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcbi0tXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYy0xMDUwLVx0ICovXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYzoxMDUxOlx0ZXJyID0gZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZHMtXHUwMDNlZGV2LCBNWEw4NjJYWF9GV19SRVBST0JFX0RFTEFZX01TKTtcbmRyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jLTEwNTItXG4tLVxuaW5jbHVkZS9saW51eC9kZXZpY2UuaD0xMzE2PWludCBfX211c3RfY2hlY2sgZGV2aWNlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTtcbmluY2x1ZGUvbGludXgvZGV2aWNlLmg6MTMxNzppbnQgX19tdXN0X2NoZWNrIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldixcbmluY2x1ZGUvbGludXgvZGV2aWNlLmgtMTMxOC1cdFx0XHRcdFx0IHVuc2lnbmVkIGludCBkZWxheV9tcyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDY6NTE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzEzNTgKCQkJCQkJCW91dHB1dDogMTc2CgkJCQkJCQl0aG91Z2h0czogMTU3MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBGdXp6aW5nIFBvdGVudGlhbCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBzb21lIGNoYW5nZXMgcmVsYXRlZCB0byBmaXJtd2FyZSBmbGFzaGluZyBmb3IgYSBNYXhMaW5lYXIgTXhMODYyeHggRFNBIHN3aXRjaCwgYSBkZXZpY2UgZHJpdmVyIGZvciBhIGhhcmR3YXJlLXNwZWNpZmljIHN3aXRjaC4gVGhlIGtleSBxdWVzdGlvbiBpcyB3aGV0aGVyIGFueSBvZiB0aGlzIGlzIGZydWl0ZnVsbHkgZnV6emFibGUgd2l0aGluIGEgc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudCwgd2hpY2ggaXMgd2hhdCBTeXprYWxsZXIgcHJpbWFyaWx5IG9wZXJhdGVzIGluLgoKRmlyc3QsIHRoZSBvbmx5IGNhbGwgc2l0ZSBmb3IgdGhpcyBwYXRjaCBpcyB0aGUgYG14bDg2Mnh4YCBkcml2ZXIsIHdoaWNoIGlzIGFuIE1ESU8gZGV2aWNlIGRyaXZlci4gU3l6a2FsbGVyIGRvZXNuJiMzOTt0IGhhdmUgYSByZWxpYWJsZSwgZ2VuZXJpYyBtZWNoYW5pc20gdG8gaW5zdGFudGlhdGUgTURJTyBkZXZpY2VzLiBJdCBuZWVkcyBhIHNwZWNpZmljIGludGVyZmFjZSBsaWtlIGBtZGlvLWdwaW9gIG9yIHNpbWlsYXIsIHdoaWNoIHdvdWxkIHJlcXVpcmUgdGFyZ2V0ZWQgZGVzY3JpcHRpb25zLCB3aGljaCB3ZSBkb24mIzM5O3QgaGF2ZS4gRXZlbiBpZiB3ZSBjb3VsZCBnZXQgdGhlIGRyaXZlciBsb2FkZWQsIGl0IHJlcXVpcmVzIHNwZWNpZmljIGhhcmR3YXJlLgoKVGhlIHBhdGNoIGludHJvZHVjZXMgYGRzYV9kZXZsaW5rX2ZsYXNoX3VwZGF0ZWAsIHJlYWNoYWJsZSB2aWEgdGhlIGRldmxpbmsgbmV0bGluayBpbnRlcmZhY2UuIFRoZSBwcm9ibGVtIGlzIHRoYXQgZnV6emluZyBgZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlYCB3b3VsZCBqdXN0IHJlc3VsdCBpbiBhIGAtRU9QTk9UU1VQUGAgZXJyb3IgKnVubGVzcyogd2UgaGF2ZSBhIERTQSBzd2l0Y2ggdGhhdCBpbXBsZW1lbnRzIHRoaXMgZnVuY3Rpb25hbGl0eSwgYW5kIGN1cnJlbnRseSwgKm9ubHkqIGBteGw4NjJ4eGAgZG9lcy4gU28sIHRyaWdnZXJpbmcgdGhpcyB0aHJvdWdoIGEgZ2VuZXJpYyBEU0Egc3dpdGNoIGlzIGEgZGVhZCBlbmQuIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSB3cmFwcGVyOgoKYGBgYwpzdGF0aWMgaW50IGRzYV9kZXZsaW5rX2ZsYXNoX3VwZGF0ZShzdHJ1Y3QgZGV2bGluayAqZGwsCgkJCQkgICAgc3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLAoJCQkJICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKewoJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZHNhX2RldmxpbmtfdG9fZHMoZGwpOwoKCWlmICghZHMtJmd0O29wcy0mZ3Q7ZGV2bGlua19mbGFzaF91cGRhdGUpCgkJcmV0dXJuIC1FT1BOT1RTVVBQOwoKCXJldHVybiBkcy0mZ3Q7b3BzLSZndDtkZXZsaW5rX2ZsYXNoX3VwZGF0ZShkcywgcGFyYW1zLCBleHRhY2spOwp9CmBgYAoKVGhlIGNvcmUgbG9naWMgbGllcyBpbiBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIGFuZCB3aXRoaW4gYG14bDg2Mnh4YCBpdHNlbGYuIFNpbmNlIGBteGw4NjJ4eGAgaXMgZm9yIGEgc3BlY2lmaWMsIGhhcmR3YXJlIHN3aXRjaCwgaXQgaXMgbm90IGVtdWxhdGVkIGluIFFFTVUuIFRoaXMgc2VlbXMgdG8gdmlvbGF0ZSB0aGUgcnVsZSBvZiByZXF1aXJpbmcgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcy4KClRoZSBjb2RlIGluc3RydWN0aW9ucyBzYXkgdG8gc2V0IFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgY2hhbmdlcyBhcmUgZm9yIGEgdmVuZG9yLXNwZWNpZmljIGRyaXZlciB0aGF0IHJlcXVpcmVzIHNwZWNpZmljIFBDSWUgaGFyZHdhcmUgbm90IGVtdWxhdGVkIGJ5IFFFTVUuIFRoYXQgaXMgdGhpcyBjYXNlLiBUaGUgTURJTyBjb21tdW5pY2F0aW9uIGlzIHZlcnkgc3BlY2lmaWMsIGFuZCB0aGUgcHJvYmUgd2lsbCBmYWlsIGlmIGl0IGRvZXNuJiMzOTt0IGdldCB0aGUgY29ycmVjdCByZXNwb25zZXMgZnJvbSB0aGUgaGFyZHdhcmU6CmBgYGMKCWEgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9BRERSKTsKCWQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBKTsKCWlmICgodTE2KWEgIT0gTVhMODYyWFhfU0JfUERJX1BST0JFX0EgfHwKCSAgICAodTE2KWQgIT0gTVhMODYyWFhfU0JfUERJX1BST0JFX0QpCgkJcmV0dXJuIC1FTk9ERVY7CmBgYAoKV2UgY2hlY2tlZCBpZiBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIGNvdWxkIGJlIGNhbGxlZCBmcm9tIGFueXdoZXJlIGVsc2UsIGJ1dCBpdCYjMzk7cyBvbmx5IGNhbGxlZCBieSBgbXhsODYyeHhgLiBTbywgdGhlIGNvcmUgY2hhbmdlcyBhcmUsIGZ1bmN0aW9uYWxseSwgaW1wb3NzaWJsZSB0byB0cmlnZ2VyIHdpdGhvdXQgdGhlIGhhcmR3YXJlLCBvciBhcmUgdHJpdmlhbC4KClRoZXJlIGlzIGEgbWlub3IgYWRkaXRpb24gdG8gYGRyaXZlcnMvYmFzZS9jb3JlLmNgIHRoYXQgc2V0cyBgc2h1dGRvd25fZG9uZSA9IHRydWVgIHdpdGhpbiBgZGV2aWNlX3NodXRkb3duYC4gVGhpcyBoYXBwZW5zIGR1cmluZyBzeXN0ZW0gc2h1dGRvd24sIHRyaWdnZXJlZCBieSBTeXprYWxsZXImIzM5O3MgcmVib290IHNlcXVlbmNlLCBhbmQgdGhpcyBhY3Rpb24gaXMgdHJpdmlhbCBhbmQgdW5saWtlbHkgdG8gYmUgdGhlIHRhcmdldCBvZiBhIGZ1enouCgpUaHVzLCB0aGUgYWRkZWQgY29kZSBpcyB1bnJlYWNoYWJsZSBvciB0cml2aWFsLCBhbmQgdGhlIHJldHVybiBpcyBXb3J0aEZ1enppbmc9ZmFsc2UuCgpUaGUgcmVhc29uaW5nIGlzIHRoYXQgdGhlIGNoYW5nZXMgYXJlIGxhcmdlbHkgY29uZmluZWQgdG8gYSB2ZW5kb3Itc3BlY2lmaWMgZHJpdmVyIHJlcXVpcmluZyBoYXJkd2FyZSBub3QgZW11bGF0ZWQgYnkgUUVNVSwgdGhlIG5ldyBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIEFQSSBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IHRoaXMgdW5yZWFjaGFibGUgZHJpdmVyLCBhbmQgdGhlIERTQSBkZXZsaW5rIGNoYW5nZXMgYXJlIHRyaXZpYWwgd3JhcHBlcnMuIFRoZSBgZGV2aWNlX3NodXRkb3duYCBjaGFuZ2Ugc2V0cyBhIGJvb2xlYW4gaW4gYSBzaHV0ZG93biByb3V0aW5lLiBBbGwgb2YgdGhpcyBpbmRpY2F0ZXMgdGhlcmUmIzM5O3Mgbm90aGluZyBmdW5jdGlvbmFsbHkgc2lnbmlmaWNhbnQgYW5kIHJlYWNoYWJsZSB0aGF0IGlzIGEgZ29vZCB0YXJnZXQgZm9yIGZ1enppbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDY6NTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGZpcm13YXJlIGZsYXNoIHN1cHBvcnQgZm9yIHRoZSBNYXhMaW5lYXIgTXhMODYyeHggRFNBIHN3aXRjaCB2aWEgZGV2bGluaywgYWxvbmcgd2l0aCBhIG5ldyBjb3JlIGRyaXZlciBtb2RlbCBmdW5jdGlvbiBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgLiBUaGUgYG14bDg2Mnh4YCBkcml2ZXIgcmVxdWlyZXMgcGh5c2ljYWwgaGFyZHdhcmUgY29ubmVjdGVkIHZpYSBNRElPIHRvIHByb2JlIHN1Y2Nlc3NmdWxseSBhbmQgaXMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuIFRoZSBuZXcgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCBBUEkgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieSB0aGlzIHVucmVhY2hhYmxlIGRyaXZlci4gVGhlIGFkZGl0aW9ucyB0byB0aGUgRFNBIGRldmxpbmsgY29yZSBhcmUgdHJpdmlhbCB3cmFwcGVycyB0aGF0IHJldHVybiBgLUVPUE5PVFNVUFBgIGZvciBhbGwgb3RoZXIgc3dpdGNoZXMuIFRoZSBtb2RpZmljYXRpb24gdG8gYGRldmljZV9zaHV0ZG93bmAgbWVyZWx5IHNldHMgYSBib29sZWFuIGZsYWcgZHVyaW5nIHN5c3RlbSB0ZWFyZG93bi4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBmdW5jdGlvbmFsbHkgc2lnbmlmaWNhbnQsIHJlYWNoYWJsZSBjb2RlIHRvIGZ1enouJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGZpcm13YXJlIGZsYXNoIHN1cHBvcnQgZm9yIHRoZSBNYXhMaW5lYXIgTXhMODYyeHggRFNBIHN3aXRjaCB2aWEgZGV2bGluaywgYWxvbmcgd2l0aCBhIG5ldyBjb3JlIGRyaXZlciBtb2RlbCBmdW5jdGlvbiBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgLiBUaGUgYG14bDg2Mnh4YCBkcml2ZXIgcmVxdWlyZXMgcGh5c2ljYWwgaGFyZHdhcmUgY29ubmVjdGVkIHZpYSBNRElPIHRvIHByb2JlIHN1Y2Nlc3NmdWxseSBhbmQgaXMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuIFRoZSBuZXcgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCBBUEkgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieSB0aGlzIHVucmVhY2hhYmxlIGRyaXZlci4gVGhlIGFkZGl0aW9ucyB0byB0aGUgRFNBIGRldmxpbmsgY29yZSBhcmUgdHJpdmlhbCB3cmFwcGVycyB0aGF0IHJldHVybiBgLUVPUE5PVFNVUFBgIGZvciBhbGwgb3RoZXIgc3dpdGNoZXMuIFRoZSBtb2RpZmljYXRpb24gdG8gYGRldmljZV9zaHV0ZG93bmAgbWVyZWx5IHNldHMgYSBib29sZWFuIGZsYWcgZHVyaW5nIHN5c3RlbSB0ZWFyZG93bi4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBmdW5jdGlvbmFsbHkgc2lnbmlmaWNhbnQsIHJlYWNoYWJsZSBjb2RlIHRvIGZ1enouJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDA2OjUxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0xNVQwNjo1MDo0NC40NDMzMTYxNDdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNTU1MjEwODEzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgZmlybXdhcmUgZmxhc2ggc3VwcG9ydCBmb3IgdGhlIE1heExpbmVhciBNeEw4NjJ4eCBEU0Egc3dpdGNoIHZpYSBkZXZsaW5rLCBhbG9uZyB3aXRoIGEgbmV3IGNvcmUgZHJpdmVyIG1vZGVsIGZ1bmN0aW9uIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAuIFRoZSBgbXhsODYyeHhgIGRyaXZlciByZXF1aXJlcyBwaHlzaWNhbCBoYXJkd2FyZSBjb25uZWN0ZWQgdmlhIE1ESU8gdG8gcHJvYmUgc3VjY2Vzc2Z1bGx5IGFuZCBpcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4gVGhlIG5ldyBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIEFQSSBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IHRoaXMgdW5yZWFjaGFibGUgZHJpdmVyLiBUaGUgYWRkaXRpb25zIHRvIHRoZSBEU0EgZGV2bGluayBjb3JlIGFyZSB0cml2aWFsIHdyYXBwZXJzIHRoYXQgcmV0dXJuIGAtRU9QTk9UU1VQUGAgZm9yIGFsbCBvdGhlciBzd2l0Y2hlcy4gVGhlIG1vZGlmaWNhdGlvbiB0byBgZGV2aWNlX3NodXRkb3duYCBtZXJlbHkgc2V0cyBhIGJvb2xlYW4gZmxhZyBkdXJpbmcgc3lzdGVtIHRlYXJkb3duLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCwgcmVhY2hhYmxlIGNvZGUgdG8gZnV6ei5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDA2OjUwOjQ0LjQ0MzMyMTczN1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTE3MjcyMTI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMjliMDExNmUwNTU5Y2NjYTE0OGFlNjlhMGFhZDYyNzQyNjFlM2JkM1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU2F0IEF1ZyAxNSAwNjo1MDo0MyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9pbmRleC5yc3RcXG5pbmRleCA0NzQ1MTQ4ZmVjZjRmLi4wNTg5OTlkMGRjNTZmIDEwMDY0NFxcbi0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdFxcbisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdFxcbkBAIC05NCw2ICs5NCw3IEBAIHBhcmFtZXRlcnMsIGluZm8gdmVyc2lvbnMsIGFuZCBvdGhlciBmZWF0dXJlcyBpdCBzdXBwb3J0cy5cXG4gICAgbWx4NVxcbiAgICBtbHhzd1xcbiAgICBtdjg4ZTZ4eHhcXG4rICAgbXhsODYyeHhcXG4gICAgbmV0ZGV2c2ltXFxuICAgIG5mcFxcbiAgICBvY3Rlb250eDJcXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RldmxpbmsvbXhsODYyeHgucnN0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RldmxpbmsvbXhsODYyeHgucnN0XFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi41YjI0ZDhjYjU3YmM5XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL214bDg2Mnh4LnJzdFxcbkBAIC0wLDAgKzEsNzQgQEBcXG4rLi4gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKz09PT09PT09PT09PT09PT09PT09PT09PVxcbitteGw4NjJ4eCBkZXZsaW5rIHN1cHBvcnRcXG4rPT09PT09PT09PT09PT09PT09PT09PT09XFxuK1xcbitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgZGV2bGluayBmZWF0dXJlcyBpbXBsZW1lbnRlZCBieSB0aGVcXG4rYGBteGw4NjJ4eGBgIGRldmljZSBkcml2ZXIuXFxuK1xcbitJbmZvIHZlcnNpb25zXFxuKz09PT09PT09PT09PT1cXG4rXFxuK1RoZSBgYG14bDg2Mnh4YGAgZHJpdmVyIHJlcG9ydHMgdGhlIGZvbGxvd2luZyB2ZXJzaW9uc1xcbitcXG4rLi4gbGlzdC10YWJsZTo6IGRldmxpbmsgaW5mbyB2ZXJzaW9ucyBpbXBsZW1lbnRlZFxcbisgICA6d2lkdGhzOiA1IDUgNSA4NVxcbitcXG4rICAgKiAtIE5hbWVcXG4rICAgICAtIFR5cGVcXG4rICAgICAtIEV4YW1wbGVcXG4rICAgICAtIERlc2NyaXB0aW9uXFxuKyAgICogLSBgYGFzaWMuaWRgYFxcbisgICAgIC0gZml4ZWRcXG4rICAgICAtIDg2MjhcXG4rICAgICAtIFRoZSBjaGlwIHBhcnQgbnVtYmVyIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMuIE9taXR0ZWRcXG4rICAgICAgIHdoZW4gdGhlIHBhcnQgbnVtYmVyIHJlYWRzIGFzIHplcm8sIHdoaWNoIGhhcHBlbnMgZm9yIGEgc3dpdGNoXFxuKyAgICAgICBzaXR0aW5nIGluIE1DVWJvb3QgcmVzY3VlIG1vZGUgKHRoZSByZWdpc3RlcnMgbmVlZCBhIHJ1bm5pbmdcXG4rICAgICAgIGZpcm13YXJlKSwgZm9yIGFuIHVuZnVzZWQgcGFydCwgYW5kIGFmdGVyIGEgZmFpbGVkIGZsYXNoLlxcbisgICAqIC0gYGBhc2ljLnJldmBgXFxuKyAgICAgLSBmaXhlZFxcbisgICAgIC0gMFxcbisgICAgIC0gVGhlIGNoaXAgdmVyc2lvbiByZWFkIGZyb20gdGhlIHNhbWUgcmVnaXN0ZXIgd29yZCwgc28gaXQgaXNcXG4rICAgICAgIG9taXR0ZWQgd2hlbmV2ZXIgYGBhc2ljLmlkYGAgaXMuXFxuKyAgICogLSBgYGZ3YGBcXG4rICAgICAtIHJ1bm5pbmcsIHN0b3JlZFxcbisgICAgIC0gMS4wLjcwXFxuKyAgICAgLSBWZXJzaW9uIG9mIHRoZSBmaXJtd2FyZSBydW5uaW5nIG9uIHRoZSBzd2l0Y2gsIHJlcG9ydGVkIGFzIGJvdGhcXG4rICAgICAgIHJ1bm5pbmcgYW5kIHN0b3JlZCBzaW5jZSB0aGUgc3dpdGNoIGJvb3RzIGl0IGZyb20gaXRzIG93biBmbGFzaC5cXG4rICAgICAgIEl0IGlzIG9taXR0ZWQgd2hpbGUgbm8gZmlybXdhcmUgdmVyc2lvbiBpcyBrbm93bjogYWZ0ZXIgYSBmYWlsZWRcXG4rICAgICAgIGZsYXNoLCBhbmQgaW4gTUNVYm9vdCByZXNjdWUgbW9kZSB3aGlsZSBhbiBpbnRlcnJ1cHRlZCBkb3dubG9hZFxcbisgICAgICAgaXMgc3RpbGwgYmVpbmcgcmVjb3ZlcmVkIGluIHRoZSBiYWNrZ3JvdW5kLiBPbmNlIHRoZSBsb2FkZXIgaXNcXG4rICAgICAgIHJlYWR5IHRvIGFjY2VwdCBhIG5ldyBpbWFnZSB0aGUgdmVyc2lvbiBhcHBlYXJzIGFzIFxcXCIwLjAuMFxcXCIsXFxuKyAgICAgICB3aGljaCBubyByZWxlYXNlZCBmaXJtd2FyZSByZXBvcnRzLCBzbyB2ZXJzaW9uLWNvbXBhcmluZyB0b29sc1xcbisgICAgICAgb2ZmZXIgYW55IGF2YWlsYWJsZSByZWxlYXNlIGFzIGFuIHVwZ3JhZGUuIFVzZSBgYGRldmxpbmsgZGV2XFxuKyAgICAgICBmbGFzaGBgIHRvIHRlbGwgYSByZWNvdmVyaW5nIHN3aXRjaCBmcm9tIGEgcmVhZHkgb25lLCBzZWUgYmVsb3c7XFxuKyAgICAgICBhIG1pc3NpbmcgdmVyc2lvbiBvbiBpdHMgb3duIGRvZXMgbm90IHNheSB3aHkuXFxuK1xcbitGbGFzaCB1cGRhdGVcXG4rPT09PT09PT09PT09XFxuK1xcbitUaGUgYGBteGw4NjJ4eGBgIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIGBgZGV2bGluayBkZXYgZmxhc2hgYC5cXG4rVGhlIHNpZ25lZCBmaXJtd2FyZSBpbWFnZSBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgc3dpdGNoIG92ZXIgdGhlIHNhbWVcXG4rTURJTyBidXMgd2hpY2ggaXMgYWxzbyB1c2VkIHRvIG1hbmFnZSB0aGUgc3dpdGNoLCB0aGVuIHZlcmlmaWVkIGFuZFxcbitpbnN0YWxsZWQgYnkgdGhlIE1DVWJvb3QgYm9vdGxvYWRlciBydW5uaW5nIG9uIHRoZSBzd2l0Y2guIEFsbCBwb3J0c1xcbitvZiB0aGUgc3dpdGNoIGFyZSBjbG9zZWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdXBkYXRlIGFuZCB0aGUgZHJpdmVyXFxuK3JlcHJvYmVzIHRoZSBzd2l0Y2ggYWZ0ZXIgaXQgaGFzIHJlYm9vdGVkIGludG8gdGhlIG5ldyBmaXJtd2FyZS4gQVxcbitjb21wbGV0ZSBmbGFzaCBhbmQgcmVwcm9iZSBjeWNsZSB0YWtlcyBhYm91dCBvbmUgbWludXRlLlxcbitcXG4rQSBzd2l0Y2ggc3R1Y2sgaW4gTUNVYm9vdCByZXNjdWUgbW9kZSwgZS5nLiBhZnRlciBhbiBpbnRlcnJ1cHRlZFxcbit1cGRhdGUsIGlzIHJlZ2lzdGVyZWQgd2l0aG91dCB1c2VyIHBvcnRzLiBJZiB0aGUgcHJldmlvdXMgZG93bmxvYWQgd2FzXFxuK2ludGVycnVwdGVkIG1pZC10cmFuc2ZlciB0aGUgbG9hZGVyIGlzIHdlZGdlZDsgdGhlIGRyaXZlciBkcmFpbnMgaXRcXG4rYmFjayB0byBhIGNsZWFuIHJlYWR5IHN0YXRlIGluIHRoZSBiYWNrZ3JvdW5kLCBvbmUgYnl0ZSBhdCBhIHRpbWUsXFxuK3doaWNoIHRha2VzIHRlbnMgb2YgbWludXRlcyBmb3IgYSBsYXJnZSBpbWFnZSBhbmQgaXMgcmVwb3J0ZWQgdGhyb3VnaFxcbit0aGUga2VybmVsIGxvZyBhcyBpdCBwcm9ncmVzc2VzLiBEdXJpbmcgdGhhdCByZWNvdmVyeSBgYGRldmxpbmsgZGV2XFxuK2ZsYXNoYGAgcmV0dXJucyBgYC1FQlVTWWBgIHdpdGggYW4gZXh0YWNrIG1lc3NhZ2Ugc2F5aW5nIHNvLCBhbmRcXG4rYGBkZXZsaW5rIGRldiBpbmZvYGAgcmVwb3J0cyBubyBmaXJtd2FyZSB2ZXJzaW9uLiBPbmNlIHRoZSBsb2FkZXIgaXNcXG4rcmVhZHkgdGhlIGZpcm13YXJlIHZlcnNpb24gYXBwZWFycyBhbmQgZmxhc2hpbmcgYSBmaXJtd2FyZSBpbWFnZVxcbit0aHJvdWdoIHRoZSByZWd1bGFyIHVwZGF0ZSBmbG93IHJlY292ZXJzIHRoZSBzd2l0Y2guXFxuK1xcbitJZiB0aGUgcmVjb3ZlcnkgZmFpbHMsIHRoZSBsb2FkZXIgbmVlZHMgYSBwb3dlciBjeWNsZTogYGBkZXZsaW5rIGRldlxcbitmbGFzaGBgIHRoZW4gcmV0dXJucyBgYC1FSU9gYCBhbmQgc2F5cyBzbyBpbiBpdHMgZXh0YWNrIG1lc3NhZ2UuIFRoZVxcbitkcml2ZXIgb25seSByZS1leGFtaW5lcyB0aGUgc3dpdGNoIHdoZW4gaXQgYmluZHMsIHNvIG9uIGEgYm9hcmQgd2hlcmVcXG4rdGhlIHN3aXRjaCBjYW4gYmUgcG93ZXIgY3ljbGVkIG9uIGl0cyBvd24sIHVuYmluZCBhbmQgcmViaW5kIHRoZSBkcml2ZXJcXG4rYWZ0ZXJ3YXJkcyB0byBoYXZlIHRoZSByZWNvdmVyZWQgc3dpdGNoIHJlY29nbmlzZWQuXFxuZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlNcXG5pbmRleCA5OTE0NjAwNTBkYTc0Li5lM2Y3ZGVkNTY5YmY3IDEwMDY0NFxcbi0tLSBhL01BSU5UQUlORVJTXFxuKysrIGIvTUFJTlRBSU5FUlNcXG5AQCAtMTYxMDYsNiArMTYxMDYsNyBAQCBNOlxcdERhbmllbCBHb2xsZSBcXHUwMDNjZGFuaWVsQG1ha3JvdG9waWEub3JnXFx1MDAzZVxcbiBMOlxcdG5ldGRldkB2Z2VyLmtlcm5lbC5vcmdcXG4gUzpcXHRNYWludGFpbmVkXFxuIEY6XFx0RG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9kc2EvbWF4bGluZWFyLG14bDg2Mnh4LnlhbWxcXG4rRjpcXHREb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3RcXG4gRjpcXHRkcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvXFxuIEY6XFx0bmV0L2RzYS90YWdfbXhsODYyeHguY1xcbiBcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Jhc2UuaCBiL2RyaXZlcnMvYmFzZS9iYXNlLmhcXG5pbmRleCBhNWI3YWJjMTBmZjAyLi42MjM0ZTM3ZGU3ZTk5IDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvYmFzZS9iYXNlLmhcXG4rKysgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oXFxuQEAgLTEwNiw2ICsxMDYsMTAgQEAgc3RydWN0IGRyaXZlcl9wcml2YXRlIHtcXG4gICogQGRlYWQ6IFRoaXMgZGV2aWNlIGlzIGN1cnJlbnRseSBlaXRoZXIgaW4gdGhlIHByb2Nlc3Mgb2Ygb3IgaGFzIGJlZW5cXG4gICpcXHQgIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLiBBbnkgYXN5bmNocm9ub3VzIGV2ZW50cyBzY2hlZHVsZWQgZm9yIHRoaXNcXG4gICpcXHQgIGRldmljZSBzaG91bGQgZXhpdCB3aXRob3V0IHRha2luZyBhbnkgYWN0aW9uLlxcbisgKiBAc2h1dGRvd25fZG9uZTogU2V0IG9uY2UgZGV2aWNlX3NodXRkb3duKCkgaGFzIHJlYWNoZWQgdGhpcyBkZXZpY2UsIHVuZGVyXFxuKyAqXFx0ICB0aGUgZGV2aWNlIGxvY2ssIGJlZm9yZSBhbnkgc2h1dGRvd24gY2FsbGJhY2sgcnVucy4gUmVhZCB1bmRlciB0aGVcXG4rICpcXHQgIGRldmljZSBsb2NrLiBBIGRlZmVycmVkIHJlLXByb2JlIHNjaGVkdWxlZCB3aXRoXFxuKyAqXFx0ICBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSgpIG11c3Qgbm90IGRldGFjaCB0aGUgZGV2aWNlIGFueW1vcmUuXFxuICAqXFxuICAqIE5vdGhpbmcgb3V0c2lkZSBvZiB0aGUgZHJpdmVyIGNvcmUgc2hvdWxkIGV2ZXIgdG91Y2ggdGhlc2UgZmllbGRzLlxcbiAgKi9cXG5AQCAtMTIwLDYgKzEyNCw3IEBAIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSB7XFxuIFxcdGNoYXIgKmRlZmVycmVkX3Byb2JlX3JlYXNvbjtcXG4gXFx0c3RydWN0IGRldmljZSAqZGV2aWNlO1xcbiBcXHR1OCBkZWFkOjE7XFxuK1xcdHU4IHNodXRkb3duX2RvbmU6MTtcXG4gfTtcXG4gI2RlZmluZSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQob2JqKVxcdFxcXFxcXG4gXFx0Y29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9wYXJlbnQpXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jXFxuaW5kZXggNGQwMjY2ODI5NDRmMi4uOGE3ZGJlNGU4MzYyYiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jXFxuKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuY1xcbkBAIC00OTA2LDYgKzQ5MDYsOSBAQCB2b2lkIGRldmljZV9zaHV0ZG93bih2b2lkKVxcbiBcXHRcXHRcXHRkZXZpY2VfbG9jayhwYXJlbnQpO1xcbiBcXHRcXHRkZXZpY2VfbG9jayhkZXYpO1xcbiBcXG4rXFx0XFx0aWYgKGRldi1cXHUwMDNlcClcXG4rXFx0XFx0XFx0ZGV2LVxcdTAwM2VwLVxcdTAwM2VzaHV0ZG93bl9kb25lID0gdHJ1ZTtcXG4rXFxuIFxcdFxcdC8qIERvbid0IGFsbG93IGFueSBtb3JlIHJ1bnRpbWUgc3VzcGVuZHMgKi9cXG4gXFx0XFx0cG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTtcXG4gXFx0XFx0cG1fcnVudGltZV9iYXJyaWVyKGRldik7XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmNcXG5pbmRleCA2MGMwMDUyMjM4NDRkLi5iYjhiMzRhY2RlMDBkIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jXFxuKysrIGIvZHJpdmVycy9iYXNlL2RkLmNcXG5AQCAtMTQzNiwzICsxNDM2LDg1IEBAIHZvaWQgZHJpdmVyX2RldGFjaChjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KVxcbiBcXHRcXHRwdXRfZGV2aWNlKGRldik7XFxuIFxcdH1cXG4gfVxcbitcXG4rc3RydWN0IGRldmljZV9yZXByb2JlIHtcXG4rXFx0c3RydWN0IGRlbGF5ZWRfd29yayB3b3JrO1xcbitcXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XFxuK1xcdGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7XFxuK307XFxuK1xcbitzdGF0aWMgdm9pZCBkZXZpY2VfcmVwcm9iZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4re1xcbitcXHRzdHJ1Y3QgZGV2aWNlX3JlcHJvYmUgKnJwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZXZpY2VfcmVwcm9iZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHdvcmsud29yayk7XFxuK1xcdHN0cnVjdCBkZXZpY2UgKmRldiA9IHJwLVxcdTAwM2VkZXY7XFxuK1xcdHN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGRldi1cXHUwMDNlcGFyZW50O1xcbitcXHRib29sIGRldGFjaGVkID0gZmFsc2U7XFxuK1xcbitcXHRfX2RldmljZV9kcml2ZXJfbG9jayhkZXYsIHBhcmVudCk7XFxuK1xcdC8qXFxuK1xcdCAqIHJwLVxcdTAwM2VkcnYgaXMgb25seSBldmVyIGNvbXBhcmVkLCBuZXZlciBkZXJlZmVyZW5jZWQ6IHRoZSBkcml2ZXIgaXRcXG4rXFx0ICogcG9pbnRzIHRvIG1heSBoYXZlIGJlZW4gdW5yZWdpc3RlcmVkIGFuZCBmcmVlZCBieSBub3cuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWRldi1cXHUwMDNlcC1cXHUwMDNlZGVhZCBcXHUwMDI2XFx1MDAyNiAhZGV2LVxcdTAwM2VwLVxcdTAwM2VzaHV0ZG93bl9kb25lIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBkZXYtXFx1MDAzZWRyaXZlciBcXHUwMDI2XFx1MDAyNiBkZXYtXFx1MDAzZWRyaXZlciA9PSBycC1cXHUwMDNlZHJ2KSB7XFxuK1xcdFxcdF9fZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldiwgcGFyZW50KTtcXG4rXFx0XFx0ZGV0YWNoZWQgPSB0cnVlO1xcbitcXHR9XFxuK1xcdF9fZGV2aWNlX2RyaXZlcl91bmxvY2soZGV2LCBwYXJlbnQpO1xcbitcXG4rXFx0aWYgKGRldGFjaGVkIFxcdTAwMjZcXHUwMDI2IGRldmljZV9hdHRhY2goZGV2KSBcXHUwMDNjIDApXFxuK1xcdFxcdGRldl9lcnIoZGV2LCBcXFwicmUtcHJvYmUgZmFpbGVkLCBkZXZpY2UgbGVmdCB1bmJvdW5kXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHB1dF9kZXZpY2UoZGV2KTtcXG4rXFx0a2ZyZWUocnApO1xcbit9XFxuK1xcbisvKipcXG4rICogZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUgLSBzY2hlZHVsZSBhIGRlZmVycmVkIGRldGFjaCBhbmQgcmUtcHJvYmVcXG4rICogQGRldjogZGV2aWNlIHRvIGRldGFjaCBhbmQgcmUtcHJvYmVcXG4rICogQGRlbGF5X21zOiBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSByZS1wcm9iZSBydW5zXFxuKyAqXFxuKyAqIFNjaGVkdWxlIGEgZGV0YWNoIGFuZCByZS1wcm9iZSBvZiBAZGV2IGFmdGVyIEBkZWxheV9tcyBtaWxsaXNlY29uZHMuXFxuKyAqIFRoZSByZS1wcm9iZSBpcyBza2lwcGVkIGlmLCBieSB0aGUgdGltZSB0aGUgc2NoZWR1bGVkIHdvcmsgcnVucywgdGhlXFxuKyAqIGRldmljZSBoYXMgYmVlbiByZW1vdmVkLCB0aGUgc3lzdGVtIHNodXRkb3duIHNlcXVlbmNlIGhhcyByZWFjaGVkIHRoZVxcbisgKiBkZXZpY2UsIG9yIEBkZXYgaXMgbm8gbG9uZ2VyIGJvdW5kIHRvIHRoZSBkcml2ZXIgdGhhdCB3YXMgYm91bmQgYXRcXG4rICogc2NoZWR1bGluZyB0aW1lLiBJbiBwYXJ0aWN1bGFyIGFuIGFkbWluaXN0cmF0aXZlIHVuYmluZCBpcyBuZXZlclxcbisgKiB1bmRvbmUgYnkgYSBzdGFsZSByZS1wcm9iZS5cXG4rICpcXG4rICogVGhlIHdvcmsgZnVuY3Rpb24gaXMgYnVpbHQtaW4gdGV4dCwgc28gdGhlIGJvdW5kIGRyaXZlciBtYXkgY2FsbCB0aGlzXFxuKyAqIGZyb20gaXRzIG93biBjb2RlIHdpdGhvdXQgaG9sZGluZyBhIG1vZHVsZSByZWZlcmVuY2UuIElmIHRoZSBkcml2ZXJcXG4rICogbW9kdWxlIGlzIHVubG9hZGVkIGJlZm9yZSB0aGUgd29yayBydW5zLCBkcml2ZXIgdW5yZWdpc3RyYXRpb24gdW5iaW5kc1xcbisgKiBAZGV2IGZpcnN0IGFuZCB0aGUgc2NoZWR1bGVkIHdvcmsgZG9lcyBub3RoaW5nLlxcbisgKlxcbisgKiBNdWx0aXBsZSBwZW5kaW5nIHJlLXByb2JlcyBmb3IgdGhlIHNhbWUgZGV2aWNlIGFyZSBpbmRpdmlkdWFsbHkgc2FmZTtcXG4rICogYSBjYWxsZXIgdGhhdCB3YW50cyBhdCBtb3N0IG9uZSBwZW5kaW5nIHJlLXByb2JlIG11c3QgZ2F0ZSBzY2hlZHVsaW5nXFxuKyAqIGl0c2VsZi5cXG4rICpcXG4rICogTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0LlxcbisgKlxcbisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgQGRldiBpcyBub3QgYSByZWdpc3RlcmVkIGRldmljZVxcbisgKiBib3VuZCB0byBhIGRyaXZlciwgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXFxuKyAqL1xcbitpbnQgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpXFxuK3tcXG4rXFx0c3RydWN0IGRldmljZV9yZXByb2JlICpycDtcXG4rXFxuK1xcdGlmICghZGV2LVxcdTAwM2VidXMgfHwgIWRldi1cXHUwMDNlcCB8fCAhZGV2aWNlX2lzX3JlZ2lzdGVyZWQoZGV2KSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdGlmICghZGV2LVxcdTAwM2Vkcml2ZXIpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0cnAgPSBremFsbG9jX29iaigqcnApO1xcbitcXHRpZiAoIXJwKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdHJwLVxcdTAwM2VkZXYgPSBnZXRfZGV2aWNlKGRldik7XFxuK1xcdHJwLVxcdTAwM2VkcnYgPSBSRUFEX09OQ0UoZGV2LVxcdTAwM2Vkcml2ZXIpO1xcbitcXHRJTklUX0RFTEFZRURfV09SSyhcXHUwMDI2cnAtXFx1MDAzZXdvcmssIGRldmljZV9yZXByb2JlX3dvcmtfZm4pO1xcbitcXHRxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX2RmbF93cSwgXFx1MDAyNnJwLVxcdTAwM2V3b3JrLFxcbitcXHRcXHRcXHQgICBtc2Vjc190b19qaWZmaWVzKGRlbGF5X21zKSk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSk7XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZVxcbmluZGV4IGE3YmUwZTY2NjlkZmEuLmJjY2FjMGQwZjcwM2YgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L01ha2VmaWxlXFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L01ha2VmaWxlXFxuQEAgLTEsMyArMSwzIEBAXFxuICMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gb2JqLSQoQ09ORklHX05FVF9EU0FfTVhMODYyKSArPSBteGw4NjJ4eF9kc2Eub1xcbi1teGw4NjJ4eF9kc2EteSA6PSBteGw4NjJ4eC5vIG14bDg2Mnh4LWhvc3QubyBteGw4NjJ4eC1waHlsaW5rLm9cXG4rbXhsODYyeHhfZHNhLXkgOj0gbXhsODYyeHgubyBteGw4NjJ4eC1ob3N0Lm8gbXhsODYyeHgtcGh5bGluay5vIG14bDg2Mnh4LWZ3Lm9cXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oXFxuaW5kZXggYTE4MGE1ZGVjZmZjMC4uNmY3NzE4OTU5ODRjYiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtYXBpLmhcXG4rKysgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtYXBpLmhcXG5AQCAtMTIyNCw2ICsxMjI0LDE2IEBAIHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB7XFxuIFxcdF9fbGUzMiBpdl9idWlsZF9udW07XFxuIH0gX19wYWNrZWQ7XFxuIFxcbisvKipcXG4rICogc3RydWN0IG14bDg2Mnh4X3N5c19yZWdfcncgLSBTeXN0ZW0gcmVnaXN0ZXIgcmVhZC93cml0ZVxcbisgKiBAYWRkcjogMzItYml0IHJlZ2lzdGVyIGFkZHJlc3NcXG4rICogQHZhbDogcmVnaXN0ZXIgdmFsdWVcXG4rICovXFxuK3N0cnVjdCBteGw4NjJ4eF9zeXNfcmVnX3J3IHtcXG4rXFx0X19sZTMyIGFkZHI7XFxuK1xcdF9fbGUzMiB2YWw7XFxuK30gX19wYWNrZWQ7XFxuK1xcbiAvKipcXG4gICogZW51bSBteGw4NjJ4eF9wb3J0X3R5cGUgLSBQb3J0IFR5cGVcXG4gICogQE1YTDg2MlhYX0xPR0lDQUxfUE9SVDogTG9naWNhbCBQb3J0XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1jbWQuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1jbWQuaFxcbmluZGV4IGM4N2E5NTVjMTNjNDguLmE4NjU0MjVhYTYxZTEgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oXFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWNtZC5oXFxuQEAgLTcwLDcgKzcwLDkgQEBcXG4gI2RlZmluZSBJTlRfR1BIWV9SRUFEXFx0XFx0XFx0KEdQWV9HUFkyWFhfTUFHSUMgKyAweDEpXFxuICNkZWZpbmUgSU5UX0dQSFlfV1JJVEVcXHRcXHRcXHQoR1BZX0dQWTJYWF9NQUdJQyArIDB4MilcXG4gXFxuKyNkZWZpbmUgU1lTX01JU0NfRldfVVBEQVRFXFx0XFx0KFNZU19NSVNDX01BR0lDICsgMHgxKVxcbiAjZGVmaW5lIFNZU19NSVNDX0ZXX1ZFUlNJT05cXHRcXHQoU1lTX01JU0NfTUFHSUMgKyAweDIpXFxuKyNkZWZpbmUgU1lTX01JU0NfUkVHX1JEXFx0XFx0XFx0KFNZU19NSVNDX01BR0lDICsgMHg4KVxcbiBcXG4gI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19DT05GSUdcXHQoTVhMODYyWFhfWFBDU19NQUdJQyArIDB4MSlcXG4gI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19HRVRfU1RBVEVcXHQoTVhMODYyWFhfWFBDU19NQUdJQyArIDB4MilcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjZlMDM3ZDk1NjQwYlxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuY1xcbkBAIC0wLDAgKzEsMTA1NCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxcbisvKlxcbisgKiBGaXJtd2FyZSBmbGFzaCBhbmQgZGV2bGluayBzdXBwb3J0IGZvciBNYXhMaW5lYXIgTXhMODYyeHhcXG4rICpcXG4rICogQ29weXJpZ2h0IChDKSAyMDI1IERhbmllbCBHb2xsZSBcXHUwMDNjZGFuaWVsQG1ha3JvdG9waWEub3JnXFx1MDAzZVxcbisgKlxcbisgKiBTQiBQREkgLSBmaXJtd2FyZSBkb3dubG9hZCBpbnRlcmZhY2Ugb3ZlciBjbGF1c2UtMjIgU01ESU9cXG4rICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuKyAqXFxuKyAqIFRoZSBNeEw4NjJ4eCBNQ1Vib290IGxvYWRlciBhY2NlcHRzIGEgZmlybXdhcmUgaW1hZ2UgdGhyb3VnaCBmb3VyIFxcXCJTQiBQRElcXFwiXFxuKyAqIHJlZ2lzdGVycyBpbiB0aGUgc3dpdGNoIFNNRElPIHJlZ2lzdGVyIHNwYWNlLiBJdCBydW5zIHdoZW5ldmVyIG5vIFdTUFxcbisgKiBmaXJtd2FyZSBpcyBhY3RpdmU6IHRoZSBub3JtYWwgZmlybXdhcmUgdXBkYXRlIGVudGVycyBpdCBkZWxpYmVyYXRlbHkgLSB0aGVcXG4rICogU1lTX01JU0NfRldfVVBEQVRFIEFQSSBjb21tYW5kIHNldHMgYSBzdGlja3kgcmVzY3VlIGJpdCBhbmQgcmVib290cyBpbnRvXFxuKyAqIE1DVWJvb3QgLSBhbmQgdGhlIGxvYWRlciBhbHNvIHN0YXlzIGhlcmUgd2hlbiB0aGUgc3RvcmVkIFdTUCBmaXJtd2FyZSBmYWlsc1xcbisgKiBpdHMgYm9vdC10aW1lIGludGVncml0eSBjaGVjay4gVGhpcyBkcml2ZXIgZHJpdmVzIHRoZSBsb2FkZXIncyAweGM1NWNcXG4rICogXFxcImNvbnNvbGVcXFwiIGRvd25sb2FkIHBhdGguXFxuKyAqXFxuKyAqIFNNRElPIHJlZ2lzdGVyIGFjY2VzcyAobXhsODYyeHhfc21kaW9fcmVhZC93cml0ZSk6XFxuKyAqICAgTUlJIHJlZyAweDFmIDo9IChcXHUwMDNjc2JfcGRpX3JlZ1xcdTAwM2UgXFx1MDAyNiAweGZmZjApICAgOyBwYWdlIGxhdGNoXFxuKyAqICAgTUlJIHJlZyAoXFx1MDAzY3NiX3BkaV9yZWdcXHUwMDNlIFxcdTAwMjYgMHgwMDBmKSA6PSAvID1cXHUwMDNlIFxcdTAwM2N1MTYgZGF0YVxcdTAwM2VcXG4rICogc28gQ1RSTC9BRERSL0RBVEEvU1RBVCAoMHhlMTAwLi4weGUxMDMpIGFyZSBNSUkgcmVncyAwLzEvMi8zIG9mIHBhZ2VcXG4rICogMHhlMTAwLCBub3QgYWxsIHJlZyAweDAwLlxcbisgKlxcbisgKiBTQiBQREkgcmVnaXN0ZXJzIChob3N0IG5hbWUvYWRkciAgLVxcdTAwM2UgIE1DVSBtYWlsYm94KTpcXG4rICogICBDVFJMIDB4ZTEwMCAtXFx1MDAzZSAweGMwOTM4NDAwICAgbW9kZTogUlNUPTB4MDAgIFJEPTB4MDEgIFdSPTB4MDJcXG4rICogICBBRERSIDB4ZTEwMSAtXFx1MDAzZSAweGMwOTM4NDA0ICAgU0IgdGFyZ2V0IHdvcmQgYWRkcmVzcyAoU0IxIGJhbmsgPSAweDc4MDApXFxuKyAqICAgREFUQSAweGUxMDIgLVxcdTAwM2UgMHhjMDkzODQwOCAgIDE2LWJpdCBkYXRhIC8gcmVwbHkgd29yZFxcbisgKiAgIFNUQVQgMHhlMTAzIC1cXHUwMDNlIDB4YzA5Mzg0MGMgICBoYW5kc2hha2U6IGEgbWFnaWMgKGJlbG93KSBvciBhIGJ5dGUgY291bnRcXG4rICpcXG4rICogU1RBVCBtYWdpY3M6XFxuKyAqICAgUkVBRFkgIDB4YzU1YyAgIGxvYWRlciBpZGxlIGluIHRoZSBjb25zb2xlIGxvb3AgICAgICAgICh0aGlzIGRyaXZlcilcXG4rICogICBETF9SRFkgMHhjMzNjICAgbG9hZGVyIGlkbGUgaW4gdGhlIGZsYXNobGVzcyBsb29wXFxuKyAqICAgU1RBUlQgIDB4ZjQ4ZiAgIGhvc3QgICAtXFx1MDAzZSBiZWdpbiBkb3dubG9hZCBzZXNzaW9uXFxuKyAqICAgQUNLICAgIDB4ZjQ5MCAgIGxvYWRlciAtXFx1MDAzZSBTVEFSVCBhY2tub3dsZWRnZWQgKFNUQVJUICsgMSlcXG4rICogICBFTkQgICAgMHgzY2MzICAgaG9zdCAgIC1cXHUwMDNlIGZpbmFsaXNlIG5vdyAob3B0aW9uYWwsIHNlZSBiZWxvdylcXG4rICogICBSRFJFRyAgMHhlMmMwICAgaG9zdCAgIC1cXHUwMDNlIHJlZ2lzdGVyLXJlYWQgY29tbWFuZCAofCBpbmRleCksIHNlZSBiZWxvd1xcbisgKlxcbisgKiBDb25zb2xlIGZsYXNoIHBhdGggKFNUQVQ9MHhjNTVjKSAtIG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKCk6XFxuKyAqXFxuKyAqICAgaG9zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyXFxuKyAqICAgLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tXFxuKyAqICAgcmVzZXQgKENUUkw9QUREUj1EQVRBPTApXFxuKyAqICAgcmVhZCBTVEFUIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMHhjNTVjICAgKFJFQURZLCBpZGxlKVxcbisgKiAgIFNUQVQgOj0gU1RBUlQoMHhmNDhmKSAgLS0tLS0tLS0tLS0tLS1cXHUwMDNlXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBcXHUwMDNjLS0tLS0tLS0tLS0tLS0gU1RBVCA9IDB4ZjQ5MCAoQUNLKVxcbisgKiAgIENUUkwgOj0gV1JcXG4rICogICBEQVRBIDo9IGhkclswLi45XSAgKDIwLWJ5dGUgaGVhZGVyOiB0eXBlLHNpemUxLGNyYzEsc2l6ZTIsY3JjMilcXG4rICogICByZXNldDsgU1RBVCA6PSAyMCAoaGVhZGVyIGxlbikgIC0tLS0tXFx1MDAzZSBwYXJzZSBoZHI7IHJfcmVtYWluPXNpemUxK3NpemUyO1xcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSQVNFIHRhcmdldCByZWdpb24ocylcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgIFxcdTAwM2MtLS0tLS0tLS0tLS0tLSBTVEFUPTIxIChsZW4rMSksIHRoZW4gU1RBVD0wXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVyYXNlZClcXG4rICogICAtLSBwYXlsb2FkLCBzdHJlYW1lZCBpbiBzbGljZXM6IC0tXFxuKyAqICAgQ1RSTCA6PSBXUlxcbisgKiAgIERBVEEgOj0gd29yZCB4IE4gLi4uXFxuKyAqICAgICBhdCB3b3JkIDE2Mzg0OiBDVFJMOj1SU1Q7IEFERFI6PTB4NzgwMDsgQ1RSTDo9V1IgIChoYWxmLWJhbmsgLVxcdTAwM2UgU0IxKVxcbisgKiAgICAgYXQgd29yZCAzMjc2MDogZmx1c2ggc2xpY2U6XFxuKyAqICAgICAgICByZXNldDsgU1RBVCA6PSBcXHUwMDNjYnl0ZXNfdGhpc19zbGljZVxcdTAwM2UgLS0tXFx1MDAzZSByX3JlbWFpbiAtPSBieXRlczsgcHJvZ3JhbVxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXFx1MDAzYy0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBVD0wICAocmVhZHkgZm9yIG5leHQgc2xpY2UpXFxuKyAqICAgLi4uIHJlcGVhdCB1bnRpbCB0aGUgd2hvbGUgcGF5bG9hZCBpcyBzZW50IC4uLlxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXFx1MDAzYy0tLS0tLS0tLS0tLS0tLS0tLS0gU1RBVD0wICBpbWFnZSB2ZXJpZmllZFxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNUQVQ9MTogaW1hZ2UgcmVqZWN0ZWQpXFxuKyAqICAgU1RBVCA6PSBFTkQoMHgzY2MzKSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFx1MDAzZSBmaW5hbGlzZSBhbmQgYm9vdFxcbisgKlxcbisgKiBUaGUgcl9yZW1haW4gPT0gMCBydWxlIChjcml0aWNhbCk6XFxuKyAqICAgRXZlcnkgaG9zdCBTVEFUIHdyaXRlIGluIHRoZSBwYXlsb2FkIHBoYXNlIGlzIGEgYnl0ZSBjb3VudDsgdGhlIGxvYWRlclxcbisgKiAgIGRvZXMgcl9yZW1haW4gLT0gY291bnQgYW5kIHN0YXlzIGluIHRoZSByZWNlaXZlIGxvb3Agd2hpbGUgcl9yZW1haW4gIT0gMC5cXG4rICogICBJdCBsZWF2ZXMgdGhlIGxvb3AgT05MWSB3aGVuIHJfcmVtYWluIGhpdHMgRVhBQ1RMWSAwLCBhbmQgYSBjb3VudCBsYXJnZXJcXG4rICogICB0aGFuIHJfcmVtYWluIHVuZGVyZmxvd3MgdGhlIDMyLWJpdCBjb3VudGVyIGFuZCB3ZWRnZXMgdGhlIGxvYWRlciB1bnRpbCBhXFxuKyAqICAgcG93ZXIgY3ljbGUuIEhhdmluZyBsZWZ0IGl0LCB0aGUgbG9hZGVyIHZlcmlmaWVzIHRoZSBpbWFnZSwgcHVibGlzaGVzIHRoZVxcbisgKiAgIHZlcmRpY3QgaW4gU1RBVCAoMCBnb29kLCAxIHJlamVjdGVkKSBhbmQgd2FpdHMgMiBzIGZvciBFTkQgYmVmb3JlXFxuKyAqICAgZmluYWxpc2luZyByZWdhcmRsZXNzIC0tIGNsZWFyaW5nIGl0cyByZXNjdWUtZW5hYmxlIGJpdCBzbyBib290X2dvIGJvb3RzXFxuKyAqICAgdGhlIG5ldyBpbWFnZSAtLSBzbyBFTkQgb25seSBzYXZlcyB0aGF0IHdhaXQuIEhlbmNlOlxcbisgKiAgICAgLSBuZXZlciBzZW5kIGEgc2xpY2UvY2h1bmsgY291bnQgbGFyZ2VyIHRoYW4gd2hhdCBpcyBvdXRzdGFuZGluZztcXG4rICogICAgIC0gYSBTVEFUIHdyaXRlIGlzIGEgY29tbWFuZCBvbmx5IG9uY2UgdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgbG9vcDtcXG4rICogICAgIC0gdGhlIGxvYWRlciBsZWF2ZXMgdGhlIGNvdW50IGluIFNUQVQgd2hpbGUgaXQgcHJvZ3JhbXMgdGhlIGNodW5rLCBzb1xcbisgKiAgICAgICBhIGxpbmdlcmluZyBjb3VudCBkb2VzIG5vdCBkaXN0aW5ndWlzaCBcXFwiYnVzeVxcXCIgZnJvbSBcXFwidmVyZGljdFxcXCI7XFxuKyAqICAgICAtIGludGVycnVwdGVkLWRvd25sb2FkIHJlY292ZXJ5IGZlZWRzIDEgYnl0ZSBhdCBhIHRpbWUgKHNlZSBiZWxvdykuXFxuKyAqXFxuKyAqIEludGVycnVwdGVkLWZsYXNoIHJlY292ZXJ5IChteGw4NjJ4eF9yZXNjdWVfZHJhaW4pOlxcbisgKiAgIEEgaG9zdCB0aGF0IGRpZXMgbWlkLXBheWxvYWQgbGVhdmVzIHRoZSBsb2FkZXIgaW4gdGhlIHJlY2VpdmUgbG9vcCBob2xkaW5nXFxuKyAqICAgU1RBVD0wLiBGZWVkIHNpbmdsZSAxLWJ5dGUgY2h1bmtzIChvbmUgREFUQSB3b3JkICsgU1RBVD0xKSB1bnRpbCByX3JlbWFpblxcbisgKiAgIHJlYWNoZXMgMDsgdGhlIGxvYWRlciB0aGVuIHZlcmlmaWVzIHRoZSAobm93IGNvcnJ1cHQpIGltYWdlLCBwdWJsaXNoZXMgaXRzXFxuKyAqICAgdmVyZGljdCBhbmQgY29tZXMgYmFjayB0byBSRUFEWSBieSBpdHNlbGYuIEVORCBpcyBuZXZlciBzZW50IGhlcmU6IHdoaWxlXFxuKyAqICAgcl9yZW1haW4gaXMgbm9uLXplcm8gaXQgd291bGQgYmUgY29uc3VtZWQgYXMgYSAxNTU1NS1ieXRlIGNvdW50LCBhbmQgYVxcbisgKiAgIGxpbmdlcmluZyBTVEFUPTEgY2Fubm90IGJlIHRvbGQgZnJvbSBhIGNodW5rIHN0aWxsIGJlaW5nIHByb2dyYW1tZWQuXFxuKyAqXFxuKyAqIFJlZ2lzdGVyLXJlYWQgY2hhbGxlbmdlIChub24tZGVzdHJ1Y3RpdmUgbGl2ZW5lc3MgcHJvb2YpOlxcbisgKiAgIERBVEEgOj0gMHg3YzIzIChtYXJrZXIpOyBTVEFUIDo9IDB4ZTJjMHxpZHhcXG4rICogICAgIC1cXHUwMDNlIGxvYWRlciByZXR1cm5zIGEgcnVudGltZSB3b3JkIGluIERBVEEgYW5kIHJlLWFybXMgU1RBVD0weGM1NWMuXFxuKyAqICAgVGhlIHJlcGx5IHNvdXJjZSBpcyBsb2FkZXIgQlNTLCBub3QgYSBjaGlwIGlkOyB1c2VkIG9ubHkgdG8gcHJvdmUgYSBsaXZlXFxuKyAqICAgbWFpbGJveCBpbiBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QoKS5cXG4rICpcXG4rICogVGhlIG90aGVyIFNUQVQgcmVhZHkgbWFnaWMsIDB4YzMzYywgbWFya3MgdGhlIGxvYWRlcidzIGZsYXNobGVzc1xcbisgKiBjaGlwLXRvLWNoaXAgZG93bmxvYWQgbW9kZSAoTXhMODYyODFTIDE2LXBvcnQgdGllcik7IHRoaXMgZHJpdmVyIGRvZXMgbm90XFxuKyAqIHVzZSBpdC5cXG4rICpcXG4rICogUmVzY3VlIGxpZmVjeWNsZSAoZGV2bGluayk6IHByb2JlIHJ1bnMgbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KCk7IGFcXG4rICogd2VkZ2VkIGxvYWRlciBpcyBkcmFpbmVkIGJhY2sgdG8gUkVBRFkgYnkgYSBiYWNrZ3JvdW5kIHNlbGYtaGVhbFxcbisgKiAocmVzY3VlX2hlYWxfd29yayksIHNvIHRoZSBsb25nIHJlY292ZXJ5IG5ldmVyIGhvbGRzIHRoZSBkZXZsaW5rIGxvY2suXFxuKyAqIGRldmxpbmsgZGV2IGluZm8gZXhwb3NlcyB0aGUgZncgdmVyc2lvbiAodGhlIFxcXCJmbGFzaGFibGVcXFwiIHNpZ25hbCkgb25seSBvbmNlIGF0XFxuKyAqIFJFQURZOyBmbGFzaF91cGRhdGUgcmV0dXJucyAtRUJVU1kgdW50aWwgdGhlbiwgYW5kIHJlcHJvYmVzIHRvIFdTUCBmaXJtd2FyZVxcbisgKiBvbiBzdWNjZXNzLlxcbisgKlxcbisgKiBOb3RlczpcXG4rICogICAtIENoaXAgaWQvcmV2aXNpb24gKDB4YzBkMjg4ODQvODgpIGFyZSBOT1QgcmVhY2hhYmxlIG9uIHRoaXMgY2hhbm5lbDsgdGhleVxcbisgKiAgICAgbmVlZCB0aGUgY2xhdXNlLTQ1IE1NRCBmaXJtd2FyZSBtYWlsYm94LCB3aGljaCBpcyBkZWFkIHVuZGVyIE1DVWJvb3QuXFxuKyAqICAgICBSZXNjdWUgaWRlbnRpdHkgaXMgYnkgU0IgUERJIGJlaGF2aW91ciBvbmx5IChteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QpLlxcbisgKiAgIC0gVGhlIFNNRElPIFBIWSBhZGRyZXNzIGNvbWVzIGZyb20gdGhlIGRldmljZSB0cmVlOyB0aGUgMHhlMXh4IHJlZ2lzdGVyXFxuKyAqICAgICBvZmZzZXRzIGFyZSB0aGUgT1RQIHJlc2V0IGRlZmF1bHRzIGFuZCB0aGUgb25seSBsYXlvdXQgc3VwcG9ydGVkIGhlcmUuXFxuKyAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NyYzMyLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9kZWxheS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZGV2aWNlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pb3BvbGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25ldGRldmljZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvb3ZlcmZsb3cuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3J0bmV0bGluay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NuZXQvZHNhLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NuZXQvc3dpdGNoZGV2LmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwibXhsODYyeHguaFxcXCJcXG4rI2luY2x1ZGUgXFxcIm14bDg2Mnh4LWFwaS5oXFxcIlxcbisjaW5jbHVkZSBcXFwibXhsODYyeHgtY21kLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJteGw4NjJ4eC1mdy5oXFxcIlxcbisjaW5jbHVkZSBcXFwibXhsODYyeHgtaG9zdC5oXFxcIlxcbitcXG4rLyogU0IgUERJIHJlZ2lzdGVycyAoY2xhdXNlLTIyIFNNRElPIGFkZHJlc3Mgc3BhY2UpICovXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxcXHRcXHQweGUxMDBcXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfQUREUlxcdFxcdDB4ZTEwMVxcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9EQVRBXFx0XFx0MHhlMTAyXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1NUQVRcXHRcXHQweGUxMDNcXG4rXFxuKy8qIFNCIFBESSBDVFJMIG1vZGVzICovXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxfUlNUXFx0MHgwMFxcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSXFx0XFx0MHgwMlxcbitcXG4rLyogU0IgUERJIGhhbmRzaGFrZSBtYWdpYyAocHVibGlzaGVkL2NvbnN1bWVkIHZpYSBTVEFUKSAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9SRUFEWVxcdFxcdDB4YzU1Y1xcdC8qIGxvYWRlciBpZGxlLCBjb25zb2xlIGxvb3AgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfRExfUkVBRFlcXHQweGMzM2NcXHQvKiBsb2FkZXIgaWRsZSwgZmxhc2hsZXNzIGxvb3AgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfU1RBUlRcXHRcXHQweGY0OGZcXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfRU5EXFx0XFx0MHgzY2MzXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1JEUkVHXFx0XFx0MHhlMmMwXFx0LyogcmVnaXN0ZXItcmVhZCBjbWQgKHwgaW5kZXgpICovXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1JEUkVHX01BUktcXHQweDdjMjNcXHQvKiBtYXJrZXIgcGxhY2VkIGluIERBVEEgZm9yIFJEUkVHICovXFxuK1xcbisvKiBCZWhhdmlvdXJhbCBwcmVzZW5jZSBwcm9iZTogdHdvIGRpc3RpbmN0IDE2LWJpdCBsYXRjaGVzIG9uIEFERFIvREFUQS4gKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQVxcdFxcdDB4NWE1YVxcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9QUk9CRV9EXFx0XFx0MHhhNWE1XFxuK1xcbisvKiBJbWFnZSB2ZXJpZmljYXRpb24gdmVyZGljdCBwdWJsaXNoZWQgaW4gU1RBVCBvbmNlIHRoZSByZWNlaXZlIGxvb3AgZW5kcyAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9WRVJJRllfT0tcXHQwXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1ZFUklGWV9CQURcXHQxXFxuK1xcbisvKiBGaXJtd2FyZSB0cmFuc2ZlciBnZW9tZXRyeSAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0hEUl9TSVpFXFx0XFx0MjBcXG4rI2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX0hBTEZcXHRcXHQxNjM4NFxcdC8qIHdvcmRzIHBlciBoYWxmLWJhbmsgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX1NMSUNFXFx0XFx0MzI3NjBcXHQvKiB3b3JkcyBwZXIgZnVsbCBzbGljZSAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX1NCMV9BRERSXFx0XFx0MHg3ODAwXFx0LyogU0IxIHdvcmQgYWRkcmVzcyAqL1xcbitcXG4rLyogVGltZW91dHMgKGdlbmVyb3VzIHVwcGVyIGJvdW5kcykgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9GV19SRUFEWV9USU1FT1VUX01TXFx0MzAwMFxcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TXFx0NTAwMFxcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0VSQVNFX1RJTUVPVVRfTVNcXHQzMDAwMDBcXG4rI2RlZmluZSBNWEw4NjJYWF9GV19XUklURV9USU1FT1VUX01TXFx0NjAwMDBcXG4rI2RlZmluZSBNWEw4NjJYWF9GV19SRUJPT1RfREVMQVlfTVNcXHQ1MDAwXFxuKyNkZWZpbmUgTVhMODYyWFhfRldfUkVQUk9CRV9ERUxBWV9NU1xcdDUwMFxcbisvKiBPbmUgbG9hZGVyIG1haWxib3ggc3RlcDogcHJvZ3JhbSBhIDEtYnl0ZSBjaHVuayBvciBzZXJ2aWNlIGEgY29tbWFuZCAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TXFx0XFx0MjAwMFxcbisvKiBDb3ZlcnMgdGhlIGxvYWRlcidzIEVORCB3YWl0LCB2ZXJpZmljYXRpb24gYW5kIHRoZSByZXNldCBpbnRvIFJFQURZICovXFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1ZFUklGWV9NU1xcdDE1MDAwXFxuK1xcbitzdGF0aWMgaW50IG14bDg2Mnh4X3NiX3BkaV9yZXNldChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsXFxuK1xcdFxcdFxcdFxcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsXFxuK1xcdFxcdFxcdFxcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0dXJuIG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLFxcbitcXHRcXHRcXHRcXHQgICAgTVhMODYyWFhfU0JfUERJX0NUUkxfUlNUKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MTYgZXhwZWN0ZWQsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0X21zKVxcbit7XFxuK1xcdGludCByZXQsIHZhbDtcXG4rXFxuK1xcdHJldCA9IHJlYWRfcG9sbF90aW1lb3V0KG14bDg2Mnh4X3NtZGlvX3JlYWQsIHZhbCxcXG4rXFx0XFx0XFx0XFx0dmFsIFxcdTAwM2MgMCB8fCAodTE2KXZhbCA9PSBleHBlY3RlZCxcXG4rXFx0XFx0XFx0XFx0MTAwMDAsIHRpbWVvdXRfbXMgKiAxMDAwLCBmYWxzZSxcXG4rXFx0XFx0XFx0XFx0cHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQpO1xcbitcXHRpZiAodmFsIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIHZhbDtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2Uoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1MzIgZGF0YV93cml0dGVuKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsIGRhdGFfd3JpdHRlbik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0dXJuIG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgMCxcXG4rXFx0XFx0XFx0XFx0XFx0IE1YTDg2MlhYX0ZXX1dSSVRFX1RJTUVPVVRfTVMpO1xcbit9XFxuK1xcbisvKiBGbHVzaCB0aGUgbGFzdCBzbGljZSwgd2hpY2ggZW5kcyB0aGUgcmVjZWl2ZSBsb29wOiB0aGUgbG9hZGVyIHZlcmlmaWVzIHRoZVxcbisgKiBpbWFnZSBhbmQgcmVwbGFjZXMgdGhlIGNvdW50IGluIFNUQVQgd2l0aCBpdHMgdmVyZGljdCwgc28gd2FpdCBmb3IgdGhlIGNvdW50XFxuKyAqIHRvIGdvIHJhdGhlciB0aGFuIGZvciBhIGZpeGVkIHZhbHVlLlxcbisgKi9cXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfbGFzdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcXG4rXFx0XFx0XFx0XFx0ICAgICAgdTMyIGRhdGFfd3JpdHRlbilcXG4re1xcbitcXHRpbnQgcmV0LCB2YWw7XFxuK1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsIGRhdGFfd3JpdHRlbik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gcmVhZF9wb2xsX3RpbWVvdXQobXhsODYyeHhfc21kaW9fcmVhZCwgdmFsLFxcbitcXHRcXHRcXHRcXHR2YWwgXFx1MDAzYyAwIHx8ICh1MTYpdmFsICE9ICh1MTYpZGF0YV93cml0dGVuLFxcbitcXHRcXHRcXHRcXHQxMDAwMCwgKE1YTDg2MlhYX0ZXX1dSSVRFX1RJTUVPVVRfTVMgK1xcbitcXHRcXHRcXHRcXHRcXHRNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TKSAqIDEwMDAsXFxuK1xcdFxcdFxcdFxcdGZhbHNlLCBwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XFxuK1xcdGlmICh2YWwgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gdmFsO1xcbitcXG4rXFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1ZFUklGWV9PSylcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHQvKiBBIGZpbmFsIGNvdW50IG9mIDEgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgcmVqZWN0IHZlcmRpY3QsIHNvXFxuK1xcdCAqIGEgdGltZW91dCBzdGlsbCBob2xkaW5nIGl0IGxhbmRzIGhlcmUgdG9vLlxcbitcXHQgKi9cXG4rXFx0aWYgKCh1MTYpdmFsID09IE1YTDg2MlhYX1NCX1BESV9WRVJJRllfQkFEKSB7XFxuK1xcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFxcImZsYXNoOiBsb2FkZXIgcmVqZWN0ZWQgdGhlIGltYWdlXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIC1FQkFETVNHO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gcmV0ID8gcmV0IDogLUVQUk9UTztcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgbXhsODYyeHhfZmxhc2hfbm90aWZ5KHN0cnVjdCBkZXZsaW5rICpkbCwgY29uc3QgY2hhciAqc3RhdHVzLFxcbitcXHRcXHRcXHRcXHQgIHUzMiBkb25lLCB1MzIgdG90YWwpXFxuK3tcXG4rXFx0ZGV2bGlua19mbGFzaF91cGRhdGVfc3RhdHVzX25vdGlmeShkbCwgc3RhdHVzLCBOVUxMLCBkb25lLCB0b3RhbCk7XFxuK31cXG4rXFxuKy8qIEJ5dGUtY291bnQgb2YgZWFjaCBjaHVuayBmZWQgdG8gdGhlIGxvYWRlciBkdXJpbmcgZHJhaW4uIEl0IE1VU1QgYmUgMTogdGhlXFxuKyAqIGxvYWRlciBvbmx5IGxldHMgdXMgb2JzZXJ2ZSBcXFwiY291bnRlciA9PSAwXFxcIiwgbmV2ZXIgXFxcImNvdW50ZXIgXFx1MDAzYyBzdGVwXFxcIiwgc28gYW55XFxuKyAqIHN0ZXAgXFx1MDAzZSAxIGNhbiBzdWJ0cmFjdCBwYXN0IHplcm8sIHVuZGVyZmxvdyB0aGUgMzItYml0IGNvdW50ZXIgYW5kIHdlZGdlIHRoZVxcbisgKiBsb2FkZXIgZm9yIH4yXjMyIG1vcmUgYnl0ZXMgKGEgc3RhdGUgb25seSBhIHBvd2VyIGN5Y2xlIGNsZWFycykuIFN0ZXBwaW5nIGJ5XFxuKyAqIDEgd2Fsa3MgdGhlIGNvdW50ZXIgdGhyb3VnaCBldmVyeSB2YWx1ZSBhbmQgaXMgZ3VhcmFudGVlZCB0byBsYW5kIG9uIHplcm9cXG4rICogd2hhdGV2ZXIgaXRzIChwb3NzaWJseSBvZGQpIHN0YXJ0LiBBIDEtYnl0ZSBjaHVuayBpcyBhIHBhdGggdGhlIGxvYWRlclxcbisgKiBhbHJlYWR5IGhhbmRsZXM6IHRoZSBub3JtYWwgdHJhbnNmZXIgZW5kcyB3aXRoIGEgc2luZ2xlIHRyYWlsaW5nIGJ5dGUgZm9yXFxuKyAqIG9kZC1zaXplZCBpbWFnZXMgKHNlZSBTdGVwIDYpLlxcbisgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFU1xcdDFcXG4rXFxuKy8qIExvZyB0aGUgZHJhaW4ncyBwcm9ncmVzcyBldmVyeSBzbyBtYW55IGJ5dGVzOyBpdCBjYW4gcnVuIGZvciBhIGxvbmcgdGltZSAqL1xcbisjZGVmaW5lIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFU1xcdCgxMjggKiAxMDI0KVxcbitcXG4rLyogV2FpdCBmb3IgdGhlIGxvYWRlciB0byBhc2sgZm9yIHRoZSBuZXh0IGNodW5rIChTVEFUIDApIG9yIHRvIGNvbWUgYmFjayB0byBpdHNcXG4rICogY29tbWFuZCBsb29wIChTVEFUIFJFQURZKSwgYW5kIHJldHVybiB0aGUgU1RBVCB2YWx1ZSBlaXRoZXIgd2F5LiBPbiB0aW1lb3V0XFxuKyAqIHRoYXQgaXMgd2hhdGV2ZXIgU1RBVCBzdGlsbCBob2xkcywgd2hpY2ggY2FycmllcyBubyBmdXJ0aGVyIGluZm9ybWF0aW9uOiB0aGVcXG4rICogbG9hZGVyIGtlZXBzIHRoZSBjb3VudCB3ZSB3cm90ZSB2aXNpYmxlIHdoaWxlIGl0IHByb2dyYW1zIHRoZSBjaHVuaywgYW5kIHRoYXRcXG4rICogaXMgdGhlIHNhbWUgdmFsdWUgaXQgcHVibGlzaGVzIGFzIHRoZSBcXFwiaW1hZ2UgcmVqZWN0ZWRcXFwiIHZlcmRpY3Qgb25jZSB0aGVcXG4rICogY291bnRlciByZWFjaGVzIHplcm8uXFxuKyAqXFxuKyAqIFNUQVQgMCBpcyB1bmFtYmlndW91cyBoZXJlIGV2ZW4gdGhvdWdoIGl0IGlzIGFsc28gdGhlIFxcXCJpbWFnZSB2ZXJpZmllZFxcXCJcXG4rICogdmVyZGljdDogYnkgdGhlIHJfcmVtYWluID09IDAgcnVsZSB0aGUgbG9hZGVyIGxlYXZlcyB0aGUgcmVjZWl2ZSBsb29wIHRoZVxcbisgKiBtb21lbnQgdGhlIGNvdW50ZXIgcmVhY2hlcyB6ZXJvLCBzbyBpdCBpcyBuZXZlciBib3RoIGluc2lkZSB0aGUgbG9vcCBhc2tpbmdcXG4rICogZm9yIGEgY2h1bmsgYW5kIHB1Ymxpc2hpbmcgYSB2ZXJkaWN0LiBPbmNlIGl0IGhhcyBsZWZ0LCB0aGUgbmV4dCBTVEFUIHdyaXRlXFxuKyAqIGlzIGEgY29tbWFuZCByYXRoZXIgdGhhbiBhIGNvdW50LCBzbyBmZWVkaW5nIG9uZSBtb3JlIGNodW5rIGFmdGVyIGEgdmVyZGljdFxcbisgKiBjYW5ub3QgdW5kZXJmbG93IGFueXRoaW5nIGVpdGhlci5cXG4rICovXFxuK3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX3BvbGxfZHJhaW4oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcylcXG4re1xcbitcXHRpbnQgdmFsO1xcbitcXG4rXFx0cmVhZF9wb2xsX3RpbWVvdXQobXhsODYyeHhfc21kaW9fcmVhZCwgdmFsLFxcbitcXHRcXHRcXHQgIHZhbCBcXHUwMDNjIDAgfHwgKHUxNil2YWwgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZIHx8XFxuK1xcdFxcdFxcdCAgKHUxNil2YWwgPT0gMCxcXG4rXFx0XFx0XFx0ICA1MCwgdGltZW91dF9tcyAqIDEwMDAsIGZhbHNlLFxcbitcXHRcXHRcXHQgIHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFUKTtcXG4rXFx0aWYgKHZhbCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiB2YWw7XFxuK1xcdHJldHVybiAodTE2KXZhbDtcXG4rfVxcbitcXG4rLyogVGhlIGxvYWRlciBpcyBub3QgYXNraW5nIGZvciBhIGNodW5rOiBpdCBtYXkgc3RpbGwgYmUgcHJvZ3JhbW1pbmcgdGhlIGxhc3RcXG4rICogb25lLCBvciB0aGUgY291bnRlciBoYXMgcmVhY2hlZCB6ZXJvIGFuZCBpdCBpcyB2ZXJpZnlpbmcgdGhlIGltYWdlIGFuZFxcbisgKiByZXNldHRpbmcgaW50byBSRUFEWS4gV2FpdCB0aGF0IG91dCAtLSBTVEFUIGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQsIGFuZFxcbisgKiBndWVzc2luZyB3b3VsZCBtZWFuIHdyaXRpbmcgRU5EIGludG8gYSBsaXZlIHJlY2VpdmUgbG9vcC5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uY2UgdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgbG9vcCwgLUVBR0FJTiBpZiBpdCBhc2tzIGZvciBhbm90aGVyXFxuKyAqIGNodW5rIGFmdGVyIGFsbCwgLUVJTyBmb3IgYSBsb2FkZXIgc3RpbGwgaG9sZGluZyB0aGUgY291bnQgd2hlbiB0aGUgdmVyaWZ5XFxuKyAqIHdpbmRvdyBleHBpcmVzLCBvciBhbiBTTURJTyBidXMgZXJyb3IuXFxuKyAqL1xcbitzdGF0aWMgaW50IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbl9maW5pc2goc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBjaHVuaylcXG4re1xcbitcXHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlZGV2O1xcbitcXHRpbnQgc3RhdDtcXG4rXFxuK1xcdHN0YXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TKTtcXG4rXFx0aWYgKHN0YXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gc3RhdDtcXG4rXFx0aWYgKHN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0aWYgKHN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1ZFUklGWV9CQUQpIHtcXG4rXFx0XFx0ZGV2X2VycihkZXYsXFxuK1xcdFxcdFxcdFxcXCJmbGFzaDogbG9hZGVyIHN0dWNrIGFmdGVyICV1IGNodW5rcywgcG93ZXIgY3ljbGUgaXRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdGNodW5rKTtcXG4rXFx0XFx0cmV0dXJuIC1FSU87XFxuK1xcdH1cXG4rXFx0aWYgKHN0YXQpIHtcXG4rXFx0XFx0LyogQSBmaXJtd2FyZSBpcyBhbnN3ZXJpbmcsIG5vdCB0aGUgbG9hZGVyOiBhbiBpbWFnZSBzdXJ2aXZlZFxcbitcXHRcXHQgKiBpbiBmbGFzaCBhbmQgYm9vdGVkLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0ZGV2X2luZm8oZGV2LCBcXFwiZmxhc2g6IGZpcm13YXJlIGJvb3RlZCB3aGlsZSBkcmFpbmluZ1xcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gLUVBR0FJTjtcXG4rfVxcbitcXG4rLyogUmVjb3ZlciBhIHN3aXRjaCB3aG9zZSBTQiBQREkgZG93bmxvYWQgd2FzIGludGVycnVwdGVkIG1pZC10cmFuc2ZlciAtIHRoZVxcbisgKiBob3N0IGRpZWQgYWZ0ZXIgTUNVYm9vdCBiZWdhbiBlcmFzaW5nIGZsYXNoLCB3aGV0aGVyIGl0IGFib3J0ZWQgbWlkIGVyYXNlIG9yXFxuKyAqIG1pZCBpbWFnZS13cml0ZSwgYm90aCBlbmQgdXAgaW4gdGhlIHNhbWUgcGxhY2U6IHRoZSBwYXlsb2FkIHJlY2VpdmUgbG9vcC5cXG4rICogVGhlcmUgdGhlIGxvYWRlciBwdWJsaXNoZXMgU1RBVD0wLCB3YWl0cyBmb3IgdGhlIGhvc3QgdG8gd3JpdGUgYSBieXRlLWNvdW50XFxuKyAqIHRvIFNUQVQsIERNQXMgdGhhdCBtYW55IGJ5dGVzIGFuZCBzdWJ0cmFjdHMgdGhlIGNvdW50IGZyb20gYSByZW1haW5pbmctYnl0ZXNcXG4rICogY291bnRlciwgbGVhdmluZyB0aGUgbG9vcCBvbmx5IHdoZW4gdGhlIGNvdW50ZXIgcmVhY2hlcyBleGFjdGx5IHplcm8uIFRoZVxcbisgKiBpbWFnZSBzaXplIGRpZWQgd2l0aCB0aGUgaG9zdCwgc28gd2UgZmVlZCBzaW5nbGUtYnl0ZSBjaHVua3MgKHNlZVxcbisgKiBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUykgdG8gd2FsayB0aGUgY291bnRlciB0byB6ZXJvIHdpdGhvdXQgdW5kZXJmbG93LlxcbisgKiBUaGUgbG9hZGVyIHRoZW4gdmVyaWZpZXMgdGhlIChub3cgY29ycnVwdCkgaW1hZ2UgYW5kIHJldHVybnMgdG8gUkVBRFkgYnlcXG4rICogaXRzZWxmLCBvciBib290cyBhIHZhbGlkIGltYWdlIHRoYXQgaGFwcGVuZWQgdG8gc3Vydml2ZSBpbiBmbGFzaDsgZWl0aGVyIHdheVxcbisgKiB0aGUgY2FsbGVyJ3MgcmVwcm9iZSBjbGFzc2lmaWVzIHRoZSByZXN1bHQuIEV2ZXJ5IGJ5dGUgY29zdHMgYWJvdXQgYSBkb3plblxcbisgKiBNRElPIGZyYW1lcywgc28gYSBtdWx0aS1NaUIgb3V0c3RhbmRpbmcgY291bnQgdGFrZXMgdGVucyBvZiBtaW51dGVzLlxcbisgKiBSZXR1cm5zIDAgb25jZSB0aGUgbG9hZGVyIGhhcyBsZWZ0IHRoZSByZWNlaXZlIGxvb3AsIFxcdTAwM2MwIG9uIGVycm9yLiBEb2VzIE5PVFxcbisgKiByZWNvdmVyIGEgY291bnRlciBhbHJlYWR5IHVuZGVyZmxvd2VkIGJ5IGFuIGVhcmxpZXIgb3ZlcnNpemVkLWNodW5rIGF0dGVtcHRcXG4rICogLSB0aGF0IG5lZWRzIGEgcG93ZXIgY3ljbGUuXFxuKyAqL1xcbitzdGF0aWMgaW50IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbihzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcXG4re1xcbitcXHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlZGV2O1xcbitcXHQvKiBCb3VuZDogdHdpY2UgdGhlIGxvYWRlcidzIDE2IE1pQiBpbWFnZSBjYXAsIG9uZSBieXRlIHBlciBjaHVuay4gKi9cXG4rXFx0dTMyIG1heF9jaHVua3MgPSAydSAqICgxNnUgXFx1MDAzY1xcdTAwM2MgMjApIC8gTVhMODYyWFhfRFJBSU5fQ0hVTktfQllURVM7XFxuK1xcdHUzMiBjaHVuayA9IDA7XFxuK1xcdGludCByZXQsIHN0YXQ7XFxuK1xcbitcXHR3aGlsZSAoY2h1bmsgXFx1MDAzYyBtYXhfY2h1bmtzKSB7XFxuK1xcdFxcdC8qIFRlYXJkb3duIGNhbiBpbnRlcnJ1cHQgdGhpcyBsb25nIGRyYWluLiAqL1xcbitcXHRcXHRpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFxcdTAwMjZwcml2LVxcdTAwM2VmbGFncykpXFxuK1xcdFxcdFxcdHJldHVybiAtRUNBTkNFTEVEO1xcbitcXG4rXFx0XFx0c3RhdCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX2RyYWluKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TKTtcXG4rXFx0XFx0aWYgKHN0YXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gc3RhdDtcXG4rXFx0XFx0aWYgKHN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKVxcbitcXHRcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdFxcdGlmIChzdGF0KSB7XFxuK1xcdFxcdFxcdHJldCA9IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbl9maW5pc2gocHJpdiwgY2h1bmspO1xcbitcXHRcXHRcXHRpZiAocmV0ICE9IC1FQUdBSU4pXFxuK1xcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdC8qIEZlZWQgb25lIHplcm8gYnl0ZTsgcmVzZXQgY2xlYXJlZCB0aGUgd3JpdGUgbGF0Y2guICovXFxuK1xcdFxcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxcbitcXHRcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgMHgwMDAwKTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULFxcbitcXHRcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUyk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRjaHVuaysrO1xcbitcXHRcXHRpZiAoIShjaHVuayAlIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFUykpXFxuK1xcdFxcdFxcdGRldl9pbmZvKGRldiwgXFxcImZsYXNoOiBkcmFpbmVkICV1IEtpQiBzbyBmYXJcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCBjaHVuayAvIDEwMjQpO1xcbitcXHRcXHRjb25kX3Jlc2NoZWQoKTtcXG4rXFx0fVxcbitcXG4rXFx0ZGV2X2VycihkZXYsXFxuK1xcdFxcdFxcXCJmbGFzaDogaW50ZXJydXB0ZWQgZG93bmxvYWQgZGlkIG5vdCBkcmFpbiBhZnRlciAldSBjaHVua3NcXFxcblxcXCIsXFxuK1xcdFxcdGNodW5rKTtcXG4rXFxuK1xcdHJldHVybiAtRVRJTUVET1VUO1xcbit9XFxuK1xcbisvKiBCYWNrZ3JvdW5kIHNlbGYtaGVhbDogZHJhaW4gYSB3ZWRnZWQgZG93bmxvYWQgb2ZmIHRoZSBkZXZsaW5rIGZsYXNoIHBhdGgsIHNvXFxuKyAqIHRoZSBsb25nIHJlY292ZXJ5IG5ldmVyIGhvbGRzIHRoZSBkZXZsaW5rIGxvY2suIFNjaGVkdWxlZCBmcm9tIHByb2JlO1xcbisgKiByZXByb2JlcyBvbiBzdWNjZXNzIHNvIHRoZSBwcm9iZS10aW1lIGRldGVjdGlvbiByZS1jbGFzc2lmaWVzIHRoZSBzd2l0Y2guXFxuKyAqL1xcbit2b2lkIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbit7XFxuK1xcdHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID1cXG4rXFx0XFx0Y29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBteGw4NjJ4eF9wcml2LCByZXNjdWVfaGVhbF93b3JrKTtcXG4rXFx0c3RydWN0IGRldmljZSAqZGV2ID0gXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldjtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IG14bDg2Mnh4X3Jlc2N1ZV9kcmFpbihwcml2KTtcXG4rXFx0aWYgKHJldCA9PSAtRUNBTkNFTEVEKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmIChyZXQpIHtcXG4rXFx0XFx0LyogTm90aGluZyByZXRyaWVzIHRoaXMsIHNvIHNheSBzbzogcmVzY3VlX3JlYWR5IHN0YXlzIGNsZWFyXFxuK1xcdFxcdCAqIGFuZCBkZXZsaW5rIGRldiBmbGFzaCByZXBvcnRzIHdoeSBpdCByZWZ1c2VzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0ZGV2X2VycihkZXYsIFxcXCJmbGFzaDogZG93bmxvYWQgcmVjb3ZlcnkgZmFpbGVkOiAlcGVcXFxcblxcXCIsXFxuK1xcdFxcdFxcdEVSUl9QVFIocmV0KSk7XFxuK1xcdFxcdFdSSVRFX09OQ0UocHJpdi1cXHUwMDNlcmVzY3VlX2ZhaWxlZCwgdHJ1ZSk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0LyogVGhlIGludGVycnVwdGVkIHRyYW5zZmVyIGlzIGZpbmFsaXNlZDsgcmVwcm9iZSBzbyB0aGUgcHJvYmUtdGltZVxcbitcXHQgKiBkZXRlY3Rpb24gYnJpbmdzIHRoZSBkcml2ZXIgdXAgLS0gZmxhc2hhYmxlIGluIHJlc2N1ZSBtb2RlIGlmIHRoZVxcbitcXHQgKiBsb2FkZXIgaXMgYXQgUkVBRFksIG9yIG5vcm1hbGx5IGlmIGEgdmFsaWQgaW1hZ2UgYm9vdGVkLiBUaGUgY29yZVxcbitcXHQgKiBza2lwcyB0aGUgcmUtcHJvYmUgb24gaXRzIG93biBpZiB0aGUgZGV2aWNlIGlzIHVuYm91bmQgZmlyc3Q7IHRoZVxcbitcXHQgKiBmbGFnIHRlc3Qgb25seSBhdm9pZHMgc2NoZWR1bGluZyBvbmUgY2VydGFpbiB0byBiZSBza2lwcGVkLiBBXFxuK1xcdCAqIGZhaWxlZCBoYW5kLW9mZiBsZWF2ZXMgbm90aGluZyB0byByZWNsYXNzaWZ5IHRoZSBzd2l0Y2gsIHNvIG1hcmtcXG4rXFx0ICogcmVjb3ZlcnkgZmFpbGVkIHJhdGhlciB0aGFuIHByb21pc2UgYSByZXRyeSB0aGF0IGNhbm5vdCBzdWNjZWVkLlxcbitcXHQgKi9cXG4rXFx0aWYgKHRlc3RfYml0KE1YTDg2MlhYX0ZMQUdfV09SS19TVE9QUEVELCBcXHUwMDI2cHJpdi1cXHUwMDNlZmxhZ3MpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRpZiAoZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZGV2LCBNWEw4NjJYWF9GV19SRVBST0JFX0RFTEFZX01TKSlcXG4rXFx0XFx0V1JJVEVfT05DRShwcml2LVxcdTAwM2VyZXNjdWVfZmFpbGVkLCB0cnVlKTtcXG4rfVxcbitcXG4rLyogRGV0ZWN0IE1DVWJvb3QgcmVzY3VlIG1vZGUgb3ZlciBjbGF1c2UtMjIgU01ESU8gYWxvbmUsIHNvIHRoZSBjYWxsZXIgY2FuIHJ1bGVcXG4rICogdGhlIGxvYWRlciBvdXQgYmVmb3JlIGFueSBDNDUgQVBJIHJlcXVlc3QgKHdoaWNoIHNwZXdzIENSQyBlcnJvcnMgd2hlbiBubyBXU1BcXG4rICogZmlybXdhcmUgYW5zd2VycykuIEEgc2NyYXRjaCB3cml0ZSB0byBBRERSL0RBVEEgbXVzdCBsYXRjaCBvciB0aGUgY2hpcCBpc1xcbisgKiBhYnNlbnQgKC1FTk9ERVYpOyB0aGUgbWFpbGJveCBpcyByZXNldCBmaXJzdCwgb3IgYSB0cmFuc2ZlciBpbnRlcnJ1cHRlZCB3aXRoXFxuKyAqIENUUkw9V1Igd291bGQgdGFrZSB0aGF0IHdyaXRlIGFzIGEgcGF5bG9hZCB3b3JkIGluc3RlYWQgb2YgbGF0Y2hpbmcgaXQuIFNUQVRcXG4rICogdGhlbiBjbGFzc2lmaWVzIHRoZSBzdGF0ZSwgcG9rZWQgZGVzdHJ1Y3RpdmVseSBvbmx5IHdoZW4gMCwgdGhlIG9uZSB2YWx1ZSBhXFxuKyAqIHJ1bm5pbmcgZmlybXdhcmUgbmV2ZXIgaG9sZHM6XFxuKyAqXFxuKyAqICAtIDB4YzMzYzogZmxhc2hsZXNzIGxvb3A7IHJlY29nbmlzZWQgYnV0IG5vdCBzdXBwb3J0ZWQgaGVyZS5cXG4rICogIC0gMHhjNTVjOiBjb25zb2xlIGxvb3AsIGlmIHRoZSByZWdpc3Rlci1yZWFkIGNoYWxsZW5nZSBpcyBzZXJ2aWNlZC5cXG4rICogIC0gb3RoZXIgbm9uLXplcm86IHJ1bm5pbmcgZmlybXdhcmUsIGxlZnQgdW5wb2tlZC5cXG4rICogIC0gMDogd2VkZ2VkIHJlY2VpdmUgbG9vcDsgdGhlIDEtYnl0ZSBzbGljZS1hZHZhbmNlIHRoZW4gc2F5cyB3aGV0aGVyIGl0XFxuKyAqICAgIHN0aWxsIG5lZWRzIGRyYWluaW5nIG9yIGhhcyBqdXN0IGZpbmlzaGVkLlxcbisgKlxcbisgKiBUaGUgc2NyYXRjaCB3cml0ZSByZWFjaGVzIGEgcnVubmluZyBmaXJtd2FyZSB0b28sIGJ1dCBsYW5kcyBpbiBtYWlsYm94XFxuKyAqIHJlZ2lzdGVycyBpdCBkb2VzIG5vdCByZWFkLCBzbyBpdCBpcyBpbmVydCB0aGVyZS5cXG4rICpcXG4rICogUmV0dXJuOiBNWEw4NjJYWF9JTl9SRVNDVUUsIE1YTDg2MlhYX05PVF9SRVNDVUUsIC1FTk9ERVYgd2hlbiB0aGUgc2NyYXRjaFxcbisgKiB3cml0ZSBkb2VzIG5vdCBsYXRjaCwgd2hpY2ggaXMgYSBzd2l0Y2ggdGhhdCBkb2VzIG5vdCBhbnN3ZXIgYXQgYWxsIG9yIG9uZVxcbisgKiB3aG9zZSBTQiBQREkgd2luZG93IGlzIG5vdCBhdCB0aGUgb2Zmc2V0cyBhYm92ZSwgLUVPUE5PVFNVUFAgZm9yIHRoZVxcbisgKiBmbGFzaGxlc3MgbG9vcCwgLUVOWElPIGZvciBhIFJFQURZIGxvYWRlciB3aG9zZSBtYWlsYm94IGZhaWxzIHRoZSBjaGFsbGVuZ2UsXFxuKyAqIG9yIGFuIFNNRElPIGJ1cyBlcnJvci5cXG4rICovXFxuK2ludCBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3Qoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXFxuK3tcXG4rXFx0aW50IHN0YXQsIGRhdCwgcmV0LCByYiwgYSwgZDtcXG4rXFxuK1xcdC8qIHJlc2N1ZV9yZWFkeSBnYXRlcyBmbGFzaGluZzsgYSB3ZWRnZWQgbG9hZGVyIG5lZWRzIHRoZSBkcmFpbiBmaXJzdC4gKi9cXG4rXFx0V1JJVEVfT05DRShwcml2LVxcdTAwM2VyZXNjdWVfcmVhZHksIGZhbHNlKTtcXG4rXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKiBQcmVzZW5jZTogYSBsaXZlIGNoaXAgbGF0Y2hlcyB0aGUgc2NyYXRjaCB3cml0ZSwgYW4gYWJzZW50IG9uZSBmbG9hdHMuICovXFxuK1xcdGEgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUixcXG4rXFx0XFx0XFx0XFx0IE1YTDg2MlhYX1NCX1BESV9QUk9CRV9BKTtcXG4rXFx0aWYgKGEgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gYTtcXG4rXFx0ZCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLFxcbitcXHRcXHRcXHRcXHQgTVhMODYyWFhfU0JfUERJX1BST0JFX0QpO1xcbitcXHRpZiAoZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiBkO1xcbitcXHRhID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUik7XFxuK1xcdGlmIChhIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIGE7XFxuK1xcdGQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBKTtcXG4rXFx0aWYgKGQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gZDtcXG4rXFx0aWYgKCh1MTYpYSAhPSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSB8fFxcbitcXHQgICAgKHUxNilkICE9IE1YTDg2MlhYX1NCX1BESV9QUk9CRV9EKVxcbitcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG4rXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRzdGF0ID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XFxuK1xcdGlmIChzdGF0IFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIHN0YXQ7XFxuK1xcbitcXHQvKiBGbGFzaGxlc3MtZG93bmxvYWQgbG9vcCAoTXhMODYyODEgdGllcik6IHVuc3VwcG9ydGVkLiAqL1xcbitcXHRpZiAoKHUxNilzdGF0ID09IE1YTDg2MlhYX1NCX1BESV9ETF9SRUFEWSlcXG4rXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXG4rXFx0LyogQ29uc29sZSBsb29wIGF0IFJFQURZOiBjb25maXJtIHRoZSBsaXZlIG1haWxib3ggd2l0aCB0aGUgcmVnaXN0ZXItcmVhZFxcbitcXHQgKiBjaGFsbGVuZ2UgKGNvbnN1bWVzIHRoZSBtYXJrZXIgZnJvbSBEQVRBIGFuZCByZS1hcm1zIFJFQURZKS5cXG4rXFx0ICovXFxuK1xcdGlmICgodTE2KXN0YXQgPT0gTVhMODYyWFhfU0JfUERJX1JFQURZKSB7XFxuK1xcdFxcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLFxcbitcXHRcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9TQl9QRElfUkRSRUdfTUFSSyk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgTVhMODYyWFhfU0JfUERJX1JEUkVHKTtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJiID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCBNWEw4NjJYWF9TQl9QRElfUkVBRFksXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBNWEw4NjJYWF9TQl9QRElfU1RFUF9NUyk7XFxuK1xcdFxcdGRhdCA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEpO1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XFxuK1xcdFxcdC8qIE5ldmVyIHJlLWFybWluZyBSRUFEWSBmYWlscyB0aGUgY2hhbGxlbmdlIGxpa2UgYW55IG90aGVyXFxuK1xcdFxcdCAqIHVuc2VydmljZWQgY29tbWFuZDsgcmVwb3J0IGl0IGFzIHN1Y2ggcmF0aGVyIHRoYW4gYXMgYSBidXNcXG4rXFx0XFx0ICogdGltZW91dCB0aGUgYnVzIG5ldmVyIHNhdy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChyYiA9PSAtRVRJTUVET1VUKVxcbitcXHRcXHRcXHRyYiA9IC1FTlhJTztcXG4rXFx0XFx0aWYgKHJiIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIHJiO1xcbitcXHRcXHRpZiAoZGF0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIGRhdDtcXG4rXFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdGlmICgodTE2KWRhdCAhPSBNWEw4NjJYWF9TQl9QRElfUkRSRUdfTUFSSykge1xcbitcXHRcXHRcXHRXUklURV9PTkNFKHByaXYtXFx1MDAzZXJlc2N1ZV9yZWFkeSwgdHJ1ZSk7XFxuK1xcdFxcdFxcdHJldHVybiBNWEw4NjJYWF9JTl9SRVNDVUU7XFxuK1xcdFxcdH1cXG4rXFx0XFx0LyogUkVBRFkgYnV0IHRoZSBtYXJrZXIgaXMgdW50b3VjaGVkLCBzbyBub3RoaW5nIGlzIHNlcnZpY2luZyB0aGVcXG4rXFx0XFx0ICogbWFpbGJveC4gQSBmaXJtd2FyZSBwdWJsaXNoaW5nIDB4YzU1YyBhcyBpdHMgc3RhdHVzIHdvcmQgbG9va3NcXG4rXFx0XFx0ICogZXhhY3RseSBsaWtlIHRoaXMsIGFuZCBmbGFzaGluZyBvbmUgd291bGQgYmUgZmFyIHdvcnNlIHRoYW5cXG4rXFx0XFx0ICogcmVmdXNpbmcgdG8gYmluZCwgc28gdHJlYXQgaXQgYXMgdW51c2FibGUuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHR9XFxuK1xcbitcXHQvKiBBbnkgb3RoZXIgbm9uLXplcm8gdmFsdWUgaXMgYSBydW5uaW5nIGZpcm13YXJlLCBub3QgYSBsb2FkZXIuICovXFxuK1xcdGlmIChzdGF0KVxcbitcXHRcXHRyZXR1cm4gTVhMODYyWFhfTk9UX1JFU0NVRTtcXG4rXFxuK1xcdC8qIFNUQVQgPT0gMDogYSB3ZWRnZWQgcmVjZWl2ZSBsb29wIHRha2VzIGEgMS1ieXRlIHNsaWNlLWFkdmFuY2UgKGZlZWRcXG4rXFx0ICogb25lIERBVEEgd29yZCBmaXJzdCwgbGlrZSBhIGRyYWluIGNodW5rKSBhbmQgYXNrcyBmb3IgdGhlIG5leHQgY2h1bmtcXG4rXFx0ICogYnkgcHVibGlzaGluZyAwIGFnYWluLiBIYWQgdGhhdCBieXRlIGJlZW4gdGhlIGxhc3Qgb25lIG91dHN0YW5kaW5nLFxcbitcXHQgKiB0aGUgbG9hZGVyIGxlYXZlcyB0aGUgbG9vcCBpbnN0ZWFkIGFuZCByZXR1cm5zIHRvIFJFQURZLCBoYXZpbmdcXG4rXFx0ICogY29uc3VtZWQgdGhlIGFkdmFuY2UgLS0gcHJvb2YgZW5vdWdoIG9mIGEgbGl2ZSBtYWlsYm94IHRvIHNraXAgdGhlXFxuK1xcdCAqIGNoYWxsZW5nZS4gQW55dGhpbmcgZWxzZSBtZWFucyBpdCBpcyBzdGlsbCB3b3JraW5nIG9uIGl0LiBBbGwgdGhyZWVcXG4rXFx0ICogYXJlIHJlc2N1ZSwgc28gdGhpcyBuZXZlciBmYWlscyBwcm9iZTsgb25seSB0aGUgZHJhaW4gZG9lcy5cXG4rXFx0ICovXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxcbitcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgMHgwMDAwKTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULFxcbitcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUyk7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmIgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RFUF9NUyk7XFxuK1xcdGlmIChyYiBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByYjtcXG4rXFx0aWYgKHJiID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSlcXG4rXFx0XFx0V1JJVEVfT05DRShwcml2LVxcdTAwM2VyZXNjdWVfcmVhZHksIHRydWUpO1xcbitcXG4rXFx0cmV0dXJuIE1YTDg2MlhYX0lOX1JFU0NVRTtcXG4rfVxcbitcXG4rLyogTUNVYm9vdCBmaXJtd2FyZSBpbWFnZSBoZWFkZXIgKi9cXG4rc3RydWN0IG14bDg2Mnh4X2Z3X2hkciB7XFxuK1xcdF9fbGUzMiBpbWFnZV90eXBlO1xcbitcXHRfX2xlMzIgaW1hZ2Vfc2l6ZV8xO1xcbitcXHRfX2xlMzIgaW1hZ2VfY2hlY2tzdW1fMTtcXG4rXFx0X19sZTMyIGltYWdlX3NpemVfMjtcXG4rXFx0X19sZTMyIGltYWdlX2NoZWNrc3VtXzI7XFxuK30gX19wYWNrZWQ7XFxuK1xcbitzdGF0aWMgaW50IG14bDg2Mnh4X2ZsYXNoX3ZhbGlkYXRlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LFxcbitcXHRcXHRcXHRcXHQgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LFxcbitcXHRcXHRcXHRcXHQgICB1MzIgKnBheWxvYWRfc2l6ZSlcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICpoZHI7XFxuK1xcdHUzMiBzaXplMSwgc2l6ZTIsIHRvdGFsO1xcbitcXHRjb25zdCB1OCAqcGF5bG9hZDtcXG4rXFx0dTMyIGNyYztcXG4rXFxuK1xcdGlmIChmdy1cXHUwMDNlc2l6ZSBcXHUwMDNjIE1YTDg2MlhYX0ZXX0hEUl9TSVpFKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGhkciA9IChjb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICopZnctXFx1MDAzZWRhdGE7XFxuK1xcdHBheWxvYWQgPSBmdy1cXHUwMDNlZGF0YSArIE1YTDg2MlhYX0ZXX0hEUl9TSVpFO1xcbitcXHRzaXplMSA9IGxlMzJfdG9fY3B1KGhkci1cXHUwMDNlaW1hZ2Vfc2l6ZV8xKTtcXG4rXFx0c2l6ZTIgPSBsZTMyX3RvX2NwdShoZHItXFx1MDAzZWltYWdlX3NpemVfMik7XFxuK1xcbitcXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KHNpemUxLCBzaXplMiwgXFx1MDAyNnRvdGFsKSB8fFxcbitcXHQgICAgdG90YWwgXFx1MDAzZSBmdy1cXHUwMDNlc2l6ZSAtIE1YTDg2MlhYX0ZXX0hEUl9TSVpFKSB7XFxuK1xcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFxcImZsYXNoOiBmaXJtd2FyZSBmaWxlIHRvbyBzbWFsbCBmb3IgZGVjbGFyZWQgc2l6ZVxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIXRvdGFsKSB7XFxuK1xcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFxcImZsYXNoOiBmaXJtd2FyZSBmaWxlIHdpdGggZW1wdHkgcGF5bG9hZFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoc2l6ZTEpIHtcXG4rXFx0XFx0Y3JjID0gfmNyYzMyX2xlKH4wVSwgcGF5bG9hZCwgc2l6ZTEpO1xcbitcXHRcXHRpZiAoY3JjICE9IGxlMzJfdG9fY3B1KGhkci1cXHUwMDNlaW1hZ2VfY2hlY2tzdW1fMSkpIHtcXG4rXFx0XFx0XFx0ZGV2X2VycihcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHRcXHRcXFwiZmxhc2g6IGltYWdlIDEgQ1JDIG1pc21hdGNoIChnb3QgJTA4eCwgZXhwZWN0ZWQgJTA4eClcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdGNyYywgbGUzMl90b19jcHUoaGRyLVxcdTAwM2VpbWFnZV9jaGVja3N1bV8xKSk7XFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChzaXplMikge1xcbitcXHRcXHRjcmMgPSB+Y3JjMzJfbGUofjBVLCBwYXlsb2FkICsgc2l6ZTEsIHNpemUyKTtcXG4rXFx0XFx0aWYgKGNyYyAhPSBsZTMyX3RvX2NwdShoZHItXFx1MDAzZWltYWdlX2NoZWNrc3VtXzIpKSB7XFxuK1xcdFxcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFx0XFxcImZsYXNoOiBpbWFnZSAyIENSQyBtaXNtYXRjaCAoZ290ICUwOHgsIGV4cGVjdGVkICUwOHgpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRjcmMsIGxlMzJfdG9fY3B1KGhkci1cXHUwMDNlaW1hZ2VfY2hlY2tzdW1fMikpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHQqcGF5bG9hZF9zaXplID0gdG90YWw7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBteGw4NjJ4eF9mbGFzaF9maXJtd2FyZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcXG4rXFx0XFx0XFx0XFx0ICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyxcXG4rXFx0XFx0XFx0XFx0ICAgdTMyIHBheWxvYWRfc2l6ZSwgc3RydWN0IGRldmxpbmsgKmRsKVxcbit7XFxuK1xcdGNvbnN0IHU4ICpwYXlsb2FkID0gZnctXFx1MDAzZWRhdGEgKyBNWEw4NjJYWF9GV19IRFJfU0laRTtcXG4rXFx0dTMyIHdvcmRfaWR4ID0gMCwgZGF0YV93cml0dGVuID0gMCwgaWR4ID0gMDtcXG4rXFx0dW5zaWduZWQgbG9uZyBuZXh0X25vdGlmeSA9IGppZmZpZXMgLSAxO1xcbitcXHR1MTYgd29yZCwgZmRhdGE7XFxuK1xcdGludCByZXQsIGk7XFxuK1xcbitcXHQvKiBTdGVwIDE6IHJlYm9vdCB0aGUgZmlybXdhcmUgaW50byBNQ1Vib290IHJlc2N1ZSBtb2RlICovXFxuK1xcdGlmICghcHJpdi1cXHUwMDNlcmVzY3VlX21vZGUpIHtcXG4rXFx0XFx0cmV0ID0gbXhsODYyeHhfYXBpX3dyYXAocHJpdiwgU1lTX01JU0NfRldfVVBEQVRFLCBOVUxMLCAwLFxcbitcXHRcXHRcXHRcXHRcXHRmYWxzZSwgZmFsc2UpO1xcbitcXHRcXHRpZiAocmV0KSB7XFxuK1xcdFxcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFx0XFxcImZsYXNoOiBGV19VUERBVEUgY29tbWFuZCBmYWlsZWQ6ICVwZVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0RVJSX1BUUihyZXQpKTtcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHQvKiBTdGVwIDI6IHdhaXQgZm9yIGJvb3Rsb2FkZXIgcmVhZHkgKi9cXG4rXFx0bXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCBcXFwiV2FpdGluZyBmb3IgYm9vdGxvYWRlclxcXCIsIDAsIDApO1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRnb3RvIHdyaXRlX2VycjtcXG4rXFxuK1xcdC8qIEZhaWx1cmVzIGZyb20gaGVyZSBvbiBlbmQgdXAgYXQgbm9fZW5kLCB3aGljaCByZXR1cm5zIHRoZSBlcnJvclxcbitcXHQgKiB3aXRob3V0IHNpZ25hbGxpbmcgRU5EIC0tIHNlZSB0aGVyZS5cXG4rXFx0ICovXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfU0JfUERJX1JFQURZLFxcbitcXHRcXHRcXHRcXHRcXHRNWEw4NjJYWF9GV19SRUFEWV9USU1FT1VUX01TKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRkZXZfZXJyKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VkZXYsXFxuK1xcdFxcdFxcdFxcXCJmbGFzaDogYm9vdGxvYWRlciBub3QgcmVhZHk6ICVwZVxcXFxuXFxcIiwgRVJSX1BUUihyZXQpKTtcXG4rXFx0XFx0Z290byBub19lbmQ7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFN0ZXAgMzogc3RhcnQgaGFuZHNoYWtlICovXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULFxcbitcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9TQl9QRElfU1RBUlQpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byB3cml0ZV9lcnI7XFxuK1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFSVCArIDEsXFxuK1xcdFxcdFxcdFxcdFxcdE1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRkZXZfZXJyKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VkZXYsXFxuK1xcdFxcdFxcdFxcXCJmbGFzaDogc3RhcnQgaGFuZHNoYWtlIGZhaWxlZDogJXBlXFxcXG5cXFwiLCBFUlJfUFRSKHJldCkpO1xcbitcXHRcXHRnb3RvIG5vX2VuZDtcXG4rXFx0fVxcbitcXG4rXFx0LyogU3RlcCA0OiB0cmFuc2ZlciBpbWFnZSBoZWFkZXIgKi9cXG4rXFx0bXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCBcXFwiRXJhc2luZyBmbGFzaFxcXCIsIDAsIDApO1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcXG4rXFx0XFx0XFx0XFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byB3cml0ZV9lcnI7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTVhMODYyWFhfRldfSERSX1NJWkUgLyAyOyBpKyspIHtcXG4rXFx0XFx0d29yZCA9IGZ3LVxcdTAwM2VkYXRhW2kgKiAyXSB8XFxuK1xcdFxcdCAgICAgICAoKHUxNilmdy1cXHUwMDNlZGF0YVtpICogMiArIDFdIFxcdTAwM2NcXHUwMDNjIDgpO1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgd29yZCk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRnb3RvIHdyaXRlX2VycjtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byB3cml0ZV9lcnI7XFxuK1xcbitcXHQvKiB0aGUgYnl0ZSBjb3VudCBpbiBTVEFUIHRyaWdnZXJzIHRoZSBlcmFzZSAqL1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcXG4rXFx0XFx0XFx0XFx0ICAgTVhMODYyWFhfRldfSERSX1NJWkUpO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0Z290byB3cml0ZV9lcnI7XFxuK1xcbitcXHQvKiBBQ0sgaXMgYnl0ZSBjb3VudCArIDEgKi9cXG4rXFx0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCBNWEw4NjJYWF9GV19IRFJfU0laRSArIDEsXFxuK1xcdFxcdFxcdFxcdFxcdE1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRkZXZfZXJyKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VkZXYsXFxuK1xcdFxcdFxcdFxcXCJmbGFzaDogaGVhZGVyIEFDSyBmYWlsZWQ6ICVwZVxcXFxuXFxcIiwgRVJSX1BUUihyZXQpKTtcXG4rXFx0XFx0Z290byBub19lbmQ7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFN0ZXAgNTogd2FpdCBmb3IgZXJhc2UgdG8gY29tcGxldGUgKi9cXG4rXFx0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCAwLFxcbitcXHRcXHRcXHRcXHRcXHRNWEw4NjJYWF9GV19FUkFTRV9USU1FT1VUX01TKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRkZXZfZXJyKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VkZXYsXFxuK1xcdFxcdFxcdFxcXCJmbGFzaDogZXJhc2UgdGltZW91dDogJXBlXFxcXG5cXFwiLCBFUlJfUFRSKHJldCkpO1xcbitcXHRcXHRnb3RvIG5vX2VuZDtcXG4rXFx0fVxcbitcXG4rXFx0LyogU3RlcCA2OiB0cmFuc2ZlciBwYXlsb2FkICovXFxuK1xcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxcbitcXHRcXHRcXHRcXHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XFxuK1xcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRnb3RvIHdyaXRlX2VycjtcXG4rXFxuK1xcdHdoaWxlIChpZHggXFx1MDAzYyBwYXlsb2FkX3NpemUpIHtcXG4rXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuK1xcdFxcdGlmIChpZHggKyAxIFxcdTAwM2MgcGF5bG9hZF9zaXplKSB7XFxuK1xcdFxcdFxcdGZkYXRhID0gcGF5bG9hZFtpZHhdIHxcXG4rXFx0XFx0XFx0XFx0KCh1MTYpcGF5bG9hZFtpZHggKyAxXSBcXHUwMDNjXFx1MDAzYyA4KTtcXG4rXFx0XFx0XFx0aWR4ICs9IDI7XFxuK1xcdFxcdFxcdGRhdGFfd3JpdHRlbiArPSAyO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRmZGF0YSA9IHBheWxvYWRbaWR4XTtcXG4rXFx0XFx0XFx0aWR4Kys7XFxuK1xcdFxcdFxcdGRhdGFfd3JpdHRlbisrO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgZmRhdGEpO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byB3cml0ZV9lcnI7XFxuK1xcdFxcdHdvcmRfaWR4Kys7XFxuK1xcbitcXHRcXHRpZiAoaWR4IFxcdTAwM2U9IHBheWxvYWRfc2l6ZSkge1xcbitcXHRcXHRcXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfbGFzdChwcml2LCBkYXRhX3dyaXR0ZW4pO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LyogSGFsZi1iYW5rIGJvdW5kYXJ5OiBzd2l0Y2ggdG8gU0IxIGFkZHJlc3MgKi9cXG4rXFx0XFx0aWYgKHdvcmRfaWR4ID09IE1YTDg2MlhYX0ZXX0JBTktfSEFMRikge1xcbitcXHRcXHRcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfUlNUKTtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdGdvdG8gd3JpdGVfZXJyO1xcbitcXG4rXFx0XFx0XFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIE1YTDg2MlhYX0ZXX1NCMV9BRERSKTtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdGdvdG8gd3JpdGVfZXJyO1xcbitcXG4rXFx0XFx0XFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdGdvdG8gd3JpdGVfZXJyO1xcbitcXHRcXHR9IGVsc2UgaWYgKHdvcmRfaWR4IFxcdTAwM2U9IE1YTDg2MlhYX0ZXX0JBTktfU0xJQ0UpIHtcXG4rXFx0XFx0XFx0cmV0ID0gbXhsODYyeHhfc2JfcGRpX2ZsdXNoX3NsaWNlKHByaXYsIGRhdGFfd3JpdHRlbik7XFxuK1xcdFxcdFxcdGlmIChyZXQpIHtcXG4rXFx0XFx0XFx0XFx0ZGV2X2VycihcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHRcXHRcXHRcXFwiZmxhc2g6IHdyaXRlIHRpbWVvdXQgYXQgJXUvJXU6ICVwZVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0aWR4LCBwYXlsb2FkX3NpemUsIEVSUl9QVFIocmV0KSk7XFxuK1xcdFxcdFxcdFxcdGdvdG8gbm9fZW5kO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdHdvcmRfaWR4ID0gMDtcXG4rXFx0XFx0XFx0ZGF0YV93cml0dGVuID0gMDtcXG4rXFx0XFx0XFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcXG4rXFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdGdvdG8gd3JpdGVfZXJyO1xcbitcXG4rXFx0XFx0XFx0aWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbmV4dF9ub3RpZnkpKSB7XFxuK1xcdFxcdFxcdFxcdG14bDg2Mnh4X2ZsYXNoX25vdGlmeShkbCwgXFxcIkZsYXNoaW5nXFxcIiwgaWR4LFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBwYXlsb2FkX3NpemUpO1xcbitcXHRcXHRcXHRcXHRuZXh0X25vdGlmeSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdGRldl9lcnIoXFx1MDAyNnByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFxcImZsYXNoOiBmaW5hbCBzbGljZSBmYWlsZWQ6ICVwZVxcXFxuXFxcIiwgRVJSX1BUUihyZXQpKTtcXG4rXFx0XFx0Z290byBub19lbmQ7XFxuK1xcdH1cXG4rXFxuK1xcdG14bDg2Mnh4X2ZsYXNoX25vdGlmeShkbCwgXFxcIkZsYXNoaW5nXFxcIiwgcGF5bG9hZF9zaXplLCBwYXlsb2FkX3NpemUpO1xcbitcXG4rXFx0LyogU3VjY2VzczogdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgcmVjZWl2ZSBsb29wIGF0IHJfcmVtYWluID09IDAgYW5kXFxuK1xcdCAqIHZlcmlmaWVkIHRoZSBpbWFnZSwgc28gRU5EKDB4M2NjMykgaXMgYSBmaW5hbGlzZS9ib290IHJlcXVlc3QgcmF0aGVyXFxuK1xcdCAqIHRoYW4gYSBieXRlIGNvdW50LiBTaWduYWwgaXQgaGVyZSAtLSBhbmQgb25seSBoZXJlIC0tIHRvIGJvb3QgdGhlIG5ld1xcbitcXHQgKiBpbWFnZSB3aXRob3V0IHdhaXRpbmcgb3V0IHRoZSBsb2FkZXIncyAyIHMgRU5EIHRpbWVvdXQuXFxuK1xcdCAqL1xcbitcXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcXG4rXFx0XFx0XFx0XFx0ICAgTVhMODYyWFhfU0JfUERJX0VORCk7XFxuK1xcdG1zbGVlcChNWEw4NjJYWF9GV19SRUJPT1RfREVMQVlfTVMpO1xcbitcXHRyZXR1cm4gcmV0O1xcbitcXG4rd3JpdGVfZXJyOlxcbitcXHRkZXZfZXJyKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VkZXYsIFxcXCJmbGFzaDogU01ESU8gd3JpdGUgZmFpbGVkOiAlcGVcXFxcblxcXCIsXFxuK1xcdFxcdEVSUl9QVFIocmV0KSk7XFxuK25vX2VuZDpcXG4rXFx0LyogQSBmYWlsdXJlIGxlYXZlcyB0aGUgbG9hZGVyIG1pZCB0cmFuc2ZlcjsgZG8gbm90IHNpZ25hbCBFTkQgKGEgU1RBVFxcbitcXHQgKiB3cml0ZSBpcyBhIGJ5dGUgY291bnQgdGhlbiwgYW5kIEVORCB3b3VsZCBiZSBtaXNyZWFkIGFzIG9uZSwgcmlza2luZ1xcbitcXHQgKiBhIHJlY2VpdmUtY291bnRlciB1bmRlcmZsb3cpLiBSZXR1cm4gdGhlIGVycm9yOyB0aGUgY2FsbGVyIHJlcHJvYmVzLlxcbitcXHQgKi9cXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4raW50IG14bDg2Mnh4X2RldmxpbmtfaW5mb19nZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxcbitcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZGV2bGlua19pbmZvX3JlcSAqcmVxLFxcbitcXHRcXHRcXHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuK3tcXG4rXFx0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cXHUwMDNlcHJpdjtcXG4rXFx0Y2hhciBidWZbMTZdO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0LyogTm8gY2hpcC1pZC9yZXZpc2lvbiBpbiBNQ1Vib290IChuZWVkcyB0aGUgZmlybXdhcmUgTU1EIG1haWxib3gpLiBUaGVcXG4rXFx0ICogZncgdmVyc2lvbiBkb3VibGVzIGFzIHRoZSBcXFwicmVhZHkgdG8gZmxhc2hcXFwiIHNpZ25hbDogcmVwb3J0IGl0IG9ubHlcXG4rXFx0ICogb25jZSB0aGUgbG9hZGVyIGlzIGF0IGEgY2xlYW4gUkVBRFksIG5vdGhpbmcgd2hpbGUgc3RpbGwgZHJhaW5pbmcuXFxuK1xcdCAqL1xcbitcXHRpZiAocHJpdi1cXHUwMDNlcmVzY3VlX21vZGUpIHtcXG4rXFx0XFx0aWYgKCFSRUFEX09OQ0UocHJpdi1cXHUwMDNlcmVzY3VlX3JlYWR5KSlcXG4rXFx0XFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRcXHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcXFwiJXUuJXUuJXVcXFwiLFxcbitcXHRcXHRcXHQgcHJpdi1cXHUwMDNlZndfdmVyc2lvbi5tYWpvciwgcHJpdi1cXHUwMDNlZndfdmVyc2lvbi5taW5vcixcXG4rXFx0XFx0XFx0IHByaXYtXFx1MDAzZWZ3X3ZlcnNpb24ucmV2aXNpb24pO1xcbitcXHRcXHRyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9ydW5uaW5nX3B1dChyZXEsXFxuK1xcdFxcdFxcdFxcdERFVkxJTktfSU5GT19WRVJTSU9OX0dFTkVSSUNfRlcsIGJ1Zik7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdHJldHVybiBkZXZsaW5rX2luZm9fdmVyc2lvbl9zdG9yZWRfcHV0KHJlcSxcXG4rXFx0XFx0XFx0XFx0REVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19GVywgYnVmKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogQSAwIHBhcnQgbnVtYmVyIG1lYW5zIHRoZSBDSElQIElEIHJlYWQgZmFpbGVkIG9yIHRoZSBwYXJ0IGlzXFxuK1xcdCAqIHVuZnVzZWQ7IG9taXQgaXQgcmF0aGVyIHRoYW4gcHVibGlzaCBhIGJvZ3VzIFxcXCIwMDAwXFxcIiB0aGF0IGZ3dXBkXFxuK1xcdCAqIHdvdWxkIG1hdGNoIGZpcm13YXJlIGFnYWluc3QgLS0gaXQgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBkcml2ZXJcXG4rXFx0ICogbmFtZS5cXG4rXFx0ICovXFxuK1xcdGlmIChwcml2LVxcdTAwM2Vhc2ljX2lkKSB7XFxuK1xcdFxcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFxcXCIlMDRYXFxcIiwgcHJpdi1cXHUwMDNlYXNpY19pZCk7XFxuK1xcdFxcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19BU0lDX0lELFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGJ1Zik7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRcXHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcXFwiJXVcXFwiLCBwcml2LVxcdTAwM2Vhc2ljX3Jldik7XFxuK1xcdFxcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgREVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19BU0lDX1JFVixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBidWYpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHQvKiBBbiBhbGwtemVybyB2ZXJzaW9uIGlzIHRoZSBjYWNoZSBhIGZhaWxlZCBmbGFzaCBsZWZ0IGJlaGluZCwgbm90IGFcXG4rXFx0ICogcmVsZWFzZWQgZmlybXdhcmU7IG9taXQgaXQgbGlrZSB0aGUgcGFydCBudW1iZXIgYWJvdmUuXFxuK1xcdCAqL1xcbitcXHRpZiAoIXByaXYtXFx1MDAzZWZ3X3ZlcnNpb24ubWFqb3IgXFx1MDAyNlxcdTAwMjYgIXByaXYtXFx1MDAzZWZ3X3ZlcnNpb24ubWlub3IgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFwcml2LVxcdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFxcXCIldS4ldS4ldVxcXCIsXFxuK1xcdFxcdCBwcml2LVxcdTAwM2Vmd192ZXJzaW9uLm1ham9yLCBwcml2LVxcdTAwM2Vmd192ZXJzaW9uLm1pbm9yLFxcbitcXHRcXHQgcHJpdi1cXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbik7XFxuK1xcbitcXHRyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9ydW5uaW5nX3B1dChyZXEsXFxuK1xcdFxcdFxcdERFVkxJTktfSU5GT19WRVJTSU9OX0dFTkVSSUNfRlcsIGJ1Zik7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKiBib290cyB0aGlzIGltYWdlIGZyb20gaXRzIG93biBmbGFzaDogc3RvcmVkID09IHJ1bm5pbmcgKi9cXG4rXFx0cmV0dXJuIGRldmxpbmtfaW5mb192ZXJzaW9uX3N0b3JlZF9wdXQocmVxLFxcbitcXHRcXHRcXHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xcbit9XFxuK1xcbitpbnQgbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcXG4rXFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuK3tcXG4rXFx0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cXHUwMDNlcHJpdjtcXG4rXFx0c3RydWN0IGRzYV9wb3J0ICpkcDtcXG4rXFx0dTMyIHBheWxvYWRfc2l6ZTtcXG4rXFx0aW50IHJldCwgZXJyLCBpO1xcbitcXG4rXFx0aWYgKHBhcmFtcy1cXHUwMDNlY29tcG9uZW50KSB7XFxuK1xcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJjb21wb25lbnQgaXMgbm90IHN1cHBvcnRlZFxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIEEgcHJldmlvdXMgZmxhc2ggaXMgc3RpbGwgd2FpdGluZyBmb3IgaXRzIHJlcHJvYmU6IHRoZSBmaXJtd2FyZSBBUElcXG4rXFx0ICogaXMgc2hvcnQtY2lyY3VpdGVkLCBzbyB0aGUgcmF3IFNCIFBESSB3cml0ZXMgYmVsb3cgd291bGQgcnVuIGFnYWluc3RcXG4rXFx0ICogYSBzd2l0Y2ggdGhpcyBkcml2ZXIgbm8gbG9uZ2VyIHRyYWNrcy5cXG4rXFx0ICovXFxuK1xcdGlmIChwcml2LVxcdTAwM2Vza2lwX3RlYXJkb3duKSB7XFxuK1xcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXFxuK1xcdFxcdFxcdFxcdCAgIFxcXCJkZXZpY2UgaXMgcmVpbml0aWFsaXppbmcsIHJldHJ5IGxhdGVyXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IG14bDg2Mnh4X2ZsYXNoX3ZhbGlkYXRlKHByaXYsIHBhcmFtcy1cXHUwMDNlZncsIFxcdTAwMjZwYXlsb2FkX3NpemUpO1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFxcXCJmaXJtd2FyZSBpbWFnZSB2YWxpZGF0aW9uIGZhaWxlZFxcXCIpO1xcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHQvKiBSZWZ1c2UgdG8gZmxhc2ggd2hpbGUgdGhlIGJhY2tncm91bmQgc2VsZi1oZWFsIGlzIHN0aWxsIGRyYWluaW5nLCBhbmRcXG4rXFx0ICogZm9yIGdvb2Qgb25jZSBpdCBoYXMgZ2l2ZW4gdXAgb24gdGhlIGxvYWRlci5cXG4rXFx0ICovXFxuK1xcdGlmIChSRUFEX09OQ0UocHJpdi1cXHUwMDNlcmVzY3VlX2ZhaWxlZCkpIHtcXG4rXFx0XFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjayxcXG4rXFx0XFx0XFx0XFx0ICAgXFxcImRvd25sb2FkIHJlY292ZXJ5IGZhaWxlZCwgcG93ZXIgY3ljbGUgdGhlIHN3aXRjaFxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLUVJTztcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlIFxcdTAwMjZcXHUwMDI2ICFSRUFEX09OQ0UocHJpdi1cXHUwMDNlcmVzY3VlX3JlYWR5KSkge1xcbitcXHRcXHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLFxcbitcXHRcXHRcXHRcXHQgICBcXFwic3dpdGNoIGlzIHJlY292ZXJpbmcgYW4gaW50ZXJydXB0ZWQgZG93bmxvYWQsIHJldHJ5IHNob3J0bHlcXFwiKTtcXG4rXFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlKVxcbitcXHRcXHRkZXZfaW5mbyhkcy1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHQgXFxcImZsYXNoOiBmbGFzaGluZyBzd2l0Y2ggdmlhIE1DVWJvb3QgcmVzY3VlIG1vZGVcXFxcblxcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGRldl9pbmZvKGRzLVxcdTAwM2VkZXYsIFxcXCJmbGFzaDogcnVubmluZyBmaXJtd2FyZSAldS4ldS4ldVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0IHByaXYtXFx1MDAzZWZ3X3ZlcnNpb24ubWFqb3IsIHByaXYtXFx1MDAzZWZ3X3ZlcnNpb24ubWlub3IsXFxuK1xcdFxcdFxcdCBwcml2LVxcdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uKTtcXG4rXFxuK1xcdC8qIENsb3NlIHBvcnRzIHdoaWxlIHRoZSBmaXJtd2FyZSBpcyBzdGlsbCBhbGl2ZSBzbyB0aGUgRFNBIGNvcmUnc1xcbitcXHQgKiBNREIvRkRCIHRyYWNraW5nIGlzIGRyYWluZWQsIGFuZCBkZXRhY2ggdXNlciBwb3J0cyBzbyB1c2Vyc3BhY2VcXG4rXFx0ICogY2Fubm90IHJlb3BlbiB0aGVtIGR1cmluZyB0aGUgZmxhc2guIFRoZSBjb25kdWl0IGlzIG9ubHkgY2xvc2VkLFxcbitcXHQgKiBub3QgZGV0YWNoZWQ6IGl0IGJlbG9uZ3MgdG8gdGhlIE1BQyBkcml2ZXIuIFRoaXMgZHJpdmVyIGJpbmRzIGFcXG4rXFx0ICogc2luZ2xlIHN3aXRjaCB3aXRoIGEgZGlyZWN0IGhvc3QgbGluayBhbmQgbm8gY2FzY2FkZSBwb3J0cywgc28gdGhlXFxuK1xcdCAqIGNvbmR1aXQgc2VydmVzIG9ubHkgdGhpcyBzd2l0Y2gsIGFuZCBmbGFzaGluZyBpdCByZWJvb3RzIHRoZSBzd2l0Y2gsXFxuK1xcdCAqIHdoaWNoIHRha2VzIHRoZSB0cmVlIGRvd24gcmVnYXJkbGVzcy5cXG4rXFx0ICovXFxuK1xcdHJ0bmxfbG9jaygpO1xcbitcXHRkc2Ffc3dpdGNoX2Zvcl9lYWNoX3VzZXJfcG9ydChkcCwgZHMpIHtcXG4rXFx0XFx0aWYgKGRwLVxcdTAwM2V1c2VyKSB7XFxuK1xcdFxcdFxcdGRldl9jbG9zZShkcC1cXHUwMDNldXNlcik7XFxuK1xcdFxcdFxcdG5ldGlmX2RldmljZV9kZXRhY2goZHAtXFx1MDAzZXVzZXIpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0ZHNhX3N3aXRjaF9mb3JfZWFjaF9jcHVfcG9ydChkcCwgZHMpXFxuK1xcdFxcdGRldl9jbG9zZShkcC1cXHUwMDNlY29uZHVpdCk7XFxuK1xcdC8qIFRoZSBicmlkZ2UgZGVmZXJzIHRoZSBTVFAgc3RhdGUgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgY2xvc2luZ1xcbitcXHQgKiB0aGUgcG9ydHM7IGxldCB0aGVtIHJlYWNoIHRoZSBmaXJtd2FyZSB3aGlsZSBpdCBpcyBzdGlsbCBhbGl2ZS5cXG4rXFx0ICovXFxuK1xcdHN3aXRjaGRldl9kZWZlcnJlZF9wcm9jZXNzKCk7XFxuK1xcdHJ0bmxfdW5sb2NrKCk7XFxuK1xcbitcXHRtdXRleF9sb2NrX25lc3RlZChcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzLVxcdTAwM2VtZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTtcXG4rXFx0cHJpdi1cXHUwMDNlYmxvY2tfaG9zdCA9IHRydWU7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzLVxcdTAwM2VtZGlvX2xvY2spO1xcbitcXG4rXFx0c2V0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgXFx1MDAyNnByaXYtXFx1MDAzZWZsYWdzKTtcXG4rXFx0Y2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKFxcdTAwMjZwcml2LVxcdTAwM2VzdGF0c193b3JrKTtcXG4rXFx0Y2FuY2VsX3dvcmtfc3luYyhcXHUwMDI2cHJpdi1cXHUwMDNlY3JjX2Vycl93b3JrKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGRzLVxcdTAwM2VudW1fcG9ydHM7IGkrKylcXG4rXFx0XFx0Y2FuY2VsX3dvcmtfc3luYyhcXHUwMDI2cHJpdi1cXHUwMDNlcG9ydHNbaV0uaG9zdF9mbG9vZF93b3JrKTtcXG4rXFxuK1xcdHJldCA9IG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKHByaXYsIHBhcmFtcy1cXHUwMDNlZncsIHBheWxvYWRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgZHMtXFx1MDAzZWRldmxpbmspO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcXFwiZmlybXdhcmUgdHJhbnNmZXIgZmFpbGVkXFxcIik7XFxuK1xcbitcXHRpZiAoIXJldCkge1xcbitcXHRcXHRtdXRleF9sb2NrX25lc3RlZChcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzLVxcdTAwM2VtZGlvX2xvY2ssXFxuK1xcdFxcdFxcdFxcdCAgTURJT19NVVRFWF9ORVNURUQpO1xcbitcXHRcXHRwcml2LVxcdTAwM2VibG9ja19ob3N0ID0gZmFsc2U7XFxuK1xcdFxcdHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlID0gZmFsc2U7XFxuK1xcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzLVxcdTAwM2VtZGlvX2xvY2spO1xcbitcXG4rXFx0XFx0LyogUmVmcmVzaCB0aGUgY2FjaGVkIHZlcnNpb25zIHNvIHRoZSBmbGFzaCB1cGRhdGUgb25seVxcbitcXHRcXHQgKiBjb21wbGV0ZXMgb25jZSB0aGUgbmV3IGZpcm13YXJlIGlzIGNvbmZpcm1lZCBydW5uaW5nIGFuZFxcbitcXHRcXHQgKiBkZXZsaW5rIGRldiBpbmZvIHJlcG9ydHMgaXQuIE11c3QgaGFwcGVuIGJlZm9yZSBzZXR0aW5nXFxuK1xcdFxcdCAqIHNraXBfdGVhcmRvd24sIHdoaWNoIGRpc2NhcmRzIGFsbCBmaXJtd2FyZSBBUEkgcmVhZHMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjayxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgXFxcIm5ldyBmaXJtd2FyZSBkaWQgbm90IGJlY29tZSByZWFkeVxcXCIpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdC8qIFRoZSBzd2l0Y2ggaXMgaW4gTUNVYm9vdCB3aXRoIGVyYXNlZCBvciBwYXJ0bHkgd3JpdHRlbiBmbGFzaDtcXG4rXFx0XFx0ICogZHJvcCB0aGUgY2FjaGVkIGlkZW50aXR5IHNvIGRldmxpbmsgZGV2IGluZm8gc3RvcHMgcmVwb3J0aW5nXFxuK1xcdFxcdCAqIHRoZSBwcmUtZmxhc2ggdmVyc2lvbiB1bnRpbCB0aGUgcmVwcm9iZSByZS1yZWFkcyB0aGUgdHJ1dGguXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRtZW1zZXQoXFx1MDAyNnByaXYtXFx1MDAzZWZ3X3ZlcnNpb24sIDAsIHNpemVvZihwcml2LVxcdTAwM2Vmd192ZXJzaW9uKSk7XFxuK1xcdFxcdHByaXYtXFx1MDAzZWFzaWNfaWQgPSAwO1xcbitcXHRcXHRwcml2LVxcdTAwM2Vhc2ljX3JldiA9IDA7XFxuK1xcdH1cXG4rXFxuK1xcdG11dGV4X2xvY2tfbmVzdGVkKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VidXMtXFx1MDAzZW1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpO1xcbitcXHRwcml2LVxcdTAwM2Vza2lwX3RlYXJkb3duID0gdHJ1ZTtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwcml2LVxcdTAwM2VtZGlvZGV2LVxcdTAwM2VidXMtXFx1MDAzZW1kaW9fbG9jayk7XFxuK1xcbitcXHQvKiBSZWluaXRpYWxpc2UgdGhyb3VnaCBhIGRlZmVycmVkIHJlLXByb2JlOiByZW1vdmUoKSBydW5zIHdpdGhcXG4rXFx0ICogc2tpcF90ZWFyZG93biBzZXQsIHRoZW4gYSBmcmVzaCBwcm9iZSgpIHN0YXJ0cyBhZ2FpbnN0IHdoYXRldmVyXFxuK1xcdCAqIHRoZSBzd2l0Y2ggbm93IHJ1bnMuIFRoZSBjb3JlIHNraXBzIHRoZSByZS1wcm9iZSBpZiB0aGUgZGV2aWNlXFxuK1xcdCAqIGlzIHVuYm91bmQgb3Igc2h1dCBkb3duIGJlZm9yZSBpdCBmaXJlcy5cXG4rXFx0ICovXFxuK1xcdGVyciA9IGRldmljZV9zY2hlZHVsZV9yZXByb2JlKGRzLVxcdTAwM2VkZXYsIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVMpO1xcbitcXG4rXFx0cmV0dXJuIHJldCA/IHJldCA6IGVycjtcXG4rfVxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi43Y2Q4N2M3YWQ4NzE2XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5oXFxuQEAgLTAsMCArMSwyMCBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xcbitcXG4rI2lmbmRlZiBfX01YTDg2MlhYX0ZXX0hcXG4rI2RlZmluZSBfX01YTDg2MlhYX0ZXX0hcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NuZXQvZHNhLmhcXHUwMDNlXFxuK1xcbitzdHJ1Y3QgbXhsODYyeHhfcHJpdjtcXG4rc3RydWN0IHdvcmtfc3RydWN0O1xcbitcXG4raW50IG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdik7XFxuK3ZvaWQgbXhsODYyeHhfcmVzY3VlX2hlYWxfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspO1xcbitpbnQgbXhsODYyeHhfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsXFxuK1xcdFxcdFxcdCAgICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsXFxuK1xcdFxcdFxcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XFxuK2ludCBteGw4NjJ4eF9kZXZsaW5rX2ZsYXNoX3VwZGF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XFxuK1xcbisjZW5kaWYgLyogX19NWEw4NjJYWF9GV19IICovXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmMgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jXFxuaW5kZXggNGFjZDIxNmY3Y2MwMC4uNGRmN2M4MzgwOGY2MCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jXFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuY1xcbkBAIC0xNSw2ICsxNSw4IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC91bmFsaWduZWQuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY25ldC9kc2EuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFxcIm14bDg2Mnh4LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJteGw4NjJ4eC1jbWQuaFxcXCJcXG4rI2luY2x1ZGUgXFxcIm14bDg2Mnh4LWZ3LmhcXFwiXFxuICNpbmNsdWRlIFxcXCJteGw4NjJ4eC1ob3N0LmhcXFwiXFxuIFxcbiAjZGVmaW5lIENUUkxfQlVTWV9NQVNLXFx0XFx0XFx0QklUKDE1KVxcbkBAIC0zNDAsNiArMzQyLDIxIEBAIGludCBteGw4NjJ4eF9hcGlfd3JhcChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGNtZCwgdm9pZCAqX2RhdGEsXFxuIFxcbiBcXHRtdXRleF9sb2NrX25lc3RlZChcXHUwMDI2cHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzLVxcdTAwM2VtZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTtcXG4gXFxuK1xcdGlmIChwcml2LVxcdTAwM2Vza2lwX3RlYXJkb3duKSB7XFxuK1xcdFxcdHJldCA9IHJlYWQgPyAtRU5PREVWIDogMDtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChwcml2LVxcdTAwM2VyZXNjdWVfbW9kZSkge1xcbitcXHRcXHRyZXQgPSAtRU5PREVWO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHByaXYtXFx1MDAzZWJsb2NrX2hvc3QgXFx1MDAyNlxcdTAwMjYgY21kICE9IFNZU19NSVNDX0ZXX1VQREFURSkge1xcbitcXHRcXHRyZXQgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbiBcXHRtYXggPSAoc2l6ZSArIDEpIC8gMjtcXG4gXFxuIFxcdHJldCA9IG14bDg2Mnh4X2J1c3lfd2FpdChwcml2KTtcXG5AQCAtNDk1LDEyICs1MTIsNTQgQEAgaW50IG14bDg2Mnh4X3Jlc2V0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuIFxcbisjZGVmaW5lIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHXFx0XFx0MHgxZlxcbisjZGVmaW5lIE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTS1xcdDB4ZmZmMFxcbisjZGVmaW5lIE1YTDg2MlhYX1NNRElPX09GRl9NQVNLXFx0XFx0MHgwMDBmXFxuK1xcbisvKiBQYWdlZCBjbGF1c2UtMjIgd2luZG93OiB0aGUgcGFnZSBnb2VzIGludG8gTUlJIHJlZ2lzdGVyIDB4MWYsIHRoZSBsb3cgbmliYmxlXFxuKyAqIG9mIGFkZHIgc2VsZWN0cyBvbmUgb2YgdGhlIDE2IHJlZ2lzdGVycyB3aXRoaW4gaXQuIEJvdGggaGVscGVycyB0YWtlIHRoZSBNRElPXFxuKyAqIGJ1cyBsb2NrIHBlciB0cmFuc2FjdGlvbiwgc28gY2FsbGVycyBtdXN0IG5vdCBhbHJlYWR5IGhvbGQgaXQgLS0gdW5saWtlXFxuKyAqIG14bDg2Mnh4X2FwaV93cmFwKCksIHdoaWNoIGhvbGRzIGl0IGFjcm9zcyBhIHdob2xlIGZpcm13YXJlIGNvbW1hbmQuXFxuKyAqL1xcbitpbnQgbXhsODYyeHhfc21kaW9fcmVhZChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGFkZHIpXFxuK3tcXG4rXFx0c3RydWN0IG1paV9idXMgKmJ1cyA9IHByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWJ1cztcXG4rXFx0aW50IHBoeSA9IHByaXYtXFx1MDAzZW1kaW9kZXYtXFx1MDAzZWFkZHI7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRtdXRleF9sb2NrKFxcdTAwMjZidXMtXFx1MDAzZW1kaW9fbG9jayk7XFxuK1xcdHJldCA9IF9fbWRpb2J1c193cml0ZShidXMsIHBoeSwgTVhMODYyWFhfU01ESU9fQUREUl9SRUcsXFxuK1xcdFxcdFxcdCAgICAgIGFkZHIgXFx1MDAyNiBNWEw4NjJYWF9TTURJT19QQUdFX01BU0spO1xcbitcXHRpZiAocmV0IFxcdTAwM2U9IDApXFxuK1xcdFxcdHJldCA9IF9fbWRpb2J1c19yZWFkKGJ1cywgcGh5LCBhZGRyIFxcdTAwMjYgTVhMODYyWFhfU01ESU9fT0ZGX01BU0spO1xcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNmJ1cy1cXHUwMDNlbWRpb19sb2NrKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4raW50IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgYWRkciwgdTE2IHZhbClcXG4re1xcbitcXHRzdHJ1Y3QgbWlpX2J1cyAqYnVzID0gcHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYnVzO1xcbitcXHRpbnQgcGh5ID0gcHJpdi1cXHUwMDNlbWRpb2Rldi1cXHUwMDNlYWRkcjtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNmJ1cy1cXHUwMDNlbWRpb19sb2NrKTtcXG4rXFx0cmV0ID0gX19tZGlvYnVzX3dyaXRlKGJ1cywgcGh5LCBNWEw4NjJYWF9TTURJT19BRERSX1JFRyxcXG4rXFx0XFx0XFx0ICAgICAgYWRkciBcXHUwMDI2IE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTSyk7XFxuK1xcdGlmIChyZXQgXFx1MDAzZT0gMClcXG4rXFx0XFx0cmV0ID0gX19tZGlvYnVzX3dyaXRlKGJ1cywgcGh5LCBhZGRyIFxcdTAwMjYgTVhMODYyWFhfU01ESU9fT0ZGX01BU0ssXFxuK1xcdFxcdFxcdFxcdCAgICAgIHZhbCk7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2YnVzLVxcdTAwM2VtZGlvX2xvY2spO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbiB2b2lkIG14bDg2Mnh4X2hvc3RfaW5pdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcXG4ge1xcbiBcXHRJTklUX1dPUksoXFx1MDAyNnByaXYtXFx1MDAzZWNyY19lcnJfd29yaywgbXhsODYyeHhfY3JjX2Vycl93b3JrX2ZuKTtcXG4rXFx0SU5JVF9XT1JLKFxcdTAwMjZwcml2LVxcdTAwM2VyZXNjdWVfaGVhbF93b3JrLCBteGw4NjJ4eF9yZXNjdWVfaGVhbF93b3JrX2ZuKTtcXG4gfVxcbiBcXG4gdm9pZCBteGw4NjJ4eF9ob3N0X3NodXRkb3duKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxcbiB7XFxuIFxcdGNhbmNlbF93b3JrX3N5bmMoXFx1MDAyNnByaXYtXFx1MDAzZWNyY19lcnJfd29yayk7XFxuK1xcdGNhbmNlbF93b3JrX3N5bmMoXFx1MDAyNnByaXYtXFx1MDAzZXJlc2N1ZV9oZWFsX3dvcmspO1xcbiB9XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5oXFxuaW5kZXggNjZkNmFlMTk4YWZmNC4uNGUwNTRjNmU0YzBlNCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5oXFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaFxcbkBAIC0xOCw1ICsxOCw3IEBAIGludCBteGw4NjJ4eF9hcGlfd3JhcChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGNtZCwgdm9pZCAqZGF0YSwgdTE2IHNpemUsXFxuIFxcdG14bDg2Mnh4X2FwaV93cmFwKGRldiwgY21kLCBcXHUwMDI2KGRhdGEpLCBzaXplb2YoKGRhdGEpKSwgdHJ1ZSwgdHJ1ZSlcXG4gXFxuIGludCBteGw4NjJ4eF9yZXNldChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdik7XFxuK2ludCBteGw4NjJ4eF9zbWRpb19yZWFkKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MzIgYWRkcik7XFxuK2ludCBteGw4NjJ4eF9zbWRpb193cml0ZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHUxNiB2YWwpO1xcbiBcXG4gI2VuZGlmIC8qIF9fTVhMODYyWFhfSE9TVF9IICovXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1waHlsaW5rLmMgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jXFxuaW5kZXggYjY4OTY1MmFhOWI5Mi4uYTViNjk0MGI1NTJlOSAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jXFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LXBoeWxpbmsuY1xcbkBAIC00MDYsNiArNDA2LDggQEAgbXhsODYyeHhfcGh5bGlua19tYWNfc2VsZWN0X3BjcyhzdHJ1Y3QgcGh5bGlua19jb25maWcgKmNvbmZpZyxcXG4gXFxuIFxcdHN3aXRjaCAocG9ydCkge1xcbiBcXHRjYXNlIDkgLi4uIDE2OlxcbitcXHRcXHRpZiAocHJpdi1cXHUwMDNlcmVzY3VlX21vZGUpXFxuK1xcdFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXHRcXHRpZiAoIU1YTDg2MlhYX0ZXX1ZFUl9NSU4ocHJpdiwgMSwgMCwgODQpKSB7XFxuIFxcdFxcdFxcdGRldl93YXJuX29uY2UoZHAtXFx1MDAzZWRzLVxcdTAwM2VkZXYsXFxuIFxcdFxcdFxcdFxcdCAgICAgIFxcXCJTZXJEZXMgUENTIHVuc3VwcG9ydGVkIG9uIG9sZCBmaXJtd2FyZS5cXFxcblxcXCIpO1xcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguYyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5jXFxuaW5kZXggNDVkMjM3YjNhNDBmMS4uMGUxNzljYWU5N2YzOCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguY1xcbisrKyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5jXFxuQEAgLTIxLDYgKzIxLDcgQEBcXG4gI2luY2x1ZGUgXFxcIm14bDg2Mnh4LmhcXFwiXFxuICNpbmNsdWRlIFxcXCJteGw4NjJ4eC1hcGkuaFxcXCJcXG4gI2luY2x1ZGUgXFxcIm14bDg2Mnh4LWNtZC5oXFxcIlxcbisjaW5jbHVkZSBcXFwibXhsODYyeHgtZncuaFxcXCJcXG4gI2luY2x1ZGUgXFxcIm14bDg2Mnh4LWhvc3QuaFxcXCJcXG4gI2luY2x1ZGUgXFxcIm14bDg2Mnh4LXBoeWxpbmsuaFxcXCJcXG4gXFxuQEAgLTcxLDYgKzcyLDEzIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9ybW9uX2hpc3RfcmFuZ2UgbXhsODYyeHhfcm1vbl9yYW5nZXNbXSA9IHtcXG4gI2RlZmluZSBNWEw4NjJYWF9SRUFEWV9USU1FT1VUX01TXFx0MTAwMDBcXG4gI2RlZmluZSBNWEw4NjJYWF9SRUFEWV9QT0xMX01TXFx0XFx0MTAwXFxuIFxcbisvKiBDaGlwIElEIHJlZ2lzdGVycywgcmVhZCB2aWEgU1lTX01JU0NfUkVHX1JEICovXFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX0xcXHRcXHQweGMwZDI4ODg0XFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01cXHRcXHQweGMwZDI4ODg4XFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX0xfUE5VTUxcXHRcXHRHRU5NQVNLKDE1LCAxMilcXG4rI2RlZmluZSBNWEw4NjJYWF9DSElQSURfTV9QTlVNTVxcdFxcdEdFTk1BU0soMTEsIDApXFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01fVkVSU0lPTlxcdEdFTk1BU0soMTQsIDEyKVxcbitcXG4gI2RlZmluZSBNWEw4NjJYWF9UQ01fSU5TVF9TRUxcXHRcXHQweGUwMFxcbiAjZGVmaW5lIE1YTDg2MlhYX1RDTV9DQlNcXHRcXHQweGUxMlxcbiAjZGVmaW5lIE1YTDg2MlhYX1RDTV9FQlNcXHRcXHQweGUxM1xcbkBAIC0yMjIsNyArMjMwLDQ2IEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcGh5X3dyaXRlX2M0NV9taWlfYnVzKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLFxcbiBcXHRyZXR1cm4gbXhsODYyeHhfcGh5X3dyaXRlX21tZChidXMtXFx1MDAzZXByaXYsIGFkZHIsIGRldmFkZCwgcmVnbnVtLCB2YWwpO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKVxcbisvKiBSZWFkIHRoZSBzdGF0aWMgY2hpcCBwYXJ0IG51bWJlciBhbmQgdmVyc2lvbiBmcm9tIHRoZSBDSElQIElEXFxuKyAqIHJlZ2lzdGVycy4gT25seSBwb3NzaWJsZSB3aXRoIGEgcnVubmluZyBmaXJtd2FyZSwgc28gdGhlIHZhbHVlcyBhcmVcXG4rICogY2FjaGVkIGF0IHNldHVwIGFuZCBsZWZ0IHplcm8gd2hlbiB0aGUgc3dpdGNoIGlzIGluIHJlc2N1ZSBtb2RlLlxcbisgKi9cXG4rc3RhdGljIGludCBteGw4NjJ4eF9yZWFkX2NoaXBfaWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXFxuK3tcXG4rXFx0c3RydWN0IG14bDg2Mnh4X3N5c19yZWdfcncgcmVnID0ge307XFxuK1xcdHUxNiBjaGlwaWRfbCwgY2hpcGlkX207XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZWcuYWRkciA9IGNwdV90b19sZTMyKE1YTDg2MlhYX0NISVBJRF9MKTtcXG4rXFx0cmV0ID0gTVhMODYyWFhfQVBJX1JFQUQocHJpdiwgU1lTX01JU0NfUkVHX1JELCByZWcpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRjaGlwaWRfbCA9IGxlMzJfdG9fY3B1KHJlZy52YWwpO1xcbitcXG4rXFx0cmVnLmFkZHIgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9DSElQSURfTSk7XFxuK1xcdHJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIFNZU19NSVNDX1JFR19SRCwgcmVnKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0Y2hpcGlkX20gPSBsZTMyX3RvX2NwdShyZWcudmFsKTtcXG4rXFxuK1xcdHByaXYtXFx1MDAzZWFzaWNfaWQgPSBGSUVMRF9HRVQoTVhMODYyWFhfQ0hJUElEX0xfUE5VTUwsIGNoaXBpZF9sKSB8XFxuK1xcdFxcdFxcdEZJRUxEX0dFVChNWEw4NjJYWF9DSElQSURfTV9QTlVNTSwgY2hpcGlkX20pIFxcdTAwM2NcXHUwMDNjIDQ7XFxuK1xcdHByaXYtXFx1MDAzZWFzaWNfcmV2ID0gRklFTERfR0VUKE1YTDg2MlhYX0NISVBJRF9NX1ZFUlNJT04sIGNoaXBpZF9tKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKipcXG4rICogbXhsODYyeHhfd2FpdF9yZWFkeSAtIHdhaXQgZm9yIHRoZSBzd2l0Y2ggZmlybXdhcmUgdG8gYmVjb21lIG9wZXJhdGlvbmFsXFxuKyAqIEBkczogRFNBIHN3aXRjaCBpbnN0YW5jZVxcbisgKlxcbisgKiBQb2xsIHRoZSBmaXJtd2FyZSB1bnRpbCBpdCByZXBvcnRzIGl0cyB2ZXJzaW9uIGFuZCBhY2NlcHRzXFxuKyAqIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMsIHRoZW4gY2FjaGUgdGhlIGZpcm13YXJlIHZlcnNpb24gYW5kIGNoaXAgSUQuXFxuKyAqIFRha2VzIGF0IGxlYXN0IHR3byBzZWNvbmRzLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuXFxuKyAqL1xcbitpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpXFxuIHtcXG4gXFx0c3RydWN0IG14bDg2Mnh4X3N5c19md19pbWFnZV92ZXJzaW9uIHZlciA9IHt9O1xcbiBcXHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllcywgdGltZW91dDtcXG5AQCAtMjU0LDYgKzMwMSwxMSBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKVxcbiBcXHRcXHRwcml2LVxcdTAwM2Vmd192ZXJzaW9uLm1ham9yID0gdmVyLml2X21ham9yO1xcbiBcXHRcXHRwcml2LVxcdTAwM2Vmd192ZXJzaW9uLm1pbm9yID0gdmVyLml2X21pbm9yO1xcbiBcXHRcXHRwcml2LVxcdTAwM2Vmd192ZXJzaW9uLnJldmlzaW9uID0gbGUxNl90b19jcHUodmVyLml2X3JldmlzaW9uKTtcXG4rXFxuK1xcdFxcdHJldCA9IG14bDg2Mnh4X3JlYWRfY2hpcF9pZChwcml2KTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0ZGV2X3dhcm4oZHMtXFx1MDAzZWRldiwgXFxcImZhaWxlZCB0byByZWFkIGNoaXAgSUQ6ICVwZVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0IEVSUl9QVFIocmV0KSk7XFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4gbm90X3JlYWR5X3lldDpcXG5AQCAtNjIyLDIxICs2NzQsNjYgQEAgc3RhdGljIGludCBteGw4NjJ4eF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpXFxuIFxcdGludCBuX3VzZXJfcG9ydHMgPSAwLCBtYXhfdmxhbnM7XFxuIFxcdGludCBpbmdyZXNzX2ZpbmFscywgdmlkX3J1bGVzO1xcbiBcXHRzdHJ1Y3QgZHNhX3BvcnQgKmRwO1xcbi1cXHRpbnQgcmV0LCBpO1xcbi1cXG4tXFx0cmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7XFxuLVxcdGlmIChyZXQpXFxuLVxcdFxcdHJldHVybiByZXQ7XFxuLVxcbi1cXHRyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTtcXG4tXFx0aWYgKHJldClcXG4tXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0aW50IHJldCwgaSwgcmVzY3VlO1xcbiBcXG4rXFx0LyogVGhlIFNlckRlcyBzdGF0ZSBpcyBzb2Z0d2FyZS1vbmx5IGFuZCBtdXN0IGV4aXN0IGJlZm9yZSBhbnl0aGluZyBjYW5cXG4rXFx0ICogcmVhY2ggcGh5bGluaywgaW5jbHVkaW5nIGEgcmVzY3VlLW1vZGUgZmxhc2ggY2xlYXJpbmcgcmVzY3VlX21vZGVcXG4rXFx0ICogYWhlYWQgb2YgdGhlIHJlcHJvYmUuXFxuK1xcdCAqL1xcbiBcXHRtdXRleF9pbml0KFxcdTAwMjZwcml2LVxcdTAwM2VzZXJkZXNfbG9jayk7XFxuIFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKHByaXYtXFx1MDAzZXNlcmRlc19wb3J0cyk7IGkrKylcXG4gXFx0XFx0bXhsODYyeHhfc2V0dXBfcGNzKHByaXYsIFxcdTAwMjZwcml2LVxcdTAwM2VzZXJkZXNfcG9ydHNbaV0sXFxuIFxcdFxcdFxcdFxcdCAgIGkgKyBNWEw4NjJYWF9GSVJTVF9TRVJERVNfUE9SVCk7XFxuIFxcbitcXHQvKiBEZXRlY3QgdGhlIGxvYWRlciBvdmVyIFNCIFBESSBmaXJzdDogaXQgbmVlZHMgbm8gZmlybXdhcmUsIHVubGlrZSB0aGVcXG4rXFx0ICogQzQ1IEFQSSAobXhsODYyeHhfcmVzZXQvd2FpdF9yZWFkeSkgd2hpY2ggc3Bld3MgQ1JDIGVycm9ycyB3aGVuIG5vbmVcXG4rXFx0ICogYW5zd2Vycy4gVG91Y2ggQzQ1IG9ubHkgb25jZSByZXNjdWUgaXMgcnVsZWQgb3V0LlxcbitcXHQgKi9cXG4rXFx0cmVzY3VlID0gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHByaXYpO1xcbitcXHRpZiAocmVzY3VlIFxcdTAwM2MgMCkge1xcbitcXHRcXHRkZXZfZXJyKGRzLVxcdTAwM2VkZXYsIFxcXCJzd2l0Y2ggc3RhdGUgZGV0ZWN0aW9uIGZhaWxlZDogJXBlXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRFUlJfUFRSKHJlc2N1ZSkpO1xcbitcXHRcXHRyZXR1cm4gcmVzY3VlO1xcbitcXHR9XFxuK1xcbitcXHRpZiAocmVzY3VlID09IE1YTDg2MlhYX05PVF9SRVNDVUUpIHtcXG4rXFx0XFx0cmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRcXHRyZXQgPSBteGw4NjJ4eF93YWl0X3JlYWR5KGRzKTtcXG4rXFx0XFx0aWYgKHJldCkge1xcbitcXHRcXHRcXHQvKiB0aGUgcmVzZXQgbWF5IG9ubHkgbm93IGhhdmUgdHJpZ2dlcmVkIHJlc2N1ZSBtb2RlICovXFxuK1xcdFxcdFxcdHJlc2N1ZSA9IG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdChwcml2KTtcXG4rXFx0XFx0XFx0aWYgKHJlc2N1ZSBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0XFx0ZGV2X2Vycihkcy1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHRcXHRcXHRcXFwic3dpdGNoIG5vdCByZXNwb25kaW5nIGFmdGVyIHJlc2V0OiAlcGVcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdEVSUl9QVFIocmVzY3VlKSk7XFxuK1xcdFxcdFxcdFxcdHJldHVybiByZXNjdWU7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0aWYgKHJlc2N1ZSA9PSBNWEw4NjJYWF9OT1RfUkVTQ1VFKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlID0gcmVzY3VlO1xcbitcXG4rXFx0aWYgKHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlKSB7XFxuK1xcdFxcdGlmIChwcml2LVxcdTAwM2VyZXNjdWVfcmVhZHkpIHtcXG4rXFx0XFx0XFx0ZGV2X3dhcm4oZHMtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFx0IFxcXCJzd2l0Y2ggaW4gTUNVYm9vdCByZXNjdWUgbW9kZSwgdXNlIGRldmxpbmsgdG8gZmxhc2ggbmV3IGZpcm13YXJlXFxcXG5cXFwiKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0LyogRHJhaW4gdGhlIHdlZGdlZCBkb3dubG9hZCBpbiB0aGUgYmFja2dyb3VuZCBzbyBpdFxcbitcXHRcXHRcXHQgKiBuZXZlciBob2xkcyB0aGUgZGV2bGluayBsb2NrOyBpbmZvIGFuZCBmbGFzaCBiZWNvbWVcXG4rXFx0XFx0XFx0ICogYXZhaWxhYmxlIG9uY2UgcmVhZHkuXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRkZXZfd2Fybihkcy1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHRcXHQgXFxcInN3aXRjaCBpbiBNQ1Vib290IHdpdGggYW4gaW50ZXJydXB0ZWQgZG93bmxvYWQsIHJlY292ZXJpbmcgaW4gYmFja2dyb3VuZFxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHF1ZXVlX3dvcmsoc3lzdGVtX2xvbmdfd3EsIFxcdTAwMjZwcml2LVxcdTAwM2VyZXNjdWVfaGVhbF93b3JrKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4gXFx0LyogQ2FsY3VsYXRlIEV4dGVuZGVkIFZMQU4gYmxvY2sgc2l6ZXMuXFxuIFxcdCAqIFdpdGggVkxBTiBGaWx0ZXIgaGFuZGxpbmcgVklEIG1lbWJlcnNoaXAgY2hlY2tzOlxcbiBcXHQgKiAgIEluZ3Jlc3M6IG9ubHkgZmluYWwgY2F0Y2hhbGwgcnVsZXMgKFBWSUQgaW5zZXJ0aW9uLCA4MDIuMVFcXG5AQCAtNzE1LDExICs4MTIsMjEgQEAgc3RhdGljIGludCBteGw4NjJ4eF9wb3J0X3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGJvb2wgZW5hYmxlKVxcbiBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfZW5hYmxlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsXFxuIFxcdFxcdFxcdFxcdHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpXFxuIHtcXG4rXFx0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cXHUwMDNlcHJpdjtcXG4rXFxuK1xcdGlmIChwcml2LVxcdTAwM2VyZXNjdWVfbW9kZSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbiBcXHRyZXR1cm4gbXhsODYyeHhfcG9ydF9zdGF0ZShkcywgcG9ydCwgdHJ1ZSk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3BvcnRfZGlzYWJsZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KVxcbiB7XFxuK1xcdHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID0gZHMtXFx1MDAzZXByaXY7XFxuK1xcbitcXHRpZiAocHJpdi1cXHUwMDNlcmVzY3VlX21vZGUpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuIFxcdGlmIChteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSkpXFxuIFxcdFxcdGRldl9lcnIoZHMtXFx1MDAzZWRldiwgXFxcImZhaWxlZCB0byBkaXNhYmxlIHBvcnQgJWRcXFxcblxcXCIsIHBvcnQpO1xcbiB9XFxuQEAgLTEzMzcsNiArMTQ0NCwxNyBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcXG4gXFx0Ym9vbCBpc19jcHVfcG9ydCA9IGRzYV9wb3J0X2lzX2NwdShkcCk7XFxuIFxcdGludCByZXQ7XFxuIFxcbitcXHRpZiAoZHNhX3BvcnRfaXNfZHNhKGRwKSkge1xcbitcXHRcXHRkZXZfZXJyKGRzLVxcdTAwM2VkZXYsIFxcXCJwb3J0ICVkOiBEU0EgbGlua3Mgbm90IHN1cHBvcnRlZFxcXFxuXFxcIiwgcG9ydCk7XFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFx0fVxcbitcXG4rXFx0LyogRFNBIHJlaW5pdHMgZmFpbGVkIHVzZXIgcG9ydHMgYXMgdW51c2VkOyBzaGFyZWQgcG9ydHMgbXVzdFxcbitcXHQgKiBzdWNjZWVkIGZvciB0aGUgdHJlZSB0byByZWdpc3Rlci5cXG4rXFx0ICovXFxuK1xcdGlmIChwcml2LVxcdTAwM2VyZXNjdWVfbW9kZSlcXG4rXFx0XFx0cmV0dXJuIGRzYV9wb3J0X2lzX3VzZXIoZHApID8gLUVOT0RFViA6IDA7XFxuK1xcbiBcXHRyZXQgPSBteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuQEAgLTEzNDYsMTEgKzE0NjQsNiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcXG4gXFx0aWYgKGRzYV9wb3J0X2lzX3VudXNlZChkcCkpXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0aWYgKGRzYV9wb3J0X2lzX2RzYShkcCkpIHtcXG4tXFx0XFx0ZGV2X2Vycihkcy1cXHUwMDNlZGV2LCBcXFwicG9ydCAlZDogRFNBIGxpbmtzIG5vdCBzdXBwb3J0ZWRcXFxcblxcXCIsIHBvcnQpO1xcbi1cXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuLVxcdH1cXG4tXFxuIFxcdHJldCA9IG14bDg2Mnh4X2NvbmZpZ3VyZV9zcF90YWdfcHJvdG8oZHMsIHBvcnQsIGlzX2NwdV9wb3J0KTtcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG5AQCAtMTU3Miw2ICsxNjg1LDEyIEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcG9ydF9tZGJfZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsXFxuIFxcdGV0aGVyX2FkZHJfY29weShxcGFyYW0ubWFjLCBtZGItXFx1MDAzZWFkZHIpO1xcbiBcXG4gXFx0cmV0ID0gTVhMODYyWFhfQVBJX1JFQUQocHJpdiwgTVhMODYyWFhfTUFDX1RBQkxFRU5UUllRVUVSWSwgcXBhcmFtKTtcXG4rXFx0LyogUG9zdC1mbGFzaCB0ZWFyZG93biBvciBNQ1Vib290OiB0aGUgZmlybXdhcmUgYW5kIGl0cyBNQUMgdGFibGUgYXJlXFxuK1xcdCAqIGdvbmUsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkZWxldGUuIE91dHNpZGUgdGhvc2UsIC1FTk9ERVYgaXMgYVxcbitcXHQgKiBidXMgZXJyb3IgYW5kIG11c3QgYmUgcmVwb3J0ZWQuXFxuK1xcdCAqL1xcbitcXHRpZiAocmV0ID09IC1FTk9ERVYgXFx1MDAyNlxcdTAwMjYgKHByaXYtXFx1MDAzZXNraXBfdGVhcmRvd24gfHwgcHJpdi1cXHUwMDNlcmVzY3VlX21vZGUpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuQEAgLTE2MjgsNiArMTc0Nyw5IEBAIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3BvcnRfc3RwX3N0YXRlX3NldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LFxcbiBcXHRzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLVxcdTAwM2Vwcml2O1xcbiBcXHRpbnQgcmV0O1xcbiBcXG4rXFx0aWYgKHByaXYtXFx1MDAzZXJlc2N1ZV9tb2RlKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbiBcXHRzd2l0Y2ggKHN0YXRlKSB7XFxuIFxcdGNhc2UgQlJfU1RBVEVfRElTQUJMRUQ6XFxuIFxcdFxcdHBhcmFtLnBvcnRfc3RhdGUgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9TVFBfUE9SVF9TVEFURV9ESVNBQkxFKTtcXG5AQCAtMjAxNSw2ICsyMTM3LDEyIEBAIHN0YXRpYyB2b2lkIG14bDg2Mnh4X3N0YXRzX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbiBcXHRzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwcml2LVxcdTAwM2VkcztcXG4gXFx0c3RydWN0IGRzYV9wb3J0ICpkcDtcXG4gXFxuK1xcdC8qIEEgZ2V0X3N0YXRzNjQoKSByZS1hcm0gY2FuIHJhY2UgdGhlIGZsYXNoIHRlYXJkb3duJ3MgV09SS19TVE9QUEVEXFxuK1xcdCAqIHNldCBhbmQgY2FuY2VsOyBiYWlsIGhlcmUgc28gYSBzdHJheSBwb2xsIG5ldmVyIHJ1bnMgZHVyaW5nIGEgZmxhc2guXFxuK1xcdCAqL1xcbitcXHRpZiAodGVzdF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFxcdTAwMjZwcml2LVxcdTAwM2VmbGFncykpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuIFxcdGRzYV9zd2l0Y2hfZm9yX2VhY2hfYXZhaWxhYmxlX3BvcnQoZHAsIGRzKVxcbiBcXHRcXHRteGw4NjJ4eF9zdGF0c19wb2xsKGRzLCBkcC1cXHUwMDNlaW5kZXgpO1xcbiBcXG5AQCAtMjA4Niw2ICsyMjE0LDggQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkc2Ffc3dpdGNoX29wcyBteGw4NjJ4eF9zd2l0Y2hfb3BzID0ge1xcbiBcXHQuZ2V0X3BhdXNlX3N0YXRzID0gbXhsODYyeHhfZ2V0X3BhdXNlX3N0YXRzLFxcbiBcXHQuZ2V0X3Jtb25fc3RhdHMgPSBteGw4NjJ4eF9nZXRfcm1vbl9zdGF0cyxcXG4gXFx0LmdldF9zdGF0czY0ID0gbXhsODYyeHhfZ2V0X3N0YXRzNjQsXFxuK1xcdC5kZXZsaW5rX2luZm9fZ2V0ID0gbXhsODYyeHhfZGV2bGlua19pbmZvX2dldCxcXG4rXFx0LmRldmxpbmtfZmxhc2hfdXBkYXRlID0gbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUsXFxuIH07XFxuIFxcbiBzdGF0aWMgaW50IG14bDg2Mnh4X3Byb2JlKHN0cnVjdCBtZGlvX2RldmljZSAqbWRpb2RldilcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaFxcbmluZGV4IDQzMmE1ZjNmMmUwOGUuLjk5MWIyNGFhOTVhZmQgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmhcXG4rKysgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaFxcbkBAIC00LDcgKzQsOSBAQFxcbiAjZGVmaW5lIF9fTVhMODYyWFhfSFxcbiBcXG4gI2luY2x1ZGUgXFx1MDAzY2FzbS9ieXRlb3JkZXIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpdG9wcy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbXV0ZXguaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3dvcmtxdWV1ZS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbmV0L2RzYS5oXFx1MDAzZVxcbiBcXG5AQCAtMTQsNiArMTYsMTAgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXY7XFxuICNkZWZpbmUgTVhMODYyWFhfRklSU1RfU0VSREVTX1BPUlRcXHQ5XFxuICNkZWZpbmUgTVhMODYyWFhfU0VSREVTX1NMT1RTXFx0XFx0NFxcbiBcXG4rLyogbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KCkgcmV0dXJuIGNvZGVzIChuZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9ycykgKi9cXG4rI2RlZmluZSBNWEw4NjJYWF9OT1RfUkVTQ1VFXFx0XFx0MFxcbisjZGVmaW5lIE1YTDg2MlhYX0lOX1JFU0NVRVxcdFxcdDFcXG4rXFxuICNkZWZpbmUgTVhMODYyWFhfREVGQVVMVF9CUklER0VcXHRcXHQwXFxuICNkZWZpbmUgTVhMODYyWFhfTUFYX0JSSURHRVNcXHRcXHQ0OFxcbiAjZGVmaW5lIE1YTDg2MlhYX01BWF9CUklER0VfUE9SVFNcXHQxMjhcXG5AQCAtMzAzLDYgKzMwOSwxMCBAQCBzdHJ1Y3QgbXhsODYyeHhfZndfdmVyc2lvbiB7XFxuICAqICAgICAgICAgICAgICAgICAgICAgIGZsb29kaW5nKVxcbiAgKiBAZndfdmVyc2lvbjogICAgICAgICBjYWNoZWQgZmlybXdhcmUgdmVyc2lvbiwgcG9wdWxhdGVkIGF0IHByb2JlIGFuZFxcbiAgKiAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZCB3aXRoIE1YTDg2MlhYX0ZXX1ZFUl9NSU4oKVxcbisgKiBAYXNpY19pZDogICAgICAgICAgICBjaGlwIHBhcnQgbnVtYmVyIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMsXFxuKyAqICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGFzIHRoZSBkZXZsaW5rIFxcXCJhc2ljLmlkXFxcIiBmaXhlZCB2ZXJzaW9uXFxuKyAqIEBhc2ljX3JldjogICAgICAgICAgIGNoaXAgdmVyc2lvbiByZWFkIGZyb20gdGhlIENISVAgSUQgcmVnaXN0ZXJzLFxcbisgKiAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBhcyB0aGUgZGV2bGluayBcXFwiYXNpYy5yZXZcXFwiIGZpeGVkIHZlcnNpb25cXG4gICogQHNlcmRlc19wb3J0czogICAgICAgU2VyRGVzIGludGVyZmFjZXMgaW5jbC4gc3ViLWludGVyZmFjZXMgaW4gY2FzZSBvZlxcbiAgKiAgICAgICAgICAgICAgICAgICAgICAxMEdfUVhHTUlJIG9yIFFTR01JSVxcbiAgKiBAc2VyZGVzX3JlZmNvdW50OiAgICBwZXItWFBDUyBjb3VudCBvZiBzdWItcG9ydHMgZW5hYmxlZCBieSBwaHlsaW5rO1xcbkBAIC0zMTksNiArMzI5LDIwIEBAIHN0cnVjdCBteGw4NjJ4eF9md192ZXJzaW9uIHtcXG4gICogQGV2bGFuX2luZ3Jlc3Nfc2l6ZTogcGVyLXBvcnQgaW5ncmVzcyBFeHRlbmRlZCBWTEFOIGJsb2NrIHNpemVcXG4gICogQGV2bGFuX2VncmVzc19zaXplOiAgcGVyLXBvcnQgZWdyZXNzIEV4dGVuZGVkIFZMQU4gYmxvY2sgc2l6ZVxcbiAgKiBAdmZfYmxvY2tfc2l6ZTogICAgICBwZXItcG9ydCBWTEFOIEZpbHRlciBibG9jayBzaXplXFxuKyAqIEBibG9ja19ob3N0OiAgICAgICAgIHJlamVjdCBmaXJtd2FyZSBBUEkgY29tbWFuZHMgKGV4Y2VwdCBGV19VUERBVEUpXFxuKyAqICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyBhIGZpcm13YXJlIGZsYXNoXFxuKyAqIEBza2lwX3RlYXJkb3duOiAgICAgIGRpc2NhcmQgZmlybXdhcmUgQVBJIGNvbW1hbmRzIGR1cmluZyB0aGUgdGVhcmRvd25cXG4rICogICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkIGJ5IHRoZSBwb3N0LWZsYXNoIHJlcHJvYmVcXG4rICogQHJlc2N1ZV9tb2RlOiAgICAgICAgc3dpdGNoIGlzIGluIE1DVWJvb3Q7IGZpcm13YXJlIEFQSSBjb21tYW5kcyBmYWlsIGZhc3QsXFxuKyAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgY2xhdXNlLTIyIFNNRElPIHdvcmtzLiBTZXQgZnJvbSBzZXR1cCgpIGJlZm9yZSB0aGVcXG4rICogICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIGlzIHJlZ2lzdGVyZWQgYW5kIGNsZWFyZWQgdW5kZXIgdGhlIE1ESU8gYnVzIGxvY2tcXG4rICogICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBiZW5lZml0IG9mIG14bDg2Mnh4X2FwaV93cmFwKCk7IG90aGVyIHJlYWRlcnNcXG4rICogICAgICAgICAgICAgICAgICAgICAgb25seSBuZWVkIGl0IHRvIGJlIGEgc3RhYmxlIHNpbmdsZSBmbGFnLlxcbisgKiBAcmVzY3VlX3JlYWR5OiAgICAgICAocmVzY3VlX21vZGUpIGxvYWRlciBpcyBhdCBhIGNsZWFuIFJFQURZIGFuZCB3aWxsIGFjY2VwdFxcbisgKiAgICAgICAgICAgICAgICAgICAgICBhIGZsYXNoOyBmYWxzZSB3aGlsZSByZXNjdWVfaGVhbF93b3JrIGlzIGRyYWluaW5nXFxuKyAqIEByZXNjdWVfZmFpbGVkOiAgICAgIChyZXNjdWVfbW9kZSkgdGhlIHNlbGYtaGVhbCBnYXZlIHVwOyB0aGUgbG9hZGVyIG5lZWRzIGFcXG4rICogICAgICAgICAgICAgICAgICAgICAgcG93ZXIgY3ljbGUgYW5kIG5vIGZsYXNoIGNhbiBiZSBhY2NlcHRlZFxcbisgKiBAcmVzY3VlX2hlYWxfd29yazogICBiYWNrZ3JvdW5kIHNlbGYtaGVhbCBkcmFpbmluZyBhIHdlZGdlZCBkb3dubG9hZCB0byBSRUFEWVxcbiAgKiBAc3RhdHNfd29yazogICAgICAgICBwZXJpb2RpYyB3b3JrIGl0ZW0gdGhhdCBwb2xscyBSTU9OIGhhcmR3YXJlIGNvdW50ZXJzXFxuICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBhY2N1bXVsYXRlcyB0aGVtIGludG8gNjQtYml0IHBlci1wb3J0IHN0YXRzXFxuICAqL1xcbkBAIC0zMjYsOSArMzUwLDEyIEBAIHN0cnVjdCBteGw4NjJ4eF9wcml2IHtcXG4gXFx0c3RydWN0IGRzYV9zd2l0Y2ggKmRzO1xcbiBcXHRzdHJ1Y3QgbWRpb19kZXZpY2UgKm1kaW9kZXY7XFxuIFxcdHN0cnVjdCB3b3JrX3N0cnVjdCBjcmNfZXJyX3dvcms7XFxuK1xcdHN0cnVjdCB3b3JrX3N0cnVjdCByZXNjdWVfaGVhbF93b3JrO1xcbiBcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbiBcXHR1MTYgZHJvcF9tZXRlcjtcXG4gXFx0c3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24gZndfdmVyc2lvbjtcXG4rXFx0dTE2IGFzaWNfaWQ7XFxuK1xcdHU4IGFzaWNfcmV2O1xcbiBcXHRzdHJ1Y3QgbXhsODYyeHhfcGNzIHNlcmRlc19wb3J0c1s4XTtcXG4gXFx0aW50IHNlcmRlc19yZWZjb3VudFsyXTtcXG4gXFx0c3RydWN0IG11dGV4IHNlcmRlc19sb2NrO1xcbkBAIC0zMzcsNyArMzY0LDE0IEBAIHN0cnVjdCBteGw4NjJ4eF9wcml2IHtcXG4gXFx0dTE2IGV2bGFuX2luZ3Jlc3Nfc2l6ZTtcXG4gXFx0dTE2IGV2bGFuX2VncmVzc19zaXplO1xcbiBcXHR1MTYgdmZfYmxvY2tfc2l6ZTtcXG4rXFx0Ym9vbCBibG9ja19ob3N0O1xcbitcXHRib29sIHNraXBfdGVhcmRvd247XFxuK1xcdGJvb2wgcmVzY3VlX21vZGU7XFxuK1xcdGJvb2wgcmVzY3VlX3JlYWR5O1xcbitcXHRib29sIHJlc2N1ZV9mYWlsZWQ7XFxuIFxcdHN0cnVjdCBkZWxheWVkX3dvcmsgc3RhdHNfd29yaztcXG4gfTtcXG4gXFxuK2ludCBteGw4NjJ4eF93YWl0X3JlYWR5KHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7XFxuK1xcbiAjZW5kaWYgLyogX19NWEw4NjJYWF9IICovXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oXFxuaW5kZXggYWVlNzlmZDZiMzJiNC4uN2E5OTE2OTUwNTc3MiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaFxcbkBAIC0xMzE0LDYgKzEzMTQsOCBAQCBpbnQgIF9fbXVzdF9jaGVjayBkZXZpY2VfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldik7XFxuIGludCBfX211c3RfY2hlY2sgZHJpdmVyX2F0dGFjaChjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KTtcXG4gdm9pZCBkZXZpY2VfaW5pdGlhbF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpO1xcbiBpbnQgX19tdXN0X2NoZWNrIGRldmljZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7XFxuK2ludCBfX211c3RfY2hlY2sgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LFxcbitcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgaW50IGRlbGF5X21zKTtcXG4gXFxuIGJvb2wgZGV2aWNlX2lzX2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldik7XFxuIFxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc2EuaCBiL2luY2x1ZGUvbmV0L2RzYS5oXFxuaW5kZXggNmY3ZjVjMTdiNTMyMC4uNTg1OTdiMTRlNTkyYSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL25ldC9kc2EuaFxcbisrKyBiL2luY2x1ZGUvbmV0L2RzYS5oXFxuQEAgLTExNzIsNiArMTE3Miw5IEBAIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyB7XFxuIFxcdGludFxcdCgqZGV2bGlua19pbmZvX2dldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxcbiBcXHRcXHRcXHRcXHQgICAgc3RydWN0IGRldmxpbmtfaW5mb19yZXEgKnJlcSxcXG4gXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XFxuK1xcdGludFxcdCgqZGV2bGlua19mbGFzaF91cGRhdGUpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcXG4rXFx0XFx0XFx0XFx0XFx0c3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLFxcbitcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spO1xcbiBcXHRpbnRcXHQoKmRldmxpbmtfc2JfcG9vbF9nZXQpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyxcXG4gXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGludCBzYl9pbmRleCwgdTE2IHBvb2xfaW5kZXgsXFxuIFxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZGV2bGlua19zYl9wb29sX2luZm8gKnBvb2xfaW5mbyk7XFxuZGlmZiAtLWdpdCBhL25ldC9kc2EvZGV2bGluay5jIGIvbmV0L2RzYS9kZXZsaW5rLmNcXG5pbmRleCBlZDM0MmYzNDU2OTJiLi4yNTMxMWE4N2NiYzU2IDEwMDY0NFxcbi0tLSBhL25ldC9kc2EvZGV2bGluay5jXFxuKysrIGIvbmV0L2RzYS9kZXZsaW5rLmNcXG5AQCAtMjAsNiArMjAsMTggQEAgc3RhdGljIGludCBkc2FfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZGV2bGluayAqZGwsXFxuIFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gfVxcbiBcXG4rc3RhdGljIGludCBkc2FfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRldmxpbmsgKmRsLFxcbitcXHRcXHRcXHRcXHQgICAgc3RydWN0IGRldmxpbmtfZmxhc2hfdXBkYXRlX3BhcmFtcyAqcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxcbit7XFxuK1xcdHN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRzYV9kZXZsaW5rX3RvX2RzKGRsKTtcXG4rXFxuK1xcdGlmICghZHMtXFx1MDAzZW9wcy1cXHUwMDNlZGV2bGlua19mbGFzaF91cGRhdGUpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuK1xcdHJldHVybiBkcy1cXHUwMDNlb3BzLVxcdTAwM2VkZXZsaW5rX2ZsYXNoX3VwZGF0ZShkcywgcGFyYW1zLCBleHRhY2spO1xcbit9XFxuK1xcbiBzdGF0aWMgaW50IGRzYV9kZXZsaW5rX3NiX3Bvb2xfZ2V0KHN0cnVjdCBkZXZsaW5rICpkbCxcXG4gXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgaW50IHNiX2luZGV4LCB1MTYgcG9vbF9pbmRleCxcXG4gXFx0XFx0XFx0XFx0ICAgc3RydWN0IGRldmxpbmtfc2JfcG9vbF9pbmZvICpwb29sX2luZm8pXFxuQEAgLTE2OSw2ICsxODEsNyBAQCBkc2FfZGV2bGlua19zYl9vY2NfdGNfcG9ydF9iaW5kX2dldChzdHJ1Y3QgZGV2bGlua19wb3J0ICpkbHAsXFxuIFxcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldmxpbmtfb3BzIGRzYV9kZXZsaW5rX29wcyA9IHtcXG4gXFx0LmluZm9fZ2V0XFx0XFx0XFx0PSBkc2FfZGV2bGlua19pbmZvX2dldCxcXG4rXFx0LmZsYXNoX3VwZGF0ZVxcdFxcdFxcdD0gZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlLFxcbiBcXHQuc2JfcG9vbF9nZXRcXHRcXHRcXHQ9IGRzYV9kZXZsaW5rX3NiX3Bvb2xfZ2V0LFxcbiBcXHQuc2JfcG9vbF9zZXRcXHRcXHRcXHQ9IGRzYV9kZXZsaW5rX3NiX3Bvb2xfc2V0LFxcbiBcXHQuc2JfcG9ydF9wb29sX2dldFxcdFxcdD0gZHNhX2Rldmxpbmtfc2JfcG9ydF9wb29sX2dldCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMDY6NTA6NDQuOTYxMjY4ODQzWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MzUwMzQwNDU1NTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgZmlybXdhcmUgZmxhc2ggc3VwcG9ydCBmb3IgdGhlIE1heExpbmVhciBNeEw4NjJ4eCBEU0Egc3dpdGNoIHZpYSBkZXZsaW5rLCBhbG9uZyB3aXRoIGEgbmV3IGNvcmUgZHJpdmVyIG1vZGVsIGZ1bmN0aW9uIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAuIFRoZSBgbXhsODYyeHhgIGRyaXZlciByZXF1aXJlcyBwaHlzaWNhbCBoYXJkd2FyZSBjb25uZWN0ZWQgdmlhIE1ESU8gdG8gcHJvYmUgc3VjY2Vzc2Z1bGx5IGFuZCBpcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4gVGhlIG5ldyBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIEFQSSBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IHRoaXMgdW5yZWFjaGFibGUgZHJpdmVyLiBUaGUgYWRkaXRpb25zIHRvIHRoZSBEU0EgZGV2bGluayBjb3JlIGFyZSB0cml2aWFsIHdyYXBwZXJzIHRoYXQgcmV0dXJuIGAtRU9QTk9UU1VQUGAgZm9yIGFsbCBvdGhlciBzd2l0Y2hlcy4gVGhlIG1vZGlmaWNhdGlvbiB0byBgZGV2aWNlX3NodXRkb3duYCBtZXJlbHkgc2V0cyBhIGJvb2xlYW4gZmxhZyBkdXJpbmcgc3lzdGVtIHRlYXJkb3duLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudCwgcmVhY2hhYmxlIGNvZGUgdG8gZnV6ei5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDI5YjAxMTZlMDU1OWNjY2ExNDhhZTY5YTBhYWQ2Mjc0MjYxZTNiZDNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IEF1ZyAxNSAwNjo1MDo0MyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdFxuaW5kZXggNDc0NTE0OGZlY2Y0Zi4uMDU4OTk5ZDBkYzU2ZiAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL2luZGV4LnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RldmxpbmsvaW5kZXgucnN0XG5AQCAtOTQsNiArOTQsNyBAQCBwYXJhbWV0ZXJzLCBpbmZvIHZlcnNpb25zLCBhbmQgb3RoZXIgZmVhdHVyZXMgaXQgc3VwcG9ydHMuXG4gICAgbWx4NVxuICAgIG1seHN3XG4gICAgbXY4OGU2eHh4XG4rICAgbXhsODYyeHhcbiAgICBuZXRkZXZzaW1cbiAgICBuZnBcbiAgICBvY3Rlb250eDJcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3QgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3Rcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi41YjI0ZDhjYjU3YmM5XG4tLS0gL2Rldi9udWxsXG4rKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGV2bGluay9teGw4NjJ4eC5yc3RcbkBAIC0wLDAgKzEsNzQgQEBcbisuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKz09PT09PT09PT09PT09PT09PT09PT09PVxuK214bDg2Mnh4IGRldmxpbmsgc3VwcG9ydFxuKz09PT09PT09PT09PT09PT09PT09PT09PVxuK1xuK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBkZXZsaW5rIGZlYXR1cmVzIGltcGxlbWVudGVkIGJ5IHRoZVxuK2BgbXhsODYyeHhgYCBkZXZpY2UgZHJpdmVyLlxuK1xuK0luZm8gdmVyc2lvbnNcbis9PT09PT09PT09PT09XG4rXG4rVGhlIGBgbXhsODYyeHhgYCBkcml2ZXIgcmVwb3J0cyB0aGUgZm9sbG93aW5nIHZlcnNpb25zXG4rXG4rLi4gbGlzdC10YWJsZTo6IGRldmxpbmsgaW5mbyB2ZXJzaW9ucyBpbXBsZW1lbnRlZFxuKyAgIDp3aWR0aHM6IDUgNSA1IDg1XG4rXG4rICAgKiAtIE5hbWVcbisgICAgIC0gVHlwZVxuKyAgICAgLSBFeGFtcGxlXG4rICAgICAtIERlc2NyaXB0aW9uXG4rICAgKiAtIGBgYXNpYy5pZGBgXG4rICAgICAtIGZpeGVkXG4rICAgICAtIDg2MjhcbisgICAgIC0gVGhlIGNoaXAgcGFydCBudW1iZXIgcmVhZCBmcm9tIHRoZSBDSElQIElEIHJlZ2lzdGVycy4gT21pdHRlZFxuKyAgICAgICB3aGVuIHRoZSBwYXJ0IG51bWJlciByZWFkcyBhcyB6ZXJvLCB3aGljaCBoYXBwZW5zIGZvciBhIHN3aXRjaFxuKyAgICAgICBzaXR0aW5nIGluIE1DVWJvb3QgcmVzY3VlIG1vZGUgKHRoZSByZWdpc3RlcnMgbmVlZCBhIHJ1bm5pbmdcbisgICAgICAgZmlybXdhcmUpLCBmb3IgYW4gdW5mdXNlZCBwYXJ0LCBhbmQgYWZ0ZXIgYSBmYWlsZWQgZmxhc2guXG4rICAgKiAtIGBgYXNpYy5yZXZgYFxuKyAgICAgLSBmaXhlZFxuKyAgICAgLSAwXG4rICAgICAtIFRoZSBjaGlwIHZlcnNpb24gcmVhZCBmcm9tIHRoZSBzYW1lIHJlZ2lzdGVyIHdvcmQsIHNvIGl0IGlzXG4rICAgICAgIG9taXR0ZWQgd2hlbmV2ZXIgYGBhc2ljLmlkYGAgaXMuXG4rICAgKiAtIGBgZndgYFxuKyAgICAgLSBydW5uaW5nLCBzdG9yZWRcbisgICAgIC0gMS4wLjcwXG4rICAgICAtIFZlcnNpb24gb2YgdGhlIGZpcm13YXJlIHJ1bm5pbmcgb24gdGhlIHN3aXRjaCwgcmVwb3J0ZWQgYXMgYm90aFxuKyAgICAgICBydW5uaW5nIGFuZCBzdG9yZWQgc2luY2UgdGhlIHN3aXRjaCBib290cyBpdCBmcm9tIGl0cyBvd24gZmxhc2guXG4rICAgICAgIEl0IGlzIG9taXR0ZWQgd2hpbGUgbm8gZmlybXdhcmUgdmVyc2lvbiBpcyBrbm93bjogYWZ0ZXIgYSBmYWlsZWRcbisgICAgICAgZmxhc2gsIGFuZCBpbiBNQ1Vib290IHJlc2N1ZSBtb2RlIHdoaWxlIGFuIGludGVycnVwdGVkIGRvd25sb2FkXG4rICAgICAgIGlzIHN0aWxsIGJlaW5nIHJlY292ZXJlZCBpbiB0aGUgYmFja2dyb3VuZC4gT25jZSB0aGUgbG9hZGVyIGlzXG4rICAgICAgIHJlYWR5IHRvIGFjY2VwdCBhIG5ldyBpbWFnZSB0aGUgdmVyc2lvbiBhcHBlYXJzIGFzIFwiMC4wLjBcIixcbisgICAgICAgd2hpY2ggbm8gcmVsZWFzZWQgZmlybXdhcmUgcmVwb3J0cywgc28gdmVyc2lvbi1jb21wYXJpbmcgdG9vbHNcbisgICAgICAgb2ZmZXIgYW55IGF2YWlsYWJsZSByZWxlYXNlIGFzIGFuIHVwZ3JhZGUuIFVzZSBgYGRldmxpbmsgZGV2XG4rICAgICAgIGZsYXNoYGAgdG8gdGVsbCBhIHJlY292ZXJpbmcgc3dpdGNoIGZyb20gYSByZWFkeSBvbmUsIHNlZSBiZWxvdztcbisgICAgICAgYSBtaXNzaW5nIHZlcnNpb24gb24gaXRzIG93biBkb2VzIG5vdCBzYXkgd2h5LlxuK1xuK0ZsYXNoIHVwZGF0ZVxuKz09PT09PT09PT09PVxuK1xuK1RoZSBgYG14bDg2Mnh4YGAgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgYGBkZXZsaW5rIGRldiBmbGFzaGBgLlxuK1RoZSBzaWduZWQgZmlybXdhcmUgaW1hZ2UgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHN3aXRjaCBvdmVyIHRoZSBzYW1lXG4rTURJTyBidXMgd2hpY2ggaXMgYWxzbyB1c2VkIHRvIG1hbmFnZSB0aGUgc3dpdGNoLCB0aGVuIHZlcmlmaWVkIGFuZFxuK2luc3RhbGxlZCBieSB0aGUgTUNVYm9vdCBib290bG9hZGVyIHJ1bm5pbmcgb24gdGhlIHN3aXRjaC4gQWxsIHBvcnRzXG4rb2YgdGhlIHN3aXRjaCBhcmUgY2xvc2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHVwZGF0ZSBhbmQgdGhlIGRyaXZlclxuK3JlcHJvYmVzIHRoZSBzd2l0Y2ggYWZ0ZXIgaXQgaGFzIHJlYm9vdGVkIGludG8gdGhlIG5ldyBmaXJtd2FyZS4gQVxuK2NvbXBsZXRlIGZsYXNoIGFuZCByZXByb2JlIGN5Y2xlIHRha2VzIGFib3V0IG9uZSBtaW51dGUuXG4rXG4rQSBzd2l0Y2ggc3R1Y2sgaW4gTUNVYm9vdCByZXNjdWUgbW9kZSwgZS5nLiBhZnRlciBhbiBpbnRlcnJ1cHRlZFxuK3VwZGF0ZSwgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHVzZXIgcG9ydHMuIElmIHRoZSBwcmV2aW91cyBkb3dubG9hZCB3YXNcbitpbnRlcnJ1cHRlZCBtaWQtdHJhbnNmZXIgdGhlIGxvYWRlciBpcyB3ZWRnZWQ7IHRoZSBkcml2ZXIgZHJhaW5zIGl0XG4rYmFjayB0byBhIGNsZWFuIHJlYWR5IHN0YXRlIGluIHRoZSBiYWNrZ3JvdW5kLCBvbmUgYnl0ZSBhdCBhIHRpbWUsXG4rd2hpY2ggdGFrZXMgdGVucyBvZiBtaW51dGVzIGZvciBhIGxhcmdlIGltYWdlIGFuZCBpcyByZXBvcnRlZCB0aHJvdWdoXG4rdGhlIGtlcm5lbCBsb2cgYXMgaXQgcHJvZ3Jlc3Nlcy4gRHVyaW5nIHRoYXQgcmVjb3ZlcnkgYGBkZXZsaW5rIGRldlxuK2ZsYXNoYGAgcmV0dXJucyBgYC1FQlVTWWBgIHdpdGggYW4gZXh0YWNrIG1lc3NhZ2Ugc2F5aW5nIHNvLCBhbmRcbitgYGRldmxpbmsgZGV2IGluZm9gYCByZXBvcnRzIG5vIGZpcm13YXJlIHZlcnNpb24uIE9uY2UgdGhlIGxvYWRlciBpc1xuK3JlYWR5IHRoZSBmaXJtd2FyZSB2ZXJzaW9uIGFwcGVhcnMgYW5kIGZsYXNoaW5nIGEgZmlybXdhcmUgaW1hZ2Vcbit0aHJvdWdoIHRoZSByZWd1bGFyIHVwZGF0ZSBmbG93IHJlY292ZXJzIHRoZSBzd2l0Y2guXG4rXG4rSWYgdGhlIHJlY292ZXJ5IGZhaWxzLCB0aGUgbG9hZGVyIG5lZWRzIGEgcG93ZXIgY3ljbGU6IGBgZGV2bGluayBkZXZcbitmbGFzaGBgIHRoZW4gcmV0dXJucyBgYC1FSU9gYCBhbmQgc2F5cyBzbyBpbiBpdHMgZXh0YWNrIG1lc3NhZ2UuIFRoZVxuK2RyaXZlciBvbmx5IHJlLWV4YW1pbmVzIHRoZSBzd2l0Y2ggd2hlbiBpdCBiaW5kcywgc28gb24gYSBib2FyZCB3aGVyZVxuK3RoZSBzd2l0Y2ggY2FuIGJlIHBvd2VyIGN5Y2xlZCBvbiBpdHMgb3duLCB1bmJpbmQgYW5kIHJlYmluZCB0aGUgZHJpdmVyXG4rYWZ0ZXJ3YXJkcyB0byBoYXZlIHRoZSByZWNvdmVyZWQgc3dpdGNoIHJlY29nbmlzZWQuXG5kaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSU1xuaW5kZXggOTkxNDYwMDUwZGE3NC4uZTNmN2RlZDU2OWJmNyAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4rKysgYi9NQUlOVEFJTkVSU1xuQEAgLTE2MTA2LDYgKzE2MTA2LDcgQEAgTTpcdERhbmllbCBHb2xsZSBcdTAwM2NkYW5pZWxAbWFrcm90b3BpYS5vcmdcdTAwM2VcbiBMOlx0bmV0ZGV2QHZnZXIua2VybmVsLm9yZ1xuIFM6XHRNYWludGFpbmVkXG4gRjpcdERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZHNhL21heGxpbmVhcixteGw4NjJ4eC55YW1sXG4rRjpcdERvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZXZsaW5rL214bDg2Mnh4LnJzdFxuIEY6XHRkcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvXG4gRjpcdG5ldC9kc2EvdGFnX214bDg2Mnh4LmNcbiBcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYmFzZS5oIGIvZHJpdmVycy9iYXNlL2Jhc2UuaFxuaW5kZXggYTViN2FiYzEwZmYwMi4uNjIzNGUzN2RlN2U5OSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvYmFzZS9iYXNlLmhcbisrKyBiL2RyaXZlcnMvYmFzZS9iYXNlLmhcbkBAIC0xMDYsNiArMTA2LDEwIEBAIHN0cnVjdCBkcml2ZXJfcHJpdmF0ZSB7XG4gICogQGRlYWQ6IFRoaXMgZGV2aWNlIGlzIGN1cnJlbnRseSBlaXRoZXIgaW4gdGhlIHByb2Nlc3Mgb2Ygb3IgaGFzIGJlZW5cbiAgKlx0ICByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4gQW55IGFzeW5jaHJvbm91cyBldmVudHMgc2NoZWR1bGVkIGZvciB0aGlzXG4gICpcdCAgZGV2aWNlIHNob3VsZCBleGl0IHdpdGhvdXQgdGFraW5nIGFueSBhY3Rpb24uXG4rICogQHNodXRkb3duX2RvbmU6IFNldCBvbmNlIGRldmljZV9zaHV0ZG93bigpIGhhcyByZWFjaGVkIHRoaXMgZGV2aWNlLCB1bmRlclxuKyAqXHQgIHRoZSBkZXZpY2UgbG9jaywgYmVmb3JlIGFueSBzaHV0ZG93biBjYWxsYmFjayBydW5zLiBSZWFkIHVuZGVyIHRoZVxuKyAqXHQgIGRldmljZSBsb2NrLiBBIGRlZmVycmVkIHJlLXByb2JlIHNjaGVkdWxlZCB3aXRoXG4rICpcdCAgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoKSBtdXN0IG5vdCBkZXRhY2ggdGhlIGRldmljZSBhbnltb3JlLlxuICAqXG4gICogTm90aGluZyBvdXRzaWRlIG9mIHRoZSBkcml2ZXIgY29yZSBzaG91bGQgZXZlciB0b3VjaCB0aGVzZSBmaWVsZHMuXG4gICovXG5AQCAtMTIwLDYgKzEyNCw3IEBAIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSB7XG4gXHRjaGFyICpkZWZlcnJlZF9wcm9iZV9yZWFzb247XG4gXHRzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7XG4gXHR1OCBkZWFkOjE7XG4rXHR1OCBzaHV0ZG93bl9kb25lOjE7XG4gfTtcbiAjZGVmaW5lIHRvX2RldmljZV9wcml2YXRlX3BhcmVudChvYmopXHRcXFxuIFx0Y29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9wYXJlbnQpXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmNcbmluZGV4IDRkMDI2NjgyOTQ0ZjIuLjhhN2RiZTRlODM2MmIgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jXG4rKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jXG5AQCAtNDkwNiw2ICs0OTA2LDkgQEAgdm9pZCBkZXZpY2Vfc2h1dGRvd24odm9pZClcbiBcdFx0XHRkZXZpY2VfbG9jayhwYXJlbnQpO1xuIFx0XHRkZXZpY2VfbG9jayhkZXYpO1xuIFxuK1x0XHRpZiAoZGV2LVx1MDAzZXApXG4rXHRcdFx0ZGV2LVx1MDAzZXAtXHUwMDNlc2h1dGRvd25fZG9uZSA9IHRydWU7XG4rXG4gXHRcdC8qIERvbid0IGFsbG93IGFueSBtb3JlIHJ1bnRpbWUgc3VzcGVuZHMgKi9cbiBcdFx0cG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTtcbiBcdFx0cG1fcnVudGltZV9iYXJyaWVyKGRldik7XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RkLmMgYi9kcml2ZXJzL2Jhc2UvZGQuY1xuaW5kZXggNjBjMDA1MjIzODQ0ZC4uYmI4YjM0YWNkZTAwZCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jXG4rKysgYi9kcml2ZXJzL2Jhc2UvZGQuY1xuQEAgLTE0MzYsMyArMTQzNiw4NSBAQCB2b2lkIGRyaXZlcl9kZXRhY2goY29uc3Qgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydilcbiBcdFx0cHV0X2RldmljZShkZXYpO1xuIFx0fVxuIH1cbitcbitzdHJ1Y3QgZGV2aWNlX3JlcHJvYmUge1xuK1x0c3RydWN0IGRlbGF5ZWRfd29yayB3b3JrO1xuK1x0c3RydWN0IGRldmljZSAqZGV2O1xuK1x0Y29uc3Qgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjtcbit9O1xuK1xuK3N0YXRpYyB2b2lkIGRldmljZV9yZXByb2JlX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuK3tcbitcdHN0cnVjdCBkZXZpY2VfcmVwcm9iZSAqcnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRldmljZV9yZXByb2JlLFxuK1x0XHRcdFx0XHRcdCB3b3JrLndvcmspO1xuK1x0c3RydWN0IGRldmljZSAqZGV2ID0gcnAtXHUwMDNlZGV2O1xuK1x0c3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LVx1MDAzZXBhcmVudDtcbitcdGJvb2wgZGV0YWNoZWQgPSBmYWxzZTtcbitcbitcdF9fZGV2aWNlX2RyaXZlcl9sb2NrKGRldiwgcGFyZW50KTtcbitcdC8qXG4rXHQgKiBycC1cdTAwM2VkcnYgaXMgb25seSBldmVyIGNvbXBhcmVkLCBuZXZlciBkZXJlZmVyZW5jZWQ6IHRoZSBkcml2ZXIgaXRcbitcdCAqIHBvaW50cyB0byBtYXkgaGF2ZSBiZWVuIHVucmVnaXN0ZXJlZCBhbmQgZnJlZWQgYnkgbm93LlxuK1x0ICovXG4rXHRpZiAoIWRldi1cdTAwM2VwLVx1MDAzZWRlYWQgXHUwMDI2XHUwMDI2ICFkZXYtXHUwMDNlcC1cdTAwM2VzaHV0ZG93bl9kb25lIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGRldi1cdTAwM2Vkcml2ZXIgXHUwMDI2XHUwMDI2IGRldi1cdTAwM2Vkcml2ZXIgPT0gcnAtXHUwMDNlZHJ2KSB7XG4rXHRcdF9fZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldiwgcGFyZW50KTtcbitcdFx0ZGV0YWNoZWQgPSB0cnVlO1xuK1x0fVxuK1x0X19kZXZpY2VfZHJpdmVyX3VubG9jayhkZXYsIHBhcmVudCk7XG4rXG4rXHRpZiAoZGV0YWNoZWQgXHUwMDI2XHUwMDI2IGRldmljZV9hdHRhY2goZGV2KSBcdTAwM2MgMClcbitcdFx0ZGV2X2VycihkZXYsIFwicmUtcHJvYmUgZmFpbGVkLCBkZXZpY2UgbGVmdCB1bmJvdW5kXFxuXCIpO1xuK1xuK1x0cHV0X2RldmljZShkZXYpO1xuK1x0a2ZyZWUocnApO1xuK31cbitcbisvKipcbisgKiBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSAtIHNjaGVkdWxlIGEgZGVmZXJyZWQgZGV0YWNoIGFuZCByZS1wcm9iZVxuKyAqIEBkZXY6IGRldmljZSB0byBkZXRhY2ggYW5kIHJlLXByb2JlXG4rICogQGRlbGF5X21zOiBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSByZS1wcm9iZSBydW5zXG4rICpcbisgKiBTY2hlZHVsZSBhIGRldGFjaCBhbmQgcmUtcHJvYmUgb2YgQGRldiBhZnRlciBAZGVsYXlfbXMgbWlsbGlzZWNvbmRzLlxuKyAqIFRoZSByZS1wcm9iZSBpcyBza2lwcGVkIGlmLCBieSB0aGUgdGltZSB0aGUgc2NoZWR1bGVkIHdvcmsgcnVucywgdGhlXG4rICogZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQsIHRoZSBzeXN0ZW0gc2h1dGRvd24gc2VxdWVuY2UgaGFzIHJlYWNoZWQgdGhlXG4rICogZGV2aWNlLCBvciBAZGV2IGlzIG5vIGxvbmdlciBib3VuZCB0byB0aGUgZHJpdmVyIHRoYXQgd2FzIGJvdW5kIGF0XG4rICogc2NoZWR1bGluZyB0aW1lLiBJbiBwYXJ0aWN1bGFyIGFuIGFkbWluaXN0cmF0aXZlIHVuYmluZCBpcyBuZXZlclxuKyAqIHVuZG9uZSBieSBhIHN0YWxlIHJlLXByb2JlLlxuKyAqXG4rICogVGhlIHdvcmsgZnVuY3Rpb24gaXMgYnVpbHQtaW4gdGV4dCwgc28gdGhlIGJvdW5kIGRyaXZlciBtYXkgY2FsbCB0aGlzXG4rICogZnJvbSBpdHMgb3duIGNvZGUgd2l0aG91dCBob2xkaW5nIGEgbW9kdWxlIHJlZmVyZW5jZS4gSWYgdGhlIGRyaXZlclxuKyAqIG1vZHVsZSBpcyB1bmxvYWRlZCBiZWZvcmUgdGhlIHdvcmsgcnVucywgZHJpdmVyIHVucmVnaXN0cmF0aW9uIHVuYmluZHNcbisgKiBAZGV2IGZpcnN0IGFuZCB0aGUgc2NoZWR1bGVkIHdvcmsgZG9lcyBub3RoaW5nLlxuKyAqXG4rICogTXVsdGlwbGUgcGVuZGluZyByZS1wcm9iZXMgZm9yIHRoZSBzYW1lIGRldmljZSBhcmUgaW5kaXZpZHVhbGx5IHNhZmU7XG4rICogYSBjYWxsZXIgdGhhdCB3YW50cyBhdCBtb3N0IG9uZSBwZW5kaW5nIHJlLXByb2JlIG11c3QgZ2F0ZSBzY2hlZHVsaW5nXG4rICogaXRzZWxmLlxuKyAqXG4rICogTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0LlxuKyAqXG4rICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIEBkZXYgaXMgbm90IGEgcmVnaXN0ZXJlZCBkZXZpY2VcbisgKiBib3VuZCB0byBhIGRyaXZlciwgLUVOT01FTSBvbiBhbGxvY2F0aW9uIGZhaWx1cmUuXG4rICovXG4raW50IGRldmljZV9zY2hlZHVsZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGRlbGF5X21zKVxuK3tcbitcdHN0cnVjdCBkZXZpY2VfcmVwcm9iZSAqcnA7XG4rXG4rXHRpZiAoIWRldi1cdTAwM2VidXMgfHwgIWRldi1cdTAwM2VwIHx8ICFkZXZpY2VfaXNfcmVnaXN0ZXJlZChkZXYpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdGlmICghZGV2LVx1MDAzZWRyaXZlcilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRycCA9IGt6YWxsb2Nfb2JqKCpycCk7XG4rXHRpZiAoIXJwKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdHJwLVx1MDAzZWRldiA9IGdldF9kZXZpY2UoZGV2KTtcbitcdHJwLVx1MDAzZWRydiA9IFJFQURfT05DRShkZXYtXHUwMDNlZHJpdmVyKTtcbitcdElOSVRfREVMQVlFRF9XT1JLKFx1MDAyNnJwLVx1MDAzZXdvcmssIGRldmljZV9yZXByb2JlX3dvcmtfZm4pO1xuK1x0cXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9kZmxfd3EsIFx1MDAyNnJwLVx1MDAzZXdvcmssXG4rXHRcdFx0ICAgbXNlY3NfdG9famlmZmllcyhkZWxheV9tcykpO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9zY2hlZHVsZV9yZXByb2JlKTtcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvTWFrZWZpbGVcbmluZGV4IGE3YmUwZTY2NjlkZmEuLmJjY2FjMGQwZjcwM2YgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvTWFrZWZpbGVcbisrKyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9NYWtlZmlsZVxuQEAgLTEsMyArMSwzIEBAXG4gIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuIG9iai0kKENPTkZJR19ORVRfRFNBX01YTDg2MikgKz0gbXhsODYyeHhfZHNhLm9cbi1teGw4NjJ4eF9kc2EteSA6PSBteGw4NjJ4eC5vIG14bDg2Mnh4LWhvc3QubyBteGw4NjJ4eC1waHlsaW5rLm9cbitteGw4NjJ4eF9kc2EteSA6PSBteGw4NjJ4eC5vIG14bDg2Mnh4LWhvc3QubyBteGw4NjJ4eC1waHlsaW5rLm8gbXhsODYyeHgtZncub1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1hcGkuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1hcGkuaFxuaW5kZXggYTE4MGE1ZGVjZmZjMC4uNmY3NzE4OTU5ODRjYiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1hcGkuaFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWFwaS5oXG5AQCAtMTIyNCw2ICsxMjI0LDE2IEBAIHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB7XG4gXHRfX2xlMzIgaXZfYnVpbGRfbnVtO1xuIH0gX19wYWNrZWQ7XG4gXG4rLyoqXG4rICogc3RydWN0IG14bDg2Mnh4X3N5c19yZWdfcncgLSBTeXN0ZW0gcmVnaXN0ZXIgcmVhZC93cml0ZVxuKyAqIEBhZGRyOiAzMi1iaXQgcmVnaXN0ZXIgYWRkcmVzc1xuKyAqIEB2YWw6IHJlZ2lzdGVyIHZhbHVlXG4rICovXG4rc3RydWN0IG14bDg2Mnh4X3N5c19yZWdfcncge1xuK1x0X19sZTMyIGFkZHI7XG4rXHRfX2xlMzIgdmFsO1xuK30gX19wYWNrZWQ7XG4rXG4gLyoqXG4gICogZW51bSBteGw4NjJ4eF9wb3J0X3R5cGUgLSBQb3J0IFR5cGVcbiAgKiBATVhMODYyWFhfTE9HSUNBTF9QT1JUOiBMb2dpY2FsIFBvcnRcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtY21kLmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtY21kLmhcbmluZGV4IGM4N2E5NTVjMTNjNDguLmE4NjU0MjVhYTYxZTEgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtY21kLmhcbisrKyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1jbWQuaFxuQEAgLTcwLDcgKzcwLDkgQEBcbiAjZGVmaW5lIElOVF9HUEhZX1JFQURcdFx0XHQoR1BZX0dQWTJYWF9NQUdJQyArIDB4MSlcbiAjZGVmaW5lIElOVF9HUEhZX1dSSVRFXHRcdFx0KEdQWV9HUFkyWFhfTUFHSUMgKyAweDIpXG4gXG4rI2RlZmluZSBTWVNfTUlTQ19GV19VUERBVEVcdFx0KFNZU19NSVNDX01BR0lDICsgMHgxKVxuICNkZWZpbmUgU1lTX01JU0NfRldfVkVSU0lPTlx0XHQoU1lTX01JU0NfTUFHSUMgKyAweDIpXG4rI2RlZmluZSBTWVNfTUlTQ19SRUdfUkRcdFx0XHQoU1lTX01JU0NfTUFHSUMgKyAweDgpXG4gXG4gI2RlZmluZSBNWEw4NjJYWF9YUENTX1BDU19DT05GSUdcdChNWEw4NjJYWF9YUENTX01BR0lDICsgMHgxKVxuICNkZWZpbmUgTVhMODYyWFhfWFBDU19QQ1NfR0VUX1NUQVRFXHQoTVhMODYyWFhfWFBDU19NQUdJQyArIDB4MilcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjZlMDM3ZDk1NjQwYlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmNcbkBAIC0wLDAgKzEsMTA1NCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4rLypcbisgKiBGaXJtd2FyZSBmbGFzaCBhbmQgZGV2bGluayBzdXBwb3J0IGZvciBNYXhMaW5lYXIgTXhMODYyeHhcbisgKlxuKyAqIENvcHlyaWdodCAoQykgMjAyNSBEYW5pZWwgR29sbGUgXHUwMDNjZGFuaWVsQG1ha3JvdG9waWEub3JnXHUwMDNlXG4rICpcbisgKiBTQiBQREkgLSBmaXJtd2FyZSBkb3dubG9hZCBpbnRlcmZhY2Ugb3ZlciBjbGF1c2UtMjIgU01ESU9cbisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbisgKlxuKyAqIFRoZSBNeEw4NjJ4eCBNQ1Vib290IGxvYWRlciBhY2NlcHRzIGEgZmlybXdhcmUgaW1hZ2UgdGhyb3VnaCBmb3VyIFwiU0IgUERJXCJcbisgKiByZWdpc3RlcnMgaW4gdGhlIHN3aXRjaCBTTURJTyByZWdpc3RlciBzcGFjZS4gSXQgcnVucyB3aGVuZXZlciBubyBXU1BcbisgKiBmaXJtd2FyZSBpcyBhY3RpdmU6IHRoZSBub3JtYWwgZmlybXdhcmUgdXBkYXRlIGVudGVycyBpdCBkZWxpYmVyYXRlbHkgLSB0aGVcbisgKiBTWVNfTUlTQ19GV19VUERBVEUgQVBJIGNvbW1hbmQgc2V0cyBhIHN0aWNreSByZXNjdWUgYml0IGFuZCByZWJvb3RzIGludG9cbisgKiBNQ1Vib290IC0gYW5kIHRoZSBsb2FkZXIgYWxzbyBzdGF5cyBoZXJlIHdoZW4gdGhlIHN0b3JlZCBXU1AgZmlybXdhcmUgZmFpbHNcbisgKiBpdHMgYm9vdC10aW1lIGludGVncml0eSBjaGVjay4gVGhpcyBkcml2ZXIgZHJpdmVzIHRoZSBsb2FkZXIncyAweGM1NWNcbisgKiBcImNvbnNvbGVcIiBkb3dubG9hZCBwYXRoLlxuKyAqXG4rICogU01ESU8gcmVnaXN0ZXIgYWNjZXNzIChteGw4NjJ4eF9zbWRpb19yZWFkL3dyaXRlKTpcbisgKiAgIE1JSSByZWcgMHgxZiA6PSAoXHUwMDNjc2JfcGRpX3JlZ1x1MDAzZSBcdTAwMjYgMHhmZmYwKSAgIDsgcGFnZSBsYXRjaFxuKyAqICAgTUlJIHJlZyAoXHUwMDNjc2JfcGRpX3JlZ1x1MDAzZSBcdTAwMjYgMHgwMDBmKSA6PSAvID1cdTAwM2UgXHUwMDNjdTE2IGRhdGFcdTAwM2VcbisgKiBzbyBDVFJML0FERFIvREFUQS9TVEFUICgweGUxMDAuLjB4ZTEwMykgYXJlIE1JSSByZWdzIDAvMS8yLzMgb2YgcGFnZVxuKyAqIDB4ZTEwMCwgbm90IGFsbCByZWcgMHgwMC5cbisgKlxuKyAqIFNCIFBESSByZWdpc3RlcnMgKGhvc3QgbmFtZS9hZGRyICAtXHUwMDNlICBNQ1UgbWFpbGJveCk6XG4rICogICBDVFJMIDB4ZTEwMCAtXHUwMDNlIDB4YzA5Mzg0MDAgICBtb2RlOiBSU1Q9MHgwMCAgUkQ9MHgwMSAgV1I9MHgwMlxuKyAqICAgQUREUiAweGUxMDEgLVx1MDAzZSAweGMwOTM4NDA0ICAgU0IgdGFyZ2V0IHdvcmQgYWRkcmVzcyAoU0IxIGJhbmsgPSAweDc4MDApXG4rICogICBEQVRBIDB4ZTEwMiAtXHUwMDNlIDB4YzA5Mzg0MDggICAxNi1iaXQgZGF0YSAvIHJlcGx5IHdvcmRcbisgKiAgIFNUQVQgMHhlMTAzIC1cdTAwM2UgMHhjMDkzODQwYyAgIGhhbmRzaGFrZTogYSBtYWdpYyAoYmVsb3cpIG9yIGEgYnl0ZSBjb3VudFxuKyAqXG4rICogU1RBVCBtYWdpY3M6XG4rICogICBSRUFEWSAgMHhjNTVjICAgbG9hZGVyIGlkbGUgaW4gdGhlIGNvbnNvbGUgbG9vcCAgICAgICAgKHRoaXMgZHJpdmVyKVxuKyAqICAgRExfUkRZIDB4YzMzYyAgIGxvYWRlciBpZGxlIGluIHRoZSBmbGFzaGxlc3MgbG9vcFxuKyAqICAgU1RBUlQgIDB4ZjQ4ZiAgIGhvc3QgICAtXHUwMDNlIGJlZ2luIGRvd25sb2FkIHNlc3Npb25cbisgKiAgIEFDSyAgICAweGY0OTAgICBsb2FkZXIgLVx1MDAzZSBTVEFSVCBhY2tub3dsZWRnZWQgKFNUQVJUICsgMSlcbisgKiAgIEVORCAgICAweDNjYzMgICBob3N0ICAgLVx1MDAzZSBmaW5hbGlzZSBub3cgKG9wdGlvbmFsLCBzZWUgYmVsb3cpXG4rICogICBSRFJFRyAgMHhlMmMwICAgaG9zdCAgIC1cdTAwM2UgcmVnaXN0ZXItcmVhZCBjb21tYW5kICh8IGluZGV4KSwgc2VlIGJlbG93XG4rICpcbisgKiBDb25zb2xlIGZsYXNoIHBhdGggKFNUQVQ9MHhjNTVjKSAtIG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKCk6XG4rICpcbisgKiAgIGhvc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlclxuKyAqICAgLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tXG4rICogICByZXNldCAoQ1RSTD1BRERSPURBVEE9MClcbisgKiAgIHJlYWQgU1RBVCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDB4YzU1YyAgIChSRUFEWSwgaWRsZSlcbisgKiAgIFNUQVQgOj0gU1RBUlQoMHhmNDhmKSAgLS0tLS0tLS0tLS0tLS1cdTAwM2VcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXHUwMDNjLS0tLS0tLS0tLS0tLS0gU1RBVCA9IDB4ZjQ5MCAoQUNLKVxuKyAqICAgQ1RSTCA6PSBXUlxuKyAqICAgREFUQSA6PSBoZHJbMC4uOV0gICgyMC1ieXRlIGhlYWRlcjogdHlwZSxzaXplMSxjcmMxLHNpemUyLGNyYzIpXG4rICogICByZXNldDsgU1RBVCA6PSAyMCAoaGVhZGVyIGxlbikgIC0tLS0tXHUwMDNlIHBhcnNlIGhkcjsgcl9yZW1haW49c2l6ZTErc2l6ZTI7XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUkFTRSB0YXJnZXQgcmVnaW9uKHMpXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgIFx1MDAzYy0tLS0tLS0tLS0tLS0tIFNUQVQ9MjEgKGxlbisxKSwgdGhlbiBTVEFUPTBcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcmFzZWQpXG4rICogICAtLSBwYXlsb2FkLCBzdHJlYW1lZCBpbiBzbGljZXM6IC0tXG4rICogICBDVFJMIDo9IFdSXG4rICogICBEQVRBIDo9IHdvcmQgeCBOIC4uLlxuKyAqICAgICBhdCB3b3JkIDE2Mzg0OiBDVFJMOj1SU1Q7IEFERFI6PTB4NzgwMDsgQ1RSTDo9V1IgIChoYWxmLWJhbmsgLVx1MDAzZSBTQjEpXG4rICogICAgIGF0IHdvcmQgMzI3NjA6IGZsdXNoIHNsaWNlOlxuKyAqICAgICAgICByZXNldDsgU1RBVCA6PSBcdTAwM2NieXRlc190aGlzX3NsaWNlXHUwMDNlIC0tLVx1MDAzZSByX3JlbWFpbiAtPSBieXRlczsgcHJvZ3JhbVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBcdTAwM2MtLS0tLS0tLS0tLS0tLS0tLS0tIFNUQVQ9MCAgKHJlYWR5IGZvciBuZXh0IHNsaWNlKVxuKyAqICAgLi4uIHJlcGVhdCB1bnRpbCB0aGUgd2hvbGUgcGF5bG9hZCBpcyBzZW50IC4uLlxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBcdTAwM2MtLS0tLS0tLS0tLS0tLS0tLS0tIFNUQVQ9MCAgaW1hZ2UgdmVyaWZpZWRcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNUQVQ9MTogaW1hZ2UgcmVqZWN0ZWQpXG4rICogICBTVEFUIDo9IEVORCgweDNjYzMpICAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cdTAwM2UgZmluYWxpc2UgYW5kIGJvb3RcbisgKlxuKyAqIFRoZSByX3JlbWFpbiA9PSAwIHJ1bGUgKGNyaXRpY2FsKTpcbisgKiAgIEV2ZXJ5IGhvc3QgU1RBVCB3cml0ZSBpbiB0aGUgcGF5bG9hZCBwaGFzZSBpcyBhIGJ5dGUgY291bnQ7IHRoZSBsb2FkZXJcbisgKiAgIGRvZXMgcl9yZW1haW4gLT0gY291bnQgYW5kIHN0YXlzIGluIHRoZSByZWNlaXZlIGxvb3Agd2hpbGUgcl9yZW1haW4gIT0gMC5cbisgKiAgIEl0IGxlYXZlcyB0aGUgbG9vcCBPTkxZIHdoZW4gcl9yZW1haW4gaGl0cyBFWEFDVExZIDAsIGFuZCBhIGNvdW50IGxhcmdlclxuKyAqICAgdGhhbiByX3JlbWFpbiB1bmRlcmZsb3dzIHRoZSAzMi1iaXQgY291bnRlciBhbmQgd2VkZ2VzIHRoZSBsb2FkZXIgdW50aWwgYVxuKyAqICAgcG93ZXIgY3ljbGUuIEhhdmluZyBsZWZ0IGl0LCB0aGUgbG9hZGVyIHZlcmlmaWVzIHRoZSBpbWFnZSwgcHVibGlzaGVzIHRoZVxuKyAqICAgdmVyZGljdCBpbiBTVEFUICgwIGdvb2QsIDEgcmVqZWN0ZWQpIGFuZCB3YWl0cyAyIHMgZm9yIEVORCBiZWZvcmVcbisgKiAgIGZpbmFsaXNpbmcgcmVnYXJkbGVzcyAtLSBjbGVhcmluZyBpdHMgcmVzY3VlLWVuYWJsZSBiaXQgc28gYm9vdF9nbyBib290c1xuKyAqICAgdGhlIG5ldyBpbWFnZSAtLSBzbyBFTkQgb25seSBzYXZlcyB0aGF0IHdhaXQuIEhlbmNlOlxuKyAqICAgICAtIG5ldmVyIHNlbmQgYSBzbGljZS9jaHVuayBjb3VudCBsYXJnZXIgdGhhbiB3aGF0IGlzIG91dHN0YW5kaW5nO1xuKyAqICAgICAtIGEgU1RBVCB3cml0ZSBpcyBhIGNvbW1hbmQgb25seSBvbmNlIHRoZSBsb2FkZXIgaGFzIGxlZnQgdGhlIGxvb3A7XG4rICogICAgIC0gdGhlIGxvYWRlciBsZWF2ZXMgdGhlIGNvdW50IGluIFNUQVQgd2hpbGUgaXQgcHJvZ3JhbXMgdGhlIGNodW5rLCBzb1xuKyAqICAgICAgIGEgbGluZ2VyaW5nIGNvdW50IGRvZXMgbm90IGRpc3Rpbmd1aXNoIFwiYnVzeVwiIGZyb20gXCJ2ZXJkaWN0XCI7XG4rICogICAgIC0gaW50ZXJydXB0ZWQtZG93bmxvYWQgcmVjb3ZlcnkgZmVlZHMgMSBieXRlIGF0IGEgdGltZSAoc2VlIGJlbG93KS5cbisgKlxuKyAqIEludGVycnVwdGVkLWZsYXNoIHJlY292ZXJ5IChteGw4NjJ4eF9yZXNjdWVfZHJhaW4pOlxuKyAqICAgQSBob3N0IHRoYXQgZGllcyBtaWQtcGF5bG9hZCBsZWF2ZXMgdGhlIGxvYWRlciBpbiB0aGUgcmVjZWl2ZSBsb29wIGhvbGRpbmdcbisgKiAgIFNUQVQ9MC4gRmVlZCBzaW5nbGUgMS1ieXRlIGNodW5rcyAob25lIERBVEEgd29yZCArIFNUQVQ9MSkgdW50aWwgcl9yZW1haW5cbisgKiAgIHJlYWNoZXMgMDsgdGhlIGxvYWRlciB0aGVuIHZlcmlmaWVzIHRoZSAobm93IGNvcnJ1cHQpIGltYWdlLCBwdWJsaXNoZXMgaXRzXG4rICogICB2ZXJkaWN0IGFuZCBjb21lcyBiYWNrIHRvIFJFQURZIGJ5IGl0c2VsZi4gRU5EIGlzIG5ldmVyIHNlbnQgaGVyZTogd2hpbGVcbisgKiAgIHJfcmVtYWluIGlzIG5vbi16ZXJvIGl0IHdvdWxkIGJlIGNvbnN1bWVkIGFzIGEgMTU1NTUtYnl0ZSBjb3VudCwgYW5kIGFcbisgKiAgIGxpbmdlcmluZyBTVEFUPTEgY2Fubm90IGJlIHRvbGQgZnJvbSBhIGNodW5rIHN0aWxsIGJlaW5nIHByb2dyYW1tZWQuXG4rICpcbisgKiBSZWdpc3Rlci1yZWFkIGNoYWxsZW5nZSAobm9uLWRlc3RydWN0aXZlIGxpdmVuZXNzIHByb29mKTpcbisgKiAgIERBVEEgOj0gMHg3YzIzIChtYXJrZXIpOyBTVEFUIDo9IDB4ZTJjMHxpZHhcbisgKiAgICAgLVx1MDAzZSBsb2FkZXIgcmV0dXJucyBhIHJ1bnRpbWUgd29yZCBpbiBEQVRBIGFuZCByZS1hcm1zIFNUQVQ9MHhjNTVjLlxuKyAqICAgVGhlIHJlcGx5IHNvdXJjZSBpcyBsb2FkZXIgQlNTLCBub3QgYSBjaGlwIGlkOyB1c2VkIG9ubHkgdG8gcHJvdmUgYSBsaXZlXG4rICogICBtYWlsYm94IGluIG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdCgpLlxuKyAqXG4rICogVGhlIG90aGVyIFNUQVQgcmVhZHkgbWFnaWMsIDB4YzMzYywgbWFya3MgdGhlIGxvYWRlcidzIGZsYXNobGVzc1xuKyAqIGNoaXAtdG8tY2hpcCBkb3dubG9hZCBtb2RlIChNeEw4NjI4MVMgMTYtcG9ydCB0aWVyKTsgdGhpcyBkcml2ZXIgZG9lcyBub3RcbisgKiB1c2UgaXQuXG4rICpcbisgKiBSZXNjdWUgbGlmZWN5Y2xlIChkZXZsaW5rKTogcHJvYmUgcnVucyBteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QoKTsgYVxuKyAqIHdlZGdlZCBsb2FkZXIgaXMgZHJhaW5lZCBiYWNrIHRvIFJFQURZIGJ5IGEgYmFja2dyb3VuZCBzZWxmLWhlYWxcbisgKiAocmVzY3VlX2hlYWxfd29yayksIHNvIHRoZSBsb25nIHJlY292ZXJ5IG5ldmVyIGhvbGRzIHRoZSBkZXZsaW5rIGxvY2suXG4rICogZGV2bGluayBkZXYgaW5mbyBleHBvc2VzIHRoZSBmdyB2ZXJzaW9uICh0aGUgXCJmbGFzaGFibGVcIiBzaWduYWwpIG9ubHkgb25jZSBhdFxuKyAqIFJFQURZOyBmbGFzaF91cGRhdGUgcmV0dXJucyAtRUJVU1kgdW50aWwgdGhlbiwgYW5kIHJlcHJvYmVzIHRvIFdTUCBmaXJtd2FyZVxuKyAqIG9uIHN1Y2Nlc3MuXG4rICpcbisgKiBOb3RlczpcbisgKiAgIC0gQ2hpcCBpZC9yZXZpc2lvbiAoMHhjMGQyODg4NC84OCkgYXJlIE5PVCByZWFjaGFibGUgb24gdGhpcyBjaGFubmVsOyB0aGV5XG4rICogICAgIG5lZWQgdGhlIGNsYXVzZS00NSBNTUQgZmlybXdhcmUgbWFpbGJveCwgd2hpY2ggaXMgZGVhZCB1bmRlciBNQ1Vib290LlxuKyAqICAgICBSZXNjdWUgaWRlbnRpdHkgaXMgYnkgU0IgUERJIGJlaGF2aW91ciBvbmx5IChteGw4NjJ4eF9yZXNjdWVfbW9kZV9kZXRlY3QpLlxuKyAqICAgLSBUaGUgU01ESU8gUEhZIGFkZHJlc3MgY29tZXMgZnJvbSB0aGUgZGV2aWNlIHRyZWU7IHRoZSAweGUxeHggcmVnaXN0ZXJcbisgKiAgICAgb2Zmc2V0cyBhcmUgdGhlIE9UUCByZXNldCBkZWZhdWx0cyBhbmQgdGhlIG9ubHkgbGF5b3V0IHN1cHBvcnRlZCBoZXJlLlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyYzMyLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWxheS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZGV2aWNlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pb3BvbGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L25ldGRldmljZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvb3ZlcmZsb3cuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3J0bmV0bGluay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvZHNhLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvc3dpdGNoZGV2LmhcdTAwM2VcbitcbisjaW5jbHVkZSBcIm14bDg2Mnh4LmhcIlxuKyNpbmNsdWRlIFwibXhsODYyeHgtYXBpLmhcIlxuKyNpbmNsdWRlIFwibXhsODYyeHgtY21kLmhcIlxuKyNpbmNsdWRlIFwibXhsODYyeHgtZncuaFwiXG4rI2luY2x1ZGUgXCJteGw4NjJ4eC1ob3N0LmhcIlxuK1xuKy8qIFNCIFBESSByZWdpc3RlcnMgKGNsYXVzZS0yMiBTTURJTyBhZGRyZXNzIHNwYWNlKSAqL1xuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxcdFx0MHhlMTAwXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfQUREUlx0XHQweGUxMDFcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9EQVRBXHRcdDB4ZTEwMlxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1NUQVRcdFx0MHhlMTAzXG4rXG4rLyogU0IgUERJIENUUkwgbW9kZXMgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVFx0MHgwMFxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX0NUUkxfV1JcdFx0MHgwMlxuK1xuKy8qIFNCIFBESSBoYW5kc2hha2UgbWFnaWMgKHB1Ymxpc2hlZC9jb25zdW1lZCB2aWEgU1RBVCkgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9SRUFEWVx0XHQweGM1NWNcdC8qIGxvYWRlciBpZGxlLCBjb25zb2xlIGxvb3AgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9ETF9SRUFEWVx0MHhjMzNjXHQvKiBsb2FkZXIgaWRsZSwgZmxhc2hsZXNzIGxvb3AgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEFSVFx0XHQweGY0OGZcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9FTkRcdFx0MHgzY2MzXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfUkRSRUdcdFx0MHhlMmMwXHQvKiByZWdpc3Rlci1yZWFkIGNtZCAofCBpbmRleCkgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9SRFJFR19NQVJLXHQweDdjMjNcdC8qIG1hcmtlciBwbGFjZWQgaW4gREFUQSBmb3IgUkRSRUcgKi9cbitcbisvKiBCZWhhdmlvdXJhbCBwcmVzZW5jZSBwcm9iZTogdHdvIGRpc3RpbmN0IDE2LWJpdCBsYXRjaGVzIG9uIEFERFIvREFUQS4gKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9QUk9CRV9BXHRcdDB4NWE1YVxuKyNkZWZpbmUgTVhMODYyWFhfU0JfUERJX1BST0JFX0RcdFx0MHhhNWE1XG4rXG4rLyogSW1hZ2UgdmVyaWZpY2F0aW9uIHZlcmRpY3QgcHVibGlzaGVkIGluIFNUQVQgb25jZSB0aGUgcmVjZWl2ZSBsb29wIGVuZHMgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9WRVJJRllfT0tcdDBcbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9WRVJJRllfQkFEXHQxXG4rXG4rLyogRmlybXdhcmUgdHJhbnNmZXIgZ2VvbWV0cnkgKi9cbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0hEUl9TSVpFXHRcdDIwXG4rI2RlZmluZSBNWEw4NjJYWF9GV19CQU5LX0hBTEZcdFx0MTYzODRcdC8qIHdvcmRzIHBlciBoYWxmLWJhbmsgKi9cbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0JBTktfU0xJQ0VcdFx0MzI3NjBcdC8qIHdvcmRzIHBlciBmdWxsIHNsaWNlICovXG4rI2RlZmluZSBNWEw4NjJYWF9GV19TQjFfQUREUlx0XHQweDc4MDBcdC8qIFNCMSB3b3JkIGFkZHJlc3MgKi9cbitcbisvKiBUaW1lb3V0cyAoZ2VuZXJvdXMgdXBwZXIgYm91bmRzKSAqL1xuKyNkZWZpbmUgTVhMODYyWFhfRldfUkVBRFlfVElNRU9VVF9NU1x0MzAwMFxuKyNkZWZpbmUgTVhMODYyWFhfRldfQUNLX1RJTUVPVVRfTVNcdDUwMDBcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX0VSQVNFX1RJTUVPVVRfTVNcdDMwMDAwMFxuKyNkZWZpbmUgTVhMODYyWFhfRldfV1JJVEVfVElNRU9VVF9NU1x0NjAwMDBcbisjZGVmaW5lIE1YTDg2MlhYX0ZXX1JFQk9PVF9ERUxBWV9NU1x0NTAwMFxuKyNkZWZpbmUgTVhMODYyWFhfRldfUkVQUk9CRV9ERUxBWV9NU1x0NTAwXG4rLyogT25lIGxvYWRlciBtYWlsYm94IHN0ZXA6IHByb2dyYW0gYSAxLWJ5dGUgY2h1bmsgb3Igc2VydmljZSBhIGNvbW1hbmQgKi9cbisjZGVmaW5lIE1YTDg2MlhYX1NCX1BESV9TVEVQX01TXHRcdDIwMDBcbisvKiBDb3ZlcnMgdGhlIGxvYWRlcidzIEVORCB3YWl0LCB2ZXJpZmljYXRpb24gYW5kIHRoZSByZXNldCBpbnRvIFJFQURZICovXG4rI2RlZmluZSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TXHQxNTAwMFxuK1xuK3N0YXRpYyBpbnQgbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxuK3tcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbitcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIsXG4rXHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldHVybiBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSxcbitcdFx0XHRcdCAgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9SU1QpO1xuK31cbitcbitzdGF0aWMgaW50IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUxNiBleHBlY3RlZCxcbitcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0X21zKVxuK3tcbitcdGludCByZXQsIHZhbDtcbitcbitcdHJldCA9IHJlYWRfcG9sbF90aW1lb3V0KG14bDg2Mnh4X3NtZGlvX3JlYWQsIHZhbCxcbitcdFx0XHRcdHZhbCBcdTAwM2MgMCB8fCAodTE2KXZhbCA9PSBleHBlY3RlZCxcbitcdFx0XHRcdDEwMDAwLCB0aW1lb3V0X21zICogMTAwMCwgZmFsc2UsXG4rXHRcdFx0XHRwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XG4rXHRpZiAodmFsIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gdmFsO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2Uoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsXG4rXHRcdFx0XHQgICAgICAgdTMyIGRhdGFfd3JpdHRlbilcbit7XG4rXHRpbnQgcmV0O1xuK1xuK1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULCBkYXRhX3dyaXR0ZW4pO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldHVybiBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIDAsXG4rXHRcdFx0XHRcdCBNWEw4NjJYWF9GV19XUklURV9USU1FT1VUX01TKTtcbit9XG4rXG4rLyogRmx1c2ggdGhlIGxhc3Qgc2xpY2UsIHdoaWNoIGVuZHMgdGhlIHJlY2VpdmUgbG9vcDogdGhlIGxvYWRlciB2ZXJpZmllcyB0aGVcbisgKiBpbWFnZSBhbmQgcmVwbGFjZXMgdGhlIGNvdW50IGluIFNUQVQgd2l0aCBpdHMgdmVyZGljdCwgc28gd2FpdCBmb3IgdGhlIGNvdW50XG4rICogdG8gZ28gcmF0aGVyIHRoYW4gZm9yIGEgZml4ZWQgdmFsdWUuXG4rICovXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfbGFzdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcbitcdFx0XHRcdCAgICAgIHUzMiBkYXRhX3dyaXR0ZW4pXG4re1xuK1x0aW50IHJldCwgdmFsO1xuK1xuK1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULCBkYXRhX3dyaXR0ZW4pO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IHJlYWRfcG9sbF90aW1lb3V0KG14bDg2Mnh4X3NtZGlvX3JlYWQsIHZhbCxcbitcdFx0XHRcdHZhbCBcdTAwM2MgMCB8fCAodTE2KXZhbCAhPSAodTE2KWRhdGFfd3JpdHRlbixcbitcdFx0XHRcdDEwMDAwLCAoTVhMODYyWFhfRldfV1JJVEVfVElNRU9VVF9NUyArXG4rXHRcdFx0XHRcdE1YTDg2MlhYX1NCX1BESV9WRVJJRllfTVMpICogMTAwMCxcbitcdFx0XHRcdGZhbHNlLCBwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XG4rXHRpZiAodmFsIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gdmFsO1xuK1xuK1x0aWYgKCFyZXQgXHUwMDI2XHUwMDI2ICh1MTYpdmFsID09IE1YTDg2MlhYX1NCX1BESV9WRVJJRllfT0spXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0LyogQSBmaW5hbCBjb3VudCBvZiAxIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIHJlamVjdCB2ZXJkaWN0LCBzb1xuK1x0ICogYSB0aW1lb3V0IHN0aWxsIGhvbGRpbmcgaXQgbGFuZHMgaGVyZSB0b28uXG4rXHQgKi9cbitcdGlmICgodTE2KXZhbCA9PSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX0JBRCkge1xuK1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XCJmbGFzaDogbG9hZGVyIHJlamVjdGVkIHRoZSBpbWFnZVxcblwiKTtcbitcdFx0cmV0dXJuIC1FQkFETVNHO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHJldCA/IHJldCA6IC1FUFJPVE87XG4rfVxuK1xuK3N0YXRpYyB2b2lkIG14bDg2Mnh4X2ZsYXNoX25vdGlmeShzdHJ1Y3QgZGV2bGluayAqZGwsIGNvbnN0IGNoYXIgKnN0YXR1cyxcbitcdFx0XHRcdCAgdTMyIGRvbmUsIHUzMiB0b3RhbClcbit7XG4rXHRkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9zdGF0dXNfbm90aWZ5KGRsLCBzdGF0dXMsIE5VTEwsIGRvbmUsIHRvdGFsKTtcbit9XG4rXG4rLyogQnl0ZS1jb3VudCBvZiBlYWNoIGNodW5rIGZlZCB0byB0aGUgbG9hZGVyIGR1cmluZyBkcmFpbi4gSXQgTVVTVCBiZSAxOiB0aGVcbisgKiBsb2FkZXIgb25seSBsZXRzIHVzIG9ic2VydmUgXCJjb3VudGVyID09IDBcIiwgbmV2ZXIgXCJjb3VudGVyIFx1MDAzYyBzdGVwXCIsIHNvIGFueVxuKyAqIHN0ZXAgXHUwMDNlIDEgY2FuIHN1YnRyYWN0IHBhc3QgemVybywgdW5kZXJmbG93IHRoZSAzMi1iaXQgY291bnRlciBhbmQgd2VkZ2UgdGhlXG4rICogbG9hZGVyIGZvciB+Ml4zMiBtb3JlIGJ5dGVzIChhIHN0YXRlIG9ubHkgYSBwb3dlciBjeWNsZSBjbGVhcnMpLiBTdGVwcGluZyBieVxuKyAqIDEgd2Fsa3MgdGhlIGNvdW50ZXIgdGhyb3VnaCBldmVyeSB2YWx1ZSBhbmQgaXMgZ3VhcmFudGVlZCB0byBsYW5kIG9uIHplcm9cbisgKiB3aGF0ZXZlciBpdHMgKHBvc3NpYmx5IG9kZCkgc3RhcnQuIEEgMS1ieXRlIGNodW5rIGlzIGEgcGF0aCB0aGUgbG9hZGVyXG4rICogYWxyZWFkeSBoYW5kbGVzOiB0aGUgbm9ybWFsIHRyYW5zZmVyIGVuZHMgd2l0aCBhIHNpbmdsZSB0cmFpbGluZyBieXRlIGZvclxuKyAqIG9kZC1zaXplZCBpbWFnZXMgKHNlZSBTdGVwIDYpLlxuKyAqL1xuKyNkZWZpbmUgTVhMODYyWFhfRFJBSU5fQ0hVTktfQllURVNcdDFcbitcbisvKiBMb2cgdGhlIGRyYWluJ3MgcHJvZ3Jlc3MgZXZlcnkgc28gbWFueSBieXRlczsgaXQgY2FuIHJ1biBmb3IgYSBsb25nIHRpbWUgKi9cbisjZGVmaW5lIE1YTDg2MlhYX0RSQUlOX0xPR19CWVRFU1x0KDEyOCAqIDEwMjQpXG4rXG4rLyogV2FpdCBmb3IgdGhlIGxvYWRlciB0byBhc2sgZm9yIHRoZSBuZXh0IGNodW5rIChTVEFUIDApIG9yIHRvIGNvbWUgYmFjayB0byBpdHNcbisgKiBjb21tYW5kIGxvb3AgKFNUQVQgUkVBRFkpLCBhbmQgcmV0dXJuIHRoZSBTVEFUIHZhbHVlIGVpdGhlciB3YXkuIE9uIHRpbWVvdXRcbisgKiB0aGF0IGlzIHdoYXRldmVyIFNUQVQgc3RpbGwgaG9sZHMsIHdoaWNoIGNhcnJpZXMgbm8gZnVydGhlciBpbmZvcm1hdGlvbjogdGhlXG4rICogbG9hZGVyIGtlZXBzIHRoZSBjb3VudCB3ZSB3cm90ZSB2aXNpYmxlIHdoaWxlIGl0IHByb2dyYW1zIHRoZSBjaHVuaywgYW5kIHRoYXRcbisgKiBpcyB0aGUgc2FtZSB2YWx1ZSBpdCBwdWJsaXNoZXMgYXMgdGhlIFwiaW1hZ2UgcmVqZWN0ZWRcIiB2ZXJkaWN0IG9uY2UgdGhlXG4rICogY291bnRlciByZWFjaGVzIHplcm8uXG4rICpcbisgKiBTVEFUIDAgaXMgdW5hbWJpZ3VvdXMgaGVyZSBldmVuIHRob3VnaCBpdCBpcyBhbHNvIHRoZSBcImltYWdlIHZlcmlmaWVkXCJcbisgKiB2ZXJkaWN0OiBieSB0aGUgcl9yZW1haW4gPT0gMCBydWxlIHRoZSBsb2FkZXIgbGVhdmVzIHRoZSByZWNlaXZlIGxvb3AgdGhlXG4rICogbW9tZW50IHRoZSBjb3VudGVyIHJlYWNoZXMgemVybywgc28gaXQgaXMgbmV2ZXIgYm90aCBpbnNpZGUgdGhlIGxvb3AgYXNraW5nXG4rICogZm9yIGEgY2h1bmsgYW5kIHB1Ymxpc2hpbmcgYSB2ZXJkaWN0LiBPbmNlIGl0IGhhcyBsZWZ0LCB0aGUgbmV4dCBTVEFUIHdyaXRlXG4rICogaXMgYSBjb21tYW5kIHJhdGhlciB0aGFuIGEgY291bnQsIHNvIGZlZWRpbmcgb25lIG1vcmUgY2h1bmsgYWZ0ZXIgYSB2ZXJkaWN0XG4rICogY2Fubm90IHVuZGVyZmxvdyBhbnl0aGluZyBlaXRoZXIuXG4rICovXG4rc3RhdGljIGludCBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9tcylcbit7XG4rXHRpbnQgdmFsO1xuK1xuK1x0cmVhZF9wb2xsX3RpbWVvdXQobXhsODYyeHhfc21kaW9fcmVhZCwgdmFsLFxuK1x0XHRcdCAgdmFsIFx1MDAzYyAwIHx8ICh1MTYpdmFsID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSB8fFxuK1x0XHRcdCAgKHUxNil2YWwgPT0gMCxcbitcdFx0XHQgIDUwLCB0aW1lb3V0X21zICogMTAwMCwgZmFsc2UsXG4rXHRcdFx0ICBwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCk7XG4rXHRpZiAodmFsIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gdmFsO1xuK1x0cmV0dXJuICh1MTYpdmFsO1xuK31cbitcbisvKiBUaGUgbG9hZGVyIGlzIG5vdCBhc2tpbmcgZm9yIGEgY2h1bms6IGl0IG1heSBzdGlsbCBiZSBwcm9ncmFtbWluZyB0aGUgbGFzdFxuKyAqIG9uZSwgb3IgdGhlIGNvdW50ZXIgaGFzIHJlYWNoZWQgemVybyBhbmQgaXQgaXMgdmVyaWZ5aW5nIHRoZSBpbWFnZSBhbmRcbisgKiByZXNldHRpbmcgaW50byBSRUFEWS4gV2FpdCB0aGF0IG91dCAtLSBTVEFUIGNhbm5vdCB0ZWxsIHRoZSB0d28gYXBhcnQsIGFuZFxuKyAqIGd1ZXNzaW5nIHdvdWxkIG1lYW4gd3JpdGluZyBFTkQgaW50byBhIGxpdmUgcmVjZWl2ZSBsb29wLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uY2UgdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgbG9vcCwgLUVBR0FJTiBpZiBpdCBhc2tzIGZvciBhbm90aGVyXG4rICogY2h1bmsgYWZ0ZXIgYWxsLCAtRUlPIGZvciBhIGxvYWRlciBzdGlsbCBob2xkaW5nIHRoZSBjb3VudCB3aGVuIHRoZSB2ZXJpZnlcbisgKiB3aW5kb3cgZXhwaXJlcywgb3IgYW4gU01ESU8gYnVzIGVycm9yLlxuKyAqL1xuK3N0YXRpYyBpbnQgbXhsODYyeHhfcmVzY3VlX2RyYWluX2ZpbmlzaChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGNodW5rKVxuK3tcbitcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXY7XG4rXHRpbnQgc3RhdDtcbitcbitcdHN0YXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX01TKTtcbitcdGlmIChzdGF0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gc3RhdDtcbitcdGlmIChzdGF0ID09IE1YTDg2MlhYX1NCX1BESV9SRUFEWSlcbitcdFx0cmV0dXJuIDA7XG4rXHRpZiAoc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfVkVSSUZZX0JBRCkge1xuK1x0XHRkZXZfZXJyKGRldixcbitcdFx0XHRcImZsYXNoOiBsb2FkZXIgc3R1Y2sgYWZ0ZXIgJXUgY2h1bmtzLCBwb3dlciBjeWNsZSBpdFxcblwiLFxuK1x0XHRcdGNodW5rKTtcbitcdFx0cmV0dXJuIC1FSU87XG4rXHR9XG4rXHRpZiAoc3RhdCkge1xuK1x0XHQvKiBBIGZpcm13YXJlIGlzIGFuc3dlcmluZywgbm90IHRoZSBsb2FkZXI6IGFuIGltYWdlIHN1cnZpdmVkXG4rXHRcdCAqIGluIGZsYXNoIGFuZCBib290ZWQuXG4rXHRcdCAqL1xuK1x0XHRkZXZfaW5mbyhkZXYsIFwiZmxhc2g6IGZpcm13YXJlIGJvb3RlZCB3aGlsZSBkcmFpbmluZ1xcblwiKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHRyZXR1cm4gLUVBR0FJTjtcbit9XG4rXG4rLyogUmVjb3ZlciBhIHN3aXRjaCB3aG9zZSBTQiBQREkgZG93bmxvYWQgd2FzIGludGVycnVwdGVkIG1pZC10cmFuc2ZlciAtIHRoZVxuKyAqIGhvc3QgZGllZCBhZnRlciBNQ1Vib290IGJlZ2FuIGVyYXNpbmcgZmxhc2gsIHdoZXRoZXIgaXQgYWJvcnRlZCBtaWQgZXJhc2Ugb3JcbisgKiBtaWQgaW1hZ2Utd3JpdGUsIGJvdGggZW5kIHVwIGluIHRoZSBzYW1lIHBsYWNlOiB0aGUgcGF5bG9hZCByZWNlaXZlIGxvb3AuXG4rICogVGhlcmUgdGhlIGxvYWRlciBwdWJsaXNoZXMgU1RBVD0wLCB3YWl0cyBmb3IgdGhlIGhvc3QgdG8gd3JpdGUgYSBieXRlLWNvdW50XG4rICogdG8gU1RBVCwgRE1BcyB0aGF0IG1hbnkgYnl0ZXMgYW5kIHN1YnRyYWN0cyB0aGUgY291bnQgZnJvbSBhIHJlbWFpbmluZy1ieXRlc1xuKyAqIGNvdW50ZXIsIGxlYXZpbmcgdGhlIGxvb3Agb25seSB3aGVuIHRoZSBjb3VudGVyIHJlYWNoZXMgZXhhY3RseSB6ZXJvLiBUaGVcbisgKiBpbWFnZSBzaXplIGRpZWQgd2l0aCB0aGUgaG9zdCwgc28gd2UgZmVlZCBzaW5nbGUtYnl0ZSBjaHVua3MgKHNlZVxuKyAqIE1YTDg2MlhYX0RSQUlOX0NIVU5LX0JZVEVTKSB0byB3YWxrIHRoZSBjb3VudGVyIHRvIHplcm8gd2l0aG91dCB1bmRlcmZsb3cuXG4rICogVGhlIGxvYWRlciB0aGVuIHZlcmlmaWVzIHRoZSAobm93IGNvcnJ1cHQpIGltYWdlIGFuZCByZXR1cm5zIHRvIFJFQURZIGJ5XG4rICogaXRzZWxmLCBvciBib290cyBhIHZhbGlkIGltYWdlIHRoYXQgaGFwcGVuZWQgdG8gc3Vydml2ZSBpbiBmbGFzaDsgZWl0aGVyIHdheVxuKyAqIHRoZSBjYWxsZXIncyByZXByb2JlIGNsYXNzaWZpZXMgdGhlIHJlc3VsdC4gRXZlcnkgYnl0ZSBjb3N0cyBhYm91dCBhIGRvemVuXG4rICogTURJTyBmcmFtZXMsIHNvIGEgbXVsdGktTWlCIG91dHN0YW5kaW5nIGNvdW50IHRha2VzIHRlbnMgb2YgbWludXRlcy5cbisgKiBSZXR1cm5zIDAgb25jZSB0aGUgbG9hZGVyIGhhcyBsZWZ0IHRoZSByZWNlaXZlIGxvb3AsIFx1MDAzYzAgb24gZXJyb3IuIERvZXMgTk9UXG4rICogcmVjb3ZlciBhIGNvdW50ZXIgYWxyZWFkeSB1bmRlcmZsb3dlZCBieSBhbiBlYXJsaWVyIG92ZXJzaXplZC1jaHVuayBhdHRlbXB0XG4rICogLSB0aGF0IG5lZWRzIGEgcG93ZXIgY3ljbGUuXG4rICovXG4rc3RhdGljIGludCBteGw4NjJ4eF9yZXNjdWVfZHJhaW4oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4re1xuK1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldjtcbitcdC8qIEJvdW5kOiB0d2ljZSB0aGUgbG9hZGVyJ3MgMTYgTWlCIGltYWdlIGNhcCwgb25lIGJ5dGUgcGVyIGNodW5rLiAqL1xuK1x0dTMyIG1heF9jaHVua3MgPSAydSAqICgxNnUgXHUwMDNjXHUwMDNjIDIwKSAvIE1YTDg2MlhYX0RSQUlOX0NIVU5LX0JZVEVTO1xuK1x0dTMyIGNodW5rID0gMDtcbitcdGludCByZXQsIHN0YXQ7XG4rXG4rXHR3aGlsZSAoY2h1bmsgXHUwMDNjIG1heF9jaHVua3MpIHtcbitcdFx0LyogVGVhcmRvd24gY2FuIGludGVycnVwdCB0aGlzIGxvbmcgZHJhaW4uICovXG4rXHRcdGlmICh0ZXN0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgXHUwMDI2cHJpdi1cdTAwM2VmbGFncykpXG4rXHRcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4rXG4rXHRcdHN0YXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RFUF9NUyk7XG4rXHRcdGlmIChzdGF0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiBzdGF0O1xuK1x0XHRpZiAoc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfUkVBRFkpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXG4rXHRcdGlmIChzdGF0KSB7XG4rXHRcdFx0cmV0ID0gbXhsODYyeHhfcmVzY3VlX2RyYWluX2ZpbmlzaChwcml2LCBjaHVuayk7XG4rXHRcdFx0aWYgKHJldCAhPSAtRUFHQUlOKVxuK1x0XHRcdFx0cmV0dXJuIHJldDtcbitcdFx0fVxuK1xuK1x0XHQvKiBGZWVkIG9uZSB6ZXJvIGJ5dGU7IHJlc2V0IGNsZWFyZWQgdGhlIHdyaXRlIGxhdGNoLiAqL1xuK1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbitcdFx0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBLCAweDAwMDApO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9yZXNldChwcml2KTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcbitcdFx0XHRcdFx0ICAgTVhMODYyWFhfRFJBSU5fQ0hVTktfQllURVMpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdGNodW5rKys7XG4rXHRcdGlmICghKGNodW5rICUgTVhMODYyWFhfRFJBSU5fTE9HX0JZVEVTKSlcbitcdFx0XHRkZXZfaW5mbyhkZXYsIFwiZmxhc2g6IGRyYWluZWQgJXUgS2lCIHNvIGZhclxcblwiLFxuK1x0XHRcdFx0IGNodW5rIC8gMTAyNCk7XG4rXHRcdGNvbmRfcmVzY2hlZCgpO1xuK1x0fVxuK1xuK1x0ZGV2X2VycihkZXYsXG4rXHRcdFwiZmxhc2g6IGludGVycnVwdGVkIGRvd25sb2FkIGRpZCBub3QgZHJhaW4gYWZ0ZXIgJXUgY2h1bmtzXFxuXCIsXG4rXHRcdGNodW5rKTtcbitcbitcdHJldHVybiAtRVRJTUVET1VUO1xuK31cbitcbisvKiBCYWNrZ3JvdW5kIHNlbGYtaGVhbDogZHJhaW4gYSB3ZWRnZWQgZG93bmxvYWQgb2ZmIHRoZSBkZXZsaW5rIGZsYXNoIHBhdGgsIHNvXG4rICogdGhlIGxvbmcgcmVjb3ZlcnkgbmV2ZXIgaG9sZHMgdGhlIGRldmxpbmsgbG9jay4gU2NoZWR1bGVkIGZyb20gcHJvYmU7XG4rICogcmVwcm9iZXMgb24gc3VjY2VzcyBzbyB0aGUgcHJvYmUtdGltZSBkZXRlY3Rpb24gcmUtY2xhc3NpZmllcyB0aGUgc3dpdGNoLlxuKyAqL1xuK3ZvaWQgbXhsODYyeHhfcmVzY3VlX2hlYWxfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4re1xuK1x0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPVxuK1x0XHRjb250YWluZXJfb2Yod29yaywgc3RydWN0IG14bDg2Mnh4X3ByaXYsIHJlc2N1ZV9oZWFsX3dvcmspO1xuK1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldjtcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBteGw4NjJ4eF9yZXNjdWVfZHJhaW4ocHJpdik7XG4rXHRpZiAocmV0ID09IC1FQ0FOQ0VMRUQpXG4rXHRcdHJldHVybjtcbitcdGlmIChyZXQpIHtcbitcdFx0LyogTm90aGluZyByZXRyaWVzIHRoaXMsIHNvIHNheSBzbzogcmVzY3VlX3JlYWR5IHN0YXlzIGNsZWFyXG4rXHRcdCAqIGFuZCBkZXZsaW5rIGRldiBmbGFzaCByZXBvcnRzIHdoeSBpdCByZWZ1c2VzLlxuK1x0XHQgKi9cbitcdFx0ZGV2X2VycihkZXYsIFwiZmxhc2g6IGRvd25sb2FkIHJlY292ZXJ5IGZhaWxlZDogJXBlXFxuXCIsXG4rXHRcdFx0RVJSX1BUUihyZXQpKTtcbitcdFx0V1JJVEVfT05DRShwcml2LVx1MDAzZXJlc2N1ZV9mYWlsZWQsIHRydWUpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHQvKiBUaGUgaW50ZXJydXB0ZWQgdHJhbnNmZXIgaXMgZmluYWxpc2VkOyByZXByb2JlIHNvIHRoZSBwcm9iZS10aW1lXG4rXHQgKiBkZXRlY3Rpb24gYnJpbmdzIHRoZSBkcml2ZXIgdXAgLS0gZmxhc2hhYmxlIGluIHJlc2N1ZSBtb2RlIGlmIHRoZVxuK1x0ICogbG9hZGVyIGlzIGF0IFJFQURZLCBvciBub3JtYWxseSBpZiBhIHZhbGlkIGltYWdlIGJvb3RlZC4gVGhlIGNvcmVcbitcdCAqIHNraXBzIHRoZSByZS1wcm9iZSBvbiBpdHMgb3duIGlmIHRoZSBkZXZpY2UgaXMgdW5ib3VuZCBmaXJzdDsgdGhlXG4rXHQgKiBmbGFnIHRlc3Qgb25seSBhdm9pZHMgc2NoZWR1bGluZyBvbmUgY2VydGFpbiB0byBiZSBza2lwcGVkLiBBXG4rXHQgKiBmYWlsZWQgaGFuZC1vZmYgbGVhdmVzIG5vdGhpbmcgdG8gcmVjbGFzc2lmeSB0aGUgc3dpdGNoLCBzbyBtYXJrXG4rXHQgKiByZWNvdmVyeSBmYWlsZWQgcmF0aGVyIHRoYW4gcHJvbWlzZSBhIHJldHJ5IHRoYXQgY2Fubm90IHN1Y2NlZWQuXG4rXHQgKi9cbitcdGlmICh0ZXN0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgXHUwMDI2cHJpdi1cdTAwM2VmbGFncykpXG4rXHRcdHJldHVybjtcbitcbitcdGlmIChkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZShkZXYsIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVMpKVxuK1x0XHRXUklURV9PTkNFKHByaXYtXHUwMDNlcmVzY3VlX2ZhaWxlZCwgdHJ1ZSk7XG4rfVxuK1xuKy8qIERldGVjdCBNQ1Vib290IHJlc2N1ZSBtb2RlIG92ZXIgY2xhdXNlLTIyIFNNRElPIGFsb25lLCBzbyB0aGUgY2FsbGVyIGNhbiBydWxlXG4rICogdGhlIGxvYWRlciBvdXQgYmVmb3JlIGFueSBDNDUgQVBJIHJlcXVlc3QgKHdoaWNoIHNwZXdzIENSQyBlcnJvcnMgd2hlbiBubyBXU1BcbisgKiBmaXJtd2FyZSBhbnN3ZXJzKS4gQSBzY3JhdGNoIHdyaXRlIHRvIEFERFIvREFUQSBtdXN0IGxhdGNoIG9yIHRoZSBjaGlwIGlzXG4rICogYWJzZW50ICgtRU5PREVWKTsgdGhlIG1haWxib3ggaXMgcmVzZXQgZmlyc3QsIG9yIGEgdHJhbnNmZXIgaW50ZXJydXB0ZWQgd2l0aFxuKyAqIENUUkw9V1Igd291bGQgdGFrZSB0aGF0IHdyaXRlIGFzIGEgcGF5bG9hZCB3b3JkIGluc3RlYWQgb2YgbGF0Y2hpbmcgaXQuIFNUQVRcbisgKiB0aGVuIGNsYXNzaWZpZXMgdGhlIHN0YXRlLCBwb2tlZCBkZXN0cnVjdGl2ZWx5IG9ubHkgd2hlbiAwLCB0aGUgb25lIHZhbHVlIGFcbisgKiBydW5uaW5nIGZpcm13YXJlIG5ldmVyIGhvbGRzOlxuKyAqXG4rICogIC0gMHhjMzNjOiBmbGFzaGxlc3MgbG9vcDsgcmVjb2duaXNlZCBidXQgbm90IHN1cHBvcnRlZCBoZXJlLlxuKyAqICAtIDB4YzU1YzogY29uc29sZSBsb29wLCBpZiB0aGUgcmVnaXN0ZXItcmVhZCBjaGFsbGVuZ2UgaXMgc2VydmljZWQuXG4rICogIC0gb3RoZXIgbm9uLXplcm86IHJ1bm5pbmcgZmlybXdhcmUsIGxlZnQgdW5wb2tlZC5cbisgKiAgLSAwOiB3ZWRnZWQgcmVjZWl2ZSBsb29wOyB0aGUgMS1ieXRlIHNsaWNlLWFkdmFuY2UgdGhlbiBzYXlzIHdoZXRoZXIgaXRcbisgKiAgICBzdGlsbCBuZWVkcyBkcmFpbmluZyBvciBoYXMganVzdCBmaW5pc2hlZC5cbisgKlxuKyAqIFRoZSBzY3JhdGNoIHdyaXRlIHJlYWNoZXMgYSBydW5uaW5nIGZpcm13YXJlIHRvbywgYnV0IGxhbmRzIGluIG1haWxib3hcbisgKiByZWdpc3RlcnMgaXQgZG9lcyBub3QgcmVhZCwgc28gaXQgaXMgaW5lcnQgdGhlcmUuXG4rICpcbisgKiBSZXR1cm46IE1YTDg2MlhYX0lOX1JFU0NVRSwgTVhMODYyWFhfTk9UX1JFU0NVRSwgLUVOT0RFViB3aGVuIHRoZSBzY3JhdGNoXG4rICogd3JpdGUgZG9lcyBub3QgbGF0Y2gsIHdoaWNoIGlzIGEgc3dpdGNoIHRoYXQgZG9lcyBub3QgYW5zd2VyIGF0IGFsbCBvciBvbmVcbisgKiB3aG9zZSBTQiBQREkgd2luZG93IGlzIG5vdCBhdCB0aGUgb2Zmc2V0cyBhYm92ZSwgLUVPUE5PVFNVUFAgZm9yIHRoZVxuKyAqIGZsYXNobGVzcyBsb29wLCAtRU5YSU8gZm9yIGEgUkVBRFkgbG9hZGVyIHdob3NlIG1haWxib3ggZmFpbHMgdGhlIGNoYWxsZW5nZSxcbisgKiBvciBhbiBTTURJTyBidXMgZXJyb3IuXG4rICovXG4raW50IG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdilcbit7XG4rXHRpbnQgc3RhdCwgZGF0LCByZXQsIHJiLCBhLCBkO1xuK1xuK1x0LyogcmVzY3VlX3JlYWR5IGdhdGVzIGZsYXNoaW5nOyBhIHdlZGdlZCBsb2FkZXIgbmVlZHMgdGhlIGRyYWluIGZpcnN0LiAqL1xuK1x0V1JJVEVfT05DRShwcml2LVx1MDAzZXJlc2N1ZV9yZWFkeSwgZmFsc2UpO1xuK1xuK1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdC8qIFByZXNlbmNlOiBhIGxpdmUgY2hpcCBsYXRjaGVzIHRoZSBzY3JhdGNoIHdyaXRlLCBhbiBhYnNlbnQgb25lIGZsb2F0cy4gKi9cbitcdGEgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUixcbitcdFx0XHRcdCBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSk7XG4rXHRpZiAoYSBcdTAwM2MgMClcbitcdFx0cmV0dXJuIGE7XG4rXHRkID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsXG4rXHRcdFx0XHQgTVhMODYyWFhfU0JfUERJX1BST0JFX0QpO1xuK1x0aWYgKGQgXHUwMDNjIDApXG4rXHRcdHJldHVybiBkO1xuK1x0YSA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0FERFIpO1xuK1x0aWYgKGEgXHUwMDNjIDApXG4rXHRcdHJldHVybiBhO1xuK1x0ZCA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEpO1xuK1x0aWYgKGQgXHUwMDNjIDApXG4rXHRcdHJldHVybiBkO1xuK1x0aWYgKCh1MTYpYSAhPSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSB8fFxuK1x0ICAgICh1MTYpZCAhPSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfRClcbitcdFx0cmV0dXJuIC1FTk9ERVY7XG4rXG4rXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0c3RhdCA9IG14bDg2Mnh4X3NtZGlvX3JlYWQocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQpO1xuK1x0aWYgKHN0YXQgXHUwMDNjIDApXG4rXHRcdHJldHVybiBzdGF0O1xuK1xuK1x0LyogRmxhc2hsZXNzLWRvd25sb2FkIGxvb3AgKE14TDg2MjgxIHRpZXIpOiB1bnN1cHBvcnRlZC4gKi9cbitcdGlmICgodTE2KXN0YXQgPT0gTVhMODYyWFhfU0JfUERJX0RMX1JFQURZKVxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4rXHQvKiBDb25zb2xlIGxvb3AgYXQgUkVBRFk6IGNvbmZpcm0gdGhlIGxpdmUgbWFpbGJveCB3aXRoIHRoZSByZWdpc3Rlci1yZWFkXG4rXHQgKiBjaGFsbGVuZ2UgKGNvbnN1bWVzIHRoZSBtYXJrZXIgZnJvbSBEQVRBIGFuZCByZS1hcm1zIFJFQURZKS5cbitcdCAqL1xuK1x0aWYgKCh1MTYpc3RhdCA9PSBNWEw4NjJYWF9TQl9QRElfUkVBRFkpIHtcbitcdFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsXG4rXHRcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9SRFJFR19NQVJLKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RBVCxcbitcdFx0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX1JEUkVHKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRyYiA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfU0JfUERJX1JFQURZLFxuK1x0XHRcdFx0XHQgICAgICAgTVhMODYyWFhfU0JfUERJX1NURVBfTVMpO1xuK1x0XHRkYXQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBKTtcbitcdFx0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuK1x0XHQvKiBOZXZlciByZS1hcm1pbmcgUkVBRFkgZmFpbHMgdGhlIGNoYWxsZW5nZSBsaWtlIGFueSBvdGhlclxuK1x0XHQgKiB1bnNlcnZpY2VkIGNvbW1hbmQ7IHJlcG9ydCBpdCBhcyBzdWNoIHJhdGhlciB0aGFuIGFzIGEgYnVzXG4rXHRcdCAqIHRpbWVvdXQgdGhlIGJ1cyBuZXZlciBzYXcuXG4rXHRcdCAqL1xuK1x0XHRpZiAocmIgPT0gLUVUSU1FRE9VVClcbitcdFx0XHRyYiA9IC1FTlhJTztcbitcdFx0aWYgKHJiIFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByYjtcbitcdFx0aWYgKGRhdCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gZGF0O1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdGlmICgodTE2KWRhdCAhPSBNWEw4NjJYWF9TQl9QRElfUkRSRUdfTUFSSykge1xuK1x0XHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHksIHRydWUpO1xuK1x0XHRcdHJldHVybiBNWEw4NjJYWF9JTl9SRVNDVUU7XG4rXHRcdH1cbitcdFx0LyogUkVBRFkgYnV0IHRoZSBtYXJrZXIgaXMgdW50b3VjaGVkLCBzbyBub3RoaW5nIGlzIHNlcnZpY2luZyB0aGVcbitcdFx0ICogbWFpbGJveC4gQSBmaXJtd2FyZSBwdWJsaXNoaW5nIDB4YzU1YyBhcyBpdHMgc3RhdHVzIHdvcmQgbG9va3NcbitcdFx0ICogZXhhY3RseSBsaWtlIHRoaXMsIGFuZCBmbGFzaGluZyBvbmUgd291bGQgYmUgZmFyIHdvcnNlIHRoYW5cbitcdFx0ICogcmVmdXNpbmcgdG8gYmluZCwgc28gdHJlYXQgaXQgYXMgdW51c2FibGUuXG4rXHRcdCAqL1xuK1x0XHRyZXR1cm4gLUVOWElPO1xuK1x0fVxuK1xuK1x0LyogQW55IG90aGVyIG5vbi16ZXJvIHZhbHVlIGlzIGEgcnVubmluZyBmaXJtd2FyZSwgbm90IGEgbG9hZGVyLiAqL1xuK1x0aWYgKHN0YXQpXG4rXHRcdHJldHVybiBNWEw4NjJYWF9OT1RfUkVTQ1VFO1xuK1xuK1x0LyogU1RBVCA9PSAwOiBhIHdlZGdlZCByZWNlaXZlIGxvb3AgdGFrZXMgYSAxLWJ5dGUgc2xpY2UtYWR2YW5jZSAoZmVlZFxuK1x0ICogb25lIERBVEEgd29yZCBmaXJzdCwgbGlrZSBhIGRyYWluIGNodW5rKSBhbmQgYXNrcyBmb3IgdGhlIG5leHQgY2h1bmtcbitcdCAqIGJ5IHB1Ymxpc2hpbmcgMCBhZ2Fpbi4gSGFkIHRoYXQgYnl0ZSBiZWVuIHRoZSBsYXN0IG9uZSBvdXRzdGFuZGluZyxcbitcdCAqIHRoZSBsb2FkZXIgbGVhdmVzIHRoZSBsb29wIGluc3RlYWQgYW5kIHJldHVybnMgdG8gUkVBRFksIGhhdmluZ1xuK1x0ICogY29uc3VtZWQgdGhlIGFkdmFuY2UgLS0gcHJvb2YgZW5vdWdoIG9mIGEgbGl2ZSBtYWlsYm94IHRvIHNraXAgdGhlXG4rXHQgKiBjaGFsbGVuZ2UuIEFueXRoaW5nIGVsc2UgbWVhbnMgaXQgaXMgc3RpbGwgd29ya2luZyBvbiBpdC4gQWxsIHRocmVlXG4rXHQgKiBhcmUgcmVzY3VlLCBzbyB0aGlzIG5ldmVyIGZhaWxzIHByb2JlOyBvbmx5IHRoZSBkcmFpbiBkb2VzLlxuK1x0ICovXG4rXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbitcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcbitcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdHJldHVybiByZXQ7XG4rXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfREFUQSwgMHgwMDAwKTtcbitcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdHJldHVybiByZXQ7XG4rXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsXG4rXHRcdFx0XHQgICBNWEw4NjJYWF9EUkFJTl9DSFVOS19CWVRFUyk7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0cmIgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9kcmFpbihwcml2LCBNWEw4NjJYWF9TQl9QRElfU1RFUF9NUyk7XG4rXHRpZiAocmIgXHUwMDNjIDApXG4rXHRcdHJldHVybiByYjtcbitcdGlmIChyYiA9PSBNWEw4NjJYWF9TQl9QRElfUkVBRFkpXG4rXHRcdFdSSVRFX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHksIHRydWUpO1xuK1xuK1x0cmV0dXJuIE1YTDg2MlhYX0lOX1JFU0NVRTtcbit9XG4rXG4rLyogTUNVYm9vdCBmaXJtd2FyZSBpbWFnZSBoZWFkZXIgKi9cbitzdHJ1Y3QgbXhsODYyeHhfZndfaGRyIHtcbitcdF9fbGUzMiBpbWFnZV90eXBlO1xuK1x0X19sZTMyIGltYWdlX3NpemVfMTtcbitcdF9fbGUzMiBpbWFnZV9jaGVja3N1bV8xO1xuK1x0X19sZTMyIGltYWdlX3NpemVfMjtcbitcdF9fbGUzMiBpbWFnZV9jaGVja3N1bV8yO1xuK30gX19wYWNrZWQ7XG4rXG4rc3RhdGljIGludCBteGw4NjJ4eF9mbGFzaF92YWxpZGF0ZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdixcbitcdFx0XHRcdCAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsXG4rXHRcdFx0XHQgICB1MzIgKnBheWxvYWRfc2l6ZSlcbit7XG4rXHRjb25zdCBzdHJ1Y3QgbXhsODYyeHhfZndfaGRyICpoZHI7XG4rXHR1MzIgc2l6ZTEsIHNpemUyLCB0b3RhbDtcbitcdGNvbnN0IHU4ICpwYXlsb2FkO1xuK1x0dTMyIGNyYztcbitcbitcdGlmIChmdy1cdTAwM2VzaXplIFx1MDAzYyBNWEw4NjJYWF9GV19IRFJfU0laRSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRoZHIgPSAoY29uc3Qgc3RydWN0IG14bDg2Mnh4X2Z3X2hkciAqKWZ3LVx1MDAzZWRhdGE7XG4rXHRwYXlsb2FkID0gZnctXHUwMDNlZGF0YSArIE1YTDg2MlhYX0ZXX0hEUl9TSVpFO1xuK1x0c2l6ZTEgPSBsZTMyX3RvX2NwdShoZHItXHUwMDNlaW1hZ2Vfc2l6ZV8xKTtcbitcdHNpemUyID0gbGUzMl90b19jcHUoaGRyLVx1MDAzZWltYWdlX3NpemVfMik7XG4rXG4rXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KHNpemUxLCBzaXplMiwgXHUwMDI2dG90YWwpIHx8XG4rXHQgICAgdG90YWwgXHUwMDNlIGZ3LVx1MDAzZXNpemUgLSBNWEw4NjJYWF9GV19IRFJfU0laRSkge1xuK1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XCJmbGFzaDogZmlybXdhcmUgZmlsZSB0b28gc21hbGwgZm9yIGRlY2xhcmVkIHNpemVcXG5cIik7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0aWYgKCF0b3RhbCkge1xuK1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XCJmbGFzaDogZmlybXdhcmUgZmlsZSB3aXRoIGVtcHR5IHBheWxvYWRcXG5cIik7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0aWYgKHNpemUxKSB7XG4rXHRcdGNyYyA9IH5jcmMzMl9sZSh+MFUsIHBheWxvYWQsIHNpemUxKTtcbitcdFx0aWYgKGNyYyAhPSBsZTMyX3RvX2NwdShoZHItXHUwMDNlaW1hZ2VfY2hlY2tzdW1fMSkpIHtcbitcdFx0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XHRcImZsYXNoOiBpbWFnZSAxIENSQyBtaXNtYXRjaCAoZ290ICUwOHgsIGV4cGVjdGVkICUwOHgpXFxuXCIsXG4rXHRcdFx0XHRjcmMsIGxlMzJfdG9fY3B1KGhkci1cdTAwM2VpbWFnZV9jaGVja3N1bV8xKSk7XG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChzaXplMikge1xuK1x0XHRjcmMgPSB+Y3JjMzJfbGUofjBVLCBwYXlsb2FkICsgc2l6ZTEsIHNpemUyKTtcbitcdFx0aWYgKGNyYyAhPSBsZTMyX3RvX2NwdShoZHItXHUwMDNlaW1hZ2VfY2hlY2tzdW1fMikpIHtcbitcdFx0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XHRcImZsYXNoOiBpbWFnZSAyIENSQyBtaXNtYXRjaCAoZ290ICUwOHgsIGV4cGVjdGVkICUwOHgpXFxuXCIsXG4rXHRcdFx0XHRjcmMsIGxlMzJfdG9fY3B1KGhkci1cdTAwM2VpbWFnZV9jaGVja3N1bV8yKSk7XG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdH1cbitcdH1cbitcbitcdCpwYXlsb2FkX3NpemUgPSB0b3RhbDtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LFxuK1x0XHRcdFx0ICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyxcbitcdFx0XHRcdCAgIHUzMiBwYXlsb2FkX3NpemUsIHN0cnVjdCBkZXZsaW5rICpkbClcbit7XG4rXHRjb25zdCB1OCAqcGF5bG9hZCA9IGZ3LVx1MDAzZWRhdGEgKyBNWEw4NjJYWF9GV19IRFJfU0laRTtcbitcdHUzMiB3b3JkX2lkeCA9IDAsIGRhdGFfd3JpdHRlbiA9IDAsIGlkeCA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIG5leHRfbm90aWZ5ID0gamlmZmllcyAtIDE7XG4rXHR1MTYgd29yZCwgZmRhdGE7XG4rXHRpbnQgcmV0LCBpO1xuK1xuK1x0LyogU3RlcCAxOiByZWJvb3QgdGhlIGZpcm13YXJlIGludG8gTUNVYm9vdCByZXNjdWUgbW9kZSAqL1xuK1x0aWYgKCFwcml2LVx1MDAzZXJlc2N1ZV9tb2RlKSB7XG4rXHRcdHJldCA9IG14bDg2Mnh4X2FwaV93cmFwKHByaXYsIFNZU19NSVNDX0ZXX1VQREFURSwgTlVMTCwgMCxcbitcdFx0XHRcdFx0ZmFsc2UsIGZhbHNlKTtcbitcdFx0aWYgKHJldCkge1xuK1x0XHRcdGRldl9lcnIoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWRldixcbitcdFx0XHRcdFwiZmxhc2g6IEZXX1VQREFURSBjb21tYW5kIGZhaWxlZDogJXBlXFxuXCIsXG4rXHRcdFx0XHRFUlJfUFRSKHJldCkpO1xuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdH1cbitcdH1cbitcbitcdC8qIFN0ZXAgMjogd2FpdCBmb3IgYm9vdGxvYWRlciByZWFkeSAqL1xuK1x0bXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCBcIldhaXRpbmcgZm9yIGJvb3Rsb2FkZXJcIiwgMCwgMCk7XG4rXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcmVzZXQocHJpdik7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRnb3RvIHdyaXRlX2VycjtcbitcbitcdC8qIEZhaWx1cmVzIGZyb20gaGVyZSBvbiBlbmQgdXAgYXQgbm9fZW5kLCB3aGljaCByZXR1cm5zIHRoZSBlcnJvclxuK1x0ICogd2l0aG91dCBzaWduYWxsaW5nIEVORCAtLSBzZWUgdGhlcmUuXG4rXHQgKi9cbitcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9wb2xsX3N0YXQocHJpdiwgTVhMODYyWFhfU0JfUERJX1JFQURZLFxuK1x0XHRcdFx0XHRNWEw4NjJYWF9GV19SRUFEWV9USU1FT1VUX01TKTtcbitcdGlmIChyZXQpIHtcbitcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuK1x0XHRcdFwiZmxhc2g6IGJvb3Rsb2FkZXIgbm90IHJlYWR5OiAlcGVcXG5cIiwgRVJSX1BUUihyZXQpKTtcbitcdFx0Z290byBub19lbmQ7XG4rXHR9XG4rXG4rXHQvKiBTdGVwIDM6IHN0YXJ0IGhhbmRzaGFrZSAqL1xuK1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsXG4rXHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfU1RBUlQpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0Z290byB3cml0ZV9lcnI7XG4rXG4rXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFSVCArIDEsXG4rXHRcdFx0XHRcdE1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TKTtcbitcdGlmIChyZXQpIHtcbitcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuK1x0XHRcdFwiZmxhc2g6IHN0YXJ0IGhhbmRzaGFrZSBmYWlsZWQ6ICVwZVxcblwiLCBFUlJfUFRSKHJldCkpO1xuK1x0XHRnb3RvIG5vX2VuZDtcbitcdH1cbitcbitcdC8qIFN0ZXAgNDogdHJhbnNmZXIgaW1hZ2UgaGVhZGVyICovXG4rXHRteGw4NjJ4eF9mbGFzaF9ub3RpZnkoZGwsIFwiRXJhc2luZyBmbGFzaFwiLCAwLCAwKTtcbitcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuK1x0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0Z290byB3cml0ZV9lcnI7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBNWEw4NjJYWF9GV19IRFJfU0laRSAvIDI7IGkrKykge1xuK1x0XHR3b3JkID0gZnctXHUwMDNlZGF0YVtpICogMl0gfFxuK1x0XHQgICAgICAgKCh1MTYpZnctXHUwMDNlZGF0YVtpICogMiArIDFdIFx1MDAzY1x1MDAzYyA4KTtcbitcdFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsIHdvcmQpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gd3JpdGVfZXJyO1xuK1x0fVxuK1xuK1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3Jlc2V0KHByaXYpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0Z290byB3cml0ZV9lcnI7XG4rXG4rXHQvKiB0aGUgYnl0ZSBjb3VudCBpbiBTVEFUIHRyaWdnZXJzIHRoZSBlcmFzZSAqL1xuK1x0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX1NUQVQsXG4rXHRcdFx0XHQgICBNWEw4NjJYWF9GV19IRFJfU0laRSk7XG4rXHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRnb3RvIHdyaXRlX2VycjtcbitcbitcdC8qIEFDSyBpcyBieXRlIGNvdW50ICsgMSAqL1xuK1x0cmV0ID0gbXhsODYyeHhfc2JfcGRpX3BvbGxfc3RhdChwcml2LCBNWEw4NjJYWF9GV19IRFJfU0laRSArIDEsXG4rXHRcdFx0XHRcdE1YTDg2MlhYX0ZXX0FDS19USU1FT1VUX01TKTtcbitcdGlmIChyZXQpIHtcbitcdFx0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LFxuK1x0XHRcdFwiZmxhc2g6IGhlYWRlciBBQ0sgZmFpbGVkOiAlcGVcXG5cIiwgRVJSX1BUUihyZXQpKTtcbitcdFx0Z290byBub19lbmQ7XG4rXHR9XG4rXG4rXHQvKiBTdGVwIDU6IHdhaXQgZm9yIGVyYXNlIHRvIGNvbXBsZXRlICovXG4rXHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfcG9sbF9zdGF0KHByaXYsIDAsXG4rXHRcdFx0XHRcdE1YTDg2MlhYX0ZXX0VSQVNFX1RJTUVPVVRfTVMpO1xuK1x0aWYgKHJldCkge1xuK1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XCJmbGFzaDogZXJhc2UgdGltZW91dDogJXBlXFxuXCIsIEVSUl9QVFIocmV0KSk7XG4rXHRcdGdvdG8gbm9fZW5kO1xuK1x0fVxuK1xuK1x0LyogU3RlcCA2OiB0cmFuc2ZlciBwYXlsb2FkICovXG4rXHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbitcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1dSKTtcbitcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdGdvdG8gd3JpdGVfZXJyO1xuK1xuK1x0d2hpbGUgKGlkeCBcdTAwM2MgcGF5bG9hZF9zaXplKSB7XG4rXHRcdGNvbmRfcmVzY2hlZCgpO1xuK1x0XHRpZiAoaWR4ICsgMSBcdTAwM2MgcGF5bG9hZF9zaXplKSB7XG4rXHRcdFx0ZmRhdGEgPSBwYXlsb2FkW2lkeF0gfFxuK1x0XHRcdFx0KCh1MTYpcGF5bG9hZFtpZHggKyAxXSBcdTAwM2NcdTAwM2MgOCk7XG4rXHRcdFx0aWR4ICs9IDI7XG4rXHRcdFx0ZGF0YV93cml0dGVuICs9IDI7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0ZmRhdGEgPSBwYXlsb2FkW2lkeF07XG4rXHRcdFx0aWR4Kys7XG4rXHRcdFx0ZGF0YV93cml0dGVuKys7XG4rXHRcdH1cbitcbitcdFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0RBVEEsIGZkYXRhKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRnb3RvIHdyaXRlX2VycjtcbitcdFx0d29yZF9pZHgrKztcbitcbitcdFx0aWYgKGlkeCBcdTAwM2U9IHBheWxvYWRfc2l6ZSkge1xuK1x0XHRcdHJldCA9IG14bDg2Mnh4X3NiX3BkaV9mbHVzaF9sYXN0KHByaXYsIGRhdGFfd3JpdHRlbik7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbitcbitcdFx0LyogSGFsZi1iYW5rIGJvdW5kYXJ5OiBzd2l0Y2ggdG8gU0IxIGFkZHJlc3MgKi9cbitcdFx0aWYgKHdvcmRfaWR4ID09IE1YTDg2MlhYX0ZXX0JBTktfSEFMRikge1xuK1x0XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9DVFJMLFxuK1x0XHRcdFx0XHRcdCAgIE1YTDg2MlhYX1NCX1BESV9DVFJMX1JTVCk7XG4rXHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRcdGdvdG8gd3JpdGVfZXJyO1xuK1xuK1x0XHRcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9BRERSLFxuK1x0XHRcdFx0XHRcdCAgIE1YTDg2MlhYX0ZXX1NCMV9BRERSKTtcbitcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdFx0Z290byB3cml0ZV9lcnI7XG4rXG4rXHRcdFx0cmV0ID0gbXhsODYyeHhfc21kaW9fd3JpdGUocHJpdiwgTVhMODYyWFhfU0JfUERJX0NUUkwsXG4rXHRcdFx0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0NUUkxfV1IpO1xuK1x0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4rXHRcdFx0XHRnb3RvIHdyaXRlX2VycjtcbitcdFx0fSBlbHNlIGlmICh3b3JkX2lkeCBcdTAwM2U9IE1YTDg2MlhYX0ZXX0JBTktfU0xJQ0UpIHtcbitcdFx0XHRyZXQgPSBteGw4NjJ4eF9zYl9wZGlfZmx1c2hfc2xpY2UocHJpdiwgZGF0YV93cml0dGVuKTtcbitcdFx0XHRpZiAocmV0KSB7XG4rXHRcdFx0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XHRcdFwiZmxhc2g6IHdyaXRlIHRpbWVvdXQgYXQgJXUvJXU6ICVwZVxcblwiLFxuK1x0XHRcdFx0XHRpZHgsIHBheWxvYWRfc2l6ZSwgRVJSX1BUUihyZXQpKTtcbitcdFx0XHRcdGdvdG8gbm9fZW5kO1xuK1x0XHRcdH1cbitcdFx0XHR3b3JkX2lkeCA9IDA7XG4rXHRcdFx0ZGF0YV93cml0dGVuID0gMDtcbitcdFx0XHRyZXQgPSBteGw4NjJ4eF9zbWRpb193cml0ZShwcml2LCBNWEw4NjJYWF9TQl9QRElfQ1RSTCxcbitcdFx0XHRcdFx0XHQgICBNWEw4NjJYWF9TQl9QRElfQ1RSTF9XUik7XG4rXHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRcdGdvdG8gd3JpdGVfZXJyO1xuK1xuK1x0XHRcdGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG5leHRfbm90aWZ5KSkge1xuK1x0XHRcdFx0bXhsODYyeHhfZmxhc2hfbm90aWZ5KGRsLCBcIkZsYXNoaW5nXCIsIGlkeCxcbitcdFx0XHRcdFx0XHQgICAgICBwYXlsb2FkX3NpemUpO1xuK1x0XHRcdFx0bmV4dF9ub3RpZnkgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0fVxuK1xuK1x0aWYgKHJldCkge1xuK1x0XHRkZXZfZXJyKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VkZXYsXG4rXHRcdFx0XCJmbGFzaDogZmluYWwgc2xpY2UgZmFpbGVkOiAlcGVcXG5cIiwgRVJSX1BUUihyZXQpKTtcbitcdFx0Z290byBub19lbmQ7XG4rXHR9XG4rXG4rXHRteGw4NjJ4eF9mbGFzaF9ub3RpZnkoZGwsIFwiRmxhc2hpbmdcIiwgcGF5bG9hZF9zaXplLCBwYXlsb2FkX3NpemUpO1xuK1xuK1x0LyogU3VjY2VzczogdGhlIGxvYWRlciBoYXMgbGVmdCB0aGUgcmVjZWl2ZSBsb29wIGF0IHJfcmVtYWluID09IDAgYW5kXG4rXHQgKiB2ZXJpZmllZCB0aGUgaW1hZ2UsIHNvIEVORCgweDNjYzMpIGlzIGEgZmluYWxpc2UvYm9vdCByZXF1ZXN0IHJhdGhlclxuK1x0ICogdGhhbiBhIGJ5dGUgY291bnQuIFNpZ25hbCBpdCBoZXJlIC0tIGFuZCBvbmx5IGhlcmUgLS0gdG8gYm9vdCB0aGUgbmV3XG4rXHQgKiBpbWFnZSB3aXRob3V0IHdhaXRpbmcgb3V0IHRoZSBsb2FkZXIncyAyIHMgRU5EIHRpbWVvdXQuXG4rXHQgKi9cbitcdHJldCA9IG14bDg2Mnh4X3NtZGlvX3dyaXRlKHByaXYsIE1YTDg2MlhYX1NCX1BESV9TVEFULFxuK1x0XHRcdFx0ICAgTVhMODYyWFhfU0JfUERJX0VORCk7XG4rXHRtc2xlZXAoTVhMODYyWFhfRldfUkVCT09UX0RFTEFZX01TKTtcbitcdHJldHVybiByZXQ7XG4rXG4rd3JpdGVfZXJyOlxuK1x0ZGV2X2VycihcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlZGV2LCBcImZsYXNoOiBTTURJTyB3cml0ZSBmYWlsZWQ6ICVwZVxcblwiLFxuK1x0XHRFUlJfUFRSKHJldCkpO1xuK25vX2VuZDpcbitcdC8qIEEgZmFpbHVyZSBsZWF2ZXMgdGhlIGxvYWRlciBtaWQgdHJhbnNmZXI7IGRvIG5vdCBzaWduYWwgRU5EIChhIFNUQVRcbitcdCAqIHdyaXRlIGlzIGEgYnl0ZSBjb3VudCB0aGVuLCBhbmQgRU5EIHdvdWxkIGJlIG1pc3JlYWQgYXMgb25lLCByaXNraW5nXG4rXHQgKiBhIHJlY2VpdmUtY291bnRlciB1bmRlcmZsb3cpLiBSZXR1cm4gdGhlIGVycm9yOyB0aGUgY2FsbGVyIHJlcHJvYmVzLlxuK1x0ICovXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitpbnQgbXhsODYyeHhfZGV2bGlua19pbmZvX2dldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsXG4rXHRcdFx0ICAgICAgc3RydWN0IGRldmxpbmtfaW5mb19yZXEgKnJlcSxcbitcdFx0XHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4re1xuK1x0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cdTAwM2Vwcml2O1xuK1x0Y2hhciBidWZbMTZdO1xuK1x0aW50IHJldDtcbitcbitcdC8qIE5vIGNoaXAtaWQvcmV2aXNpb24gaW4gTUNVYm9vdCAobmVlZHMgdGhlIGZpcm13YXJlIE1NRCBtYWlsYm94KS4gVGhlXG4rXHQgKiBmdyB2ZXJzaW9uIGRvdWJsZXMgYXMgdGhlIFwicmVhZHkgdG8gZmxhc2hcIiBzaWduYWw6IHJlcG9ydCBpdCBvbmx5XG4rXHQgKiBvbmNlIHRoZSBsb2FkZXIgaXMgYXQgYSBjbGVhbiBSRUFEWSwgbm90aGluZyB3aGlsZSBzdGlsbCBkcmFpbmluZy5cbitcdCAqL1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpIHtcbitcdFx0aWYgKCFSRUFEX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHkpKVxuK1x0XHRcdHJldHVybiAwO1xuK1xuK1x0XHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcIiV1LiV1LiV1XCIsXG4rXHRcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5tYWpvciwgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1pbm9yLFxuK1x0XHRcdCBwcml2LVx1MDAzZWZ3X3ZlcnNpb24ucmV2aXNpb24pO1xuK1x0XHRyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9ydW5uaW5nX3B1dChyZXEsXG4rXHRcdFx0XHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdHJldHVybiBkZXZsaW5rX2luZm9fdmVyc2lvbl9zdG9yZWRfcHV0KHJlcSxcbitcdFx0XHRcdERFVkxJTktfSU5GT19WRVJTSU9OX0dFTkVSSUNfRlcsIGJ1Zik7XG4rXHR9XG4rXG4rXHQvKiBBIDAgcGFydCBudW1iZXIgbWVhbnMgdGhlIENISVAgSUQgcmVhZCBmYWlsZWQgb3IgdGhlIHBhcnQgaXNcbitcdCAqIHVuZnVzZWQ7IG9taXQgaXQgcmF0aGVyIHRoYW4gcHVibGlzaCBhIGJvZ3VzIFwiMDAwMFwiIHRoYXQgZnd1cGRcbitcdCAqIHdvdWxkIG1hdGNoIGZpcm13YXJlIGFnYWluc3QgLS0gaXQgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBkcml2ZXJcbitcdCAqIG5hbWUuXG4rXHQgKi9cbitcdGlmIChwcml2LVx1MDAzZWFzaWNfaWQpIHtcbitcdFx0c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgXCIlMDRYXCIsIHByaXYtXHUwMDNlYXNpY19pZCk7XG4rXHRcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXG4rXHRcdFx0XHRcdFx0ICAgICBERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0FTSUNfSUQsXG4rXHRcdFx0XHRcdFx0ICAgICBidWYpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXG4rXHRcdHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFwiJXVcIiwgcHJpdi1cdTAwM2Vhc2ljX3Jldik7XG4rXHRcdHJldCA9IGRldmxpbmtfaW5mb192ZXJzaW9uX2ZpeGVkX3B1dChyZXEsXG4rXHRcdFx0XHRcdFx0ICAgICBERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0FTSUNfUkVWLFxuK1x0XHRcdFx0XHRcdCAgICAgYnVmKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0fVxuK1xuK1x0LyogQW4gYWxsLXplcm8gdmVyc2lvbiBpcyB0aGUgY2FjaGUgYSBmYWlsZWQgZmxhc2ggbGVmdCBiZWhpbmQsIG5vdCBhXG4rXHQgKiByZWxlYXNlZCBmaXJtd2FyZTsgb21pdCBpdCBsaWtlIHRoZSBwYXJ0IG51bWJlciBhYm92ZS5cbitcdCAqL1xuK1x0aWYgKCFwcml2LVx1MDAzZWZ3X3ZlcnNpb24ubWFqb3IgXHUwMDI2XHUwMDI2ICFwcml2LVx1MDAzZWZ3X3ZlcnNpb24ubWlub3IgXHUwMDI2XHUwMDI2XG4rXHQgICAgIXByaXYtXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbilcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcIiV1LiV1LiV1XCIsXG4rXHRcdCBwcml2LVx1MDAzZWZ3X3ZlcnNpb24ubWFqb3IsIHByaXYtXHUwMDNlZndfdmVyc2lvbi5taW5vcixcbitcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbik7XG4rXG4rXHRyZXQgPSBkZXZsaW5rX2luZm9fdmVyc2lvbl9ydW5uaW5nX3B1dChyZXEsXG4rXHRcdFx0REVWTElOS19JTkZPX1ZFUlNJT05fR0VORVJJQ19GVywgYnVmKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKiBib290cyB0aGlzIGltYWdlIGZyb20gaXRzIG93biBmbGFzaDogc3RvcmVkID09IHJ1bm5pbmcgKi9cbitcdHJldHVybiBkZXZsaW5rX2luZm9fdmVyc2lvbl9zdG9yZWRfcHV0KHJlcSxcbitcdFx0XHRERVZMSU5LX0lORk9fVkVSU0lPTl9HRU5FUklDX0ZXLCBidWYpO1xuK31cbitcbitpbnQgbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuK1x0XHRcdFx0ICBzdHJ1Y3QgZGV2bGlua19mbGFzaF91cGRhdGVfcGFyYW1zICpwYXJhbXMsXG4rXHRcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbit7XG4rXHRzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLVx1MDAzZXByaXY7XG4rXHRzdHJ1Y3QgZHNhX3BvcnQgKmRwO1xuK1x0dTMyIHBheWxvYWRfc2l6ZTtcbitcdGludCByZXQsIGVyciwgaTtcbitcbitcdGlmIChwYXJhbXMtXHUwMDNlY29tcG9uZW50KSB7XG4rXHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwiY29tcG9uZW50IGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcdH1cbitcbitcdC8qIEEgcHJldmlvdXMgZmxhc2ggaXMgc3RpbGwgd2FpdGluZyBmb3IgaXRzIHJlcHJvYmU6IHRoZSBmaXJtd2FyZSBBUElcbitcdCAqIGlzIHNob3J0LWNpcmN1aXRlZCwgc28gdGhlIHJhdyBTQiBQREkgd3JpdGVzIGJlbG93IHdvdWxkIHJ1biBhZ2FpbnN0XG4rXHQgKiBhIHN3aXRjaCB0aGlzIGRyaXZlciBubyBsb25nZXIgdHJhY2tzLlxuK1x0ICovXG4rXHRpZiAocHJpdi1cdTAwM2Vza2lwX3RlYXJkb3duKSB7XG4rXHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXG4rXHRcdFx0XHQgICBcImRldmljZSBpcyByZWluaXRpYWxpemluZywgcmV0cnkgbGF0ZXJcIik7XG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXHR9XG4rXG4rXHRyZXQgPSBteGw4NjJ4eF9mbGFzaF92YWxpZGF0ZShwcml2LCBwYXJhbXMtXHUwMDNlZncsIFx1MDAyNnBheWxvYWRfc2l6ZSk7XG4rXHRpZiAocmV0KSB7XG4rXHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssIFwiZmlybXdhcmUgaW1hZ2UgdmFsaWRhdGlvbiBmYWlsZWRcIik7XG4rXHRcdHJldHVybiByZXQ7XG4rXHR9XG4rXG4rXHQvKiBSZWZ1c2UgdG8gZmxhc2ggd2hpbGUgdGhlIGJhY2tncm91bmQgc2VsZi1oZWFsIGlzIHN0aWxsIGRyYWluaW5nLCBhbmRcbitcdCAqIGZvciBnb29kIG9uY2UgaXQgaGFzIGdpdmVuIHVwIG9uIHRoZSBsb2FkZXIuXG4rXHQgKi9cbitcdGlmIChSRUFEX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfZmFpbGVkKSkge1xuK1x0XHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLFxuK1x0XHRcdFx0ICAgXCJkb3dubG9hZCByZWNvdmVyeSBmYWlsZWQsIHBvd2VyIGN5Y2xlIHRoZSBzd2l0Y2hcIik7XG4rXHRcdHJldHVybiAtRUlPO1xuK1x0fVxuK1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUgXHUwMDI2XHUwMDI2ICFSRUFEX09OQ0UocHJpdi1cdTAwM2VyZXNjdWVfcmVhZHkpKSB7XG4rXHRcdE5MX1NFVF9FUlJfTVNHX01PRChleHRhY2ssXG4rXHRcdFx0XHQgICBcInN3aXRjaCBpcyByZWNvdmVyaW5nIGFuIGludGVycnVwdGVkIGRvd25sb2FkLCByZXRyeSBzaG9ydGx5XCIpO1xuK1x0XHRyZXR1cm4gLUVCVVNZO1xuK1x0fVxuK1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpXG4rXHRcdGRldl9pbmZvKGRzLVx1MDAzZWRldixcbitcdFx0XHQgXCJmbGFzaDogZmxhc2hpbmcgc3dpdGNoIHZpYSBNQ1Vib290IHJlc2N1ZSBtb2RlXFxuXCIpO1xuK1x0ZWxzZVxuK1x0XHRkZXZfaW5mbyhkcy1cdTAwM2VkZXYsIFwiZmxhc2g6IHJ1bm5pbmcgZmlybXdhcmUgJXUuJXUuJXVcXG5cIixcbitcdFx0XHQgcHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1ham9yLCBwcml2LVx1MDAzZWZ3X3ZlcnNpb24ubWlub3IsXG4rXHRcdFx0IHByaXYtXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbik7XG4rXG4rXHQvKiBDbG9zZSBwb3J0cyB3aGlsZSB0aGUgZmlybXdhcmUgaXMgc3RpbGwgYWxpdmUgc28gdGhlIERTQSBjb3JlJ3NcbitcdCAqIE1EQi9GREIgdHJhY2tpbmcgaXMgZHJhaW5lZCwgYW5kIGRldGFjaCB1c2VyIHBvcnRzIHNvIHVzZXJzcGFjZVxuK1x0ICogY2Fubm90IHJlb3BlbiB0aGVtIGR1cmluZyB0aGUgZmxhc2guIFRoZSBjb25kdWl0IGlzIG9ubHkgY2xvc2VkLFxuK1x0ICogbm90IGRldGFjaGVkOiBpdCBiZWxvbmdzIHRvIHRoZSBNQUMgZHJpdmVyLiBUaGlzIGRyaXZlciBiaW5kcyBhXG4rXHQgKiBzaW5nbGUgc3dpdGNoIHdpdGggYSBkaXJlY3QgaG9zdCBsaW5rIGFuZCBubyBjYXNjYWRlIHBvcnRzLCBzbyB0aGVcbitcdCAqIGNvbmR1aXQgc2VydmVzIG9ubHkgdGhpcyBzd2l0Y2gsIGFuZCBmbGFzaGluZyBpdCByZWJvb3RzIHRoZSBzd2l0Y2gsXG4rXHQgKiB3aGljaCB0YWtlcyB0aGUgdHJlZSBkb3duIHJlZ2FyZGxlc3MuXG4rXHQgKi9cbitcdHJ0bmxfbG9jaygpO1xuK1x0ZHNhX3N3aXRjaF9mb3JfZWFjaF91c2VyX3BvcnQoZHAsIGRzKSB7XG4rXHRcdGlmIChkcC1cdTAwM2V1c2VyKSB7XG4rXHRcdFx0ZGV2X2Nsb3NlKGRwLVx1MDAzZXVzZXIpO1xuK1x0XHRcdG5ldGlmX2RldmljZV9kZXRhY2goZHAtXHUwMDNldXNlcik7XG4rXHRcdH1cbitcdH1cbitcdGRzYV9zd2l0Y2hfZm9yX2VhY2hfY3B1X3BvcnQoZHAsIGRzKVxuK1x0XHRkZXZfY2xvc2UoZHAtXHUwMDNlY29uZHVpdCk7XG4rXHQvKiBUaGUgYnJpZGdlIGRlZmVycyB0aGUgU1RQIHN0YXRlIGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IGNsb3NpbmdcbitcdCAqIHRoZSBwb3J0czsgbGV0IHRoZW0gcmVhY2ggdGhlIGZpcm13YXJlIHdoaWxlIGl0IGlzIHN0aWxsIGFsaXZlLlxuK1x0ICovXG4rXHRzd2l0Y2hkZXZfZGVmZXJyZWRfcHJvY2VzcygpO1xuK1x0cnRubF91bmxvY2soKTtcbitcbitcdG11dGV4X2xvY2tfbmVzdGVkKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7XG4rXHRwcml2LVx1MDAzZWJsb2NrX2hvc3QgPSB0cnVlO1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrKTtcbitcbitcdHNldF9iaXQoTVhMODYyWFhfRkxBR19XT1JLX1NUT1BQRUQsIFx1MDAyNnByaXYtXHUwMDNlZmxhZ3MpO1xuK1x0Y2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKFx1MDAyNnByaXYtXHUwMDNlc3RhdHNfd29yayk7XG4rXHRjYW5jZWxfd29ya19zeW5jKFx1MDAyNnByaXYtXHUwMDNlY3JjX2Vycl93b3JrKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRzLVx1MDAzZW51bV9wb3J0czsgaSsrKVxuK1x0XHRjYW5jZWxfd29ya19zeW5jKFx1MDAyNnByaXYtXHUwMDNlcG9ydHNbaV0uaG9zdF9mbG9vZF93b3JrKTtcbitcbitcdHJldCA9IG14bDg2Mnh4X2ZsYXNoX2Zpcm13YXJlKHByaXYsIHBhcmFtcy1cdTAwM2VmdywgcGF5bG9hZF9zaXplLFxuK1x0XHRcdFx0ICAgICAgZHMtXHUwMDNlZGV2bGluayk7XG4rXHRpZiAocmV0KVxuK1x0XHROTF9TRVRfRVJSX01TR19NT0QoZXh0YWNrLCBcImZpcm13YXJlIHRyYW5zZmVyIGZhaWxlZFwiKTtcbitcbitcdGlmICghcmV0KSB7XG4rXHRcdG11dGV4X2xvY2tfbmVzdGVkKFx1MDAyNnByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXMtXHUwMDNlbWRpb19sb2NrLFxuK1x0XHRcdFx0ICBNRElPX01VVEVYX05FU1RFRCk7XG4rXHRcdHByaXYtXHUwMDNlYmxvY2tfaG9zdCA9IGZhbHNlO1xuK1x0XHRwcml2LVx1MDAzZXJlc2N1ZV9tb2RlID0gZmFsc2U7XG4rXHRcdG11dGV4X3VubG9jayhcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzLVx1MDAzZW1kaW9fbG9jayk7XG4rXG4rXHRcdC8qIFJlZnJlc2ggdGhlIGNhY2hlZCB2ZXJzaW9ucyBzbyB0aGUgZmxhc2ggdXBkYXRlIG9ubHlcbitcdFx0ICogY29tcGxldGVzIG9uY2UgdGhlIG5ldyBmaXJtd2FyZSBpcyBjb25maXJtZWQgcnVubmluZyBhbmRcbitcdFx0ICogZGV2bGluayBkZXYgaW5mbyByZXBvcnRzIGl0LiBNdXN0IGhhcHBlbiBiZWZvcmUgc2V0dGluZ1xuK1x0XHQgKiBza2lwX3RlYXJkb3duLCB3aGljaCBkaXNjYXJkcyBhbGwgZmlybXdhcmUgQVBJIHJlYWRzLlxuK1x0XHQgKi9cbitcdFx0cmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0TkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjayxcbitcdFx0XHRcdFx0ICAgXCJuZXcgZmlybXdhcmUgZGlkIG5vdCBiZWNvbWUgcmVhZHlcIik7XG4rXHR9XG4rXG4rXHRpZiAocmV0KSB7XG4rXHRcdC8qIFRoZSBzd2l0Y2ggaXMgaW4gTUNVYm9vdCB3aXRoIGVyYXNlZCBvciBwYXJ0bHkgd3JpdHRlbiBmbGFzaDtcbitcdFx0ICogZHJvcCB0aGUgY2FjaGVkIGlkZW50aXR5IHNvIGRldmxpbmsgZGV2IGluZm8gc3RvcHMgcmVwb3J0aW5nXG4rXHRcdCAqIHRoZSBwcmUtZmxhc2ggdmVyc2lvbiB1bnRpbCB0aGUgcmVwcm9iZSByZS1yZWFkcyB0aGUgdHJ1dGguXG4rXHRcdCAqL1xuK1x0XHRtZW1zZXQoXHUwMDI2cHJpdi1cdTAwM2Vmd192ZXJzaW9uLCAwLCBzaXplb2YocHJpdi1cdTAwM2Vmd192ZXJzaW9uKSk7XG4rXHRcdHByaXYtXHUwMDNlYXNpY19pZCA9IDA7XG4rXHRcdHByaXYtXHUwMDNlYXNpY19yZXYgPSAwO1xuK1x0fVxuK1xuK1x0bXV0ZXhfbG9ja19uZXN0ZWQoXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWJ1cy1cdTAwM2VtZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTtcbitcdHByaXYtXHUwMDNlc2tpcF90ZWFyZG93biA9IHRydWU7XG4rXHRtdXRleF91bmxvY2soXHUwMDI2cHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWJ1cy1cdTAwM2VtZGlvX2xvY2spO1xuK1xuK1x0LyogUmVpbml0aWFsaXNlIHRocm91Z2ggYSBkZWZlcnJlZCByZS1wcm9iZTogcmVtb3ZlKCkgcnVucyB3aXRoXG4rXHQgKiBza2lwX3RlYXJkb3duIHNldCwgdGhlbiBhIGZyZXNoIHByb2JlKCkgc3RhcnRzIGFnYWluc3Qgd2hhdGV2ZXJcbitcdCAqIHRoZSBzd2l0Y2ggbm93IHJ1bnMuIFRoZSBjb3JlIHNraXBzIHRoZSByZS1wcm9iZSBpZiB0aGUgZGV2aWNlXG4rXHQgKiBpcyB1bmJvdW5kIG9yIHNodXQgZG93biBiZWZvcmUgaXQgZmlyZXMuXG4rXHQgKi9cbitcdGVyciA9IGRldmljZV9zY2hlZHVsZV9yZXByb2JlKGRzLVx1MDAzZWRldiwgTVhMODYyWFhfRldfUkVQUk9CRV9ERUxBWV9NUyk7XG4rXG4rXHRyZXR1cm4gcmV0ID8gcmV0IDogZXJyO1xuK31cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuaCBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uN2NkODdjN2FkODcxNlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmhcbkBAIC0wLDAgKzEsMjAgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xuK1xuKyNpZm5kZWYgX19NWEw4NjJYWF9GV19IXG4rI2RlZmluZSBfX01YTDg2MlhYX0ZXX0hcbitcbisjaW5jbHVkZSBcdTAwM2NuZXQvZHNhLmhcdTAwM2VcbitcbitzdHJ1Y3QgbXhsODYyeHhfcHJpdjtcbitzdHJ1Y3Qgd29ya19zdHJ1Y3Q7XG4rXG4raW50IG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdik7XG4rdm9pZCBteGw4NjJ4eF9yZXNjdWVfaGVhbF93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7XG4raW50IG14bDg2Mnh4X2RldmxpbmtfaW5mb19nZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuK1x0XHRcdCAgICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsXG4rXHRcdFx0ICAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKTtcbitpbnQgbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuK1x0XHRcdFx0ICBzdHJ1Y3QgZGV2bGlua19mbGFzaF91cGRhdGVfcGFyYW1zICpwYXJhbXMsXG4rXHRcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4rXG4rI2VuZGlmIC8qIF9fTVhMODYyWFhfRldfSCAqL1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmMgYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5jXG5pbmRleCA0YWNkMjE2ZjdjYzAwLi40ZGY3YzgzODA4ZjYwIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuY1xuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuY1xuQEAgLTE1LDYgKzE1LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91bmFsaWduZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9kc2EuaFx1MDAzZVxuICNpbmNsdWRlIFwibXhsODYyeHguaFwiXG4rI2luY2x1ZGUgXCJteGw4NjJ4eC1jbWQuaFwiXG4rI2luY2x1ZGUgXCJteGw4NjJ4eC1mdy5oXCJcbiAjaW5jbHVkZSBcIm14bDg2Mnh4LWhvc3QuaFwiXG4gXG4gI2RlZmluZSBDVFJMX0JVU1lfTUFTS1x0XHRcdEJJVCgxNSlcbkBAIC0zNDAsNiArMzQyLDIxIEBAIGludCBteGw4NjJ4eF9hcGlfd3JhcChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTE2IGNtZCwgdm9pZCAqX2RhdGEsXG4gXG4gXHRtdXRleF9sb2NrX25lc3RlZChcdTAwMjZwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzLVx1MDAzZW1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpO1xuIFxuK1x0aWYgKHByaXYtXHUwMDNlc2tpcF90ZWFyZG93bikge1xuK1x0XHRyZXQgPSByZWFkID8gLUVOT0RFViA6IDA7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpIHtcbitcdFx0cmV0ID0gLUVOT0RFVjtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAocHJpdi1cdTAwM2VibG9ja19ob3N0IFx1MDAyNlx1MDAyNiBjbWQgIT0gU1lTX01JU0NfRldfVVBEQVRFKSB7XG4rXHRcdHJldCA9IC1FQlVTWTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4gXHRtYXggPSAoc2l6ZSArIDEpIC8gMjtcbiBcbiBcdHJldCA9IG14bDg2Mnh4X2J1c3lfd2FpdChwcml2KTtcbkBAIC00OTUsMTIgKzUxMiw1NCBAQCBpbnQgbXhsODYyeHhfcmVzZXQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbisjZGVmaW5lIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHXHRcdDB4MWZcbisjZGVmaW5lIE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTS1x0MHhmZmYwXG4rI2RlZmluZSBNWEw4NjJYWF9TTURJT19PRkZfTUFTS1x0XHQweDAwMGZcbitcbisvKiBQYWdlZCBjbGF1c2UtMjIgd2luZG93OiB0aGUgcGFnZSBnb2VzIGludG8gTUlJIHJlZ2lzdGVyIDB4MWYsIHRoZSBsb3cgbmliYmxlXG4rICogb2YgYWRkciBzZWxlY3RzIG9uZSBvZiB0aGUgMTYgcmVnaXN0ZXJzIHdpdGhpbiBpdC4gQm90aCBoZWxwZXJzIHRha2UgdGhlIE1ESU9cbisgKiBidXMgbG9jayBwZXIgdHJhbnNhY3Rpb24sIHNvIGNhbGxlcnMgbXVzdCBub3QgYWxyZWFkeSBob2xkIGl0IC0tIHVubGlrZVxuKyAqIG14bDg2Mnh4X2FwaV93cmFwKCksIHdoaWNoIGhvbGRzIGl0IGFjcm9zcyBhIHdob2xlIGZpcm13YXJlIGNvbW1hbmQuXG4rICovXG4raW50IG14bDg2Mnh4X3NtZGlvX3JlYWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyKVxuK3tcbitcdHN0cnVjdCBtaWlfYnVzICpidXMgPSBwcml2LVx1MDAzZW1kaW9kZXYtXHUwMDNlYnVzO1xuK1x0aW50IHBoeSA9IHByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VhZGRyO1xuK1x0aW50IHJldDtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2YnVzLVx1MDAzZW1kaW9fbG9jayk7XG4rXHRyZXQgPSBfX21kaW9idXNfd3JpdGUoYnVzLCBwaHksIE1YTDg2MlhYX1NNRElPX0FERFJfUkVHLFxuK1x0XHRcdCAgICAgIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX1BBR0VfTUFTSyk7XG4rXHRpZiAocmV0IFx1MDAzZT0gMClcbitcdFx0cmV0ID0gX19tZGlvYnVzX3JlYWQoYnVzLCBwaHksIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX09GRl9NQVNLKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZidXMtXHUwMDNlbWRpb19sb2NrKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK2ludCBteGw4NjJ4eF9zbWRpb193cml0ZShzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHUxNiB2YWwpXG4re1xuK1x0c3RydWN0IG1paV9idXMgKmJ1cyA9IHByaXYtXHUwMDNlbWRpb2Rldi1cdTAwM2VidXM7XG4rXHRpbnQgcGh5ID0gcHJpdi1cdTAwM2VtZGlvZGV2LVx1MDAzZWFkZHI7XG4rXHRpbnQgcmV0O1xuK1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZidXMtXHUwMDNlbWRpb19sb2NrKTtcbitcdHJldCA9IF9fbWRpb2J1c193cml0ZShidXMsIHBoeSwgTVhMODYyWFhfU01ESU9fQUREUl9SRUcsXG4rXHRcdFx0ICAgICAgYWRkciBcdTAwMjYgTVhMODYyWFhfU01ESU9fUEFHRV9NQVNLKTtcbitcdGlmIChyZXQgXHUwMDNlPSAwKVxuK1x0XHRyZXQgPSBfX21kaW9idXNfd3JpdGUoYnVzLCBwaHksIGFkZHIgXHUwMDI2IE1YTDg2MlhYX1NNRElPX09GRl9NQVNLLFxuK1x0XHRcdFx0ICAgICAgdmFsKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZidXMtXHUwMDNlbWRpb19sb2NrKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuIHZvaWQgbXhsODYyeHhfaG9zdF9pbml0KHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxuIHtcbiBcdElOSVRfV09SSyhcdTAwMjZwcml2LVx1MDAzZWNyY19lcnJfd29yaywgbXhsODYyeHhfY3JjX2Vycl93b3JrX2ZuKTtcbitcdElOSVRfV09SSyhcdTAwMjZwcml2LVx1MDAzZXJlc2N1ZV9oZWFsX3dvcmssIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4pO1xuIH1cbiBcbiB2b2lkIG14bDg2Mnh4X2hvc3Rfc2h1dGRvd24oc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYpXG4ge1xuIFx0Y2FuY2VsX3dvcmtfc3luYyhcdTAwMjZwcml2LVx1MDAzZWNyY19lcnJfd29yayk7XG4rXHRjYW5jZWxfd29ya19zeW5jKFx1MDAyNnByaXYtXHUwMDNlcmVzY3VlX2hlYWxfd29yayk7XG4gfVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1ob3N0LmggYi9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtaG9zdC5oXG5pbmRleCA2NmQ2YWUxOThhZmY0Li40ZTA1NGM2ZTRjMGU0IDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWhvc3QuaFxuQEAgLTE4LDUgKzE4LDcgQEAgaW50IG14bDg2Mnh4X2FwaV93cmFwKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2LCB1MTYgY21kLCB2b2lkICpkYXRhLCB1MTYgc2l6ZSxcbiBcdG14bDg2Mnh4X2FwaV93cmFwKGRldiwgY21kLCBcdTAwMjYoZGF0YSksIHNpemVvZigoZGF0YSkpLCB0cnVlLCB0cnVlKVxuIFxuIGludCBteGw4NjJ4eF9yZXNldChzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdik7XG4raW50IG14bDg2Mnh4X3NtZGlvX3JlYWQoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyKTtcbitpbnQgbXhsODYyeHhfc21kaW9fd3JpdGUoc3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYsIHUzMiBhZGRyLCB1MTYgdmFsKTtcbiBcbiAjZW5kaWYgLyogX19NWEw4NjJYWF9IT1NUX0ggKi9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtcGh5bGluay5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LXBoeWxpbmsuY1xuaW5kZXggYjY4OTY1MmFhOWI5Mi4uYTViNjk0MGI1NTJlOSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1waHlsaW5rLmNcbisrKyBiL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1waHlsaW5rLmNcbkBAIC00MDYsNiArNDA2LDggQEAgbXhsODYyeHhfcGh5bGlua19tYWNfc2VsZWN0X3BjcyhzdHJ1Y3QgcGh5bGlua19jb25maWcgKmNvbmZpZyxcbiBcbiBcdHN3aXRjaCAocG9ydCkge1xuIFx0Y2FzZSA5IC4uLiAxNjpcbitcdFx0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpXG4rXHRcdFx0cmV0dXJuIE5VTEw7XG4gXHRcdGlmICghTVhMODYyWFhfRldfVkVSX01JTihwcml2LCAxLCAwLCA4NCkpIHtcbiBcdFx0XHRkZXZfd2Fybl9vbmNlKGRwLVx1MDAzZWRzLVx1MDAzZWRldixcbiBcdFx0XHRcdCAgICAgIFwiU2VyRGVzIFBDUyB1bnN1cHBvcnRlZCBvbiBvbGQgZmlybXdhcmUuXFxuXCIpO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5jIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmNcbmluZGV4IDQ1ZDIzN2IzYTQwZjEuLjBlMTc5Y2FlOTdmMzggMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguY1xuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmNcbkBAIC0yMSw2ICsyMSw3IEBAXG4gI2luY2x1ZGUgXCJteGw4NjJ4eC5oXCJcbiAjaW5jbHVkZSBcIm14bDg2Mnh4LWFwaS5oXCJcbiAjaW5jbHVkZSBcIm14bDg2Mnh4LWNtZC5oXCJcbisjaW5jbHVkZSBcIm14bDg2Mnh4LWZ3LmhcIlxuICNpbmNsdWRlIFwibXhsODYyeHgtaG9zdC5oXCJcbiAjaW5jbHVkZSBcIm14bDg2Mnh4LXBoeWxpbmsuaFwiXG4gXG5AQCAtNzEsNiArNzIsMTMgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX3Jtb25faGlzdF9yYW5nZSBteGw4NjJ4eF9ybW9uX3Jhbmdlc1tdID0ge1xuICNkZWZpbmUgTVhMODYyWFhfUkVBRFlfVElNRU9VVF9NU1x0MTAwMDBcbiAjZGVmaW5lIE1YTDg2MlhYX1JFQURZX1BPTExfTVNcdFx0MTAwXG4gXG4rLyogQ2hpcCBJRCByZWdpc3RlcnMsIHJlYWQgdmlhIFNZU19NSVNDX1JFR19SRCAqL1xuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX0xcdFx0MHhjMGQyODg4NFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01cdFx0MHhjMGQyODg4OFxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX0xfUE5VTUxcdFx0R0VOTUFTSygxNSwgMTIpXG4rI2RlZmluZSBNWEw4NjJYWF9DSElQSURfTV9QTlVNTVx0XHRHRU5NQVNLKDExLCAwKVxuKyNkZWZpbmUgTVhMODYyWFhfQ0hJUElEX01fVkVSU0lPTlx0R0VOTUFTSygxNCwgMTIpXG4rXG4gI2RlZmluZSBNWEw4NjJYWF9UQ01fSU5TVF9TRUxcdFx0MHhlMDBcbiAjZGVmaW5lIE1YTDg2MlhYX1RDTV9DQlNcdFx0MHhlMTJcbiAjZGVmaW5lIE1YTDg2MlhYX1RDTV9FQlNcdFx0MHhlMTNcbkBAIC0yMjIsNyArMjMwLDQ2IEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcGh5X3dyaXRlX2M0NV9taWlfYnVzKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLFxuIFx0cmV0dXJuIG14bDg2Mnh4X3BoeV93cml0ZV9tbWQoYnVzLVx1MDAzZXByaXYsIGFkZHIsIGRldmFkZCwgcmVnbnVtLCB2YWwpO1xuIH1cbiBcbi1zdGF0aWMgaW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKVxuKy8qIFJlYWQgdGhlIHN0YXRpYyBjaGlwIHBhcnQgbnVtYmVyIGFuZCB2ZXJzaW9uIGZyb20gdGhlIENISVAgSURcbisgKiByZWdpc3RlcnMuIE9ubHkgcG9zc2libGUgd2l0aCBhIHJ1bm5pbmcgZmlybXdhcmUsIHNvIHRoZSB2YWx1ZXMgYXJlXG4rICogY2FjaGVkIGF0IHNldHVwIGFuZCBsZWZ0IHplcm8gd2hlbiB0aGUgc3dpdGNoIGlzIGluIHJlc2N1ZSBtb2RlLlxuKyAqL1xuK3N0YXRpYyBpbnQgbXhsODYyeHhfcmVhZF9jaGlwX2lkKHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2KVxuK3tcbitcdHN0cnVjdCBteGw4NjJ4eF9zeXNfcmVnX3J3IHJlZyA9IHt9O1xuK1x0dTE2IGNoaXBpZF9sLCBjaGlwaWRfbTtcbitcdGludCByZXQ7XG4rXG4rXHRyZWcuYWRkciA9IGNwdV90b19sZTMyKE1YTDg2MlhYX0NISVBJRF9MKTtcbitcdHJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIFNZU19NSVNDX1JFR19SRCwgcmVnKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXHRjaGlwaWRfbCA9IGxlMzJfdG9fY3B1KHJlZy52YWwpO1xuK1xuK1x0cmVnLmFkZHIgPSBjcHVfdG9fbGUzMihNWEw4NjJYWF9DSElQSURfTSk7XG4rXHRyZXQgPSBNWEw4NjJYWF9BUElfUkVBRChwcml2LCBTWVNfTUlTQ19SRUdfUkQsIHJlZyk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1x0Y2hpcGlkX20gPSBsZTMyX3RvX2NwdShyZWcudmFsKTtcbitcbitcdHByaXYtXHUwMDNlYXNpY19pZCA9IEZJRUxEX0dFVChNWEw4NjJYWF9DSElQSURfTF9QTlVNTCwgY2hpcGlkX2wpIHxcbitcdFx0XHRGSUVMRF9HRVQoTVhMODYyWFhfQ0hJUElEX01fUE5VTU0sIGNoaXBpZF9tKSBcdTAwM2NcdTAwM2MgNDtcbitcdHByaXYtXHUwMDNlYXNpY19yZXYgPSBGSUVMRF9HRVQoTVhMODYyWFhfQ0hJUElEX01fVkVSU0lPTiwgY2hpcGlkX20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIG14bDg2Mnh4X3dhaXRfcmVhZHkgLSB3YWl0IGZvciB0aGUgc3dpdGNoIGZpcm13YXJlIHRvIGJlY29tZSBvcGVyYXRpb25hbFxuKyAqIEBkczogRFNBIHN3aXRjaCBpbnN0YW5jZVxuKyAqXG4rICogUG9sbCB0aGUgZmlybXdhcmUgdW50aWwgaXQgcmVwb3J0cyBpdHMgdmVyc2lvbiBhbmQgYWNjZXB0c1xuKyAqIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMsIHRoZW4gY2FjaGUgdGhlIGZpcm13YXJlIHZlcnNpb24gYW5kIGNoaXAgSUQuXG4rICogVGFrZXMgYXQgbGVhc3QgdHdvIHNlY29uZHMuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuXG4rICovXG4raW50IG14bDg2Mnh4X3dhaXRfcmVhZHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKVxuIHtcbiBcdHN0cnVjdCBteGw4NjJ4eF9zeXNfZndfaW1hZ2VfdmVyc2lvbiB2ZXIgPSB7fTtcbiBcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzLCB0aW1lb3V0O1xuQEAgLTI1NCw2ICszMDEsMTEgQEAgc3RhdGljIGludCBteGw4NjJ4eF93YWl0X3JlYWR5KHN0cnVjdCBkc2Ffc3dpdGNoICpkcylcbiBcdFx0cHJpdi1cdTAwM2Vmd192ZXJzaW9uLm1ham9yID0gdmVyLml2X21ham9yO1xuIFx0XHRwcml2LVx1MDAzZWZ3X3ZlcnNpb24ubWlub3IgPSB2ZXIuaXZfbWlub3I7XG4gXHRcdHByaXYtXHUwMDNlZndfdmVyc2lvbi5yZXZpc2lvbiA9IGxlMTZfdG9fY3B1KHZlci5pdl9yZXZpc2lvbik7XG4rXG4rXHRcdHJldCA9IG14bDg2Mnh4X3JlYWRfY2hpcF9pZChwcml2KTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRkZXZfd2Fybihkcy1cdTAwM2VkZXYsIFwiZmFpbGVkIHRvIHJlYWQgY2hpcCBJRDogJXBlXFxuXCIsXG4rXHRcdFx0XHQgRVJSX1BUUihyZXQpKTtcbiBcdFx0cmV0dXJuIDA7XG4gXG4gbm90X3JlYWR5X3lldDpcbkBAIC02MjIsMjEgKzY3NCw2NiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcylcbiBcdGludCBuX3VzZXJfcG9ydHMgPSAwLCBtYXhfdmxhbnM7XG4gXHRpbnQgaW5ncmVzc19maW5hbHMsIHZpZF9ydWxlcztcbiBcdHN0cnVjdCBkc2FfcG9ydCAqZHA7XG4tXHRpbnQgcmV0LCBpO1xuLVxuLVx0cmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7XG4tXHRpZiAocmV0KVxuLVx0XHRyZXR1cm4gcmV0O1xuLVxuLVx0cmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7XG4tXHRpZiAocmV0KVxuLVx0XHRyZXR1cm4gcmV0O1xuK1x0aW50IHJldCwgaSwgcmVzY3VlO1xuIFxuK1x0LyogVGhlIFNlckRlcyBzdGF0ZSBpcyBzb2Z0d2FyZS1vbmx5IGFuZCBtdXN0IGV4aXN0IGJlZm9yZSBhbnl0aGluZyBjYW5cbitcdCAqIHJlYWNoIHBoeWxpbmssIGluY2x1ZGluZyBhIHJlc2N1ZS1tb2RlIGZsYXNoIGNsZWFyaW5nIHJlc2N1ZV9tb2RlXG4rXHQgKiBhaGVhZCBvZiB0aGUgcmVwcm9iZS5cbitcdCAqL1xuIFx0bXV0ZXhfaW5pdChcdTAwMjZwcml2LVx1MDAzZXNlcmRlc19sb2NrKTtcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUocHJpdi1cdTAwM2VzZXJkZXNfcG9ydHMpOyBpKyspXG4gXHRcdG14bDg2Mnh4X3NldHVwX3Bjcyhwcml2LCBcdTAwMjZwcml2LVx1MDAzZXNlcmRlc19wb3J0c1tpXSxcbiBcdFx0XHRcdCAgIGkgKyBNWEw4NjJYWF9GSVJTVF9TRVJERVNfUE9SVCk7XG4gXG4rXHQvKiBEZXRlY3QgdGhlIGxvYWRlciBvdmVyIFNCIFBESSBmaXJzdDogaXQgbmVlZHMgbm8gZmlybXdhcmUsIHVubGlrZSB0aGVcbitcdCAqIEM0NSBBUEkgKG14bDg2Mnh4X3Jlc2V0L3dhaXRfcmVhZHkpIHdoaWNoIHNwZXdzIENSQyBlcnJvcnMgd2hlbiBub25lXG4rXHQgKiBhbnN3ZXJzLiBUb3VjaCBDNDUgb25seSBvbmNlIHJlc2N1ZSBpcyBydWxlZCBvdXQuXG4rXHQgKi9cbitcdHJlc2N1ZSA9IG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdChwcml2KTtcbitcdGlmIChyZXNjdWUgXHUwMDNjIDApIHtcbitcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsIFwic3dpdGNoIHN0YXRlIGRldGVjdGlvbiBmYWlsZWQ6ICVwZVxcblwiLFxuK1x0XHRcdEVSUl9QVFIocmVzY3VlKSk7XG4rXHRcdHJldHVybiByZXNjdWU7XG4rXHR9XG4rXG4rXHRpZiAocmVzY3VlID09IE1YTDg2MlhYX05PVF9SRVNDVUUpIHtcbitcdFx0cmV0ID0gbXhsODYyeHhfcmVzZXQocHJpdik7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcbitcdFx0cmV0ID0gbXhsODYyeHhfd2FpdF9yZWFkeShkcyk7XG4rXHRcdGlmIChyZXQpIHtcbitcdFx0XHQvKiB0aGUgcmVzZXQgbWF5IG9ubHkgbm93IGhhdmUgdHJpZ2dlcmVkIHJlc2N1ZSBtb2RlICovXG4rXHRcdFx0cmVzY3VlID0gbXhsODYyeHhfcmVzY3VlX21vZGVfZGV0ZWN0KHByaXYpO1xuK1x0XHRcdGlmIChyZXNjdWUgXHUwMDNjIDApIHtcbitcdFx0XHRcdGRldl9lcnIoZHMtXHUwMDNlZGV2LFxuK1x0XHRcdFx0XHRcInN3aXRjaCBub3QgcmVzcG9uZGluZyBhZnRlciByZXNldDogJXBlXFxuXCIsXG4rXHRcdFx0XHRcdEVSUl9QVFIocmVzY3VlKSk7XG4rXHRcdFx0XHRyZXR1cm4gcmVzY3VlO1xuK1x0XHRcdH1cbitcdFx0XHRpZiAocmVzY3VlID09IE1YTDg2MlhYX05PVF9SRVNDVUUpXG4rXHRcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRwcml2LVx1MDAzZXJlc2N1ZV9tb2RlID0gcmVzY3VlO1xuK1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpIHtcbitcdFx0aWYgKHByaXYtXHUwMDNlcmVzY3VlX3JlYWR5KSB7XG4rXHRcdFx0ZGV2X3dhcm4oZHMtXHUwMDNlZGV2LFxuK1x0XHRcdFx0IFwic3dpdGNoIGluIE1DVWJvb3QgcmVzY3VlIG1vZGUsIHVzZSBkZXZsaW5rIHRvIGZsYXNoIG5ldyBmaXJtd2FyZVxcblwiKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHQvKiBEcmFpbiB0aGUgd2VkZ2VkIGRvd25sb2FkIGluIHRoZSBiYWNrZ3JvdW5kIHNvIGl0XG4rXHRcdFx0ICogbmV2ZXIgaG9sZHMgdGhlIGRldmxpbmsgbG9jazsgaW5mbyBhbmQgZmxhc2ggYmVjb21lXG4rXHRcdFx0ICogYXZhaWxhYmxlIG9uY2UgcmVhZHkuXG4rXHRcdFx0ICovXG4rXHRcdFx0ZGV2X3dhcm4oZHMtXHUwMDNlZGV2LFxuK1x0XHRcdFx0IFwic3dpdGNoIGluIE1DVWJvb3Qgd2l0aCBhbiBpbnRlcnJ1cHRlZCBkb3dubG9hZCwgcmVjb3ZlcmluZyBpbiBiYWNrZ3JvdW5kXFxuXCIpO1xuK1x0XHRcdHF1ZXVlX3dvcmsoc3lzdGVtX2xvbmdfd3EsIFx1MDAyNnByaXYtXHUwMDNlcmVzY3VlX2hlYWxfd29yayk7XG4rXHRcdH1cbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4gXHQvKiBDYWxjdWxhdGUgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplcy5cbiBcdCAqIFdpdGggVkxBTiBGaWx0ZXIgaGFuZGxpbmcgVklEIG1lbWJlcnNoaXAgY2hlY2tzOlxuIFx0ICogICBJbmdyZXNzOiBvbmx5IGZpbmFsIGNhdGNoYWxsIHJ1bGVzIChQVklEIGluc2VydGlvbiwgODAyLjFRXG5AQCAtNzE1LDExICs4MTIsMjEgQEAgc3RhdGljIGludCBteGw4NjJ4eF9wb3J0X3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGJvb2wgZW5hYmxlKVxuIHN0YXRpYyBpbnQgbXhsODYyeHhfcG9ydF9lbmFibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCxcbiBcdFx0XHRcdHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpXG4ge1xuK1x0c3RydWN0IG14bDg2Mnh4X3ByaXYgKnByaXYgPSBkcy1cdTAwM2Vwcml2O1xuK1xuK1x0aWYgKHByaXYtXHUwMDNlcmVzY3VlX21vZGUpXG4rXHRcdHJldHVybiAwO1xuK1xuIFx0cmV0dXJuIG14bDg2Mnh4X3BvcnRfc3RhdGUoZHMsIHBvcnQsIHRydWUpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBteGw4NjJ4eF9wb3J0X2Rpc2FibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcbiB7XG4rXHRzdHJ1Y3QgbXhsODYyeHhfcHJpdiAqcHJpdiA9IGRzLVx1MDAzZXByaXY7XG4rXG4rXHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSlcbitcdFx0cmV0dXJuO1xuK1xuIFx0aWYgKG14bDg2Mnh4X3BvcnRfc3RhdGUoZHMsIHBvcnQsIGZhbHNlKSlcbiBcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsIFwiZmFpbGVkIHRvIGRpc2FibGUgcG9ydCAlZFxcblwiLCBwb3J0KTtcbiB9XG5AQCAtMTMzNyw2ICsxNDQ0LDE3IEBAIHN0YXRpYyBpbnQgbXhsODYyeHhfcG9ydF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KVxuIFx0Ym9vbCBpc19jcHVfcG9ydCA9IGRzYV9wb3J0X2lzX2NwdShkcCk7XG4gXHRpbnQgcmV0O1xuIFxuK1x0aWYgKGRzYV9wb3J0X2lzX2RzYShkcCkpIHtcbitcdFx0ZGV2X2Vycihkcy1cdTAwM2VkZXYsIFwicG9ydCAlZDogRFNBIGxpbmtzIG5vdCBzdXBwb3J0ZWRcXG5cIiwgcG9ydCk7XG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcdH1cbitcbitcdC8qIERTQSByZWluaXRzIGZhaWxlZCB1c2VyIHBvcnRzIGFzIHVudXNlZDsgc2hhcmVkIHBvcnRzIG11c3RcbitcdCAqIHN1Y2NlZWQgZm9yIHRoZSB0cmVlIHRvIHJlZ2lzdGVyLlxuK1x0ICovXG4rXHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSlcbitcdFx0cmV0dXJuIGRzYV9wb3J0X2lzX3VzZXIoZHApID8gLUVOT0RFViA6IDA7XG4rXG4gXHRyZXQgPSBteGw4NjJ4eF9wb3J0X3N0YXRlKGRzLCBwb3J0LCBmYWxzZSk7XG4gXHRpZiAocmV0KVxuIFx0XHRyZXR1cm4gcmV0O1xuQEAgLTEzNDYsMTEgKzE0NjQsNiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydClcbiBcdGlmIChkc2FfcG9ydF9pc191bnVzZWQoZHApKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdGlmIChkc2FfcG9ydF9pc19kc2EoZHApKSB7XG4tXHRcdGRldl9lcnIoZHMtXHUwMDNlZGV2LCBcInBvcnQgJWQ6IERTQSBsaW5rcyBub3Qgc3VwcG9ydGVkXFxuXCIsIHBvcnQpO1xuLVx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4tXHR9XG4tXG4gXHRyZXQgPSBteGw4NjJ4eF9jb25maWd1cmVfc3BfdGFnX3Byb3RvKGRzLCBwb3J0LCBpc19jcHVfcG9ydCk7XG4gXHRpZiAocmV0KVxuIFx0XHRyZXR1cm4gcmV0O1xuQEAgLTE1NzIsNiArMTY4NSwxMiBAQCBzdGF0aWMgaW50IG14bDg2Mnh4X3BvcnRfbWRiX2RlbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LFxuIFx0ZXRoZXJfYWRkcl9jb3B5KHFwYXJhbS5tYWMsIG1kYi1cdTAwM2VhZGRyKTtcbiBcbiBcdHJldCA9IE1YTDg2MlhYX0FQSV9SRUFEKHByaXYsIE1YTDg2MlhYX01BQ19UQUJMRUVOVFJZUVVFUlksIHFwYXJhbSk7XG4rXHQvKiBQb3N0LWZsYXNoIHRlYXJkb3duIG9yIE1DVWJvb3Q6IHRoZSBmaXJtd2FyZSBhbmQgaXRzIE1BQyB0YWJsZSBhcmVcbitcdCAqIGdvbmUsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkZWxldGUuIE91dHNpZGUgdGhvc2UsIC1FTk9ERVYgaXMgYVxuK1x0ICogYnVzIGVycm9yIGFuZCBtdXN0IGJlIHJlcG9ydGVkLlxuK1x0ICovXG4rXHRpZiAocmV0ID09IC1FTk9ERVYgXHUwMDI2XHUwMDI2IChwcml2LVx1MDAzZXNraXBfdGVhcmRvd24gfHwgcHJpdi1cdTAwM2VyZXNjdWVfbW9kZSkpXG4rXHRcdHJldHVybiAwO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbkBAIC0xNjI4LDYgKzE3NDcsOSBAQCBzdGF0aWMgdm9pZCBteGw4NjJ4eF9wb3J0X3N0cF9zdGF0ZV9zZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCxcbiBcdHN0cnVjdCBteGw4NjJ4eF9wcml2ICpwcml2ID0gZHMtXHUwMDNlcHJpdjtcbiBcdGludCByZXQ7XG4gXG4rXHRpZiAocHJpdi1cdTAwM2VyZXNjdWVfbW9kZSlcbitcdFx0cmV0dXJuO1xuK1xuIFx0c3dpdGNoIChzdGF0ZSkge1xuIFx0Y2FzZSBCUl9TVEFURV9ESVNBQkxFRDpcbiBcdFx0cGFyYW0ucG9ydF9zdGF0ZSA9IGNwdV90b19sZTMyKE1YTDg2MlhYX1NUUF9QT1JUX1NUQVRFX0RJU0FCTEUpO1xuQEAgLTIwMTUsNiArMjEzNywxMiBAQCBzdGF0aWMgdm9pZCBteGw4NjJ4eF9zdGF0c193b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiBcdHN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHByaXYtXHUwMDNlZHM7XG4gXHRzdHJ1Y3QgZHNhX3BvcnQgKmRwO1xuIFxuK1x0LyogQSBnZXRfc3RhdHM2NCgpIHJlLWFybSBjYW4gcmFjZSB0aGUgZmxhc2ggdGVhcmRvd24ncyBXT1JLX1NUT1BQRURcbitcdCAqIHNldCBhbmQgY2FuY2VsOyBiYWlsIGhlcmUgc28gYSBzdHJheSBwb2xsIG5ldmVyIHJ1bnMgZHVyaW5nIGEgZmxhc2guXG4rXHQgKi9cbitcdGlmICh0ZXN0X2JpdChNWEw4NjJYWF9GTEFHX1dPUktfU1RPUFBFRCwgXHUwMDI2cHJpdi1cdTAwM2VmbGFncykpXG4rXHRcdHJldHVybjtcbitcbiBcdGRzYV9zd2l0Y2hfZm9yX2VhY2hfYXZhaWxhYmxlX3BvcnQoZHAsIGRzKVxuIFx0XHRteGw4NjJ4eF9zdGF0c19wb2xsKGRzLCBkcC1cdTAwM2VpbmRleCk7XG4gXG5AQCAtMjA4Niw2ICsyMjE0LDggQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkc2Ffc3dpdGNoX29wcyBteGw4NjJ4eF9zd2l0Y2hfb3BzID0ge1xuIFx0LmdldF9wYXVzZV9zdGF0cyA9IG14bDg2Mnh4X2dldF9wYXVzZV9zdGF0cyxcbiBcdC5nZXRfcm1vbl9zdGF0cyA9IG14bDg2Mnh4X2dldF9ybW9uX3N0YXRzLFxuIFx0LmdldF9zdGF0czY0ID0gbXhsODYyeHhfZ2V0X3N0YXRzNjQsXG4rXHQuZGV2bGlua19pbmZvX2dldCA9IG14bDg2Mnh4X2RldmxpbmtfaW5mb19nZXQsXG4rXHQuZGV2bGlua19mbGFzaF91cGRhdGUgPSBteGw4NjJ4eF9kZXZsaW5rX2ZsYXNoX3VwZGF0ZSxcbiB9O1xuIFxuIHN0YXRpYyBpbnQgbXhsODYyeHhfcHJvYmUoc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2KVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC5oIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmhcbmluZGV4IDQzMmE1ZjNmMmUwOGUuLjk5MWIyNGFhOTVhZmQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHguaFxuKysrIGIvZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LmhcbkBAIC00LDcgKzQsOSBAQFxuICNkZWZpbmUgX19NWEw4NjJYWF9IXG4gXG4gI2luY2x1ZGUgXHUwMDNjYXNtL2J5dGVvcmRlci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0b3BzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tdXRleC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvd29ya3F1ZXVlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NuZXQvZHNhLmhcdTAwM2VcbiBcbkBAIC0xNCw2ICsxNiwxMCBAQCBzdHJ1Y3QgbXhsODYyeHhfcHJpdjtcbiAjZGVmaW5lIE1YTDg2MlhYX0ZJUlNUX1NFUkRFU19QT1JUXHQ5XG4gI2RlZmluZSBNWEw4NjJYWF9TRVJERVNfU0xPVFNcdFx0NFxuIFxuKy8qIG14bDg2Mnh4X3Jlc2N1ZV9tb2RlX2RldGVjdCgpIHJldHVybiBjb2RlcyAobmVnYXRpdmUgdmFsdWVzIGFyZSBlcnJvcnMpICovXG4rI2RlZmluZSBNWEw4NjJYWF9OT1RfUkVTQ1VFXHRcdDBcbisjZGVmaW5lIE1YTDg2MlhYX0lOX1JFU0NVRVx0XHQxXG4rXG4gI2RlZmluZSBNWEw4NjJYWF9ERUZBVUxUX0JSSURHRVx0XHQwXG4gI2RlZmluZSBNWEw4NjJYWF9NQVhfQlJJREdFU1x0XHQ0OFxuICNkZWZpbmUgTVhMODYyWFhfTUFYX0JSSURHRV9QT1JUU1x0MTI4XG5AQCAtMzAzLDYgKzMwOSwxMCBAQCBzdHJ1Y3QgbXhsODYyeHhfZndfdmVyc2lvbiB7XG4gICogICAgICAgICAgICAgICAgICAgICAgZmxvb2RpbmcpXG4gICogQGZ3X3ZlcnNpb246ICAgICAgICAgY2FjaGVkIGZpcm13YXJlIHZlcnNpb24sIHBvcHVsYXRlZCBhdCBwcm9iZSBhbmRcbiAgKiAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZCB3aXRoIE1YTDg2MlhYX0ZXX1ZFUl9NSU4oKVxuKyAqIEBhc2ljX2lkOiAgICAgICAgICAgIGNoaXAgcGFydCBudW1iZXIgcmVhZCBmcm9tIHRoZSBDSElQIElEIHJlZ2lzdGVycyxcbisgKiAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBhcyB0aGUgZGV2bGluayBcImFzaWMuaWRcIiBmaXhlZCB2ZXJzaW9uXG4rICogQGFzaWNfcmV2OiAgICAgICAgICAgY2hpcCB2ZXJzaW9uIHJlYWQgZnJvbSB0aGUgQ0hJUCBJRCByZWdpc3RlcnMsXG4rICogICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYXMgdGhlIGRldmxpbmsgXCJhc2ljLnJldlwiIGZpeGVkIHZlcnNpb25cbiAgKiBAc2VyZGVzX3BvcnRzOiAgICAgICBTZXJEZXMgaW50ZXJmYWNlcyBpbmNsLiBzdWItaW50ZXJmYWNlcyBpbiBjYXNlIG9mXG4gICogICAgICAgICAgICAgICAgICAgICAgMTBHX1FYR01JSSBvciBRU0dNSUlcbiAgKiBAc2VyZGVzX3JlZmNvdW50OiAgICBwZXItWFBDUyBjb3VudCBvZiBzdWItcG9ydHMgZW5hYmxlZCBieSBwaHlsaW5rO1xuQEAgLTMxOSw2ICszMjksMjAgQEAgc3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24ge1xuICAqIEBldmxhbl9pbmdyZXNzX3NpemU6IHBlci1wb3J0IGluZ3Jlc3MgRXh0ZW5kZWQgVkxBTiBibG9jayBzaXplXG4gICogQGV2bGFuX2VncmVzc19zaXplOiAgcGVyLXBvcnQgZWdyZXNzIEV4dGVuZGVkIFZMQU4gYmxvY2sgc2l6ZVxuICAqIEB2Zl9ibG9ja19zaXplOiAgICAgIHBlci1wb3J0IFZMQU4gRmlsdGVyIGJsb2NrIHNpemVcbisgKiBAYmxvY2tfaG9zdDogICAgICAgICByZWplY3QgZmlybXdhcmUgQVBJIGNvbW1hbmRzIChleGNlcHQgRldfVVBEQVRFKVxuKyAqICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyBhIGZpcm13YXJlIGZsYXNoXG4rICogQHNraXBfdGVhcmRvd246ICAgICAgZGlzY2FyZCBmaXJtd2FyZSBBUEkgY29tbWFuZHMgZHVyaW5nIHRoZSB0ZWFyZG93blxuKyAqICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZCBieSB0aGUgcG9zdC1mbGFzaCByZXByb2JlXG4rICogQHJlc2N1ZV9tb2RlOiAgICAgICAgc3dpdGNoIGlzIGluIE1DVWJvb3Q7IGZpcm13YXJlIEFQSSBjb21tYW5kcyBmYWlsIGZhc3QsXG4rICogICAgICAgICAgICAgICAgICAgICAgb25seSBjbGF1c2UtMjIgU01ESU8gd29ya3MuIFNldCBmcm9tIHNldHVwKCkgYmVmb3JlIHRoZVxuKyAqICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCBpcyByZWdpc3RlcmVkIGFuZCBjbGVhcmVkIHVuZGVyIHRoZSBNRElPIGJ1cyBsb2NrXG4rICogICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBiZW5lZml0IG9mIG14bDg2Mnh4X2FwaV93cmFwKCk7IG90aGVyIHJlYWRlcnNcbisgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IG5lZWQgaXQgdG8gYmUgYSBzdGFibGUgc2luZ2xlIGZsYWcuXG4rICogQHJlc2N1ZV9yZWFkeTogICAgICAgKHJlc2N1ZV9tb2RlKSBsb2FkZXIgaXMgYXQgYSBjbGVhbiBSRUFEWSBhbmQgd2lsbCBhY2NlcHRcbisgKiAgICAgICAgICAgICAgICAgICAgICBhIGZsYXNoOyBmYWxzZSB3aGlsZSByZXNjdWVfaGVhbF93b3JrIGlzIGRyYWluaW5nXG4rICogQHJlc2N1ZV9mYWlsZWQ6ICAgICAgKHJlc2N1ZV9tb2RlKSB0aGUgc2VsZi1oZWFsIGdhdmUgdXA7IHRoZSBsb2FkZXIgbmVlZHMgYVxuKyAqICAgICAgICAgICAgICAgICAgICAgIHBvd2VyIGN5Y2xlIGFuZCBubyBmbGFzaCBjYW4gYmUgYWNjZXB0ZWRcbisgKiBAcmVzY3VlX2hlYWxfd29yazogICBiYWNrZ3JvdW5kIHNlbGYtaGVhbCBkcmFpbmluZyBhIHdlZGdlZCBkb3dubG9hZCB0byBSRUFEWVxuICAqIEBzdGF0c193b3JrOiAgICAgICAgIHBlcmlvZGljIHdvcmsgaXRlbSB0aGF0IHBvbGxzIFJNT04gaGFyZHdhcmUgY291bnRlcnNcbiAgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgYWNjdW11bGF0ZXMgdGhlbSBpbnRvIDY0LWJpdCBwZXItcG9ydCBzdGF0c1xuICAqL1xuQEAgLTMyNiw5ICszNTAsMTIgQEAgc3RydWN0IG14bDg2Mnh4X3ByaXYge1xuIFx0c3RydWN0IGRzYV9zd2l0Y2ggKmRzO1xuIFx0c3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2O1xuIFx0c3RydWN0IHdvcmtfc3RydWN0IGNyY19lcnJfd29yaztcbitcdHN0cnVjdCB3b3JrX3N0cnVjdCByZXNjdWVfaGVhbF93b3JrO1xuIFx0dW5zaWduZWQgbG9uZyBmbGFncztcbiBcdHUxNiBkcm9wX21ldGVyO1xuIFx0c3RydWN0IG14bDg2Mnh4X2Z3X3ZlcnNpb24gZndfdmVyc2lvbjtcbitcdHUxNiBhc2ljX2lkO1xuK1x0dTggYXNpY19yZXY7XG4gXHRzdHJ1Y3QgbXhsODYyeHhfcGNzIHNlcmRlc19wb3J0c1s4XTtcbiBcdGludCBzZXJkZXNfcmVmY291bnRbMl07XG4gXHRzdHJ1Y3QgbXV0ZXggc2VyZGVzX2xvY2s7XG5AQCAtMzM3LDcgKzM2NCwxNCBAQCBzdHJ1Y3QgbXhsODYyeHhfcHJpdiB7XG4gXHR1MTYgZXZsYW5faW5ncmVzc19zaXplO1xuIFx0dTE2IGV2bGFuX2VncmVzc19zaXplO1xuIFx0dTE2IHZmX2Jsb2NrX3NpemU7XG4rXHRib29sIGJsb2NrX2hvc3Q7XG4rXHRib29sIHNraXBfdGVhcmRvd247XG4rXHRib29sIHJlc2N1ZV9tb2RlO1xuK1x0Ym9vbCByZXNjdWVfcmVhZHk7XG4rXHRib29sIHJlc2N1ZV9mYWlsZWQ7XG4gXHRzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXRzX3dvcms7XG4gfTtcbiBcbitpbnQgbXhsODYyeHhfd2FpdF9yZWFkeShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpO1xuK1xuICNlbmRpZiAvKiBfX01YTDg2MlhYX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaFxuaW5kZXggYWVlNzlmZDZiMzJiNC4uN2E5OTE2OTUwNTc3MiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmhcbisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmhcbkBAIC0xMzE0LDYgKzEzMTQsOCBAQCBpbnQgIF9fbXVzdF9jaGVjayBkZXZpY2VfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldik7XG4gaW50IF9fbXVzdF9jaGVjayBkcml2ZXJfYXR0YWNoKGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpO1xuIHZvaWQgZGV2aWNlX2luaXRpYWxfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTtcbiBpbnQgX19tdXN0X2NoZWNrIGRldmljZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7XG4raW50IF9fbXVzdF9jaGVjayBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsXG4rXHRcdFx0XHRcdCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpO1xuIFxuIGJvb2wgZGV2aWNlX2lzX2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldik7XG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZHNhLmggYi9pbmNsdWRlL25ldC9kc2EuaFxuaW5kZXggNmY3ZjVjMTdiNTMyMC4uNTg1OTdiMTRlNTkyYSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbmV0L2RzYS5oXG4rKysgYi9pbmNsdWRlL25ldC9kc2EuaFxuQEAgLTExNzIsNiArMTE3Miw5IEBAIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyB7XG4gXHRpbnRcdCgqZGV2bGlua19pbmZvX2dldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuIFx0XHRcdFx0ICAgIHN0cnVjdCBkZXZsaW5rX2luZm9fcmVxICpyZXEsXG4gXHRcdFx0XHQgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKTtcbitcdGludFx0KCpkZXZsaW5rX2ZsYXNoX3VwZGF0ZSkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuK1x0XHRcdFx0XHRzdHJ1Y3QgZGV2bGlua19mbGFzaF91cGRhdGVfcGFyYW1zICpwYXJhbXMsXG4rXHRcdFx0XHRcdHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4gXHRpbnRcdCgqZGV2bGlua19zYl9wb29sX2dldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxuIFx0XHRcdFx0ICAgICAgIHVuc2lnbmVkIGludCBzYl9pbmRleCwgdTE2IHBvb2xfaW5kZXgsXG4gXHRcdFx0XHQgICAgICAgc3RydWN0IGRldmxpbmtfc2JfcG9vbF9pbmZvICpwb29sX2luZm8pO1xuZGlmZiAtLWdpdCBhL25ldC9kc2EvZGV2bGluay5jIGIvbmV0L2RzYS9kZXZsaW5rLmNcbmluZGV4IGVkMzQyZjM0NTY5MmIuLjI1MzExYTg3Y2JjNTYgMTAwNjQ0XG4tLS0gYS9uZXQvZHNhL2RldmxpbmsuY1xuKysrIGIvbmV0L2RzYS9kZXZsaW5rLmNcbkBAIC0yMCw2ICsyMCwxOCBAQCBzdGF0aWMgaW50IGRzYV9kZXZsaW5rX2luZm9fZ2V0KHN0cnVjdCBkZXZsaW5rICpkbCxcbiBcdHJldHVybiAtRU9QTk9UU1VQUDtcbiB9XG4gXG4rc3RhdGljIGludCBkc2FfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRldmxpbmsgKmRsLFxuK1x0XHRcdFx0ICAgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcbitcdFx0XHRcdCAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4re1xuK1x0c3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZHNhX2RldmxpbmtfdG9fZHMoZGwpO1xuK1xuK1x0aWYgKCFkcy1cdTAwM2VvcHMtXHUwMDNlZGV2bGlua19mbGFzaF91cGRhdGUpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdHJldHVybiBkcy1cdTAwM2VvcHMtXHUwMDNlZGV2bGlua19mbGFzaF91cGRhdGUoZHMsIHBhcmFtcywgZXh0YWNrKTtcbit9XG4rXG4gc3RhdGljIGludCBkc2FfZGV2bGlua19zYl9wb29sX2dldChzdHJ1Y3QgZGV2bGluayAqZGwsXG4gXHRcdFx0XHQgICB1bnNpZ25lZCBpbnQgc2JfaW5kZXgsIHUxNiBwb29sX2luZGV4LFxuIFx0XHRcdFx0ICAgc3RydWN0IGRldmxpbmtfc2JfcG9vbF9pbmZvICpwb29sX2luZm8pXG5AQCAtMTY5LDYgKzE4MSw3IEBAIGRzYV9kZXZsaW5rX3NiX29jY190Y19wb3J0X2JpbmRfZ2V0KHN0cnVjdCBkZXZsaW5rX3BvcnQgKmRscCxcbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldmxpbmtfb3BzIGRzYV9kZXZsaW5rX29wcyA9IHtcbiBcdC5pbmZvX2dldFx0XHRcdD0gZHNhX2RldmxpbmtfaW5mb19nZXQsXG4rXHQuZmxhc2hfdXBkYXRlXHRcdFx0PSBkc2FfZGV2bGlua19mbGFzaF91cGRhdGUsXG4gXHQuc2JfcG9vbF9nZXRcdFx0XHQ9IGRzYV9kZXZsaW5rX3NiX3Bvb2xfZ2V0LFxuIFx0LnNiX3Bvb2xfc2V0XHRcdFx0PSBkc2FfZGV2bGlua19zYl9wb29sX3NldCxcbiBcdC5zYl9wb3J0X3Bvb2xfZ2V0XHRcdD0gZHNhX2Rldmxpbmtfc2JfcG9ydF9wb29sX2dldCxcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDA2OjUwOjQ0Ljk2MTI3MTAzM1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE0NTI5MzkyODc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgQW5hbHlzaXM6IGBteGw4NjJ4eGAgYW5kIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGludHJvZHVjZXMgZGV2bGluayBmbGFzaCB1cGRhdGUgc3VwcG9ydCB0byB0aGUgYG14bDg2Mnh4YCBEU0Egc3dpdGNoIGRyaXZlciBhbmQgYSBuZXcgZnVuY3Rpb24sIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAsIGluIGBkcml2ZXJzL2Jhc2UvZGQuY2AuIExldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIHRoZSBgbXhsODYyeHhgIGRyaXZlci4gSXQncyBhIERTQSBzd2l0Y2ggZHJpdmVyLCBtZWFuaW5nIGl0IHR5cGljYWxseSByZXF1aXJlcyBwaHlzaWNhbCBoYXJkd2FyZSBvciBhIHZlcnkgc3BlY2lmaWMgZW11bGF0aW9uIHNldHVwLCB1c3VhbGx5IGludm9sdmluZyBNRElPLCBJMkMsIG9yIFNQSSBpbnRlcmZhY2VzLiBXZSBnZW5lcmFsbHkgZG9uJ3QgdGFyZ2V0IGhhcmR3YXJlLXNwZWNpZmljIERTQSBkcml2ZXJzIHVubGVzcyB0aGV5J3JlIHdpZGVseSBlbXVsYXRlZCwgd2hpY2ggaXNuJ3QgdHlwaWNhbGx5IHRoZSBjYXNlLiBUaGUgaW5zdHJ1Y3Rpb25zIGV4cGxpY2l0bHkgc2F5IHRvIGV4Y2x1ZGUgdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoIGRyaXZlcnMsIGJ1dCBgbXhsODYyeHhgIGlzIGFuIE1ESU8tYmFzZWQgc3dpdGNoLCBzbyB0aGF0IGV4Y2x1c2lvbiBkb2Vzbid0IGRpcmVjdGx5IGFwcGx5LlxuXG5Ob3csIHRoZSBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIGZ1bmN0aW9uIGluIGNvcmUga2VybmVsIGNvZGUgaW4gYGRyaXZlcnMvYmFzZS9kZC5jYC4gVGhpcyBpcyBwb3RlbnRpYWxseSBtb3JlIGludGVyZXN0aW5nIGJlY2F1c2UgaXQncyAqY29yZSoga2VybmVsIGxvZ2ljIGFuZCBpcyBleHBvcnRlZC4gTG9va2luZyBhdCB0aGUgY29kZSwgaXQgc2NoZWR1bGVzIGEgcmVwcm9iZSBvcGVyYXRpb24gZm9yIGEgZGV2aWNlLCBwcm92aWRlZCBpdCdzIHJlZ2lzdGVyZWQsIGhhcyBhIGJ1cywgYSBwYXJlbnQsIGFuZCBhIGRyaXZlci4gSXQgdXNlcyBkZWxheWVkIHdvcmssIGFuZCB0aGUgY29kZSBsb29rcyBjbGVhbi4gQ3J1Y2lhbGx5LCBpdCdzIG5vdyBhIG5ldyBjb3JlIEFQSSwgd2hpY2ggbWVhbnMgKmFueSogZHJpdmVyIGNvdWxkIHBvdGVudGlhbGx5IHVzZSBpdC4gSXQgaXMgYWxzbyBleHBvcnRlZCwgbWVhbmluZyBpdCAqY2FuKiBiZSBjYWxsZWQgYnkgb3RoZXIgZHJpdmVycy5cblxuSG93ZXZlciwgY3VycmVudGx5LCBvbmx5IGBteGw4NjJ4eGAgY2FsbHMgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYC4gQmVjYXVzZSBgbXhsODYyeHhgIGlzIGFuIE1ESU8gZHJpdmVyLCB3aGljaCBtZWFucyBpdCBsaWtlbHkgaXNuJ3QgZ29pbmcgdG8gYmUgZnV6emVkIHVubGVzcyB0aGVyZSBpcyBzcGVjaWZpYyBzZXR1cCBpbnN0cnVjdGlvbnMuICBTeXprYWxsZXIgbWlnaHQgbm90IGF1dG9tYXRpY2FsbHkgaW5zdGFudGlhdGUgdGhlc2UgTURJTyBkZXZpY2VzIHVubGVzcyB0aGVyZSdzIGEgc3BlY2lmaWMgc3l6bGFuZyBkZXNjcmlwdGlvbi5cblxuVGhlIG90aGVyIGNoYW5nZSBpcyBgZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlYCBpbiBgbmV0L2RzYS9kZXZsaW5rLmNgLiBUaGlzIGlzIHJlYWNoYWJsZSB2aWEgdGhlIGRldmxpbmsgbmV0bGluayBpbnRlcmZhY2UsICppZiogdGhlIERTQSBzd2l0Y2ggc3VwcG9ydHMgZGV2bGluayBmbGFzaCB1cGRhdGVzLiBDdXJyZW50bHksIG9ubHkgYG14bDg2Mnh4YCBpbXBsZW1lbnRzIHRoaXMuIEZvciBvdGhlciBEU0Egc3dpdGNoZXMsIGl0IHdpbGwgcmV0dXJuIGAtRU9QTk9UU1VQUGAuXG5cblNvLCB0aGUgcmVhbCBxdWVzdGlvbiBpcyB3aGV0aGVyIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgaXMgd29ydGggZnV6emluZy4gV2hpbGUgaXQgKmNvdWxkKiBiZSB1c2VkIGJ5IG1vcmUgZHJpdmVycyBpbiB0aGUgZnV0dXJlLCBpdHMgY3VycmVudCBzb2xlIGNhbGxlciBpcyBgbXhsODYyeHhgLiBTaW5jZSBgbXhsODYyeHhgIGlzIGFuIE1ESU8gZHJpdmVyLCB3aGljaCBhcmUgbm90IGNvbW1vbmx5IGZ1enplZCB3aXRob3V0IGRlZGljYXRlZCBzZXR1cCwgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCB3aWxsIGxpa2VseSBiZSB1bnJlYWNoYWJsZSBpbiBtb3N0IGZ1enppbmcgc2V0dXBzIHVubGVzcyB0aGlzIGRyaXZlciBpcyBzcGVjaWZpY2FsbHkgZW5hYmxlZC5cblxuTXkgbmV4dCBzdGVwIHdvdWxkIGJlIHRvIHBlcmZvcm0gYSBgZGVmYXVsdF9hcGk6Z3JlcHBlcmAgc2VhcmNoIHRvIGNoZWNrIGZvciBvdGhlciBjYWxsZXJzIG9mIGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAsIGFsdGhvdWdoIEkgc3VzcGVjdCB0aGUgY3VycmVudCBjYWxsIGlzIHRoZSBvbmx5IG9uZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg2MTgsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzI3LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMDY6NTA6NTkuNDkwNjc5NDAyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5MjY0MjEwMDEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9iYXNlL2Jhc2UuaD04MD1zdHJ1Y3QgZHJpdmVyX3ByaXZhdGUge1xcbi0tXFxuZHJpdmVycy9iYXNlL2Jhc2UuaC0xMTEtICpcXHQgIGRldmljZSBsb2NrLiBBIGRlZmVycmVkIHJlLXByb2JlIHNjaGVkdWxlZCB3aXRoXFxuZHJpdmVycy9iYXNlL2Jhc2UuaDoxMTI6ICpcXHQgIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKCkgbXVzdCBub3QgZGV0YWNoIHRoZSBkZXZpY2UgYW55bW9yZS5cXG5kcml2ZXJzL2Jhc2UvYmFzZS5oLTExMy0gKlxcbi0tXFxuZHJpdmVycy9iYXNlL2RkLmM9MTQ0Nj1zdGF0aWMgdm9pZCBkZXZpY2VfcmVwcm9iZV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4tLVxcbmRyaXZlcnMvYmFzZS9kZC5jLTE0NzMtLyoqXFxuZHJpdmVycy9iYXNlL2RkLmM6MTQ3NDogKiBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZSAtIHNjaGVkdWxlIGEgZGVmZXJyZWQgZGV0YWNoIGFuZCByZS1wcm9iZVxcbmRyaXZlcnMvYmFzZS9kZC5jLTE0NzUtICogQGRldjogZGV2aWNlIHRvIGRldGFjaCBhbmQgcmUtcHJvYmVcXG4tLVxcbmRyaXZlcnMvYmFzZS9kZC5jLTE0OTgtICovXFxuZHJpdmVycy9iYXNlL2RkLmM6MTQ5OTppbnQgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMpXFxuZHJpdmVycy9iYXNlL2RkLmMtMTUwMC17XFxuLS1cXG5kcml2ZXJzL2Jhc2UvZGQuYy0xNTE5LX1cXG5kcml2ZXJzL2Jhc2UvZGQuYzoxNTIwOkVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9zY2hlZHVsZV9yZXByb2JlKTtcXG4tLVxcbmRyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jPTQyMT12b2lkIG14bDg2Mnh4X3Jlc2N1ZV9oZWFsX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbi0tXFxuZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMtNDUxLVxcbmRyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jOjQ1MjpcXHRpZiAoZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmUoZGV2LCBNWEw4NjJYWF9GV19SRVBST0JFX0RFTEFZX01TKSlcXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYy00NTMtXFx0XFx0V1JJVEVfT05DRShwcml2LVxcdTAwM2VyZXNjdWVfZmFpbGVkLCB0cnVlKTtcXG4tLVxcbmRyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jPTkyMz1pbnQgbXhsODYyeHhfZGV2bGlua19mbGFzaF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLFxcbi0tXFxuZHJpdmVycy9uZXQvZHNhL214bDg2Mnh4L214bDg2Mnh4LWZ3LmMtMTA1MC1cXHQgKi9cXG5kcml2ZXJzL25ldC9kc2EvbXhsODYyeHgvbXhsODYyeHgtZncuYzoxMDUxOlxcdGVyciA9IGRldmljZV9zY2hlZHVsZV9yZXByb2JlKGRzLVxcdTAwM2VkZXYsIE1YTDg2MlhYX0ZXX1JFUFJPQkVfREVMQVlfTVMpO1xcbmRyaXZlcnMvbmV0L2RzYS9teGw4NjJ4eC9teGw4NjJ4eC1mdy5jLTEwNTItXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2RldmljZS5oPTEzMTY9aW50IF9fbXVzdF9jaGVjayBkZXZpY2VfcmVwcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpO1xcbmluY2x1ZGUvbGludXgvZGV2aWNlLmg6MTMxNzppbnQgX19tdXN0X2NoZWNrIGRldmljZV9zY2hlZHVsZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldixcXG5pbmNsdWRlL2xpbnV4L2RldmljZS5oLTEzMTgtXFx0XFx0XFx0XFx0XFx0IHVuc2lnbmVkIGludCBkZWxheV9tcyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDA2OjUxOjAxLjQxNzEwNDYwM1oiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE4NTc4MTQ5MDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5c2lzIG9mIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBzb21lIGNoYW5nZXMgcmVsYXRlZCB0byBmaXJtd2FyZSBmbGFzaGluZyBmb3IgYSBNYXhMaW5lYXIgTXhMODYyeHggRFNBIHN3aXRjaCwgYSBkZXZpY2UgZHJpdmVyIGZvciBhIGhhcmR3YXJlLXNwZWNpZmljIHN3aXRjaC4gVGhlIGtleSBxdWVzdGlvbiBpcyB3aGV0aGVyIGFueSBvZiB0aGlzIGlzIGZydWl0ZnVsbHkgZnV6emFibGUgd2l0aGluIGEgc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudCwgd2hpY2ggaXMgd2hhdCBTeXprYWxsZXIgcHJpbWFyaWx5IG9wZXJhdGVzIGluLlxuXG5GaXJzdCwgdGhlIG9ubHkgY2FsbCBzaXRlIGZvciB0aGlzIHBhdGNoIGlzIHRoZSBgbXhsODYyeHhgIGRyaXZlciwgd2hpY2ggaXMgYW4gTURJTyBkZXZpY2UgZHJpdmVyLiBTeXprYWxsZXIgZG9lc24ndCBoYXZlIGEgcmVsaWFibGUsIGdlbmVyaWMgbWVjaGFuaXNtIHRvIGluc3RhbnRpYXRlIE1ESU8gZGV2aWNlcy4gSXQgbmVlZHMgYSBzcGVjaWZpYyBpbnRlcmZhY2UgbGlrZSBgbWRpby1ncGlvYCBvciBzaW1pbGFyLCB3aGljaCB3b3VsZCByZXF1aXJlIHRhcmdldGVkIGRlc2NyaXB0aW9ucywgd2hpY2ggd2UgZG9uJ3QgaGF2ZS4gRXZlbiBpZiB3ZSBjb3VsZCBnZXQgdGhlIGRyaXZlciBsb2FkZWQsIGl0IHJlcXVpcmVzIHNwZWNpZmljIGhhcmR3YXJlLlxuXG5UaGUgcGF0Y2ggaW50cm9kdWNlcyBgZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlYCwgcmVhY2hhYmxlIHZpYSB0aGUgZGV2bGluayBuZXRsaW5rIGludGVyZmFjZS4gVGhlIHByb2JsZW0gaXMgdGhhdCBmdXp6aW5nIGBkc2FfZGV2bGlua19mbGFzaF91cGRhdGVgIHdvdWxkIGp1c3QgcmVzdWx0IGluIGEgYC1FT1BOT1RTVVBQYCBlcnJvciAqdW5sZXNzKiB3ZSBoYXZlIGEgRFNBIHN3aXRjaCB0aGF0IGltcGxlbWVudHMgdGhpcyBmdW5jdGlvbmFsaXR5LCBhbmQgY3VycmVudGx5LCAqb25seSogYG14bDg2Mnh4YCBkb2VzLiBTbywgdHJpZ2dlcmluZyB0aGlzIHRocm91Z2ggYSBnZW5lcmljIERTQSBzd2l0Y2ggaXMgYSBkZWFkIGVuZC4gVGhpcyBpcyBhIHZlcnkgc2ltcGxlIHdyYXBwZXI6XG5cbmBgYGNcbnN0YXRpYyBpbnQgZHNhX2RldmxpbmtfZmxhc2hfdXBkYXRlKHN0cnVjdCBkZXZsaW5rICpkbCxcblx0XHRcdFx0ICAgIHN0cnVjdCBkZXZsaW5rX2ZsYXNoX3VwZGF0ZV9wYXJhbXMgKnBhcmFtcyxcblx0XHRcdFx0ICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbntcblx0c3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZHNhX2RldmxpbmtfdG9fZHMoZGwpO1xuXG5cdGlmICghZHMtXHUwMDNlb3BzLVx1MDAzZWRldmxpbmtfZmxhc2hfdXBkYXRlKVxuXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcblxuXHRyZXR1cm4gZHMtXHUwMDNlb3BzLVx1MDAzZWRldmxpbmtfZmxhc2hfdXBkYXRlKGRzLCBwYXJhbXMsIGV4dGFjayk7XG59XG5gYGBcblxuVGhlIGNvcmUgbG9naWMgbGllcyBpbiBgZGV2aWNlX3NjaGVkdWxlX3JlcHJvYmVgIGFuZCB3aXRoaW4gYG14bDg2Mnh4YCBpdHNlbGYuIFNpbmNlIGBteGw4NjJ4eGAgaXMgZm9yIGEgc3BlY2lmaWMsIGhhcmR3YXJlIHN3aXRjaCwgaXQgaXMgbm90IGVtdWxhdGVkIGluIFFFTVUuIFRoaXMgc2VlbXMgdG8gdmlvbGF0ZSB0aGUgcnVsZSBvZiByZXF1aXJpbmcgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcy5cblxuVGhlIGNvZGUgaW5zdHJ1Y3Rpb25zIHNheSB0byBzZXQgV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBjaGFuZ2VzIGFyZSBmb3IgYSB2ZW5kb3Itc3BlY2lmaWMgZHJpdmVyIHRoYXQgcmVxdWlyZXMgc3BlY2lmaWMgUENJZSBoYXJkd2FyZSBub3QgZW11bGF0ZWQgYnkgUUVNVS4gVGhhdCBpcyB0aGlzIGNhc2UuIFRoZSBNRElPIGNvbW11bmljYXRpb24gaXMgdmVyeSBzcGVjaWZpYywgYW5kIHRoZSBwcm9iZSB3aWxsIGZhaWwgaWYgaXQgZG9lc24ndCBnZXQgdGhlIGNvcnJlY3QgcmVzcG9uc2VzIGZyb20gdGhlIGhhcmR3YXJlOlxuYGBgY1xuXHRhID0gbXhsODYyeHhfc21kaW9fcmVhZChwcml2LCBNWEw4NjJYWF9TQl9QRElfQUREUik7XG5cdGQgPSBteGw4NjJ4eF9zbWRpb19yZWFkKHByaXYsIE1YTDg2MlhYX1NCX1BESV9EQVRBKTtcblx0aWYgKCh1MTYpYSAhPSBNWEw4NjJYWF9TQl9QRElfUFJPQkVfQSB8fFxuXHQgICAgKHUxNilkICE9IE1YTDg2MlhYX1NCX1BESV9QUk9CRV9EKVxuXHRcdHJldHVybiAtRU5PREVWO1xuYGBgXG5cbldlIGNoZWNrZWQgaWYgYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYCBjb3VsZCBiZSBjYWxsZWQgZnJvbSBhbnl3aGVyZSBlbHNlLCBidXQgaXQncyBvbmx5IGNhbGxlZCBieSBgbXhsODYyeHhgLiBTbywgdGhlIGNvcmUgY2hhbmdlcyBhcmUsIGZ1bmN0aW9uYWxseSwgaW1wb3NzaWJsZSB0byB0cmlnZ2VyIHdpdGhvdXQgdGhlIGhhcmR3YXJlLCBvciBhcmUgdHJpdmlhbC5cblxuVGhlcmUgaXMgYSBtaW5vciBhZGRpdGlvbiB0byBgZHJpdmVycy9iYXNlL2NvcmUuY2AgdGhhdCBzZXRzIGBzaHV0ZG93bl9kb25lID0gdHJ1ZWAgd2l0aGluIGBkZXZpY2Vfc2h1dGRvd25gLiBUaGlzIGhhcHBlbnMgZHVyaW5nIHN5c3RlbSBzaHV0ZG93biwgdHJpZ2dlcmVkIGJ5IFN5emthbGxlcidzIHJlYm9vdCBzZXF1ZW5jZSwgYW5kIHRoaXMgYWN0aW9uIGlzIHRyaXZpYWwgYW5kIHVubGlrZWx5IHRvIGJlIHRoZSB0YXJnZXQgb2YgYSBmdXp6LlxuXG5UaHVzLCB0aGUgYWRkZWQgY29kZSBpcyB1bnJlYWNoYWJsZSBvciB0cml2aWFsLCBhbmQgdGhlIHJldHVybiBpcyBXb3J0aEZ1enppbmc9ZmFsc2UuXG5cblRoZSByZWFzb25pbmcgaXMgdGhhdCB0aGUgY2hhbmdlcyBhcmUgbGFyZ2VseSBjb25maW5lZCB0byBhIHZlbmRvci1zcGVjaWZpYyBkcml2ZXIgcmVxdWlyaW5nIGhhcmR3YXJlIG5vdCBlbXVsYXRlZCBieSBRRU1VLCB0aGUgbmV3IGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgQVBJIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGhpcyB1bnJlYWNoYWJsZSBkcml2ZXIsIGFuZCB0aGUgRFNBIGRldmxpbmsgY2hhbmdlcyBhcmUgdHJpdmlhbCB3cmFwcGVycy4gVGhlIGBkZXZpY2Vfc2h1dGRvd25gIGNoYW5nZSBzZXRzIGEgYm9vbGVhbiBpbiBhIHNodXRkb3duIHJvdXRpbmUuIEFsbCBvZiB0aGlzIGluZGljYXRlcyB0aGVyZSdzIG5vdGhpbmcgZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50IGFuZCByZWFjaGFibGUgdGhhdCBpcyBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMTM1OCwiT3V0cHV0VG9rZW5zIjoxNzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTczLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDA2OjUxOjE5Ljk5NTI1NjQ1MloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTU0ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBmaXJtd2FyZSBmbGFzaCBzdXBwb3J0IGZvciB0aGUgTWF4TGluZWFyIE14TDg2Mnh4IERTQSBzd2l0Y2ggdmlhIGRldmxpbmssIGFsb25nIHdpdGggYSBuZXcgY29yZSBkcml2ZXIgbW9kZWwgZnVuY3Rpb24gYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYC4gVGhlIGBteGw4NjJ4eGAgZHJpdmVyIHJlcXVpcmVzIHBoeXNpY2FsIGhhcmR3YXJlIGNvbm5lY3RlZCB2aWEgTURJTyB0byBwcm9iZSBzdWNjZXNzZnVsbHkgYW5kIGlzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLiBUaGUgbmV3IGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgQVBJIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGhpcyB1bnJlYWNoYWJsZSBkcml2ZXIuIFRoZSBhZGRpdGlvbnMgdG8gdGhlIERTQSBkZXZsaW5rIGNvcmUgYXJlIHRyaXZpYWwgd3JhcHBlcnMgdGhhdCByZXR1cm4gYC1FT1BOT1RTVVBQYCBmb3IgYWxsIG90aGVyIHN3aXRjaGVzLiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBkZXZpY2Vfc2h1dGRvd25gIG1lcmVseSBzZXRzIGEgYm9vbGVhbiBmbGFnIGR1cmluZyBzeXN0ZW0gdGVhcmRvd24uIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50LCByZWFjaGFibGUgY29kZSB0byBmdXp6LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBmaXJtd2FyZSBmbGFzaCBzdXBwb3J0IGZvciB0aGUgTWF4TGluZWFyIE14TDg2Mnh4IERTQSBzd2l0Y2ggdmlhIGRldmxpbmssIGFsb25nIHdpdGggYSBuZXcgY29yZSBkcml2ZXIgbW9kZWwgZnVuY3Rpb24gYGRldmljZV9zY2hlZHVsZV9yZXByb2JlYC4gVGhlIGBteGw4NjJ4eGAgZHJpdmVyIHJlcXVpcmVzIHBoeXNpY2FsIGhhcmR3YXJlIGNvbm5lY3RlZCB2aWEgTURJTyB0byBwcm9iZSBzdWNjZXNzZnVsbHkgYW5kIGlzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLiBUaGUgbmV3IGBkZXZpY2Vfc2NoZWR1bGVfcmVwcm9iZWAgQVBJIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgdGhpcyB1bnJlYWNoYWJsZSBkcml2ZXIuIFRoZSBhZGRpdGlvbnMgdG8gdGhlIERTQSBkZXZsaW5rIGNvcmUgYXJlIHRyaXZpYWwgd3JhcHBlcnMgdGhhdCByZXR1cm4gYC1FT1BOT1RTVVBQYCBmb3IgYWxsIG90aGVyIHN3aXRjaGVzLiBUaGUgbW9kaWZpY2F0aW9uIHRvIGBkZXZpY2Vfc2h1dGRvd25gIG1lcmVseSBzZXRzIGEgYm9vbGVhbiBmbGFnIGR1cmluZyBzeXN0ZW0gdGVhcmRvd24uIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50LCByZWFjaGFibGUgY29kZSB0byBmdXp6LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMDY6NTE6MTkuOTk1MzE3MDEyWiIsIlNlcSI6NywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM4MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowqzl57[1] Phase: Running StartedAt: 2026-08-15 06:51:31 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowqzl57[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-08-15 06:51:31 +0000 UTC FinishedAt: 2026-08-15 06:51:35 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}