Name: series-workflowktr6k Phase: Running StartedAt: 2026-07-29 05:40:26 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowktr6k[0] Phase: Running StartedAt: 2026-07-29 05:40:26 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowktr6k[0].run-triage Phase: Running StartedAt: 2026-07-29 05:40:26 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowktr6k[0].run-triage(0) Phase: Running StartedAt: 2026-07-29 05:40:26 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +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+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgSTJDIGFuZCBVQVJUIChzZXJkZXYpIGRyaXZlciBmb3IgUmVhbHRlayBQU0UgTUNVcy4gVGhlIEkyQyBkcml2ZXIgcmVsaWVzIG9uIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoKWAgaW4gaXRzIHByb2JlIGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIE5VTEwgZm9yIGRldmljZXMgaW5zdGFudGlhdGVkIGR5bmFtaWNhbGx5IHZpYSBzeXNmcyBgbmV3X2RldmljZWAgYmVjYXVzZSB0aGV5IGxhY2sgYSBmaXJtd2FyZSBub2RlIChmd25vZGUpLiBXaXRob3V0IGFuIGBpZF90YWJsZWAgZmFsbGJhY2ssIHRoZSBwcm9iZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBmYWlsIHdpdGggLUVOT0RFViB3aGVuIGluc3RhbnRpYXRlZCB2aWEgc3lzZnMuIEZ1cnRoZXJtb3JlLCBzZXJkZXYgZGV2aWNlcyBjYW5ub3QgYmUgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkIHZpYSBzeXNmcyBhdCBhbGwuIFNpbmNlIHN5emthbGxlciBkb2VzIG5vdCBkeW5hbWljYWxseSBpbmplY3QgRGV2aWNlIFRyZWUgbm9kZXMgb3Igc29mdHdhcmUgbm9kZXMgZm9yIGFyYml0cmFyeSBJMkMvc2VyZGV2IGRldmljZXMsIHRoaXMgZHJpdmVyIGNhbm5vdCBiZSBzdWNjZXNzZnVsbHkgcHJvYmVkIGFuZCBpdHMgY29yZSBsb2dpYyBpcyBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIFFFTVUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYjdjOTFlMjBmM2Y5MmI5OGRkMmFkZGVmZDE3ZTE3YTQ3NDFlMTQwZlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgSnVsIDI5IDA1OjQ3OjM3IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcHNlLXBkL3JlYWx0ZWsscHNlLW1jdS1nZW4xLnlhbWwgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3BzZS1wZC9yZWFsdGVrLHBzZS1tY3UtZ2VuMS55YW1sXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMGYxYTgxOWRiNDliYlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9wc2UtcGQvcmVhbHRlayxwc2UtbWN1LWdlbjEueWFtbFxuQEAgLTAsMCAmIzQzOzEsMTgwIEBAXG4mIzQzOyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IChHUEwtMi4wLW9ubHkgT1IgQlNELTItQ2xhdXNlKVxuJiM0MzslWUFNTCAxLjJcbiYjNDM7LS0tXG4mIzQzOyRpZDogaHR0cDovL2RldmljZXRyZWUub3JnL3NjaGVtYXMvbmV0L3BzZS1wZC9yZWFsdGVrLHBzZS1tY3UtZ2VuMS55YW1sI1xuJiM0Mzskc2NoZW1hOiBodHRwOi8vZGV2aWNldHJlZS5vcmcvbWV0YS1zY2hlbWFzL2NvcmUueWFtbCNcbiYjNDM7XG4mIzQzO3RpdGxlOiBSZWFsdGVrIFBTRSBNQ1VcbiYjNDM7XG4mIzQzO21haW50YWluZXJzOlxuJiM0MzsgIC0gSm9uYXMgSmVsb25layBcdTAwM2NqZWxvbmVrLmpvbmFzQGdtYWlsLmNvbVx1MDAzZVxuJiM0MztcbiYjNDM7ZGVzY3JpcHRpb246IHxcbiYjNDM7ICBBIG1pY3JvY29udHJvbGxlciAoTUNVKSB0aGF0IG1hbmFnZXMgdGhlIFBTRSAoUG93ZXIgU291cmNpbmcgRXF1aXBtZW50KVxuJiM0MzsgIGhhcmR3YXJlIG9uIGEgcmFuZ2Ugb2YgbWFuYWdlZCBQb0Ugc3dpdGNoZXMuIFRoZSBob3N0IENQVSB0YWxrcyBvbmx5IHRvXG4mIzQzOyAgdGhpcyBNQ1UgLSBvdmVyIEkyQy9TTUJ1cyBvciBVQVJUIC0gdXNpbmcgYSBzbWFsbCBtZXNzYWdlLWJhc2VkIHByb3RvY29sO1xuJiM0MzsgIHRoZSBQU0Ugc2lsaWNvbiBpdCBkcml2ZXMgc2l0cyBiZWhpbmQgdGhlIE1DVSBhbmQgaXMgbmV2ZXIgYWNjZXNzZWRcbiYjNDM7ICBkaXJlY3RseS4gRm9yIGV4YW1wbGUsIG9uIHRoZSBaeXhlbCBHUzE5MDAtMTBIUCB0aGUgU29DIHJlYWNoZXMgdGhlIE1DVVxuJiM0MzsgIG92ZXIgVUFSVCwgYW5kIHRoZSBNQ1UgbWFuYWdlcyB0aGUgb24tYm9hcmQgUFNFIGNoaXAuXG4mIzQzO1xuJiM0MzsgIFRoaXMgYmluZGluZyBkZXNjcmliZXMgdGhlIE1DVSB0b2dldGhlciB3aXRoIGl0cyBSZWFsdGVrIGZpcm13YXJlOiB0aGVcbiYjNDM7ICBmaXJtd2FyZSBhbmQgaXRzIGhvc3QgcHJvdG9jb2wsIHdoaWNoIGFyZSBzdGFibGUgYWNyb3NzIGJvYXJkcy4gVGhlXG4mIzQzOyAgbWljcm9jb250cm9sbGVyIHNpbGljb24gaXMgYSBnZW5lcmFsLXB1cnBvc2UgcGFydCB0aGF0IHZhcmllcywgYW5kIHRoZVxuJiM0MzsgIFBTRSBzaWxpY29uIGJlaGluZCB0aGUgTUNVIChSZWFsdGVrIFJUTDgyM3gvUlRMODIzOSogb3IgQnJvYWRjb21cbiYjNDM7ICBCQ001OXh4eCkgaXMgcmVwb3J0ZWQgYnkgdGhlIE1DVSBhbmQgZGV0ZWN0ZWQgYXQgcnVudGltZSAtIG5laXRoZXIgaXNcbiYjNDM7ICBuYW1lZCBoZXJlLlxuJiM0MztcbiYjNDM7ICBUd28gcHJvdG9jb2wgZ2VuZXJhdGlvbnMgZXhpc3QsIGJvdGggUmVhbHRlayYjMzk7czpcbiYjNDM7ICAgIGdlbjEgIG9sZGVyIGJvYXJkcywgd2hlcmUgdGhlIE1DVSBmcm9udHMgQnJvYWRjb20gUFNFIHNpbGljb25cbiYjNDM7ICAgIGdlbjIgIHRoZSBhbHRlcmVkIHByb3RvY29sIHVzZWQgd2l0aCBSZWFsdGVrJiMzOTtzIG93biBQU0Ugc2lsaWNvblxuJiM0MztcbiYjNDM7ICBPbiBhbiBJMkMgYXR0YWNobWVudCB0aGUgZnJhbWluZyB0aGUgTUNVIGZpcm13YXJlIGV4cGVjdHMgaXMgcGFydCBvZiB0aGVcbiYjNDM7ICBjb21wYXRpYmxlOiAmIzM5Oy1zbWJ1cyYjMzk7IChyZWFkcyBjYXJyeSBhIGxlYWRpbmcgY29tbWFuZCBieXRlIGFuZCBhIHJlcGVhdGVkXG4mIzQzOyAgc3RhcnQpIG9yICYjMzk7LWkyYyYjMzk7IChiYXJlIGJsb2NrIHdyaXRlcyBhbmQgcmVhZHMpLiBBIFVBUlQgYXR0YWNobWVudCBjYXJyaWVzXG4mIzQzOyAgbm8gZnJhbWluZyBzdWZmaXg7IHRoZSB0cmFuc3BvcnQgaXMgZ2l2ZW4gYnkgdGhlIHBhcmVudCAmIzM5O3NlcmlhbCYjMzk7IG5vZGUuXG4mIzQzO1xuJiM0MzsgIEVhY2ggYm9hcmQgYWRkaXRpb25hbGx5IGNhcnJpZXMgYSBkZXZpY2Utc3BlY2lmaWMgY29tcGF0aWJsZSB0aGF0IGZhbGxzXG4mIzQzOyAgYmFjayB0byBvbmUgb2YgdGhlIHByb3RvY29sIGNvbXBhdGlibGVzIGFib3ZlLiBEcml2ZXJzIGJpbmQgb24gdGhlXG4mIzQzOyAgcHJvdG9jb2wgY29tcGF0aWJsZTsgdGhlIGRldmljZS1zcGVjaWZpYyBzdHJpbmcgaWRlbnRpZmllcyB0aGUgYm9hcmQgYW5kXG4mIzQzOyAgcmVzZXJ2ZXMgYSBwbGFjZSBmb3IgYSBmdXR1cmUgcGVyLWJvYXJkIHF1aXJrIHdpdGhvdXQgaGF2aW5nIHRvIHJldHJvZml0XG4mIzQzOyAgZGV2aWNlIHRyZWVzIGFscmVhZHkgaW4gdGhlIGZpZWxkLlxuJiM0MztcbiYjNDM7cHJvcGVydGllczpcbiYjNDM7ICBjb21wYXRpYmxlOlxuJiM0MzsgICAgb25lT2Y6XG4mIzQzOyAgICAgICMgVUFSVFxuJiM0MzsgICAgICAtIGl0ZW1zOlxuJiM0MzsgICAgICAgICAgLSBlbnVtOlxuJiM0MzsgICAgICAgICAgICAgIC0genl4ZWwsZ3MxOTAwLTEwaHAtYTEtcHNlXG4mIzQzOyAgICAgICAgICAtIGNvbnN0OiByZWFsdGVrLHBzZS1tY3UtZ2VuMVxuJiM0MztcbiYjNDM7ICAgICAgIyBJMkMsIFNNQnVzIGZyYW1pbmdcbiYjNDM7ICAgICAgLSBpdGVtczpcbiYjNDM7ICAgICAgICAgIC0gZW51bTpcbiYjNDM7ICAgICAgICAgICAgICAtIHp5eGVsLGdzMTkyMC0yNGhwLXYyLXBzZVxuJiM0MzsgICAgICAgICAgLSBjb25zdDogcmVhbHRlayxwc2UtbWN1LWdlbjEtc21idXNcbiYjNDM7XG4mIzQzOyAgICAgICMgVUFSVFxuJiM0MzsgICAgICAtIGl0ZW1zOlxuJiM0MzsgICAgICAgICAgLSBlbnVtOlxuJiM0MzsgICAgICAgICAgICAgIC0genl4ZWwsZ3MxOTAwLTEwaHAtYjEtcHNlXG4mIzQzOyAgICAgICAgICAgICAgLSB6eXhlbCx4bWcxOTE1LTEwZXAtcHNlXG4mIzQzOyAgICAgICAgICAtIGNvbnN0OiByZWFsdGVrLHBzZS1tY3UtZ2VuMlxuJiM0MztcbiYjNDM7ICAgICAgIyBJMkMsIFNNQnVzIGZyYW1pbmdcbiYjNDM7ICAgICAgLSBpdGVtczpcbiYjNDM7ICAgICAgICAgIC0gZW51bTpcbiYjNDM7ICAgICAgICAgICAgICAtIHp5eGVsLHhzMTkzMC0xMmhwLXBzZVxuJiM0MzsgICAgICAgICAgLSBjb25zdDogcmVhbHRlayxwc2UtbWN1LWdlbjItc21idXNcbiYjNDM7XG4mIzQzOyAgICAgICMgSTJDLCByYXcgZnJhbWluZ1xuJiM0MzsgICAgICAtIGl0ZW1zOlxuJiM0MzsgICAgICAgICAgLSBlbnVtOlxuJiM0MzsgICAgICAgICAgICAgIC0gbGlua3N5cyxsZ3MzMjhtcGMtdjItcHNlXG4mIzQzOyAgICAgICAgICAtIGNvbnN0OiByZWFsdGVrLHBzZS1tY3UtZ2VuMi1pMmNcbiYjNDM7XG4mIzQzOyAgcmVnOlxuJiM0MzsgICAgbWF4SXRlbXM6IDFcbiYjNDM7XG4mIzQzOyAgcmVzZXQtZ3Bpb3M6XG4mIzQzOyAgICBkZXNjcmlwdGlvbjogUmVzZXQgbGluZSBvZiB0aGUgTUNVLlxuJiM0MzsgICAgbWF4SXRlbXM6IDFcbiYjNDM7XG4mIzQzOyAgZGlzYWJsZS1wb3J0cy1ncGlvczpcbiYjNDM7ICAgIGRlc2NyaXB0aW9uOlxuJiM0MzsgICAgICBIYXJkd2FyZSBnYXRlIHRoYXQgZm9yY2VzIGFsbCBwb3J0cyBpbnRvIGFkbWluLWRpc2FibGVkIHN0YXRlIHdoaWxlXG4mIzQzOyAgICAgIGFzc2VydGVkLlxuJiM0MzsgICAgbWF4SXRlbXM6IDFcbiYjNDM7XG4mIzQzO3JlcXVpcmVkOlxuJiM0MzsgIC0gY29tcGF0aWJsZVxuJiM0MztcbiYjNDM7YWxsT2Y6XG4mIzQzOyAgLSAkcmVmOiBwc2UtY29udHJvbGxlci55YW1sI1xuJiM0MzsgIC0gJHJlZjogL3NjaGVtYXMvc2VyaWFsL3NlcmlhbC1wZXJpcGhlcmFsLXByb3BzLnlhbWwjXG4mIzQzOyAgIyBBICYjMzk7LXNtYnVzJiMzOTsvJiMzOTstaTJjJiMzOTsgY29tcGF0aWJsZSBpcyBhbiBJMkMgYXR0YWNobWVudDogaXQgaGFzICYjMzk7cmVnJiMzOTsgYW5kXG4mIzQzOyAgIyBjYW5ub3QgY2Fycnkgc2VyaWFsIGJ1cyBwcm9wZXJ0aWVzLiBBIGJhcmUgZ2VuIGNvbXBhdGlibGUgaXMgYSBVQVJUXG4mIzQzOyAgIyBhdHRhY2htZW50OiBubyAmIzM5O3JlZyYjMzk7LCB0aGUgdHJhbnNwb3J0IGNvbWVzIGZyb20gdGhlIHBhcmVudCBzZXJpYWwgbm9kZS5cbiYjNDM7ICAtIGlmOlxuJiM0MzsgICAgICBwcm9wZXJ0aWVzOlxuJiM0MzsgICAgICAgIGNvbXBhdGlibGU6XG4mIzQzOyAgICAgICAgICBjb250YWluczpcbiYjNDM7ICAgICAgICAgICAgZW51bTpcbiYjNDM7ICAgICAgICAgICAgICAtIHJlYWx0ZWsscHNlLW1jdS1nZW4xLXNtYnVzXG4mIzQzOyAgICAgICAgICAgICAgLSByZWFsdGVrLHBzZS1tY3UtZ2VuMi1zbWJ1c1xuJiM0MzsgICAgICAgICAgICAgIC0gcmVhbHRlayxwc2UtbWN1LWdlbjItaTJjXG4mIzQzOyAgICB0aGVuOlxuJiM0MzsgICAgICByZXF1aXJlZDpcbiYjNDM7ICAgICAgICAtIHJlZ1xuJiM0MzsgICAgICBwcm9wZXJ0aWVzOlxuJiM0MzsgICAgICAgIGN1cnJlbnQtc3BlZWQ6IGZhbHNlXG4mIzQzOyAgICAgICAgbWF4LXNwZWVkOiBmYWxzZVxuJiM0MzsgICAgZWxzZTpcbiYjNDM7ICAgICAgcHJvcGVydGllczpcbiYjNDM7ICAgICAgICByZWc6IGZhbHNlXG4mIzQzO1xuJiM0Mzt1bmV2YWx1YXRlZFByb3BlcnRpZXM6IGZhbHNlXG4mIzQzO1xuJiM0MztleGFtcGxlczpcbiYjNDM7ICAjIFNNQnVzLWZyYW1lZCBJMkMgYXR0YWNobWVudFxuJiM0MzsgIC0gfFxuJiM0MzsgICAgaTJjIHtcbiYjNDM7ICAgICAgICAjYWRkcmVzcy1jZWxscyA9IFx1MDAzYzFcdTAwM2U7XG4mIzQzOyAgICAgICAgI3NpemUtY2VsbHMgPSBcdTAwM2MwXHUwMDNlO1xuJiM0MztcbiYjNDM7ICAgICAgICBldGhlcm5ldC1wc2VAMjAge1xuJiM0MzsgICAgICAgICAgICBjb21wYXRpYmxlID0gXCYjMzQ7enl4ZWwseHMxOTMwLTEyaHAtcHNlXCYjMzQ7LCBcJiMzNDtyZWFsdGVrLHBzZS1tY3UtZ2VuMi1zbWJ1c1wmIzM0OztcbiYjNDM7ICAgICAgICAgICAgcmVnID0gXHUwMDNjMHgyMFx1MDAzZTtcbiYjNDM7XG4mIzQzOyAgICAgICAgICAgIHBzZS1waXMge1xuJiM0MzsgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSBcdTAwM2MxXHUwMDNlO1xuJiM0MzsgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSBcdTAwM2MwXHUwMDNlO1xuJiM0MztcbiYjNDM7ICAgICAgICAgICAgICAgIHBzZS1waUAwIHtcbiYjNDM7ICAgICAgICAgICAgICAgICAgICByZWcgPSBcdTAwM2MwXHUwMDNlO1xuJiM0MzsgICAgICAgICAgICAgICAgICAgICNwc2UtY2VsbHMgPSBcdTAwM2MwXHUwMDNlO1xuJiM0MzsgICAgICAgICAgICAgICAgfTtcbiYjNDM7ICAgICAgICAgICAgfTtcbiYjNDM7ICAgICAgICB9O1xuJiM0MzsgICAgfTtcbiYjNDM7XG4mIzQzOyAgIyBSYXctSTJDLWZyYW1lZCBhdHRhY2htZW50XG4mIzQzOyAgLSB8XG4mIzQzOyAgICBpMmMge1xuJiM0MzsgICAgICAgICNhZGRyZXNzLWNlbGxzID0gXHUwMDNjMVx1MDAzZTtcbiYjNDM7ICAgICAgICAjc2l6ZS1jZWxscyA9IFx1MDAzYzBcdTAwM2U7XG4mIzQzO1xuJiM0MzsgICAgICAgIGV0aGVybmV0LXBzZUAyMCB7XG4mIzQzOyAgICAgICAgICAgIGNvbXBhdGlibGUgPSBcJiMzNDtsaW5rc3lzLGxnczMyOG1wYy12Mi1wc2VcJiMzNDssIFwmIzM0O3JlYWx0ZWsscHNlLW1jdS1nZW4yLWkyY1wmIzM0OztcbiYjNDM7ICAgICAgICAgICAgcmVnID0gXHUwMDNjMHgyMFx1MDAzZTtcbiYjNDM7XG4mIzQzOyAgICAgICAgICAgIHBzZS1waXMge1xuJiM0MzsgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSBcdTAwM2MxXHUwMDNlO1xuJiM0MzsgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSBcdTAwM2MwXHUwMDNlO1xuJiM0MztcbiYjNDM7ICAgICAgICAgICAgICAgIHBzZS1waUAwIHtcbiYjNDM7ICAgICAgICAgICAgICAgICAgICByZWcgPSBcdTAwM2MwXHUwMDNlO1xuJiM0MzsgICAgICAgICAgICAgICAgICAgICNwc2UtY2VsbHMgPSBcdTAwM2MwXHUwMDNlO1xuJiM0MzsgICAgICAgICAgICAgICAgfTtcbiYjNDM7ICAgICAgICAgICAgfTtcbiYjNDM7ICAgICAgICB9O1xuJiM0MzsgICAgfTtcbiYjNDM7XG4mIzQzOyAgIyBVQVJUIGF0dGFjaG1lbnRcbiYjNDM7ICAtIHxcbiYjNDM7ICAgIHNlcmlhbCB7XG4mIzQzOyAgICAgICAgZXRoZXJuZXQtcHNlIHtcbiYjNDM7ICAgICAgICAgICAgY29tcGF0aWJsZSA9IFwmIzM0O3p5eGVsLGdzMTkwMC0xMGhwLWExLXBzZVwmIzM0OywgXCYjMzQ7cmVhbHRlayxwc2UtbWN1LWdlbjFcJiMzNDs7XG4mIzQzOyAgICAgICAgICAgIGN1cnJlbnQtc3BlZWQgPSBcdTAwM2MxOTIwMFx1MDAzZTtcbiYjNDM7XG4mIzQzOyAgICAgICAgICAgIHBzZS1waXMge1xuJiM0MzsgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSBcdTAwM2MxXHUwMDNlO1xuJiM0MzsgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSBcdTAwM2MwXHUwMDNlO1xuJiM0MztcbiYjNDM7ICAgICAgICAgICAgICAgIHBzZS1waUAwIHtcbiYjNDM7ICAgICAgICAgICAgICAgICAgICByZWcgPSBcdTAwM2MwXHUwMDNlO1xuJiM0MzsgICAgICAgICAgICAgICAgICAgICNwc2UtY2VsbHMgPSBcdTAwM2MwXHUwMDNlO1xuJiM0MzsgICAgICAgICAgICAgICAgfTtcbiYjNDM7ICAgICAgICAgICAgfTtcbiYjNDM7ICAgICAgICB9O1xuJiM0MzsgICAgfTtcbmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTXG5pbmRleCAyZDQyMGQ0MDc4MmUzLi40MzM0YzI0NTMwNTI4IDEwMDY0NFxuLS0tIGEvTUFJTlRBSU5FUlNcbiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTXG5AQCAtMjI3NjcsNiAmIzQzOzIyNzY3LDEzIEBAIFM6XHRNYWludGFpbmVkXG4gRjpcdERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9yZWFsdGVrLG90dG8td2R0LnlhbWxcbiBGOlx0ZHJpdmVycy93YXRjaGRvZy9yZWFsdGVrX290dG9fd2R0LmNcbiBcbiYjNDM7UkVBTFRFSyBQU0UgTUNVIERSSVZFUlxuJiM0MztNOlx0Sm9uYXMgSmVsb25layBcdTAwM2NqZWxvbmVrLmpvbmFzQGdtYWlsLmNvbVx1MDAzZVxuJiM0MztMOlx0bmV0ZGV2QHZnZXIua2VybmVsLm9yZ1xuJiM0MztTOlx0TWFpbnRhaW5lZFxuJiM0MztGOlx0RG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9wc2UtcGQvcmVhbHRlayxwc2UtbWN1LWdlbjEueWFtbFxuJiM0MztGOlx0ZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdSpcbiYjNDM7XG4gUkVBTFRFSyBSVEw4M3h4IFNNSSBEU0EgUk9VVEVSIENISVBTXG4gTTpcdExpbnVzIFdhbGxlaWogXHUwMDNjbGludXN3QGtlcm5lbC5vcmdcdTAwM2VcbiBNOlx0QWx2aW4gxaBpcHJhZ2EgXHUwMDNjYWxzaUBiYW5nLW9sdWZzZW4uZGtcdTAwM2VcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9LY29uZmlnXG5pbmRleCA3ZWYyOTY1N2VlNWRkLi5hMGYyYWU2NjhjNjdjIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvcHNlLXBkL0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9LY29uZmlnXG5AQCAtMTMsNiAmIzQzOzEzLDM0IEBAIG1lbnVjb25maWcgUFNFX0NPTlRST0xMRVJcbiBcbiBpZiBQU0VfQ09OVFJPTExFUlxuIFxuJiM0Mztjb25maWcgUFNFX1JFQUxURUtfTUNVXG4mIzQzO1x0dHJpc3RhdGVcbiYjNDM7XHRoZWxwXG4mIzQzO1x0ICBTaGFyZWQgY29yZSBmb3IgdGhlIFJlYWx0ZWsgUFNFIE1DVSBkcml2ZXIuIFRoaXMgaXMgc2VsZWN0ZWRcbiYjNDM7XHQgIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHRyYW5zcG9ydCBvcHRpb25zIGJlbG93LlxuJiM0MztcbiYjNDM7Y29uZmlnIFBTRV9SRUFMVEVLX01DVV9JMkNcbiYjNDM7XHR0cmlzdGF0ZSBcJiMzNDtSZWFsdGVrIFBTRSBNQ1UgZHJpdmVyIChJMkMgdHJhbnNwb3J0KVwmIzM0O1xuJiM0MztcdGRlcGVuZHMgb24gSTJDXG4mIzQzO1x0c2VsZWN0IFBTRV9SRUFMVEVLX01DVVxuJiM0MztcdGhlbHBcbiYjNDM7XHQgIERyaXZlciBmb3IgdGhlIG1pY3JvY29udHJvbGxlciAoTUNVKSB0aGF0IGZyb250cyB0aGUgUFNFXG4mIzQzO1x0ICBoYXJkd2FyZSBvbiB2YXJpb3VzIFJlYWx0ZWstYmFzZWQgbWFuYWdlZCBzd2l0Y2hlcywgYXR0YWNoZWRcbiYjNDM7XHQgIHZpYSBJMkMvU01CdXMuIFRoZSBNQ1UgZXhwb3NlcyBhIG1lc3NhZ2UtYmFzZWQgcHJvdG9jb2w7IHRoZSBhY3R1YWxcbiYjNDM7XHQgIFBTRSBzaWxpY29uIGlzIG5vdCBhY2Nlc3NlZCBkaXJlY3RseS4gVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhXG4mIzQzO1x0ICBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmVhbHRlay1wc2UtbWN1LWkyYy5cbiYjNDM7XG4mIzQzO2NvbmZpZyBQU0VfUkVBTFRFS19NQ1VfVUFSVFxuJiM0MztcdHRyaXN0YXRlIFwmIzM0O1JlYWx0ZWsgUFNFIE1DVSBkcml2ZXIgKFVBUlQgdHJhbnNwb3J0KVwmIzM0O1xuJiM0MztcdGRlcGVuZHMgb24gU0VSSUFMX0RFVl9CVVNcbiYjNDM7XHRzZWxlY3QgUFNFX1JFQUxURUtfTUNVXG4mIzQzO1x0aGVscFxuJiM0MztcdCAgRHJpdmVyIGZvciB0aGUgbWljcm9jb250cm9sbGVyIChNQ1UpIHRoYXQgZnJvbnRzIHRoZSBQU0VcbiYjNDM7XHQgIGhhcmR3YXJlIG9uIHZhcmlvdXMgUmVhbHRlay1iYXNlZCBtYW5hZ2VkIHN3aXRjaGVzLCBhdHRhY2hlZFxuJiM0MztcdCAgdmlhIFVBUlQuIFRoZSBNQ1UgZXhwb3NlcyBhIG1lc3NhZ2UtYmFzZWQgcHJvdG9jb2w7IHRoZSBhY3R1YWwgUFNFXG4mIzQzO1x0ICBzaWxpY29uIGlzIG5vdCBhY2Nlc3NlZCBkaXJlY3RseS4gVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhXG4mIzQzO1x0ICBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmVhbHRlay1wc2UtbWN1LXVhcnQuXG4mIzQzO1xuIGNvbmZpZyBQU0VfUkVHVUxBVE9SXG4gXHR0cmlzdGF0ZSBcJiMzNDtSZWd1bGF0b3IgYmFzZWQgUFNFIGNvbnRyb2xsZXJcJiMzNDtcbiBcdGhlbHBcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9wc2UtcGQvTWFrZWZpbGVcbmluZGV4IGNjNzhmN2VhN2Y1ZjcuLjljY2E1OTAwZmUzNDIgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9wc2UtcGQvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9NYWtlZmlsZVxuQEAgLTMsNiAmIzQzOzMsOSBAQFxuIFxuIG9iai0kKENPTkZJR19QU0VfQ09OVFJPTExFUikgJiM0Mzs9IHBzZV9jb3JlLm9cbiBcbiYjNDM7b2JqLSQoQ09ORklHX1BTRV9SRUFMVEVLX01DVSkgJiM0Mzs9IHJlYWx0ZWstcHNlLW1jdS1jb3JlLm9cbiYjNDM7b2JqLSQoQ09ORklHX1BTRV9SRUFMVEVLX01DVV9JMkMpICYjNDM7PSByZWFsdGVrLXBzZS1tY3UtaTJjLm9cbiYjNDM7b2JqLSQoQ09ORklHX1BTRV9SRUFMVEVLX01DVV9VQVJUKSAmIzQzOz0gcmVhbHRlay1wc2UtbWN1LXVhcnQub1xuIG9iai0kKENPTkZJR19QU0VfUkVHVUxBVE9SKSAmIzQzOz0gcHNlX3JlZ3VsYXRvci5vXG4gb2JqLSQoQ09ORklHX1BTRV9QRDY5MlgwKSAmIzQzOz0gcGQ2OTJ4MC5vXG4gb2JqLSQoQ09ORklHX1BTRV9TSTM0NzQpICYjNDM7PSBzaTM0NzQub1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtY29yZS5jIGIvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS1jb3JlLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5lZDNiNzQzNDcwZGJmXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LWNvcmUuY1xuQEAgLTAsMCAmIzQzOzEsOTg4IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4mIzQzOy8qXG4mIzQzOyAqIERyaXZlciBmb3IgdGhlIG1pY3JvY29udHJvbGxlciAoTUNVKSBmcm9udGluZyBQU0Ugc2lsaWNvbiBvbiB2YXJpb3VzXG4mIzQzOyAqIFJlYWx0ZWstYmFzZWQgbWFuYWdlZCBzd2l0Y2hlcy4gVGhlIE1DVSBzcGVha3MgYSAxMi1ieXRlIGZpeGVkLWZyYW1lXG4mIzQzOyAqIG1hbmFnZW1lbnQgcHJvdG9jb2w7IHRoaXMgZHJpdmVyIGNvdmVycyB0d28gZ2VuZXJhdGlvbnMgb2YgdGhlXG4mIzQzOyAqIHByb3RvY29sIHZpYSBhIHBlci1kaWFsZWN0IG9wY29kZSB0YWJsZSBhbmQgcmVzcG9uc2UgcGFyc2Vycy5cbiYjNDM7ICpcbiYjNDM7ICogTWFueSBQb0Ugc3dpdGNoIGRlc2lnbnMgcHV0IGEgZGVkaWNhdGVkIG1pY3JvY29udHJvbGxlciBpbiBmcm9udCBvZiB0aGVcbiYjNDM7ICogYWN0dWFsIFBTRSBzaWxpY29uOiB0aGUgaG9zdCBDUFUgdGFsa3MgdG8gdGhlIE1DVSBvdmVyIEkyQy9TTUJ1cyBvclxuJiM0MzsgKiBVQVJULCBhbmQgdGhlIE1DVSBpbiB0dXJuIG1hbmFnZXMgdGhlIFBTRSBjaGlwcyBvbiB0aGUgYm9hcmQuIFRoZSBNQ1VcbiYjNDM7ICogc3BlYWtzIGEgc21hbGwgbWVzc2FnZS1iYXNlZCBwcm90b2NvbC4gVGhlIFBTRSBjaGlwcyB0aGVtc2VsdmVzIGFyZSBub3RcbiYjNDM7ICogYWNjZXNzZWQgZGlyZWN0bHk7IGV2ZXJ5dGhpbmcgZ29lcyB0aHJvdWdoIE1DVSBjb21tYW5kcy5cbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBkcml2ZXIgdGFyZ2V0cyB0aGF0IGFyY2hpdGVjdHVyZSBmb3IgdGhlIFJlYWx0ZWstZmFtaWx5IHByb3RvY29sLlxuJiM0MzsgKiBUd28gZ2VuZXJhdGlvbnMgYXJlIHN1cHBvcnRlZDogR2VuMSBiZWluZyB1c2VkIG9uIG9sZGVyIHN3aXRjaGVzIHdoZXJlXG4mIzQzOyAqIHRoZSBNQ1UgZnJvbnRzIGFuZCBtYW5hZ2VzIEJyb2FkY29tIFBTRSBzaWxpY29uOyBHZW4yIGJlaW5nIHVzZWQgd2l0aFxuJiM0MzsgKiBSZWFsdGVrIFBTRSBzaWxpY29uLiBUaGUgdHdvIHNoYXJlIGZyYW1lIGZvcm1hdCBhbmQgYSBzdW0tbW9kLTI1NlxuJiM0MzsgKiBjaGVja3N1bSBidXQgZGl2ZXJnZSBvbiBvcGNvZGUgbnVtYmVycyBhbmQgb24gYSBmZXcgcmVzcG9uc2UgbGF5b3V0cztcbiYjNDM7ICogdGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBwZXItZGlhbGVjdCBvcGNvZGUgdGFibGUgYW5kIHBhcnNlciBob29rcy5cbiYjNDM7ICpcbiYjNDM7ICogT3V0IG9mIHNjb3BlOiBQU0UgY2hpcHMgdGhhdCBhcmUgaW50ZXJmYWNlZCBkaXJlY3RseSBmcm9tIHRoZSBob3N0XG4mIzQzOyAqIHdpdGhvdXQgYSBtYW5hZ2VtZW50IE1DVSwgTUNVIGRlc2lnbnMgdGhhdCBzcGVhayBhbiB1bnJlbGF0ZWQgcHJvdG9jb2xcbiYjNDM7ICogZmFtaWx5LCBhbmQgXCYjMzQ7ZHVtYiBQU0VcJiMzNDsgbW9kZXMgd2hlcmUgbm8gaG9zdCBjb250cm9sIGlzIHdpcmVkIHVwIGF0IGFsbC5cbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBjb3JlIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBwcm90b2NvbCwgZGVjb2RpbmcvZW5jb2Rpbmcgb2YgTUNVXG4mIzQzOyAqIHJlc3BvbnNlcywgYW5kIHRoZSBwc2VfY29udHJvbGxlcl9vcHMgaW50ZWdyYXRpb24uIFRyYW5zcG9ydCBtb2R1bGVzXG4mIzQzOyAqIChyZWFsdGVrLXBzZS1tY3UtaTJjLCByZWFsdGVrLXBzZS1tY3UtdWFydCkgcHJvdmlkZSB0aGUgc2VuZC9yZWN2XG4mIzQzOyAqIGNhbGxiYWNrcy5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRmaWVsZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NsZWFudXAuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jb250YWluZXJfb2YuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWxheS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2dwaW8vY29uc3VtZXIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9qaWZmaWVzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbWlubWF4LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcHJvcGVydHkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wc2UtcGQvcHNlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdW5hbGlnbmVkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3JlYWx0ZWstcHNlLW1jdS5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOEJcdFx0MHgwMTM4XG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX0RFVklDRV9JRF9SVEw4MjM5XHRcdDB4MDAzOVxuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOUNcdFx0MHgwMTM5XG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX0RFVklDRV9JRF9CQ001OTExMVx0XHQweGUxMTFcbiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfREVWSUNFX0lEX0JDTTU5MTIxXHRcdDB4ZTEyMVxuJiM0MztcbiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9TVFNfRElTQUJMRURcdFx0MHgwMFxuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19TRUFSQ0hJTkdcdFx0MHgwMVxuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19ERUxJVkVSSU5HXHRcdDB4MDJcbiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9TVFNfVEVTVFx0XHRcdDB4MDNcdC8qIEdlbjEtb25seTsgcmVzZXJ2ZWQgb24gR2VuMiAqL1xuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19GQVVMVFx0XHQweDA0XG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX1BPUlRfU1RTX09USEVSX0ZBVUxUXHRcdDB4MDVcdC8qIEdlbjEtb25seTsgcmVzZXJ2ZWQgb24gR2VuMiAqL1xuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19SRVFVRVNUSU5HXHRcdDB4MDZcbiYjNDM7XG4mIzQzOy8qIFJUUFNFX01DVV9QT1JUX1NFVF9QT1dFUl9MSU1JVF9UWVBFIHZhbHVlcyAqL1xuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1BXX0xJTUlUX1RZUEVfVVNFUlx0MHgwMlxuJiM0MztcbiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfTUFYX1BPUlRTXHRcdFx0NDhcbiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9NQVhfUFJJT1JJVFlcdFx0M1xuJiM0MztcbiYjNDM7LyogTm9taW5hbCBQU0UgcmFpbDsgODAyLjNhdC9idCBvcGVyYXRpbmcgcmFuZ2UuICovXG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX1BTRV9WT0xUQUdFX1VWXHRcdDU0MDAwMDAwXG4mIzQzO1xuJiM0MztlbnVtIHJ0cHNlX21jdV9jbWQge1xuJiM0MztcdFJUUFNFX01DVV9DTURfU0VUX0dMT0JBTF9TVEFURSxcbiYjNDM7XHRSVFBTRV9NQ1VfQ01EX0dFVF9TWVNURU1fSU5GTyxcbiYjNDM7XHRSVFBTRV9NQ1VfQ01EX0dFVF9FWFRfQ09ORklHLFxuJiM0MztcbiYjNDM7XHRSVFBTRV9NQ1VfQ01EX1BPUlRfRU5BQkxFLFxuJiM0MztcdFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfVFlQRSxcbiYjNDM7XHRSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlULFxuJiM0MztcdFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfRVhULFxuJiM0MztcdFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUFJJT1JJVFksXG4mIzQzO1x0UlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9TVEFUVVMsXG4mIzQzO1x0UlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9QT1dFUl9TVEFUUyxcbiYjNDM7XHRSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0NPTkZJRyxcbiYjNDM7XHRSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0VYVF9DT05GSUcsXG4mIzQzO1xuJiM0MztcdFJUUFNFX01DVV9OVU1fQ01EUyxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlIHtcbiYjNDM7XHR1OCBvcDtcbiYjNDM7XHRib29sIHZhbGlkO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LyogU2hvcnRoYW5kIGZvciB0aGUgZGVzaWduYXRlZC1pbml0aWFsaXplciBlbnRyaWVzIGluIGRpYWxlY3Qgb3Bjb2RlIHRhYmxlcy4gKi9cbiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfT1Aob3BjKVx0eyAub3AgPSAob3BjKSwgLnZhbGlkID0gdHJ1ZSB9XG4mIzQzO1xuJiM0MzsvKiBQYXJzZWQgTUNVIHJlc3BvbnNlIHN0cnVjdHVyZXMgKGRlY29kZWQgZnJvbSBydHBzZV9tY3VfbXNnIHJlcGxpZXMpICovXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X2luZm8ge1xuJiM0MztcdHU4IG1heF9wb3J0cztcbiYjNDM7XHRib29sIHN5c3RlbV9lbmFibGU7XG4mIzQzO1x0dTE2IGRldmljZV9pZDtcbiYjNDM7XHR1OCBtY3VfdHlwZTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBydHBzZV9tY3VfZXh0X2NvbmZpZyB7XG4mIzQzO1x0dTggbnVtX29mX3BzZXM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfc3RhdHVzIHtcbiYjNDM7XHR1OCBzdHMxO1xuJiM0MztcdHU4IHN0czI7XG4mIzQzO1x0dTggc3RzMztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBydHBzZV9tY3VfcG9ydF9tZWFzdXJlbWVudCB7XG4mIzQzO1x0dTE2IHZvbHRhZ2VfcmF3O1x0LyogNjQuNDVtVi9MU0IgKi9cbiYjNDM7XHR1MTYgY3VycmVudF9yYXc7XHQvKiAxbUEvTFNCICovXG4mIzQzO1x0dTE2IHRlbXBlcmF0dXJlX3JhdztcdC8qIFQobUMpID0gMTI1MCAqICgyMjAgLSByYXcpICovXG4mIzQzO1x0dTE2IHBvd2VyX3JhdztcdFx0LyogMTAwbVcvTFNCICovXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfY29uZmlnIHtcbiYjNDM7XHRib29sIGVuYWJsZTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBydHBzZV9tY3VfcG9ydF9leHRfY29uZmlnIHtcbiYjNDM7XHR1OCBtYXhfcG93ZXI7XG4mIzQzO1x0dTggcHJpb3JpdHk7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X2RpYWxlY3Qge1xuJiM0MztcdHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlIG9wY29kZVtSVFBTRV9NQ1VfTlVNX0NNRFNdO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFJlc3BvbnNlIHBhcnNlcnMgZm9yIHRoZSBmaWVsZHMgdGhhdCBkaWZmZXIgYmV0d2VlbiBkaWFsZWN0czsgZWFjaFxuJiM0MztcdCAqIGRpYWxlY3Qgc3VwcGxpZXMgaXRzIG93bi4gT3RoZXIgcmVzcG9uc2VzIHNoYXJlIG9uZSBsYXlvdXQgYW5kIGFyZVxuJiM0MztcdCAqIGRlY29kZWQgZGlyZWN0bHkgLSBhIGRpYWxlY3QgdGhhdCBkaXZlcmdlcyB0aGVyZSBtdXN0IGFkZCBhIGhvb2ssXG4mIzQzO1x0ICogYXMgYSBtaXNtYXRjaGVkIGxheW91dCBjYW5ub3QgYmUgZGV0ZWN0ZWQgKHRoZSBjaGVja3N1bSBzdGlsbCBwYXNzZXMpLlxuJiM0MztcdCAqL1xuJiM0MztcdHZvaWQgKCpwYXJzZV9zeXN0ZW1faW5mbykoY29uc3QgdTggKnBheWxvYWQsIHN0cnVjdCBydHBzZV9tY3VfaW5mbyAqaW5mbyk7XG4mIzQzO1x0aW50ICgqcGFyc2VfcG9ydF9jbGFzcykoY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9wb3J0X3N0YXR1cyAqc3RhdHVzKTtcbiYjNDM7XHRjb25zdCBjaGFyICooKm1jdV90eXBlX3N0cikodW5zaWduZWQgaW50IG1jdV90eXBlKTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBydHBzZV9tY3VfY2hpcF9pbmZvIHtcbiYjNDM7XHRjb25zdCBjaGFyICpuYW1lO1xuJiM0MztcdHUzMiBtYXhfbVdfcGVyX3BvcnQ7XG4mIzQzO1x0ZW51bSBydHBzZV9tY3VfY21kIHB3X3NldF9jbWQ7XHQvKiBjb21tYW5kIHVzZWQgYnkgc2V0X3B3X2xpbWl0ICovXG4mIzQzO1x0dTMyIHB3X3NldF9sc2JfbVc7XHRcdC8qIExTQiBvZiBwd19zZXRfY21kIHZhbHVlLCBpbiBtVyAqL1xuJiM0MztcdHUzMiBwd19yZWFkX2xzYl9tVztcdFx0LyogTFNCIG9mIGV4dF9jb25maWcubWF4X3Bvd2VyIHJlYWQtYmFjaywgaW4gbVcgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbyBydGw4MjM4Yl9pbmZvID0ge1xuJiM0MztcdC5tYXhfbVdfcGVyX3BvcnQgPSAzMDAwMCxcbiYjNDM7XHQubmFtZSA9IFwmIzM0O1JUTDgyMzhCXCYjMzQ7LFxuJiM0MztcdC5wd19yZWFkX2xzYl9tVyA9IDIwMCxcbiYjNDM7XHQucHdfc2V0X2NtZCA9IFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVQsXG4mIzQzO1x0LnB3X3NldF9sc2JfbVcgPSAyMDAsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gcnRsODIzOV9pbmZvID0ge1xuJiM0MztcdC5tYXhfbVdfcGVyX3BvcnQgPSA5MDAwMCxcbiYjNDM7XHQubmFtZSA9IFwmIzM0O1JUTDgyMzlcJiMzNDssXG4mIzQzO1x0LnB3X3JlYWRfbHNiX21XID0gNDAwLFxuJiM0MztcdC5wd19zZXRfY21kID0gUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF9FWFQsXG4mIzQzO1x0LnB3X3NldF9sc2JfbVcgPSA0MDAsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gcnRsODIzOWNfaW5mbyA9IHtcbiYjNDM7XHQubWF4X21XX3Blcl9wb3J0ID0gOTAwMDAsXG4mIzQzO1x0Lm5hbWUgPSBcJiMzNDtSVEw4MjM5Q1wmIzM0OyxcbiYjNDM7XHQucHdfcmVhZF9sc2JfbVcgPSA0MDAsXG4mIzQzO1x0LnB3X3NldF9jbWQgPSBSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUX0VYVCxcbiYjNDM7XHQucHdfc2V0X2xzYl9tVyA9IDQwMCxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbyBiY201OTExMV9pbmZvID0ge1xuJiM0MztcdC5tYXhfbVdfcGVyX3BvcnQgPSAzMDAwMCxcbiYjNDM7XHQubmFtZSA9IFwmIzM0O0JDTTU5MTExXCYjMzQ7LFxuJiM0MztcdC5wd19yZWFkX2xzYl9tVyA9IDIwMCxcbiYjNDM7XHQucHdfc2V0X2NtZCA9IFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVQsXG4mIzQzO1x0LnB3X3NldF9sc2JfbVcgPSAyMDAsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gYmNtNTkxMjFfaW5mbyA9IHtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEJDTTU5MTIxIGlzIGEgNjBXIFR5cGUtMyBwYXJ0LCBidXQga25vd24gYm9hcmRzIHJ1biBpdCBhdCA4MDIuM2F0XG4mIzQzO1x0ICogYW5kIHRoZSBHZW4xIGRpYWxlY3QgaGFzIG9ubHkgdGhlIDgtYml0LzAuMlcgc2V0IGNvbW1hbmQgKFx1MDAzYz01MVcpO1xuJiM0MztcdCAqIGNhcCBhdCB0aGUgMzBXIHRoZSBoYXJkd2FyZSBhY3R1YWxseSBvZmZlcnMuXG4mIzQzO1x0ICovXG4mIzQzO1x0Lm1heF9tV19wZXJfcG9ydCA9IDMwMDAwLFxuJiM0MztcdC5uYW1lID0gXCYjMzQ7QkNNNTkxMjFcJiMzNDssXG4mIzQzO1x0LnB3X3JlYWRfbHNiX21XID0gMjAwLFxuJiM0MztcdC5wd19zZXRfY21kID0gUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVCxcbiYjNDM7XHQucHdfc2V0X2xzYl9tVyA9IDIwMCxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIEhlbHBlcnMgYW5kIGJhc2ljIGZ1bmN0aW9ucyAqL1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBydHBzZV9tY3VfY3RybCAqdG9fcnRwc2VfbWN1X2N0cmwoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gY29udGFpbmVyX29mKHBjZGV2LCBzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwsIHBjZGV2KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcnRwc2VfbWN1X21zZ19pbml0KHN0cnVjdCBydHBzZV9tY3VfbXNnICptc2csIHU4IG9wY29kZSlcbiYjNDM7e1xuJiM0MztcdG1lbXNldChtc2csIDB4ZmYsIHNpemVvZigqbXNnKSk7XG4mIzQzO1x0bXNnLVx1MDAzZW9wY29kZSA9IG9wY29kZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHU4IHJ0cHNlX21jdV9jaGVja3N1bShjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKVxuJiM0Mzt7XG4mIzQzO1x0dTggc3VtID0gMDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKGxlbi0tKVxuJiM0MztcdFx0c3VtICYjNDM7PSAqYnVmJiM0MzsmIzQzOztcbiYjNDM7XHRyZXR1cm4gc3VtO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9kb194ZmVyKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxLFxuJiM0MztcdFx0XHQgICAgIHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXNwKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0c2NvcGVkX2d1YXJkKG11dGV4LCBcdTAwMjZwc2UtXHUwMDNlbXV0ZXgpIHtcbiYjNDM7XHRcdC8qIFJvbGxpbmcgc2VxX251bSBzbyBhIGxhdGUgcmVwbHkgY2FuJiMzOTt0IHBhc3MgYXMgYSBsYXRlciBvbmUuICovXG4mIzQzO1x0XHRyZXEtXHUwMDNlc2VxX251bSA9IHBzZS1cdTAwM2VzZXEmIzQzOyYjNDM7O1xuJiM0MztcdFx0cmVxLVx1MDAzZWNoZWNrc3VtID0gcnRwc2VfbWN1X2NoZWNrc3VtKCh1OCAqKXJlcSwgUlRQU0VfTUNVX01TR19TSVpFIC0gMSk7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gcHNlLVx1MDAzZXRyYW5zcG9ydC1cdTAwM2VzZW5kKHBzZSwgcmVxKTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRoZSBNQ1UgbmVlZHMgYSBmaXhlZCBiYXNlIHRpbWUgYmV0d2VlbiBhY2NlcHRpbmcgYSByZXF1ZXN0IGFuZFxuJiM0MztcdFx0ICogaGF2aW5nIGEgcmVwbHkgcmVhZHksIGluZGVwZW5kZW50IG9mIHRyYW5zcG9ydC4gUGFjZSB0aGF0IGhlcmU7IHRoZVxuJiM0MztcdFx0ICogdHJhbnNwb3J0IHRoZW4gZmluaXNoZXMgcmVjdiBpbiBpdHMgb3duIG1vZGVsIC0gYSBib3VuZGVkIHBvbGwgb2ZcbiYjNDM7XHRcdCAqIHRoZSByZXNwb25zZSByZWdpc3RlciAoSTJDKSBvciBvbmUgd2FpdCBvbiBhIHB1c2hlZCBmcmFtZSAoVUFSVCkgLVxuJiM0MztcdFx0ICogc28gdGhlIHJldHJ5IGJlbG9uZ3MgaW4gdGhlIHRyYW5zcG9ydCwgbm90IGhlcmUuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdG1zbGVlcChSVFBTRV9NQ1VfUkVTUE9OU0VfTVMpO1xuJiM0MztcbiYjNDM7XHRcdG1lbXNldChyZXNwLCAwLCBzaXplb2YoKnJlc3ApKTtcbiYjNDM7XHRcdHJldCA9IHBzZS1cdTAwM2V0cmFuc3BvcnQtXHUwMDNlcmVjdihwc2UsIHJlcSwgcmVzcCk7XG4mIzQzO1x0XHRpZiAocmV0KVxuJiM0MztcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBFeHBsaWNpdCBNQ1UgZXJyb3Igb3Bjb2RlcyAob2JzZXJ2ZWQgb24gdGhlIEdlbjEgZGlhbGVjdDsgaGFybWxlc3NcbiYjNDM7XHQgKiB0byBjaGVjayBmb3IgR2VuMiB0b28pLiBDYXRjaCB0aGVzZSBiZWZvcmUgdGhlIGdlbmVyaWMgb3Bjb2RlL0NSQ1xuJiM0MztcdCAqIG1pc21hdGNoIHBhdGggc28gY2FsbGVycyBzZWUgYSBtZWFuaW5nZnVsIGVycm5vLlxuJiM0MztcdCAqL1xuJiM0MztcdHN3aXRjaCAocmVzcC1cdTAwM2VvcGNvZGUpIHtcbiYjNDM7XHRjYXNlIFJUUFNFX01DVV9PUENPREVfSU5DT01QTEVURTpcbiYjNDM7XHRcdHJldHVybiAtRUJBREU7XG4mIzQzO1x0Y2FzZSBSVFBTRV9NQ1VfT1BDT0RFX0JBRF9DU1VNOlxuJiM0MztcdFx0cmV0dXJuIC1FQkFETVNHO1xuJiM0MztcdGNhc2UgUlRQU0VfTUNVX09QQ09ERV9OT1RfUkVBRFk6XG4mIzQzO1x0XHRyZXR1cm4gLUVBR0FJTjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChyZXNwLVx1MDAzZW9wY29kZSAhPSByZXEtXHUwMDNlb3Bjb2RlIHx8XG4mIzQzO1x0ICAgIHJlc3AtXHUwMDNlc2VxX251bSAhPSByZXEtXHUwMDNlc2VxX251bSB8fFxuJiM0MztcdCAgICByZXNwLVx1MDAzZWNoZWNrc3VtICE9IHJ0cHNlX21jdV9jaGVja3N1bSgodTggKilyZXNwLCBSVFBTRV9NQ1VfTVNHX1NJWkUgLSAxKSlcbiYjNDM7XHRcdHJldHVybiAtRUJBRE1TRztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfcXVlcnkoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHVuc2lnbmVkIGludCBwb3J0LCB1OCBvcGNvZGUsXG4mIzQzO1x0XHRcdFx0c3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlc3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXE7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cnRwc2VfbWN1X21zZ19pbml0KFx1MDAyNnJlcSwgb3Bjb2RlKTtcbiYjNDM7XHRyZXEucGF5bG9hZFswXSA9IHBvcnQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJ0cHNlX21jdV9kb194ZmVyKHBzZSwgXHUwMDI2cmVxLCByZXNwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlc3AtXHUwMDNlcGF5bG9hZFswXSAhPSBwb3J0KVxuJiM0MztcdFx0cmV0dXJuIC1FSU87XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2NtZChzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgdW5zaWduZWQgaW50IHBvcnQsIHU4IG9wY29kZSwgdTggYXJnKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJ0cHNlX21jdV9tc2cgcmVxLCByZXNwO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJ0cHNlX21jdV9tc2dfaW5pdChcdTAwMjZyZXEsIG9wY29kZSk7XG4mIzQzO1x0cmVxLnBheWxvYWRbMF0gPSBwb3J0O1xuJiM0MztcdHJlcS5wYXlsb2FkWzFdID0gYXJnO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBydHBzZV9tY3VfZG9feGZlcihwc2UsIFx1MDAyNnJlcSwgXHUwMDI2cmVzcCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGlmIChyZXNwLnBheWxvYWRbMF0gIT0gcG9ydCB8fCByZXNwLnBheWxvYWRbMV0gIT0gMClcbiYjNDM7XHRcdHJldHVybiAtRUlPO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogR2xvYmFsIG9wZXJhdGlvbnMgKi9cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X2dldF9pbmZvKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBzdHJ1Y3QgcnRwc2VfbWN1X2luZm8gKmluZm8pXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXEsIHJlc3A7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRvcGMgPSBcdTAwMjZwc2UtXHUwMDNlZGlhbGVjdC1cdTAwM2VvcGNvZGVbUlRQU0VfTUNVX0NNRF9HRVRfU1lTVEVNX0lORk9dO1xuJiM0MztcdGlmICghb3BjLVx1MDAzZXZhbGlkKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRydHBzZV9tY3VfbXNnX2luaXQoXHUwMDI2cmVxLCBvcGMtXHUwMDNlb3ApO1xuJiM0MztcdHJldCA9IHJ0cHNlX21jdV9kb194ZmVyKHBzZSwgXHUwMDI2cmVxLCBcdTAwMjZyZXNwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlcGFyc2Vfc3lzdGVtX2luZm8ocmVzcC5wYXlsb2FkLCBpbmZvKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfZ2V0X2V4dF9jb25maWcoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHN0cnVjdCBydHBzZV9tY3VfZXh0X2NvbmZpZyAqY29uZmlnKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJ0cHNlX21jdV9tc2cgcmVxLCByZXNwO1xuJiM0MztcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0b3BjID0gXHUwMDI2cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfR0VUX0VYVF9DT05GSUddO1xuJiM0MztcdGlmICghb3BjLVx1MDAzZXZhbGlkKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRydHBzZV9tY3VfbXNnX2luaXQoXHUwMDI2cmVxLCBvcGMtXHUwMDNlb3ApO1xuJiM0MztcdHJldCA9IHJ0cHNlX21jdV9kb194ZmVyKHBzZSwgXHUwMDI2cmVxLCBcdTAwMjZyZXNwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0Y29uZmlnLVx1MDAzZW51bV9vZl9wc2VzID0gcmVzcC5wYXlsb2FkWzZdO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBydHBzZV9tY3Vfc2V0X2dsb2JhbF9zdGF0ZShzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgYm9vbCBlbmFibGUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXEsIHJlc3A7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRvcGMgPSBcdTAwMjZwc2UtXHUwMDNlZGlhbGVjdC1cdTAwM2VvcGNvZGVbUlRQU0VfTUNVX0NNRF9TRVRfR0xPQkFMX1NUQVRFXTtcbiYjNDM7XHRpZiAoIW9wYy1cdTAwM2V2YWxpZClcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0cnRwc2VfbWN1X21zZ19pbml0KFx1MDAyNnJlcSwgb3BjLVx1MDAzZW9wKTtcbiYjNDM7XHRyZXEucGF5bG9hZFswXSA9IGVuYWJsZSA/IDB4MSA6IDB4MDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcnRwc2VfbWN1X2RvX3hmZXIocHNlLCBcdTAwMjZyZXEsIFx1MDAyNnJlc3ApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gKHJlc3AucGF5bG9hZFswXSA9PSAweDApID8gMCA6IC1FSU87XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFBvcnQgb3BlcmF0aW9ucyAqL1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfc3RhdHVzKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCxcbiYjNDM7XHRcdFx0XHQgICAgIHN0cnVjdCBydHBzZV9tY3VfcG9ydF9zdGF0dXMgKnN0YXR1cylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XG4mIzQzO1x0c3RydWN0IHJ0cHNlX21jdV9tc2cgcmVzcDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRvcGMgPSBcdTAwMjZwc2UtXHUwMDNlZGlhbGVjdC1cdTAwM2VvcGNvZGVbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9TVEFUVVNdO1xuJiM0MztcdGlmICghb3BjLVx1MDAzZXZhbGlkKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBydHBzZV9tY3VfcG9ydF9xdWVyeShwc2UsIHBvcnQsIG9wYy1cdTAwM2VvcCwgXHUwMDI2cmVzcCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHN0YXR1cy1cdTAwM2VzdHMxID0gcmVzcC5wYXlsb2FkWzFdO1xuJiM0MztcdHN0YXR1cy1cdTAwM2VzdHMyID0gcmVzcC5wYXlsb2FkWzJdO1xuJiM0MztcdHN0YXR1cy1cdTAwM2VzdHMzID0gcmVzcC5wYXlsb2FkWzNdO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfbWVhc3VyZW1lbnQoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHVuc2lnbmVkIGludCBwb3J0LFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfbWVhc3VyZW1lbnQgKm1lYXN1cmVtZW50KVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXNwO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdG9wYyA9IFx1MDAyNnBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZW9wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1BPV0VSX1NUQVRTXTtcbiYjNDM7XHRpZiAoIW9wYy1cdTAwM2V2YWxpZClcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcnRwc2VfbWN1X3BvcnRfcXVlcnkocHNlLCBwb3J0LCBvcGMtXHUwMDNlb3AsIFx1MDAyNnJlc3ApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRtZWFzdXJlbWVudC1cdTAwM2V2b2x0YWdlX3JhdyA9IGdldF91bmFsaWduZWRfYmUxNihcdTAwMjZyZXNwLnBheWxvYWRbMV0pO1xuJiM0MztcdG1lYXN1cmVtZW50LVx1MDAzZWN1cnJlbnRfcmF3ID0gZ2V0X3VuYWxpZ25lZF9iZTE2KFx1MDAyNnJlc3AucGF5bG9hZFszXSk7XG4mIzQzO1x0bWVhc3VyZW1lbnQtXHUwMDNldGVtcGVyYXR1cmVfcmF3ID0gZ2V0X3VuYWxpZ25lZF9iZTE2KFx1MDAyNnJlc3AucGF5bG9hZFs1XSk7XG4mIzQzO1x0bWVhc3VyZW1lbnQtXHUwMDNlcG93ZXJfcmF3ID0gZ2V0X3VuYWxpZ25lZF9iZTE2KFx1MDAyNnJlc3AucGF5bG9hZFs3XSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9jb25maWcoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHVuc2lnbmVkIGludCBwb3J0LFxuJiM0MztcdFx0XHRcdCAgICAgc3RydWN0IHJ0cHNlX21jdV9wb3J0X2NvbmZpZyAqY29uZmlnKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXNwO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdG9wYyA9IFx1MDAyNnBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZW9wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0NPTkZJR107XG4mIzQzO1x0aWYgKCFvcGMtXHUwMDNldmFsaWQpXG4mIzQzO1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJ0cHNlX21jdV9wb3J0X3F1ZXJ5KHBzZSwgcG9ydCwgb3BjLVx1MDAzZW9wLCBcdTAwMjZyZXNwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0Y29uZmlnLVx1MDAzZWVuYWJsZSA9IChyZXNwLnBheWxvYWRbMV0gPT0gMSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9leHRfY29uZmlnKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCxcbiYjNDM7XHRcdFx0XHRcdCBzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfZXh0X2NvbmZpZyAqY29uZmlnKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXNwO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdG9wYyA9IFx1MDAyNnBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZW9wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0VYVF9DT05GSUddO1xuJiM0MztcdGlmICghb3BjLVx1MDAzZXZhbGlkKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBydHBzZV9tY3VfcG9ydF9xdWVyeShwc2UsIHBvcnQsIG9wYy1cdTAwM2VvcCwgXHUwMDI2cmVzcCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGNvbmZpZy1cdTAwM2VtYXhfcG93ZXIgPSByZXNwLnBheWxvYWRbM107XG4mIzQzO1x0Y29uZmlnLVx1MDAzZXByaW9yaXR5ID0gcmVzcC5wYXlsb2FkWzRdO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9zZXRfc3RhdGUoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHVuc2lnbmVkIGludCBwb3J0LCBib29sIGVuYWJsZSlcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XG4mIzQzO1xuJiM0MztcdG9wYyA9IFx1MDAyNnBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZW9wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfRU5BQkxFXTtcbiYjNDM7XHRpZiAoIW9wYy1cdTAwM2V2YWxpZClcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJ0cHNlX21jdV9wb3J0X2NtZChwc2UsIHBvcnQsIG9wYy1cdTAwM2VvcCwgZW5hYmxlID8gMHgxIDogMHgwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUFNFIGNvbnRyb2xsZXIgb3BzICovXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9hZG1pbl9zdGF0ZShzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkLFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgcHNlX2FkbWluX3N0YXRlICphZG1pbl9zdGF0ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpO1xuJiM0MztcdHN0cnVjdCBydHBzZV9tY3VfcG9ydF9jb25maWcgY29uZmlnO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJ0cHNlX21jdV9wb3J0X2dldF9jb25maWcocHNlLCBpZCwgXHUwMDI2Y29uZmlnKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0YWRtaW5fc3RhdGUtXHUwMDNlYzMzX2FkbWluX3N0YXRlID0gY29uZmlnLmVuYWJsZSA/IEVUSFRPT0xfQzMzX1BTRV9BRE1JTl9TVEFURV9FTkFCTEVEIDpcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgIEVUSFRPT0xfQzMzX1BTRV9BRE1JTl9TVEFURV9ESVNBQkxFRDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHdfc3RhdHVzKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQsXG4mIzQzO1x0XHRcdFx0XHRzdHJ1Y3QgcHNlX3B3X3N0YXR1cyAqcHdfc3RhdHVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7XG4mIzQzO1x0c3RydWN0IHJ0cHNlX21jdV9wb3J0X3N0YXR1cyBzdGF0dXM7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3N0YXR1cyhwc2UsIGlkLCBcdTAwMjZzdGF0dXMpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRzd2l0Y2ggKHN0YXR1cy5zdHMxKSB7XG4mIzQzO1x0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfRElTQUJMRUQ6XG4mIzQzO1x0XHRwd19zdGF0dXMtXHUwMDNlYzMzX3B3X3N0YXR1cyA9IEVUSFRPT0xfQzMzX1BTRV9QV19EX1NUQVRVU19ESVNBQkxFRDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgUlRQU0VfTUNVX1BPUlRfU1RTX1NFQVJDSElORzpcbiYjNDM7XHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19SRVFVRVNUSU5HOlxuJiM0MztcdFx0cHdfc3RhdHVzLVx1MDAzZWMzM19wd19zdGF0dXMgPSBFVEhUT09MX0MzM19QU0VfUFdfRF9TVEFUVVNfU0VBUkNISU5HO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfREVMSVZFUklORzpcbiYjNDM7XHRcdHB3X3N0YXR1cy1cdTAwM2VjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX0RFTElWRVJJTkc7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19URVNUOlxuJiM0MztcdFx0cHdfc3RhdHVzLVx1MDAzZWMzM19wd19zdGF0dXMgPSBFVEhUT09MX0MzM19QU0VfUFdfRF9TVEFUVVNfVEVTVDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgUlRQU0VfTUNVX1BPUlRfU1RTX0ZBVUxUOlxuJiM0MztcdFx0cHdfc3RhdHVzLVx1MDAzZWMzM19wd19zdGF0dXMgPSBFVEhUT09MX0MzM19QU0VfUFdfRF9TVEFUVVNfRkFVTFQ7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19PVEhFUl9GQVVMVDpcbiYjNDM7XHRcdHB3X3N0YXR1cy1cdTAwM2VjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX09USEVSRkFVTFQ7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRkZWZhdWx0OlxuJiM0MztcdFx0cHdfc3RhdHVzLVx1MDAzZWMzM19wd19zdGF0dXMgPSBFVEhUT09MX0MzM19QU0VfUFdfRF9TVEFUVVNfVU5LTk9XTjtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfZ2V0X3B3X2NsYXNzKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfc3RhdHVzIHN0YXR1cztcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBydHBzZV9tY3VfcG9ydF9nZXRfc3RhdHVzKHBzZSwgaWQsIFx1MDAyNnN0YXR1cyk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQXMgcGVyIGRhdGFzaGVldCwgdGhlIGNsYXNzaWZpY2F0aW9uIHJlc3VsdCBpcyBvbmx5IHZhbGlkIHdoZW4gaW5cbiYjNDM7XHQgKiBvbmUgb2YgdGhvc2Ugb3BlcmF0aW9uYWwgbW9kZXMsIG90aGVyd2lzZSBub3QuXG4mIzQzO1x0ICovXG4mIzQzO1x0c3dpdGNoIChzdGF0dXMuc3RzMSkge1xuJiM0MztcdGNhc2UgUlRQU0VfTUNVX1BPUlRfU1RTX0RJU0FCTEVEOlxuJiM0MztcdGNhc2UgUlRQU0VfTUNVX1BPUlRfU1RTX1NFQVJDSElORzpcbiYjNDM7XHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19ERUxJVkVSSU5HOlxuJiM0MztcdGNhc2UgUlRQU0VfTUNVX1BPUlRfU1RTX1JFUVVFU1RJTkc6XG4mIzQzO1x0XHRyZXR1cm4gcHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlcGFyc2VfcG9ydF9jbGFzcyhcdTAwMjZzdGF0dXMpO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogTm8gY2xhc3MgdG8gcmVwb3J0LCByZXR1cm4gMCBpbnN0ZWFkLiBUaGlzIGlzIGluZGlzdGluZ3Vpc2hhYmxlXG4mIzQzO1x0XHQgKiBmcm9tIGEgcmVhbCBjbGFzcy0wIFBEIGJ1dCB1c2Vyc3BhY2UgZGlzYW1iaWd1YXRlcyB2aWEgdGhlXG4mIzQzO1x0XHQgKiBwb3dlciBzdGF0dXMuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfYWN0dWFsX3B3KHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfbWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQ7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X21lYXN1cmVtZW50KHBzZSwgaWQsIFx1MDAyNm1lYXN1cmVtZW50KTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0LyogMTAwbVcgcGVyIExTQiAqL1xuJiM0MztcdHJldHVybiBtZWFzdXJlbWVudC5wb3dlcl9yYXcgKiAxMDBVO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF92b2x0YWdlKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfbWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQ7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHR1MzIgdVY7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJ0cHNlX21jdV9wb3J0X2dldF9tZWFzdXJlbWVudChwc2UsIGlkLCBcdTAwMjZtZWFzdXJlbWVudCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIDY0LjQ1bVYgcGVyIExTQiAqL1xuJiM0MztcdHVWID0gbWVhc3VyZW1lbnQudm9sdGFnZV9yYXcgKiA2NDQ1MFU7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogSWRsZSBwb3J0cyBtZWFzdXJlIDBWLCB3aGljaCB0aGUgY29yZSByZWplY3RzIHdoZW4gdHVybmluZyBhIHBvd2VyXG4mIzQzO1x0ICogbGltaXQgaW50byBhIGN1cnJlbnQgbGltaXQuIEZhbGwgYmFjayB0byB0aGUgbm9taW5hbCByYWlsIHNvIGEgbGltaXRcbiYjNDM7XHQgKiBjYW4gYmUgc2V0IGJlZm9yZSBhIFBEIGlzIGF0dGFjaGVkLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghdVYpXG4mIzQzO1x0XHRyZXR1cm4gUlRQU0VfTUNVX1BTRV9WT0xUQUdFX1VWO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gbWluX3QodTMyLCB1ViwgSU5UX01BWCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfZW5hYmxlKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcnRwc2VfbWN1X3BvcnRfc2V0X3N0YXRlKHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KSwgaWQsIHRydWUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2Rpc2FibGUoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBydHBzZV9tY3VfcG9ydF9zZXRfc3RhdGUodG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpLCBpZCwgZmFsc2UpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9wd19saW1pdChzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7XG4mIzQzO1x0c3RydWN0IHJ0cHNlX21jdV9wb3J0X2V4dF9jb25maWcgY29uZmlnO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJ0cHNlX21jdV9wb3J0X2dldF9leHRfY29uZmlnKHBzZSwgaWQsIFx1MDAyNmNvbmZpZyk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBjb25maWcubWF4X3Bvd2VyICogcHNlLVx1MDAzZWNoaXAtXHUwMDNlcHdfcmVhZF9sc2JfbVc7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfc2V0X3B3X2xpbWl0KHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQsIGludCBtYXhfbVcpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSAqdHlwZV9vcGMsICp2YWxfb3BjO1xuJiM0MztcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpO1xuJiM0MztcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfY2hpcF9pbmZvICpjaGlwID0gcHNlLVx1MDAzZWNoaXA7XG4mIzQzO1x0dTggcHJnX3ZhbDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAobWF4X21XIFx1MDAzYyAwIHx8IG1heF9tVyBcdTAwM2UgY2hpcC1cdTAwM2VtYXhfbVdfcGVyX3BvcnQpXG4mIzQzO1x0XHRyZXR1cm4gLUVSQU5HRTtcbiYjNDM7XG4mIzQzO1x0dHlwZV9vcGMgPSBcdTAwMjZwc2UtXHUwMDNlZGlhbGVjdC1cdTAwM2VvcGNvZGVbUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF9UWVBFXTtcbiYjNDM7XHR2YWxfb3BjID0gXHUwMDI2cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlb3Bjb2RlW2NoaXAtXHUwMDNlcHdfc2V0X2NtZF07XG4mIzQzO1x0LyogcHdfc2V0X2xzYl9tVyBpcyB0aGUgZGl2aXNvciBiZWxvdzsgcmVqZWN0IGEgY2hpcCB0aGF0IGxhY2tzIGl0LiAqL1xuJiM0MztcdGlmICghdHlwZV9vcGMtXHUwMDNldmFsaWQgfHwgIXZhbF9vcGMtXHUwMDNldmFsaWQgfHwgIWNoaXAtXHUwMDNlcHdfc2V0X2xzYl9tVylcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTd2l0Y2ggdGhlIHBvcnQgdG8gdXNlci1kZWZpbmVkIGxpbWl0IG1vZGUgZmlyc3QsIHRoZW4gcHJvZ3JhbSB0aGVcbiYjNDM7XHQgKiBsaW1pdCB2YWx1ZS4gSWYgdGhlIHNlY29uZCBjbWQgZmFpbHMsIHRoZSBwb3J0IGlzIGxlZnQgaW5cbiYjNDM7XHQgKiB1c2VyLWRlZmluZWQgbW9kZSBidXQgd2l0aCB0aGUgcHJldmlvdXMgbGltaXQgdmFsdWU7IHRoZSBuZXh0XG4mIzQzO1x0ICogc3VjY2Vzc2Z1bCBzZXRfcHdfbGltaXQgY2FsbCByZWNvdmVycyBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRyZXQgPSBydHBzZV9tY3VfcG9ydF9jbWQocHNlLCBpZCwgdHlwZV9vcGMtXHUwMDNlb3AsIFJUUFNFX01DVV9QT1JUX1BXX0xJTUlUX1RZUEVfVVNFUik7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUm91bmQgdXAgc28gYSBzdWItTFNCIHJlcXVlc3QgbWFwcyB0byBvbmUgTFNCLCBub3Qgc2lsZW50bHkgdG8gMDtcbiYjNDM7XHQgKiBhbiBleHBsaWNpdCAwIHN0aWxsIHlpZWxkcyAwLCBhbmQgTFNCLWFsaWduZWQgbWF4aW1hIGNhbiYjMzk7dCBvdmVyc2hvb3QuXG4mIzQzO1x0ICovXG4mIzQzO1x0cHJnX3ZhbCA9IG1pbl90KHVuc2lnbmVkIGludCwgRElWX1JPVU5EX1VQKG1heF9tVywgY2hpcC1cdTAwM2Vwd19zZXRfbHNiX21XKSwgVThfTUFYKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJ0cHNlX21jdV9wb3J0X2NtZChwc2UsIGlkLCB2YWxfb3BjLVx1MDAzZW9wLCBwcmdfdmFsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHdfbGltaXRfcmFuZ2VzKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBzdHJ1Y3QgcHNlX3B3X2xpbWl0X3JhbmdlcyAqb3V0KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7XG4mIzQzO1x0c3RydWN0IGV0aHRvb2xfYzMzX3BzZV9wd19saW1pdF9yYW5nZSAqcmFuZ2U7XG4mIzQzO1xuJiM0MztcdHJhbmdlID0ga3phbGxvY19vYmooKnJhbmdlKTtcbiYjNDM7XHRpZiAoIXJhbmdlKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHJhbmdlWzBdLm1pbiA9IDA7XG4mIzQzO1x0cmFuZ2VbMF0ubWF4ID0gcHNlLVx1MDAzZWNoaXAtXHUwMDNlbWF4X21XX3Blcl9wb3J0O1xuJiM0MztcbiYjNDM7XHRvdXQtXHUwMDNlYzMzX3B3X2xpbWl0X3JhbmdlcyA9IHJhbmdlO1xuJiM0MztcdHJldHVybiAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9wcmlvKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfZXh0X2NvbmZpZyBjb25maWc7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X2V4dF9jb25maWcocHNlLCBpZCwgXHUwMDI2Y29uZmlnKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGNvbmZpZy5wcmlvcml0eTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9zZXRfcHJpbyhzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkLCB1bnNpZ25lZCBpbnQgcHJpbylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpO1xuJiM0MztcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XG4mIzQzO1xuJiM0MztcdGlmIChwcmlvIFx1MDAzZSBSVFBTRV9NQ1VfUE9SVF9NQVhfUFJJT1JJVFkpXG4mIzQzO1x0XHRyZXR1cm4gLUVSQU5HRTtcbiYjNDM7XG4mIzQzO1x0b3BjID0gXHUwMDI2cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUFJJT1JJVFldO1xuJiM0MztcdGlmICghb3BjLVx1MDAzZXZhbGlkKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcnRwc2VfbWN1X3BvcnRfY21kKHBzZSwgaWQsIG9wYy1cdTAwM2VvcCwgcHJpbyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfb3BzIHJ0cHNlX21jdV9vcHMgPSB7XG4mIzQzO1x0LnBpX2dldF9hZG1pbl9zdGF0ZSA9IHJ0cHNlX21jdV9wb3J0X2dldF9hZG1pbl9zdGF0ZSxcbiYjNDM7XHQucGlfZ2V0X3B3X3N0YXR1cyA9IHJ0cHNlX21jdV9wb3J0X2dldF9wd19zdGF0dXMsXG4mIzQzO1x0LnBpX2dldF9wd19jbGFzcyA9IHJ0cHNlX21jdV9wb3J0X2dldF9wd19jbGFzcyxcbiYjNDM7XHQucGlfZ2V0X2FjdHVhbF9wdyA9IHJ0cHNlX21jdV9wb3J0X2dldF9hY3R1YWxfcHcsXG4mIzQzO1x0LnBpX2VuYWJsZSA9IHJ0cHNlX21jdV9wb3J0X2VuYWJsZSxcbiYjNDM7XHQucGlfZGlzYWJsZSA9IHJ0cHNlX21jdV9wb3J0X2Rpc2FibGUsXG4mIzQzO1x0LnBpX2dldF92b2x0YWdlID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3ZvbHRhZ2UsXG4mIzQzO1x0LnBpX2dldF9wd19saW1pdCA9IHJ0cHNlX21jdV9wb3J0X2dldF9wd19saW1pdCxcbiYjNDM7XHQucGlfc2V0X3B3X2xpbWl0ID0gcnRwc2VfbWN1X3BvcnRfc2V0X3B3X2xpbWl0LFxuJiM0MztcdC5waV9nZXRfcHdfbGltaXRfcmFuZ2VzID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3B3X2xpbWl0X3JhbmdlcyxcbiYjNDM7XHQucGlfZ2V0X3ByaW8gPSBydHBzZV9tY3VfcG9ydF9nZXRfcHJpbyxcbiYjNDM7XHQucGlfc2V0X3ByaW8gPSBydHBzZV9tY3VfcG9ydF9zZXRfcHJpbyxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X2Rpc2NvdmVyKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBzdHJ1Y3QgcnRwc2VfbWN1X2luZm8gKmluZm8pXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X2V4dF9jb25maWcgZXh0X2NvbmZpZztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGRlYWRsaW5lO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQSBib290aW5nIE1DVSBtYXkgc3RheSBzaWxlbnQgKC1FVElNRURPVVQpLCBub3QgQUNLIGl0cyBhZGRyZXNzXG4mIzQzO1x0ICogKC1FTlhJTyAvIC1FUkVNT1RFSU8pLCByZXBvcnQgbm90LXJlYWR5ICgtRUFHQUlOKSwgb3IgZW1pdCBhXG4mIzQzO1x0ICogY29ycnVwdC9wYXJ0aWFsIGZyYW1lICgtRUJBRE1TRyAvIC1FQkFERSkuIFJldHJ5IHRob3NlIHdpdGhpbiBhXG4mIzQzO1x0ICogYm91bmRlZCB3aW5kb3c7IG90aGVyIGVycm9ycyAoZS5nLiAtRU9QTk9UU1VQUCkgYXJlIGZhdGFsIGFuZCBmYWlsXG4mIzQzO1x0ICogaW1tZWRpYXRlbHkuXG4mIzQzO1x0ICovXG4mIzQzO1x0ZGVhZGxpbmUgPSBqaWZmaWVzICYjNDM7IG1zZWNzX3RvX2ppZmZpZXMoUlRQU0VfTUNVX0JPT1RfVElNRU9VVF9NUyk7XG4mIzQzO1x0ZG8ge1xuJiM0MztcdFx0cmV0ID0gcnRwc2VfbWN1X2dldF9pbmZvKHBzZSwgaW5mbyk7XG4mIzQzO1x0XHRpZiAocmV0ICE9IC1FVElNRURPVVQgXHUwMDI2XHUwMDI2IHJldCAhPSAtRU5YSU8gXHUwMDI2XHUwMDI2IHJldCAhPSAtRVJFTU9URUlPIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIHJldCAhPSAtRUFHQUlOIFx1MDAyNlx1MDAyNiByZXQgIT0gLUVCQURNU0cgXHUwMDI2XHUwMDI2IHJldCAhPSAtRUJBREUpXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0bXNsZWVwKFJUUFNFX01DVV9CT09UX1JFVFJZX01TKTtcbiYjNDM7XHR9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBkZWFkbGluZSkpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXHUwMDNlZGV2LCByZXQsIFwmIzM0O2ZhaWxlZCB0byByZWFkIE1DVSBpbmZvXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChpbmZvLVx1MDAzZWRldmljZV9pZCkge1xuJiM0MztcdGNhc2UgUlRQU0VfTUNVX0RFVklDRV9JRF9SVEw4MjM4QjpcbiYjNDM7XHRcdHBzZS1cdTAwM2VjaGlwID0gXHUwMDI2cnRsODIzOGJfaW5mbztcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgUlRQU0VfTUNVX0RFVklDRV9JRF9SVEw4MjM5OlxuJiM0MztcdFx0cHNlLVx1MDAzZWNoaXAgPSBcdTAwMjZydGw4MjM5X2luZm87XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOUM6XG4mIzQzO1x0XHRwc2UtXHUwMDNlY2hpcCA9IFx1MDAyNnJ0bDgyMzljX2luZm87XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFJUUFNFX01DVV9ERVZJQ0VfSURfQkNNNTkxMTE6XG4mIzQzO1x0XHRwc2UtXHUwMDNlY2hpcCA9IFx1MDAyNmJjbTU5MTExX2luZm87XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFJUUFNFX01DVV9ERVZJQ0VfSURfQkNNNTkxMjE6XG4mIzQzO1x0XHRwc2UtXHUwMDNlY2hpcCA9IFx1MDAyNmJjbTU5MTIxX2luZm87XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRkZWZhdWx0OlxuJiM0MztcdFx0cmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLVx1MDAzZWRldiwgLUVJTlZBTCwgXCYjMzQ7dW5rbm93biBQU0UgaWQgMHgleFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgIGluZm8tXHUwMDNlZGV2aWNlX2lkKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghaW5mby1cdTAwM2VtYXhfcG9ydHMgfHwgaW5mby1cdTAwM2VtYXhfcG9ydHMgXHUwMDNlIFJUUFNFX01DVV9NQVhfUE9SVFMpXG4mIzQzO1x0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXHUwMDNlZGV2LCAtRUlOVkFMLFxuJiM0MztcdFx0XHRcdCAgICAgXCYjMzQ7TUNVIHJlcG9ydHMgaW52YWxpZCBwb3J0IGNvdW50ICV1XFxuXCYjMzQ7LCBpbmZvLVx1MDAzZW1heF9wb3J0cyk7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJ0cHNlX21jdV9nZXRfZXh0X2NvbmZpZyhwc2UsIFx1MDAyNmV4dF9jb25maWcpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXHUwMDNlZGV2LCByZXQsIFwmIzM0O2ZhaWxlZCB0byByZWFkIE1DVSBleHQgY29uZmlnXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZGV2X2luZm8ocHNlLVx1MDAzZWRldiwgXCYjMzQ7JXMgTUNVLCAlcyAoaWQgMHglMDR4KSwgJXUgcG9ydHMgYWNyb3NzICV1IFBTRSBjaGlwKHMpXFxuXCYjMzQ7LFxuJiM0MztcdFx0IHBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZW1jdV90eXBlX3N0cihpbmZvLVx1MDAzZW1jdV90eXBlKSwgcHNlLVx1MDAzZWNoaXAtXHUwMDNlbmFtZSxcbiYjNDM7XHRcdCBpbmZvLVx1MDAzZWRldmljZV9pZCwgaW5mby1cdTAwM2VtYXhfcG9ydHMsIGV4dF9jb25maWcubnVtX29mX3BzZXMpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBydHBzZV9tY3VfZ2xvYmFsX2Rpc2FibGUodm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gZGF0YTtcbiYjNDM7XG4mIzQzO1x0cnRwc2VfbWN1X3NldF9nbG9iYWxfc3RhdGUocHNlLCBmYWxzZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBydHBzZV9tY3VfcmVnaXN0ZXIoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21hdGNoX2RhdGEgKm1hdGNoO1xuJiM0MztcdHN0cnVjdCBydHBzZV9tY3VfaW5mbyBpbmZvO1xuJiM0MztcdHN0cnVjdCBncGlvX2Rlc2MgKmdwaW9kO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHJ0cHNlX21jdV9tc2cpICE9IFJUUFNFX01DVV9NU0dfU0laRSk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGRldm1fbXV0ZXhfaW5pdChwc2UtXHUwMDNlZGV2LCBcdTAwMjZwc2UtXHUwMDNlbXV0ZXgpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRtYXRjaCA9IGRldmljZV9nZXRfbWF0Y2hfZGF0YShwc2UtXHUwMDNlZGV2KTtcbiYjNDM7XHRpZiAoIW1hdGNoKVxuJiM0MztcdFx0cmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLVx1MDAzZWRldiwgLUVOT0RFViwgXCYjMzQ7bWlzc2luZyBtYXRjaCBkYXRhXFxuXCYjMzQ7KTtcbiYjNDM7XHRwc2UtXHUwMDNlZGlhbGVjdCA9IG1hdGNoLVx1MDAzZWRpYWxlY3Q7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQ2F0Y2ggYSBkaWFsZWN0IHRoYXQgZm9yZ290IHRvIHNldCBvbmUgb2YgdGhlIHJlcXVpcmVkIGhvb2tzIGF0XG4mIzQzO1x0ICogcHJvYmUgdGltZSwgcmF0aGVyIHRoYW4gTlVMTC1kZXJlZiYjMzk7aW5nIGxhdGVyIGZyb20gYSBmYXN0IHBhdGguXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFwc2UtXHUwMDNlZGlhbGVjdCB8fFxuJiM0MztcdCAgICAhcHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlcGFyc2Vfc3lzdGVtX2luZm8gfHxcbiYjNDM7XHQgICAgIXBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZXBhcnNlX3BvcnRfY2xhc3MgfHxcbiYjNDM7XHQgICAgIXBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZW1jdV90eXBlX3N0cilcbiYjNDM7XHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKHBzZS1cdTAwM2VkZXYsIC1FSU5WQUwsXG4mIzQzO1x0XHRcdFx0ICAgICBcJiMzNDtkaWFsZWN0IGZvciBjaGlwIGlzIGluY29tcGxldGVcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFJlbGVhc2UgdGhlIE1DVSBmcm9tIHJlc2V0IGJlZm9yZSB0aGUgZmlyc3QgdHJhbnNhY3Rpb247IHRoZVxuJiM0MztcdCAqIGJvb3QtcmV0cnkgbG9vcCBpbiBkaXNjb3ZlcigpIHdhaXRzIGZvciBpdCB0byBhbnN3ZXIuXG4mIzQzO1x0ICovXG4mIzQzO1x0Z3Bpb2QgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChwc2UtXHUwMDNlZGV2LCBcJiMzNDtyZXNldFwmIzM0OywgR1BJT0RfT1VUX0xPVyk7XG4mIzQzO1x0aWYgKElTX0VSUihncGlvZCkpXG4mIzQzO1x0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXHUwMDNlZGV2LCBQVFJfRVJSKGdwaW9kKSxcbiYjNDM7XHRcdFx0XHQgICAgIFwmIzM0O2ZhaWxlZCB0byBnZXQgcmVzZXQgZ3Bpb1xcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJ0cHNlX21jdV9kaXNjb3Zlcihwc2UsIFx1MDAyNmluZm8pO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFNvbWUgYm9hcmRzIGdhdGUgYWxsIHBvcnRzIHRocm91Z2ggYSBoYXJkd2FyZSBsaW5lOyBkZWFzc2VydCBpdCBvbmx5XG4mIzQzO1x0ICogb25jZSB0aGUgTUNVIGlzIGNvbmZpcm1lZCBwcmVzZW50LCBzbyBhIGZhaWxlZCBwcm9iZSBsZWF2ZXMgdGhlIHBvcnRzXG4mIzQzO1x0ICogZ2F0ZWQuIEZyb20gaGVyZSB0aGUgTUNVIHByb3RvY29sIGdvdmVybnMgcGVyLXBvcnQgYWRtaW4gc3RhdGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0Z3Bpb2QgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChwc2UtXHUwMDNlZGV2LCBcJiMzNDtkaXNhYmxlLXBvcnRzXCYjMzQ7LCBHUElPRF9PVVRfTE9XKTtcbiYjNDM7XHRpZiAoSVNfRVJSKGdwaW9kKSlcbiYjNDM7XHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKHBzZS1cdTAwM2VkZXYsIFBUUl9FUlIoZ3Bpb2QpLFxuJiM0MztcdFx0XHRcdCAgICAgXCYjMzQ7ZmFpbGVkIHRvIGdldCBkaXNhYmxlLXBvcnRzIGdwaW9cXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRpZiAoIWluZm8uc3lzdGVtX2VuYWJsZSkge1xuJiM0MztcdFx0cmV0ID0gcnRwc2VfbWN1X3NldF9nbG9iYWxfc3RhdGUocHNlLCB0cnVlKTtcbiYjNDM7XHRcdC8qIERpYWxlY3RzIHdpdGhvdXQgYSBnbG9iYWwtc3RhdGUgY29uY2VwdCAoZS5nLiBHZW4xKSByZXR1cm5cbiYjNDM7XHRcdCAqIC1FT1BOT1RTVVBQOyB0cmVhdCB0aGF0IGFzIFwmIzM0O25vIHNlcGFyYXRlIGVuYWJsZSByZXF1aXJlZFwmIzM0Oy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKHJldCBcdTAwMjZcdTAwMjYgcmV0ICE9IC1FT1BOT1RTVVBQKVxuJiM0MztcdFx0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXHUwMDNlZGV2LCByZXQsXG4mIzQzO1x0XHRcdFx0XHQgICAgIFwmIzM0O2ZhaWxlZCB0byBlbmFibGUgUFNFIHN5c3RlbVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIXJldCkge1xuJiM0MztcdFx0XHRyZXQgPSBkZXZtX2FkZF9hY3Rpb25fb3JfcmVzZXQocHNlLVx1MDAzZWRldixcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgIHJ0cHNlX21jdV9nbG9iYWxfZGlzYWJsZSwgcHNlKTtcbiYjNDM7XHRcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEZXBlbmRpbmcgb24gdGhlIE1DVSBmaXJtd2FyZSBjb25maWd1cmF0aW9uICh3aGljaCBtaWdodCBiZSBkaWZmZXJlbnRcbiYjNDM7XHQgKiBmb3IgZXZlcnkgYm9hcmQpLCBpdCBpc24mIzM5O3Qga25vd24gd2hldGhlciB0aGUgUG9FIHN1YnN5c3RlbSBpcyBhY3RpdmUgb3JcbiYjNDM7XHQgKiBpbmFjdGl2ZSBieSBkZWZhdWx0LiBBdCB0aGlzIHN0YWdlLCB0aGUgUFNFIGNoaXBzIG1pZ2h0IGFscmVhZHkgZGVsaXZlclxuJiM0MztcdCAqIHBvd2VyIHRvIFBEcyB3aXRob3V0IGFueSBleHBsaWNpdCBlbmFibGUuXG4mIzQzO1x0ICovXG4mIzQzO1xuJiM0MztcdC8qIHBjZGV2Lm93bmVyIGlzIHNldCBieSB0aGUgdHJhbnNwb3J0LCBzbyB0aGUgcmVnaXN0ZXJlZCBjb250cm9sbGVyXG4mIzQzO1x0ICogcGlucyB0aGUgdHJhbnNwb3J0IG1vZHVsZSB0aGF0IG93bnMgdGhlIGxpdmUgZGV2aWNlLCBub3QgdGhlIGNvcmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0cHNlLVx1MDAzZXBjZGV2Lm9wcyAgICAgID0gXHUwMDI2cnRwc2VfbWN1X29wcztcbiYjNDM7XHRwc2UtXHUwMDNlcGNkZXYuZGV2ICAgICAgPSBwc2UtXHUwMDNlZGV2O1xuJiM0MztcdHBzZS1cdTAwM2VwY2Rldi50eXBlcyAgICA9IEVUSFRPT0xfUFNFX0MzMztcbiYjNDM7XHRwc2UtXHUwMDNlcGNkZXYubnJfbGluZXMgPSBpbmZvLm1heF9wb3J0cztcbiYjNDM7XHRwc2UtXHUwMDNlcGNkZXYucGlzX3ByaW9fbWF4ID0gUlRQU0VfTUNVX1BPUlRfTUFYX1BSSU9SSVRZO1xuJiM0MztcdHBzZS1cdTAwM2VwY2Rldi5zdXBwX2J1ZGdldF9ldmFsX3N0cmF0ZWdpZXMgPSBQU0VfQlVER0VUX0VWQUxfU1RSQVRfRFlOQU1JQztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRldm1fcHNlX2NvbnRyb2xsZXJfcmVnaXN0ZXIocHNlLVx1MDAzZWRldiwgXHUwMDI2cHNlLVx1MDAzZXBjZGV2KTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChydHBzZV9tY3VfcmVnaXN0ZXIpO1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcnRwc2VfbWN1X2dlbjJfcGFyc2Vfc3lzdGVtX2luZm8oY29uc3QgdTggKnBheWxvYWQsIHN0cnVjdCBydHBzZV9tY3VfaW5mbyAqaW5mbylcbiYjNDM7e1xuJiM0MztcdGluZm8tXHUwMDNlbWF4X3BvcnRzID0gcGF5bG9hZFsxXTtcbiYjNDM7XHRpbmZvLVx1MDAzZXN5c3RlbV9lbmFibGUgPSAocGF5bG9hZFsyXSA9PSAweDEpO1xuJiM0MztcdGluZm8tXHUwMDNlZGV2aWNlX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTE2KFx1MDAyNnBheWxvYWRbM10pO1xuJiM0MztcdGluZm8tXHUwMDNlbWN1X3R5cGUgPSBwYXlsb2FkWzZdO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9nZW4yX3BhcnNlX3BvcnRfY2xhc3MoY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9wb3J0X3N0YXR1cyAqc3RhdHVzKVxuJiM0Mzt7XG4mIzQzO1x0LyogQ2xhc3MgbGl2ZXMgaW4gdGhlIHVwcGVyIG5pYmJsZSBvZiBzdHMyLiAqL1xuJiM0MztcdHJldHVybiBGSUVMRF9HRVQoR0VOTUFTSyg3LCA0KSwgc3RhdHVzLVx1MDAzZXN0czIpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqcnRwc2VfbWN1X2dlbjJfbWN1X3R5cGVfc3RyKHVuc2lnbmVkIGludCBtY3VfdHlwZSlcbiYjNDM7e1xuJiM0MztcdHN3aXRjaCAobWN1X3R5cGUpIHtcbiYjNDM7XHRjYXNlIDB4MDA6XHRyZXR1cm4gXCYjMzQ7R2lnYURldmljZSBHRDMyRjMxMFwmIzM0OztcbiYjNDM7XHRjYXNlIDB4MDE6XHRyZXR1cm4gXCYjMzQ7R2lnYURldmljZSBHRDMyRjIzMFwmIzM0OztcbiYjNDM7XHRjYXNlIDB4MDI6XHRyZXR1cm4gXCYjMzQ7R2lnYURldmljZSBHRDMyRjMwM1wmIzM0OztcbiYjNDM7XHRjYXNlIDB4MDM6XHRyZXR1cm4gXCYjMzQ7R2lnYURldmljZSBHRDMyRjEwM1wmIzM0OztcbiYjNDM7XHRjYXNlIDB4MDQ6XHRyZXR1cm4gXCYjMzQ7R2lnYURldmljZSBHRDMyRTEwM1wmIzM0OztcbiYjNDM7XHRjYXNlIDB4MTA6XHRyZXR1cm4gXCYjMzQ7TnV2b3RvbiBNMDUxNlwmIzM0OztcbiYjNDM7XHRjYXNlIDB4MTE6XHRyZXR1cm4gXCYjMzQ7TnV2b3RvbiBNMDU2NFwmIzM0OztcbiYjNDM7XHRjYXNlIDB4MTI6XHRyZXR1cm4gXCYjMzQ7TnV2b3RvbiBOVUMwMjlcJiMzNDs7XG4mIzQzO1x0ZGVmYXVsdDpcdHJldHVybiBcJiMzNDt1bmtub3duXCYjMzQ7O1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcnRwc2VfbWN1X2dlbjFfcGFyc2Vfc3lzdGVtX2luZm8oY29uc3QgdTggKnBheWxvYWQsIHN0cnVjdCBydHBzZV9tY3VfaW5mbyAqaW5mbylcbiYjNDM7e1xuJiM0MztcdGluZm8tXHUwMDNlbWF4X3BvcnRzID0gcGF5bG9hZFsxXTtcbiYjNDM7XHQvKiBHZW4xIGhhcyBubyBleHBsaWNpdCBzeXN0ZW1fZW5hYmxlIGJ5dGU7IHRoZSBjbG9zZXN0IGFuYWxvZyBpcyB0aGVcbiYjNDM7XHQgKiBcJiMzNDtyZW1vdGUgZW5hYmxlXCYjMzQ7IGJpdCBpbiB0aGUgc3lzdGVtLXN0YXR1cyBmbGFncyBhdCBwYXlsb2FkWzddLlxuJiM0MztcdCAqL1xuJiM0MztcdGluZm8tXHUwMDNlc3lzdGVtX2VuYWJsZSA9ICEhKHBheWxvYWRbN10gXHUwMDI2IEJJVCgyKSk7XG4mIzQzO1x0aW5mby1cdTAwM2VkZXZpY2VfaWQgPSBnZXRfdW5hbGlnbmVkX2JlMTYoXHUwMDI2cGF5bG9hZFszXSk7XG4mIzQzO1x0aW5mby1cdTAwM2VtY3VfdHlwZSA9IHBheWxvYWRbNl07XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X2dlbjFfcGFyc2VfcG9ydF9jbGFzcyhjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfc3RhdHVzICpzdGF0dXMpXG4mIzQzO3tcbiYjNDM7XHQvKiBHZW4xIHB1dHMgdGhlIGRldGVjdGVkIGNsYXNzIGluIHBheWxvYWRbM10gKD09IHN0czMpIGRpcmVjdGx5LlxuJiM0MztcdCAqIE1hc2sgdG8gdGhlIGxvdyBuaWJibGU7IGNsYXNzIGlzIDAuLjggYW5kIGFueSBoaWdoIGJpdHMgd291bGQgYmVcbiYjNDM7XHQgKiBub2lzZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRyZXR1cm4gc3RhdHVzLVx1MDAzZXN0czMgXHUwMDI2IDB4MGY7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBjaGFyICpydHBzZV9tY3VfZ2VuMV9tY3VfdHlwZV9zdHIodW5zaWduZWQgaW50IG1jdV90eXBlKVxuJiM0Mzt7XG4mIzQzO1x0c3dpdGNoIChtY3VfdHlwZSkge1xuJiM0MztcdGNhc2UgMHgwMDpcdHJldHVybiBcJiMzNDtTVCBNaWNybyBTVDMyRjEwMFwmIzM0OztcbiYjNDM7XHRjYXNlIDB4MDE6XHRyZXR1cm4gXCYjMzQ7TnV2b3RvbiBNMDV4eCBMQU5cJiMzNDs7XG4mIzQzO1x0Y2FzZSAweDAyOlx0cmV0dXJuIFwmIzM0O1NUIE1pY3JvIFNURjAzMEM4XCYjMzQ7O1xuJiM0MztcdGNhc2UgMHgwMzpcdHJldHVybiBcJiMzNDtOdXZvdG9uIE0wNThTQU5cJiMzNDs7XG4mIzQzO1x0Y2FzZSAweDA0Olx0cmV0dXJuIFwmIzM0O051dm90b24gTlVDMTIyXCYjMzQ7O1xuJiM0MztcdGRlZmF1bHQ6XHRyZXR1cm4gXCYjMzQ7dW5rbm93blwmIzM0OztcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIE1hcCBlYWNoIGxvZ2ljYWwgY29tbWFuZCB0aGUgY29yZSBpc3N1ZXMgdG8gaXRzIHBlci1kaWFsZWN0IG9wY29kZS4gKi9cbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfZGlhbGVjdCBydHBzZV9tY3VfZGlhbGVjdF9nZW4yID0ge1xuJiM0MztcdC5wYXJzZV9zeXN0ZW1faW5mbyA9IHJ0cHNlX21jdV9nZW4yX3BhcnNlX3N5c3RlbV9pbmZvLFxuJiM0MztcdC5wYXJzZV9wb3J0X2NsYXNzICA9IHJ0cHNlX21jdV9nZW4yX3BhcnNlX3BvcnRfY2xhc3MsXG4mIzQzO1x0Lm1jdV90eXBlX3N0ciAgICAgID0gcnRwc2VfbWN1X2dlbjJfbWN1X3R5cGVfc3RyLFxuJiM0MztcdC5vcGNvZGUgPSB7XG4mIzQzO1x0XHRbUlRQU0VfTUNVX0NNRF9TRVRfR0xPQkFMX1NUQVRFXVx0PSBSVFBTRV9NQ1VfT1AoMHgwMCksXG4mIzQzO1x0XHRbUlRQU0VfTUNVX0NNRF9HRVRfU1lTVEVNX0lORk9dXHRcdD0gUlRQU0VfTUNVX09QKDB4NDApLFxuJiM0MztcdFx0W1JUUFNFX01DVV9DTURfR0VUX0VYVF9DT05GSUddXHRcdD0gUlRQU0VfTUNVX09QKDB4NGEpLFxuJiM0MztcbiYjNDM7XHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfRU5BQkxFXVx0XHQ9IFJUUFNFX01DVV9PUCgweDAxKSxcbiYjNDM7XHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUX1RZUEVdID0gUlRQU0VfTUNVX09QKDB4MTIpLFxuJiM0MztcdFx0W1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRdXHQ9IFJUUFNFX01DVV9PUCgweDEzKSxcbiYjNDM7XHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUX0VYVF0gPSBSVFBTRV9NQ1VfT1AoMHgxNCksXG4mIzQzO1x0XHRbUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QUklPUklUWV1cdD0gUlRQU0VfTUNVX09QKDB4MTUpLFxuJiM0MztcdFx0W1JUUFNFX01DVV9DTURfUE9SVF9HRVRfU1RBVFVTXVx0XHQ9IFJUUFNFX01DVV9PUCgweDQyKSxcbiYjNDM7XHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1BPV0VSX1NUQVRTXVx0PSBSVFBTRV9NQ1VfT1AoMHg0NCksXG4mIzQzO1x0XHRbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9DT05GSUddXHRcdD0gUlRQU0VfTUNVX09QKDB4NDgpLFxuJiM0MztcdFx0W1JUUFNFX01DVV9DTURfUE9SVF9HRVRfRVhUX0NPTkZJR11cdD0gUlRQU0VfTUNVX09QKDB4NDkpLFxuJiM0MztcdH0sXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9kaWFsZWN0IHJ0cHNlX21jdV9kaWFsZWN0X2dlbjEgPSB7XG4mIzQzO1x0LnBhcnNlX3N5c3RlbV9pbmZvID0gcnRwc2VfbWN1X2dlbjFfcGFyc2Vfc3lzdGVtX2luZm8sXG4mIzQzO1x0LnBhcnNlX3BvcnRfY2xhc3MgID0gcnRwc2VfbWN1X2dlbjFfcGFyc2VfcG9ydF9jbGFzcyxcbiYjNDM7XHQubWN1X3R5cGVfc3RyICAgICAgPSBydHBzZV9tY3VfZ2VuMV9tY3VfdHlwZV9zdHIsXG4mIzQzO1x0Lm9wY29kZSA9IHtcbiYjNDM7XHRcdFtSVFBTRV9NQ1VfQ01EX0dFVF9TWVNURU1fSU5GT11cdFx0PSBSVFBTRV9NQ1VfT1AoMHgyMCksXG4mIzQzO1x0XHRbUlRQU0VfTUNVX0NNRF9HRVRfRVhUX0NPTkZJR11cdFx0PSBSVFBTRV9NQ1VfT1AoMHgyYiksXG4mIzQzO1xuJiM0MztcdFx0W1JUUFNFX01DVV9DTURfUE9SVF9FTkFCTEVdXHRcdD0gUlRQU0VfTUNVX09QKDB4MDApLFxuJiM0MztcdFx0W1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfVFlQRV0gPSBSVFBTRV9NQ1VfT1AoMHgxNSksXG4mIzQzO1x0XHRbUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF1cdD0gUlRQU0VfTUNVX09QKDB4MTYpLFxuJiM0MztcdFx0W1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUFJJT1JJVFldXHQ9IFJUUFNFX01DVV9PUCgweDFhKSxcbiYjNDM7XHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1NUQVRVU11cdFx0PSBSVFBTRV9NQ1VfT1AoMHgyMSksXG4mIzQzO1x0XHRbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9QT1dFUl9TVEFUU11cdD0gUlRQU0VfTUNVX09QKDB4MzApLFxuJiM0MztcdFx0W1JUUFNFX01DVV9DTURfUE9SVF9HRVRfQ09ORklHXVx0XHQ9IFJUUFNFX01DVV9PUCgweDI1KSxcbiYjNDM7XHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0VYVF9DT05GSUddXHQ9IFJUUFNFX01DVV9PUCgweDI2KSxcbiYjNDM7XHR9LFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhIHJ0cHNlX21jdV9nZW4xX2RhdGEgPSB7XG4mIzQzO1x0LmRpYWxlY3QgPSBcdTAwMjZydHBzZV9tY3VfZGlhbGVjdF9nZW4xLFxuJiM0Mzt9O1xuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChydHBzZV9tY3VfZ2VuMV9kYXRhKTtcbiYjNDM7XG4mIzQzO2NvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMl9kYXRhID0ge1xuJiM0MztcdC5kaWFsZWN0ID0gXHUwMDI2cnRwc2VfbWN1X2RpYWxlY3RfZ2VuMixcbiYjNDM7fTtcbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocnRwc2VfbWN1X2dlbjJfZGF0YSk7XG4mIzQzO1xuJiM0MzsvKiBTYW1lIGRpYWxlY3QgYXMgZ2VuMiwgYnV0IHRoZSBNQ1UgZXhwZWN0cyByYXctSTJDIGZyYW1pbmcuICovXG4mIzQzO2NvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMl9pMmNfZGF0YSA9IHtcbiYjNDM7XHQuZGlhbGVjdCA9IFx1MDAyNnJ0cHNlX21jdV9kaWFsZWN0X2dlbjIsXG4mIzQzO1x0Lm5hdGl2ZV9pMmMgPSB0cnVlLFxuJiM0Mzt9O1xuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChydHBzZV9tY3VfZ2VuMl9pMmNfZGF0YSk7XG4mIzQzO1xuJiM0MztNT0RVTEVfQVVUSE9SKFwmIzM0O0pvbmFzIEplbG9uZWsgXHUwMDNjamVsb25lay5qb25hc0BnbWFpbC5jb21cdTAwM2VcJiMzNDspO1xuJiM0MztNT0RVTEVfREVTQ1JJUFRJT04oXCYjMzQ7UmVhbHRlayBQU0UgTUNVIGRyaXZlciAoY29yZSlcJiMzNDspO1xuJiM0MztNT0RVTEVfTElDRU5TRShcJiMzNDtHUExcJiMzNDspO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtaTJjLmMgYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LWkyYy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTEwZjhjNjMzYjY4ZVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS1pMmMuY1xuQEAgLTAsMCAmIzQzOzEsMTcwIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWxheS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2kyYy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L29mLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcHNlLXBkL3BzZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmcuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7cmVhbHRlay1wc2UtbWN1LmhcJiMzNDtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBjb3JlIGhhcyBhbHJlYWR5IHdhaXRlZCBSVFBTRV9NQ1VfUkVTUE9OU0VfTVMgYmVmb3JlIGNhbGxpbmcgdXMsIHNvXG4mIzQzOyAqIHRoZSByZXNwb25zZSBpcyBub3JtYWxseSByZWFkeSBvbiB0aGUgdmVyeSBmaXJzdCByZWFkLiBGb3IgY29tbWFuZHMgdGhlXG4mIzQzOyAqIE1DVSBwcm9kdWNlcyBtb3JlIHNsb3dseSwga2VlcCBwb2xsaW5nIGF0IHRoZSB0eXBpY2FsIHJlc3BvbnNlIGNhZGVuY2VcbiYjNDM7ICogdXAgdG8gdGhlIHdvcnN0LWNhc2UgY2VpbGluZy5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX0kyQ19SRVRSWV9NU1x0UlRQU0VfTUNVX1JFU1BPTlNFX01TXG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX0kyQ19NQVhfVFJJRVNcdChSVFBTRV9NQ1VfUkVTUE9OU0VfTUFYX01TIC8gUlRQU0VfTUNVX0kyQ19SRVRSWV9NUylcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X2kyY19zbWJ1c19zZW5kKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQocHNlLVx1MDAzZWRldik7XG4mIzQzO1xuJiM0MztcdC8qIFNlbmQgb3Bjb2RlIGFzIFNNQnVzIGNvbW1hbmQgYnl0ZTsgcmVtYWluaW5nIDExIGJ5dGVzIGFzIGJsb2NrIGRhdGEgKi9cbiYjNDM7XHRyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNsaWVudCwgcmVxLVx1MDAzZW9wY29kZSwgUlRQU0VfTUNVX01TR19TSVpFIC0gMSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICh1OCAqKXJlcSAmIzQzOyAxKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfaTJjX3NtYnVzX3JlY3Yoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEsXG4mIzQzO1x0XHRcdFx0ICAgIHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXNwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQocHNlLVx1MDAzZWRldik7XG4mIzQzO1x0aW50IHRyaWVzLCByZXQ7XG4mIzQzO1xuJiM0MztcdGZvciAodHJpZXMgPSAwOyB0cmllcyBcdTAwM2MgUlRQU0VfTUNVX0kyQ19NQVhfVFJJRVM7IHRyaWVzJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHRyaWVzIFx1MDAzZSAwKVxuJiM0MztcdFx0XHRtc2xlZXAoUlRQU0VfTUNVX0kyQ19SRVRSWV9NUyk7XG4mIzQzO1xuJiM0MztcdFx0LyogTUNVIG5lZWRzIDB4MDAgYXMgY29tbWFuZCBieXRlIGZvciByZWFkICovXG4mIzQzO1x0XHRyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsIDB4MDAsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBSVFBTRV9NQ1VfTVNHX1NJWkUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAodTggKilyZXNwKTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHRpZiAocmV0ID09IFJUUFNFX01DVV9NU0dfU0laRSBcdTAwMjZcdTAwMjYgcnRwc2VfbWN1X3Jlc3BfaXNfZmluYWwocmVxLCByZXNwKSlcbiYjNDM7XHRcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gLUVUSU1FRE9VVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfdHJhbnNwb3J0X29wcyBydHBzZV9tY3VfaTJjX3NtYnVzX29wcyA9IHtcbiYjNDM7XHQuc2VuZCA9IHJ0cHNlX21jdV9pMmNfc21idXNfc2VuZCxcbiYjNDM7XHQucmVjdiA9IHJ0cHNlX21jdV9pMmNfc21idXNfcmVjdixcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X2kyY19uYXRpdmVfc2VuZChzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHBzZS1cdTAwM2VkZXYpO1xuJiM0MztcdHZvaWQgKmJ1ZjtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHQvKiBpMmNfbWFzdGVyX3NlbmQoKSBtYXkgRE1BLCBzbyB0aGUgYnVmZmVyIG11c3Qgbm90IGJlIG9uIHRoZSBzdGFjay4gKi9cbiYjNDM7XHRidWYgPSBrbWVtZHVwKHJlcSwgUlRQU0VfTUNVX01TR19TSVpFLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIWJ1ZilcbiYjNDM7XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIFJUUFNFX01DVV9NU0dfU0laRSk7XG4mIzQzO1x0a2ZyZWUoYnVmKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRyZXR1cm4gcmV0ID09IFJUUFNFX01DVV9NU0dfU0laRSA/IDAgOiAtRUlPO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9pMmNfbmF0aXZlX3JlY3Yoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEsXG4mIzQzO1x0XHRcdFx0ICAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHBzZS1cdTAwM2VkZXYpO1xuJiM0MztcdGludCB0cmllcywgcmV0O1xuJiM0MztcdHU4ICpidWY7XG4mIzQzO1xuJiM0MztcdC8qIGkyY19tYXN0ZXJfcmVjdigpIG1heSBETUEsIHNvIHJlYWQgaW50byBhbiBvZmYtc3RhY2sgYnVmZmVyLiAqL1xuJiM0MztcdGJ1ZiA9IGttYWxsb2MoUlRQU0VfTUNVX01TR19TSVpFLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIWJ1ZilcbiYjNDM7XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcbiYjNDM7XHRmb3IgKHRyaWVzID0gMDsgdHJpZXMgXHUwMDNjIFJUUFNFX01DVV9JMkNfTUFYX1RSSUVTOyB0cmllcyYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmICh0cmllcyBcdTAwM2UgMClcbiYjNDM7XHRcdFx0bXNsZWVwKFJUUFNFX01DVV9JMkNfUkVUUllfTVMpO1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1ZiwgUlRQU0VfTUNVX01TR19TSVpFKTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0aWYgKHJldCA9PSBSVFBTRV9NQ1VfTVNHX1NJWkUpIHtcbiYjNDM7XHRcdFx0bWVtY3B5KHJlc3AsIGJ1ZiwgUlRQU0VfTUNVX01TR19TSVpFKTtcbiYjNDM7XHRcdFx0aWYgKHJ0cHNlX21jdV9yZXNwX2lzX2ZpbmFsKHJlcSwgcmVzcCkpIHtcbiYjNDM7XHRcdFx0XHRyZXQgPSAwO1xuJiM0MztcdFx0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJldCA9IC1FVElNRURPVVQ7XG4mIzQzO291dDpcbiYjNDM7XHRrZnJlZShidWYpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X3RyYW5zcG9ydF9vcHMgcnRwc2VfbWN1X2kyY19uYXRpdmVfb3BzID0ge1xuJiM0MztcdC5zZW5kID0gcnRwc2VfbWN1X2kyY19uYXRpdmVfc2VuZCxcbiYjNDM7XHQucmVjdiA9IHJ0cHNlX21jdV9pMmNfbmF0aXZlX3JlY3YsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFx1MDAyNmNsaWVudC1cdTAwM2VkZXY7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhICptYXRjaDtcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZTtcbiYjNDM7XHRib29sIHVzZV9uYXRpdmU7XG4mIzQzO1xuJiM0MztcdG1hdGNoID0gZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7XG4mIzQzO1x0aWYgKCFtYXRjaClcbiYjNDM7XHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgLUVOT0RFViwgXCYjMzQ7bWlzc2luZyBtYXRjaCBkYXRhXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogVGhlIGZyYW1pbmcgKHJhdyBJMkMgdnMgU01CdXMpIGlzIGNhcnJpZWQgYnkgdGhlIG1hdGNoIGRhdGEuICovXG4mIzQzO1x0dXNlX25hdGl2ZSA9IG1hdGNoLVx1MDAzZW5hdGl2ZV9pMmM7XG4mIzQzO1x0aWYgKHVzZV9uYXRpdmUpIHtcbiYjNDM7XHRcdGlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LVx1MDAzZWFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpXG4mIzQzO1x0XHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgLUVPUE5PVFNVUFAsXG4mIzQzO1x0XHRcdFx0XCYjMzQ7cGxhaW4tSTJDIE1DVSBwcm90b2NvbCByZXF1aXJlcyBJMkMtY2FwYWJsZSBhZGFwdGVyXFxuXCYjMzQ7KTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0aWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtXHUwMDNlYWRhcHRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfSTJDX0JMT0NLIHxcbiYjNDM7XHRcdFx0XHRcdCAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0spKVxuJiM0MztcdFx0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1FT1BOT1RTVVBQLFxuJiM0MztcdFx0XHRcdFwmIzM0O1NNQnVzIE1DVSBwcm90b2NvbCByZXF1aXJlcyBTTUJ1cyBJMkMtYmxvY2sgc3VwcG9ydFxcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRwc2UgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBzZSksIEdGUF9LRVJORUwpO1xuJiM0MztcdGlmICghcHNlKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHBzZS1cdTAwM2VkZXYgPSBkZXY7XG4mIzQzO1x0cHNlLVx1MDAzZXBjZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7XG4mIzQzO1x0cHNlLVx1MDAzZXRyYW5zcG9ydCA9IHVzZV9uYXRpdmUgPyBcdTAwMjZydHBzZV9tY3VfaTJjX25hdGl2ZV9vcHMgOiBcdTAwMjZydHBzZV9tY3VfaTJjX3NtYnVzX29wcztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJ0cHNlX21jdV9yZWdpc3Rlcihwc2UpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBydHBzZV9tY3VfaTJjX29mX21hdGNoW10gPSB7XG4mIzQzO1x0eyAuY29tcGF0aWJsZSA9IFwmIzM0O3JlYWx0ZWsscHNlLW1jdS1nZW4xLXNtYnVzXCYjMzQ7LCAuZGF0YSA9IFx1MDAyNnJ0cHNlX21jdV9nZW4xX2RhdGEgfSxcbiYjNDM7XHR7IC5jb21wYXRpYmxlID0gXCYjMzQ7cmVhbHRlayxwc2UtbWN1LWdlbjItc21idXNcJiMzNDssIC5kYXRhID0gXHUwMDI2cnRwc2VfbWN1X2dlbjJfZGF0YSB9LFxuJiM0MztcdHsgLmNvbXBhdGlibGUgPSBcJiMzNDtyZWFsdGVrLHBzZS1tY3UtZ2VuMi1pMmNcJiMzNDssIC5kYXRhID0gXHUwMDI2cnRwc2VfbWN1X2dlbjJfaTJjX2RhdGEgfSxcbiYjNDM7XHR7IC8qIHNlbnRpbmVsICovIH1cbiYjNDM7fTtcbiYjNDM7TU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcnRwc2VfbWN1X2kyY19vZl9tYXRjaCk7XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcnRwc2VfbWN1X2kyY19kcml2ZXIgPSB7XG4mIzQzO1x0LmRyaXZlciA9IHtcbiYjNDM7XHRcdC5uYW1lXHRcdD0gXCYjMzQ7cmVhbHRlay1wc2UtbWN1LWkyY1wmIzM0OyxcbiYjNDM7XHRcdC5vZl9tYXRjaF90YWJsZVx0PSBydHBzZV9tY3VfaTJjX29mX21hdGNoLFxuJiM0MztcdH0sXG4mIzQzO1x0LnByb2JlXHRcdD0gcnRwc2VfbWN1X2kyY19wcm9iZSxcbiYjNDM7fTtcbiYjNDM7bW9kdWxlX2kyY19kcml2ZXIocnRwc2VfbWN1X2kyY19kcml2ZXIpO1xuJiM0MztcbiYjNDM7TU9EVUxFX0FVVEhPUihcJiMzNDtKb25hcyBKZWxvbmVrIFx1MDAzY2plbG9uZWsuam9uYXNAZ21haWwuY29tXHUwMDNlXCYjMzQ7KTtcbiYjNDM7TU9EVUxFX0RFU0NSSVBUSU9OKFwmIzM0O1JlYWx0ZWsgUFNFIE1DVSBkcml2ZXIgKEkyQyB0cmFuc3BvcnQpXCYjMzQ7KTtcbiYjNDM7TU9EVUxFX0xJQ0VOU0UoXCYjMzQ7R1BMXCYjMzQ7KTtcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LXVhcnQuYyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtdWFydC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uOWJhYTE3ZDhkMzFmYVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS11YXJ0LmNcbkBAIC0wLDAgJiM0MzsxLDE2NCBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlclxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvY2xlYW51cC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbXBsZXRpb24uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9vZi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3BzZS1wZC9wc2UuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zZXJkZXYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zcGlubG9jay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtyZWFsdGVrLXBzZS1tY3UuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfVUFSVF9CQVVEX0RFRkFVTFRcdDE5MjAwXG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX1VBUlRfVFhfVElNRU9VVFx0bXNlY3NfdG9famlmZmllcygxMDApXG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX1VBUlRfUlhfVElNRU9VVFx0bXNlY3NfdG9famlmZmllcyhSVFBTRV9NQ1VfUkVTUE9OU0VfTUFYX01TKVxuJiM0MztcbiYjNDM7c3RydWN0IHJ0cHNlX21jdV91YXJ0IHtcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgcHNlO1xuJiM0MztcdHN0cnVjdCBzZXJkZXZfZGV2aWNlICpzZXJkZXY7XG4mIzQzO1x0c3RydWN0IGNvbXBsZXRpb24gcnhfZG9uZTtcbiYjNDM7XHRzcGlubG9ja190IHJ4X2xvY2s7XHRcdC8qIHByb3RlY3RzIHJ4X2J1ZiBhbmQgcnhfbGVuICovXG4mIzQzO1x0c2l6ZV90IHJ4X2xlbjtcbiYjNDM7XHR1OCByeF9idWZbUlRQU0VfTUNVX01TR19TSVpFXTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgdG9fcnRwc2VfbWN1X3VhcnQocCkgIGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgcnRwc2VfbWN1X3VhcnQsIHBzZSlcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE5vIGZyYW1pbmcgaXMgZG9uZSBoZXJlOiBhIGdsaXRjaGVkIGZyYW1lIGNvc3RzIG9uZSB0cmFuc2FjdGlvbiwgdGhlblxuJiM0MzsgKiB0aGUgbmV4dCBfc2VuZCByZS1mcmFtZXMgZnJvbSByeF9sZW4gMC4gUmVzeW5jIHdvcmtzIGJ5IHJldHVybmluZyBjb3VudFxuJiM0MzsgKiAobm90IHRha2UpLCBkcm9wcGluZyBhbnkgb3ZlcmZsb3cgc28gc2VyZGV2IGtlZXBzIG5vIGxlZnRvdmVyIHRvIGJsZWVkXG4mIzQzOyAqIGludG8gdGhlIG5leHQgZnJhbWUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgc2l6ZV90IHJ0cHNlX21jdV91YXJ0X3JlY2VpdmUoc3RydWN0IHNlcmRldl9kZXZpY2UgKnNlcmRldixcbiYjNDM7XHRcdFx0XHQgICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBjb3VudClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBydHBzZV9tY3VfdWFydCAqY3R4ID0gc2VyZGV2X2RldmljZV9nZXRfZHJ2ZGF0YShzZXJkZXYpO1xuJiM0MztcdHNpemVfdCB0YWtlO1xuJiM0MztcbiYjNDM7XHRzY29wZWRfZ3VhcmQoc3BpbmxvY2tfaXJxc2F2ZSwgXHUwMDI2Y3R4LVx1MDAzZXJ4X2xvY2spIHtcbiYjNDM7XHRcdHRha2UgPSBtaW4oY291bnQsIHNpemVvZihjdHgtXHUwMDNlcnhfYnVmKSAtIGN0eC1cdTAwM2VyeF9sZW4pO1xuJiM0MztcdFx0aWYgKHRha2UpIHtcbiYjNDM7XHRcdFx0bWVtY3B5KGN0eC1cdTAwM2VyeF9idWYgJiM0MzsgY3R4LVx1MDAzZXJ4X2xlbiwgYnVmLCB0YWtlKTtcbiYjNDM7XHRcdFx0Y3R4LVx1MDAzZXJ4X2xlbiAmIzQzOz0gdGFrZTtcbiYjNDM7XHRcdFx0aWYgKGN0eC1cdTAwM2VyeF9sZW4gPT0gc2l6ZW9mKGN0eC1cdTAwM2VyeF9idWYpKVxuJiM0MztcdFx0XHRcdGNvbXBsZXRlKFx1MDAyNmN0eC1cdTAwM2VyeF9kb25lKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIGNvbnN1bWUgYWxsIHRvIGF2b2lkIGRlc3luYy9taXNhbGlnbm1lbnQgKi9cbiYjNDM7XHRyZXR1cm4gY291bnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VyZGV2X2RldmljZV9vcHMgcnRwc2VfbWN1X3VhcnRfc2VyZGV2X29wcyA9IHtcbiYjNDM7XHQucmVjZWl2ZV9idWYgPSBydHBzZV9tY3VfdWFydF9yZWNlaXZlLFxuJiM0MztcdC53cml0ZV93YWtldXAgPSBzZXJkZXZfZGV2aWNlX3dyaXRlX3dha2V1cCxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X3VhcnRfc2VuZChzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBydHBzZV9tY3VfdWFydCAqY3R4ID0gdG9fcnRwc2VfbWN1X3VhcnQocHNlKTtcbiYjNDM7XHRpbnQgd3JpdHRlbjtcbiYjNDM7XG4mIzQzO1x0LyogY2xlYXIgYW55IGxlZnRvdmVyIHJ4IHN0YXRlIGJlZm9yZSB0cmFuc21pdHRpbmcgKi9cbiYjNDM7XHRzY29wZWRfZ3VhcmQoc3BpbmxvY2tfaXJxc2F2ZSwgXHUwMDI2Y3R4LVx1MDAzZXJ4X2xvY2spIHtcbiYjNDM7XHRcdHJlaW5pdF9jb21wbGV0aW9uKFx1MDAyNmN0eC1cdTAwM2VyeF9kb25lKTtcbiYjNDM7XHRcdGN0eC1cdTAwM2VyeF9sZW4gPSAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0d3JpdHRlbiA9IHNlcmRldl9kZXZpY2Vfd3JpdGUoY3R4LVx1MDAzZXNlcmRldiwgKGNvbnN0IHU4ICopcmVxLCBzaXplb2YoKnJlcSksXG4mIzQzO1x0XHRcdFx0ICAgICAgUlRQU0VfTUNVX1VBUlRfVFhfVElNRU9VVCk7XG4mIzQzO1x0aWYgKHdyaXR0ZW4gXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gd3JpdHRlbjtcbiYjNDM7XHRpZiAod3JpdHRlbiAhPSBzaXplb2YoKnJlcSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X3VhcnRfcmVjdihzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSxcbiYjNDM7XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEsXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBydHBzZV9tY3VfdWFydCAqY3R4ID0gdG9fcnRwc2VfbWN1X3VhcnQocHNlKTtcbiYjNDM7XG4mIzQzO1x0aWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoXHUwMDI2Y3R4LVx1MDAzZXJ4X2RvbmUsIFJUUFNFX01DVV9VQVJUX1JYX1RJTUVPVVQpKVxuJiM0MztcdFx0cmV0dXJuIC1FVElNRURPVVQ7XG4mIzQzO1xuJiM0MztcdHNjb3BlZF9ndWFyZChzcGlubG9ja19pcnFzYXZlLCBcdTAwMjZjdHgtXHUwMDNlcnhfbG9jaykge1xuJiM0MztcdFx0aWYgKGN0eC1cdTAwM2VyeF9sZW4gIT0gc2l6ZW9mKCpyZXNwKSlcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU87XG4mIzQzO1xuJiM0MztcdFx0bWVtY3B5KHJlc3AsIGN0eC1cdTAwM2VyeF9idWYsIHNpemVvZigqcmVzcCkpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfdHJhbnNwb3J0X29wcyBydHBzZV9tY3VfdWFydF90cmFuc3BvcnRfb3BzID0ge1xuJiM0MztcdC5zZW5kID0gcnRwc2VfbWN1X3VhcnRfc2VuZCxcbiYjNDM7XHQucmVjdiA9IHJ0cHNlX21jdV91YXJ0X3JlY3YsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV91YXJ0X3Byb2JlKHN0cnVjdCBzZXJkZXZfZGV2aWNlICpzZXJkZXYpXG4mIzQzO3tcbiYjNDM7XHR1MzIgc3BlZWQgPSBSVFBTRV9NQ1VfVUFSVF9CQVVEX0RFRkFVTFQ7XG4mIzQzO1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2c2VyZGV2LVx1MDAzZWRldjtcbiYjNDM7XHRzdHJ1Y3QgcnRwc2VfbWN1X3VhcnQgKmN0eDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgYmF1ZDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRjdHggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpO1xuJiM0MztcdGlmICghY3R4KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdGN0eC1cdTAwM2VzZXJkZXYgPSBzZXJkZXY7XG4mIzQzO1x0Y3R4LVx1MDAzZXBzZS5kZXYgPSBkZXY7XG4mIzQzO1x0Y3R4LVx1MDAzZXBzZS5wY2Rldi5vd25lciA9IFRISVNfTU9EVUxFO1xuJiM0MztcdGN0eC1cdTAwM2Vwc2UudHJhbnNwb3J0ID0gXHUwMDI2cnRwc2VfbWN1X3VhcnRfdHJhbnNwb3J0X29wcztcbiYjNDM7XHRpbml0X2NvbXBsZXRpb24oXHUwMDI2Y3R4LVx1MDAzZXJ4X2RvbmUpO1xuJiM0MztcdHNwaW5fbG9ja19pbml0KFx1MDAyNmN0eC1cdTAwM2VyeF9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0c2VyZGV2X2RldmljZV9zZXRfZHJ2ZGF0YShzZXJkZXYsIGN0eCk7XG4mIzQzO1x0c2VyZGV2X2RldmljZV9zZXRfY2xpZW50X29wcyhzZXJkZXYsIFx1MDAyNnJ0cHNlX21jdV91YXJ0X3NlcmRldl9vcHMpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBkZXZtX3NlcmRldl9kZXZpY2Vfb3BlbihkZXYsIHNlcmRldik7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgcmV0LCBcJiMzNDtmYWlsZWQgdG8gb3BlbiBzZXJkZXZcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRmd25vZGVfcHJvcGVydHlfcmVhZF91MzIoZGV2X2Z3bm9kZShkZXYpLCBcJiMzNDtjdXJyZW50LXNwZWVkXCYjMzQ7LCBcdTAwMjZzcGVlZCk7XG4mIzQzO1xuJiM0MztcdGJhdWQgPSBzZXJkZXZfZGV2aWNlX3NldF9iYXVkcmF0ZShzZXJkZXYsIHNwZWVkKTtcbiYjNDM7XHRpZiAoYmF1ZCAhPSBzcGVlZClcbiYjNDM7XHRcdGRldl93YXJuKGRldiwgXCYjMzQ7Y291bGQgbm90IHNldCBiYXVkcmF0ZSAldSwgY29udHJvbGxlciB1c2VzICV1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgc3BlZWQsIGJhdWQpO1xuJiM0MztcbiYjNDM7XHRzZXJkZXZfZGV2aWNlX3NldF9mbG93X2NvbnRyb2woc2VyZGV2LCBmYWxzZSk7XG4mIzQzO1xuJiM0MztcdHJldCA9IHNlcmRldl9kZXZpY2Vfc2V0X3Bhcml0eShzZXJkZXYsIFNFUkRFVl9QQVJJVFlfTk9ORSk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdGRldl93YXJuKGRldiwgXCYjMzQ7Y291bGQgbm90IHNldCBwYXJpdHkgdG8gbm9uZTogJWRcXG5cJiMzNDssIHJldCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBydHBzZV9tY3VfcmVnaXN0ZXIoXHUwMDI2Y3R4LVx1MDAzZXBzZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJ0cHNlX21jdV91YXJ0X29mX21hdGNoW10gPSB7XG4mIzQzO1x0eyAuY29tcGF0aWJsZSA9IFwmIzM0O3JlYWx0ZWsscHNlLW1jdS1nZW4xXCYjMzQ7LCAuZGF0YSA9IFx1MDAyNnJ0cHNlX21jdV9nZW4xX2RhdGEgfSxcbiYjNDM7XHR7IC5jb21wYXRpYmxlID0gXCYjMzQ7cmVhbHRlayxwc2UtbWN1LWdlbjJcJiMzNDssIC5kYXRhID0gXHUwMDI2cnRwc2VfbWN1X2dlbjJfZGF0YSB9LFxuJiM0MztcdHsgLyogc2VudGluZWwgKi8gfVxuJiM0Mzt9O1xuJiM0MztNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBydHBzZV9tY3VfdWFydF9vZl9tYXRjaCk7XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IHNlcmRldl9kZXZpY2VfZHJpdmVyIHJ0cHNlX21jdV91YXJ0X2RyaXZlciA9IHtcbiYjNDM7XHQuZHJpdmVyID0ge1xuJiM0MztcdFx0Lm5hbWUgPSBcJiMzNDtyZWFsdGVrLXBzZS1tY3UtdWFydFwmIzM0OyxcbiYjNDM7XHRcdC5vZl9tYXRjaF90YWJsZSA9IHJ0cHNlX21jdV91YXJ0X29mX21hdGNoLFxuJiM0MztcdH0sXG4mIzQzO1x0LnByb2JlICA9IHJ0cHNlX21jdV91YXJ0X3Byb2JlLFxuJiM0Mzt9O1xuJiM0Mzttb2R1bGVfc2VyZGV2X2RldmljZV9kcml2ZXIocnRwc2VfbWN1X3VhcnRfZHJpdmVyKTtcbiYjNDM7XG4mIzQzO01PRFVMRV9BVVRIT1IoXCYjMzQ7Sm9uYXMgSmVsb25layBcdTAwM2NqZWxvbmVrLmpvbmFzQGdtYWlsLmNvbVx1MDAzZVwmIzM0Oyk7XG4mIzQzO01PRFVMRV9ERVNDUklQVElPTihcJiMzNDtSZWFsdGVrIFBTRSBNQ1UgZHJpdmVyIChVQVJUIHRyYW5zcG9ydClcJiMzNDspO1xuJiM0MztNT0RVTEVfTElDRU5TRShcJiMzNDtHUExcJiMzNDspO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UuaCBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjUyZjk0NDJkNzExN2Ncbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UuaFxuQEAgLTAsMCAmIzQzOzEsOTMgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX1JFQUxURUtfUFNFX01DVV9IXG4mIzQzOyNkZWZpbmUgX1JFQUxURUtfUFNFX01DVV9IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tdXRleC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3BzZS1wZC9wc2UuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaW1lIHRoZSBNQ1UgaXRzZWxmIG5lZWRzIGJldHdlZW4gYWNjZXB0aW5nIGEgcmVxdWVzdCBhbmQgaGF2aW5nIGFcbiYjNDM7ICogcmVzcG9uc2UgcmVhZHkuIFRoZXNlIGFyZSBwcm9wZXJ0aWVzIG9mIHRoZSBNQ1UgZmlybXdhcmUsIG5vdCBvZiB0aGVcbiYjNDM7ICogdW5kZXJseWluZyB0cmFuc3BvcnQ6IHRoZSBjb3JlIHBhY2VzIHRyYW5zYWN0aW9ucyBieSBSVFBTRV9NQ1VfUkVTUE9OU0VfTVNcbiYjNDM7ICogYW5kIGJvdGggdHJhbnNwb3J0cyBzaXplIHRoZWlyIHBlci10cmFuc2FjdGlvbiByZWN2IGNlaWxpbmcgZnJvbVxuJiM0MzsgKiBSVFBTRV9NQ1VfUkVTUE9OU0VfTUFYX01TLCBzaW5jZSBzb21lIGNvbW1hbmRzIGFyZSBkb2N1bWVudGVkIGFzXG4mIzQzOyAqIG5lZWRpbmcgdXAgdG8gfjFzIHRvIHByb2R1Y2UgYSByZXBseS5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX1JFU1BPTlNFX01TXHRcdFx0MjVcbiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfUkVTUE9OU0VfTUFYX01TXHRcdDEwMDBcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRvdGFsIHRpbWUgdG8ga2VlcCByZXRyeWluZyB0aGUgZmlyc3QgTUNVIHJlYWQgYXQgcHJvYmUsIGFuZCB0aGUgcGF1c2VcbiYjNDM7ICogYmV0d2VlbiBhdHRlbXB0cy4gUmlnaHQgYWZ0ZXIgcmVzZXQtZ3Bpb3MgaXMgZGVhc3NlcnRlZCB0aGUgTUNVIG1heSBub3RcbiYjNDM7ICogYW5zd2VyIG9uIHRoZSBidXMgeWV0OyBnaXZlIGl0IGEgYm91bmRlZCB3aW5kb3cgdG8gY29tZSB1cCBiZWZvcmVcbiYjNDM7ICogZGVjbGFyaW5nIHRoZSBwcm9iZSBmYWlsZWQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9CT09UX1RJTUVPVVRfTVNcdFx0MzAwMFxuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9CT09UX1JFVFJZX01TXHRcdFx0MTAwXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9NU0dfU0laRVx0XHRcdDEyXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X21zZyB7XG4mIzQzO1x0dTggb3Bjb2RlO1xuJiM0MztcdHU4IHNlcV9udW07XG4mIzQzO1x0dTggcGF5bG9hZFs5XTtcbiYjNDM7XHR1OCBjaGVja3N1bTtcbiYjNDM7fSBfX3BhY2tlZDtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE1DVSBzdGF0dXMgb3Bjb2RlcyAoc2VlbiBvbiB0aGUgR2VuMSBkaWFsZWN0OyBHZW4yIG5ldmVyIGVtaXRzIHRoZW0pLlxuJiM0MzsgKiBJTkNPTVBMRVRFL0JBRF9DU1VNIGFyZSB0ZXJtaW5hbDsgTk9UX1JFQURZIGlzIHRyYW5zaWVudC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX09QQ09ERV9JTkNPTVBMRVRFXHRcdDB4ZmRcdC8qIC1FQkFERSAgICovXG4mIzQzOyNkZWZpbmUgUlRQU0VfTUNVX09QQ09ERV9CQURfQ1NVTVx0XHQweGZlXHQvKiAtRUJBRE1TRyAqL1xuJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9PUENPREVfTk9UX1JFQURZXHRcdDB4ZmZcdC8qIC1FQUdBSU4gICovXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIHBvbGxpbmcgdHJhbnNwb3J0IGNhbiBzdG9wIGhlcmU6IHRoZSByZXBseSB0byB0aGlzIHJlcXVlc3QgKG9wY29kZSBhbmRcbiYjNDM7ICogc2VxX251bSksIG9yIGEgdGVybWluYWwgZXJyb3IuIFRoZSBzZXFfbnVtIHJlamVjdHMgYSBzdGFsZSByZXBseSBsZWZ0IGJ5IGFuXG4mIzQzOyAqIGFiYW5kb25lZCB0cmFuc2FjdGlvbiwgaW5zdGVhZCBvZiBkZXN5bmNpbmcgYnkgb25lIGZyYW1lLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIHJ0cHNlX21jdV9yZXNwX2lzX2ZpbmFsKGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEsXG4mIzQzO1x0XHRcdFx0XHQgICBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAocmVzcC1cdTAwM2VvcGNvZGUgPT0gcmVxLVx1MDAzZW9wY29kZSBcdTAwMjZcdTAwMjYgcmVzcC1cdTAwM2VzZXFfbnVtID09IHJlcS1cdTAwM2VzZXFfbnVtKSB8fFxuJiM0MztcdCAgICAgICByZXNwLVx1MDAzZW9wY29kZSA9PSBSVFBTRV9NQ1VfT1BDT0RFX0lOQ09NUExFVEUgfHxcbiYjNDM7XHQgICAgICAgcmVzcC1cdTAwM2VvcGNvZGUgPT0gUlRQU0VfTUNVX09QQ09ERV9CQURfQ1NVTTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogT3BhcXVlIHRvIHRyYW5zcG9ydHM7IGRlZmluZWQgaW4gcmVhbHRlay1wc2UtbWN1LWNvcmUuYy4gKi9cbiYjNDM7c3RydWN0IHJ0cHNlX21jdV9kaWFsZWN0O1xuJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbztcbiYjNDM7c3RydWN0IHJ0cHNlX21jdV9jdHJsO1xuJiM0MztcbiYjNDM7LyogUGVyLWNvbXBhdGlibGUgbWF0Y2ggZGF0YSAodGhlIG9mX21hdGNoIC5kYXRhKS4gKi9cbiYjNDM7c3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhIHtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2RpYWxlY3QgKmRpYWxlY3Q7XG4mIzQzO1x0Ym9vbCBuYXRpdmVfaTJjO1x0LyogcmF3LUkyQyBmcmFtaW5nICh2cyBTTUJ1cyk7IEkyQyB0cmFuc3BvcnQgb25seSAqL1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHJ0cHNlX21jdV90cmFuc3BvcnRfb3BzIHtcbiYjNDM7XHRpbnQgKCpzZW5kKShzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSk7XG4mIzQzO1x0aW50ICgqcmVjdikoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEsXG4mIzQzO1x0XHQgICAgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlc3ApO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHJ0cHNlX21jdV9jdHJsIHtcbiYjNDM7XHRzdHJ1Y3QgZGV2aWNlICpkZXY7XG4mIzQzO1x0c3RydWN0IHBzZV9jb250cm9sbGVyX2RldiBwY2RldjtcbiYjNDM7XHRzdHJ1Y3QgbXV0ZXggbXV0ZXg7XHQvKiBzZXJpYWxpemVzIE1DVSByZXF1ZXN0L3Jlc3BvbnNlIHRyYW5zYWN0aW9ucyAqL1xuJiM0MztcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfZGlhbGVjdCAqZGlhbGVjdDtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbyAqY2hpcDtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X3RyYW5zcG9ydF9vcHMgKnRyYW5zcG9ydDtcbiYjNDM7XHR1OCBzZXE7XHRcdFx0Lyogcm9sbGluZyByZXF1ZXN0IHNlcV9udW0sIGVjaG9lZCBieSB0aGUgTUNVICovXG4mIzQzO307XG4mIzQzO1xuJiM0MztpbnQgcnRwc2VfbWN1X3JlZ2lzdGVyKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlKTtcbiYjNDM7XG4mIzQzO2V4dGVybiBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21hdGNoX2RhdGEgcnRwc2VfbWN1X2dlbjFfZGF0YTtcbiYjNDM7ZXh0ZXJuIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMl9kYXRhO1xuJiM0MztleHRlcm4gY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhIHJ0cHNlX21jdV9nZW4yX2kyY19kYXRhO1xuJiM0MztcbiYjNDM7I2VuZGlmXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgSTJDIGFuZCBVQVJUIChzZXJkZXYpIGRyaXZlciBmb3IgUmVhbHRlayBQU0UgTUNVcy4gVGhlIEkyQyBkcml2ZXIgcmVsaWVzIG9uIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoKWAgaW4gaXRzIHByb2JlIGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIE5VTEwgZm9yIGRldmljZXMgaW5zdGFudGlhdGVkIGR5bmFtaWNhbGx5IHZpYSBzeXNmcyBgbmV3X2RldmljZWAgYmVjYXVzZSB0aGV5IGxhY2sgYSBmaXJtd2FyZSBub2RlIChmd25vZGUpLiBXaXRob3V0IGFuIGBpZF90YWJsZWAgZmFsbGJhY2ssIHRoZSBwcm9iZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBmYWlsIHdpdGggLUVOT0RFViB3aGVuIGluc3RhbnRpYXRlZCB2aWEgc3lzZnMuIEZ1cnRoZXJtb3JlLCBzZXJkZXYgZGV2aWNlcyBjYW5ub3QgYmUgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkIHZpYSBzeXNmcyBhdCBhbGwuIFNpbmNlIHN5emthbGxlciBkb2VzIG5vdCBkeW5hbWljYWxseSBpbmplY3QgRGV2aWNlIFRyZWUgbm9kZXMgb3Igc29mdHdhcmUgbm9kZXMgZm9yIGFyYml0cmFyeSBJMkMvc2VyZGV2IGRldmljZXMsIHRoaXMgZHJpdmVyIGNhbm5vdCBiZSBzdWNjZXNzZnVsbHkgcHJvYmVkIGFuZCBpdHMgY29yZSBsb2dpYyBpcyBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIFFFTVUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYjdjOTFlMjBmM2Y5MmI5OGRkMmFkZGVmZDE3ZTE3YTQ3NDFlMTQwZgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgSnVsIDI5IDA1OjQ3OjM3IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9wc2UtcGQvcmVhbHRlayxwc2UtbWN1LWdlbjEueWFtbCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcHNlLXBkL3JlYWx0ZWsscHNlLW1jdS1nZW4xLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uMGYxYTgxOWRiNDliYgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcHNlLXBkL3JlYWx0ZWsscHNlLW1jdS1nZW4xLnlhbWwKQEAgLTAsMCAmIzQzOzEsMTgwIEBACiYjNDM7IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogKEdQTC0yLjAtb25seSBPUiBCU0QtMi1DbGF1c2UpCiYjNDM7JVlBTUwgMS4yCiYjNDM7LS0tCiYjNDM7JGlkOiBodHRwOi8vZGV2aWNldHJlZS5vcmcvc2NoZW1hcy9uZXQvcHNlLXBkL3JlYWx0ZWsscHNlLW1jdS1nZW4xLnlhbWwjCiYjNDM7JHNjaGVtYTogaHR0cDovL2RldmljZXRyZWUub3JnL21ldGEtc2NoZW1hcy9jb3JlLnlhbWwjCiYjNDM7CiYjNDM7dGl0bGU6IFJlYWx0ZWsgUFNFIE1DVQomIzQzOwomIzQzO21haW50YWluZXJzOgomIzQzOyAgLSBKb25hcyBKZWxvbmVrICZsdDtqZWxvbmVrLmpvbmFzQGdtYWlsLmNvbSZndDsKJiM0MzsKJiM0MztkZXNjcmlwdGlvbjogfAomIzQzOyAgQSBtaWNyb2NvbnRyb2xsZXIgKE1DVSkgdGhhdCBtYW5hZ2VzIHRoZSBQU0UgKFBvd2VyIFNvdXJjaW5nIEVxdWlwbWVudCkKJiM0MzsgIGhhcmR3YXJlIG9uIGEgcmFuZ2Ugb2YgbWFuYWdlZCBQb0Ugc3dpdGNoZXMuIFRoZSBob3N0IENQVSB0YWxrcyBvbmx5IHRvCiYjNDM7ICB0aGlzIE1DVSAtIG92ZXIgSTJDL1NNQnVzIG9yIFVBUlQgLSB1c2luZyBhIHNtYWxsIG1lc3NhZ2UtYmFzZWQgcHJvdG9jb2w7CiYjNDM7ICB0aGUgUFNFIHNpbGljb24gaXQgZHJpdmVzIHNpdHMgYmVoaW5kIHRoZSBNQ1UgYW5kIGlzIG5ldmVyIGFjY2Vzc2VkCiYjNDM7ICBkaXJlY3RseS4gRm9yIGV4YW1wbGUsIG9uIHRoZSBaeXhlbCBHUzE5MDAtMTBIUCB0aGUgU29DIHJlYWNoZXMgdGhlIE1DVQomIzQzOyAgb3ZlciBVQVJULCBhbmQgdGhlIE1DVSBtYW5hZ2VzIHRoZSBvbi1ib2FyZCBQU0UgY2hpcC4KJiM0MzsKJiM0MzsgIFRoaXMgYmluZGluZyBkZXNjcmliZXMgdGhlIE1DVSB0b2dldGhlciB3aXRoIGl0cyBSZWFsdGVrIGZpcm13YXJlOiB0aGUKJiM0MzsgIGZpcm13YXJlIGFuZCBpdHMgaG9zdCBwcm90b2NvbCwgd2hpY2ggYXJlIHN0YWJsZSBhY3Jvc3MgYm9hcmRzLiBUaGUKJiM0MzsgIG1pY3JvY29udHJvbGxlciBzaWxpY29uIGlzIGEgZ2VuZXJhbC1wdXJwb3NlIHBhcnQgdGhhdCB2YXJpZXMsIGFuZCB0aGUKJiM0MzsgIFBTRSBzaWxpY29uIGJlaGluZCB0aGUgTUNVIChSZWFsdGVrIFJUTDgyM3gvUlRMODIzOSogb3IgQnJvYWRjb20KJiM0MzsgIEJDTTU5eHh4KSBpcyByZXBvcnRlZCBieSB0aGUgTUNVIGFuZCBkZXRlY3RlZCBhdCBydW50aW1lIC0gbmVpdGhlciBpcwomIzQzOyAgbmFtZWQgaGVyZS4KJiM0MzsKJiM0MzsgIFR3byBwcm90b2NvbCBnZW5lcmF0aW9ucyBleGlzdCwgYm90aCBSZWFsdGVrJiMzOTtzOgomIzQzOyAgICBnZW4xICBvbGRlciBib2FyZHMsIHdoZXJlIHRoZSBNQ1UgZnJvbnRzIEJyb2FkY29tIFBTRSBzaWxpY29uCiYjNDM7ICAgIGdlbjIgIHRoZSBhbHRlcmVkIHByb3RvY29sIHVzZWQgd2l0aCBSZWFsdGVrJiMzOTtzIG93biBQU0Ugc2lsaWNvbgomIzQzOwomIzQzOyAgT24gYW4gSTJDIGF0dGFjaG1lbnQgdGhlIGZyYW1pbmcgdGhlIE1DVSBmaXJtd2FyZSBleHBlY3RzIGlzIHBhcnQgb2YgdGhlCiYjNDM7ICBjb21wYXRpYmxlOiAmIzM5Oy1zbWJ1cyYjMzk7IChyZWFkcyBjYXJyeSBhIGxlYWRpbmcgY29tbWFuZCBieXRlIGFuZCBhIHJlcGVhdGVkCiYjNDM7ICBzdGFydCkgb3IgJiMzOTstaTJjJiMzOTsgKGJhcmUgYmxvY2sgd3JpdGVzIGFuZCByZWFkcykuIEEgVUFSVCBhdHRhY2htZW50IGNhcnJpZXMKJiM0MzsgIG5vIGZyYW1pbmcgc3VmZml4OyB0aGUgdHJhbnNwb3J0IGlzIGdpdmVuIGJ5IHRoZSBwYXJlbnQgJiMzOTtzZXJpYWwmIzM5OyBub2RlLgomIzQzOwomIzQzOyAgRWFjaCBib2FyZCBhZGRpdGlvbmFsbHkgY2FycmllcyBhIGRldmljZS1zcGVjaWZpYyBjb21wYXRpYmxlIHRoYXQgZmFsbHMKJiM0MzsgIGJhY2sgdG8gb25lIG9mIHRoZSBwcm90b2NvbCBjb21wYXRpYmxlcyBhYm92ZS4gRHJpdmVycyBiaW5kIG9uIHRoZQomIzQzOyAgcHJvdG9jb2wgY29tcGF0aWJsZTsgdGhlIGRldmljZS1zcGVjaWZpYyBzdHJpbmcgaWRlbnRpZmllcyB0aGUgYm9hcmQgYW5kCiYjNDM7ICByZXNlcnZlcyBhIHBsYWNlIGZvciBhIGZ1dHVyZSBwZXItYm9hcmQgcXVpcmsgd2l0aG91dCBoYXZpbmcgdG8gcmV0cm9maXQKJiM0MzsgIGRldmljZSB0cmVlcyBhbHJlYWR5IGluIHRoZSBmaWVsZC4KJiM0MzsKJiM0Mztwcm9wZXJ0aWVzOgomIzQzOyAgY29tcGF0aWJsZToKJiM0MzsgICAgb25lT2Y6CiYjNDM7ICAgICAgIyBVQVJUCiYjNDM7ICAgICAgLSBpdGVtczoKJiM0MzsgICAgICAgICAgLSBlbnVtOgomIzQzOyAgICAgICAgICAgICAgLSB6eXhlbCxnczE5MDAtMTBocC1hMS1wc2UKJiM0MzsgICAgICAgICAgLSBjb25zdDogcmVhbHRlayxwc2UtbWN1LWdlbjEKJiM0MzsKJiM0MzsgICAgICAjIEkyQywgU01CdXMgZnJhbWluZwomIzQzOyAgICAgIC0gaXRlbXM6CiYjNDM7ICAgICAgICAgIC0gZW51bToKJiM0MzsgICAgICAgICAgICAgIC0genl4ZWwsZ3MxOTIwLTI0aHAtdjItcHNlCiYjNDM7ICAgICAgICAgIC0gY29uc3Q6IHJlYWx0ZWsscHNlLW1jdS1nZW4xLXNtYnVzCiYjNDM7CiYjNDM7ICAgICAgIyBVQVJUCiYjNDM7ICAgICAgLSBpdGVtczoKJiM0MzsgICAgICAgICAgLSBlbnVtOgomIzQzOyAgICAgICAgICAgICAgLSB6eXhlbCxnczE5MDAtMTBocC1iMS1wc2UKJiM0MzsgICAgICAgICAgICAgIC0genl4ZWwseG1nMTkxNS0xMGVwLXBzZQomIzQzOyAgICAgICAgICAtIGNvbnN0OiByZWFsdGVrLHBzZS1tY3UtZ2VuMgomIzQzOwomIzQzOyAgICAgICMgSTJDLCBTTUJ1cyBmcmFtaW5nCiYjNDM7ICAgICAgLSBpdGVtczoKJiM0MzsgICAgICAgICAgLSBlbnVtOgomIzQzOyAgICAgICAgICAgICAgLSB6eXhlbCx4czE5MzAtMTJocC1wc2UKJiM0MzsgICAgICAgICAgLSBjb25zdDogcmVhbHRlayxwc2UtbWN1LWdlbjItc21idXMKJiM0MzsKJiM0MzsgICAgICAjIEkyQywgcmF3IGZyYW1pbmcKJiM0MzsgICAgICAtIGl0ZW1zOgomIzQzOyAgICAgICAgICAtIGVudW06CiYjNDM7ICAgICAgICAgICAgICAtIGxpbmtzeXMsbGdzMzI4bXBjLXYyLXBzZQomIzQzOyAgICAgICAgICAtIGNvbnN0OiByZWFsdGVrLHBzZS1tY3UtZ2VuMi1pMmMKJiM0MzsKJiM0MzsgIHJlZzoKJiM0MzsgICAgbWF4SXRlbXM6IDEKJiM0MzsKJiM0MzsgIHJlc2V0LWdwaW9zOgomIzQzOyAgICBkZXNjcmlwdGlvbjogUmVzZXQgbGluZSBvZiB0aGUgTUNVLgomIzQzOyAgICBtYXhJdGVtczogMQomIzQzOwomIzQzOyAgZGlzYWJsZS1wb3J0cy1ncGlvczoKJiM0MzsgICAgZGVzY3JpcHRpb246CiYjNDM7ICAgICAgSGFyZHdhcmUgZ2F0ZSB0aGF0IGZvcmNlcyBhbGwgcG9ydHMgaW50byBhZG1pbi1kaXNhYmxlZCBzdGF0ZSB3aGlsZQomIzQzOyAgICAgIGFzc2VydGVkLgomIzQzOyAgICBtYXhJdGVtczogMQomIzQzOwomIzQzO3JlcXVpcmVkOgomIzQzOyAgLSBjb21wYXRpYmxlCiYjNDM7CiYjNDM7YWxsT2Y6CiYjNDM7ICAtICRyZWY6IHBzZS1jb250cm9sbGVyLnlhbWwjCiYjNDM7ICAtICRyZWY6IC9zY2hlbWFzL3NlcmlhbC9zZXJpYWwtcGVyaXBoZXJhbC1wcm9wcy55YW1sIwomIzQzOyAgIyBBICYjMzk7LXNtYnVzJiMzOTsvJiMzOTstaTJjJiMzOTsgY29tcGF0aWJsZSBpcyBhbiBJMkMgYXR0YWNobWVudDogaXQgaGFzICYjMzk7cmVnJiMzOTsgYW5kCiYjNDM7ICAjIGNhbm5vdCBjYXJyeSBzZXJpYWwgYnVzIHByb3BlcnRpZXMuIEEgYmFyZSBnZW4gY29tcGF0aWJsZSBpcyBhIFVBUlQKJiM0MzsgICMgYXR0YWNobWVudDogbm8gJiMzOTtyZWcmIzM5OywgdGhlIHRyYW5zcG9ydCBjb21lcyBmcm9tIHRoZSBwYXJlbnQgc2VyaWFsIG5vZGUuCiYjNDM7ICAtIGlmOgomIzQzOyAgICAgIHByb3BlcnRpZXM6CiYjNDM7ICAgICAgICBjb21wYXRpYmxlOgomIzQzOyAgICAgICAgICBjb250YWluczoKJiM0MzsgICAgICAgICAgICBlbnVtOgomIzQzOyAgICAgICAgICAgICAgLSByZWFsdGVrLHBzZS1tY3UtZ2VuMS1zbWJ1cwomIzQzOyAgICAgICAgICAgICAgLSByZWFsdGVrLHBzZS1tY3UtZ2VuMi1zbWJ1cwomIzQzOyAgICAgICAgICAgICAgLSByZWFsdGVrLHBzZS1tY3UtZ2VuMi1pMmMKJiM0MzsgICAgdGhlbjoKJiM0MzsgICAgICByZXF1aXJlZDoKJiM0MzsgICAgICAgIC0gcmVnCiYjNDM7ICAgICAgcHJvcGVydGllczoKJiM0MzsgICAgICAgIGN1cnJlbnQtc3BlZWQ6IGZhbHNlCiYjNDM7ICAgICAgICBtYXgtc3BlZWQ6IGZhbHNlCiYjNDM7ICAgIGVsc2U6CiYjNDM7ICAgICAgcHJvcGVydGllczoKJiM0MzsgICAgICAgIHJlZzogZmFsc2UKJiM0MzsKJiM0Mzt1bmV2YWx1YXRlZFByb3BlcnRpZXM6IGZhbHNlCiYjNDM7CiYjNDM7ZXhhbXBsZXM6CiYjNDM7ICAjIFNNQnVzLWZyYW1lZCBJMkMgYXR0YWNobWVudAomIzQzOyAgLSB8CiYjNDM7ICAgIGkyYyB7CiYjNDM7ICAgICAgICAjYWRkcmVzcy1jZWxscyA9ICZsdDsxJmd0OzsKJiM0MzsgICAgICAgICNzaXplLWNlbGxzID0gJmx0OzAmZ3Q7OwomIzQzOwomIzQzOyAgICAgICAgZXRoZXJuZXQtcHNlQDIwIHsKJiM0MzsgICAgICAgICAgICBjb21wYXRpYmxlID0gJiMzNDt6eXhlbCx4czE5MzAtMTJocC1wc2UmIzM0OywgJiMzNDtyZWFsdGVrLHBzZS1tY3UtZ2VuMi1zbWJ1cyYjMzQ7OwomIzQzOyAgICAgICAgICAgIHJlZyA9ICZsdDsweDIwJmd0OzsKJiM0MzsKJiM0MzsgICAgICAgICAgICBwc2UtcGlzIHsKJiM0MzsgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSAmbHQ7MSZndDs7CiYjNDM7ICAgICAgICAgICAgICAgICNzaXplLWNlbGxzID0gJmx0OzAmZ3Q7OwomIzQzOwomIzQzOyAgICAgICAgICAgICAgICBwc2UtcGlAMCB7CiYjNDM7ICAgICAgICAgICAgICAgICAgICByZWcgPSAmbHQ7MCZndDs7CiYjNDM7ICAgICAgICAgICAgICAgICAgICAjcHNlLWNlbGxzID0gJmx0OzAmZ3Q7OwomIzQzOyAgICAgICAgICAgICAgICB9OwomIzQzOyAgICAgICAgICAgIH07CiYjNDM7ICAgICAgICB9OwomIzQzOyAgICB9OwomIzQzOwomIzQzOyAgIyBSYXctSTJDLWZyYW1lZCBhdHRhY2htZW50CiYjNDM7ICAtIHwKJiM0MzsgICAgaTJjIHsKJiM0MzsgICAgICAgICNhZGRyZXNzLWNlbGxzID0gJmx0OzEmZ3Q7OwomIzQzOyAgICAgICAgI3NpemUtY2VsbHMgPSAmbHQ7MCZndDs7CiYjNDM7CiYjNDM7ICAgICAgICBldGhlcm5ldC1wc2VAMjAgewomIzQzOyAgICAgICAgICAgIGNvbXBhdGlibGUgPSAmIzM0O2xpbmtzeXMsbGdzMzI4bXBjLXYyLXBzZSYjMzQ7LCAmIzM0O3JlYWx0ZWsscHNlLW1jdS1nZW4yLWkyYyYjMzQ7OwomIzQzOyAgICAgICAgICAgIHJlZyA9ICZsdDsweDIwJmd0OzsKJiM0MzsKJiM0MzsgICAgICAgICAgICBwc2UtcGlzIHsKJiM0MzsgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSAmbHQ7MSZndDs7CiYjNDM7ICAgICAgICAgICAgICAgICNzaXplLWNlbGxzID0gJmx0OzAmZ3Q7OwomIzQzOwomIzQzOyAgICAgICAgICAgICAgICBwc2UtcGlAMCB7CiYjNDM7ICAgICAgICAgICAgICAgICAgICByZWcgPSAmbHQ7MCZndDs7CiYjNDM7ICAgICAgICAgICAgICAgICAgICAjcHNlLWNlbGxzID0gJmx0OzAmZ3Q7OwomIzQzOyAgICAgICAgICAgICAgICB9OwomIzQzOyAgICAgICAgICAgIH07CiYjNDM7ICAgICAgICB9OwomIzQzOyAgICB9OwomIzQzOwomIzQzOyAgIyBVQVJUIGF0dGFjaG1lbnQKJiM0MzsgIC0gfAomIzQzOyAgICBzZXJpYWwgewomIzQzOyAgICAgICAgZXRoZXJuZXQtcHNlIHsKJiM0MzsgICAgICAgICAgICBjb21wYXRpYmxlID0gJiMzNDt6eXhlbCxnczE5MDAtMTBocC1hMS1wc2UmIzM0OywgJiMzNDtyZWFsdGVrLHBzZS1tY3UtZ2VuMSYjMzQ7OwomIzQzOyAgICAgICAgICAgIGN1cnJlbnQtc3BlZWQgPSAmbHQ7MTkyMDAmZ3Q7OwomIzQzOwomIzQzOyAgICAgICAgICAgIHBzZS1waXMgewomIzQzOyAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9ICZsdDsxJmd0OzsKJiM0MzsgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSAmbHQ7MCZndDs7CiYjNDM7CiYjNDM7ICAgICAgICAgICAgICAgIHBzZS1waUAwIHsKJiM0MzsgICAgICAgICAgICAgICAgICAgIHJlZyA9ICZsdDswJmd0OzsKJiM0MzsgICAgICAgICAgICAgICAgICAgICNwc2UtY2VsbHMgPSAmbHQ7MCZndDs7CiYjNDM7ICAgICAgICAgICAgICAgIH07CiYjNDM7ICAgICAgICAgICAgfTsKJiM0MzsgICAgICAgIH07CiYjNDM7ICAgIH07CmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDJkNDIwZDQwNzgyZTMuLjQzMzRjMjQ1MzA1MjggMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCiYjNDM7JiM0MzsmIzQzOyBiL01BSU5UQUlORVJTCkBAIC0yMjc2Nyw2ICYjNDM7MjI3NjcsMTMgQEAgUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL3JlYWx0ZWssb3R0by13ZHQueWFtbAogRjoJZHJpdmVycy93YXRjaGRvZy9yZWFsdGVrX290dG9fd2R0LmMKIAomIzQzO1JFQUxURUsgUFNFIE1DVSBEUklWRVIKJiM0MztNOglKb25hcyBKZWxvbmVrICZsdDtqZWxvbmVrLmpvbmFzQGdtYWlsLmNvbSZndDsKJiM0MztMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiYjNDM7UzoJTWFpbnRhaW5lZAomIzQzO0Y6CURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcHNlLXBkL3JlYWx0ZWsscHNlLW1jdS1nZW4xLnlhbWwKJiM0MztGOglkcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1KgomIzQzOwogUkVBTFRFSyBSVEw4M3h4IFNNSSBEU0EgUk9VVEVSIENISVBTCiBNOglMaW51cyBXYWxsZWlqICZsdDtsaW51c3dAa2VybmVsLm9yZyZndDsKIE06CUFsdmluIMWgaXByYWdhICZsdDthbHNpQGJhbmctb2x1ZnNlbi5kayZndDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BzZS1wZC9LY29uZmlnIGIvZHJpdmVycy9uZXQvcHNlLXBkL0tjb25maWcKaW5kZXggN2VmMjk2NTdlZTVkZC4uYTBmMmFlNjY4YzY3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHNlLXBkL0tjb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvcHNlLXBkL0tjb25maWcKQEAgLTEzLDYgJiM0MzsxMywzNCBAQCBtZW51Y29uZmlnIFBTRV9DT05UUk9MTEVSCiAKIGlmIFBTRV9DT05UUk9MTEVSCiAKJiM0Mztjb25maWcgUFNFX1JFQUxURUtfTUNVCiYjNDM7CXRyaXN0YXRlCiYjNDM7CWhlbHAKJiM0MzsJICBTaGFyZWQgY29yZSBmb3IgdGhlIFJlYWx0ZWsgUFNFIE1DVSBkcml2ZXIuIFRoaXMgaXMgc2VsZWN0ZWQKJiM0MzsJICBhdXRvbWF0aWNhbGx5IGJ5IHRoZSB0cmFuc3BvcnQgb3B0aW9ucyBiZWxvdy4KJiM0MzsKJiM0Mztjb25maWcgUFNFX1JFQUxURUtfTUNVX0kyQwomIzQzOwl0cmlzdGF0ZSAmIzM0O1JlYWx0ZWsgUFNFIE1DVSBkcml2ZXIgKEkyQyB0cmFuc3BvcnQpJiMzNDsKJiM0MzsJZGVwZW5kcyBvbiBJMkMKJiM0MzsJc2VsZWN0IFBTRV9SRUFMVEVLX01DVQomIzQzOwloZWxwCiYjNDM7CSAgRHJpdmVyIGZvciB0aGUgbWljcm9jb250cm9sbGVyIChNQ1UpIHRoYXQgZnJvbnRzIHRoZSBQU0UKJiM0MzsJICBoYXJkd2FyZSBvbiB2YXJpb3VzIFJlYWx0ZWstYmFzZWQgbWFuYWdlZCBzd2l0Y2hlcywgYXR0YWNoZWQKJiM0MzsJICB2aWEgSTJDL1NNQnVzLiBUaGUgTUNVIGV4cG9zZXMgYSBtZXNzYWdlLWJhc2VkIHByb3RvY29sOyB0aGUgYWN0dWFsCiYjNDM7CSAgUFNFIHNpbGljb24gaXMgbm90IGFjY2Vzc2VkIGRpcmVjdGx5LiBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEKJiM0MzsJICBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmVhbHRlay1wc2UtbWN1LWkyYy4KJiM0MzsKJiM0Mztjb25maWcgUFNFX1JFQUxURUtfTUNVX1VBUlQKJiM0MzsJdHJpc3RhdGUgJiMzNDtSZWFsdGVrIFBTRSBNQ1UgZHJpdmVyIChVQVJUIHRyYW5zcG9ydCkmIzM0OwomIzQzOwlkZXBlbmRzIG9uIFNFUklBTF9ERVZfQlVTCiYjNDM7CXNlbGVjdCBQU0VfUkVBTFRFS19NQ1UKJiM0MzsJaGVscAomIzQzOwkgIERyaXZlciBmb3IgdGhlIG1pY3JvY29udHJvbGxlciAoTUNVKSB0aGF0IGZyb250cyB0aGUgUFNFCiYjNDM7CSAgaGFyZHdhcmUgb24gdmFyaW91cyBSZWFsdGVrLWJhc2VkIG1hbmFnZWQgc3dpdGNoZXMsIGF0dGFjaGVkCiYjNDM7CSAgdmlhIFVBUlQuIFRoZSBNQ1UgZXhwb3NlcyBhIG1lc3NhZ2UtYmFzZWQgcHJvdG9jb2w7IHRoZSBhY3R1YWwgUFNFCiYjNDM7CSAgc2lsaWNvbiBpcyBub3QgYWNjZXNzZWQgZGlyZWN0bHkuIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYQomIzQzOwkgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByZWFsdGVrLXBzZS1tY3UtdWFydC4KJiM0MzsKIGNvbmZpZyBQU0VfUkVHVUxBVE9SCiAJdHJpc3RhdGUgJiMzNDtSZWd1bGF0b3IgYmFzZWQgUFNFIGNvbnRyb2xsZXImIzM0OwogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BzZS1wZC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3BzZS1wZC9NYWtlZmlsZQppbmRleCBjYzc4ZjdlYTdmNWY3Li45Y2NhNTkwMGZlMzQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wc2UtcGQvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvcHNlLXBkL01ha2VmaWxlCkBAIC0zLDYgJiM0MzszLDkgQEAKIAogb2JqLSQoQ09ORklHX1BTRV9DT05UUk9MTEVSKSAmIzQzOz0gcHNlX2NvcmUubwogCiYjNDM7b2JqLSQoQ09ORklHX1BTRV9SRUFMVEVLX01DVSkgJiM0Mzs9IHJlYWx0ZWstcHNlLW1jdS1jb3JlLm8KJiM0MztvYmotJChDT05GSUdfUFNFX1JFQUxURUtfTUNVX0kyQykgJiM0Mzs9IHJlYWx0ZWstcHNlLW1jdS1pMmMubwomIzQzO29iai0kKENPTkZJR19QU0VfUkVBTFRFS19NQ1VfVUFSVCkgJiM0Mzs9IHJlYWx0ZWstcHNlLW1jdS11YXJ0Lm8KIG9iai0kKENPTkZJR19QU0VfUkVHVUxBVE9SKSAmIzQzOz0gcHNlX3JlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUFNFX1BENjkyWDApICYjNDM7PSBwZDY5MngwLm8KIG9iai0kKENPTkZJR19QU0VfU0kzNDc0KSAmIzQzOz0gc2kzNDc0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtY29yZS5jIGIvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uZWQzYjc0MzQ3MGRiZgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtY29yZS5jCkBAIC0wLDAgJiM0MzsxLDk4OCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCiYjNDM7LyoKJiM0MzsgKiBEcml2ZXIgZm9yIHRoZSBtaWNyb2NvbnRyb2xsZXIgKE1DVSkgZnJvbnRpbmcgUFNFIHNpbGljb24gb24gdmFyaW91cwomIzQzOyAqIFJlYWx0ZWstYmFzZWQgbWFuYWdlZCBzd2l0Y2hlcy4gVGhlIE1DVSBzcGVha3MgYSAxMi1ieXRlIGZpeGVkLWZyYW1lCiYjNDM7ICogbWFuYWdlbWVudCBwcm90b2NvbDsgdGhpcyBkcml2ZXIgY292ZXJzIHR3byBnZW5lcmF0aW9ucyBvZiB0aGUKJiM0MzsgKiBwcm90b2NvbCB2aWEgYSBwZXItZGlhbGVjdCBvcGNvZGUgdGFibGUgYW5kIHJlc3BvbnNlIHBhcnNlcnMuCiYjNDM7ICoKJiM0MzsgKiBNYW55IFBvRSBzd2l0Y2ggZGVzaWducyBwdXQgYSBkZWRpY2F0ZWQgbWljcm9jb250cm9sbGVyIGluIGZyb250IG9mIHRoZQomIzQzOyAqIGFjdHVhbCBQU0Ugc2lsaWNvbjogdGhlIGhvc3QgQ1BVIHRhbGtzIHRvIHRoZSBNQ1Ugb3ZlciBJMkMvU01CdXMgb3IKJiM0MzsgKiBVQVJULCBhbmQgdGhlIE1DVSBpbiB0dXJuIG1hbmFnZXMgdGhlIFBTRSBjaGlwcyBvbiB0aGUgYm9hcmQuIFRoZSBNQ1UKJiM0MzsgKiBzcGVha3MgYSBzbWFsbCBtZXNzYWdlLWJhc2VkIHByb3RvY29sLiBUaGUgUFNFIGNoaXBzIHRoZW1zZWx2ZXMgYXJlIG5vdAomIzQzOyAqIGFjY2Vzc2VkIGRpcmVjdGx5OyBldmVyeXRoaW5nIGdvZXMgdGhyb3VnaCBNQ1UgY29tbWFuZHMuCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGRyaXZlciB0YXJnZXRzIHRoYXQgYXJjaGl0ZWN0dXJlIGZvciB0aGUgUmVhbHRlay1mYW1pbHkgcHJvdG9jb2wuCiYjNDM7ICogVHdvIGdlbmVyYXRpb25zIGFyZSBzdXBwb3J0ZWQ6IEdlbjEgYmVpbmcgdXNlZCBvbiBvbGRlciBzd2l0Y2hlcyB3aGVyZQomIzQzOyAqIHRoZSBNQ1UgZnJvbnRzIGFuZCBtYW5hZ2VzIEJyb2FkY29tIFBTRSBzaWxpY29uOyBHZW4yIGJlaW5nIHVzZWQgd2l0aAomIzQzOyAqIFJlYWx0ZWsgUFNFIHNpbGljb24uIFRoZSB0d28gc2hhcmUgZnJhbWUgZm9ybWF0IGFuZCBhIHN1bS1tb2QtMjU2CiYjNDM7ICogY2hlY2tzdW0gYnV0IGRpdmVyZ2Ugb24gb3Bjb2RlIG51bWJlcnMgYW5kIG9uIGEgZmV3IHJlc3BvbnNlIGxheW91dHM7CiYjNDM7ICogdGhpcyBpcyBoYW5kbGVkIGJ5IHRoZSBwZXItZGlhbGVjdCBvcGNvZGUgdGFibGUgYW5kIHBhcnNlciBob29rcy4KJiM0MzsgKgomIzQzOyAqIE91dCBvZiBzY29wZTogUFNFIGNoaXBzIHRoYXQgYXJlIGludGVyZmFjZWQgZGlyZWN0bHkgZnJvbSB0aGUgaG9zdAomIzQzOyAqIHdpdGhvdXQgYSBtYW5hZ2VtZW50IE1DVSwgTUNVIGRlc2lnbnMgdGhhdCBzcGVhayBhbiB1bnJlbGF0ZWQgcHJvdG9jb2wKJiM0MzsgKiBmYW1pbHksIGFuZCAmIzM0O2R1bWIgUFNFJiMzNDsgbW9kZXMgd2hlcmUgbm8gaG9zdCBjb250cm9sIGlzIHdpcmVkIHVwIGF0IGFsbC4KJiM0MzsgKgomIzQzOyAqIFRoaXMgY29yZSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgcHJvdG9jb2wsIGRlY29kaW5nL2VuY29kaW5nIG9mIE1DVQomIzQzOyAqIHJlc3BvbnNlcywgYW5kIHRoZSBwc2VfY29udHJvbGxlcl9vcHMgaW50ZWdyYXRpb24uIFRyYW5zcG9ydCBtb2R1bGVzCiYjNDM7ICogKHJlYWx0ZWstcHNlLW1jdS1pMmMsIHJlYWx0ZWstcHNlLW1jdS11YXJ0KSBwcm92aWRlIHRoZSBzZW5kL3JlY3YKJiM0MzsgKiBjYWxsYmFja3MuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JpdGZpZWxkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2NsZWFudXAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY29udGFpbmVyX29mLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2RlbGF5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2dwaW8vY29uc3VtZXIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvamlmZmllcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9taW5tYXguaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbW9kdWxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3Byb3BlcnR5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3BzZS1wZC9wc2UuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdW5hbGlnbmVkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtyZWFsdGVrLXBzZS1tY3UuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfREVWSUNFX0lEX1JUTDgyMzhCCQkweDAxMzgKJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOQkJMHgwMDM5CiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfREVWSUNFX0lEX1JUTDgyMzlDCQkweDAxMzkKJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9ERVZJQ0VfSURfQkNNNTkxMTEJCTB4ZTExMQomIzQzOyNkZWZpbmUgUlRQU0VfTUNVX0RFVklDRV9JRF9CQ001OTEyMQkJMHhlMTIxCiYjNDM7CiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9TVFNfRElTQUJMRUQJCTB4MDAKJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19TRUFSQ0hJTkcJCTB4MDEKJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19ERUxJVkVSSU5HCQkweDAyCiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9TVFNfVEVTVAkJCTB4MDMJLyogR2VuMS1vbmx5OyByZXNlcnZlZCBvbiBHZW4yICovCiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9TVFNfRkFVTFQJCTB4MDQKJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19PVEhFUl9GQVVMVAkJMHgwNQkvKiBHZW4xLW9ubHk7IHJlc2VydmVkIG9uIEdlbjIgKi8KJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19SRVFVRVNUSU5HCQkweDA2CiYjNDM7CiYjNDM7LyogUlRQU0VfTUNVX1BPUlRfU0VUX1BPV0VSX0xJTUlUX1RZUEUgdmFsdWVzICovCiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9QV19MSU1JVF9UWVBFX1VTRVIJMHgwMgomIzQzOwomIzQzOyNkZWZpbmUgUlRQU0VfTUNVX01BWF9QT1JUUwkJCTQ4CiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9NQVhfUFJJT1JJVFkJCTMKJiM0MzsKJiM0MzsvKiBOb21pbmFsIFBTRSByYWlsOyA4MDIuM2F0L2J0IG9wZXJhdGluZyByYW5nZS4gKi8KJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9QU0VfVk9MVEFHRV9VVgkJNTQwMDAwMDAKJiM0MzsKJiM0MztlbnVtIHJ0cHNlX21jdV9jbWQgewomIzQzOwlSVFBTRV9NQ1VfQ01EX1NFVF9HTE9CQUxfU1RBVEUsCiYjNDM7CVJUUFNFX01DVV9DTURfR0VUX1NZU1RFTV9JTkZPLAomIzQzOwlSVFBTRV9NQ1VfQ01EX0dFVF9FWFRfQ09ORklHLAomIzQzOwomIzQzOwlSVFBTRV9NQ1VfQ01EX1BPUlRfRU5BQkxFLAomIzQzOwlSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUX1RZUEUsCiYjNDM7CVJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVQsCiYjNDM7CVJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfRVhULAomIzQzOwlSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BSSU9SSVRZLAomIzQzOwlSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1NUQVRVUywKJiM0MzsJUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9QT1dFUl9TVEFUUywKJiM0MzsJUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9DT05GSUcsCiYjNDM7CVJUUFNFX01DVV9DTURfUE9SVF9HRVRfRVhUX0NPTkZJRywKJiM0MzsKJiM0MzsJUlRQU0VfTUNVX05VTV9DTURTLAomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgewomIzQzOwl1OCBvcDsKJiM0MzsJYm9vbCB2YWxpZDsKJiM0Mzt9OwomIzQzOwomIzQzOy8qIFNob3J0aGFuZCBmb3IgdGhlIGRlc2lnbmF0ZWQtaW5pdGlhbGl6ZXIgZW50cmllcyBpbiBkaWFsZWN0IG9wY29kZSB0YWJsZXMuICovCiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfT1Aob3BjKQl7IC5vcCA9IChvcGMpLCAudmFsaWQgPSB0cnVlIH0KJiM0MzsKJiM0MzsvKiBQYXJzZWQgTUNVIHJlc3BvbnNlIHN0cnVjdHVyZXMgKGRlY29kZWQgZnJvbSBydHBzZV9tY3VfbXNnIHJlcGxpZXMpICovCiYjNDM7CiYjNDM7c3RydWN0IHJ0cHNlX21jdV9pbmZvIHsKJiM0MzsJdTggbWF4X3BvcnRzOwomIzQzOwlib29sIHN5c3RlbV9lbmFibGU7CiYjNDM7CXUxNiBkZXZpY2VfaWQ7CiYjNDM7CXU4IG1jdV90eXBlOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHJ0cHNlX21jdV9leHRfY29uZmlnIHsKJiM0MzsJdTggbnVtX29mX3BzZXM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfc3RhdHVzIHsKJiM0MzsJdTggc3RzMTsKJiM0MzsJdTggc3RzMjsKJiM0MzsJdTggc3RzMzsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBydHBzZV9tY3VfcG9ydF9tZWFzdXJlbWVudCB7CiYjNDM7CXUxNiB2b2x0YWdlX3JhdzsJLyogNjQuNDVtVi9MU0IgKi8KJiM0MzsJdTE2IGN1cnJlbnRfcmF3OwkvKiAxbUEvTFNCICovCiYjNDM7CXUxNiB0ZW1wZXJhdHVyZV9yYXc7CS8qIFQobUMpID0gMTI1MCAqICgyMjAgLSByYXcpICovCiYjNDM7CXUxNiBwb3dlcl9yYXc7CQkvKiAxMDBtVy9MU0IgKi8KJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBydHBzZV9tY3VfcG9ydF9jb25maWcgewomIzQzOwlib29sIGVuYWJsZTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBydHBzZV9tY3VfcG9ydF9leHRfY29uZmlnIHsKJiM0MzsJdTggbWF4X3Bvd2VyOwomIzQzOwl1OCBwcmlvcml0eTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBydHBzZV9tY3VfZGlhbGVjdCB7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlIG9wY29kZVtSVFBTRV9NQ1VfTlVNX0NNRFNdOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBSZXNwb25zZSBwYXJzZXJzIGZvciB0aGUgZmllbGRzIHRoYXQgZGlmZmVyIGJldHdlZW4gZGlhbGVjdHM7IGVhY2gKJiM0MzsJICogZGlhbGVjdCBzdXBwbGllcyBpdHMgb3duLiBPdGhlciByZXNwb25zZXMgc2hhcmUgb25lIGxheW91dCBhbmQgYXJlCiYjNDM7CSAqIGRlY29kZWQgZGlyZWN0bHkgLSBhIGRpYWxlY3QgdGhhdCBkaXZlcmdlcyB0aGVyZSBtdXN0IGFkZCBhIGhvb2ssCiYjNDM7CSAqIGFzIGEgbWlzbWF0Y2hlZCBsYXlvdXQgY2Fubm90IGJlIGRldGVjdGVkICh0aGUgY2hlY2tzdW0gc3RpbGwgcGFzc2VzKS4KJiM0MzsJICovCiYjNDM7CXZvaWQgKCpwYXJzZV9zeXN0ZW1faW5mbykoY29uc3QgdTggKnBheWxvYWQsIHN0cnVjdCBydHBzZV9tY3VfaW5mbyAqaW5mbyk7CiYjNDM7CWludCAoKnBhcnNlX3BvcnRfY2xhc3MpKGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfcG9ydF9zdGF0dXMgKnN0YXR1cyk7CiYjNDM7CWNvbnN0IGNoYXIgKigqbWN1X3R5cGVfc3RyKSh1bnNpZ25lZCBpbnQgbWN1X3R5cGUpOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gewomIzQzOwljb25zdCBjaGFyICpuYW1lOwomIzQzOwl1MzIgbWF4X21XX3Blcl9wb3J0OwomIzQzOwllbnVtIHJ0cHNlX21jdV9jbWQgcHdfc2V0X2NtZDsJLyogY29tbWFuZCB1c2VkIGJ5IHNldF9wd19saW1pdCAqLwomIzQzOwl1MzIgcHdfc2V0X2xzYl9tVzsJCS8qIExTQiBvZiBwd19zZXRfY21kIHZhbHVlLCBpbiBtVyAqLwomIzQzOwl1MzIgcHdfcmVhZF9sc2JfbVc7CQkvKiBMU0Igb2YgZXh0X2NvbmZpZy5tYXhfcG93ZXIgcmVhZC1iYWNrLCBpbiBtVyAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfY2hpcF9pbmZvIHJ0bDgyMzhiX2luZm8gPSB7CiYjNDM7CS5tYXhfbVdfcGVyX3BvcnQgPSAzMDAwMCwKJiM0MzsJLm5hbWUgPSAmIzM0O1JUTDgyMzhCJiMzNDssCiYjNDM7CS5wd19yZWFkX2xzYl9tVyA9IDIwMCwKJiM0MzsJLnB3X3NldF9jbWQgPSBSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlULAomIzQzOwkucHdfc2V0X2xzYl9tVyA9IDIwMCwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbyBydGw4MjM5X2luZm8gPSB7CiYjNDM7CS5tYXhfbVdfcGVyX3BvcnQgPSA5MDAwMCwKJiM0MzsJLm5hbWUgPSAmIzM0O1JUTDgyMzkmIzM0OywKJiM0MzsJLnB3X3JlYWRfbHNiX21XID0gNDAwLAomIzQzOwkucHdfc2V0X2NtZCA9IFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfRVhULAomIzQzOwkucHdfc2V0X2xzYl9tVyA9IDQwMCwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbyBydGw4MjM5Y19pbmZvID0gewomIzQzOwkubWF4X21XX3Blcl9wb3J0ID0gOTAwMDAsCiYjNDM7CS5uYW1lID0gJiMzNDtSVEw4MjM5QyYjMzQ7LAomIzQzOwkucHdfcmVhZF9sc2JfbVcgPSA0MDAsCiYjNDM7CS5wd19zZXRfY21kID0gUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF9FWFQsCiYjNDM7CS5wd19zZXRfbHNiX21XID0gNDAwLAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfY2hpcF9pbmZvIGJjbTU5MTExX2luZm8gPSB7CiYjNDM7CS5tYXhfbVdfcGVyX3BvcnQgPSAzMDAwMCwKJiM0MzsJLm5hbWUgPSAmIzM0O0JDTTU5MTExJiMzNDssCiYjNDM7CS5wd19yZWFkX2xzYl9tVyA9IDIwMCwKJiM0MzsJLnB3X3NldF9jbWQgPSBSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlULAomIzQzOwkucHdfc2V0X2xzYl9tVyA9IDIwMCwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbyBiY201OTEyMV9pbmZvID0gewomIzQzOwkvKgomIzQzOwkgKiBCQ001OTEyMSBpcyBhIDYwVyBUeXBlLTMgcGFydCwgYnV0IGtub3duIGJvYXJkcyBydW4gaXQgYXQgODAyLjNhdAomIzQzOwkgKiBhbmQgdGhlIEdlbjEgZGlhbGVjdCBoYXMgb25seSB0aGUgOC1iaXQvMC4yVyBzZXQgY29tbWFuZCAoJmx0Oz01MVcpOwomIzQzOwkgKiBjYXAgYXQgdGhlIDMwVyB0aGUgaGFyZHdhcmUgYWN0dWFsbHkgb2ZmZXJzLgomIzQzOwkgKi8KJiM0MzsJLm1heF9tV19wZXJfcG9ydCA9IDMwMDAwLAomIzQzOwkubmFtZSA9ICYjMzQ7QkNNNTkxMjEmIzM0OywKJiM0MzsJLnB3X3JlYWRfbHNiX21XID0gMjAwLAomIzQzOwkucHdfc2V0X2NtZCA9IFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVQsCiYjNDM7CS5wd19zZXRfbHNiX21XID0gMjAwLAomIzQzO307CiYjNDM7CiYjNDM7LyogSGVscGVycyBhbmQgYmFzaWMgZnVuY3Rpb25zICovCiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBydHBzZV9tY3VfY3RybCAqdG9fcnRwc2VfbWN1X2N0cmwoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYpCiYjNDM7ewomIzQzOwlyZXR1cm4gY29udGFpbmVyX29mKHBjZGV2LCBzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwsIHBjZGV2KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcnRwc2VfbWN1X21zZ19pbml0KHN0cnVjdCBydHBzZV9tY3VfbXNnICptc2csIHU4IG9wY29kZSkKJiM0Mzt7CiYjNDM7CW1lbXNldChtc2csIDB4ZmYsIHNpemVvZigqbXNnKSk7CiYjNDM7CW1zZy0mZ3Q7b3Bjb2RlID0gb3Bjb2RlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdTggcnRwc2VfbWN1X2NoZWNrc3VtKGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pCiYjNDM7ewomIzQzOwl1OCBzdW0gPSAwOwomIzQzOwomIzQzOwl3aGlsZSAobGVuLS0pCiYjNDM7CQlzdW0gJiM0Mzs9ICpidWYmIzQzOyYjNDM7OwomIzQzOwlyZXR1cm4gc3VtOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9kb194ZmVyKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxLAomIzQzOwkJCSAgICAgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlc3ApCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlzY29wZWRfZ3VhcmQobXV0ZXgsICZhbXA7cHNlLSZndDttdXRleCkgewomIzQzOwkJLyogUm9sbGluZyBzZXFfbnVtIHNvIGEgbGF0ZSByZXBseSBjYW4mIzM5O3QgcGFzcyBhcyBhIGxhdGVyIG9uZS4gKi8KJiM0MzsJCXJlcS0mZ3Q7c2VxX251bSA9IHBzZS0mZ3Q7c2VxJiM0MzsmIzQzOzsKJiM0MzsJCXJlcS0mZ3Q7Y2hlY2tzdW0gPSBydHBzZV9tY3VfY2hlY2tzdW0oKHU4ICopcmVxLCBSVFBTRV9NQ1VfTVNHX1NJWkUgLSAxKTsKJiM0MzsKJiM0MzsJCXJldCA9IHBzZS0mZ3Q7dHJhbnNwb3J0LSZndDtzZW5kKHBzZSwgcmVxKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaGUgTUNVIG5lZWRzIGEgZml4ZWQgYmFzZSB0aW1lIGJldHdlZW4gYWNjZXB0aW5nIGEgcmVxdWVzdCBhbmQKJiM0MzsJCSAqIGhhdmluZyBhIHJlcGx5IHJlYWR5LCBpbmRlcGVuZGVudCBvZiB0cmFuc3BvcnQuIFBhY2UgdGhhdCBoZXJlOyB0aGUKJiM0MzsJCSAqIHRyYW5zcG9ydCB0aGVuIGZpbmlzaGVzIHJlY3YgaW4gaXRzIG93biBtb2RlbCAtIGEgYm91bmRlZCBwb2xsIG9mCiYjNDM7CQkgKiB0aGUgcmVzcG9uc2UgcmVnaXN0ZXIgKEkyQykgb3Igb25lIHdhaXQgb24gYSBwdXNoZWQgZnJhbWUgKFVBUlQpIC0KJiM0MzsJCSAqIHNvIHRoZSByZXRyeSBiZWxvbmdzIGluIHRoZSB0cmFuc3BvcnQsIG5vdCBoZXJlLgomIzQzOwkJICovCiYjNDM7CQltc2xlZXAoUlRQU0VfTUNVX1JFU1BPTlNFX01TKTsKJiM0MzsKJiM0MzsJCW1lbXNldChyZXNwLCAwLCBzaXplb2YoKnJlc3ApKTsKJiM0MzsJCXJldCA9IHBzZS0mZ3Q7dHJhbnNwb3J0LSZndDtyZWN2KHBzZSwgcmVxLCByZXNwKTsKJiM0MzsJCWlmIChyZXQpCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBFeHBsaWNpdCBNQ1UgZXJyb3Igb3Bjb2RlcyAob2JzZXJ2ZWQgb24gdGhlIEdlbjEgZGlhbGVjdDsgaGFybWxlc3MKJiM0MzsJICogdG8gY2hlY2sgZm9yIEdlbjIgdG9vKS4gQ2F0Y2ggdGhlc2UgYmVmb3JlIHRoZSBnZW5lcmljIG9wY29kZS9DUkMKJiM0MzsJICogbWlzbWF0Y2ggcGF0aCBzbyBjYWxsZXJzIHNlZSBhIG1lYW5pbmdmdWwgZXJybm8uCiYjNDM7CSAqLwomIzQzOwlzd2l0Y2ggKHJlc3AtJmd0O29wY29kZSkgewomIzQzOwljYXNlIFJUUFNFX01DVV9PUENPREVfSU5DT01QTEVURToKJiM0MzsJCXJldHVybiAtRUJBREU7CiYjNDM7CWNhc2UgUlRQU0VfTUNVX09QQ09ERV9CQURfQ1NVTToKJiM0MzsJCXJldHVybiAtRUJBRE1TRzsKJiM0MzsJY2FzZSBSVFBTRV9NQ1VfT1BDT0RFX05PVF9SRUFEWToKJiM0MzsJCXJldHVybiAtRUFHQUlOOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChyZXNwLSZndDtvcGNvZGUgIT0gcmVxLSZndDtvcGNvZGUgfHwKJiM0MzsJICAgIHJlc3AtJmd0O3NlcV9udW0gIT0gcmVxLSZndDtzZXFfbnVtIHx8CiYjNDM7CSAgICByZXNwLSZndDtjaGVja3N1bSAhPSBydHBzZV9tY3VfY2hlY2tzdW0oKHU4ICopcmVzcCwgUlRQU0VfTUNVX01TR19TSVpFIC0gMSkpCiYjNDM7CQlyZXR1cm4gLUVCQURNU0c7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X3F1ZXJ5KHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCwgdTggb3Bjb2RlLAomIzQzOwkJCQlzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfbXNnIHJlcTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcnRwc2VfbWN1X21zZ19pbml0KCZhbXA7cmVxLCBvcGNvZGUpOwomIzQzOwlyZXEucGF5bG9hZFswXSA9IHBvcnQ7CiYjNDM7CiYjNDM7CXJldCA9IHJ0cHNlX21jdV9kb194ZmVyKHBzZSwgJmFtcDtyZXEsIHJlc3ApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJaWYgKHJlc3AtJmd0O3BheWxvYWRbMF0gIT0gcG9ydCkKJiM0MzsJCXJldHVybiAtRUlPOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9jbWQoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHVuc2lnbmVkIGludCBwb3J0LCB1OCBvcGNvZGUsIHU4IGFyZykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfbXNnIHJlcSwgcmVzcDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcnRwc2VfbWN1X21zZ19pbml0KCZhbXA7cmVxLCBvcGNvZGUpOwomIzQzOwlyZXEucGF5bG9hZFswXSA9IHBvcnQ7CiYjNDM7CXJlcS5wYXlsb2FkWzFdID0gYXJnOwomIzQzOwomIzQzOwlyZXQgPSBydHBzZV9tY3VfZG9feGZlcihwc2UsICZhbXA7cmVxLCAmYW1wO3Jlc3ApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJaWYgKHJlc3AucGF5bG9hZFswXSAhPSBwb3J0IHx8IHJlc3AucGF5bG9hZFsxXSAhPSAwKQomIzQzOwkJcmV0dXJuIC1FSU87CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBHbG9iYWwgb3BlcmF0aW9ucyAqLwomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X2dldF9pbmZvKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBzdHJ1Y3QgcnRwc2VfbWN1X2luZm8gKmluZm8pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXEsIHJlc3A7CiYjNDM7CWNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CW9wYyA9ICZhbXA7cHNlLSZndDtkaWFsZWN0LSZndDtvcGNvZGVbUlRQU0VfTUNVX0NNRF9HRVRfU1lTVEVNX0lORk9dOwomIzQzOwlpZiAoIW9wYy0mZ3Q7dmFsaWQpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CXJ0cHNlX21jdV9tc2dfaW5pdCgmYW1wO3JlcSwgb3BjLSZndDtvcCk7CiYjNDM7CXJldCA9IHJ0cHNlX21jdV9kb194ZmVyKHBzZSwgJmFtcDtyZXEsICZhbXA7cmVzcCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlwc2UtJmd0O2RpYWxlY3QtJmd0O3BhcnNlX3N5c3RlbV9pbmZvKHJlc3AucGF5bG9hZCwgaW5mbyk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9nZXRfZXh0X2NvbmZpZyhzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgc3RydWN0IHJ0cHNlX21jdV9leHRfY29uZmlnICpjb25maWcpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXEsIHJlc3A7CiYjNDM7CWNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CW9wYyA9ICZhbXA7cHNlLSZndDtkaWFsZWN0LSZndDtvcGNvZGVbUlRQU0VfTUNVX0NNRF9HRVRfRVhUX0NPTkZJR107CiYjNDM7CWlmICghb3BjLSZndDt2YWxpZCkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsKJiM0MzsJcnRwc2VfbWN1X21zZ19pbml0KCZhbXA7cmVxLCBvcGMtJmd0O29wKTsKJiM0MzsJcmV0ID0gcnRwc2VfbWN1X2RvX3hmZXIocHNlLCAmYW1wO3JlcSwgJmFtcDtyZXNwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CWNvbmZpZy0mZ3Q7bnVtX29mX3BzZXMgPSByZXNwLnBheWxvYWRbNl07CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9zZXRfZ2xvYmFsX3N0YXRlKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBib29sIGVuYWJsZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfbXNnIHJlcSwgcmVzcDsKJiM0MzsJY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYzsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJb3BjID0gJmFtcDtwc2UtJmd0O2RpYWxlY3QtJmd0O29wY29kZVtSVFBTRV9NQ1VfQ01EX1NFVF9HTE9CQUxfU1RBVEVdOwomIzQzOwlpZiAoIW9wYy0mZ3Q7dmFsaWQpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CXJ0cHNlX21jdV9tc2dfaW5pdCgmYW1wO3JlcSwgb3BjLSZndDtvcCk7CiYjNDM7CXJlcS5wYXlsb2FkWzBdID0gZW5hYmxlID8gMHgxIDogMHgwOwomIzQzOwomIzQzOwlyZXQgPSBydHBzZV9tY3VfZG9feGZlcihwc2UsICZhbXA7cmVxLCAmYW1wO3Jlc3ApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0dXJuIChyZXNwLnBheWxvYWRbMF0gPT0gMHgwKSA/IDAgOiAtRUlPOwomIzQzO30KJiM0MzsKJiM0MzsvKiBQb3J0IG9wZXJhdGlvbnMgKi8KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9zdGF0dXMoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHVuc2lnbmVkIGludCBwb3J0LAomIzQzOwkJCQkgICAgIHN0cnVjdCBydHBzZV9tY3VfcG9ydF9zdGF0dXMgKnN0YXR1cykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfbXNnIHJlc3A7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CW9wYyA9ICZhbXA7cHNlLSZndDtkaWFsZWN0LSZndDtvcGNvZGVbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9TVEFUVVNdOwomIzQzOwlpZiAoIW9wYy0mZ3Q7dmFsaWQpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CXJldCA9IHJ0cHNlX21jdV9wb3J0X3F1ZXJ5KHBzZSwgcG9ydCwgb3BjLSZndDtvcCwgJmFtcDtyZXNwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXN0YXR1cy0mZ3Q7c3RzMSA9IHJlc3AucGF5bG9hZFsxXTsKJiM0MzsJc3RhdHVzLSZndDtzdHMyID0gcmVzcC5wYXlsb2FkWzJdOwomIzQzOwlzdGF0dXMtJmd0O3N0czMgPSByZXNwLnBheWxvYWRbM107CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9tZWFzdXJlbWVudChzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgdW5zaWduZWQgaW50IHBvcnQsCiYjNDM7CQkJCQkgIHN0cnVjdCBydHBzZV9tY3VfcG9ydF9tZWFzdXJlbWVudCAqbWVhc3VyZW1lbnQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSAqb3BjOwomIzQzOwlzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXNwOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlvcGMgPSAmYW1wO3BzZS0mZ3Q7ZGlhbGVjdC0mZ3Q7b3Bjb2RlW1JUUFNFX01DVV9DTURfUE9SVF9HRVRfUE9XRVJfU1RBVFNdOwomIzQzOwlpZiAoIW9wYy0mZ3Q7dmFsaWQpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CXJldCA9IHJ0cHNlX21jdV9wb3J0X3F1ZXJ5KHBzZSwgcG9ydCwgb3BjLSZndDtvcCwgJmFtcDtyZXNwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CW1lYXN1cmVtZW50LSZndDt2b2x0YWdlX3JhdyA9IGdldF91bmFsaWduZWRfYmUxNigmYW1wO3Jlc3AucGF5bG9hZFsxXSk7CiYjNDM7CW1lYXN1cmVtZW50LSZndDtjdXJyZW50X3JhdyA9IGdldF91bmFsaWduZWRfYmUxNigmYW1wO3Jlc3AucGF5bG9hZFszXSk7CiYjNDM7CW1lYXN1cmVtZW50LSZndDt0ZW1wZXJhdHVyZV9yYXcgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmFtcDtyZXNwLnBheWxvYWRbNV0pOwomIzQzOwltZWFzdXJlbWVudC0mZ3Q7cG93ZXJfcmF3ID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZhbXA7cmVzcC5wYXlsb2FkWzddKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfZ2V0X2NvbmZpZyhzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgdW5zaWduZWQgaW50IHBvcnQsCiYjNDM7CQkJCSAgICAgc3RydWN0IHJ0cHNlX21jdV9wb3J0X2NvbmZpZyAqY29uZmlnKQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYzsKJiM0MzsJc3RydWN0IHJ0cHNlX21jdV9tc2cgcmVzcDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJb3BjID0gJmFtcDtwc2UtJmd0O2RpYWxlY3QtJmd0O29wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0NPTkZJR107CiYjNDM7CWlmICghb3BjLSZndDt2YWxpZCkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsKJiM0MzsJcmV0ID0gcnRwc2VfbWN1X3BvcnRfcXVlcnkocHNlLCBwb3J0LCBvcGMtJmd0O29wLCAmYW1wO3Jlc3ApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJY29uZmlnLSZndDtlbmFibGUgPSAocmVzcC5wYXlsb2FkWzFdID09IDEpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfZXh0X2NvbmZpZyhzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgdW5zaWduZWQgaW50IHBvcnQsCiYjNDM7CQkJCQkgc3RydWN0IHJ0cHNlX21jdV9wb3J0X2V4dF9jb25maWcgKmNvbmZpZykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfbXNnIHJlc3A7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CW9wYyA9ICZhbXA7cHNlLSZndDtkaWFsZWN0LSZndDtvcGNvZGVbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9FWFRfQ09ORklHXTsKJiM0MzsJaWYgKCFvcGMtJmd0O3ZhbGlkKQomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwomIzQzOwlyZXQgPSBydHBzZV9tY3VfcG9ydF9xdWVyeShwc2UsIHBvcnQsIG9wYy0mZ3Q7b3AsICZhbXA7cmVzcCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwljb25maWctJmd0O21heF9wb3dlciA9IHJlc3AucGF5bG9hZFszXTsKJiM0MzsJY29uZmlnLSZndDtwcmlvcml0eSA9IHJlc3AucGF5bG9hZFs0XTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfc2V0X3N0YXRlKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCwgYm9vbCBlbmFibGUpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSAqb3BjOwomIzQzOwomIzQzOwlvcGMgPSAmYW1wO3BzZS0mZ3Q7ZGlhbGVjdC0mZ3Q7b3Bjb2RlW1JUUFNFX01DVV9DTURfUE9SVF9FTkFCTEVdOwomIzQzOwlpZiAoIW9wYy0mZ3Q7dmFsaWQpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CXJldHVybiBydHBzZV9tY3VfcG9ydF9jbWQocHNlLCBwb3J0LCBvcGMtJmd0O29wLCBlbmFibGUgPyAweDEgOiAweDApOwomIzQzO30KJiM0MzsKJiM0MzsvKiBQU0UgY29udHJvbGxlciBvcHMgKi8KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9hZG1pbl9zdGF0ZShzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkLAomIzQzOwkJCQkJICBzdHJ1Y3QgcHNlX2FkbWluX3N0YXRlICphZG1pbl9zdGF0ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpOwomIzQzOwlzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfY29uZmlnIGNvbmZpZzsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X2NvbmZpZyhwc2UsIGlkLCAmYW1wO2NvbmZpZyk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlhZG1pbl9zdGF0ZS0mZ3Q7YzMzX2FkbWluX3N0YXRlID0gY29uZmlnLmVuYWJsZSA/IEVUSFRPT0xfQzMzX1BTRV9BRE1JTl9TVEFURV9FTkFCTEVEIDoKJiM0MzsJCQkJCQkgICAgICAgRVRIVE9PTF9DMzNfUFNFX0FETUlOX1NUQVRFX0RJU0FCTEVEOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHdfc3RhdHVzKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQsCiYjNDM7CQkJCQlzdHJ1Y3QgcHNlX3B3X3N0YXR1cyAqcHdfc3RhdHVzKQomIzQzO3sKJiM0MzsJc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfcG9ydF9zdGF0dXMgc3RhdHVzOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBydHBzZV9tY3VfcG9ydF9nZXRfc3RhdHVzKHBzZSwgaWQsICZhbXA7c3RhdHVzKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXN3aXRjaCAoc3RhdHVzLnN0czEpIHsKJiM0MzsJY2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfRElTQUJMRUQ6CiYjNDM7CQlwd19zdGF0dXMtJmd0O2MzM19wd19zdGF0dXMgPSBFVEhUT09MX0MzM19QU0VfUFdfRF9TVEFUVVNfRElTQUJMRUQ7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfU0VBUkNISU5HOgomIzQzOwljYXNlIFJUUFNFX01DVV9QT1JUX1NUU19SRVFVRVNUSU5HOgomIzQzOwkJcHdfc3RhdHVzLSZndDtjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX1NFQVJDSElORzsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFJUUFNFX01DVV9QT1JUX1NUU19ERUxJVkVSSU5HOgomIzQzOwkJcHdfc3RhdHVzLSZndDtjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX0RFTElWRVJJTkc7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfVEVTVDoKJiM0MzsJCXB3X3N0YXR1cy0mZ3Q7YzMzX3B3X3N0YXR1cyA9IEVUSFRPT0xfQzMzX1BTRV9QV19EX1NUQVRVU19URVNUOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUlRQU0VfTUNVX1BPUlRfU1RTX0ZBVUxUOgomIzQzOwkJcHdfc3RhdHVzLSZndDtjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX0ZBVUxUOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUlRQU0VfTUNVX1BPUlRfU1RTX09USEVSX0ZBVUxUOgomIzQzOwkJcHdfc3RhdHVzLSZndDtjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX09USEVSRkFVTFQ7CiYjNDM7CQlicmVhazsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCXB3X3N0YXR1cy0mZ3Q7YzMzX3B3X3N0YXR1cyA9IEVUSFRPT0xfQzMzX1BTRV9QV19EX1NUQVRVU19VTktOT1dOOwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfZ2V0X3B3X2NsYXNzKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTsKJiM0MzsJc3RydWN0IHJ0cHNlX21jdV9wb3J0X3N0YXR1cyBzdGF0dXM7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJ0cHNlX21jdV9wb3J0X2dldF9zdGF0dXMocHNlLCBpZCwgJmFtcDtzdGF0dXMpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQXMgcGVyIGRhdGFzaGVldCwgdGhlIGNsYXNzaWZpY2F0aW9uIHJlc3VsdCBpcyBvbmx5IHZhbGlkIHdoZW4gaW4KJiM0MzsJICogb25lIG9mIHRob3NlIG9wZXJhdGlvbmFsIG1vZGVzLCBvdGhlcndpc2Ugbm90LgomIzQzOwkgKi8KJiM0MzsJc3dpdGNoIChzdGF0dXMuc3RzMSkgewomIzQzOwljYXNlIFJUUFNFX01DVV9QT1JUX1NUU19ESVNBQkxFRDoKJiM0MzsJY2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfU0VBUkNISU5HOgomIzQzOwljYXNlIFJUUFNFX01DVV9QT1JUX1NUU19ERUxJVkVSSU5HOgomIzQzOwljYXNlIFJUUFNFX01DVV9QT1JUX1NUU19SRVFVRVNUSU5HOgomIzQzOwkJcmV0dXJuIHBzZS0mZ3Q7ZGlhbGVjdC0mZ3Q7cGFyc2VfcG9ydF9jbGFzcygmYW1wO3N0YXR1cyk7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQkvKgomIzQzOwkJICogTm8gY2xhc3MgdG8gcmVwb3J0LCByZXR1cm4gMCBpbnN0ZWFkLiBUaGlzIGlzIGluZGlzdGluZ3Vpc2hhYmxlCiYjNDM7CQkgKiBmcm9tIGEgcmVhbCBjbGFzcy0wIFBEIGJ1dCB1c2Vyc3BhY2UgZGlzYW1iaWd1YXRlcyB2aWEgdGhlCiYjNDM7CQkgKiBwb3dlciBzdGF0dXMuCiYjNDM7CQkgKi8KJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfZ2V0X2FjdHVhbF9wdyhzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkKQomIzQzO3sKJiM0MzsJc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfcG9ydF9tZWFzdXJlbWVudCBtZWFzdXJlbWVudDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X21lYXN1cmVtZW50KHBzZSwgaWQsICZhbXA7bWVhc3VyZW1lbnQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyogMTAwbVcgcGVyIExTQiAqLwomIzQzOwlyZXR1cm4gbWVhc3VyZW1lbnQucG93ZXJfcmF3ICogMTAwVTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfdm9sdGFnZShzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkKQomIzQzO3sKJiM0MzsJc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfcG9ydF9tZWFzdXJlbWVudCBtZWFzdXJlbWVudDsKJiM0MzsJaW50IHJldDsKJiM0MzsJdTMyIHVWOwomIzQzOwomIzQzOwlyZXQgPSBydHBzZV9tY3VfcG9ydF9nZXRfbWVhc3VyZW1lbnQocHNlLCBpZCwgJmFtcDttZWFzdXJlbWVudCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwkvKiA2NC40NW1WIHBlciBMU0IgKi8KJiM0MzsJdVYgPSBtZWFzdXJlbWVudC52b2x0YWdlX3JhdyAqIDY0NDUwVTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogSWRsZSBwb3J0cyBtZWFzdXJlIDBWLCB3aGljaCB0aGUgY29yZSByZWplY3RzIHdoZW4gdHVybmluZyBhIHBvd2VyCiYjNDM7CSAqIGxpbWl0IGludG8gYSBjdXJyZW50IGxpbWl0LiBGYWxsIGJhY2sgdG8gdGhlIG5vbWluYWwgcmFpbCBzbyBhIGxpbWl0CiYjNDM7CSAqIGNhbiBiZSBzZXQgYmVmb3JlIGEgUEQgaXMgYXR0YWNoZWQuCiYjNDM7CSAqLwomIzQzOwlpZiAoIXVWKQomIzQzOwkJcmV0dXJuIFJUUFNFX01DVV9QU0VfVk9MVEFHRV9VVjsKJiM0MzsKJiM0MzsJcmV0dXJuIG1pbl90KHUzMiwgdVYsIElOVF9NQVgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2VuYWJsZShzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJ0cHNlX21jdV9wb3J0X3NldF9zdGF0ZSh0b19ydHBzZV9tY3VfY3RybChwY2RldiksIGlkLCB0cnVlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9kaXNhYmxlKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gcnRwc2VfbWN1X3BvcnRfc2V0X3N0YXRlKHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KSwgaWQsIGZhbHNlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHdfbGltaXQoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpOwomIzQzOwlzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfZXh0X2NvbmZpZyBjb25maWc7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJ0cHNlX21jdV9wb3J0X2dldF9leHRfY29uZmlnKHBzZSwgaWQsICZhbXA7Y29uZmlnKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldHVybiBjb25maWcubWF4X3Bvd2VyICogcHNlLSZndDtjaGlwLSZndDtwd19yZWFkX2xzYl9tVzsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9zZXRfcHdfbGltaXQoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZCwgaW50IG1heF9tVykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICp0eXBlX29wYywgKnZhbF9vcGM7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpOwomIzQzOwljb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbyAqY2hpcCA9IHBzZS0mZ3Q7Y2hpcDsKJiM0MzsJdTggcHJnX3ZhbDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJaWYgKG1heF9tVyAmbHQ7IDAgfHwgbWF4X21XICZndDsgY2hpcC0mZ3Q7bWF4X21XX3Blcl9wb3J0KQomIzQzOwkJcmV0dXJuIC1FUkFOR0U7CiYjNDM7CiYjNDM7CXR5cGVfb3BjID0gJmFtcDtwc2UtJmd0O2RpYWxlY3QtJmd0O29wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUX1RZUEVdOwomIzQzOwl2YWxfb3BjID0gJmFtcDtwc2UtJmd0O2RpYWxlY3QtJmd0O29wY29kZVtjaGlwLSZndDtwd19zZXRfY21kXTsKJiM0MzsJLyogcHdfc2V0X2xzYl9tVyBpcyB0aGUgZGl2aXNvciBiZWxvdzsgcmVqZWN0IGEgY2hpcCB0aGF0IGxhY2tzIGl0LiAqLwomIzQzOwlpZiAoIXR5cGVfb3BjLSZndDt2YWxpZCB8fCAhdmFsX29wYy0mZ3Q7dmFsaWQgfHwgIWNoaXAtJmd0O3B3X3NldF9sc2JfbVcpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFN3aXRjaCB0aGUgcG9ydCB0byB1c2VyLWRlZmluZWQgbGltaXQgbW9kZSBmaXJzdCwgdGhlbiBwcm9ncmFtIHRoZQomIzQzOwkgKiBsaW1pdCB2YWx1ZS4gSWYgdGhlIHNlY29uZCBjbWQgZmFpbHMsIHRoZSBwb3J0IGlzIGxlZnQgaW4KJiM0MzsJICogdXNlci1kZWZpbmVkIG1vZGUgYnV0IHdpdGggdGhlIHByZXZpb3VzIGxpbWl0IHZhbHVlOyB0aGUgbmV4dAomIzQzOwkgKiBzdWNjZXNzZnVsIHNldF9wd19saW1pdCBjYWxsIHJlY292ZXJzIGl0LgomIzQzOwkgKi8KJiM0MzsJcmV0ID0gcnRwc2VfbWN1X3BvcnRfY21kKHBzZSwgaWQsIHR5cGVfb3BjLSZndDtvcCwgUlRQU0VfTUNVX1BPUlRfUFdfTElNSVRfVFlQRV9VU0VSKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFJvdW5kIHVwIHNvIGEgc3ViLUxTQiByZXF1ZXN0IG1hcHMgdG8gb25lIExTQiwgbm90IHNpbGVudGx5IHRvIDA7CiYjNDM7CSAqIGFuIGV4cGxpY2l0IDAgc3RpbGwgeWllbGRzIDAsIGFuZCBMU0ItYWxpZ25lZCBtYXhpbWEgY2FuJiMzOTt0IG92ZXJzaG9vdC4KJiM0MzsJICovCiYjNDM7CXByZ192YWwgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIERJVl9ST1VORF9VUChtYXhfbVcsIGNoaXAtJmd0O3B3X3NldF9sc2JfbVcpLCBVOF9NQVgpOwomIzQzOwomIzQzOwlyZXR1cm4gcnRwc2VfbWN1X3BvcnRfY21kKHBzZSwgaWQsIHZhbF9vcGMtJmd0O29wLCBwcmdfdmFsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHdfbGltaXRfcmFuZ2VzKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQsCiYjNDM7CQkJCQkgICAgICBzdHJ1Y3QgcHNlX3B3X2xpbWl0X3JhbmdlcyAqb3V0KQomIzQzO3sKJiM0MzsJc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7CiYjNDM7CXN0cnVjdCBldGh0b29sX2MzM19wc2VfcHdfbGltaXRfcmFuZ2UgKnJhbmdlOwomIzQzOwomIzQzOwlyYW5nZSA9IGt6YWxsb2Nfb2JqKCpyYW5nZSk7CiYjNDM7CWlmICghcmFuZ2UpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJcmFuZ2VbMF0ubWluID0gMDsKJiM0MzsJcmFuZ2VbMF0ubWF4ID0gcHNlLSZndDtjaGlwLSZndDttYXhfbVdfcGVyX3BvcnQ7CiYjNDM7CiYjNDM7CW91dC0mZ3Q7YzMzX3B3X2xpbWl0X3JhbmdlcyA9IHJhbmdlOwomIzQzOwlyZXR1cm4gMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHJpbyhzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkKQomIzQzO3sKJiM0MzsJc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfcG9ydF9leHRfY29uZmlnIGNvbmZpZzsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X2V4dF9jb25maWcocHNlLCBpZCwgJmFtcDtjb25maWcpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0dXJuIGNvbmZpZy5wcmlvcml0eTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9zZXRfcHJpbyhzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkLCB1bnNpZ25lZCBpbnQgcHJpbykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpOwomIzQzOwljb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSAqb3BjOwomIzQzOwomIzQzOwlpZiAocHJpbyAmZ3Q7IFJUUFNFX01DVV9QT1JUX01BWF9QUklPUklUWSkKJiM0MzsJCXJldHVybiAtRVJBTkdFOwomIzQzOwomIzQzOwlvcGMgPSAmYW1wO3BzZS0mZ3Q7ZGlhbGVjdC0mZ3Q7b3Bjb2RlW1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUFJJT1JJVFldOwomIzQzOwlpZiAoIW9wYy0mZ3Q7dmFsaWQpCiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CiYjNDM7CXJldHVybiBydHBzZV9tY3VfcG9ydF9jbWQocHNlLCBpZCwgb3BjLSZndDtvcCwgcHJpbyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfb3BzIHJ0cHNlX21jdV9vcHMgPSB7CiYjNDM7CS5waV9nZXRfYWRtaW5fc3RhdGUgPSBydHBzZV9tY3VfcG9ydF9nZXRfYWRtaW5fc3RhdGUsCiYjNDM7CS5waV9nZXRfcHdfc3RhdHVzID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3B3X3N0YXR1cywKJiM0MzsJLnBpX2dldF9wd19jbGFzcyA9IHJ0cHNlX21jdV9wb3J0X2dldF9wd19jbGFzcywKJiM0MzsJLnBpX2dldF9hY3R1YWxfcHcgPSBydHBzZV9tY3VfcG9ydF9nZXRfYWN0dWFsX3B3LAomIzQzOwkucGlfZW5hYmxlID0gcnRwc2VfbWN1X3BvcnRfZW5hYmxlLAomIzQzOwkucGlfZGlzYWJsZSA9IHJ0cHNlX21jdV9wb3J0X2Rpc2FibGUsCiYjNDM7CS5waV9nZXRfdm9sdGFnZSA9IHJ0cHNlX21jdV9wb3J0X2dldF92b2x0YWdlLAomIzQzOwkucGlfZ2V0X3B3X2xpbWl0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3B3X2xpbWl0LAomIzQzOwkucGlfc2V0X3B3X2xpbWl0ID0gcnRwc2VfbWN1X3BvcnRfc2V0X3B3X2xpbWl0LAomIzQzOwkucGlfZ2V0X3B3X2xpbWl0X3JhbmdlcyA9IHJ0cHNlX21jdV9wb3J0X2dldF9wd19saW1pdF9yYW5nZXMsCiYjNDM7CS5waV9nZXRfcHJpbyA9IHJ0cHNlX21jdV9wb3J0X2dldF9wcmlvLAomIzQzOwkucGlfc2V0X3ByaW8gPSBydHBzZV9tY3VfcG9ydF9zZXRfcHJpbywKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X2Rpc2NvdmVyKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBzdHJ1Y3QgcnRwc2VfbWN1X2luZm8gKmluZm8pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcnRwc2VfbWN1X2V4dF9jb25maWcgZXh0X2NvbmZpZzsKJiM0MzsJdW5zaWduZWQgbG9uZyBkZWFkbGluZTsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQSBib290aW5nIE1DVSBtYXkgc3RheSBzaWxlbnQgKC1FVElNRURPVVQpLCBub3QgQUNLIGl0cyBhZGRyZXNzCiYjNDM7CSAqICgtRU5YSU8gLyAtRVJFTU9URUlPKSwgcmVwb3J0IG5vdC1yZWFkeSAoLUVBR0FJTiksIG9yIGVtaXQgYQomIzQzOwkgKiBjb3JydXB0L3BhcnRpYWwgZnJhbWUgKC1FQkFETVNHIC8gLUVCQURFKS4gUmV0cnkgdGhvc2Ugd2l0aGluIGEKJiM0MzsJICogYm91bmRlZCB3aW5kb3c7IG90aGVyIGVycm9ycyAoZS5nLiAtRU9QTk9UU1VQUCkgYXJlIGZhdGFsIGFuZCBmYWlsCiYjNDM7CSAqIGltbWVkaWF0ZWx5LgomIzQzOwkgKi8KJiM0MzsJZGVhZGxpbmUgPSBqaWZmaWVzICYjNDM7IG1zZWNzX3RvX2ppZmZpZXMoUlRQU0VfTUNVX0JPT1RfVElNRU9VVF9NUyk7CiYjNDM7CWRvIHsKJiM0MzsJCXJldCA9IHJ0cHNlX21jdV9nZXRfaW5mbyhwc2UsIGluZm8pOwomIzQzOwkJaWYgKHJldCAhPSAtRVRJTUVET1VUICZhbXA7JmFtcDsgcmV0ICE9IC1FTlhJTyAmYW1wOyZhbXA7IHJldCAhPSAtRVJFTU9URUlPICZhbXA7JmFtcDsKJiM0MzsJCSAgICByZXQgIT0gLUVBR0FJTiAmYW1wOyZhbXA7IHJldCAhPSAtRUJBRE1TRyAmYW1wOyZhbXA7IHJldCAhPSAtRUJBREUpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQltc2xlZXAoUlRQU0VfTUNVX0JPT1RfUkVUUllfTVMpOwomIzQzOwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBkZWFkbGluZSkpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLSZndDtkZXYsIHJldCwgJiMzNDtmYWlsZWQgdG8gcmVhZCBNQ1UgaW5mb1xuJiMzNDspOwomIzQzOwomIzQzOwlzd2l0Y2ggKGluZm8tJmd0O2RldmljZV9pZCkgewomIzQzOwljYXNlIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOEI6CiYjNDM7CQlwc2UtJmd0O2NoaXAgPSAmYW1wO3J0bDgyMzhiX2luZm87CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBSVFBTRV9NQ1VfREVWSUNFX0lEX1JUTDgyMzk6CiYjNDM7CQlwc2UtJmd0O2NoaXAgPSAmYW1wO3J0bDgyMzlfaW5mbzsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOUM6CiYjNDM7CQlwc2UtJmd0O2NoaXAgPSAmYW1wO3J0bDgyMzljX2luZm87CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBSVFBTRV9NQ1VfREVWSUNFX0lEX0JDTTU5MTExOgomIzQzOwkJcHNlLSZndDtjaGlwID0gJmFtcDtiY201OTExMV9pbmZvOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUlRQU0VfTUNVX0RFVklDRV9JRF9CQ001OTEyMToKJiM0MzsJCXBzZS0mZ3Q7Y2hpcCA9ICZhbXA7YmNtNTkxMjFfaW5mbzsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLSZndDtkZXYsIC1FSU5WQUwsICYjMzQ7dW5rbm93biBQU0UgaWQgMHgleFxuJiMzNDssCiYjNDM7CQkJCSAgICAgaW5mby0mZ3Q7ZGV2aWNlX2lkKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIWluZm8tJmd0O21heF9wb3J0cyB8fCBpbmZvLSZndDttYXhfcG9ydHMgJmd0OyBSVFBTRV9NQ1VfTUFYX1BPUlRTKQomIzQzOwkJcmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLSZndDtkZXYsIC1FSU5WQUwsCiYjNDM7CQkJCSAgICAgJiMzNDtNQ1UgcmVwb3J0cyBpbnZhbGlkIHBvcnQgY291bnQgJXVcbiYjMzQ7LCBpbmZvLSZndDttYXhfcG9ydHMpOwomIzQzOwomIzQzOwlyZXQgPSBydHBzZV9tY3VfZ2V0X2V4dF9jb25maWcocHNlLCAmYW1wO2V4dF9jb25maWcpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLSZndDtkZXYsIHJldCwgJiMzNDtmYWlsZWQgdG8gcmVhZCBNQ1UgZXh0IGNvbmZpZ1xuJiMzNDspOwomIzQzOwomIzQzOwlkZXZfaW5mbyhwc2UtJmd0O2RldiwgJiMzNDslcyBNQ1UsICVzIChpZCAweCUwNHgpLCAldSBwb3J0cyBhY3Jvc3MgJXUgUFNFIGNoaXAocylcbiYjMzQ7LAomIzQzOwkJIHBzZS0mZ3Q7ZGlhbGVjdC0mZ3Q7bWN1X3R5cGVfc3RyKGluZm8tJmd0O21jdV90eXBlKSwgcHNlLSZndDtjaGlwLSZndDtuYW1lLAomIzQzOwkJIGluZm8tJmd0O2RldmljZV9pZCwgaW5mby0mZ3Q7bWF4X3BvcnRzLCBleHRfY29uZmlnLm51bV9vZl9wc2VzKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ0cHNlX21jdV9nbG9iYWxfZGlzYWJsZSh2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSBkYXRhOwomIzQzOwomIzQzOwlydHBzZV9tY3Vfc2V0X2dsb2JhbF9zdGF0ZShwc2UsIGZhbHNlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IHJ0cHNlX21jdV9yZWdpc3RlcihzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSkKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSAqbWF0Y2g7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfaW5mbyBpbmZvOwomIzQzOwlzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvZDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgcnRwc2VfbWN1X21zZykgIT0gUlRQU0VfTUNVX01TR19TSVpFKTsKJiM0MzsKJiM0MzsJcmV0ID0gZGV2bV9tdXRleF9pbml0KHBzZS0mZ3Q7ZGV2LCAmYW1wO3BzZS0mZ3Q7bXV0ZXgpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJbWF0Y2ggPSBkZXZpY2VfZ2V0X21hdGNoX2RhdGEocHNlLSZndDtkZXYpOwomIzQzOwlpZiAoIW1hdGNoKQomIzQzOwkJcmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLSZndDtkZXYsIC1FTk9ERVYsICYjMzQ7bWlzc2luZyBtYXRjaCBkYXRhXG4mIzM0Oyk7CiYjNDM7CXBzZS0mZ3Q7ZGlhbGVjdCA9IG1hdGNoLSZndDtkaWFsZWN0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBDYXRjaCBhIGRpYWxlY3QgdGhhdCBmb3Jnb3QgdG8gc2V0IG9uZSBvZiB0aGUgcmVxdWlyZWQgaG9va3MgYXQKJiM0MzsJICogcHJvYmUgdGltZSwgcmF0aGVyIHRoYW4gTlVMTC1kZXJlZiYjMzk7aW5nIGxhdGVyIGZyb20gYSBmYXN0IHBhdGguCiYjNDM7CSAqLwomIzQzOwlpZiAoIXBzZS0mZ3Q7ZGlhbGVjdCB8fAomIzQzOwkgICAgIXBzZS0mZ3Q7ZGlhbGVjdC0mZ3Q7cGFyc2Vfc3lzdGVtX2luZm8gfHwKJiM0MzsJICAgICFwc2UtJmd0O2RpYWxlY3QtJmd0O3BhcnNlX3BvcnRfY2xhc3MgfHwKJiM0MzsJICAgICFwc2UtJmd0O2RpYWxlY3QtJmd0O21jdV90eXBlX3N0cikKJiM0MzsJCXJldHVybiBkZXZfZXJyX3Byb2JlKHBzZS0mZ3Q7ZGV2LCAtRUlOVkFMLAomIzQzOwkJCQkgICAgICYjMzQ7ZGlhbGVjdCBmb3IgY2hpcCBpcyBpbmNvbXBsZXRlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFJlbGVhc2UgdGhlIE1DVSBmcm9tIHJlc2V0IGJlZm9yZSB0aGUgZmlyc3QgdHJhbnNhY3Rpb247IHRoZQomIzQzOwkgKiBib290LXJldHJ5IGxvb3AgaW4gZGlzY292ZXIoKSB3YWl0cyBmb3IgaXQgdG8gYW5zd2VyLgomIzQzOwkgKi8KJiM0MzsJZ3Bpb2QgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChwc2UtJmd0O2RldiwgJiMzNDtyZXNldCYjMzQ7LCBHUElPRF9PVVRfTE9XKTsKJiM0MzsJaWYgKElTX0VSUihncGlvZCkpCiYjNDM7CQlyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtJmd0O2RldiwgUFRSX0VSUihncGlvZCksCiYjNDM7CQkJCSAgICAgJiMzNDtmYWlsZWQgdG8gZ2V0IHJlc2V0IGdwaW9cbiYjMzQ7KTsKJiM0MzsKJiM0MzsJcmV0ID0gcnRwc2VfbWN1X2Rpc2NvdmVyKHBzZSwgJmFtcDtpbmZvKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFNvbWUgYm9hcmRzIGdhdGUgYWxsIHBvcnRzIHRocm91Z2ggYSBoYXJkd2FyZSBsaW5lOyBkZWFzc2VydCBpdCBvbmx5CiYjNDM7CSAqIG9uY2UgdGhlIE1DVSBpcyBjb25maXJtZWQgcHJlc2VudCwgc28gYSBmYWlsZWQgcHJvYmUgbGVhdmVzIHRoZSBwb3J0cwomIzQzOwkgKiBnYXRlZC4gRnJvbSBoZXJlIHRoZSBNQ1UgcHJvdG9jb2wgZ292ZXJucyBwZXItcG9ydCBhZG1pbiBzdGF0ZS4KJiM0MzsJICovCiYjNDM7CWdwaW9kID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwocHNlLSZndDtkZXYsICYjMzQ7ZGlzYWJsZS1wb3J0cyYjMzQ7LCBHUElPRF9PVVRfTE9XKTsKJiM0MzsJaWYgKElTX0VSUihncGlvZCkpCiYjNDM7CQlyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtJmd0O2RldiwgUFRSX0VSUihncGlvZCksCiYjNDM7CQkJCSAgICAgJiMzNDtmYWlsZWQgdG8gZ2V0IGRpc2FibGUtcG9ydHMgZ3Bpb1xuJiMzNDspOwomIzQzOwomIzQzOwlpZiAoIWluZm8uc3lzdGVtX2VuYWJsZSkgewomIzQzOwkJcmV0ID0gcnRwc2VfbWN1X3NldF9nbG9iYWxfc3RhdGUocHNlLCB0cnVlKTsKJiM0MzsJCS8qIERpYWxlY3RzIHdpdGhvdXQgYSBnbG9iYWwtc3RhdGUgY29uY2VwdCAoZS5nLiBHZW4xKSByZXR1cm4KJiM0MzsJCSAqIC1FT1BOT1RTVVBQOyB0cmVhdCB0aGF0IGFzICYjMzQ7bm8gc2VwYXJhdGUgZW5hYmxlIHJlcXVpcmVkJiMzNDsuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChyZXQgJmFtcDsmYW1wOyByZXQgIT0gLUVPUE5PVFNVUFApCiYjNDM7CQkJcmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLSZndDtkZXYsIHJldCwKJiM0MzsJCQkJCSAgICAgJiMzNDtmYWlsZWQgdG8gZW5hYmxlIFBTRSBzeXN0ZW1cbiYjMzQ7KTsKJiM0MzsJCWlmICghcmV0KSB7CiYjNDM7CQkJcmV0ID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KHBzZS0mZ3Q7ZGV2LAomIzQzOwkJCQkJCSAgICAgICBydHBzZV9tY3VfZ2xvYmFsX2Rpc2FibGUsIHBzZSk7CiYjNDM7CQkJaWYgKHJldCkKJiM0MzsJCQkJcmV0dXJuIHJldDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBEZXBlbmRpbmcgb24gdGhlIE1DVSBmaXJtd2FyZSBjb25maWd1cmF0aW9uICh3aGljaCBtaWdodCBiZSBkaWZmZXJlbnQKJiM0MzsJICogZm9yIGV2ZXJ5IGJvYXJkKSwgaXQgaXNuJiMzOTt0IGtub3duIHdoZXRoZXIgdGhlIFBvRSBzdWJzeXN0ZW0gaXMgYWN0aXZlIG9yCiYjNDM7CSAqIGluYWN0aXZlIGJ5IGRlZmF1bHQuIEF0IHRoaXMgc3RhZ2UsIHRoZSBQU0UgY2hpcHMgbWlnaHQgYWxyZWFkeSBkZWxpdmVyCiYjNDM7CSAqIHBvd2VyIHRvIFBEcyB3aXRob3V0IGFueSBleHBsaWNpdCBlbmFibGUuCiYjNDM7CSAqLwomIzQzOwomIzQzOwkvKiBwY2Rldi5vd25lciBpcyBzZXQgYnkgdGhlIHRyYW5zcG9ydCwgc28gdGhlIHJlZ2lzdGVyZWQgY29udHJvbGxlcgomIzQzOwkgKiBwaW5zIHRoZSB0cmFuc3BvcnQgbW9kdWxlIHRoYXQgb3ducyB0aGUgbGl2ZSBkZXZpY2UsIG5vdCB0aGUgY29yZS4KJiM0MzsJICovCiYjNDM7CXBzZS0mZ3Q7cGNkZXYub3BzICAgICAgPSAmYW1wO3J0cHNlX21jdV9vcHM7CiYjNDM7CXBzZS0mZ3Q7cGNkZXYuZGV2ICAgICAgPSBwc2UtJmd0O2RldjsKJiM0MzsJcHNlLSZndDtwY2Rldi50eXBlcyAgICA9IEVUSFRPT0xfUFNFX0MzMzsKJiM0MzsJcHNlLSZndDtwY2Rldi5ucl9saW5lcyA9IGluZm8ubWF4X3BvcnRzOwomIzQzOwlwc2UtJmd0O3BjZGV2LnBpc19wcmlvX21heCA9IFJUUFNFX01DVV9QT1JUX01BWF9QUklPUklUWTsKJiM0MzsJcHNlLSZndDtwY2Rldi5zdXBwX2J1ZGdldF9ldmFsX3N0cmF0ZWdpZXMgPSBQU0VfQlVER0VUX0VWQUxfU1RSQVRfRFlOQU1JQzsKJiM0MzsKJiM0MzsJcmV0dXJuIGRldm1fcHNlX2NvbnRyb2xsZXJfcmVnaXN0ZXIocHNlLSZndDtkZXYsICZhbXA7cHNlLSZndDtwY2Rldik7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJ0cHNlX21jdV9yZWdpc3Rlcik7CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcnRwc2VfbWN1X2dlbjJfcGFyc2Vfc3lzdGVtX2luZm8oY29uc3QgdTggKnBheWxvYWQsIHN0cnVjdCBydHBzZV9tY3VfaW5mbyAqaW5mbykKJiM0Mzt7CiYjNDM7CWluZm8tJmd0O21heF9wb3J0cyA9IHBheWxvYWRbMV07CiYjNDM7CWluZm8tJmd0O3N5c3RlbV9lbmFibGUgPSAocGF5bG9hZFsyXSA9PSAweDEpOwomIzQzOwlpbmZvLSZndDtkZXZpY2VfaWQgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmFtcDtwYXlsb2FkWzNdKTsKJiM0MzsJaW5mby0mZ3Q7bWN1X3R5cGUgPSBwYXlsb2FkWzZdOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9nZW4yX3BhcnNlX3BvcnRfY2xhc3MoY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9wb3J0X3N0YXR1cyAqc3RhdHVzKQomIzQzO3sKJiM0MzsJLyogQ2xhc3MgbGl2ZXMgaW4gdGhlIHVwcGVyIG5pYmJsZSBvZiBzdHMyLiAqLwomIzQzOwlyZXR1cm4gRklFTERfR0VUKEdFTk1BU0soNywgNCksIHN0YXR1cy0mZ3Q7c3RzMik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpydHBzZV9tY3VfZ2VuMl9tY3VfdHlwZV9zdHIodW5zaWduZWQgaW50IG1jdV90eXBlKQomIzQzO3sKJiM0MzsJc3dpdGNoIChtY3VfdHlwZSkgewomIzQzOwljYXNlIDB4MDA6CXJldHVybiAmIzM0O0dpZ2FEZXZpY2UgR0QzMkYzMTAmIzM0OzsKJiM0MzsJY2FzZSAweDAxOglyZXR1cm4gJiMzNDtHaWdhRGV2aWNlIEdEMzJGMjMwJiMzNDs7CiYjNDM7CWNhc2UgMHgwMjoJcmV0dXJuICYjMzQ7R2lnYURldmljZSBHRDMyRjMwMyYjMzQ7OwomIzQzOwljYXNlIDB4MDM6CXJldHVybiAmIzM0O0dpZ2FEZXZpY2UgR0QzMkYxMDMmIzM0OzsKJiM0MzsJY2FzZSAweDA0OglyZXR1cm4gJiMzNDtHaWdhRGV2aWNlIEdEMzJFMTAzJiMzNDs7CiYjNDM7CWNhc2UgMHgxMDoJcmV0dXJuICYjMzQ7TnV2b3RvbiBNMDUxNiYjMzQ7OwomIzQzOwljYXNlIDB4MTE6CXJldHVybiAmIzM0O051dm90b24gTTA1NjQmIzM0OzsKJiM0MzsJY2FzZSAweDEyOglyZXR1cm4gJiMzNDtOdXZvdG9uIE5VQzAyOSYjMzQ7OwomIzQzOwlkZWZhdWx0OglyZXR1cm4gJiMzNDt1bmtub3duJiMzNDs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcnRwc2VfbWN1X2dlbjFfcGFyc2Vfc3lzdGVtX2luZm8oY29uc3QgdTggKnBheWxvYWQsIHN0cnVjdCBydHBzZV9tY3VfaW5mbyAqaW5mbykKJiM0Mzt7CiYjNDM7CWluZm8tJmd0O21heF9wb3J0cyA9IHBheWxvYWRbMV07CiYjNDM7CS8qIEdlbjEgaGFzIG5vIGV4cGxpY2l0IHN5c3RlbV9lbmFibGUgYnl0ZTsgdGhlIGNsb3Nlc3QgYW5hbG9nIGlzIHRoZQomIzQzOwkgKiAmIzM0O3JlbW90ZSBlbmFibGUmIzM0OyBiaXQgaW4gdGhlIHN5c3RlbS1zdGF0dXMgZmxhZ3MgYXQgcGF5bG9hZFs3XS4KJiM0MzsJICovCiYjNDM7CWluZm8tJmd0O3N5c3RlbV9lbmFibGUgPSAhIShwYXlsb2FkWzddICZhbXA7IEJJVCgyKSk7CiYjNDM7CWluZm8tJmd0O2RldmljZV9pZCA9IGdldF91bmFsaWduZWRfYmUxNigmYW1wO3BheWxvYWRbM10pOwomIzQzOwlpbmZvLSZndDttY3VfdHlwZSA9IHBheWxvYWRbNl07CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X2dlbjFfcGFyc2VfcG9ydF9jbGFzcyhjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfc3RhdHVzICpzdGF0dXMpCiYjNDM7ewomIzQzOwkvKiBHZW4xIHB1dHMgdGhlIGRldGVjdGVkIGNsYXNzIGluIHBheWxvYWRbM10gKD09IHN0czMpIGRpcmVjdGx5LgomIzQzOwkgKiBNYXNrIHRvIHRoZSBsb3cgbmliYmxlOyBjbGFzcyBpcyAwLi44IGFuZCBhbnkgaGlnaCBiaXRzIHdvdWxkIGJlCiYjNDM7CSAqIG5vaXNlLgomIzQzOwkgKi8KJiM0MzsJcmV0dXJuIHN0YXR1cy0mZ3Q7c3RzMyAmYW1wOyAweDBmOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgY2hhciAqcnRwc2VfbWN1X2dlbjFfbWN1X3R5cGVfc3RyKHVuc2lnbmVkIGludCBtY3VfdHlwZSkKJiM0Mzt7CiYjNDM7CXN3aXRjaCAobWN1X3R5cGUpIHsKJiM0MzsJY2FzZSAweDAwOglyZXR1cm4gJiMzNDtTVCBNaWNybyBTVDMyRjEwMCYjMzQ7OwomIzQzOwljYXNlIDB4MDE6CXJldHVybiAmIzM0O051dm90b24gTTA1eHggTEFOJiMzNDs7CiYjNDM7CWNhc2UgMHgwMjoJcmV0dXJuICYjMzQ7U1QgTWljcm8gU1RGMDMwQzgmIzM0OzsKJiM0MzsJY2FzZSAweDAzOglyZXR1cm4gJiMzNDtOdXZvdG9uIE0wNThTQU4mIzM0OzsKJiM0MzsJY2FzZSAweDA0OglyZXR1cm4gJiMzNDtOdXZvdG9uIE5VQzEyMiYjMzQ7OwomIzQzOwlkZWZhdWx0OglyZXR1cm4gJiMzNDt1bmtub3duJiMzNDs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogTWFwIGVhY2ggbG9naWNhbCBjb21tYW5kIHRoZSBjb3JlIGlzc3VlcyB0byBpdHMgcGVyLWRpYWxlY3Qgb3Bjb2RlLiAqLwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2RpYWxlY3QgcnRwc2VfbWN1X2RpYWxlY3RfZ2VuMiA9IHsKJiM0MzsJLnBhcnNlX3N5c3RlbV9pbmZvID0gcnRwc2VfbWN1X2dlbjJfcGFyc2Vfc3lzdGVtX2luZm8sCiYjNDM7CS5wYXJzZV9wb3J0X2NsYXNzICA9IHJ0cHNlX21jdV9nZW4yX3BhcnNlX3BvcnRfY2xhc3MsCiYjNDM7CS5tY3VfdHlwZV9zdHIgICAgICA9IHJ0cHNlX21jdV9nZW4yX21jdV90eXBlX3N0ciwKJiM0MzsJLm9wY29kZSA9IHsKJiM0MzsJCVtSVFBTRV9NQ1VfQ01EX1NFVF9HTE9CQUxfU1RBVEVdCT0gUlRQU0VfTUNVX09QKDB4MDApLAomIzQzOwkJW1JUUFNFX01DVV9DTURfR0VUX1NZU1RFTV9JTkZPXQkJPSBSVFBTRV9NQ1VfT1AoMHg0MCksCiYjNDM7CQlbUlRQU0VfTUNVX0NNRF9HRVRfRVhUX0NPTkZJR10JCT0gUlRQU0VfTUNVX09QKDB4NGEpLAomIzQzOwomIzQzOwkJW1JUUFNFX01DVV9DTURfUE9SVF9FTkFCTEVdCQk9IFJUUFNFX01DVV9PUCgweDAxKSwKJiM0MzsJCVtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUX1RZUEVdID0gUlRQU0VfTUNVX09QKDB4MTIpLAomIzQzOwkJW1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRdCT0gUlRQU0VfTUNVX09QKDB4MTMpLAomIzQzOwkJW1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfRVhUXSA9IFJUUFNFX01DVV9PUCgweDE0KSwKJiM0MzsJCVtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BSSU9SSVRZXQk9IFJUUFNFX01DVV9PUCgweDE1KSwKJiM0MzsJCVtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1NUQVRVU10JCT0gUlRQU0VfTUNVX09QKDB4NDIpLAomIzQzOwkJW1JUUFNFX01DVV9DTURfUE9SVF9HRVRfUE9XRVJfU1RBVFNdCT0gUlRQU0VfTUNVX09QKDB4NDQpLAomIzQzOwkJW1JUUFNFX01DVV9DTURfUE9SVF9HRVRfQ09ORklHXQkJPSBSVFBTRV9NQ1VfT1AoMHg0OCksCiYjNDM7CQlbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9FWFRfQ09ORklHXQk9IFJUUFNFX01DVV9PUCgweDQ5KSwKJiM0MzsJfSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2RpYWxlY3QgcnRwc2VfbWN1X2RpYWxlY3RfZ2VuMSA9IHsKJiM0MzsJLnBhcnNlX3N5c3RlbV9pbmZvID0gcnRwc2VfbWN1X2dlbjFfcGFyc2Vfc3lzdGVtX2luZm8sCiYjNDM7CS5wYXJzZV9wb3J0X2NsYXNzICA9IHJ0cHNlX21jdV9nZW4xX3BhcnNlX3BvcnRfY2xhc3MsCiYjNDM7CS5tY3VfdHlwZV9zdHIgICAgICA9IHJ0cHNlX21jdV9nZW4xX21jdV90eXBlX3N0ciwKJiM0MzsJLm9wY29kZSA9IHsKJiM0MzsJCVtSVFBTRV9NQ1VfQ01EX0dFVF9TWVNURU1fSU5GT10JCT0gUlRQU0VfTUNVX09QKDB4MjApLAomIzQzOwkJW1JUUFNFX01DVV9DTURfR0VUX0VYVF9DT05GSUddCQk9IFJUUFNFX01DVV9PUCgweDJiKSwKJiM0MzsKJiM0MzsJCVtSVFBTRV9NQ1VfQ01EX1BPUlRfRU5BQkxFXQkJPSBSVFBTRV9NQ1VfT1AoMHgwMCksCiYjNDM7CQlbUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF9UWVBFXSA9IFJUUFNFX01DVV9PUCgweDE1KSwKJiM0MzsJCVtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUXQk9IFJUUFNFX01DVV9PUCgweDE2KSwKJiM0MzsJCVtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BSSU9SSVRZXQk9IFJUUFNFX01DVV9PUCgweDFhKSwKJiM0MzsJCVtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1NUQVRVU10JCT0gUlRQU0VfTUNVX09QKDB4MjEpLAomIzQzOwkJW1JUUFNFX01DVV9DTURfUE9SVF9HRVRfUE9XRVJfU1RBVFNdCT0gUlRQU0VfTUNVX09QKDB4MzApLAomIzQzOwkJW1JUUFNFX01DVV9DTURfUE9SVF9HRVRfQ09ORklHXQkJPSBSVFBTRV9NQ1VfT1AoMHgyNSksCiYjNDM7CQlbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9FWFRfQ09ORklHXQk9IFJUUFNFX01DVV9PUCgweDI2KSwKJiM0MzsJfSwKJiM0Mzt9OwomIzQzOwomIzQzO2NvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMV9kYXRhID0gewomIzQzOwkuZGlhbGVjdCA9ICZhbXA7cnRwc2VfbWN1X2RpYWxlY3RfZ2VuMSwKJiM0Mzt9OwomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJ0cHNlX21jdV9nZW4xX2RhdGEpOwomIzQzOwomIzQzO2NvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMl9kYXRhID0gewomIzQzOwkuZGlhbGVjdCA9ICZhbXA7cnRwc2VfbWN1X2RpYWxlY3RfZ2VuMiwKJiM0Mzt9OwomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJ0cHNlX21jdV9nZW4yX2RhdGEpOwomIzQzOwomIzQzOy8qIFNhbWUgZGlhbGVjdCBhcyBnZW4yLCBidXQgdGhlIE1DVSBleHBlY3RzIHJhdy1JMkMgZnJhbWluZy4gKi8KJiM0Mztjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21hdGNoX2RhdGEgcnRwc2VfbWN1X2dlbjJfaTJjX2RhdGEgPSB7CiYjNDM7CS5kaWFsZWN0ID0gJmFtcDtydHBzZV9tY3VfZGlhbGVjdF9nZW4yLAomIzQzOwkubmF0aXZlX2kyYyA9IHRydWUsCiYjNDM7fTsKJiM0MztFWFBPUlRfU1lNQk9MX0dQTChydHBzZV9tY3VfZ2VuMl9pMmNfZGF0YSk7CiYjNDM7CiYjNDM7TU9EVUxFX0FVVEhPUigmIzM0O0pvbmFzIEplbG9uZWsgJmx0O2plbG9uZWsuam9uYXNAZ21haWwuY29tJmd0OyYjMzQ7KTsKJiM0MztNT0RVTEVfREVTQ1JJUFRJT04oJiMzNDtSZWFsdGVrIFBTRSBNQ1UgZHJpdmVyIChjb3JlKSYjMzQ7KTsKJiM0MztNT0RVTEVfTElDRU5TRSgmIzM0O0dQTCYjMzQ7KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtaTJjLmMgYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmUxMGY4YzYzM2I2OGUKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LWkyYy5jCkBAIC0wLDAgJiM0MzsxLDE3MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2RlbGF5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2kyYy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvb2YuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHNlLXBkL3BzZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N0cmluZy5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7cmVhbHRlay1wc2UtbWN1LmgmIzM0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIGNvcmUgaGFzIGFscmVhZHkgd2FpdGVkIFJUUFNFX01DVV9SRVNQT05TRV9NUyBiZWZvcmUgY2FsbGluZyB1cywgc28KJiM0MzsgKiB0aGUgcmVzcG9uc2UgaXMgbm9ybWFsbHkgcmVhZHkgb24gdGhlIHZlcnkgZmlyc3QgcmVhZC4gRm9yIGNvbW1hbmRzIHRoZQomIzQzOyAqIE1DVSBwcm9kdWNlcyBtb3JlIHNsb3dseSwga2VlcCBwb2xsaW5nIGF0IHRoZSB0eXBpY2FsIHJlc3BvbnNlIGNhZGVuY2UKJiM0MzsgKiB1cCB0byB0aGUgd29yc3QtY2FzZSBjZWlsaW5nLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgUlRQU0VfTUNVX0kyQ19SRVRSWV9NUwlSVFBTRV9NQ1VfUkVTUE9OU0VfTVMKJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9JMkNfTUFYX1RSSUVTCShSVFBTRV9NQ1VfUkVTUE9OU0VfTUFYX01TIC8gUlRQU0VfTUNVX0kyQ19SRVRSWV9NUykKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9pMmNfc21idXNfc2VuZChzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHBzZS0mZ3Q7ZGV2KTsKJiM0MzsKJiM0MzsJLyogU2VuZCBvcGNvZGUgYXMgU01CdXMgY29tbWFuZCBieXRlOyByZW1haW5pbmcgMTEgYnl0ZXMgYXMgYmxvY2sgZGF0YSAqLwomIzQzOwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNsaWVudCwgcmVxLSZndDtvcGNvZGUsIFJUUFNFX01DVV9NU0dfU0laRSAtIDEsCiYjNDM7CQkJCQkgICAgICAodTggKilyZXEgJiM0MzsgMSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X2kyY19zbWJ1c19yZWN2KHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxLAomIzQzOwkJCQkgICAgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlc3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChwc2UtJmd0O2Rldik7CiYjNDM7CWludCB0cmllcywgcmV0OwomIzQzOwomIzQzOwlmb3IgKHRyaWVzID0gMDsgdHJpZXMgJmx0OyBSVFBTRV9NQ1VfSTJDX01BWF9UUklFUzsgdHJpZXMmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAodHJpZXMgJmd0OyAwKQomIzQzOwkJCW1zbGVlcChSVFBTRV9NQ1VfSTJDX1JFVFJZX01TKTsKJiM0MzsKJiM0MzsJCS8qIE1DVSBuZWVkcyAweDAwIGFzIGNvbW1hbmQgYnl0ZSBmb3IgcmVhZCAqLwomIzQzOwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCAweDAwLAomIzQzOwkJCQkJCSAgICBSVFBTRV9NQ1VfTVNHX1NJWkUsCiYjNDM7CQkJCQkJICAgICh1OCAqKXJlc3ApOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJCWlmIChyZXQgPT0gUlRQU0VfTUNVX01TR19TSVpFICZhbXA7JmFtcDsgcnRwc2VfbWN1X3Jlc3BfaXNfZmluYWwocmVxLCByZXNwKSkKJiM0MzsJCQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gLUVUSU1FRE9VVDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfdHJhbnNwb3J0X29wcyBydHBzZV9tY3VfaTJjX3NtYnVzX29wcyA9IHsKJiM0MzsJLnNlbmQgPSBydHBzZV9tY3VfaTJjX3NtYnVzX3NlbmQsCiYjNDM7CS5yZWN2ID0gcnRwc2VfbWN1X2kyY19zbWJ1c19yZWN2LAomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIGludCBydHBzZV9tY3VfaTJjX25hdGl2ZV9zZW5kKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxKQomIzQzO3sKJiM0MzsJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQocHNlLSZndDtkZXYpOwomIzQzOwl2b2lkICpidWY7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CS8qIGkyY19tYXN0ZXJfc2VuZCgpIG1heSBETUEsIHNvIHRoZSBidWZmZXIgbXVzdCBub3QgYmUgb24gdGhlIHN0YWNrLiAqLwomIzQzOwlidWYgPSBrbWVtZHVwKHJlcSwgUlRQU0VfTUNVX01TR19TSVpFLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFidWYpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCBSVFBTRV9NQ1VfTVNHX1NJWkUpOwomIzQzOwlrZnJlZShidWYpOwomIzQzOwlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CXJldHVybiByZXQgPT0gUlRQU0VfTUNVX01TR19TSVpFID8gMCA6IC1FSU87CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcnRwc2VfbWN1X2kyY19uYXRpdmVfcmVjdihzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSwKJiM0MzsJCQkJICAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHBzZS0mZ3Q7ZGV2KTsKJiM0MzsJaW50IHRyaWVzLCByZXQ7CiYjNDM7CXU4ICpidWY7CiYjNDM7CiYjNDM7CS8qIGkyY19tYXN0ZXJfcmVjdigpIG1heSBETUEsIHNvIHJlYWQgaW50byBhbiBvZmYtc3RhY2sgYnVmZmVyLiAqLwomIzQzOwlidWYgPSBrbWFsbG9jKFJUUFNFX01DVV9NU0dfU0laRSwgR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghYnVmKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CWZvciAodHJpZXMgPSAwOyB0cmllcyAmbHQ7IFJUUFNFX01DVV9JMkNfTUFYX1RSSUVTOyB0cmllcyYjNDM7JiM0MzspIHsKJiM0MzsJCWlmICh0cmllcyAmZ3Q7IDApCiYjNDM7CQkJbXNsZWVwKFJUUFNFX01DVV9JMkNfUkVUUllfTVMpOwomIzQzOwomIzQzOwkJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgYnVmLCBSVFBTRV9NQ1VfTVNHX1NJWkUpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZiAocmV0ID09IFJUUFNFX01DVV9NU0dfU0laRSkgewomIzQzOwkJCW1lbWNweShyZXNwLCBidWYsIFJUUFNFX01DVV9NU0dfU0laRSk7CiYjNDM7CQkJaWYgKHJ0cHNlX21jdV9yZXNwX2lzX2ZpbmFsKHJlcSwgcmVzcCkpIHsKJiM0MzsJCQkJcmV0ID0gMDsKJiM0MzsJCQkJZ290byBvdXQ7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXJldCA9IC1FVElNRURPVVQ7CiYjNDM7b3V0OgomIzQzOwlrZnJlZShidWYpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV90cmFuc3BvcnRfb3BzIHJ0cHNlX21jdV9pMmNfbmF0aXZlX29wcyA9IHsKJiM0MzsJLnNlbmQgPSBydHBzZV9tY3VfaTJjX25hdGl2ZV9zZW5kLAomIzQzOwkucmVjdiA9IHJ0cHNlX21jdV9pMmNfbmF0aXZlX3JlY3YsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhbXA7Y2xpZW50LSZndDtkZXY7CiYjNDM7CWNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSAqbWF0Y2g7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlOwomIzQzOwlib29sIHVzZV9uYXRpdmU7CiYjNDM7CiYjNDM7CW1hdGNoID0gZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7CiYjNDM7CWlmICghbWF0Y2gpCiYjNDM7CQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1FTk9ERVYsICYjMzQ7bWlzc2luZyBtYXRjaCBkYXRhXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CS8qIFRoZSBmcmFtaW5nIChyYXcgSTJDIHZzIFNNQnVzKSBpcyBjYXJyaWVkIGJ5IHRoZSBtYXRjaCBkYXRhLiAqLwomIzQzOwl1c2VfbmF0aXZlID0gbWF0Y2gtJmd0O25hdGl2ZV9pMmM7CiYjNDM7CWlmICh1c2VfbmF0aXZlKSB7CiYjNDM7CQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0mZ3Q7YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkKJiM0MzsJCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1FT1BOT1RTVVBQLAomIzQzOwkJCQkmIzM0O3BsYWluLUkyQyBNQ1UgcHJvdG9jb2wgcmVxdWlyZXMgSTJDLWNhcGFibGUgYWRhcHRlclxuJiMzNDspOwomIzQzOwl9IGVsc2UgewomIzQzOwkJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtJmd0O2FkYXB0ZXIsCiYjNDM7CQkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DSyB8CiYjNDM7CQkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLKSkKJiM0MzsJCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1FT1BOT1RTVVBQLAomIzQzOwkJCQkmIzM0O1NNQnVzIE1DVSBwcm90b2NvbCByZXF1aXJlcyBTTUJ1cyBJMkMtYmxvY2sgc3VwcG9ydFxuJiMzNDspOwomIzQzOwl9CiYjNDM7CiYjNDM7CXBzZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHNlKSwgR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghcHNlKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CXBzZS0mZ3Q7ZGV2ID0gZGV2OwomIzQzOwlwc2UtJmd0O3BjZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7CiYjNDM7CXBzZS0mZ3Q7dHJhbnNwb3J0ID0gdXNlX25hdGl2ZSA/ICZhbXA7cnRwc2VfbWN1X2kyY19uYXRpdmVfb3BzIDogJmFtcDtydHBzZV9tY3VfaTJjX3NtYnVzX29wczsKJiM0MzsKJiM0MzsJcmV0dXJuIHJ0cHNlX21jdV9yZWdpc3Rlcihwc2UpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBydHBzZV9tY3VfaTJjX29mX21hdGNoW10gPSB7CiYjNDM7CXsgLmNvbXBhdGlibGUgPSAmIzM0O3JlYWx0ZWsscHNlLW1jdS1nZW4xLXNtYnVzJiMzNDssIC5kYXRhID0gJmFtcDtydHBzZV9tY3VfZ2VuMV9kYXRhIH0sCiYjNDM7CXsgLmNvbXBhdGlibGUgPSAmIzM0O3JlYWx0ZWsscHNlLW1jdS1nZW4yLXNtYnVzJiMzNDssIC5kYXRhID0gJmFtcDtydHBzZV9tY3VfZ2VuMl9kYXRhIH0sCiYjNDM7CXsgLmNvbXBhdGlibGUgPSAmIzM0O3JlYWx0ZWsscHNlLW1jdS1nZW4yLWkyYyYjMzQ7LCAuZGF0YSA9ICZhbXA7cnRwc2VfbWN1X2dlbjJfaTJjX2RhdGEgfSwKJiM0MzsJeyAvKiBzZW50aW5lbCAqLyB9CiYjNDM7fTsKJiM0MztNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBydHBzZV9tY3VfaTJjX29mX21hdGNoKTsKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcnRwc2VfbWN1X2kyY19kcml2ZXIgPSB7CiYjNDM7CS5kcml2ZXIgPSB7CiYjNDM7CQkubmFtZQkJPSAmIzM0O3JlYWx0ZWstcHNlLW1jdS1pMmMmIzM0OywKJiM0MzsJCS5vZl9tYXRjaF90YWJsZQk9IHJ0cHNlX21jdV9pMmNfb2ZfbWF0Y2gsCiYjNDM7CX0sCiYjNDM7CS5wcm9iZQkJPSBydHBzZV9tY3VfaTJjX3Byb2JlLAomIzQzO307CiYjNDM7bW9kdWxlX2kyY19kcml2ZXIocnRwc2VfbWN1X2kyY19kcml2ZXIpOwomIzQzOwomIzQzO01PRFVMRV9BVVRIT1IoJiMzNDtKb25hcyBKZWxvbmVrICZsdDtqZWxvbmVrLmpvbmFzQGdtYWlsLmNvbSZndDsmIzM0Oyk7CiYjNDM7TU9EVUxFX0RFU0NSSVBUSU9OKCYjMzQ7UmVhbHRlayBQU0UgTUNVIGRyaXZlciAoSTJDIHRyYW5zcG9ydCkmIzM0Oyk7CiYjNDM7TU9EVUxFX0xJQ0VOU0UoJiMzNDtHUEwmIzM0Oyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LXVhcnQuYyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjliYWExN2Q4ZDMxZmEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LXVhcnQuYwpAQCAtMCwwICYjNDM7MSwxNjQgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlcgomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9jbGVhbnVwLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2NvbXBsZXRpb24uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvbW9kdWxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L29mLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3BzZS1wZC9wc2UuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2VyZGV2LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NwaW5sb2NrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N0cmluZy5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7cmVhbHRlay1wc2UtbWN1LmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgUlRQU0VfTUNVX1VBUlRfQkFVRF9ERUZBVUxUCTE5MjAwCiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfVUFSVF9UWF9USU1FT1VUCW1zZWNzX3RvX2ppZmZpZXMoMTAwKQomIzQzOyNkZWZpbmUgUlRQU0VfTUNVX1VBUlRfUlhfVElNRU9VVAltc2Vjc190b19qaWZmaWVzKFJUUFNFX01DVV9SRVNQT05TRV9NQVhfTVMpCiYjNDM7CiYjNDM7c3RydWN0IHJ0cHNlX21jdV91YXJ0IHsKJiM0MzsJc3RydWN0IHJ0cHNlX21jdV9jdHJsIHBzZTsKJiM0MzsJc3RydWN0IHNlcmRldl9kZXZpY2UgKnNlcmRldjsKJiM0MzsJc3RydWN0IGNvbXBsZXRpb24gcnhfZG9uZTsKJiM0MzsJc3BpbmxvY2tfdCByeF9sb2NrOwkJLyogcHJvdGVjdHMgcnhfYnVmIGFuZCByeF9sZW4gKi8KJiM0MzsJc2l6ZV90IHJ4X2xlbjsKJiM0MzsJdTggcnhfYnVmW1JUUFNFX01DVV9NU0dfU0laRV07CiYjNDM7fTsKJiM0MzsKJiM0MzsjZGVmaW5lIHRvX3J0cHNlX21jdV91YXJ0KHApICBjb250YWluZXJfb2YocCwgc3RydWN0IHJ0cHNlX21jdV91YXJ0LCBwc2UpCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBObyBmcmFtaW5nIGlzIGRvbmUgaGVyZTogYSBnbGl0Y2hlZCBmcmFtZSBjb3N0cyBvbmUgdHJhbnNhY3Rpb24sIHRoZW4KJiM0MzsgKiB0aGUgbmV4dCBfc2VuZCByZS1mcmFtZXMgZnJvbSByeF9sZW4gMC4gUmVzeW5jIHdvcmtzIGJ5IHJldHVybmluZyBjb3VudAomIzQzOyAqIChub3QgdGFrZSksIGRyb3BwaW5nIGFueSBvdmVyZmxvdyBzbyBzZXJkZXYga2VlcHMgbm8gbGVmdG92ZXIgdG8gYmxlZWQKJiM0MzsgKiBpbnRvIHRoZSBuZXh0IGZyYW1lLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzaXplX3QgcnRwc2VfbWN1X3VhcnRfcmVjZWl2ZShzdHJ1Y3Qgc2VyZGV2X2RldmljZSAqc2VyZGV2LAomIzQzOwkJCQkgICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBjb3VudCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfdWFydCAqY3R4ID0gc2VyZGV2X2RldmljZV9nZXRfZHJ2ZGF0YShzZXJkZXYpOwomIzQzOwlzaXplX3QgdGFrZTsKJiM0MzsKJiM0MzsJc2NvcGVkX2d1YXJkKHNwaW5sb2NrX2lycXNhdmUsICZhbXA7Y3R4LSZndDtyeF9sb2NrKSB7CiYjNDM7CQl0YWtlID0gbWluKGNvdW50LCBzaXplb2YoY3R4LSZndDtyeF9idWYpIC0gY3R4LSZndDtyeF9sZW4pOwomIzQzOwkJaWYgKHRha2UpIHsKJiM0MzsJCQltZW1jcHkoY3R4LSZndDtyeF9idWYgJiM0MzsgY3R4LSZndDtyeF9sZW4sIGJ1ZiwgdGFrZSk7CiYjNDM7CQkJY3R4LSZndDtyeF9sZW4gJiM0Mzs9IHRha2U7CiYjNDM7CQkJaWYgKGN0eC0mZ3Q7cnhfbGVuID09IHNpemVvZihjdHgtJmd0O3J4X2J1ZikpCiYjNDM7CQkJCWNvbXBsZXRlKCZhbXA7Y3R4LSZndDtyeF9kb25lKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwkvKiBjb25zdW1lIGFsbCB0byBhdm9pZCBkZXN5bmMvbWlzYWxpZ25tZW50ICovCiYjNDM7CXJldHVybiBjb3VudDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBzZXJkZXZfZGV2aWNlX29wcyBydHBzZV9tY3VfdWFydF9zZXJkZXZfb3BzID0gewomIzQzOwkucmVjZWl2ZV9idWYgPSBydHBzZV9tY3VfdWFydF9yZWNlaXZlLAomIzQzOwkud3JpdGVfd2FrZXVwID0gc2VyZGV2X2RldmljZV93cml0ZV93YWtldXAsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV91YXJ0X3NlbmQoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcnRwc2VfbWN1X3VhcnQgKmN0eCA9IHRvX3J0cHNlX21jdV91YXJ0KHBzZSk7CiYjNDM7CWludCB3cml0dGVuOwomIzQzOwomIzQzOwkvKiBjbGVhciBhbnkgbGVmdG92ZXIgcnggc3RhdGUgYmVmb3JlIHRyYW5zbWl0dGluZyAqLwomIzQzOwlzY29wZWRfZ3VhcmQoc3BpbmxvY2tfaXJxc2F2ZSwgJmFtcDtjdHgtJmd0O3J4X2xvY2spIHsKJiM0MzsJCXJlaW5pdF9jb21wbGV0aW9uKCZhbXA7Y3R4LSZndDtyeF9kb25lKTsKJiM0MzsJCWN0eC0mZ3Q7cnhfbGVuID0gMDsKJiM0MzsJfQomIzQzOwomIzQzOwl3cml0dGVuID0gc2VyZGV2X2RldmljZV93cml0ZShjdHgtJmd0O3NlcmRldiwgKGNvbnN0IHU4ICopcmVxLCBzaXplb2YoKnJlcSksCiYjNDM7CQkJCSAgICAgIFJUUFNFX01DVV9VQVJUX1RYX1RJTUVPVVQpOwomIzQzOwlpZiAod3JpdHRlbiAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gd3JpdHRlbjsKJiM0MzsJaWYgKHdyaXR0ZW4gIT0gc2l6ZW9mKCpyZXEpKQomIzQzOwkJcmV0dXJuIC1FSU87CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV91YXJ0X3JlY3Yoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsCiYjNDM7CQkJICAgICAgIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEsCiYjNDM7CQkJICAgICAgIHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXNwKQomIzQzO3sKJiM0MzsJc3RydWN0IHJ0cHNlX21jdV91YXJ0ICpjdHggPSB0b19ydHBzZV9tY3VfdWFydChwc2UpOwomIzQzOwomIzQzOwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYW1wO2N0eC0mZ3Q7cnhfZG9uZSwgUlRQU0VfTUNVX1VBUlRfUlhfVElNRU9VVCkpCiYjNDM7CQlyZXR1cm4gLUVUSU1FRE9VVDsKJiM0MzsKJiM0MzsJc2NvcGVkX2d1YXJkKHNwaW5sb2NrX2lycXNhdmUsICZhbXA7Y3R4LSZndDtyeF9sb2NrKSB7CiYjNDM7CQlpZiAoY3R4LSZndDtyeF9sZW4gIT0gc2l6ZW9mKCpyZXNwKSkKJiM0MzsJCQlyZXR1cm4gLUVJTzsKJiM0MzsKJiM0MzsJCW1lbWNweShyZXNwLCBjdHgtJmd0O3J4X2J1Ziwgc2l6ZW9mKCpyZXNwKSk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X3RyYW5zcG9ydF9vcHMgcnRwc2VfbWN1X3VhcnRfdHJhbnNwb3J0X29wcyA9IHsKJiM0MzsJLnNlbmQgPSBydHBzZV9tY3VfdWFydF9zZW5kLAomIzQzOwkucmVjdiA9IHJ0cHNlX21jdV91YXJ0X3JlY3YsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJ0cHNlX21jdV91YXJ0X3Byb2JlKHN0cnVjdCBzZXJkZXZfZGV2aWNlICpzZXJkZXYpCiYjNDM7ewomIzQzOwl1MzIgc3BlZWQgPSBSVFBTRV9NQ1VfVUFSVF9CQVVEX0RFRkFVTFQ7CiYjNDM7CXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhbXA7c2VyZGV2LSZndDtkZXY7CiYjNDM7CXN0cnVjdCBydHBzZV9tY3VfdWFydCAqY3R4OwomIzQzOwl1bnNpZ25lZCBpbnQgYmF1ZDsKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJY3R4ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFjdHgpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJY3R4LSZndDtzZXJkZXYgPSBzZXJkZXY7CiYjNDM7CWN0eC0mZ3Q7cHNlLmRldiA9IGRldjsKJiM0MzsJY3R4LSZndDtwc2UucGNkZXYub3duZXIgPSBUSElTX01PRFVMRTsKJiM0MzsJY3R4LSZndDtwc2UudHJhbnNwb3J0ID0gJmFtcDtydHBzZV9tY3VfdWFydF90cmFuc3BvcnRfb3BzOwomIzQzOwlpbml0X2NvbXBsZXRpb24oJmFtcDtjdHgtJmd0O3J4X2RvbmUpOwomIzQzOwlzcGluX2xvY2tfaW5pdCgmYW1wO2N0eC0mZ3Q7cnhfbG9jayk7CiYjNDM7CiYjNDM7CXNlcmRldl9kZXZpY2Vfc2V0X2RydmRhdGEoc2VyZGV2LCBjdHgpOwomIzQzOwlzZXJkZXZfZGV2aWNlX3NldF9jbGllbnRfb3BzKHNlcmRldiwgJmFtcDtydHBzZV9tY3VfdWFydF9zZXJkZXZfb3BzKTsKJiM0MzsKJiM0MzsJcmV0ID0gZGV2bV9zZXJkZXZfZGV2aWNlX29wZW4oZGV2LCBzZXJkZXYpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCByZXQsICYjMzQ7ZmFpbGVkIHRvIG9wZW4gc2VyZGV2XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXZfZndub2RlKGRldiksICYjMzQ7Y3VycmVudC1zcGVlZCYjMzQ7LCAmYW1wO3NwZWVkKTsKJiM0MzsKJiM0MzsJYmF1ZCA9IHNlcmRldl9kZXZpY2Vfc2V0X2JhdWRyYXRlKHNlcmRldiwgc3BlZWQpOwomIzQzOwlpZiAoYmF1ZCAhPSBzcGVlZCkKJiM0MzsJCWRldl93YXJuKGRldiwgJiMzNDtjb3VsZCBub3Qgc2V0IGJhdWRyYXRlICV1LCBjb250cm9sbGVyIHVzZXMgJXVcbiYjMzQ7LAomIzQzOwkJCSBzcGVlZCwgYmF1ZCk7CiYjNDM7CiYjNDM7CXNlcmRldl9kZXZpY2Vfc2V0X2Zsb3dfY29udHJvbChzZXJkZXYsIGZhbHNlKTsKJiM0MzsKJiM0MzsJcmV0ID0gc2VyZGV2X2RldmljZV9zZXRfcGFyaXR5KHNlcmRldiwgU0VSREVWX1BBUklUWV9OT05FKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCWRldl93YXJuKGRldiwgJiMzNDtjb3VsZCBub3Qgc2V0IHBhcml0eSB0byBub25lOiAlZFxuJiMzNDssIHJldCk7CiYjNDM7CiYjNDM7CXJldHVybiBydHBzZV9tY3VfcmVnaXN0ZXIoJmFtcDtjdHgtJmd0O3BzZSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJ0cHNlX21jdV91YXJ0X29mX21hdGNoW10gPSB7CiYjNDM7CXsgLmNvbXBhdGlibGUgPSAmIzM0O3JlYWx0ZWsscHNlLW1jdS1nZW4xJiMzNDssIC5kYXRhID0gJmFtcDtydHBzZV9tY3VfZ2VuMV9kYXRhIH0sCiYjNDM7CXsgLmNvbXBhdGlibGUgPSAmIzM0O3JlYWx0ZWsscHNlLW1jdS1nZW4yJiMzNDssIC5kYXRhID0gJmFtcDtydHBzZV9tY3VfZ2VuMl9kYXRhIH0sCiYjNDM7CXsgLyogc2VudGluZWwgKi8gfQomIzQzO307CiYjNDM7TU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcnRwc2VfbWN1X3VhcnRfb2ZfbWF0Y2gpOwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3Qgc2VyZGV2X2RldmljZV9kcml2ZXIgcnRwc2VfbWN1X3VhcnRfZHJpdmVyID0gewomIzQzOwkuZHJpdmVyID0gewomIzQzOwkJLm5hbWUgPSAmIzM0O3JlYWx0ZWstcHNlLW1jdS11YXJ0JiMzNDssCiYjNDM7CQkub2ZfbWF0Y2hfdGFibGUgPSBydHBzZV9tY3VfdWFydF9vZl9tYXRjaCwKJiM0MzsJfSwKJiM0MzsJLnByb2JlICA9IHJ0cHNlX21jdV91YXJ0X3Byb2JlLAomIzQzO307CiYjNDM7bW9kdWxlX3NlcmRldl9kZXZpY2VfZHJpdmVyKHJ0cHNlX21jdV91YXJ0X2RyaXZlcik7CiYjNDM7CiYjNDM7TU9EVUxFX0FVVEhPUigmIzM0O0pvbmFzIEplbG9uZWsgJmx0O2plbG9uZWsuam9uYXNAZ21haWwuY29tJmd0OyYjMzQ7KTsKJiM0MztNT0RVTEVfREVTQ1JJUFRJT04oJiMzNDtSZWFsdGVrIFBTRSBNQ1UgZHJpdmVyIChVQVJUIHRyYW5zcG9ydCkmIzM0Oyk7CiYjNDM7TU9EVUxFX0xJQ0VOU0UoJiMzNDtHUEwmIzM0Oyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LmggYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNTJmOTQ0MmQ3MTE3YwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UuaApAQCAtMCwwICYjNDM7MSw5MyBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyICovCiYjNDM7CiYjNDM7I2lmbmRlZiBfUkVBTFRFS19QU0VfTUNVX0gKJiM0MzsjZGVmaW5lIF9SRUFMVEVLX1BTRV9NQ1VfSAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tdXRleC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9wc2UtcGQvcHNlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaW1lIHRoZSBNQ1UgaXRzZWxmIG5lZWRzIGJldHdlZW4gYWNjZXB0aW5nIGEgcmVxdWVzdCBhbmQgaGF2aW5nIGEKJiM0MzsgKiByZXNwb25zZSByZWFkeS4gVGhlc2UgYXJlIHByb3BlcnRpZXMgb2YgdGhlIE1DVSBmaXJtd2FyZSwgbm90IG9mIHRoZQomIzQzOyAqIHVuZGVybHlpbmcgdHJhbnNwb3J0OiB0aGUgY29yZSBwYWNlcyB0cmFuc2FjdGlvbnMgYnkgUlRQU0VfTUNVX1JFU1BPTlNFX01TCiYjNDM7ICogYW5kIGJvdGggdHJhbnNwb3J0cyBzaXplIHRoZWlyIHBlci10cmFuc2FjdGlvbiByZWN2IGNlaWxpbmcgZnJvbQomIzQzOyAqIFJUUFNFX01DVV9SRVNQT05TRV9NQVhfTVMsIHNpbmNlIHNvbWUgY29tbWFuZHMgYXJlIGRvY3VtZW50ZWQgYXMKJiM0MzsgKiBuZWVkaW5nIHVwIHRvIH4xcyB0byBwcm9kdWNlIGEgcmVwbHkuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfUkVTUE9OU0VfTVMJCQkyNQomIzQzOyNkZWZpbmUgUlRQU0VfTUNVX1JFU1BPTlNFX01BWF9NUwkJMTAwMAomIzQzOwomIzQzOy8qCiYjNDM7ICogVG90YWwgdGltZSB0byBrZWVwIHJldHJ5aW5nIHRoZSBmaXJzdCBNQ1UgcmVhZCBhdCBwcm9iZSwgYW5kIHRoZSBwYXVzZQomIzQzOyAqIGJldHdlZW4gYXR0ZW1wdHMuIFJpZ2h0IGFmdGVyIHJlc2V0LWdwaW9zIGlzIGRlYXNzZXJ0ZWQgdGhlIE1DVSBtYXkgbm90CiYjNDM7ICogYW5zd2VyIG9uIHRoZSBidXMgeWV0OyBnaXZlIGl0IGEgYm91bmRlZCB3aW5kb3cgdG8gY29tZSB1cCBiZWZvcmUKJiM0MzsgKiBkZWNsYXJpbmcgdGhlIHByb2JlIGZhaWxlZC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9CT09UX1RJTUVPVVRfTVMJCTMwMDAKJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9CT09UX1JFVFJZX01TCQkJMTAwCiYjNDM7CiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfTVNHX1NJWkUJCQkxMgomIzQzOwomIzQzO3N0cnVjdCBydHBzZV9tY3VfbXNnIHsKJiM0MzsJdTggb3Bjb2RlOwomIzQzOwl1OCBzZXFfbnVtOwomIzQzOwl1OCBwYXlsb2FkWzldOwomIzQzOwl1OCBjaGVja3N1bTsKJiM0Mzt9IF9fcGFja2VkOwomIzQzOwomIzQzOy8qCiYjNDM7ICogTUNVIHN0YXR1cyBvcGNvZGVzIChzZWVuIG9uIHRoZSBHZW4xIGRpYWxlY3Q7IEdlbjIgbmV2ZXIgZW1pdHMgdGhlbSkuCiYjNDM7ICogSU5DT01QTEVURS9CQURfQ1NVTSBhcmUgdGVybWluYWw7IE5PVF9SRUFEWSBpcyB0cmFuc2llbnQuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBSVFBTRV9NQ1VfT1BDT0RFX0lOQ09NUExFVEUJCTB4ZmQJLyogLUVCQURFICAgKi8KJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9PUENPREVfQkFEX0NTVU0JCTB4ZmUJLyogLUVCQURNU0cgKi8KJiM0MzsjZGVmaW5lIFJUUFNFX01DVV9PUENPREVfTk9UX1JFQURZCQkweGZmCS8qIC1FQUdBSU4gICovCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBIHBvbGxpbmcgdHJhbnNwb3J0IGNhbiBzdG9wIGhlcmU6IHRoZSByZXBseSB0byB0aGlzIHJlcXVlc3QgKG9wY29kZSBhbmQKJiM0MzsgKiBzZXFfbnVtKSwgb3IgYSB0ZXJtaW5hbCBlcnJvci4gVGhlIHNlcV9udW0gcmVqZWN0cyBhIHN0YWxlIHJlcGx5IGxlZnQgYnkgYW4KJiM0MzsgKiBhYmFuZG9uZWQgdHJhbnNhY3Rpb24sIGluc3RlYWQgb2YgZGVzeW5jaW5nIGJ5IG9uZSBmcmFtZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgcnRwc2VfbWN1X3Jlc3BfaXNfZmluYWwoY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSwKJiM0MzsJCQkJCSAgIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXNwKQomIzQzO3sKJiM0MzsJcmV0dXJuIChyZXNwLSZndDtvcGNvZGUgPT0gcmVxLSZndDtvcGNvZGUgJmFtcDsmYW1wOyByZXNwLSZndDtzZXFfbnVtID09IHJlcS0mZ3Q7c2VxX251bSkgfHwKJiM0MzsJICAgICAgIHJlc3AtJmd0O29wY29kZSA9PSBSVFBTRV9NQ1VfT1BDT0RFX0lOQ09NUExFVEUgfHwKJiM0MzsJICAgICAgIHJlc3AtJmd0O29wY29kZSA9PSBSVFBTRV9NQ1VfT1BDT0RFX0JBRF9DU1VNOwomIzQzO30KJiM0MzsKJiM0MzsvKiBPcGFxdWUgdG8gdHJhbnNwb3J0czsgZGVmaW5lZCBpbiByZWFsdGVrLXBzZS1tY3UtY29yZS5jLiAqLwomIzQzO3N0cnVjdCBydHBzZV9tY3VfZGlhbGVjdDsKJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbzsKJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X2N0cmw7CiYjNDM7CiYjNDM7LyogUGVyLWNvbXBhdGlibGUgbWF0Y2ggZGF0YSAodGhlIG9mX21hdGNoIC5kYXRhKS4gKi8KJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X21hdGNoX2RhdGEgewomIzQzOwljb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2RpYWxlY3QgKmRpYWxlY3Q7CiYjNDM7CWJvb2wgbmF0aXZlX2kyYzsJLyogcmF3LUkyQyBmcmFtaW5nICh2cyBTTUJ1cyk7IEkyQyB0cmFuc3BvcnQgb25seSAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHJ0cHNlX21jdV90cmFuc3BvcnRfb3BzIHsKJiM0MzsJaW50ICgqc2VuZCkoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEpOwomIzQzOwlpbnQgKCpyZWN2KShzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSwKJiM0MzsJCSAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcCk7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgewomIzQzOwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiYjNDM7CXN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgcGNkZXY7CiYjNDM7CXN0cnVjdCBtdXRleCBtdXRleDsJLyogc2VyaWFsaXplcyBNQ1UgcmVxdWVzdC9yZXNwb25zZSB0cmFuc2FjdGlvbnMgKi8KJiM0MzsJY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9kaWFsZWN0ICpkaWFsZWN0OwomIzQzOwljb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbyAqY2hpcDsKJiM0MzsJY29uc3Qgc3RydWN0IHJ0cHNlX21jdV90cmFuc3BvcnRfb3BzICp0cmFuc3BvcnQ7CiYjNDM7CXU4IHNlcTsJCQkvKiByb2xsaW5nIHJlcXVlc3Qgc2VxX251bSwgZWNob2VkIGJ5IHRoZSBNQ1UgKi8KJiM0Mzt9OwomIzQzOwomIzQzO2ludCBydHBzZV9tY3VfcmVnaXN0ZXIoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UpOwomIzQzOwomIzQzO2V4dGVybiBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21hdGNoX2RhdGEgcnRwc2VfbWN1X2dlbjFfZGF0YTsKJiM0MztleHRlcm4gY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhIHJ0cHNlX21jdV9nZW4yX2RhdGE7CiYjNDM7ZXh0ZXJuIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMl9pMmNfZGF0YTsKJiM0MzsKJiM0MzsjZW5kaWYKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQwMTQKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA4ODUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBSZWFsdGVrIFBTRSBNQ1UgRHJpdmVyIGZvciBGdXp6aW5nIFBvdGVudGlhbCoqCgpPa2F5LCBzbyB3ZSBoYXZlIHRoaXMgbmV3IHBhdGNoIHdpdGggYSBkcml2ZXIgZm9yIHRoZSBSZWFsdGVrIFBTRSBNQ1UsIHNwZWNpZmljYWxseSB0YXJnZXRpbmcgUG9FIHN3aXRjaCBoYXJkd2FyZSBtYW5hZ2VtZW50LiBJdCYjMzk7cyBhbiBJMkMvVUFSVC1iYXNlZCBkcml2ZXIsIHdoaWNoIGdldHMgbWUgdGhpbmtpbmcgaW1tZWRpYXRlbHkgYWJvdXQgaG93IHdlIGNhbiByZWFjaCBpdCBpbiBhIHZpcnR1YWxpemVkIGVudmlyb25tZW50IGZvciBmdXp6aW5nLiBDYW4gUUVNVSBvciBzeXprYWxsZXIgYmUgbGV2ZXJhZ2VkIGhlcmU/CgpTeXprYWxsZXIgaXMgYWxyZWFkeSBzZXQgdXAgdG8gZnV6eiBJMkMgZGV2aWNlcywgZWl0aGVyIHRocm91Z2ggZGlyZWN0IGAvZGV2L2kyYy0qYCBhY2Nlc3MgKHdpdGggdGhlIHJpZ2h0IHN0dWJzIG9yIGluamVjdGlvbnMpIG9yIFVBUlQgdmlhIHNlcmRldi4gVGhlIHF1ZXN0aW9uIGlzLCBob3cgZWFzaWx5IGNhbiB3ZSBnZXQgdGhpcyBzcGVjaWZpYyBkcml2ZXIgaW5zdGFudGlhdGVkPyBJIGtub3cgc3l6a2FsbGVyIGNhbiBpbnN0YW50aWF0ZSBJMkMgZGV2aWNlcyB2aWEgYHZoY2lgIG9yIGJ5IHNpbXBseSBsb2FkaW5nIHRoZSBtb2R1bGUgYW5kIHVzaW5nIHN5c2ZzIHdpdGggYG5ld19kZXZpY2VgLCB3aGljaCBpcyB0aGUgaW1tZWRpYXRlIGZvY3VzLiBGb3Igc2VyZGV2LCBpdCYjMzk7cyB0eXBpY2FsbHkgZGV2aWNlIHRyZWUgZHJpdmVuLCB3aGljaCBtaWdodCBiZSB0cmlja2llciB0byByZWFjaCB3aXRob3V0IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3Igb3ZlcmxheSBpbmplY3Rpb24sIGJ1dCBJMkMgbG9va3MgcHJvbWlzaW5nLgoKTGV0JiMzOTtzIGZvY3VzIG9uIHRoZSBgcmVhbHRlay1wc2UtbWN1LWkyY2AgZHJpdmVyLiBJdCYjMzk7cyBhbiBJMkMgZHJpdmVyLCBgcnRwc2VfbWN1X2kyY19kcml2ZXJgLCBhbmQgaXQgdXNlcyBhbiBgb2ZfbWF0Y2hfdGFibGVgLiBDYW4gd2UgbGV2ZXJhZ2UgdGhpcyB0YWJsZSB3aXRoIHN5c2ZzIGBuZXdfZGV2aWNlYD8gSSYjMzk7bSB0aGlua2luZyBgZWNobyAmIzM0O3JlYWx0ZWsscHNlLW1jdS1nZW4xLXNtYnVzIDB4MjAmIzM0OyAmZ3Q7IC9zeXMvYnVzL2kyYy9kZXZpY2VzL2kyYy0wL25ld19kZXZpY2VgIG1pZ2h0IGRvIHRoZSB0cmljaywgYXNzdW1pbmcgdGhlIGRyaXZlciBuYW1lIG9yIEkyQyBJRCBtYXRjaC4gV2FpdCwgaXQgc2VlbXMgbGlrZSBgbmV3X2RldmljZWAgcHJpbWFyaWx5IHVzZXMgYGlkX3RhYmxlYCwgd2hpY2ggaXNuJiMzOTt0IHByZXNlbnQgaW4gdGhpcyBkcml2ZXIuCgpBaCwgYnV0IEkgcmVtZW1iZXIgdGhhdCB0aGUgSTJDIGNvcmUgKmNhbiogZmFsbCBiYWNrIHRvIHRoZSBPRiBtYXRjaCB0YWJsZSBldmVuIGZvciBzeXNmcyBgbmV3X2RldmljZWAgaW4gcmVjZW50IGtlcm5lbHMuIFRoYXQmIzM5O3MgYSBrZXkgZGV0YWlsISBIb3dldmVyLCB0aGUgZHJpdmVyIHVzZXMgYGRldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpYC4gSWYgaW5zdGFudGlhdGVkIHRocm91Z2ggc3lzZnMgd2l0aG91dCBhbiBPRiBub2RlLCB3aWxsIHRoYXQgcmV0dXJuIE5VTEw/IFRoYXQgd291bGQgY2F1c2UgdGhlIHByb2JlIHRvIGZhaWwgd2l0aCBgLUVOT0RFVmAuIFdlIGhhdmUgdG8gY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHRvIGJlIHN1cmUuIERvZXMgaXQgY2hlY2sgZm9yIGEgc3BlY2lmaWMgT0Ygbm9kZSwgb3IgZG9lcyBpdCBmYWxsIGJhY2sgdG8gb3RoZXIgbWVjaGFuaXNtcyBsaWtlIGBpZF90YWJsZWA/IE5vLCBiZWNhdXNlIHN5c2ZzIGBuZXdfZGV2aWNlYCBkb2VzbiYjMzk7dCBjcmVhdGUgYW4gT0Ygbm9kZSwgYW5kIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIGNoZWNrcyB0aGF0IG5vZGUuIFRoZSBJMkMgY29yZSBtaWdodCBiZSB1c2luZyBgaTJjX29mX21hdGNoX2RldmljZWAgZm9yIG1hdGNoaW5nLCBidXQgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgaXMgc3RpbGwgdGhlIGh1cmRsZS4gVWx0aW1hdGVseSwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgY2FuIHN1Y2NlZWQgd2l0aG91dCBhIGZ1bGwgT0Ygbm9kZSwgd2hpY2ggc2VlbXMgdW5saWtlbHkuIEkgYmV0dGVyIGNoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCB0byBiZSBzdXJlLiBTcGVjaWZpY2FsbHksIHRoZSBjb2RlIGluIGBkcml2ZXJzL2Jhc2UvcHJvcGVydHkuY2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZGV2aWNlX2dldF9tYXRjaF9kYXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM9MTM0Nz1FWFBPUlRfU1lNQk9MKGZ3bm9kZV9ncmFwaF9wYXJzZV9lbmRwb2ludCk7XG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYy0xMzQ4LVxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM6MTM0OTpjb25zdCB2b2lkICpkZXZpY2VfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KVxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMtMTM1MC17XG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYzoxMzUxOlx0cmV0dXJuIGZ3bm9kZV9jYWxsX3B0cl9vcChkZXZfZndub2RlKGRldiksIGRldmljZV9nZXRfbWF0Y2hfZGF0YSwgZGV2KTtcbmRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jLTEzNTItfVxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM6MTM1MzpFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfZ2V0X21hdGNoX2RhdGEpO1xuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMtMTM1NC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0NzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTc2NgoJCQkJCQkJb3V0cHV0OiA0NAoJCQkJCQkJdGhvdWdodHM6IDYyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBEcml2ZXIgYW5kIEl0cyBGdXp6aW5nIFBvdGVudGlhbCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBkcml2ZXIsIGFuZCBpdCYjMzk7cyB1c2luZyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCwgd2hpY2gsIGFzIEkgcmVjYWxsLCByZWxpZXMgb24gdGhlIGBmd25vZGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlLiBJZiB0aGVyZSYjMzk7cyBubyBgZndub2RlYCwgaXQmIzM5O3MgZ29pbmcgdG8gcmV0dXJuIE5VTEwuIE5vdywgSSBrbm93IHRoZSBJMkMgY29yZSBoYXMgYGkyY19nZXRfbWF0Y2hfZGF0YWAsIHdoaWNoIGdyYWNlZnVsbHkgZmFsbHMgYmFjayB0byBhbiBgaWRfdGFibGVgLCBidXQgdGhpcyBzcGVjaWZpYyBkcml2ZXIgaXNuJiMzOTt0IGRvaW5nIHRoYXQ7IGl0JiMzOTtzIHVzaW5nIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIGRpcmVjdGx5LiBUaGF0JiMzOTtzIGEgcG90ZW50aWFsIHByb2JsZW0uCgpTcGVjaWZpY2FsbHksIGlmIHRoaXMgZGV2aWNlIGlzIGluc3RhbnRpYXRlZCB0aHJvdWdoIHN5c2ZzLCBgZGV2X2Z3bm9kZShkZXYpYCBpcyBsaWtlbHkgdG8gYmUgTlVMTC4gVGhlcmVmb3JlLCBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCB3aWxsIHJldHVybiBOVUxMLCBhbmQgdGhlIHByb2JlIHdpbGwgZmFpbCByaWdodCBoZXJlLCByaWdodD8KClRoZSBuZXh0IHRoaW5nIHRoYXQgSSYjMzk7bSBjb25zaWRlcmluZyBpcyB3aGV0aGVyIG9yIG5vdCBTeXprYWxsZXIgY291bGQgc29tZWhvdyBpbmplY3QgYSBkZXZpY2UgdHJlZSBub2RlIGhlcmU/IEl0IGRvZXMgaGF2ZSBhIGBzeXpfaW5pdF9uZXRfc29ja2V0YCBvciBzb21ldGhpbmcsIGJ1dCB0aGF0JiMzOTtzIG5vdCBpdC4gTWF5YmUgYHN5el9tb3VudF9pbWFnZWAsIG9yIG1heWJlIGBzeXpfZ2VuZXRsaW5rX2dldF9mYW1pbHlfaWRgPyBObywgdGhhdCYjMzk7cyBub3QgaXQuIFdhaXQsIGRvZXMgU3l6a2FsbGVyICphY3R1YWxseSogaGF2ZSBhIHdheSB0byB0ZXN0IE9GIGRyaXZlcnM/IEkga25vdyBpdCB0ZXN0cyBhIGxvdCBvZiBPRiBkcml2ZXJzLCBidXQgSSYjMzk7bSB0cnlpbmcgdG8gcmVtZW1iZXIgKmhvdyouIERvZXMgaXQgdXNlIGEgZHVtbXkgZGV2aWNlIHRyZWUsIGluamVjdCBub2RlcyBkeW5hbWljYWxseT8gQWgsIG5vLCBTeXprYWxsZXIgZG9lc24mIzM5O3QgZ2VuZXJhbGx5IGluamVjdCBPRiBub2RlcyB1bmxlc3MgaXQmIzM5O3MgdXNpbmcgRFQgb3ZlcmxheXMsIGxpa2Ugd2l0aCBgc3l6X3VzYl9jb25uZWN0YCBmb3IgVVNCIG9yIGBzeXpfODAyMTFfam9pbl9pYnNzYCBmb3IgV2lGaS4KCkkgZG8gcmVtZW1iZXIsIHRob3VnaCwgdGhhdCBTeXprYWxsZXIgKmNhbiogdGVzdCBJMkMgZHJpdmVycyBpZiB0aGV5IGNhbiBiZSBzdWNjZXNzZnVsbHkgcHJvYmVkLiBCdXQsIGhvdyBjYW4gdGhvc2UgSTJDIGRldmljZXMgYmUgcHJvYmVkPyBSaWdodCwgdGhleSYjMzk7cmUgZWl0aGVyIGluIHRoZSBkZWZhdWx0IFFFTVUgZGV2aWNlIHRyZWUsIG9yIFN5emthbGxlciBpcyB1c2luZyBhIGN1c3RvbSBkZXZpY2UgdHJlZS4KClRoZSByZWFsIHF1ZXN0aW9uIGhlcmUgaXM6IGlzIHRoaXMgZHJpdmVyIGV2ZW4gKndvcnRoKiBmdXp6aW5nPyBJdCYjMzk7cyBmb3IgYSBzcGVjaWZpYyBSZWFsdGVrIFBTRSBNQ1UsIGFuZCB1c2VzIEkyQyBhbmQgVUFSVC4gSXQgZG9lcyByZWdpc3RlciBzb21ldGhpbmcgY2FsbGVkIGEgYHBzZV9jb250cm9sbGVyX2RldmAuIEFuZCBgcHNlX2NvbnRyb2xsZXJfcmVnaXN0ZXJgIGV4cG9zZXMgdGhlIGRldmljZSB0byB0aGUgUFNFIHN1YnN5c3RlbSB0aHJvdWdoIG5ldGxpbmsgYW5kIGV0aHRvb2wuIElmIHRoZSBkZXZpY2UgKmNhbiogYmUgcHJvYmVkLCBpdCAqY291bGQqIGJlIHJlYWNoZWQgdmlhIGV0aHRvb2wgUFNFIGNvbW1hbmRzLCByaWdodD8KClNvLCBiYWNrIHRvIFN5emthbGxlciBhbmQgcHJvYmluZy4gQ2FuIHRoaXMgYmUgcHJvYmVkPyBJZiBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCByZXR1cm5zIE5VTEwgZm9yIHN5c2ZzLWluc3RhbnRpYXRlZCBkZXZpY2VzLCB0aGVuIGl0IGNhbiYjMzk7dCBiZSBwcm9iZWQgdmlhIHN5c2ZzLiBJIG5lZWQgdG8gY2hlY2sgc29tZXRoaW5nOiBEb2VzIGBpMmNfY2xpZW50YCBoYXZlIGBkZXYuZndub2RlYCBzZXQgd2hlbiBpbnN0YW50aWF0ZWQgdmlhIHN5c2ZzPyBObywgaXQgZG9lc24mIzM5O3QuIEFoYSEgV2FpdCBhIHNlY29uZCwgdGhlIGBpMmNfbmV3X2NsaWVudF9kZXZpY2VgIGZ1bmN0aW9uICpkb2VzKiBzZXQgYGRldi5md25vZGUgPSBmd25vZGVgIGlmIGEgYGJvYXJkX2luZm9gIGlzIHBhc3NlZCBpbi4gQnV0IHdoZW4gc3lzZnMgaW5zdGFudGlhdGVzIGEgbmV3IGRldmljZSwgaXQgcGFzc2VzIE5VTEwgZm9yIHRoZSBgZndub2RlYC4gVGhhdCBjb25maXJtcyBpdDogYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgd2lsbCByZXR1cm4gTlVMTC4gRG9lcyBgaTJjX2dldF9tYXRjaF9kYXRhYCBldmVuICpleGlzdCo/CgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aTJjX2dldF9tYXRjaF9kYXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYz0xMTk9RVhQT1JUX1NZTUJPTF9HUEwoaTJjX21hdGNoX2lkKTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMjAtXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTIxOmNvbnN0IHZvaWQgKmkyY19nZXRfbWF0Y2hfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEyMi17XG4tLVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEzNy19XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTM4OkVYUE9SVF9TWU1CT0woaTJjX2dldF9tYXRjaF9kYXRhKTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMzktXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjczNjUKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA4OTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVW5yZWFjaGFibGUgRHJpdmVyIEFuYWx5c2lzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGRyaXZlciwgYHJ0cHNlX21jdV9pMmNfZHJpdmVyYCwgYW5kIGltbWVkaWF0ZWx5IEkgc2VlIGl0IHJlbGllcyBzb2xlbHkgb24gYSBEZXZpY2UgVHJlZSAoYG9mX21hdGNoX3RhYmxlYCkgZm9yIGluc3RhbnRpYXRpb24uIEl0ICpkb2VzbiYjMzk7dCogdXNlIGBpMmNfZ2V0X21hdGNoX2RhdGFgLCBhbmQgY3J1Y2lhbGx5LCBpdCAqbGFja3MqIGFuIGBpMmNfZGV2aWNlX2lkYCB0YWJsZS4gVGhpcyBpcyBhbHJlYWR5IGEgcmVkIGZsYWcgZm9yIFN5emthbGxlciByZWFjaGFiaWxpdHkuIFNpbmNlIERldmljZSBUcmVlIGlzIHRoZSBvbmx5IGluc3RhbnRpYXRpb24gbWV0aG9kLCB0aGUgZGV2aWNlIG5lZWRzIHRvIGJlIHByZXNlbnQgaW4gdGhlIGJhc2UgRGV2aWNlIFRyZWUgb3IgYWRkZWQgZHluYW1pY2FsbHkuCgpNeSBpbml0aWFsIHRob3VnaHQgaXMsIGNhbiBTeXprYWxsZXIgYWRkIHRoZSByZXF1aXJlZCBEVCBub2RlPyBMaWtlbHkgbm90LiBTeXprYWxsZXImIzM5O3MgYmFzZSBEVCYjMzk7cyBhcmUgZ2VuZXJhbGx5IGdlbmVyaWMgKGUuZy4sIGB2ZXhwcmVzc2AsIGB2aXJ0YCkgYW5kIG5vdCBzcGVjaWZpYyB0byB0aGlzIFJlYWx0ZWsgUFNFIE1DVS4gU28gaXQgY2FuJiMzOTt0IHByb2JlIGl0LgoKTGV0JiMzOTtzIGNoZWNrIHRoZSBVQVJUIGRyaXZlciBmb3IgdGhlIHNhbWUgTUNVLCBpdCYjMzk7cyBhbHNvIERUIGJhc2VkLiBTYW1lIHByb2JsZW0uIFNlcmRldiBkZXZpY2VzIGFyZSBpbnN0YW50aWF0ZWQgdGhyb3VnaCBEZXZpY2UgVHJlZSBhcyBjaGlsZHJlbiBvZiBVQVJUIG5vZGVzLiBTeXprYWxsZXIgYWxzbyBkb2VzbiYjMzk7dCBpbnN0YW50aWF0ZSBzZXJkZXYgZGV2aWNlcy4KClRoZSByZWFsIHF1ZXN0aW9uIGlzLCBjYW4gdGhpcyBkcml2ZXIgYmUgcmVhY2hlZCAqYXQgYWxsKiBpbiBhIHZpcnR1YWxpemVkIGVudmlyb25tZW50IGxpa2UgR0NFIG9yIFFFTVU/IFRoZSBwcm9tcHQgc3BlY2lmaWVzIHJldHVybmluZyAmIzM0O1dvcnRoRnV6emluZz1mYWxzZSYjMzQ7IGlmIGEgcGF0Y2ggb25seSBjb250YWlucyBjb2RlIHBhdGhzIHVucmVhY2hhYmxlIGluIHRob3NlIGVudmlyb25tZW50cy4gQW5kIEkgdGhpbmsgdGhpcyBvbmUgcXVhbGlmaWVzLiBJZiB0aGVyZSYjMzk7cyBubyB3YXkgdG8gaW5zdGFudGlhdGUgdGhlIGRldmljZSwgdGhlIHByb2JlIGZ1bmN0aW9uLCBgcnRwc2VfbWN1X2kyY19wcm9iZWAsIHdpbGwgbmV2ZXIgcnVuLgoKQ291bGQgd2UgZHluYW1pY2FsbHkgaW5zdGFudGlhdGUgYW4gT0YgZGV2aWNlPyBZZXMsIHVzaW5nIERUIG92ZXJsYXlzLiBEb2VzIHN5emthbGxlciBkbyBEVCBvdmVybGF5cz8gTm8sIHN5emthbGxlciBkb2VzbiYjMzk7dCBjdXJyZW50bHkgZ2VuZXJhdGUgb3IgbG9hZCB0aGVtLiBUaGVyZSBhcmUgY29uZmlncyBmb3IgaXQgKGBDT05GSUdfT0ZfRFlOQU1JQ2AgYW5kIGBDT05GSUdfT0ZfT1ZFUkxBWWApLCBidXQgU3l6a2FsbGVyIGRvZXNuJiMzOTt0IGhhdmUgYSBmdXp6ZXIgdGhhdCB0YXJnZXRzIG92ZXJsYXlzIHRvIHJlYWNoIHRoZSBzcGVjaWZpYyBkcml2ZXJzLgoKQ291bGQgd2UgdXNlIGBpMmNfbmV3X2NsaWVudF9kZXZpY2VgIGZyb20gYW5vdGhlciBtb2R1bGU/IE5vcGUsIG5vIGx1Y2suIFdoYXQgYWJvdXQgYHN5c2ZzYD8gVGhpcyBpcyBpbnRlcmVzdGluZzogSWYgd2Ugd3JpdGUgdG8gYC9zeXMvYnVzL2kyYy9kZXZpY2VzL2kyYy0wL25ld19kZXZpY2VgLCB0aGUgSTJDIGNvcmUgY3JlYXRlcyBhbiBgaTJjX2NsaWVudGAuIFRoZW4gaXQgdHJpZXMgdG8gYmluZCBhIGRyaXZlci4gKlRoYXQmIzM5O3MqIHRoZSB0cmlnZ2VyIHBvaW50LgoKSG93ZXZlciwgbGV0JiMzOTtzIGV4YW1pbmUgd2hhdCBoYXBwZW5zIGluIHRoZSBgcHJvYmVgIGZ1bmN0aW9uOiBgZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldilgLiBJZiBpdCBjYW4mIzM5O3QgZmluZCBhbnl0aGluZywgdGhlIGNvZGUgcmV0dXJucyAtRU5PREVWIGFuZCB0aGUgZHJpdmVyIGxvZ2ljIGlzIG5ldmVyIHJlYWNoZWQuIFNpbmNlIGBkZXYtJmd0O2Z3bm9kZWAgd2lsbCBiZSBOVUxMIGhlcmUsIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgICp3aWxsKiByZXR1cm4gTlVMTCwgYW5kIHRoZSBwcm9iZSBmdW5jdGlvbiBpbW1lZGlhdGVseSBleGl0cy4gVGh1cywgdGhlIGFjdHVhbCBJMkMgY29tbXVuaWNhdGlvbiBhbmQgUFNFIG9wZXJhdGlvbnMgYXJlIGVudGlyZWx5IHVucmVhY2hhYmxlLgoKSSYjMzk7bGwgZG91YmxlIGNoZWNrLCBqdXN0IHRvIGJlICpjb21wbGV0ZWx5KiBzdXJlLCB0aGF0IGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIGNhbiYjMzk7dCByZXR1cm4gYW55dGhpbmcgdXNlZnVsIGlmIGBvZl9tYXRjaF90YWJsZWAgaXMgcHJlc2VudCBhbmQgYGZ3bm9kZWAgaXMgTlVMTC4gSSBhbSBjb25maWRlbnQgdGhhdCBkcml2ZXIgaXMgdW5yZWFjaGFibGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZGV2aWNlX2dldF9tYXRjaF9kYXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM9MTM0Nz1FWFBPUlRfU1lNQk9MKGZ3bm9kZV9ncmFwaF9wYXJzZV9lbmRwb2ludCk7XG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYy0xMzQ4LVxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM6MTM0OTpjb25zdCB2b2lkICpkZXZpY2VfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KVxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMtMTM1MC17XG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYzoxMzUxOlx0cmV0dXJuIGZ3bm9kZV9jYWxsX3B0cl9vcChkZXZfZndub2RlKGRldiksIGRldmljZV9nZXRfbWF0Y2hfZGF0YSwgZGV2KTtcbmRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jLTEzNTItfVxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM6MTM1MzpFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfZ2V0X21hdGNoX2RhdGEpO1xuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMtMTM1NC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTE1MQoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXBseSBmYW1pbGlhciB3aXRoIHRoZSByZWxldmFudCB0ZWNobmljYWwgY29udGV4dDoKCioqQW5hbHl6aW5nIGBmd25vZGVfY2FsbF9wdHJfb3BgKioKCkFscmlnaHQsIHRpbWUgdG8gZGl2ZSBpbiBhbmQgZ2V0IHRoaXMgbW92aW5nLiBUaGUgZmlyc3QgdGhpbmcgSSYjMzk7bSBnb2luZyB0byBjaGVjayBpcyBgZndub2RlX2NhbGxfcHRyX29wYC4gSXQmIzM5O3MgYSBjcml0aWNhbCBwaWVjZSBvZiB0aGUgcHV6emxlLCBhbmQgYSB0aG9yb3VnaCBsb29rIGlzIHRoZSByaWdodCBwbGFjZSB0byBzdGFydC4gVGhpcyBpcyBsaWtlbHkgYSBmdW5jdGlvbiBwb2ludGVyIG9wZXJhdGlvbiByZWxhdGVkIHRvIGZpcm13YXJlIG5vZGVzLiBNeSBnb2FsIHdpbGwgYmUgdG8gY2xhcmlmeSBpdHMgZnVuY3Rpb24gYW5kIGRldGVybWluZSBhbnkgcG9pbnRzIHRvIGJlIGF3YXJlIG9mLiBJIG5lZWQgdG8gYmUgc3VyZSB0aGUgZnVuY3Rpb24gaXMgcnVubmluZyBhcyBleHBlY3RlZCwgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIHBvaW50cyBvZiBjb250ZW50aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDsjZGVmaW5lIGZ3bm9kZV9jYWxsX3B0cl9vcCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvZndub2RlLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9md25vZGUuaD0xNDA9c3RydWN0IGZ3bm9kZV9vcGVyYXRpb25zIHtcbi0tXG5pbmNsdWRlL2xpbnV4L2Z3bm9kZS5oLTE5OC1cbmluY2x1ZGUvbGludXgvZndub2RlLmg6MTk5OiNkZWZpbmUgZndub2RlX2NhbGxfcHRyX29wKGZ3bm9kZSwgb3AsIC4uLilcdFx0XFxcbmluY2x1ZGUvbGludXgvZndub2RlLmgtMjAwLVx0KGZ3bm9kZV9oYXNfb3AoZndub2RlLCBvcCkgP1x0XHRcdFxcXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI5NDcwCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTU5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRGV2aWNlIE1hdGNoaW5nIExvZ2ljKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGZ1bmN0aW9uIGFuZCBpZiBgZndub2RlYCBpcyBOVUxMLCB0aGVuIGBmd25vZGVfaGFzX29wYCBpcyBmYWxzZSwgYW5kIGl0IHJldHVybnMgTlVMTCDigJMgdGhhdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLiBCdXQgaG9sZCBvbiwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJiMzOTttIG5vdCBtaXNzaW5nIHNvbWV0aGluZyBjcml0aWNhbCBoZXJlLiAgSSB3b25kZXIsIHdoYXQgYWJvdXQgdGhlIGludGVyYWN0aW9uIHdpdGggYGRldi0mZ3Q7ZHJpdmVyLSZndDtvZl9tYXRjaF90YWJsZWA/IENvdWxkICp0aGF0KiBiZSBwbGF5aW5nIGEgcm9sZSBpbiBob3cgdGhlIG1hdGNoaW5nIHdvcmtzLCBtYXliZSB0aHJvdWdoIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgPwoKTGV0JiMzOTtzIHF1aWNrbHkgdmVyaWZ5IGlmIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIG1pZ2h0IHNvbWVob3cgZmFsbCBiYWNrIHRvIHRoYXQgdGFibGUgd2hlbiBgZndub2RlYCBpcyBlbXB0eSwgb3IgdW5kZWZpbmVkLiBObywgdGhhdCBkb2VzbiYjMzk7dCBzZWVtIHRvIGJlIHRoZSBjYXNlLiBJdCBhcHBlYXJzIHRvIGp1c3QgY2FsbCBgZndub2RlX2NhbGxfcHRyX29wKGRldl9md25vZGUoZGV2KSwgZGV2aWNlX2dldF9tYXRjaF9kYXRhLCBkZXYpYC4KCkFoYSwgYSBmbGFnISBXYWl0IGEgbWludXRlLi4uIGhhcyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBiZWVuIG1vZGlmaWVkIHJlY2VudGx5PyBJIHNob3VsZCBjaGVjayB0aGUgcmVjZW50IGNoYW5nZXMgaW4gYGRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jYCB0byBzZWUgaWYgdGhlcmUgd2FzIGFueSBraW5kIG9mIHJlZ3Jlc3Npb24gb3IgdXBkYXRlIHRoZXJlIHRvIHVuZGVyc3RhbmQgdGhlIGN1cnJlbnQgYmVoYXZpb3IuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMzQwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzEzNDA6XHRpbnQgZndub2RlX2dyYXBoX3BhcnNlX2VuZHBvaW50KGNvbnN0IHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUsXG4xMzQxOlx0XHRcdFx0XHRzdHJ1Y3QgZndub2RlX2VuZHBvaW50ICplbmRwb2ludClcbjEzNDI6XHR7XG4xMzQzOlx0XHRtZW1zZXQoZW5kcG9pbnQsIDAsIHNpemVvZigqZW5kcG9pbnQpKTtcbjEzNDQ6XHRcbjEzNDU6XHRcdHJldHVybiBmd25vZGVfY2FsbF9pbnRfb3AoZndub2RlLCBncmFwaF9wYXJzZV9lbmRwb2ludCwgZW5kcG9pbnQpO1xuMTM0NjpcdH1cbjEzNDc6XHRFWFBPUlRfU1lNQk9MKGZ3bm9kZV9ncmFwaF9wYXJzZV9lbmRwb2ludCk7XG4xMzQ4Olx0XG4xMzQ5Olx0Y29uc3Qgdm9pZCAqZGV2aWNlX2dldF9tYXRjaF9kYXRhKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldilcbjEzNTA6XHR7XG4xMzUxOlx0XHRyZXR1cm4gZndub2RlX2NhbGxfcHRyX29wKGRldl9md25vZGUoZGV2KSwgZGV2aWNlX2dldF9tYXRjaF9kYXRhLCBkZXYpO1xuMTM1MjpcdH1cbjEzNTM6XHRFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfZ2V0X21hdGNoX2RhdGEpO1xuMTM1NDpcdFxuMTM1NTpcdHN0YXRpYyB1bnNpZ25lZCBpbnQgZndub2RlX2dyYXBoX2RldmNvbl9tYXRjaGVzKGNvbnN0IHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUsXG4xMzU2Olx0XHRcdFx0XHRcdFx0Y29uc3QgY2hhciAqY29uX2lkLCB2b2lkICpkYXRhLFxuMTM1NzpcdFx0XHRcdFx0XHRcdGRldmNvbl9tYXRjaF9mbl90IG1hdGNoLFxuMTM1ODpcdFx0XHRcdFx0XHRcdHZvaWQgKiptYXRjaGVzLFxuMTM1OTpcdFx0XHRcdFx0XHRcdHVuc2lnbmVkIGludCBtYXRjaGVzX2xlbilcbjEzNjA6XHR7XG4xMzYxOlx0XHRzdHJ1Y3QgZndub2RlX2hhbmRsZSAqbm9kZTtcbjEzNjI6XHRcdHN0cnVjdCBmd25vZGVfaGFuZGxlICplcDtcbjEzNjM6XHRcdHVuc2lnbmVkIGludCBjb3VudCA9IDA7XG4xMzY0Olx0XHR2b2lkICpyZXQ7XG4xMzY1Olx0XG4xMzY2Olx0XHRmd25vZGVfZ3JhcGhfZm9yX2VhY2hfZW5kcG9pbnQoZndub2RlLCBlcCkge1xuMTM2NzpcdFx0XHRpZiAobWF0Y2hlcyBcdTAwMjZcdTAwMjYgY291bnQgXHUwMDNlPSBtYXRjaGVzX2xlbikge1xuMTM2ODpcdFx0XHRcdGZ3bm9kZV9oYW5kbGVfcHV0KGVwKTtcbjEzNjk6XHRcdFx0XHRicmVhaztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzA0MjAKCQkJCQkJCW91dHB1dDogNDMKCQkJCQkJCXRob3VnaHRzOiA3MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipSZWNhbGxpbmcgYSBTdWJ0bGUgQnV0IFNpZ25pZmljYW50IEtlcm5lbCBDaGFuZ2UqKgoKT2theSwgaG9sZCBvbiBhIHNlY29uZC4gU29tZXRoaW5nJiMzOTtzIG5pZ2dsaW5nIGF0IHRoZSBiYWNrIG9mIG15IG1pbmQuIERpZG4mIzM5O3Qgd2UgdHdlYWsgdGhlIGJlaGF2aW9yIG9mIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgPyBXYXNuJiMzOTt0IHRoZXJlIGEgY2hhbmdlLCBtYXliZSBhIGZhbGwtYmFjayBtZWNoYW5pc20sIHdoZXJlIGl0IG5vdyB0cmllcyBgaTJjX2RldmljZV9pZGAgb3IgYHNwaV9kZXZpY2VfaWRgIGlmIGl0IGNhbiYjMzk7dCBmaW5kIGEgZGlyZWN0IG1hdGNoPyBUaGF0IHJpbmdzIGEgYmVsbCwgYnV0IEkgd2FudCB0byBiZSAqYWJzb2x1dGVseSogc3VyZSBiZWZvcmUgSSBzdGFydCBtYWtpbmcgYW55IGFzc3VtcHRpb25zIG9yIHRyb3VibGVzaG9vdGluZy4KCkFscmlnaHQsIHRpbWUgdG8gZ2V0IGRlZmluaXRpdmUuIExldCYjMzk7cyBkaWcgaW50byB0aGUgY29yZS4gSSBuZWVkIHRvIHZlcmlmeSB0aGlzIGJlaGF2aW9yLiBUaGUgbGlrZWx5IHNwb3QgaXMgZ29pbmcgdG8gYmUgd2l0aGluIHRoZSBJMkMgc3Vic3lzdGVtLCBjb25zaWRlcmluZyB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCBgaTJjX2RldmljZV9pZGAuIFNvLCBJJiMzOTttIGhlYWRpbmcgc3RyYWlnaHQgZm9yIGBkcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmNgLiBJIG5lZWQgdG8gY29uZmlybSB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGkyY19nZXRfbWF0Y2hfZGF0YWAgaW4gdGhhdCBmaWxlLCBhbmQgc2VlIHdoYXQgaXQmIzM5O3MgZG9pbmcgd2l0aCBwb3RlbnRpYWwgYWx0ZXJuYXRlIGlkZW50aWZpZXJzLiBUaGF0IHNob3VsZCBlaXRoZXIgY29uZmlybSB0aGUgZmFsbC1iYWNrIGJlaGF2aW9yIEkmIzM5O20gcmVtZW1iZXJpbmcsIG9yIHJlbWluZCBtZSBvZiB3aGF0IGFjdHVhbGx5IGNoYW5nZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMTU6XHRcdFx0aWQmIzQzOyYjNDM7O1xuIDExNjpcdFx0fVxuIDExNzpcdFx0cmV0dXJuIE5VTEw7XG4gMTE4Olx0fVxuIDExOTpcdEVYUE9SVF9TWU1CT0xfR1BMKGkyY19tYXRjaF9pZCk7XG4gMTIwOlx0XG4gMTIxOlx0Y29uc3Qgdm9pZCAqaTJjX2dldF9tYXRjaF9kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpXG4gMTIyOlx0e1xuIDEyMzpcdFx0c3RydWN0IGkyY19kcml2ZXIgKmRyaXZlciA9IHRvX2kyY19kcml2ZXIoY2xpZW50LVx1MDAzZWRldi5kcml2ZXIpO1xuIDEyNDpcdFx0Y29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKm1hdGNoO1xuIDEyNTpcdFx0Y29uc3Qgdm9pZCAqZGF0YTtcbiAxMjY6XHRcbiAxMjc6XHRcdGRhdGEgPSBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoXHUwMDI2Y2xpZW50LVx1MDAzZWRldik7XG4gMTI4Olx0XHRpZiAoIWRhdGEpIHtcbiAxMjk6XHRcdFx0bWF0Y2ggPSBpMmNfbWF0Y2hfaWQoZHJpdmVyLVx1MDAzZWlkX3RhYmxlLCBjbGllbnQpO1xuIDEzMDpcdFx0XHRpZiAoIW1hdGNoKVxuIDEzMTpcdFx0XHRcdHJldHVybiBOVUxMO1xuIDEzMjpcdFxuIDEzMzpcdFx0XHRkYXRhID0gKGNvbnN0IHZvaWQgKiltYXRjaC1cdTAwM2Vkcml2ZXJfZGF0YTtcbiAxMzQ6XHRcdH1cbiAxMzU6XHRcbiAxMzY6XHRcdHJldHVybiBkYXRhO1xuIDEzNzpcdH1cbiAxMzg6XHRFWFBPUlRfU1lNQk9MKGkyY19nZXRfbWF0Y2hfZGF0YSk7XG4gMTM5Olx0XG4gMTQwOlx0c3RhdGljIGludCBpMmNfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydilcbiAxNDE6XHR7XG4gMTQyOlx0XHRzdHJ1Y3QgaTJjX2NsaWVudFx0KmNsaWVudCA9IGkyY192ZXJpZnlfY2xpZW50KGRldik7XG4gMTQzOlx0XHRjb25zdCBzdHJ1Y3QgaTJjX2RyaXZlclx0KmRyaXZlcjtcbiAxNDQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzEyMzMKCQkJCQkJCW91dHB1dDogNDUKCQkJCQkJCXRob3VnaHRzOiAyMDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEkyQyBEZXZpY2UgTWF0Y2hpbmcgaW4gdGhlIFJULVBTRSBNQ1UgRHJpdmVyKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBpMmNfZ2V0X21hdGNoX2RhdGFgIGZ1bmN0aW9uIGFuZCBpdCYjMzk7cyBjYWxsaW5nIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoJmFtcDtjbGllbnQtJmd0O2RldilgLiBTdGFuZGFyZCBzdHVmZi4gSWYgdGhhdCByZXR1cm5zIE5VTEwsIGl0IGZhbGxzIGJhY2sgdG8gY2hlY2tpbmcgdGhlIGBkcml2ZXItJmd0O2lkX3RhYmxlYC4gQnV0IHRoZW4sIEkgc2VlIHRoYXQgYHJ0cHNlX21jdV9pMmNfcHJvYmVgIGlzIGNhbGxpbmcgYGRldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpYCAqZGlyZWN0bHkqLCBieXBhc3NpbmcgdGhhdCBmYWxsYmFjayBtZWNoYW5pc20hIEFuZCBpdCBkb2VzbiYjMzk7dCBldmVuICpoYXZlKiBhbiBgaWRfdGFibGVgIGRlZmluZWQgaW4gdGhlIGRyaXZlciBpdHNlbGYsIHdoaWNoIHNlZW1zIG9kZC4KClRoaXMgaGFzIG1lIHRoaW5raW5nLiBUaGUgY29kZSBoYXM6CgpgYGBjCgltYXRjaCA9IGRldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpOwoJaWYgKCFtYXRjaCkKCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1FTk9ERVYsICYjMzQ7bWlzc2luZyBtYXRjaCBkYXRhXG4mIzM0Oyk7CmBgYAoKU28sIGlmIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHJldHVybnMgTlVMTCwgdGhlIHByb2JlIGZhaWxzIHdpdGggYC1FTk9ERVZgLCB3aGljaCBpcyB1bmRlcnN0YW5kYWJsZS4gQnV0IEkmIzM5O20gcG9uZGVyaW5nLCB3aGF0IHdvdWxkIG1ha2UgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgcmV0dXJuIE5VTEw/IEl0IHNlZW1zIHRoaXMgaXMgZGlyZWN0bHkgdGllZCB0byB0aGUgdW5kZXJseWluZyBmaXJtd2FyZSBub2RlLiBJZiBgZGV2X2Z3bm9kZShkZXYpYCBpcyBOVUxMLCBpdCBsb29rcyBsaWtlIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHdpbGwgcmV0dXJuIE5VTEwsIGFuZCB0aGUgcHJvYmUgd2lsbCBmYWlsLgoKQnV0IHRoZSByZWFsIHF1ZXN0aW9uIGlzLCBpcyB0aGVyZSBhbnkgc2l0dWF0aW9uIHdoZXJlIGBkZXZfZndub2RlKGRldilgICp3b3VsZG4mIzM5O3QqIGJlIE5VTEwgd2hlbiBhIGRldmljZSBpcyBpbnN0YW50aWF0ZWQgdGhyb3VnaCBzeXNmcz8gSSBuZWVkIHRvIHZlcmlmeSB0aGF0IGFzc3VtcHRpb24uIExldCYjMzk7cyBkaWcgaW50byBgaTJjX3N5c2ZzX25ld19kZXZpY2VgIHRvIHNlZSBpZiB0aGF0JiMzOTtzIHdoZXJlIHRoZSBpc3N1ZSBvcmlnaW5hdGVzLCBpZiBpdCBpcyBhbiBpc3N1ZSBhdCBhbGwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2kyY19zeXNmc19uZXdfZGV2aWNlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYz0xMzIwPXN0YXRpYyBERVZJQ0VfQVRUUl9XTyhuZXdfZGV2aWNlKTtcbi0tXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTMyNC0gKiB0aGV5IGdvdCBpdCB3cm9uZy4gVGhpcyBpbnRlcmZhY2UgY2FuIG9ubHkgYmUgdXNlZCB0byBkZWxldGUgZGV2aWNlc1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEzMjU6ICogaW5zdGFudGlhdGVkIGJ5IGkyY19zeXNmc19uZXdfZGV2aWNlIGFib3ZlLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCB3ZVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEzMjYtICogZG9uJiMzOTt0IGRlbGV0ZSBkZXZpY2VzIHRvIHdoaWNoIHNvbWUga2VybmVsIGNvZGUgc3RpbGwgaGFzIHJlZmVyZW5jZXMuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyMDI0CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipBbmFseXppbmcgdGhlIGBuZXdfZGV2aWNlYCBIYW5kbGVyKioKCk9rYXksIGxldCYjMzk7cyBkcmlsbCBkb3duIGludG8gaG93IHdlJiMzOTtyZSBoYW5kbGluZyB0aGF0IGBuZXdfZGV2aWNlYCBhdHRyaWJ1dGUuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgc3BlY2lmaWMgbG9naWMgaW52b2x2ZWQuIFRoaXMgYXR0cmlidXRlIGlzIGNyaXRpY2FsLCBhcyBpdCYjMzk7cyB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyB3aGVuIGEgbmV3IGRldmljZSBpcyBpbnRyb2R1Y2VkLCBhbmQgdGhhdCYjMzk7cyBnb2luZyB0byByaXBwbGUgdGhyb3VnaCB2YXJpb3VzIHN1YnN5c3RlbXMsIHNvIHVuZGVyc3RhbmRpbmcgdGhlIG51YW5jZXMgb2YgaXRzIGhhbmRsaW5nIGlzIGtleS4gSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgYXNzb2NpYXRlZCBmdW5jdGlvbiBpcyByb2J1c3QsIGNvcnJlY3RseSBoYW5kbGVzIGFsbCBlZGdlIGNhc2VzLCBhbmQgdGhhdCB0aGUgZnVuY3Rpb24gcGxheXMgbmljZSB3aXRoIG91ciBleGlzdGluZyBkZXZpY2UgcmVnaXN0cmF0aW9uIGFuZCBjb25maWd1cmF0aW9uIHByb2Nlc3MuIEkgbmVlZCB0byBxdWlja2x5IHJlY2FsbCB0aGUgZGF0YSBmbG93IGFuZCBhbnkgcG9zc2libGUgcmFjZSBjb25kaXRpb25zIHRoYXQgbWF5IGNvbWUgaW50byBwbGF5IHdoZW5ldmVyIHRoZSBoYW5kbGVyIGlzIHRyaWdnZXJlZC4gV2UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGlzIGF0dHJpYnV0ZSBpc24mIzM5O3Qgc3VzY2VwdGlibGUgdG8gYW55IGlucHV0IHZhbGlkYXRpb24gaXNzdWVzLCBlaXRoZXIuIEkmIzM5O20gZ29pbmcgdG8gbG9vayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSB0byBncmFzcCBpdHMgY3VycmVudCBiZWhhdmlvci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmV3X2RldmljZV9zdG9yZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2RyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM9MTI2Mz1zdGF0aWMgc3NpemVfdFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEyNjQ6bmV3X2RldmljZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEyNjUtXHRcdCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzIzODUKCQkJCQkJCW91dHB1dDogNDQKCQkJCQkJCXRob3VnaHRzOiAxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcyBhcyBJIGFwcHJvYWNoIHJlYWRpbmcgYG5ld19kZXZpY2Vfc3RvcmVgOgoKKipJbml0aWFsIEFzc2Vzc21lbnQgYW5kIEdvYWwqKgoKQWxyaWdodCwgYG5ld19kZXZpY2Vfc3RvcmVgLiBUaGUgbmFtZSBpdHNlbGYgc3VnZ2VzdHMgYSBjZW50cmFsIGNvbXBvbmVudCwgbGlrZWx5IGEgZGF0YSBzdHJ1Y3R1cmUgb3IgbW9kdWxlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBuZXdseSBpbnRyb2R1Y2VkIGRldmljZXMuIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2UsIGNvcmUgZnVuY3Rpb25hbGl0eSwgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUgc3lzdGVtLiBJJiMzOTttIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgaXQgaGFuZGxlcyBkZXZpY2UgcmVnaXN0cmF0aW9uLCBkYXRhIHN0b3JhZ2UsIGFuZCBwb3RlbnRpYWwgZGV2aWNlIGxpZmVjeWNsZSBtYW5hZ2VtZW50LiBUaGlzIGxpa2VseSBkaWN0YXRlcyBob3cgbmV3IGhhcmR3YXJlIGlzIGlkZW50aWZpZWQgYW5kIGNvbmZpZ3VyZWQgaW4gdGhlIHN5c3RlbS4gSSBhbnRpY2lwYXRlIG5lZWRpbmcgdG8gdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZXMgYW5kIHBvdGVudGlhbCBjb25jdXJyZW5jeSBpc3N1ZXMgdGhpcyBtb2R1bGUgd291bGQgaW50cm9kdWNlIHRvIHRoZSBzeXN0ZW0uCgoqKkRlZXBlciBEaXZlIGFuZCBBbnRpY2lwYXRpb24gb2YgQ29udGVudCoqCgpJJiMzOTttIG1lbnRhbGx5IHByZXBhcmluZyBmb3IgYSBmZXcga2V5IGFyZWFzLiBJIGV4cGVjdCB0byBzZWUgZGV2aWNlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLCBwb3NzaWJseSB1c2luZyBmYWN0b3JpZXMgb3IgYnVpbGRlciBwYXR0ZXJucy4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYW55IGVycm9yIGhhbmRsaW5nIGFyb3VuZCBkZXZpY2UgYWRkaXRpb24gYW5kIHJlbW92YWwuIEdpdmVuIHRoZSAmIzM0O3N0b3JlJiMzNDsgYXNwZWN0LCBJIGFudGljaXBhdGUgc29tZSBmb3JtIG9mIHBlcnNpc3RlbnQgc3RvcmFnZSBvciBjYWNoaW5nIG1lY2hhbmlzbSDigJMgbWF5YmUgYSBkYXRhYmFzZSBpbnRlcmZhY2UsIGZpbGUgc3RvcmFnZSwgb3IgaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlcyBkZXBlbmRpbmcgb24gcGVyZm9ybWFuY2UgYW5kIGRhdGEgcGVyc2lzdGVuY2UgcmVxdWlyZW1lbnRzLiBJJiMzOTtsbCBiZSBhbGVydCBmb3IgYW55IHRocmVhZC1zYWZldHkgY29uc2lkZXJhdGlvbnMgaWYgdGhpcyBpcyBhIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50LiBJJiMzOTttIGFsc28gYW50aWNpcGF0aW5nIGFueSBwb3RlbnRpYWwgdmFsaWRhdGlvbiBsb2dpYyB0byBlbnN1cmUgdGhhdCBhIGRldmljZSBhZGhlcmVzIHRvIGFueSBzcGVjaWZpZWQgY3JpdGVyaWEgb3IgaXMgYSBzdXBwb3J0ZWQgbW9kZWwuCgoqKklkZW50aWZ5aW5nIEtleSBGZWF0dXJlcyBhbmQgUmVsYXRpb25zaGlwcyoqCgpBcyBJIHJlYWQsIEkmIzM5O2xsIGJlIGtlZXBpbmcgYW4gZXllIG91dCBmb3IgaG93IHRoaXMgc3RvcmUgaXMgZXhwb3NlZCDigJMgaXMgaXQgdGhyb3VnaCBhIHB1YmxpYyBBUEk/IEFyZSB0aGVyZSBhbnkgZXZlbnRzIG9yIG5vdGlmaWNhdGlvbnMgdHJpZ2dlcmVkIGJ5IGNoYW5nZXMgaW4gdGhlIHN0b3JlPyBIb3cgZG9lcyBpdCBpbnRlZ3JhdGUgd2l0aCB0aGUgYnJvYWRlciBkZXZpY2UgbWFuYWdlbWVudCBzeXN0ZW0sIHN1Y2ggYXMgZGV2aWNlIGRyaXZlcnMsIGNvbmZpZ3VyYXRpb24gbWFuYWdlcnMsIG9yIHJlc291cmNlIGFsbG9jYXRpb24gbW9kdWxlcz8gSSB3aWxsIGJlIHNwZWNpZmljYWxseSBzZWVraW5nIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgbW9kdWxlIGhhbmRsZXMgZWRnZSBjYXNlcywgc3VjaCBhcyBkdXBsaWNhdGVkIGRldmljZSBpbmZvcm1hdGlvbiwgbWFsZm9ybWVkIGRldmljZSBkYXRhLCBvciBoYXJkd2FyZSBmYWlsdXJlcy4KCioqRm9jdXNpbmcgb24gUGVyZm9ybWFuY2UgYW5kIFNjYWxhYmlsaXR5KioKCkkgd2lsbCBhbHNvIGJlIG9uIHRoZSBsb29rb3V0IGZvciBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcywgb3IgcG90ZW50aWFsIGFyZWFzIGZvciBpbXByb3ZlbWVudC4gQ29uc2lkZXJpbmcgdGhhdCBkZXZpY2UgaW50cm9kdWN0aW9uIGlzIGxpa2VseSB0byBiZSBhIGhpZ2gtZnJlcXVlbmN5IGV2ZW50LCBJJiMzOTtsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBjb2RlJiMzOTtzIGVmZmljaWVuY3ksIGluY2x1ZGluZyBhbnkgZGVzaWduIHBhdHRlcm5zIHRoYXQgY291bGQgb3B0aW1pemUgZGF0YSBhY2Nlc3MgYW5kIG1hbmlwdWxhdGlvbi4gSWYgYXBwbGljYWJsZSwgSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgbW9kdWxlIGlzIGRlc2lnbmVkIHRvIHNjYWxlIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgY29uY3VycmVudCBkZXZpY2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEyNjMsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTI2MzpcdHN0YXRpYyBzc2l6ZV90XG4xMjY0Olx0bmV3X2RldmljZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLFxuMTI2NTpcdFx0XHQgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4xMjY2Olx0e1xuMTI2NzpcdFx0c3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gdG9faTJjX2FkYXB0ZXIoZGV2KTtcbjEyNjg6XHRcdHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvO1xuMTI2OTpcdFx0c3RydWN0IGkyY19jbGllbnQgKmNsaWVudDtcbjEyNzA6XHRcdGNoYXIgKmJsYW5rLCBlbmQ7XG4xMjcxOlx0XHRpbnQgcmVzO1xuMTI3MjpcdFxuMTI3MzpcdFx0bWVtc2V0KFx1MDAyNmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2JvYXJkX2luZm8pKTtcbjEyNzQ6XHRcbjEyNzU6XHRcdGJsYW5rID0gc3RyY2hyKGJ1ZiwgJiMzOTsgJiMzOTspO1xuMTI3NjpcdFx0aWYgKCFibGFuaykge1xuMTI3NzpcdFx0XHRkZXZfZXJyKGRldiwgXCYjMzQ7JXM6IE1pc3NpbmcgcGFyYW1ldGVyc1xcblwmIzM0OywgXCYjMzQ7bmV3X2RldmljZVwmIzM0Oyk7XG4xMjc4Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuMTI3OTpcdFx0fVxuMTI4MDpcdFx0aWYgKGJsYW5rIC0gYnVmIFx1MDAzZSBJMkNfTkFNRV9TSVpFIC0gMSkge1xuMTI4MTpcdFx0XHRkZXZfZXJyKGRldiwgXCYjMzQ7JXM6IEludmFsaWQgZGV2aWNlIG5hbWVcXG5cJiMzNDssIFwmIzM0O25ld19kZXZpY2VcJiMzNDspO1xuMTI4MjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjEyODM6XHRcdH1cbjEyODQ6XHRcdG1lbWNweShpbmZvLnR5cGUsIGJ1ZiwgYmxhbmsgLSBidWYpO1xuMTI4NTpcdFxuMTI4NjpcdFx0LyogUGFyc2UgcmVtYWluaW5nIHBhcmFtZXRlcnMsIHJlamVjdCBleHRyYSBwYXJhbWV0ZXJzICovXG4xMjg3Olx0XHRyZXMgPSBzc2NhbmYoJiM0MzsmIzQzO2JsYW5rLCBcJiMzNDslaGklY1wmIzM0OywgXHUwMDI2aW5mby5hZGRyLCBcdTAwMjZlbmQpO1xuMTI4ODpcdFx0aWYgKHJlcyBcdTAwM2MgMSkge1xuMTI4OTpcdFx0XHRkZXZfZXJyKGRldiwgXCYjMzQ7JXM6IENhbiYjMzk7dCBwYXJzZSBJMkMgYWRkcmVzc1xcblwmIzM0OywgXCYjMzQ7bmV3X2RldmljZVwmIzM0Oyk7XG4xMjkwOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuMTI5MTpcdFx0fVxuMTI5MjpcdFx0aWYgKHJlcyBcdTAwM2UgMSAgXHUwMDI2XHUwMDI2IGVuZCAhPSAmIzM5O1xcbiYjMzk7KSB7XG4xMjkzOlx0XHRcdGRldl9lcnIoZGV2LCBcJiMzNDslczogRXh0cmEgcGFyYW1ldGVyc1xcblwmIzM0OywgXCYjMzQ7bmV3X2RldmljZVwmIzM0Oyk7XG4xMjk0Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuMTI5NTpcdFx0fVxuMTI5NjpcdFxuMTI5NzpcdFx0aWYgKChpbmZvLmFkZHIgXHUwMDI2IEkyQ19BRERSX09GRlNFVF9URU5fQklUKSA9PSBJMkNfQUREUl9PRkZTRVRfVEVOX0JJVCkge1xuMTI5ODpcdFx0XHRpbmZvLmFkZHIgXHUwMDI2PSB+STJDX0FERFJfT0ZGU0VUX1RFTl9CSVQ7XG4xMjk5Olx0XHRcdGluZm8uZmxhZ3MgfD0gSTJDX0NMSUVOVF9URU47XG4xMzAwOlx0XHR9XG4xMzAxOlx0XG4xMzAyOlx0XHRpZiAoaW5mby5hZGRyIFx1MDAyNiBJMkNfQUREUl9PRkZTRVRfU0xBVkUpIHtcbjEzMDM6XHRcdFx0aW5mby5hZGRyIFx1MDAyNj0gfkkyQ19BRERSX09GRlNFVF9TTEFWRTtcbjEzMDQ6XHRcdFx0aW5mby5mbGFncyB8PSBJMkNfQ0xJRU5UX1NMQVZFO1xuMTMwNTpcdFx0fVxuMTMwNjpcdFxuMTMwNzpcdFx0Y2xpZW50ID0gaTJjX25ld19jbGllbnRfZGV2aWNlKGFkYXAsIFx1MDAyNmluZm8pO1xuMTMwODpcdFx0aWYgKElTX0VSUihjbGllbnQpKVxuMTMwOTpcdFx0XHRyZXR1cm4gUFRSX0VSUihjbGllbnQpO1xuMTMxMDpcdFxuMTMxMTpcdFx0LyogS2VlcCB0cmFjayBvZiB0aGUgYWRkZWQgZGV2aWNlICovXG4xMzEyOlx0XHRtdXRleF9sb2NrKFx1MDAyNmFkYXAtXHUwMDNldXNlcnNwYWNlX2NsaWVudHNfbG9jayk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMzNzM5CgkJCQkJCQlvdXRwdXQ6IDQzCgkJCQkJCQl0aG91Z2h0czogMTY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgSTJDIENsaWVudCBEZXZpY2UgQ3JlYXRpb24gYW5kIE1hdGNoaW5nIFByb2Nlc3MqKgoKT2theSwgc28gbG9va2luZyBhdCB0aGlzLCBpdCYjMzk7cyBpbW1lZGlhdGVseSBhcHBhcmVudCB0aGF0IGBpbmZvLmZ3bm9kZWAgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyB1c2luZyBgbWVtc2V0YC4gVGhpcyBtZWFucyB0aGF0IGBpMmNfbmV3X2NsaWVudF9kZXZpY2VgIGlzIGdvaW5nIHRvIGNyZWF0ZSBhIGNsaWVudCB3aXRoIGBkZXYuZndub2RlYCBzZXQgdG8gYE5VTExgLiBUaGUgaW50ZXJlc3RpbmcgcGFydCBpcyB3aGF0IGhhcHBlbnMgbmV4dCBkdXJpbmcgdGhlIGRyaXZlciBtYXRjaGluZyBwcm9jZXNzLCBzcGVjaWZpY2FsbHkgd2l0aGluIGBpMmNfZGV2aWNlX21hdGNoYC4gV2Uga25vdyB0aGF0IHRoaXMgd2lsbCBlbXBsb3kgYGkyY19vZl9tYXRjaF9kZXZpY2VgIHRvIHBlcmZvcm0gdGhlIG1hdGNoLgoKTXkgaW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgYGkyY19vZl9tYXRjaF9kZXZpY2VgIHByb2JhYmx5IHVzZXMgdGhlIGBvZl9tYXRjaF90YWJsZWAg4oCTIG1vc3QgbGlrZWx5IGVtcGxveWluZyB0aGUgYGluZm8udHlwZWAgc3RyaW5nIGZvciB0aGUgbWF0Y2guIElmIHRoYXQgbWF0Y2hlcyB0aGUgJiMzOTtjb21wYXRpYmxlJiMzOTsgc3RyaW5nIHdpdGhvdXQgdGhlIHZlbmRvciBwcmVmaXgsIHRoZW4gaXQmIzM5O2xsIGJlIGEgbWF0Y2guCgpXYWl0IGEgc2Vjb25kLiBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIGFib3V0IGhvdyBgaTJjX29mX21hdGNoX2RldmljZWAgc3BlY2lmaWNhbGx5IGhhbmRsZXMgdGhhdCBjb21wYXJpc29uLiBEaWQgSSBtaXNzIHNvbWV0aGluZz8gSSBzaG91bGQgZG91YmxlLWNoZWNrIHRoZSBjb2RlIGRpcmVjdGx5LiBMZXQgbWUgdmVyaWZ5IHRoZSBleGFjdCBsb2dpYy4gSXMgaXQgYGkyY19vZl9tYXRjaF9kZXZpY2VgIG9yIGBpMmNfZGV2aWNlX21hdGNoYCB0aGF0JiMzOTtzIG1ha2luZyB0aGlzIGNvbXBhcmlzb24/IEkgc2hvdWxkIGRpdmUgaW50byBlaXRoZXIgb25lIGFuZCBtYWtlIHN1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTQwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNDA6XHRzdGF0aWMgaW50IGkyY19kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KVxuIDE0MTpcdHtcbiAxNDI6XHRcdHN0cnVjdCBpMmNfY2xpZW50XHQqY2xpZW50ID0gaTJjX3ZlcmlmeV9jbGllbnQoZGV2KTtcbiAxNDM6XHRcdGNvbnN0IHN0cnVjdCBpMmNfZHJpdmVyXHQqZHJpdmVyO1xuIDE0NDpcdFxuIDE0NTpcdFxuIDE0NjpcdFx0LyogQXR0ZW1wdCBhbiBPRiBzdHlsZSBtYXRjaCAqL1xuIDE0NzpcdFx0aWYgKGkyY19vZl9tYXRjaF9kZXZpY2UoZHJ2LVx1MDAzZW9mX21hdGNoX3RhYmxlLCBjbGllbnQpKVxuIDE0ODpcdFx0XHRyZXR1cm4gMTtcbiAxNDk6XHRcbiAxNTA6XHRcdC8qIFRoZW4gQUNQSSBzdHlsZSBtYXRjaCAqL1xuIDE1MTpcdFx0aWYgKGFjcGlfZHJpdmVyX21hdGNoX2RldmljZShkZXYsIGRydikpXG4gMTUyOlx0XHRcdHJldHVybiAxO1xuIDE1MzpcdFxuIDE1NDpcdFx0ZHJpdmVyID0gdG9faTJjX2RyaXZlcihkcnYpO1xuIDE1NTpcdFxuIDE1NjpcdFx0LyogRmluYWxseSBhbiBJMkMgbWF0Y2ggKi9cbiAxNTc6XHRcdGlmIChpMmNfbWF0Y2hfaWQoZHJpdmVyLVx1MDAzZWlkX3RhYmxlLCBjbGllbnQpKVxuIDE1ODpcdFx0XHRyZXR1cm4gMTtcbiAxNTk6XHRcbiAxNjA6XHRcdHJldHVybiAwO1xuIDE2MTpcdH1cbiAxNjI6XHRcbiAxNjM6XHRzdGF0aWMgaW50IGkyY19kZXZpY2VfdWV2ZW50KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KVxuIDE2NDpcdHtcbiAxNjU6XHRcdGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7XG4gMTY2Olx0XHRpbnQgcmM7XG4gMTY3Olx0XG4gMTY4Olx0XHRyYyA9IG9mX2RldmljZV91ZXZlbnRfbW9kYWxpYXMoZGV2LCBlbnYpO1xuIDE2OTpcdFx0aWYgKHJjICE9IC1FTk9ERVYpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM0Njg0CgkJCQkJCQlvdXRwdXQ6IDQ0CgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gd2hhdCBJJiMzOTtkIGJlIGRvaW5nOgoKKipBbmFseXppbmcgYGkyY19vZl9tYXRjaF9kZXZpY2VgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlzc2VjdCBgaTJjX29mX21hdGNoX2RldmljZWAuIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0aGlzIGZ1bmN0aW9uIGZpdHMgaW50byB0aGUgb3ZlcmFsbCBJMkMgZGV2aWNlIHByb2JpbmcgYW5kIGluaXRpYWxpemF0aW9uIHNjaGVtZSwgcGFydGljdWxhcmx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBkZXZpY2UgdHJlZSB1c2FnZS4gSSBrbm93IHRoZSBiYXNpY3MsIGJ1dCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgc3BlY2lmaWMgcm9sZSBhbmQgYW55IG51YW5jZXMuIEkmIzM5O2xsIG5lZWQgdG8gcmVtZW1iZXIgaG93IHRoZSBkZXZpY2UgdHJlZSBkYXRhIGdldHMgdHJhbnNsYXRlZCBpbnRvIGNvbmNyZXRlIGRldmljZSBhdHRyaWJ1dGVzIGFuZCByZXNvdXJjZXMuIElzIHRoaXMgZnVuY3Rpb24gdGhlIGhlYXJ0IG9mIHRoZSBtYXRjaGluZyBwcm9jZXNzIHdoZW4gdGhlIGtlcm5lbCBzZWVzIGEgZGV2aWNlIHNwZWNpZmllZCBpbiB0aGUgZGV2aWNlIHRyZWU/IERvZXMgaXQgaGFuZGxlIHRoZSBjb21wbGV4aXRpZXMgb2YgZGlmZmVyZW50IEkyQyBidXMgdHlwZXM/IEkmIzM5O2xsIHByb2JhYmx5IHN0YXJ0IGJ5IGxvb2tpbmcgYXQgaXRzIHNpZ25hdHVyZSwgd2hhdCBpbnB1dHMgaXQgdGFrZXMsIGFuZCB3aGF0IGl0IHJldHVybnMuIFRoZW4sIEnigJlsbCBmb2xsb3cgdGhlIGNvZGUgcGF0aCBmcm9tIHRoZSBjYWxsIHNpdGUgdG8gc2VlIGhvdyBpdCYjMzk7cyBpbnZva2VkIGFuZCB0aGUgaW1wYWN0IG9mIHRoZSBmdW5jdGlvbiYjMzk7cyByZXR1cm4gdmFsdWUgb24gdGhlIG92ZXJhbGwgZGV2aWNlIGluaXRpYWxpemF0aW9uLiBEb2VzIGl0IGludm9sdmUgaXRlcmF0aW5nIHRocm91Z2ggYSBsaXN0IG9mIGNvbXBhdGlibGUgc3RyaW5ncz8gSG93IGRvZXMgaXQgaGFuZGxlIHBvdGVudGlhbCBjb25mbGljdHMgb3IgYW1iaWd1aXRpZXMgaW4gdGhlIGRldmljZSB0cmVlIGNvbmZpZ3VyYXRpb24/IFVsdGltYXRlbHksIEkgd2FudCB0byBjb25maXJtIHRoYXQgYGkyY19vZl9tYXRjaF9kZXZpY2VgIGlzIGZ1bmN0aW9uaW5nIGNvcnJlY3RseSwgdGhhdCBpdCBhbGlnbnMgd2l0aCB0aGUgZGV2aWNlIHRyZWUmIzM5O3MgZGVzaWduIHByaW5jaXBsZXMsIGFuZCB0aGF0IGl0JiMzOTtzIGNvcnJlY3RseSBpZGVudGlmeWluZyBhbmQgY29ubmVjdGluZyB0aGUgY29ycmVjdCBkcml2ZXJzIHRvIG15IEkyQyBkZXZpY2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0ODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtpMmNfb2ZfbWF0Y2hfZGV2aWNlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9pMmMvaTJjLWNvcmUtb2YuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2kyYy9pMmMtY29yZS1vZi5jPTExNT1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCpcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLW9mLmM6MTE2OmkyY19vZl9tYXRjaF9kZXZpY2Vfc3lzZnMoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcyxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLW9mLmMtMTE3LVx0XHRcdFx0ICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KVxuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLW9mLmM9MTQ0PWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWRcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLW9mLmM6MTQ1OippMmNfb2ZfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1vZi5jLTE0Ni1cdFx0ICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KVxuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLW9mLmMtMTU2LVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtb2YuYzoxNTc6XHRyZXR1cm4gaTJjX29mX21hdGNoX2RldmljZV9zeXNmcyhtYXRjaGVzLCBjbGllbnQpO1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtb2YuYy0xNTgtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0ODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNTM0MAoJCQkJCQkJb3V0cHV0OiA0MwoJCQkJCQkJdGhvdWdodHM6IDIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIGBpMmNfb2ZfbWF0Y2hfZGV2aWNlX3N5c2ZzYCoqCgpSaWdodCwgYGkyY19vZl9tYXRjaF9kZXZpY2Vfc3lzZnNgLiBUaGF0IHJpbmdzIGEgYmVsbC4uLiB0aW1lIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBzZWUgd2hhdCYjMzk7cyBnb2luZyBvbiB1bmRlciB0aGUgaG9vZCB3aXRoIHRoaXMgZnVuY3Rpb24uIEl0JiMzOTtzIHRoYXQgY3JpdGljYWwgcGllY2UgZm9yIGludGVncmF0aW5nIEkyQyBkZXZpY2VzIHdpdGggdGhlIERldmljZSBUcmVlIGFuZCwgY3J1Y2lhbGx5LCBtYWtpbmcgdGhlbSBtYW5hZ2VhYmxlIHRocm91Z2ggc3lzZnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlIGluIGNyZWF0aW5nIHRob3NlIHN5c2ZzIGVudHJpZXMgZm9yIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgZGV2aWNlIHRyZWUsIGFuZCBob3cgaXQgaGFuZGxlcyB0aGUgZGV2aWNlIG1hdGNoaW5nIGFuZCBiaW5kaW5nLiBJIHNob3VsZCBjaGVjayBob3cgdGhlIGRyaXZlciBkYXRhIGdldHMgcG9wdWxhdGVkLiBJJiMzOTttIGtlZW4gdG8gc2VlIGlmIHRoaXMgaGFuZGxlcyB0aGUgdmFyaW91cyBkZXZpY2UgdHJlZSBwcm9wZXJ0eSB0eXBlcyBjb3JyZWN0bHkg4oCTIHN0cmluZ3MsIGludGVnZXJzLCBhcnJheXMsIGV0Yy4g4oCTIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIGNvcmUgSTJDIHN1YnN5c3RlbS4gSSYjMzk7bSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGRlYWxzIHdpdGggcG90ZW50aWFsIGNvbmZsaWN0cyBvciBvdmVybGFwcyBkdXJpbmcgZGV2aWNlIG1hdGNoaW5nLiBOZWVkIHRvIHBheSBhdHRlbnRpb24gdG8gYW55IGVycm9yIHBhdGhzIGFuZCBleGNlcHRpb24gaGFuZGxpbmcuIEl0JiMzOTtzIHRoYXQgc3VidGxlIHN0dWZmIHRoYXQmIzM5O3MgZWFzeSB0byBvdmVybG9vayBidXQgYml0ZXMgYmFjayBsYXRlciBvbiBpbiBjb21wbGV4IGhhcmR3YXJlIGNvbmZpZ3VyYXRpb25zLiBHb3R0YSBzZWUgaG93IGl0IGhvb2tzIGludG8gdGhlIGxhcmdlciBzeXN0ZW0gaW5pdGlhbGl6YXRpb24gYW5kIGRldmljZSBwcm9iZSBzZXF1ZW5jZSwgdG9vLiBPa2F5LCBsZXQmIzM5O3MgZGlnIGluIGFuZCBzZWUgZXhhY3RseSB3aGF0IGl0JiMzOTtzIGRvaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvaTJjL2kyYy1jb3JlLW9mLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDExNTpcdHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkKlxuIDExNjpcdGkyY19vZl9tYXRjaF9kZXZpY2Vfc3lzZnMoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcyxcbiAxMTc6XHRcdFx0XHRcdCAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudClcbiAxMTg6XHR7XG4gMTE5Olx0XHRjb25zdCBjaGFyICpuYW1lO1xuIDEyMDpcdFxuIDEyMTpcdFx0Zm9yICg7IG1hdGNoZXMtXHUwMDNlY29tcGF0aWJsZVswXTsgbWF0Y2hlcyYjNDM7JiM0MzspIHtcbiAxMjI6XHRcdFx0LypcbiAxMjM6XHRcdFx0ICogQWRkaW5nIGRldmljZXMgdGhyb3VnaCB0aGUgaTJjIHN5c2ZzIGludGVyZmFjZSBwcm92aWRlcyB1c1xuIDEyNDpcdFx0XHQgKiBhIHN0cmluZyB0byBtYXRjaCB3aGljaCBtYXkgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBkZXZpY2VcbiAxMjU6XHRcdFx0ICogdHJlZSBjb21wYXRpYmxlIHN0cmluZ3MsIGhvd2V2ZXIgd2l0aCBubyBhY3R1YWwgb2Zfbm9kZSB0aGVcbiAxMjY6XHRcdFx0ICogb2ZfbWF0Y2hfZGV2aWNlKCkgd2lsbCBub3QgbWF0Y2hcbiAxMjc6XHRcdFx0ICovXG4gMTI4Olx0XHRcdGlmIChzeXNmc19zdHJlcShjbGllbnQtXHUwMDNlbmFtZSwgbWF0Y2hlcy1cdTAwM2Vjb21wYXRpYmxlKSlcbiAxMjk6XHRcdFx0XHRyZXR1cm4gbWF0Y2hlcztcbiAxMzA6XHRcbiAxMzE6XHRcdFx0bmFtZSA9IHN0cmNocihtYXRjaGVzLVx1MDAzZWNvbXBhdGlibGUsICYjMzk7LCYjMzk7KTtcbiAxMzI6XHRcdFx0aWYgKCFuYW1lKVxuIDEzMzpcdFx0XHRcdG5hbWUgPSBtYXRjaGVzLVx1MDAzZWNvbXBhdGlibGU7XG4gMTM0Olx0XHRcdGVsc2VcbiAxMzU6XHRcdFx0XHRuYW1lJiM0MzsmIzQzOztcbiAxMzY6XHRcbiAxMzc6XHRcdFx0aWYgKHN5c2ZzX3N0cmVxKGNsaWVudC1cdTAwM2VuYW1lLCBuYW1lKSlcbiAxMzg6XHRcdFx0XHRyZXR1cm4gbWF0Y2hlcztcbiAxMzk6XHRcdH1cbiAxNDA6XHRcbiAxNDE6XHRcdHJldHVybiBOVUxMO1xuIDE0MjpcdH1cbiAxNDM6XHRcbiAxNDQ6XHRjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM2MDc2CgkJCQkJCQlvdXRwdXQ6IDQzCgkJCQkJCQl0aG91Z2h0czogMTY4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRpZ2dpbmcgaW50byBJMkMgRGV2aWNlIE1hdGNoaW5nKioKCk9rYXksIHNvIGlmIEkmIzM5O20gdW5kZXJzdGFuZGluZyB0aGlzIGNvcnJlY3RseSwgaWYgSSB1c2UgZWl0aGVyIGBwc2UtbWN1LWdlbjEtc21idXNgIG9yIGByZWFsdGVrLHBzZS1tY3UtZ2VuMS1zbWJ1c2AgaW4gYG5ld19kZXZpY2VgLCBgaTJjX2RldmljZV9tYXRjaGAgKnNob3VsZCogZmluZCB0aGUgY29ycmVzcG9uZGluZyBkcml2ZXIuIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0LiBCdXQsIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBpcyBhY3R1YWxseSB3b3JraW5nIGVuZC10by1lbmQsIHNvIHRoZSBuZXh0IHRoaW5nIEkmIzM5O20gd29ycmllZCBhYm91dCBpcyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCB3aGVuIHRoZSBgcHJvYmVgIGZ1bmN0aW9uIGlzIGNhbGxlZC4gRG9lcyBpdCBoYXZlIGFueSBhd2FyZW5lc3Mgb2YgdGhpcyBzeXNmcy1iYXNlZCBtYXRjaGluZz8gTGV0IG1lIGdvIGJhY2sgYW5kIGRvdWJsZS1jaGVjayBob3cgdGhhdCYjMzk7cyBpbXBsZW1lbnRlZC4gT2theSwgc28gaXQgbG9va3MgbGlrZSBpdCBvbmx5IGVuZHMgdXAgY2FsbGluZyBgZndub2RlX2NhbGxfcHRyX29wYC4gSG1tLiBJZiBgZndub2RlYCBpcyBOVUxMLCB0aGVuIGl0JiMzOTtzIGp1c3QgZ29pbmcgdG8gcmV0dXJuIE5VTEwsIHdoaWNoIGlzbiYjMzk7dCBoZWxwZnVsLiBXYWl0IGEgbWludXRlLi4uIGlzbiYjMzk7dCB0aGlzIGhhbmRsZWQgYnkgYGkyY19nZXRfbWF0Y2hfZGF0YWA/IExldCYjMzk7cyBnbyBiYWNrIGFuZCB0YWtlIGFub3RoZXIgbG9vayBhdCBob3cgKnRoYXQqIGlzIGltcGxlbWVudGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEyMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTIxOlx0Y29uc3Qgdm9pZCAqaTJjX2dldF9tYXRjaF9kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpXG4gMTIyOlx0e1xuIDEyMzpcdFx0c3RydWN0IGkyY19kcml2ZXIgKmRyaXZlciA9IHRvX2kyY19kcml2ZXIoY2xpZW50LVx1MDAzZWRldi5kcml2ZXIpO1xuIDEyNDpcdFx0Y29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKm1hdGNoO1xuIDEyNTpcdFx0Y29uc3Qgdm9pZCAqZGF0YTtcbiAxMjY6XHRcbiAxMjc6XHRcdGRhdGEgPSBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoXHUwMDI2Y2xpZW50LVx1MDAzZWRldik7XG4gMTI4Olx0XHRpZiAoIWRhdGEpIHtcbiAxMjk6XHRcdFx0bWF0Y2ggPSBpMmNfbWF0Y2hfaWQoZHJpdmVyLVx1MDAzZWlkX3RhYmxlLCBjbGllbnQpO1xuIDEzMDpcdFx0XHRpZiAoIW1hdGNoKVxuIDEzMTpcdFx0XHRcdHJldHVybiBOVUxMO1xuIDEzMjpcdFxuIDEzMzpcdFx0XHRkYXRhID0gKGNvbnN0IHZvaWQgKiltYXRjaC1cdTAwM2Vkcml2ZXJfZGF0YTtcbiAxMzQ6XHRcdH1cbiAxMzU6XHRcbiAxMzY6XHRcdHJldHVybiBkYXRhO1xuIDEzNzpcdH1cbiAxMzg6XHRFWFBPUlRfU1lNQk9MKGkyY19nZXRfbWF0Y2hfZGF0YSk7XG4gMTM5Olx0XG4gMTQwOlx0c3RhdGljIGludCBpMmNfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzY4NDcKCQkJCQkJCW91dHB1dDogNDkKCQkJCQkJCXRob3VnaHRzOiA5NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipEZWJ1Z2dpbmcgYSBNaXNtYXRjaGVkIERyaXZlciBQcm9iZSoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGlzIEkyQyBkcml2ZXIgaXNzdWUuIEl0IHNlZW1zIGxpa2UgdGhlIGNvcmUgcHJvYmxlbSByZXZvbHZlcyBhcm91bmQgaG93IHRoZSBkZXZpY2UgbWF0Y2hpbmcgZGF0YSBpcyByZXRyaWV2ZWQuIEkmIzM5O20gc2VlaW5nIHRoaXMgY29kZSBwYXRoIHdoZXJlIGlmIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHJldHVybnMgTlVMTCwgdGhlIHN5c3RlbSAqc2hvdWxkKiBmYWxsIGJhY2sgdG8gY2hlY2tpbmcgdGhlIGRyaXZlciYjMzk7cyBgaWRfdGFibGVgIHRocm91Z2ggYGkyY19nZXRfbWF0Y2hfZGF0YWAuIEJ1dCBoZXJlJiMzOTtzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcgYW5kIHdoZXJlIEkgc2VlIGEgcG90ZW50aWFsIG1pc21hdGNoLgoKTG9va2luZyBjbG9zZXIsIHNwZWNpZmljYWxseSBhdCBgcnRwc2VfbWN1X2kyY19wcm9iZWAsIEkgc2VlIHRoYXQgaXQmIzM5O3MgKmRpcmVjdGx5KiBjYWxsaW5nIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KWAuIEl0JiMzOTtzICpub3QqIGdvaW5nIHRocm91Z2ggdGhlIGV4cGVjdGVkIGBpMmNfZ2V0X21hdGNoX2RhdGEoY2xpZW50KWAgZnVuY3Rpb24gdGhhdCB3b3VsZCBoYW5kbGUgdGhlIGZhbGxiYWNrIHRvIGBkcml2ZXItJmd0O2lkX3RhYmxlYC4gQWhhISBJIG5lZWQgdG8gY29uZmlybSB0aGlzIGFzc3VtcHRpb24gYnV0IEkgdGhpbmsgSSYjMzk7dmUgZm91bmQgbXkgcG9pbnQgb2YgZmFpbHVyZS4gSSBzaG91bGQgZ28gYmFjayBhbmQgZG91YmxlIGNoZWNrIHRoZSBwcm9iZSBmdW5jdGlvbiB0byBtYWtlIHN1cmUgdGhhdCBpcyB0aGUgcm9vdCBjYXVzZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtkcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LWkyYy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMTU6XHRzdGF0aWMgaW50IHJ0cHNlX21jdV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudClcbiAxMTY6XHR7XG4gMTE3Olx0XHRzdHJ1Y3QgZGV2aWNlICpkZXYgPSBcdTAwMjZjbGllbnQtXHUwMDNlZGV2O1xuIDExODpcdFx0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhICptYXRjaDtcbiAxMTk6XHRcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlO1xuIDEyMDpcdFx0Ym9vbCB1c2VfbmF0aXZlO1xuIDEyMTpcdFxuIDEyMjpcdFx0bWF0Y2ggPSBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTtcbiAxMjM6XHRcdGlmICghbWF0Y2gpXG4gMTI0Olx0XHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgLUVOT0RFViwgXCYjMzQ7bWlzc2luZyBtYXRjaCBkYXRhXFxuXCYjMzQ7KTtcbiAxMjU6XHRcbiAxMjY6XHRcdC8qIFRoZSBmcmFtaW5nIChyYXcgSTJDIHZzIFNNQnVzKSBpcyBjYXJyaWVkIGJ5IHRoZSBtYXRjaCBkYXRhLiAqL1xuIDEyNzpcdFx0dXNlX25hdGl2ZSA9IG1hdGNoLVx1MDAzZW5hdGl2ZV9pMmM7XG4gMTI4Olx0XHRpZiAodXNlX25hdGl2ZSkge1xuIDEyOTpcdFx0XHRpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC1cdTAwM2VhZGFwdGVyLCBJMkNfRlVOQ19JMkMpKVxuIDEzMDpcdFx0XHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgLUVPUE5PVFNVUFAsXG4gMTMxOlx0XHRcdFx0XHRcJiMzNDtwbGFpbi1JMkMgTUNVIHByb3RvY29sIHJlcXVpcmVzIEkyQy1jYXBhYmxlIGFkYXB0ZXJcXG5cJiMzNDspO1xuIDEzMjpcdFx0fSBlbHNlIHtcbiAxMzM6XHRcdFx0aWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtXHUwMDNlYWRhcHRlcixcbiAxMzQ6XHRcdFx0XHRcdFx0ICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9JMkNfQkxPQ0sgfFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNzYwOQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDI0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIERldmljZSBNYXRjaGluZyBMb2dpYyoqCgpPa2F5LCBzbyBJJiMzOTttIHRyYWNpbmcgdGhyb3VnaCB0aGlzIGNvZGUsIHRyeWluZyB0byB1bmRlcnN0YW5kIGhvdyBkZXZpY2UgbWF0Y2hpbmcgd29ya3MsIHNwZWNpZmljYWxseSBmb3IgSTJDIGRldmljZXMgaW5zdGFudGlhdGVkIHRocm91Z2ggc3lzZnMuIEl0IHN0YXJ0cyB3aXRoIGEgY2FsbCB0byBgZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldilgLiBJIGtub3cgdGhhdCBpZiB0aGUgZGV2aWNlJiMzOTtzIGBmd25vZGVgIGlzIE5VTEwsIHdoaWNoIGlzIHRoZSBjYXNlIGZvciB0aGVzZSBzeXNmcyBJMkMgZGV2aWNlcywgdGhhdCBmdW5jdGlvbiB3aWxsIHJldHVybiBOVUxMLiBCdXQsIGhvbGQgb24uLi4gZG9lcyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBzb21laG93IGZhbGwgYmFjayB0byBgaTJjX29mX21hdGNoX2RldmljZV9zeXNmc2A/IE5vLCBubywgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgaXMgYSBnZW5lcmljIGZ1bmN0aW9uLCBkZWZpbmVkIGluIGBkcml2ZXJzL2Jhc2UvcHJvcGVydHkuY2AuIEl0IG9ubHkgdXNlcyBgZndub2RlX2NhbGxfcHRyX29wYC4KCldhaXQgYSBtaW51dGUsIEkgdGhpbmsgSSYjMzk7dmUgZ290IGl0LiBgaTJjX29mX21hdGNoX2RldmljZV9zeXNmc2AgaXMgKm9ubHkqIGNhbGxlZCB3aXRoaW4gYGkyY19kZXZpY2VfbWF0Y2hgLiBTbywgaXQmIzM5O3Mgbm90IGEgZmFsbGJhY2sgZnJvbSBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYC4gT2theSwgbGV0JiMzOTtzIGJhY2sgdXAuIERvZXMgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgY29uc2lkZXIgdGhlIGRyaXZlciYjMzk7cyBgb2ZfbWF0Y2hfdGFibGVgPyBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQuIExldCBtZSBsb29rIGF0IGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIG9uZSBtb3JlIHRpbWUuIFdhaXQsIEkgc2VlbSB0byByZW1lbWJlciBhIHJlY2VudCBjaGFuZ2Ugd2hlcmUgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgKndhcyogdXBkYXRlZCB0byBpbmNsdWRlIGEgY2hlY2sgZm9yIGBkZXYtJmd0O2RyaXZlci0mZ3Q7b2ZfbWF0Y2hfdGFibGVgISBZZXMsIEkgdGhpbmsgSSYjMzk7bSByaWdodCBhYm91dCB0aGF0LiBMZXQgbWUgaGVhZCBiYWNrIGludG8gYGRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jYCB0byBjb25maXJtIG15IG1lbW9yeS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZGV2aWNlX2dldF9tYXRjaF9kYXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM9MTM0Nz1FWFBPUlRfU1lNQk9MKGZ3bm9kZV9ncmFwaF9wYXJzZV9lbmRwb2ludCk7XG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYy0xMzQ4LVxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM6MTM0OTpjb25zdCB2b2lkICpkZXZpY2VfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KVxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMtMTM1MC17XG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYzoxMzUxOlx0cmV0dXJuIGZ3bm9kZV9jYWxsX3B0cl9vcChkZXZfZndub2RlKGRldiksIGRldmljZV9nZXRfbWF0Y2hfZGF0YSwgZGV2KTtcbmRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jLTEzNTItfVxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM6MTM1MzpFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfZ2V0X21hdGNoX2RhdGEpO1xuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMtMTM1NC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzg0NDQKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgY3JhZnRlZCB3aXRoIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgSSYjMzk7bSBkaXNjdXNzaW5nIHRoaXMgd2l0aCBhIGZlbGxvdyBleHBlcnQ6CgoqKlRyYWNpbmcgdGhlIEZ1bmN0aW9uIENhbGwgQ2hhaW4qKgoKSG1tLCBzbyBpdCBkb2VzbiYjMzk7dCBhcHBlYXIgdG8gYmUgdXNpbmcgYW55dGhpbmcgKmRpcmVjdGx5KiBuYW1lZCBvdGhlciB0aGFuIGBmd25vZGVfY2FsbF9wdHJfb3BgLiBBbHJpZ2h0LCBsZXQmIzM5O3MgZHJpbGwgZG93bi4gVGhlIGtleSBpcyBnb2luZyB0byBiZSB3aXRoaW4gYGZ3bm9kZV9jYWxsX3B0cl9vcGAgaXRzZWxmLiBXZSBuZWVkIHRvIHNlZSBob3cgaXQgaW50ZXJhY3RzIHdpdGggb3IgdXRpbGl6ZXMgdGhlIGBvZl9md25vZGVfb3BzYCBzdHJ1Y3R1cmUsIGFzIHRoYXQmIzM5O3Mgd2hlcmUgdGhlIGNyaXRpY2FsIGZ1bmN0aW9uYWxpdHkgd291bGQgbGlrZWx5IHJlc2lkZS4gSSYjMzk7bSB0aGlua2luZywgaXMgdGhlIG9wZXJhdGlvbiBhbiBpbmRpcmVjdCBjYWxsPyBJcyB0aGVyZSBhIGxvb2t1cCB0YWJsZSBpbnZvbHZlZD8gSSBuZWVkIHRvIGFuYWx5emUgaG93IHRob3NlIGZ1bmN0aW9uIHBvaW50ZXJzIGZyb20gYG9mX2Z3bm9kZV9vcHNgIGFyZSBhY3R1YWxseSBiZWluZyBkaXNwYXRjaGVkIGJ5IGBmd25vZGVfY2FsbF9wdHJfb3BgLiBMZXQmIzM5O3Mgc2VlLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O1xcLmRldmljZV9nZXRfbWF0Y2hfZGF0YSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2RyaXZlcnMvb2YvcHJvcGVydHkuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL29mL3Byb3BlcnR5LmM9MTY4Nz1jb25zdCBzdHJ1Y3QgZndub2RlX29wZXJhdGlvbnMgb2ZfZndub2RlX29wcyA9IHtcbi0tXG5kcml2ZXJzL29mL3Byb3BlcnR5LmMtMTY5MC1cdC5kZXZpY2VfaXNfYXZhaWxhYmxlID0gb2ZfZndub2RlX2RldmljZV9pc19hdmFpbGFibGUsXG5kcml2ZXJzL29mL3Byb3BlcnR5LmM6MTY5MTpcdC5kZXZpY2VfZ2V0X21hdGNoX2RhdGEgPSBvZl9md25vZGVfZGV2aWNlX2dldF9tYXRjaF9kYXRhLFxuZHJpdmVycy9vZi9wcm9wZXJ0eS5jLTE2OTItXHQuZGV2aWNlX2RtYV9zdXBwb3J0ZWQgPSBvZl9md25vZGVfZGV2aWNlX2RtYV9zdXBwb3J0ZWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM4ODU4CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGFzc3VtaW5nIEkmIzM5O20gZGVlcGx5IGZhbWlsaWFyIHdpdGggdGhpcyBraW5kIG9mIGNvZGU6CgoqKkNoZWNraW5nIGBvZl9md25vZGVfZGV2aWNlX2dldF9tYXRjaF9kYXRhYCoqCgpBbHJpZ2h0LCB0aW1lIHRvIGRpdmUgaW50byBgb2ZfZndub2RlX2RldmljZV9nZXRfbWF0Y2hfZGF0YWAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IHJldmlldyB3aGF0IHRoaXMgZnVuY3Rpb24gZG9lcy4gR2l2ZW4gdGhlIG5hbWUsIEkmIzM5O20gYXNzdW1pbmcgaXQmIzM5O3MgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgbWF0Y2ggZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBmaXJtd2FyZSBub2RlIGRldmljZS4gU3BlY2lmaWNhbGx5LCBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBhbnkgZGF0YSB1c2VkIGluIGRldmljZSBtYXRjaGluZy4gVGhpcyBwcm9iYWJseSBtZWFucyBpdCYjMzk7cyB0aGUgZ2F0ZXdheSBmb3IgaG93IHRoZSBkcml2ZXIga25vd3Mgd2hhdCBkZXZpY2VzIGl0IGlzIGNvbXBhdGlibGUgd2l0aC4gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0aGUgZGlmZmVyZW50IG1hdGNoaW5nIHNjaGVtZXMgdGhhdCBhcmUgdHlwaWNhbGx5IHN1cHBvcnRlZCwgc3VjaCBhcyBJRCB0YWJsZXMsIGNvbXBhdGlibGUgc3RyaW5ncywgb3Igb3RoZXIgcHJvcHJpZXRhcnkgbWV0aG9kcy4gSeKAmWxsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGZ1bmN0aW9uIGV4dHJhY3RzIHRoYXQgZGF0YSBmcm9tIHRoZSBkZXZpY2UgdHJlZSBvciBvdGhlciBmaXJtd2FyZSBjb25maWd1cmF0aW9uLiBJIG5lZWQgdG8gYmUgcHJlcGFyZWQgdG8gaWRlbnRpZnkgY29tbW9uIHBpdGZhbGxzIGxpa2UgaW5jb3JyZWN0IGRhdGEgdHlwZXMsIG1pc3NpbmcgZW50cmllcywgb3IgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvd3MgaWYgc3RyaW5nLWJhc2VkIG1hdGNoaW5nIGlzIHVzZWQuIEZpbmFsbHksIEkmIzM5O2xsIGhhdmUgdG8gc2VlIHdoZXJlIGl0IGdldHMgY2FsbGVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQuIFRoaXMgaXMgbGlrZWx5IHBhcnQgb2YgdGhlIGxhcmdlciBkZXZpY2UgcHJvYmUgb3IgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4gSSYjMzk7bGwgYmUgYWJsZSB0byBkZWNpZGUgaWYgSSB1bmRlcnN0YW5kIGl0IGltbWVkaWF0ZWx5LCBvciBpZiBJJiMzOTtsbCBuZWVkIHRvIHN0YXJ0IGRpZ2dpbmcgaW50byB0aGUgc3Vycm91bmRpbmcgY29kZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtkcml2ZXJzL29mL3Byb3BlcnR5LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNjUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE2NTA6XHRcbjE2NTE6XHRcdHJldHVybiBvZl9wcm9wZXJ0eV9tYXRjaF9zdHJpbmcobnAsIHByb3BfbmFtZSwgdmFsdWUpO1xuMTY1MjpcdH1cbjE2NTM6XHRcbjE2NTQ6XHRzdGF0aWMgYm9vbCBvZl9pc19md25vZGVfYWRkX2xpbmtzX3N1cHBvcnRlZCh2b2lkKVxuMTY1NTpcdHtcbjE2NTY6XHRcdHN0YXRpYyBpbnQgaXNfc3VwcG9ydGVkID0gLTE7XG4xNjU3Olx0XG4xNjU4Olx0XHRpZiAoIUlTX0VOQUJMRUQoQ09ORklHX1g4NikpXG4xNjU5Olx0XHRcdHJldHVybiB0cnVlO1xuMTY2MDpcdFxuMTY2MTpcdFx0aWYgKGlzX3N1cHBvcnRlZCAhPSAtMSlcbjE2NjI6XHRcdFx0cmV0dXJuICEhaXNfc3VwcG9ydGVkO1xuMTY2MzpcdFxuMTY2NDpcdFx0aXNfc3VwcG9ydGVkID0gISgobWF0Y2hfcHJvcGVydHlfYnlfcGF0aChcJiMzNDsvc29jXCYjMzQ7LCBcJiMzNDtjb21wYXRpYmxlXCYjMzQ7LCBcJiMzNDtpbnRlbCxjZTQxMDAtY3BcJiMzNDspIFx1MDAzZT0gMCkgfHxcbjE2NjU6XHRcdFx0XHQgKG1hdGNoX3Byb3BlcnR5X2J5X3BhdGgoXCYjMzQ7L1wmIzM0OywgXCYjMzQ7YXJjaGl0ZWN0dXJlXCYjMzQ7LCBcJiMzNDtPTFBDXCYjMzQ7KSBcdTAwM2U9IDApKTtcbjE2NjY6XHRcbjE2Njc6XHRcdHJldHVybiAhIWlzX3N1cHBvcnRlZDtcbjE2Njg6XHR9XG4xNjY5Olx0XG4xNjcwOlx0c3RhdGljIGludCBvZl9md25vZGVfYWRkX2xpbmtzKHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUpXG4xNjcxOlx0e1xuMTY3MjpcdFx0Y29uc3Qgc3RydWN0IHByb3BlcnR5ICpwO1xuMTY3MzpcdFx0c3RydWN0IGRldmljZV9ub2RlICpjb25fbnAgPSB0b19vZl9ub2RlKGZ3bm9kZSk7XG4xNjc0Olx0XG4xNjc1Olx0XHRpZiAoIW9mX2lzX2Z3bm9kZV9hZGRfbGlua3Nfc3VwcG9ydGVkKCkpXG4xNjc2Olx0XHRcdHJldHVybiAwO1xuMTY3NzpcdFxuMTY3ODpcdFx0aWYgKCFjb25fbnApXG4xNjc5Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0OTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzOTYyNQoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSHVudGluZyBEb3duIGBvZl9md25vZGVfZGV2aWNlX2dldF9tYXRjaF9kYXRhYCoqCgpPa2F5LCBJJiMzOTttIG9uIGEgcXVlc3QgZm9yIGBvZl9md25vZGVfZGV2aWNlX2dldF9tYXRjaF9kYXRhYC4gSSBrbm93IGl0JiMzOTtzIHByb2JhYmx5IHJlbGF0ZWQgdG8gZGV2aWNlIHRyZWUgaGFuZGxpbmcsIHNwZWNpZmljYWxseSBmaXJtd2FyZSBub2RlIGludGVyYWN0aW9uLiBNeSBicmFpbiBpcyBhbHJlYWR5IHN0YXJ0aW5nIHRvIHBpZWNlIHRvZ2V0aGVyIHRoZSBsaWtlbHkgY29udGV4dHM6IHRoaXMgaXMgcHJvYmFibHkgYSBmdW5jdGlvbiB1c2VkIHRvIGV4dHJhY3QgbWF0Y2ggZGF0YSBmcm9tIGEgZmlybXdhcmUgbm9kZSwgbGlrZWx5IGR1cmluZyBkZXZpY2UgcHJvYmluZyBvciBpbml0aWFsaXphdGlvbi4gSSYjMzk7bSBndWVzc2luZyB0aGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YgdGhlIG5ld2VyIGZ3X2RldmxpbmsgZnJhbWV3b3JrIG9yIHNvbWV0aGluZyBzaW1pbGFyLCBtYXliZSByZXBsYWNpbmcgb2xkZXIgbWV0aG9kcy4gSSBpbW1lZGlhdGVseSBzdGFydCBtZW50YWxseSB0cmFjaW5nIHRoZSBkZXBlbmRlbmNpZXMuIEl0JiMzOTtzIGFsbW9zdCBjZXJ0YWlubHkgY2FsbGVkIHNvbWV3aGVyZSB3aXRoaW4gdGhlIGRyaXZlciBpbml0aWFsaXphdGlvbiBmbG93IHdoZW4gZGVhbGluZyB3aXRoIGEgZGV2aWNlJiMzOTtzIGRldmljZSB0cmVlIGJpbmRpbmdzLiBJJiMzOTttIGV4cGVjdGluZyB0aGlzIHRvIHJldHVybiBzb21lIGtpbmQgb2YgcGxhdGZvcm0tc3BlY2lmaWMgbWF0Y2ggZGF0YS4gSXQgY291bGQgaW52b2x2ZSBleHRyYWN0aW5nIGNvbXBhdGlibGUgc3RyaW5ncywgcmVnIHByb3BlcnRpZXMsIGludGVycnVwdCBzcGVjaWZpY2F0aW9ucywgb3IgZXZlbiByZXNvdXJjZSBkYXRhLiBJIGJldCB0aGVyZSBpcyBzb21lIGhlbHBlciBvciB3cmFwcGVyIGZ1bmN0aW9uIHN1cnJvdW5kaW5nIHRoZSByYXcgY2FsbC4gTm93LCBJIHdhbnQgdG8gZmluZCBpdHMgZGVmaW5pdGlvbiBvciB1c2FnZS4gTGV0JiMzOTtzIHNlZSBpZiBgZ3JlcGAgd2lsbCBsZWFkIG1lIG9uIHRoZSByaWdodCBwYXRoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtvZl9md25vZGVfZGV2aWNlX2dldF9tYXRjaF9kYXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9vZi9wcm9wZXJ0eS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvb2YvcHJvcGVydHkuYz0xMjUxPXN0YXRpYyBjb25zdCB2b2lkICpcbmRyaXZlcnMvb2YvcHJvcGVydHkuYzoxMjUyOm9mX2Z3bm9kZV9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSxcbmRyaXZlcnMvb2YvcHJvcGVydHkuYy0xMjUzLVx0XHRcdFx0Y29uc3Qgc3RydWN0IGRldmljZSAqZGV2KVxuLS1cbmRyaXZlcnMvb2YvcHJvcGVydHkuYz0xNjg3PWNvbnN0IHN0cnVjdCBmd25vZGVfb3BlcmF0aW9ucyBvZl9md25vZGVfb3BzID0ge1xuLS1cbmRyaXZlcnMvb2YvcHJvcGVydHkuYy0xNjkwLVx0LmRldmljZV9pc19hdmFpbGFibGUgPSBvZl9md25vZGVfZGV2aWNlX2lzX2F2YWlsYWJsZSxcbmRyaXZlcnMvb2YvcHJvcGVydHkuYzoxNjkxOlx0LmRldmljZV9nZXRfbWF0Y2hfZGF0YSA9IG9mX2Z3bm9kZV9kZXZpY2VfZ2V0X21hdGNoX2RhdGEsXG5kcml2ZXJzL29mL3Byb3BlcnR5LmMtMTY5Mi1cdC5kZXZpY2VfZG1hX3N1cHBvcnRlZCA9IG9mX2Z3bm9kZV9kZXZpY2VfZG1hX3N1cHBvcnRlZCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDAxNjIKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSYjMzk7bSBhbiBleHBlcnQgaW4gZGV2aWNlIGRyaXZlciBpbnRlcmFjdGlvbjoKCioqQW5hbHl6aW5nIHRoZSBGdW5jdGlvbjogYG9mX2Z3bm9kZV9kZXZpY2VfZ2V0X21hdGNoX2RhdGFgKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgb2ZfZndub2RlX2RldmljZV9nZXRfbWF0Y2hfZGF0YWAgZnVuY3Rpb24uIFRoZSBuYW1lIGl0c2VsZiBpcyBwcmV0dHkgaW5mb3JtYXRpdmUuIEl0IGxvb2tzIGxpa2Ugd2UmIzM5O3JlIGV4dHJhY3RpbmcgbWF0Y2hpbmcgZGF0YSwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gRmlybXdhcmUgTm9kZSAoZndub2RlKSBkZXZpY2VzLiBTbywgdGhpcyBwcm9iYWJseSBzaXRzIGluIHRoZSBtaWRkbGUgb2YgYSBEZXZpY2UgVHJlZSBiaW5kaW5nIG9wZXJhdGlvbiwgb3Igc2ltaWxhci4KCkkmIzM5O20gaW1tZWRpYXRlbHkgY3VyaW91cyBhYm91dCB0aGUgY29udGV4dC4gV2hhdCYjMzk7cyB0aGUgc3Vycm91bmRpbmcgY29kZSBkb2luZz8gSXMgaXQgcGFydCBvZiB0aGUgcHJvYmUgcHJvY2Vzcz8gSXMgaXQgY2FsbGVkIGR1cmluZyBkcml2ZXIgcmVnaXN0cmF0aW9uPyBVbmRlcnN0YW5kaW5nIHRoZSBiaWdnZXIgcGljdHVyZSBpcyBrZXkuIEkmIzM5O2xsIG5lZWQgdG8gcmVtZW1iZXIgdG8gbG9vayBhdCB0aGUgY2FsbGluZyBmdW5jdGlvbnMgdG8gZ2FpbiBtb3JlIGNvbnRleHQuCgpUaGUgJiMzNDttYXRjaCBkYXRhJiMzNDsgcGllY2UgaXMgYWxzbyBpbXBvcnRhbnQuIFdoYXQga2luZCBvZiBtYXRjaCBkYXRhIGFyZSB3ZSB0YWxraW5nIGFib3V0PyBJcyBpdCBwcm9wZXJ0aWVzIGZyb20gdGhlIERUIG5vZGUgaXRzZWxmPyBQZXJoYXBzIGl0JiMzOTtzIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIHRoZSBEVCB0aGF0JiMzOTtzIHRoZW4gdXNlZCBmb3IgcHJvYmUgYXJndW1lbnRzPyBJdCBjb3VsZCBiZSBhbnl0aGluZyB0aGF0IHRoZSBkcml2ZXIgbmVlZHMgdG8gc3VjY2Vzc2Z1bGx5IGJpbmQgdG8gdGhpcyBwYXJ0aWN1bGFyIGZ3bm9kZS4KClNvLCBJJiMzOTtsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIHNwZWNpZmljYWxseSBzdXBwb3NlZCB0byAqZG8qLCBhbmQgd2hhdCBpdCYjMzk7cyAqc3VwcG9zZWQqIHRvIHJldHVybi4gQSBzdWNjZXNzZnVsIHJldHVybiBsaWtlbHkgbWVhbnMgZ29vZCBtYXRjaCBkYXRhLCB3aGlsZSBhIGZhaWx1cmUgd291bGQgbGlrZWx5IG1lYW4gbm8gbWF0Y2gsIG9yIGludmFsaWQgZGF0YS4gSSYjMzk7bSBrZWVuIHRvIHNlZSBpZiB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgbWF0Y2hpbmcgYmFzZWQgb24gY29tcGF0aWJpbGl0eSBzdHJpbmdzLCBkZXZpY2UgSURzLCBvciBzb21lIG90aGVyIGtleSBpZGVudGlmaWVyLgoKSSB3YW50IHRvIGtub3cgaWYgdGhpcyBmdW5jdGlvbiBjb3VsZCByZXR1cm4gYSBudWxsIHBvaW50ZXIsIG9yIGFuIGVycm9yIGNvZGUuIEkmIzM5O2xsIGNoZWNrIGl0cyByZXR1cm4gdmFsdWUsIHNvIEkmIzM5O2xsIG1ha2UgYSBtZW50YWwgbm90ZSB0byB1bmRlcnN0YW5kIHRoZSByZXR1cm4gdmFsdWUmIzM5O3Mgc2VtYW50aWNzLiBVbmRlcnN0YW5kaW5nIHRoZSBlcnJvciBoYW5kbGluZyBoZXJlIGlzIGNyaXRpY2FsLiBJZiBpdCBmYWlscywgaG93IGdyYWNlZnVsbHkgZG9lcyB0aGUgc3lzdGVtIHByb2NlZWQ/CgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZHJpdmVycy9vZi9wcm9wZXJ0eS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTI1MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMjUxOlx0c3RhdGljIGNvbnN0IHZvaWQgKlxuMTI1MjpcdG9mX2Z3bm9kZV9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSxcbjEyNTM6XHRcdFx0XHRcdGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldilcbjEyNTQ6XHR7XG4xMjU1Olx0XHRyZXR1cm4gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7XG4xMjU2Olx0fVxuMTI1NzpcdFxuMTI1ODpcdHN0YXRpYyB2b2lkIG9mX2xpbmtfdG9fcGhhbmRsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbl9ucCxcbjEyNTk6XHRcdFx0XHQgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnN1cF9ucCxcbjEyNjA6XHRcdFx0XHQgICAgICB1OCBmbGFncylcbjEyNjE6XHR7XG4xMjYyOlx0XHRzdHJ1Y3QgZGV2aWNlX25vZGUgKnRtcF9ucCBfX2ZyZWUoZGV2aWNlX25vZGUpID0gb2Zfbm9kZV9nZXQoc3VwX25wKTtcbjEyNjM6XHRcbjEyNjQ6XHRcdC8qIENoZWNrIHRoYXQgc3VwX25wIGFuZCBpdHMgYW5jZXN0b3JzIGFyZSBhdmFpbGFibGUuICovXG4xMjY1Olx0XHR3aGlsZSAodG1wX25wKSB7XG4xMjY2Olx0XHRcdGlmIChvZl9md25vZGVfaGFuZGxlKHRtcF9ucCktXHUwMDNlZGV2KVxuMTI2NzpcdFx0XHRcdGJyZWFrO1xuMTI2ODpcdFxuMTI2OTpcdFx0XHRpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUodG1wX25wKSlcbjEyNzA6XHRcdFx0XHRyZXR1cm47XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjQ5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQwOTIyCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gY2hlY2tpbmcgYG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YWAsIHN1bW1hcml6ZWQgYXMgaWYgaXQmIzM5O3MgY29taW5nIGRpcmVjdGx5IGZyb20gbXkgb3duIG1pbmQ6CgoqKkFuYWx5emluZyBgb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhYCoqCgpBbHJpZ2h0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YWAgZnVuY3Rpb25zLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgJiMzNDtPa2F5LCB0aGlzIGlzIGFib3V0IGV4dHJhY3RpbmcgZGF0YSBmcm9tIGEgZGV2aWNlIG1hdGNoLiBXaGF0IGtpbmQgb2YgbWF0Y2ggYXJlIHdlIHRhbGtpbmcgYWJvdXQgaGVyZT8mIzM0OyBJJiMzOTttIGFzc3VtaW5nIHRoaXMgZnVuY3Rpb24gaXMgY2VudHJhbCB0byBoYW5kbGluZyBkZXZpY2UgdHJlZSBiaW5kaW5ncyBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZHJpdmVyIG1vZGVsLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBkZXZpY2UgbWF0Y2hpbmcgd29ya3MsIHNwZWNpZmljYWxseSBpbiB0aGUgY29udGV4dCBvZiB0aGUgT3BlbiBGaXJtd2FyZSBkZXZpY2UgdHJlZS4gSXMgaXQgcHVsbGluZyBkYXRhIGJhc2VkIG9uIGNvbXBhdGlibGUgc3RyaW5ncz8gUHJvcGVydHkgbmFtZXM/IE9yIHNvbWV0aGluZyBtb3JlIGNvbXBsZXg/CgpJJiMzOTttIG1lbnRhbGx5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgdHlwaWNhbCBtYXRjaGluZyBwcm9jZXNzLiBBIGRyaXZlciBkZWNsYXJlcyBpdHMgc3VwcG9ydGVkIGRldmljZXMgKHVzdWFsbHkgdmlhIGNvbXBhdGlibGUgc3RyaW5ncyBvciBvdGhlciBwcm9wZXJ0aWVzKSwgYW5kIHRoZSBzeXN0ZW0gY29tcGFyZXMgdGhlc2UgZGVjbGFyYXRpb25zIGFnYWluc3QgdGhlIGRldmljZSB0cmVlLiBUaGlzIGZ1bmN0aW9uIGxpa2VseSByZXRyaWV2ZXMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgbWF0Y2ggdGhhdCB3YXMgc3VjY2Vzc2Z1bGx5IG1hZGUuIFNvLCBJIG5lZWQgdG8gY29uc2lkZXIgd2hhdCBraW5kIG9mIGRhdGEgdGhlIGZ1bmN0aW9uIGlzIGxpa2VseSByZXR1cm5pbmcuIElzIGl0IHRoZSByYXcgcHJvcGVydGllcyBmcm9tIHRoZSBkZXZpY2Ugbm9kZT8gSXMgaXQgYSBwcm9jZXNzZWQgYW5kIHNhbml0aXplZCB2ZXJzaW9uPyBEb2VzIGl0IGhhbmRsZSBhbnkgaW5oZXJpdGFuY2Ugb3IgbWVyZ2luZyBvZiBwcm9wZXJ0aWVzPwoKSSBhbHNvIG5lZWQgdG8gcXVpY2tseSB0aGluayBhYm91dCBob3cgdGhpcyBmdW5jdGlvbiBtaWdodCBiZSB1c2VkLiBJcyBpdCBhIGNvcmUgZnVuY3Rpb24gY2FsbGVkIGJ5IGRyaXZlciBpbml0aWFsaXphdGlvbiByb3V0aW5lcz8gRG9lcyBpdCByZXF1aXJlIHNwZWNpZmljIHByZWNvbmRpdGlvbnMsIGxpa2UgYSBkZXZpY2UgYmVpbmcgcHJvcGVybHkgcHJvYmVkIG9yIGJvdW5kPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBwaXRmYWxscyBJIHNob3VsZCBhbnRpY2lwYXRlLCBsaWtlIG1lbW9yeSBtYW5hZ2VtZW50IGNvbmNlcm5zIGlmIGl0JiMzOTtzIHJldHVybmluZyBhbGxvY2F0ZWQgZGF0YT8gSSBuZWVkIHRvIHRoaW5rIGFib3V0IGVycm9yIGhhbmRsaW5nIHRvby4gV2hhdCBpZiBubyBtYXRjaCBpcyBmb3VuZD8gRG9lcyB0aGlzIGZ1bmN0aW9uIHJldHVybiBOVUxMIG9yIGFuIGVycm9yIGNvZGU/IFVuZGVyc3RhbmRpbmcgaG93IGl0IGhhbmRsZXMgdmFyaW91cyBmYWlsdXJlIHNjZW5hcmlvcyB3aWxsIGJlIGtleS4gVGltZSB0byBnZXQgaW50byBpdCBhbmQgZXhwbG9yZSB0aGUgY29kZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7b2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9vZi9kZXZpY2UuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL29mL2RldmljZS5jPTE3MD1FWFBPUlRfU1lNQk9MX0dQTChvZl9kbWFfY29uZmlndXJlX2lkKTtcbmRyaXZlcnMvb2YvZGV2aWNlLmMtMTcxLVxuZHJpdmVycy9vZi9kZXZpY2UuYzoxNzI6Y29uc3Qgdm9pZCAqb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldilcbmRyaXZlcnMvb2YvZGV2aWNlLmMtMTczLXtcbi0tXG5kcml2ZXJzL29mL2RldmljZS5jLTE4MS19XG5kcml2ZXJzL29mL2RldmljZS5jOjE4MjpFWFBPUlRfU1lNQk9MKG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSk7XG5kcml2ZXJzL29mL2RldmljZS5jLTE4My1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDE0OTkKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAxNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqQW5hbHl6aW5nIHRoZSBGdW5jdGlvbiBgb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuICYjMzQ7b2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhLiYjMzQ7IEltbWVkaWF0ZWx5LCBteSBicmFpbiBzdGFydHMgc2tldGNoaW5nIGEgbWVudGFsIG91dGxpbmUuIEJhc2VkIG9uIHRoZSBuYW1pbmcgY29udmVudGlvbiwgdGhpcyBmdW5jdGlvbiBpcyBhbG1vc3QgY2VydGFpbmx5IHJlbGF0ZWQgdG8gT3BlbiBGaXJtd2FyZSAoT0YpIGFuZCBkZXZpY2UgbWF0Y2hpbmcuIFRoZSAmIzM0O2dldF9tYXRjaF9kYXRhJiMzNDsgcGFydCBzdHJvbmdseSBzdWdnZXN0cyB0aGF0IGl0JiMzOTtzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGRldmljZSYjMzk7cyBtYXRjaCAtIGxpa2VseSBpbmZvcm1hdGlvbiB1c2VkIHRvIGlkZW50aWZ5IGEgZGV2aWNlIGZyb20gdGhlIGRldmljZSB0cmVlIGFuZCBiaW5kIGl0IHRvIGEgZHJpdmVyLgoKSSYjMzk7bSBpbnN0YW50bHkgY29uc2lkZXJpbmcgdGhlIGNvbnRleHQuIElzIHRoaXMgY2FsbGVkIGR1cmluZyBkcml2ZXIgcHJvYmU/IEluaXRpYWxpemF0aW9uPyBIb3cgZG9lcyBpdCBpbnRlcmFjdCB3aXRoIHRoZSBkZXZpY2UgdHJlZSB0cmF2ZXJzYWwgcHJvY2Vzcz8gSXMgaXQgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBtYXRjaCBoYXMgYWxyZWFkeSBiZWVuIGlkZW50aWZpZWQsIG9yIGlzIGl0IGEga2V5IHBhcnQgb2YgdGhlIG1hdGNoaW5nICppdHNlbGYqPyBUaGUgJiMzNDtkYXRhJiMzNDsgYXNwZWN0IGlzIGludGVyZXN0aW5nLiBXaGF0ICpraW5kKiBvZiBkYXRhIGFyZSB3ZSB0YWxraW5nIGFib3V0PyBQcm9wZXJ0aWVzIGZyb20gdGhlIGRldmljZSBub2RlPyBJcyBpdCBhIGNvbWJpbmF0aW9uIG9mIHByb3BlcnR5IHZhbHVlcyBhbmQgc29tZSBvdGhlciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiwgcGVyaGFwcyBzdHJ1Y3R1cmVkIGluIGEgcGFydGljdWxhciB3YXk/CgpNeSBtaW5kIGlzIG5vdyByYWNpbmcgdGhyb3VnaCBhIGxpc3Qgb2YgcmVsYXRlZCBjb25jZXB0czogT0YgbWF0Y2hpbmcgdGFibGVzLCBkcml2ZXIgYmluZGluZ3MsIHByb3BlcnR5IHBhcnNpbmcuIEkmIzM5O20gbWVudGFsbHkgcGFyc2luZyB0aGUgbGlrZWx5IGZ1bmN0aW9uIHNpZ25hdHVyZTogd2hhdCBhcmd1bWVudHMgZG9lcyBpdCBwcm9iYWJseSB0YWtlPyBBIGRldmljZSBub2RlIHBvaW50ZXIsIGNlcnRhaW5seS4gUGVyaGFwcyBhIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJldHJpZXZlZCBkYXRhPyBBbiBlcnJvciBjb2RlIHJldHVybiB2YWx1ZSwgc3RhbmRhcmQgaW4gdGhpcyBhcmVhLiBJJiMzOTttIHdvbmRlcmluZyBhYm91dCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIGxvY2tpbmcgaXNzdWVzLCBhbmQgd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgcmUtZW50cmFudC4gRG9lcyBpdCBoYW5kbGUgZGV2aWNlIHRyZWUgYWxpYXNlcz8gSG93IGRvZXMgaXQgaGFuZGxlIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRldmljZSB0cmVlIGl0c2VsZj8gSXMgaXQgcm9idXN0IGluIHRoZSBmYWNlIG9mIG1hbGZvcm1lZCBvciBtaXNzaW5nIGRldmljZSB0cmVlIGVudHJpZXM/CgpJJiMzOTttIGFscmVhZHkgZm9ybXVsYXRpbmcgcXVlc3Rpb25zOiBJcyB0aGlzIGZ1bmN0aW9uIGEgcGVyZm9ybWFuY2UgYm90dGxlbmVjaz8gSXMgaXQgdXNlZCBvZnRlbj8gSXMgdGhlcmUgYW4gb3Bwb3J0dW5pdHkgZm9yIG9wdGltaXphdGlvbj8gVGhlIGNob2ljZSBvZiBkYXRhIHN0cnVjdHVyZXMgaXMgc29tZXRoaW5nIEkmIzM5O20gdmVyeSBpbnRlcmVzdGVkIGluLiBEb2VzIGl0IHVzZSBkeW5hbWljIGFsbG9jYXRpb24/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIG1lbW9yeSBsZWFrcz8gSSBhbSBhbHJlYWR5IHRoaW5raW5nIGFib3V0IHRoZSB3YXlzIGluIHdoaWNoIEkgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uLCBhbmQgYW55IHBvdGVudGlhbCBpc3N1ZXMgaXQgbWF5IHByZXNlbnQuCgpJJiMzOTttIHJlYWR5IHRvIGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGFuZCB1bmRlcnN0YW5kIGhvdyBpdCB3b3JrcyB1bmRlciB0aGUgaG9vZC4gVGltZSB0byBsb29rIGF0IHRoZSBjb2RlIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo0OTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvb2YvZGV2aWNlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNzIsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE3MjpcdGNvbnN0IHZvaWQgKm9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpXG4gMTczOlx0e1xuIDE3NDpcdFx0Y29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7XG4gMTc1Olx0XG4gMTc2Olx0XHRtYXRjaCA9IG9mX21hdGNoX2RldmljZShkZXYtXHUwMDNlZHJpdmVyLVx1MDAzZW9mX21hdGNoX3RhYmxlLCBkZXYpO1xuIDE3NzpcdFx0aWYgKCFtYXRjaClcbiAxNzg6XHRcdFx0cmV0dXJuIE5VTEw7XG4gMTc5Olx0XG4gMTgwOlx0XHRyZXR1cm4gbWF0Y2gtXHUwMDNlZGF0YTtcbiAxODE6XHR9XG4gMTgyOlx0RVhQT1JUX1NZTUJPTChvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEpO1xuIDE4MzpcdFxuIDE4NDpcdC8qKlxuIDE4NTpcdCAqIG9mX2RldmljZV9tb2RhbGlhcyAtIEZpbGwgYnVmZmVyIHdpdGggbmV3bGluZSB0ZXJtaW5hdGVkIG1vZGFsaWFzIHN0cmluZ1xuIDE4NjpcdCAqIEBkZXY6XHRDYWxsaW5nIGRldmljZVxuIDE4NzpcdCAqIEBzdHI6XHRNb2RhbGlhcyBzdHJpbmdcbiAxODg6XHQgKiBAbGVuOlx0U2l6ZSBvZiBAc3RyXG4gMTg5Olx0ICovXG4gMTkwOlx0c3NpemVfdCBvZl9kZXZpY2VfbW9kYWxpYXMoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpzdHIsIHNzaXplX3QgbGVuKVxuIDE5MTpcdHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NDk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDIzMTkKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA1MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIERldmljZSBNYXRjaGluZyBQcm9jZXNzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgdGhpcyBkZXZpY2UgbWF0Y2hpbmcgaXMgaGFuZGxlZC4gSXQgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gVGhlIGNvcmUgZnVuY3Rpb24gaGVyZSBpcyBgb2ZfbWF0Y2hfZGV2aWNlYCwgYW5kIGl0IGhpbmdlcyBvbiB0aGUgZGV2aWNlJiMzOTtzIGBvZl9ub2RlYC4gSWYgdGhhdCBgZGV2LSZndDtvZl9ub2RlYCBpcyBudWxsLCB3aGljaCBpcyBwcmV0dHkgbXVjaCB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRldmljZXMgd2hpY2ggYXJlIG5vdCBkZXZpY2UtdHJlZSBiYXNlZCwgdGhlbiBgb2ZfbWF0Y2hfZGV2aWNlYCByZXR1cm5zIE5VTEwuIFJpZ2h0LiBUaGF0IG1ha2VzIHNlbnNlLCBhIG51bGwgcG9pbnRlciBmb3IgYSBudWxsIGRldmljZSB0cmVlLiBIbW0sIEkgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayB0aGUgYmVoYXZpb3Igb2YgYG9mX21hdGNoX2RldmljZWAgaXRzZWxmIGp1c3QgdG8gYmUgY29tcGxldGVseSBzdXJlIEkmIzM5O20gZm9sbG93aW5nIHRoZSBsb2dpYyBjb3JyZWN0bHkuIEdvdHRhIGJlIHByZWNpc2UgaGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7b2ZfbWF0Y2hfZGV2aWNlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9vZi9kZXZpY2UuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL29mL2RldmljZS5jLTE3LS8qKlxuZHJpdmVycy9vZi9kZXZpY2UuYzoxODogKiBvZl9tYXRjaF9kZXZpY2UgLSBUZWxsIGlmIGEgc3RydWN0IGRldmljZSBtYXRjaGVzIGFuIG9mX2RldmljZV9pZCBsaXN0XG5kcml2ZXJzL29mL2RldmljZS5jLTE5LSAqIEBtYXRjaGVzOiBhcnJheSBvZiBvZl9kZXZpY2VfaWQgbWF0Y2ggc3RydWN0dXJlcyB0byBzZWFyY2ggaW5cbi0tXG5kcml2ZXJzL29mL2RldmljZS5jLTI0LSAqL1xuZHJpdmVycy9vZi9kZXZpY2UuYzoyNTpjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcyxcbmRyaXZlcnMvb2YvZGV2aWNlLmMtMjYtXHRcdFx0XHRcdCAgIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldilcbi0tXG5kcml2ZXJzL29mL2RldmljZS5jLTMxLX1cbmRyaXZlcnMvb2YvZGV2aWNlLmM6MzI6RVhQT1JUX1NZTUJPTChvZl9tYXRjaF9kZXZpY2UpO1xuZHJpdmVycy9vZi9kZXZpY2UuYy0zMy1cbi0tXG5kcml2ZXJzL29mL2RldmljZS5jPTE3Mj1jb25zdCB2b2lkICpvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KVxuLS1cbmRyaXZlcnMvb2YvZGV2aWNlLmMtMTc1LVxuZHJpdmVycy9vZi9kZXZpY2UuYzoxNzY6XHRtYXRjaCA9IG9mX21hdGNoX2RldmljZShkZXYtXHUwMDNlZHJpdmVyLVx1MDAzZW9mX21hdGNoX3RhYmxlLCBkZXYpO1xuZHJpdmVycy9vZi9kZXZpY2UuYy0xNzctXHRpZiAoIW1hdGNoKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0Mjg1NQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgdGhlIEZ1bmN0aW9uOiBgb2ZfbWF0Y2hfZGV2aWNlYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgYG9mX21hdGNoX2RldmljZWAgZnVuY3Rpb24uIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIHF1aWNrbHkgZ2V0IGEgaGlnaC1sZXZlbCB1bmRlcnN0YW5kaW5nLiBXaGF0IGlzIHRoaXMgZnVuY3Rpb24gKnN1cHBvc2VkKiB0byBkbz8gQ29udGV4dCBjbHVlcyBpbmRpY2F0ZSBpdCYjMzk7cyByZWxhdGVkIHRvIE9wZW4gRmlybXdhcmUgYW5kIGRldmljZSBtYXRjaGluZywgYnV0IHNwZWNpZmljYWxseSwgaG93IGRvZXMgaXQgZml0IGludG8gdGhlIGJyb2FkZXIgZGV2aWNlIHRyZWUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2U/IEkgbmVlZCB0byBxdWlja2x5IGRldGVybWluZSBpdHMgaW5wdXQgcGFyYW1ldGVycywgZXNwZWNpYWxseSB3aGF0IGl0IGV4cGVjdHMgcmVnYXJkaW5nIGRldmljZSBub2RlcyBhbmQgdGhlaXIgcHJvcGVydGllcy4gSXMgaXQgbG9va2luZyBmb3Igc3BlY2lmaWMgcHJvcGVydGllcyBvciBhIHBhcnRpY3VsYXIgc3RydWN0dXJlIGluIHRoZSBkZXZpY2UgdHJlZT8gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYW55IGhpbnRzIGFib3V0IHRoZSBtYXRjaGluZyBzdHJhdGVneSDigJMgaXMgaXQgYmFzZWQgb24gY29tcGF0aWJsZSBzdHJpbmdzLCBoYXJkd2FyZSBJRHMsIG9yIHNvbWV0aGluZyBlbHNlPwoKSSBuZWVkIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzLiBJJiMzOTttIGtlZW4gdG8gdW5kZXJzdGFuZCB0aGUgcmV0dXJuIHZhbHVlLiBEb2VzIGl0IHJldHVybiBhIGJvb2xlYW4sIGFuIGVycm9yIGNvZGUsIG9yIGEgcG9pbnRlciB0byBhIG1hdGNoZWQgZGV2aWNlPyBXaGF0IGNvbmRpdGlvbnMgdHJpZ2dlciBhIG1hdGNoLCBhbmQgd2hhdCBoYXBwZW5zIHdoZW4gbm8gbWF0Y2ggaXMgZm91bmQ/IFRoaXMgaXMgY3J1Y2lhbCBmb3IgZGVidWdnaW5nIGFuZCB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIHN5c3RlbSYjMzk7cyBiZWhhdmlvci4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IGFueSBzdXJyb3VuZGluZyBjb2RlLCBwYXJ0aWN1bGFybHkgZnVuY3Rpb24gY2FsbHMgcHJlY2VkaW5nIGFuZCBmb2xsb3dpbmcgYG9mX21hdGNoX2RldmljZWAsIHRvIGdldCBhIGZlZWwgZm9yIGl0cyByb2xlIGluIHRoZSBkcml2ZXIgcHJvYmluZyBwcm9jZXNzLiBGaW5hbGx5LCB3aGF0IGRhdGEgc3RydWN0dXJlcyBkb2VzIGl0IGludGVyYWN0IHdpdGg/IEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgb2ZfbWF0Y2hfZGV2aWNlYCBjb250cmlidXRlcyB0byBidWlsZGluZyB0aGUgZHJpdmVyIG1vZGVsIHdpdGhpbiB0aGlzIHN5c3RlbS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtkcml2ZXJzL29mL2RldmljZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAyNTpcdGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLFxuICAyNjpcdFx0XHRcdFx0XHQgICBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpXG4gIDI3Olx0e1xuICAyODpcdFx0aWYgKCFtYXRjaGVzIHx8ICFkZXYtXHUwMDNlb2Zfbm9kZSB8fCBkZXZfb2Zfbm9kZV9yZXVzZWQoZGV2KSlcbiAgMjk6XHRcdFx0cmV0dXJuIE5VTEw7XG4gIDMwOlx0XHRyZXR1cm4gb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBkZXYtXHUwMDNlb2Zfbm9kZSk7XG4gIDMxOlx0fVxuICAzMjpcdEVYUE9SVF9TWU1CT0wob2ZfbWF0Y2hfZGV2aWNlKTtcbiAgMzM6XHRcbiAgMzQ6XHRzdGF0aWMgdm9pZFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNTo1MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MzM3MgoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDg4MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipVbnJlYWNoYWJsZSBEcml2ZXJzIGluIFZpcnR1YWxpemVkIEVudmlyb25tZW50cyoqCgpPa2F5LCBzbyBoZXJlJiMzOTtzIHRoZSBkZWFsLiBNeSBpbml0aWFsIHRob3VnaHQgcHJvY2VzcyBsZWQgbWUgZG93biB0aGlzIHBhdGg6IGlmIGBkZXYtJmd0O29mX25vZGVgIGlzIG51bGwsIHRoZSBkZXZpY2UgbWF0Y2hpbmcgZnVuY3Rpb24gcmV0dXJucyBudWxsLCB3aGljaCBtZWFucyB0aGUgbWF0Y2ggZGF0YSByZXRyaWV2YWwgd2lsbCBhbHNvIGltbWVkaWF0ZWx5IHJldHVybiBudWxsIGlmIGBkZXZfZndub2RlKGRldilgIGlzIG51bGwuIEFuZCBndWVzcyB3aGF0PyBUaGF0JiMzOTtzIHByZWNpc2VseSB0aGUgc2l0dWF0aW9uIGZvciBJMkMgZGV2aWNlcyBpbnN0YW50aWF0ZWQgdGhyb3VnaCBzeXNmcyEgVGhpcyBtZWFucyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgbnVsbCBmb3IgdGhlc2UgZGV2aWNlcywgYW5kIHRoZSBgcnRwc2VfbWN1X2kyY19wcm9iZWAgaXMgZ29pbmcgdG8gZmFpbCB3aXRoIGAtRU5PREVWYCwgZXZlcnkgc2luZ2xlIHRpbWUuCgpOb3csIEkgcGF1c2VkIHRvIGNvbnNpZGVyIGlmIHRoZXJlIHdhcyBhbiBhbHRlcm5hdGUgcm91dGUgdG8gaW5zdGFudGlhdGUgYW4gSTJDIGRldmljZSB3aXRoIGBkZXZfZndub2RlKGRldilgIHNldC4gVGhlcmUgaXMgb25lISBgaTJjX25ld19jbGllbnRfZGV2aWNlYCBmcm9tIGFub3RoZXIgZHJpdmVyLCBwYXNzaW5nIGBib2FyZF9pbmZvLmZ3bm9kZWAsIGJ1dCBzeXprYWxsZXIgZG9lc24mIzM5O3QgaGF2ZSBhIGdlbmVyaWMgbWVjaGFuaXNtIGZvciB0aGF0LgoKVGhlbiwgSSBsb29rZWQgYXQgYGkyY19nZXRfbWF0Y2hfZGF0YWAuIElmIHRoZSBwcm9iZSB1c2VkIHRoYXQsIGl0IHdvdWxkIGZhbGwgYmFjayB0byBgaTJjX21hdGNoX2lkYCwgYnV0IHRoZSBkcml2ZXIgZG9lc24mIzM5O3QgaGF2ZSBhbiBgaWRfdGFibGVgIGFueXdheSEgU28gZXZlbiBpZiBpdCB1c2VkIGBpMmNfZ2V0X21hdGNoX2RhdGFgLCBpdCB3b3VsZCBzdGlsbCByZXR1cm4gTlVMTC4gSGVyZSYjMzk7cyBhIGtleSBwb2ludDogYGkyY19nZXRfbWF0Y2hfZGF0YWAgKmRvZXNuJiMzOTt0KiBmYWxsIGJhY2sgdG8gYGkyY19vZl9tYXRjaF9kZXZpY2Vfc3lzZnNgLiBUaGF0IGlzIG9ubHkgdXNlZCBmb3IgYmluZGluZyB0aGUgZHJpdmVyIHZpYSBgaTJjX2RldmljZV9tYXRjaGAuIEJ1dCBvbmNlIHRoZSBkcml2ZXIgaXMgYm91bmQsIHRoZSBwcm9iZSBmdW5jdGlvbiBpcyBjYWxsZWQuIEFuZCBpbiB0aGUgcHJvYmUgZnVuY3Rpb24sIHRoZSBkcml2ZXIgd2lsbCB0cnkgdG8gZ2V0IHRoZSBtYXRjaCBkYXRhLCBidXQgd2l0aCBubyBgaWRfdGFibGVgIGFuZCBubyBgb2Zfbm9kZWAsIGl0IHdpbGwgZmFpbC4gVGhpcyBpcyBhIGtub3duIGlzc3VlISBEcml2ZXJzIHdpdGggb25seSBgb2ZfbWF0Y2hfdGFibGVgIGFuZCB1c2luZyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBvciBgaTJjX2dldF9tYXRjaF9kYXRhYCBidXQgbm8gYGlkX3RhYmxlYCBjYW5ub3QgYmUgcHJvYmVkIHZpYSBzeXNmcyBgbmV3X2RldmljZWAuCgpJIHRoZW4gbG9va2VkIGF0IHRoZSBwb3NzaWJpbGl0eSBvZiBwYXNzaW5nIG1hdGNoIGRhdGEuIERvZXMgYGkyY19vZl9tYXRjaF9kZXZpY2Vfc3lzZnNgIHNldCBgY2xpZW50LSZndDtkZXYuZHJpdmVyX2RhdGFgPyBObywgaXQgZG9lc24mIzM5O3QuIGBpMmNfZGV2aWNlX21hdGNoYCBqdXN0IHJldHVybnMgMSBhbmQgZG9lc24mIzM5O3Qgc2F2ZSB0aGUgbWF0Y2ggZGF0YSBhbnl3aGVyZS4KCkluIHN1bW1hcnksIHRoaXMgZHJpdmVyJiMzOTtzIHByb2JlIGZ1bmN0aW9uIGlzIGRvb21lZCB0byBmYWlsLiBUaGlzIGlzIGEgY29tcGxldGUgZGVhZCBlbmQgaW4gYSB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudCAqd2l0aG91dCogYSBzcGVjaWZpYyBEZXZpY2UgVHJlZS4KClNvLCBkb2VzIHN5emthbGxlciBoYXZlIGEgY3VzdG9tIERUIGZvciB0aGlzIGtpbmQgb2Ygc2NlbmFyaW8/IE5vLCBpdCB1c2VzIHN0YXRpYyBEVHMgZm9yIGBxZW11LXN5c3RlbS1hcm1gIG9yIGBxZW11LXN5c3RlbS1hYXJjaDY0YCAobGlrZSBgdmV4cHJlc3NgIG9yIGB2aXJ0YCkuIEl0IGRvZXNuJiMzOTt0IGFkZCBub2RlcyBkeW5hbWljYWxseSBmb3IgbmV3IGRyaXZlcnMuCgpEb2VzIHN5emthbGxlciB0ZXN0IEkyQyBkcml2ZXJzIGJ5IGluamVjdGluZyB0cmFmZmljPyBJZiB0aGUgZHJpdmVyIGNhbm5vdCBiZSBwcm9iZWQsIGl0IGNhbm5vdCBiZSB0ZXN0ZWQsIHdoaWNoIG1lYW5zIGl0IGNhbm5vdCBiZSB0ZXN0ZWQgYXQgYWxsISBUaGlzIGlzIGEgc2VyaW91cyBwcm9ibGVtLgoKQW5kIHRoZW4gSSB0dXJuZWQgdG8gdGhlIFVBUlQgZHJpdmVyLiBJdCB1c2VzIGBzZXJkZXZgLCB3aGljaCBpcyBhbHNvIGluc3RhbnRpYXRlZCB2aWEgRGV2aWNlIFRyZWUgb3IgQUNQSS4gQ2FuIHN5emthbGxlciBpbnN0YW50aWF0ZSBzZXJkZXYgZGV2aWNlcz8gTm8sIHRoZXJlIGlzIG5vIHN5c2ZzIGBuZXdfZGV2aWNlYCBmb3IgYHNlcmRldmAuIFNlcmRldiBpcyBzdHJpY3RseSBpbnN0YW50aWF0ZWQgZnJvbSBmaXJtd2FyZS4gU3l6a2FsbGVyIGNhbm5vdCBpbmplY3QgRFQgbm9kZXMgZm9yIHNlcmRldiwgc28gdGhhdCBkcml2ZXIgaXMgYWxzbyB1bnJlYWNoYWJsZS4KCkZpbmFsbHksIEkgd29uZGVyIGlmIHRoZXJlIGlzIGFueSBgc2VyZGV2YCBmdXp6ZXIgaW4gc3l6a2FsbGVyLiBUaW1lIHRvIGNoZWNrIGZvciBgc2VyZGV2YCBkZXNjcmlwdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjUwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c2VyZGV2JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7c3lzL2xpbnV4LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA1OjUwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ1MDY4CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6CgoqKk1pc3NpbmcgUGllY2VzIGFuZCBQb3RlbnRpYWwgTGVhZHMgaW4gU3l6a2FsbGVyIERlc2NyaXB0aW9ucyoqCgpPa2F5LCBJJiMzOTttIGdvaW5nIHRocm91Z2ggdGhlc2Ugc3l6a2FsbGVyIGRlc2NyaXB0aW9ucywgYW5kIEkmIzM5O20gbm90aWNpbmcgc29tZXRoaW5nIGFic2VudC4gVGhlcmUmIzM5O3Mgbm8gbWVudGlvbiBvZiBgc2VyZGV2YCwgd2hpY2ggaXMgdW51c3VhbCBnaXZlbiB0aGUgc2NvcGUgb2YgdGhlIHByb2plY3QuIFRoaXMgZmVlbHMgbGlrZSBhbiBvdmVyc2lnaHQgdGhhdCBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24uIE15IG1pbmQgaW1tZWRpYXRlbHkgc3RhcnRzIHRvIHJ1biB0aHJvdWdoIHJlbGF0ZWQgYXJlYXMgYW5kIHBvc3NpYmxlIHJlYXNvbnMgZm9yIHRoZSBvbWlzc2lvbi4KClRoZW4sIG15IHRyYWluIG9mIHRob3VnaHQgc2hpZnRzIGdlYXJzLiBXaGlsZSBjb25zaWRlcmluZyB3aGF0IG1heSBiZSBtaXNzaW5nLCBJIG1vdmUgdG8gdGhpbmtpbmcgYWJvdXQgYGkyY2AuIElzIGBpMmNgIGhhbmRsZWQgY29ycmVjdGx5IGluIHRoZXNlIGRlc2NyaXB0aW9ucz8gSXQmIzM5O3MgYSBrZXkgYXJlYSwgYW5kIHRoZSBhYnNlbmNlIG9mIGBzZXJkZXZgIHJlbWluZHMgbWUgdG8gZG91YmxlLWNoZWNrIHJlbGF0ZWQgY29tcG9uZW50cy4gSXQmIzM5O3MgYSBwb3RlbnRpYWwgYXJlYSBvZiBjb25jZXJuIGlmIHRoaXMgaXMgbWlzc2luZyBvciBoYW5kbGVkIGluY29ycmVjdGx5LiBJIG5lZWQgdG8gZGVsdmUgZGVlcGVyIGludG8gdGhlIGBpMmNgIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uIHRvIGVuc3VyZSBldmVyeXRoaW5nIGlzIGFjY291bnRlZCBmb3IuIFRoaXMgb2JzZXJ2YXRpb24gaXMgYSBzaWduYWwgdG8gZG8gYSBkZWVwZXIgZGl2ZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Mi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtpMmMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtzeXMvbGludXgvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NTA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDUzMzUKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAyOTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEkyQyBEcml2ZXIgSW5zdGFudGlhdGlvbiB3aXRoIFN5emthbGxlcioqCgpPa2F5LCBzbyBJIGNhbiYjMzk7dCBqdXN0IGBncmVwcGVyYCB0aGUgc3l6a2FsbGVyIGRlc2NyaXB0aW9ucywgcmlnaHQ/IFRoYXQmIzM5O3MgcmlnaHQsIHRoZSBpbnN0cnVjdGlvbnMgc2F5IHRvIGF2b2lkIHRob3NlIGFuZCBzeXpfIHByZWZpeGVzLiBJIHNob3VsZCBoYXZlIGJlZW4gYWJsZSB0byB1c2UgdGhhdCBgdG9vbFJlYWREZXNjcmlwdGlvbmAgdGhpbmcsIGJ1dCBpdCYjMzk7cyBub3QgYWN0dWFsbHkgYW4gYXZhaWxhYmxlIHRvb2wuIFNpZ2guIEkga25vdyBzeXprYWxsZXIgY2FuIHRlc3QgSTJDIGRyaXZlcnMgdXNpbmcgYC9kZXYvaTJjLVhgIG9yIGBuZXdfZGV2aWNlYCB2aWEgc3lzZnMuIEkgaGFkIGEgaHlwb3RoZXNpcyBhYm91dCBgbmV3X2RldmljZWAgZmFpbGluZyBpbiBgcHJvYmVgIGJlY2F1c2UgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgcmV0dXJucyBOVUxMLiBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQgYXNzdW1wdGlvbiB0aG91Z2guIEl04oCZcyBwb3NzaWJsZSBhIHJlY2VudCBwYXRjaCBjb3VsZCBjaGFuZ2UgdGhhdCBiZWhhdmlvciBmb3Igc3lzZnMtaW5zdGFudGlhdGVkIEkyQyBkZXZpY2VzLiBMZXQgbWUgZGlnIGludG8gYGRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuY2AgYW5kIHNlZSBpZiBgZGV2LmZ3bm9kZWAgaXMgYmVpbmcgc2V0IGFueXdoZXJlLiBUaGF0IHdvdWxkIGJlIGtleSB0byBtYWtpbmcgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgcmV0dXJuIGEgdmFsaWQgcG9pbnRlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Zndub2RlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYz00OTE9c3RhdGljIGludCBpMmNfZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldilcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy00OTIte1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjQ5MzpcdHN0cnVjdCBmd25vZGVfaGFuZGxlXHQqZndub2RlID0gZGV2X2Z3bm9kZShkZXYpO1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTQ5NC1cdHN0cnVjdCBpMmNfY2xpZW50XHQqY2xpZW50ID0gaTJjX3ZlcmlmeV9jbGllbnQoZGV2KTtcbi0tXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtNTExLVx0XHRcdGlycSA9IGkyY19zbWJ1c19ob3N0X25vdGlmeV90b19pcnEoY2xpZW50KTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzo1MTI6XHRcdH0gZWxzZSBpZiAoaXNfb2Zfbm9kZShmd25vZGUpKSB7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6NTEzOlx0XHRcdGlycSA9IGZ3bm9kZV9pcnFfZ2V0X2J5bmFtZShmd25vZGUsIFwmIzM0O2lycVwmIzM0Oyk7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtNTE0LVx0XHRcdGlmIChpcnEgPT0gLUVJTlZBTCB8fCBpcnEgPT0gLUVOT0RBVEEpXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6NTE1Olx0XHRcdFx0aXJxID0gZndub2RlX2lycV9nZXQoZndub2RlLCAwKTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzo1MTY6XHRcdH0gZWxzZSBpZiAoaXNfYWNwaV9kZXZpY2Vfbm9kZShmd25vZGUpKSB7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtNTE3LVx0XHRcdGJvb2wgd2FrZV9jYXBhYmxlO1xuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy01NDktXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6NTUwOlx0XHR3YWtlaXJxID0gZndub2RlX2lycV9nZXRfYnluYW1lKGZ3bm9kZSwgXCYjMzQ7d2FrZXVwXCYjMzQ7KTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy01NTEtXHRcdGlmICh3YWtlaXJxID09IC1FUFJPQkVfREVGRVIpIHtcbi0tXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtNTcwLVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjU3MTpcdHN0YXR1cyA9IG9mX2Nsa19zZXRfZGVmYXVsdHModG9fb2Zfbm9kZShmd25vZGUpLCBmYWxzZSk7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtNTcyLVx0aWYgKHN0YXR1cyBcdTAwM2MgMClcbi0tXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM9OTYwPWkyY19uZXdfY2xpZW50X2RldmljZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBjb25zdCAqaW5mbylcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy05NjEte1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjk2MjpcdHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUgPSBpbmZvLVx1MDAzZWZ3bm9kZTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy05NjMtXHRzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50O1xuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDA1LVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwMDY6XHRkZXZpY2Vfc2V0X25vZGUoXHUwMDI2Y2xpZW50LVx1MDAzZWRldiwgZndub2RlX2hhbmRsZV9nZXQoZndub2RlKSk7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTAwNy1cbi0tXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTAxMy1cdFx0XHRcdGNsaWVudC1cdTAwM2VuYW1lLCBzdGF0dXMpO1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwMTQ6XHRcdFx0Z290byBvdXRfZXJyX3B1dF9md25vZGU7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTAxNS1cdFx0fVxuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDMyLVx0bmVlZF9wdXQgPSB0cnVlO1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwMzM6b3V0X2Vycl9wdXRfZndub2RlOlxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwMzQ6XHRmd25vZGVfaGFuZGxlX3B1dChmd25vZGUpO1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwMzUtb3V0X2Vycjpcbi0tXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM9MTA1ND12b2lkIGkyY191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNTUte1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwNTY6XHRzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlO1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNTctXG4tLVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNjAtXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA2MTpcdGZ3bm9kZSA9IGRldl9md25vZGUoXHUwMDI2Y2xpZW50LVx1MDAzZWRldik7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA2MjpcdGlmIChpc19vZl9ub2RlKGZ3bm9kZSkpXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA2MzpcdFx0b2Zfbm9kZV9jbGVhcl9mbGFnKHRvX29mX25vZGUoZndub2RlKSwgT0ZfUE9QVUxBVEVEKTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMDY0Olx0ZWxzZSBpZiAoaXNfYWNwaV9kZXZpY2Vfbm9kZShmd25vZGUpKVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwNjU6XHRcdGFjcGlfZGV2aWNlX2NsZWFyX2VudW1lcmF0ZWQodG9fYWNwaV9kZXZpY2Vfbm9kZShmd25vZGUpKTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDY2LVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNjctXHQvKlxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwNjg6XHQgKiBJZiB0aGUgcHJpbWFyeSBmd25vZGUgaXMgYSBzb2Z0d2FyZSBub2RlIGl0IGlzIGZyZWUtZWQgYnlcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDY5LVx0ICogZGV2aWNlX3JlbW92ZV9zb2Z0d2FyZV9ub2RlKCkgYmVsb3csIGF2b2lkIGRvdWJsZS1mcmVlLlxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNzAtXHQgKi9cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMDcxOlx0aWYgKCFpc19zb2Z0d2FyZV9ub2RlKGZ3bm9kZSkpXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA3MjpcdFx0Zndub2RlX2hhbmRsZV9wdXQoZndub2RlKTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDczLVxuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYz0xMDc3PUVYUE9SVF9TWU1CT0xfR1BMKGkyY191bnJlZ2lzdGVyX2RldmljZSk7XG4tLVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNzktLyoqXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA4MDogKiBpMmNfZmluZF9kZXZpY2VfYnlfZndub2RlKCkgLSBmaW5kIGFuIGkyY19jbGllbnQgZm9yIHRoZSBmd25vZGVcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMDgxOiAqIEBmd25vZGU6IFx1MDAyNnN0cnVjdCBmd25vZGVfaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFx1MDAyNnN0cnVjdCBpMmNfY2xpZW50XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTA4Mi0gKlxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwODM6ICogTG9vayB1cCBhbmQgcmV0dXJuIHRoZSBcdTAwMjZzdHJ1Y3QgaTJjX2NsaWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBAZndub2RlLlxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwODQ6ICogSWYgbm8gY2xpZW50IGNhbiBiZSBmb3VuZCwgb3IgQGZ3bm9kZSBpcyBOVUxMLCB0aGlzIHJldHVybnMgTlVMTC5cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDg1LSAqXG4tLVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwODctICovXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA4ODpzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2ZpbmRfZGV2aWNlX2J5X2Z3bm9kZShzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwODkte1xuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDkyLVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwOTM6XHRpZiAoSVNfRVJSX09SX05VTEwoZndub2RlKSlcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDk0LVx0XHRyZXR1cm4gTlVMTDtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDk1LVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwOTY6XHRkZXYgPSBidXNfZmluZF9kZXZpY2VfYnlfZndub2RlKFx1MDAyNmkyY19idXNfdHlwZSwgZndub2RlKTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDk3LVx0aWYgKCFkZXYpXG4tLVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTExMDUtfVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjExMDY6RVhQT1JUX1NZTUJPTChpMmNfZmluZF9kZXZpY2VfYnlfZndub2RlKTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMTA3LVxuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYz0xNDcyPXN0YXRpYyBpbnQgaTJjX3NldHVwX2hvc3Rfbm90aWZ5X2lycV9kb21haW4oc3RydWN0IGkyY19hZGFwdGVyICphZGFwKVxuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xNDc4LVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE0Nzk6XHRkb21haW4gPSBpcnFfZG9tYWluX2NyZWF0ZV9saW5lYXIoZGV2X2Z3bm9kZShhZGFwLVx1MDAzZWRldi5wYXJlbnQpLFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE0ODAtXHRcdFx0XHRcdCAgSTJDX0FERFJfN0JJVFNfQ09VTlQsXG4tLVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jPTE4Nzc9RVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9pMmNfYWRkX2FkYXB0ZXIpO1xuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE4NzgtXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTg3OTpzdGF0aWMgaW50IGkyY19kZXZfb3JfcGFyZW50X2Z3bm9kZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQgKmRhdGEpXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTg4MC17XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTg4MTpcdGlmIChkZXZpY2VfbWF0Y2hfZndub2RlKGRldiwgZGF0YSkpXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTg4Mi1cdFx0cmV0dXJuIDE7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTg4My1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxODg0Olx0aWYgKGRldi1cdTAwM2VwYXJlbnQgXHUwMDI2XHUwMDI2IGRldmljZV9tYXRjaF9md25vZGUoZGV2LVx1MDAzZXBhcmVudCwgZGF0YSkpXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTg4NS1cdFx0cmV0dXJuIDE7XG4tLVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE4OTAtLyoqXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTg5MTogKiBpMmNfZmluZF9hZGFwdGVyX2J5X2Z3bm9kZSgpIC0gZmluZCBhbiBpMmNfYWRhcHRlciBmb3IgdGhlIGZ3bm9kZVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE4OTI6ICogQGZ3bm9kZTogXHUwMDI2c3RydWN0IGZ3bm9kZV9oYW5kbGUgY29ycmVzcG9uZGluZyB0byB0aGUgXHUwMDI2c3RydWN0IGkyY19hZGFwdGVyXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTg5My0gKlxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE4OTQ6ICogTG9vayB1cCBhbmQgcmV0dXJuIHRoZSBcdTAwMjZzdHJ1Y3QgaTJjX2FkYXB0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgQGZ3bm9kZS5cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxODk1OiAqIElmIG5vIGFkYXB0ZXIgY2FuIGJlIGZvdW5kLCBvciBAZndub2RlIGlzIE5VTEwsIHRoaXMgcmV0dXJucyBOVUxMLlxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE4OTYtICpcbi0tXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTg5OC0gKi9cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxODk5OnN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2ZpbmRfYWRhcHRlcl9ieV9md25vZGUoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSlcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTAwLXtcbi0tXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTkwMy1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxOTA0Olx0aWYgKElTX0VSUl9PUl9OVUxMKGZ3bm9kZSkpXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTkwNS1cdFx0cmV0dXJuIE5VTEw7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTkwNi1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxOTA3Olx0ZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKFx1MDAyNmkyY19idXNfdHlwZSwgTlVMTCwgZndub2RlLFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE5MDg6XHRcdFx0ICAgICAgaTJjX2Rldl9vcl9wYXJlbnRfZndub2RlX21hdGNoKTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTA5LVx0aWYgKCFkZXYpXG4tLVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE5MTctfVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE5MTg6RVhQT1JUX1NZTUJPTChpMmNfZmluZF9hZGFwdGVyX2J5X2Z3bm9kZSk7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTkxOS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTIwLS8qKlxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE5MjE6ICogaTJjX2dldF9hZGFwdGVyX2J5X2Z3bm9kZSgpIC0gZmluZCBhbiBpMmNfYWRhcHRlciBmb3IgdGhlIGZ3bm9kZVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE5MjI6ICogQGZ3bm9kZTogXHUwMDI2c3RydWN0IGZ3bm9kZV9oYW5kbGUgY29ycmVzcG9uZGluZyB0byB0aGUgXHUwMDI2c3RydWN0IGkyY19hZGFwdGVyXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTkyMy0gKlxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE5MjQ6ICogTG9vayB1cCBhbmQgcmV0dXJuIHRoZSBcdTAwMjZzdHJ1Y3QgaTJjX2FkYXB0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgQGZ3bm9kZSxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTI1LSAqIGFuZCBpbmNyZW1lbnQgdGhlIGFkYXB0ZXIgbW9kdWxlJiMzOTtzIHVzZSBjb3VudC4gSWYgbm8gYWRhcHRlciBjYW4gYmUgZm91bmQsXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTkyNjogKiBvciBAZndub2RlIGlzIE5VTEwsIHRoaXMgcmV0dXJucyBOVUxMLlxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE5MjctICpcbi0tXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTkzMC0gKi9cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxOTMxOnN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2dldF9hZGFwdGVyX2J5X2Z3bm9kZShzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE5MzIte1xuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTM0LVxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE5MzU6XHRhZGFwdGVyID0gaTJjX2ZpbmRfYWRhcHRlcl9ieV9md25vZGUoZndub2RlKTtcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTM2LVx0aWYgKCFhZGFwdGVyKVxuLS1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTQ1LX1cbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxOTQ2OkVYUE9SVF9TWU1CT0woaTJjX2dldF9hZGFwdGVyX2J5X2Z3bm9kZSk7XG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTk0Ny1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NTA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDk4OTMKCQkJCQkJCW91dHB1dDogMTg4CgkJCQkJCQl0aG91Z2h0czogMTMxMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipVbnJlYWNoYWJsZSBEcml2ZXIgQW5hbHlzaXMqKgoKT2theSwgbXkgYW5hbHlzaXMgaXMgYXMgZm9sbG93czogSSYjMzk7bSBjb25maWRlbnQgdGhhdCBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCByZXR1cm5zIE5VTEwgd2hlbiB0aGUgZGV2aWNlJiMzOTtzIGZ3bm9kZSAoYGRldl9md25vZGUoZGV2KWApIGlzIE5VTEwsIGFuZCBJIGtub3cgZnJvbSBwcmlvciBleHBlcmllbmNlIHRoYXQgYGRldl9md25vZGUoZGV2KWAgaXMgaW5kZWVkIE5VTEwgZm9yIEkyQyBkZXZpY2VzIGluc3RhbnRpYXRlZCB0aHJvdWdoIHN5c2ZzLiBUaGlzIG1lYW5zIHRoZSBgcnRwc2VfbWN1X2kyY19wcm9iZWAgZnVuY3Rpb24gd2lsbCBpbmV2aXRhYmx5IGZhaWwgd2l0aCBhbiBgLUVOT0RFVmAgZXJyb3IgaWYgdGhlIEkyQyBkZXZpY2UgaXMgY3JlYXRlZCB1c2luZyB0aGUgc3lzZnMgaW50ZXJmYWNlLgoKSSB0aGVuIGNvbnNpZGVyZWQgaG93IHN5emthbGxlciBtaWdodCBiZSBhYmxlIHRvIHRyaWdnZXIgdGhpcyBkcml2ZXIuIFRoZSBrZXkgcXVlc3Rpb24gaXMgd2hldGhlciB0aGVyZSBpcyBhIHdheSB0byBzZXQgdGhlIGBmd25vZGVgIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgZGV2aWNlLiBTeXprYWxsZXIgZG9lc24mIzM5O3Qgc2VlbSB0byBoYXZlIGEgd2F5IHRvIGluamVjdCBJMkMgZGV2aWNlcyB3aXRoIHRoZSBgZndub2RlYCBzZXQsIGZvciBpbnN0YW5jZSB0aHJvdWdoIERUIG92ZXJsYXlzLiAKCkkgY29uc2lkZXJlZCBpZiBhbm90aGVyIGZ1enplZCBkcml2ZXIgY291bGQgaW5kaXJlY3RseSBjcmVhdGUgdGhpcyBJMkMgZGV2aWNlIHZpYSBgaTJjX25ld19jbGllbnRfZGV2aWNlYCwgYnV0IHRoZXJlJiMzOTtzIG5vIGdlbmVyaWMgd2F5IHRoaXMgY291bGQgaGFwcGVuLiBUaGVuIEkgdGhvdWdodCBhYm91dCB0aGUgVUFSVCBkcml2ZXIsIHdoaWNoIHVzZXMgYHNlcmRldmAuIFNlcmRldiBkZXZpY2VzIGFyZSBhbHNvIGluc3RhbnRpYXRlZCB2aWEgRFQgb3IgQUNQSSwgc28gdGhlIHNhbWUgbGltaXRhdGlvbiBhcHBsaWVzLiBTeXprYWxsZXIgY2Fubm90IGluc3RhbnRpYXRlIHNlcmRldiBkZXZpY2VzIHZpYSBzeXNmcywgc2luY2UgdGhlcmUgaXMgbm8gYG5ld19kZXZpY2VgIGZvciBzZXJkZXYuCgpJIHRoZW4gZXhwbG9yZWQgdGhlIHBvc3NpYmlsaXR5IG9mIGluamVjdGluZyBhIGBzb2Z0d2FyZV9ub2RlYCB0byBieXBhc3MgdGhlIERUIGRlcGVuZGVuY3ksIGJ1dCB1bmZvcnR1bmF0ZWx5LCBzeXprYWxsZXIgZG9lcyBub3QgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3Igc29mdHdhcmUgbm9kZSBpbmplY3Rpb24uIFRoaXMgbWVhbnMgdGhlIGRyaXZlciBpcyBjb21wbGV0ZWx5IHVucmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIFFFTVUgb3IgR0NFLgoKSSBkb3VibGUtY2hlY2tlZCBgaTJjX29mX21hdGNoX2RldmljZV9zeXNmc2AgdG8gY29uZmlybSBpdCBkb2VzbiYjMzk7dCBzdG9yZSB0aGUgbWF0Y2ggZGF0YSBpbiB0aGUgYGRldi0mZ3Q7ZHJpdmVyX2RhdGFgIG9yIHNvbWV0aGluZyBzaW1pbGFyLCBhbmQgaXQgZG9lc24mIzM5O3QuIFRoaXMgY29uZmlybXMgdGhhdCBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCB3aWxsIGRlZmluaXRlbHkgcmV0dXJuIE5VTEwuIFRoaXMgaXMgYSBrbm93biBpc3N1ZSBmb3IgSTJDIGRyaXZlcnMgdGhhdCBkZXBlbmQgb24gYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgd2l0aG91dCBoYXZpbmcgYW4gYGlkX3RhYmxlYC4gCgpJIHRoZW4gY29uc2lkZXJlZCBpZiBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBvciBgaTJjX2dldF9tYXRjaF9kYXRhYCBjb3VsZCBiZSBwYXRjaGVkIHRvIHNvbWVob3cgdXNlIGBpMmNfb2ZfbWF0Y2hfZGV2aWNlX3N5c2ZzYCwgYnV0IGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiB0aGF0IGRvZXNuJiMzOTt0IGtub3cgYWJvdXQgSTJDLCBhbmQgYGkyY19nZXRfbWF0Y2hfZGF0YWAsIGV2ZW4gaWYgdXNlZCwgd291bGQgc3RpbGwgcmV0dXJuIE5VTEwgYmVjYXVzZSB0aGUgZHJpdmVyIGRvZXNuJiMzOTt0IGhhdmUgYW4gYGlkX3RhYmxlYC4KClRoZXJlZm9yZSwgdGhlIGRyaXZlciBpcyB1bnJlYWNoYWJsZSB2aWEgc3lzZnMgYG5ld19kZXZpY2VgLgoKR2l2ZW4gdGhlIHByb21wdCwgc2luY2UgdGhpcyBkcml2ZXIgcmVsaWVzIG9uIGEgc3BlY2lmaWMgRGV2aWNlIFRyZWUgbm9kZSBmb3IgaW5zdGFudGlhdGlvbiwgYW5kIHN5emthbGxlciBjYW5ub3QgaW5qZWN0IGFyYml0cmFyeSBEVCBub2RlcywgSSBuZWVkIHRvIGNvbmNsdWRlIHRoYXQgdGhpcyBkcml2ZXIgaXMgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB0aGUgc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMgdXNlZCBieSBzeXprYWxsZXIuCgpJIGFsc28gY2hlY2tlZCBpZiBzeXprYWxsZXIgdXNlcyBhIGN1c3RvbSBEVCB0aGF0IGNvdWxkIGluY2x1ZGUgdGhpcyBkZXZpY2UsIGFuZCBjb25maXJtZWQgaXQgZG9lcyBub3QuCgpJIGNvbnNpZGVyZWQgb3RoZXIgcG9zc2liaWxpdGllcyAoQUNQSSwgUENJLCBVU0IsIHBsYXRmb3JtIGRldmljZSkgYnV0LCBnaXZlbiB0aGUgSTJDL1VBUlQgbmF0dXJlIG9mIHRoZSBkZXZpY2UsIHRoZXNlIGFyZSBub3QgYXBwbGljYWJsZS4KCkluIGNvbmNsdXNpb24sIEkmIzM5O20gc2V0dGluZyBgV29ydGhGdXp6aW5nPWZhbHNlYCBhbmQgSSYjMzk7bSBleHBsYWluaW5nIHRoYXQgdGhlIGRyaXZlciByZWxpZXMgb24gRGV2aWNlIFRyZWUgKG9yIEFDUEkvc29mdHdhcmUgbm9kZXMpIGZvciBpbnN0YW50aWF0aW9uLiBTcGVjaWZpY2FsbHksIGl0IGRlcGVuZHMgb24gYGRldmljZV9nZXRfbWF0Y2hfZGF0YSgpYCwgd2hpY2ggcmV0dXJucyBOVUxMIGZvciBzeXNmcy1pbnN0YW50aWF0ZWQgSTJDIGRldmljZXMuIFN5emthbGxlciBkb2VzIG5vdCBkeW5hbWljYWxseSBpbmplY3QgRFQgbm9kZXMgZm9yIGFyYml0cmFyeSBJMkMgZGV2aWNlczsgdGhlcmVmb3JlIHRoZSBkcml2ZXImIzM5O3MgcHJvYmUgZnVuY3Rpb24gYW5kIGl0cyBjb3JlIGxvZ2ljIGFyZSB1bnJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuCgpJIHdpbGwgdmVyaWZ5IHRoZSBleGFjdCBiZWhhdmlvciBvZiBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBvbmUgbGFzdCB0aW1lLiBJIGNvbmZpcm1lZCB0aGUgZW50aXJlIHByb2JlIHBhdGggYW5kIHRoYXQgaXQgaW5ldml0YWJseSBmYWlscy4gVGhpcyBjb25maXJtcyB0aGUgY29uY2x1c2lvbiBhbmQgdGhlIHJlcG9ydCBpcyBjb21wbGV0ZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDU6NTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEkyQyBhbmQgVUFSVCAoc2VyZGV2KSBkcml2ZXIgZm9yIFJlYWx0ZWsgUFNFIE1DVXMuIFRoZSBJMkMgZHJpdmVyIHJlbGllcyBvbiBgZGV2aWNlX2dldF9tYXRjaF9kYXRhKClgIGluIGl0cyBwcm9iZSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBOVUxMIGZvciBkZXZpY2VzIGluc3RhbnRpYXRlZCBkeW5hbWljYWxseSB2aWEgc3lzZnMgYG5ld19kZXZpY2VgIGJlY2F1c2UgdGhleSBsYWNrIGEgZmlybXdhcmUgbm9kZSAoZndub2RlKS4gV2l0aG91dCBhbiBgaWRfdGFibGVgIGZhbGxiYWNrLCB0aGUgcHJvYmUgZnVuY3Rpb24gd2lsbCBhbHdheXMgZmFpbCB3aXRoIC1FTk9ERVYgd2hlbiBpbnN0YW50aWF0ZWQgdmlhIHN5c2ZzLiBGdXJ0aGVybW9yZSwgc2VyZGV2IGRldmljZXMgY2Fubm90IGJlIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZCB2aWEgc3lzZnMgYXQgYWxsLiBTaW5jZSBzeXprYWxsZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgaW5qZWN0IERldmljZSBUcmVlIG5vZGVzIG9yIHNvZnR3YXJlIG5vZGVzIGZvciBhcmJpdHJhcnkgSTJDL3NlcmRldiBkZXZpY2VzLCB0aGlzIGRyaXZlciBjYW5ub3QgYmUgc3VjY2Vzc2Z1bGx5IHByb2JlZCBhbmQgaXRzIGNvcmUgbG9naWMgaXMgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBRRU1VLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBJMkMgYW5kIFVBUlQgKHNlcmRldikgZHJpdmVyIGZvciBSZWFsdGVrIFBTRSBNQ1VzLiBUaGUgSTJDIGRyaXZlciByZWxpZXMgb24gYGRldmljZV9nZXRfbWF0Y2hfZGF0YSgpYCBpbiBpdHMgcHJvYmUgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgTlVMTCBmb3IgZGV2aWNlcyBpbnN0YW50aWF0ZWQgZHluYW1pY2FsbHkgdmlhIHN5c2ZzIGBuZXdfZGV2aWNlYCBiZWNhdXNlIHRoZXkgbGFjayBhIGZpcm13YXJlIG5vZGUgKGZ3bm9kZSkuIFdpdGhvdXQgYW4gYGlkX3RhYmxlYCBmYWxsYmFjaywgdGhlIHByb2JlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGZhaWwgd2l0aCAtRU5PREVWIHdoZW4gaW5zdGFudGlhdGVkIHZpYSBzeXNmcy4gRnVydGhlcm1vcmUsIHNlcmRldiBkZXZpY2VzIGNhbm5vdCBiZSBkeW5hbWljYWxseSBpbnN0YW50aWF0ZWQgdmlhIHN5c2ZzIGF0IGFsbC4gU2luY2Ugc3l6a2FsbGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGluamVjdCBEZXZpY2UgVHJlZSBub2RlcyBvciBzb2Z0d2FyZSBub2RlcyBmb3IgYXJiaXRyYXJ5IEkyQy9zZXJkZXYgZGV2aWNlcywgdGhpcyBkcml2ZXIgY2Fubm90IGJlIHN1Y2Nlc3NmdWxseSBwcm9iZWQgYW5kIGl0cyBjb3JlIGxvZ2ljIGlzIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgUUVNVS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0NzozOC44OTcyNzg2NjVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDE2ODg4ODY2MjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgSTJDIGFuZCBVQVJUIChzZXJkZXYpIGRyaXZlciBmb3IgUmVhbHRlayBQU0UgTUNVcy4gVGhlIEkyQyBkcml2ZXIgcmVsaWVzIG9uIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoKWAgaW4gaXRzIHByb2JlIGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIE5VTEwgZm9yIGRldmljZXMgaW5zdGFudGlhdGVkIGR5bmFtaWNhbGx5IHZpYSBzeXNmcyBgbmV3X2RldmljZWAgYmVjYXVzZSB0aGV5IGxhY2sgYSBmaXJtd2FyZSBub2RlIChmd25vZGUpLiBXaXRob3V0IGFuIGBpZF90YWJsZWAgZmFsbGJhY2ssIHRoZSBwcm9iZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBmYWlsIHdpdGggLUVOT0RFViB3aGVuIGluc3RhbnRpYXRlZCB2aWEgc3lzZnMuIEZ1cnRoZXJtb3JlLCBzZXJkZXYgZGV2aWNlcyBjYW5ub3QgYmUgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkIHZpYSBzeXNmcyBhdCBhbGwuIFNpbmNlIHN5emthbGxlciBkb2VzIG5vdCBkeW5hbWljYWxseSBpbmplY3QgRGV2aWNlIFRyZWUgbm9kZXMgb3Igc29mdHdhcmUgbm9kZXMgZm9yIGFyYml0cmFyeSBJMkMvc2VyZGV2IGRldmljZXMsIHRoaXMgZHJpdmVyIGNhbm5vdCBiZSBzdWNjZXNzZnVsbHkgcHJvYmVkIGFuZCBpdHMgY29yZSBsb2dpYyBpcyBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIFFFTVUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0NzozOC44OTcyOTI0NjVaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgzNDk2MTExNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGI3YzkxZTIwZjNmOTJiOThkZDJhZGRlZmQxN2UxN2E0NzQxZTE0MGZcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBKdWwgMjkgMDU6NDc6MzcgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9wc2UtcGQvcmVhbHRlayxwc2UtbWN1LWdlbjEueWFtbCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcHNlLXBkL3JlYWx0ZWsscHNlLW1jdS1nZW4xLnlhbWxcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjBmMWE4MTlkYjQ5YmJcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9wc2UtcGQvcmVhbHRlayxwc2UtbWN1LWdlbjEueWFtbFxcbkBAIC0wLDAgKzEsMTgwIEBAXFxuKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IChHUEwtMi4wLW9ubHkgT1IgQlNELTItQ2xhdXNlKVxcbislWUFNTCAxLjJcXG4rLS0tXFxuKyRpZDogaHR0cDovL2RldmljZXRyZWUub3JnL3NjaGVtYXMvbmV0L3BzZS1wZC9yZWFsdGVrLHBzZS1tY3UtZ2VuMS55YW1sI1xcbiskc2NoZW1hOiBodHRwOi8vZGV2aWNldHJlZS5vcmcvbWV0YS1zY2hlbWFzL2NvcmUueWFtbCNcXG4rXFxuK3RpdGxlOiBSZWFsdGVrIFBTRSBNQ1VcXG4rXFxuK21haW50YWluZXJzOlxcbisgIC0gSm9uYXMgSmVsb25layBcXHUwMDNjamVsb25lay5qb25hc0BnbWFpbC5jb21cXHUwMDNlXFxuK1xcbitkZXNjcmlwdGlvbjogfFxcbisgIEEgbWljcm9jb250cm9sbGVyIChNQ1UpIHRoYXQgbWFuYWdlcyB0aGUgUFNFIChQb3dlciBTb3VyY2luZyBFcXVpcG1lbnQpXFxuKyAgaGFyZHdhcmUgb24gYSByYW5nZSBvZiBtYW5hZ2VkIFBvRSBzd2l0Y2hlcy4gVGhlIGhvc3QgQ1BVIHRhbGtzIG9ubHkgdG9cXG4rICB0aGlzIE1DVSAtIG92ZXIgSTJDL1NNQnVzIG9yIFVBUlQgLSB1c2luZyBhIHNtYWxsIG1lc3NhZ2UtYmFzZWQgcHJvdG9jb2w7XFxuKyAgdGhlIFBTRSBzaWxpY29uIGl0IGRyaXZlcyBzaXRzIGJlaGluZCB0aGUgTUNVIGFuZCBpcyBuZXZlciBhY2Nlc3NlZFxcbisgIGRpcmVjdGx5LiBGb3IgZXhhbXBsZSwgb24gdGhlIFp5eGVsIEdTMTkwMC0xMEhQIHRoZSBTb0MgcmVhY2hlcyB0aGUgTUNVXFxuKyAgb3ZlciBVQVJULCBhbmQgdGhlIE1DVSBtYW5hZ2VzIHRoZSBvbi1ib2FyZCBQU0UgY2hpcC5cXG4rXFxuKyAgVGhpcyBiaW5kaW5nIGRlc2NyaWJlcyB0aGUgTUNVIHRvZ2V0aGVyIHdpdGggaXRzIFJlYWx0ZWsgZmlybXdhcmU6IHRoZVxcbisgIGZpcm13YXJlIGFuZCBpdHMgaG9zdCBwcm90b2NvbCwgd2hpY2ggYXJlIHN0YWJsZSBhY3Jvc3MgYm9hcmRzLiBUaGVcXG4rICBtaWNyb2NvbnRyb2xsZXIgc2lsaWNvbiBpcyBhIGdlbmVyYWwtcHVycG9zZSBwYXJ0IHRoYXQgdmFyaWVzLCBhbmQgdGhlXFxuKyAgUFNFIHNpbGljb24gYmVoaW5kIHRoZSBNQ1UgKFJlYWx0ZWsgUlRMODIzeC9SVEw4MjM5KiBvciBCcm9hZGNvbVxcbisgIEJDTTU5eHh4KSBpcyByZXBvcnRlZCBieSB0aGUgTUNVIGFuZCBkZXRlY3RlZCBhdCBydW50aW1lIC0gbmVpdGhlciBpc1xcbisgIG5hbWVkIGhlcmUuXFxuK1xcbisgIFR3byBwcm90b2NvbCBnZW5lcmF0aW9ucyBleGlzdCwgYm90aCBSZWFsdGVrJ3M6XFxuKyAgICBnZW4xICBvbGRlciBib2FyZHMsIHdoZXJlIHRoZSBNQ1UgZnJvbnRzIEJyb2FkY29tIFBTRSBzaWxpY29uXFxuKyAgICBnZW4yICB0aGUgYWx0ZXJlZCBwcm90b2NvbCB1c2VkIHdpdGggUmVhbHRlaydzIG93biBQU0Ugc2lsaWNvblxcbitcXG4rICBPbiBhbiBJMkMgYXR0YWNobWVudCB0aGUgZnJhbWluZyB0aGUgTUNVIGZpcm13YXJlIGV4cGVjdHMgaXMgcGFydCBvZiB0aGVcXG4rICBjb21wYXRpYmxlOiAnLXNtYnVzJyAocmVhZHMgY2FycnkgYSBsZWFkaW5nIGNvbW1hbmQgYnl0ZSBhbmQgYSByZXBlYXRlZFxcbisgIHN0YXJ0KSBvciAnLWkyYycgKGJhcmUgYmxvY2sgd3JpdGVzIGFuZCByZWFkcykuIEEgVUFSVCBhdHRhY2htZW50IGNhcnJpZXNcXG4rICBubyBmcmFtaW5nIHN1ZmZpeDsgdGhlIHRyYW5zcG9ydCBpcyBnaXZlbiBieSB0aGUgcGFyZW50ICdzZXJpYWwnIG5vZGUuXFxuK1xcbisgIEVhY2ggYm9hcmQgYWRkaXRpb25hbGx5IGNhcnJpZXMgYSBkZXZpY2Utc3BlY2lmaWMgY29tcGF0aWJsZSB0aGF0IGZhbGxzXFxuKyAgYmFjayB0byBvbmUgb2YgdGhlIHByb3RvY29sIGNvbXBhdGlibGVzIGFib3ZlLiBEcml2ZXJzIGJpbmQgb24gdGhlXFxuKyAgcHJvdG9jb2wgY29tcGF0aWJsZTsgdGhlIGRldmljZS1zcGVjaWZpYyBzdHJpbmcgaWRlbnRpZmllcyB0aGUgYm9hcmQgYW5kXFxuKyAgcmVzZXJ2ZXMgYSBwbGFjZSBmb3IgYSBmdXR1cmUgcGVyLWJvYXJkIHF1aXJrIHdpdGhvdXQgaGF2aW5nIHRvIHJldHJvZml0XFxuKyAgZGV2aWNlIHRyZWVzIGFscmVhZHkgaW4gdGhlIGZpZWxkLlxcbitcXG4rcHJvcGVydGllczpcXG4rICBjb21wYXRpYmxlOlxcbisgICAgb25lT2Y6XFxuKyAgICAgICMgVUFSVFxcbisgICAgICAtIGl0ZW1zOlxcbisgICAgICAgICAgLSBlbnVtOlxcbisgICAgICAgICAgICAgIC0genl4ZWwsZ3MxOTAwLTEwaHAtYTEtcHNlXFxuKyAgICAgICAgICAtIGNvbnN0OiByZWFsdGVrLHBzZS1tY3UtZ2VuMVxcbitcXG4rICAgICAgIyBJMkMsIFNNQnVzIGZyYW1pbmdcXG4rICAgICAgLSBpdGVtczpcXG4rICAgICAgICAgIC0gZW51bTpcXG4rICAgICAgICAgICAgICAtIHp5eGVsLGdzMTkyMC0yNGhwLXYyLXBzZVxcbisgICAgICAgICAgLSBjb25zdDogcmVhbHRlayxwc2UtbWN1LWdlbjEtc21idXNcXG4rXFxuKyAgICAgICMgVUFSVFxcbisgICAgICAtIGl0ZW1zOlxcbisgICAgICAgICAgLSBlbnVtOlxcbisgICAgICAgICAgICAgIC0genl4ZWwsZ3MxOTAwLTEwaHAtYjEtcHNlXFxuKyAgICAgICAgICAgICAgLSB6eXhlbCx4bWcxOTE1LTEwZXAtcHNlXFxuKyAgICAgICAgICAtIGNvbnN0OiByZWFsdGVrLHBzZS1tY3UtZ2VuMlxcbitcXG4rICAgICAgIyBJMkMsIFNNQnVzIGZyYW1pbmdcXG4rICAgICAgLSBpdGVtczpcXG4rICAgICAgICAgIC0gZW51bTpcXG4rICAgICAgICAgICAgICAtIHp5eGVsLHhzMTkzMC0xMmhwLXBzZVxcbisgICAgICAgICAgLSBjb25zdDogcmVhbHRlayxwc2UtbWN1LWdlbjItc21idXNcXG4rXFxuKyAgICAgICMgSTJDLCByYXcgZnJhbWluZ1xcbisgICAgICAtIGl0ZW1zOlxcbisgICAgICAgICAgLSBlbnVtOlxcbisgICAgICAgICAgICAgIC0gbGlua3N5cyxsZ3MzMjhtcGMtdjItcHNlXFxuKyAgICAgICAgICAtIGNvbnN0OiByZWFsdGVrLHBzZS1tY3UtZ2VuMi1pMmNcXG4rXFxuKyAgcmVnOlxcbisgICAgbWF4SXRlbXM6IDFcXG4rXFxuKyAgcmVzZXQtZ3Bpb3M6XFxuKyAgICBkZXNjcmlwdGlvbjogUmVzZXQgbGluZSBvZiB0aGUgTUNVLlxcbisgICAgbWF4SXRlbXM6IDFcXG4rXFxuKyAgZGlzYWJsZS1wb3J0cy1ncGlvczpcXG4rICAgIGRlc2NyaXB0aW9uOlxcbisgICAgICBIYXJkd2FyZSBnYXRlIHRoYXQgZm9yY2VzIGFsbCBwb3J0cyBpbnRvIGFkbWluLWRpc2FibGVkIHN0YXRlIHdoaWxlXFxuKyAgICAgIGFzc2VydGVkLlxcbisgICAgbWF4SXRlbXM6IDFcXG4rXFxuK3JlcXVpcmVkOlxcbisgIC0gY29tcGF0aWJsZVxcbitcXG4rYWxsT2Y6XFxuKyAgLSAkcmVmOiBwc2UtY29udHJvbGxlci55YW1sI1xcbisgIC0gJHJlZjogL3NjaGVtYXMvc2VyaWFsL3NlcmlhbC1wZXJpcGhlcmFsLXByb3BzLnlhbWwjXFxuKyAgIyBBICctc21idXMnLyctaTJjJyBjb21wYXRpYmxlIGlzIGFuIEkyQyBhdHRhY2htZW50OiBpdCBoYXMgJ3JlZycgYW5kXFxuKyAgIyBjYW5ub3QgY2Fycnkgc2VyaWFsIGJ1cyBwcm9wZXJ0aWVzLiBBIGJhcmUgZ2VuIGNvbXBhdGlibGUgaXMgYSBVQVJUXFxuKyAgIyBhdHRhY2htZW50OiBubyAncmVnJywgdGhlIHRyYW5zcG9ydCBjb21lcyBmcm9tIHRoZSBwYXJlbnQgc2VyaWFsIG5vZGUuXFxuKyAgLSBpZjpcXG4rICAgICAgcHJvcGVydGllczpcXG4rICAgICAgICBjb21wYXRpYmxlOlxcbisgICAgICAgICAgY29udGFpbnM6XFxuKyAgICAgICAgICAgIGVudW06XFxuKyAgICAgICAgICAgICAgLSByZWFsdGVrLHBzZS1tY3UtZ2VuMS1zbWJ1c1xcbisgICAgICAgICAgICAgIC0gcmVhbHRlayxwc2UtbWN1LWdlbjItc21idXNcXG4rICAgICAgICAgICAgICAtIHJlYWx0ZWsscHNlLW1jdS1nZW4yLWkyY1xcbisgICAgdGhlbjpcXG4rICAgICAgcmVxdWlyZWQ6XFxuKyAgICAgICAgLSByZWdcXG4rICAgICAgcHJvcGVydGllczpcXG4rICAgICAgICBjdXJyZW50LXNwZWVkOiBmYWxzZVxcbisgICAgICAgIG1heC1zcGVlZDogZmFsc2VcXG4rICAgIGVsc2U6XFxuKyAgICAgIHByb3BlcnRpZXM6XFxuKyAgICAgICAgcmVnOiBmYWxzZVxcbitcXG4rdW5ldmFsdWF0ZWRQcm9wZXJ0aWVzOiBmYWxzZVxcbitcXG4rZXhhbXBsZXM6XFxuKyAgIyBTTUJ1cy1mcmFtZWQgSTJDIGF0dGFjaG1lbnRcXG4rICAtIHxcXG4rICAgIGkyYyB7XFxuKyAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSBcXHUwMDNjMVxcdTAwM2U7XFxuKyAgICAgICAgI3NpemUtY2VsbHMgPSBcXHUwMDNjMFxcdTAwM2U7XFxuK1xcbisgICAgICAgIGV0aGVybmV0LXBzZUAyMCB7XFxuKyAgICAgICAgICAgIGNvbXBhdGlibGUgPSBcXFwienl4ZWwseHMxOTMwLTEyaHAtcHNlXFxcIiwgXFxcInJlYWx0ZWsscHNlLW1jdS1nZW4yLXNtYnVzXFxcIjtcXG4rICAgICAgICAgICAgcmVnID0gXFx1MDAzYzB4MjBcXHUwMDNlO1xcbitcXG4rICAgICAgICAgICAgcHNlLXBpcyB7XFxuKyAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IFxcdTAwM2MxXFx1MDAzZTtcXG4rICAgICAgICAgICAgICAgICNzaXplLWNlbGxzID0gXFx1MDAzYzBcXHUwMDNlO1xcbitcXG4rICAgICAgICAgICAgICAgIHBzZS1waUAwIHtcXG4rICAgICAgICAgICAgICAgICAgICByZWcgPSBcXHUwMDNjMFxcdTAwM2U7XFxuKyAgICAgICAgICAgICAgICAgICAgI3BzZS1jZWxscyA9IFxcdTAwM2MwXFx1MDAzZTtcXG4rICAgICAgICAgICAgICAgIH07XFxuKyAgICAgICAgICAgIH07XFxuKyAgICAgICAgfTtcXG4rICAgIH07XFxuK1xcbisgICMgUmF3LUkyQy1mcmFtZWQgYXR0YWNobWVudFxcbisgIC0gfFxcbisgICAgaTJjIHtcXG4rICAgICAgICAjYWRkcmVzcy1jZWxscyA9IFxcdTAwM2MxXFx1MDAzZTtcXG4rICAgICAgICAjc2l6ZS1jZWxscyA9IFxcdTAwM2MwXFx1MDAzZTtcXG4rXFxuKyAgICAgICAgZXRoZXJuZXQtcHNlQDIwIHtcXG4rICAgICAgICAgICAgY29tcGF0aWJsZSA9IFxcXCJsaW5rc3lzLGxnczMyOG1wYy12Mi1wc2VcXFwiLCBcXFwicmVhbHRlayxwc2UtbWN1LWdlbjItaTJjXFxcIjtcXG4rICAgICAgICAgICAgcmVnID0gXFx1MDAzYzB4MjBcXHUwMDNlO1xcbitcXG4rICAgICAgICAgICAgcHNlLXBpcyB7XFxuKyAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IFxcdTAwM2MxXFx1MDAzZTtcXG4rICAgICAgICAgICAgICAgICNzaXplLWNlbGxzID0gXFx1MDAzYzBcXHUwMDNlO1xcbitcXG4rICAgICAgICAgICAgICAgIHBzZS1waUAwIHtcXG4rICAgICAgICAgICAgICAgICAgICByZWcgPSBcXHUwMDNjMFxcdTAwM2U7XFxuKyAgICAgICAgICAgICAgICAgICAgI3BzZS1jZWxscyA9IFxcdTAwM2MwXFx1MDAzZTtcXG4rICAgICAgICAgICAgICAgIH07XFxuKyAgICAgICAgICAgIH07XFxuKyAgICAgICAgfTtcXG4rICAgIH07XFxuK1xcbisgICMgVUFSVCBhdHRhY2htZW50XFxuKyAgLSB8XFxuKyAgICBzZXJpYWwge1xcbisgICAgICAgIGV0aGVybmV0LXBzZSB7XFxuKyAgICAgICAgICAgIGNvbXBhdGlibGUgPSBcXFwienl4ZWwsZ3MxOTAwLTEwaHAtYTEtcHNlXFxcIiwgXFxcInJlYWx0ZWsscHNlLW1jdS1nZW4xXFxcIjtcXG4rICAgICAgICAgICAgY3VycmVudC1zcGVlZCA9IFxcdTAwM2MxOTIwMFxcdTAwM2U7XFxuK1xcbisgICAgICAgICAgICBwc2UtcGlzIHtcXG4rICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gXFx1MDAzYzFcXHUwMDNlO1xcbisgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSBcXHUwMDNjMFxcdTAwM2U7XFxuK1xcbisgICAgICAgICAgICAgICAgcHNlLXBpQDAge1xcbisgICAgICAgICAgICAgICAgICAgIHJlZyA9IFxcdTAwM2MwXFx1MDAzZTtcXG4rICAgICAgICAgICAgICAgICAgICAjcHNlLWNlbGxzID0gXFx1MDAzYzBcXHUwMDNlO1xcbisgICAgICAgICAgICAgICAgfTtcXG4rICAgICAgICAgICAgfTtcXG4rICAgICAgICB9O1xcbisgICAgfTtcXG5kaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSU1xcbmluZGV4IDJkNDIwZDQwNzgyZTMuLjQzMzRjMjQ1MzA1MjggMTAwNjQ0XFxuLS0tIGEvTUFJTlRBSU5FUlNcXG4rKysgYi9NQUlOVEFJTkVSU1xcbkBAIC0yMjc2Nyw2ICsyMjc2NywxMyBAQCBTOlxcdE1haW50YWluZWRcXG4gRjpcXHREb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvcmVhbHRlayxvdHRvLXdkdC55YW1sXFxuIEY6XFx0ZHJpdmVycy93YXRjaGRvZy9yZWFsdGVrX290dG9fd2R0LmNcXG4gXFxuK1JFQUxURUsgUFNFIE1DVSBEUklWRVJcXG4rTTpcXHRKb25hcyBKZWxvbmVrIFxcdTAwM2NqZWxvbmVrLmpvbmFzQGdtYWlsLmNvbVxcdTAwM2VcXG4rTDpcXHRuZXRkZXZAdmdlci5rZXJuZWwub3JnXFxuK1M6XFx0TWFpbnRhaW5lZFxcbitGOlxcdERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcHNlLXBkL3JlYWx0ZWsscHNlLW1jdS1nZW4xLnlhbWxcXG4rRjpcXHRkcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1KlxcbitcXG4gUkVBTFRFSyBSVEw4M3h4IFNNSSBEU0EgUk9VVEVSIENISVBTXFxuIE06XFx0TGludXMgV2FsbGVpaiBcXHUwMDNjbGludXN3QGtlcm5lbC5vcmdcXHUwMDNlXFxuIE06XFx0QWx2aW4gxaBpcHJhZ2EgXFx1MDAzY2Fsc2lAYmFuZy1vbHVmc2VuLmRrXFx1MDAzZVxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9LY29uZmlnXFxuaW5kZXggN2VmMjk2NTdlZTVkZC4uYTBmMmFlNjY4YzY3YyAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9wc2UtcGQvS2NvbmZpZ1xcbisrKyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9LY29uZmlnXFxuQEAgLTEzLDYgKzEzLDM0IEBAIG1lbnVjb25maWcgUFNFX0NPTlRST0xMRVJcXG4gXFxuIGlmIFBTRV9DT05UUk9MTEVSXFxuIFxcbitjb25maWcgUFNFX1JFQUxURUtfTUNVXFxuK1xcdHRyaXN0YXRlXFxuK1xcdGhlbHBcXG4rXFx0ICBTaGFyZWQgY29yZSBmb3IgdGhlIFJlYWx0ZWsgUFNFIE1DVSBkcml2ZXIuIFRoaXMgaXMgc2VsZWN0ZWRcXG4rXFx0ICBhdXRvbWF0aWNhbGx5IGJ5IHRoZSB0cmFuc3BvcnQgb3B0aW9ucyBiZWxvdy5cXG4rXFxuK2NvbmZpZyBQU0VfUkVBTFRFS19NQ1VfSTJDXFxuK1xcdHRyaXN0YXRlIFxcXCJSZWFsdGVrIFBTRSBNQ1UgZHJpdmVyIChJMkMgdHJhbnNwb3J0KVxcXCJcXG4rXFx0ZGVwZW5kcyBvbiBJMkNcXG4rXFx0c2VsZWN0IFBTRV9SRUFMVEVLX01DVVxcbitcXHRoZWxwXFxuK1xcdCAgRHJpdmVyIGZvciB0aGUgbWljcm9jb250cm9sbGVyIChNQ1UpIHRoYXQgZnJvbnRzIHRoZSBQU0VcXG4rXFx0ICBoYXJkd2FyZSBvbiB2YXJpb3VzIFJlYWx0ZWstYmFzZWQgbWFuYWdlZCBzd2l0Y2hlcywgYXR0YWNoZWRcXG4rXFx0ICB2aWEgSTJDL1NNQnVzLiBUaGUgTUNVIGV4cG9zZXMgYSBtZXNzYWdlLWJhc2VkIHByb3RvY29sOyB0aGUgYWN0dWFsXFxuK1xcdCAgUFNFIHNpbGljb24gaXMgbm90IGFjY2Vzc2VkIGRpcmVjdGx5LiBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGFcXG4rXFx0ICBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmVhbHRlay1wc2UtbWN1LWkyYy5cXG4rXFxuK2NvbmZpZyBQU0VfUkVBTFRFS19NQ1VfVUFSVFxcbitcXHR0cmlzdGF0ZSBcXFwiUmVhbHRlayBQU0UgTUNVIGRyaXZlciAoVUFSVCB0cmFuc3BvcnQpXFxcIlxcbitcXHRkZXBlbmRzIG9uIFNFUklBTF9ERVZfQlVTXFxuK1xcdHNlbGVjdCBQU0VfUkVBTFRFS19NQ1VcXG4rXFx0aGVscFxcbitcXHQgIERyaXZlciBmb3IgdGhlIG1pY3JvY29udHJvbGxlciAoTUNVKSB0aGF0IGZyb250cyB0aGUgUFNFXFxuK1xcdCAgaGFyZHdhcmUgb24gdmFyaW91cyBSZWFsdGVrLWJhc2VkIG1hbmFnZWQgc3dpdGNoZXMsIGF0dGFjaGVkXFxuK1xcdCAgdmlhIFVBUlQuIFRoZSBNQ1UgZXhwb3NlcyBhIG1lc3NhZ2UtYmFzZWQgcHJvdG9jb2w7IHRoZSBhY3R1YWwgUFNFXFxuK1xcdCAgc2lsaWNvbiBpcyBub3QgYWNjZXNzZWQgZGlyZWN0bHkuIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYVxcbitcXHQgIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByZWFsdGVrLXBzZS1tY3UtdWFydC5cXG4rXFxuIGNvbmZpZyBQU0VfUkVHVUxBVE9SXFxuIFxcdHRyaXN0YXRlIFxcXCJSZWd1bGF0b3IgYmFzZWQgUFNFIGNvbnRyb2xsZXJcXFwiXFxuIFxcdGhlbHBcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHNlLXBkL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvcHNlLXBkL01ha2VmaWxlXFxuaW5kZXggY2M3OGY3ZWE3ZjVmNy4uOWNjYTU5MDBmZTM0MiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9wc2UtcGQvTWFrZWZpbGVcXG4rKysgYi9kcml2ZXJzL25ldC9wc2UtcGQvTWFrZWZpbGVcXG5AQCAtMyw2ICszLDkgQEBcXG4gXFxuIG9iai0kKENPTkZJR19QU0VfQ09OVFJPTExFUikgKz0gcHNlX2NvcmUub1xcbiBcXG4rb2JqLSQoQ09ORklHX1BTRV9SRUFMVEVLX01DVSkgKz0gcmVhbHRlay1wc2UtbWN1LWNvcmUub1xcbitvYmotJChDT05GSUdfUFNFX1JFQUxURUtfTUNVX0kyQykgKz0gcmVhbHRlay1wc2UtbWN1LWkyYy5vXFxuK29iai0kKENPTkZJR19QU0VfUkVBTFRFS19NQ1VfVUFSVCkgKz0gcmVhbHRlay1wc2UtbWN1LXVhcnQub1xcbiBvYmotJChDT05GSUdfUFNFX1JFR1VMQVRPUikgKz0gcHNlX3JlZ3VsYXRvci5vXFxuIG9iai0kKENPTkZJR19QU0VfUEQ2OTJYMCkgKz0gcGQ2OTJ4MC5vXFxuIG9iai0kKENPTkZJR19QU0VfU0kzNDc0KSArPSBzaTM0NzQub1xcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LWNvcmUuYyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtY29yZS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5lZDNiNzQzNDcwZGJmXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtY29yZS5jXFxuQEAgLTAsMCArMSw5ODggQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcXG4rLypcXG4rICogRHJpdmVyIGZvciB0aGUgbWljcm9jb250cm9sbGVyIChNQ1UpIGZyb250aW5nIFBTRSBzaWxpY29uIG9uIHZhcmlvdXNcXG4rICogUmVhbHRlay1iYXNlZCBtYW5hZ2VkIHN3aXRjaGVzLiBUaGUgTUNVIHNwZWFrcyBhIDEyLWJ5dGUgZml4ZWQtZnJhbWVcXG4rICogbWFuYWdlbWVudCBwcm90b2NvbDsgdGhpcyBkcml2ZXIgY292ZXJzIHR3byBnZW5lcmF0aW9ucyBvZiB0aGVcXG4rICogcHJvdG9jb2wgdmlhIGEgcGVyLWRpYWxlY3Qgb3Bjb2RlIHRhYmxlIGFuZCByZXNwb25zZSBwYXJzZXJzLlxcbisgKlxcbisgKiBNYW55IFBvRSBzd2l0Y2ggZGVzaWducyBwdXQgYSBkZWRpY2F0ZWQgbWljcm9jb250cm9sbGVyIGluIGZyb250IG9mIHRoZVxcbisgKiBhY3R1YWwgUFNFIHNpbGljb246IHRoZSBob3N0IENQVSB0YWxrcyB0byB0aGUgTUNVIG92ZXIgSTJDL1NNQnVzIG9yXFxuKyAqIFVBUlQsIGFuZCB0aGUgTUNVIGluIHR1cm4gbWFuYWdlcyB0aGUgUFNFIGNoaXBzIG9uIHRoZSBib2FyZC4gVGhlIE1DVVxcbisgKiBzcGVha3MgYSBzbWFsbCBtZXNzYWdlLWJhc2VkIHByb3RvY29sLiBUaGUgUFNFIGNoaXBzIHRoZW1zZWx2ZXMgYXJlIG5vdFxcbisgKiBhY2Nlc3NlZCBkaXJlY3RseTsgZXZlcnl0aGluZyBnb2VzIHRocm91Z2ggTUNVIGNvbW1hbmRzLlxcbisgKlxcbisgKiBUaGlzIGRyaXZlciB0YXJnZXRzIHRoYXQgYXJjaGl0ZWN0dXJlIGZvciB0aGUgUmVhbHRlay1mYW1pbHkgcHJvdG9jb2wuXFxuKyAqIFR3byBnZW5lcmF0aW9ucyBhcmUgc3VwcG9ydGVkOiBHZW4xIGJlaW5nIHVzZWQgb24gb2xkZXIgc3dpdGNoZXMgd2hlcmVcXG4rICogdGhlIE1DVSBmcm9udHMgYW5kIG1hbmFnZXMgQnJvYWRjb20gUFNFIHNpbGljb247IEdlbjIgYmVpbmcgdXNlZCB3aXRoXFxuKyAqIFJlYWx0ZWsgUFNFIHNpbGljb24uIFRoZSB0d28gc2hhcmUgZnJhbWUgZm9ybWF0IGFuZCBhIHN1bS1tb2QtMjU2XFxuKyAqIGNoZWNrc3VtIGJ1dCBkaXZlcmdlIG9uIG9wY29kZSBudW1iZXJzIGFuZCBvbiBhIGZldyByZXNwb25zZSBsYXlvdXRzO1xcbisgKiB0aGlzIGlzIGhhbmRsZWQgYnkgdGhlIHBlci1kaWFsZWN0IG9wY29kZSB0YWJsZSBhbmQgcGFyc2VyIGhvb2tzLlxcbisgKlxcbisgKiBPdXQgb2Ygc2NvcGU6IFBTRSBjaGlwcyB0aGF0IGFyZSBpbnRlcmZhY2VkIGRpcmVjdGx5IGZyb20gdGhlIGhvc3RcXG4rICogd2l0aG91dCBhIG1hbmFnZW1lbnQgTUNVLCBNQ1UgZGVzaWducyB0aGF0IHNwZWFrIGFuIHVucmVsYXRlZCBwcm90b2NvbFxcbisgKiBmYW1pbHksIGFuZCBcXFwiZHVtYiBQU0VcXFwiIG1vZGVzIHdoZXJlIG5vIGhvc3QgY29udHJvbCBpcyB3aXJlZCB1cCBhdCBhbGwuXFxuKyAqXFxuKyAqIFRoaXMgY29yZSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgcHJvdG9jb2wsIGRlY29kaW5nL2VuY29kaW5nIG9mIE1DVVxcbisgKiByZXNwb25zZXMsIGFuZCB0aGUgcHNlX2NvbnRyb2xsZXJfb3BzIGludGVncmF0aW9uLiBUcmFuc3BvcnQgbW9kdWxlc1xcbisgKiAocmVhbHRlay1wc2UtbWN1LWkyYywgcmVhbHRlay1wc2UtbWN1LXVhcnQpIHByb3ZpZGUgdGhlIHNlbmQvcmVjdlxcbisgKiBjYWxsYmFja3MuXFxuKyAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpdGZpZWxkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jbGVhbnVwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jb250YWluZXJfb2YuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2RlbGF5LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9ncGlvL2NvbnN1bWVyLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9qaWZmaWVzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9taW5tYXguaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcHJvcGVydHkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BzZS1wZC9wc2UuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3VuYWxpZ25lZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcInJlYWx0ZWstcHNlLW1jdS5oXFxcIlxcbitcXG4rI2RlZmluZSBSVFBTRV9NQ1VfREVWSUNFX0lEX1JUTDgyMzhCXFx0XFx0MHgwMTM4XFxuKyNkZWZpbmUgUlRQU0VfTUNVX0RFVklDRV9JRF9SVEw4MjM5XFx0XFx0MHgwMDM5XFxuKyNkZWZpbmUgUlRQU0VfTUNVX0RFVklDRV9JRF9SVEw4MjM5Q1xcdFxcdDB4MDEzOVxcbisjZGVmaW5lIFJUUFNFX01DVV9ERVZJQ0VfSURfQkNNNTkxMTFcXHRcXHQweGUxMTFcXG4rI2RlZmluZSBSVFBTRV9NQ1VfREVWSUNFX0lEX0JDTTU5MTIxXFx0XFx0MHhlMTIxXFxuK1xcbisjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19ESVNBQkxFRFxcdFxcdDB4MDBcXG4rI2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9TVFNfU0VBUkNISU5HXFx0XFx0MHgwMVxcbisjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19ERUxJVkVSSU5HXFx0XFx0MHgwMlxcbisjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19URVNUXFx0XFx0XFx0MHgwM1xcdC8qIEdlbjEtb25seTsgcmVzZXJ2ZWQgb24gR2VuMiAqL1xcbisjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19GQVVMVFxcdFxcdDB4MDRcXG4rI2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9TVFNfT1RIRVJfRkFVTFRcXHRcXHQweDA1XFx0LyogR2VuMS1vbmx5OyByZXNlcnZlZCBvbiBHZW4yICovXFxuKyNkZWZpbmUgUlRQU0VfTUNVX1BPUlRfU1RTX1JFUVVFU1RJTkdcXHRcXHQweDA2XFxuK1xcbisvKiBSVFBTRV9NQ1VfUE9SVF9TRVRfUE9XRVJfTElNSVRfVFlQRSB2YWx1ZXMgKi9cXG4rI2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9QV19MSU1JVF9UWVBFX1VTRVJcXHQweDAyXFxuK1xcbisjZGVmaW5lIFJUUFNFX01DVV9NQVhfUE9SVFNcXHRcXHRcXHQ0OFxcbisjZGVmaW5lIFJUUFNFX01DVV9QT1JUX01BWF9QUklPUklUWVxcdFxcdDNcXG4rXFxuKy8qIE5vbWluYWwgUFNFIHJhaWw7IDgwMi4zYXQvYnQgb3BlcmF0aW5nIHJhbmdlLiAqL1xcbisjZGVmaW5lIFJUUFNFX01DVV9QU0VfVk9MVEFHRV9VVlxcdFxcdDU0MDAwMDAwXFxuK1xcbitlbnVtIHJ0cHNlX21jdV9jbWQge1xcbitcXHRSVFBTRV9NQ1VfQ01EX1NFVF9HTE9CQUxfU1RBVEUsXFxuK1xcdFJUUFNFX01DVV9DTURfR0VUX1NZU1RFTV9JTkZPLFxcbitcXHRSVFBTRV9NQ1VfQ01EX0dFVF9FWFRfQ09ORklHLFxcbitcXG4rXFx0UlRQU0VfTUNVX0NNRF9QT1JUX0VOQUJMRSxcXG4rXFx0UlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF9UWVBFLFxcbitcXHRSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlULFxcbitcXHRSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUX0VYVCxcXG4rXFx0UlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QUklPUklUWSxcXG4rXFx0UlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9TVEFUVVMsXFxuK1xcdFJUUFNFX01DVV9DTURfUE9SVF9HRVRfUE9XRVJfU1RBVFMsXFxuK1xcdFJUUFNFX01DVV9DTURfUE9SVF9HRVRfQ09ORklHLFxcbitcXHRSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0VYVF9DT05GSUcsXFxuK1xcbitcXHRSVFBTRV9NQ1VfTlVNX0NNRFMsXFxuK307XFxuK1xcbitzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSB7XFxuK1xcdHU4IG9wO1xcbitcXHRib29sIHZhbGlkO1xcbit9O1xcbitcXG4rLyogU2hvcnRoYW5kIGZvciB0aGUgZGVzaWduYXRlZC1pbml0aWFsaXplciBlbnRyaWVzIGluIGRpYWxlY3Qgb3Bjb2RlIHRhYmxlcy4gKi9cXG4rI2RlZmluZSBSVFBTRV9NQ1VfT1Aob3BjKVxcdHsgLm9wID0gKG9wYyksIC52YWxpZCA9IHRydWUgfVxcbitcXG4rLyogUGFyc2VkIE1DVSByZXNwb25zZSBzdHJ1Y3R1cmVzIChkZWNvZGVkIGZyb20gcnRwc2VfbWN1X21zZyByZXBsaWVzKSAqL1xcbitcXG4rc3RydWN0IHJ0cHNlX21jdV9pbmZvIHtcXG4rXFx0dTggbWF4X3BvcnRzO1xcbitcXHRib29sIHN5c3RlbV9lbmFibGU7XFxuK1xcdHUxNiBkZXZpY2VfaWQ7XFxuK1xcdHU4IG1jdV90eXBlO1xcbit9O1xcbitcXG4rc3RydWN0IHJ0cHNlX21jdV9leHRfY29uZmlnIHtcXG4rXFx0dTggbnVtX29mX3BzZXM7XFxuK307XFxuK1xcbitzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfc3RhdHVzIHtcXG4rXFx0dTggc3RzMTtcXG4rXFx0dTggc3RzMjtcXG4rXFx0dTggc3RzMztcXG4rfTtcXG4rXFxuK3N0cnVjdCBydHBzZV9tY3VfcG9ydF9tZWFzdXJlbWVudCB7XFxuK1xcdHUxNiB2b2x0YWdlX3JhdztcXHQvKiA2NC40NW1WL0xTQiAqL1xcbitcXHR1MTYgY3VycmVudF9yYXc7XFx0LyogMW1BL0xTQiAqL1xcbitcXHR1MTYgdGVtcGVyYXR1cmVfcmF3O1xcdC8qIFQobUMpID0gMTI1MCAqICgyMjAgLSByYXcpICovXFxuK1xcdHUxNiBwb3dlcl9yYXc7XFx0XFx0LyogMTAwbVcvTFNCICovXFxuK307XFxuK1xcbitzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfY29uZmlnIHtcXG4rXFx0Ym9vbCBlbmFibGU7XFxuK307XFxuK1xcbitzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfZXh0X2NvbmZpZyB7XFxuK1xcdHU4IG1heF9wb3dlcjtcXG4rXFx0dTggcHJpb3JpdHk7XFxuK307XFxuK1xcbitzdHJ1Y3QgcnRwc2VfbWN1X2RpYWxlY3Qge1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSBvcGNvZGVbUlRQU0VfTUNVX05VTV9DTURTXTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFJlc3BvbnNlIHBhcnNlcnMgZm9yIHRoZSBmaWVsZHMgdGhhdCBkaWZmZXIgYmV0d2VlbiBkaWFsZWN0czsgZWFjaFxcbitcXHQgKiBkaWFsZWN0IHN1cHBsaWVzIGl0cyBvd24uIE90aGVyIHJlc3BvbnNlcyBzaGFyZSBvbmUgbGF5b3V0IGFuZCBhcmVcXG4rXFx0ICogZGVjb2RlZCBkaXJlY3RseSAtIGEgZGlhbGVjdCB0aGF0IGRpdmVyZ2VzIHRoZXJlIG11c3QgYWRkIGEgaG9vayxcXG4rXFx0ICogYXMgYSBtaXNtYXRjaGVkIGxheW91dCBjYW5ub3QgYmUgZGV0ZWN0ZWQgKHRoZSBjaGVja3N1bSBzdGlsbCBwYXNzZXMpLlxcbitcXHQgKi9cXG4rXFx0dm9pZCAoKnBhcnNlX3N5c3RlbV9pbmZvKShjb25zdCB1OCAqcGF5bG9hZCwgc3RydWN0IHJ0cHNlX21jdV9pbmZvICppbmZvKTtcXG4rXFx0aW50ICgqcGFyc2VfcG9ydF9jbGFzcykoY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9wb3J0X3N0YXR1cyAqc3RhdHVzKTtcXG4rXFx0Y29uc3QgY2hhciAqKCptY3VfdHlwZV9zdHIpKHVuc2lnbmVkIGludCBtY3VfdHlwZSk7XFxuK307XFxuK1xcbitzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbyB7XFxuK1xcdGNvbnN0IGNoYXIgKm5hbWU7XFxuK1xcdHUzMiBtYXhfbVdfcGVyX3BvcnQ7XFxuK1xcdGVudW0gcnRwc2VfbWN1X2NtZCBwd19zZXRfY21kO1xcdC8qIGNvbW1hbmQgdXNlZCBieSBzZXRfcHdfbGltaXQgKi9cXG4rXFx0dTMyIHB3X3NldF9sc2JfbVc7XFx0XFx0LyogTFNCIG9mIHB3X3NldF9jbWQgdmFsdWUsIGluIG1XICovXFxuK1xcdHUzMiBwd19yZWFkX2xzYl9tVztcXHRcXHQvKiBMU0Igb2YgZXh0X2NvbmZpZy5tYXhfcG93ZXIgcmVhZC1iYWNrLCBpbiBtVyAqL1xcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfY2hpcF9pbmZvIHJ0bDgyMzhiX2luZm8gPSB7XFxuK1xcdC5tYXhfbVdfcGVyX3BvcnQgPSAzMDAwMCxcXG4rXFx0Lm5hbWUgPSBcXFwiUlRMODIzOEJcXFwiLFxcbitcXHQucHdfcmVhZF9sc2JfbVcgPSAyMDAsXFxuK1xcdC5wd19zZXRfY21kID0gUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVCxcXG4rXFx0LnB3X3NldF9sc2JfbVcgPSAyMDAsXFxuK307XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gcnRsODIzOV9pbmZvID0ge1xcbitcXHQubWF4X21XX3Blcl9wb3J0ID0gOTAwMDAsXFxuK1xcdC5uYW1lID0gXFxcIlJUTDgyMzlcXFwiLFxcbitcXHQucHdfcmVhZF9sc2JfbVcgPSA0MDAsXFxuK1xcdC5wd19zZXRfY21kID0gUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF9FWFQsXFxuK1xcdC5wd19zZXRfbHNiX21XID0gNDAwLFxcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfY2hpcF9pbmZvIHJ0bDgyMzljX2luZm8gPSB7XFxuK1xcdC5tYXhfbVdfcGVyX3BvcnQgPSA5MDAwMCxcXG4rXFx0Lm5hbWUgPSBcXFwiUlRMODIzOUNcXFwiLFxcbitcXHQucHdfcmVhZF9sc2JfbVcgPSA0MDAsXFxuK1xcdC5wd19zZXRfY21kID0gUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF9FWFQsXFxuK1xcdC5wd19zZXRfbHNiX21XID0gNDAwLFxcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfY2hpcF9pbmZvIGJjbTU5MTExX2luZm8gPSB7XFxuK1xcdC5tYXhfbVdfcGVyX3BvcnQgPSAzMDAwMCxcXG4rXFx0Lm5hbWUgPSBcXFwiQkNNNTkxMTFcXFwiLFxcbitcXHQucHdfcmVhZF9sc2JfbVcgPSAyMDAsXFxuK1xcdC5wd19zZXRfY21kID0gUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVCxcXG4rXFx0LnB3X3NldF9sc2JfbVcgPSAyMDAsXFxuK307XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gYmNtNTkxMjFfaW5mbyA9IHtcXG4rXFx0LypcXG4rXFx0ICogQkNNNTkxMjEgaXMgYSA2MFcgVHlwZS0zIHBhcnQsIGJ1dCBrbm93biBib2FyZHMgcnVuIGl0IGF0IDgwMi4zYXRcXG4rXFx0ICogYW5kIHRoZSBHZW4xIGRpYWxlY3QgaGFzIG9ubHkgdGhlIDgtYml0LzAuMlcgc2V0IGNvbW1hbmQgKFxcdTAwM2M9NTFXKTtcXG4rXFx0ICogY2FwIGF0IHRoZSAzMFcgdGhlIGhhcmR3YXJlIGFjdHVhbGx5IG9mZmVycy5cXG4rXFx0ICovXFxuK1xcdC5tYXhfbVdfcGVyX3BvcnQgPSAzMDAwMCxcXG4rXFx0Lm5hbWUgPSBcXFwiQkNNNTkxMjFcXFwiLFxcbitcXHQucHdfcmVhZF9sc2JfbVcgPSAyMDAsXFxuK1xcdC5wd19zZXRfY21kID0gUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVCxcXG4rXFx0LnB3X3NldF9sc2JfbVcgPSAyMDAsXFxuK307XFxuK1xcbisvKiBIZWxwZXJzIGFuZCBiYXNpYyBmdW5jdGlvbnMgKi9cXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnRvX3J0cHNlX21jdV9jdHJsKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2KVxcbit7XFxuK1xcdHJldHVybiBjb250YWluZXJfb2YocGNkZXYsIHN0cnVjdCBydHBzZV9tY3VfY3RybCwgcGNkZXYpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBydHBzZV9tY3VfbXNnX2luaXQoc3RydWN0IHJ0cHNlX21jdV9tc2cgKm1zZywgdTggb3Bjb2RlKVxcbit7XFxuK1xcdG1lbXNldChtc2csIDB4ZmYsIHNpemVvZigqbXNnKSk7XFxuK1xcdG1zZy1cXHUwMDNlb3Bjb2RlID0gb3Bjb2RlO1xcbit9XFxuK1xcbitzdGF0aWMgdTggcnRwc2VfbWN1X2NoZWNrc3VtKGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pXFxuK3tcXG4rXFx0dTggc3VtID0gMDtcXG4rXFxuK1xcdHdoaWxlIChsZW4tLSlcXG4rXFx0XFx0c3VtICs9ICpidWYrKztcXG4rXFx0cmV0dXJuIHN1bTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfZG9feGZlcihzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSxcXG4rXFx0XFx0XFx0ICAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0c2NvcGVkX2d1YXJkKG11dGV4LCBcXHUwMDI2cHNlLVxcdTAwM2VtdXRleCkge1xcbitcXHRcXHQvKiBSb2xsaW5nIHNlcV9udW0gc28gYSBsYXRlIHJlcGx5IGNhbid0IHBhc3MgYXMgYSBsYXRlciBvbmUuICovXFxuK1xcdFxcdHJlcS1cXHUwMDNlc2VxX251bSA9IHBzZS1cXHUwMDNlc2VxKys7XFxuK1xcdFxcdHJlcS1cXHUwMDNlY2hlY2tzdW0gPSBydHBzZV9tY3VfY2hlY2tzdW0oKHU4ICopcmVxLCBSVFBTRV9NQ1VfTVNHX1NJWkUgLSAxKTtcXG4rXFxuK1xcdFxcdHJldCA9IHBzZS1cXHUwMDNldHJhbnNwb3J0LVxcdTAwM2VzZW5kKHBzZSwgcmVxKTtcXG4rXFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSBNQ1UgbmVlZHMgYSBmaXhlZCBiYXNlIHRpbWUgYmV0d2VlbiBhY2NlcHRpbmcgYSByZXF1ZXN0IGFuZFxcbitcXHRcXHQgKiBoYXZpbmcgYSByZXBseSByZWFkeSwgaW5kZXBlbmRlbnQgb2YgdHJhbnNwb3J0LiBQYWNlIHRoYXQgaGVyZTsgdGhlXFxuK1xcdFxcdCAqIHRyYW5zcG9ydCB0aGVuIGZpbmlzaGVzIHJlY3YgaW4gaXRzIG93biBtb2RlbCAtIGEgYm91bmRlZCBwb2xsIG9mXFxuK1xcdFxcdCAqIHRoZSByZXNwb25zZSByZWdpc3RlciAoSTJDKSBvciBvbmUgd2FpdCBvbiBhIHB1c2hlZCBmcmFtZSAoVUFSVCkgLVxcbitcXHRcXHQgKiBzbyB0aGUgcmV0cnkgYmVsb25ncyBpbiB0aGUgdHJhbnNwb3J0LCBub3QgaGVyZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdG1zbGVlcChSVFBTRV9NQ1VfUkVTUE9OU0VfTVMpO1xcbitcXG4rXFx0XFx0bWVtc2V0KHJlc3AsIDAsIHNpemVvZigqcmVzcCkpO1xcbitcXHRcXHRyZXQgPSBwc2UtXFx1MDAzZXRyYW5zcG9ydC1cXHUwMDNlcmVjdihwc2UsIHJlcSwgcmVzcCk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEV4cGxpY2l0IE1DVSBlcnJvciBvcGNvZGVzIChvYnNlcnZlZCBvbiB0aGUgR2VuMSBkaWFsZWN0OyBoYXJtbGVzc1xcbitcXHQgKiB0byBjaGVjayBmb3IgR2VuMiB0b28pLiBDYXRjaCB0aGVzZSBiZWZvcmUgdGhlIGdlbmVyaWMgb3Bjb2RlL0NSQ1xcbitcXHQgKiBtaXNtYXRjaCBwYXRoIHNvIGNhbGxlcnMgc2VlIGEgbWVhbmluZ2Z1bCBlcnJuby5cXG4rXFx0ICovXFxuK1xcdHN3aXRjaCAocmVzcC1cXHUwMDNlb3Bjb2RlKSB7XFxuK1xcdGNhc2UgUlRQU0VfTUNVX09QQ09ERV9JTkNPTVBMRVRFOlxcbitcXHRcXHRyZXR1cm4gLUVCQURFO1xcbitcXHRjYXNlIFJUUFNFX01DVV9PUENPREVfQkFEX0NTVU06XFxuK1xcdFxcdHJldHVybiAtRUJBRE1TRztcXG4rXFx0Y2FzZSBSVFBTRV9NQ1VfT1BDT0RFX05PVF9SRUFEWTpcXG4rXFx0XFx0cmV0dXJuIC1FQUdBSU47XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChyZXNwLVxcdTAwM2VvcGNvZGUgIT0gcmVxLVxcdTAwM2VvcGNvZGUgfHxcXG4rXFx0ICAgIHJlc3AtXFx1MDAzZXNlcV9udW0gIT0gcmVxLVxcdTAwM2VzZXFfbnVtIHx8XFxuK1xcdCAgICByZXNwLVxcdTAwM2VjaGVja3N1bSAhPSBydHBzZV9tY3VfY2hlY2tzdW0oKHU4ICopcmVzcCwgUlRQU0VfTUNVX01TR19TSVpFIC0gMSkpXFxuK1xcdFxcdHJldHVybiAtRUJBRE1TRztcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X3F1ZXJ5KHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCwgdTggb3Bjb2RlLFxcbitcXHRcXHRcXHRcXHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcXG4re1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXE7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRydHBzZV9tY3VfbXNnX2luaXQoXFx1MDAyNnJlcSwgb3Bjb2RlKTtcXG4rXFx0cmVxLnBheWxvYWRbMF0gPSBwb3J0O1xcbitcXG4rXFx0cmV0ID0gcnRwc2VfbWN1X2RvX3hmZXIocHNlLCBcXHUwMDI2cmVxLCByZXNwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGlmIChyZXNwLVxcdTAwM2VwYXlsb2FkWzBdICE9IHBvcnQpXFxuK1xcdFxcdHJldHVybiAtRUlPO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfY21kKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCwgdTggb3Bjb2RlLCB1OCBhcmcpXFxuK3tcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9tc2cgcmVxLCByZXNwO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cnRwc2VfbWN1X21zZ19pbml0KFxcdTAwMjZyZXEsIG9wY29kZSk7XFxuK1xcdHJlcS5wYXlsb2FkWzBdID0gcG9ydDtcXG4rXFx0cmVxLnBheWxvYWRbMV0gPSBhcmc7XFxuK1xcbitcXHRyZXQgPSBydHBzZV9tY3VfZG9feGZlcihwc2UsIFxcdTAwMjZyZXEsIFxcdTAwMjZyZXNwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGlmIChyZXNwLnBheWxvYWRbMF0gIT0gcG9ydCB8fCByZXNwLnBheWxvYWRbMV0gIT0gMClcXG4rXFx0XFx0cmV0dXJuIC1FSU87XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyogR2xvYmFsIG9wZXJhdGlvbnMgKi9cXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X2dldF9pbmZvKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBzdHJ1Y3QgcnRwc2VfbWN1X2luZm8gKmluZm8pXFxuK3tcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9tc2cgcmVxLCByZXNwO1xcbitcXHRjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSAqb3BjO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0b3BjID0gXFx1MDAyNnBzZS1cXHUwMDNlZGlhbGVjdC1cXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfR0VUX1NZU1RFTV9JTkZPXTtcXG4rXFx0aWYgKCFvcGMtXFx1MDAzZXZhbGlkKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHRydHBzZV9tY3VfbXNnX2luaXQoXFx1MDAyNnJlcSwgb3BjLVxcdTAwM2VvcCk7XFxuK1xcdHJldCA9IHJ0cHNlX21jdV9kb194ZmVyKHBzZSwgXFx1MDAyNnJlcSwgXFx1MDAyNnJlc3ApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cHNlLVxcdTAwM2VkaWFsZWN0LVxcdTAwM2VwYXJzZV9zeXN0ZW1faW5mbyhyZXNwLnBheWxvYWQsIGluZm8pO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfZ2V0X2V4dF9jb25maWcoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHN0cnVjdCBydHBzZV9tY3VfZXh0X2NvbmZpZyAqY29uZmlnKVxcbit7XFxuK1xcdHN0cnVjdCBydHBzZV9tY3VfbXNnIHJlcSwgcmVzcDtcXG4rXFx0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdG9wYyA9IFxcdTAwMjZwc2UtXFx1MDAzZWRpYWxlY3QtXFx1MDAzZW9wY29kZVtSVFBTRV9NQ1VfQ01EX0dFVF9FWFRfQ09ORklHXTtcXG4rXFx0aWYgKCFvcGMtXFx1MDAzZXZhbGlkKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHRydHBzZV9tY3VfbXNnX2luaXQoXFx1MDAyNnJlcSwgb3BjLVxcdTAwM2VvcCk7XFxuK1xcdHJldCA9IHJ0cHNlX21jdV9kb194ZmVyKHBzZSwgXFx1MDAyNnJlcSwgXFx1MDAyNnJlc3ApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0Y29uZmlnLVxcdTAwM2VudW1fb2ZfcHNlcyA9IHJlc3AucGF5bG9hZFs2XTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9zZXRfZ2xvYmFsX3N0YXRlKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBib29sIGVuYWJsZSlcXG4re1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXEsIHJlc3A7XFxuK1xcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRvcGMgPSBcXHUwMDI2cHNlLVxcdTAwM2VkaWFsZWN0LVxcdTAwM2VvcGNvZGVbUlRQU0VfTUNVX0NNRF9TRVRfR0xPQkFMX1NUQVRFXTtcXG4rXFx0aWYgKCFvcGMtXFx1MDAzZXZhbGlkKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHRydHBzZV9tY3VfbXNnX2luaXQoXFx1MDAyNnJlcSwgb3BjLVxcdTAwM2VvcCk7XFxuK1xcdHJlcS5wYXlsb2FkWzBdID0gZW5hYmxlID8gMHgxIDogMHgwO1xcbitcXG4rXFx0cmV0ID0gcnRwc2VfbWN1X2RvX3hmZXIocHNlLCBcXHUwMDI2cmVxLCBcXHUwMDI2cmVzcCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXR1cm4gKHJlc3AucGF5bG9hZFswXSA9PSAweDApID8gMCA6IC1FSU87XFxuK31cXG4rXFxuKy8qIFBvcnQgb3BlcmF0aW9ucyAqL1xcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfc3RhdHVzKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCxcXG4rXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfc3RhdHVzICpzdGF0dXMpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9tc2cgcmVzcDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdG9wYyA9IFxcdTAwMjZwc2UtXFx1MDAzZWRpYWxlY3QtXFx1MDAzZW9wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1NUQVRVU107XFxuK1xcdGlmICghb3BjLVxcdTAwM2V2YWxpZClcXG4rXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXG4rXFx0cmV0ID0gcnRwc2VfbWN1X3BvcnRfcXVlcnkocHNlLCBwb3J0LCBvcGMtXFx1MDAzZW9wLCBcXHUwMDI2cmVzcCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRzdGF0dXMtXFx1MDAzZXN0czEgPSByZXNwLnBheWxvYWRbMV07XFxuK1xcdHN0YXR1cy1cXHUwMDNlc3RzMiA9IHJlc3AucGF5bG9hZFsyXTtcXG4rXFx0c3RhdHVzLVxcdTAwM2VzdHMzID0gcmVzcC5wYXlsb2FkWzNdO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfZ2V0X21lYXN1cmVtZW50KHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCxcXG4rXFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfbWVhc3VyZW1lbnQgKm1lYXN1cmVtZW50KVxcbit7XFxuK1xcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XFxuK1xcdHN0cnVjdCBydHBzZV9tY3VfbXNnIHJlc3A7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRvcGMgPSBcXHUwMDI2cHNlLVxcdTAwM2VkaWFsZWN0LVxcdTAwM2VvcGNvZGVbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9QT1dFUl9TVEFUU107XFxuK1xcdGlmICghb3BjLVxcdTAwM2V2YWxpZClcXG4rXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXG4rXFx0cmV0ID0gcnRwc2VfbWN1X3BvcnRfcXVlcnkocHNlLCBwb3J0LCBvcGMtXFx1MDAzZW9wLCBcXHUwMDI2cmVzcCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRtZWFzdXJlbWVudC1cXHUwMDNldm9sdGFnZV9yYXcgPSBnZXRfdW5hbGlnbmVkX2JlMTYoXFx1MDAyNnJlc3AucGF5bG9hZFsxXSk7XFxuK1xcdG1lYXN1cmVtZW50LVxcdTAwM2VjdXJyZW50X3JhdyA9IGdldF91bmFsaWduZWRfYmUxNihcXHUwMDI2cmVzcC5wYXlsb2FkWzNdKTtcXG4rXFx0bWVhc3VyZW1lbnQtXFx1MDAzZXRlbXBlcmF0dXJlX3JhdyA9IGdldF91bmFsaWduZWRfYmUxNihcXHUwMDI2cmVzcC5wYXlsb2FkWzVdKTtcXG4rXFx0bWVhc3VyZW1lbnQtXFx1MDAzZXBvd2VyX3JhdyA9IGdldF91bmFsaWduZWRfYmUxNihcXHUwMDI2cmVzcC5wYXlsb2FkWzddKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9jb25maWcoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHVuc2lnbmVkIGludCBwb3J0LFxcbitcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBydHBzZV9tY3VfcG9ydF9jb25maWcgKmNvbmZpZylcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSAqb3BjO1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXNwO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0b3BjID0gXFx1MDAyNnBzZS1cXHUwMDNlZGlhbGVjdC1cXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfUE9SVF9HRVRfQ09ORklHXTtcXG4rXFx0aWYgKCFvcGMtXFx1MDAzZXZhbGlkKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHRyZXQgPSBydHBzZV9tY3VfcG9ydF9xdWVyeShwc2UsIHBvcnQsIG9wYy1cXHUwMDNlb3AsIFxcdTAwMjZyZXNwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGNvbmZpZy1cXHUwMDNlZW5hYmxlID0gKHJlc3AucGF5bG9hZFsxXSA9PSAxKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9leHRfY29uZmlnKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCxcXG4rXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBydHBzZV9tY3VfcG9ydF9leHRfY29uZmlnICpjb25maWcpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9tc2cgcmVzcDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdG9wYyA9IFxcdTAwMjZwc2UtXFx1MDAzZWRpYWxlY3QtXFx1MDAzZW9wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0VYVF9DT05GSUddO1xcbitcXHRpZiAoIW9wYy1cXHUwMDNldmFsaWQpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuK1xcdHJldCA9IHJ0cHNlX21jdV9wb3J0X3F1ZXJ5KHBzZSwgcG9ydCwgb3BjLVxcdTAwM2VvcCwgXFx1MDAyNnJlc3ApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0Y29uZmlnLVxcdTAwM2VtYXhfcG93ZXIgPSByZXNwLnBheWxvYWRbM107XFxuK1xcdGNvbmZpZy1cXHUwMDNlcHJpb3JpdHkgPSByZXNwLnBheWxvYWRbNF07XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9zZXRfc3RhdGUoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHVuc2lnbmVkIGludCBwb3J0LCBib29sIGVuYWJsZSlcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSAqb3BjO1xcbitcXG4rXFx0b3BjID0gXFx1MDAyNnBzZS1cXHUwMDNlZGlhbGVjdC1cXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfUE9SVF9FTkFCTEVdO1xcbitcXHRpZiAoIW9wYy1cXHUwMDNldmFsaWQpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuK1xcdHJldHVybiBydHBzZV9tY3VfcG9ydF9jbWQocHNlLCBwb3J0LCBvcGMtXFx1MDAzZW9wLCBlbmFibGUgPyAweDEgOiAweDApO1xcbit9XFxuK1xcbisvKiBQU0UgY29udHJvbGxlciBvcHMgKi9cXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfZ2V0X2FkbWluX3N0YXRlKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IHBzZV9hZG1pbl9zdGF0ZSAqYWRtaW5fc3RhdGUpXFxuK3tcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7XFxuK1xcdHN0cnVjdCBydHBzZV9tY3VfcG9ydF9jb25maWcgY29uZmlnO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X2NvbmZpZyhwc2UsIGlkLCBcXHUwMDI2Y29uZmlnKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGFkbWluX3N0YXRlLVxcdTAwM2VjMzNfYWRtaW5fc3RhdGUgPSBjb25maWcuZW5hYmxlID8gRVRIVE9PTF9DMzNfUFNFX0FETUlOX1NUQVRFX0VOQUJMRUQgOlxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgRVRIVE9PTF9DMzNfUFNFX0FETUlOX1NUQVRFX0RJU0FCTEVEO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHdfc3RhdHVzKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQsXFxuK1xcdFxcdFxcdFxcdFxcdHN0cnVjdCBwc2VfcHdfc3RhdHVzICpwd19zdGF0dXMpXFxuK3tcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7XFxuK1xcdHN0cnVjdCBydHBzZV9tY3VfcG9ydF9zdGF0dXMgc3RhdHVzO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3N0YXR1cyhwc2UsIGlkLCBcXHUwMDI2c3RhdHVzKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHN3aXRjaCAoc3RhdHVzLnN0czEpIHtcXG4rXFx0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfRElTQUJMRUQ6XFxuK1xcdFxcdHB3X3N0YXR1cy1cXHUwMDNlYzMzX3B3X3N0YXR1cyA9IEVUSFRPT0xfQzMzX1BTRV9QV19EX1NUQVRVU19ESVNBQkxFRDtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgUlRQU0VfTUNVX1BPUlRfU1RTX1NFQVJDSElORzpcXG4rXFx0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfUkVRVUVTVElORzpcXG4rXFx0XFx0cHdfc3RhdHVzLVxcdTAwM2VjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX1NFQVJDSElORztcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgUlRQU0VfTUNVX1BPUlRfU1RTX0RFTElWRVJJTkc6XFxuK1xcdFxcdHB3X3N0YXR1cy1cXHUwMDNlYzMzX3B3X3N0YXR1cyA9IEVUSFRPT0xfQzMzX1BTRV9QV19EX1NUQVRVU19ERUxJVkVSSU5HO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfVEVTVDpcXG4rXFx0XFx0cHdfc3RhdHVzLVxcdTAwM2VjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX1RFU1Q7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19GQVVMVDpcXG4rXFx0XFx0cHdfc3RhdHVzLVxcdTAwM2VjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX0ZBVUxUO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfT1RIRVJfRkFVTFQ6XFxuK1xcdFxcdHB3X3N0YXR1cy1cXHUwMDNlYzMzX3B3X3N0YXR1cyA9IEVUSFRPT0xfQzMzX1BTRV9QV19EX1NUQVRVU19PVEhFUkZBVUxUO1xcbitcXHRcXHRicmVhaztcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0cHdfc3RhdHVzLVxcdTAwM2VjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX1VOS05PV047XFxuK1xcdFxcdGJyZWFrO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHdfY2xhc3Moc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcXG4re1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9wb3J0X3N0YXR1cyBzdGF0dXM7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBydHBzZV9tY3VfcG9ydF9nZXRfc3RhdHVzKHBzZSwgaWQsIFxcdTAwMjZzdGF0dXMpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0LypcXG4rXFx0ICogQXMgcGVyIGRhdGFzaGVldCwgdGhlIGNsYXNzaWZpY2F0aW9uIHJlc3VsdCBpcyBvbmx5IHZhbGlkIHdoZW4gaW5cXG4rXFx0ICogb25lIG9mIHRob3NlIG9wZXJhdGlvbmFsIG1vZGVzLCBvdGhlcndpc2Ugbm90LlxcbitcXHQgKi9cXG4rXFx0c3dpdGNoIChzdGF0dXMuc3RzMSkge1xcbitcXHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19ESVNBQkxFRDpcXG4rXFx0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfU0VBUkNISU5HOlxcbitcXHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19ERUxJVkVSSU5HOlxcbitcXHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19SRVFVRVNUSU5HOlxcbitcXHRcXHRyZXR1cm4gcHNlLVxcdTAwM2VkaWFsZWN0LVxcdTAwM2VwYXJzZV9wb3J0X2NsYXNzKFxcdTAwMjZzdGF0dXMpO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBObyBjbGFzcyB0byByZXBvcnQsIHJldHVybiAwIGluc3RlYWQuIFRoaXMgaXMgaW5kaXN0aW5ndWlzaGFibGVcXG4rXFx0XFx0ICogZnJvbSBhIHJlYWwgY2xhc3MtMCBQRCBidXQgdXNlcnNwYWNlIGRpc2FtYmlndWF0ZXMgdmlhIHRoZVxcbitcXHRcXHQgKiBwb3dlciBzdGF0dXMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9hY3R1YWxfcHcoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcXG4re1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9wb3J0X21lYXN1cmVtZW50IG1lYXN1cmVtZW50O1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X21lYXN1cmVtZW50KHBzZSwgaWQsIFxcdTAwMjZtZWFzdXJlbWVudCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKiAxMDBtVyBwZXIgTFNCICovXFxuK1xcdHJldHVybiBtZWFzdXJlbWVudC5wb3dlcl9yYXcgKiAxMDBVO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF92b2x0YWdlKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQpXFxuK3tcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7XFxuK1xcdHN0cnVjdCBydHBzZV9tY3VfcG9ydF9tZWFzdXJlbWVudCBtZWFzdXJlbWVudDtcXG4rXFx0aW50IHJldDtcXG4rXFx0dTMyIHVWO1xcbitcXG4rXFx0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X21lYXN1cmVtZW50KHBzZSwgaWQsIFxcdTAwMjZtZWFzdXJlbWVudCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKiA2NC40NW1WIHBlciBMU0IgKi9cXG4rXFx0dVYgPSBtZWFzdXJlbWVudC52b2x0YWdlX3JhdyAqIDY0NDUwVTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIElkbGUgcG9ydHMgbWVhc3VyZSAwViwgd2hpY2ggdGhlIGNvcmUgcmVqZWN0cyB3aGVuIHR1cm5pbmcgYSBwb3dlclxcbitcXHQgKiBsaW1pdCBpbnRvIGEgY3VycmVudCBsaW1pdC4gRmFsbCBiYWNrIHRvIHRoZSBub21pbmFsIHJhaWwgc28gYSBsaW1pdFxcbitcXHQgKiBjYW4gYmUgc2V0IGJlZm9yZSBhIFBEIGlzIGF0dGFjaGVkLlxcbitcXHQgKi9cXG4rXFx0aWYgKCF1VilcXG4rXFx0XFx0cmV0dXJuIFJUUFNFX01DVV9QU0VfVk9MVEFHRV9VVjtcXG4rXFxuK1xcdHJldHVybiBtaW5fdCh1MzIsIHVWLCBJTlRfTUFYKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9lbmFibGUoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcXG4re1xcbitcXHRyZXR1cm4gcnRwc2VfbWN1X3BvcnRfc2V0X3N0YXRlKHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KSwgaWQsIHRydWUpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2Rpc2FibGUoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcXG4re1xcbitcXHRyZXR1cm4gcnRwc2VfbWN1X3BvcnRfc2V0X3N0YXRlKHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KSwgaWQsIGZhbHNlKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHdfbGltaXQoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcXG4re1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9wb3J0X2V4dF9jb25maWcgY29uZmlnO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X2V4dF9jb25maWcocHNlLCBpZCwgXFx1MDAyNmNvbmZpZyk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXR1cm4gY29uZmlnLm1heF9wb3dlciAqIHBzZS1cXHUwMDNlY2hpcC1cXHUwMDNlcHdfcmVhZF9sc2JfbVc7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfc2V0X3B3X2xpbWl0KHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQsIGludCBtYXhfbVcpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKnR5cGVfb3BjLCAqdmFsX29wYztcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7XFxuK1xcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfY2hpcF9pbmZvICpjaGlwID0gcHNlLVxcdTAwM2VjaGlwO1xcbitcXHR1OCBwcmdfdmFsO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0aWYgKG1heF9tVyBcXHUwMDNjIDAgfHwgbWF4X21XIFxcdTAwM2UgY2hpcC1cXHUwMDNlbWF4X21XX3Blcl9wb3J0KVxcbitcXHRcXHRyZXR1cm4gLUVSQU5HRTtcXG4rXFxuK1xcdHR5cGVfb3BjID0gXFx1MDAyNnBzZS1cXHUwMDNlZGlhbGVjdC1cXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfVFlQRV07XFxuK1xcdHZhbF9vcGMgPSBcXHUwMDI2cHNlLVxcdTAwM2VkaWFsZWN0LVxcdTAwM2VvcGNvZGVbY2hpcC1cXHUwMDNlcHdfc2V0X2NtZF07XFxuK1xcdC8qIHB3X3NldF9sc2JfbVcgaXMgdGhlIGRpdmlzb3IgYmVsb3c7IHJlamVjdCBhIGNoaXAgdGhhdCBsYWNrcyBpdC4gKi9cXG4rXFx0aWYgKCF0eXBlX29wYy1cXHUwMDNldmFsaWQgfHwgIXZhbF9vcGMtXFx1MDAzZXZhbGlkIHx8ICFjaGlwLVxcdTAwM2Vwd19zZXRfbHNiX21XKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBTd2l0Y2ggdGhlIHBvcnQgdG8gdXNlci1kZWZpbmVkIGxpbWl0IG1vZGUgZmlyc3QsIHRoZW4gcHJvZ3JhbSB0aGVcXG4rXFx0ICogbGltaXQgdmFsdWUuIElmIHRoZSBzZWNvbmQgY21kIGZhaWxzLCB0aGUgcG9ydCBpcyBsZWZ0IGluXFxuK1xcdCAqIHVzZXItZGVmaW5lZCBtb2RlIGJ1dCB3aXRoIHRoZSBwcmV2aW91cyBsaW1pdCB2YWx1ZTsgdGhlIG5leHRcXG4rXFx0ICogc3VjY2Vzc2Z1bCBzZXRfcHdfbGltaXQgY2FsbCByZWNvdmVycyBpdC5cXG4rXFx0ICovXFxuK1xcdHJldCA9IHJ0cHNlX21jdV9wb3J0X2NtZChwc2UsIGlkLCB0eXBlX29wYy1cXHUwMDNlb3AsIFJUUFNFX01DVV9QT1JUX1BXX0xJTUlUX1RZUEVfVVNFUik7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBSb3VuZCB1cCBzbyBhIHN1Yi1MU0IgcmVxdWVzdCBtYXBzIHRvIG9uZSBMU0IsIG5vdCBzaWxlbnRseSB0byAwO1xcbitcXHQgKiBhbiBleHBsaWNpdCAwIHN0aWxsIHlpZWxkcyAwLCBhbmQgTFNCLWFsaWduZWQgbWF4aW1hIGNhbid0IG92ZXJzaG9vdC5cXG4rXFx0ICovXFxuK1xcdHByZ192YWwgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIERJVl9ST1VORF9VUChtYXhfbVcsIGNoaXAtXFx1MDAzZXB3X3NldF9sc2JfbVcpLCBVOF9NQVgpO1xcbitcXG4rXFx0cmV0dXJuIHJ0cHNlX21jdV9wb3J0X2NtZChwc2UsIGlkLCB2YWxfb3BjLVxcdTAwM2VvcCwgcHJnX3ZhbCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfZ2V0X3B3X2xpbWl0X3JhbmdlcyhzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgcHNlX3B3X2xpbWl0X3JhbmdlcyAqb3V0KVxcbit7XFxuK1xcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpO1xcbitcXHRzdHJ1Y3QgZXRodG9vbF9jMzNfcHNlX3B3X2xpbWl0X3JhbmdlICpyYW5nZTtcXG4rXFxuK1xcdHJhbmdlID0ga3phbGxvY19vYmooKnJhbmdlKTtcXG4rXFx0aWYgKCFyYW5nZSlcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRyYW5nZVswXS5taW4gPSAwO1xcbitcXHRyYW5nZVswXS5tYXggPSBwc2UtXFx1MDAzZWNoaXAtXFx1MDAzZW1heF9tV19wZXJfcG9ydDtcXG4rXFxuK1xcdG91dC1cXHUwMDNlYzMzX3B3X2xpbWl0X3JhbmdlcyA9IHJhbmdlO1xcbitcXHRyZXR1cm4gMTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHJpbyhzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkKVxcbit7XFxuK1xcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpO1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfZXh0X2NvbmZpZyBjb25maWc7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBydHBzZV9tY3VfcG9ydF9nZXRfZXh0X2NvbmZpZyhwc2UsIGlkLCBcXHUwMDI2Y29uZmlnKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldHVybiBjb25maWcucHJpb3JpdHk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfc2V0X3ByaW8oc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZCwgdW5zaWduZWQgaW50IHByaW8pXFxuK3tcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7XFxuK1xcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XFxuK1xcbitcXHRpZiAocHJpbyBcXHUwMDNlIFJUUFNFX01DVV9QT1JUX01BWF9QUklPUklUWSlcXG4rXFx0XFx0cmV0dXJuIC1FUkFOR0U7XFxuK1xcbitcXHRvcGMgPSBcXHUwMDI2cHNlLVxcdTAwM2VkaWFsZWN0LVxcdTAwM2VvcGNvZGVbUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QUklPUklUWV07XFxuK1xcdGlmICghb3BjLVxcdTAwM2V2YWxpZClcXG4rXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXG4rXFx0cmV0dXJuIHJ0cHNlX21jdV9wb3J0X2NtZChwc2UsIGlkLCBvcGMtXFx1MDAzZW9wLCBwcmlvKTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBwc2VfY29udHJvbGxlcl9vcHMgcnRwc2VfbWN1X29wcyA9IHtcXG4rXFx0LnBpX2dldF9hZG1pbl9zdGF0ZSA9IHJ0cHNlX21jdV9wb3J0X2dldF9hZG1pbl9zdGF0ZSxcXG4rXFx0LnBpX2dldF9wd19zdGF0dXMgPSBydHBzZV9tY3VfcG9ydF9nZXRfcHdfc3RhdHVzLFxcbitcXHQucGlfZ2V0X3B3X2NsYXNzID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3B3X2NsYXNzLFxcbitcXHQucGlfZ2V0X2FjdHVhbF9wdyA9IHJ0cHNlX21jdV9wb3J0X2dldF9hY3R1YWxfcHcsXFxuK1xcdC5waV9lbmFibGUgPSBydHBzZV9tY3VfcG9ydF9lbmFibGUsXFxuK1xcdC5waV9kaXNhYmxlID0gcnRwc2VfbWN1X3BvcnRfZGlzYWJsZSxcXG4rXFx0LnBpX2dldF92b2x0YWdlID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3ZvbHRhZ2UsXFxuK1xcdC5waV9nZXRfcHdfbGltaXQgPSBydHBzZV9tY3VfcG9ydF9nZXRfcHdfbGltaXQsXFxuK1xcdC5waV9zZXRfcHdfbGltaXQgPSBydHBzZV9tY3VfcG9ydF9zZXRfcHdfbGltaXQsXFxuK1xcdC5waV9nZXRfcHdfbGltaXRfcmFuZ2VzID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3B3X2xpbWl0X3JhbmdlcyxcXG4rXFx0LnBpX2dldF9wcmlvID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3ByaW8sXFxuK1xcdC5waV9zZXRfcHJpbyA9IHJ0cHNlX21jdV9wb3J0X3NldF9wcmlvLFxcbit9O1xcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfZGlzY292ZXIoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHN0cnVjdCBydHBzZV9tY3VfaW5mbyAqaW5mbylcXG4re1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X2V4dF9jb25maWcgZXh0X2NvbmZpZztcXG4rXFx0dW5zaWduZWQgbG9uZyBkZWFkbGluZTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgYm9vdGluZyBNQ1UgbWF5IHN0YXkgc2lsZW50ICgtRVRJTUVET1VUKSwgbm90IEFDSyBpdHMgYWRkcmVzc1xcbitcXHQgKiAoLUVOWElPIC8gLUVSRU1PVEVJTyksIHJlcG9ydCBub3QtcmVhZHkgKC1FQUdBSU4pLCBvciBlbWl0IGFcXG4rXFx0ICogY29ycnVwdC9wYXJ0aWFsIGZyYW1lICgtRUJBRE1TRyAvIC1FQkFERSkuIFJldHJ5IHRob3NlIHdpdGhpbiBhXFxuK1xcdCAqIGJvdW5kZWQgd2luZG93OyBvdGhlciBlcnJvcnMgKGUuZy4gLUVPUE5PVFNVUFApIGFyZSBmYXRhbCBhbmQgZmFpbFxcbitcXHQgKiBpbW1lZGlhdGVseS5cXG4rXFx0ICovXFxuK1xcdGRlYWRsaW5lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUlRQU0VfTUNVX0JPT1RfVElNRU9VVF9NUyk7XFxuK1xcdGRvIHtcXG4rXFx0XFx0cmV0ID0gcnRwc2VfbWN1X2dldF9pbmZvKHBzZSwgaW5mbyk7XFxuK1xcdFxcdGlmIChyZXQgIT0gLUVUSU1FRE9VVCBcXHUwMDI2XFx1MDAyNiByZXQgIT0gLUVOWElPIFxcdTAwMjZcXHUwMDI2IHJldCAhPSAtRVJFTU9URUlPIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICByZXQgIT0gLUVBR0FJTiBcXHUwMDI2XFx1MDAyNiByZXQgIT0gLUVCQURNU0cgXFx1MDAyNlxcdTAwMjYgcmV0ICE9IC1FQkFERSlcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdG1zbGVlcChSVFBTRV9NQ1VfQk9PVF9SRVRSWV9NUyk7XFxuK1xcdH0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGRlYWRsaW5lKSk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiBkZXZfZXJyX3Byb2JlKHBzZS1cXHUwMDNlZGV2LCByZXQsIFxcXCJmYWlsZWQgdG8gcmVhZCBNQ1UgaW5mb1xcXFxuXFxcIik7XFxuK1xcbitcXHRzd2l0Y2ggKGluZm8tXFx1MDAzZWRldmljZV9pZCkge1xcbitcXHRjYXNlIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOEI6XFxuK1xcdFxcdHBzZS1cXHUwMDNlY2hpcCA9IFxcdTAwMjZydGw4MjM4Yl9pbmZvO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBSVFBTRV9NQ1VfREVWSUNFX0lEX1JUTDgyMzk6XFxuK1xcdFxcdHBzZS1cXHUwMDNlY2hpcCA9IFxcdTAwMjZydGw4MjM5X2luZm87XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOUM6XFxuK1xcdFxcdHBzZS1cXHUwMDNlY2hpcCA9IFxcdTAwMjZydGw4MjM5Y19pbmZvO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBSVFBTRV9NQ1VfREVWSUNFX0lEX0JDTTU5MTExOlxcbitcXHRcXHRwc2UtXFx1MDAzZWNoaXAgPSBcXHUwMDI2YmNtNTkxMTFfaW5mbztcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgUlRQU0VfTUNVX0RFVklDRV9JRF9CQ001OTEyMTpcXG4rXFx0XFx0cHNlLVxcdTAwM2VjaGlwID0gXFx1MDAyNmJjbTU5MTIxX2luZm87XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXFx1MDAzZWRldiwgLUVJTlZBTCwgXFxcInVua25vd24gUFNFIGlkIDB4JXhcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgaW5mby1cXHUwMDNlZGV2aWNlX2lkKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFpbmZvLVxcdTAwM2VtYXhfcG9ydHMgfHwgaW5mby1cXHUwMDNlbWF4X3BvcnRzIFxcdTAwM2UgUlRQU0VfTUNVX01BWF9QT1JUUylcXG4rXFx0XFx0cmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLVxcdTAwM2VkZXYsIC1FSU5WQUwsXFxuK1xcdFxcdFxcdFxcdCAgICAgXFxcIk1DVSByZXBvcnRzIGludmFsaWQgcG9ydCBjb3VudCAldVxcXFxuXFxcIiwgaW5mby1cXHUwMDNlbWF4X3BvcnRzKTtcXG4rXFxuK1xcdHJldCA9IHJ0cHNlX21jdV9nZXRfZXh0X2NvbmZpZyhwc2UsIFxcdTAwMjZleHRfY29uZmlnKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLVxcdTAwM2VkZXYsIHJldCwgXFxcImZhaWxlZCB0byByZWFkIE1DVSBleHQgY29uZmlnXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGRldl9pbmZvKHBzZS1cXHUwMDNlZGV2LCBcXFwiJXMgTUNVLCAlcyAoaWQgMHglMDR4KSwgJXUgcG9ydHMgYWNyb3NzICV1IFBTRSBjaGlwKHMpXFxcXG5cXFwiLFxcbitcXHRcXHQgcHNlLVxcdTAwM2VkaWFsZWN0LVxcdTAwM2VtY3VfdHlwZV9zdHIoaW5mby1cXHUwMDNlbWN1X3R5cGUpLCBwc2UtXFx1MDAzZWNoaXAtXFx1MDAzZW5hbWUsXFxuK1xcdFxcdCBpbmZvLVxcdTAwM2VkZXZpY2VfaWQsIGluZm8tXFx1MDAzZW1heF9wb3J0cywgZXh0X2NvbmZpZy5udW1fb2ZfcHNlcyk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBydHBzZV9tY3VfZ2xvYmFsX2Rpc2FibGUodm9pZCAqZGF0YSlcXG4re1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IGRhdGE7XFxuK1xcbitcXHRydHBzZV9tY3Vfc2V0X2dsb2JhbF9zdGF0ZShwc2UsIGZhbHNlKTtcXG4rfVxcbitcXG4raW50IHJ0cHNlX21jdV9yZWdpc3RlcihzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSlcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21hdGNoX2RhdGEgKm1hdGNoO1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X2luZm8gaW5mbztcXG4rXFx0c3RydWN0IGdwaW9fZGVzYyAqZ3Bpb2Q7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBydHBzZV9tY3VfbXNnKSAhPSBSVFBTRV9NQ1VfTVNHX1NJWkUpO1xcbitcXG4rXFx0cmV0ID0gZGV2bV9tdXRleF9pbml0KHBzZS1cXHUwMDNlZGV2LCBcXHUwMDI2cHNlLVxcdTAwM2VtdXRleCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRtYXRjaCA9IGRldmljZV9nZXRfbWF0Y2hfZGF0YShwc2UtXFx1MDAzZWRldik7XFxuK1xcdGlmICghbWF0Y2gpXFxuK1xcdFxcdHJldHVybiBkZXZfZXJyX3Byb2JlKHBzZS1cXHUwMDNlZGV2LCAtRU5PREVWLCBcXFwibWlzc2luZyBtYXRjaCBkYXRhXFxcXG5cXFwiKTtcXG4rXFx0cHNlLVxcdTAwM2VkaWFsZWN0ID0gbWF0Y2gtXFx1MDAzZWRpYWxlY3Q7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBDYXRjaCBhIGRpYWxlY3QgdGhhdCBmb3Jnb3QgdG8gc2V0IG9uZSBvZiB0aGUgcmVxdWlyZWQgaG9va3MgYXRcXG4rXFx0ICogcHJvYmUgdGltZSwgcmF0aGVyIHRoYW4gTlVMTC1kZXJlZidpbmcgbGF0ZXIgZnJvbSBhIGZhc3QgcGF0aC5cXG4rXFx0ICovXFxuK1xcdGlmICghcHNlLVxcdTAwM2VkaWFsZWN0IHx8XFxuK1xcdCAgICAhcHNlLVxcdTAwM2VkaWFsZWN0LVxcdTAwM2VwYXJzZV9zeXN0ZW1faW5mbyB8fFxcbitcXHQgICAgIXBzZS1cXHUwMDNlZGlhbGVjdC1cXHUwMDNlcGFyc2VfcG9ydF9jbGFzcyB8fFxcbitcXHQgICAgIXBzZS1cXHUwMDNlZGlhbGVjdC1cXHUwMDNlbWN1X3R5cGVfc3RyKVxcbitcXHRcXHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXFx1MDAzZWRldiwgLUVJTlZBTCxcXG4rXFx0XFx0XFx0XFx0ICAgICBcXFwiZGlhbGVjdCBmb3IgY2hpcCBpcyBpbmNvbXBsZXRlXFxcXG5cXFwiKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFJlbGVhc2UgdGhlIE1DVSBmcm9tIHJlc2V0IGJlZm9yZSB0aGUgZmlyc3QgdHJhbnNhY3Rpb247IHRoZVxcbitcXHQgKiBib290LXJldHJ5IGxvb3AgaW4gZGlzY292ZXIoKSB3YWl0cyBmb3IgaXQgdG8gYW5zd2VyLlxcbitcXHQgKi9cXG4rXFx0Z3Bpb2QgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChwc2UtXFx1MDAzZWRldiwgXFxcInJlc2V0XFxcIiwgR1BJT0RfT1VUX0xPVyk7XFxuK1xcdGlmIChJU19FUlIoZ3Bpb2QpKVxcbitcXHRcXHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXFx1MDAzZWRldiwgUFRSX0VSUihncGlvZCksXFxuK1xcdFxcdFxcdFxcdCAgICAgXFxcImZhaWxlZCB0byBnZXQgcmVzZXQgZ3Bpb1xcXFxuXFxcIik7XFxuK1xcbitcXHRyZXQgPSBydHBzZV9tY3VfZGlzY292ZXIocHNlLCBcXHUwMDI2aW5mbyk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBTb21lIGJvYXJkcyBnYXRlIGFsbCBwb3J0cyB0aHJvdWdoIGEgaGFyZHdhcmUgbGluZTsgZGVhc3NlcnQgaXQgb25seVxcbitcXHQgKiBvbmNlIHRoZSBNQ1UgaXMgY29uZmlybWVkIHByZXNlbnQsIHNvIGEgZmFpbGVkIHByb2JlIGxlYXZlcyB0aGUgcG9ydHNcXG4rXFx0ICogZ2F0ZWQuIEZyb20gaGVyZSB0aGUgTUNVIHByb3RvY29sIGdvdmVybnMgcGVyLXBvcnQgYWRtaW4gc3RhdGUuXFxuK1xcdCAqL1xcbitcXHRncGlvZCA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKHBzZS1cXHUwMDNlZGV2LCBcXFwiZGlzYWJsZS1wb3J0c1xcXCIsIEdQSU9EX09VVF9MT1cpO1xcbitcXHRpZiAoSVNfRVJSKGdwaW9kKSlcXG4rXFx0XFx0cmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLVxcdTAwM2VkZXYsIFBUUl9FUlIoZ3Bpb2QpLFxcbitcXHRcXHRcXHRcXHQgICAgIFxcXCJmYWlsZWQgdG8gZ2V0IGRpc2FibGUtcG9ydHMgZ3Bpb1xcXFxuXFxcIik7XFxuK1xcbitcXHRpZiAoIWluZm8uc3lzdGVtX2VuYWJsZSkge1xcbitcXHRcXHRyZXQgPSBydHBzZV9tY3Vfc2V0X2dsb2JhbF9zdGF0ZShwc2UsIHRydWUpO1xcbitcXHRcXHQvKiBEaWFsZWN0cyB3aXRob3V0IGEgZ2xvYmFsLXN0YXRlIGNvbmNlcHQgKGUuZy4gR2VuMSkgcmV0dXJuXFxuK1xcdFxcdCAqIC1FT1BOT1RTVVBQOyB0cmVhdCB0aGF0IGFzIFxcXCJubyBzZXBhcmF0ZSBlbmFibGUgcmVxdWlyZWRcXFwiLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKHJldCBcXHUwMDI2XFx1MDAyNiByZXQgIT0gLUVPUE5PVFNVUFApXFxuK1xcdFxcdFxcdHJldHVybiBkZXZfZXJyX3Byb2JlKHBzZS1cXHUwMDNlZGV2LCByZXQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgXFxcImZhaWxlZCB0byBlbmFibGUgUFNFIHN5c3RlbVxcXFxuXFxcIik7XFxuK1xcdFxcdGlmICghcmV0KSB7XFxuK1xcdFxcdFxcdHJldCA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChwc2UtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIHJ0cHNlX21jdV9nbG9iYWxfZGlzYWJsZSwgcHNlKTtcXG4rXFx0XFx0XFx0aWYgKHJldClcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBEZXBlbmRpbmcgb24gdGhlIE1DVSBmaXJtd2FyZSBjb25maWd1cmF0aW9uICh3aGljaCBtaWdodCBiZSBkaWZmZXJlbnRcXG4rXFx0ICogZm9yIGV2ZXJ5IGJvYXJkKSwgaXQgaXNuJ3Qga25vd24gd2hldGhlciB0aGUgUG9FIHN1YnN5c3RlbSBpcyBhY3RpdmUgb3JcXG4rXFx0ICogaW5hY3RpdmUgYnkgZGVmYXVsdC4gQXQgdGhpcyBzdGFnZSwgdGhlIFBTRSBjaGlwcyBtaWdodCBhbHJlYWR5IGRlbGl2ZXJcXG4rXFx0ICogcG93ZXIgdG8gUERzIHdpdGhvdXQgYW55IGV4cGxpY2l0IGVuYWJsZS5cXG4rXFx0ICovXFxuK1xcbitcXHQvKiBwY2Rldi5vd25lciBpcyBzZXQgYnkgdGhlIHRyYW5zcG9ydCwgc28gdGhlIHJlZ2lzdGVyZWQgY29udHJvbGxlclxcbitcXHQgKiBwaW5zIHRoZSB0cmFuc3BvcnQgbW9kdWxlIHRoYXQgb3ducyB0aGUgbGl2ZSBkZXZpY2UsIG5vdCB0aGUgY29yZS5cXG4rXFx0ICovXFxuK1xcdHBzZS1cXHUwMDNlcGNkZXYub3BzICAgICAgPSBcXHUwMDI2cnRwc2VfbWN1X29wcztcXG4rXFx0cHNlLVxcdTAwM2VwY2Rldi5kZXYgICAgICA9IHBzZS1cXHUwMDNlZGV2O1xcbitcXHRwc2UtXFx1MDAzZXBjZGV2LnR5cGVzICAgID0gRVRIVE9PTF9QU0VfQzMzO1xcbitcXHRwc2UtXFx1MDAzZXBjZGV2Lm5yX2xpbmVzID0gaW5mby5tYXhfcG9ydHM7XFxuK1xcdHBzZS1cXHUwMDNlcGNkZXYucGlzX3ByaW9fbWF4ID0gUlRQU0VfTUNVX1BPUlRfTUFYX1BSSU9SSVRZO1xcbitcXHRwc2UtXFx1MDAzZXBjZGV2LnN1cHBfYnVkZ2V0X2V2YWxfc3RyYXRlZ2llcyA9IFBTRV9CVURHRVRfRVZBTF9TVFJBVF9EWU5BTUlDO1xcbitcXG4rXFx0cmV0dXJuIGRldm1fcHNlX2NvbnRyb2xsZXJfcmVnaXN0ZXIocHNlLVxcdTAwM2VkZXYsIFxcdTAwMjZwc2UtXFx1MDAzZXBjZGV2KTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChydHBzZV9tY3VfcmVnaXN0ZXIpO1xcbitcXG4rc3RhdGljIHZvaWQgcnRwc2VfbWN1X2dlbjJfcGFyc2Vfc3lzdGVtX2luZm8oY29uc3QgdTggKnBheWxvYWQsIHN0cnVjdCBydHBzZV9tY3VfaW5mbyAqaW5mbylcXG4re1xcbitcXHRpbmZvLVxcdTAwM2VtYXhfcG9ydHMgPSBwYXlsb2FkWzFdO1xcbitcXHRpbmZvLVxcdTAwM2VzeXN0ZW1fZW5hYmxlID0gKHBheWxvYWRbMl0gPT0gMHgxKTtcXG4rXFx0aW5mby1cXHUwMDNlZGV2aWNlX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTE2KFxcdTAwMjZwYXlsb2FkWzNdKTtcXG4rXFx0aW5mby1cXHUwMDNlbWN1X3R5cGUgPSBwYXlsb2FkWzZdO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9nZW4yX3BhcnNlX3BvcnRfY2xhc3MoY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9wb3J0X3N0YXR1cyAqc3RhdHVzKVxcbit7XFxuK1xcdC8qIENsYXNzIGxpdmVzIGluIHRoZSB1cHBlciBuaWJibGUgb2Ygc3RzMi4gKi9cXG4rXFx0cmV0dXJuIEZJRUxEX0dFVChHRU5NQVNLKDcsIDQpLCBzdGF0dXMtXFx1MDAzZXN0czIpO1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3QgY2hhciAqcnRwc2VfbWN1X2dlbjJfbWN1X3R5cGVfc3RyKHVuc2lnbmVkIGludCBtY3VfdHlwZSlcXG4re1xcbitcXHRzd2l0Y2ggKG1jdV90eXBlKSB7XFxuK1xcdGNhc2UgMHgwMDpcXHRyZXR1cm4gXFxcIkdpZ2FEZXZpY2UgR0QzMkYzMTBcXFwiO1xcbitcXHRjYXNlIDB4MDE6XFx0cmV0dXJuIFxcXCJHaWdhRGV2aWNlIEdEMzJGMjMwXFxcIjtcXG4rXFx0Y2FzZSAweDAyOlxcdHJldHVybiBcXFwiR2lnYURldmljZSBHRDMyRjMwM1xcXCI7XFxuK1xcdGNhc2UgMHgwMzpcXHRyZXR1cm4gXFxcIkdpZ2FEZXZpY2UgR0QzMkYxMDNcXFwiO1xcbitcXHRjYXNlIDB4MDQ6XFx0cmV0dXJuIFxcXCJHaWdhRGV2aWNlIEdEMzJFMTAzXFxcIjtcXG4rXFx0Y2FzZSAweDEwOlxcdHJldHVybiBcXFwiTnV2b3RvbiBNMDUxNlxcXCI7XFxuK1xcdGNhc2UgMHgxMTpcXHRyZXR1cm4gXFxcIk51dm90b24gTTA1NjRcXFwiO1xcbitcXHRjYXNlIDB4MTI6XFx0cmV0dXJuIFxcXCJOdXZvdG9uIE5VQzAyOVxcXCI7XFxuK1xcdGRlZmF1bHQ6XFx0cmV0dXJuIFxcXCJ1bmtub3duXFxcIjtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBydHBzZV9tY3VfZ2VuMV9wYXJzZV9zeXN0ZW1faW5mbyhjb25zdCB1OCAqcGF5bG9hZCwgc3RydWN0IHJ0cHNlX21jdV9pbmZvICppbmZvKVxcbit7XFxuK1xcdGluZm8tXFx1MDAzZW1heF9wb3J0cyA9IHBheWxvYWRbMV07XFxuK1xcdC8qIEdlbjEgaGFzIG5vIGV4cGxpY2l0IHN5c3RlbV9lbmFibGUgYnl0ZTsgdGhlIGNsb3Nlc3QgYW5hbG9nIGlzIHRoZVxcbitcXHQgKiBcXFwicmVtb3RlIGVuYWJsZVxcXCIgYml0IGluIHRoZSBzeXN0ZW0tc3RhdHVzIGZsYWdzIGF0IHBheWxvYWRbN10uXFxuK1xcdCAqL1xcbitcXHRpbmZvLVxcdTAwM2VzeXN0ZW1fZW5hYmxlID0gISEocGF5bG9hZFs3XSBcXHUwMDI2IEJJVCgyKSk7XFxuK1xcdGluZm8tXFx1MDAzZWRldmljZV9pZCA9IGdldF91bmFsaWduZWRfYmUxNihcXHUwMDI2cGF5bG9hZFszXSk7XFxuK1xcdGluZm8tXFx1MDAzZW1jdV90eXBlID0gcGF5bG9hZFs2XTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfZ2VuMV9wYXJzZV9wb3J0X2NsYXNzKGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfcG9ydF9zdGF0dXMgKnN0YXR1cylcXG4re1xcbitcXHQvKiBHZW4xIHB1dHMgdGhlIGRldGVjdGVkIGNsYXNzIGluIHBheWxvYWRbM10gKD09IHN0czMpIGRpcmVjdGx5LlxcbitcXHQgKiBNYXNrIHRvIHRoZSBsb3cgbmliYmxlOyBjbGFzcyBpcyAwLi44IGFuZCBhbnkgaGlnaCBiaXRzIHdvdWxkIGJlXFxuK1xcdCAqIG5vaXNlLlxcbitcXHQgKi9cXG4rXFx0cmV0dXJuIHN0YXR1cy1cXHUwMDNlc3RzMyBcXHUwMDI2IDB4MGY7XFxuK31cXG4rXFxuK3N0YXRpYyBjb25zdCBjaGFyICpydHBzZV9tY3VfZ2VuMV9tY3VfdHlwZV9zdHIodW5zaWduZWQgaW50IG1jdV90eXBlKVxcbit7XFxuK1xcdHN3aXRjaCAobWN1X3R5cGUpIHtcXG4rXFx0Y2FzZSAweDAwOlxcdHJldHVybiBcXFwiU1QgTWljcm8gU1QzMkYxMDBcXFwiO1xcbitcXHRjYXNlIDB4MDE6XFx0cmV0dXJuIFxcXCJOdXZvdG9uIE0wNXh4IExBTlxcXCI7XFxuK1xcdGNhc2UgMHgwMjpcXHRyZXR1cm4gXFxcIlNUIE1pY3JvIFNURjAzMEM4XFxcIjtcXG4rXFx0Y2FzZSAweDAzOlxcdHJldHVybiBcXFwiTnV2b3RvbiBNMDU4U0FOXFxcIjtcXG4rXFx0Y2FzZSAweDA0OlxcdHJldHVybiBcXFwiTnV2b3RvbiBOVUMxMjJcXFwiO1xcbitcXHRkZWZhdWx0OlxcdHJldHVybiBcXFwidW5rbm93blxcXCI7XFxuK1xcdH1cXG4rfVxcbitcXG4rLyogTWFwIGVhY2ggbG9naWNhbCBjb21tYW5kIHRoZSBjb3JlIGlzc3VlcyB0byBpdHMgcGVyLWRpYWxlY3Qgb3Bjb2RlLiAqL1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9kaWFsZWN0IHJ0cHNlX21jdV9kaWFsZWN0X2dlbjIgPSB7XFxuK1xcdC5wYXJzZV9zeXN0ZW1faW5mbyA9IHJ0cHNlX21jdV9nZW4yX3BhcnNlX3N5c3RlbV9pbmZvLFxcbitcXHQucGFyc2VfcG9ydF9jbGFzcyAgPSBydHBzZV9tY3VfZ2VuMl9wYXJzZV9wb3J0X2NsYXNzLFxcbitcXHQubWN1X3R5cGVfc3RyICAgICAgPSBydHBzZV9tY3VfZ2VuMl9tY3VfdHlwZV9zdHIsXFxuK1xcdC5vcGNvZGUgPSB7XFxuK1xcdFxcdFtSVFBTRV9NQ1VfQ01EX1NFVF9HTE9CQUxfU1RBVEVdXFx0PSBSVFBTRV9NQ1VfT1AoMHgwMCksXFxuK1xcdFxcdFtSVFBTRV9NQ1VfQ01EX0dFVF9TWVNURU1fSU5GT11cXHRcXHQ9IFJUUFNFX01DVV9PUCgweDQwKSxcXG4rXFx0XFx0W1JUUFNFX01DVV9DTURfR0VUX0VYVF9DT05GSUddXFx0XFx0PSBSVFBTRV9NQ1VfT1AoMHg0YSksXFxuK1xcbitcXHRcXHRbUlRQU0VfTUNVX0NNRF9QT1JUX0VOQUJMRV1cXHRcXHQ9IFJUUFNFX01DVV9PUCgweDAxKSxcXG4rXFx0XFx0W1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfVFlQRV0gPSBSVFBTRV9NQ1VfT1AoMHgxMiksXFxuK1xcdFxcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUXVxcdD0gUlRQU0VfTUNVX09QKDB4MTMpLFxcbitcXHRcXHRbUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF9FWFRdID0gUlRQU0VfTUNVX09QKDB4MTQpLFxcbitcXHRcXHRbUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QUklPUklUWV1cXHQ9IFJUUFNFX01DVV9PUCgweDE1KSxcXG4rXFx0XFx0W1JUUFNFX01DVV9DTURfUE9SVF9HRVRfU1RBVFVTXVxcdFxcdD0gUlRQU0VfTUNVX09QKDB4NDIpLFxcbitcXHRcXHRbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9QT1dFUl9TVEFUU11cXHQ9IFJUUFNFX01DVV9PUCgweDQ0KSxcXG4rXFx0XFx0W1JUUFNFX01DVV9DTURfUE9SVF9HRVRfQ09ORklHXVxcdFxcdD0gUlRQU0VfTUNVX09QKDB4NDgpLFxcbitcXHRcXHRbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9FWFRfQ09ORklHXVxcdD0gUlRQU0VfTUNVX09QKDB4NDkpLFxcbitcXHR9LFxcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfZGlhbGVjdCBydHBzZV9tY3VfZGlhbGVjdF9nZW4xID0ge1xcbitcXHQucGFyc2Vfc3lzdGVtX2luZm8gPSBydHBzZV9tY3VfZ2VuMV9wYXJzZV9zeXN0ZW1faW5mbyxcXG4rXFx0LnBhcnNlX3BvcnRfY2xhc3MgID0gcnRwc2VfbWN1X2dlbjFfcGFyc2VfcG9ydF9jbGFzcyxcXG4rXFx0Lm1jdV90eXBlX3N0ciAgICAgID0gcnRwc2VfbWN1X2dlbjFfbWN1X3R5cGVfc3RyLFxcbitcXHQub3Bjb2RlID0ge1xcbitcXHRcXHRbUlRQU0VfTUNVX0NNRF9HRVRfU1lTVEVNX0lORk9dXFx0XFx0PSBSVFBTRV9NQ1VfT1AoMHgyMCksXFxuK1xcdFxcdFtSVFBTRV9NQ1VfQ01EX0dFVF9FWFRfQ09ORklHXVxcdFxcdD0gUlRQU0VfTUNVX09QKDB4MmIpLFxcbitcXG4rXFx0XFx0W1JUUFNFX01DVV9DTURfUE9SVF9FTkFCTEVdXFx0XFx0PSBSVFBTRV9NQ1VfT1AoMHgwMCksXFxuK1xcdFxcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUX1RZUEVdID0gUlRQU0VfTUNVX09QKDB4MTUpLFxcbitcXHRcXHRbUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF1cXHQ9IFJUUFNFX01DVV9PUCgweDE2KSxcXG4rXFx0XFx0W1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUFJJT1JJVFldXFx0PSBSVFBTRV9NQ1VfT1AoMHgxYSksXFxuK1xcdFxcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1NUQVRVU11cXHRcXHQ9IFJUUFNFX01DVV9PUCgweDIxKSxcXG4rXFx0XFx0W1JUUFNFX01DVV9DTURfUE9SVF9HRVRfUE9XRVJfU1RBVFNdXFx0PSBSVFBTRV9NQ1VfT1AoMHgzMCksXFxuK1xcdFxcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0NPTkZJR11cXHRcXHQ9IFJUUFNFX01DVV9PUCgweDI1KSxcXG4rXFx0XFx0W1JUUFNFX01DVV9DTURfUE9SVF9HRVRfRVhUX0NPTkZJR11cXHQ9IFJUUFNFX01DVV9PUCgweDI2KSxcXG4rXFx0fSxcXG4rfTtcXG4rXFxuK2NvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMV9kYXRhID0ge1xcbitcXHQuZGlhbGVjdCA9IFxcdTAwMjZydHBzZV9tY3VfZGlhbGVjdF9nZW4xLFxcbit9O1xcbitFWFBPUlRfU1lNQk9MX0dQTChydHBzZV9tY3VfZ2VuMV9kYXRhKTtcXG4rXFxuK2NvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMl9kYXRhID0ge1xcbitcXHQuZGlhbGVjdCA9IFxcdTAwMjZydHBzZV9tY3VfZGlhbGVjdF9nZW4yLFxcbit9O1xcbitFWFBPUlRfU1lNQk9MX0dQTChydHBzZV9tY3VfZ2VuMl9kYXRhKTtcXG4rXFxuKy8qIFNhbWUgZGlhbGVjdCBhcyBnZW4yLCBidXQgdGhlIE1DVSBleHBlY3RzIHJhdy1JMkMgZnJhbWluZy4gKi9cXG4rY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhIHJ0cHNlX21jdV9nZW4yX2kyY19kYXRhID0ge1xcbitcXHQuZGlhbGVjdCA9IFxcdTAwMjZydHBzZV9tY3VfZGlhbGVjdF9nZW4yLFxcbitcXHQubmF0aXZlX2kyYyA9IHRydWUsXFxuK307XFxuK0VYUE9SVF9TWU1CT0xfR1BMKHJ0cHNlX21jdV9nZW4yX2kyY19kYXRhKTtcXG4rXFxuK01PRFVMRV9BVVRIT1IoXFxcIkpvbmFzIEplbG9uZWsgXFx1MDAzY2plbG9uZWsuam9uYXNAZ21haWwuY29tXFx1MDAzZVxcXCIpO1xcbitNT0RVTEVfREVTQ1JJUFRJT04oXFxcIlJlYWx0ZWsgUFNFIE1DVSBkcml2ZXIgKGNvcmUpXFxcIik7XFxuK01PRFVMRV9MSUNFTlNFKFxcXCJHUExcXFwiKTtcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS1pMmMuYyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtaTJjLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmUxMGY4YzYzM2I2OGVcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS1pMmMuY1xcbkBAIC0wLDAgKzEsMTcwIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZGVsYXkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2kyYy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9vZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcHNlLXBkL3BzZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwicmVhbHRlay1wc2UtbWN1LmhcXFwiXFxuK1xcbisvKlxcbisgKiBUaGUgY29yZSBoYXMgYWxyZWFkeSB3YWl0ZWQgUlRQU0VfTUNVX1JFU1BPTlNFX01TIGJlZm9yZSBjYWxsaW5nIHVzLCBzb1xcbisgKiB0aGUgcmVzcG9uc2UgaXMgbm9ybWFsbHkgcmVhZHkgb24gdGhlIHZlcnkgZmlyc3QgcmVhZC4gRm9yIGNvbW1hbmRzIHRoZVxcbisgKiBNQ1UgcHJvZHVjZXMgbW9yZSBzbG93bHksIGtlZXAgcG9sbGluZyBhdCB0aGUgdHlwaWNhbCByZXNwb25zZSBjYWRlbmNlXFxuKyAqIHVwIHRvIHRoZSB3b3JzdC1jYXNlIGNlaWxpbmcuXFxuKyAqL1xcbisjZGVmaW5lIFJUUFNFX01DVV9JMkNfUkVUUllfTVNcXHRSVFBTRV9NQ1VfUkVTUE9OU0VfTVNcXG4rI2RlZmluZSBSVFBTRV9NQ1VfSTJDX01BWF9UUklFU1xcdChSVFBTRV9NQ1VfUkVTUE9OU0VfTUFYX01TIC8gUlRQU0VfTUNVX0kyQ19SRVRSWV9NUylcXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X2kyY19zbWJ1c19zZW5kKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxKVxcbit7XFxuK1xcdHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHBzZS1cXHUwMDNlZGV2KTtcXG4rXFxuK1xcdC8qIFNlbmQgb3Bjb2RlIGFzIFNNQnVzIGNvbW1hbmQgYnl0ZTsgcmVtYWluaW5nIDExIGJ5dGVzIGFzIGJsb2NrIGRhdGEgKi9cXG4rXFx0cmV0dXJuIGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShjbGllbnQsIHJlcS1cXHUwMDNlb3Bjb2RlLCBSVFBTRV9NQ1VfTVNHX1NJWkUgLSAxLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAodTggKilyZXEgKyAxKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfaTJjX3NtYnVzX3JlY3Yoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEsXFxuK1xcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcXG4re1xcbitcXHRzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChwc2UtXFx1MDAzZWRldik7XFxuK1xcdGludCB0cmllcywgcmV0O1xcbitcXG4rXFx0Zm9yICh0cmllcyA9IDA7IHRyaWVzIFxcdTAwM2MgUlRQU0VfTUNVX0kyQ19NQVhfVFJJRVM7IHRyaWVzKyspIHtcXG4rXFx0XFx0aWYgKHRyaWVzIFxcdTAwM2UgMClcXG4rXFx0XFx0XFx0bXNsZWVwKFJUUFNFX01DVV9JMkNfUkVUUllfTVMpO1xcbitcXG4rXFx0XFx0LyogTUNVIG5lZWRzIDB4MDAgYXMgY29tbWFuZCBieXRlIGZvciByZWFkICovXFxuK1xcdFxcdHJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwgMHgwMCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIFJUUFNFX01DVV9NU0dfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICh1OCAqKXJlc3ApO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0XFx0aWYgKHJldCA9PSBSVFBTRV9NQ1VfTVNHX1NJWkUgXFx1MDAyNlxcdTAwMjYgcnRwc2VfbWN1X3Jlc3BfaXNfZmluYWwocmVxLCByZXNwKSlcXG4rXFx0XFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAtRVRJTUVET1VUO1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV90cmFuc3BvcnRfb3BzIHJ0cHNlX21jdV9pMmNfc21idXNfb3BzID0ge1xcbitcXHQuc2VuZCA9IHJ0cHNlX21jdV9pMmNfc21idXNfc2VuZCxcXG4rXFx0LnJlY3YgPSBydHBzZV9tY3VfaTJjX3NtYnVzX3JlY3YsXFxuK307XFxuK1xcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9pMmNfbmF0aXZlX3NlbmQoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEpXFxuK3tcXG4rXFx0c3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQocHNlLVxcdTAwM2VkZXYpO1xcbitcXHR2b2lkICpidWY7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHQvKiBpMmNfbWFzdGVyX3NlbmQoKSBtYXkgRE1BLCBzbyB0aGUgYnVmZmVyIG11c3Qgbm90IGJlIG9uIHRoZSBzdGFjay4gKi9cXG4rXFx0YnVmID0ga21lbWR1cChyZXEsIFJUUFNFX01DVV9NU0dfU0laRSwgR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghYnVmKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdHJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgUlRQU0VfTUNVX01TR19TSVpFKTtcXG4rXFx0a2ZyZWUoYnVmKTtcXG4rXFx0aWYgKHJldCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcdHJldHVybiByZXQgPT0gUlRQU0VfTUNVX01TR19TSVpFID8gMCA6IC1FSU87XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X2kyY19uYXRpdmVfcmVjdihzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSxcXG4rXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcXG4re1xcbitcXHRzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChwc2UtXFx1MDAzZWRldik7XFxuK1xcdGludCB0cmllcywgcmV0O1xcbitcXHR1OCAqYnVmO1xcbitcXG4rXFx0LyogaTJjX21hc3Rlcl9yZWN2KCkgbWF5IERNQSwgc28gcmVhZCBpbnRvIGFuIG9mZi1zdGFjayBidWZmZXIuICovXFxuK1xcdGJ1ZiA9IGttYWxsb2MoUlRQU0VfTUNVX01TR19TSVpFLCBHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFidWYpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0Zm9yICh0cmllcyA9IDA7IHRyaWVzIFxcdTAwM2MgUlRQU0VfTUNVX0kyQ19NQVhfVFJJRVM7IHRyaWVzKyspIHtcXG4rXFx0XFx0aWYgKHRyaWVzIFxcdTAwM2UgMClcXG4rXFx0XFx0XFx0bXNsZWVwKFJUUFNFX01DVV9JMkNfUkVUUllfTVMpO1xcbitcXG4rXFx0XFx0cmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgYnVmLCBSVFBTRV9NQ1VfTVNHX1NJWkUpO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGlmIChyZXQgPT0gUlRQU0VfTUNVX01TR19TSVpFKSB7XFxuK1xcdFxcdFxcdG1lbWNweShyZXNwLCBidWYsIFJUUFNFX01DVV9NU0dfU0laRSk7XFxuK1xcdFxcdFxcdGlmIChydHBzZV9tY3VfcmVzcF9pc19maW5hbChyZXEsIHJlc3ApKSB7XFxuK1xcdFxcdFxcdFxcdHJldCA9IDA7XFxuK1xcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRyZXQgPSAtRVRJTUVET1VUO1xcbitvdXQ6XFxuK1xcdGtmcmVlKGJ1Zik7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X3RyYW5zcG9ydF9vcHMgcnRwc2VfbWN1X2kyY19uYXRpdmVfb3BzID0ge1xcbitcXHQuc2VuZCA9IHJ0cHNlX21jdV9pMmNfbmF0aXZlX3NlbmQsXFxuK1xcdC5yZWN2ID0gcnRwc2VfbWN1X2kyY19uYXRpdmVfcmVjdixcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KVxcbit7XFxuK1xcdHN0cnVjdCBkZXZpY2UgKmRldiA9IFxcdTAwMjZjbGllbnQtXFx1MDAzZWRldjtcXG4rXFx0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhICptYXRjaDtcXG4rXFx0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2U7XFxuK1xcdGJvb2wgdXNlX25hdGl2ZTtcXG4rXFxuK1xcdG1hdGNoID0gZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7XFxuK1xcdGlmICghbWF0Y2gpXFxuK1xcdFxcdHJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgLUVOT0RFViwgXFxcIm1pc3NpbmcgbWF0Y2ggZGF0YVxcXFxuXFxcIik7XFxuK1xcbitcXHQvKiBUaGUgZnJhbWluZyAocmF3IEkyQyB2cyBTTUJ1cykgaXMgY2FycmllZCBieSB0aGUgbWF0Y2ggZGF0YS4gKi9cXG4rXFx0dXNlX25hdGl2ZSA9IG1hdGNoLVxcdTAwM2VuYXRpdmVfaTJjO1xcbitcXHRpZiAodXNlX25hdGl2ZSkge1xcbitcXHRcXHRpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC1cXHUwMDNlYWRhcHRlciwgSTJDX0ZVTkNfSTJDKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCAtRU9QTk9UU1VQUCxcXG4rXFx0XFx0XFx0XFx0XFxcInBsYWluLUkyQyBNQ1UgcHJvdG9jb2wgcmVxdWlyZXMgSTJDLWNhcGFibGUgYWRhcHRlclxcXFxuXFxcIik7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdGlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LVxcdTAwM2VhZGFwdGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DSyB8XFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0spKVxcbitcXHRcXHRcXHRyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1FT1BOT1RTVVBQLFxcbitcXHRcXHRcXHRcXHRcXFwiU01CdXMgTUNVIHByb3RvY29sIHJlcXVpcmVzIFNNQnVzIEkyQy1ibG9jayBzdXBwb3J0XFxcXG5cXFwiKTtcXG4rXFx0fVxcbitcXG4rXFx0cHNlID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwc2UpLCBHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFwc2UpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0cHNlLVxcdTAwM2VkZXYgPSBkZXY7XFxuK1xcdHBzZS1cXHUwMDNlcGNkZXYub3duZXIgPSBUSElTX01PRFVMRTtcXG4rXFx0cHNlLVxcdTAwM2V0cmFuc3BvcnQgPSB1c2VfbmF0aXZlID8gXFx1MDAyNnJ0cHNlX21jdV9pMmNfbmF0aXZlX29wcyA6IFxcdTAwMjZydHBzZV9tY3VfaTJjX3NtYnVzX29wcztcXG4rXFxuK1xcdHJldHVybiBydHBzZV9tY3VfcmVnaXN0ZXIocHNlKTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnRwc2VfbWN1X2kyY19vZl9tYXRjaFtdID0ge1xcbitcXHR7IC5jb21wYXRpYmxlID0gXFxcInJlYWx0ZWsscHNlLW1jdS1nZW4xLXNtYnVzXFxcIiwgLmRhdGEgPSBcXHUwMDI2cnRwc2VfbWN1X2dlbjFfZGF0YSB9LFxcbitcXHR7IC5jb21wYXRpYmxlID0gXFxcInJlYWx0ZWsscHNlLW1jdS1nZW4yLXNtYnVzXFxcIiwgLmRhdGEgPSBcXHUwMDI2cnRwc2VfbWN1X2dlbjJfZGF0YSB9LFxcbitcXHR7IC5jb21wYXRpYmxlID0gXFxcInJlYWx0ZWsscHNlLW1jdS1nZW4yLWkyY1xcXCIsIC5kYXRhID0gXFx1MDAyNnJ0cHNlX21jdV9nZW4yX2kyY19kYXRhIH0sXFxuK1xcdHsgLyogc2VudGluZWwgKi8gfVxcbit9O1xcbitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBydHBzZV9tY3VfaTJjX29mX21hdGNoKTtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBydHBzZV9tY3VfaTJjX2RyaXZlciA9IHtcXG4rXFx0LmRyaXZlciA9IHtcXG4rXFx0XFx0Lm5hbWVcXHRcXHQ9IFxcXCJyZWFsdGVrLXBzZS1tY3UtaTJjXFxcIixcXG4rXFx0XFx0Lm9mX21hdGNoX3RhYmxlXFx0PSBydHBzZV9tY3VfaTJjX29mX21hdGNoLFxcbitcXHR9LFxcbitcXHQucHJvYmVcXHRcXHQ9IHJ0cHNlX21jdV9pMmNfcHJvYmUsXFxuK307XFxuK21vZHVsZV9pMmNfZHJpdmVyKHJ0cHNlX21jdV9pMmNfZHJpdmVyKTtcXG4rXFxuK01PRFVMRV9BVVRIT1IoXFxcIkpvbmFzIEplbG9uZWsgXFx1MDAzY2plbG9uZWsuam9uYXNAZ21haWwuY29tXFx1MDAzZVxcXCIpO1xcbitNT0RVTEVfREVTQ1JJUFRJT04oXFxcIlJlYWx0ZWsgUFNFIE1DVSBkcml2ZXIgKEkyQyB0cmFuc3BvcnQpXFxcIik7XFxuK01PRFVMRV9MSUNFTlNFKFxcXCJHUExcXFwiKTtcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS11YXJ0LmMgYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LXVhcnQuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uOWJhYTE3ZDhkMzFmYVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LXVhcnQuY1xcbkBAIC0wLDAgKzEsMTY0IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvY2xlYW51cC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvY29tcGxldGlvbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9vZi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcHNlLXBkL3BzZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2VyZGV2LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zcGlubG9jay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwicmVhbHRlay1wc2UtbWN1LmhcXFwiXFxuK1xcbisjZGVmaW5lIFJUUFNFX01DVV9VQVJUX0JBVURfREVGQVVMVFxcdDE5MjAwXFxuKyNkZWZpbmUgUlRQU0VfTUNVX1VBUlRfVFhfVElNRU9VVFxcdG1zZWNzX3RvX2ppZmZpZXMoMTAwKVxcbisjZGVmaW5lIFJUUFNFX01DVV9VQVJUX1JYX1RJTUVPVVRcXHRtc2Vjc190b19qaWZmaWVzKFJUUFNFX01DVV9SRVNQT05TRV9NQVhfTVMpXFxuK1xcbitzdHJ1Y3QgcnRwc2VfbWN1X3VhcnQge1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgcHNlO1xcbitcXHRzdHJ1Y3Qgc2VyZGV2X2RldmljZSAqc2VyZGV2O1xcbitcXHRzdHJ1Y3QgY29tcGxldGlvbiByeF9kb25lO1xcbitcXHRzcGlubG9ja190IHJ4X2xvY2s7XFx0XFx0LyogcHJvdGVjdHMgcnhfYnVmIGFuZCByeF9sZW4gKi9cXG4rXFx0c2l6ZV90IHJ4X2xlbjtcXG4rXFx0dTggcnhfYnVmW1JUUFNFX01DVV9NU0dfU0laRV07XFxuK307XFxuK1xcbisjZGVmaW5lIHRvX3J0cHNlX21jdV91YXJ0KHApICBjb250YWluZXJfb2YocCwgc3RydWN0IHJ0cHNlX21jdV91YXJ0LCBwc2UpXFxuK1xcbisvKlxcbisgKiBObyBmcmFtaW5nIGlzIGRvbmUgaGVyZTogYSBnbGl0Y2hlZCBmcmFtZSBjb3N0cyBvbmUgdHJhbnNhY3Rpb24sIHRoZW5cXG4rICogdGhlIG5leHQgX3NlbmQgcmUtZnJhbWVzIGZyb20gcnhfbGVuIDAuIFJlc3luYyB3b3JrcyBieSByZXR1cm5pbmcgY291bnRcXG4rICogKG5vdCB0YWtlKSwgZHJvcHBpbmcgYW55IG92ZXJmbG93IHNvIHNlcmRldiBrZWVwcyBubyBsZWZ0b3ZlciB0byBibGVlZFxcbisgKiBpbnRvIHRoZSBuZXh0IGZyYW1lLlxcbisgKi9cXG4rc3RhdGljIHNpemVfdCBydHBzZV9tY3VfdWFydF9yZWNlaXZlKHN0cnVjdCBzZXJkZXZfZGV2aWNlICpzZXJkZXYsXFxuK1xcdFxcdFxcdFxcdCAgICAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KVxcbit7XFxuK1xcdHN0cnVjdCBydHBzZV9tY3VfdWFydCAqY3R4ID0gc2VyZGV2X2RldmljZV9nZXRfZHJ2ZGF0YShzZXJkZXYpO1xcbitcXHRzaXplX3QgdGFrZTtcXG4rXFxuK1xcdHNjb3BlZF9ndWFyZChzcGlubG9ja19pcnFzYXZlLCBcXHUwMDI2Y3R4LVxcdTAwM2VyeF9sb2NrKSB7XFxuK1xcdFxcdHRha2UgPSBtaW4oY291bnQsIHNpemVvZihjdHgtXFx1MDAzZXJ4X2J1ZikgLSBjdHgtXFx1MDAzZXJ4X2xlbik7XFxuK1xcdFxcdGlmICh0YWtlKSB7XFxuK1xcdFxcdFxcdG1lbWNweShjdHgtXFx1MDAzZXJ4X2J1ZiArIGN0eC1cXHUwMDNlcnhfbGVuLCBidWYsIHRha2UpO1xcbitcXHRcXHRcXHRjdHgtXFx1MDAzZXJ4X2xlbiArPSB0YWtlO1xcbitcXHRcXHRcXHRpZiAoY3R4LVxcdTAwM2VyeF9sZW4gPT0gc2l6ZW9mKGN0eC1cXHUwMDNlcnhfYnVmKSlcXG4rXFx0XFx0XFx0XFx0Y29tcGxldGUoXFx1MDAyNmN0eC1cXHUwMDNlcnhfZG9uZSk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0LyogY29uc3VtZSBhbGwgdG8gYXZvaWQgZGVzeW5jL21pc2FsaWdubWVudCAqL1xcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VyZGV2X2RldmljZV9vcHMgcnRwc2VfbWN1X3VhcnRfc2VyZGV2X29wcyA9IHtcXG4rXFx0LnJlY2VpdmVfYnVmID0gcnRwc2VfbWN1X3VhcnRfcmVjZWl2ZSxcXG4rXFx0LndyaXRlX3dha2V1cCA9IHNlcmRldl9kZXZpY2Vfd3JpdGVfd2FrZXVwLFxcbit9O1xcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfdWFydF9zZW5kKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxKVxcbit7XFxuK1xcdHN0cnVjdCBydHBzZV9tY3VfdWFydCAqY3R4ID0gdG9fcnRwc2VfbWN1X3VhcnQocHNlKTtcXG4rXFx0aW50IHdyaXR0ZW47XFxuK1xcbitcXHQvKiBjbGVhciBhbnkgbGVmdG92ZXIgcnggc3RhdGUgYmVmb3JlIHRyYW5zbWl0dGluZyAqL1xcbitcXHRzY29wZWRfZ3VhcmQoc3BpbmxvY2tfaXJxc2F2ZSwgXFx1MDAyNmN0eC1cXHUwMDNlcnhfbG9jaykge1xcbitcXHRcXHRyZWluaXRfY29tcGxldGlvbihcXHUwMDI2Y3R4LVxcdTAwM2VyeF9kb25lKTtcXG4rXFx0XFx0Y3R4LVxcdTAwM2VyeF9sZW4gPSAwO1xcbitcXHR9XFxuK1xcbitcXHR3cml0dGVuID0gc2VyZGV2X2RldmljZV93cml0ZShjdHgtXFx1MDAzZXNlcmRldiwgKGNvbnN0IHU4ICopcmVxLCBzaXplb2YoKnJlcSksXFxuK1xcdFxcdFxcdFxcdCAgICAgIFJUUFNFX01DVV9VQVJUX1RYX1RJTUVPVVQpO1xcbitcXHRpZiAod3JpdHRlbiBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiB3cml0dGVuO1xcbitcXHRpZiAod3JpdHRlbiAhPSBzaXplb2YoKnJlcSkpXFxuK1xcdFxcdHJldHVybiAtRUlPO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X3VhcnRfcmVjdihzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSxcXG4rXFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEsXFxuK1xcdFxcdFxcdCAgICAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcXG4re1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X3VhcnQgKmN0eCA9IHRvX3J0cHNlX21jdV91YXJ0KHBzZSk7XFxuK1xcbitcXHRpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dChcXHUwMDI2Y3R4LVxcdTAwM2VyeF9kb25lLCBSVFBTRV9NQ1VfVUFSVF9SWF9USU1FT1VUKSlcXG4rXFx0XFx0cmV0dXJuIC1FVElNRURPVVQ7XFxuK1xcbitcXHRzY29wZWRfZ3VhcmQoc3BpbmxvY2tfaXJxc2F2ZSwgXFx1MDAyNmN0eC1cXHUwMDNlcnhfbG9jaykge1xcbitcXHRcXHRpZiAoY3R4LVxcdTAwM2VyeF9sZW4gIT0gc2l6ZW9mKCpyZXNwKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuK1xcbitcXHRcXHRtZW1jcHkocmVzcCwgY3R4LVxcdTAwM2VyeF9idWYsIHNpemVvZigqcmVzcCkpO1xcbitcXHR9XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV90cmFuc3BvcnRfb3BzIHJ0cHNlX21jdV91YXJ0X3RyYW5zcG9ydF9vcHMgPSB7XFxuK1xcdC5zZW5kID0gcnRwc2VfbWN1X3VhcnRfc2VuZCxcXG4rXFx0LnJlY3YgPSBydHBzZV9tY3VfdWFydF9yZWN2LFxcbit9O1xcbitcXG4rc3RhdGljIGludCBydHBzZV9tY3VfdWFydF9wcm9iZShzdHJ1Y3Qgc2VyZGV2X2RldmljZSAqc2VyZGV2KVxcbit7XFxuK1xcdHUzMiBzcGVlZCA9IFJUUFNFX01DVV9VQVJUX0JBVURfREVGQVVMVDtcXG4rXFx0c3RydWN0IGRldmljZSAqZGV2ID0gXFx1MDAyNnNlcmRldi1cXHUwMDNlZGV2O1xcbitcXHRzdHJ1Y3QgcnRwc2VfbWN1X3VhcnQgKmN0eDtcXG4rXFx0dW5zaWduZWQgaW50IGJhdWQ7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRjdHggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpO1xcbitcXHRpZiAoIWN0eClcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcbitcXHRjdHgtXFx1MDAzZXNlcmRldiA9IHNlcmRldjtcXG4rXFx0Y3R4LVxcdTAwM2Vwc2UuZGV2ID0gZGV2O1xcbitcXHRjdHgtXFx1MDAzZXBzZS5wY2Rldi5vd25lciA9IFRISVNfTU9EVUxFO1xcbitcXHRjdHgtXFx1MDAzZXBzZS50cmFuc3BvcnQgPSBcXHUwMDI2cnRwc2VfbWN1X3VhcnRfdHJhbnNwb3J0X29wcztcXG4rXFx0aW5pdF9jb21wbGV0aW9uKFxcdTAwMjZjdHgtXFx1MDAzZXJ4X2RvbmUpO1xcbitcXHRzcGluX2xvY2tfaW5pdChcXHUwMDI2Y3R4LVxcdTAwM2VyeF9sb2NrKTtcXG4rXFxuK1xcdHNlcmRldl9kZXZpY2Vfc2V0X2RydmRhdGEoc2VyZGV2LCBjdHgpO1xcbitcXHRzZXJkZXZfZGV2aWNlX3NldF9jbGllbnRfb3BzKHNlcmRldiwgXFx1MDAyNnJ0cHNlX21jdV91YXJ0X3NlcmRldl9vcHMpO1xcbitcXG4rXFx0cmV0ID0gZGV2bV9zZXJkZXZfZGV2aWNlX29wZW4oZGV2LCBzZXJkZXYpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIHJldCwgXFxcImZhaWxlZCB0byBvcGVuIHNlcmRldlxcXFxuXFxcIik7XFxuK1xcbitcXHRmd25vZGVfcHJvcGVydHlfcmVhZF91MzIoZGV2X2Z3bm9kZShkZXYpLCBcXFwiY3VycmVudC1zcGVlZFxcXCIsIFxcdTAwMjZzcGVlZCk7XFxuK1xcbitcXHRiYXVkID0gc2VyZGV2X2RldmljZV9zZXRfYmF1ZHJhdGUoc2VyZGV2LCBzcGVlZCk7XFxuK1xcdGlmIChiYXVkICE9IHNwZWVkKVxcbitcXHRcXHRkZXZfd2FybihkZXYsIFxcXCJjb3VsZCBub3Qgc2V0IGJhdWRyYXRlICV1LCBjb250cm9sbGVyIHVzZXMgJXVcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCBzcGVlZCwgYmF1ZCk7XFxuK1xcbitcXHRzZXJkZXZfZGV2aWNlX3NldF9mbG93X2NvbnRyb2woc2VyZGV2LCBmYWxzZSk7XFxuK1xcbitcXHRyZXQgPSBzZXJkZXZfZGV2aWNlX3NldF9wYXJpdHkoc2VyZGV2LCBTRVJERVZfUEFSSVRZX05PTkUpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRkZXZfd2FybihkZXYsIFxcXCJjb3VsZCBub3Qgc2V0IHBhcml0eSB0byBub25lOiAlZFxcXFxuXFxcIiwgcmV0KTtcXG4rXFxuK1xcdHJldHVybiBydHBzZV9tY3VfcmVnaXN0ZXIoXFx1MDAyNmN0eC1cXHUwMDNlcHNlKTtcXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnRwc2VfbWN1X3VhcnRfb2ZfbWF0Y2hbXSA9IHtcXG4rXFx0eyAuY29tcGF0aWJsZSA9IFxcXCJyZWFsdGVrLHBzZS1tY3UtZ2VuMVxcXCIsIC5kYXRhID0gXFx1MDAyNnJ0cHNlX21jdV9nZW4xX2RhdGEgfSxcXG4rXFx0eyAuY29tcGF0aWJsZSA9IFxcXCJyZWFsdGVrLHBzZS1tY3UtZ2VuMlxcXCIsIC5kYXRhID0gXFx1MDAyNnJ0cHNlX21jdV9nZW4yX2RhdGEgfSxcXG4rXFx0eyAvKiBzZW50aW5lbCAqLyB9XFxuK307XFxuK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJ0cHNlX21jdV91YXJ0X29mX21hdGNoKTtcXG4rXFxuK3N0YXRpYyBzdHJ1Y3Qgc2VyZGV2X2RldmljZV9kcml2ZXIgcnRwc2VfbWN1X3VhcnRfZHJpdmVyID0ge1xcbitcXHQuZHJpdmVyID0ge1xcbitcXHRcXHQubmFtZSA9IFxcXCJyZWFsdGVrLXBzZS1tY3UtdWFydFxcXCIsXFxuK1xcdFxcdC5vZl9tYXRjaF90YWJsZSA9IHJ0cHNlX21jdV91YXJ0X29mX21hdGNoLFxcbitcXHR9LFxcbitcXHQucHJvYmUgID0gcnRwc2VfbWN1X3VhcnRfcHJvYmUsXFxuK307XFxuK21vZHVsZV9zZXJkZXZfZGV2aWNlX2RyaXZlcihydHBzZV9tY3VfdWFydF9kcml2ZXIpO1xcbitcXG4rTU9EVUxFX0FVVEhPUihcXFwiSm9uYXMgSmVsb25layBcXHUwMDNjamVsb25lay5qb25hc0BnbWFpbC5jb21cXHUwMDNlXFxcIik7XFxuK01PRFVMRV9ERVNDUklQVElPTihcXFwiUmVhbHRlayBQU0UgTUNVIGRyaXZlciAoVUFSVCB0cmFuc3BvcnQpXFxcIik7XFxuK01PRFVMRV9MSUNFTlNFKFxcXCJHUExcXFwiKTtcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS5oIGIvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi41MmY5NDQyZDcxMTdjXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UuaFxcbkBAIC0wLDAgKzEsOTMgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIgKi9cXG4rXFxuKyNpZm5kZWYgX1JFQUxURUtfUFNFX01DVV9IXFxuKyNkZWZpbmUgX1JFQUxURUtfUFNFX01DVV9IXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbXV0ZXguaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BzZS1wZC9wc2UuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuK1xcbisvKlxcbisgKiBUaW1lIHRoZSBNQ1UgaXRzZWxmIG5lZWRzIGJldHdlZW4gYWNjZXB0aW5nIGEgcmVxdWVzdCBhbmQgaGF2aW5nIGFcXG4rICogcmVzcG9uc2UgcmVhZHkuIFRoZXNlIGFyZSBwcm9wZXJ0aWVzIG9mIHRoZSBNQ1UgZmlybXdhcmUsIG5vdCBvZiB0aGVcXG4rICogdW5kZXJseWluZyB0cmFuc3BvcnQ6IHRoZSBjb3JlIHBhY2VzIHRyYW5zYWN0aW9ucyBieSBSVFBTRV9NQ1VfUkVTUE9OU0VfTVNcXG4rICogYW5kIGJvdGggdHJhbnNwb3J0cyBzaXplIHRoZWlyIHBlci10cmFuc2FjdGlvbiByZWN2IGNlaWxpbmcgZnJvbVxcbisgKiBSVFBTRV9NQ1VfUkVTUE9OU0VfTUFYX01TLCBzaW5jZSBzb21lIGNvbW1hbmRzIGFyZSBkb2N1bWVudGVkIGFzXFxuKyAqIG5lZWRpbmcgdXAgdG8gfjFzIHRvIHByb2R1Y2UgYSByZXBseS5cXG4rICovXFxuKyNkZWZpbmUgUlRQU0VfTUNVX1JFU1BPTlNFX01TXFx0XFx0XFx0MjVcXG4rI2RlZmluZSBSVFBTRV9NQ1VfUkVTUE9OU0VfTUFYX01TXFx0XFx0MTAwMFxcbitcXG4rLypcXG4rICogVG90YWwgdGltZSB0byBrZWVwIHJldHJ5aW5nIHRoZSBmaXJzdCBNQ1UgcmVhZCBhdCBwcm9iZSwgYW5kIHRoZSBwYXVzZVxcbisgKiBiZXR3ZWVuIGF0dGVtcHRzLiBSaWdodCBhZnRlciByZXNldC1ncGlvcyBpcyBkZWFzc2VydGVkIHRoZSBNQ1UgbWF5IG5vdFxcbisgKiBhbnN3ZXIgb24gdGhlIGJ1cyB5ZXQ7IGdpdmUgaXQgYSBib3VuZGVkIHdpbmRvdyB0byBjb21lIHVwIGJlZm9yZVxcbisgKiBkZWNsYXJpbmcgdGhlIHByb2JlIGZhaWxlZC5cXG4rICovXFxuKyNkZWZpbmUgUlRQU0VfTUNVX0JPT1RfVElNRU9VVF9NU1xcdFxcdDMwMDBcXG4rI2RlZmluZSBSVFBTRV9NQ1VfQk9PVF9SRVRSWV9NU1xcdFxcdFxcdDEwMFxcbitcXG4rI2RlZmluZSBSVFBTRV9NQ1VfTVNHX1NJWkVcXHRcXHRcXHQxMlxcbitcXG4rc3RydWN0IHJ0cHNlX21jdV9tc2cge1xcbitcXHR1OCBvcGNvZGU7XFxuK1xcdHU4IHNlcV9udW07XFxuK1xcdHU4IHBheWxvYWRbOV07XFxuK1xcdHU4IGNoZWNrc3VtO1xcbit9IF9fcGFja2VkO1xcbitcXG4rLypcXG4rICogTUNVIHN0YXR1cyBvcGNvZGVzIChzZWVuIG9uIHRoZSBHZW4xIGRpYWxlY3Q7IEdlbjIgbmV2ZXIgZW1pdHMgdGhlbSkuXFxuKyAqIElOQ09NUExFVEUvQkFEX0NTVU0gYXJlIHRlcm1pbmFsOyBOT1RfUkVBRFkgaXMgdHJhbnNpZW50LlxcbisgKi9cXG4rI2RlZmluZSBSVFBTRV9NQ1VfT1BDT0RFX0lOQ09NUExFVEVcXHRcXHQweGZkXFx0LyogLUVCQURFICAgKi9cXG4rI2RlZmluZSBSVFBTRV9NQ1VfT1BDT0RFX0JBRF9DU1VNXFx0XFx0MHhmZVxcdC8qIC1FQkFETVNHICovXFxuKyNkZWZpbmUgUlRQU0VfTUNVX09QQ09ERV9OT1RfUkVBRFlcXHRcXHQweGZmXFx0LyogLUVBR0FJTiAgKi9cXG4rXFxuKy8qXFxuKyAqIEEgcG9sbGluZyB0cmFuc3BvcnQgY2FuIHN0b3AgaGVyZTogdGhlIHJlcGx5IHRvIHRoaXMgcmVxdWVzdCAob3Bjb2RlIGFuZFxcbisgKiBzZXFfbnVtKSwgb3IgYSB0ZXJtaW5hbCBlcnJvci4gVGhlIHNlcV9udW0gcmVqZWN0cyBhIHN0YWxlIHJlcGx5IGxlZnQgYnkgYW5cXG4rICogYWJhbmRvbmVkIHRyYW5zYWN0aW9uLCBpbnN0ZWFkIG9mIGRlc3luY2luZyBieSBvbmUgZnJhbWUuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGJvb2wgcnRwc2VfbWN1X3Jlc3BfaXNfZmluYWwoY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlc3ApXFxuK3tcXG4rXFx0cmV0dXJuIChyZXNwLVxcdTAwM2VvcGNvZGUgPT0gcmVxLVxcdTAwM2VvcGNvZGUgXFx1MDAyNlxcdTAwMjYgcmVzcC1cXHUwMDNlc2VxX251bSA9PSByZXEtXFx1MDAzZXNlcV9udW0pIHx8XFxuK1xcdCAgICAgICByZXNwLVxcdTAwM2VvcGNvZGUgPT0gUlRQU0VfTUNVX09QQ09ERV9JTkNPTVBMRVRFIHx8XFxuK1xcdCAgICAgICByZXNwLVxcdTAwM2VvcGNvZGUgPT0gUlRQU0VfTUNVX09QQ09ERV9CQURfQ1NVTTtcXG4rfVxcbitcXG4rLyogT3BhcXVlIHRvIHRyYW5zcG9ydHM7IGRlZmluZWQgaW4gcmVhbHRlay1wc2UtbWN1LWNvcmUuYy4gKi9cXG4rc3RydWN0IHJ0cHNlX21jdV9kaWFsZWN0O1xcbitzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbztcXG4rc3RydWN0IHJ0cHNlX21jdV9jdHJsO1xcbitcXG4rLyogUGVyLWNvbXBhdGlibGUgbWF0Y2ggZGF0YSAodGhlIG9mX21hdGNoIC5kYXRhKS4gKi9cXG4rc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhIHtcXG4rXFx0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9kaWFsZWN0ICpkaWFsZWN0O1xcbitcXHRib29sIG5hdGl2ZV9pMmM7XFx0LyogcmF3LUkyQyBmcmFtaW5nICh2cyBTTUJ1cyk7IEkyQyB0cmFuc3BvcnQgb25seSAqL1xcbit9O1xcbitcXG4rc3RydWN0IHJ0cHNlX21jdV90cmFuc3BvcnRfb3BzIHtcXG4rXFx0aW50ICgqc2VuZCkoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEpO1xcbitcXHRpbnQgKCpyZWN2KShzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSxcXG4rXFx0XFx0ICAgIHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXNwKTtcXG4rfTtcXG4rXFxuK3N0cnVjdCBydHBzZV9tY3VfY3RybCB7XFxuK1xcdHN0cnVjdCBkZXZpY2UgKmRldjtcXG4rXFx0c3RydWN0IHBzZV9jb250cm9sbGVyX2RldiBwY2RldjtcXG4rXFx0c3RydWN0IG11dGV4IG11dGV4O1xcdC8qIHNlcmlhbGl6ZXMgTUNVIHJlcXVlc3QvcmVzcG9uc2UgdHJhbnNhY3Rpb25zICovXFxuK1xcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfZGlhbGVjdCAqZGlhbGVjdDtcXG4rXFx0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gKmNoaXA7XFxuK1xcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfdHJhbnNwb3J0X29wcyAqdHJhbnNwb3J0O1xcbitcXHR1OCBzZXE7XFx0XFx0XFx0Lyogcm9sbGluZyByZXF1ZXN0IHNlcV9udW0sIGVjaG9lZCBieSB0aGUgTUNVICovXFxuK307XFxuK1xcbitpbnQgcnRwc2VfbWN1X3JlZ2lzdGVyKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlKTtcXG4rXFxuK2V4dGVybiBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21hdGNoX2RhdGEgcnRwc2VfbWN1X2dlbjFfZGF0YTtcXG4rZXh0ZXJuIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMl9kYXRhO1xcbitleHRlcm4gY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhIHJ0cHNlX21jdV9nZW4yX2kyY19kYXRhO1xcbitcXG4rI2VuZGlmXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ3OjM5LjczMzQwMzczMVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjIwMDg1Mjc1MjQ2OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBJMkMgYW5kIFVBUlQgKHNlcmRldikgZHJpdmVyIGZvciBSZWFsdGVrIFBTRSBNQ1VzLiBUaGUgSTJDIGRyaXZlciByZWxpZXMgb24gYGRldmljZV9nZXRfbWF0Y2hfZGF0YSgpYCBpbiBpdHMgcHJvYmUgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgTlVMTCBmb3IgZGV2aWNlcyBpbnN0YW50aWF0ZWQgZHluYW1pY2FsbHkgdmlhIHN5c2ZzIGBuZXdfZGV2aWNlYCBiZWNhdXNlIHRoZXkgbGFjayBhIGZpcm13YXJlIG5vZGUgKGZ3bm9kZSkuIFdpdGhvdXQgYW4gYGlkX3RhYmxlYCBmYWxsYmFjaywgdGhlIHByb2JlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGZhaWwgd2l0aCAtRU5PREVWIHdoZW4gaW5zdGFudGlhdGVkIHZpYSBzeXNmcy4gRnVydGhlcm1vcmUsIHNlcmRldiBkZXZpY2VzIGNhbm5vdCBiZSBkeW5hbWljYWxseSBpbnN0YW50aWF0ZWQgdmlhIHN5c2ZzIGF0IGFsbC4gU2luY2Ugc3l6a2FsbGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGluamVjdCBEZXZpY2UgVHJlZSBub2RlcyBvciBzb2Z0d2FyZSBub2RlcyBmb3IgYXJiaXRyYXJ5IEkyQy9zZXJkZXYgZGV2aWNlcywgdGhpcyBkcml2ZXIgY2Fubm90IGJlIHN1Y2Nlc3NmdWxseSBwcm9iZWQgYW5kIGl0cyBjb3JlIGxvZ2ljIGlzIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgUUVNVS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGI3YzkxZTIwZjNmOTJiOThkZDJhZGRlZmQxN2UxN2E0NzQxZTE0MGZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEp1bCAyOSAwNTo0NzozNyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcHNlLXBkL3JlYWx0ZWsscHNlLW1jdS1nZW4xLnlhbWwgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3BzZS1wZC9yZWFsdGVrLHBzZS1tY3UtZ2VuMS55YW1sXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMGYxYTgxOWRiNDliYlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9wc2UtcGQvcmVhbHRlayxwc2UtbWN1LWdlbjEueWFtbFxuQEAgLTAsMCArMSwxODAgQEBcbisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiAoR1BMLTIuMC1vbmx5IE9SIEJTRC0yLUNsYXVzZSlcbislWUFNTCAxLjJcbistLS1cbiskaWQ6IGh0dHA6Ly9kZXZpY2V0cmVlLm9yZy9zY2hlbWFzL25ldC9wc2UtcGQvcmVhbHRlayxwc2UtbWN1LWdlbjEueWFtbCNcbiskc2NoZW1hOiBodHRwOi8vZGV2aWNldHJlZS5vcmcvbWV0YS1zY2hlbWFzL2NvcmUueWFtbCNcbitcbit0aXRsZTogUmVhbHRlayBQU0UgTUNVXG4rXG4rbWFpbnRhaW5lcnM6XG4rICAtIEpvbmFzIEplbG9uZWsgXHUwMDNjamVsb25lay5qb25hc0BnbWFpbC5jb21cdTAwM2VcbitcbitkZXNjcmlwdGlvbjogfFxuKyAgQSBtaWNyb2NvbnRyb2xsZXIgKE1DVSkgdGhhdCBtYW5hZ2VzIHRoZSBQU0UgKFBvd2VyIFNvdXJjaW5nIEVxdWlwbWVudClcbisgIGhhcmR3YXJlIG9uIGEgcmFuZ2Ugb2YgbWFuYWdlZCBQb0Ugc3dpdGNoZXMuIFRoZSBob3N0IENQVSB0YWxrcyBvbmx5IHRvXG4rICB0aGlzIE1DVSAtIG92ZXIgSTJDL1NNQnVzIG9yIFVBUlQgLSB1c2luZyBhIHNtYWxsIG1lc3NhZ2UtYmFzZWQgcHJvdG9jb2w7XG4rICB0aGUgUFNFIHNpbGljb24gaXQgZHJpdmVzIHNpdHMgYmVoaW5kIHRoZSBNQ1UgYW5kIGlzIG5ldmVyIGFjY2Vzc2VkXG4rICBkaXJlY3RseS4gRm9yIGV4YW1wbGUsIG9uIHRoZSBaeXhlbCBHUzE5MDAtMTBIUCB0aGUgU29DIHJlYWNoZXMgdGhlIE1DVVxuKyAgb3ZlciBVQVJULCBhbmQgdGhlIE1DVSBtYW5hZ2VzIHRoZSBvbi1ib2FyZCBQU0UgY2hpcC5cbitcbisgIFRoaXMgYmluZGluZyBkZXNjcmliZXMgdGhlIE1DVSB0b2dldGhlciB3aXRoIGl0cyBSZWFsdGVrIGZpcm13YXJlOiB0aGVcbisgIGZpcm13YXJlIGFuZCBpdHMgaG9zdCBwcm90b2NvbCwgd2hpY2ggYXJlIHN0YWJsZSBhY3Jvc3MgYm9hcmRzLiBUaGVcbisgIG1pY3JvY29udHJvbGxlciBzaWxpY29uIGlzIGEgZ2VuZXJhbC1wdXJwb3NlIHBhcnQgdGhhdCB2YXJpZXMsIGFuZCB0aGVcbisgIFBTRSBzaWxpY29uIGJlaGluZCB0aGUgTUNVIChSZWFsdGVrIFJUTDgyM3gvUlRMODIzOSogb3IgQnJvYWRjb21cbisgIEJDTTU5eHh4KSBpcyByZXBvcnRlZCBieSB0aGUgTUNVIGFuZCBkZXRlY3RlZCBhdCBydW50aW1lIC0gbmVpdGhlciBpc1xuKyAgbmFtZWQgaGVyZS5cbitcbisgIFR3byBwcm90b2NvbCBnZW5lcmF0aW9ucyBleGlzdCwgYm90aCBSZWFsdGVrJ3M6XG4rICAgIGdlbjEgIG9sZGVyIGJvYXJkcywgd2hlcmUgdGhlIE1DVSBmcm9udHMgQnJvYWRjb20gUFNFIHNpbGljb25cbisgICAgZ2VuMiAgdGhlIGFsdGVyZWQgcHJvdG9jb2wgdXNlZCB3aXRoIFJlYWx0ZWsncyBvd24gUFNFIHNpbGljb25cbitcbisgIE9uIGFuIEkyQyBhdHRhY2htZW50IHRoZSBmcmFtaW5nIHRoZSBNQ1UgZmlybXdhcmUgZXhwZWN0cyBpcyBwYXJ0IG9mIHRoZVxuKyAgY29tcGF0aWJsZTogJy1zbWJ1cycgKHJlYWRzIGNhcnJ5IGEgbGVhZGluZyBjb21tYW5kIGJ5dGUgYW5kIGEgcmVwZWF0ZWRcbisgIHN0YXJ0KSBvciAnLWkyYycgKGJhcmUgYmxvY2sgd3JpdGVzIGFuZCByZWFkcykuIEEgVUFSVCBhdHRhY2htZW50IGNhcnJpZXNcbisgIG5vIGZyYW1pbmcgc3VmZml4OyB0aGUgdHJhbnNwb3J0IGlzIGdpdmVuIGJ5IHRoZSBwYXJlbnQgJ3NlcmlhbCcgbm9kZS5cbitcbisgIEVhY2ggYm9hcmQgYWRkaXRpb25hbGx5IGNhcnJpZXMgYSBkZXZpY2Utc3BlY2lmaWMgY29tcGF0aWJsZSB0aGF0IGZhbGxzXG4rICBiYWNrIHRvIG9uZSBvZiB0aGUgcHJvdG9jb2wgY29tcGF0aWJsZXMgYWJvdmUuIERyaXZlcnMgYmluZCBvbiB0aGVcbisgIHByb3RvY29sIGNvbXBhdGlibGU7IHRoZSBkZXZpY2Utc3BlY2lmaWMgc3RyaW5nIGlkZW50aWZpZXMgdGhlIGJvYXJkIGFuZFxuKyAgcmVzZXJ2ZXMgYSBwbGFjZSBmb3IgYSBmdXR1cmUgcGVyLWJvYXJkIHF1aXJrIHdpdGhvdXQgaGF2aW5nIHRvIHJldHJvZml0XG4rICBkZXZpY2UgdHJlZXMgYWxyZWFkeSBpbiB0aGUgZmllbGQuXG4rXG4rcHJvcGVydGllczpcbisgIGNvbXBhdGlibGU6XG4rICAgIG9uZU9mOlxuKyAgICAgICMgVUFSVFxuKyAgICAgIC0gaXRlbXM6XG4rICAgICAgICAgIC0gZW51bTpcbisgICAgICAgICAgICAgIC0genl4ZWwsZ3MxOTAwLTEwaHAtYTEtcHNlXG4rICAgICAgICAgIC0gY29uc3Q6IHJlYWx0ZWsscHNlLW1jdS1nZW4xXG4rXG4rICAgICAgIyBJMkMsIFNNQnVzIGZyYW1pbmdcbisgICAgICAtIGl0ZW1zOlxuKyAgICAgICAgICAtIGVudW06XG4rICAgICAgICAgICAgICAtIHp5eGVsLGdzMTkyMC0yNGhwLXYyLXBzZVxuKyAgICAgICAgICAtIGNvbnN0OiByZWFsdGVrLHBzZS1tY3UtZ2VuMS1zbWJ1c1xuK1xuKyAgICAgICMgVUFSVFxuKyAgICAgIC0gaXRlbXM6XG4rICAgICAgICAgIC0gZW51bTpcbisgICAgICAgICAgICAgIC0genl4ZWwsZ3MxOTAwLTEwaHAtYjEtcHNlXG4rICAgICAgICAgICAgICAtIHp5eGVsLHhtZzE5MTUtMTBlcC1wc2VcbisgICAgICAgICAgLSBjb25zdDogcmVhbHRlayxwc2UtbWN1LWdlbjJcbitcbisgICAgICAjIEkyQywgU01CdXMgZnJhbWluZ1xuKyAgICAgIC0gaXRlbXM6XG4rICAgICAgICAgIC0gZW51bTpcbisgICAgICAgICAgICAgIC0genl4ZWwseHMxOTMwLTEyaHAtcHNlXG4rICAgICAgICAgIC0gY29uc3Q6IHJlYWx0ZWsscHNlLW1jdS1nZW4yLXNtYnVzXG4rXG4rICAgICAgIyBJMkMsIHJhdyBmcmFtaW5nXG4rICAgICAgLSBpdGVtczpcbisgICAgICAgICAgLSBlbnVtOlxuKyAgICAgICAgICAgICAgLSBsaW5rc3lzLGxnczMyOG1wYy12Mi1wc2VcbisgICAgICAgICAgLSBjb25zdDogcmVhbHRlayxwc2UtbWN1LWdlbjItaTJjXG4rXG4rICByZWc6XG4rICAgIG1heEl0ZW1zOiAxXG4rXG4rICByZXNldC1ncGlvczpcbisgICAgZGVzY3JpcHRpb246IFJlc2V0IGxpbmUgb2YgdGhlIE1DVS5cbisgICAgbWF4SXRlbXM6IDFcbitcbisgIGRpc2FibGUtcG9ydHMtZ3Bpb3M6XG4rICAgIGRlc2NyaXB0aW9uOlxuKyAgICAgIEhhcmR3YXJlIGdhdGUgdGhhdCBmb3JjZXMgYWxsIHBvcnRzIGludG8gYWRtaW4tZGlzYWJsZWQgc3RhdGUgd2hpbGVcbisgICAgICBhc3NlcnRlZC5cbisgICAgbWF4SXRlbXM6IDFcbitcbityZXF1aXJlZDpcbisgIC0gY29tcGF0aWJsZVxuK1xuK2FsbE9mOlxuKyAgLSAkcmVmOiBwc2UtY29udHJvbGxlci55YW1sI1xuKyAgLSAkcmVmOiAvc2NoZW1hcy9zZXJpYWwvc2VyaWFsLXBlcmlwaGVyYWwtcHJvcHMueWFtbCNcbisgICMgQSAnLXNtYnVzJy8nLWkyYycgY29tcGF0aWJsZSBpcyBhbiBJMkMgYXR0YWNobWVudDogaXQgaGFzICdyZWcnIGFuZFxuKyAgIyBjYW5ub3QgY2Fycnkgc2VyaWFsIGJ1cyBwcm9wZXJ0aWVzLiBBIGJhcmUgZ2VuIGNvbXBhdGlibGUgaXMgYSBVQVJUXG4rICAjIGF0dGFjaG1lbnQ6IG5vICdyZWcnLCB0aGUgdHJhbnNwb3J0IGNvbWVzIGZyb20gdGhlIHBhcmVudCBzZXJpYWwgbm9kZS5cbisgIC0gaWY6XG4rICAgICAgcHJvcGVydGllczpcbisgICAgICAgIGNvbXBhdGlibGU6XG4rICAgICAgICAgIGNvbnRhaW5zOlxuKyAgICAgICAgICAgIGVudW06XG4rICAgICAgICAgICAgICAtIHJlYWx0ZWsscHNlLW1jdS1nZW4xLXNtYnVzXG4rICAgICAgICAgICAgICAtIHJlYWx0ZWsscHNlLW1jdS1nZW4yLXNtYnVzXG4rICAgICAgICAgICAgICAtIHJlYWx0ZWsscHNlLW1jdS1nZW4yLWkyY1xuKyAgICB0aGVuOlxuKyAgICAgIHJlcXVpcmVkOlxuKyAgICAgICAgLSByZWdcbisgICAgICBwcm9wZXJ0aWVzOlxuKyAgICAgICAgY3VycmVudC1zcGVlZDogZmFsc2VcbisgICAgICAgIG1heC1zcGVlZDogZmFsc2VcbisgICAgZWxzZTpcbisgICAgICBwcm9wZXJ0aWVzOlxuKyAgICAgICAgcmVnOiBmYWxzZVxuK1xuK3VuZXZhbHVhdGVkUHJvcGVydGllczogZmFsc2VcbitcbitleGFtcGxlczpcbisgICMgU01CdXMtZnJhbWVkIEkyQyBhdHRhY2htZW50XG4rICAtIHxcbisgICAgaTJjIHtcbisgICAgICAgICNhZGRyZXNzLWNlbGxzID0gXHUwMDNjMVx1MDAzZTtcbisgICAgICAgICNzaXplLWNlbGxzID0gXHUwMDNjMFx1MDAzZTtcbitcbisgICAgICAgIGV0aGVybmV0LXBzZUAyMCB7XG4rICAgICAgICAgICAgY29tcGF0aWJsZSA9IFwienl4ZWwseHMxOTMwLTEyaHAtcHNlXCIsIFwicmVhbHRlayxwc2UtbWN1LWdlbjItc21idXNcIjtcbisgICAgICAgICAgICByZWcgPSBcdTAwM2MweDIwXHUwMDNlO1xuK1xuKyAgICAgICAgICAgIHBzZS1waXMge1xuKyAgICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IFx1MDAzYzFcdTAwM2U7XG4rICAgICAgICAgICAgICAgICNzaXplLWNlbGxzID0gXHUwMDNjMFx1MDAzZTtcbitcbisgICAgICAgICAgICAgICAgcHNlLXBpQDAge1xuKyAgICAgICAgICAgICAgICAgICAgcmVnID0gXHUwMDNjMFx1MDAzZTtcbisgICAgICAgICAgICAgICAgICAgICNwc2UtY2VsbHMgPSBcdTAwM2MwXHUwMDNlO1xuKyAgICAgICAgICAgICAgICB9O1xuKyAgICAgICAgICAgIH07XG4rICAgICAgICB9O1xuKyAgICB9O1xuK1xuKyAgIyBSYXctSTJDLWZyYW1lZCBhdHRhY2htZW50XG4rICAtIHxcbisgICAgaTJjIHtcbisgICAgICAgICNhZGRyZXNzLWNlbGxzID0gXHUwMDNjMVx1MDAzZTtcbisgICAgICAgICNzaXplLWNlbGxzID0gXHUwMDNjMFx1MDAzZTtcbitcbisgICAgICAgIGV0aGVybmV0LXBzZUAyMCB7XG4rICAgICAgICAgICAgY29tcGF0aWJsZSA9IFwibGlua3N5cyxsZ3MzMjhtcGMtdjItcHNlXCIsIFwicmVhbHRlayxwc2UtbWN1LWdlbjItaTJjXCI7XG4rICAgICAgICAgICAgcmVnID0gXHUwMDNjMHgyMFx1MDAzZTtcbitcbisgICAgICAgICAgICBwc2UtcGlzIHtcbisgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSBcdTAwM2MxXHUwMDNlO1xuKyAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IFx1MDAzYzBcdTAwM2U7XG4rXG4rICAgICAgICAgICAgICAgIHBzZS1waUAwIHtcbisgICAgICAgICAgICAgICAgICAgIHJlZyA9IFx1MDAzYzBcdTAwM2U7XG4rICAgICAgICAgICAgICAgICAgICAjcHNlLWNlbGxzID0gXHUwMDNjMFx1MDAzZTtcbisgICAgICAgICAgICAgICAgfTtcbisgICAgICAgICAgICB9O1xuKyAgICAgICAgfTtcbisgICAgfTtcbitcbisgICMgVUFSVCBhdHRhY2htZW50XG4rICAtIHxcbisgICAgc2VyaWFsIHtcbisgICAgICAgIGV0aGVybmV0LXBzZSB7XG4rICAgICAgICAgICAgY29tcGF0aWJsZSA9IFwienl4ZWwsZ3MxOTAwLTEwaHAtYTEtcHNlXCIsIFwicmVhbHRlayxwc2UtbWN1LWdlbjFcIjtcbisgICAgICAgICAgICBjdXJyZW50LXNwZWVkID0gXHUwMDNjMTkyMDBcdTAwM2U7XG4rXG4rICAgICAgICAgICAgcHNlLXBpcyB7XG4rICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gXHUwMDNjMVx1MDAzZTtcbisgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSBcdTAwM2MwXHUwMDNlO1xuK1xuKyAgICAgICAgICAgICAgICBwc2UtcGlAMCB7XG4rICAgICAgICAgICAgICAgICAgICByZWcgPSBcdTAwM2MwXHUwMDNlO1xuKyAgICAgICAgICAgICAgICAgICAgI3BzZS1jZWxscyA9IFx1MDAzYzBcdTAwM2U7XG4rICAgICAgICAgICAgICAgIH07XG4rICAgICAgICAgICAgfTtcbisgICAgICAgIH07XG4rICAgIH07XG5kaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSU1xuaW5kZXggMmQ0MjBkNDA3ODJlMy4uNDMzNGMyNDUzMDUyOCAxMDA2NDRcbi0tLSBhL01BSU5UQUlORVJTXG4rKysgYi9NQUlOVEFJTkVSU1xuQEAgLTIyNzY3LDYgKzIyNzY3LDEzIEBAIFM6XHRNYWludGFpbmVkXG4gRjpcdERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9yZWFsdGVrLG90dG8td2R0LnlhbWxcbiBGOlx0ZHJpdmVycy93YXRjaGRvZy9yZWFsdGVrX290dG9fd2R0LmNcbiBcbitSRUFMVEVLIFBTRSBNQ1UgRFJJVkVSXG4rTTpcdEpvbmFzIEplbG9uZWsgXHUwMDNjamVsb25lay5qb25hc0BnbWFpbC5jb21cdTAwM2VcbitMOlx0bmV0ZGV2QHZnZXIua2VybmVsLm9yZ1xuK1M6XHRNYWludGFpbmVkXG4rRjpcdERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcHNlLXBkL3JlYWx0ZWsscHNlLW1jdS1nZW4xLnlhbWxcbitGOlx0ZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdSpcbitcbiBSRUFMVEVLIFJUTDgzeHggU01JIERTQSBST1VURVIgQ0hJUFNcbiBNOlx0TGludXMgV2FsbGVpaiBcdTAwM2NsaW51c3dAa2VybmVsLm9yZ1x1MDAzZVxuIE06XHRBbHZpbiDFoGlwcmFnYSBcdTAwM2NhbHNpQGJhbmctb2x1ZnNlbi5ka1x1MDAzZVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BzZS1wZC9LY29uZmlnIGIvZHJpdmVycy9uZXQvcHNlLXBkL0tjb25maWdcbmluZGV4IDdlZjI5NjU3ZWU1ZGQuLmEwZjJhZTY2OGM2N2MgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9wc2UtcGQvS2NvbmZpZ1xuKysrIGIvZHJpdmVycy9uZXQvcHNlLXBkL0tjb25maWdcbkBAIC0xMyw2ICsxMywzNCBAQCBtZW51Y29uZmlnIFBTRV9DT05UUk9MTEVSXG4gXG4gaWYgUFNFX0NPTlRST0xMRVJcbiBcbitjb25maWcgUFNFX1JFQUxURUtfTUNVXG4rXHR0cmlzdGF0ZVxuK1x0aGVscFxuK1x0ICBTaGFyZWQgY29yZSBmb3IgdGhlIFJlYWx0ZWsgUFNFIE1DVSBkcml2ZXIuIFRoaXMgaXMgc2VsZWN0ZWRcbitcdCAgYXV0b21hdGljYWxseSBieSB0aGUgdHJhbnNwb3J0IG9wdGlvbnMgYmVsb3cuXG4rXG4rY29uZmlnIFBTRV9SRUFMVEVLX01DVV9JMkNcbitcdHRyaXN0YXRlIFwiUmVhbHRlayBQU0UgTUNVIGRyaXZlciAoSTJDIHRyYW5zcG9ydClcIlxuK1x0ZGVwZW5kcyBvbiBJMkNcbitcdHNlbGVjdCBQU0VfUkVBTFRFS19NQ1VcbitcdGhlbHBcbitcdCAgRHJpdmVyIGZvciB0aGUgbWljcm9jb250cm9sbGVyIChNQ1UpIHRoYXQgZnJvbnRzIHRoZSBQU0VcbitcdCAgaGFyZHdhcmUgb24gdmFyaW91cyBSZWFsdGVrLWJhc2VkIG1hbmFnZWQgc3dpdGNoZXMsIGF0dGFjaGVkXG4rXHQgIHZpYSBJMkMvU01CdXMuIFRoZSBNQ1UgZXhwb3NlcyBhIG1lc3NhZ2UtYmFzZWQgcHJvdG9jb2w7IHRoZSBhY3R1YWxcbitcdCAgUFNFIHNpbGljb24gaXMgbm90IGFjY2Vzc2VkIGRpcmVjdGx5LiBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGFcbitcdCAgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJlYWx0ZWstcHNlLW1jdS1pMmMuXG4rXG4rY29uZmlnIFBTRV9SRUFMVEVLX01DVV9VQVJUXG4rXHR0cmlzdGF0ZSBcIlJlYWx0ZWsgUFNFIE1DVSBkcml2ZXIgKFVBUlQgdHJhbnNwb3J0KVwiXG4rXHRkZXBlbmRzIG9uIFNFUklBTF9ERVZfQlVTXG4rXHRzZWxlY3QgUFNFX1JFQUxURUtfTUNVXG4rXHRoZWxwXG4rXHQgIERyaXZlciBmb3IgdGhlIG1pY3JvY29udHJvbGxlciAoTUNVKSB0aGF0IGZyb250cyB0aGUgUFNFXG4rXHQgIGhhcmR3YXJlIG9uIHZhcmlvdXMgUmVhbHRlay1iYXNlZCBtYW5hZ2VkIHN3aXRjaGVzLCBhdHRhY2hlZFxuK1x0ICB2aWEgVUFSVC4gVGhlIE1DVSBleHBvc2VzIGEgbWVzc2FnZS1iYXNlZCBwcm90b2NvbDsgdGhlIGFjdHVhbCBQU0VcbitcdCAgc2lsaWNvbiBpcyBub3QgYWNjZXNzZWQgZGlyZWN0bHkuIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYVxuK1x0ICBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmVhbHRlay1wc2UtbWN1LXVhcnQuXG4rXG4gY29uZmlnIFBTRV9SRUdVTEFUT1JcbiBcdHRyaXN0YXRlIFwiUmVndWxhdG9yIGJhc2VkIFBTRSBjb250cm9sbGVyXCJcbiBcdGhlbHBcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9wc2UtcGQvTWFrZWZpbGVcbmluZGV4IGNjNzhmN2VhN2Y1ZjcuLjljY2E1OTAwZmUzNDIgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9wc2UtcGQvTWFrZWZpbGVcbisrKyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9NYWtlZmlsZVxuQEAgLTMsNiArMyw5IEBAXG4gXG4gb2JqLSQoQ09ORklHX1BTRV9DT05UUk9MTEVSKSArPSBwc2VfY29yZS5vXG4gXG4rb2JqLSQoQ09ORklHX1BTRV9SRUFMVEVLX01DVSkgKz0gcmVhbHRlay1wc2UtbWN1LWNvcmUub1xuK29iai0kKENPTkZJR19QU0VfUkVBTFRFS19NQ1VfSTJDKSArPSByZWFsdGVrLXBzZS1tY3UtaTJjLm9cbitvYmotJChDT05GSUdfUFNFX1JFQUxURUtfTUNVX1VBUlQpICs9IHJlYWx0ZWstcHNlLW1jdS11YXJ0Lm9cbiBvYmotJChDT05GSUdfUFNFX1JFR1VMQVRPUikgKz0gcHNlX3JlZ3VsYXRvci5vXG4gb2JqLSQoQ09ORklHX1BTRV9QRDY5MlgwKSArPSBwZDY5MngwLm9cbiBvYmotJChDT05GSUdfUFNFX1NJMzQ3NCkgKz0gc2kzNDc0Lm9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LWNvcmUuYyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtY29yZS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZWQzYjc0MzQ3MGRiZlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS1jb3JlLmNcbkBAIC0wLDAgKzEsOTg4IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcbisvKlxuKyAqIERyaXZlciBmb3IgdGhlIG1pY3JvY29udHJvbGxlciAoTUNVKSBmcm9udGluZyBQU0Ugc2lsaWNvbiBvbiB2YXJpb3VzXG4rICogUmVhbHRlay1iYXNlZCBtYW5hZ2VkIHN3aXRjaGVzLiBUaGUgTUNVIHNwZWFrcyBhIDEyLWJ5dGUgZml4ZWQtZnJhbWVcbisgKiBtYW5hZ2VtZW50IHByb3RvY29sOyB0aGlzIGRyaXZlciBjb3ZlcnMgdHdvIGdlbmVyYXRpb25zIG9mIHRoZVxuKyAqIHByb3RvY29sIHZpYSBhIHBlci1kaWFsZWN0IG9wY29kZSB0YWJsZSBhbmQgcmVzcG9uc2UgcGFyc2Vycy5cbisgKlxuKyAqIE1hbnkgUG9FIHN3aXRjaCBkZXNpZ25zIHB1dCBhIGRlZGljYXRlZCBtaWNyb2NvbnRyb2xsZXIgaW4gZnJvbnQgb2YgdGhlXG4rICogYWN0dWFsIFBTRSBzaWxpY29uOiB0aGUgaG9zdCBDUFUgdGFsa3MgdG8gdGhlIE1DVSBvdmVyIEkyQy9TTUJ1cyBvclxuKyAqIFVBUlQsIGFuZCB0aGUgTUNVIGluIHR1cm4gbWFuYWdlcyB0aGUgUFNFIGNoaXBzIG9uIHRoZSBib2FyZC4gVGhlIE1DVVxuKyAqIHNwZWFrcyBhIHNtYWxsIG1lc3NhZ2UtYmFzZWQgcHJvdG9jb2wuIFRoZSBQU0UgY2hpcHMgdGhlbXNlbHZlcyBhcmUgbm90XG4rICogYWNjZXNzZWQgZGlyZWN0bHk7IGV2ZXJ5dGhpbmcgZ29lcyB0aHJvdWdoIE1DVSBjb21tYW5kcy5cbisgKlxuKyAqIFRoaXMgZHJpdmVyIHRhcmdldHMgdGhhdCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBSZWFsdGVrLWZhbWlseSBwcm90b2NvbC5cbisgKiBUd28gZ2VuZXJhdGlvbnMgYXJlIHN1cHBvcnRlZDogR2VuMSBiZWluZyB1c2VkIG9uIG9sZGVyIHN3aXRjaGVzIHdoZXJlXG4rICogdGhlIE1DVSBmcm9udHMgYW5kIG1hbmFnZXMgQnJvYWRjb20gUFNFIHNpbGljb247IEdlbjIgYmVpbmcgdXNlZCB3aXRoXG4rICogUmVhbHRlayBQU0Ugc2lsaWNvbi4gVGhlIHR3byBzaGFyZSBmcmFtZSBmb3JtYXQgYW5kIGEgc3VtLW1vZC0yNTZcbisgKiBjaGVja3N1bSBidXQgZGl2ZXJnZSBvbiBvcGNvZGUgbnVtYmVycyBhbmQgb24gYSBmZXcgcmVzcG9uc2UgbGF5b3V0cztcbisgKiB0aGlzIGlzIGhhbmRsZWQgYnkgdGhlIHBlci1kaWFsZWN0IG9wY29kZSB0YWJsZSBhbmQgcGFyc2VyIGhvb2tzLlxuKyAqXG4rICogT3V0IG9mIHNjb3BlOiBQU0UgY2hpcHMgdGhhdCBhcmUgaW50ZXJmYWNlZCBkaXJlY3RseSBmcm9tIHRoZSBob3N0XG4rICogd2l0aG91dCBhIG1hbmFnZW1lbnQgTUNVLCBNQ1UgZGVzaWducyB0aGF0IHNwZWFrIGFuIHVucmVsYXRlZCBwcm90b2NvbFxuKyAqIGZhbWlseSwgYW5kIFwiZHVtYiBQU0VcIiBtb2RlcyB3aGVyZSBubyBob3N0IGNvbnRyb2wgaXMgd2lyZWQgdXAgYXQgYWxsLlxuKyAqXG4rICogVGhpcyBjb3JlIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBwcm90b2NvbCwgZGVjb2RpbmcvZW5jb2Rpbmcgb2YgTUNVXG4rICogcmVzcG9uc2VzLCBhbmQgdGhlIHBzZV9jb250cm9sbGVyX29wcyBpbnRlZ3JhdGlvbi4gVHJhbnNwb3J0IG1vZHVsZXNcbisgKiAocmVhbHRlay1wc2UtbWN1LWkyYywgcmVhbHRlay1wc2UtbWN1LXVhcnQpIHByb3ZpZGUgdGhlIHNlbmQvcmVjdlxuKyAqIGNhbGxiYWNrcy5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRmaWVsZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY2xlYW51cC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY29udGFpbmVyX29mLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWxheS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZ3Bpby9jb25zdW1lci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvamlmZmllcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWlubWF4LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb3BlcnR5LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9wc2UtcGQvcHNlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC91bmFsaWduZWQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwicmVhbHRlay1wc2UtbWN1LmhcIlxuK1xuKyNkZWZpbmUgUlRQU0VfTUNVX0RFVklDRV9JRF9SVEw4MjM4Qlx0XHQweDAxMzhcbisjZGVmaW5lIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOVx0XHQweDAwMzlcbisjZGVmaW5lIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOUNcdFx0MHgwMTM5XG4rI2RlZmluZSBSVFBTRV9NQ1VfREVWSUNFX0lEX0JDTTU5MTExXHRcdDB4ZTExMVxuKyNkZWZpbmUgUlRQU0VfTUNVX0RFVklDRV9JRF9CQ001OTEyMVx0XHQweGUxMjFcbitcbisjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19ESVNBQkxFRFx0XHQweDAwXG4rI2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9TVFNfU0VBUkNISU5HXHRcdDB4MDFcbisjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19ERUxJVkVSSU5HXHRcdDB4MDJcbisjZGVmaW5lIFJUUFNFX01DVV9QT1JUX1NUU19URVNUXHRcdFx0MHgwM1x0LyogR2VuMS1vbmx5OyByZXNlcnZlZCBvbiBHZW4yICovXG4rI2RlZmluZSBSVFBTRV9NQ1VfUE9SVF9TVFNfRkFVTFRcdFx0MHgwNFxuKyNkZWZpbmUgUlRQU0VfTUNVX1BPUlRfU1RTX09USEVSX0ZBVUxUXHRcdDB4MDVcdC8qIEdlbjEtb25seTsgcmVzZXJ2ZWQgb24gR2VuMiAqL1xuKyNkZWZpbmUgUlRQU0VfTUNVX1BPUlRfU1RTX1JFUVVFU1RJTkdcdFx0MHgwNlxuK1xuKy8qIFJUUFNFX01DVV9QT1JUX1NFVF9QT1dFUl9MSU1JVF9UWVBFIHZhbHVlcyAqL1xuKyNkZWZpbmUgUlRQU0VfTUNVX1BPUlRfUFdfTElNSVRfVFlQRV9VU0VSXHQweDAyXG4rXG4rI2RlZmluZSBSVFBTRV9NQ1VfTUFYX1BPUlRTXHRcdFx0NDhcbisjZGVmaW5lIFJUUFNFX01DVV9QT1JUX01BWF9QUklPUklUWVx0XHQzXG4rXG4rLyogTm9taW5hbCBQU0UgcmFpbDsgODAyLjNhdC9idCBvcGVyYXRpbmcgcmFuZ2UuICovXG4rI2RlZmluZSBSVFBTRV9NQ1VfUFNFX1ZPTFRBR0VfVVZcdFx0NTQwMDAwMDBcbitcbitlbnVtIHJ0cHNlX21jdV9jbWQge1xuK1x0UlRQU0VfTUNVX0NNRF9TRVRfR0xPQkFMX1NUQVRFLFxuK1x0UlRQU0VfTUNVX0NNRF9HRVRfU1lTVEVNX0lORk8sXG4rXHRSVFBTRV9NQ1VfQ01EX0dFVF9FWFRfQ09ORklHLFxuK1xuK1x0UlRQU0VfTUNVX0NNRF9QT1JUX0VOQUJMRSxcbitcdFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfVFlQRSxcbitcdFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVQsXG4rXHRSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUX0VYVCxcbitcdFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUFJJT1JJVFksXG4rXHRSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1NUQVRVUyxcbitcdFJUUFNFX01DVV9DTURfUE9SVF9HRVRfUE9XRVJfU1RBVFMsXG4rXHRSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0NPTkZJRyxcbitcdFJUUFNFX01DVV9DTURfUE9SVF9HRVRfRVhUX0NPTkZJRyxcbitcbitcdFJUUFNFX01DVV9OVU1fQ01EUyxcbit9O1xuK1xuK3N0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlIHtcbitcdHU4IG9wO1xuK1x0Ym9vbCB2YWxpZDtcbit9O1xuK1xuKy8qIFNob3J0aGFuZCBmb3IgdGhlIGRlc2lnbmF0ZWQtaW5pdGlhbGl6ZXIgZW50cmllcyBpbiBkaWFsZWN0IG9wY29kZSB0YWJsZXMuICovXG4rI2RlZmluZSBSVFBTRV9NQ1VfT1Aob3BjKVx0eyAub3AgPSAob3BjKSwgLnZhbGlkID0gdHJ1ZSB9XG4rXG4rLyogUGFyc2VkIE1DVSByZXNwb25zZSBzdHJ1Y3R1cmVzIChkZWNvZGVkIGZyb20gcnRwc2VfbWN1X21zZyByZXBsaWVzKSAqL1xuK1xuK3N0cnVjdCBydHBzZV9tY3VfaW5mbyB7XG4rXHR1OCBtYXhfcG9ydHM7XG4rXHRib29sIHN5c3RlbV9lbmFibGU7XG4rXHR1MTYgZGV2aWNlX2lkO1xuK1x0dTggbWN1X3R5cGU7XG4rfTtcbitcbitzdHJ1Y3QgcnRwc2VfbWN1X2V4dF9jb25maWcge1xuK1x0dTggbnVtX29mX3BzZXM7XG4rfTtcbitcbitzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfc3RhdHVzIHtcbitcdHU4IHN0czE7XG4rXHR1OCBzdHMyO1xuK1x0dTggc3RzMztcbit9O1xuK1xuK3N0cnVjdCBydHBzZV9tY3VfcG9ydF9tZWFzdXJlbWVudCB7XG4rXHR1MTYgdm9sdGFnZV9yYXc7XHQvKiA2NC40NW1WL0xTQiAqL1xuK1x0dTE2IGN1cnJlbnRfcmF3O1x0LyogMW1BL0xTQiAqL1xuK1x0dTE2IHRlbXBlcmF0dXJlX3JhdztcdC8qIFQobUMpID0gMTI1MCAqICgyMjAgLSByYXcpICovXG4rXHR1MTYgcG93ZXJfcmF3O1x0XHQvKiAxMDBtVy9MU0IgKi9cbit9O1xuK1xuK3N0cnVjdCBydHBzZV9tY3VfcG9ydF9jb25maWcge1xuK1x0Ym9vbCBlbmFibGU7XG4rfTtcbitcbitzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfZXh0X2NvbmZpZyB7XG4rXHR1OCBtYXhfcG93ZXI7XG4rXHR1OCBwcmlvcml0eTtcbit9O1xuK1xuK3N0cnVjdCBydHBzZV9tY3VfZGlhbGVjdCB7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSBvcGNvZGVbUlRQU0VfTUNVX05VTV9DTURTXTtcbitcbitcdC8qXG4rXHQgKiBSZXNwb25zZSBwYXJzZXJzIGZvciB0aGUgZmllbGRzIHRoYXQgZGlmZmVyIGJldHdlZW4gZGlhbGVjdHM7IGVhY2hcbitcdCAqIGRpYWxlY3Qgc3VwcGxpZXMgaXRzIG93bi4gT3RoZXIgcmVzcG9uc2VzIHNoYXJlIG9uZSBsYXlvdXQgYW5kIGFyZVxuK1x0ICogZGVjb2RlZCBkaXJlY3RseSAtIGEgZGlhbGVjdCB0aGF0IGRpdmVyZ2VzIHRoZXJlIG11c3QgYWRkIGEgaG9vayxcbitcdCAqIGFzIGEgbWlzbWF0Y2hlZCBsYXlvdXQgY2Fubm90IGJlIGRldGVjdGVkICh0aGUgY2hlY2tzdW0gc3RpbGwgcGFzc2VzKS5cbitcdCAqL1xuK1x0dm9pZCAoKnBhcnNlX3N5c3RlbV9pbmZvKShjb25zdCB1OCAqcGF5bG9hZCwgc3RydWN0IHJ0cHNlX21jdV9pbmZvICppbmZvKTtcbitcdGludCAoKnBhcnNlX3BvcnRfY2xhc3MpKGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfcG9ydF9zdGF0dXMgKnN0YXR1cyk7XG4rXHRjb25zdCBjaGFyICooKm1jdV90eXBlX3N0cikodW5zaWduZWQgaW50IG1jdV90eXBlKTtcbit9O1xuK1xuK3N0cnVjdCBydHBzZV9tY3VfY2hpcF9pbmZvIHtcbitcdGNvbnN0IGNoYXIgKm5hbWU7XG4rXHR1MzIgbWF4X21XX3Blcl9wb3J0O1xuK1x0ZW51bSBydHBzZV9tY3VfY21kIHB3X3NldF9jbWQ7XHQvKiBjb21tYW5kIHVzZWQgYnkgc2V0X3B3X2xpbWl0ICovXG4rXHR1MzIgcHdfc2V0X2xzYl9tVztcdFx0LyogTFNCIG9mIHB3X3NldF9jbWQgdmFsdWUsIGluIG1XICovXG4rXHR1MzIgcHdfcmVhZF9sc2JfbVc7XHRcdC8qIExTQiBvZiBleHRfY29uZmlnLm1heF9wb3dlciByZWFkLWJhY2ssIGluIG1XICovXG4rfTtcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gcnRsODIzOGJfaW5mbyA9IHtcbitcdC5tYXhfbVdfcGVyX3BvcnQgPSAzMDAwMCxcbitcdC5uYW1lID0gXCJSVEw4MjM4QlwiLFxuK1x0LnB3X3JlYWRfbHNiX21XID0gMjAwLFxuK1x0LnB3X3NldF9jbWQgPSBSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlULFxuK1x0LnB3X3NldF9sc2JfbVcgPSAyMDAsXG4rfTtcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gcnRsODIzOV9pbmZvID0ge1xuK1x0Lm1heF9tV19wZXJfcG9ydCA9IDkwMDAwLFxuK1x0Lm5hbWUgPSBcIlJUTDgyMzlcIixcbitcdC5wd19yZWFkX2xzYl9tVyA9IDQwMCxcbitcdC5wd19zZXRfY21kID0gUlRQU0VfTUNVX0NNRF9QT1JUX1NFVF9QT1dFUl9MSU1JVF9FWFQsXG4rXHQucHdfc2V0X2xzYl9tVyA9IDQwMCxcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X2NoaXBfaW5mbyBydGw4MjM5Y19pbmZvID0ge1xuK1x0Lm1heF9tV19wZXJfcG9ydCA9IDkwMDAwLFxuK1x0Lm5hbWUgPSBcIlJUTDgyMzlDXCIsXG4rXHQucHdfcmVhZF9sc2JfbVcgPSA0MDAsXG4rXHQucHdfc2V0X2NtZCA9IFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfRVhULFxuK1x0LnB3X3NldF9sc2JfbVcgPSA0MDAsXG4rfTtcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gYmNtNTkxMTFfaW5mbyA9IHtcbitcdC5tYXhfbVdfcGVyX3BvcnQgPSAzMDAwMCxcbitcdC5uYW1lID0gXCJCQ001OTExMVwiLFxuK1x0LnB3X3JlYWRfbHNiX21XID0gMjAwLFxuK1x0LnB3X3NldF9jbWQgPSBSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlULFxuK1x0LnB3X3NldF9sc2JfbVcgPSAyMDAsXG4rfTtcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gYmNtNTkxMjFfaW5mbyA9IHtcbitcdC8qXG4rXHQgKiBCQ001OTEyMSBpcyBhIDYwVyBUeXBlLTMgcGFydCwgYnV0IGtub3duIGJvYXJkcyBydW4gaXQgYXQgODAyLjNhdFxuK1x0ICogYW5kIHRoZSBHZW4xIGRpYWxlY3QgaGFzIG9ubHkgdGhlIDgtYml0LzAuMlcgc2V0IGNvbW1hbmQgKFx1MDAzYz01MVcpO1xuK1x0ICogY2FwIGF0IHRoZSAzMFcgdGhlIGhhcmR3YXJlIGFjdHVhbGx5IG9mZmVycy5cbitcdCAqL1xuK1x0Lm1heF9tV19wZXJfcG9ydCA9IDMwMDAwLFxuK1x0Lm5hbWUgPSBcIkJDTTU5MTIxXCIsXG4rXHQucHdfcmVhZF9sc2JfbVcgPSAyMDAsXG4rXHQucHdfc2V0X2NtZCA9IFJUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVQsXG4rXHQucHdfc2V0X2xzYl9tVyA9IDIwMCxcbit9O1xuK1xuKy8qIEhlbHBlcnMgYW5kIGJhc2ljIGZ1bmN0aW9ucyAqL1xuK1xuK3N0YXRpYyBzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnRvX3J0cHNlX21jdV9jdHJsKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2KVxuK3tcbitcdHJldHVybiBjb250YWluZXJfb2YocGNkZXYsIHN0cnVjdCBydHBzZV9tY3VfY3RybCwgcGNkZXYpO1xuK31cbitcbitzdGF0aWMgdm9pZCBydHBzZV9tY3VfbXNnX2luaXQoc3RydWN0IHJ0cHNlX21jdV9tc2cgKm1zZywgdTggb3Bjb2RlKVxuK3tcbitcdG1lbXNldChtc2csIDB4ZmYsIHNpemVvZigqbXNnKSk7XG4rXHRtc2ctXHUwMDNlb3Bjb2RlID0gb3Bjb2RlO1xuK31cbitcbitzdGF0aWMgdTggcnRwc2VfbWN1X2NoZWNrc3VtKGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4pXG4re1xuK1x0dTggc3VtID0gMDtcbitcbitcdHdoaWxlIChsZW4tLSlcbitcdFx0c3VtICs9ICpidWYrKztcbitcdHJldHVybiBzdW07XG4rfVxuK1xuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X2RvX3hmZXIoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXEsXG4rXHRcdFx0ICAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcbit7XG4rXHRpbnQgcmV0O1xuK1xuK1x0c2NvcGVkX2d1YXJkKG11dGV4LCBcdTAwMjZwc2UtXHUwMDNlbXV0ZXgpIHtcbitcdFx0LyogUm9sbGluZyBzZXFfbnVtIHNvIGEgbGF0ZSByZXBseSBjYW4ndCBwYXNzIGFzIGEgbGF0ZXIgb25lLiAqL1xuK1x0XHRyZXEtXHUwMDNlc2VxX251bSA9IHBzZS1cdTAwM2VzZXErKztcbitcdFx0cmVxLVx1MDAzZWNoZWNrc3VtID0gcnRwc2VfbWN1X2NoZWNrc3VtKCh1OCAqKXJlcSwgUlRQU0VfTUNVX01TR19TSVpFIC0gMSk7XG4rXG4rXHRcdHJldCA9IHBzZS1cdTAwM2V0cmFuc3BvcnQtXHUwMDNlc2VuZChwc2UsIHJlcSk7XG4rXHRcdGlmIChyZXQpXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIE1DVSBuZWVkcyBhIGZpeGVkIGJhc2UgdGltZSBiZXR3ZWVuIGFjY2VwdGluZyBhIHJlcXVlc3QgYW5kXG4rXHRcdCAqIGhhdmluZyBhIHJlcGx5IHJlYWR5LCBpbmRlcGVuZGVudCBvZiB0cmFuc3BvcnQuIFBhY2UgdGhhdCBoZXJlOyB0aGVcbitcdFx0ICogdHJhbnNwb3J0IHRoZW4gZmluaXNoZXMgcmVjdiBpbiBpdHMgb3duIG1vZGVsIC0gYSBib3VuZGVkIHBvbGwgb2ZcbitcdFx0ICogdGhlIHJlc3BvbnNlIHJlZ2lzdGVyIChJMkMpIG9yIG9uZSB3YWl0IG9uIGEgcHVzaGVkIGZyYW1lIChVQVJUKSAtXG4rXHRcdCAqIHNvIHRoZSByZXRyeSBiZWxvbmdzIGluIHRoZSB0cmFuc3BvcnQsIG5vdCBoZXJlLlxuK1x0XHQgKi9cbitcdFx0bXNsZWVwKFJUUFNFX01DVV9SRVNQT05TRV9NUyk7XG4rXG4rXHRcdG1lbXNldChyZXNwLCAwLCBzaXplb2YoKnJlc3ApKTtcbitcdFx0cmV0ID0gcHNlLVx1MDAzZXRyYW5zcG9ydC1cdTAwM2VyZWN2KHBzZSwgcmVxLCByZXNwKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIEV4cGxpY2l0IE1DVSBlcnJvciBvcGNvZGVzIChvYnNlcnZlZCBvbiB0aGUgR2VuMSBkaWFsZWN0OyBoYXJtbGVzc1xuK1x0ICogdG8gY2hlY2sgZm9yIEdlbjIgdG9vKS4gQ2F0Y2ggdGhlc2UgYmVmb3JlIHRoZSBnZW5lcmljIG9wY29kZS9DUkNcbitcdCAqIG1pc21hdGNoIHBhdGggc28gY2FsbGVycyBzZWUgYSBtZWFuaW5nZnVsIGVycm5vLlxuK1x0ICovXG4rXHRzd2l0Y2ggKHJlc3AtXHUwMDNlb3Bjb2RlKSB7XG4rXHRjYXNlIFJUUFNFX01DVV9PUENPREVfSU5DT01QTEVURTpcbitcdFx0cmV0dXJuIC1FQkFERTtcbitcdGNhc2UgUlRQU0VfTUNVX09QQ09ERV9CQURfQ1NVTTpcbitcdFx0cmV0dXJuIC1FQkFETVNHO1xuK1x0Y2FzZSBSVFBTRV9NQ1VfT1BDT0RFX05PVF9SRUFEWTpcbitcdFx0cmV0dXJuIC1FQUdBSU47XG4rXHR9XG4rXG4rXHRpZiAocmVzcC1cdTAwM2VvcGNvZGUgIT0gcmVxLVx1MDAzZW9wY29kZSB8fFxuK1x0ICAgIHJlc3AtXHUwMDNlc2VxX251bSAhPSByZXEtXHUwMDNlc2VxX251bSB8fFxuK1x0ICAgIHJlc3AtXHUwMDNlY2hlY2tzdW0gIT0gcnRwc2VfbWN1X2NoZWNrc3VtKCh1OCAqKXJlc3AsIFJUUFNFX01DVV9NU0dfU0laRSAtIDEpKVxuK1x0XHRyZXR1cm4gLUVCQURNU0c7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9xdWVyeShzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgdW5zaWduZWQgaW50IHBvcnQsIHU4IG9wY29kZSxcbitcdFx0XHRcdHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXNwKVxuK3tcbitcdHN0cnVjdCBydHBzZV9tY3VfbXNnIHJlcTtcbitcdGludCByZXQ7XG4rXG4rXHRydHBzZV9tY3VfbXNnX2luaXQoXHUwMDI2cmVxLCBvcGNvZGUpO1xuK1x0cmVxLnBheWxvYWRbMF0gPSBwb3J0O1xuK1xuK1x0cmV0ID0gcnRwc2VfbWN1X2RvX3hmZXIocHNlLCBcdTAwMjZyZXEsIHJlc3ApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGlmIChyZXNwLVx1MDAzZXBheWxvYWRbMF0gIT0gcG9ydClcbitcdFx0cmV0dXJuIC1FSU87XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9jbWQoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHVuc2lnbmVkIGludCBwb3J0LCB1OCBvcGNvZGUsIHU4IGFyZylcbit7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXEsIHJlc3A7XG4rXHRpbnQgcmV0O1xuK1xuK1x0cnRwc2VfbWN1X21zZ19pbml0KFx1MDAyNnJlcSwgb3Bjb2RlKTtcbitcdHJlcS5wYXlsb2FkWzBdID0gcG9ydDtcbitcdHJlcS5wYXlsb2FkWzFdID0gYXJnO1xuK1xuK1x0cmV0ID0gcnRwc2VfbWN1X2RvX3hmZXIocHNlLCBcdTAwMjZyZXEsIFx1MDAyNnJlc3ApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGlmIChyZXNwLnBheWxvYWRbMF0gIT0gcG9ydCB8fCByZXNwLnBheWxvYWRbMV0gIT0gMClcbitcdFx0cmV0dXJuIC1FSU87XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyogR2xvYmFsIG9wZXJhdGlvbnMgKi9cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9nZXRfaW5mbyhzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgc3RydWN0IHJ0cHNlX21jdV9pbmZvICppbmZvKVxuK3tcbitcdHN0cnVjdCBydHBzZV9tY3VfbXNnIHJlcSwgcmVzcDtcbitcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XG4rXHRpbnQgcmV0O1xuK1xuK1x0b3BjID0gXHUwMDI2cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfR0VUX1NZU1RFTV9JTkZPXTtcbitcdGlmICghb3BjLVx1MDAzZXZhbGlkKVxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4rXHRydHBzZV9tY3VfbXNnX2luaXQoXHUwMDI2cmVxLCBvcGMtXHUwMDNlb3ApO1xuK1x0cmV0ID0gcnRwc2VfbWN1X2RvX3hmZXIocHNlLCBcdTAwMjZyZXEsIFx1MDAyNnJlc3ApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZXBhcnNlX3N5c3RlbV9pbmZvKHJlc3AucGF5bG9hZCwgaW5mbyk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfZ2V0X2V4dF9jb25maWcoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHN0cnVjdCBydHBzZV9tY3VfZXh0X2NvbmZpZyAqY29uZmlnKVxuK3tcbitcdHN0cnVjdCBydHBzZV9tY3VfbXNnIHJlcSwgcmVzcDtcbitcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XG4rXHRpbnQgcmV0O1xuK1xuK1x0b3BjID0gXHUwMDI2cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfR0VUX0VYVF9DT05GSUddO1xuK1x0aWYgKCFvcGMtXHUwMDNldmFsaWQpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdHJ0cHNlX21jdV9tc2dfaW5pdChcdTAwMjZyZXEsIG9wYy1cdTAwM2VvcCk7XG4rXHRyZXQgPSBydHBzZV9tY3VfZG9feGZlcihwc2UsIFx1MDAyNnJlcSwgXHUwMDI2cmVzcCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0Y29uZmlnLVx1MDAzZW51bV9vZl9wc2VzID0gcmVzcC5wYXlsb2FkWzZdO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X3NldF9nbG9iYWxfc3RhdGUoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIGJvb2wgZW5hYmxlKVxuK3tcbitcdHN0cnVjdCBydHBzZV9tY3VfbXNnIHJlcSwgcmVzcDtcbitcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XG4rXHRpbnQgcmV0O1xuK1xuK1x0b3BjID0gXHUwMDI2cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfU0VUX0dMT0JBTF9TVEFURV07XG4rXHRpZiAoIW9wYy1cdTAwM2V2YWxpZClcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuK1x0cnRwc2VfbWN1X21zZ19pbml0KFx1MDAyNnJlcSwgb3BjLVx1MDAzZW9wKTtcbitcdHJlcS5wYXlsb2FkWzBdID0gZW5hYmxlID8gMHgxIDogMHgwO1xuK1xuK1x0cmV0ID0gcnRwc2VfbWN1X2RvX3hmZXIocHNlLCBcdTAwMjZyZXEsIFx1MDAyNnJlc3ApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldHVybiAocmVzcC5wYXlsb2FkWzBdID09IDB4MCkgPyAwIDogLUVJTztcbit9XG4rXG4rLyogUG9ydCBvcGVyYXRpb25zICovXG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfc3RhdHVzKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCxcbitcdFx0XHRcdCAgICAgc3RydWN0IHJ0cHNlX21jdV9wb3J0X3N0YXR1cyAqc3RhdHVzKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXNwO1xuK1x0aW50IHJldDtcbitcbitcdG9wYyA9IFx1MDAyNnBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZW9wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1NUQVRVU107XG4rXHRpZiAoIW9wYy1cdTAwM2V2YWxpZClcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuK1x0cmV0ID0gcnRwc2VfbWN1X3BvcnRfcXVlcnkocHNlLCBwb3J0LCBvcGMtXHUwMDNlb3AsIFx1MDAyNnJlc3ApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHN0YXR1cy1cdTAwM2VzdHMxID0gcmVzcC5wYXlsb2FkWzFdO1xuK1x0c3RhdHVzLVx1MDAzZXN0czIgPSByZXNwLnBheWxvYWRbMl07XG4rXHRzdGF0dXMtXHUwMDNlc3RzMyA9IHJlc3AucGF5bG9hZFszXTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9tZWFzdXJlbWVudChzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgdW5zaWduZWQgaW50IHBvcnQsXG4rXHRcdFx0XHRcdCAgc3RydWN0IHJ0cHNlX21jdV9wb3J0X21lYXN1cmVtZW50ICptZWFzdXJlbWVudClcbit7XG4rXHRjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X29wY29kZSAqb3BjO1xuK1x0c3RydWN0IHJ0cHNlX21jdV9tc2cgcmVzcDtcbitcdGludCByZXQ7XG4rXG4rXHRvcGMgPSBcdTAwMjZwc2UtXHUwMDNlZGlhbGVjdC1cdTAwM2VvcGNvZGVbUlRQU0VfTUNVX0NNRF9QT1JUX0dFVF9QT1dFUl9TVEFUU107XG4rXHRpZiAoIW9wYy1cdTAwM2V2YWxpZClcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1xuK1x0cmV0ID0gcnRwc2VfbWN1X3BvcnRfcXVlcnkocHNlLCBwb3J0LCBvcGMtXHUwMDNlb3AsIFx1MDAyNnJlc3ApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdG1lYXN1cmVtZW50LVx1MDAzZXZvbHRhZ2VfcmF3ID0gZ2V0X3VuYWxpZ25lZF9iZTE2KFx1MDAyNnJlc3AucGF5bG9hZFsxXSk7XG4rXHRtZWFzdXJlbWVudC1cdTAwM2VjdXJyZW50X3JhdyA9IGdldF91bmFsaWduZWRfYmUxNihcdTAwMjZyZXNwLnBheWxvYWRbM10pO1xuK1x0bWVhc3VyZW1lbnQtXHUwMDNldGVtcGVyYXR1cmVfcmF3ID0gZ2V0X3VuYWxpZ25lZF9iZTE2KFx1MDAyNnJlc3AucGF5bG9hZFs1XSk7XG4rXHRtZWFzdXJlbWVudC1cdTAwM2Vwb3dlcl9yYXcgPSBnZXRfdW5hbGlnbmVkX2JlMTYoXHUwMDI2cmVzcC5wYXlsb2FkWzddKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9jb25maWcoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHVuc2lnbmVkIGludCBwb3J0LFxuK1x0XHRcdFx0ICAgICBzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfY29uZmlnICpjb25maWcpXG4re1xuK1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcbitcdHN0cnVjdCBydHBzZV9tY3VfbXNnIHJlc3A7XG4rXHRpbnQgcmV0O1xuK1xuK1x0b3BjID0gXHUwMDI2cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfUE9SVF9HRVRfQ09ORklHXTtcbitcdGlmICghb3BjLVx1MDAzZXZhbGlkKVxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4rXHRyZXQgPSBydHBzZV9tY3VfcG9ydF9xdWVyeShwc2UsIHBvcnQsIG9wYy1cdTAwM2VvcCwgXHUwMDI2cmVzcCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0Y29uZmlnLVx1MDAzZWVuYWJsZSA9IChyZXNwLnBheWxvYWRbMV0gPT0gMSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfZXh0X2NvbmZpZyhzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgdW5zaWduZWQgaW50IHBvcnQsXG4rXHRcdFx0XHRcdCBzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfZXh0X2NvbmZpZyAqY29uZmlnKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3Vfb3Bjb2RlICpvcGM7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X21zZyByZXNwO1xuK1x0aW50IHJldDtcbitcbitcdG9wYyA9IFx1MDAyNnBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZW9wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0VYVF9DT05GSUddO1xuK1x0aWYgKCFvcGMtXHUwMDNldmFsaWQpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdHJldCA9IHJ0cHNlX21jdV9wb3J0X3F1ZXJ5KHBzZSwgcG9ydCwgb3BjLVx1MDAzZW9wLCBcdTAwMjZyZXNwKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRjb25maWctXHUwMDNlbWF4X3Bvd2VyID0gcmVzcC5wYXlsb2FkWzNdO1xuK1x0Y29uZmlnLVx1MDAzZXByaW9yaXR5ID0gcmVzcC5wYXlsb2FkWzRdO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfc2V0X3N0YXRlKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCB1bnNpZ25lZCBpbnQgcG9ydCwgYm9vbCBlbmFibGUpXG4re1xuK1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcbitcbitcdG9wYyA9IFx1MDAyNnBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZW9wY29kZVtSVFBTRV9NQ1VfQ01EX1BPUlRfRU5BQkxFXTtcbitcdGlmICghb3BjLVx1MDAzZXZhbGlkKVxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4rXHRyZXR1cm4gcnRwc2VfbWN1X3BvcnRfY21kKHBzZSwgcG9ydCwgb3BjLVx1MDAzZW9wLCBlbmFibGUgPyAweDEgOiAweDApO1xuK31cbitcbisvKiBQU0UgY29udHJvbGxlciBvcHMgKi9cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9hZG1pbl9zdGF0ZShzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2ICpwY2RldiwgaW50IGlkLFxuK1x0XHRcdFx0XHQgIHN0cnVjdCBwc2VfYWRtaW5fc3RhdGUgKmFkbWluX3N0YXRlKVxuK3tcbitcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpO1xuK1x0c3RydWN0IHJ0cHNlX21jdV9wb3J0X2NvbmZpZyBjb25maWc7XG4rXHRpbnQgcmV0O1xuK1xuK1x0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X2NvbmZpZyhwc2UsIGlkLCBcdTAwMjZjb25maWcpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdGFkbWluX3N0YXRlLVx1MDAzZWMzM19hZG1pbl9zdGF0ZSA9IGNvbmZpZy5lbmFibGUgPyBFVEhUT09MX0MzM19QU0VfQURNSU5fU1RBVEVfRU5BQkxFRCA6XG4rXHRcdFx0XHRcdFx0ICAgICAgIEVUSFRPT0xfQzMzX1BTRV9BRE1JTl9TVEFURV9ESVNBQkxFRDtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9wd19zdGF0dXMoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZCxcbitcdFx0XHRcdFx0c3RydWN0IHBzZV9wd19zdGF0dXMgKnB3X3N0YXR1cylcbit7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcbitcdHN0cnVjdCBydHBzZV9tY3VfcG9ydF9zdGF0dXMgc3RhdHVzO1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHJ0cHNlX21jdV9wb3J0X2dldF9zdGF0dXMocHNlLCBpZCwgXHUwMDI2c3RhdHVzKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRzd2l0Y2ggKHN0YXR1cy5zdHMxKSB7XG4rXHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19ESVNBQkxFRDpcbitcdFx0cHdfc3RhdHVzLVx1MDAzZWMzM19wd19zdGF0dXMgPSBFVEhUT09MX0MzM19QU0VfUFdfRF9TVEFUVVNfRElTQUJMRUQ7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfU0VBUkNISU5HOlxuK1x0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfUkVRVUVTVElORzpcbitcdFx0cHdfc3RhdHVzLVx1MDAzZWMzM19wd19zdGF0dXMgPSBFVEhUT09MX0MzM19QU0VfUFdfRF9TVEFUVVNfU0VBUkNISU5HO1xuK1x0XHRicmVhaztcbitcdGNhc2UgUlRQU0VfTUNVX1BPUlRfU1RTX0RFTElWRVJJTkc6XG4rXHRcdHB3X3N0YXR1cy1cdTAwM2VjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX0RFTElWRVJJTkc7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfVEVTVDpcbitcdFx0cHdfc3RhdHVzLVx1MDAzZWMzM19wd19zdGF0dXMgPSBFVEhUT09MX0MzM19QU0VfUFdfRF9TVEFUVVNfVEVTVDtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19GQVVMVDpcbitcdFx0cHdfc3RhdHVzLVx1MDAzZWMzM19wd19zdGF0dXMgPSBFVEhUT09MX0MzM19QU0VfUFdfRF9TVEFUVVNfRkFVTFQ7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfT1RIRVJfRkFVTFQ6XG4rXHRcdHB3X3N0YXR1cy1cdTAwM2VjMzNfcHdfc3RhdHVzID0gRVRIVE9PTF9DMzNfUFNFX1BXX0RfU1RBVFVTX09USEVSRkFVTFQ7XG4rXHRcdGJyZWFrO1xuK1x0ZGVmYXVsdDpcbitcdFx0cHdfc3RhdHVzLVx1MDAzZWMzM19wd19zdGF0dXMgPSBFVEhUT09MX0MzM19QU0VfUFdfRF9TVEFUVVNfVU5LTk9XTjtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHdfY2xhc3Moc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcbit7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcbitcdHN0cnVjdCBydHBzZV9tY3VfcG9ydF9zdGF0dXMgc3RhdHVzO1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHJ0cHNlX21jdV9wb3J0X2dldF9zdGF0dXMocHNlLCBpZCwgXHUwMDI2c3RhdHVzKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKlxuK1x0ICogQXMgcGVyIGRhdGFzaGVldCwgdGhlIGNsYXNzaWZpY2F0aW9uIHJlc3VsdCBpcyBvbmx5IHZhbGlkIHdoZW4gaW5cbitcdCAqIG9uZSBvZiB0aG9zZSBvcGVyYXRpb25hbCBtb2Rlcywgb3RoZXJ3aXNlIG5vdC5cbitcdCAqL1xuK1x0c3dpdGNoIChzdGF0dXMuc3RzMSkge1xuK1x0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfRElTQUJMRUQ6XG4rXHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19TRUFSQ0hJTkc6XG4rXHRjYXNlIFJUUFNFX01DVV9QT1JUX1NUU19ERUxJVkVSSU5HOlxuK1x0Y2FzZSBSVFBTRV9NQ1VfUE9SVF9TVFNfUkVRVUVTVElORzpcbitcdFx0cmV0dXJuIHBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZXBhcnNlX3BvcnRfY2xhc3MoXHUwMDI2c3RhdHVzKTtcbitcdGRlZmF1bHQ6XG4rXHRcdC8qXG4rXHRcdCAqIE5vIGNsYXNzIHRvIHJlcG9ydCwgcmV0dXJuIDAgaW5zdGVhZC4gVGhpcyBpcyBpbmRpc3Rpbmd1aXNoYWJsZVxuK1x0XHQgKiBmcm9tIGEgcmVhbCBjbGFzcy0wIFBEIGJ1dCB1c2Vyc3BhY2UgZGlzYW1iaWd1YXRlcyB2aWEgdGhlXG4rXHRcdCAqIHBvd2VyIHN0YXR1cy5cbitcdFx0ICovXG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9hY3R1YWxfcHcoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcbit7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcbitcdHN0cnVjdCBydHBzZV9tY3VfcG9ydF9tZWFzdXJlbWVudCBtZWFzdXJlbWVudDtcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBydHBzZV9tY3VfcG9ydF9nZXRfbWVhc3VyZW1lbnQocHNlLCBpZCwgXHUwMDI2bWVhc3VyZW1lbnQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdC8qIDEwMG1XIHBlciBMU0IgKi9cbitcdHJldHVybiBtZWFzdXJlbWVudC5wb3dlcl9yYXcgKiAxMDBVO1xuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF92b2x0YWdlKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQpXG4re1xuK1x0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfbWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQ7XG4rXHRpbnQgcmV0O1xuK1x0dTMyIHVWO1xuK1xuK1x0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X21lYXN1cmVtZW50KHBzZSwgaWQsIFx1MDAyNm1lYXN1cmVtZW50KTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKiA2NC40NW1WIHBlciBMU0IgKi9cbitcdHVWID0gbWVhc3VyZW1lbnQudm9sdGFnZV9yYXcgKiA2NDQ1MFU7XG4rXG4rXHQvKlxuK1x0ICogSWRsZSBwb3J0cyBtZWFzdXJlIDBWLCB3aGljaCB0aGUgY29yZSByZWplY3RzIHdoZW4gdHVybmluZyBhIHBvd2VyXG4rXHQgKiBsaW1pdCBpbnRvIGEgY3VycmVudCBsaW1pdC4gRmFsbCBiYWNrIHRvIHRoZSBub21pbmFsIHJhaWwgc28gYSBsaW1pdFxuK1x0ICogY2FuIGJlIHNldCBiZWZvcmUgYSBQRCBpcyBhdHRhY2hlZC5cbitcdCAqL1xuK1x0aWYgKCF1VilcbitcdFx0cmV0dXJuIFJUUFNFX01DVV9QU0VfVk9MVEFHRV9VVjtcbitcbitcdHJldHVybiBtaW5fdCh1MzIsIHVWLCBJTlRfTUFYKTtcbit9XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9lbmFibGUoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcbit7XG4rXHRyZXR1cm4gcnRwc2VfbWN1X3BvcnRfc2V0X3N0YXRlKHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KSwgaWQsIHRydWUpO1xuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2Rpc2FibGUoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcbit7XG4rXHRyZXR1cm4gcnRwc2VfbWN1X3BvcnRfc2V0X3N0YXRlKHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KSwgaWQsIGZhbHNlKTtcbit9XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfcG9ydF9nZXRfcHdfbGltaXQoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZClcbit7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcbitcdHN0cnVjdCBydHBzZV9tY3VfcG9ydF9leHRfY29uZmlnIGNvbmZpZztcbitcdGludCByZXQ7XG4rXG4rXHRyZXQgPSBydHBzZV9tY3VfcG9ydF9nZXRfZXh0X2NvbmZpZyhwc2UsIGlkLCBcdTAwMjZjb25maWcpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldHVybiBjb25maWcubWF4X3Bvd2VyICogcHNlLVx1MDAzZWNoaXAtXHUwMDNlcHdfcmVhZF9sc2JfbVc7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X3BvcnRfc2V0X3B3X2xpbWl0KHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQsIGludCBtYXhfbVcpXG4re1xuK1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKnR5cGVfb3BjLCAqdmFsX29wYztcbitcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpO1xuK1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm8gKmNoaXAgPSBwc2UtXHUwMDNlY2hpcDtcbitcdHU4IHByZ192YWw7XG4rXHRpbnQgcmV0O1xuK1xuK1x0aWYgKG1heF9tVyBcdTAwM2MgMCB8fCBtYXhfbVcgXHUwMDNlIGNoaXAtXHUwMDNlbWF4X21XX3Blcl9wb3J0KVxuK1x0XHRyZXR1cm4gLUVSQU5HRTtcbitcbitcdHR5cGVfb3BjID0gXHUwMDI2cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfVFlQRV07XG4rXHR2YWxfb3BjID0gXHUwMDI2cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlb3Bjb2RlW2NoaXAtXHUwMDNlcHdfc2V0X2NtZF07XG4rXHQvKiBwd19zZXRfbHNiX21XIGlzIHRoZSBkaXZpc29yIGJlbG93OyByZWplY3QgYSBjaGlwIHRoYXQgbGFja3MgaXQuICovXG4rXHRpZiAoIXR5cGVfb3BjLVx1MDAzZXZhbGlkIHx8ICF2YWxfb3BjLVx1MDAzZXZhbGlkIHx8ICFjaGlwLVx1MDAzZXB3X3NldF9sc2JfbVcpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdC8qXG4rXHQgKiBTd2l0Y2ggdGhlIHBvcnQgdG8gdXNlci1kZWZpbmVkIGxpbWl0IG1vZGUgZmlyc3QsIHRoZW4gcHJvZ3JhbSB0aGVcbitcdCAqIGxpbWl0IHZhbHVlLiBJZiB0aGUgc2Vjb25kIGNtZCBmYWlscywgdGhlIHBvcnQgaXMgbGVmdCBpblxuK1x0ICogdXNlci1kZWZpbmVkIG1vZGUgYnV0IHdpdGggdGhlIHByZXZpb3VzIGxpbWl0IHZhbHVlOyB0aGUgbmV4dFxuK1x0ICogc3VjY2Vzc2Z1bCBzZXRfcHdfbGltaXQgY2FsbCByZWNvdmVycyBpdC5cbitcdCAqL1xuK1x0cmV0ID0gcnRwc2VfbWN1X3BvcnRfY21kKHBzZSwgaWQsIHR5cGVfb3BjLVx1MDAzZW9wLCBSVFBTRV9NQ1VfUE9SVF9QV19MSU1JVF9UWVBFX1VTRVIpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdC8qXG4rXHQgKiBSb3VuZCB1cCBzbyBhIHN1Yi1MU0IgcmVxdWVzdCBtYXBzIHRvIG9uZSBMU0IsIG5vdCBzaWxlbnRseSB0byAwO1xuK1x0ICogYW4gZXhwbGljaXQgMCBzdGlsbCB5aWVsZHMgMCwgYW5kIExTQi1hbGlnbmVkIG1heGltYSBjYW4ndCBvdmVyc2hvb3QuXG4rXHQgKi9cbitcdHByZ192YWwgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIERJVl9ST1VORF9VUChtYXhfbVcsIGNoaXAtXHUwMDNlcHdfc2V0X2xzYl9tVyksIFU4X01BWCk7XG4rXG4rXHRyZXR1cm4gcnRwc2VfbWN1X3BvcnRfY21kKHBzZSwgaWQsIHZhbF9vcGMtXHUwMDNlb3AsIHByZ192YWwpO1xuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9wd19saW1pdF9yYW5nZXMoc3RydWN0IHBzZV9jb250cm9sbGVyX2RldiAqcGNkZXYsIGludCBpZCxcbitcdFx0XHRcdFx0ICAgICAgc3RydWN0IHBzZV9wd19saW1pdF9yYW5nZXMgKm91dClcbit7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSA9IHRvX3J0cHNlX21jdV9jdHJsKHBjZGV2KTtcbitcdHN0cnVjdCBldGh0b29sX2MzM19wc2VfcHdfbGltaXRfcmFuZ2UgKnJhbmdlO1xuK1xuK1x0cmFuZ2UgPSBremFsbG9jX29iaigqcmFuZ2UpO1xuK1x0aWYgKCFyYW5nZSlcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHRyYW5nZVswXS5taW4gPSAwO1xuK1x0cmFuZ2VbMF0ubWF4ID0gcHNlLVx1MDAzZWNoaXAtXHUwMDNlbWF4X21XX3Blcl9wb3J0O1xuK1xuK1x0b3V0LVx1MDAzZWMzM19wd19saW1pdF9yYW5nZXMgPSByYW5nZTtcbitcdHJldHVybiAxO1xuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X2dldF9wcmlvKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQpXG4re1xuK1x0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSB0b19ydHBzZV9tY3VfY3RybChwY2Rldik7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfZXh0X2NvbmZpZyBjb25maWc7XG4rXHRpbnQgcmV0O1xuK1xuK1x0cmV0ID0gcnRwc2VfbWN1X3BvcnRfZ2V0X2V4dF9jb25maWcocHNlLCBpZCwgXHUwMDI2Y29uZmlnKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXR1cm4gY29uZmlnLnByaW9yaXR5O1xuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9wb3J0X3NldF9wcmlvKHN0cnVjdCBwc2VfY29udHJvbGxlcl9kZXYgKnBjZGV2LCBpbnQgaWQsIHVuc2lnbmVkIGludCBwcmlvKVxuK3tcbitcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlID0gdG9fcnRwc2VfbWN1X2N0cmwocGNkZXYpO1xuK1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9vcGNvZGUgKm9wYztcbitcbitcdGlmIChwcmlvIFx1MDAzZSBSVFBTRV9NQ1VfUE9SVF9NQVhfUFJJT1JJVFkpXG4rXHRcdHJldHVybiAtRVJBTkdFO1xuK1xuK1x0b3BjID0gXHUwMDI2cHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlb3Bjb2RlW1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUFJJT1JJVFldO1xuK1x0aWYgKCFvcGMtXHUwMDNldmFsaWQpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdHJldHVybiBydHBzZV9tY3VfcG9ydF9jbWQocHNlLCBpZCwgb3BjLVx1MDAzZW9wLCBwcmlvKTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBwc2VfY29udHJvbGxlcl9vcHMgcnRwc2VfbWN1X29wcyA9IHtcbitcdC5waV9nZXRfYWRtaW5fc3RhdGUgPSBydHBzZV9tY3VfcG9ydF9nZXRfYWRtaW5fc3RhdGUsXG4rXHQucGlfZ2V0X3B3X3N0YXR1cyA9IHJ0cHNlX21jdV9wb3J0X2dldF9wd19zdGF0dXMsXG4rXHQucGlfZ2V0X3B3X2NsYXNzID0gcnRwc2VfbWN1X3BvcnRfZ2V0X3B3X2NsYXNzLFxuK1x0LnBpX2dldF9hY3R1YWxfcHcgPSBydHBzZV9tY3VfcG9ydF9nZXRfYWN0dWFsX3B3LFxuK1x0LnBpX2VuYWJsZSA9IHJ0cHNlX21jdV9wb3J0X2VuYWJsZSxcbitcdC5waV9kaXNhYmxlID0gcnRwc2VfbWN1X3BvcnRfZGlzYWJsZSxcbitcdC5waV9nZXRfdm9sdGFnZSA9IHJ0cHNlX21jdV9wb3J0X2dldF92b2x0YWdlLFxuK1x0LnBpX2dldF9wd19saW1pdCA9IHJ0cHNlX21jdV9wb3J0X2dldF9wd19saW1pdCxcbitcdC5waV9zZXRfcHdfbGltaXQgPSBydHBzZV9tY3VfcG9ydF9zZXRfcHdfbGltaXQsXG4rXHQucGlfZ2V0X3B3X2xpbWl0X3JhbmdlcyA9IHJ0cHNlX21jdV9wb3J0X2dldF9wd19saW1pdF9yYW5nZXMsXG4rXHQucGlfZ2V0X3ByaW8gPSBydHBzZV9tY3VfcG9ydF9nZXRfcHJpbyxcbitcdC5waV9zZXRfcHJpbyA9IHJ0cHNlX21jdV9wb3J0X3NldF9wcmlvLFxuK307XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfZGlzY292ZXIoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UsIHN0cnVjdCBydHBzZV9tY3VfaW5mbyAqaW5mbylcbit7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X2V4dF9jb25maWcgZXh0X2NvbmZpZztcbitcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmU7XG4rXHRpbnQgcmV0O1xuK1xuK1x0LypcbitcdCAqIEEgYm9vdGluZyBNQ1UgbWF5IHN0YXkgc2lsZW50ICgtRVRJTUVET1VUKSwgbm90IEFDSyBpdHMgYWRkcmVzc1xuK1x0ICogKC1FTlhJTyAvIC1FUkVNT1RFSU8pLCByZXBvcnQgbm90LXJlYWR5ICgtRUFHQUlOKSwgb3IgZW1pdCBhXG4rXHQgKiBjb3JydXB0L3BhcnRpYWwgZnJhbWUgKC1FQkFETVNHIC8gLUVCQURFKS4gUmV0cnkgdGhvc2Ugd2l0aGluIGFcbitcdCAqIGJvdW5kZWQgd2luZG93OyBvdGhlciBlcnJvcnMgKGUuZy4gLUVPUE5PVFNVUFApIGFyZSBmYXRhbCBhbmQgZmFpbFxuK1x0ICogaW1tZWRpYXRlbHkuXG4rXHQgKi9cbitcdGRlYWRsaW5lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUlRQU0VfTUNVX0JPT1RfVElNRU9VVF9NUyk7XG4rXHRkbyB7XG4rXHRcdHJldCA9IHJ0cHNlX21jdV9nZXRfaW5mbyhwc2UsIGluZm8pO1xuK1x0XHRpZiAocmV0ICE9IC1FVElNRURPVVQgXHUwMDI2XHUwMDI2IHJldCAhPSAtRU5YSU8gXHUwMDI2XHUwMDI2IHJldCAhPSAtRVJFTU9URUlPIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgcmV0ICE9IC1FQUdBSU4gXHUwMDI2XHUwMDI2IHJldCAhPSAtRUJBRE1TRyBcdTAwMjZcdTAwMjYgcmV0ICE9IC1FQkFERSlcbitcdFx0XHRicmVhaztcbitcdFx0bXNsZWVwKFJUUFNFX01DVV9CT09UX1JFVFJZX01TKTtcbitcdH0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGRlYWRsaW5lKSk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXHUwMDNlZGV2LCByZXQsIFwiZmFpbGVkIHRvIHJlYWQgTUNVIGluZm9cXG5cIik7XG4rXG4rXHRzd2l0Y2ggKGluZm8tXHUwMDNlZGV2aWNlX2lkKSB7XG4rXHRjYXNlIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOEI6XG4rXHRcdHBzZS1cdTAwM2VjaGlwID0gXHUwMDI2cnRsODIzOGJfaW5mbztcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJUUFNFX01DVV9ERVZJQ0VfSURfUlRMODIzOTpcbitcdFx0cHNlLVx1MDAzZWNoaXAgPSBcdTAwMjZydGw4MjM5X2luZm87XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBSVFBTRV9NQ1VfREVWSUNFX0lEX1JUTDgyMzlDOlxuK1x0XHRwc2UtXHUwMDNlY2hpcCA9IFx1MDAyNnJ0bDgyMzljX2luZm87XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBSVFBTRV9NQ1VfREVWSUNFX0lEX0JDTTU5MTExOlxuK1x0XHRwc2UtXHUwMDNlY2hpcCA9IFx1MDAyNmJjbTU5MTExX2luZm87XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBSVFBTRV9NQ1VfREVWSUNFX0lEX0JDTTU5MTIxOlxuK1x0XHRwc2UtXHUwMDNlY2hpcCA9IFx1MDAyNmJjbTU5MTIxX2luZm87XG4rXHRcdGJyZWFrO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLVx1MDAzZWRldiwgLUVJTlZBTCwgXCJ1bmtub3duIFBTRSBpZCAweCV4XFxuXCIsXG4rXHRcdFx0XHQgICAgIGluZm8tXHUwMDNlZGV2aWNlX2lkKTtcbitcdH1cbitcbitcdGlmICghaW5mby1cdTAwM2VtYXhfcG9ydHMgfHwgaW5mby1cdTAwM2VtYXhfcG9ydHMgXHUwMDNlIFJUUFNFX01DVV9NQVhfUE9SVFMpXG4rXHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKHBzZS1cdTAwM2VkZXYsIC1FSU5WQUwsXG4rXHRcdFx0XHQgICAgIFwiTUNVIHJlcG9ydHMgaW52YWxpZCBwb3J0IGNvdW50ICV1XFxuXCIsIGluZm8tXHUwMDNlbWF4X3BvcnRzKTtcbitcbitcdHJldCA9IHJ0cHNlX21jdV9nZXRfZXh0X2NvbmZpZyhwc2UsIFx1MDAyNmV4dF9jb25maWcpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLVx1MDAzZWRldiwgcmV0LCBcImZhaWxlZCB0byByZWFkIE1DVSBleHQgY29uZmlnXFxuXCIpO1xuK1xuK1x0ZGV2X2luZm8ocHNlLVx1MDAzZWRldiwgXCIlcyBNQ1UsICVzIChpZCAweCUwNHgpLCAldSBwb3J0cyBhY3Jvc3MgJXUgUFNFIGNoaXAocylcXG5cIixcbitcdFx0IHBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZW1jdV90eXBlX3N0cihpbmZvLVx1MDAzZW1jdV90eXBlKSwgcHNlLVx1MDAzZWNoaXAtXHUwMDNlbmFtZSxcbitcdFx0IGluZm8tXHUwMDNlZGV2aWNlX2lkLCBpbmZvLVx1MDAzZW1heF9wb3J0cywgZXh0X2NvbmZpZy5udW1fb2ZfcHNlcyk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgcnRwc2VfbWN1X2dsb2JhbF9kaXNhYmxlKHZvaWQgKmRhdGEpXG4re1xuK1x0c3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UgPSBkYXRhO1xuK1xuK1x0cnRwc2VfbWN1X3NldF9nbG9iYWxfc3RhdGUocHNlLCBmYWxzZSk7XG4rfVxuK1xuK2ludCBydHBzZV9tY3VfcmVnaXN0ZXIoc3RydWN0IHJ0cHNlX21jdV9jdHJsICpwc2UpXG4re1xuK1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhICptYXRjaDtcbitcdHN0cnVjdCBydHBzZV9tY3VfaW5mbyBpbmZvO1xuK1x0c3RydWN0IGdwaW9fZGVzYyAqZ3Bpb2Q7XG4rXHRpbnQgcmV0O1xuK1xuK1x0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgcnRwc2VfbWN1X21zZykgIT0gUlRQU0VfTUNVX01TR19TSVpFKTtcbitcbitcdHJldCA9IGRldm1fbXV0ZXhfaW5pdChwc2UtXHUwMDNlZGV2LCBcdTAwMjZwc2UtXHUwMDNlbXV0ZXgpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdG1hdGNoID0gZGV2aWNlX2dldF9tYXRjaF9kYXRhKHBzZS1cdTAwM2VkZXYpO1xuK1x0aWYgKCFtYXRjaClcbitcdFx0cmV0dXJuIGRldl9lcnJfcHJvYmUocHNlLVx1MDAzZWRldiwgLUVOT0RFViwgXCJtaXNzaW5nIG1hdGNoIGRhdGFcXG5cIik7XG4rXHRwc2UtXHUwMDNlZGlhbGVjdCA9IG1hdGNoLVx1MDAzZWRpYWxlY3Q7XG4rXG4rXHQvKlxuK1x0ICogQ2F0Y2ggYSBkaWFsZWN0IHRoYXQgZm9yZ290IHRvIHNldCBvbmUgb2YgdGhlIHJlcXVpcmVkIGhvb2tzIGF0XG4rXHQgKiBwcm9iZSB0aW1lLCByYXRoZXIgdGhhbiBOVUxMLWRlcmVmJ2luZyBsYXRlciBmcm9tIGEgZmFzdCBwYXRoLlxuK1x0ICovXG4rXHRpZiAoIXBzZS1cdTAwM2VkaWFsZWN0IHx8XG4rXHQgICAgIXBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZXBhcnNlX3N5c3RlbV9pbmZvIHx8XG4rXHQgICAgIXBzZS1cdTAwM2VkaWFsZWN0LVx1MDAzZXBhcnNlX3BvcnRfY2xhc3MgfHxcbitcdCAgICAhcHNlLVx1MDAzZWRpYWxlY3QtXHUwMDNlbWN1X3R5cGVfc3RyKVxuK1x0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXHUwMDNlZGV2LCAtRUlOVkFMLFxuK1x0XHRcdFx0ICAgICBcImRpYWxlY3QgZm9yIGNoaXAgaXMgaW5jb21wbGV0ZVxcblwiKTtcbitcbitcdC8qXG4rXHQgKiBSZWxlYXNlIHRoZSBNQ1UgZnJvbSByZXNldCBiZWZvcmUgdGhlIGZpcnN0IHRyYW5zYWN0aW9uOyB0aGVcbitcdCAqIGJvb3QtcmV0cnkgbG9vcCBpbiBkaXNjb3ZlcigpIHdhaXRzIGZvciBpdCB0byBhbnN3ZXIuXG4rXHQgKi9cbitcdGdwaW9kID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwocHNlLVx1MDAzZWRldiwgXCJyZXNldFwiLCBHUElPRF9PVVRfTE9XKTtcbitcdGlmIChJU19FUlIoZ3Bpb2QpKVxuK1x0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShwc2UtXHUwMDNlZGV2LCBQVFJfRVJSKGdwaW9kKSxcbitcdFx0XHRcdCAgICAgXCJmYWlsZWQgdG8gZ2V0IHJlc2V0IGdwaW9cXG5cIik7XG4rXG4rXHRyZXQgPSBydHBzZV9tY3VfZGlzY292ZXIocHNlLCBcdTAwMjZpbmZvKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKlxuK1x0ICogU29tZSBib2FyZHMgZ2F0ZSBhbGwgcG9ydHMgdGhyb3VnaCBhIGhhcmR3YXJlIGxpbmU7IGRlYXNzZXJ0IGl0IG9ubHlcbitcdCAqIG9uY2UgdGhlIE1DVSBpcyBjb25maXJtZWQgcHJlc2VudCwgc28gYSBmYWlsZWQgcHJvYmUgbGVhdmVzIHRoZSBwb3J0c1xuK1x0ICogZ2F0ZWQuIEZyb20gaGVyZSB0aGUgTUNVIHByb3RvY29sIGdvdmVybnMgcGVyLXBvcnQgYWRtaW4gc3RhdGUuXG4rXHQgKi9cbitcdGdwaW9kID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwocHNlLVx1MDAzZWRldiwgXCJkaXNhYmxlLXBvcnRzXCIsIEdQSU9EX09VVF9MT1cpO1xuK1x0aWYgKElTX0VSUihncGlvZCkpXG4rXHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKHBzZS1cdTAwM2VkZXYsIFBUUl9FUlIoZ3Bpb2QpLFxuK1x0XHRcdFx0ICAgICBcImZhaWxlZCB0byBnZXQgZGlzYWJsZS1wb3J0cyBncGlvXFxuXCIpO1xuK1xuK1x0aWYgKCFpbmZvLnN5c3RlbV9lbmFibGUpIHtcbitcdFx0cmV0ID0gcnRwc2VfbWN1X3NldF9nbG9iYWxfc3RhdGUocHNlLCB0cnVlKTtcbitcdFx0LyogRGlhbGVjdHMgd2l0aG91dCBhIGdsb2JhbC1zdGF0ZSBjb25jZXB0IChlLmcuIEdlbjEpIHJldHVyblxuK1x0XHQgKiAtRU9QTk9UU1VQUDsgdHJlYXQgdGhhdCBhcyBcIm5vIHNlcGFyYXRlIGVuYWJsZSByZXF1aXJlZFwiLlxuK1x0XHQgKi9cbitcdFx0aWYgKHJldCBcdTAwMjZcdTAwMjYgcmV0ICE9IC1FT1BOT1RTVVBQKVxuK1x0XHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKHBzZS1cdTAwM2VkZXYsIHJldCxcbitcdFx0XHRcdFx0ICAgICBcImZhaWxlZCB0byBlbmFibGUgUFNFIHN5c3RlbVxcblwiKTtcbitcdFx0aWYgKCFyZXQpIHtcbitcdFx0XHRyZXQgPSBkZXZtX2FkZF9hY3Rpb25fb3JfcmVzZXQocHNlLVx1MDAzZWRldixcbitcdFx0XHRcdFx0XHQgICAgICAgcnRwc2VfbWN1X2dsb2JhbF9kaXNhYmxlLCBwc2UpO1xuK1x0XHRcdGlmIChyZXQpXG4rXHRcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogRGVwZW5kaW5nIG9uIHRoZSBNQ1UgZmlybXdhcmUgY29uZmlndXJhdGlvbiAod2hpY2ggbWlnaHQgYmUgZGlmZmVyZW50XG4rXHQgKiBmb3IgZXZlcnkgYm9hcmQpLCBpdCBpc24ndCBrbm93biB3aGV0aGVyIHRoZSBQb0Ugc3Vic3lzdGVtIGlzIGFjdGl2ZSBvclxuK1x0ICogaW5hY3RpdmUgYnkgZGVmYXVsdC4gQXQgdGhpcyBzdGFnZSwgdGhlIFBTRSBjaGlwcyBtaWdodCBhbHJlYWR5IGRlbGl2ZXJcbitcdCAqIHBvd2VyIHRvIFBEcyB3aXRob3V0IGFueSBleHBsaWNpdCBlbmFibGUuXG4rXHQgKi9cbitcbitcdC8qIHBjZGV2Lm93bmVyIGlzIHNldCBieSB0aGUgdHJhbnNwb3J0LCBzbyB0aGUgcmVnaXN0ZXJlZCBjb250cm9sbGVyXG4rXHQgKiBwaW5zIHRoZSB0cmFuc3BvcnQgbW9kdWxlIHRoYXQgb3ducyB0aGUgbGl2ZSBkZXZpY2UsIG5vdCB0aGUgY29yZS5cbitcdCAqL1xuK1x0cHNlLVx1MDAzZXBjZGV2Lm9wcyAgICAgID0gXHUwMDI2cnRwc2VfbWN1X29wcztcbitcdHBzZS1cdTAwM2VwY2Rldi5kZXYgICAgICA9IHBzZS1cdTAwM2VkZXY7XG4rXHRwc2UtXHUwMDNlcGNkZXYudHlwZXMgICAgPSBFVEhUT09MX1BTRV9DMzM7XG4rXHRwc2UtXHUwMDNlcGNkZXYubnJfbGluZXMgPSBpbmZvLm1heF9wb3J0cztcbitcdHBzZS1cdTAwM2VwY2Rldi5waXNfcHJpb19tYXggPSBSVFBTRV9NQ1VfUE9SVF9NQVhfUFJJT1JJVFk7XG4rXHRwc2UtXHUwMDNlcGNkZXYuc3VwcF9idWRnZXRfZXZhbF9zdHJhdGVnaWVzID0gUFNFX0JVREdFVF9FVkFMX1NUUkFUX0RZTkFNSUM7XG4rXG4rXHRyZXR1cm4gZGV2bV9wc2VfY29udHJvbGxlcl9yZWdpc3Rlcihwc2UtXHUwMDNlZGV2LCBcdTAwMjZwc2UtXHUwMDNlcGNkZXYpO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChydHBzZV9tY3VfcmVnaXN0ZXIpO1xuK1xuK3N0YXRpYyB2b2lkIHJ0cHNlX21jdV9nZW4yX3BhcnNlX3N5c3RlbV9pbmZvKGNvbnN0IHU4ICpwYXlsb2FkLCBzdHJ1Y3QgcnRwc2VfbWN1X2luZm8gKmluZm8pXG4re1xuK1x0aW5mby1cdTAwM2VtYXhfcG9ydHMgPSBwYXlsb2FkWzFdO1xuK1x0aW5mby1cdTAwM2VzeXN0ZW1fZW5hYmxlID0gKHBheWxvYWRbMl0gPT0gMHgxKTtcbitcdGluZm8tXHUwMDNlZGV2aWNlX2lkID0gZ2V0X3VuYWxpZ25lZF9iZTE2KFx1MDAyNnBheWxvYWRbM10pO1xuK1x0aW5mby1cdTAwM2VtY3VfdHlwZSA9IHBheWxvYWRbNl07XG4rfVxuK1xuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X2dlbjJfcGFyc2VfcG9ydF9jbGFzcyhjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X3BvcnRfc3RhdHVzICpzdGF0dXMpXG4re1xuK1x0LyogQ2xhc3MgbGl2ZXMgaW4gdGhlIHVwcGVyIG5pYmJsZSBvZiBzdHMyLiAqL1xuK1x0cmV0dXJuIEZJRUxEX0dFVChHRU5NQVNLKDcsIDQpLCBzdGF0dXMtXHUwMDNlc3RzMik7XG4rfVxuK1xuK3N0YXRpYyBjb25zdCBjaGFyICpydHBzZV9tY3VfZ2VuMl9tY3VfdHlwZV9zdHIodW5zaWduZWQgaW50IG1jdV90eXBlKVxuK3tcbitcdHN3aXRjaCAobWN1X3R5cGUpIHtcbitcdGNhc2UgMHgwMDpcdHJldHVybiBcIkdpZ2FEZXZpY2UgR0QzMkYzMTBcIjtcbitcdGNhc2UgMHgwMTpcdHJldHVybiBcIkdpZ2FEZXZpY2UgR0QzMkYyMzBcIjtcbitcdGNhc2UgMHgwMjpcdHJldHVybiBcIkdpZ2FEZXZpY2UgR0QzMkYzMDNcIjtcbitcdGNhc2UgMHgwMzpcdHJldHVybiBcIkdpZ2FEZXZpY2UgR0QzMkYxMDNcIjtcbitcdGNhc2UgMHgwNDpcdHJldHVybiBcIkdpZ2FEZXZpY2UgR0QzMkUxMDNcIjtcbitcdGNhc2UgMHgxMDpcdHJldHVybiBcIk51dm90b24gTTA1MTZcIjtcbitcdGNhc2UgMHgxMTpcdHJldHVybiBcIk51dm90b24gTTA1NjRcIjtcbitcdGNhc2UgMHgxMjpcdHJldHVybiBcIk51dm90b24gTlVDMDI5XCI7XG4rXHRkZWZhdWx0Olx0cmV0dXJuIFwidW5rbm93blwiO1xuK1x0fVxuK31cbitcbitzdGF0aWMgdm9pZCBydHBzZV9tY3VfZ2VuMV9wYXJzZV9zeXN0ZW1faW5mbyhjb25zdCB1OCAqcGF5bG9hZCwgc3RydWN0IHJ0cHNlX21jdV9pbmZvICppbmZvKVxuK3tcbitcdGluZm8tXHUwMDNlbWF4X3BvcnRzID0gcGF5bG9hZFsxXTtcbitcdC8qIEdlbjEgaGFzIG5vIGV4cGxpY2l0IHN5c3RlbV9lbmFibGUgYnl0ZTsgdGhlIGNsb3Nlc3QgYW5hbG9nIGlzIHRoZVxuK1x0ICogXCJyZW1vdGUgZW5hYmxlXCIgYml0IGluIHRoZSBzeXN0ZW0tc3RhdHVzIGZsYWdzIGF0IHBheWxvYWRbN10uXG4rXHQgKi9cbitcdGluZm8tXHUwMDNlc3lzdGVtX2VuYWJsZSA9ICEhKHBheWxvYWRbN10gXHUwMDI2IEJJVCgyKSk7XG4rXHRpbmZvLVx1MDAzZWRldmljZV9pZCA9IGdldF91bmFsaWduZWRfYmUxNihcdTAwMjZwYXlsb2FkWzNdKTtcbitcdGluZm8tXHUwMDNlbWN1X3R5cGUgPSBwYXlsb2FkWzZdO1xuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9nZW4xX3BhcnNlX3BvcnRfY2xhc3MoY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9wb3J0X3N0YXR1cyAqc3RhdHVzKVxuK3tcbitcdC8qIEdlbjEgcHV0cyB0aGUgZGV0ZWN0ZWQgY2xhc3MgaW4gcGF5bG9hZFszXSAoPT0gc3RzMykgZGlyZWN0bHkuXG4rXHQgKiBNYXNrIHRvIHRoZSBsb3cgbmliYmxlOyBjbGFzcyBpcyAwLi44IGFuZCBhbnkgaGlnaCBiaXRzIHdvdWxkIGJlXG4rXHQgKiBub2lzZS5cbitcdCAqL1xuK1x0cmV0dXJuIHN0YXR1cy1cdTAwM2VzdHMzIFx1MDAyNiAweDBmO1xuK31cbitcbitzdGF0aWMgY29uc3QgY2hhciAqcnRwc2VfbWN1X2dlbjFfbWN1X3R5cGVfc3RyKHVuc2lnbmVkIGludCBtY3VfdHlwZSlcbit7XG4rXHRzd2l0Y2ggKG1jdV90eXBlKSB7XG4rXHRjYXNlIDB4MDA6XHRyZXR1cm4gXCJTVCBNaWNybyBTVDMyRjEwMFwiO1xuK1x0Y2FzZSAweDAxOlx0cmV0dXJuIFwiTnV2b3RvbiBNMDV4eCBMQU5cIjtcbitcdGNhc2UgMHgwMjpcdHJldHVybiBcIlNUIE1pY3JvIFNURjAzMEM4XCI7XG4rXHRjYXNlIDB4MDM6XHRyZXR1cm4gXCJOdXZvdG9uIE0wNThTQU5cIjtcbitcdGNhc2UgMHgwNDpcdHJldHVybiBcIk51dm90b24gTlVDMTIyXCI7XG4rXHRkZWZhdWx0Olx0cmV0dXJuIFwidW5rbm93blwiO1xuK1x0fVxuK31cbitcbisvKiBNYXAgZWFjaCBsb2dpY2FsIGNvbW1hbmQgdGhlIGNvcmUgaXNzdWVzIHRvIGl0cyBwZXItZGlhbGVjdCBvcGNvZGUuICovXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfZGlhbGVjdCBydHBzZV9tY3VfZGlhbGVjdF9nZW4yID0ge1xuK1x0LnBhcnNlX3N5c3RlbV9pbmZvID0gcnRwc2VfbWN1X2dlbjJfcGFyc2Vfc3lzdGVtX2luZm8sXG4rXHQucGFyc2VfcG9ydF9jbGFzcyAgPSBydHBzZV9tY3VfZ2VuMl9wYXJzZV9wb3J0X2NsYXNzLFxuK1x0Lm1jdV90eXBlX3N0ciAgICAgID0gcnRwc2VfbWN1X2dlbjJfbWN1X3R5cGVfc3RyLFxuK1x0Lm9wY29kZSA9IHtcbitcdFx0W1JUUFNFX01DVV9DTURfU0VUX0dMT0JBTF9TVEFURV1cdD0gUlRQU0VfTUNVX09QKDB4MDApLFxuK1x0XHRbUlRQU0VfTUNVX0NNRF9HRVRfU1lTVEVNX0lORk9dXHRcdD0gUlRQU0VfTUNVX09QKDB4NDApLFxuK1x0XHRbUlRQU0VfTUNVX0NNRF9HRVRfRVhUX0NPTkZJR11cdFx0PSBSVFBTRV9NQ1VfT1AoMHg0YSksXG4rXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfRU5BQkxFXVx0XHQ9IFJUUFNFX01DVV9PUCgweDAxKSxcbitcdFx0W1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfVFlQRV0gPSBSVFBTRV9NQ1VfT1AoMHgxMiksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUXVx0PSBSVFBTRV9NQ1VfT1AoMHgxMyksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUX0VYVF0gPSBSVFBTRV9NQ1VfT1AoMHgxNCksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BSSU9SSVRZXVx0PSBSVFBTRV9NQ1VfT1AoMHgxNSksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1NUQVRVU11cdFx0PSBSVFBTRV9NQ1VfT1AoMHg0MiksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1BPV0VSX1NUQVRTXVx0PSBSVFBTRV9NQ1VfT1AoMHg0NCksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0NPTkZJR11cdFx0PSBSVFBTRV9NQ1VfT1AoMHg0OCksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0VYVF9DT05GSUddXHQ9IFJUUFNFX01DVV9PUCgweDQ5KSxcbitcdH0sXG4rfTtcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9kaWFsZWN0IHJ0cHNlX21jdV9kaWFsZWN0X2dlbjEgPSB7XG4rXHQucGFyc2Vfc3lzdGVtX2luZm8gPSBydHBzZV9tY3VfZ2VuMV9wYXJzZV9zeXN0ZW1faW5mbyxcbitcdC5wYXJzZV9wb3J0X2NsYXNzICA9IHJ0cHNlX21jdV9nZW4xX3BhcnNlX3BvcnRfY2xhc3MsXG4rXHQubWN1X3R5cGVfc3RyICAgICAgPSBydHBzZV9tY3VfZ2VuMV9tY3VfdHlwZV9zdHIsXG4rXHQub3Bjb2RlID0ge1xuK1x0XHRbUlRQU0VfTUNVX0NNRF9HRVRfU1lTVEVNX0lORk9dXHRcdD0gUlRQU0VfTUNVX09QKDB4MjApLFxuK1x0XHRbUlRQU0VfTUNVX0NNRF9HRVRfRVhUX0NPTkZJR11cdFx0PSBSVFBTRV9NQ1VfT1AoMHgyYiksXG4rXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfRU5BQkxFXVx0XHQ9IFJUUFNFX01DVV9PUCgweDAwKSxcbitcdFx0W1JUUFNFX01DVV9DTURfUE9SVF9TRVRfUE9XRVJfTElNSVRfVFlQRV0gPSBSVFBTRV9NQ1VfT1AoMHgxNSksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BPV0VSX0xJTUlUXVx0PSBSVFBTRV9NQ1VfT1AoMHgxNiksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfU0VUX1BSSU9SSVRZXVx0PSBSVFBTRV9NQ1VfT1AoMHgxYSksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1NUQVRVU11cdFx0PSBSVFBTRV9NQ1VfT1AoMHgyMSksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX1BPV0VSX1NUQVRTXVx0PSBSVFBTRV9NQ1VfT1AoMHgzMCksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0NPTkZJR11cdFx0PSBSVFBTRV9NQ1VfT1AoMHgyNSksXG4rXHRcdFtSVFBTRV9NQ1VfQ01EX1BPUlRfR0VUX0VYVF9DT05GSUddXHQ9IFJUUFNFX01DVV9PUCgweDI2KSxcbitcdH0sXG4rfTtcbitcbitjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21hdGNoX2RhdGEgcnRwc2VfbWN1X2dlbjFfZGF0YSA9IHtcbitcdC5kaWFsZWN0ID0gXHUwMDI2cnRwc2VfbWN1X2RpYWxlY3RfZ2VuMSxcbit9O1xuK0VYUE9SVF9TWU1CT0xfR1BMKHJ0cHNlX21jdV9nZW4xX2RhdGEpO1xuK1xuK2NvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMl9kYXRhID0ge1xuK1x0LmRpYWxlY3QgPSBcdTAwMjZydHBzZV9tY3VfZGlhbGVjdF9nZW4yLFxuK307XG4rRVhQT1JUX1NZTUJPTF9HUEwocnRwc2VfbWN1X2dlbjJfZGF0YSk7XG4rXG4rLyogU2FtZSBkaWFsZWN0IGFzIGdlbjIsIGJ1dCB0aGUgTUNVIGV4cGVjdHMgcmF3LUkyQyBmcmFtaW5nLiAqL1xuK2NvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMl9pMmNfZGF0YSA9IHtcbitcdC5kaWFsZWN0ID0gXHUwMDI2cnRwc2VfbWN1X2RpYWxlY3RfZ2VuMixcbitcdC5uYXRpdmVfaTJjID0gdHJ1ZSxcbit9O1xuK0VYUE9SVF9TWU1CT0xfR1BMKHJ0cHNlX21jdV9nZW4yX2kyY19kYXRhKTtcbitcbitNT0RVTEVfQVVUSE9SKFwiSm9uYXMgSmVsb25layBcdTAwM2NqZWxvbmVrLmpvbmFzQGdtYWlsLmNvbVx1MDAzZVwiKTtcbitNT0RVTEVfREVTQ1JJUFRJT04oXCJSZWFsdGVrIFBTRSBNQ1UgZHJpdmVyIChjb3JlKVwiKTtcbitNT0RVTEVfTElDRU5TRShcIkdQTFwiKTtcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LWkyYy5jIGIvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS1pMmMuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmUxMGY4YzYzM2I2OGVcbi0tLSAvZGV2L251bGxcbisrKyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtaTJjLmNcbkBAIC0wLDAgKzEsMTcwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWxheS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaTJjLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L29mLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9wc2UtcGQvcHNlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmcuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwicmVhbHRlay1wc2UtbWN1LmhcIlxuK1xuKy8qXG4rICogVGhlIGNvcmUgaGFzIGFscmVhZHkgd2FpdGVkIFJUUFNFX01DVV9SRVNQT05TRV9NUyBiZWZvcmUgY2FsbGluZyB1cywgc29cbisgKiB0aGUgcmVzcG9uc2UgaXMgbm9ybWFsbHkgcmVhZHkgb24gdGhlIHZlcnkgZmlyc3QgcmVhZC4gRm9yIGNvbW1hbmRzIHRoZVxuKyAqIE1DVSBwcm9kdWNlcyBtb3JlIHNsb3dseSwga2VlcCBwb2xsaW5nIGF0IHRoZSB0eXBpY2FsIHJlc3BvbnNlIGNhZGVuY2VcbisgKiB1cCB0byB0aGUgd29yc3QtY2FzZSBjZWlsaW5nLlxuKyAqL1xuKyNkZWZpbmUgUlRQU0VfTUNVX0kyQ19SRVRSWV9NU1x0UlRQU0VfTUNVX1JFU1BPTlNFX01TXG4rI2RlZmluZSBSVFBTRV9NQ1VfSTJDX01BWF9UUklFU1x0KFJUUFNFX01DVV9SRVNQT05TRV9NQVhfTVMgLyBSVFBTRV9NQ1VfSTJDX1JFVFJZX01TKVxuK1xuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X2kyY19zbWJ1c19zZW5kKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxKVxuK3tcbitcdHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHBzZS1cdTAwM2VkZXYpO1xuK1xuK1x0LyogU2VuZCBvcGNvZGUgYXMgU01CdXMgY29tbWFuZCBieXRlOyByZW1haW5pbmcgMTEgYnl0ZXMgYXMgYmxvY2sgZGF0YSAqL1xuK1x0cmV0dXJuIGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShjbGllbnQsIHJlcS1cdTAwM2VvcGNvZGUsIFJUUFNFX01DVV9NU0dfU0laRSAtIDEsXG4rXHRcdFx0XHRcdCAgICAgICh1OCAqKXJlcSArIDEpO1xuK31cbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV9pMmNfc21idXNfcmVjdihzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSxcbitcdFx0XHRcdCAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcbit7XG4rXHRzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChwc2UtXHUwMDNlZGV2KTtcbitcdGludCB0cmllcywgcmV0O1xuK1xuK1x0Zm9yICh0cmllcyA9IDA7IHRyaWVzIFx1MDAzYyBSVFBTRV9NQ1VfSTJDX01BWF9UUklFUzsgdHJpZXMrKykge1xuK1x0XHRpZiAodHJpZXMgXHUwMDNlIDApXG4rXHRcdFx0bXNsZWVwKFJUUFNFX01DVV9JMkNfUkVUUllfTVMpO1xuK1xuK1x0XHQvKiBNQ1UgbmVlZHMgMHgwMCBhcyBjb21tYW5kIGJ5dGUgZm9yIHJlYWQgKi9cbitcdFx0cmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCAweDAwLFxuK1x0XHRcdFx0XHRcdCAgICBSVFBTRV9NQ1VfTVNHX1NJWkUsXG4rXHRcdFx0XHRcdFx0ICAgICh1OCAqKXJlc3ApO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXHRcdGlmIChyZXQgPT0gUlRQU0VfTUNVX01TR19TSVpFIFx1MDAyNlx1MDAyNiBydHBzZV9tY3VfcmVzcF9pc19maW5hbChyZXEsIHJlc3ApKVxuK1x0XHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0cmV0dXJuIC1FVElNRURPVVQ7XG4rfVxuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X3RyYW5zcG9ydF9vcHMgcnRwc2VfbWN1X2kyY19zbWJ1c19vcHMgPSB7XG4rXHQuc2VuZCA9IHJ0cHNlX21jdV9pMmNfc21idXNfc2VuZCxcbitcdC5yZWN2ID0gcnRwc2VfbWN1X2kyY19zbWJ1c19yZWN2LFxuK307XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfaTJjX25hdGl2ZV9zZW5kKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxKVxuK3tcbitcdHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHBzZS1cdTAwM2VkZXYpO1xuK1x0dm9pZCAqYnVmO1xuK1x0aW50IHJldDtcbitcbitcdC8qIGkyY19tYXN0ZXJfc2VuZCgpIG1heSBETUEsIHNvIHRoZSBidWZmZXIgbXVzdCBub3QgYmUgb24gdGhlIHN0YWNrLiAqL1xuK1x0YnVmID0ga21lbWR1cChyZXEsIFJUUFNFX01DVV9NU0dfU0laRSwgR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIWJ1ZilcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXG4rXHRyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIFJUUFNFX01DVV9NU0dfU0laRSk7XG4rXHRrZnJlZShidWYpO1xuK1x0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHJldDtcbitcdHJldHVybiByZXQgPT0gUlRQU0VfTUNVX01TR19TSVpFID8gMCA6IC1FSU87XG4rfVxuK1xuK3N0YXRpYyBpbnQgcnRwc2VfbWN1X2kyY19uYXRpdmVfcmVjdihzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSxcbitcdFx0XHRcdCAgICAgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlc3ApXG4re1xuK1x0c3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQocHNlLVx1MDAzZWRldik7XG4rXHRpbnQgdHJpZXMsIHJldDtcbitcdHU4ICpidWY7XG4rXG4rXHQvKiBpMmNfbWFzdGVyX3JlY3YoKSBtYXkgRE1BLCBzbyByZWFkIGludG8gYW4gb2ZmLXN0YWNrIGJ1ZmZlci4gKi9cbitcdGJ1ZiA9IGttYWxsb2MoUlRQU0VfTUNVX01TR19TSVpFLCBHRlBfS0VSTkVMKTtcbitcdGlmICghYnVmKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdGZvciAodHJpZXMgPSAwOyB0cmllcyBcdTAwM2MgUlRQU0VfTUNVX0kyQ19NQVhfVFJJRVM7IHRyaWVzKyspIHtcbitcdFx0aWYgKHRyaWVzIFx1MDAzZSAwKVxuK1x0XHRcdG1zbGVlcChSVFBTRV9NQ1VfSTJDX1JFVFJZX01TKTtcbitcbitcdFx0cmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgYnVmLCBSVFBTRV9NQ1VfTVNHX1NJWkUpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRpZiAocmV0ID09IFJUUFNFX01DVV9NU0dfU0laRSkge1xuK1x0XHRcdG1lbWNweShyZXNwLCBidWYsIFJUUFNFX01DVV9NU0dfU0laRSk7XG4rXHRcdFx0aWYgKHJ0cHNlX21jdV9yZXNwX2lzX2ZpbmFsKHJlcSwgcmVzcCkpIHtcbitcdFx0XHRcdHJldCA9IDA7XG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0XHR9XG4rXHRcdH1cbitcdH1cbitcdHJldCA9IC1FVElNRURPVVQ7XG4rb3V0OlxuK1x0a2ZyZWUoYnVmKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X3RyYW5zcG9ydF9vcHMgcnRwc2VfbWN1X2kyY19uYXRpdmVfb3BzID0ge1xuK1x0LnNlbmQgPSBydHBzZV9tY3VfaTJjX25hdGl2ZV9zZW5kLFxuK1x0LnJlY3YgPSBydHBzZV9tY3VfaTJjX25hdGl2ZV9yZWN2LFxuK307XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpXG4re1xuK1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2Y2xpZW50LVx1MDAzZWRldjtcbitcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSAqbWF0Y2g7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZTtcbitcdGJvb2wgdXNlX25hdGl2ZTtcbitcbitcdG1hdGNoID0gZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7XG4rXHRpZiAoIW1hdGNoKVxuK1x0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1FTk9ERVYsIFwibWlzc2luZyBtYXRjaCBkYXRhXFxuXCIpO1xuK1xuK1x0LyogVGhlIGZyYW1pbmcgKHJhdyBJMkMgdnMgU01CdXMpIGlzIGNhcnJpZWQgYnkgdGhlIG1hdGNoIGRhdGEuICovXG4rXHR1c2VfbmF0aXZlID0gbWF0Y2gtXHUwMDNlbmF0aXZlX2kyYztcbitcdGlmICh1c2VfbmF0aXZlKSB7XG4rXHRcdGlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LVx1MDAzZWFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpXG4rXHRcdFx0cmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCAtRU9QTk9UU1VQUCxcbitcdFx0XHRcdFwicGxhaW4tSTJDIE1DVSBwcm90b2NvbCByZXF1aXJlcyBJMkMtY2FwYWJsZSBhZGFwdGVyXFxuXCIpO1xuK1x0fSBlbHNlIHtcbitcdFx0aWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtXHUwMDNlYWRhcHRlcixcbitcdFx0XHRcdFx0ICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9JMkNfQkxPQ0sgfFxuK1x0XHRcdFx0XHQgICAgIEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLKSlcbitcdFx0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1FT1BOT1RTVVBQLFxuK1x0XHRcdFx0XCJTTUJ1cyBNQ1UgcHJvdG9jb2wgcmVxdWlyZXMgU01CdXMgSTJDLWJsb2NrIHN1cHBvcnRcXG5cIik7XG4rXHR9XG4rXG4rXHRwc2UgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBzZSksIEdGUF9LRVJORUwpO1xuK1x0aWYgKCFwc2UpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0cHNlLVx1MDAzZWRldiA9IGRldjtcbitcdHBzZS1cdTAwM2VwY2Rldi5vd25lciA9IFRISVNfTU9EVUxFO1xuK1x0cHNlLVx1MDAzZXRyYW5zcG9ydCA9IHVzZV9uYXRpdmUgPyBcdTAwMjZydHBzZV9tY3VfaTJjX25hdGl2ZV9vcHMgOiBcdTAwMjZydHBzZV9tY3VfaTJjX3NtYnVzX29wcztcbitcbitcdHJldHVybiBydHBzZV9tY3VfcmVnaXN0ZXIocHNlKTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnRwc2VfbWN1X2kyY19vZl9tYXRjaFtdID0ge1xuK1x0eyAuY29tcGF0aWJsZSA9IFwicmVhbHRlayxwc2UtbWN1LWdlbjEtc21idXNcIiwgLmRhdGEgPSBcdTAwMjZydHBzZV9tY3VfZ2VuMV9kYXRhIH0sXG4rXHR7IC5jb21wYXRpYmxlID0gXCJyZWFsdGVrLHBzZS1tY3UtZ2VuMi1zbWJ1c1wiLCAuZGF0YSA9IFx1MDAyNnJ0cHNlX21jdV9nZW4yX2RhdGEgfSxcbitcdHsgLmNvbXBhdGlibGUgPSBcInJlYWx0ZWsscHNlLW1jdS1nZW4yLWkyY1wiLCAuZGF0YSA9IFx1MDAyNnJ0cHNlX21jdV9nZW4yX2kyY19kYXRhIH0sXG4rXHR7IC8qIHNlbnRpbmVsICovIH1cbit9O1xuK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJ0cHNlX21jdV9pMmNfb2ZfbWF0Y2gpO1xuK1xuK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBydHBzZV9tY3VfaTJjX2RyaXZlciA9IHtcbitcdC5kcml2ZXIgPSB7XG4rXHRcdC5uYW1lXHRcdD0gXCJyZWFsdGVrLXBzZS1tY3UtaTJjXCIsXG4rXHRcdC5vZl9tYXRjaF90YWJsZVx0PSBydHBzZV9tY3VfaTJjX29mX21hdGNoLFxuK1x0fSxcbitcdC5wcm9iZVx0XHQ9IHJ0cHNlX21jdV9pMmNfcHJvYmUsXG4rfTtcbittb2R1bGVfaTJjX2RyaXZlcihydHBzZV9tY3VfaTJjX2RyaXZlcik7XG4rXG4rTU9EVUxFX0FVVEhPUihcIkpvbmFzIEplbG9uZWsgXHUwMDNjamVsb25lay5qb25hc0BnbWFpbC5jb21cdTAwM2VcIik7XG4rTU9EVUxFX0RFU0NSSVBUSU9OKFwiUmVhbHRlayBQU0UgTUNVIGRyaXZlciAoSTJDIHRyYW5zcG9ydClcIik7XG4rTU9EVUxFX0xJQ0VOU0UoXCJHUExcIik7XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHNlLXBkL3JlYWx0ZWstcHNlLW1jdS11YXJ0LmMgYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LXVhcnQuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjliYWExN2Q4ZDMxZmFcbi0tLSAvZGV2L251bGxcbisrKyBiL2RyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtdWFydC5jXG5AQCAtMCwwICsxLDE2NCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY2xlYW51cC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY29tcGxldGlvbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbW9kdWxlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9vZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcHNlLXBkL3BzZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2VyZGV2LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zcGlubG9jay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcInJlYWx0ZWstcHNlLW1jdS5oXCJcbitcbisjZGVmaW5lIFJUUFNFX01DVV9VQVJUX0JBVURfREVGQVVMVFx0MTkyMDBcbisjZGVmaW5lIFJUUFNFX01DVV9VQVJUX1RYX1RJTUVPVVRcdG1zZWNzX3RvX2ppZmZpZXMoMTAwKVxuKyNkZWZpbmUgUlRQU0VfTUNVX1VBUlRfUlhfVElNRU9VVFx0bXNlY3NfdG9famlmZmllcyhSVFBTRV9NQ1VfUkVTUE9OU0VfTUFYX01TKVxuK1xuK3N0cnVjdCBydHBzZV9tY3VfdWFydCB7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgcHNlO1xuK1x0c3RydWN0IHNlcmRldl9kZXZpY2UgKnNlcmRldjtcbitcdHN0cnVjdCBjb21wbGV0aW9uIHJ4X2RvbmU7XG4rXHRzcGlubG9ja190IHJ4X2xvY2s7XHRcdC8qIHByb3RlY3RzIHJ4X2J1ZiBhbmQgcnhfbGVuICovXG4rXHRzaXplX3QgcnhfbGVuO1xuK1x0dTggcnhfYnVmW1JUUFNFX01DVV9NU0dfU0laRV07XG4rfTtcbitcbisjZGVmaW5lIHRvX3J0cHNlX21jdV91YXJ0KHApICBjb250YWluZXJfb2YocCwgc3RydWN0IHJ0cHNlX21jdV91YXJ0LCBwc2UpXG4rXG4rLypcbisgKiBObyBmcmFtaW5nIGlzIGRvbmUgaGVyZTogYSBnbGl0Y2hlZCBmcmFtZSBjb3N0cyBvbmUgdHJhbnNhY3Rpb24sIHRoZW5cbisgKiB0aGUgbmV4dCBfc2VuZCByZS1mcmFtZXMgZnJvbSByeF9sZW4gMC4gUmVzeW5jIHdvcmtzIGJ5IHJldHVybmluZyBjb3VudFxuKyAqIChub3QgdGFrZSksIGRyb3BwaW5nIGFueSBvdmVyZmxvdyBzbyBzZXJkZXYga2VlcHMgbm8gbGVmdG92ZXIgdG8gYmxlZWRcbisgKiBpbnRvIHRoZSBuZXh0IGZyYW1lLlxuKyAqL1xuK3N0YXRpYyBzaXplX3QgcnRwc2VfbWN1X3VhcnRfcmVjZWl2ZShzdHJ1Y3Qgc2VyZGV2X2RldmljZSAqc2VyZGV2LFxuK1x0XHRcdFx0ICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgY291bnQpXG4re1xuK1x0c3RydWN0IHJ0cHNlX21jdV91YXJ0ICpjdHggPSBzZXJkZXZfZGV2aWNlX2dldF9kcnZkYXRhKHNlcmRldik7XG4rXHRzaXplX3QgdGFrZTtcbitcbitcdHNjb3BlZF9ndWFyZChzcGlubG9ja19pcnFzYXZlLCBcdTAwMjZjdHgtXHUwMDNlcnhfbG9jaykge1xuK1x0XHR0YWtlID0gbWluKGNvdW50LCBzaXplb2YoY3R4LVx1MDAzZXJ4X2J1ZikgLSBjdHgtXHUwMDNlcnhfbGVuKTtcbitcdFx0aWYgKHRha2UpIHtcbitcdFx0XHRtZW1jcHkoY3R4LVx1MDAzZXJ4X2J1ZiArIGN0eC1cdTAwM2VyeF9sZW4sIGJ1ZiwgdGFrZSk7XG4rXHRcdFx0Y3R4LVx1MDAzZXJ4X2xlbiArPSB0YWtlO1xuK1x0XHRcdGlmIChjdHgtXHUwMDNlcnhfbGVuID09IHNpemVvZihjdHgtXHUwMDNlcnhfYnVmKSlcbitcdFx0XHRcdGNvbXBsZXRlKFx1MDAyNmN0eC1cdTAwM2VyeF9kb25lKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0LyogY29uc3VtZSBhbGwgdG8gYXZvaWQgZGVzeW5jL21pc2FsaWdubWVudCAqL1xuK1x0cmV0dXJuIGNvdW50O1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcmRldl9kZXZpY2Vfb3BzIHJ0cHNlX21jdV91YXJ0X3NlcmRldl9vcHMgPSB7XG4rXHQucmVjZWl2ZV9idWYgPSBydHBzZV9tY3VfdWFydF9yZWNlaXZlLFxuK1x0LndyaXRlX3dha2V1cCA9IHNlcmRldl9kZXZpY2Vfd3JpdGVfd2FrZXVwLFxuK307XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfdWFydF9zZW5kKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLCBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxKVxuK3tcbitcdHN0cnVjdCBydHBzZV9tY3VfdWFydCAqY3R4ID0gdG9fcnRwc2VfbWN1X3VhcnQocHNlKTtcbitcdGludCB3cml0dGVuO1xuK1xuK1x0LyogY2xlYXIgYW55IGxlZnRvdmVyIHJ4IHN0YXRlIGJlZm9yZSB0cmFuc21pdHRpbmcgKi9cbitcdHNjb3BlZF9ndWFyZChzcGlubG9ja19pcnFzYXZlLCBcdTAwMjZjdHgtXHUwMDNlcnhfbG9jaykge1xuK1x0XHRyZWluaXRfY29tcGxldGlvbihcdTAwMjZjdHgtXHUwMDNlcnhfZG9uZSk7XG4rXHRcdGN0eC1cdTAwM2VyeF9sZW4gPSAwO1xuK1x0fVxuK1xuK1x0d3JpdHRlbiA9IHNlcmRldl9kZXZpY2Vfd3JpdGUoY3R4LVx1MDAzZXNlcmRldiwgKGNvbnN0IHU4ICopcmVxLCBzaXplb2YoKnJlcSksXG4rXHRcdFx0XHQgICAgICBSVFBTRV9NQ1VfVUFSVF9UWF9USU1FT1VUKTtcbitcdGlmICh3cml0dGVuIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gd3JpdHRlbjtcbitcdGlmICh3cml0dGVuICE9IHNpemVvZigqcmVxKSlcbitcdFx0cmV0dXJuIC1FSU87XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBydHBzZV9tY3VfdWFydF9yZWN2KHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlLFxuK1x0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVxLFxuK1x0XHRcdCAgICAgICBzdHJ1Y3QgcnRwc2VfbWN1X21zZyAqcmVzcClcbit7XG4rXHRzdHJ1Y3QgcnRwc2VfbWN1X3VhcnQgKmN0eCA9IHRvX3J0cHNlX21jdV91YXJ0KHBzZSk7XG4rXG4rXHRpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dChcdTAwMjZjdHgtXHUwMDNlcnhfZG9uZSwgUlRQU0VfTUNVX1VBUlRfUlhfVElNRU9VVCkpXG4rXHRcdHJldHVybiAtRVRJTUVET1VUO1xuK1xuK1x0c2NvcGVkX2d1YXJkKHNwaW5sb2NrX2lycXNhdmUsIFx1MDAyNmN0eC1cdTAwM2VyeF9sb2NrKSB7XG4rXHRcdGlmIChjdHgtXHUwMDNlcnhfbGVuICE9IHNpemVvZigqcmVzcCkpXG4rXHRcdFx0cmV0dXJuIC1FSU87XG4rXG4rXHRcdG1lbWNweShyZXNwLCBjdHgtXHUwMDNlcnhfYnVmLCBzaXplb2YoKnJlc3ApKTtcbitcdH1cbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV90cmFuc3BvcnRfb3BzIHJ0cHNlX21jdV91YXJ0X3RyYW5zcG9ydF9vcHMgPSB7XG4rXHQuc2VuZCA9IHJ0cHNlX21jdV91YXJ0X3NlbmQsXG4rXHQucmVjdiA9IHJ0cHNlX21jdV91YXJ0X3JlY3YsXG4rfTtcbitcbitzdGF0aWMgaW50IHJ0cHNlX21jdV91YXJ0X3Byb2JlKHN0cnVjdCBzZXJkZXZfZGV2aWNlICpzZXJkZXYpXG4re1xuK1x0dTMyIHNwZWVkID0gUlRQU0VfTUNVX1VBUlRfQkFVRF9ERUZBVUxUO1xuK1x0c3RydWN0IGRldmljZSAqZGV2ID0gXHUwMDI2c2VyZGV2LVx1MDAzZWRldjtcbitcdHN0cnVjdCBydHBzZV9tY3VfdWFydCAqY3R4O1xuK1x0dW5zaWduZWQgaW50IGJhdWQ7XG4rXHRpbnQgcmV0O1xuK1xuK1x0Y3R4ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTtcbitcdGlmICghY3R4KVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdGN0eC1cdTAwM2VzZXJkZXYgPSBzZXJkZXY7XG4rXHRjdHgtXHUwMDNlcHNlLmRldiA9IGRldjtcbitcdGN0eC1cdTAwM2Vwc2UucGNkZXYub3duZXIgPSBUSElTX01PRFVMRTtcbitcdGN0eC1cdTAwM2Vwc2UudHJhbnNwb3J0ID0gXHUwMDI2cnRwc2VfbWN1X3VhcnRfdHJhbnNwb3J0X29wcztcbitcdGluaXRfY29tcGxldGlvbihcdTAwMjZjdHgtXHUwMDNlcnhfZG9uZSk7XG4rXHRzcGluX2xvY2tfaW5pdChcdTAwMjZjdHgtXHUwMDNlcnhfbG9jayk7XG4rXG4rXHRzZXJkZXZfZGV2aWNlX3NldF9kcnZkYXRhKHNlcmRldiwgY3R4KTtcbitcdHNlcmRldl9kZXZpY2Vfc2V0X2NsaWVudF9vcHMoc2VyZGV2LCBcdTAwMjZydHBzZV9tY3VfdWFydF9zZXJkZXZfb3BzKTtcbitcbitcdHJldCA9IGRldm1fc2VyZGV2X2RldmljZV9vcGVuKGRldiwgc2VyZGV2KTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgcmV0LCBcImZhaWxlZCB0byBvcGVuIHNlcmRldlxcblwiKTtcbitcbitcdGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXZfZndub2RlKGRldiksIFwiY3VycmVudC1zcGVlZFwiLCBcdTAwMjZzcGVlZCk7XG4rXG4rXHRiYXVkID0gc2VyZGV2X2RldmljZV9zZXRfYmF1ZHJhdGUoc2VyZGV2LCBzcGVlZCk7XG4rXHRpZiAoYmF1ZCAhPSBzcGVlZClcbitcdFx0ZGV2X3dhcm4oZGV2LCBcImNvdWxkIG5vdCBzZXQgYmF1ZHJhdGUgJXUsIGNvbnRyb2xsZXIgdXNlcyAldVxcblwiLFxuK1x0XHRcdCBzcGVlZCwgYmF1ZCk7XG4rXG4rXHRzZXJkZXZfZGV2aWNlX3NldF9mbG93X2NvbnRyb2woc2VyZGV2LCBmYWxzZSk7XG4rXG4rXHRyZXQgPSBzZXJkZXZfZGV2aWNlX3NldF9wYXJpdHkoc2VyZGV2LCBTRVJERVZfUEFSSVRZX05PTkUpO1xuK1x0aWYgKHJldClcbitcdFx0ZGV2X3dhcm4oZGV2LCBcImNvdWxkIG5vdCBzZXQgcGFyaXR5IHRvIG5vbmU6ICVkXFxuXCIsIHJldCk7XG4rXG4rXHRyZXR1cm4gcnRwc2VfbWN1X3JlZ2lzdGVyKFx1MDAyNmN0eC1cdTAwM2Vwc2UpO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBydHBzZV9tY3VfdWFydF9vZl9tYXRjaFtdID0ge1xuK1x0eyAuY29tcGF0aWJsZSA9IFwicmVhbHRlayxwc2UtbWN1LWdlbjFcIiwgLmRhdGEgPSBcdTAwMjZydHBzZV9tY3VfZ2VuMV9kYXRhIH0sXG4rXHR7IC5jb21wYXRpYmxlID0gXCJyZWFsdGVrLHBzZS1tY3UtZ2VuMlwiLCAuZGF0YSA9IFx1MDAyNnJ0cHNlX21jdV9nZW4yX2RhdGEgfSxcbitcdHsgLyogc2VudGluZWwgKi8gfVxuK307XG4rTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcnRwc2VfbWN1X3VhcnRfb2ZfbWF0Y2gpO1xuK1xuK3N0YXRpYyBzdHJ1Y3Qgc2VyZGV2X2RldmljZV9kcml2ZXIgcnRwc2VfbWN1X3VhcnRfZHJpdmVyID0ge1xuK1x0LmRyaXZlciA9IHtcbitcdFx0Lm5hbWUgPSBcInJlYWx0ZWstcHNlLW1jdS11YXJ0XCIsXG4rXHRcdC5vZl9tYXRjaF90YWJsZSA9IHJ0cHNlX21jdV91YXJ0X29mX21hdGNoLFxuK1x0fSxcbitcdC5wcm9iZSAgPSBydHBzZV9tY3VfdWFydF9wcm9iZSxcbit9O1xuK21vZHVsZV9zZXJkZXZfZGV2aWNlX2RyaXZlcihydHBzZV9tY3VfdWFydF9kcml2ZXIpO1xuK1xuK01PRFVMRV9BVVRIT1IoXCJKb25hcyBKZWxvbmVrIFx1MDAzY2plbG9uZWsuam9uYXNAZ21haWwuY29tXHUwMDNlXCIpO1xuK01PRFVMRV9ERVNDUklQVElPTihcIlJlYWx0ZWsgUFNFIE1DVSBkcml2ZXIgKFVBUlQgdHJhbnNwb3J0KVwiKTtcbitNT0RVTEVfTElDRU5TRShcIkdQTFwiKTtcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LmggYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1Lmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi41MmY5NDQyZDcxMTdjXG4tLS0gL2Rldi9udWxsXG4rKysgYi9kcml2ZXJzL25ldC9wc2UtcGQvcmVhbHRlay1wc2UtbWN1LmhcbkBAIC0wLDAgKzEsOTMgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xuK1xuKyNpZm5kZWYgX1JFQUxURUtfUFNFX01DVV9IXG4rI2RlZmluZSBfUkVBTFRFS19QU0VfTUNVX0hcbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tdXRleC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcHNlLXBkL3BzZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuK1xuKy8qXG4rICogVGltZSB0aGUgTUNVIGl0c2VsZiBuZWVkcyBiZXR3ZWVuIGFjY2VwdGluZyBhIHJlcXVlc3QgYW5kIGhhdmluZyBhXG4rICogcmVzcG9uc2UgcmVhZHkuIFRoZXNlIGFyZSBwcm9wZXJ0aWVzIG9mIHRoZSBNQ1UgZmlybXdhcmUsIG5vdCBvZiB0aGVcbisgKiB1bmRlcmx5aW5nIHRyYW5zcG9ydDogdGhlIGNvcmUgcGFjZXMgdHJhbnNhY3Rpb25zIGJ5IFJUUFNFX01DVV9SRVNQT05TRV9NU1xuKyAqIGFuZCBib3RoIHRyYW5zcG9ydHMgc2l6ZSB0aGVpciBwZXItdHJhbnNhY3Rpb24gcmVjdiBjZWlsaW5nIGZyb21cbisgKiBSVFBTRV9NQ1VfUkVTUE9OU0VfTUFYX01TLCBzaW5jZSBzb21lIGNvbW1hbmRzIGFyZSBkb2N1bWVudGVkIGFzXG4rICogbmVlZGluZyB1cCB0byB+MXMgdG8gcHJvZHVjZSBhIHJlcGx5LlxuKyAqL1xuKyNkZWZpbmUgUlRQU0VfTUNVX1JFU1BPTlNFX01TXHRcdFx0MjVcbisjZGVmaW5lIFJUUFNFX01DVV9SRVNQT05TRV9NQVhfTVNcdFx0MTAwMFxuK1xuKy8qXG4rICogVG90YWwgdGltZSB0byBrZWVwIHJldHJ5aW5nIHRoZSBmaXJzdCBNQ1UgcmVhZCBhdCBwcm9iZSwgYW5kIHRoZSBwYXVzZVxuKyAqIGJldHdlZW4gYXR0ZW1wdHMuIFJpZ2h0IGFmdGVyIHJlc2V0LWdwaW9zIGlzIGRlYXNzZXJ0ZWQgdGhlIE1DVSBtYXkgbm90XG4rICogYW5zd2VyIG9uIHRoZSBidXMgeWV0OyBnaXZlIGl0IGEgYm91bmRlZCB3aW5kb3cgdG8gY29tZSB1cCBiZWZvcmVcbisgKiBkZWNsYXJpbmcgdGhlIHByb2JlIGZhaWxlZC5cbisgKi9cbisjZGVmaW5lIFJUUFNFX01DVV9CT09UX1RJTUVPVVRfTVNcdFx0MzAwMFxuKyNkZWZpbmUgUlRQU0VfTUNVX0JPT1RfUkVUUllfTVNcdFx0XHQxMDBcbitcbisjZGVmaW5lIFJUUFNFX01DVV9NU0dfU0laRVx0XHRcdDEyXG4rXG4rc3RydWN0IHJ0cHNlX21jdV9tc2cge1xuK1x0dTggb3Bjb2RlO1xuK1x0dTggc2VxX251bTtcbitcdHU4IHBheWxvYWRbOV07XG4rXHR1OCBjaGVja3N1bTtcbit9IF9fcGFja2VkO1xuK1xuKy8qXG4rICogTUNVIHN0YXR1cyBvcGNvZGVzIChzZWVuIG9uIHRoZSBHZW4xIGRpYWxlY3Q7IEdlbjIgbmV2ZXIgZW1pdHMgdGhlbSkuXG4rICogSU5DT01QTEVURS9CQURfQ1NVTSBhcmUgdGVybWluYWw7IE5PVF9SRUFEWSBpcyB0cmFuc2llbnQuXG4rICovXG4rI2RlZmluZSBSVFBTRV9NQ1VfT1BDT0RFX0lOQ09NUExFVEVcdFx0MHhmZFx0LyogLUVCQURFICAgKi9cbisjZGVmaW5lIFJUUFNFX01DVV9PUENPREVfQkFEX0NTVU1cdFx0MHhmZVx0LyogLUVCQURNU0cgKi9cbisjZGVmaW5lIFJUUFNFX01DVV9PUENPREVfTk9UX1JFQURZXHRcdDB4ZmZcdC8qIC1FQUdBSU4gICovXG4rXG4rLypcbisgKiBBIHBvbGxpbmcgdHJhbnNwb3J0IGNhbiBzdG9wIGhlcmU6IHRoZSByZXBseSB0byB0aGlzIHJlcXVlc3QgKG9wY29kZSBhbmRcbisgKiBzZXFfbnVtKSwgb3IgYSB0ZXJtaW5hbCBlcnJvci4gVGhlIHNlcV9udW0gcmVqZWN0cyBhIHN0YWxlIHJlcGx5IGxlZnQgYnkgYW5cbisgKiBhYmFuZG9uZWQgdHJhbnNhY3Rpb24sIGluc3RlYWQgb2YgZGVzeW5jaW5nIGJ5IG9uZSBmcmFtZS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgcnRwc2VfbWN1X3Jlc3BfaXNfZmluYWwoY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSxcbitcdFx0XHRcdFx0ICAgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlc3ApXG4re1xuK1x0cmV0dXJuIChyZXNwLVx1MDAzZW9wY29kZSA9PSByZXEtXHUwMDNlb3Bjb2RlIFx1MDAyNlx1MDAyNiByZXNwLVx1MDAzZXNlcV9udW0gPT0gcmVxLVx1MDAzZXNlcV9udW0pIHx8XG4rXHQgICAgICAgcmVzcC1cdTAwM2VvcGNvZGUgPT0gUlRQU0VfTUNVX09QQ09ERV9JTkNPTVBMRVRFIHx8XG4rXHQgICAgICAgcmVzcC1cdTAwM2VvcGNvZGUgPT0gUlRQU0VfTUNVX09QQ09ERV9CQURfQ1NVTTtcbit9XG4rXG4rLyogT3BhcXVlIHRvIHRyYW5zcG9ydHM7IGRlZmluZWQgaW4gcmVhbHRlay1wc2UtbWN1LWNvcmUuYy4gKi9cbitzdHJ1Y3QgcnRwc2VfbWN1X2RpYWxlY3Q7XG4rc3RydWN0IHJ0cHNlX21jdV9jaGlwX2luZm87XG4rc3RydWN0IHJ0cHNlX21jdV9jdHJsO1xuK1xuKy8qIFBlci1jb21wYXRpYmxlIG1hdGNoIGRhdGEgKHRoZSBvZl9tYXRjaCAuZGF0YSkuICovXG4rc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhIHtcbitcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfZGlhbGVjdCAqZGlhbGVjdDtcbitcdGJvb2wgbmF0aXZlX2kyYztcdC8qIHJhdy1JMkMgZnJhbWluZyAodnMgU01CdXMpOyBJMkMgdHJhbnNwb3J0IG9ubHkgKi9cbit9O1xuK1xuK3N0cnVjdCBydHBzZV9tY3VfdHJhbnNwb3J0X29wcyB7XG4rXHRpbnQgKCpzZW5kKShzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSk7XG4rXHRpbnQgKCpyZWN2KShzdHJ1Y3QgcnRwc2VfbWN1X2N0cmwgKnBzZSwgY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tc2cgKnJlcSxcbitcdFx0ICAgIHN0cnVjdCBydHBzZV9tY3VfbXNnICpyZXNwKTtcbit9O1xuK1xuK3N0cnVjdCBydHBzZV9tY3VfY3RybCB7XG4rXHRzdHJ1Y3QgZGV2aWNlICpkZXY7XG4rXHRzdHJ1Y3QgcHNlX2NvbnRyb2xsZXJfZGV2IHBjZGV2O1xuK1x0c3RydWN0IG11dGV4IG11dGV4O1x0Lyogc2VyaWFsaXplcyBNQ1UgcmVxdWVzdC9yZXNwb25zZSB0cmFuc2FjdGlvbnMgKi9cbitcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfZGlhbGVjdCAqZGlhbGVjdDtcbitcdGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfY2hpcF9pbmZvICpjaGlwO1xuK1x0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV90cmFuc3BvcnRfb3BzICp0cmFuc3BvcnQ7XG4rXHR1OCBzZXE7XHRcdFx0Lyogcm9sbGluZyByZXF1ZXN0IHNlcV9udW0sIGVjaG9lZCBieSB0aGUgTUNVICovXG4rfTtcbitcbitpbnQgcnRwc2VfbWN1X3JlZ2lzdGVyKHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlKTtcbitcbitleHRlcm4gY29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhIHJ0cHNlX21jdV9nZW4xX2RhdGE7XG4rZXh0ZXJuIGNvbnN0IHN0cnVjdCBydHBzZV9tY3VfbWF0Y2hfZGF0YSBydHBzZV9tY3VfZ2VuMl9kYXRhO1xuK2V4dGVybiBjb25zdCBzdHJ1Y3QgcnRwc2VfbWN1X21hdGNoX2RhdGEgcnRwc2VfbWN1X2dlbjJfaTJjX2RhdGE7XG4rXG4rI2VuZGlmXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0NzozOS43MzM0MDgwNzFaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMzI5MjIzMzI5MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFJlYWx0ZWsgUFNFIE1DVSBEcml2ZXIgZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgc28gd2UgaGF2ZSB0aGlzIG5ldyBwYXRjaCB3aXRoIGEgZHJpdmVyIGZvciB0aGUgUmVhbHRlayBQU0UgTUNVLCBzcGVjaWZpY2FsbHkgdGFyZ2V0aW5nIFBvRSBzd2l0Y2ggaGFyZHdhcmUgbWFuYWdlbWVudC4gSXQncyBhbiBJMkMvVUFSVC1iYXNlZCBkcml2ZXIsIHdoaWNoIGdldHMgbWUgdGhpbmtpbmcgaW1tZWRpYXRlbHkgYWJvdXQgaG93IHdlIGNhbiByZWFjaCBpdCBpbiBhIHZpcnR1YWxpemVkIGVudmlyb25tZW50IGZvciBmdXp6aW5nLiBDYW4gUUVNVSBvciBzeXprYWxsZXIgYmUgbGV2ZXJhZ2VkIGhlcmU/XG5cblN5emthbGxlciBpcyBhbHJlYWR5IHNldCB1cCB0byBmdXp6IEkyQyBkZXZpY2VzLCBlaXRoZXIgdGhyb3VnaCBkaXJlY3QgYC9kZXYvaTJjLSpgIGFjY2VzcyAod2l0aCB0aGUgcmlnaHQgc3R1YnMgb3IgaW5qZWN0aW9ucykgb3IgVUFSVCB2aWEgc2VyZGV2LiBUaGUgcXVlc3Rpb24gaXMsIGhvdyBlYXNpbHkgY2FuIHdlIGdldCB0aGlzIHNwZWNpZmljIGRyaXZlciBpbnN0YW50aWF0ZWQ/IEkga25vdyBzeXprYWxsZXIgY2FuIGluc3RhbnRpYXRlIEkyQyBkZXZpY2VzIHZpYSBgdmhjaWAgb3IgYnkgc2ltcGx5IGxvYWRpbmcgdGhlIG1vZHVsZSBhbmQgdXNpbmcgc3lzZnMgd2l0aCBgbmV3X2RldmljZWAsIHdoaWNoIGlzIHRoZSBpbW1lZGlhdGUgZm9jdXMuIEZvciBzZXJkZXYsIGl0J3MgdHlwaWNhbGx5IGRldmljZSB0cmVlIGRyaXZlbiwgd2hpY2ggbWlnaHQgYmUgdHJpY2tpZXIgdG8gcmVhY2ggd2l0aG91dCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIG9yIG92ZXJsYXkgaW5qZWN0aW9uLCBidXQgSTJDIGxvb2tzIHByb21pc2luZy5cblxuTGV0J3MgZm9jdXMgb24gdGhlIGByZWFsdGVrLXBzZS1tY3UtaTJjYCBkcml2ZXIuIEl0J3MgYW4gSTJDIGRyaXZlciwgYHJ0cHNlX21jdV9pMmNfZHJpdmVyYCwgYW5kIGl0IHVzZXMgYW4gYG9mX21hdGNoX3RhYmxlYC4gQ2FuIHdlIGxldmVyYWdlIHRoaXMgdGFibGUgd2l0aCBzeXNmcyBgbmV3X2RldmljZWA/IEknbSB0aGlua2luZyBgZWNobyBcInJlYWx0ZWsscHNlLW1jdS1nZW4xLXNtYnVzIDB4MjBcIiBcdTAwM2UgL3N5cy9idXMvaTJjL2RldmljZXMvaTJjLTAvbmV3X2RldmljZWAgbWlnaHQgZG8gdGhlIHRyaWNrLCBhc3N1bWluZyB0aGUgZHJpdmVyIG5hbWUgb3IgSTJDIElEIG1hdGNoLiBXYWl0LCBpdCBzZWVtcyBsaWtlIGBuZXdfZGV2aWNlYCBwcmltYXJpbHkgdXNlcyBgaWRfdGFibGVgLCB3aGljaCBpc24ndCBwcmVzZW50IGluIHRoaXMgZHJpdmVyLlxuXG5BaCwgYnV0IEkgcmVtZW1iZXIgdGhhdCB0aGUgSTJDIGNvcmUgKmNhbiogZmFsbCBiYWNrIHRvIHRoZSBPRiBtYXRjaCB0YWJsZSBldmVuIGZvciBzeXNmcyBgbmV3X2RldmljZWAgaW4gcmVjZW50IGtlcm5lbHMuIFRoYXQncyBhIGtleSBkZXRhaWwhIEhvd2V2ZXIsIHRoZSBkcml2ZXIgdXNlcyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldilgLiBJZiBpbnN0YW50aWF0ZWQgdGhyb3VnaCBzeXNmcyB3aXRob3V0IGFuIE9GIG5vZGUsIHdpbGwgdGhhdCByZXR1cm4gTlVMTD8gVGhhdCB3b3VsZCBjYXVzZSB0aGUgcHJvYmUgdG8gZmFpbCB3aXRoIGAtRU5PREVWYC4gV2UgaGF2ZSB0byBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgdG8gYmUgc3VyZS4gRG9lcyBpdCBjaGVjayBmb3IgYSBzcGVjaWZpYyBPRiBub2RlLCBvciBkb2VzIGl0IGZhbGwgYmFjayB0byBvdGhlciBtZWNoYW5pc21zIGxpa2UgYGlkX3RhYmxlYD8gTm8sIGJlY2F1c2Ugc3lzZnMgYG5ld19kZXZpY2VgIGRvZXNuJ3QgY3JlYXRlIGFuIE9GIG5vZGUsIGFuZCBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBjaGVja3MgdGhhdCBub2RlLiBUaGUgSTJDIGNvcmUgbWlnaHQgYmUgdXNpbmcgYGkyY19vZl9tYXRjaF9kZXZpY2VgIGZvciBtYXRjaGluZywgYnV0IGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIGlzIHN0aWxsIHRoZSBodXJkbGUuIFVsdGltYXRlbHksIEkgbmVlZCB0byB1bmRlcnN0YW5kIGlmIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIGNhbiBzdWNjZWVkIHdpdGhvdXQgYSBmdWxsIE9GIG5vZGUsIHdoaWNoIHNlZW1zIHVubGlrZWx5LiBJIGJldHRlciBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgdG8gYmUgc3VyZS4gU3BlY2lmaWNhbGx5LCB0aGUgY29kZSBpbiBgZHJpdmVycy9iYXNlL3Byb3BlcnR5LmNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDAxNCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg4NSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ3OjUzLjAyNTY0NzI4NVoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5ODA3Mjk1NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJkZXZpY2VfZ2V0X21hdGNoX2RhdGFcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9iYXNlL3Byb3BlcnR5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM9MTM0Nz1FWFBPUlRfU1lNQk9MKGZ3bm9kZV9ncmFwaF9wYXJzZV9lbmRwb2ludCk7XFxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMtMTM0OC1cXG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYzoxMzQ5OmNvbnN0IHZvaWQgKmRldmljZV9nZXRfbWF0Y2hfZGF0YShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMtMTM1MC17XFxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM6MTM1MTpcXHRyZXR1cm4gZndub2RlX2NhbGxfcHRyX29wKGRldl9md25vZGUoZGV2KSwgZGV2aWNlX2dldF9tYXRjaF9kYXRhLCBkZXYpO1xcbmRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jLTEzNTItfVxcbmRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jOjEzNTM6RVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX2dldF9tYXRjaF9kYXRhKTtcXG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYy0xMzU0LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0Nzo1My4xMjM3MzQ3MDlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTA1OTQ2NDYwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBEcml2ZXIgYW5kIEl0cyBGdXp6aW5nIFBvdGVudGlhbCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgZHJpdmVyLCBhbmQgaXQncyB1c2luZyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCwgd2hpY2gsIGFzIEkgcmVjYWxsLCByZWxpZXMgb24gdGhlIGBmd25vZGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlLiBJZiB0aGVyZSdzIG5vIGBmd25vZGVgLCBpdCdzIGdvaW5nIHRvIHJldHVybiBOVUxMLiBOb3csIEkga25vdyB0aGUgSTJDIGNvcmUgaGFzIGBpMmNfZ2V0X21hdGNoX2RhdGFgLCB3aGljaCBncmFjZWZ1bGx5IGZhbGxzIGJhY2sgdG8gYW4gYGlkX3RhYmxlYCwgYnV0IHRoaXMgc3BlY2lmaWMgZHJpdmVyIGlzbid0IGRvaW5nIHRoYXQ7IGl0J3MgdXNpbmcgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgZGlyZWN0bHkuIFRoYXQncyBhIHBvdGVudGlhbCBwcm9ibGVtLlxuXG5TcGVjaWZpY2FsbHksIGlmIHRoaXMgZGV2aWNlIGlzIGluc3RhbnRpYXRlZCB0aHJvdWdoIHN5c2ZzLCBgZGV2X2Z3bm9kZShkZXYpYCBpcyBsaWtlbHkgdG8gYmUgTlVMTC4gVGhlcmVmb3JlLCBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCB3aWxsIHJldHVybiBOVUxMLCBhbmQgdGhlIHByb2JlIHdpbGwgZmFpbCByaWdodCBoZXJlLCByaWdodD9cblxuVGhlIG5leHQgdGhpbmcgdGhhdCBJJ20gY29uc2lkZXJpbmcgaXMgd2hldGhlciBvciBub3QgU3l6a2FsbGVyIGNvdWxkIHNvbWVob3cgaW5qZWN0IGEgZGV2aWNlIHRyZWUgbm9kZSBoZXJlPyBJdCBkb2VzIGhhdmUgYSBgc3l6X2luaXRfbmV0X3NvY2tldGAgb3Igc29tZXRoaW5nLCBidXQgdGhhdCdzIG5vdCBpdC4gTWF5YmUgYHN5el9tb3VudF9pbWFnZWAsIG9yIG1heWJlIGBzeXpfZ2VuZXRsaW5rX2dldF9mYW1pbHlfaWRgPyBObywgdGhhdCdzIG5vdCBpdC4gV2FpdCwgZG9lcyBTeXprYWxsZXIgKmFjdHVhbGx5KiBoYXZlIGEgd2F5IHRvIHRlc3QgT0YgZHJpdmVycz8gSSBrbm93IGl0IHRlc3RzIGEgbG90IG9mIE9GIGRyaXZlcnMsIGJ1dCBJJ20gdHJ5aW5nIHRvIHJlbWVtYmVyICpob3cqLiBEb2VzIGl0IHVzZSBhIGR1bW15IGRldmljZSB0cmVlLCBpbmplY3Qgbm9kZXMgZHluYW1pY2FsbHk/IEFoLCBubywgU3l6a2FsbGVyIGRvZXNuJ3QgZ2VuZXJhbGx5IGluamVjdCBPRiBub2RlcyB1bmxlc3MgaXQncyB1c2luZyBEVCBvdmVybGF5cywgbGlrZSB3aXRoIGBzeXpfdXNiX2Nvbm5lY3RgIGZvciBVU0Igb3IgYHN5el84MDIxMV9qb2luX2lic3NgIGZvciBXaUZpLlxuXG5JIGRvIHJlbWVtYmVyLCB0aG91Z2gsIHRoYXQgU3l6a2FsbGVyICpjYW4qIHRlc3QgSTJDIGRyaXZlcnMgaWYgdGhleSBjYW4gYmUgc3VjY2Vzc2Z1bGx5IHByb2JlZC4gQnV0LCBob3cgY2FuIHRob3NlIEkyQyBkZXZpY2VzIGJlIHByb2JlZD8gUmlnaHQsIHRoZXkncmUgZWl0aGVyIGluIHRoZSBkZWZhdWx0IFFFTVUgZGV2aWNlIHRyZWUsIG9yIFN5emthbGxlciBpcyB1c2luZyBhIGN1c3RvbSBkZXZpY2UgdHJlZS5cblxuVGhlIHJlYWwgcXVlc3Rpb24gaGVyZSBpczogaXMgdGhpcyBkcml2ZXIgZXZlbiAqd29ydGgqIGZ1enppbmc/IEl0J3MgZm9yIGEgc3BlY2lmaWMgUmVhbHRlayBQU0UgTUNVLCBhbmQgdXNlcyBJMkMgYW5kIFVBUlQuIEl0IGRvZXMgcmVnaXN0ZXIgc29tZXRoaW5nIGNhbGxlZCBhIGBwc2VfY29udHJvbGxlcl9kZXZgLiBBbmQgYHBzZV9jb250cm9sbGVyX3JlZ2lzdGVyYCBleHBvc2VzIHRoZSBkZXZpY2UgdG8gdGhlIFBTRSBzdWJzeXN0ZW0gdGhyb3VnaCBuZXRsaW5rIGFuZCBldGh0b29sLiBJZiB0aGUgZGV2aWNlICpjYW4qIGJlIHByb2JlZCwgaXQgKmNvdWxkKiBiZSByZWFjaGVkIHZpYSBldGh0b29sIFBTRSBjb21tYW5kcywgcmlnaHQ/XG5cblNvLCBiYWNrIHRvIFN5emthbGxlciBhbmQgcHJvYmluZy4gQ2FuIHRoaXMgYmUgcHJvYmVkPyBJZiBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCByZXR1cm5zIE5VTEwgZm9yIHN5c2ZzLWluc3RhbnRpYXRlZCBkZXZpY2VzLCB0aGVuIGl0IGNhbid0IGJlIHByb2JlZCB2aWEgc3lzZnMuIEkgbmVlZCB0byBjaGVjayBzb21ldGhpbmc6IERvZXMgYGkyY19jbGllbnRgIGhhdmUgYGRldi5md25vZGVgIHNldCB3aGVuIGluc3RhbnRpYXRlZCB2aWEgc3lzZnM/IE5vLCBpdCBkb2Vzbid0LiBBaGEhIFdhaXQgYSBzZWNvbmQsIHRoZSBgaTJjX25ld19jbGllbnRfZGV2aWNlYCBmdW5jdGlvbiAqZG9lcyogc2V0IGBkZXYuZndub2RlID0gZndub2RlYCBpZiBhIGBib2FyZF9pbmZvYCBpcyBwYXNzZWQgaW4uIEJ1dCB3aGVuIHN5c2ZzIGluc3RhbnRpYXRlcyBhIG5ldyBkZXZpY2UsIGl0IHBhc3NlcyBOVUxMIGZvciB0aGUgYGZ3bm9kZWAuIFRoYXQgY29uZmlybXMgaXQ6IGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHdpbGwgcmV0dXJuIE5VTEwuIERvZXMgYGkyY19nZXRfbWF0Y2hfZGF0YWAgZXZlbiAqZXhpc3QqP1xuXG5cbiIsIklucHV0VG9rZW5zIjoyNTc2NiwiT3V0cHV0VG9rZW5zIjo0NCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjYyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0ODowNC4xODMyMDQyNDFaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU4ODU4MjcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImkyY19nZXRfbWF0Y2hfZGF0YVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jPTExOT1FWFBPUlRfU1lNQk9MX0dQTChpMmNfbWF0Y2hfaWQpO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMjAtXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEyMTpjb25zdCB2b2lkICppMmNfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudClcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTIyLXtcXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMzctfVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMzg6RVhQT1JUX1NZTUJPTChpMmNfZ2V0X21hdGNoX2RhdGEpO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMzktXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ4OjA0LjM0MjA3NTI1MloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEzODg5OTY0MTU5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlVucmVhY2hhYmxlIERyaXZlciBBbmFseXNpcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgZHJpdmVyLCBgcnRwc2VfbWN1X2kyY19kcml2ZXJgLCBhbmQgaW1tZWRpYXRlbHkgSSBzZWUgaXQgcmVsaWVzIHNvbGVseSBvbiBhIERldmljZSBUcmVlIChgb2ZfbWF0Y2hfdGFibGVgKSBmb3IgaW5zdGFudGlhdGlvbi4gSXQgKmRvZXNuJ3QqIHVzZSBgaTJjX2dldF9tYXRjaF9kYXRhYCwgYW5kIGNydWNpYWxseSwgaXQgKmxhY2tzKiBhbiBgaTJjX2RldmljZV9pZGAgdGFibGUuIFRoaXMgaXMgYWxyZWFkeSBhIHJlZCBmbGFnIGZvciBTeXprYWxsZXIgcmVhY2hhYmlsaXR5LiBTaW5jZSBEZXZpY2UgVHJlZSBpcyB0aGUgb25seSBpbnN0YW50aWF0aW9uIG1ldGhvZCwgdGhlIGRldmljZSBuZWVkcyB0byBiZSBwcmVzZW50IGluIHRoZSBiYXNlIERldmljZSBUcmVlIG9yIGFkZGVkIGR5bmFtaWNhbGx5LlxuXG5NeSBpbml0aWFsIHRob3VnaHQgaXMsIGNhbiBTeXprYWxsZXIgYWRkIHRoZSByZXF1aXJlZCBEVCBub2RlPyBMaWtlbHkgbm90LiBTeXprYWxsZXIncyBiYXNlIERUJ3MgYXJlIGdlbmVyYWxseSBnZW5lcmljIChlLmcuLCBgdmV4cHJlc3NgLCBgdmlydGApIGFuZCBub3Qgc3BlY2lmaWMgdG8gdGhpcyBSZWFsdGVrIFBTRSBNQ1UuIFNvIGl0IGNhbid0IHByb2JlIGl0LlxuXG5MZXQncyBjaGVjayB0aGUgVUFSVCBkcml2ZXIgZm9yIHRoZSBzYW1lIE1DVSwgaXQncyBhbHNvIERUIGJhc2VkLiBTYW1lIHByb2JsZW0uIFNlcmRldiBkZXZpY2VzIGFyZSBpbnN0YW50aWF0ZWQgdGhyb3VnaCBEZXZpY2UgVHJlZSBhcyBjaGlsZHJlbiBvZiBVQVJUIG5vZGVzLiBTeXprYWxsZXIgYWxzbyBkb2Vzbid0IGluc3RhbnRpYXRlIHNlcmRldiBkZXZpY2VzLlxuXG5UaGUgcmVhbCBxdWVzdGlvbiBpcywgY2FuIHRoaXMgZHJpdmVyIGJlIHJlYWNoZWQgKmF0IGFsbCogaW4gYSB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudCBsaWtlIEdDRSBvciBRRU1VPyBUaGUgcHJvbXB0IHNwZWNpZmllcyByZXR1cm5pbmcgXCJXb3J0aEZ1enppbmc9ZmFsc2VcIiBpZiBhIHBhdGNoIG9ubHkgY29udGFpbnMgY29kZSBwYXRocyB1bnJlYWNoYWJsZSBpbiB0aG9zZSBlbnZpcm9ubWVudHMuIEFuZCBJIHRoaW5rIHRoaXMgb25lIHF1YWxpZmllcy4gSWYgdGhlcmUncyBubyB3YXkgdG8gaW5zdGFudGlhdGUgdGhlIGRldmljZSwgdGhlIHByb2JlIGZ1bmN0aW9uLCBgcnRwc2VfbWN1X2kyY19wcm9iZWAsIHdpbGwgbmV2ZXIgcnVuLlxuXG5Db3VsZCB3ZSBkeW5hbWljYWxseSBpbnN0YW50aWF0ZSBhbiBPRiBkZXZpY2U/IFllcywgdXNpbmcgRFQgb3ZlcmxheXMuIERvZXMgc3l6a2FsbGVyIGRvIERUIG92ZXJsYXlzPyBObywgc3l6a2FsbGVyIGRvZXNuJ3QgY3VycmVudGx5IGdlbmVyYXRlIG9yIGxvYWQgdGhlbS4gVGhlcmUgYXJlIGNvbmZpZ3MgZm9yIGl0IChgQ09ORklHX09GX0RZTkFNSUNgIGFuZCBgQ09ORklHX09GX09WRVJMQVlgKSwgYnV0IFN5emthbGxlciBkb2Vzbid0IGhhdmUgYSBmdXp6ZXIgdGhhdCB0YXJnZXRzIG92ZXJsYXlzIHRvIHJlYWNoIHRoZSBzcGVjaWZpYyBkcml2ZXJzLlxuXG5Db3VsZCB3ZSB1c2UgYGkyY19uZXdfY2xpZW50X2RldmljZWAgZnJvbSBhbm90aGVyIG1vZHVsZT8gTm9wZSwgbm8gbHVjay4gV2hhdCBhYm91dCBgc3lzZnNgPyBUaGlzIGlzIGludGVyZXN0aW5nOiBJZiB3ZSB3cml0ZSB0byBgL3N5cy9idXMvaTJjL2RldmljZXMvaTJjLTAvbmV3X2RldmljZWAsIHRoZSBJMkMgY29yZSBjcmVhdGVzIGFuIGBpMmNfY2xpZW50YC4gVGhlbiBpdCB0cmllcyB0byBiaW5kIGEgZHJpdmVyLiAqVGhhdCdzKiB0aGUgdHJpZ2dlciBwb2ludC5cblxuSG93ZXZlciwgbGV0J3MgZXhhbWluZSB3aGF0IGhhcHBlbnMgaW4gdGhlIGBwcm9iZWAgZnVuY3Rpb246IGBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KWAuIElmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcsIHRoZSBjb2RlIHJldHVybnMgLUVOT0RFViBhbmQgdGhlIGRyaXZlciBsb2dpYyBpcyBuZXZlciByZWFjaGVkLiBTaW5jZSBgZGV2LVx1MDAzZWZ3bm9kZWAgd2lsbCBiZSBOVUxMIGhlcmUsIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgICp3aWxsKiByZXR1cm4gTlVMTCwgYW5kIHRoZSBwcm9iZSBmdW5jdGlvbiBpbW1lZGlhdGVseSBleGl0cy4gVGh1cywgdGhlIGFjdHVhbCBJMkMgY29tbXVuaWNhdGlvbiBhbmQgUFNFIG9wZXJhdGlvbnMgYXJlIGVudGlyZWx5IHVucmVhY2hhYmxlLlxuXG5JJ2xsIGRvdWJsZSBjaGVjaywganVzdCB0byBiZSAqY29tcGxldGVseSogc3VyZSwgdGhhdCBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBjYW4ndCByZXR1cm4gYW55dGhpbmcgdXNlZnVsIGlmIGBvZl9tYXRjaF90YWJsZWAgaXMgcHJlc2VudCBhbmQgYGZ3bm9kZWAgaXMgTlVMTC4gSSBhbSBjb25maWRlbnQgdGhhdCBkcml2ZXIgaXMgdW5yZWFjaGFibGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3MzY1LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODk0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ4OjE4LjIzMjA0NzM5MVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDg0MzE2OTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZGV2aWNlX2dldF9tYXRjaF9kYXRhXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jPTEzNDc9RVhQT1JUX1NZTUJPTChmd25vZGVfZ3JhcGhfcGFyc2VfZW5kcG9pbnQpO1xcbmRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jLTEzNDgtXFxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM6MTM0OTpjb25zdCB2b2lkICpkZXZpY2VfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KVxcbmRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jLTEzNTAte1xcbmRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jOjEzNTE6XFx0cmV0dXJuIGZ3bm9kZV9jYWxsX3B0cl9vcChkZXZfZndub2RlKGRldiksIGRldmljZV9nZXRfbWF0Y2hfZGF0YSwgZGV2KTtcXG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYy0xMzUyLX1cXG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYzoxMzUzOkVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9nZXRfbWF0Y2hfZGF0YSk7XFxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMtMTM1NC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjlUMDU6NDg6MTguMzgwNDg2ODhaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMzIzMzQ4Mjk2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGFzc3VtaW5nIEknbSBkZWVwbHkgZmFtaWxpYXIgd2l0aCB0aGUgcmVsZXZhbnQgdGVjaG5pY2FsIGNvbnRleHQ6XG5cbioqQW5hbHl6aW5nIGBmd25vZGVfY2FsbF9wdHJfb3BgKipcblxuQWxyaWdodCwgdGltZSB0byBkaXZlIGluIGFuZCBnZXQgdGhpcyBtb3ZpbmcuIFRoZSBmaXJzdCB0aGluZyBJJ20gZ29pbmcgdG8gY2hlY2sgaXMgYGZ3bm9kZV9jYWxsX3B0cl9vcGAuIEl0J3MgYSBjcml0aWNhbCBwaWVjZSBvZiB0aGUgcHV6emxlLCBhbmQgYSB0aG9yb3VnaCBsb29rIGlzIHRoZSByaWdodCBwbGFjZSB0byBzdGFydC4gVGhpcyBpcyBsaWtlbHkgYSBmdW5jdGlvbiBwb2ludGVyIG9wZXJhdGlvbiByZWxhdGVkIHRvIGZpcm13YXJlIG5vZGVzLiBNeSBnb2FsIHdpbGwgYmUgdG8gY2xhcmlmeSBpdHMgZnVuY3Rpb24gYW5kIGRldGVybWluZSBhbnkgcG9pbnRzIHRvIGJlIGF3YXJlIG9mLiBJIG5lZWQgdG8gYmUgc3VyZSB0aGUgZnVuY3Rpb24gaXMgcnVubmluZyBhcyBleHBlY3RlZCwgYW5kIHRoYXQgdGhlcmUgYXJlIG5vIHBvaW50cyBvZiBjb250ZW50aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyOTE1MSwiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ4OjIxLjcwMzg0MTcwNloiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTU3MDIxMDYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiI2RlZmluZSBmd25vZGVfY2FsbF9wdHJfb3BcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9saW51eC9md25vZGUuaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L2Z3bm9kZS5oPTE0MD1zdHJ1Y3QgZndub2RlX29wZXJhdGlvbnMge1xcbi0tXFxuaW5jbHVkZS9saW51eC9md25vZGUuaC0xOTgtXFxuaW5jbHVkZS9saW51eC9md25vZGUuaDoxOTk6I2RlZmluZSBmd25vZGVfY2FsbF9wdHJfb3AoZndub2RlLCBvcCwgLi4uKVxcdFxcdFxcXFxcXG5pbmNsdWRlL2xpbnV4L2Z3bm9kZS5oLTIwMC1cXHQoZndub2RlX2hhc19vcChmd25vZGUsIG9wKSA/XFx0XFx0XFx0XFxcXFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0ODoyMS43OTk1NTQ1MTJaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDcyMDE5MTU3MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIERldmljZSBNYXRjaGluZyBMb2dpYyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgZnVuY3Rpb24gYW5kIGlmIGBmd25vZGVgIGlzIE5VTEwsIHRoZW4gYGZ3bm9kZV9oYXNfb3BgIGlzIGZhbHNlLCBhbmQgaXQgcmV0dXJucyBOVUxMIOKAkyB0aGF0IHNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2guIEJ1dCBob2xkIG9uLCBJIG5lZWQgdG8gbWFrZSBzdXJlIEknbSBub3QgbWlzc2luZyBzb21ldGhpbmcgY3JpdGljYWwgaGVyZS4gIEkgd29uZGVyLCB3aGF0IGFib3V0IHRoZSBpbnRlcmFjdGlvbiB3aXRoIGBkZXYtXHUwMDNlZHJpdmVyLVx1MDAzZW9mX21hdGNoX3RhYmxlYD8gQ291bGQgKnRoYXQqIGJlIHBsYXlpbmcgYSByb2xlIGluIGhvdyB0aGUgbWF0Y2hpbmcgd29ya3MsIG1heWJlIHRocm91Z2ggYGRldmljZV9nZXRfbWF0Y2hfZGF0YWA/XG5cbkxldCdzIHF1aWNrbHkgdmVyaWZ5IGlmIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIG1pZ2h0IHNvbWVob3cgZmFsbCBiYWNrIHRvIHRoYXQgdGFibGUgd2hlbiBgZndub2RlYCBpcyBlbXB0eSwgb3IgdW5kZWZpbmVkLiBObywgdGhhdCBkb2Vzbid0IHNlZW0gdG8gYmUgdGhlIGNhc2UuIEl0IGFwcGVhcnMgdG8ganVzdCBjYWxsIGBmd25vZGVfY2FsbF9wdHJfb3AoZGV2X2Z3bm9kZShkZXYpLCBkZXZpY2VfZ2V0X21hdGNoX2RhdGEsIGRldilgLlxuXG5BaGEsIGEgZmxhZyEgV2FpdCBhIG1pbnV0ZS4uLiBoYXMgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgYmVlbiBtb2RpZmllZCByZWNlbnRseT8gSSBzaG91bGQgY2hlY2sgdGhlIHJlY2VudCBjaGFuZ2VzIGluIGBkcml2ZXJzL2Jhc2UvcHJvcGVydHkuY2AgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbnkga2luZCBvZiByZWdyZXNzaW9uIG9yIHVwZGF0ZSB0aGVyZSB0byB1bmRlcnN0YW5kIHRoZSBjdXJyZW50IGJlaGF2aW9yLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyOTQ3MCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0ODoyNi41MTk3NTE3NDNaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzcwNDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEzNDAsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEzNDA6XFx0aW50IGZ3bm9kZV9ncmFwaF9wYXJzZV9lbmRwb2ludChjb25zdCBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLFxcbjEzNDE6XFx0XFx0XFx0XFx0XFx0c3RydWN0IGZ3bm9kZV9lbmRwb2ludCAqZW5kcG9pbnQpXFxuMTM0MjpcXHR7XFxuMTM0MzpcXHRcXHRtZW1zZXQoZW5kcG9pbnQsIDAsIHNpemVvZigqZW5kcG9pbnQpKTtcXG4xMzQ0OlxcdFxcbjEzNDU6XFx0XFx0cmV0dXJuIGZ3bm9kZV9jYWxsX2ludF9vcChmd25vZGUsIGdyYXBoX3BhcnNlX2VuZHBvaW50LCBlbmRwb2ludCk7XFxuMTM0NjpcXHR9XFxuMTM0NzpcXHRFWFBPUlRfU1lNQk9MKGZ3bm9kZV9ncmFwaF9wYXJzZV9lbmRwb2ludCk7XFxuMTM0ODpcXHRcXG4xMzQ5OlxcdGNvbnN0IHZvaWQgKmRldmljZV9nZXRfbWF0Y2hfZGF0YShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuMTM1MDpcXHR7XFxuMTM1MTpcXHRcXHRyZXR1cm4gZndub2RlX2NhbGxfcHRyX29wKGRldl9md25vZGUoZGV2KSwgZGV2aWNlX2dldF9tYXRjaF9kYXRhLCBkZXYpO1xcbjEzNTI6XFx0fVxcbjEzNTM6XFx0RVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX2dldF9tYXRjaF9kYXRhKTtcXG4xMzU0OlxcdFxcbjEzNTU6XFx0c3RhdGljIHVuc2lnbmVkIGludCBmd25vZGVfZ3JhcGhfZGV2Y29uX21hdGNoZXMoY29uc3Qgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSxcXG4xMzU2OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGNvbnN0IGNoYXIgKmNvbl9pZCwgdm9pZCAqZGF0YSxcXG4xMzU3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdGRldmNvbl9tYXRjaF9mbl90IG1hdGNoLFxcbjEzNTg6XFx0XFx0XFx0XFx0XFx0XFx0XFx0dm9pZCAqKm1hdGNoZXMsXFxuMTM1OTpcXHRcXHRcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgbWF0Y2hlc19sZW4pXFxuMTM2MDpcXHR7XFxuMTM2MTpcXHRcXHRzdHJ1Y3QgZndub2RlX2hhbmRsZSAqbm9kZTtcXG4xMzYyOlxcdFxcdHN0cnVjdCBmd25vZGVfaGFuZGxlICplcDtcXG4xMzYzOlxcdFxcdHVuc2lnbmVkIGludCBjb3VudCA9IDA7XFxuMTM2NDpcXHRcXHR2b2lkICpyZXQ7XFxuMTM2NTpcXHRcXG4xMzY2OlxcdFxcdGZ3bm9kZV9ncmFwaF9mb3JfZWFjaF9lbmRwb2ludChmd25vZGUsIGVwKSB7XFxuMTM2NzpcXHRcXHRcXHRpZiAobWF0Y2hlcyBcXHUwMDI2XFx1MDAyNiBjb3VudCBcXHUwMDNlPSBtYXRjaGVzX2xlbikge1xcbjEzNjg6XFx0XFx0XFx0XFx0Zndub2RlX2hhbmRsZV9wdXQoZXApO1xcbjEzNjk6XFx0XFx0XFx0XFx0YnJlYWs7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ4OjI2LjUyMDEyNDcxM1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MjQyNDAyNDgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipSZWNhbGxpbmcgYSBTdWJ0bGUgQnV0IFNpZ25pZmljYW50IEtlcm5lbCBDaGFuZ2UqKlxuXG5Pa2F5LCBob2xkIG9uIGEgc2Vjb25kLiBTb21ldGhpbmcncyBuaWdnbGluZyBhdCB0aGUgYmFjayBvZiBteSBtaW5kLiBEaWRuJ3Qgd2UgdHdlYWsgdGhlIGJlaGF2aW9yIG9mIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgPyBXYXNuJ3QgdGhlcmUgYSBjaGFuZ2UsIG1heWJlIGEgZmFsbC1iYWNrIG1lY2hhbmlzbSwgd2hlcmUgaXQgbm93IHRyaWVzIGBpMmNfZGV2aWNlX2lkYCBvciBgc3BpX2RldmljZV9pZGAgaWYgaXQgY2FuJ3QgZmluZCBhIGRpcmVjdCBtYXRjaD8gVGhhdCByaW5ncyBhIGJlbGwsIGJ1dCBJIHdhbnQgdG8gYmUgKmFic29sdXRlbHkqIHN1cmUgYmVmb3JlIEkgc3RhcnQgbWFraW5nIGFueSBhc3N1bXB0aW9ucyBvciB0cm91Ymxlc2hvb3RpbmcuXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IGRlZmluaXRpdmUuIExldCdzIGRpZyBpbnRvIHRoZSBjb3JlLiBJIG5lZWQgdG8gdmVyaWZ5IHRoaXMgYmVoYXZpb3IuIFRoZSBsaWtlbHkgc3BvdCBpcyBnb2luZyB0byBiZSB3aXRoaW4gdGhlIEkyQyBzdWJzeXN0ZW0sIGNvbnNpZGVyaW5nIHdlJ3JlIHRhbGtpbmcgYWJvdXQgYGkyY19kZXZpY2VfaWRgLiBTbywgSSdtIGhlYWRpbmcgc3RyYWlnaHQgZm9yIGBkcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmNgLiBJIG5lZWQgdG8gY29uZmlybSB0aGUgaW1wbGVtZW50YXRpb24gb2YgYGkyY19nZXRfbWF0Y2hfZGF0YWAgaW4gdGhhdCBmaWxlLCBhbmQgc2VlIHdoYXQgaXQncyBkb2luZyB3aXRoIHBvdGVudGlhbCBhbHRlcm5hdGUgaWRlbnRpZmllcnMuIFRoYXQgc2hvdWxkIGVpdGhlciBjb25maXJtIHRoZSBmYWxsLWJhY2sgYmVoYXZpb3IgSSdtIHJlbWVtYmVyaW5nLCBvciByZW1pbmQgbWUgb2Ygd2hhdCBhY3R1YWxseSBjaGFuZ2VkLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMDQyMCwiT3V0cHV0VG9rZW5zIjo0MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjlUMDU6NDg6MzEuNzYyNTM0MzE2WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzNDY4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTE1LFxuICBcIkxpbmVDb3VudFwiOiAzMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTE1OlxcdFxcdFxcdGlkKys7XFxuIDExNjpcXHRcXHR9XFxuIDExNzpcXHRcXHRyZXR1cm4gTlVMTDtcXG4gMTE4OlxcdH1cXG4gMTE5OlxcdEVYUE9SVF9TWU1CT0xfR1BMKGkyY19tYXRjaF9pZCk7XFxuIDEyMDpcXHRcXG4gMTIxOlxcdGNvbnN0IHZvaWQgKmkyY19nZXRfbWF0Y2hfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KVxcbiAxMjI6XFx0e1xcbiAxMjM6XFx0XFx0c3RydWN0IGkyY19kcml2ZXIgKmRyaXZlciA9IHRvX2kyY19kcml2ZXIoY2xpZW50LVxcdTAwM2VkZXYuZHJpdmVyKTtcXG4gMTI0OlxcdFxcdGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICptYXRjaDtcXG4gMTI1OlxcdFxcdGNvbnN0IHZvaWQgKmRhdGE7XFxuIDEyNjpcXHRcXG4gMTI3OlxcdFxcdGRhdGEgPSBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoXFx1MDAyNmNsaWVudC1cXHUwMDNlZGV2KTtcXG4gMTI4OlxcdFxcdGlmICghZGF0YSkge1xcbiAxMjk6XFx0XFx0XFx0bWF0Y2ggPSBpMmNfbWF0Y2hfaWQoZHJpdmVyLVxcdTAwM2VpZF90YWJsZSwgY2xpZW50KTtcXG4gMTMwOlxcdFxcdFxcdGlmICghbWF0Y2gpXFxuIDEzMTpcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gMTMyOlxcdFxcbiAxMzM6XFx0XFx0XFx0ZGF0YSA9IChjb25zdCB2b2lkICopbWF0Y2gtXFx1MDAzZWRyaXZlcl9kYXRhO1xcbiAxMzQ6XFx0XFx0fVxcbiAxMzU6XFx0XFxuIDEzNjpcXHRcXHRyZXR1cm4gZGF0YTtcXG4gMTM3OlxcdH1cXG4gMTM4OlxcdEVYUE9SVF9TWU1CT0woaTJjX2dldF9tYXRjaF9kYXRhKTtcXG4gMTM5OlxcdFxcbiAxNDA6XFx0c3RhdGljIGludCBpMmNfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydilcXG4gMTQxOlxcdHtcXG4gMTQyOlxcdFxcdHN0cnVjdCBpMmNfY2xpZW50XFx0KmNsaWVudCA9IGkyY192ZXJpZnlfY2xpZW50KGRldik7XFxuIDE0MzpcXHRcXHRjb25zdCBzdHJ1Y3QgaTJjX2RyaXZlclxcdCpkcml2ZXI7XFxuIDE0NDpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjlUMDU6NDg6MzEuNzYyNzcyNTI1WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU3NDA0ODE1NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEkyQyBEZXZpY2UgTWF0Y2hpbmcgaW4gdGhlIFJULVBTRSBNQ1UgRHJpdmVyKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgaTJjX2dldF9tYXRjaF9kYXRhYCBmdW5jdGlvbiBhbmQgaXQncyBjYWxsaW5nIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoXHUwMDI2Y2xpZW50LVx1MDAzZWRldilgLiBTdGFuZGFyZCBzdHVmZi4gSWYgdGhhdCByZXR1cm5zIE5VTEwsIGl0IGZhbGxzIGJhY2sgdG8gY2hlY2tpbmcgdGhlIGBkcml2ZXItXHUwMDNlaWRfdGFibGVgLiBCdXQgdGhlbiwgSSBzZWUgdGhhdCBgcnRwc2VfbWN1X2kyY19wcm9iZWAgaXMgY2FsbGluZyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldilgICpkaXJlY3RseSosIGJ5cGFzc2luZyB0aGF0IGZhbGxiYWNrIG1lY2hhbmlzbSEgQW5kIGl0IGRvZXNuJ3QgZXZlbiAqaGF2ZSogYW4gYGlkX3RhYmxlYCBkZWZpbmVkIGluIHRoZSBkcml2ZXIgaXRzZWxmLCB3aGljaCBzZWVtcyBvZGQuXG5cblRoaXMgaGFzIG1lIHRoaW5raW5nLiBUaGUgY29kZSBoYXM6XG5cbmBgYGNcblx0bWF0Y2ggPSBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTtcblx0aWYgKCFtYXRjaClcblx0XHRyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIC1FTk9ERVYsIFwibWlzc2luZyBtYXRjaCBkYXRhXFxuXCIpO1xuYGBgXG5cblNvLCBpZiBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCByZXR1cm5zIE5VTEwsIHRoZSBwcm9iZSBmYWlscyB3aXRoIGAtRU5PREVWYCwgd2hpY2ggaXMgdW5kZXJzdGFuZGFibGUuIEJ1dCBJJ20gcG9uZGVyaW5nLCB3aGF0IHdvdWxkIG1ha2UgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgcmV0dXJuIE5VTEw/IEl0IHNlZW1zIHRoaXMgaXMgZGlyZWN0bHkgdGllZCB0byB0aGUgdW5kZXJseWluZyBmaXJtd2FyZSBub2RlLiBJZiBgZGV2X2Z3bm9kZShkZXYpYCBpcyBOVUxMLCBpdCBsb29rcyBsaWtlIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHdpbGwgcmV0dXJuIE5VTEwsIGFuZCB0aGUgcHJvYmUgd2lsbCBmYWlsLlxuXG5CdXQgdGhlIHJlYWwgcXVlc3Rpb24gaXMsIGlzIHRoZXJlIGFueSBzaXR1YXRpb24gd2hlcmUgYGRldl9md25vZGUoZGV2KWAgKndvdWxkbid0KiBiZSBOVUxMIHdoZW4gYSBkZXZpY2UgaXMgaW5zdGFudGlhdGVkIHRocm91Z2ggc3lzZnM/IEkgbmVlZCB0byB2ZXJpZnkgdGhhdCBhc3N1bXB0aW9uLiBMZXQncyBkaWcgaW50byBgaTJjX3N5c2ZzX25ld19kZXZpY2VgIHRvIHNlZSBpZiB0aGF0J3Mgd2hlcmUgdGhlIGlzc3VlIG9yaWdpbmF0ZXMsIGlmIGl0IGlzIGFuIGlzc3VlIGF0IGFsbC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzEyMzMsIk91dHB1dFRva2VucyI6NDUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMDUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0ODozNy41MDMyNjA0NzFaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI4MzU2NDM0MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpMmNfc3lzZnNfbmV3X2RldmljZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jPTEzMjA9c3RhdGljIERFVklDRV9BVFRSX1dPKG5ld19kZXZpY2UpO1xcbi0tXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEzMjQtICogdGhleSBnb3QgaXQgd3JvbmcuIFRoaXMgaW50ZXJmYWNlIGNhbiBvbmx5IGJlIHVzZWQgdG8gZGVsZXRlIGRldmljZXNcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTMyNTogKiBpbnN0YW50aWF0ZWQgYnkgaTJjX3N5c2ZzX25ld19kZXZpY2UgYWJvdmUuIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHdlXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEzMjYtICogZG9uJ3QgZGVsZXRlIGRldmljZXMgdG8gd2hpY2ggc29tZSBrZXJuZWwgY29kZSBzdGlsbCBoYXMgcmVmZXJlbmNlcy5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjlUMDU6NDg6MzcuNzg2ODM3NzAzWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMyNzY5ODg1NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQW5hbHl6aW5nIHRoZSBgbmV3X2RldmljZWAgSGFuZGxlcioqXG5cbk9rYXksIGxldCdzIGRyaWxsIGRvd24gaW50byBob3cgd2UncmUgaGFuZGxpbmcgdGhhdCBgbmV3X2RldmljZWAgYXR0cmlidXRlLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIHNwZWNpZmljIGxvZ2ljIGludm9sdmVkLiBUaGlzIGF0dHJpYnV0ZSBpcyBjcml0aWNhbCwgYXMgaXQncyB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyB3aGVuIGEgbmV3IGRldmljZSBpcyBpbnRyb2R1Y2VkLCBhbmQgdGhhdCdzIGdvaW5nIHRvIHJpcHBsZSB0aHJvdWdoIHZhcmlvdXMgc3Vic3lzdGVtcywgc28gdW5kZXJzdGFuZGluZyB0aGUgbnVhbmNlcyBvZiBpdHMgaGFuZGxpbmcgaXMga2V5LiBJIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBhc3NvY2lhdGVkIGZ1bmN0aW9uIGlzIHJvYnVzdCwgY29ycmVjdGx5IGhhbmRsZXMgYWxsIGVkZ2UgY2FzZXMsIGFuZCB0aGF0IHRoZSBmdW5jdGlvbiBwbGF5cyBuaWNlIHdpdGggb3VyIGV4aXN0aW5nIGRldmljZSByZWdpc3RyYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gSSBuZWVkIHRvIHF1aWNrbHkgcmVjYWxsIHRoZSBkYXRhIGZsb3cgYW5kIGFueSBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbnMgdGhhdCBtYXkgY29tZSBpbnRvIHBsYXkgd2hlbmV2ZXIgdGhlIGhhbmRsZXIgaXMgdHJpZ2dlcmVkLiBXZSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoaXMgYXR0cmlidXRlIGlzbid0IHN1c2NlcHRpYmxlIHRvIGFueSBpbnB1dCB2YWxpZGF0aW9uIGlzc3VlcywgZWl0aGVyLiBJJ20gZ29pbmcgdG8gbG9vayBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSB0byBncmFzcCBpdHMgY3VycmVudCBiZWhhdmlvci5cblxuXG4iLCJJbnB1dFRva2VucyI6MzIwMjQsIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0ODo0MS4wNjM4MzA0OTlaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NDYyOTkyNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXdfZGV2aWNlX3N0b3JlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM9MTI2Mz1zdGF0aWMgc3NpemVfdFxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMjY0Om5ld19kZXZpY2Vfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cixcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTI2NS1cXHRcXHQgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ4OjQxLjIyODQ3NTI3NVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MDY2OTQ5ODA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcyBhcyBJIGFwcHJvYWNoIHJlYWRpbmcgYG5ld19kZXZpY2Vfc3RvcmVgOlxuXG4qKkluaXRpYWwgQXNzZXNzbWVudCBhbmQgR29hbCoqXG5cbkFscmlnaHQsIGBuZXdfZGV2aWNlX3N0b3JlYC4gVGhlIG5hbWUgaXRzZWxmIHN1Z2dlc3RzIGEgY2VudHJhbCBjb21wb25lbnQsIGxpa2VseSBhIGRhdGEgc3RydWN0dXJlIG9yIG1vZHVsZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgbmV3bHkgaW50cm9kdWNlZCBkZXZpY2VzLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byB1bmRlcnN0YW5kIGl0cyBwdXJwb3NlLCBjb3JlIGZ1bmN0aW9uYWxpdHksIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIHN5c3RlbS4gSSdtIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgaXQgaGFuZGxlcyBkZXZpY2UgcmVnaXN0cmF0aW9uLCBkYXRhIHN0b3JhZ2UsIGFuZCBwb3RlbnRpYWwgZGV2aWNlIGxpZmVjeWNsZSBtYW5hZ2VtZW50LiBUaGlzIGxpa2VseSBkaWN0YXRlcyBob3cgbmV3IGhhcmR3YXJlIGlzIGlkZW50aWZpZWQgYW5kIGNvbmZpZ3VyZWQgaW4gdGhlIHN5c3RlbS4gSSBhbnRpY2lwYXRlIG5lZWRpbmcgdG8gdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZXMgYW5kIHBvdGVudGlhbCBjb25jdXJyZW5jeSBpc3N1ZXMgdGhpcyBtb2R1bGUgd291bGQgaW50cm9kdWNlIHRvIHRoZSBzeXN0ZW0uXG5cbioqRGVlcGVyIERpdmUgYW5kIEFudGljaXBhdGlvbiBvZiBDb250ZW50KipcblxuSSdtIG1lbnRhbGx5IHByZXBhcmluZyBmb3IgYSBmZXcga2V5IGFyZWFzLiBJIGV4cGVjdCB0byBzZWUgZGV2aWNlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLCBwb3NzaWJseSB1c2luZyBmYWN0b3JpZXMgb3IgYnVpbGRlciBwYXR0ZXJucy4gSSdsbCBiZSBsb29raW5nIGZvciBhbnkgZXJyb3IgaGFuZGxpbmcgYXJvdW5kIGRldmljZSBhZGRpdGlvbiBhbmQgcmVtb3ZhbC4gR2l2ZW4gdGhlIFwic3RvcmVcIiBhc3BlY3QsIEkgYW50aWNpcGF0ZSBzb21lIGZvcm0gb2YgcGVyc2lzdGVudCBzdG9yYWdlIG9yIGNhY2hpbmcgbWVjaGFuaXNtIOKAkyBtYXliZSBhIGRhdGFiYXNlIGludGVyZmFjZSwgZmlsZSBzdG9yYWdlLCBvciBpbi1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmVzIGRlcGVuZGluZyBvbiBwZXJmb3JtYW5jZSBhbmQgZGF0YSBwZXJzaXN0ZW5jZSByZXF1aXJlbWVudHMuIEknbGwgYmUgYWxlcnQgZm9yIGFueSB0aHJlYWQtc2FmZXR5IGNvbnNpZGVyYXRpb25zIGlmIHRoaXMgaXMgYSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudC4gSSdtIGFsc28gYW50aWNpcGF0aW5nIGFueSBwb3RlbnRpYWwgdmFsaWRhdGlvbiBsb2dpYyB0byBlbnN1cmUgdGhhdCBhIGRldmljZSBhZGhlcmVzIHRvIGFueSBzcGVjaWZpZWQgY3JpdGVyaWEgb3IgaXMgYSBzdXBwb3J0ZWQgbW9kZWwuXG5cbioqSWRlbnRpZnlpbmcgS2V5IEZlYXR1cmVzIGFuZCBSZWxhdGlvbnNoaXBzKipcblxuQXMgSSByZWFkLCBJJ2xsIGJlIGtlZXBpbmcgYW4gZXllIG91dCBmb3IgaG93IHRoaXMgc3RvcmUgaXMgZXhwb3NlZCDigJMgaXMgaXQgdGhyb3VnaCBhIHB1YmxpYyBBUEk/IEFyZSB0aGVyZSBhbnkgZXZlbnRzIG9yIG5vdGlmaWNhdGlvbnMgdHJpZ2dlcmVkIGJ5IGNoYW5nZXMgaW4gdGhlIHN0b3JlPyBIb3cgZG9lcyBpdCBpbnRlZ3JhdGUgd2l0aCB0aGUgYnJvYWRlciBkZXZpY2UgbWFuYWdlbWVudCBzeXN0ZW0sIHN1Y2ggYXMgZGV2aWNlIGRyaXZlcnMsIGNvbmZpZ3VyYXRpb24gbWFuYWdlcnMsIG9yIHJlc291cmNlIGFsbG9jYXRpb24gbW9kdWxlcz8gSSB3aWxsIGJlIHNwZWNpZmljYWxseSBzZWVraW5nIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgbW9kdWxlIGhhbmRsZXMgZWRnZSBjYXNlcywgc3VjaCBhcyBkdXBsaWNhdGVkIGRldmljZSBpbmZvcm1hdGlvbiwgbWFsZm9ybWVkIGRldmljZSBkYXRhLCBvciBoYXJkd2FyZSBmYWlsdXJlcy5cblxuKipGb2N1c2luZyBvbiBQZXJmb3JtYW5jZSBhbmQgU2NhbGFiaWxpdHkqKlxuXG5JIHdpbGwgYWxzbyBiZSBvbiB0aGUgbG9va291dCBmb3IgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MsIG9yIHBvdGVudGlhbCBhcmVhcyBmb3IgaW1wcm92ZW1lbnQuIENvbnNpZGVyaW5nIHRoYXQgZGV2aWNlIGludHJvZHVjdGlvbiBpcyBsaWtlbHkgdG8gYmUgYSBoaWdoLWZyZXF1ZW5jeSBldmVudCwgSSdsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBjb2RlJ3MgZWZmaWNpZW5jeSwgaW5jbHVkaW5nIGFueSBkZXNpZ24gcGF0dGVybnMgdGhhdCBjb3VsZCBvcHRpbWl6ZSBkYXRhIGFjY2VzcyBhbmQgbWFuaXB1bGF0aW9uLiBJZiBhcHBsaWNhYmxlLCBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBtb2R1bGUgaXMgZGVzaWduZWQgdG8gc2NhbGUgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBjb25jdXJyZW50IGRldmljZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMyMzg1LCJPdXRwdXRUb2tlbnMiOjQ0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjlUMDU6NDg6NDYuMjk1NDI5ODQxWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM5NTQzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTI2MyxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTI2MzpcXHRzdGF0aWMgc3NpemVfdFxcbjEyNjQ6XFx0bmV3X2RldmljZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLFxcbjEyNjU6XFx0XFx0XFx0IGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KVxcbjEyNjY6XFx0e1xcbjEyNjc6XFx0XFx0c3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gdG9faTJjX2FkYXB0ZXIoZGV2KTtcXG4xMjY4OlxcdFxcdHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvO1xcbjEyNjk6XFx0XFx0c3RydWN0IGkyY19jbGllbnQgKmNsaWVudDtcXG4xMjcwOlxcdFxcdGNoYXIgKmJsYW5rLCBlbmQ7XFxuMTI3MTpcXHRcXHRpbnQgcmVzO1xcbjEyNzI6XFx0XFxuMTI3MzpcXHRcXHRtZW1zZXQoXFx1MDAyNmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2JvYXJkX2luZm8pKTtcXG4xMjc0OlxcdFxcbjEyNzU6XFx0XFx0YmxhbmsgPSBzdHJjaHIoYnVmLCAnICcpO1xcbjEyNzY6XFx0XFx0aWYgKCFibGFuaykge1xcbjEyNzc6XFx0XFx0XFx0ZGV2X2VycihkZXYsIFxcXCIlczogTWlzc2luZyBwYXJhbWV0ZXJzXFxcXG5cXFwiLCBcXFwibmV3X2RldmljZVxcXCIpO1xcbjEyNzg6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMTI3OTpcXHRcXHR9XFxuMTI4MDpcXHRcXHRpZiAoYmxhbmsgLSBidWYgXFx1MDAzZSBJMkNfTkFNRV9TSVpFIC0gMSkge1xcbjEyODE6XFx0XFx0XFx0ZGV2X2VycihkZXYsIFxcXCIlczogSW52YWxpZCBkZXZpY2UgbmFtZVxcXFxuXFxcIiwgXFxcIm5ld19kZXZpY2VcXFwiKTtcXG4xMjgyOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjEyODM6XFx0XFx0fVxcbjEyODQ6XFx0XFx0bWVtY3B5KGluZm8udHlwZSwgYnVmLCBibGFuayAtIGJ1Zik7XFxuMTI4NTpcXHRcXG4xMjg2OlxcdFxcdC8qIFBhcnNlIHJlbWFpbmluZyBwYXJhbWV0ZXJzLCByZWplY3QgZXh0cmEgcGFyYW1ldGVycyAqL1xcbjEyODc6XFx0XFx0cmVzID0gc3NjYW5mKCsrYmxhbmssIFxcXCIlaGklY1xcXCIsIFxcdTAwMjZpbmZvLmFkZHIsIFxcdTAwMjZlbmQpO1xcbjEyODg6XFx0XFx0aWYgKHJlcyBcXHUwMDNjIDEpIHtcXG4xMjg5OlxcdFxcdFxcdGRldl9lcnIoZGV2LCBcXFwiJXM6IENhbid0IHBhcnNlIEkyQyBhZGRyZXNzXFxcXG5cXFwiLCBcXFwibmV3X2RldmljZVxcXCIpO1xcbjEyOTA6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMTI5MTpcXHRcXHR9XFxuMTI5MjpcXHRcXHRpZiAocmVzIFxcdTAwM2UgMSAgXFx1MDAyNlxcdTAwMjYgZW5kICE9ICdcXFxcbicpIHtcXG4xMjkzOlxcdFxcdFxcdGRldl9lcnIoZGV2LCBcXFwiJXM6IEV4dHJhIHBhcmFtZXRlcnNcXFxcblxcXCIsIFxcXCJuZXdfZGV2aWNlXFxcIik7XFxuMTI5NDpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4xMjk1OlxcdFxcdH1cXG4xMjk2OlxcdFxcbjEyOTc6XFx0XFx0aWYgKChpbmZvLmFkZHIgXFx1MDAyNiBJMkNfQUREUl9PRkZTRVRfVEVOX0JJVCkgPT0gSTJDX0FERFJfT0ZGU0VUX1RFTl9CSVQpIHtcXG4xMjk4OlxcdFxcdFxcdGluZm8uYWRkciBcXHUwMDI2PSB+STJDX0FERFJfT0ZGU0VUX1RFTl9CSVQ7XFxuMTI5OTpcXHRcXHRcXHRpbmZvLmZsYWdzIHw9IEkyQ19DTElFTlRfVEVOO1xcbjEzMDA6XFx0XFx0fVxcbjEzMDE6XFx0XFxuMTMwMjpcXHRcXHRpZiAoaW5mby5hZGRyIFxcdTAwMjYgSTJDX0FERFJfT0ZGU0VUX1NMQVZFKSB7XFxuMTMwMzpcXHRcXHRcXHRpbmZvLmFkZHIgXFx1MDAyNj0gfkkyQ19BRERSX09GRlNFVF9TTEFWRTtcXG4xMzA0OlxcdFxcdFxcdGluZm8uZmxhZ3MgfD0gSTJDX0NMSUVOVF9TTEFWRTtcXG4xMzA1OlxcdFxcdH1cXG4xMzA2OlxcdFxcbjEzMDc6XFx0XFx0Y2xpZW50ID0gaTJjX25ld19jbGllbnRfZGV2aWNlKGFkYXAsIFxcdTAwMjZpbmZvKTtcXG4xMzA4OlxcdFxcdGlmIChJU19FUlIoY2xpZW50KSlcXG4xMzA5OlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKGNsaWVudCk7XFxuMTMxMDpcXHRcXG4xMzExOlxcdFxcdC8qIEtlZXAgdHJhY2sgb2YgdGhlIGFkZGVkIGRldmljZSAqL1xcbjEzMTI6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2YWRhcC1cXHUwMDNldXNlcnNwYWNlX2NsaWVudHNfbG9jayk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ4OjQ2LjI5NTgyOTA2MVoiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1NzY5NDkyMDkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSTJDIENsaWVudCBEZXZpY2UgQ3JlYXRpb24gYW5kIE1hdGNoaW5nIFByb2Nlc3MqKlxuXG5Pa2F5LCBzbyBsb29raW5nIGF0IHRoaXMsIGl0J3MgaW1tZWRpYXRlbHkgYXBwYXJlbnQgdGhhdCBgaW5mby5md25vZGVgIGlzIGluaXRpYWxpemVkIHRvIHplcm8gdXNpbmcgYG1lbXNldGAuIFRoaXMgbWVhbnMgdGhhdCBgaTJjX25ld19jbGllbnRfZGV2aWNlYCBpcyBnb2luZyB0byBjcmVhdGUgYSBjbGllbnQgd2l0aCBgZGV2LmZ3bm9kZWAgc2V0IHRvIGBOVUxMYC4gVGhlIGludGVyZXN0aW5nIHBhcnQgaXMgd2hhdCBoYXBwZW5zIG5leHQgZHVyaW5nIHRoZSBkcml2ZXIgbWF0Y2hpbmcgcHJvY2Vzcywgc3BlY2lmaWNhbGx5IHdpdGhpbiBgaTJjX2RldmljZV9tYXRjaGAuIFdlIGtub3cgdGhhdCB0aGlzIHdpbGwgZW1wbG95IGBpMmNfb2ZfbWF0Y2hfZGV2aWNlYCB0byBwZXJmb3JtIHRoZSBtYXRjaC5cblxuTXkgaW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgYGkyY19vZl9tYXRjaF9kZXZpY2VgIHByb2JhYmx5IHVzZXMgdGhlIGBvZl9tYXRjaF90YWJsZWAg4oCTIG1vc3QgbGlrZWx5IGVtcGxveWluZyB0aGUgYGluZm8udHlwZWAgc3RyaW5nIGZvciB0aGUgbWF0Y2guIElmIHRoYXQgbWF0Y2hlcyB0aGUgJ2NvbXBhdGlibGUnIHN0cmluZyB3aXRob3V0IHRoZSB2ZW5kb3IgcHJlZml4LCB0aGVuIGl0J2xsIGJlIGEgbWF0Y2guXG5cbldhaXQgYSBzZWNvbmQuIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUgYWJvdXQgaG93IGBpMmNfb2ZfbWF0Y2hfZGV2aWNlYCBzcGVjaWZpY2FsbHkgaGFuZGxlcyB0aGF0IGNvbXBhcmlzb24uIERpZCBJIG1pc3Mgc29tZXRoaW5nPyBJIHNob3VsZCBkb3VibGUtY2hlY2sgdGhlIGNvZGUgZGlyZWN0bHkuIExldCBtZSB2ZXJpZnkgdGhlIGV4YWN0IGxvZ2ljLiBJcyBpdCBgaTJjX29mX21hdGNoX2RldmljZWAgb3IgYGkyY19kZXZpY2VfbWF0Y2hgIHRoYXQncyBtYWtpbmcgdGhpcyBjb21wYXJpc29uPyBJIHNob3VsZCBkaXZlIGludG8gZWl0aGVyIG9uZSBhbmQgbWFrZSBzdXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMzczOSwiT3V0cHV0VG9rZW5zIjo0MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ4OjUyLjA2NTMyNjQ0MloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzgyOTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE0MCxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE0MDpcXHRzdGF0aWMgaW50IGkyY19kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KVxcbiAxNDE6XFx0e1xcbiAxNDI6XFx0XFx0c3RydWN0IGkyY19jbGllbnRcXHQqY2xpZW50ID0gaTJjX3ZlcmlmeV9jbGllbnQoZGV2KTtcXG4gMTQzOlxcdFxcdGNvbnN0IHN0cnVjdCBpMmNfZHJpdmVyXFx0KmRyaXZlcjtcXG4gMTQ0OlxcdFxcbiAxNDU6XFx0XFxuIDE0NjpcXHRcXHQvKiBBdHRlbXB0IGFuIE9GIHN0eWxlIG1hdGNoICovXFxuIDE0NzpcXHRcXHRpZiAoaTJjX29mX21hdGNoX2RldmljZShkcnYtXFx1MDAzZW9mX21hdGNoX3RhYmxlLCBjbGllbnQpKVxcbiAxNDg6XFx0XFx0XFx0cmV0dXJuIDE7XFxuIDE0OTpcXHRcXG4gMTUwOlxcdFxcdC8qIFRoZW4gQUNQSSBzdHlsZSBtYXRjaCAqL1xcbiAxNTE6XFx0XFx0aWYgKGFjcGlfZHJpdmVyX21hdGNoX2RldmljZShkZXYsIGRydikpXFxuIDE1MjpcXHRcXHRcXHRyZXR1cm4gMTtcXG4gMTUzOlxcdFxcbiAxNTQ6XFx0XFx0ZHJpdmVyID0gdG9faTJjX2RyaXZlcihkcnYpO1xcbiAxNTU6XFx0XFxuIDE1NjpcXHRcXHQvKiBGaW5hbGx5IGFuIEkyQyBtYXRjaCAqL1xcbiAxNTc6XFx0XFx0aWYgKGkyY19tYXRjaF9pZChkcml2ZXItXFx1MDAzZWlkX3RhYmxlLCBjbGllbnQpKVxcbiAxNTg6XFx0XFx0XFx0cmV0dXJuIDE7XFxuIDE1OTpcXHRcXG4gMTYwOlxcdFxcdHJldHVybiAwO1xcbiAxNjE6XFx0fVxcbiAxNjI6XFx0XFxuIDE2MzpcXHRzdGF0aWMgaW50IGkyY19kZXZpY2VfdWV2ZW50KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KVxcbiAxNjQ6XFx0e1xcbiAxNjU6XFx0XFx0Y29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTtcXG4gMTY2OlxcdFxcdGludCByYztcXG4gMTY3OlxcdFxcbiAxNjg6XFx0XFx0cmMgPSBvZl9kZXZpY2VfdWV2ZW50X21vZGFsaWFzKGRldiwgZW52KTtcXG4gMTY5OlxcdFxcdGlmIChyYyAhPSAtRU5PREVWKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0ODo1Mi4wNjU1NjY4ODFaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzkwMjc1NDU3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gd2hhdCBJJ2QgYmUgZG9pbmc6XG5cbioqQW5hbHl6aW5nIGBpMmNfb2ZfbWF0Y2hfZGV2aWNlYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlzc2VjdCBgaTJjX29mX21hdGNoX2RldmljZWAuIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0aGlzIGZ1bmN0aW9uIGZpdHMgaW50byB0aGUgb3ZlcmFsbCBJMkMgZGV2aWNlIHByb2JpbmcgYW5kIGluaXRpYWxpemF0aW9uIHNjaGVtZSwgcGFydGljdWxhcmx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBkZXZpY2UgdHJlZSB1c2FnZS4gSSBrbm93IHRoZSBiYXNpY3MsIGJ1dCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgc3BlY2lmaWMgcm9sZSBhbmQgYW55IG51YW5jZXMuIEknbGwgbmVlZCB0byByZW1lbWJlciBob3cgdGhlIGRldmljZSB0cmVlIGRhdGEgZ2V0cyB0cmFuc2xhdGVkIGludG8gY29uY3JldGUgZGV2aWNlIGF0dHJpYnV0ZXMgYW5kIHJlc291cmNlcy4gSXMgdGhpcyBmdW5jdGlvbiB0aGUgaGVhcnQgb2YgdGhlIG1hdGNoaW5nIHByb2Nlc3Mgd2hlbiB0aGUga2VybmVsIHNlZXMgYSBkZXZpY2Ugc3BlY2lmaWVkIGluIHRoZSBkZXZpY2UgdHJlZT8gRG9lcyBpdCBoYW5kbGUgdGhlIGNvbXBsZXhpdGllcyBvZiBkaWZmZXJlbnQgSTJDIGJ1cyB0eXBlcz8gSSdsbCBwcm9iYWJseSBzdGFydCBieSBsb29raW5nIGF0IGl0cyBzaWduYXR1cmUsIHdoYXQgaW5wdXRzIGl0IHRha2VzLCBhbmQgd2hhdCBpdCByZXR1cm5zLiBUaGVuLCBJ4oCZbGwgZm9sbG93IHRoZSBjb2RlIHBhdGggZnJvbSB0aGUgY2FsbCBzaXRlIHRvIHNlZSBob3cgaXQncyBpbnZva2VkIGFuZCB0aGUgaW1wYWN0IG9mIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBvbiB0aGUgb3ZlcmFsbCBkZXZpY2UgaW5pdGlhbGl6YXRpb24uIERvZXMgaXQgaW52b2x2ZSBpdGVyYXRpbmcgdGhyb3VnaCBhIGxpc3Qgb2YgY29tcGF0aWJsZSBzdHJpbmdzPyBIb3cgZG9lcyBpdCBoYW5kbGUgcG90ZW50aWFsIGNvbmZsaWN0cyBvciBhbWJpZ3VpdGllcyBpbiB0aGUgZGV2aWNlIHRyZWUgY29uZmlndXJhdGlvbj8gVWx0aW1hdGVseSwgSSB3YW50IHRvIGNvbmZpcm0gdGhhdCBgaTJjX29mX21hdGNoX2RldmljZWAgaXMgZnVuY3Rpb25pbmcgY29ycmVjdGx5LCB0aGF0IGl0IGFsaWducyB3aXRoIHRoZSBkZXZpY2UgdHJlZSdzIGRlc2lnbiBwcmluY2lwbGVzLCBhbmQgdGhhdCBpdCdzIGNvcnJlY3RseSBpZGVudGlmeWluZyBhbmQgY29ubmVjdGluZyB0aGUgY29ycmVjdCBkcml2ZXJzIHRvIG15IEkyQyBkZXZpY2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNDY4NCwiT3V0cHV0VG9rZW5zIjo0NCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjlUMDU6NDg6NTUuOTY4MzI1ODU5WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTA3OTYzMzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaTJjX29mX21hdGNoX2RldmljZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2kyYy9pMmMtY29yZS1vZi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvaTJjL2kyYy1jb3JlLW9mLmM9MTE1PXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkKlxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLW9mLmM6MTE2OmkyY19vZl9tYXRjaF9kZXZpY2Vfc3lzZnMoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcyxcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1vZi5jLTExNy1cXHRcXHRcXHRcXHQgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpXFxuLS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1vZi5jPTE0ND1jb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtb2YuYzoxNDU6KmkyY19vZl9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcyxcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1vZi5jLTE0Ni1cXHRcXHQgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpXFxuLS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1vZi5jLTE1Ni1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1vZi5jOjE1NzpcXHRyZXR1cm4gaTJjX29mX21hdGNoX2RldmljZV9zeXNmcyhtYXRjaGVzLCBjbGllbnQpO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLW9mLmMtMTU4LX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjlUMDU6NDg6NTYuMTE5MTMwODU3WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ0OTQwMzY5MzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBpMmNfb2ZfbWF0Y2hfZGV2aWNlX3N5c2ZzYCoqXG5cblJpZ2h0LCBgaTJjX29mX21hdGNoX2RldmljZV9zeXNmc2AuIFRoYXQgcmluZ3MgYSBiZWxsLi4uIHRpbWUgdG8gcmVmcmVzaCBteSBtZW1vcnkgYW5kIHNlZSB3aGF0J3MgZ29pbmcgb24gdW5kZXIgdGhlIGhvb2Qgd2l0aCB0aGlzIGZ1bmN0aW9uLiBJdCdzIHRoYXQgY3JpdGljYWwgcGllY2UgZm9yIGludGVncmF0aW5nIEkyQyBkZXZpY2VzIHdpdGggdGhlIERldmljZSBUcmVlIGFuZCwgY3J1Y2lhbGx5LCBtYWtpbmcgdGhlbSBtYW5hZ2VhYmxlIHRocm91Z2ggc3lzZnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlIGluIGNyZWF0aW5nIHRob3NlIHN5c2ZzIGVudHJpZXMgZm9yIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgZGV2aWNlIHRyZWUsIGFuZCBob3cgaXQgaGFuZGxlcyB0aGUgZGV2aWNlIG1hdGNoaW5nIGFuZCBiaW5kaW5nLiBJIHNob3VsZCBjaGVjayBob3cgdGhlIGRyaXZlciBkYXRhIGdldHMgcG9wdWxhdGVkLiBJJ20ga2VlbiB0byBzZWUgaWYgdGhpcyBoYW5kbGVzIHRoZSB2YXJpb3VzIGRldmljZSB0cmVlIHByb3BlcnR5IHR5cGVzIGNvcnJlY3RseSDigJMgc3RyaW5ncywgaW50ZWdlcnMsIGFycmF5cywgZXRjLiDigJMgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgY29yZSBJMkMgc3Vic3lzdGVtLiBJJ20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIGhvdyBpdCBkZWFscyB3aXRoIHBvdGVudGlhbCBjb25mbGljdHMgb3Igb3ZlcmxhcHMgZHVyaW5nIGRldmljZSBtYXRjaGluZy4gTmVlZCB0byBwYXkgYXR0ZW50aW9uIHRvIGFueSBlcnJvciBwYXRocyBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nLiBJdCdzIHRoYXQgc3VidGxlIHN0dWZmIHRoYXQncyBlYXN5IHRvIG92ZXJsb29rIGJ1dCBiaXRlcyBiYWNrIGxhdGVyIG9uIGluIGNvbXBsZXggaGFyZHdhcmUgY29uZmlndXJhdGlvbnMuIEdvdHRhIHNlZSBob3cgaXQgaG9va3MgaW50byB0aGUgbGFyZ2VyIHN5c3RlbSBpbml0aWFsaXphdGlvbiBhbmQgZGV2aWNlIHByb2JlIHNlcXVlbmNlLCB0b28uIE9rYXksIGxldCdzIGRpZyBpbiBhbmQgc2VlIGV4YWN0bHkgd2hhdCBpdCdzIGRvaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNTM0MCwiT3V0cHV0VG9rZW5zIjo0MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ5OjAwLjYxMzE3NDI4NloiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTYwNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZHJpdmVycy9pMmMvaTJjLWNvcmUtb2YuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTUsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMTU6XFx0c3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQqXFxuIDExNjpcXHRpMmNfb2ZfbWF0Y2hfZGV2aWNlX3N5c2ZzKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsXFxuIDExNzpcXHRcXHRcXHRcXHRcXHQgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpXFxuIDExODpcXHR7XFxuIDExOTpcXHRcXHRjb25zdCBjaGFyICpuYW1lO1xcbiAxMjA6XFx0XFxuIDEyMTpcXHRcXHRmb3IgKDsgbWF0Y2hlcy1cXHUwMDNlY29tcGF0aWJsZVswXTsgbWF0Y2hlcysrKSB7XFxuIDEyMjpcXHRcXHRcXHQvKlxcbiAxMjM6XFx0XFx0XFx0ICogQWRkaW5nIGRldmljZXMgdGhyb3VnaCB0aGUgaTJjIHN5c2ZzIGludGVyZmFjZSBwcm92aWRlcyB1c1xcbiAxMjQ6XFx0XFx0XFx0ICogYSBzdHJpbmcgdG8gbWF0Y2ggd2hpY2ggbWF5IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgZGV2aWNlXFxuIDEyNTpcXHRcXHRcXHQgKiB0cmVlIGNvbXBhdGlibGUgc3RyaW5ncywgaG93ZXZlciB3aXRoIG5vIGFjdHVhbCBvZl9ub2RlIHRoZVxcbiAxMjY6XFx0XFx0XFx0ICogb2ZfbWF0Y2hfZGV2aWNlKCkgd2lsbCBub3QgbWF0Y2hcXG4gMTI3OlxcdFxcdFxcdCAqL1xcbiAxMjg6XFx0XFx0XFx0aWYgKHN5c2ZzX3N0cmVxKGNsaWVudC1cXHUwMDNlbmFtZSwgbWF0Y2hlcy1cXHUwMDNlY29tcGF0aWJsZSkpXFxuIDEyOTpcXHRcXHRcXHRcXHRyZXR1cm4gbWF0Y2hlcztcXG4gMTMwOlxcdFxcbiAxMzE6XFx0XFx0XFx0bmFtZSA9IHN0cmNocihtYXRjaGVzLVxcdTAwM2Vjb21wYXRpYmxlLCAnLCcpO1xcbiAxMzI6XFx0XFx0XFx0aWYgKCFuYW1lKVxcbiAxMzM6XFx0XFx0XFx0XFx0bmFtZSA9IG1hdGNoZXMtXFx1MDAzZWNvbXBhdGlibGU7XFxuIDEzNDpcXHRcXHRcXHRlbHNlXFxuIDEzNTpcXHRcXHRcXHRcXHRuYW1lKys7XFxuIDEzNjpcXHRcXG4gMTM3OlxcdFxcdFxcdGlmIChzeXNmc19zdHJlcShjbGllbnQtXFx1MDAzZW5hbWUsIG5hbWUpKVxcbiAxMzg6XFx0XFx0XFx0XFx0cmV0dXJuIG1hdGNoZXM7XFxuIDEzOTpcXHRcXHR9XFxuIDE0MDpcXHRcXG4gMTQxOlxcdFxcdHJldHVybiBOVUxMO1xcbiAxNDI6XFx0fVxcbiAxNDM6XFx0XFxuIDE0NDpcXHRjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ5OjAwLjYxMzU3MjI1NloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MTUwMTM3MTU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkRpZ2dpbmcgaW50byBJMkMgRGV2aWNlIE1hdGNoaW5nKipcblxuT2theSwgc28gaWYgSSdtIHVuZGVyc3RhbmRpbmcgdGhpcyBjb3JyZWN0bHksIGlmIEkgdXNlIGVpdGhlciBgcHNlLW1jdS1nZW4xLXNtYnVzYCBvciBgcmVhbHRlayxwc2UtbWN1LWdlbjEtc21idXNgIGluIGBuZXdfZGV2aWNlYCwgYGkyY19kZXZpY2VfbWF0Y2hgICpzaG91bGQqIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyLiBUaGF0J3MgYSBnb29kIHN0YXJ0LiBCdXQsIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBpcyBhY3R1YWxseSB3b3JraW5nIGVuZC10by1lbmQsIHNvIHRoZSBuZXh0IHRoaW5nIEknbSB3b3JyaWVkIGFib3V0IGlzIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHdoZW4gdGhlIGBwcm9iZWAgZnVuY3Rpb24gaXMgY2FsbGVkLiBEb2VzIGl0IGhhdmUgYW55IGF3YXJlbmVzcyBvZiB0aGlzIHN5c2ZzLWJhc2VkIG1hdGNoaW5nPyBMZXQgbWUgZ28gYmFjayBhbmQgZG91YmxlLWNoZWNrIGhvdyB0aGF0J3MgaW1wbGVtZW50ZWQuIE9rYXksIHNvIGl0IGxvb2tzIGxpa2UgaXQgb25seSBlbmRzIHVwIGNhbGxpbmcgYGZ3bm9kZV9jYWxsX3B0cl9vcGAuIEhtbS4gSWYgYGZ3bm9kZWAgaXMgTlVMTCwgdGhlbiBpdCdzIGp1c3QgZ29pbmcgdG8gcmV0dXJuIE5VTEwsIHdoaWNoIGlzbid0IGhlbHBmdWwuIFdhaXQgYSBtaW51dGUuLi4gaXNuJ3QgdGhpcyBoYW5kbGVkIGJ5IGBpMmNfZ2V0X21hdGNoX2RhdGFgPyBMZXQncyBnbyBiYWNrIGFuZCB0YWtlIGFub3RoZXIgbG9vayBhdCBob3cgKnRoYXQqIGlzIGltcGxlbWVudGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNjA3NiwiT3V0cHV0VG9rZW5zIjo0MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2OCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ5OjA1Ljc2MzcxNjA5OVoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzc5MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyMSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDEyMTpcXHRjb25zdCB2b2lkICppMmNfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudClcXG4gMTIyOlxcdHtcXG4gMTIzOlxcdFxcdHN0cnVjdCBpMmNfZHJpdmVyICpkcml2ZXIgPSB0b19pMmNfZHJpdmVyKGNsaWVudC1cXHUwMDNlZGV2LmRyaXZlcik7XFxuIDEyNDpcXHRcXHRjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqbWF0Y2g7XFxuIDEyNTpcXHRcXHRjb25zdCB2b2lkICpkYXRhO1xcbiAxMjY6XFx0XFxuIDEyNzpcXHRcXHRkYXRhID0gZGV2aWNlX2dldF9tYXRjaF9kYXRhKFxcdTAwMjZjbGllbnQtXFx1MDAzZWRldik7XFxuIDEyODpcXHRcXHRpZiAoIWRhdGEpIHtcXG4gMTI5OlxcdFxcdFxcdG1hdGNoID0gaTJjX21hdGNoX2lkKGRyaXZlci1cXHUwMDNlaWRfdGFibGUsIGNsaWVudCk7XFxuIDEzMDpcXHRcXHRcXHRpZiAoIW1hdGNoKVxcbiAxMzE6XFx0XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDEzMjpcXHRcXG4gMTMzOlxcdFxcdFxcdGRhdGEgPSAoY29uc3Qgdm9pZCAqKW1hdGNoLVxcdTAwM2Vkcml2ZXJfZGF0YTtcXG4gMTM0OlxcdFxcdH1cXG4gMTM1OlxcdFxcbiAxMzY6XFx0XFx0cmV0dXJuIGRhdGE7XFxuIDEzNzpcXHR9XFxuIDEzODpcXHRFWFBPUlRfU1lNQk9MKGkyY19nZXRfbWF0Y2hfZGF0YSk7XFxuIDEzOTpcXHRcXG4gMTQwOlxcdHN0YXRpYyBpbnQgaTJjX2RldmljZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ5OjA1Ljc2Mzk5NjkxOVoiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozOTQzNDk3MjUyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkRlYnVnZ2luZyBhIE1pc21hdGNoZWQgRHJpdmVyIFByb2JlKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGlzIEkyQyBkcml2ZXIgaXNzdWUuIEl0IHNlZW1zIGxpa2UgdGhlIGNvcmUgcHJvYmxlbSByZXZvbHZlcyBhcm91bmQgaG93IHRoZSBkZXZpY2UgbWF0Y2hpbmcgZGF0YSBpcyByZXRyaWV2ZWQuIEknbSBzZWVpbmcgdGhpcyBjb2RlIHBhdGggd2hlcmUgaWYgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgcmV0dXJucyBOVUxMLCB0aGUgc3lzdGVtICpzaG91bGQqIGZhbGwgYmFjayB0byBjaGVja2luZyB0aGUgZHJpdmVyJ3MgYGlkX3RhYmxlYCB0aHJvdWdoIGBpMmNfZ2V0X21hdGNoX2RhdGFgLiBCdXQgaGVyZSdzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcgYW5kIHdoZXJlIEkgc2VlIGEgcG90ZW50aWFsIG1pc21hdGNoLlxuXG5Mb29raW5nIGNsb3Nlciwgc3BlY2lmaWNhbGx5IGF0IGBydHBzZV9tY3VfaTJjX3Byb2JlYCwgSSBzZWUgdGhhdCBpdCdzICpkaXJlY3RseSogY2FsbGluZyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldilgLiBJdCdzICpub3QqIGdvaW5nIHRocm91Z2ggdGhlIGV4cGVjdGVkIGBpMmNfZ2V0X21hdGNoX2RhdGEoY2xpZW50KWAgZnVuY3Rpb24gdGhhdCB3b3VsZCBoYW5kbGUgdGhlIGZhbGxiYWNrIHRvIGBkcml2ZXItXHUwMDNlaWRfdGFibGVgLiBBaGEhIEkgbmVlZCB0byBjb25maXJtIHRoaXMgYXNzdW1wdGlvbiBidXQgSSB0aGluayBJJ3ZlIGZvdW5kIG15IHBvaW50IG9mIGZhaWx1cmUuIEkgc2hvdWxkIGdvIGJhY2sgYW5kIGRvdWJsZSBjaGVjayB0aGUgcHJvYmUgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIHRoYXQgaXMgdGhlIHJvb3QgY2F1c2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM2ODQ3LCJPdXRwdXRUb2tlbnMiOjQ5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0OTowOS43MDc0OTgzNDFaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjAwNTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvbmV0L3BzZS1wZC9yZWFsdGVrLXBzZS1tY3UtaTJjLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTE1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTE1OlxcdHN0YXRpYyBpbnQgcnRwc2VfbWN1X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KVxcbiAxMTY6XFx0e1xcbiAxMTc6XFx0XFx0c3RydWN0IGRldmljZSAqZGV2ID0gXFx1MDAyNmNsaWVudC1cXHUwMDNlZGV2O1xcbiAxMTg6XFx0XFx0Y29uc3Qgc3RydWN0IHJ0cHNlX21jdV9tYXRjaF9kYXRhICptYXRjaDtcXG4gMTE5OlxcdFxcdHN0cnVjdCBydHBzZV9tY3VfY3RybCAqcHNlO1xcbiAxMjA6XFx0XFx0Ym9vbCB1c2VfbmF0aXZlO1xcbiAxMjE6XFx0XFxuIDEyMjpcXHRcXHRtYXRjaCA9IGRldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpO1xcbiAxMjM6XFx0XFx0aWYgKCFtYXRjaClcXG4gMTI0OlxcdFxcdFxcdHJldHVybiBkZXZfZXJyX3Byb2JlKGRldiwgLUVOT0RFViwgXFxcIm1pc3NpbmcgbWF0Y2ggZGF0YVxcXFxuXFxcIik7XFxuIDEyNTpcXHRcXG4gMTI2OlxcdFxcdC8qIFRoZSBmcmFtaW5nIChyYXcgSTJDIHZzIFNNQnVzKSBpcyBjYXJyaWVkIGJ5IHRoZSBtYXRjaCBkYXRhLiAqL1xcbiAxMjc6XFx0XFx0dXNlX25hdGl2ZSA9IG1hdGNoLVxcdTAwM2VuYXRpdmVfaTJjO1xcbiAxMjg6XFx0XFx0aWYgKHVzZV9uYXRpdmUpIHtcXG4gMTI5OlxcdFxcdFxcdGlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LVxcdTAwM2VhZGFwdGVyLCBJMkNfRlVOQ19JMkMpKVxcbiAxMzA6XFx0XFx0XFx0XFx0cmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCAtRU9QTk9UU1VQUCxcXG4gMTMxOlxcdFxcdFxcdFxcdFxcdFxcXCJwbGFpbi1JMkMgTUNVIHByb3RvY29sIHJlcXVpcmVzIEkyQy1jYXBhYmxlIGFkYXB0ZXJcXFxcblxcXCIpO1xcbiAxMzI6XFx0XFx0fSBlbHNlIHtcXG4gMTMzOlxcdFxcdFxcdGlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LVxcdTAwM2VhZGFwdGVyLFxcbiAxMzQ6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9JMkNfQkxPQ0sgfFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0OTowOS43MDc3MDMxMDFaIiwiU2VxIjozMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTI4NDExMTgzMzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBEZXZpY2UgTWF0Y2hpbmcgTG9naWMqKlxuXG5Pa2F5LCBzbyBJJ20gdHJhY2luZyB0aHJvdWdoIHRoaXMgY29kZSwgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgaG93IGRldmljZSBtYXRjaGluZyB3b3Jrcywgc3BlY2lmaWNhbGx5IGZvciBJMkMgZGV2aWNlcyBpbnN0YW50aWF0ZWQgdGhyb3VnaCBzeXNmcy4gSXQgc3RhcnRzIHdpdGggYSBjYWxsIHRvIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KWAuIEkga25vdyB0aGF0IGlmIHRoZSBkZXZpY2UncyBgZndub2RlYCBpcyBOVUxMLCB3aGljaCBpcyB0aGUgY2FzZSBmb3IgdGhlc2Ugc3lzZnMgSTJDIGRldmljZXMsIHRoYXQgZnVuY3Rpb24gd2lsbCByZXR1cm4gTlVMTC4gQnV0LCBob2xkIG9uLi4uIGRvZXMgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgc29tZWhvdyBmYWxsIGJhY2sgdG8gYGkyY19vZl9tYXRjaF9kZXZpY2Vfc3lzZnNgPyBObywgbm8sIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiwgZGVmaW5lZCBpbiBgZHJpdmVycy9iYXNlL3Byb3BlcnR5LmNgLiBJdCBvbmx5IHVzZXMgYGZ3bm9kZV9jYWxsX3B0cl9vcGAuXG5cbldhaXQgYSBtaW51dGUsIEkgdGhpbmsgSSd2ZSBnb3QgaXQuIGBpMmNfb2ZfbWF0Y2hfZGV2aWNlX3N5c2ZzYCBpcyAqb25seSogY2FsbGVkIHdpdGhpbiBgaTJjX2RldmljZV9tYXRjaGAuIFNvLCBpdCdzIG5vdCBhIGZhbGxiYWNrIGZyb20gYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAuIE9rYXksIGxldCdzIGJhY2sgdXAuIERvZXMgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgY29uc2lkZXIgdGhlIGRyaXZlcidzIGBvZl9tYXRjaF90YWJsZWA/IEkgbmVlZCB0byBkb3VibGUtY2hlY2sgdGhhdC4gTGV0IG1lIGxvb2sgYXQgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgb25lIG1vcmUgdGltZS4gV2FpdCwgSSBzZWVtIHRvIHJlbWVtYmVyIGEgcmVjZW50IGNoYW5nZSB3aGVyZSBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCAqd2FzKiB1cGRhdGVkIHRvIGluY2x1ZGUgYSBjaGVjayBmb3IgYGRldi1cdTAwM2Vkcml2ZXItXHUwMDNlb2ZfbWF0Y2hfdGFibGVgISBZZXMsIEkgdGhpbmsgSSdtIHJpZ2h0IGFib3V0IHRoYXQuIExldCBtZSBoZWFkIGJhY2sgaW50byBgZHJpdmVycy9iYXNlL3Byb3BlcnR5LmNgIHRvIGNvbmZpcm0gbXkgbWVtb3J5LlxuXG5cbiIsIklucHV0VG9rZW5zIjozNzYwOSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ5OjIyLjU0ODgyNzE4MVoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMwMzEzNTQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImRldmljZV9nZXRfbWF0Y2hfZGF0YVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2Jhc2UvcHJvcGVydHkuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2Jhc2UvcHJvcGVydHkuYz0xMzQ3PUVYUE9SVF9TWU1CT0woZndub2RlX2dyYXBoX3BhcnNlX2VuZHBvaW50KTtcXG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYy0xMzQ4LVxcbmRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jOjEzNDk6Y29uc3Qgdm9pZCAqZGV2aWNlX2dldF9tYXRjaF9kYXRhKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldilcXG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYy0xMzUwLXtcXG5kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYzoxMzUxOlxcdHJldHVybiBmd25vZGVfY2FsbF9wdHJfb3AoZGV2X2Z3bm9kZShkZXYpLCBkZXZpY2VfZ2V0X21hdGNoX2RhdGEsIGRldik7XFxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmMtMTM1Mi19XFxuZHJpdmVycy9iYXNlL3Byb3BlcnR5LmM6MTM1MzpFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfZ2V0X21hdGNoX2RhdGEpO1xcbmRyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jLTEzNTQtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ5OjIyLjc3OTE0OTc3OVoiLCJTZXEiOjMzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MTA0OTA2MjU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIGNyYWZ0ZWQgd2l0aCB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IEknbSBkaXNjdXNzaW5nIHRoaXMgd2l0aCBhIGZlbGxvdyBleHBlcnQ6XG5cbioqVHJhY2luZyB0aGUgRnVuY3Rpb24gQ2FsbCBDaGFpbioqXG5cbkhtbSwgc28gaXQgZG9lc24ndCBhcHBlYXIgdG8gYmUgdXNpbmcgYW55dGhpbmcgKmRpcmVjdGx5KiBuYW1lZCBvdGhlciB0aGFuIGBmd25vZGVfY2FsbF9wdHJfb3BgLiBBbHJpZ2h0LCBsZXQncyBkcmlsbCBkb3duLiBUaGUga2V5IGlzIGdvaW5nIHRvIGJlIHdpdGhpbiBgZndub2RlX2NhbGxfcHRyX29wYCBpdHNlbGYuIFdlIG5lZWQgdG8gc2VlIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvciB1dGlsaXplcyB0aGUgYG9mX2Z3bm9kZV9vcHNgIHN0cnVjdHVyZSwgYXMgdGhhdCdzIHdoZXJlIHRoZSBjcml0aWNhbCBmdW5jdGlvbmFsaXR5IHdvdWxkIGxpa2VseSByZXNpZGUuIEknbSB0aGlua2luZywgaXMgdGhlIG9wZXJhdGlvbiBhbiBpbmRpcmVjdCBjYWxsPyBJcyB0aGVyZSBhIGxvb2t1cCB0YWJsZSBpbnZvbHZlZD8gSSBuZWVkIHRvIGFuYWx5emUgaG93IHRob3NlIGZ1bmN0aW9uIHBvaW50ZXJzIGZyb20gYG9mX2Z3bm9kZV9vcHNgIGFyZSBhY3R1YWxseSBiZWluZyBkaXNwYXRjaGVkIGJ5IGBmd25vZGVfY2FsbF9wdHJfb3BgLiBMZXQncyBzZWUuLi5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzg0NDQsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0OToyNy44ODQwNjE2NzJaIiwiU2VxIjozNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI0NjA2MjY1NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJcXFxcLmRldmljZV9nZXRfbWF0Y2hfZGF0YVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL29mL3Byb3BlcnR5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9vZi9wcm9wZXJ0eS5jPTE2ODc9Y29uc3Qgc3RydWN0IGZ3bm9kZV9vcGVyYXRpb25zIG9mX2Z3bm9kZV9vcHMgPSB7XFxuLS1cXG5kcml2ZXJzL29mL3Byb3BlcnR5LmMtMTY5MC1cXHQuZGV2aWNlX2lzX2F2YWlsYWJsZSA9IG9mX2Z3bm9kZV9kZXZpY2VfaXNfYXZhaWxhYmxlLFxcbmRyaXZlcnMvb2YvcHJvcGVydHkuYzoxNjkxOlxcdC5kZXZpY2VfZ2V0X21hdGNoX2RhdGEgPSBvZl9md25vZGVfZGV2aWNlX2dldF9tYXRjaF9kYXRhLFxcbmRyaXZlcnMvb2YvcHJvcGVydHkuYy0xNjkyLVxcdC5kZXZpY2VfZG1hX3N1cHBvcnRlZCA9IG9mX2Z3bm9kZV9kZXZpY2VfZG1hX3N1cHBvcnRlZCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjlUMDU6NDk6MjguMTMwMTQwMzY2WiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU5NTc2NzY3NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgYXNzdW1pbmcgSSdtIGRlZXBseSBmYW1pbGlhciB3aXRoIHRoaXMga2luZCBvZiBjb2RlOlxuXG4qKkNoZWNraW5nIGBvZl9md25vZGVfZGV2aWNlX2dldF9tYXRjaF9kYXRhYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGl2ZSBpbnRvIGBvZl9md25vZGVfZGV2aWNlX2dldF9tYXRjaF9kYXRhYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHF1aWNrbHkgcmV2aWV3IHdoYXQgdGhpcyBmdW5jdGlvbiBkb2VzLiBHaXZlbiB0aGUgbmFtZSwgSSdtIGFzc3VtaW5nIGl0J3MgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgbWF0Y2ggZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBmaXJtd2FyZSBub2RlIGRldmljZS4gU3BlY2lmaWNhbGx5LCBJJ2xsIGJlIGxvb2tpbmcgZm9yIGFueSBkYXRhIHVzZWQgaW4gZGV2aWNlIG1hdGNoaW5nLiBUaGlzIHByb2JhYmx5IG1lYW5zIGl0J3MgdGhlIGdhdGV3YXkgZm9yIGhvdyB0aGUgZHJpdmVyIGtub3dzIHdoYXQgZGV2aWNlcyBpdCBpcyBjb21wYXRpYmxlIHdpdGguIEknbGwgbmVlZCB0byByZW1lbWJlciB0aGUgZGlmZmVyZW50IG1hdGNoaW5nIHNjaGVtZXMgdGhhdCBhcmUgdHlwaWNhbGx5IHN1cHBvcnRlZCwgc3VjaCBhcyBJRCB0YWJsZXMsIGNvbXBhdGlibGUgc3RyaW5ncywgb3Igb3RoZXIgcHJvcHJpZXRhcnkgbWV0aG9kcy4gSeKAmWxsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGZ1bmN0aW9uIGV4dHJhY3RzIHRoYXQgZGF0YSBmcm9tIHRoZSBkZXZpY2UgdHJlZSBvciBvdGhlciBmaXJtd2FyZSBjb25maWd1cmF0aW9uLiBJIG5lZWQgdG8gYmUgcHJlcGFyZWQgdG8gaWRlbnRpZnkgY29tbW9uIHBpdGZhbGxzIGxpa2UgaW5jb3JyZWN0IGRhdGEgdHlwZXMsIG1pc3NpbmcgZW50cmllcywgb3IgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvd3MgaWYgc3RyaW5nLWJhc2VkIG1hdGNoaW5nIGlzIHVzZWQuIEZpbmFsbHksIEknbGwgaGF2ZSB0byBzZWUgd2hlcmUgaXQgZ2V0cyBjYWxsZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dC4gVGhpcyBpcyBsaWtlbHkgcGFydCBvZiB0aGUgbGFyZ2VyIGRldmljZSBwcm9iZSBvciBpbml0aWFsaXphdGlvbiBwcm9jZXNzLiBJJ2xsIGJlIGFibGUgdG8gZGVjaWRlIGlmIEkgdW5kZXJzdGFuZCBpdCBpbW1lZGlhdGVseSwgb3IgaWYgSSdsbCBuZWVkIHRvIHN0YXJ0IGRpZ2dpbmcgaW50byB0aGUgc3Vycm91bmRpbmcgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzg4NTgsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0OTozNC4wODc4MjI3MjJaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI3NTU2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL29mL3Byb3BlcnR5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTY1MCxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTY1MDpcXHRcXG4xNjUxOlxcdFxcdHJldHVybiBvZl9wcm9wZXJ0eV9tYXRjaF9zdHJpbmcobnAsIHByb3BfbmFtZSwgdmFsdWUpO1xcbjE2NTI6XFx0fVxcbjE2NTM6XFx0XFxuMTY1NDpcXHRzdGF0aWMgYm9vbCBvZl9pc19md25vZGVfYWRkX2xpbmtzX3N1cHBvcnRlZCh2b2lkKVxcbjE2NTU6XFx0e1xcbjE2NTY6XFx0XFx0c3RhdGljIGludCBpc19zdXBwb3J0ZWQgPSAtMTtcXG4xNjU3OlxcdFxcbjE2NTg6XFx0XFx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19YODYpKVxcbjE2NTk6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuMTY2MDpcXHRcXG4xNjYxOlxcdFxcdGlmIChpc19zdXBwb3J0ZWQgIT0gLTEpXFxuMTY2MjpcXHRcXHRcXHRyZXR1cm4gISFpc19zdXBwb3J0ZWQ7XFxuMTY2MzpcXHRcXG4xNjY0OlxcdFxcdGlzX3N1cHBvcnRlZCA9ICEoKG1hdGNoX3Byb3BlcnR5X2J5X3BhdGgoXFxcIi9zb2NcXFwiLCBcXFwiY29tcGF0aWJsZVxcXCIsIFxcXCJpbnRlbCxjZTQxMDAtY3BcXFwiKSBcXHUwMDNlPSAwKSB8fFxcbjE2NjU6XFx0XFx0XFx0XFx0IChtYXRjaF9wcm9wZXJ0eV9ieV9wYXRoKFxcXCIvXFxcIiwgXFxcImFyY2hpdGVjdHVyZVxcXCIsIFxcXCJPTFBDXFxcIikgXFx1MDAzZT0gMCkpO1xcbjE2NjY6XFx0XFxuMTY2NzpcXHRcXHRyZXR1cm4gISFpc19zdXBwb3J0ZWQ7XFxuMTY2ODpcXHR9XFxuMTY2OTpcXHRcXG4xNjcwOlxcdHN0YXRpYyBpbnQgb2ZfZndub2RlX2FkZF9saW5rcyhzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKVxcbjE2NzE6XFx0e1xcbjE2NzI6XFx0XFx0Y29uc3Qgc3RydWN0IHByb3BlcnR5ICpwO1xcbjE2NzM6XFx0XFx0c3RydWN0IGRldmljZV9ub2RlICpjb25fbnAgPSB0b19vZl9ub2RlKGZ3bm9kZSk7XFxuMTY3NDpcXHRcXG4xNjc1OlxcdFxcdGlmICghb2ZfaXNfZndub2RlX2FkZF9saW5rc19zdXBwb3J0ZWQoKSlcXG4xNjc2OlxcdFxcdFxcdHJldHVybiAwO1xcbjE2Nzc6XFx0XFxuMTY3ODpcXHRcXHRpZiAoIWNvbl9ucClcXG4xNjc5OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0OTozNC4wOTAxMDUwNFoiLCJTZXEiOjM3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODYwMzI2MjE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkh1bnRpbmcgRG93biBgb2ZfZndub2RlX2RldmljZV9nZXRfbWF0Y2hfZGF0YWAqKlxuXG5Pa2F5LCBJJ20gb24gYSBxdWVzdCBmb3IgYG9mX2Z3bm9kZV9kZXZpY2VfZ2V0X21hdGNoX2RhdGFgLiBJIGtub3cgaXQncyBwcm9iYWJseSByZWxhdGVkIHRvIGRldmljZSB0cmVlIGhhbmRsaW5nLCBzcGVjaWZpY2FsbHkgZmlybXdhcmUgbm9kZSBpbnRlcmFjdGlvbi4gTXkgYnJhaW4gaXMgYWxyZWFkeSBzdGFydGluZyB0byBwaWVjZSB0b2dldGhlciB0aGUgbGlrZWx5IGNvbnRleHRzOiB0aGlzIGlzIHByb2JhYmx5IGEgZnVuY3Rpb24gdXNlZCB0byBleHRyYWN0IG1hdGNoIGRhdGEgZnJvbSBhIGZpcm13YXJlIG5vZGUsIGxpa2VseSBkdXJpbmcgZGV2aWNlIHByb2Jpbmcgb3IgaW5pdGlhbGl6YXRpb24uIEknbSBndWVzc2luZyB0aGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YgdGhlIG5ld2VyIGZ3X2RldmxpbmsgZnJhbWV3b3JrIG9yIHNvbWV0aGluZyBzaW1pbGFyLCBtYXliZSByZXBsYWNpbmcgb2xkZXIgbWV0aG9kcy4gSSBpbW1lZGlhdGVseSBzdGFydCBtZW50YWxseSB0cmFjaW5nIHRoZSBkZXBlbmRlbmNpZXMuIEl0J3MgYWxtb3N0IGNlcnRhaW5seSBjYWxsZWQgc29tZXdoZXJlIHdpdGhpbiB0aGUgZHJpdmVyIGluaXRpYWxpemF0aW9uIGZsb3cgd2hlbiBkZWFsaW5nIHdpdGggYSBkZXZpY2UncyBkZXZpY2UgdHJlZSBiaW5kaW5ncy4gSSdtIGV4cGVjdGluZyB0aGlzIHRvIHJldHVybiBzb21lIGtpbmQgb2YgcGxhdGZvcm0tc3BlY2lmaWMgbWF0Y2ggZGF0YS4gSXQgY291bGQgaW52b2x2ZSBleHRyYWN0aW5nIGNvbXBhdGlibGUgc3RyaW5ncywgcmVnIHByb3BlcnRpZXMsIGludGVycnVwdCBzcGVjaWZpY2F0aW9ucywgb3IgZXZlbiByZXNvdXJjZSBkYXRhLiBJIGJldCB0aGVyZSBpcyBzb21lIGhlbHBlciBvciB3cmFwcGVyIGZ1bmN0aW9uIHN1cnJvdW5kaW5nIHRoZSByYXcgY2FsbC4gTm93LCBJIHdhbnQgdG8gZmluZCBpdHMgZGVmaW5pdGlvbiBvciB1c2FnZS4gTGV0J3Mgc2VlIGlmIGBncmVwYCB3aWxsIGxlYWQgbWUgb24gdGhlIHJpZ2h0IHBhdGguXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM5NjI1LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0OTozNy45NTA0MzU3NzVaIiwiU2VxIjozOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM3MjQyMjE2MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJvZl9md25vZGVfZGV2aWNlX2dldF9tYXRjaF9kYXRhXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImRyaXZlcnMvb2YvcHJvcGVydHkuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL29mL3Byb3BlcnR5LmM9MTI1MT1zdGF0aWMgY29uc3Qgdm9pZCAqXFxuZHJpdmVycy9vZi9wcm9wZXJ0eS5jOjEyNTI6b2ZfZndub2RlX2RldmljZV9nZXRfbWF0Y2hfZGF0YShjb25zdCBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLFxcbmRyaXZlcnMvb2YvcHJvcGVydHkuYy0xMjUzLVxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldilcXG4tLVxcbmRyaXZlcnMvb2YvcHJvcGVydHkuYz0xNjg3PWNvbnN0IHN0cnVjdCBmd25vZGVfb3BlcmF0aW9ucyBvZl9md25vZGVfb3BzID0ge1xcbi0tXFxuZHJpdmVycy9vZi9wcm9wZXJ0eS5jLTE2OTAtXFx0LmRldmljZV9pc19hdmFpbGFibGUgPSBvZl9md25vZGVfZGV2aWNlX2lzX2F2YWlsYWJsZSxcXG5kcml2ZXJzL29mL3Byb3BlcnR5LmM6MTY5MTpcXHQuZGV2aWNlX2dldF9tYXRjaF9kYXRhID0gb2ZfZndub2RlX2RldmljZV9nZXRfbWF0Y2hfZGF0YSxcXG5kcml2ZXJzL29mL3Byb3BlcnR5LmMtMTY5Mi1cXHQuZGV2aWNlX2RtYV9zdXBwb3J0ZWQgPSBvZl9md25vZGVfZGV2aWNlX2RtYV9zdXBwb3J0ZWQsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ5OjM4LjMyMjg2NzQ2OFoiLCJTZXEiOjM5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0Nzc3OTQzNjYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGFzc3VtaW5nIEknbSBhbiBleHBlcnQgaW4gZGV2aWNlIGRyaXZlciBpbnRlcmFjdGlvbjpcblxuKipBbmFseXppbmcgdGhlIEZ1bmN0aW9uOiBgb2ZfZndub2RlX2RldmljZV9nZXRfbWF0Y2hfZGF0YWAqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgb2ZfZndub2RlX2RldmljZV9nZXRfbWF0Y2hfZGF0YWAgZnVuY3Rpb24uIFRoZSBuYW1lIGl0c2VsZiBpcyBwcmV0dHkgaW5mb3JtYXRpdmUuIEl0IGxvb2tzIGxpa2Ugd2UncmUgZXh0cmFjdGluZyBtYXRjaGluZyBkYXRhLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBGaXJtd2FyZSBOb2RlIChmd25vZGUpIGRldmljZXMuIFNvLCB0aGlzIHByb2JhYmx5IHNpdHMgaW4gdGhlIG1pZGRsZSBvZiBhIERldmljZSBUcmVlIGJpbmRpbmcgb3BlcmF0aW9uLCBvciBzaW1pbGFyLlxuXG5JJ20gaW1tZWRpYXRlbHkgY3VyaW91cyBhYm91dCB0aGUgY29udGV4dC4gV2hhdCdzIHRoZSBzdXJyb3VuZGluZyBjb2RlIGRvaW5nPyBJcyBpdCBwYXJ0IG9mIHRoZSBwcm9iZSBwcm9jZXNzPyBJcyBpdCBjYWxsZWQgZHVyaW5nIGRyaXZlciByZWdpc3RyYXRpb24/IFVuZGVyc3RhbmRpbmcgdGhlIGJpZ2dlciBwaWN0dXJlIGlzIGtleS4gSSdsbCBuZWVkIHRvIHJlbWVtYmVyIHRvIGxvb2sgYXQgdGhlIGNhbGxpbmcgZnVuY3Rpb25zIHRvIGdhaW4gbW9yZSBjb250ZXh0LlxuXG5UaGUgXCJtYXRjaCBkYXRhXCIgcGllY2UgaXMgYWxzbyBpbXBvcnRhbnQuIFdoYXQga2luZCBvZiBtYXRjaCBkYXRhIGFyZSB3ZSB0YWxraW5nIGFib3V0PyBJcyBpdCBwcm9wZXJ0aWVzIGZyb20gdGhlIERUIG5vZGUgaXRzZWxmPyBQZXJoYXBzIGl0J3MgaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIERUIHRoYXQncyB0aGVuIHVzZWQgZm9yIHByb2JlIGFyZ3VtZW50cz8gSXQgY291bGQgYmUgYW55dGhpbmcgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIHRvIHN1Y2Nlc3NmdWxseSBiaW5kIHRvIHRoaXMgcGFydGljdWxhciBmd25vZGUuXG5cblNvLCBJJ2xsIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgc3BlY2lmaWNhbGx5IHN1cHBvc2VkIHRvICpkbyosIGFuZCB3aGF0IGl0J3MgKnN1cHBvc2VkKiB0byByZXR1cm4uIEEgc3VjY2Vzc2Z1bCByZXR1cm4gbGlrZWx5IG1lYW5zIGdvb2QgbWF0Y2ggZGF0YSwgd2hpbGUgYSBmYWlsdXJlIHdvdWxkIGxpa2VseSBtZWFuIG5vIG1hdGNoLCBvciBpbnZhbGlkIGRhdGEuIEknbSBrZWVuIHRvIHNlZSBpZiB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgbWF0Y2hpbmcgYmFzZWQgb24gY29tcGF0aWJpbGl0eSBzdHJpbmdzLCBkZXZpY2UgSURzLCBvciBzb21lIG90aGVyIGtleSBpZGVudGlmaWVyLlxuXG5JIHdhbnQgdG8ga25vdyBpZiB0aGlzIGZ1bmN0aW9uIGNvdWxkIHJldHVybiBhIG51bGwgcG9pbnRlciwgb3IgYW4gZXJyb3IgY29kZS4gSSdsbCBjaGVjayBpdHMgcmV0dXJuIHZhbHVlLCBzbyBJJ2xsIG1ha2UgYSBtZW50YWwgbm90ZSB0byB1bmRlcnN0YW5kIHRoZSByZXR1cm4gdmFsdWUncyBzZW1hbnRpY3MuIFVuZGVyc3RhbmRpbmcgdGhlIGVycm9yIGhhbmRsaW5nIGhlcmUgaXMgY3JpdGljYWwuIElmIGl0IGZhaWxzLCBob3cgZ3JhY2VmdWxseSBkb2VzIHRoZSBzeXN0ZW0gcHJvY2VlZD9cblxuXG4iLCJJbnB1dFRva2VucyI6NDAxNjIsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0OTo0My4xMDA4MTg0MjhaIiwiU2VxIjo0MCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjU2MDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvb2YvcHJvcGVydHkuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMjUxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMjUxOlxcdHN0YXRpYyBjb25zdCB2b2lkICpcXG4xMjUyOlxcdG9mX2Z3bm9kZV9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSxcXG4xMjUzOlxcdFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldilcXG4xMjU0OlxcdHtcXG4xMjU1OlxcdFxcdHJldHVybiBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTtcXG4xMjU2OlxcdH1cXG4xMjU3OlxcdFxcbjEyNTg6XFx0c3RhdGljIHZvaWQgb2ZfbGlua190b19waGFuZGxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29uX25wLFxcbjEyNTk6XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGRldmljZV9ub2RlICpzdXBfbnAsXFxuMTI2MDpcXHRcXHRcXHRcXHQgICAgICB1OCBmbGFncylcXG4xMjYxOlxcdHtcXG4xMjYyOlxcdFxcdHN0cnVjdCBkZXZpY2Vfbm9kZSAqdG1wX25wIF9fZnJlZShkZXZpY2Vfbm9kZSkgPSBvZl9ub2RlX2dldChzdXBfbnApO1xcbjEyNjM6XFx0XFxuMTI2NDpcXHRcXHQvKiBDaGVjayB0aGF0IHN1cF9ucCBhbmQgaXRzIGFuY2VzdG9ycyBhcmUgYXZhaWxhYmxlLiAqL1xcbjEyNjU6XFx0XFx0d2hpbGUgKHRtcF9ucCkge1xcbjEyNjY6XFx0XFx0XFx0aWYgKG9mX2Z3bm9kZV9oYW5kbGUodG1wX25wKS1cXHUwMDNlZGV2KVxcbjEyNjc6XFx0XFx0XFx0XFx0YnJlYWs7XFxuMTI2ODpcXHRcXG4xMjY5OlxcdFxcdFxcdGlmICghb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZSh0bXBfbnApKVxcbjEyNzA6XFx0XFx0XFx0XFx0cmV0dXJuO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0OTo0My4xMDEwNzgxOThaIiwiU2VxIjo0MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzYxMDU5ODI4NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gY2hlY2tpbmcgYG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YWAsIHN1bW1hcml6ZWQgYXMgaWYgaXQncyBjb21pbmcgZGlyZWN0bHkgZnJvbSBteSBvd24gbWluZDpcblxuKipBbmFseXppbmcgYG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YWAqKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YWAgZnVuY3Rpb25zLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgXCJPa2F5LCB0aGlzIGlzIGFib3V0IGV4dHJhY3RpbmcgZGF0YSBmcm9tIGEgZGV2aWNlIG1hdGNoLiBXaGF0IGtpbmQgb2YgbWF0Y2ggYXJlIHdlIHRhbGtpbmcgYWJvdXQgaGVyZT9cIiBJJ20gYXNzdW1pbmcgdGhpcyBmdW5jdGlvbiBpcyBjZW50cmFsIHRvIGhhbmRsaW5nIGRldmljZSB0cmVlIGJpbmRpbmdzIGFuZCB0aGVpciBpbnRlcmFjdGlvbiB3aXRoIHRoZSBkcml2ZXIgbW9kZWwuIEkgbmVlZCB0byByZWZyZXNoIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IGRldmljZSBtYXRjaGluZyB3b3Jrcywgc3BlY2lmaWNhbGx5IGluIHRoZSBjb250ZXh0IG9mIHRoZSBPcGVuIEZpcm13YXJlIGRldmljZSB0cmVlLiBJcyBpdCBwdWxsaW5nIGRhdGEgYmFzZWQgb24gY29tcGF0aWJsZSBzdHJpbmdzPyBQcm9wZXJ0eSBuYW1lcz8gT3Igc29tZXRoaW5nIG1vcmUgY29tcGxleD9cblxuSSdtIG1lbnRhbGx5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgdHlwaWNhbCBtYXRjaGluZyBwcm9jZXNzLiBBIGRyaXZlciBkZWNsYXJlcyBpdHMgc3VwcG9ydGVkIGRldmljZXMgKHVzdWFsbHkgdmlhIGNvbXBhdGlibGUgc3RyaW5ncyBvciBvdGhlciBwcm9wZXJ0aWVzKSwgYW5kIHRoZSBzeXN0ZW0gY29tcGFyZXMgdGhlc2UgZGVjbGFyYXRpb25zIGFnYWluc3QgdGhlIGRldmljZSB0cmVlLiBUaGlzIGZ1bmN0aW9uIGxpa2VseSByZXRyaWV2ZXMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgbWF0Y2ggdGhhdCB3YXMgc3VjY2Vzc2Z1bGx5IG1hZGUuIFNvLCBJIG5lZWQgdG8gY29uc2lkZXIgd2hhdCBraW5kIG9mIGRhdGEgdGhlIGZ1bmN0aW9uIGlzIGxpa2VseSByZXR1cm5pbmcuIElzIGl0IHRoZSByYXcgcHJvcGVydGllcyBmcm9tIHRoZSBkZXZpY2Ugbm9kZT8gSXMgaXQgYSBwcm9jZXNzZWQgYW5kIHNhbml0aXplZCB2ZXJzaW9uPyBEb2VzIGl0IGhhbmRsZSBhbnkgaW5oZXJpdGFuY2Ugb3IgbWVyZ2luZyBvZiBwcm9wZXJ0aWVzP1xuXG5JIGFsc28gbmVlZCB0byBxdWlja2x5IHRoaW5rIGFib3V0IGhvdyB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIHVzZWQuIElzIGl0IGEgY29yZSBmdW5jdGlvbiBjYWxsZWQgYnkgZHJpdmVyIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzPyBEb2VzIGl0IHJlcXVpcmUgc3BlY2lmaWMgcHJlY29uZGl0aW9ucywgbGlrZSBhIGRldmljZSBiZWluZyBwcm9wZXJseSBwcm9iZWQgb3IgYm91bmQ/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHBpdGZhbGxzIEkgc2hvdWxkIGFudGljaXBhdGUsIGxpa2UgbWVtb3J5IG1hbmFnZW1lbnQgY29uY2VybnMgaWYgaXQncyByZXR1cm5pbmcgYWxsb2NhdGVkIGRhdGE/IEkgbmVlZCB0byB0aGluayBhYm91dCBlcnJvciBoYW5kbGluZyB0b28uIFdoYXQgaWYgbm8gbWF0Y2ggaXMgZm91bmQ/IERvZXMgdGhpcyBmdW5jdGlvbiByZXR1cm4gTlVMTCBvciBhbiBlcnJvciBjb2RlPyBVbmRlcnN0YW5kaW5nIGhvdyBpdCBoYW5kbGVzIHZhcmlvdXMgZmFpbHVyZSBzY2VuYXJpb3Mgd2lsbCBiZSBrZXkuIFRpbWUgdG8gZ2V0IGludG8gaXQgYW5kIGV4cGxvcmUgdGhlIGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQwOTIyLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo0OTo1MC43MTE2ODQ4MTRaIiwiU2VxIjo0MiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0OTQzMzA2NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGFcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9vZi9kZXZpY2UuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL29mL2RldmljZS5jPTE3MD1FWFBPUlRfU1lNQk9MX0dQTChvZl9kbWFfY29uZmlndXJlX2lkKTtcXG5kcml2ZXJzL29mL2RldmljZS5jLTE3MS1cXG5kcml2ZXJzL29mL2RldmljZS5jOjE3Mjpjb25zdCB2b2lkICpvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KVxcbmRyaXZlcnMvb2YvZGV2aWNlLmMtMTczLXtcXG4tLVxcbmRyaXZlcnMvb2YvZGV2aWNlLmMtMTgxLX1cXG5kcml2ZXJzL29mL2RldmljZS5jOjE4MjpFWFBPUlRfU1lNQk9MKG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSk7XFxuZHJpdmVycy9vZi9kZXZpY2UuYy0xODMtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ5OjUxLjE2MTEyNjE4WiIsIlNlcSI6NDMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwODIxMzY4ODMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipBbmFseXppbmcgdGhlIEZ1bmN0aW9uIGBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGFgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIFwib2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhLlwiIEltbWVkaWF0ZWx5LCBteSBicmFpbiBzdGFydHMgc2tldGNoaW5nIGEgbWVudGFsIG91dGxpbmUuIEJhc2VkIG9uIHRoZSBuYW1pbmcgY29udmVudGlvbiwgdGhpcyBmdW5jdGlvbiBpcyBhbG1vc3QgY2VydGFpbmx5IHJlbGF0ZWQgdG8gT3BlbiBGaXJtd2FyZSAoT0YpIGFuZCBkZXZpY2UgbWF0Y2hpbmcuIFRoZSBcImdldF9tYXRjaF9kYXRhXCIgcGFydCBzdHJvbmdseSBzdWdnZXN0cyB0aGF0IGl0J3MgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgZGV2aWNlJ3MgbWF0Y2ggLSBsaWtlbHkgaW5mb3JtYXRpb24gdXNlZCB0byBpZGVudGlmeSBhIGRldmljZSBmcm9tIHRoZSBkZXZpY2UgdHJlZSBhbmQgYmluZCBpdCB0byBhIGRyaXZlci5cblxuSSdtIGluc3RhbnRseSBjb25zaWRlcmluZyB0aGUgY29udGV4dC4gSXMgdGhpcyBjYWxsZWQgZHVyaW5nIGRyaXZlciBwcm9iZT8gSW5pdGlhbGl6YXRpb24/IEhvdyBkb2VzIGl0IGludGVyYWN0IHdpdGggdGhlIGRldmljZSB0cmVlIHRyYXZlcnNhbCBwcm9jZXNzPyBJcyBpdCBjYWxsZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIG1hdGNoIGhhcyBhbHJlYWR5IGJlZW4gaWRlbnRpZmllZCwgb3IgaXMgaXQgYSBrZXkgcGFydCBvZiB0aGUgbWF0Y2hpbmcgKml0c2VsZio/IFRoZSBcImRhdGFcIiBhc3BlY3QgaXMgaW50ZXJlc3RpbmcuIFdoYXQgKmtpbmQqIG9mIGRhdGEgYXJlIHdlIHRhbGtpbmcgYWJvdXQ/IFByb3BlcnRpZXMgZnJvbSB0aGUgZGV2aWNlIG5vZGU/IElzIGl0IGEgY29tYmluYXRpb24gb2YgcHJvcGVydHkgdmFsdWVzIGFuZCBzb21lIG90aGVyIGludGVybmFsIHJlcHJlc2VudGF0aW9uLCBwZXJoYXBzIHN0cnVjdHVyZWQgaW4gYSBwYXJ0aWN1bGFyIHdheT9cblxuTXkgbWluZCBpcyBub3cgcmFjaW5nIHRocm91Z2ggYSBsaXN0IG9mIHJlbGF0ZWQgY29uY2VwdHM6IE9GIG1hdGNoaW5nIHRhYmxlcywgZHJpdmVyIGJpbmRpbmdzLCBwcm9wZXJ0eSBwYXJzaW5nLiBJJ20gbWVudGFsbHkgcGFyc2luZyB0aGUgbGlrZWx5IGZ1bmN0aW9uIHNpZ25hdHVyZTogd2hhdCBhcmd1bWVudHMgZG9lcyBpdCBwcm9iYWJseSB0YWtlPyBBIGRldmljZSBub2RlIHBvaW50ZXIsIGNlcnRhaW5seS4gUGVyaGFwcyBhIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJldHJpZXZlZCBkYXRhPyBBbiBlcnJvciBjb2RlIHJldHVybiB2YWx1ZSwgc3RhbmRhcmQgaW4gdGhpcyBhcmVhLiBJJ20gd29uZGVyaW5nIGFib3V0IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3IgbG9ja2luZyBpc3N1ZXMsIGFuZCB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSByZS1lbnRyYW50LiBEb2VzIGl0IGhhbmRsZSBkZXZpY2UgdHJlZSBhbGlhc2VzPyBIb3cgZG9lcyBpdCBoYW5kbGUgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZGV2aWNlIHRyZWUgaXRzZWxmPyBJcyBpdCByb2J1c3QgaW4gdGhlIGZhY2Ugb2YgbWFsZm9ybWVkIG9yIG1pc3NpbmcgZGV2aWNlIHRyZWUgZW50cmllcz9cblxuSSdtIGFscmVhZHkgZm9ybXVsYXRpbmcgcXVlc3Rpb25zOiBJcyB0aGlzIGZ1bmN0aW9uIGEgcGVyZm9ybWFuY2UgYm90dGxlbmVjaz8gSXMgaXQgdXNlZCBvZnRlbj8gSXMgdGhlcmUgYW4gb3Bwb3J0dW5pdHkgZm9yIG9wdGltaXphdGlvbj8gVGhlIGNob2ljZSBvZiBkYXRhIHN0cnVjdHVyZXMgaXMgc29tZXRoaW5nIEknbSB2ZXJ5IGludGVyZXN0ZWQgaW4uIERvZXMgaXQgdXNlIGR5bmFtaWMgYWxsb2NhdGlvbj8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzPyBJIGFtIGFscmVhZHkgdGhpbmtpbmcgYWJvdXQgdGhlIHdheXMgaW4gd2hpY2ggSSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24sIGFuZCBhbnkgcG90ZW50aWFsIGlzc3VlcyBpdCBtYXkgcHJlc2VudC5cblxuSSdtIHJlYWR5IHRvIGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGFuZCB1bmRlcnN0YW5kIGhvdyBpdCB3b3JrcyB1bmRlciB0aGUgaG9vZC4gVGltZSB0byBsb29rIGF0IHRoZSBjb2RlIVxuXG5cbiIsIklucHV0VG9rZW5zIjo0MTQ5OSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ5OjU2LjI0MzI2OTYzM1oiLCJTZXEiOjQ0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzUzMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZHJpdmVycy9vZi9kZXZpY2UuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNzIsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxNzI6XFx0Y29uc3Qgdm9pZCAqb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldilcXG4gMTczOlxcdHtcXG4gMTc0OlxcdFxcdGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoO1xcbiAxNzU6XFx0XFxuIDE3NjpcXHRcXHRtYXRjaCA9IG9mX21hdGNoX2RldmljZShkZXYtXFx1MDAzZWRyaXZlci1cXHUwMDNlb2ZfbWF0Y2hfdGFibGUsIGRldik7XFxuIDE3NzpcXHRcXHRpZiAoIW1hdGNoKVxcbiAxNzg6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDE3OTpcXHRcXG4gMTgwOlxcdFxcdHJldHVybiBtYXRjaC1cXHUwMDNlZGF0YTtcXG4gMTgxOlxcdH1cXG4gMTgyOlxcdEVYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKTtcXG4gMTgzOlxcdFxcbiAxODQ6XFx0LyoqXFxuIDE4NTpcXHQgKiBvZl9kZXZpY2VfbW9kYWxpYXMgLSBGaWxsIGJ1ZmZlciB3aXRoIG5ld2xpbmUgdGVybWluYXRlZCBtb2RhbGlhcyBzdHJpbmdcXG4gMTg2OlxcdCAqIEBkZXY6XFx0Q2FsbGluZyBkZXZpY2VcXG4gMTg3OlxcdCAqIEBzdHI6XFx0TW9kYWxpYXMgc3RyaW5nXFxuIDE4ODpcXHQgKiBAbGVuOlxcdFNpemUgb2YgQHN0clxcbiAxODk6XFx0ICovXFxuIDE5MDpcXHRzc2l6ZV90IG9mX2RldmljZV9tb2RhbGlhcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKnN0ciwgc3NpemVfdCBsZW4pXFxuIDE5MTpcXHR7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjQ5OjU2LjI0MzQ0OTAwM1oiLCJTZXEiOjQ1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozODA1ODMwMDYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgRGV2aWNlIE1hdGNoaW5nIFByb2Nlc3MqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBob3cgdGhpcyBkZXZpY2UgbWF0Y2hpbmcgaXMgaGFuZGxlZC4gSXQgc2VlbXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gVGhlIGNvcmUgZnVuY3Rpb24gaGVyZSBpcyBgb2ZfbWF0Y2hfZGV2aWNlYCwgYW5kIGl0IGhpbmdlcyBvbiB0aGUgZGV2aWNlJ3MgYG9mX25vZGVgLiBJZiB0aGF0IGBkZXYtXHUwMDNlb2Zfbm9kZWAgaXMgbnVsbCwgd2hpY2ggaXMgcHJldHR5IG11Y2ggdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXZpY2VzIHdoaWNoIGFyZSBub3QgZGV2aWNlLXRyZWUgYmFzZWQsIHRoZW4gYG9mX21hdGNoX2RldmljZWAgcmV0dXJucyBOVUxMLiBSaWdodC4gVGhhdCBtYWtlcyBzZW5zZSwgYSBudWxsIHBvaW50ZXIgZm9yIGEgbnVsbCBkZXZpY2UgdHJlZS4gSG1tLCBJIHNob3VsZCBwcm9iYWJseSBkb3VibGUtY2hlY2sgdGhlIGJlaGF2aW9yIG9mIGBvZl9tYXRjaF9kZXZpY2VgIGl0c2VsZiBqdXN0IHRvIGJlIGNvbXBsZXRlbHkgc3VyZSBJJ20gZm9sbG93aW5nIHRoZSBsb2dpYyBjb3JyZWN0bHkuIEdvdHRhIGJlIHByZWNpc2UgaGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDIzMTksIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjUwOjAwLjA0OTI4NDU3NVoiLCJTZXEiOjQ2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ1MzIyNDA1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm9mX21hdGNoX2RldmljZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL29mL2RldmljZS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvb2YvZGV2aWNlLmMtMTctLyoqXFxuZHJpdmVycy9vZi9kZXZpY2UuYzoxODogKiBvZl9tYXRjaF9kZXZpY2UgLSBUZWxsIGlmIGEgc3RydWN0IGRldmljZSBtYXRjaGVzIGFuIG9mX2RldmljZV9pZCBsaXN0XFxuZHJpdmVycy9vZi9kZXZpY2UuYy0xOS0gKiBAbWF0Y2hlczogYXJyYXkgb2Ygb2ZfZGV2aWNlX2lkIG1hdGNoIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluXFxuLS1cXG5kcml2ZXJzL29mL2RldmljZS5jLTI0LSAqL1xcbmRyaXZlcnMvb2YvZGV2aWNlLmM6MjU6Y29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsXFxuZHJpdmVycy9vZi9kZXZpY2UuYy0yNi1cXHRcXHRcXHRcXHRcXHQgICBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuLS1cXG5kcml2ZXJzL29mL2RldmljZS5jLTMxLX1cXG5kcml2ZXJzL29mL2RldmljZS5jOjMyOkVYUE9SVF9TWU1CT0wob2ZfbWF0Y2hfZGV2aWNlKTtcXG5kcml2ZXJzL29mL2RldmljZS5jLTMzLVxcbi0tXFxuZHJpdmVycy9vZi9kZXZpY2UuYz0xNzI9Y29uc3Qgdm9pZCAqb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldilcXG4tLVxcbmRyaXZlcnMvb2YvZGV2aWNlLmMtMTc1LVxcbmRyaXZlcnMvb2YvZGV2aWNlLmM6MTc2OlxcdG1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKGRldi1cXHUwMDNlZHJpdmVyLVxcdTAwM2VvZl9tYXRjaF90YWJsZSwgZGV2KTtcXG5kcml2ZXJzL29mL2RldmljZS5jLTE3Ny1cXHRpZiAoIW1hdGNoKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo1MDowMC4yOTQ2MjQ5MVoiLCJTZXEiOjQ3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MTg0MDU4NDI0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQW5hbHl6aW5nIHRoZSBGdW5jdGlvbjogYG9mX21hdGNoX2RldmljZWAqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgb2ZfbWF0Y2hfZGV2aWNlYCBmdW5jdGlvbi4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdG8gcXVpY2tseSBnZXQgYSBoaWdoLWxldmVsIHVuZGVyc3RhbmRpbmcuIFdoYXQgaXMgdGhpcyBmdW5jdGlvbiAqc3VwcG9zZWQqIHRvIGRvPyBDb250ZXh0IGNsdWVzIGluZGljYXRlIGl0J3MgcmVsYXRlZCB0byBPcGVuIEZpcm13YXJlIGFuZCBkZXZpY2UgbWF0Y2hpbmcsIGJ1dCBzcGVjaWZpY2FsbHksIGhvdyBkb2VzIGl0IGZpdCBpbnRvIHRoZSBicm9hZGVyIGRldmljZSB0cmVlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlPyBJIG5lZWQgdG8gcXVpY2tseSBkZXRlcm1pbmUgaXRzIGlucHV0IHBhcmFtZXRlcnMsIGVzcGVjaWFsbHkgd2hhdCBpdCBleHBlY3RzIHJlZ2FyZGluZyBkZXZpY2Ugbm9kZXMgYW5kIHRoZWlyIHByb3BlcnRpZXMuIElzIGl0IGxvb2tpbmcgZm9yIHNwZWNpZmljIHByb3BlcnRpZXMgb3IgYSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBpbiB0aGUgZGV2aWNlIHRyZWU/IEknbGwgYmUgbG9va2luZyBmb3IgYW55IGhpbnRzIGFib3V0IHRoZSBtYXRjaGluZyBzdHJhdGVneSDigJMgaXMgaXQgYmFzZWQgb24gY29tcGF0aWJsZSBzdHJpbmdzLCBoYXJkd2FyZSBJRHMsIG9yIHNvbWV0aGluZyBlbHNlP1xuXG5JIG5lZWQgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMuIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgdGhlIHJldHVybiB2YWx1ZS4gRG9lcyBpdCByZXR1cm4gYSBib29sZWFuLCBhbiBlcnJvciBjb2RlLCBvciBhIHBvaW50ZXIgdG8gYSBtYXRjaGVkIGRldmljZT8gV2hhdCBjb25kaXRpb25zIHRyaWdnZXIgYSBtYXRjaCwgYW5kIHdoYXQgaGFwcGVucyB3aGVuIG5vIG1hdGNoIGlzIGZvdW5kPyBUaGlzIGlzIGNydWNpYWwgZm9yIGRlYnVnZ2luZyBhbmQgdW5kZXJzdGFuZGluZyB0aGUgb3ZlcmFsbCBzeXN0ZW0ncyBiZWhhdmlvci4gSSdsbCBuZWVkIHRvIGxvb2sgYXQgYW55IHN1cnJvdW5kaW5nIGNvZGUsIHBhcnRpY3VsYXJseSBmdW5jdGlvbiBjYWxscyBwcmVjZWRpbmcgYW5kIGZvbGxvd2luZyBgb2ZfbWF0Y2hfZGV2aWNlYCwgdG8gZ2V0IGEgZmVlbCBmb3IgaXRzIHJvbGUgaW4gdGhlIGRyaXZlciBwcm9iaW5nIHByb2Nlc3MuIEZpbmFsbHksIHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgaW50ZXJhY3Qgd2l0aD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBvZl9tYXRjaF9kZXZpY2VgIGNvbnRyaWJ1dGVzIHRvIGJ1aWxkaW5nIHRoZSBkcml2ZXIgbW9kZWwgd2l0aGluIHRoaXMgc3lzdGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0Mjg1NSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjUwOjA1LjQ3ODY5MTE0NFoiLCJTZXEiOjQ4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjk4OTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZHJpdmVycy9vZi9kZXZpY2UuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNSxcbiAgXCJMaW5lQ291bnRcIjogMTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAyNTpcXHRjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcyxcXG4gIDI2OlxcdFxcdFxcdFxcdFxcdFxcdCAgIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldilcXG4gIDI3OlxcdHtcXG4gIDI4OlxcdFxcdGlmICghbWF0Y2hlcyB8fCAhZGV2LVxcdTAwM2VvZl9ub2RlIHx8IGRldl9vZl9ub2RlX3JldXNlZChkZXYpKVxcbiAgMjk6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICAzMDpcXHRcXHRyZXR1cm4gb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBkZXYtXFx1MDAzZW9mX25vZGUpO1xcbiAgMzE6XFx0fVxcbiAgMzI6XFx0RVhQT1JUX1NZTUJPTChvZl9tYXRjaF9kZXZpY2UpO1xcbiAgMzM6XFx0XFxuICAzNDpcXHRzdGF0aWMgdm9pZFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo1MDowNS40Nzg4NjM5MTRaIiwiU2VxIjo0OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTM3NzczNTY5MjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqVW5yZWFjaGFibGUgRHJpdmVycyBpbiBWaXJ0dWFsaXplZCBFbnZpcm9ubWVudHMqKlxuXG5Pa2F5LCBzbyBoZXJlJ3MgdGhlIGRlYWwuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGxlZCBtZSBkb3duIHRoaXMgcGF0aDogaWYgYGRldi1cdTAwM2VvZl9ub2RlYCBpcyBudWxsLCB0aGUgZGV2aWNlIG1hdGNoaW5nIGZ1bmN0aW9uIHJldHVybnMgbnVsbCwgd2hpY2ggbWVhbnMgdGhlIG1hdGNoIGRhdGEgcmV0cmlldmFsIHdpbGwgYWxzbyBpbW1lZGlhdGVseSByZXR1cm4gbnVsbCBpZiBgZGV2X2Z3bm9kZShkZXYpYCBpcyBudWxsLiBBbmQgZ3Vlc3Mgd2hhdD8gVGhhdCdzIHByZWNpc2VseSB0aGUgc2l0dWF0aW9uIGZvciBJMkMgZGV2aWNlcyBpbnN0YW50aWF0ZWQgdGhyb3VnaCBzeXNmcyEgVGhpcyBtZWFucyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgbnVsbCBmb3IgdGhlc2UgZGV2aWNlcywgYW5kIHRoZSBgcnRwc2VfbWN1X2kyY19wcm9iZWAgaXMgZ29pbmcgdG8gZmFpbCB3aXRoIGAtRU5PREVWYCwgZXZlcnkgc2luZ2xlIHRpbWUuXG5cbk5vdywgSSBwYXVzZWQgdG8gY29uc2lkZXIgaWYgdGhlcmUgd2FzIGFuIGFsdGVybmF0ZSByb3V0ZSB0byBpbnN0YW50aWF0ZSBhbiBJMkMgZGV2aWNlIHdpdGggYGRldl9md25vZGUoZGV2KWAgc2V0LiBUaGVyZSBpcyBvbmUhIGBpMmNfbmV3X2NsaWVudF9kZXZpY2VgIGZyb20gYW5vdGhlciBkcml2ZXIsIHBhc3NpbmcgYGJvYXJkX2luZm8uZndub2RlYCwgYnV0IHN5emthbGxlciBkb2Vzbid0IGhhdmUgYSBnZW5lcmljIG1lY2hhbmlzbSBmb3IgdGhhdC5cblxuVGhlbiwgSSBsb29rZWQgYXQgYGkyY19nZXRfbWF0Y2hfZGF0YWAuIElmIHRoZSBwcm9iZSB1c2VkIHRoYXQsIGl0IHdvdWxkIGZhbGwgYmFjayB0byBgaTJjX21hdGNoX2lkYCwgYnV0IHRoZSBkcml2ZXIgZG9lc24ndCBoYXZlIGFuIGBpZF90YWJsZWAgYW55d2F5ISBTbyBldmVuIGlmIGl0IHVzZWQgYGkyY19nZXRfbWF0Y2hfZGF0YWAsIGl0IHdvdWxkIHN0aWxsIHJldHVybiBOVUxMLiBIZXJlJ3MgYSBrZXkgcG9pbnQ6IGBpMmNfZ2V0X21hdGNoX2RhdGFgICpkb2Vzbid0KiBmYWxsIGJhY2sgdG8gYGkyY19vZl9tYXRjaF9kZXZpY2Vfc3lzZnNgLiBUaGF0IGlzIG9ubHkgdXNlZCBmb3IgYmluZGluZyB0aGUgZHJpdmVyIHZpYSBgaTJjX2RldmljZV9tYXRjaGAuIEJ1dCBvbmNlIHRoZSBkcml2ZXIgaXMgYm91bmQsIHRoZSBwcm9iZSBmdW5jdGlvbiBpcyBjYWxsZWQuIEFuZCBpbiB0aGUgcHJvYmUgZnVuY3Rpb24sIHRoZSBkcml2ZXIgd2lsbCB0cnkgdG8gZ2V0IHRoZSBtYXRjaCBkYXRhLCBidXQgd2l0aCBubyBgaWRfdGFibGVgIGFuZCBubyBgb2Zfbm9kZWAsIGl0IHdpbGwgZmFpbC4gVGhpcyBpcyBhIGtub3duIGlzc3VlISBEcml2ZXJzIHdpdGggb25seSBgb2ZfbWF0Y2hfdGFibGVgIGFuZCB1c2luZyBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBvciBgaTJjX2dldF9tYXRjaF9kYXRhYCBidXQgbm8gYGlkX3RhYmxlYCBjYW5ub3QgYmUgcHJvYmVkIHZpYSBzeXNmcyBgbmV3X2RldmljZWAuXG5cbkkgdGhlbiBsb29rZWQgYXQgdGhlIHBvc3NpYmlsaXR5IG9mIHBhc3NpbmcgbWF0Y2ggZGF0YS4gRG9lcyBgaTJjX29mX21hdGNoX2RldmljZV9zeXNmc2Agc2V0IGBjbGllbnQtXHUwMDNlZGV2LmRyaXZlcl9kYXRhYD8gTm8sIGl0IGRvZXNuJ3QuIGBpMmNfZGV2aWNlX21hdGNoYCBqdXN0IHJldHVybnMgMSBhbmQgZG9lc24ndCBzYXZlIHRoZSBtYXRjaCBkYXRhIGFueXdoZXJlLlxuXG5JbiBzdW1tYXJ5LCB0aGlzIGRyaXZlcidzIHByb2JlIGZ1bmN0aW9uIGlzIGRvb21lZCB0byBmYWlsLiBUaGlzIGlzIGEgY29tcGxldGUgZGVhZCBlbmQgaW4gYSB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudCAqd2l0aG91dCogYSBzcGVjaWZpYyBEZXZpY2UgVHJlZS5cblxuU28sIGRvZXMgc3l6a2FsbGVyIGhhdmUgYSBjdXN0b20gRFQgZm9yIHRoaXMga2luZCBvZiBzY2VuYXJpbz8gTm8sIGl0IHVzZXMgc3RhdGljIERUcyBmb3IgYHFlbXUtc3lzdGVtLWFybWAgb3IgYHFlbXUtc3lzdGVtLWFhcmNoNjRgIChsaWtlIGB2ZXhwcmVzc2Agb3IgYHZpcnRgKS4gSXQgZG9lc24ndCBhZGQgbm9kZXMgZHluYW1pY2FsbHkgZm9yIG5ldyBkcml2ZXJzLlxuXG5Eb2VzIHN5emthbGxlciB0ZXN0IEkyQyBkcml2ZXJzIGJ5IGluamVjdGluZyB0cmFmZmljPyBJZiB0aGUgZHJpdmVyIGNhbm5vdCBiZSBwcm9iZWQsIGl0IGNhbm5vdCBiZSB0ZXN0ZWQsIHdoaWNoIG1lYW5zIGl0IGNhbm5vdCBiZSB0ZXN0ZWQgYXQgYWxsISBUaGlzIGlzIGEgc2VyaW91cyBwcm9ibGVtLlxuXG5BbmQgdGhlbiBJIHR1cm5lZCB0byB0aGUgVUFSVCBkcml2ZXIuIEl0IHVzZXMgYHNlcmRldmAsIHdoaWNoIGlzIGFsc28gaW5zdGFudGlhdGVkIHZpYSBEZXZpY2UgVHJlZSBvciBBQ1BJLiBDYW4gc3l6a2FsbGVyIGluc3RhbnRpYXRlIHNlcmRldiBkZXZpY2VzPyBObywgdGhlcmUgaXMgbm8gc3lzZnMgYG5ld19kZXZpY2VgIGZvciBgc2VyZGV2YC4gU2VyZGV2IGlzIHN0cmljdGx5IGluc3RhbnRpYXRlZCBmcm9tIGZpcm13YXJlLiBTeXprYWxsZXIgY2Fubm90IGluamVjdCBEVCBub2RlcyBmb3Igc2VyZGV2LCBzbyB0aGF0IGRyaXZlciBpcyBhbHNvIHVucmVhY2hhYmxlLlxuXG5GaW5hbGx5LCBJIHdvbmRlciBpZiB0aGVyZSBpcyBhbnkgYHNlcmRldmAgZnV6emVyIGluIHN5emthbGxlci4gVGltZSB0byBjaGVjayBmb3IgYHNlcmRldmAgZGVzY3JpcHRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MzM3MiwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg4MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjUwOjE5LjI1NjIyNjc2M1oiLCJTZXEiOjUwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY4OTk0NTAxLCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzZXJkZXZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwic3lzL2xpbnV4L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMjlUMDU6NTA6MTkuNDI1MjM1NTM0WiIsIlNlcSI6NTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUxNTQyOTI4MjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipNaXNzaW5nIFBpZWNlcyBhbmQgUG90ZW50aWFsIExlYWRzIGluIFN5emthbGxlciBEZXNjcmlwdGlvbnMqKlxuXG5Pa2F5LCBJJ20gZ29pbmcgdGhyb3VnaCB0aGVzZSBzeXprYWxsZXIgZGVzY3JpcHRpb25zLCBhbmQgSSdtIG5vdGljaW5nIHNvbWV0aGluZyBhYnNlbnQuIFRoZXJlJ3Mgbm8gbWVudGlvbiBvZiBgc2VyZGV2YCwgd2hpY2ggaXMgdW51c3VhbCBnaXZlbiB0aGUgc2NvcGUgb2YgdGhlIHByb2plY3QuIFRoaXMgZmVlbHMgbGlrZSBhbiBvdmVyc2lnaHQgdGhhdCBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24uIE15IG1pbmQgaW1tZWRpYXRlbHkgc3RhcnRzIHRvIHJ1biB0aHJvdWdoIHJlbGF0ZWQgYXJlYXMgYW5kIHBvc3NpYmxlIHJlYXNvbnMgZm9yIHRoZSBvbWlzc2lvbi5cblxuVGhlbiwgbXkgdHJhaW4gb2YgdGhvdWdodCBzaGlmdHMgZ2VhcnMuIFdoaWxlIGNvbnNpZGVyaW5nIHdoYXQgbWF5IGJlIG1pc3NpbmcsIEkgbW92ZSB0byB0aGlua2luZyBhYm91dCBgaTJjYC4gSXMgYGkyY2AgaGFuZGxlZCBjb3JyZWN0bHkgaW4gdGhlc2UgZGVzY3JpcHRpb25zPyBJdCdzIGEga2V5IGFyZWEsIGFuZCB0aGUgYWJzZW5jZSBvZiBgc2VyZGV2YCByZW1pbmRzIG1lIHRvIGRvdWJsZS1jaGVjayByZWxhdGVkIGNvbXBvbmVudHMuIEl0J3MgYSBwb3RlbnRpYWwgYXJlYSBvZiBjb25jZXJuIGlmIHRoaXMgaXMgbWlzc2luZyBvciBoYW5kbGVkIGluY29ycmVjdGx5LiBJIG5lZWQgdG8gZGVsdmUgZGVlcGVyIGludG8gdGhlIGBpMmNgIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uIHRvIGVuc3VyZSBldmVyeXRoaW5nIGlzIGFjY291bnRlZCBmb3IuIFRoaXMgb2JzZXJ2YXRpb24gaXMgYSBzaWduYWwgdG8gZG8gYSBkZWVwZXIgZGl2ZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDUwNjgsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo1MDoyNC41Nzk1MzQxMzVaIiwiU2VxIjo1MiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM1MDY2ODk4MiwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaTJjXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInN5cy9saW51eC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjUwOjI0LjkzMDIxNzYwN1oiLCJTZXEiOjUzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMDgzOTMzNjI1NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgSTJDIERyaXZlciBJbnN0YW50aWF0aW9uIHdpdGggU3l6a2FsbGVyKipcblxuT2theSwgc28gSSBjYW4ndCBqdXN0IGBncmVwcGVyYCB0aGUgc3l6a2FsbGVyIGRlc2NyaXB0aW9ucywgcmlnaHQ/IFRoYXQncyByaWdodCwgdGhlIGluc3RydWN0aW9ucyBzYXkgdG8gYXZvaWQgdGhvc2UgYW5kIHN5el8gcHJlZml4ZXMuIEkgc2hvdWxkIGhhdmUgYmVlbiBhYmxlIHRvIHVzZSB0aGF0IGB0b29sUmVhZERlc2NyaXB0aW9uYCB0aGluZywgYnV0IGl0J3Mgbm90IGFjdHVhbGx5IGFuIGF2YWlsYWJsZSB0b29sLiBTaWdoLiBJIGtub3cgc3l6a2FsbGVyIGNhbiB0ZXN0IEkyQyBkcml2ZXJzIHVzaW5nIGAvZGV2L2kyYy1YYCBvciBgbmV3X2RldmljZWAgdmlhIHN5c2ZzLiBJIGhhZCBhIGh5cG90aGVzaXMgYWJvdXQgYG5ld19kZXZpY2VgIGZhaWxpbmcgaW4gYHByb2JlYCBiZWNhdXNlIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHJldHVybnMgTlVMTC4gSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IGFzc3VtcHRpb24gdGhvdWdoLiBJdOKAmXMgcG9zc2libGUgYSByZWNlbnQgcGF0Y2ggY291bGQgY2hhbmdlIHRoYXQgYmVoYXZpb3IgZm9yIHN5c2ZzLWluc3RhbnRpYXRlZCBJMkMgZGV2aWNlcy4gTGV0IG1lIGRpZyBpbnRvIGBkcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmNgIGFuZCBzZWUgaWYgYGRldi5md25vZGVgIGlzIGJlaW5nIHNldCBhbnl3aGVyZS4gVGhhdCB3b3VsZCBiZSBrZXkgdG8gbWFraW5nIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHJldHVybiBhIHZhbGlkIHBvaW50ZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ1MzM1LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mjk3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA1OjUwOjM1Ljc2OTYzMTE4MloiLCJTZXEiOjU0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQ0MDc2MDc2OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmd25vZGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYz00OTE9c3RhdGljIGludCBpMmNfZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldilcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtNDkyLXtcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6NDkzOlxcdHN0cnVjdCBmd25vZGVfaGFuZGxlXFx0KmZ3bm9kZSA9IGRldl9md25vZGUoZGV2KTtcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtNDk0LVxcdHN0cnVjdCBpMmNfY2xpZW50XFx0KmNsaWVudCA9IGkyY192ZXJpZnlfY2xpZW50KGRldik7XFxuLS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtNTExLVxcdFxcdFxcdGlycSA9IGkyY19zbWJ1c19ob3N0X25vdGlmeV90b19pcnEoY2xpZW50KTtcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6NTEyOlxcdFxcdH0gZWxzZSBpZiAoaXNfb2Zfbm9kZShmd25vZGUpKSB7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjUxMzpcXHRcXHRcXHRpcnEgPSBmd25vZGVfaXJxX2dldF9ieW5hbWUoZndub2RlLCBcXFwiaXJxXFxcIik7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTUxNC1cXHRcXHRcXHRpZiAoaXJxID09IC1FSU5WQUwgfHwgaXJxID09IC1FTk9EQVRBKVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzo1MTU6XFx0XFx0XFx0XFx0aXJxID0gZndub2RlX2lycV9nZXQoZndub2RlLCAwKTtcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6NTE2OlxcdFxcdH0gZWxzZSBpZiAoaXNfYWNwaV9kZXZpY2Vfbm9kZShmd25vZGUpKSB7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTUxNy1cXHRcXHRcXHRib29sIHdha2VfY2FwYWJsZTtcXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy01NDktXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjU1MDpcXHRcXHR3YWtlaXJxID0gZndub2RlX2lycV9nZXRfYnluYW1lKGZ3bm9kZSwgXFxcIndha2V1cFxcXCIpO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy01NTEtXFx0XFx0aWYgKHdha2VpcnEgPT0gLUVQUk9CRV9ERUZFUikge1xcbi0tXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTU3MC1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6NTcxOlxcdHN0YXR1cyA9IG9mX2Nsa19zZXRfZGVmYXVsdHModG9fb2Zfbm9kZShmd25vZGUpLCBmYWxzZSk7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTU3Mi1cXHRpZiAoc3RhdHVzIFxcdTAwM2MgMClcXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYz05NjA9aTJjX25ld19jbGllbnRfZGV2aWNlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19ib2FyZF9pbmZvIGNvbnN0ICppbmZvKVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy05NjEte1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzo5NjI6XFx0c3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSA9IGluZm8tXFx1MDAzZWZ3bm9kZTtcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtOTYzLVxcdHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7XFxuLS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTAwNS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTAwNjpcXHRkZXZpY2Vfc2V0X25vZGUoXFx1MDAyNmNsaWVudC1cXHUwMDNlZGV2LCBmd25vZGVfaGFuZGxlX2dldChmd25vZGUpKTtcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTAwNy1cXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDEzLVxcdFxcdFxcdFxcdGNsaWVudC1cXHUwMDNlbmFtZSwgc3RhdHVzKTtcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTAxNDpcXHRcXHRcXHRnb3RvIG91dF9lcnJfcHV0X2Z3bm9kZTtcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTAxNS1cXHRcXHR9XFxuLS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTAzMi1cXHRuZWVkX3B1dCA9IHRydWU7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwMzM6b3V0X2Vycl9wdXRfZndub2RlOlxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMDM0OlxcdGZ3bm9kZV9oYW5kbGVfcHV0KGZ3bm9kZSk7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwMzUtb3V0X2VycjpcXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYz0xMDU0PXZvaWQgaTJjX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNTUte1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMDU2OlxcdHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGU7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNTctXFxuLS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTA2MC1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA2MTpcXHRmd25vZGUgPSBkZXZfZndub2RlKFxcdTAwMjZjbGllbnQtXFx1MDAzZWRldik7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwNjI6XFx0aWYgKGlzX29mX25vZGUoZndub2RlKSlcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA2MzpcXHRcXHRvZl9ub2RlX2NsZWFyX2ZsYWcodG9fb2Zfbm9kZShmd25vZGUpLCBPRl9QT1BVTEFURUQpO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMDY0OlxcdGVsc2UgaWYgKGlzX2FjcGlfZGV2aWNlX25vZGUoZndub2RlKSlcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA2NTpcXHRcXHRhY3BpX2RldmljZV9jbGVhcl9lbnVtZXJhdGVkKHRvX2FjcGlfZGV2aWNlX25vZGUoZndub2RlKSk7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNjYtXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNjctXFx0LypcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA2ODpcXHQgKiBJZiB0aGUgcHJpbWFyeSBmd25vZGUgaXMgYSBzb2Z0d2FyZSBub2RlIGl0IGlzIGZyZWUtZWQgYnlcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTA2OS1cXHQgKiBkZXZpY2VfcmVtb3ZlX3NvZnR3YXJlX25vZGUoKSBiZWxvdywgYXZvaWQgZG91YmxlLWZyZWUuXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwNzAtXFx0ICovXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwNzE6XFx0aWYgKCFpc19zb2Z0d2FyZV9ub2RlKGZ3bm9kZSkpXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwNzI6XFx0XFx0Zndub2RlX2hhbmRsZV9wdXQoZndub2RlKTtcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTA3My1cXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYz0xMDc3PUVYUE9SVF9TWU1CT0xfR1BMKGkyY191bnJlZ2lzdGVyX2RldmljZSk7XFxuLS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTA3OS0vKipcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA4MDogKiBpMmNfZmluZF9kZXZpY2VfYnlfZndub2RlKCkgLSBmaW5kIGFuIGkyY19jbGllbnQgZm9yIHRoZSBmd25vZGVcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA4MTogKiBAZndub2RlOiBcXHUwMDI2c3RydWN0IGZ3bm9kZV9oYW5kbGUgY29ycmVzcG9uZGluZyB0byB0aGUgXFx1MDAyNnN0cnVjdCBpMmNfY2xpZW50XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwODItICpcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTA4MzogKiBMb29rIHVwIGFuZCByZXR1cm4gdGhlIFxcdTAwMjZzdHJ1Y3QgaTJjX2NsaWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBAZndub2RlLlxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMDg0OiAqIElmIG5vIGNsaWVudCBjYW4gYmUgZm91bmQsIG9yIEBmd25vZGUgaXMgTlVMTCwgdGhpcyByZXR1cm5zIE5VTEwuXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwODUtICpcXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDg3LSAqL1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMDg4OnN0cnVjdCBpMmNfY2xpZW50ICppMmNfZmluZF9kZXZpY2VfYnlfZndub2RlKHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUpXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwODkte1xcbi0tXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwOTItXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwOTM6XFx0aWYgKElTX0VSUl9PUl9OVUxMKGZ3bm9kZSkpXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwOTQtXFx0XFx0cmV0dXJuIE5VTEw7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTEwOTUtXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjEwOTY6XFx0ZGV2ID0gYnVzX2ZpbmRfZGV2aWNlX2J5X2Z3bm9kZShcXHUwMDI2aTJjX2J1c190eXBlLCBmd25vZGUpO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xMDk3LVxcdGlmICghZGV2KVxcbi0tXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTExMDUtfVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxMTA2OkVYUE9SVF9TWU1CT0woaTJjX2ZpbmRfZGV2aWNlX2J5X2Z3bm9kZSk7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTExMDctXFxuLS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM9MTQ3Mj1zdGF0aWMgaW50IGkyY19zZXR1cF9ob3N0X25vdGlmeV9pcnFfZG9tYWluKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcClcXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xNDc4LVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxNDc5OlxcdGRvbWFpbiA9IGlycV9kb21haW5fY3JlYXRlX2xpbmVhcihkZXZfZndub2RlKGFkYXAtXFx1MDAzZWRldi5wYXJlbnQpLFxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xNDgwLVxcdFxcdFxcdFxcdFxcdCAgSTJDX0FERFJfN0JJVFNfQ09VTlQsXFxuLS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM9MTg3Nz1FWFBPUlRfU1lNQk9MX0dQTChkZXZtX2kyY19hZGRfYWRhcHRlcik7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE4NzgtXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE4Nzk6c3RhdGljIGludCBpMmNfZGV2X29yX3BhcmVudF9md25vZGVfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCB2b2lkICpkYXRhKVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xODgwLXtcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTg4MTpcXHRpZiAoZGV2aWNlX21hdGNoX2Z3bm9kZShkZXYsIGRhdGEpKVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xODgyLVxcdFxcdHJldHVybiAxO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xODgzLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxODg0OlxcdGlmIChkZXYtXFx1MDAzZXBhcmVudCBcXHUwMDI2XFx1MDAyNiBkZXZpY2VfbWF0Y2hfZndub2RlKGRldi1cXHUwMDNlcGFyZW50LCBkYXRhKSlcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTg4NS1cXHRcXHRyZXR1cm4gMTtcXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xODkwLS8qKlxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxODkxOiAqIGkyY19maW5kX2FkYXB0ZXJfYnlfZndub2RlKCkgLSBmaW5kIGFuIGkyY19hZGFwdGVyIGZvciB0aGUgZndub2RlXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE4OTI6ICogQGZ3bm9kZTogXFx1MDAyNnN0cnVjdCBmd25vZGVfaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFxcdTAwMjZzdHJ1Y3QgaTJjX2FkYXB0ZXJcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTg5My0gKlxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxODk0OiAqIExvb2sgdXAgYW5kIHJldHVybiB0aGUgXFx1MDAyNnN0cnVjdCBpMmNfYWRhcHRlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBAZndub2RlLlxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxODk1OiAqIElmIG5vIGFkYXB0ZXIgY2FuIGJlIGZvdW5kLCBvciBAZndub2RlIGlzIE5VTEwsIHRoaXMgcmV0dXJucyBOVUxMLlxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xODk2LSAqXFxuLS1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMtMTg5OC0gKi9cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTg5OTpzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19maW5kX2FkYXB0ZXJfYnlfZndub2RlKHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUpXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE5MDAte1xcbi0tXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE5MDMtXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE5MDQ6XFx0aWYgKElTX0VSUl9PUl9OVUxMKGZ3bm9kZSkpXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE5MDUtXFx0XFx0cmV0dXJuIE5VTEw7XFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE5MDYtXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE5MDc6XFx0ZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKFxcdTAwMjZpMmNfYnVzX3R5cGUsIE5VTEwsIGZ3bm9kZSxcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTkwODpcXHRcXHRcXHQgICAgICBpMmNfZGV2X29yX3BhcmVudF9md25vZGVfbWF0Y2gpO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTA5LVxcdGlmICghZGV2KVxcbi0tXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE5MTctfVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxOTE4OkVYUE9SVF9TWU1CT0woaTJjX2ZpbmRfYWRhcHRlcl9ieV9md25vZGUpO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTE5LVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTIwLS8qKlxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxOTIxOiAqIGkyY19nZXRfYWRhcHRlcl9ieV9md25vZGUoKSAtIGZpbmQgYW4gaTJjX2FkYXB0ZXIgZm9yIHRoZSBmd25vZGVcXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTkyMjogKiBAZndub2RlOiBcXHUwMDI2c3RydWN0IGZ3bm9kZV9oYW5kbGUgY29ycmVzcG9uZGluZyB0byB0aGUgXFx1MDAyNnN0cnVjdCBpMmNfYWRhcHRlclxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTIzLSAqXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jOjE5MjQ6ICogTG9vayB1cCBhbmQgcmV0dXJuIHRoZSBcXHUwMDI2c3RydWN0IGkyY19hZGFwdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEBmd25vZGUsXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE5MjUtICogYW5kIGluY3JlbWVudCB0aGUgYWRhcHRlciBtb2R1bGUncyB1c2UgY291bnQuIElmIG5vIGFkYXB0ZXIgY2FuIGJlIGZvdW5kLFxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxOTI2OiAqIG9yIEBmd25vZGUgaXMgTlVMTCwgdGhpcyByZXR1cm5zIE5VTEwuXFxuZHJpdmVycy9pMmMvaTJjLWNvcmUtYmFzZS5jLTE5MjctICpcXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTMwLSAqL1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxOTMxOnN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2dldF9hZGFwdGVyX2J5X2Z3bm9kZShzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTMyLXtcXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTM0LVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYzoxOTM1OlxcdGFkYXB0ZXIgPSBpMmNfZmluZF9hZGFwdGVyX2J5X2Z3bm9kZShmd25vZGUpO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTM2LVxcdGlmICghYWRhcHRlcilcXG4tLVxcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTQ1LX1cXG5kcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmM6MTk0NjpFWFBPUlRfU1lNQk9MKGkyY19nZXRfYWRhcHRlcl9ieV9md25vZGUpO1xcbmRyaXZlcnMvaTJjL2kyYy1jb3JlLWJhc2UuYy0xOTQ3LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNTo1MDozOC4yMTA0MDE4MjFaIiwiU2VxIjo1NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjIzNzU2OTcwODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqVW5yZWFjaGFibGUgRHJpdmVyIEFuYWx5c2lzKipcblxuT2theSwgbXkgYW5hbHlzaXMgaXMgYXMgZm9sbG93czogSSdtIGNvbmZpZGVudCB0aGF0IGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHJldHVybnMgTlVMTCB3aGVuIHRoZSBkZXZpY2UncyBmd25vZGUgKGBkZXZfZndub2RlKGRldilgKSBpcyBOVUxMLCBhbmQgSSBrbm93IGZyb20gcHJpb3IgZXhwZXJpZW5jZSB0aGF0IGBkZXZfZndub2RlKGRldilgIGlzIGluZGVlZCBOVUxMIGZvciBJMkMgZGV2aWNlcyBpbnN0YW50aWF0ZWQgdGhyb3VnaCBzeXNmcy4gVGhpcyBtZWFucyB0aGUgYHJ0cHNlX21jdV9pMmNfcHJvYmVgIGZ1bmN0aW9uIHdpbGwgaW5ldml0YWJseSBmYWlsIHdpdGggYW4gYC1FTk9ERVZgIGVycm9yIGlmIHRoZSBJMkMgZGV2aWNlIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIHN5c2ZzIGludGVyZmFjZS5cblxuSSB0aGVuIGNvbnNpZGVyZWQgaG93IHN5emthbGxlciBtaWdodCBiZSBhYmxlIHRvIHRyaWdnZXIgdGhpcyBkcml2ZXIuIFRoZSBrZXkgcXVlc3Rpb24gaXMgd2hldGhlciB0aGVyZSBpcyBhIHdheSB0byBzZXQgdGhlIGBmd25vZGVgIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgZGV2aWNlLiBTeXprYWxsZXIgZG9lc24ndCBzZWVtIHRvIGhhdmUgYSB3YXkgdG8gaW5qZWN0IEkyQyBkZXZpY2VzIHdpdGggdGhlIGBmd25vZGVgIHNldCwgZm9yIGluc3RhbmNlIHRocm91Z2ggRFQgb3ZlcmxheXMuIFxuXG5JIGNvbnNpZGVyZWQgaWYgYW5vdGhlciBmdXp6ZWQgZHJpdmVyIGNvdWxkIGluZGlyZWN0bHkgY3JlYXRlIHRoaXMgSTJDIGRldmljZSB2aWEgYGkyY19uZXdfY2xpZW50X2RldmljZWAsIGJ1dCB0aGVyZSdzIG5vIGdlbmVyaWMgd2F5IHRoaXMgY291bGQgaGFwcGVuLiBUaGVuIEkgdGhvdWdodCBhYm91dCB0aGUgVUFSVCBkcml2ZXIsIHdoaWNoIHVzZXMgYHNlcmRldmAuIFNlcmRldiBkZXZpY2VzIGFyZSBhbHNvIGluc3RhbnRpYXRlZCB2aWEgRFQgb3IgQUNQSSwgc28gdGhlIHNhbWUgbGltaXRhdGlvbiBhcHBsaWVzLiBTeXprYWxsZXIgY2Fubm90IGluc3RhbnRpYXRlIHNlcmRldiBkZXZpY2VzIHZpYSBzeXNmcywgc2luY2UgdGhlcmUgaXMgbm8gYG5ld19kZXZpY2VgIGZvciBzZXJkZXYuXG5cbkkgdGhlbiBleHBsb3JlZCB0aGUgcG9zc2liaWxpdHkgb2YgaW5qZWN0aW5nIGEgYHNvZnR3YXJlX25vZGVgIHRvIGJ5cGFzcyB0aGUgRFQgZGVwZW5kZW5jeSwgYnV0IHVuZm9ydHVuYXRlbHksIHN5emthbGxlciBkb2VzIG5vdCBwcm92aWRlIGEgbWVjaGFuaXNtIGZvciBzb2Z0d2FyZSBub2RlIGluamVjdGlvbi4gVGhpcyBtZWFucyB0aGUgZHJpdmVyIGlzIGNvbXBsZXRlbHkgdW5yZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgUUVNVSBvciBHQ0UuXG5cbkkgZG91YmxlLWNoZWNrZWQgYGkyY19vZl9tYXRjaF9kZXZpY2Vfc3lzZnNgIHRvIGNvbmZpcm0gaXQgZG9lc24ndCBzdG9yZSB0aGUgbWF0Y2ggZGF0YSBpbiB0aGUgYGRldi1cdTAwM2Vkcml2ZXJfZGF0YWAgb3Igc29tZXRoaW5nIHNpbWlsYXIsIGFuZCBpdCBkb2Vzbid0LiBUaGlzIGNvbmZpcm1zIHRoYXQgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgd2lsbCBkZWZpbml0ZWx5IHJldHVybiBOVUxMLiBUaGlzIGlzIGEga25vd24gaXNzdWUgZm9yIEkyQyBkcml2ZXJzIHRoYXQgZGVwZW5kIG9uIGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIHdpdGhvdXQgaGF2aW5nIGFuIGBpZF90YWJsZWAuIFxuXG5JIHRoZW4gY29uc2lkZXJlZCBpZiBgZGV2aWNlX2dldF9tYXRjaF9kYXRhYCBvciBgaTJjX2dldF9tYXRjaF9kYXRhYCBjb3VsZCBiZSBwYXRjaGVkIHRvIHNvbWVob3cgdXNlIGBpMmNfb2ZfbWF0Y2hfZGV2aWNlX3N5c2ZzYCwgYnV0IGBkZXZpY2VfZ2V0X21hdGNoX2RhdGFgIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiB0aGF0IGRvZXNuJ3Qga25vdyBhYm91dCBJMkMsIGFuZCBgaTJjX2dldF9tYXRjaF9kYXRhYCwgZXZlbiBpZiB1c2VkLCB3b3VsZCBzdGlsbCByZXR1cm4gTlVMTCBiZWNhdXNlIHRoZSBkcml2ZXIgZG9lc24ndCBoYXZlIGFuIGBpZF90YWJsZWAuXG5cblRoZXJlZm9yZSwgdGhlIGRyaXZlciBpcyB1bnJlYWNoYWJsZSB2aWEgc3lzZnMgYG5ld19kZXZpY2VgLlxuXG5HaXZlbiB0aGUgcHJvbXB0LCBzaW5jZSB0aGlzIGRyaXZlciByZWxpZXMgb24gYSBzcGVjaWZpYyBEZXZpY2UgVHJlZSBub2RlIGZvciBpbnN0YW50aWF0aW9uLCBhbmQgc3l6a2FsbGVyIGNhbm5vdCBpbmplY3QgYXJiaXRyYXJ5IERUIG5vZGVzLCBJIG5lZWQgdG8gY29uY2x1ZGUgdGhhdCB0aGlzIGRyaXZlciBpcyBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHRoZSBzdGFuZGFyZCBRRU1VIGVudmlyb25tZW50cyB1c2VkIGJ5IHN5emthbGxlci5cblxuSSBhbHNvIGNoZWNrZWQgaWYgc3l6a2FsbGVyIHVzZXMgYSBjdXN0b20gRFQgdGhhdCBjb3VsZCBpbmNsdWRlIHRoaXMgZGV2aWNlLCBhbmQgY29uZmlybWVkIGl0IGRvZXMgbm90LlxuXG5JIGNvbnNpZGVyZWQgb3RoZXIgcG9zc2liaWxpdGllcyAoQUNQSSwgUENJLCBVU0IsIHBsYXRmb3JtIGRldmljZSkgYnV0LCBnaXZlbiB0aGUgSTJDL1VBUlQgbmF0dXJlIG9mIHRoZSBkZXZpY2UsIHRoZXNlIGFyZSBub3QgYXBwbGljYWJsZS5cblxuSW4gY29uY2x1c2lvbiwgSSdtIHNldHRpbmcgYFdvcnRoRnV6emluZz1mYWxzZWAgYW5kIEknbSBleHBsYWluaW5nIHRoYXQgdGhlIGRyaXZlciByZWxpZXMgb24gRGV2aWNlIFRyZWUgKG9yIEFDUEkvc29mdHdhcmUgbm9kZXMpIGZvciBpbnN0YW50aWF0aW9uLiBTcGVjaWZpY2FsbHksIGl0IGRlcGVuZHMgb24gYGRldmljZV9nZXRfbWF0Y2hfZGF0YSgpYCwgd2hpY2ggcmV0dXJucyBOVUxMIGZvciBzeXNmcy1pbnN0YW50aWF0ZWQgSTJDIGRldmljZXMuIFN5emthbGxlciBkb2VzIG5vdCBkeW5hbWljYWxseSBpbmplY3QgRFQgbm9kZXMgZm9yIGFyYml0cmFyeSBJMkMgZGV2aWNlczsgdGhlcmVmb3JlIHRoZSBkcml2ZXIncyBwcm9iZSBmdW5jdGlvbiBhbmQgaXRzIGNvcmUgbG9naWMgYXJlIHVucmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy5cblxuSSB3aWxsIHZlcmlmeSB0aGUgZXhhY3QgYmVoYXZpb3Igb2YgYGRldmljZV9nZXRfbWF0Y2hfZGF0YWAgb25lIGxhc3QgdGltZS4gSSBjb25maXJtZWQgdGhlIGVudGlyZSBwcm9iZSBwYXRoIGFuZCB0aGF0IGl0IGluZXZpdGFibHkgZmFpbHMuIFRoaXMgY29uZmlybXMgdGhlIGNvbmNsdXNpb24gYW5kIHRoZSByZXBvcnQgaXMgY29tcGxldGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ5ODkzLCJPdXRwdXRUb2tlbnMiOjE4OCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzMTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMjlUMDU6NTE6MDAuNTg2MTA2MDhaIiwiU2VxIjo1NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NzU4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEkyQyBhbmQgVUFSVCAoc2VyZGV2KSBkcml2ZXIgZm9yIFJlYWx0ZWsgUFNFIE1DVXMuIFRoZSBJMkMgZHJpdmVyIHJlbGllcyBvbiBgZGV2aWNlX2dldF9tYXRjaF9kYXRhKClgIGluIGl0cyBwcm9iZSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBOVUxMIGZvciBkZXZpY2VzIGluc3RhbnRpYXRlZCBkeW5hbWljYWxseSB2aWEgc3lzZnMgYG5ld19kZXZpY2VgIGJlY2F1c2UgdGhleSBsYWNrIGEgZmlybXdhcmUgbm9kZSAoZndub2RlKS4gV2l0aG91dCBhbiBgaWRfdGFibGVgIGZhbGxiYWNrLCB0aGUgcHJvYmUgZnVuY3Rpb24gd2lsbCBhbHdheXMgZmFpbCB3aXRoIC1FTk9ERVYgd2hlbiBpbnN0YW50aWF0ZWQgdmlhIHN5c2ZzLiBGdXJ0aGVybW9yZSwgc2VyZGV2IGRldmljZXMgY2Fubm90IGJlIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZCB2aWEgc3lzZnMgYXQgYWxsLiBTaW5jZSBzeXprYWxsZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgaW5qZWN0IERldmljZSBUcmVlIG5vZGVzIG9yIHNvZnR3YXJlIG5vZGVzIGZvciBhcmJpdHJhcnkgSTJDL3NlcmRldiBkZXZpY2VzLCB0aGlzIGRyaXZlciBjYW5ub3QgYmUgc3VjY2Vzc2Z1bGx5IHByb2JlZCBhbmQgaXRzIGNvcmUgbG9naWMgaXMgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBRRU1VLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBJMkMgYW5kIFVBUlQgKHNlcmRldikgZHJpdmVyIGZvciBSZWFsdGVrIFBTRSBNQ1VzLiBUaGUgSTJDIGRyaXZlciByZWxpZXMgb24gYGRldmljZV9nZXRfbWF0Y2hfZGF0YSgpYCBpbiBpdHMgcHJvYmUgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgTlVMTCBmb3IgZGV2aWNlcyBpbnN0YW50aWF0ZWQgZHluYW1pY2FsbHkgdmlhIHN5c2ZzIGBuZXdfZGV2aWNlYCBiZWNhdXNlIHRoZXkgbGFjayBhIGZpcm13YXJlIG5vZGUgKGZ3bm9kZSkuIFdpdGhvdXQgYW4gYGlkX3RhYmxlYCBmYWxsYmFjaywgdGhlIHByb2JlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGZhaWwgd2l0aCAtRU5PREVWIHdoZW4gaW5zdGFudGlhdGVkIHZpYSBzeXNmcy4gRnVydGhlcm1vcmUsIHNlcmRldiBkZXZpY2VzIGNhbm5vdCBiZSBkeW5hbWljYWxseSBpbnN0YW50aWF0ZWQgdmlhIHN5c2ZzIGF0IGFsbC4gU2luY2Ugc3l6a2FsbGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGluamVjdCBEZXZpY2UgVHJlZSBub2RlcyBvciBzb2Z0d2FyZSBub2RlcyBmb3IgYXJiaXRyYXJ5IEkyQy9zZXJkZXYgZGV2aWNlcywgdGhpcyBkcml2ZXIgY2Fubm90IGJlIHN1Y2Nlc3NmdWxseSBwcm9iZWQgYW5kIGl0cyBjb3JlIGxvZ2ljIGlzIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgUUVNVS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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:nil,}