Name: series-workflowdtxc9 Phase: Succeeded StartedAt: 2026-07-12 12:53:48 +0000 UTC FinishedAt: 2026-07-12 17:53:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[0] Phase: Succeeded StartedAt: 2026-07-12 12:53:48 +0000 UTC FinishedAt: 2026-07-12 13:14:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[0].run-triage Phase: Succeeded StartedAt: 2026-07-12 12:53:48 +0000 UTC FinishedAt: 2026-07-12 13:14:01 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "61cccb8363fcc282d4ae0555b8739dd227f5ad0b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MIGRATION", "HUGETLB_PAGE", "TRANSPARENT_HUGEPAGE" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "61cccb8363fcc282d4ae0555b8739dd227f5ad0b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MIGRATION", "HUGETLB_PAGE", "TRANSPARENT_HUGEPAGE" ], "series_id": "f6ed0914-22d0-4ad7-be5e-be4ed8fb9961" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "migration_pte_batch", "remove_migration_pte", "remove_migration_pte_hugetlb", "remove_migration_ptes", "make_migration_swp_pte", "try_to_migrate_hugetlb_one", "folio_migrate_pte_batch", "try_to_migrate_one", "try_to_migrate" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEyIDEzOjEyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01JR1JBVElPTiYjMzQ7LAogICAgJiMzNDtIVUdFVExCX1BBR0UmIzM0OywKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttaWdyYXRpb25fcHRlX2JhdGNoJiMzNDssCiAgICAmIzM0O3JlbW92ZV9taWdyYXRpb25fcHRlJiMzNDssCiAgICAmIzM0O3JlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGImIzM0OywKICAgICYjMzQ7cmVtb3ZlX21pZ3JhdGlvbl9wdGVzJiMzNDssCiAgICAmIzM0O21ha2VfbWlncmF0aW9uX3N3cF9wdGUmIzM0OywKICAgICYjMzQ7dHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmUmIzM0OywKICAgICYjMzQ7Zm9saW9fbWlncmF0ZV9wdGVfYmF0Y2gmIzM0OywKICAgICYjMzQ7dHJ5X3RvX21pZ3JhdGVfb25lJiMzNDssCiAgICAmIzM0O3RyeV90b19taWdyYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYmF0Y2hpbmcgZm9yIG1pZ3JhdGlvbiBQVEVzIHRvIG9wdGltaXplIG1lbW9yeSBtaWdyYXRpb24sIGVzcGVjaWFsbHkgZm9yIGxhcmdlIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgaW4gbW0vbWlncmF0ZS5jIGFuZCBtbS9ybWFwLmMuIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBiYXRjaGluZyBsb2dpYyBjb3JyZWN0bHkgaGFuZGxlcyBQVEVzLCBwZXJtaXNzaW9ucywgYW5kIGVkZ2UgY2FzZXMgbGlrZSBkZXZpY2UgcHJpdmF0ZSBmb2xpb3Mgb3IgaHVnZXRsYiBwYWdlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGM2ZTJiZTFlMWE2MWJiZmE4MTFkNzVjMWQ3NzAyYTRkOThjNWU4ODVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIEp1bCAxMiAxMzoxMjoyMCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JtYXAuaCBiL2luY2x1ZGUvbGludXgvcm1hcC5oXG5pbmRleCA4ZGMwODcxZTVmMDAxMS4uNjQ5Mjk0OTBhN2NmY2EgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3JtYXAuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ybWFwLmhcbkBAIC03MDYsMTcgJiM0Mzs3MDYsMTggQEAgc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X2R1cF9hbm9uX3JtYXBfcG1kKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gfVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuLVx0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywgZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsKVxuIHtcbiYjNDM7XHQvKiBkZXZpY2UgcHJpdmF0ZSBmb2xpb3MgY2Fubm90IGdldCBwaW5uZWQgdmlhIEdVUC4gKi9cbiYjNDM7XHRjb25zdCBib29sIHBpbm5hYmxlID0gbGlrZWx5KCFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpO1xuJiM0MztcbiBcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fRk9MSU8oIVBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpLCBmb2xpbyk7XG4gXHRfX2ZvbGlvX3JtYXBfc2FuaXR5X2NoZWNrcyhmb2xpbywgcGFnZSwgbnJfcGFnZXMsIGxldmVsKTtcbiBcbi1cdC8qIGRldmljZSBwcml2YXRlIGZvbGlvcyBjYW5ub3QgZ2V0IHBpbm5lZCB2aWEgR1VQLiAqL1xuLVx0aWYgKHVubGlrZWx5KGZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSkpIHtcbi1cdFx0Q2xlYXJQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbi1cdFx0cmV0dXJuIDA7XG4tXHR9XG4mIzQzO1x0LyogV2Ugb25seSBjbGVhciBhbm9uLWV4Y2x1c2l2ZSBmcm9tIGhlYWQgcGFnZSBvZiBQTUQgZm9saW8gKi9cbiYjNDM7XHRpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QTUQpXG4mIzQzO1x0XHRucl9wYWdlcyA9IDE7XG4gXG4gXHQvKlxuIFx0ICogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIHdlIGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlLCB0aGF0XG5AQCAtNzYwLDI5ICYjNDM7NzYxLDM4IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIFx0ICogc28gd2UgdXNlIGV4cGxpY2l0IG9uZXMgaGVyZS5cbiBcdCAqL1xuIFxuLVx0LyogUGFpcmVkIHdpdGggdGhlIG1lbW9yeSBiYXJyaWVyIGluIHRyeV9ncmFiX2ZvbGlvKCkuICovXG4tXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpXG4tXHRcdHNtcF9tYigpO1xuJiM0MztcdGlmIChwaW5uYWJsZSkge1xuJiM0MztcdFx0LyogUGFpcmVkIHdpdGggdGhlIG1lbW9yeSBiYXJyaWVyIGluIHRyeV9ncmFiX2ZvbGlvKCkuICovXG4mIzQzO1x0XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpXG4mIzQzO1x0XHRcdHNtcF9tYigpO1xuIFxuLVx0aWYgKHVubGlrZWx5KGZvbGlvX21heWJlX2RtYV9waW5uZWQoZm9saW8pKSlcbi1cdFx0cmV0dXJuIC1FQlVTWTtcbi1cdENsZWFyUGFnZUFub25FeGNsdXNpdmUocGFnZSk7XG4mIzQzO1x0XHRpZiAodW5saWtlbHkoZm9saW9fbWF5YmVfZG1hX3Bpbm5lZChmb2xpbykpKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Zm9yICg7Oykge1xuJiM0MztcdFx0Q2xlYXJQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbiYjNDM7XHRcdGlmICgtLW5yX3BhZ2VzID09IDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0cGFnZSYjNDM7JiM0Mzs7XG4mIzQzO1x0fVxuIFxuIFx0LypcbiBcdCAqIFRoaXMgaXMgY29uY2VwdHVhbGx5IGEgc21wX3dtYigpIHBhaXJlZCB3aXRoIHRoZSBzbXBfcm1iKCkgaW5cbiBcdCAqIGd1cF9tdXN0X3Vuc2hhcmUoKS5cbiBcdCAqL1xuLVx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKVxuJiM0MztcdGlmIChwaW5uYWJsZSBcdTAwMjZcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpXG4gXHRcdHNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4gLyoqXG4tICogZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUgLSB0cnkgbWFya2luZyBhbiBleGNsdXNpdmUgYW5vbnltb3VzIHBhZ2Vcbi0gKlx0XHRcdFx0ICAgbWFwcGVkIGJ5IGEgUFRFIHBvc3NpYmx5IHNoYXJlZCB0byBwcmVwYXJlXG4mIzQzOyAqIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyAtIHRyeSBtYXJraW5nIGV4Y2x1c2l2ZSBhbm9ueW1vdXMgcGFnZXNcbiYjNDM7ICpcdFx0XHRcdCAgIG1hcHBlZCBieSBQVEVzIHBvc3NpYmx5IHNoYXJlZCB0byBwcmVwYXJlXG4gICpcdFx0XHRcdCAgIGZvciBLU00gb3IgdGVtcG9yYXJ5IHVubWFwcGluZ1xuICAqIEBmb2xpbzpcdFRoZSBmb2xpbyB0byBzaGFyZSBhIG1hcHBpbmcgb2Zcbi0gKiBAcGFnZTpcdFRoZSBtYXBwZWQgZXhjbHVzaXZlIHBhZ2VcbiYjNDM7ICogQHBhZ2U6XHRUaGUgZmlyc3QgbWFwcGVkIGV4Y2x1c2l2ZSBwYWdlIG9mIHRoZSBiYXRjaCBpbiB0aGUgZm9saW9cbiYjNDM7ICogQG5yX3BhZ2VzOlx0VGhlIG51bWJlciBvZiBwYWdlcyB0byBzaGFyZSBpbiB0aGUgZm9saW8gKGJhdGNoIHNpemUpXG4gICpcbiAgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgdGhlIHBhZ2UgdGFibGUgbG9jayBhbmQgaGFzIHRvIGhhdmUgdGhlIHBhZ2UgdGFibGVcbiAgKiBlbnRyaWVzIGNsZWFyZWQvaW52YWxpZGF0ZWQuXG5AQCAtNzk3LDExICYjNDM7ODA3LDE5IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuICAqXG4gICogUmV0dXJucyAwIGlmIG1hcmtpbmcgdGhlIG1hcHBlZCBwYWdlIHBvc3NpYmx5IHNoYXJlZCBzdWNjZWVkZWQuIFJldHVybnNcbiAgKiAtRUJVU1kgb3RoZXJ3aXNlLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgdGhlIHBhZ2UgdGFibGUgbG9jay5cbiAgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8sIHBhZ2UsIG5yX3BhZ2VzLCBQR1RBQkxFX0xFVkVMX1BURSk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcbiBcdFx0c3RydWN0IHBhZ2UgKnBhZ2UpXG4ge1xuLVx0cmV0dXJuIF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChmb2xpbywgcGFnZSwgMSwgUEdUQUJMRV9MRVZFTF9QVEUpO1xuJiM0MztcdHJldHVybiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIDEpO1xuIH1cbiBcbiAvKipcbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggODc0YmU5NGNmMjU3MGUuLmE5MDcyMWY4YzY4NzdlIDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaFxuQEAgLTUwNSw2ICYjNDM7NTA1LDI2IEBAIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX25leHRfc3dwX29mZnNldChwdGVfdCBwdGUpXG4gXHRyZXR1cm4gcHRlX21vdmVfc3dwX29mZnNldChwdGUsIDEpO1xuIH1cbiBcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgc29mdGxlYWZfcHRlX2JhdGNoKHB0ZV90ICpzdGFydF9wdGVwLCBpbnQgbWF4X25yLCBwdGVfdCBwdGUpXG4mIzQzO3tcbiYjNDM7XHRwdGVfdCBleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHB0ZSk7XG4mIzQzO1x0Y29uc3QgcHRlX3QgKmVuZF9wdGVwID0gc3RhcnRfcHRlcCAmIzQzOyBtYXhfbnI7XG4mIzQzO1x0cHRlX3QgKnB0ZXAgPSBzdGFydF9wdGVwICYjNDM7IDE7XG4mIzQzO1xuJiM0MztcdFZNX1dBUk5fT04obWF4X25yIFx1MDAzYyAxKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHB0ZXAgXHUwMDNjIGVuZF9wdGVwKSB7XG4mIzQzO1x0XHRwdGUgPSBwdGVwX2dldChwdGVwKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIXB0ZV9zYW1lKHB0ZSwgZXhwZWN0ZWRfcHRlKSlcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KGV4cGVjdGVkX3B0ZSk7XG4mIzQzO1x0XHRwdGVwJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBwdGVwIC0gc3RhcnRfcHRlcDtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiBzd2FwX3B0ZV9iYXRjaCAtIGRldGVjdCBhIFBURSBiYXRjaCBmb3IgYSBzZXQgb2YgY29udGlndW91cyBzd2FwIGVudHJpZXNcbiAgKiBAc3RhcnRfcHRlcDogUGFnZSB0YWJsZSBwb2ludGVyIGZvciB0aGUgZmlyc3QgZW50cnkuXG5AQCAtNTIyLDIzICYjNDM7NTQyLDkgQEAgc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHB0ZV90IHB0ZSlcbiAgKi9cbiBzdGF0aWMgaW5saW5lIGludCBzd2FwX3B0ZV9iYXRjaChwdGVfdCAqc3RhcnRfcHRlcCwgaW50IG1heF9uciwgcHRlX3QgcHRlKVxuIHtcbi1cdHB0ZV90IGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlKTtcbi1cdGNvbnN0IHB0ZV90ICplbmRfcHRlcCA9IHN0YXJ0X3B0ZXAgJiM0MzsgbWF4X25yO1xuLVx0cHRlX3QgKnB0ZXAgPSBzdGFydF9wdGVwICYjNDM7IDE7XG4tXG4tXHRWTV9XQVJOX09OKG1heF9uciBcdTAwM2MgMSk7XG4gXHRWTV9XQVJOX09OKCFzb2Z0bGVhZl9pc19zd2FwKHNvZnRsZWFmX2Zyb21fcHRlKHB0ZSkpKTtcbiBcbi1cdHdoaWxlIChwdGVwIFx1MDAzYyBlbmRfcHRlcCkge1xuLVx0XHRwdGUgPSBwdGVwX2dldChwdGVwKTtcbi1cbi1cdFx0aWYgKCFwdGVfc2FtZShwdGUsIGV4cGVjdGVkX3B0ZSkpXG4tXHRcdFx0YnJlYWs7XG4tXHRcdGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQoZXhwZWN0ZWRfcHRlKTtcbi1cdFx0cHRlcCYjNDM7JiM0Mzs7XG4tXHR9XG4tXG4tXHRyZXR1cm4gcHRlcCAtIHN0YXJ0X3B0ZXA7XG4mIzQzO1x0cmV0dXJuIHNvZnRsZWFmX3B0ZV9iYXRjaChzdGFydF9wdGVwLCBtYXhfbnIsIHB0ZSk7XG4gfVxuICNlbmRpZiAvKiBDT05GSUdfTU1VICovXG4gXG5kaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jXG5pbmRleCAyMjJjOGMxNWY3ODJmNy4uNmQwNWQzZjQxMDk1ZDYgMTAwNjQ0XG4tLS0gYS9tbS9taWdyYXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21pZ3JhdGUuY1xuQEAgLTM0NSw2ICYjNDM7MzQ1LDExMSBAQCBzdHJ1Y3Qgcm1hcF93YWxrX2FyZyB7XG4gXHRib29sIG1hcF91bnVzZWRfdG9femVyb3BhZ2U7XG4gfTtcbiBcbiYjNDM7LypcbiYjNDM7ICogRGV0ZWN0IGEgYmF0Y2ggb2YgY29udGlndW91cyBtaWdyYXRpb24gZW50cmllczogY29uc2VjdXRpdmUgKG5vbi1wcmVzZW50KSBQVEVzXG4mIzQzOyAqIGNvbnRhaW5pbmcgbWlncmF0aW9uIGVudHJpZXMgd2l0aCBjb25zZWN1dGl2ZSBvZmZzZXRzIGFuZCBtYXRjaGluZyBwdGUgYml0cy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlncmF0aW9uX3B0ZV9iYXRjaChzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsXG4mIzQzO1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBwdGVfdCBmaXJzdF9wdGUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBwdm13LVx1MDAzZXZtYTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gcG1kX2FkZHJfZW5kKHB2bXctXHUwMDNlYWRkcmVzcywgdm1hLVx1MDAzZXZtX2VuZCk7XG4mIzQzO1x0dW5zaWduZWQgaW50IGZvbGlvX25yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfbnI7XG4mIzQzO1xuJiM0MztcdFZNX1dBUk5fT04oIXNvZnRsZWFmX2lzX21pZ3JhdGlvbihzb2Z0bGVhZl9mcm9tX3B0ZShmaXJzdF9wdGUpKSk7XG4mIzQzO1xuJiM0MztcdC8qIEJvdW5kIGJ5IFZNQSAvIFBNRCBlbmQgYW5kIGJ5IHRoZSByZW1haW5pbmcgc3VicGFnZXMgb2YgdGhlIGZvbGlvLiAqL1xuJiM0MztcdG1heF9uciA9IG1pbigoZW5kX2FkZHIgLSBwdm13LVx1MDAzZWFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBmb2xpb19uciAtIHN0YXJ0X2lkeCk7XG4mIzQzO1x0aWYgKG1heF9uciBcdTAwM2M9IDEpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHNvZnRsZWFmX3B0ZV9iYXRjaChwdm13LVx1MDAzZXB0ZSwgbWF4X25yLCBmaXJzdF9wdGUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgcHRlX3QgbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqbmV3LFxuJiM0MztcdFx0c29mdGxlYWZfdCBlbnRyeSwgcHRlX3Qgb2xkX3B0ZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHRybWFwX3QgKnJtYXBfZmxhZ3MpXG4mIzQzO3tcbiYjNDM7XHRwdGVfdCBwdGUgPSBta19wdGUobmV3LCBSRUFEX09OQ0Uodm1hLVx1MDAzZXZtX3BhZ2VfcHJvdCkpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSkpXG4mIzQzO1x0XHRwdGUgPSBwdGVfbWtvbGQocHRlKTtcbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSkpXG4mIzQzO1x0XHRwdGUgPSBwdGVfbWtkaXJ0eShwdGUpO1xuJiM0MztcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkob2xkX3B0ZSkpXG4mIzQzO1x0XHRwdGUgPSBwdGVfbWtzb2Z0X2RpcnR5KHB0ZSk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0cHRlID0gcHRlX2NsZWFyX3NvZnRfZGlydHkocHRlKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNvZnRsZWFmX2lzX21pZ3JhdGlvbl93cml0ZShlbnRyeSkpXG4mIzQzO1x0XHRwdGUgPSBwdGVfbWt3cml0ZShwdGUsIHZtYSk7XG4mIzQzO1x0ZWxzZSBpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuJiM0MztcdFx0cHRlID0gcHRlX21rdWZmZChwdGUpO1xuJiM0MztcbiYjNDM7XHQvKiBTZWUgZG9fc3dhcF9wYWdlKCk6IHJlc3RvcmUgUEFHRV9OT05FIGZvciBSV1AgKi9cbiYjNDM7XHRpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpIFx1MDAyNlx1MDAyNiB1c2VyZmF1bHRmZF9yd3Aodm1hKSlcbiYjNDM7XHRcdHB0ZSA9IHB0ZV9tb2RpZnkocHRlLCBQQUdFX05PTkUpO1xuJiM0MztcbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkKGVudHJ5KSlcbiYjNDM7XHRcdCpybWFwX2ZsYWdzIHw9IFJNQVBfRVhDTFVTSVZFO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcHRlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXN0b3JlIGEgcG90ZW50aWFsIG1pZ3JhdGlvbiBwdGUgdG8gYSB3b3JraW5nIHB0ZSBlbnRyeSBmb3IgaHVnZXRsYiBmb2xpb3MuXG4mIzQzOyAqL1xuJiM0MzsjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRVxuJiM0MztzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4mIzQzO1x0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgcm1hcF93YWxrX2FyZyAqcm1hcF93YWxrX2FyZyA9IGFyZztcbiYjNDM7XHRERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgcm1hcF93YWxrX2FyZy1cdTAwM2Vmb2xpbywgdm1hLCBhZGRyLCBQVk1XX1NZTkMgfCBQVk1XX01JR1JBVElPTik7XG4mIzQzO1x0c3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaCk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwc2l6ZSA9IGh1Z2VfcGFnZV9zaXplKGgpO1xuJiM0MztcbiYjNDM7XHRpZiAocGFnZV92bWFfbWFwcGVkX3dhbGsoXHUwMDI2cHZtdykpIHtcbiYjNDM7XHRcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xuJiM0MztcdFx0c3RydWN0IHBhZ2UgKm5ldyA9IGZvbGlvX3BhZ2UoZm9saW8sIDApO1xuJiM0MztcdFx0cHRlX3Qgb2xkX3B0ZSwgcHRlO1xuJiM0MztcdFx0c29mdGxlYWZfdCBlbnRyeTtcbiYjNDM7XG4mIzQzO1x0XHRvbGRfcHRlID0gaHVnZV9wdGVwX2dldCh2bWEtXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUpO1xuJiM0MztcdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3B0ZShvbGRfcHRlKTtcbiYjNDM7XG4mIzQzO1x0XHRmb2xpb19nZXQoZm9saW8pO1xuJiM0MztcdFx0cHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgdm1hLCBcdTAwMjZybWFwX2ZsYWdzKTtcbiYjNDM7XHRcdHB0ZSA9IGFyY2hfbWFrZV9odWdlX3B0ZShwdGUsIHNoaWZ0LCB2bWEtXHUwMDNldm1fZmxhZ3MpO1xuJiM0MztcdFx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4mIzQzO1x0XHRcdGh1Z2V0bGJfYWRkX2Fub25fcm1hcChmb2xpbywgdm1hLCBwdm13LmFkZHJlc3MsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBybWFwX2ZsYWdzKTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0aHVnZXRsYl9hZGRfZmlsZV9ybWFwKGZvbGlvKTtcbiYjNDM7XHRcdHNldF9odWdlX3B0ZV9hdCh2bWEtXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIHB0ZSwgcHNpemUpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSRUFEX09OQ0Uodm1hLVx1MDAzZXZtX2ZsYWdzKSBcdTAwMjYgVk1fTE9DS0VEKVxuJiM0MztcdFx0XHRtbG9ja19kcmFpbl9sb2NhbCgpO1xuJiM0MztcbiYjNDM7XHRcdHRyYWNlX3JlbW92ZV9taWdyYXRpb25fcHRlKHB2bXcuYWRkcmVzcywgcHRlX3ZhbChwdGUpLFxuJiM0MztcdFx0XHRcdFx0ICAgY29tcG91bmRfb3JkZXIobmV3KSk7XG4mIzQzO1xuJiM0MztcdFx0LyogTm8gbmVlZCB0byBpbnZhbGlkYXRlIC0gaXQgd2FzIG5vbi1wcmVzZW50IGJlZm9yZSAqL1xuJiM0MztcdFx0dXBkYXRlX21tdV9jYWNoZSh2bWEsIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7I2Vsc2VcbiYjNDM7c3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYihzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuJiM0MztcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZiAvKiBDT05GSUdfSFVHRVRMQl9QQUdFICovXG4mIzQzO1xuIC8qXG4gICogUmVzdG9yZSBhIHBvdGVudGlhbCBtaWdyYXRpb24gcHRlIHRvIGEgd29ya2luZyBwdGUgZW50cnlcbiAgKi9cbkBAIC0zNTIsNiAmIzQzOzQ1Nyw3IEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZylcbiB7XG4gXHRzdHJ1Y3Qgcm1hcF93YWxrX2FyZyAqcm1hcF93YWxrX2FyZyA9IGFyZztcbiYjNDM7XHRib29sIGlzX2RldnByaXYgPSBmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbyk7XG4gXHRERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgcm1hcF93YWxrX2FyZy1cdTAwM2Vmb2xpbywgdm1hLCBhZGRyLCBQVk1XX1NZTkMgfCBQVk1XX01JR1JBVElPTik7XG4gXG4gXHR3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoXHUwMDI2cHZtdykpIHtcbkBAIC0zNjEsNTYgJiM0Mzs0NjcsNDAgQEAgc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcbiBcdFx0c29mdGxlYWZfdCBlbnRyeTtcbiBcdFx0c3RydWN0IHBhZ2UgKm5ldztcbiBcdFx0dW5zaWduZWQgbG9uZyBpZHggPSAwO1xuJiM0MztcdFx0dW5zaWduZWQgaW50IG5yID0gMTtcbiBcbiBcdFx0LyogcGdvZmYgaXMgaW52YWxpZCBmb3Iga3NtIHBhZ2VzLCBidXQgdGhleSBhcmUgbmV2ZXIgbGFyZ2UgKi9cbi1cdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbiYjNDM7XHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbiBcdFx0XHRpZHggPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIHB2bXcuYWRkcmVzcykgLSBwdm13LnBnb2ZmO1xuIFx0XHRuZXcgPSBmb2xpb19wYWdlKGZvbGlvLCBpZHgpO1xuIFxuICNpZmRlZiBDT05GSUdfQVJDSF9IQVNfUE1EX1NPRlRMRUFWRVNcbiBcdFx0LyogUE1ELW1hcHBlZCBUSFAgbWlncmF0aW9uIGVudHJ5ICovXG4gXHRcdGlmICghcHZtdy5wdGUpIHtcbi1cdFx0XHRWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSB8fFxuLVx0XHRcdFx0XHQhZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7XG4mIzQzO1x0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7XG4gXHRcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wbWQoXHUwMDI2cHZtdywgbmV3KTtcbiBcdFx0XHRjb250aW51ZTtcbiBcdFx0fVxuICNlbmRpZlxuLVx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbi1cdFx0XHRvbGRfcHRlID0gaHVnZV9wdGVwX2dldCh2bWEtXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcyxcbi1cdFx0XHRcdFx0XHRwdm13LnB0ZSk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRvbGRfcHRlID0gcHRlcF9nZXQocHZtdy5wdGUpO1xuJiM0MztcdFx0b2xkX3B0ZSA9IHB0ZXBfZ2V0KHB2bXcucHRlKTtcbiBcdFx0aWYgKHJtYXBfd2Fsa19hcmctXHUwMDNlbWFwX3VudXNlZF90b196ZXJvcGFnZSBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgIHRyeV90b19tYXBfdW51c2VkX3RvX3plcm9wYWdlKFx1MDAyNnB2bXcsIGZvbGlvLCBvbGRfcHRlLCBpZHgpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb19nZXQoZm9saW8pO1xuLVx0XHRwdGUgPSBta19wdGUobmV3LCBSRUFEX09OQ0Uodm1hLVx1MDAzZXZtX3BhZ2VfcHJvdCkpO1xuLVxuIFx0XHRlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKG9sZF9wdGUpO1xuLVx0XHRpZiAoIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSkpXG4tXHRcdFx0cHRlID0gcHRlX21rb2xkKHB0ZSk7XG4tXHRcdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KSlcbi1cdFx0XHRwdGUgPSBwdGVfbWtkaXJ0eShwdGUpO1xuLVx0XHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KG9sZF9wdGUpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3NvZnRfZGlydHkocHRlKTtcbi1cdFx0ZWxzZVxuLVx0XHRcdHB0ZSA9IHB0ZV9jbGVhcl9zb2Z0X2RpcnR5KHB0ZSk7XG4gXG4tXHRcdGlmIChzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3dyaXRlKHB0ZSwgdm1hKTtcbi1cdFx0ZWxzZSBpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3VmZmQocHRlKTtcbi1cbi1cdFx0LyogU2VlIGRvX3N3YXBfcGFnZSgpOiByZXN0b3JlIFBBR0VfTk9ORSBmb3IgUldQICovXG4tXHRcdGlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkgXHUwMDI2XHUwMDI2IHVzZXJmYXVsdGZkX3J3cCh2bWEpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9tb2RpZnkocHRlLCBQQUdFX05PTkUpO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRyeSB0byByZXN0b3JlIG5yXHUwMDNlMSBjb250aWd1b3VzIFBURXMgaW4gb25lIHNob3QuIEZhbGxzIGJhY2tcbiYjNDM7XHRcdCAqIHRvIG9yaWdpbmFsIHBlci1QVEUgcGF0aCAobnI9MSkgaWYgYmF0Y2hpbmcgaXMgbm90IHBvc3NpYmxlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIXJtYXBfd2Fsa19hcmctXHUwMDNlbWFwX3VudXNlZF90b196ZXJvcGFnZSBcdTAwMjZcdTAwMjYgbGlrZWx5KCFpc19kZXZwcml2KSlcbiYjNDM7XHRcdFx0bnIgPSBtaWdyYXRpb25fcHRlX2JhdGNoKFx1MDAyNnB2bXcsIGZvbGlvLCBvbGRfcHRlLCBpZHgpO1xuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkKGVudHJ5KSlcbi1cdFx0XHRybWFwX2ZsYWdzIHw9IFJNQVBfRVhDTFVTSVZFO1xuJiM0MztcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgbnIpO1xuJiM0MztcdFx0cHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgdm1hLCBcdTAwMjZybWFwX2ZsYWdzKTtcbiBcbi1cdFx0aWYgKHVubGlrZWx5KGlzX2RldmljZV9wcml2YXRlX3BhZ2UobmV3KSkpIHtcbiYjNDM7XHRcdGlmICh1bmxpa2VseShpc19kZXZwcml2KSkge1xuIFx0XHRcdGlmIChwdGVfd3JpdGUocHRlKSlcbiBcdFx0XHRcdGVudHJ5ID0gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShcbiBcdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKG5ldykpO1xuQEAgLTQyNCwzMCAmIzQzOzUxNCwxMiBAQCBzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIFx0XHRcdFx0cHRlID0gcHRlX3N3cF9ta3VmZmQocHRlKTtcbiBcdFx0fVxuIFxuLSNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFXG4tXHRcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XG4tXHRcdFx0c3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTtcbi1cdFx0XHR1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaCk7XG4tXHRcdFx0dW5zaWduZWQgbG9uZyBwc2l6ZSA9IGh1Z2VfcGFnZV9zaXplKGgpO1xuLVxuLVx0XHRcdHB0ZSA9IGFyY2hfbWFrZV9odWdlX3B0ZShwdGUsIHNoaWZ0LCB2bWEtXHUwMDNldm1fZmxhZ3MpO1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuLVx0XHRcdFx0aHVnZXRsYl9hZGRfYW5vbl9ybWFwKGZvbGlvLCB2bWEsIHB2bXcuYWRkcmVzcyxcbi1cdFx0XHRcdFx0XHQgICAgICBybWFwX2ZsYWdzKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRodWdldGxiX2FkZF9maWxlX3JtYXAoZm9saW8pO1xuLVx0XHRcdHNldF9odWdlX3B0ZV9hdCh2bWEtXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIHB0ZSxcbi1cdFx0XHRcdFx0cHNpemUpO1xuLVx0XHR9IGVsc2Vcbi0jZW5kaWZcbi1cdFx0e1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuLVx0XHRcdFx0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGUoZm9saW8sIG5ldywgdm1hLFxuLVx0XHRcdFx0XHRcdFx0cHZtdy5hZGRyZXNzLCBybWFwX2ZsYWdzKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRmb2xpb19hZGRfZmlsZV9ybWFwX3B0ZShmb2xpbywgbmV3LCB2bWEpO1xuLVx0XHRcdHNldF9wdGVfYXQodm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUpO1xuLVx0XHR9XG4mIzQzO1x0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbiYjNDM7XHRcdFx0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKGZvbGlvLCBuZXcsIG5yLCB2bWEsXG4mIzQzO1x0XHRcdFx0XHRcdCBwdm13LmFkZHJlc3MsIHJtYXBfZmxhZ3MpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRmb2xpb19hZGRfZmlsZV9ybWFwX3B0ZXMoZm9saW8sIG5ldywgbnIsIHZtYSk7XG4mIzQzO1x0XHRzZXRfcHRlcyh2bWEtXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIHB0ZSwgbnIpO1xuIFx0XHRpZiAoUkVBRF9PTkNFKHZtYS1cdTAwM2V2bV9mbGFncykgXHUwMDI2IFZNX0xPQ0tFRClcbiBcdFx0XHRtbG9ja19kcmFpbl9sb2NhbCgpO1xuIFxuQEAgLTQ1NSw3ICYjNDM7NTI3LDExIEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdFx0XHRcdCAgIGNvbXBvdW5kX29yZGVyKG5ldykpO1xuIFxuIFx0XHQvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovXG4tXHRcdHVwZGF0ZV9tbXVfY2FjaGUodm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTtcbiYjNDM7XHRcdHVwZGF0ZV9tbXVfY2FjaGVfcmFuZ2UoTlVMTCwgdm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBucik7XG4mIzQzO1xuJiM0MztcdFx0LyogU2tpcCB0aGUgYmF0Y2hlZCBQVEVzICovXG4mIzQzO1x0XHRwdm13LnB0ZSAmIzQzOz0gbnIgLSAxO1xuJiM0MztcdFx0cHZtdy5hZGRyZXNzICYjNDM7PSAobnIgLSAxKSAqIFBBR0VfU0laRTtcbiBcdH1cbiBcbiBcdHJldHVybiB0cnVlO1xuQEAgLTQ3NCw3ICYjNDM7NTUwLDkgQEAgdm9pZCByZW1vdmVfbWlncmF0aW9uX3B0ZXMoc3RydWN0IGZvbGlvICpzcmMsIHN0cnVjdCBmb2xpbyAqZHN0LFxuIFx0fTtcbiBcbiBcdHN0cnVjdCBybWFwX3dhbGtfY29udHJvbCByd2MgPSB7XG4tXHRcdC5ybWFwX29uZSA9IHJlbW92ZV9taWdyYXRpb25fcHRlLFxuJiM0MztcdFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKHNyYykgP1xuJiM0MztcdFx0XHRcdHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGIgOlxuJiM0MztcdFx0XHRcdHJlbW92ZV9taWdyYXRpb25fcHRlLFxuIFx0XHQuYXJnID0gXHUwMDI2cm1hcF93YWxrX2FyZyxcbiBcdH07XG4gXG5kaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jXG5pbmRleCBlODU0Njc5NTUzYjljMy4uY2ZhYzg1ZjZmNjhhNjggMTAwNjQ0XG4tLS0gYS9tbS9ybWFwLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL3JtYXAuY1xuQEAgLTI0MDUsNiAmIzQzOzI0MDUsMjI5IEBAIHZvaWQgdHJ5X3RvX3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIGVudW0gdHR1X2ZsYWdzIGZsYWdzKVxuIFx0XHRybWFwX3dhbGsoZm9saW8sIFx1MDAyNnJ3Yyk7XG4gfVxuIFxuJiM0MzsvKiBCdWlsZCB0aGUgbWlncmF0aW9uIHN3YXAgUFRFIHRoYXQgcmVwbGFjZXMgcHRldmFsIGZvciBhIHBhZ2UuICovXG4mIzQzO3N0YXRpYyBwdGVfdCBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKHN0cnVjdCBwYWdlICpwYWdlLCBwdGVfdCBwdGV2YWwsXG4mIzQzO1x0XHRib29sIHdyaXRhYmxlLCBib29sIGFub25fZXhjbHVzaXZlKVxuJiM0Mzt7XG4mIzQzO1x0c3dwX2VudHJ5X3QgZW50cnk7XG4mIzQzO1x0cHRlX3Qgc3dwX3B0ZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHdyaXRhYmxlKVxuJiM0MztcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwYWdlX3RvX3BmbihwYWdlKSk7XG4mIzQzO1x0ZWxzZSBpZiAoYW5vbl9leGNsdXNpdmUpXG4mIzQzO1x0XHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfZXhjbHVzaXZlX21pZ3JhdGlvbl9lbnRyeShcbiYjNDM7XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSkpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9taWdyYXRpb25fZW50cnkocGFnZV90b19wZm4ocGFnZSkpO1xuJiM0MztcbiYjNDM7XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4mIzQzO1x0XHRpZiAocHRlX3lvdW5nKHB0ZXZhbCkpXG4mIzQzO1x0XHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoZW50cnkpO1xuJiM0MztcdFx0aWYgKHB0ZV9kaXJ0eShwdGV2YWwpKVxuJiM0MztcdFx0XHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTtcbiYjNDM7XHRcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbiYjNDM7XHRcdGlmIChwdGVfc29mdF9kaXJ0eShwdGV2YWwpKVxuJiM0MztcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4mIzQzO1x0XHRpZiAocHRlX3VmZmQocHRldmFsKSlcbiYjNDM7XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzd3BfcHRlID0gc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSk7XG4mIzQzO1x0XHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KHB0ZXZhbCkpXG4mIzQzO1x0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcbiYjNDM7XHRcdGlmIChwdGVfc3dwX3VmZmQocHRldmFsKSlcbiYjNDM7XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHN3cF9wdGU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFJlcGxhY2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBtYXBwaW5nIGZvciBmb2xpbyB3aXRoIG1pZ3JhdGlvbiBlbnRyaWVzLlxuJiM0MzsgKlxuJiM0MzsgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmUoc3RydWN0IGZvbGlvICpmb2xpbyxcbiYjNDM7XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgaHN6ID0gaHVnZV9wYWdlX3NpemUoaHN0YXRlX3ZtYSh2bWEpKTtcbiYjNDM7XHRERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgZm9saW8sIHZtYSwgYWRkcmVzcywgMCk7XG4mIzQzO1x0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuJiM0MztcdGJvb2wgYW5vbl9leGNsdXNpdmUsIHdyaXRhYmxlLCByZXQgPSB0cnVlO1xuJiM0MztcdGJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4mIzQzO1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4mIzQzO1x0c3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHBmbjtcbiYjNDM7XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiYjNDM7XHRwdGVfdCBwdGV2YWw7XG4mIzQzO1xuJiM0MztcdHJhbmdlLmVuZCA9IHZtYV9hZGRyZXNzX2VuZChcdTAwMjZwdm13KTtcbiYjNDM7XHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVx1MDAzZXZtX21tLFxuJiM0MztcdFx0XHRcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XG4mIzQzO1x0LyogSWYgc2hhcmluZyBpcyBwb3NzaWJsZSwgc3RhcnQgYW5kIGVuZCB3aWxsIGJlIGFkanVzdGVkIGFjY29yZGluZ2x5LiAqL1xuJiM0MztcdGFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsIFx1MDAyNnJhbmdlLnN0YXJ0LCBcdTAwMjZyYW5nZS5lbmQpO1xuJiM0MztcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFx1MDAyNnJhbmdlKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKSB7XG4mIzQzO1x0XHRhZGRyZXNzID0gcHZtdy5hZGRyZXNzO1xuJiM0MztcdFx0cHRldmFsID0gaHVnZV9wdGVwX2dldChtbSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuJiM0MztcdFx0aWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSlcbiYjNDM7XHRcdFx0cGZuID0gcHRlX3BmbihwdGV2YWwpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oc29mdGxlYWZfZnJvbV9wdGUocHRldmFsKSk7XG4mIzQzO1xuJiM0MztcdFx0cGFnZSA9IGZvbGlvX3BhZ2UoZm9saW8sIHBmbiAtIGZvbGlvX3Bmbihmb2xpbykpO1xuJiM0MztcdFx0YW5vbl9leGNsdXNpdmUgPSBhbm9uIFx1MDAyNlx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogaHVnZV9wbWRfdW5zaGFyZSBtYXkgdW5tYXAgYW4gZW50aXJlIFBNRCBwYWdlLiBUaGVyZSBpcyBub1xuJiM0MztcdFx0ICogd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heSBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sXG4mIzQzO1x0XHQgKiBzbyB3ZSBtdXN0IGZsdXNoIHRoZW0gYWxsLiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkXG4mIzQzO1x0XHQgKiBhYm92ZSB0byBjb3ZlciB0aGlzIHJhbmdlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUbyBjYWxsIGh1Z2VfcG1kX3Vuc2hhcmUsIGlfbW1hcF9yd3NlbSBtdXN0IGJlIGhlbGQgaW4gd3JpdGVcbiYjNDM7XHRcdCAqIG1vZGUuIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5IGRvIHRoaXMgb3V0c2lkZSBybWFwXG4mIzQzO1x0XHQgKiByb3V0aW5lcy4gV2UgYWxzbyBtdXN0IGhvbGQgaHVnZXRsYiB2bWFfbG9jayBpbiB3cml0ZSBtb2RlLlxuJiM0MztcdFx0ICogTG9jayBvcmRlciBkaWN0YXRlcyBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFIGlfbW1hcF9yd3NlbS5cbiYjNDM7XHRcdCAqIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kIGZhaWwgaWYgdW5zdWNjZXNzZnVsLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIWFub24pIHtcbiYjNDM7XHRcdFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xuJiM0MztcbiYjNDM7XHRcdFx0Vk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgXHUwMDI2IFRUVV9STUFQX0xPQ0tFRCkpO1xuJiM0MztcdFx0XHRpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSkge1xuJiM0MztcdFx0XHRcdHJldCA9IGZhbHNlO1xuJiM0MztcdFx0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHR0bGJfZ2F0aGVyX21tdV92bWEoXHUwMDI2dGxiLCB2bWEpO1xuJiM0MztcdFx0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4mIzQzO1x0XHRcdFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XG4mIzQzO1x0XHRcdFx0aHVnZV9wbWRfdW5zaGFyZV9mbHVzaChcdTAwMjZ0bGIsIHZtYSk7XG4mIzQzO1x0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbiYjNDM7XHRcdFx0XHQvKlxuJiM0MztcdFx0XHRcdCAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLFxuJiM0MztcdFx0XHRcdCAqIGNvbnNlcXVlbnRseSB1bm1hcHBpbmcgdGhlIGZvbGlvLlxuJiM0MztcdFx0XHRcdCAqL1xuJiM0MztcdFx0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuJiM0MztcdFx0XHR0bGJfZmluaXNoX21tdShcdTAwMjZ0bGIpO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIE51a2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBlbnRyeSAqL1xuJiM0MztcdFx0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuJiM0MztcdFx0aWYgKGh1Z2VfcHRlX2RpcnR5KHB0ZXZhbCkpXG4mIzQzO1x0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuJiM0MztcdFx0d3JpdGFibGUgPSBwdGVfd3JpdGUocHRldmFsKTtcbiYjNDM7XG4mIzQzO1x0XHRWTV9XQVJOX09OX0ZPTElPKHdyaXRhYmxlIFx1MDAyNlx1MDAyNiBhbm9uIFx1MDAyNlx1MDAyNiAhYW5vbl9leGNsdXNpdmUsIGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoUGFnZUhXUG9pc29uKHBhZ2UpKSB7XG4mIzQzO1x0XHRcdHB0ZXZhbCA9IHN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShwYWdlKSk7XG4mIzQzO1x0XHRcdGh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pO1xuJiM0MztcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIGhzeik7XG4mIzQzO1x0XHR9IGVsc2UgaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSBcdTAwMjZcdTAwMjYgcHRlX3VudXNlZChwdGV2YWwpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBUaGUgZ3Vlc3QgaW5kaWNhdGVkIHRoYXQgdGhlIHBhZ2UgY29udGVudCBpcyBvZiBub1xuJiM0MztcdFx0XHQgKiBpbnRlcmVzdCBhbnltb3JlLiBTaW1wbHkgZGlzY2FyZCB0aGUgcHRlLCB2bXNjYW5cbiYjNDM7XHRcdFx0ICogd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHJlc3QuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0cHRlX3Qgc3dwX3B0ZTtcbiYjNDM7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cbiYjNDM7XHRcdFx0ICogYXJjaGl0ZWN0dXJlcyB3aGVyZSB3ZSBjb3VsZCBoYXZlIFBGTiBzd2FwIFBURXMsXG4mIzQzO1x0XHRcdCAqIHNvIHdlJiMzOTtsbCBub3QgY2hlY2svY2FyZS5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdGlmIChhcmNoX3VubWFwX29uZShtbSwgdm1hLCBhZGRyZXNzLCBwdGV2YWwpIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcbiYjNDM7XHRcdFx0XHRcdFx0cHRldmFsLCBoc3opO1xuJiM0MztcdFx0XHRcdHJldCA9IGZhbHNlO1xuJiM0MztcdFx0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHQvKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xuJiM0MztcdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRcdCAgICBodWdldGxiX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8pKSB7XG4mIzQzO1x0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcbiYjNDM7XHRcdFx0XHRcdFx0cHRldmFsLCBoc3opO1xuJiM0MztcdFx0XHRcdHJldCA9IGZhbHNlO1xuJiM0MztcdFx0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBTdG9yZSB0aGUgcGZuIG9mIHRoZSBwYWdlIGluIGEgc3BlY2lhbCBtaWdyYXRpb25cbiYjNDM7XHRcdFx0ICogcHRlLiBkb19zd2FwX3BhZ2UoKSB3aWxsIHdhaXQgdW50aWwgdGhlIG1pZ3JhdGlvblxuJiM0MztcdFx0XHQgKiBwdGUgaXMgcmVtb3ZlZCBhbmQgdGhlbiByZXN0YXJ0IGZhdWx0IGhhbmRsaW5nLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0c3dwX3B0ZSA9IG1ha2VfbWlncmF0aW9uX3N3cF9wdGUocGFnZSwgcHRldmFsLFxuJiM0MztcdFx0XHRcdFx0XHRcdCB3cml0YWJsZSwgYW5vbl9leGNsdXNpdmUpO1xuJiM0MztcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlLCBoc3opO1xuJiM0MztcdFx0XHR0cmFjZV9zZXRfbWlncmF0aW9uX3B0ZShhZGRyZXNzLCBwdGVfdmFsKHN3cF9wdGUpLFxuJiM0MztcdFx0XHRcdFx0XHRmb2xpb19vcmRlcihmb2xpbykpO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pO1xuJiM0MztcdFx0aWYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fTE9DS0VEKVxuJiM0MztcdFx0XHRtbG9ja19kcmFpbl9sb2NhbCgpO1xuJiM0MztcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiYjNDM7d2Fsa19kb25lOlxuJiM0MztcdFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcdTAwMjZwdm13KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChcdTAwMjZyYW5nZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsIHB0ZV90IHB0ZSxcbiYjNDM7XHRcdHN0cnVjdCBwYWdlICpzdWJwYWdlLCBib29sIGFub25fZXhjbHVzaXZlKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbmRfYWRkciwgYWRkciA9IHB2bXctXHUwMDNlYWRkcmVzcztcbiYjNDM7XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IHB2bXctXHUwMDNldm1hO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfbnIsIG5yLCBpO1xuJiM0MztcbiYjNDM7I2lmZGVmIF9fSEFWRV9BUkNIX1VOTUFQX09ORVxuJiM0MztcdC8qIENhbm5vdCBiYXRjaCB1bm1hcCBpZiBhcmNoX3VubWFwX29uZSgpIGlzIGRlZmluZWQuICovXG4mIzQzO1x0cmV0dXJuIDE7XG4mIzQzOyNlbmRpZlxuJiM0MztcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1x0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fCBmb2xpb190ZXN0X2hhc19od3BvaXNvbmVkKGZvbGlvKSlcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcdGlmIChwdGVfdW51c2VkKHB0ZSkpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0LyogV2UgbWF5IG9ubHkgYmF0Y2ggd2l0aGluIGEgc2luZ2xlIFZNQSBhbmQgYSBzaW5nbGUgcGFnZSB0YWJsZS4gKi9cbiYjNDM7XHRlbmRfYWRkciA9IHBtZF9hZGRyX2VuZChhZGRyLCB2bWEtXHUwMDNldm1fZW5kKTtcbiYjNDM7XHRtYXhfbnIgPSAoZW5kX2FkZHIgLSBhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHVubWFwIGZhaWxzLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHB0ZXMuIFRvIGF2b2lkIGFjY2lkZW50YWxseVxuJiM0MztcdCAqIHVwZ3JhZGluZyB3cml0ZSBwZXJtaXNzaW9ucyBmb3IgcHRlcyB0aGF0IHdlcmUgbm90IG9yaWdpbmFsbHkgd3JpdGFibGUsXG4mIzQzO1x0ICogYW5kIHRvIGF2b2lkIGxvc2luZyB0aGUgc29mdC1kaXJ0eSBiaXQsIHVzZSB0aGUgYXBwcm9wcmlhdGUgRlBCIGZsYWdzLlxuJiM0MztcdCAqL1xuJiM0MztcdG5yID0gZm9saW9fcHRlX2JhdGNoX2ZsYWdzKGZvbGlvLCB2bWEsIHB2bXctXHUwMDNlcHRlLCBcdTAwMjZwdGUsIG1heF9ucixcbiYjNDM7XHRcdFx0XHQgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9SRVNQRUNUX1NPRlRfRElSVFkpO1xuJiM0MztcbiYjNDM7XHQvKiBMaW1pdCBwb3NzaWJsZSBiYXRjaCBjb3VudCB0byBhIHVuaWZvcm0gUGFnZUFub25FeGNsdXNpdmUgdmFsdWUgKi9cbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuJiM0MztcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnI7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpZiAoUGFnZUFub25FeGNsdXNpdmUoc3VicGFnZSAmIzQzOyBpKSAhPSBhbm9uX2V4Y2x1c2l2ZSlcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdG5yID0gaTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBucjtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIEBhcmc6IGVudW0gdHR1X2ZsYWdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgYXJndW1lbnQuXG4gICpcbkBAIC0yNDIxLDggJiM0MzsyNjQ0LDcgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2U7XG4gXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xuIFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuLVx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm4sIGVuZF9hZGRyLCBucl9wYWdlcztcbiBcbiBcdC8qXG4gXHQgKiBXaGVuIHJhY2luZyBhZ2FpbnN0IGUuZy4gemFwX3B0ZV9yYW5nZSgpIG9uIGFub3RoZXIgY3B1LFxuQEAgLTI0MzUsMjYgJiM0MzsyNjU3LDEzIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcbiBcdC8qXG4gXHQgKiBGb3IgVEhQLCB3ZSBoYXZlIHRvIGFzc3VtZSB0aGUgd29yc2UgY2FzZSBpZSBwbWQgZm9yIGludmFsaWRhdGlvbi5cbi1cdCAqIEZvciBodWdldGxiLCBpdCBjb3VsZCBiZSBtdWNoIHdvcnNlIGlmIHdlIG5lZWQgdG8gZG8gcHVkXG4tXHQgKiBpbnZhbGlkYXRpb24gaW4gdGhlIGNhc2Ugb2YgcG1kIHNoYXJpbmcuXG4gXHQgKlxuIFx0ICogTm90ZSB0aGF0IHRoZSBwYWdlIGNhbiBub3QgYmUgZnJlZSBpbiB0aGlzIGZ1bmN0aW9uIGFzIGNhbGwgb2Zcbi1cdCAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS5cbiYjNDM7XHQgKiB0cnlfdG9fbWlncmF0ZSgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS5cbiBcdCAqL1xuIFx0cmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKFx1MDAyNnB2bXcpO1xuIFx0bW11X25vdGlmaWVyX3JhbmdlX2luaXQoXHUwMDI2cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS1cdTAwM2V2bV9tbSxcbiBcdFx0XHRcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XG4tXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBJZiBzaGFyaW5nIGlzIHBvc3NpYmxlLCBzdGFydCBhbmQgZW5kIHdpbGwgYmUgYWRqdXN0ZWRcbi1cdFx0ICogYWNjb3JkaW5nbHkuXG4tXHRcdCAqL1xuLVx0XHRhZGp1c3RfcmFuZ2VfaWZfcG1kX3NoYXJpbmdfcG9zc2libGUodm1hLCBcdTAwMjZyYW5nZS5zdGFydCxcbi1cdFx0XHRcdFx0XHQgICAgIFx1MDAyNnJhbmdlLmVuZCk7XG4tXG4tXHRcdC8qIFdlIG5lZWQgdGhlIGh1Z2UgcGFnZSBzaXplIGZvciBzZXRfaHVnZV9wdGVfYXQoKSAqL1xuLVx0XHRoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xuLVx0fVxuIFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoXHUwMDI2cmFuZ2UpO1xuIFxuIFx0d2hpbGUgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKSB7XG5AQCAtMjQ4OCwxMSAmIzQzOzI2OTcsOCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0Vk1fQlVHX09OX0ZPTElPKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgfHxcbiBcdFx0XHRcdFx0IWZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSwgZm9saW8pO1xuIFxuLVx0XHRcdGlmIChzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeShcdTAwMjZwdm13LCBzdWJwYWdlKSkge1xuLVx0XHRcdFx0cmV0ID0gZmFsc2U7XG4tXHRcdFx0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuLVx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0fVxuJiM0MztcdFx0XHRpZiAoc2V0X3BtZF9taWdyYXRpb25fZW50cnkoXHUwMDI2cHZtdywgc3VicGFnZSkpXG4mIzQzO1x0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuIFx0XHRcdGNvbnRpbnVlO1xuICNlbmRpZlxuIFx0XHR9XG5AQCAtMjUwMSwxMCAmIzQzOzI3MDcsNyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFZNX0JVR19PTl9GT0xJTyghcHZtdy5wdGUsIGZvbGlvKTtcbiBcbiBcdFx0YWRkcmVzcyA9IHB2bXcuYWRkcmVzcztcbi1cdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpXG4tXHRcdFx0cHRldmFsID0gaHVnZV9wdGVwX2dldChtbSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuLVx0XHRlbHNlXG4tXHRcdFx0cHRldmFsID0gcHRlcF9nZXQocHZtdy5wdGUpO1xuJiM0MztcdFx0cHRldmFsID0gcHRlcF9nZXQocHZtdy5wdGUpO1xuIFx0XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4gXHRcdFx0cGZuID0gcHRlX3BmbihwdGV2YWwpO1xuIFx0XHR9IGVsc2Uge1xuQEAgLTI1MTUsNjggJiM0MzsyNzE4LDIyIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRjb25zdCBzb2Z0bGVhZl90IGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wdGUocHRldmFsKTtcbiBcbiBcdFx0XHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oZW50cnkpO1xuLVx0XHRcdFZNX1dBUk5fT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSwgZm9saW8pO1xuIFx0XHR9XG4gXG4gXHRcdHN1YnBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcbiBcdFx0YW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNlxuIFx0XHRcdFx0IFBhZ2VBbm9uRXhjbHVzaXZlKHN1YnBhZ2UpO1xuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdGJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4tXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBodWdlX3BtZF91bnNoYXJlIG1heSB1bm1hcCBhbiBlbnRpcmUgUE1EIHBhZ2UuXG4tXHRcdFx0ICogVGhlcmUgaXMgbm8gd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heVxuLVx0XHRcdCAqIGJlIGNhY2hlZCBmb3IgdGhpcyBtbSwgc28gd2UgbXVzdCBmbHVzaCB0aGVtIGFsbC5cbi1cdFx0XHQgKiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkIGFib3ZlIHRvIGNvdmVyIHRoaXNcbi1cdFx0XHQgKiByYW5nZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuLVxuLVx0XHRcdC8qXG4tXHRcdFx0ICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZVxuLVx0XHRcdCAqIGhlbGQgaW4gd3JpdGUgbW9kZS4gIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5XG4tXHRcdFx0ICogZG8gdGhpcyBvdXRzaWRlIHJtYXAgcm91dGluZXMuXG4tXHRcdFx0ICpcbi1cdFx0XHQgKiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuXG4tXHRcdFx0ICogTG9jayBvcmRlciBkaWN0YXRlcyBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFXG4tXHRcdFx0ICogaV9tbWFwX3J3c2VtLiAgV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmRcbi1cdFx0XHQgKiBmYWlsIGlmIHVuc3VjY2Vzc2Z1bC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoIWFub24pIHtcbi1cdFx0XHRcdHN0cnVjdCBtbXVfZ2F0aGVyIHRsYjtcbiYjNDM7XHRcdG5yX3BhZ2VzID0gMTtcbiYjNDM7XHRcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcbiYjNDM7XHRcdFx0bnJfcGFnZXMgPSBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaChmb2xpbywgXHUwMDI2cHZtdywgcHRldmFsLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgIHN1YnBhZ2UsIGFub25fZXhjbHVzaXZlKTtcbiBcbi1cdFx0XHRcdFZNX0JVR19PTighKGZsYWdzIFx1MDAyNiBUVFVfUk1BUF9MT0NLRUQpKTtcbi1cdFx0XHRcdGlmICghaHVnZXRsYl92bWFfdHJ5bG9ja193cml0ZSh2bWEpKSB7XG4tXHRcdFx0XHRcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4tXHRcdFx0XHRcdHJldCA9IGZhbHNlO1xuLVx0XHRcdFx0XHRicmVhaztcbi1cdFx0XHRcdH1cbiYjNDM7XHRcdFx0ZW5kX2FkZHIgPSBhZGRyZXNzICYjNDM7IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuJiM0MztcdFx0XHRmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIGFkZHJlc3MsIGVuZF9hZGRyKTtcbiBcbi1cdFx0XHRcdHRsYl9nYXRoZXJfbW11X3ZtYShcdTAwMjZ0bGIsIHZtYSk7XG4tXHRcdFx0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4tXHRcdFx0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuLVx0XHRcdFx0XHRodWdlX3BtZF91bnNoYXJlX2ZsdXNoKFx1MDAyNnRsYiwgdm1hKTtcbi1cdFx0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbi1cdFx0XHRcdFx0Lypcbi1cdFx0XHRcdFx0ICogVGhlIFBNRCB0YWJsZSB3YXMgdW5tYXBwZWQsXG4tXHRcdFx0XHRcdCAqIGNvbnNlcXVlbnRseSB1bm1hcHBpbmcgdGhlIGZvbGlvLlxuLVx0XHRcdFx0XHQgKi9cbi1cdFx0XHRcdFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcdTAwMjZwdm13KTtcbi1cdFx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcbi1cdFx0XHRcdHRsYl9maW5pc2hfbW11KFx1MDAyNnRsYik7XG4tXHRcdFx0fVxuLVx0XHRcdC8qIE51a2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBlbnRyeSAqL1xuLVx0XHRcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcbi1cdFx0XHRpZiAocHRlX2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbi1cdFx0XHR3cml0YWJsZSA9IHB0ZV93cml0ZShwdGV2YWwpO1xuLVx0XHR9IGVsc2UgaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkge1xuLVx0XHRcdGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCBhZGRyZXNzLCBwZm4pO1xuLVx0XHRcdC8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cnkuICovXG4mIzQzO1x0XHRcdC8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cmllcy4gKi9cbiYjNDM7XHRcdFx0cHRldmFsID0gZ2V0X2FuZF9jbGVhcl9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgbnJfcGFnZXMpO1xuIFx0XHRcdGlmIChzaG91bGRfZGVmZXJfZmx1c2gobW0sIGZsYWdzKSkge1xuIFx0XHRcdFx0LypcbiBcdFx0XHRcdCAqIFdlIGNsZWFyIHRoZSBQVEUgYnV0IGRvIG5vdCBmbHVzaCBzbyBwb3RlbnRpYWxseVxuQEAgLTI1ODYsMTEgJiM0MzsyNzQzLDkgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdFx0ICogdHJhbnNpdGlvbiBvbiBhIGNhY2hlZCBUTEIgZW50cnkgaXMgd3JpdHRlbiB0aHJvdWdoXG4gXHRcdFx0XHQgKiBhbmQgdHJhcHMgaWYgdGhlIFBURSBpcyB1bm1hcHBlZC5cbiBcdFx0XHRcdCAqL1xuLVx0XHRcdFx0cHRldmFsID0gcHRlcF9nZXRfYW5kX2NsZWFyKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSk7XG4tXG4tXHRcdFx0XHRzZXRfdGxiX3ViY19mbHVzaF9wZW5kaW5nKG1tLCBwdGV2YWwsIGFkZHJlc3MsIGFkZHJlc3MgJiM0MzsgUEFHRV9TSVpFKTtcbiYjNDM7XHRcdFx0XHRzZXRfdGxiX3ViY19mbHVzaF9wZW5kaW5nKG1tLCBwdGV2YWwsIGFkZHJlc3MsIGVuZF9hZGRyKTtcbiBcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0cHRldmFsID0gcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcbiYjNDM7XHRcdFx0XHRmbHVzaF90bGJfcmFuZ2Uodm1hLCBhZGRyZXNzLCBlbmRfYWRkcik7XG4gXHRcdFx0fVxuIFx0XHRcdGlmIChwdGVfZGlydHkocHRldmFsKSlcbiBcdFx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuQEAgLTI2MTMsMTQgJiM0MzsyNzY4LDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdFZNX1dBUk5fT05fRk9MSU8oZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pLCBmb2xpbyk7XG4gXG4gXHRcdFx0cHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KHN1YnBhZ2UpKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdFx0aHVnZXRsYl9jb3VudF9zdWIoZm9saW9fbnJfcGFnZXMoZm9saW8pLCBtbSk7XG4tXHRcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsXG4tXHRcdFx0XHRcdFx0aHN6KTtcbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbi1cdFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xuLVx0XHRcdH1cbiYjNDM7XHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbiYjNDM7XHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XG4gXHRcdH0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpIFx1MDAyNlx1MDAyNiBwdGVfdW51c2VkKHB0ZXZhbCkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgIXVzZXJmYXVsdGZkX2FybWVkKHZtYSkpIHtcbiBcdFx0XHQvKlxuQEAgLTI2MzUsOCAmIzQzOzI3ODQsOCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0ICovXG4gXHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRzd3BfZW50cnlfdCBlbnRyeTtcbiBcdFx0XHRwdGVfdCBzd3BfcHRlO1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgaTtcbiBcbiBcdFx0XHQvKlxuIFx0XHRcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cbkBAIC0yNjQ0LDMyICYjNDM7Mjc5MywxNSBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0ICogc28gd2UmIzM5O2xsIG5vdCBjaGVjay9jYXJlLlxuIFx0XHRcdCAqL1xuIFx0XHRcdGlmIChhcmNoX3VubWFwX29uZShtbSwgdm1hLCBhZGRyZXNzLCBwdGV2YWwpIFx1MDAzYyAwKSB7XG4tXHRcdFx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbi1cdFx0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcbi1cdFx0XHRcdFx0XHRcdHB0ZXZhbCwgaHN6KTtcbi1cdFx0XHRcdGVsc2Vcbi1cdFx0XHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XG4tXHRcdFx0XHRyZXQgPSBmYWxzZTtcbi1cdFx0XHRcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4tXHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuJiM0MztcdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbiBcdFx0XHR9XG4gXG4tXHRcdFx0LyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdFx0aWYgKGFub25fZXhjbHVzaXZlIFx1MDAyNlx1MDAyNlxuLVx0XHRcdFx0ICAgIGh1Z2V0bGJfdHJ5X3NoYXJlX2Fub25fcm1hcChmb2xpbykpIHtcbi1cdFx0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcbi1cdFx0XHRcdFx0XHRcdHB0ZXZhbCwgaHN6KTtcbi1cdFx0XHRcdFx0cmV0ID0gZmFsc2U7XG4tXHRcdFx0XHRcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4tXHRcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdFx0fVxuLVx0XHRcdH0gZWxzZSBpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZShmb2xpbywgc3VicGFnZSkpIHtcbi1cdFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xuLVx0XHRcdFx0cmV0ID0gZmFsc2U7XG4tXHRcdFx0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuLVx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xuJiM0MztcdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzKSkge1xuJiM0MztcdFx0XHRcdHNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7XG4mIzQzO1x0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuIFx0XHRcdH1cbiBcbiBcdFx0XHQvKlxuQEAgLTI2NzcsNTIgJiM0MzsyODA5LDQwIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHQgKiBwdGUuIGRvX3N3YXBfcGFnZSgpIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWlncmF0aW9uXG4gXHRcdFx0ICogcHRlIGlzIHJlbW92ZWQgYW5kIHRoZW4gcmVzdGFydCBmYXVsdCBoYW5kbGluZy5cbiBcdFx0XHQgKi9cbi1cdFx0XHRpZiAod3JpdGFibGUpXG4tXHRcdFx0XHRlbnRyeSA9IG1ha2Vfd3JpdGFibGVfbWlncmF0aW9uX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4oc3VicGFnZSkpO1xuLVx0XHRcdGVsc2UgaWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkoXG4tXHRcdFx0XHRcdFx0XHRwYWdlX3RvX3BmbihzdWJwYWdlKSk7XG4tXHRcdFx0ZWxzZVxuLVx0XHRcdFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTtcbi1cdFx0XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4tXHRcdFx0XHRpZiAocHRlX3lvdW5nKHB0ZXZhbCkpXG4tXHRcdFx0XHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoZW50cnkpO1xuLVx0XHRcdFx0aWYgKHB0ZV9kaXJ0eShwdGV2YWwpKVxuLVx0XHRcdFx0XHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTtcbi1cdFx0XHRcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbi1cdFx0XHRcdGlmIChwdGVfc29mdF9kaXJ0eShwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4tXHRcdFx0XHRpZiAocHRlX3VmZmQocHRldmFsKSlcbi1cdFx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xuLVx0XHRcdH0gZWxzZSB7XG4tXHRcdFx0XHRzd3BfcHRlID0gc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSk7XG4tXHRcdFx0XHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcbi1cdFx0XHRcdGlmIChwdGVfc3dwX3VmZmQocHRldmFsKSlcbi1cdFx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xuLVx0XHRcdH1cbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbi1cdFx0XHRcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHN3cF9wdGUsXG4tXHRcdFx0XHRcdFx0aHN6KTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSk7XG4mIzQzO1x0XHRcdHN3cF9wdGUgPSBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKHN1YnBhZ2UsIHB0ZXZhbCxcbiYjNDM7XHRcdFx0XHRcdFx0XHQgd3JpdGFibGUsIGFub25fZXhjbHVzaXZlKTtcbiBcdFx0XHR0cmFjZV9zZXRfbWlncmF0aW9uX3B0ZShhZGRyZXNzLCBwdGVfdmFsKHN3cF9wdGUpLFxuIFx0XHRcdFx0XHRcdGZvbGlvX29yZGVyKGZvbGlvKSk7XG4mIzQzO1xuJiM0MztcdFx0XHQvKiBTZXQgbnJfcGFnZXMgbWlncmF0aW9uIGVudHJpZXMsIGFkdmFuY2luZyB0aGUgUEZOLiAqL1xuJiM0MztcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzICYjNDM7ICh1bnNpZ25lZCBsb25nKWkgKiBQQUdFX1NJWkUsXG4mIzQzO1x0XHRcdFx0XHQgICBwdm13LnB0ZSAmIzQzOyBpLCBzd3BfcHRlKTtcbiYjNDM7XHRcdFx0XHRzd3BfcHRlID0gcHRlX25leHRfc3dwX29mZnNldChzd3BfcHRlKTtcbiYjNDM7XHRcdFx0fVxuIFx0XHRcdC8qXG4gXHRcdFx0ICogTm8gbmVlZCB0byBpbnZhbGlkYXRlIGhlcmUgaXQgd2lsbCBzeW5jaHJvbml6ZSBvblxuIFx0XHRcdCAqIGFnYWluc3QgdGhlIHNwZWNpYWwgc3dhcCBtaWdyYXRpb24gcHRlLlxuIFx0XHRcdCAqL1xuIFx0XHR9XG4gXG4tXHRcdGlmICh1bmxpa2VseShmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSlcbi1cdFx0XHRodWdldGxiX3JlbW92ZV9ybWFwKGZvbGlvKTtcbi1cdFx0ZWxzZVxuLVx0XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZShmb2xpbywgc3VicGFnZSwgdm1hKTtcbiYjNDM7XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xuIFx0XHRpZiAodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9MT0NLRUQpXG4gXHRcdFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcbi1cdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiYjNDM7XHRcdGZvbGlvX3B1dF9yZWZzKGZvbGlvLCBucl9wYWdlcyk7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIElmIHdlIGJhdGNoZWQgdGhlIGVudGlyZSBmb2xpbywgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvXG4mIzQzO1x0XHQgKiB3YWxrOyBzdG9wIHJpZ2h0IGhlcmUuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChucl9wYWdlcyA9PSBmb2xpb19ucl9wYWdlcyhmb2xpbykpXG4mIzQzO1x0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0Y29udGludWU7XG4mIzQzO3dhbGtfYWJvcnQ6XG4mIzQzO1x0XHRyZXQgPSBmYWxzZTtcbiYjNDM7d2Fsa19kb25lOlxuJiM0MztcdFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcdTAwMjZwdm13KTtcbiYjNDM7XHRcdGJyZWFrO1xuIFx0fVxuIFxuIFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFx1MDAyNnJhbmdlKTtcbkBAIC0yNzQxLDcgJiM0MzsyODYxLDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIHZvaWQgdHJ5X3RvX21pZ3JhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHtcbi1cdFx0LnJtYXBfb25lID0gdHJ5X3RvX21pZ3JhdGVfb25lLFxuJiM0MztcdFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSA/XG4mIzQzO1x0XHRcdFx0dHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmUgOiB0cnlfdG9fbWlncmF0ZV9vbmUsXG4gXHRcdC5hcmcgPSAodm9pZCAqKWZsYWdzLFxuIFx0XHQuZG9uZSA9IGZvbGlvX25vdF9tYXBwZWQsXG4gXHRcdC5hbm9uX2xvY2sgPSBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTIgMTM6MTI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUlHUkFUSU9OJiMzNDssCiAgICAmIzM0O0hVR0VUTEJfUEFHRSYjMzQ7LAogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21pZ3JhdGlvbl9wdGVfYmF0Y2gmIzM0OywKICAgICYjMzQ7cmVtb3ZlX21pZ3JhdGlvbl9wdGUmIzM0OywKICAgICYjMzQ7cmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYiYjMzQ7LAogICAgJiMzNDtyZW1vdmVfbWlncmF0aW9uX3B0ZXMmIzM0OywKICAgICYjMzQ7bWFrZV9taWdyYXRpb25fc3dwX3B0ZSYjMzQ7LAogICAgJiMzNDt0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZSYjMzQ7LAogICAgJiMzNDtmb2xpb19taWdyYXRlX3B0ZV9iYXRjaCYjMzQ7LAogICAgJiMzNDt0cnlfdG9fbWlncmF0ZV9vbmUmIzM0OywKICAgICYjMzQ7dHJ5X3RvX21pZ3JhdGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBiYXRjaGluZyBmb3IgbWlncmF0aW9uIFBURXMgdG8gb3B0aW1pemUgbWVtb3J5IG1pZ3JhdGlvbiwgZXNwZWNpYWxseSBmb3IgbGFyZ2UgZm9saW9zLiBJdCBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBpbiBtbS9taWdyYXRlLmMgYW5kIG1tL3JtYXAuYy4gRnV6emluZyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIGJhdGNoaW5nIGxvZ2ljIGNvcnJlY3RseSBoYW5kbGVzIFBURXMsIHBlcm1pc3Npb25zLCBhbmQgZWRnZSBjYXNlcyBsaWtlIGRldmljZSBwcml2YXRlIGZvbGlvcyBvciBodWdldGxiIHBhZ2VzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBjNmUyYmUxZTFhNjFiYmZhODExZDc1YzFkNzcwMmE0ZDk4YzVlODg1CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFN1biBKdWwgMTIgMTM6MTI6MjAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JtYXAuaCBiL2luY2x1ZGUvbGludXgvcm1hcC5oCmluZGV4IDhkYzA4NzFlNWYwMDExLi42NDkyOTQ5MGE3Y2ZjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ybWFwLmgKQEAgLTcwNiwxNyAmIzQzOzcwNiwxOCBAQCBzdGF0aWMgaW5saW5lIGludCBmb2xpb190cnlfZHVwX2Fub25fcm1hcF9wbWQoc3RydWN0IGZvbGlvICpmb2xpbywKIH0KIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19mb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sCi0JCXN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnJfcGFnZXMsIGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbCkKJiM0MzsJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpCiB7CiYjNDM7CS8qIGRldmljZSBwcml2YXRlIGZvbGlvcyBjYW5ub3QgZ2V0IHBpbm5lZCB2aWEgR1VQLiAqLwomIzQzOwljb25zdCBib29sIHBpbm5hYmxlID0gbGlrZWx5KCFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpOwomIzQzOwogCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX0ZPTElPKCFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgZm9saW8pOwogCV9fZm9saW9fcm1hcF9zYW5pdHlfY2hlY2tzKGZvbGlvLCBwYWdlLCBucl9wYWdlcywgbGV2ZWwpOwogCi0JLyogZGV2aWNlIHByaXZhdGUgZm9saW9zIGNhbm5vdCBnZXQgcGlubmVkIHZpYSBHVVAuICovCi0JaWYgKHVubGlrZWx5KGZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSkpIHsKLQkJQ2xlYXJQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTsKLQkJcmV0dXJuIDA7Ci0JfQomIzQzOwkvKiBXZSBvbmx5IGNsZWFyIGFub24tZXhjbHVzaXZlIGZyb20gaGVhZCBwYWdlIG9mIFBNRCBmb2xpbyAqLwomIzQzOwlpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QTUQpCiYjNDM7CQlucl9wYWdlcyA9IDE7CiAKIAkvKgogCSAqIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2hlbiB3ZSBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSwgdGhhdApAQCAtNzYwLDI5ICYjNDM7NzYxLDM4IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLAogCSAqIHNvIHdlIHVzZSBleHBsaWNpdCBvbmVzIGhlcmUuCiAJICovCiAKLQkvKiBQYWlyZWQgd2l0aCB0aGUgbWVtb3J5IGJhcnJpZXIgaW4gdHJ5X2dyYWJfZm9saW8oKS4gKi8KLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpCi0JCXNtcF9tYigpOwomIzQzOwlpZiAocGlubmFibGUpIHsKJiM0MzsJCS8qIFBhaXJlZCB3aXRoIHRoZSBtZW1vcnkgYmFycmllciBpbiB0cnlfZ3JhYl9mb2xpbygpLiAqLwomIzQzOwkJaWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKQomIzQzOwkJCXNtcF9tYigpOwogCi0JaWYgKHVubGlrZWx5KGZvbGlvX21heWJlX2RtYV9waW5uZWQoZm9saW8pKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQlDbGVhclBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpOwomIzQzOwkJaWYgKHVubGlrZWx5KGZvbGlvX21heWJlX2RtYV9waW5uZWQoZm9saW8pKSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZvciAoOzspIHsKJiM0MzsJCUNsZWFyUGFnZUFub25FeGNsdXNpdmUocGFnZSk7CiYjNDM7CQlpZiAoLS1ucl9wYWdlcyA9PSAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJcGFnZSYjNDM7JiM0Mzs7CiYjNDM7CX0KIAogCS8qCiAJICogVGhpcyBpcyBjb25jZXB0dWFsbHkgYSBzbXBfd21iKCkgcGFpcmVkIHdpdGggdGhlIHNtcF9ybWIoKSBpbgogCSAqIGd1cF9tdXN0X3Vuc2hhcmUoKS4KIAkgKi8KLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpCiYjNDM7CWlmIChwaW5uYWJsZSAmYW1wOyZhbXA7IElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKQogCQlzbXBfbWJfX2FmdGVyX2F0b21pYygpOwogCXJldHVybiAwOwogfQogCiAvKioKLSAqIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlIC0gdHJ5IG1hcmtpbmcgYW4gZXhjbHVzaXZlIGFub255bW91cyBwYWdlCi0gKgkJCQkgICBtYXBwZWQgYnkgYSBQVEUgcG9zc2libHkgc2hhcmVkIHRvIHByZXBhcmUKJiM0MzsgKiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMgLSB0cnkgbWFya2luZyBleGNsdXNpdmUgYW5vbnltb3VzIHBhZ2VzCiYjNDM7ICoJCQkJICAgbWFwcGVkIGJ5IFBURXMgcG9zc2libHkgc2hhcmVkIHRvIHByZXBhcmUKICAqCQkJCSAgIGZvciBLU00gb3IgdGVtcG9yYXJ5IHVubWFwcGluZwogICogQGZvbGlvOglUaGUgZm9saW8gdG8gc2hhcmUgYSBtYXBwaW5nIG9mCi0gKiBAcGFnZToJVGhlIG1hcHBlZCBleGNsdXNpdmUgcGFnZQomIzQzOyAqIEBwYWdlOglUaGUgZmlyc3QgbWFwcGVkIGV4Y2x1c2l2ZSBwYWdlIG9mIHRoZSBiYXRjaCBpbiB0aGUgZm9saW8KJiM0MzsgKiBAbnJfcGFnZXM6CVRoZSBudW1iZXIgb2YgcGFnZXMgdG8gc2hhcmUgaW4gdGhlIGZvbGlvIChiYXRjaCBzaXplKQogICoKICAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCB0aGUgcGFnZSB0YWJsZSBsb2NrIGFuZCBoYXMgdG8gaGF2ZSB0aGUgcGFnZSB0YWJsZQogICogZW50cmllcyBjbGVhcmVkL2ludmFsaWRhdGVkLgpAQCAtNzk3LDExICYjNDM7ODA3LDE5IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLAogICoKICAqIFJldHVybnMgMCBpZiBtYXJraW5nIHRoZSBtYXBwZWQgcGFnZSBwb3NzaWJseSBzaGFyZWQgc3VjY2VlZGVkLiBSZXR1cm5zCiAgKiAtRUJVU1kgb3RoZXJ3aXNlLgomIzQzOyAqCiYjNDM7ICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwYWdlIHRhYmxlIGxvY2suCiAgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoc3RydWN0IGZvbGlvICpmb2xpbywKJiM0MzsJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQomIzQzO3sKJiM0MzsJcmV0dXJuIF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChmb2xpbywgcGFnZSwgbnJfcGFnZXMsIFBHVEFCTEVfTEVWRUxfUFRFKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW5saW5lIGludCBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLAogCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlyZXR1cm4gX19mb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKGZvbGlvLCBwYWdlLCAxLCBQR1RBQkxFX0xFVkVMX1BURSk7CiYjNDM7CXJldHVybiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIDEpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IDg3NGJlOTRjZjI1NzBlLi5hOTA3MjFmOGM2ODc3ZSAxMDA2NDQKLS0tIGEvbW0vaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi9tbS9pbnRlcm5hbC5oCkBAIC01MDUsNiAmIzQzOzUwNSwyNiBAQCBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlX3QgcHRlKQogCXJldHVybiBwdGVfbW92ZV9zd3Bfb2Zmc2V0KHB0ZSwgMSk7CiB9CiAKJiM0MztzdGF0aWMgaW5saW5lIGludCBzb2Z0bGVhZl9wdGVfYmF0Y2gocHRlX3QgKnN0YXJ0X3B0ZXAsIGludCBtYXhfbnIsIHB0ZV90IHB0ZSkKJiM0Mzt7CiYjNDM7CXB0ZV90IGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlKTsKJiM0MzsJY29uc3QgcHRlX3QgKmVuZF9wdGVwID0gc3RhcnRfcHRlcCAmIzQzOyBtYXhfbnI7CiYjNDM7CXB0ZV90ICpwdGVwID0gc3RhcnRfcHRlcCAmIzQzOyAxOwomIzQzOwomIzQzOwlWTV9XQVJOX09OKG1heF9uciAmbHQ7IDEpOwomIzQzOwomIzQzOwl3aGlsZSAocHRlcCAmbHQ7IGVuZF9wdGVwKSB7CiYjNDM7CQlwdGUgPSBwdGVwX2dldChwdGVwKTsKJiM0MzsKJiM0MzsJCWlmICghcHRlX3NhbWUocHRlLCBleHBlY3RlZF9wdGUpKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJZXhwZWN0ZWRfcHRlID0gcHRlX25leHRfc3dwX29mZnNldChleHBlY3RlZF9wdGUpOwomIzQzOwkJcHRlcCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHB0ZXAgLSBzdGFydF9wdGVwOwomIzQzO30KJiM0MzsKIC8qKgogICogc3dhcF9wdGVfYmF0Y2ggLSBkZXRlY3QgYSBQVEUgYmF0Y2ggZm9yIGEgc2V0IG9mIGNvbnRpZ3VvdXMgc3dhcCBlbnRyaWVzCiAgKiBAc3RhcnRfcHRlcDogUGFnZSB0YWJsZSBwb2ludGVyIGZvciB0aGUgZmlyc3QgZW50cnkuCkBAIC01MjIsMjMgJiM0Mzs1NDIsOSBAQCBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlX3QgcHRlKQogICovCiBzdGF0aWMgaW5saW5lIGludCBzd2FwX3B0ZV9iYXRjaChwdGVfdCAqc3RhcnRfcHRlcCwgaW50IG1heF9uciwgcHRlX3QgcHRlKQogewotCXB0ZV90IGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlKTsKLQljb25zdCBwdGVfdCAqZW5kX3B0ZXAgPSBzdGFydF9wdGVwICYjNDM7IG1heF9ucjsKLQlwdGVfdCAqcHRlcCA9IHN0YXJ0X3B0ZXAgJiM0MzsgMTsKLQotCVZNX1dBUk5fT04obWF4X25yICZsdDsgMSk7CiAJVk1fV0FSTl9PTighc29mdGxlYWZfaXNfc3dhcChzb2Z0bGVhZl9mcm9tX3B0ZShwdGUpKSk7CiAKLQl3aGlsZSAocHRlcCAmbHQ7IGVuZF9wdGVwKSB7Ci0JCXB0ZSA9IHB0ZXBfZ2V0KHB0ZXApOwotCi0JCWlmICghcHRlX3NhbWUocHRlLCBleHBlY3RlZF9wdGUpKQotCQkJYnJlYWs7Ci0JCWV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQoZXhwZWN0ZWRfcHRlKTsKLQkJcHRlcCYjNDM7JiM0Mzs7Ci0JfQotCi0JcmV0dXJuIHB0ZXAgLSBzdGFydF9wdGVwOwomIzQzOwlyZXR1cm4gc29mdGxlYWZfcHRlX2JhdGNoKHN0YXJ0X3B0ZXAsIG1heF9uciwgcHRlKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfTU1VICovCiAKZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCAyMjJjOGMxNWY3ODJmNy4uNmQwNWQzZjQxMDk1ZDYgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9taWdyYXRlLmMKQEAgLTM0NSw2ICYjNDM7MzQ1LDExMSBAQCBzdHJ1Y3Qgcm1hcF93YWxrX2FyZyB7CiAJYm9vbCBtYXBfdW51c2VkX3RvX3plcm9wYWdlOwogfTsKIAomIzQzOy8qCiYjNDM7ICogRGV0ZWN0IGEgYmF0Y2ggb2YgY29udGlndW91cyBtaWdyYXRpb24gZW50cmllczogY29uc2VjdXRpdmUgKG5vbi1wcmVzZW50KSBQVEVzCiYjNDM7ICogY29udGFpbmluZyBtaWdyYXRpb24gZW50cmllcyB3aXRoIGNvbnNlY3V0aXZlIG9mZnNldHMgYW5kIG1hdGNoaW5nIHB0ZSBiaXRzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlncmF0aW9uX3B0ZV9iYXRjaChzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsCiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvLCBwdGVfdCBmaXJzdF9wdGUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4KQomIzQzO3sKJiM0MzsJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBwdm13LSZndDt2bWE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZW5kX2FkZHIgPSBwbWRfYWRkcl9lbmQocHZtdy0mZ3Q7YWRkcmVzcywgdm1hLSZndDt2bV9lbmQpOwomIzQzOwl1bnNpZ25lZCBpbnQgZm9saW9fbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiYjNDM7CXVuc2lnbmVkIGludCBtYXhfbnI7CiYjNDM7CiYjNDM7CVZNX1dBUk5fT04oIXNvZnRsZWFmX2lzX21pZ3JhdGlvbihzb2Z0bGVhZl9mcm9tX3B0ZShmaXJzdF9wdGUpKSk7CiYjNDM7CiYjNDM7CS8qIEJvdW5kIGJ5IFZNQSAvIFBNRCBlbmQgYW5kIGJ5IHRoZSByZW1haW5pbmcgc3VicGFnZXMgb2YgdGhlIGZvbGlvLiAqLwomIzQzOwltYXhfbnIgPSBtaW4oKGVuZF9hZGRyIC0gcHZtdy0mZ3Q7YWRkcmVzcykgJmd0OyZndDsgUEFHRV9TSElGVCwgZm9saW9fbnIgLSBzdGFydF9pZHgpOwomIzQzOwlpZiAobWF4X25yICZsdDs9IDEpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHNvZnRsZWFmX3B0ZV9iYXRjaChwdm13LSZndDtwdGUsIG1heF9uciwgZmlyc3RfcHRlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHB0ZV90IG1pZ3JhdGlvbl9zb2Z0bGVhZl9lbnRyeV90b19wdGUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKm5ldywKJiM0MzsJCXNvZnRsZWFmX3QgZW50cnksIHB0ZV90IG9sZF9wdGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJcm1hcF90ICpybWFwX2ZsYWdzKQomIzQzO3sKJiM0MzsJcHRlX3QgcHRlID0gbWtfcHRlKG5ldywgUkVBRF9PTkNFKHZtYS0mZ3Q7dm1fcGFnZV9wcm90KSk7CiYjNDM7CiYjNDM7CWlmICghc29mdGxlYWZfaXNfbWlncmF0aW9uX3lvdW5nKGVudHJ5KSkKJiM0MzsJCXB0ZSA9IHB0ZV9ta29sZChwdGUpOwomIzQzOwlpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgJmFtcDsmYW1wOyBzb2Z0bGVhZl9pc19taWdyYXRpb25fZGlydHkoZW50cnkpKQomIzQzOwkJcHRlID0gcHRlX21rZGlydHkocHRlKTsKJiM0MzsJaWYgKHB0ZV9zd3Bfc29mdF9kaXJ0eShvbGRfcHRlKSkKJiM0MzsJCXB0ZSA9IHB0ZV9ta3NvZnRfZGlydHkocHRlKTsKJiM0MzsJZWxzZQomIzQzOwkJcHRlID0gcHRlX2NsZWFyX3NvZnRfZGlydHkocHRlKTsKJiM0MzsKJiM0MzsJaWYgKHNvZnRsZWFmX2lzX21pZ3JhdGlvbl93cml0ZShlbnRyeSkpCiYjNDM7CQlwdGUgPSBwdGVfbWt3cml0ZShwdGUsIHZtYSk7CiYjNDM7CWVsc2UgaWYgKHB0ZV9zd3BfdWZmZChvbGRfcHRlKSkKJiM0MzsJCXB0ZSA9IHB0ZV9ta3VmZmQocHRlKTsKJiM0MzsKJiM0MzsJLyogU2VlIGRvX3N3YXBfcGFnZSgpOiByZXN0b3JlIFBBR0VfTk9ORSBmb3IgUldQICovCiYjNDM7CWlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkgJmFtcDsmYW1wOyB1c2VyZmF1bHRmZF9yd3Aodm1hKSkKJiM0MzsJCXB0ZSA9IHB0ZV9tb2RpZnkocHRlLCBQQUdFX05PTkUpOwomIzQzOwomIzQzOwlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7ICFzb2Z0bGVhZl9pc19taWdyYXRpb25fcmVhZChlbnRyeSkpCiYjNDM7CQkqcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTsKJiM0MzsKJiM0MzsJcmV0dXJuIHB0ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZXN0b3JlIGEgcG90ZW50aWFsIG1pZ3JhdGlvbiBwdGUgdG8gYSB3b3JraW5nIHB0ZSBlbnRyeSBmb3IgaHVnZXRsYiBmb2xpb3MuCiYjNDM7ICovCiYjNDM7I2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKJiM0MztzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiKHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgcm1hcF93YWxrX2FyZyAqcm1hcF93YWxrX2FyZyA9IGFyZzsKJiM0MzsJREVGSU5FX0ZPTElPX1ZNQV9XQUxLKHB2bXcsIHJtYXBfd2Fsa19hcmctJmd0O2ZvbGlvLCB2bWEsIGFkZHIsIFBWTVdfU1lOQyB8IFBWTVdfTUlHUkFUSU9OKTsKJiM0MzsJc3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTsKJiM0MzsJdW5zaWduZWQgaW50IHNoaWZ0ID0gaHVnZV9wYWdlX3NoaWZ0KGgpOwomIzQzOwl1bnNpZ25lZCBsb25nIHBzaXplID0gaHVnZV9wYWdlX3NpemUoaCk7CiYjNDM7CiYjNDM7CWlmIChwYWdlX3ZtYV9tYXBwZWRfd2FsaygmYW1wO3B2bXcpKSB7CiYjNDM7CQlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKJiM0MzsJCXN0cnVjdCBwYWdlICpuZXcgPSBmb2xpb19wYWdlKGZvbGlvLCAwKTsKJiM0MzsJCXB0ZV90IG9sZF9wdGUsIHB0ZTsKJiM0MzsJCXNvZnRsZWFmX3QgZW50cnk7CiYjNDM7CiYjNDM7CQlvbGRfcHRlID0gaHVnZV9wdGVwX2dldCh2bWEtJmd0O3ZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTsKJiM0MzsJCWVudHJ5ID0gc29mdGxlYWZfZnJvbV9wdGUob2xkX3B0ZSk7CiYjNDM7CiYjNDM7CQlmb2xpb19nZXQoZm9saW8pOwomIzQzOwkJcHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSwKJiM0MzsJCQkJCQkgICAgICB2bWEsICZhbXA7cm1hcF9mbGFncyk7CiYjNDM7CQlwdGUgPSBhcmNoX21ha2VfaHVnZV9wdGUocHRlLCBzaGlmdCwgdm1hLSZndDt2bV9mbGFncyk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKJiM0MzsJCQlodWdldGxiX2FkZF9hbm9uX3JtYXAoZm9saW8sIHZtYSwgcHZtdy5hZGRyZXNzLAomIzQzOwkJCQkJICAgICAgcm1hcF9mbGFncyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJaHVnZXRsYl9hZGRfZmlsZV9ybWFwKGZvbGlvKTsKJiM0MzsJCXNldF9odWdlX3B0ZV9hdCh2bWEtJmd0O3ZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsIHBzaXplKTsKJiM0MzsKJiM0MzsJCWlmIChSRUFEX09OQ0Uodm1hLSZndDt2bV9mbGFncykgJmFtcDsgVk1fTE9DS0VEKQomIzQzOwkJCW1sb2NrX2RyYWluX2xvY2FsKCk7CiYjNDM7CiYjNDM7CQl0cmFjZV9yZW1vdmVfbWlncmF0aW9uX3B0ZShwdm13LmFkZHJlc3MsIHB0ZV92YWwocHRlKSwKJiM0MzsJCQkJCSAgIGNvbXBvdW5kX29yZGVyKG5ldykpOwomIzQzOwomIzQzOwkJLyogTm8gbmVlZCB0byBpbnZhbGlkYXRlIC0gaXQgd2FzIG5vbi1wcmVzZW50IGJlZm9yZSAqLwomIzQzOwkJdXBkYXRlX21tdV9jYWNoZSh2bWEsIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsjZWxzZQomIzQzO3N0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGIoc3RydWN0IGZvbGlvICpmb2xpbywKJiM0MzsJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7I2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KJiM0MzsKIC8qCiAgKiBSZXN0b3JlIGEgcG90ZW50aWFsIG1pZ3JhdGlvbiBwdGUgdG8gYSB3b3JraW5nIHB0ZSBlbnRyeQogICovCkBAIC0zNTIsNiAmIzQzOzQ1Nyw3IEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sCiAJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3Qgcm1hcF93YWxrX2FyZyAqcm1hcF93YWxrX2FyZyA9IGFyZzsKJiM0MzsJYm9vbCBpc19kZXZwcml2ID0gZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pOwogCURFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBybWFwX3dhbGtfYXJnLSZndDtmb2xpbywgdm1hLCBhZGRyLCBQVk1XX1NZTkMgfCBQVk1XX01JR1JBVElPTik7CiAKIAl3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoJmFtcDtwdm13KSkgewpAQCAtMzYxLDU2ICYjNDM7NDY3LDQwIEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sCiAJCXNvZnRsZWFmX3QgZW50cnk7CiAJCXN0cnVjdCBwYWdlICpuZXc7CiAJCXVuc2lnbmVkIGxvbmcgaWR4ID0gMDsKJiM0MzsJCXVuc2lnbmVkIGludCBuciA9IDE7CiAKIAkJLyogcGdvZmYgaXMgaW52YWxpZCBmb3Iga3NtIHBhZ2VzLCBidXQgdGhleSBhcmUgbmV2ZXIgbGFyZ2UgKi8KLQkJaWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpCiYjNDM7CQlpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpCiAJCQlpZHggPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIHB2bXcuYWRkcmVzcykgLSBwdm13LnBnb2ZmOwogCQluZXcgPSBmb2xpb19wYWdlKGZvbGlvLCBpZHgpOwogCiAjaWZkZWYgQ09ORklHX0FSQ0hfSEFTX1BNRF9TT0ZUTEVBVkVTCiAJCS8qIFBNRC1tYXBwZWQgVEhQIG1pZ3JhdGlvbiBlbnRyeSAqLwogCQlpZiAoIXB2bXcucHRlKSB7Ci0JCQlWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSB8fAotCQkJCQkhZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7CiYjNDM7CQkJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbyksIGZvbGlvKTsKIAkJCXJlbW92ZV9taWdyYXRpb25fcG1kKCZhbXA7cHZtdywgbmV3KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAjZW5kaWYKLQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpCi0JCQlvbGRfcHRlID0gaHVnZV9wdGVwX2dldCh2bWEtJmd0O3ZtX21tLCBwdm13LmFkZHJlc3MsCi0JCQkJCQlwdm13LnB0ZSk7Ci0JCWVsc2UKLQkJCW9sZF9wdGUgPSBwdGVwX2dldChwdm13LnB0ZSk7CiYjNDM7CQlvbGRfcHRlID0gcHRlcF9nZXQocHZtdy5wdGUpOwogCQlpZiAocm1hcF93YWxrX2FyZy0mZ3Q7bWFwX3VudXNlZF90b196ZXJvcGFnZSAmYW1wOyZhbXA7CiAJCSAgICB0cnlfdG9fbWFwX3VudXNlZF90b196ZXJvcGFnZSgmYW1wO3B2bXcsIGZvbGlvLCBvbGRfcHRlLCBpZHgpKQogCQkJY29udGludWU7CiAKLQkJZm9saW9fZ2V0KGZvbGlvKTsKLQkJcHRlID0gbWtfcHRlKG5ldywgUkVBRF9PTkNFKHZtYS0mZ3Q7dm1fcGFnZV9wcm90KSk7Ci0KIAkJZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3B0ZShvbGRfcHRlKTsKLQkJaWYgKCFzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpKQotCQkJcHRlID0gcHRlX21rb2xkKHB0ZSk7Ci0JCWlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSAmYW1wOyZhbXA7IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSkpCi0JCQlwdGUgPSBwdGVfbWtkaXJ0eShwdGUpOwotCQlpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KG9sZF9wdGUpKQotCQkJcHRlID0gcHRlX21rc29mdF9kaXJ0eShwdGUpOwotCQllbHNlCi0JCQlwdGUgPSBwdGVfY2xlYXJfc29mdF9kaXJ0eShwdGUpOwogCi0JCWlmIChzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpKQotCQkJcHRlID0gcHRlX21rd3JpdGUocHRlLCB2bWEpOwotCQllbHNlIGlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkpCi0JCQlwdGUgPSBwdGVfbWt1ZmZkKHB0ZSk7Ci0KLQkJLyogU2VlIGRvX3N3YXBfcGFnZSgpOiByZXN0b3JlIFBBR0VfTk9ORSBmb3IgUldQICovCi0JCWlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkgJmFtcDsmYW1wOyB1c2VyZmF1bHRmZF9yd3Aodm1hKSkKLQkJCXB0ZSA9IHB0ZV9tb2RpZnkocHRlLCBQQUdFX05PTkUpOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRyeSB0byByZXN0b3JlIG5yJmd0OzEgY29udGlndW91cyBQVEVzIGluIG9uZSBzaG90LiBGYWxscyBiYWNrCiYjNDM7CQkgKiB0byBvcmlnaW5hbCBwZXItUFRFIHBhdGggKG5yPTEpIGlmIGJhdGNoaW5nIGlzIG5vdCBwb3NzaWJsZS4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKCFybWFwX3dhbGtfYXJnLSZndDttYXBfdW51c2VkX3RvX3plcm9wYWdlICZhbXA7JmFtcDsgbGlrZWx5KCFpc19kZXZwcml2KSkKJiM0MzsJCQluciA9IG1pZ3JhdGlvbl9wdGVfYmF0Y2goJmFtcDtwdm13LCBmb2xpbywgb2xkX3B0ZSwgaWR4KTsKIAotCQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7ICFzb2Z0bGVhZl9pc19taWdyYXRpb25fcmVhZChlbnRyeSkpCi0JCQlybWFwX2ZsYWdzIHw9IFJNQVBfRVhDTFVTSVZFOwomIzQzOwkJZm9saW9fcmVmX2FkZChmb2xpbywgbnIpOwomIzQzOwkJcHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSwKJiM0MzsJCQkJCQkgICAgICB2bWEsICZhbXA7cm1hcF9mbGFncyk7CiAKLQkJaWYgKHVubGlrZWx5KGlzX2RldmljZV9wcml2YXRlX3BhZ2UobmV3KSkpIHsKJiM0MzsJCWlmICh1bmxpa2VseShpc19kZXZwcml2KSkgewogCQkJaWYgKHB0ZV93cml0ZShwdGUpKQogCQkJCWVudHJ5ID0gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeSgKIAkJCQkJCQlwYWdlX3RvX3BmbihuZXcpKTsKQEAgLTQyNCwzMCAmIzQzOzUxNCwxMiBAQCBzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLAogCQkJCXB0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHB0ZSk7CiAJCX0KIAotI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKLQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHsKLQkJCXN0cnVjdCBoc3RhdGUgKmggPSBoc3RhdGVfdm1hKHZtYSk7Ci0JCQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaCk7Ci0JCQl1bnNpZ25lZCBsb25nIHBzaXplID0gaHVnZV9wYWdlX3NpemUoaCk7Ci0KLQkJCXB0ZSA9IGFyY2hfbWFrZV9odWdlX3B0ZShwdGUsIHNoaWZ0LCB2bWEtJmd0O3ZtX2ZsYWdzKTsKLQkJCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKQotCQkJCWh1Z2V0bGJfYWRkX2Fub25fcm1hcChmb2xpbywgdm1hLCBwdm13LmFkZHJlc3MsCi0JCQkJCQkgICAgICBybWFwX2ZsYWdzKTsKLQkJCWVsc2UKLQkJCQlodWdldGxiX2FkZF9maWxlX3JtYXAoZm9saW8pOwotCQkJc2V0X2h1Z2VfcHRlX2F0KHZtYS0mZ3Q7dm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIHB0ZSwKLQkJCQkJcHNpemUpOwotCQl9IGVsc2UKLSNlbmRpZgotCQl7Ci0JCQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKLQkJCQlmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZShmb2xpbywgbmV3LCB2bWEsCi0JCQkJCQkJcHZtdy5hZGRyZXNzLCBybWFwX2ZsYWdzKTsKLQkJCWVsc2UKLQkJCQlmb2xpb19hZGRfZmlsZV9ybWFwX3B0ZShmb2xpbywgbmV3LCB2bWEpOwotCQkJc2V0X3B0ZV9hdCh2bWEtJmd0O3ZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUpOwotCQl9CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKJiM0MzsJCQlmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIG5ldywgbnIsIHZtYSwKJiM0MzsJCQkJCQkgcHZtdy5hZGRyZXNzLCBybWFwX2ZsYWdzKTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlmb2xpb19hZGRfZmlsZV9ybWFwX3B0ZXMoZm9saW8sIG5ldywgbnIsIHZtYSk7CiYjNDM7CQlzZXRfcHRlcyh2bWEtJmd0O3ZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsIG5yKTsKIAkJaWYgKFJFQURfT05DRSh2bWEtJmd0O3ZtX2ZsYWdzKSAmYW1wOyBWTV9MT0NLRUQpCiAJCQltbG9ja19kcmFpbl9sb2NhbCgpOwogCkBAIC00NTUsNyAmIzQzOzUyNywxMSBAQCBzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLAogCQkJCQkgICBjb21wb3VuZF9vcmRlcihuZXcpKTsKIAogCQkvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovCi0JCXVwZGF0ZV9tbXVfY2FjaGUodm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTsKJiM0MzsJCXVwZGF0ZV9tbXVfY2FjaGVfcmFuZ2UoTlVMTCwgdm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBucik7CiYjNDM7CiYjNDM7CQkvKiBTa2lwIHRoZSBiYXRjaGVkIFBURXMgKi8KJiM0MzsJCXB2bXcucHRlICYjNDM7PSBuciAtIDE7CiYjNDM7CQlwdm13LmFkZHJlc3MgJiM0Mzs9IChuciAtIDEpICogUEFHRV9TSVpFOwogCX0KIAogCXJldHVybiB0cnVlOwpAQCAtNDc0LDcgJiM0Mzs1NTAsOSBAQCB2b2lkIHJlbW92ZV9taWdyYXRpb25fcHRlcyhzdHJ1Y3QgZm9saW8gKnNyYywgc3RydWN0IGZvbGlvICpkc3QsCiAJfTsKIAogCXN0cnVjdCBybWFwX3dhbGtfY29udHJvbCByd2MgPSB7Ci0JCS5ybWFwX29uZSA9IHJlbW92ZV9taWdyYXRpb25fcHRlLAomIzQzOwkJLnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKHNyYykgPwomIzQzOwkJCQlyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiIDoKJiM0MzsJCQkJcmVtb3ZlX21pZ3JhdGlvbl9wdGUsCiAJCS5hcmcgPSAmYW1wO3JtYXBfd2Fsa19hcmcsCiAJfTsKIApkaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IGU4NTQ2Nzk1NTNiOWMzLi5jZmFjODVmNmY2OGE2OCAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3JtYXAuYwpAQCAtMjQwNSw2ICYjNDM7MjQwNSwyMjkgQEAgdm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpCiAJCXJtYXBfd2Fsayhmb2xpbywgJmFtcDtyd2MpOwogfQogCiYjNDM7LyogQnVpbGQgdGhlIG1pZ3JhdGlvbiBzd2FwIFBURSB0aGF0IHJlcGxhY2VzIHB0ZXZhbCBmb3IgYSBwYWdlLiAqLwomIzQzO3N0YXRpYyBwdGVfdCBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKHN0cnVjdCBwYWdlICpwYWdlLCBwdGVfdCBwdGV2YWwsCiYjNDM7CQlib29sIHdyaXRhYmxlLCBib29sIGFub25fZXhjbHVzaXZlKQomIzQzO3sKJiM0MzsJc3dwX2VudHJ5X3QgZW50cnk7CiYjNDM7CXB0ZV90IHN3cF9wdGU7CiYjNDM7CiYjNDM7CWlmICh3cml0YWJsZSkKJiM0MzsJCWVudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkocGFnZV90b19wZm4ocGFnZSkpOwomIzQzOwllbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSkKJiM0MzsJCWVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KAomIzQzOwkJCQkJCXBhZ2VfdG9fcGZuKHBhZ2UpKTsKJiM0MzsJZWxzZQomIzQzOwkJZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShwYWdlX3RvX3BmbihwYWdlKSk7CiYjNDM7CiYjNDM7CWlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHsKJiM0MzsJCWlmIChwdGVfeW91bmcocHRldmFsKSkKJiM0MzsJCQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X3lvdW5nKGVudHJ5KTsKJiM0MzsJCWlmIChwdGVfZGlydHkocHRldmFsKSkKJiM0MzsJCQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTsKJiM0MzsJCXN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTsKJiM0MzsJCWlmIChwdGVfc29mdF9kaXJ0eShwdGV2YWwpKQomIzQzOwkJCXN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTsKJiM0MzsJCWlmIChwdGVfdWZmZChwdGV2YWwpKQomIzQzOwkJCXN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTsKJiM0MzsJCWlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSkKJiM0MzsJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7CiYjNDM7CQlpZiAocHRlX3N3cF91ZmZkKHB0ZXZhbCkpCiYjNDM7CQkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBzd3BfcHRlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlcGxhY2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBtYXBwaW5nIGZvciBmb2xpbyB3aXRoIG1pZ3JhdGlvbiBlbnRyaWVzLgomIzQzOyAqCiYjNDM7ICogQGFyZzogZW51bSB0dHVfZmxhZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBhcmd1bWVudC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLAomIzQzOwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpOwomIzQzOwlERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgZm9saW8sIHZtYSwgYWRkcmVzcywgMCk7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIGZsYWdzID0gKGVudW0gdHR1X2ZsYWdzKShsb25nKWFyZzsKJiM0MzsJYm9vbCBhbm9uX2V4Y2x1c2l2ZSwgd3JpdGFibGUsIHJldCA9IHRydWU7CiYjNDM7CWJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7CiYjNDM7CXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKJiM0MzsJc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm47CiYjNDM7CXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwlwdGVfdCBwdGV2YWw7CiYjNDM7CiYjNDM7CXJhbmdlLmVuZCA9IHZtYV9hZGRyZXNzX2VuZCgmYW1wO3B2bXcpOwomIzQzOwltbXVfbm90aWZpZXJfcmFuZ2VfaW5pdCgmYW1wO3JhbmdlLCBNTVVfTk9USUZZX0NMRUFSLCAwLCB2bWEtJmd0O3ZtX21tLAomIzQzOwkJCQlhZGRyZXNzLCByYW5nZS5lbmQpOwomIzQzOwkvKiBJZiBzaGFyaW5nIGlzIHBvc3NpYmxlLCBzdGFydCBhbmQgZW5kIHdpbGwgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuICovCiYjNDM7CWFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsICZhbXA7cmFuZ2Uuc3RhcnQsICZhbXA7cmFuZ2UuZW5kKTsKJiM0MzsJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoJmFtcDtyYW5nZSk7CiYjNDM7CiYjNDM7CWlmIChwYWdlX3ZtYV9tYXBwZWRfd2FsaygmYW1wO3B2bXcpKSB7CiYjNDM7CQlhZGRyZXNzID0gcHZtdy5hZGRyZXNzOwomIzQzOwkJcHRldmFsID0gaHVnZV9wdGVwX2dldChtbSwgYWRkcmVzcywgcHZtdy5wdGUpOwomIzQzOwkJaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkKJiM0MzsJCQlwZm4gPSBwdGVfcGZuKHB0ZXZhbCk7CiYjNDM7CQllbHNlCiYjNDM7CQkJcGZuID0gc29mdGxlYWZfdG9fcGZuKHNvZnRsZWFmX2Zyb21fcHRlKHB0ZXZhbCkpOwomIzQzOwomIzQzOwkJcGFnZSA9IGZvbGlvX3BhZ2UoZm9saW8sIHBmbiAtIGZvbGlvX3Bmbihmb2xpbykpOwomIzQzOwkJYW5vbl9leGNsdXNpdmUgPSBhbm9uICZhbXA7JmFtcDsgUGFnZUFub25FeGNsdXNpdmUocGFnZSk7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogaHVnZV9wbWRfdW5zaGFyZSBtYXkgdW5tYXAgYW4gZW50aXJlIFBNRCBwYWdlLiBUaGVyZSBpcyBubwomIzQzOwkJICogd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heSBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sCiYjNDM7CQkgKiBzbyB3ZSBtdXN0IGZsdXNoIHRoZW0gYWxsLiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkCiYjNDM7CQkgKiBhYm92ZSB0byBjb3ZlciB0aGlzIHJhbmdlLgomIzQzOwkJICovCiYjNDM7CQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRvIGNhbGwgaHVnZV9wbWRfdW5zaGFyZSwgaV9tbWFwX3J3c2VtIG11c3QgYmUgaGVsZCBpbiB3cml0ZQomIzQzOwkJICogbW9kZS4gQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkgZG8gdGhpcyBvdXRzaWRlIHJtYXAKJiM0MzsJCSAqIHJvdXRpbmVzLiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuCiYjNDM7CQkgKiBMb2NrIG9yZGVyIGRpY3RhdGVzIGFjcXVpcmluZyB2bWFfbG9jayBCRUZPUkUgaV9tbWFwX3J3c2VtLgomIzQzOwkJICogV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmQgZmFpbCBpZiB1bnN1Y2Nlc3NmdWwuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghYW5vbikgewomIzQzOwkJCXN0cnVjdCBtbXVfZ2F0aGVyIHRsYjsKJiM0MzsKJiM0MzsJCQlWTV9XQVJOX09OX09OQ0UoIShmbGFncyAmYW1wOyBUVFVfUk1BUF9MT0NLRUQpKTsKJiM0MzsJCQlpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSkgewomIzQzOwkJCQlyZXQgPSBmYWxzZTsKJiM0MzsJCQkJZ290byB3YWxrX2RvbmU7CiYjNDM7CQkJfQomIzQzOwomIzQzOwkJCXRsYl9nYXRoZXJfbW11X3ZtYSgmYW1wO3RsYiwgdm1hKTsKJiM0MzsJCQlpZiAoaHVnZV9wbWRfdW5zaGFyZSgmYW1wO3RsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHsKJiM0MzsJCQkJaHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7CiYjNDM7CQkJCWh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goJmFtcDt0bGIsIHZtYSk7CiYjNDM7CQkJCXRsYl9maW5pc2hfbW11KCZhbXA7dGxiKTsKJiM0MzsJCQkJLyoKJiM0MzsJCQkJICogVGhlIFBNRCB0YWJsZSB3YXMgdW5tYXBwZWQsCiYjNDM7CQkJCSAqIGNvbnNlcXVlbnRseSB1bm1hcHBpbmcgdGhlIGZvbGlvLgomIzQzOwkJCQkgKi8KJiM0MzsJCQkJZ290byB3YWxrX2RvbmU7CiYjNDM7CQkJfQomIzQzOwkJCWh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpOwomIzQzOwkJCXRsYl9maW5pc2hfbW11KCZhbXA7dGxiKTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qIE51a2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBlbnRyeSAqLwomIzQzOwkJcHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpOwomIzQzOwkJaWYgKGh1Z2VfcHRlX2RpcnR5KHB0ZXZhbCkpCiYjNDM7CQkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7CiYjNDM7CQl3cml0YWJsZSA9IHB0ZV93cml0ZShwdGV2YWwpOwomIzQzOwomIzQzOwkJVk1fV0FSTl9PTl9GT0xJTyh3cml0YWJsZSAmYW1wOyZhbXA7IGFub24gJmFtcDsmYW1wOyAhYW5vbl9leGNsdXNpdmUsIGZvbGlvKTsKJiM0MzsKJiM0MzsJCWlmIChQYWdlSFdQb2lzb24ocGFnZSkpIHsKJiM0MzsJCQlwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpOwomIzQzOwkJCWh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pOwomIzQzOwkJCXNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgaHN6KTsKJiM0MzsJCX0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpICZhbXA7JmFtcDsgcHRlX3VudXNlZChwdGV2YWwpICZhbXA7JmFtcDsKJiM0MzsJCQkgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkgewomIzQzOwkJCS8qCiYjNDM7CQkJICogVGhlIGd1ZXN0IGluZGljYXRlZCB0aGF0IHRoZSBwYWdlIGNvbnRlbnQgaXMgb2Ygbm8KJiM0MzsJCQkgKiBpbnRlcmVzdCBhbnltb3JlLiBTaW1wbHkgZGlzY2FyZCB0aGUgcHRlLCB2bXNjYW4KJiM0MzsJCQkgKiB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdC4KJiM0MzsJCQkgKi8KJiM0MzsJCQlkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpOwomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQlwdGVfdCBzd3BfcHRlOwomIzQzOwomIzQzOwkJCS8qCiYjNDM7CQkJICogYXJjaF91bm1hcF9vbmUoKSBpcyBleHBlY3RlZCB0byBiZSBhIE5PUCBvbgomIzQzOwkJCSAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgd2UgY291bGQgaGF2ZSBQRk4gc3dhcCBQVEVzLAomIzQzOwkJCSAqIHNvIHdlJiMzOTtsbCBub3QgY2hlY2svY2FyZS4KJiM0MzsJCQkgKi8KJiM0MzsJCQlpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSAmbHQ7IDApIHsKJiM0MzsJCQkJc2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwKJiM0MzsJCQkJCQlwdGV2YWwsIGhzeik7CiYjNDM7CQkJCXJldCA9IGZhbHNlOwomIzQzOwkJCQlnb3RvIHdhbGtfZG9uZTsKJiM0MzsJCQl9CiYjNDM7CiYjNDM7CQkJLyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKCk6IGNsZWFyIFBURSBmaXJzdC4gKi8KJiM0MzsJCQlpZiAoYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwomIzQzOwkJCSAgICBodWdldGxiX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8pKSB7CiYjNDM7CQkJCXNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsCiYjNDM7CQkJCQkJcHRldmFsLCBoc3opOwomIzQzOwkJCQlyZXQgPSBmYWxzZTsKJiM0MzsJCQkJZ290byB3YWxrX2RvbmU7CiYjNDM7CQkJfQomIzQzOwomIzQzOwkJCS8qCiYjNDM7CQkJICogU3RvcmUgdGhlIHBmbiBvZiB0aGUgcGFnZSBpbiBhIHNwZWNpYWwgbWlncmF0aW9uCiYjNDM7CQkJICogcHRlLiBkb19zd2FwX3BhZ2UoKSB3aWxsIHdhaXQgdW50aWwgdGhlIG1pZ3JhdGlvbgomIzQzOwkJCSAqIHB0ZSBpcyByZW1vdmVkIGFuZCB0aGVuIHJlc3RhcnQgZmF1bHQgaGFuZGxpbmcuCiYjNDM7CQkJICovCiYjNDM7CQkJc3dwX3B0ZSA9IG1ha2VfbWlncmF0aW9uX3N3cF9wdGUocGFnZSwgcHRldmFsLAomIzQzOwkJCQkJCQkgd3JpdGFibGUsIGFub25fZXhjbHVzaXZlKTsKJiM0MzsJCQlzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlLCBoc3opOwomIzQzOwkJCXRyYWNlX3NldF9taWdyYXRpb25fcHRlKGFkZHJlc3MsIHB0ZV92YWwoc3dwX3B0ZSksCiYjNDM7CQkJCQkJZm9saW9fb3JkZXIoZm9saW8pKTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pOwomIzQzOwkJaWYgKHZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fTE9DS0VEKQomIzQzOwkJCW1sb2NrX2RyYWluX2xvY2FsKCk7CiYjNDM7CQlmb2xpb19wdXQoZm9saW8pOwomIzQzO3dhbGtfZG9uZToKJiM0MzsJCXBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoJmFtcDtwdm13KTsKJiM0MzsJfQomIzQzOwomIzQzOwltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9lbmQoJmFtcDtyYW5nZSk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsIHB0ZV90IHB0ZSwKJiM0MzsJCXN0cnVjdCBwYWdlICpzdWJwYWdlLCBib29sIGFub25fZXhjbHVzaXZlKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBlbmRfYWRkciwgYWRkciA9IHB2bXctJmd0O2FkZHJlc3M7CiYjNDM7CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gcHZtdy0mZ3Q7dm1hOwomIzQzOwl1bnNpZ25lZCBpbnQgbWF4X25yLCBuciwgaTsKJiM0MzsKJiM0MzsjaWZkZWYgX19IQVZFX0FSQ0hfVU5NQVBfT05FCiYjNDM7CS8qIENhbm5vdCBiYXRjaCB1bm1hcCBpZiBhcmNoX3VubWFwX29uZSgpIGlzIGRlZmluZWQuICovCiYjNDM7CXJldHVybiAxOwomIzQzOyNlbmRpZgomIzQzOwomIzQzOwlpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CWlmIChmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHwgZm9saW9fdGVzdF9oYXNfaHdwb2lzb25lZChmb2xpbykpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsJaWYgKHB0ZV91bnVzZWQocHRlKSkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwkvKiBXZSBtYXkgb25seSBiYXRjaCB3aXRoaW4gYSBzaW5nbGUgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLiAqLwomIzQzOwllbmRfYWRkciA9IHBtZF9hZGRyX2VuZChhZGRyLCB2bWEtJmd0O3ZtX2VuZCk7CiYjNDM7CW1heF9uciA9IChlbmRfYWRkciAtIGFkZHIpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CS8qCiYjNDM7CSAqIElmIHVubWFwIGZhaWxzLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHB0ZXMuIFRvIGF2b2lkIGFjY2lkZW50YWxseQomIzQzOwkgKiB1cGdyYWRpbmcgd3JpdGUgcGVybWlzc2lvbnMgZm9yIHB0ZXMgdGhhdCB3ZXJlIG5vdCBvcmlnaW5hbGx5IHdyaXRhYmxlLAomIzQzOwkgKiBhbmQgdG8gYXZvaWQgbG9zaW5nIHRoZSBzb2Z0LWRpcnR5IGJpdCwgdXNlIHRoZSBhcHByb3ByaWF0ZSBGUEIgZmxhZ3MuCiYjNDM7CSAqLwomIzQzOwluciA9IGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdm13LSZndDtwdGUsICZhbXA7cHRlLCBtYXhfbnIsCiYjNDM7CQkJCSAgIEZQQl9SRVNQRUNUX1dSSVRFIHwgRlBCX1JFU1BFQ1RfU09GVF9ESVJUWSk7CiYjNDM7CiYjNDM7CS8qIExpbWl0IHBvc3NpYmxlIGJhdGNoIGNvdW50IHRvIGEgdW5pZm9ybSBQYWdlQW5vbkV4Y2x1c2l2ZSB2YWx1ZSAqLwomIzQzOwlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkgewomIzQzOwkJZm9yIChpID0gMTsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlpZiAoUGFnZUFub25FeGNsdXNpdmUoc3VicGFnZSAmIzQzOyBpKSAhPSBhbm9uX2V4Y2x1c2l2ZSkKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQluciA9IGk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIG5yOwomIzQzO30KJiM0MzsKIC8qCiAgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50LgogICoKQEAgLTI0MjEsOCAmIzQzOzI2NDQsNyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJc3RydWN0IHBhZ2UgKnN1YnBhZ2U7CiAJc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTsKIAllbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7Ci0JdW5zaWduZWQgbG9uZyBwZm47Ci0JdW5zaWduZWQgbG9uZyBoc3ogPSAwOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbiwgZW5kX2FkZHIsIG5yX3BhZ2VzOwogCiAJLyoKIAkgKiBXaGVuIHJhY2luZyBhZ2FpbnN0IGUuZy4gemFwX3B0ZV9yYW5nZSgpIG9uIGFub3RoZXIgY3B1LApAQCAtMjQzNSwyNiAmIzQzOzI2NTcsMTMgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCiAJLyoKIAkgKiBGb3IgVEhQLCB3ZSBoYXZlIHRvIGFzc3VtZSB0aGUgd29yc2UgY2FzZSBpZSBwbWQgZm9yIGludmFsaWRhdGlvbi4KLQkgKiBGb3IgaHVnZXRsYiwgaXQgY291bGQgYmUgbXVjaCB3b3JzZSBpZiB3ZSBuZWVkIHRvIGRvIHB1ZAotCSAqIGludmFsaWRhdGlvbiBpbiB0aGUgY2FzZSBvZiBwbWQgc2hhcmluZy4KIAkgKgogCSAqIE5vdGUgdGhhdCB0aGUgcGFnZSBjYW4gbm90IGJlIGZyZWUgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mCi0JICogdHJ5X3RvX3VubWFwKCkgbXVzdCBob2xkIGEgcmVmZXJlbmNlIG9uIHRoZSBwYWdlLgomIzQzOwkgKiB0cnlfdG9fbWlncmF0ZSgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS4KIAkgKi8KIAlyYW5nZS5lbmQgPSB2bWFfYWRkcmVzc19lbmQoJmFtcDtwdm13KTsKIAltbXVfbm90aWZpZXJfcmFuZ2VfaW5pdCgmYW1wO3JhbmdlLCBNTVVfTk9USUZZX0NMRUFSLCAwLCB2bWEtJmd0O3ZtX21tLAogCQkJCWFkZHJlc3MsIHJhbmdlLmVuZCk7Ci0JaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHsKLQkJLyoKLQkJICogSWYgc2hhcmluZyBpcyBwb3NzaWJsZSwgc3RhcnQgYW5kIGVuZCB3aWxsIGJlIGFkanVzdGVkCi0JCSAqIGFjY29yZGluZ2x5LgotCQkgKi8KLQkJYWRqdXN0X3JhbmdlX2lmX3BtZF9zaGFyaW5nX3Bvc3NpYmxlKHZtYSwgJmFtcDtyYW5nZS5zdGFydCwKLQkJCQkJCSAgICAgJmFtcDtyYW5nZS5lbmQpOwotCi0JCS8qIFdlIG5lZWQgdGhlIGh1Z2UgcGFnZSBzaXplIGZvciBzZXRfaHVnZV9wdGVfYXQoKSAqLwotCQloc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpOwotCX0KIAltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydCgmYW1wO3JhbmdlKTsKIAogCXdoaWxlIChwYWdlX3ZtYV9tYXBwZWRfd2FsaygmYW1wO3B2bXcpKSB7CkBAIC0yNDg4LDExICYjNDM7MjY5Nyw4IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCVZNX0JVR19PTl9GT0xJTyhmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pIHx8CiAJCQkJCSFmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbyksIGZvbGlvKTsKIAotCQkJaWYgKHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KCZhbXA7cHZtdywgc3VicGFnZSkpIHsKLQkJCQlyZXQgPSBmYWxzZTsKLQkJCQlwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKCZhbXA7cHZtdyk7Ci0JCQkJYnJlYWs7Ci0JCQl9CiYjNDM7CQkJaWYgKHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KCZhbXA7cHZtdywgc3VicGFnZSkpCiYjNDM7CQkJCWdvdG8gd2Fsa19hYm9ydDsKIAkJCWNvbnRpbnVlOwogI2VuZGlmCiAJCX0KQEAgLTI1MDEsMTAgJiM0MzsyNzA3LDcgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlWTV9CVUdfT05fRk9MSU8oIXB2bXcucHRlLCBmb2xpbyk7CiAKIAkJYWRkcmVzcyA9IHB2bXcuYWRkcmVzczsKLQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpCi0JCQlwdGV2YWwgPSBodWdlX3B0ZXBfZ2V0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSk7Ci0JCWVsc2UKLQkJCXB0ZXZhbCA9IHB0ZXBfZ2V0KHB2bXcucHRlKTsKJiM0MzsJCXB0ZXZhbCA9IHB0ZXBfZ2V0KHB2bXcucHRlKTsKIAkJaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkgewogCQkJcGZuID0gcHRlX3BmbihwdGV2YWwpOwogCQl9IGVsc2UgewpAQCAtMjUxNSw2OCAmIzQzOzI3MTgsMjIgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJY29uc3Qgc29mdGxlYWZfdCBlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKHB0ZXZhbCk7CiAKIAkJCXBmbiA9IHNvZnRsZWFmX3RvX3BmbihlbnRyeSk7Ci0JCQlWTV9XQVJOX09OX0ZPTElPKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbyksIGZvbGlvKTsKIAkJfQogCiAJCXN1YnBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTsKIAkJYW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsKIAkJCQkgUGFnZUFub25FeGNsdXNpdmUoc3VicGFnZSk7CiAKLQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHsKLQkJCWJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7Ci0KLQkJCS8qCi0JCQkgKiBodWdlX3BtZF91bnNoYXJlIG1heSB1bm1hcCBhbiBlbnRpcmUgUE1EIHBhZ2UuCi0JCQkgKiBUaGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5Ci0JCQkgKiBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sIHNvIHdlIG11c3QgZmx1c2ggdGhlbSBhbGwuCi0JCQkgKiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkIGFib3ZlIHRvIGNvdmVyIHRoaXMKLQkJCSAqIHJhbmdlLgotCQkJICovCi0JCQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpOwotCi0JCQkvKgotCQkJICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZQotCQkJICogaGVsZCBpbiB3cml0ZSBtb2RlLiAgQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkKLQkJCSAqIGRvIHRoaXMgb3V0c2lkZSBybWFwIHJvdXRpbmVzLgotCQkJICoKLQkJCSAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS4KLQkJCSAqIExvY2sgb3JkZXIgZGljdGF0ZXMgYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRQotCQkJICogaV9tbWFwX3J3c2VtLiAgV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmQKLQkJCSAqIGZhaWwgaWYgdW5zdWNjZXNzZnVsLgotCQkJICovCi0JCQlpZiAoIWFub24pIHsKLQkJCQlzdHJ1Y3QgbW11X2dhdGhlciB0bGI7CiYjNDM7CQlucl9wYWdlcyA9IDE7CiYjNDM7CQlpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7CiYjNDM7CQkJbnJfcGFnZXMgPSBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaChmb2xpbywgJmFtcDtwdm13LCBwdGV2YWwsCiYjNDM7CQkJCQkJCSAgIHN1YnBhZ2UsIGFub25fZXhjbHVzaXZlKTsKIAotCQkJCVZNX0JVR19PTighKGZsYWdzICZhbXA7IFRUVV9STUFQX0xPQ0tFRCkpOwotCQkJCWlmICghaHVnZXRsYl92bWFfdHJ5bG9ja193cml0ZSh2bWEpKSB7Ci0JCQkJCXBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoJmFtcDtwdm13KTsKLQkJCQkJcmV0ID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KJiM0MzsJCQllbmRfYWRkciA9IGFkZHJlc3MgJiM0MzsgbnJfcGFnZXMgKiBQQUdFX1NJWkU7CiYjNDM7CQkJZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBhZGRyZXNzLCBlbmRfYWRkcik7CiAKLQkJCQl0bGJfZ2F0aGVyX21tdV92bWEoJmFtcDt0bGIsIHZtYSk7Ci0JCQkJaWYgKGh1Z2VfcG1kX3Vuc2hhcmUoJmFtcDt0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7Ci0JCQkJCWh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpOwotCQkJCQlodWdlX3BtZF91bnNoYXJlX2ZsdXNoKCZhbXA7dGxiLCB2bWEpOwotCQkJCQl0bGJfZmluaXNoX21tdSgmYW1wO3RsYik7Ci0JCQkJCS8qCi0JCQkJCSAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLAotCQkJCQkgKiBjb25zZXF1ZW50bHkgdW5tYXBwaW5nIHRoZSBmb2xpby4KLQkJCQkJICovCi0JCQkJCXBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoJmFtcDtwdm13KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpOwotCQkJCXRsYl9maW5pc2hfbW11KCZhbXA7dGxiKTsKLQkJCX0KLQkJCS8qIE51a2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBlbnRyeSAqLwotCQkJcHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpOwotCQkJaWYgKHB0ZV9kaXJ0eShwdGV2YWwpKQotCQkJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwotCQkJd3JpdGFibGUgPSBwdGVfd3JpdGUocHRldmFsKTsKLQkJfSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHsKLQkJCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLCBhZGRyZXNzLCBwZm4pOwotCQkJLyogTnVrZSB0aGUgcGFnZSB0YWJsZSBlbnRyeS4gKi8KJiM0MzsJCQkvKiBOdWtlIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuICovCiYjNDM7CQkJcHRldmFsID0gZ2V0X2FuZF9jbGVhcl9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgbnJfcGFnZXMpOwogCQkJaWYgKHNob3VsZF9kZWZlcl9mbHVzaChtbSwgZmxhZ3MpKSB7CiAJCQkJLyoKIAkJCQkgKiBXZSBjbGVhciB0aGUgUFRFIGJ1dCBkbyBub3QgZmx1c2ggc28gcG90ZW50aWFsbHkKQEAgLTI1ODYsMTEgJiM0MzsyNzQzLDkgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCSAqIHRyYW5zaXRpb24gb24gYSBjYWNoZWQgVExCIGVudHJ5IGlzIHdyaXR0ZW4gdGhyb3VnaAogCQkJCSAqIGFuZCB0cmFwcyBpZiB0aGUgUFRFIGlzIHVubWFwcGVkLgogCQkJCSAqLwotCQkJCXB0ZXZhbCA9IHB0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgYWRkcmVzcywgcHZtdy5wdGUpOwotCi0JCQkJc2V0X3RsYl91YmNfZmx1c2hfcGVuZGluZyhtbSwgcHRldmFsLCBhZGRyZXNzLCBhZGRyZXNzICYjNDM7IFBBR0VfU0laRSk7CiYjNDM7CQkJCXNldF90bGJfdWJjX2ZsdXNoX3BlbmRpbmcobW0sIHB0ZXZhbCwgYWRkcmVzcywgZW5kX2FkZHIpOwogCQkJfSBlbHNlIHsKLQkJCQlwdGV2YWwgPSBwdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpOwomIzQzOwkJCQlmbHVzaF90bGJfcmFuZ2Uodm1hLCBhZGRyZXNzLCBlbmRfYWRkcik7CiAJCQl9CiAJCQlpZiAocHRlX2RpcnR5KHB0ZXZhbCkpCiAJCQkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7CkBAIC0yNjEzLDE0ICYjNDM7Mjc2OCw4IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCVZNX1dBUk5fT05fRk9MSU8oZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pLCBmb2xpbyk7CiAKIAkJCXB0ZXZhbCA9IHN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShzdWJwYWdlKSk7Ci0JCQlpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkgewotCQkJCWh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pOwotCQkJCXNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwKLQkJCQkJCWhzeik7Ci0JCQl9IGVsc2UgewotCQkJCWRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7Ci0JCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7Ci0JCQl9CiYjNDM7CQkJZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTsKJiM0MzsJCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTsKIAkJfSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgJmFtcDsmYW1wOyBwdGVfdW51c2VkKHB0ZXZhbCkgJmFtcDsmYW1wOwogCQkJICAgIXVzZXJmYXVsdGZkX2FybWVkKHZtYSkpIHsKIAkJCS8qCkBAIC0yNjM1LDggJiM0MzsyNzg0LDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJICovCiAJCQlkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpOwogCQl9IGVsc2UgewotCQkJc3dwX2VudHJ5X3QgZW50cnk7CiAJCQlwdGVfdCBzd3BfcHRlOwomIzQzOwkJCXVuc2lnbmVkIGludCBpOwogCiAJCQkvKgogCQkJICogYXJjaF91bm1hcF9vbmUoKSBpcyBleHBlY3RlZCB0byBiZSBhIE5PUCBvbgpAQCAtMjY0NCwzMiAmIzQzOzI3OTMsMTUgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJICogc28gd2UmIzM5O2xsIG5vdCBjaGVjay9jYXJlLgogCQkJICovCiAJCQlpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSAmbHQ7IDApIHsKLQkJCQlpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkKLQkJCQkJc2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwKLQkJCQkJCQlwdGV2YWwsIGhzeik7Ci0JCQkJZWxzZQotCQkJCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTsKLQkJCQlyZXQgPSBmYWxzZTsKLQkJCQlwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKCZhbXA7cHZtdyk7Ci0JCQkJYnJlYWs7CiYjNDM7CQkJCXNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7CiYjNDM7CQkJCWdvdG8gd2Fsa19hYm9ydDsKIAkJCX0KIAotCQkJLyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKCk6IGNsZWFyIFBURSBmaXJzdC4gKi8KLQkJCWlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7Ci0JCQkJaWYgKGFub25fZXhjbHVzaXZlICZhbXA7JmFtcDsKLQkJCQkgICAgaHVnZXRsYl90cnlfc2hhcmVfYW5vbl9ybWFwKGZvbGlvKSkgewotCQkJCQlzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLAotCQkJCQkJCXB0ZXZhbCwgaHN6KTsKLQkJCQkJcmV0ID0gZmFsc2U7Ci0JCQkJCXBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoJmFtcDtwdm13KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSAmYW1wOyZhbXA7Ci0JCQkJICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoZm9saW8sIHN1YnBhZ2UpKSB7Ci0JCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7Ci0JCQkJcmV0ID0gZmFsc2U7Ci0JCQkJcGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZSgmYW1wO3B2bXcpOwotCQkJCWJyZWFrOwomIzQzOwkJCS8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoKTogY2xlYXIgUFRFIGZpcnN0LiAqLwomIzQzOwkJCWlmIChhbm9uX2V4Y2x1c2l2ZSAmYW1wOyZhbXA7CiYjNDM7CQkJICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhmb2xpbywgc3VicGFnZSwgbnJfcGFnZXMpKSB7CiYjNDM7CQkJCXNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7CiYjNDM7CQkJCWdvdG8gd2Fsa19hYm9ydDsKIAkJCX0KIAogCQkJLyoKQEAgLTI2NzcsNTIgJiM0MzsyODA5LDQwIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCSAqIHB0ZS4gZG9fc3dhcF9wYWdlKCkgd2lsbCB3YWl0IHVudGlsIHRoZSBtaWdyYXRpb24KIAkJCSAqIHB0ZSBpcyByZW1vdmVkIGFuZCB0aGVuIHJlc3RhcnQgZmF1bHQgaGFuZGxpbmcuCiAJCQkgKi8KLQkJCWlmICh3cml0YWJsZSkKLQkJCQllbnRyeSA9IG1ha2Vfd3JpdGFibGVfbWlncmF0aW9uX2VudHJ5KAotCQkJCQkJCXBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTsKLQkJCWVsc2UgaWYgKGFub25fZXhjbHVzaXZlKQotCQkJCWVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KAotCQkJCQkJCXBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTsKLQkJCWVsc2UKLQkJCQllbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KAotCQkJCQkJCXBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTsKLQkJCWlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHsKLQkJCQlpZiAocHRlX3lvdW5nKHB0ZXZhbCkpCi0JCQkJCWVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoZW50cnkpOwotCQkJCWlmIChwdGVfZGlydHkocHRldmFsKSkKLQkJCQkJZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShlbnRyeSk7Ci0JCQkJc3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpOwotCQkJCWlmIChwdGVfc29mdF9kaXJ0eShwdGV2YWwpKQotCQkJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7Ci0JCQkJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpCi0JCQkJCXN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpOwotCQkJCWlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSkKLQkJCQkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpOwotCQkJCWlmIChwdGVfc3dwX3VmZmQocHRldmFsKSkKLQkJCQkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpOwotCQkJfQotCQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpCi0JCQkJc2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSwKLQkJCQkJCWhzeik7Ci0JCQllbHNlCi0JCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHN3cF9wdGUpOwomIzQzOwkJCXN3cF9wdGUgPSBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKHN1YnBhZ2UsIHB0ZXZhbCwKJiM0MzsJCQkJCQkJIHdyaXRhYmxlLCBhbm9uX2V4Y2x1c2l2ZSk7CiAJCQl0cmFjZV9zZXRfbWlncmF0aW9uX3B0ZShhZGRyZXNzLCBwdGVfdmFsKHN3cF9wdGUpLAogCQkJCQkJZm9saW9fb3JkZXIoZm9saW8pKTsKJiM0MzsKJiM0MzsJCQkvKiBTZXQgbnJfcGFnZXMgbWlncmF0aW9uIGVudHJpZXMsIGFkdmFuY2luZyB0aGUgUEZOLiAqLwomIzQzOwkJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcyAmIzQzOyAodW5zaWduZWQgbG9uZylpICogUEFHRV9TSVpFLAomIzQzOwkJCQkJICAgcHZtdy5wdGUgJiM0MzsgaSwgc3dwX3B0ZSk7CiYjNDM7CQkJCXN3cF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHN3cF9wdGUpOwomIzQzOwkJCX0KIAkJCS8qCiAJCQkgKiBObyBuZWVkIHRvIGludmFsaWRhdGUgaGVyZSBpdCB3aWxsIHN5bmNocm9uaXplIG9uCiAJCQkgKiBhZ2FpbnN0IHRoZSBzcGVjaWFsIHN3YXAgbWlncmF0aW9uIHB0ZS4KIAkJCSAqLwogCQl9CiAKLQkJaWYgKHVubGlrZWx5KGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpKQotCQkJaHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7Ci0JCWVsc2UKLQkJCWZvbGlvX3JlbW92ZV9ybWFwX3B0ZShmb2xpbywgc3VicGFnZSwgdm1hKTsKJiM0MzsJCWZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpOwogCQlpZiAodm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9MT0NLRUQpCiAJCQltbG9ja19kcmFpbl9sb2NhbCgpOwotCQlmb2xpb19wdXQoZm9saW8pOwomIzQzOwkJZm9saW9fcHV0X3JlZnMoZm9saW8sIG5yX3BhZ2VzKTsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBJZiB3ZSBiYXRjaGVkIHRoZSBlbnRpcmUgZm9saW8sIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0bwomIzQzOwkJICogd2Fsazsgc3RvcCByaWdodCBoZXJlLgomIzQzOwkJICovCiYjNDM7CQlpZiAobnJfcGFnZXMgPT0gZm9saW9fbnJfcGFnZXMoZm9saW8pKQomIzQzOwkJCWdvdG8gd2Fsa19kb25lOwomIzQzOwkJY29udGludWU7CiYjNDM7d2Fsa19hYm9ydDoKJiM0MzsJCXJldCA9IGZhbHNlOwomIzQzO3dhbGtfZG9uZToKJiM0MzsJCXBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoJmFtcDtwdm13KTsKJiM0MzsJCWJyZWFrOwogCX0KIAogCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZCgmYW1wO3JhbmdlKTsKQEAgLTI3NDEsNyAmIzQzOzI4NjEsOCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiB2b2lkIHRyeV90b19taWdyYXRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIGVudW0gdHR1X2ZsYWdzIGZsYWdzKQogewogCXN0cnVjdCBybWFwX3dhbGtfY29udHJvbCByd2MgPSB7Ci0JCS5ybWFwX29uZSA9IHRyeV90b19taWdyYXRlX29uZSwKJiM0MzsJCS5ybWFwX29uZSA9IGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgPwomIzQzOwkJCQl0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZSA6IHRyeV90b19taWdyYXRlX29uZSwKIAkJLmFyZyA9ICh2b2lkICopZmxhZ3MsCiAJCS5kb25lID0gZm9saW9fbm90X21hcHBlZCwKIAkJLmFub25fbG9jayA9IGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCwKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTIgMTM6MTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQzMDAKCQkJCQkJCW91dHB1dDogOTkKCQkJCQkJCXRob3VnaHRzOiAyOTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgZ290IHRoaXMgcGF0Y2ggaW4gZnJvbnQgb2YgbWUsIGFuZCBpdCBsb29rcyBsaWtlIGEgZmFpcmx5IHNpZ25pZmljYW50IGNoYW5nZSB0byB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLCBmb2N1c2luZyBvbiBgcm1hcC5jYCBhbmQgYG1pZ3JhdGUuY2AuIFNwZWNpZmljYWxseSwgaXQmIzM5O3MgaW50cm9kdWNpbmcgc29tZSBiYXRjaGluZyBmb3IgbWlncmF0aW9uIFBURXMg4oCTIGBtaWdyYXRpb25fcHRlX2JhdGNoYCwgYGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlc2AsIGFuZCBgZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2hgIGFyZSB0aGUga2V5IHBsYXllcnMgaGVyZS4gSXQmIzM5O3MgcmVmYWN0b3JpbmcgYHRyeV90b19taWdyYXRlX29uZWAgdG8gdXNlIHRoaXMgYmF0Y2hpbmcgYXBwcm9hY2gsIGFuZCBldmVuIHB1bGxpbmcgb3V0IGEgZGVkaWNhdGVkIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAgZnVuY3Rpb24gZm9yIEh1Z2V0bGIgZm9saW9zLiBJdCYjMzk7cyBhbHNvIHRvdWNoaW5nIGByZW1vdmVfbWlncmF0aW9uX3B0ZWAgd2l0aCBiYXRjaGluZyBpbiBtaW5kLgoKR2l2ZW4gdGhhdCB0aGlzIGlzIHRvdWNoaW5nIGZ1bmRhbWVudGFsIG1lbW9yeSBtYW5hZ2VtZW50IC0gbWlncmF0aW9uIGFuZCB0aGUgcm1hcCBtZWNoYW5pc20gLSB0aGlzIGlzIGFic29sdXRlbHkgc29tZXRoaW5nIHRoYXQgZGVtYW5kcyB0aG9yb3VnaCBmdXp6aW5nLiBXZSBuZWVkIHRvIGJlIGNvbmZpZGVudCBpbiBpdHMgY29ycmVjdG5lc3MsIGVzcGVjaWFsbHkgYXJvdW5kIFBURSBoYW5kbGluZy4KCkFscmlnaHQsIHRpbWUgdG8gZ2V0IHNwZWNpZmljLiBJIG5lZWQgdG8gbmFpbCBkb3duIHRoZSBhZmZlY3RlZCBjb2RlIGFuZCB3aGF0IHRoZSBrZXkgZnVuY3Rpb25hbCBhcmVhcyBhcmUuIExldCBtZSBsaXN0IHRoZSBwcmltYXJ5IGZ1bmN0aW9ucyBJIG5lZWQgdG8gZm9jdXMgb24gZHVyaW5nIGZ1enppbmc6CgoqICAgYG1pZ3JhdGlvbl9wdGVfYmF0Y2hgCiogICBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVgCiogICBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYmAKKiAgIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAKKiAgIGB0cnlfdG9fbWlncmF0ZV9vbmVgCiogICBgZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2hgCiogICBgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzYAoqICAgYG1ha2VfbWlncmF0aW9uX3N3cF9wdGVgCgpPa2F5LCBub3cgbGV0JiMzOTtzIHVzZSBgZGVmYXVsdF9hcGk6Z3JlcHBlcmAgdG8gbG9jYXRlIHRoZXNlIGZ1bmN0aW9ucyBhbmQgdW5kZXJzdGFuZCB0aGVpciBjb250ZXh0IHdpdGhpbiB0aGUgY29kZS4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayBib3RoIGBtbS9taWdyYXRlLmNgIGFuZCBgbW0vcm1hcC5jYCB0byBwaW5wb2ludCB3aGVyZSB0aGVzZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGltcGxlbWVudGVkLiBUaGF0IHNob3VsZCBnaXZlIG1lIGEgZ29vZCBoYW5kbGUgb24gd2hlcmUgdG8gZm9jdXMgbXkgYW5hbHlzaXMgYW5kIGZ1enppbmcgZWZmb3J0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKHN0YXRpY3x2b2lkfGludHxib29sfHVuc2lnbmVkKS4qIChtaWdyYXRpb25fcHRlX2JhdGNofHJlbW92ZV9taWdyYXRpb25fcHRlfHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGJ8dHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmV8dHJ5X3RvX21pZ3JhdGVfb25lfGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNofGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlc3xtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKVxcKCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L3JtYXAuaD03MDg9c3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19mb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4tLVxuaW5jbHVkZS9saW51eC9ybWFwLmgtODEyLSAqL1xuaW5jbHVkZS9saW51eC9ybWFwLmg6ODEzOnN0YXRpYyBpbmxpbmUgaW50IGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuaW5jbHVkZS9saW51eC9ybWFwLmgtODE0LVx0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5tbS9taWdyYXRlLmM9MzQzPXN0cnVjdCBybWFwX3dhbGtfYXJnIHtcbi0tXG5tbS9taWdyYXRlLmMtMzUxLSAqL1xubW0vbWlncmF0ZS5jOjM1MjpzdGF0aWMgdW5zaWduZWQgaW50IG1pZ3JhdGlvbl9wdGVfYmF0Y2goc3RydWN0IHBhZ2Vfdm1hX21hcHBlZF93YWxrICpwdm13LFxubW0vbWlncmF0ZS5jLTM1My1cdFx0c3RydWN0IGZvbGlvICpmb2xpbywgcHRlX3QgZmlyc3RfcHRlLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeClcbi0tXG5tbS9taWdyYXRlLmM9MzcwPXN0YXRpYyBwdGVfdCBtaWdyYXRpb25fc29mdGxlYWZfZW50cnlfdG9fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpuZXcsXG4tLVxubW0vbWlncmF0ZS5jLTQwMy0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRVxubW0vbWlncmF0ZS5jOjQwNDpzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiKHN0cnVjdCBmb2xpbyAqZm9saW8sXG5tbS9taWdyYXRlLmMtNDA1LVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpXG4tLVxubW0vbWlncmF0ZS5jLTQ0NS0jZWxzZVxubW0vbWlncmF0ZS5jOjQ0NjpzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiKHN0cnVjdCBmb2xpbyAqZm9saW8sXG5tbS9taWdyYXRlLmMtNDQ3LVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpXG4tLVxubW0vbWlncmF0ZS5jLTQ1NS0gKi9cbm1tL21pZ3JhdGUuYzo0NTY6c3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcbm1tL21pZ3JhdGUuYy00NTctXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZylcbi0tXG5tbS9ybWFwLmM9MjM5Mz12b2lkIHRyeV90b191bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBlbnVtIHR0dV9mbGFncyBmbGFncylcbi0tXG5tbS9ybWFwLmMtMjQwOC0vKiBCdWlsZCB0aGUgbWlncmF0aW9uIHN3YXAgUFRFIHRoYXQgcmVwbGFjZXMgcHRldmFsIGZvciBhIHBhZ2UuICovXG5tbS9ybWFwLmM6MjQwOTpzdGF0aWMgcHRlX3QgbWFrZV9taWdyYXRpb25fc3dwX3B0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgcHRlX3QgcHRldmFsLFxubW0vcm1hcC5jLTI0MTAtXHRcdGJvb2wgd3JpdGFibGUsIGJvb2wgYW5vbl9leGNsdXNpdmUpXG4tLVxubW0vcm1hcC5jLTI0NDgtICovXG5tbS9ybWFwLmM6MjQ0OTpzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxubW0vcm1hcC5jLTI0NTAtXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcbi0tXG5tbS9ybWFwLmMtMjU4OC1cbm1tL3JtYXAuYzoyNTg5OnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sXG5tbS9ybWFwLmMtMjU5MC1cdFx0c3RydWN0IHBhZ2Vfdm1hX21hcHBlZF93YWxrICpwdm13LCBwdGVfdCBwdGUsXG4tLVxubW0vcm1hcC5jLTI2MzYtICovXG5tbS9ybWFwLmM6MjYzNzpzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9ybWFwLmMtMjYzOC1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTk1NAoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDE3MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1pZ3JhdGlvbiBGdW5jdGlvbnMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSSBzZWUgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBhIHNldCBvZiBmdW5jdGlvbnMgcmVsYXRlZCB0byBwYWdlIG1pZ3JhdGlvbi4gVGhlIGNvcmUgc2V0IGluY2x1ZGVzIGBtaWdyYXRpb25fcHRlX2JhdGNoYCwgYHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGJgLCBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVgLCBgbWFrZV9taWdyYXRpb25fc3dwX3B0ZWAsIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAsIGBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaGAsIGFuZCBgdHJ5X3RvX21pZ3JhdGVfb25lYC4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIGluc3RhbnRseSByZWNvZ25pemUgdGhlc2UgYXMgY3J1Y2lhbCBlbGVtZW50cyBpbiBoYW5kbGluZyB0aGUgbW92ZW1lbnQgb2YgcGFnZXMsIHBvdGVudGlhbGx5IGZyb20gb25lIHBoeXNpY2FsIGxvY2F0aW9uIHRvIGFub3RoZXIuIFRoZSBuYW1pbmcgY29udmVudGlvbnMgc3VnZ2VzdCBiYXRjaCBwcm9jZXNzaW5nIGFuZCBoYW5kbGluZyBvZiBIdWdlVExCIHBhZ2VzLCB3aGljaCBpcyBwcmVjaXNlbHkgdGhlIGtpbmQgb2YgbG93LWxldmVsIHN0dWZmIEkgbmVlZCB0byB1bmRlcnN0YW5kLgoKTm93LCBhIGNyaXRpY2FsIHF1ZXN0aW9uIGFyaXNlczogYXJlIHRoZXJlIGFueSAqc3BlY2lmaWMqIGNvbmZpZ3VyYXRpb25zIHRoYXQgaW5mbHVlbmNlIHRoZWlyIGJlaGF2aW9yIG9yIGNvbXBpbGF0aW9uPyBGcm9tIG15IGluaXRpYWwgc2NhbiwgaXQgbG9va3MgbGlrZSBgQ09ORklHX0hVR0VUTEJfUEFHRWAgaXMgdGhlIGtleSBmb3IgZnVuY3Rpb25zIGxpa2UgYHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGJgIGFuZCBgdHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmVgLCB3aGljaCBtYWtlcyBwZXJmZWN0IHNlbnNlLiBIdWdlVExCIHBhZ2UgbWlncmF0aW9uIHdpbGwgYWx3YXlzIG5lZWQgdGhpcyBlbmFibGVkLiBPYnZpb3VzbHksIGBDT05GSUdfTUlHUkFUSU9OYCBpcyBnb2luZyB0byBiZSBtYW5kYXRvcnkuIEJ1dCwgd2hhdCBhYm91dCB0aGUgY29tcGlsYXRpb24gb2YgYG1pZ3JhdGUuY2AgaXRzZWxmPyBJdCYjMzk7cyBlc3NlbnRpYWwgdG8gY29uZmlybSBpZiBpdCYjMzk7cyBjb25kaXRpb25hbGx5IGluY2x1ZGVkLCBvciBpZiB0aGUgY29tcGlsZXIgYWx3YXlzIGJ1aWxkcyBpdC4gVGhlIGRldGFpbHMgd2lsbCBiZSBmb3VuZCBpbiBlaXRoZXIgYG1tL0tjb25maWdgIG9yIGBtbS9NYWtlZmlsZWAuIFRoYXQmIzM5O3Mgd2hlcmUgSSBuZWVkIHRvIGxvb2sgZm9yIHByZWNpc2UgYW5zd2Vycy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttaWdyYXRlXFwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTk3PW9iai0kKENPTkZJR19NRU1URVNUKVx0XHQmIzQzOz0gbWVtdGVzdC5vXG5tbS9NYWtlZmlsZTo5ODpvYmotJChDT05GSUdfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZS5vXG5tbS9NYWtlZmlsZS05OS1vYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG1lbW9yeS10aWVycy5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTIgMTM6MTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY1NTQKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA3NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIHNlZSwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBgQ09ORklHX01JR1JBVElPTmAgaXMgZW5hYmxlZC4gVGhhdCYjMzk7cyBmdW5kYW1lbnRhbCwgSSYjMzk7ZCBzYXkuIEFuZCwgb2YgY291cnNlLCBmb3IgYW55dGhpbmcgaHVnZXRsYi1zcGVjaWZpYywgSSBuZWVkIGBDT05GSUdfSFVHRVRMQl9QQUdFYC4gTWFrZXMgcGVyZmVjdCBzZW5zZS4gTm93LCBnaXZlbiB0aGF0IGJhdGNoaW5nIGlzIG1vc3QgYmVuZWZpY2lhbCBmb3IgbGFyZ2VyIGZvbGlvcywgaXQmIzM5O3Mgd29ydGggY2hlY2tpbmcgdGhlIHN0YXR1cyBvZiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhcyB3ZWxsLiBNaWdodCBhcyB3ZWxsIGJlIHRob3JvdWdoIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGFueSBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBJIHNob3VsZCBiZSBjb25zaWRlcmluZyBhdCB0aGUgc2FtZSB0aW1lLiBMZXQgbWUganVzdCBzY2FuIHRocm91Z2ggdGhlIHJlbGV2YW50IGRvY3VtZW50YXRpb24gYW5kIGNvbmZpZ3MgdG8gY29uZmlybS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR19NSUdSQVRJT04mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjgwNwoJCQkJCQkJb3V0cHV0OiAxOAoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgaG93IEkmIzM5O2QgYXBwcm9hY2ggdGhpcyB0YXNrLCBhcyBpZiB0aGVzZSB3ZXJlIG15IGludGVybmFsIHRob3VnaHRzOgoKKipMb2NhdGluZyB0aGUgRGVmaW5pdGlvbiBvZiBDT05GSUdfTUlHUkFUSU9OKioKCkFscmlnaHQsIHNvIGBDT05GSUdfTUlHUkFUSU9OYCBpcyB0aGUgdGFyZ2V0LiBGaXJzdCBpbnN0aW5jdD8gTGV0JiMzOTtzIHRyYWNlIGJhY2sgdGhhdCBtYWNyby4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXQmIzM5O3MgZGVmaW5lZCB3aXRoaW4gdGhlIHByb2plY3QuIEkmIzM5O2xsIG5lZWQgdG8ga25vdyB3aGVyZSBJIGNhbiBzZWUgaXRzIHZhbHVlLCB3aGF0IGl0IHJlbGF0ZXMgdG8sIGFuZCBob3cgaXQgaXMgYmVpbmcgdXNlZC4gV2hlcmUgaXMgdGhhdCBjb25maWcgb3B0aW9uIGRlZmluZWQ/IExldCYjMzk7cyBwaW5wb2ludCB0aGF0IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBGcm9tIHRoZXJlLCBJIGNhbiB1bmRlcnN0YW5kIGl0JiMzOTtzIHJvbGUgaW4gdGhlIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTIgMTM6MTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIE1JR1JBVElPTiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTY3Nz1jb25maWcgTlVNQV9NSUdSQVRJT05cbi0tXG5tbS9LY29uZmlnLTY4Ny1cbm1tL0tjb25maWc6Njg4OmNvbmZpZyBNSUdSQVRJT05cbm1tL0tjb25maWctNjg5LVx0Ym9vbFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzA0NAoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKktjb25maWcgTXVzaW5ncyoqCgpSaWdodCwgbGV0IG1lIHNlZS4uLiB0aGF0IGBjb25maWcgTUlHUkFUSU9OYCBvcHRpb24gSSYjMzk7bSBmYW1pbGlhciB3aXRoLCB0aGF0JiMzOTtzIGRlZmluZWQgaW4gYG1tL0tjb25maWdgLCBpc24mIzM5O3QgaXQ/IEdvb2QuIEFoLCBhbmQgYSBxdWljayBzYW5pdHkgY2hlY2sg4oCTIEkgcmVtZW1iZXIgaXQmIzM5O3MgYSBzaW1wbGUgYm9vbGVhbi4gTm90aGluZyBjb21wbGljYXRlZCB0aGVyZS4gTm93LCBqdXN0IHRvIGJlIHRob3JvdWdoIGFuZCBiZWNhdXNlIGl0JiMzOTtzIGluIHRoZSBzYW1lIGdlbmVyYWwgYXJlYSwgbGV0IG1lIHRha2UgYSBxdWljayBsb29rIGF0IGBDT05GSUdfSFVHRVRMQl9QQUdFYCB3aGlsZSBJJiMzOTttIGF0IGl0LCBqdXN0IHRvIGJlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXAgYW5kIGFueSBwb3RlbnRpYWwgaW50ZXJhY3Rpb25zLiBOZWVkIHRvIGtlZXAgdGhlIHdob2xlIHBpY3R1cmUgaW4gbWluZCwgYWZ0ZXIgYWxsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgSFVHRVRMQl9QQUdFJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvc2gvbW0vS2NvbmZpZz0xNTg9Y2hvaWNlXG4tLVxuYXJjaC9zaC9tbS9LY29uZmlnLTE2My1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxNjQ6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzY0S1xuYXJjaC9zaC9tbS9LY29uZmlnLTE2NS1cdGJvb2wgXCYjMzQ7NjRrQlwmIzM0O1xuLS1cbmFyY2gvc2gvbW0vS2NvbmZpZy0xNjctXG5hcmNoL3NoL21tL0tjb25maWc6MTY4OmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV8yNTZLXG5hcmNoL3NoL21tL0tjb25maWctMTY5LVx0Ym9vbCBcJiMzNDsyNTZrQlwmIzM0O1xuLS1cbmFyY2gvc2gvbW0vS2NvbmZpZy0xNzEtXG5hcmNoL3NoL21tL0tjb25maWc6MTcyOmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV8xTUJcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNzMtXHRib29sIFwmIzM0OzFNQlwmIzM0O1xuYXJjaC9zaC9tbS9LY29uZmlnLTE3NC1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxNzU6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzRNQlxuYXJjaC9zaC9tbS9LY29uZmlnLTE3Ni1cdGJvb2wgXCYjMzQ7NE1CXCYjMzQ7XG4tLVxuYXJjaC9zaC9tbS9LY29uZmlnLTE3OC1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxNzk6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzY0TUJcbmFyY2gvc2gvbW0vS2NvbmZpZy0xODAtXHRib29sIFwmIzM0OzY0TUJcJiMzNDtcbi0tXG5mcy9LY29uZmlnPTI2Mj1pZiBIVUdFVExCRlNcbmZzL0tjb25maWc6MjYzOmNvbmZpZyBIVUdFVExCX1BBR0VfT1BUSU1JWkVfVk1FTU1BUF9ERUZBVUxUX09OXG5mcy9LY29uZmlnLTI2NC1cdGJvb2wgXCYjMzQ7SHVnZVRMQiBWbWVtbWFwIE9wdGltaXphdGlvbiAoSFZPKSBkZWZhdWx0cyB0byBvblwmIzM0O1xuLS1cbmZzL0tjb25maWc9MjcxPWVuZGlmICMgSFVHRVRMQkZTXG5mcy9LY29uZmlnLTI3Mi1cbmZzL0tjb25maWc6MjczOmNvbmZpZyBIVUdFVExCX1BBR0VcbmZzL0tjb25maWctMjc0LVx0ZGVmX2Jvb2wgSFVHRVRMQkZTXG4tLVxuZnMvS2NvbmZpZy0yNzYtXG5mcy9LY29uZmlnOjI3Nzpjb25maWcgSFVHRVRMQl9QQUdFX09QVElNSVpFX1ZNRU1NQVBcbmZzL0tjb25maWctMjc4LVx0ZGVmX2Jvb2wgSFVHRVRMQl9QQUdFXG4tLVxubW0vS2NvbmZpZz02OTg9Y29uZmlnIEFSQ0hfSEFTX1BNRF9TT0ZUTEVBVkVTXG4tLVxubW0vS2NvbmZpZy03MDAtXG5tbS9LY29uZmlnOjcwMTpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfVkFSSUFCTEVcbm1tL0tjb25maWctNzAyLVx0ZGVmX2Jvb2wgblxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzg1MwoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDQzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKkludmVzdGlnYXRpbmcgSHVnZSBQYWdlcyBhbmQgRGVwZW5kZW5jaWVzKioKCkFscmlnaHQsIGxldCYjMzk7cyBzZWUuLi4gYEhVR0VUTEJfUEFHRWAgaXMgZGVmaW5lZCBpbiBgZnMvS2NvbmZpZ2AuIFRoYXQmIzM5O3MgdGhlIHN0YXJ0aW5nIHBvaW50LiBBbmQgYSBxdWljayBjaGVjayByZXZlYWxzIHRoYXQgaXQmIzM5O3MgZGVwZW5kZW50IG9uIGBIVUdFVExCRlNgLiBNYWtlcyBwZXJmZWN0IHNlbnNlLiBDYW4mIzM5O3QgaGF2ZSBodWdlIHBhZ2VzIHdpdGhvdXQgdGhlIGZpbGUgc3lzdGVtIHN1cHBvcnQsIHJpZ2h0PyBOb3csIHRoZSBuZXh0IHF1ZXN0aW9uIGlzIGFib3V0IGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhhdCB0aWVzIGluLiBMZXQmIzM5O3Mgc2VlIHdoYXQgSSBjYW4gZmluZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTIgMTM6MTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9ODM1PWNvbmZpZyBNTV9JRFxuLS1cbm1tL0tjb25maWctODM3LVxubW0vS2NvbmZpZzo4Mzg6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vS2NvbmZpZy04MzktXHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg1Nj1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg2MS1cbm1tL0tjb25maWc6ODYyOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xubW0vS2NvbmZpZy04NjMtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NjgtXG5tbS9LY29uZmlnOjg2OTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXG5tbS9LY29uZmlnLTg3MC1cdFx0Ym9vbCBcJiMzNDttYWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NzctXG5tbS9LY29uZmlnOjg3ODpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxubW0vS2NvbmZpZy04NzktXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg4NT1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg5NC1cbm1tL0tjb25maWc6ODk1Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcbm1tL0tjb25maWctODk2LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDQtXG5tbS9LY29uZmlnOjkwNTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05MDYtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MTItXG5tbS9LY29uZmlnOjkxMzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTkxNC1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTIwLVxubW0vS2NvbmZpZzo5MjE6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTIyLVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWc9OTMwPWNob2ljZVxuLS1cbm1tL0tjb25maWctOTM5LVxubW0vS2NvbmZpZzo5NDA6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05NDEtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk0OC1cbm1tL0tjb25maWc6OTQ5Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTk1MC1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1Ni1cbm1tL0tjb25maWc6OTU3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTU4LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NjQtXG5tbS9LY29uZmlnOjk2NTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05NjYtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEyIDEzOjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4NzYxCgkJCQkJCQlvdXRwdXQ6IDIxNgoJCQkJCQkJdGhvdWdodHM6IDc0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgTWVtb3J5IE1pZ3JhdGlvbiBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGhhbmRlZCB0aGlzIHBhdGNoIHRoYXQmIzM5O3MgY2xlYXJseSBmb2N1c2VkIG9uIG9wdGltaXppbmcgbWVtb3J5IG1pZ3JhdGlvbiwgcGFydGljdWxhcmx5IGFyb3VuZCBoYW5kbGluZyBQVEVzIGluIGJhdGNoZXMuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB0aGUgY29yZSBmdW5jdGlvbnMgYWZmZWN0ZWQ6IGBtbS9taWdyYXRlLmNgIGFuZCBgbW0vcm1hcC5jYC4gSSYjMzk7dmUgZ29uZSB0aHJvdWdoIHRoZSBjb2RlIGFuZCBJJiMzOTt2ZSBpZGVudGlmaWVkIHRoZSBrZXkgZnVuY3Rpb25zIEkgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aC4KCkkmIzM5O3ZlIGluaXRpYWxseSBsaXN0ZWQgYWxsIHRoZSBmdW5jdGlvbnMgaW4gdGhhdCByZWdpb24sIGJ1dCBJIHF1aWNrbHkgcmVhbGl6ZWQgdGhhdCB0d28gb2YgdGhlbSwgYGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlc2AgYW5kIGBzb2Z0bGVhZl9wdGVfYmF0Y2hgLCBhcmUgYHN0YXRpYyBpbmxpbmVgIGFuZCBkZWZpbmVkIGluIGhlYWRlcnMuIFRoZXJlZm9yZSwgdGhleSBtaWdodCBub3QgYmUgZGlyZWN0bHkgZnV6emFibGUgYXMgc3RhbmRhbG9uZSB1bml0cywgYWx0aG91Z2ggdGhleSBhcmUgY3JpdGljYWwgdG8gY29uc2lkZXIgYXMgcGFydCBvZiB0aGUgb3ZlcmFsbCBmbG93IG9mIHRoZSBub24taW5saW5lIGZ1bmN0aW9ucy4gSSYjMzk7dmUgcmUtcHJpb3JpdGl6ZWQgYW5kIHJlbW92ZWQgdGhvc2Ugc3RhdGljIGlubGluZXMgdG8gZ2l2ZSBtZSBhIHNoYXJwZXIgZm9jdXMuCgpTbywgaGVyZSYjMzk7cyB0aGUgbmFycm93ZWQtZG93biBsaXN0IG9mIGZ1bmN0aW9ucyBJIHJlYWxseSBuZWVkIHRvIGRyaWxsIGRvd24gb246IGBtaWdyYXRpb25fcHRlX2JhdGNoYCwgYHJlbW92ZV9taWdyYXRpb25fcHRlYCwgYHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGJgLCBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVzYCwgYG1ha2VfbWlncmF0aW9uX3N3cF9wdGVgLCBgdHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmVgLCBgZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2hgLCBgdHJ5X3RvX21pZ3JhdGVfb25lYCwgYW5kIGB0cnlfdG9fbWlncmF0ZWAuCgpUaGUgcGF0Y2gmIzM5O3MgZ29hbCBhcHBlYXJzIHRvIGJlIHNwZWVkaW5nIHRoaW5ncyB1cCwgc28gYmF0Y2hpbmcgUFRFIG9wZXJhdGlvbnMsIHByZXN1bWFibHkgZm9yIGxhcmdlciBmb2xpb3MuIFRoaXMgbWVhbnMgbXkgZnV6emluZyBuZWVkcyB0byBiZSBwYXJ0aWN1bGFybHkgcm9idXN0LCBjb3ZlcmluZyBhbGwgdGhlIHBvdGVudGlhbCBwZXJtdXRhdGlvbnMgb2YgUFRFIGhhbmRsaW5nLCBlc3BlY2lhbGx5IHdpdGggcGVybWlzc2lvbnMsIGFuZCBtYWtpbmcgc3VyZSB0aGUgYmF0Y2hpbmcgbG9naWMgZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSBzdWJ0bGUgZXJyb3JzIG9yIGxlYWtzIHdoZW4gaGFuZGxpbmcgZGV2aWNlLXByaXZhdGUgZm9saW9zIG9yIGh1Z2V0bGIgcGFnZXMuIEVkZ2UgY2FzZXMgYXJlIGdvaW5nIHRvIGJlIG15IGZyaWVuZHMgaGVyZS4KCkdpdmVuIHRoZSBjb2RlJiMzOTtzIGRlcGVuZGVuY2Ugb24gYG1tL21pZ3JhdGUuY2AsIGBNSUdSQVRJT05gIGlzIG15IGluaXRpYWwgY29uZmlnLiBJIHRoZW4gbmVlZCB0byBlbnN1cmUgdGhhdCBgSFVHRVRMQl9QQUdFYCBpcyBhbHNvIHNldCBiZWNhdXNlIG9mIGByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiYCBhbmQgYHRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lYC4gQWxzbywgc2luY2UgdGhlIHdob2xlIGJhdGNoaW5nIGNvbmNlcHQgaXMgbGFyZ2VseSBnZWFyZWQgdG93YXJkIGRlYWxpbmcgd2l0aCBsYXJnZXIgbWVtb3J5IGNodW5rcywgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBzaG91bGQgYWxzbyBiZSB1c2VkIHRvIGdldCBzb21lIGNvdmVyYWdlIGluIHRoYXQgc3BhY2UuCgpJIHRoaW5rIEkmIzM5O3ZlIGdvdCBhIHNvbGlkIHBsYW4gZm9yIGZ1enppbmcgdGhpcyBwYXRjaC4gTm93LCBsZXQmIzM5O3MgZ2V0IHRvIHdvcmshCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEyIDEzOjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNSUdSQVRJT04mIzM0OywKICAgICYjMzQ7SFVHRVRMQl9QQUdFJiMzNDssCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bWlncmF0aW9uX3B0ZV9iYXRjaCYjMzQ7LAogICAgJiMzNDtyZW1vdmVfbWlncmF0aW9uX3B0ZSYjMzQ7LAogICAgJiMzNDtyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiJiMzNDssCiAgICAmIzM0O3JlbW92ZV9taWdyYXRpb25fcHRlcyYjMzQ7LAogICAgJiMzNDttYWtlX21pZ3JhdGlvbl9zd3BfcHRlJiMzNDssCiAgICAmIzM0O3RyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lJiMzNDssCiAgICAmIzM0O2ZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoJiMzNDssCiAgICAmIzM0O3RyeV90b19taWdyYXRlX29uZSYjMzQ7LAogICAgJiMzNDt0cnlfdG9fbWlncmF0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGJhdGNoaW5nIGZvciBtaWdyYXRpb24gUFRFcyB0byBvcHRpbWl6ZSBtZW1vcnkgbWlncmF0aW9uLCBlc3BlY2lhbGx5IGZvciBsYXJnZSBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zIGluIG1tL21pZ3JhdGUuYyBhbmQgbW0vcm1hcC5jLiBGdXp6aW5nIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgYmF0Y2hpbmcgbG9naWMgY29ycmVjdGx5IGhhbmRsZXMgUFRFcywgcGVybWlzc2lvbnMsIGFuZCBlZGdlIGNhc2VzIGxpa2UgZGV2aWNlIHByaXZhdGUgZm9saW9zIG9yIGh1Z2V0bGIgcGFnZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01JR1JBVElPTiYjMzQ7LAogICAgJiMzNDtIVUdFVExCX1BBR0UmIzM0OywKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttaWdyYXRpb25fcHRlX2JhdGNoJiMzNDssCiAgICAmIzM0O3JlbW92ZV9taWdyYXRpb25fcHRlJiMzNDssCiAgICAmIzM0O3JlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGImIzM0OywKICAgICYjMzQ7cmVtb3ZlX21pZ3JhdGlvbl9wdGVzJiMzNDssCiAgICAmIzM0O21ha2VfbWlncmF0aW9uX3N3cF9wdGUmIzM0OywKICAgICYjMzQ7dHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmUmIzM0OywKICAgICYjMzQ7Zm9saW9fbWlncmF0ZV9wdGVfYmF0Y2gmIzM0OywKICAgICYjMzQ7dHJ5X3RvX21pZ3JhdGVfb25lJiMzNDssCiAgICAmIzM0O3RyeV90b19taWdyYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYmF0Y2hpbmcgZm9yIG1pZ3JhdGlvbiBQVEVzIHRvIG9wdGltaXplIG1lbW9yeSBtaWdyYXRpb24sIGVzcGVjaWFsbHkgZm9yIGxhcmdlIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgaW4gbW0vbWlncmF0ZS5jIGFuZCBtbS9ybWFwLmMuIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBiYXRjaGluZyBsb2dpYyBjb3JyZWN0bHkgaGFuZGxlcyBQVEVzLCBwZXJtaXNzaW9ucywgYW5kIGVkZ2UgY2FzZXMgbGlrZSBkZXZpY2UgcHJpdmF0ZSBmb2xpb3Mgb3IgaHVnZXRsYiBwYWdlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEyVDEzOjEyOjIyLjA3ODI5ODczOFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwMzc1NzAxNjczLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1JR1JBVElPTlwiLFxuICAgIFwiSFVHRVRMQl9QQUdFXCIsXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1pZ3JhdGlvbl9wdGVfYmF0Y2hcIixcbiAgICBcInJlbW92ZV9taWdyYXRpb25fcHRlXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZXNcIixcbiAgICBcIm1ha2VfbWlncmF0aW9uX3N3cF9wdGVcIixcbiAgICBcInRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lXCIsXG4gICAgXCJmb2xpb19taWdyYXRlX3B0ZV9iYXRjaFwiLFxuICAgIFwidHJ5X3RvX21pZ3JhdGVfb25lXCIsXG4gICAgXCJ0cnlfdG9fbWlncmF0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYmF0Y2hpbmcgZm9yIG1pZ3JhdGlvbiBQVEVzIHRvIG9wdGltaXplIG1lbW9yeSBtaWdyYXRpb24sIGVzcGVjaWFsbHkgZm9yIGxhcmdlIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgaW4gbW0vbWlncmF0ZS5jIGFuZCBtbS9ybWFwLmMuIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBiYXRjaGluZyBsb2dpYyBjb3JyZWN0bHkgaGFuZGxlcyBQVEVzLCBwZXJtaXNzaW9ucywgYW5kIGVkZ2UgY2FzZXMgbGlrZSBkZXZpY2UgcHJpdmF0ZSBmb2xpb3Mgb3IgaHVnZXRsYiBwYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6MjIuMDc4MzA4NzM4WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDYwOTYzOTkzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYzZlMmJlMWUxYTYxYmJmYTgxMWQ3NWMxZDc3MDJhNGQ5OGM1ZTg4NVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU3VuIEp1bCAxMiAxMzoxMjoyMCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JtYXAuaCBiL2luY2x1ZGUvbGludXgvcm1hcC5oXFxuaW5kZXggOGRjMDg3MWU1ZjAwMTEuLjY0OTI5NDkwYTdjZmNhIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvcm1hcC5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9ybWFwLmhcXG5AQCAtNzA2LDE3ICs3MDYsMTggQEAgc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X2R1cF9hbm9uX3JtYXBfcG1kKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuIH1cXG4gXFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbi1cXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXFxuK1xcdFxcdHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXFxuIHtcXG4rXFx0LyogZGV2aWNlIHByaXZhdGUgZm9saW9zIGNhbm5vdCBnZXQgcGlubmVkIHZpYSBHVVAuICovXFxuK1xcdGNvbnN0IGJvb2wgcGlubmFibGUgPSBsaWtlbHkoIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSk7XFxuK1xcbiBcXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XFxuIFxcdFZNX1dBUk5fT05fRk9MSU8oIVBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpLCBmb2xpbyk7XFxuIFxcdF9fZm9saW9fcm1hcF9zYW5pdHlfY2hlY2tzKGZvbGlvLCBwYWdlLCBucl9wYWdlcywgbGV2ZWwpO1xcbiBcXG4tXFx0LyogZGV2aWNlIHByaXZhdGUgZm9saW9zIGNhbm5vdCBnZXQgcGlubmVkIHZpYSBHVVAuICovXFxuLVxcdGlmICh1bmxpa2VseShmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpKSB7XFxuLVxcdFxcdENsZWFyUGFnZUFub25FeGNsdXNpdmUocGFnZSk7XFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXHR9XFxuK1xcdC8qIFdlIG9ubHkgY2xlYXIgYW5vbi1leGNsdXNpdmUgZnJvbSBoZWFkIHBhZ2Ugb2YgUE1EIGZvbGlvICovXFxuK1xcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BNRClcXG4rXFx0XFx0bnJfcGFnZXMgPSAxO1xcbiBcXG4gXFx0LypcXG4gXFx0ICogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIHdlIGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlLCB0aGF0XFxuQEAgLTc2MCwyOSArNzYxLDM4IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbiBcXHQgKiBzbyB3ZSB1c2UgZXhwbGljaXQgb25lcyBoZXJlLlxcbiBcXHQgKi9cXG4gXFxuLVxcdC8qIFBhaXJlZCB3aXRoIHRoZSBtZW1vcnkgYmFycmllciBpbiB0cnlfZ3JhYl9mb2xpbygpLiAqL1xcbi1cXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpXFxuLVxcdFxcdHNtcF9tYigpO1xcbitcXHRpZiAocGlubmFibGUpIHtcXG4rXFx0XFx0LyogUGFpcmVkIHdpdGggdGhlIG1lbW9yeSBiYXJyaWVyIGluIHRyeV9ncmFiX2ZvbGlvKCkuICovXFxuK1xcdFxcdGlmIChJU19FTkFCTEVEKENPTkZJR19IQVZFX0dVUF9GQVNUKSlcXG4rXFx0XFx0XFx0c21wX21iKCk7XFxuIFxcbi1cXHRpZiAodW5saWtlbHkoZm9saW9fbWF5YmVfZG1hX3Bpbm5lZChmb2xpbykpKVxcbi1cXHRcXHRyZXR1cm4gLUVCVVNZO1xcbi1cXHRDbGVhclBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xcbitcXHRcXHRpZiAodW5saWtlbHkoZm9saW9fbWF5YmVfZG1hX3Bpbm5lZChmb2xpbykpKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKDs7KSB7XFxuK1xcdFxcdENsZWFyUGFnZUFub25FeGNsdXNpdmUocGFnZSk7XFxuK1xcdFxcdGlmICgtLW5yX3BhZ2VzID09IDApXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRwYWdlKys7XFxuK1xcdH1cXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFRoaXMgaXMgY29uY2VwdHVhbGx5IGEgc21wX3dtYigpIHBhaXJlZCB3aXRoIHRoZSBzbXBfcm1iKCkgaW5cXG4gXFx0ICogZ3VwX211c3RfdW5zaGFyZSgpLlxcbiBcXHQgKi9cXG4tXFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKVxcbitcXHRpZiAocGlubmFibGUgXFx1MDAyNlxcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpXFxuIFxcdFxcdHNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbiAvKipcXG4tICogZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUgLSB0cnkgbWFya2luZyBhbiBleGNsdXNpdmUgYW5vbnltb3VzIHBhZ2VcXG4tICpcXHRcXHRcXHRcXHQgICBtYXBwZWQgYnkgYSBQVEUgcG9zc2libHkgc2hhcmVkIHRvIHByZXBhcmVcXG4rICogZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzIC0gdHJ5IG1hcmtpbmcgZXhjbHVzaXZlIGFub255bW91cyBwYWdlc1xcbisgKlxcdFxcdFxcdFxcdCAgIG1hcHBlZCBieSBQVEVzIHBvc3NpYmx5IHNoYXJlZCB0byBwcmVwYXJlXFxuICAqXFx0XFx0XFx0XFx0ICAgZm9yIEtTTSBvciB0ZW1wb3JhcnkgdW5tYXBwaW5nXFxuICAqIEBmb2xpbzpcXHRUaGUgZm9saW8gdG8gc2hhcmUgYSBtYXBwaW5nIG9mXFxuLSAqIEBwYWdlOlxcdFRoZSBtYXBwZWQgZXhjbHVzaXZlIHBhZ2VcXG4rICogQHBhZ2U6XFx0VGhlIGZpcnN0IG1hcHBlZCBleGNsdXNpdmUgcGFnZSBvZiB0aGUgYmF0Y2ggaW4gdGhlIGZvbGlvXFxuKyAqIEBucl9wYWdlczpcXHRUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIHNoYXJlIGluIHRoZSBmb2xpbyAoYmF0Y2ggc2l6ZSlcXG4gICpcXG4gICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwYWdlIHRhYmxlIGxvY2sgYW5kIGhhcyB0byBoYXZlIHRoZSBwYWdlIHRhYmxlXFxuICAqIGVudHJpZXMgY2xlYXJlZC9pbnZhbGlkYXRlZC5cXG5AQCAtNzk3LDExICs4MDcsMTkgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19mb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuICAqXFxuICAqIFJldHVybnMgMCBpZiBtYXJraW5nIHRoZSBtYXBwZWQgcGFnZSBwb3NzaWJseSBzaGFyZWQgc3VjY2VlZGVkLiBSZXR1cm5zXFxuICAqIC1FQlVTWSBvdGhlcndpc2UuXFxuKyAqXFxuKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCB0aGUgcGFnZSB0YWJsZSBsb2NrLlxcbiAgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuK1xcdFxcdHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbit7XFxuK1xcdHJldHVybiBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8sIHBhZ2UsIG5yX3BhZ2VzLCBQR1RBQkxFX0xFVkVMX1BURSk7XFxuK31cXG4rXFxuIHN0YXRpYyBpbmxpbmUgaW50IGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuIFxcdFxcdHN0cnVjdCBwYWdlICpwYWdlKVxcbiB7XFxuLVxcdHJldHVybiBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8sIHBhZ2UsIDEsIFBHVEFCTEVfTEVWRUxfUFRFKTtcXG4rXFx0cmV0dXJuIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhmb2xpbywgcGFnZSwgMSk7XFxuIH1cXG4gXFxuIC8qKlxcbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxcbmluZGV4IDg3NGJlOTRjZjI1NzBlLi5hOTA3MjFmOGM2ODc3ZSAxMDA2NDRcXG4tLS0gYS9tbS9pbnRlcm5hbC5oXFxuKysrIGIvbW0vaW50ZXJuYWwuaFxcbkBAIC01MDUsNiArNTA1LDI2IEBAIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX25leHRfc3dwX29mZnNldChwdGVfdCBwdGUpXFxuIFxcdHJldHVybiBwdGVfbW92ZV9zd3Bfb2Zmc2V0KHB0ZSwgMSk7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbmxpbmUgaW50IHNvZnRsZWFmX3B0ZV9iYXRjaChwdGVfdCAqc3RhcnRfcHRlcCwgaW50IG1heF9uciwgcHRlX3QgcHRlKVxcbit7XFxuK1xcdHB0ZV90IGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlKTtcXG4rXFx0Y29uc3QgcHRlX3QgKmVuZF9wdGVwID0gc3RhcnRfcHRlcCArIG1heF9ucjtcXG4rXFx0cHRlX3QgKnB0ZXAgPSBzdGFydF9wdGVwICsgMTtcXG4rXFxuK1xcdFZNX1dBUk5fT04obWF4X25yIFxcdTAwM2MgMSk7XFxuK1xcbitcXHR3aGlsZSAocHRlcCBcXHUwMDNjIGVuZF9wdGVwKSB7XFxuK1xcdFxcdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xcbitcXG4rXFx0XFx0aWYgKCFwdGVfc2FtZShwdGUsIGV4cGVjdGVkX3B0ZSkpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KGV4cGVjdGVkX3B0ZSk7XFxuK1xcdFxcdHB0ZXArKztcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHB0ZXAgLSBzdGFydF9wdGVwO1xcbit9XFxuK1xcbiAvKipcXG4gICogc3dhcF9wdGVfYmF0Y2ggLSBkZXRlY3QgYSBQVEUgYmF0Y2ggZm9yIGEgc2V0IG9mIGNvbnRpZ3VvdXMgc3dhcCBlbnRyaWVzXFxuICAqIEBzdGFydF9wdGVwOiBQYWdlIHRhYmxlIHBvaW50ZXIgZm9yIHRoZSBmaXJzdCBlbnRyeS5cXG5AQCAtNTIyLDIzICs1NDIsOSBAQCBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlX3QgcHRlKVxcbiAgKi9cXG4gc3RhdGljIGlubGluZSBpbnQgc3dhcF9wdGVfYmF0Y2gocHRlX3QgKnN0YXJ0X3B0ZXAsIGludCBtYXhfbnIsIHB0ZV90IHB0ZSlcXG4ge1xcbi1cXHRwdGVfdCBleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHB0ZSk7XFxuLVxcdGNvbnN0IHB0ZV90ICplbmRfcHRlcCA9IHN0YXJ0X3B0ZXAgKyBtYXhfbnI7XFxuLVxcdHB0ZV90ICpwdGVwID0gc3RhcnRfcHRlcCArIDE7XFxuLVxcbi1cXHRWTV9XQVJOX09OKG1heF9uciBcXHUwMDNjIDEpO1xcbiBcXHRWTV9XQVJOX09OKCFzb2Z0bGVhZl9pc19zd2FwKHNvZnRsZWFmX2Zyb21fcHRlKHB0ZSkpKTtcXG4gXFxuLVxcdHdoaWxlIChwdGVwIFxcdTAwM2MgZW5kX3B0ZXApIHtcXG4tXFx0XFx0cHRlID0gcHRlcF9nZXQocHRlcCk7XFxuLVxcbi1cXHRcXHRpZiAoIXB0ZV9zYW1lKHB0ZSwgZXhwZWN0ZWRfcHRlKSlcXG4tXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQoZXhwZWN0ZWRfcHRlKTtcXG4tXFx0XFx0cHRlcCsrO1xcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gcHRlcCAtIHN0YXJ0X3B0ZXA7XFxuK1xcdHJldHVybiBzb2Z0bGVhZl9wdGVfYmF0Y2goc3RhcnRfcHRlcCwgbWF4X25yLCBwdGUpO1xcbiB9XFxuICNlbmRpZiAvKiBDT05GSUdfTU1VICovXFxuIFxcbmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmNcXG5pbmRleCAyMjJjOGMxNWY3ODJmNy4uNmQwNWQzZjQxMDk1ZDYgMTAwNjQ0XFxuLS0tIGEvbW0vbWlncmF0ZS5jXFxuKysrIGIvbW0vbWlncmF0ZS5jXFxuQEAgLTM0NSw2ICszNDUsMTExIEBAIHN0cnVjdCBybWFwX3dhbGtfYXJnIHtcXG4gXFx0Ym9vbCBtYXBfdW51c2VkX3RvX3plcm9wYWdlO1xcbiB9O1xcbiBcXG4rLypcXG4rICogRGV0ZWN0IGEgYmF0Y2ggb2YgY29udGlndW91cyBtaWdyYXRpb24gZW50cmllczogY29uc2VjdXRpdmUgKG5vbi1wcmVzZW50KSBQVEVzXFxuKyAqIGNvbnRhaW5pbmcgbWlncmF0aW9uIGVudHJpZXMgd2l0aCBjb25zZWN1dGl2ZSBvZmZzZXRzIGFuZCBtYXRjaGluZyBwdGUgYml0cy5cXG4rICovXFxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlncmF0aW9uX3B0ZV9iYXRjaChzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsXFxuK1xcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHB0ZV90IGZpcnN0X3B0ZSwgdW5zaWduZWQgbG9uZyBzdGFydF9pZHgpXFxuK3tcXG4rXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBwdm13LVxcdTAwM2V2bWE7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIgPSBwbWRfYWRkcl9lbmQocHZtdy1cXHUwMDNlYWRkcmVzcywgdm1hLVxcdTAwM2V2bV9lbmQpO1xcbitcXHR1bnNpZ25lZCBpbnQgZm9saW9fbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuK1xcdHVuc2lnbmVkIGludCBtYXhfbnI7XFxuK1xcbitcXHRWTV9XQVJOX09OKCFzb2Z0bGVhZl9pc19taWdyYXRpb24oc29mdGxlYWZfZnJvbV9wdGUoZmlyc3RfcHRlKSkpO1xcbitcXG4rXFx0LyogQm91bmQgYnkgVk1BIC8gUE1EIGVuZCBhbmQgYnkgdGhlIHJlbWFpbmluZyBzdWJwYWdlcyBvZiB0aGUgZm9saW8uICovXFxuK1xcdG1heF9uciA9IG1pbigoZW5kX2FkZHIgLSBwdm13LVxcdTAwM2VhZGRyZXNzKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZULCBmb2xpb19uciAtIHN0YXJ0X2lkeCk7XFxuK1xcdGlmIChtYXhfbnIgXFx1MDAzYz0gMSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHRyZXR1cm4gc29mdGxlYWZfcHRlX2JhdGNoKHB2bXctXFx1MDAzZXB0ZSwgbWF4X25yLCBmaXJzdF9wdGUpO1xcbit9XFxuK1xcbitzdGF0aWMgcHRlX3QgbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqbmV3LFxcbitcXHRcXHRzb2Z0bGVhZl90IGVudHJ5LCBwdGVfdCBvbGRfcHRlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0cm1hcF90ICpybWFwX2ZsYWdzKVxcbit7XFxuK1xcdHB0ZV90IHB0ZSA9IG1rX3B0ZShuZXcsIFJFQURfT05DRSh2bWEtXFx1MDAzZXZtX3BhZ2VfcHJvdCkpO1xcbitcXG4rXFx0aWYgKCFzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpKVxcbitcXHRcXHRwdGUgPSBwdGVfbWtvbGQocHRlKTtcXG4rXFx0aWYgKGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pIFxcdTAwMjZcXHUwMDI2IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSkpXFxuK1xcdFxcdHB0ZSA9IHB0ZV9ta2RpcnR5KHB0ZSk7XFxuK1xcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkob2xkX3B0ZSkpXFxuK1xcdFxcdHB0ZSA9IHB0ZV9ta3NvZnRfZGlydHkocHRlKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRwdGUgPSBwdGVfY2xlYXJfc29mdF9kaXJ0eShwdGUpO1xcbitcXG4rXFx0aWYgKHNvZnRsZWFmX2lzX21pZ3JhdGlvbl93cml0ZShlbnRyeSkpXFxuK1xcdFxcdHB0ZSA9IHB0ZV9ta3dyaXRlKHB0ZSwgdm1hKTtcXG4rXFx0ZWxzZSBpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxcbitcXHRcXHRwdGUgPSBwdGVfbWt1ZmZkKHB0ZSk7XFxuK1xcbitcXHQvKiBTZWUgZG9fc3dhcF9wYWdlKCk6IHJlc3RvcmUgUEFHRV9OT05FIGZvciBSV1AgKi9cXG4rXFx0aWYgKHB0ZV9zd3BfdWZmZChvbGRfcHRlKSBcXHUwMDI2XFx1MDAyNiB1c2VyZmF1bHRmZF9yd3Aodm1hKSlcXG4rXFx0XFx0cHRlID0gcHRlX21vZGlmeShwdGUsIFBBR0VfTk9ORSk7XFxuK1xcbitcXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiAhc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWQoZW50cnkpKVxcbitcXHRcXHQqcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcXG4rXFxuK1xcdHJldHVybiBwdGU7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFJlc3RvcmUgYSBwb3RlbnRpYWwgbWlncmF0aW9uIHB0ZSB0byBhIHdvcmtpbmcgcHRlIGVudHJ5IGZvciBodWdldGxiIGZvbGlvcy5cXG4rICovXFxuKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFXFxuK3N0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGIoc3RydWN0IGZvbGlvICpmb2xpbyxcXG4rXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxcbit7XFxuK1xcdHN0cnVjdCBybWFwX3dhbGtfYXJnICpybWFwX3dhbGtfYXJnID0gYXJnO1xcbitcXHRERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgcm1hcF93YWxrX2FyZy1cXHUwMDNlZm9saW8sIHZtYSwgYWRkciwgUFZNV19TWU5DIHwgUFZNV19NSUdSQVRJT04pO1xcbitcXHRzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpO1xcbitcXHR1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaCk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcHNpemUgPSBodWdlX3BhZ2Vfc2l6ZShoKTtcXG4rXFxuK1xcdGlmIChwYWdlX3ZtYV9tYXBwZWRfd2FsayhcXHUwMDI2cHZtdykpIHtcXG4rXFx0XFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XFxuK1xcdFxcdHN0cnVjdCBwYWdlICpuZXcgPSBmb2xpb19wYWdlKGZvbGlvLCAwKTtcXG4rXFx0XFx0cHRlX3Qgb2xkX3B0ZSwgcHRlO1xcbitcXHRcXHRzb2Z0bGVhZl90IGVudHJ5O1xcbitcXG4rXFx0XFx0b2xkX3B0ZSA9IGh1Z2VfcHRlcF9nZXQodm1hLVxcdTAwM2V2bV9tbSwgcHZtdy5hZGRyZXNzLCBwdm13LnB0ZSk7XFxuK1xcdFxcdGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wdGUob2xkX3B0ZSk7XFxuK1xcbitcXHRcXHRmb2xpb19nZXQoZm9saW8pO1xcbitcXHRcXHRwdGUgPSBtaWdyYXRpb25fc29mdGxlYWZfZW50cnlfdG9fcHRlKGZvbGlvLCBuZXcsIGVudHJ5LCBvbGRfcHRlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICB2bWEsIFxcdTAwMjZybWFwX2ZsYWdzKTtcXG4rXFx0XFx0cHRlID0gYXJjaF9tYWtlX2h1Z2VfcHRlKHB0ZSwgc2hpZnQsIHZtYS1cXHUwMDNldm1fZmxhZ3MpO1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4rXFx0XFx0XFx0aHVnZXRsYl9hZGRfYW5vbl9ybWFwKGZvbGlvLCB2bWEsIHB2bXcuYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgcm1hcF9mbGFncyk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0aHVnZXRsYl9hZGRfZmlsZV9ybWFwKGZvbGlvKTtcXG4rXFx0XFx0c2V0X2h1Z2VfcHRlX2F0KHZtYS1cXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIHB0ZSwgcHNpemUpO1xcbitcXG4rXFx0XFx0aWYgKFJFQURfT05DRSh2bWEtXFx1MDAzZXZtX2ZsYWdzKSBcXHUwMDI2IFZNX0xPQ0tFRClcXG4rXFx0XFx0XFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcXG4rXFxuK1xcdFxcdHRyYWNlX3JlbW92ZV9taWdyYXRpb25fcHRlKHB2bXcuYWRkcmVzcywgcHRlX3ZhbChwdGUpLFxcbitcXHRcXHRcXHRcXHRcXHQgICBjb21wb3VuZF9vcmRlcihuZXcpKTtcXG4rXFxuK1xcdFxcdC8qIE5vIG5lZWQgdG8gaW52YWxpZGF0ZSAtIGl0IHdhcyBub24tcHJlc2VudCBiZWZvcmUgKi9cXG4rXFx0XFx0dXBkYXRlX21tdV9jYWNoZSh2bWEsIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUpO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbisjZWxzZVxcbitzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuK1xcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZylcXG4re1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi9cXG4rXFxuIC8qXFxuICAqIFJlc3RvcmUgYSBwb3RlbnRpYWwgbWlncmF0aW9uIHB0ZSB0byBhIHdvcmtpbmcgcHRlIGVudHJ5XFxuICAqL1xcbkBAIC0zNTIsNiArNDU3LDcgQEAgc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcXG4gXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxcbiB7XFxuIFxcdHN0cnVjdCBybWFwX3dhbGtfYXJnICpybWFwX3dhbGtfYXJnID0gYXJnO1xcbitcXHRib29sIGlzX2RldnByaXYgPSBmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbyk7XFxuIFxcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBybWFwX3dhbGtfYXJnLVxcdTAwM2Vmb2xpbywgdm1hLCBhZGRyLCBQVk1XX1NZTkMgfCBQVk1XX01JR1JBVElPTik7XFxuIFxcbiBcXHR3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoXFx1MDAyNnB2bXcpKSB7XFxuQEAgLTM2MSw1NiArNDY3LDQwIEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuIFxcdFxcdHNvZnRsZWFmX3QgZW50cnk7XFxuIFxcdFxcdHN0cnVjdCBwYWdlICpuZXc7XFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgaWR4ID0gMDtcXG4rXFx0XFx0dW5zaWduZWQgaW50IG5yID0gMTtcXG4gXFxuIFxcdFxcdC8qIHBnb2ZmIGlzIGludmFsaWQgZm9yIGtzbSBwYWdlcywgYnV0IHRoZXkgYXJlIG5ldmVyIGxhcmdlICovXFxuLVxcdFxcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiAhZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcXG4rXFx0XFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxcbiBcXHRcXHRcXHRpZHggPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIHB2bXcuYWRkcmVzcykgLSBwdm13LnBnb2ZmO1xcbiBcXHRcXHRuZXcgPSBmb2xpb19wYWdlKGZvbGlvLCBpZHgpO1xcbiBcXG4gI2lmZGVmIENPTkZJR19BUkNIX0hBU19QTURfU09GVExFQVZFU1xcbiBcXHRcXHQvKiBQTUQtbWFwcGVkIFRIUCBtaWdyYXRpb24gZW50cnkgKi9cXG4gXFx0XFx0aWYgKCFwdm13LnB0ZSkge1xcbi1cXHRcXHRcXHRWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSB8fFxcbi1cXHRcXHRcXHRcXHRcXHQhZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7XFxuK1xcdFxcdFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7XFxuIFxcdFxcdFxcdHJlbW92ZV9taWdyYXRpb25fcG1kKFxcdTAwMjZwdm13LCBuZXcpO1xcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0fVxcbiAjZW5kaWZcXG4tXFx0XFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpXFxuLVxcdFxcdFxcdG9sZF9wdGUgPSBodWdlX3B0ZXBfZ2V0KHZtYS1cXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0cHZtdy5wdGUpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdG9sZF9wdGUgPSBwdGVwX2dldChwdm13LnB0ZSk7XFxuK1xcdFxcdG9sZF9wdGUgPSBwdGVwX2dldChwdm13LnB0ZSk7XFxuIFxcdFxcdGlmIChybWFwX3dhbGtfYXJnLVxcdTAwM2VtYXBfdW51c2VkX3RvX3plcm9wYWdlIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdCAgICB0cnlfdG9fbWFwX3VudXNlZF90b196ZXJvcGFnZShcXHUwMDI2cHZtdywgZm9saW8sIG9sZF9wdGUsIGlkeCkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4tXFx0XFx0Zm9saW9fZ2V0KGZvbGlvKTtcXG4tXFx0XFx0cHRlID0gbWtfcHRlKG5ldywgUkVBRF9PTkNFKHZtYS1cXHUwMDNldm1fcGFnZV9wcm90KSk7XFxuLVxcbiBcXHRcXHRlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKG9sZF9wdGUpO1xcbi1cXHRcXHRpZiAoIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSkpXFxuLVxcdFxcdFxcdHB0ZSA9IHB0ZV9ta29sZChwdGUpO1xcbi1cXHRcXHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXFx1MDAyNlxcdTAwMjYgc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KSlcXG4tXFx0XFx0XFx0cHRlID0gcHRlX21rZGlydHkocHRlKTtcXG4tXFx0XFx0aWYgKHB0ZV9zd3Bfc29mdF9kaXJ0eShvbGRfcHRlKSlcXG4tXFx0XFx0XFx0cHRlID0gcHRlX21rc29mdF9kaXJ0eShwdGUpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdHB0ZSA9IHB0ZV9jbGVhcl9zb2Z0X2RpcnR5KHB0ZSk7XFxuIFxcbi1cXHRcXHRpZiAoc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KSlcXG4tXFx0XFx0XFx0cHRlID0gcHRlX21rd3JpdGUocHRlLCB2bWEpO1xcbi1cXHRcXHRlbHNlIGlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkpXFxuLVxcdFxcdFxcdHB0ZSA9IHB0ZV9ta3VmZmQocHRlKTtcXG4tXFxuLVxcdFxcdC8qIFNlZSBkb19zd2FwX3BhZ2UoKTogcmVzdG9yZSBQQUdFX05PTkUgZm9yIFJXUCAqL1xcbi1cXHRcXHRpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpIFxcdTAwMjZcXHUwMDI2IHVzZXJmYXVsdGZkX3J3cCh2bWEpKVxcbi1cXHRcXHRcXHRwdGUgPSBwdGVfbW9kaWZ5KHB0ZSwgUEFHRV9OT05FKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVHJ5IHRvIHJlc3RvcmUgbnJcXHUwMDNlMSBjb250aWd1b3VzIFBURXMgaW4gb25lIHNob3QuIEZhbGxzIGJhY2tcXG4rXFx0XFx0ICogdG8gb3JpZ2luYWwgcGVyLVBURSBwYXRoIChucj0xKSBpZiBiYXRjaGluZyBpcyBub3QgcG9zc2libGUuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoIXJtYXBfd2Fsa19hcmctXFx1MDAzZW1hcF91bnVzZWRfdG9femVyb3BhZ2UgXFx1MDAyNlxcdTAwMjYgbGlrZWx5KCFpc19kZXZwcml2KSlcXG4rXFx0XFx0XFx0bnIgPSBtaWdyYXRpb25fcHRlX2JhdGNoKFxcdTAwMjZwdm13LCBmb2xpbywgb2xkX3B0ZSwgaWR4KTtcXG4gXFxuLVxcdFxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFzb2Z0bGVhZl9pc19taWdyYXRpb25fcmVhZChlbnRyeSkpXFxuLVxcdFxcdFxcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XFxuK1xcdFxcdGZvbGlvX3JlZl9hZGQoZm9saW8sIG5yKTtcXG4rXFx0XFx0cHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgdm1hLCBcXHUwMDI2cm1hcF9mbGFncyk7XFxuIFxcbi1cXHRcXHRpZiAodW5saWtlbHkoaXNfZGV2aWNlX3ByaXZhdGVfcGFnZShuZXcpKSkge1xcbitcXHRcXHRpZiAodW5saWtlbHkoaXNfZGV2cHJpdikpIHtcXG4gXFx0XFx0XFx0aWYgKHB0ZV93cml0ZShwdGUpKVxcbiBcXHRcXHRcXHRcXHRlbnRyeSA9IG1ha2Vfd3JpdGFibGVfZGV2aWNlX3ByaXZhdGVfZW50cnkoXFxuIFxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhZ2VfdG9fcGZuKG5ldykpO1xcbkBAIC00MjQsMzAgKzUxNCwxMiBAQCBzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbiBcXHRcXHRcXHRcXHRwdGUgPSBwdGVfc3dwX21rdWZmZChwdGUpO1xcbiBcXHRcXHR9XFxuIFxcbi0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRVxcbi1cXHRcXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xcbi1cXHRcXHRcXHRzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpO1xcbi1cXHRcXHRcXHR1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaCk7XFxuLVxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgcHNpemUgPSBodWdlX3BhZ2Vfc2l6ZShoKTtcXG4tXFxuLVxcdFxcdFxcdHB0ZSA9IGFyY2hfbWFrZV9odWdlX3B0ZShwdGUsIHNoaWZ0LCB2bWEtXFx1MDAzZXZtX2ZsYWdzKTtcXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXFxuLVxcdFxcdFxcdFxcdGh1Z2V0bGJfYWRkX2Fub25fcm1hcChmb2xpbywgdm1hLCBwdm13LmFkZHJlc3MsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIHJtYXBfZmxhZ3MpO1xcbi1cXHRcXHRcXHRlbHNlXFxuLVxcdFxcdFxcdFxcdGh1Z2V0bGJfYWRkX2ZpbGVfcm1hcChmb2xpbyk7XFxuLVxcdFxcdFxcdHNldF9odWdlX3B0ZV9hdCh2bWEtXFx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsXFxuLVxcdFxcdFxcdFxcdFxcdHBzaXplKTtcXG4tXFx0XFx0fSBlbHNlXFxuLSNlbmRpZlxcbi1cXHRcXHR7XFxuLVxcdFxcdFxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKVxcbi1cXHRcXHRcXHRcXHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZShmb2xpbywgbmV3LCB2bWEsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdHB2bXcuYWRkcmVzcywgcm1hcF9mbGFncyk7XFxuLVxcdFxcdFxcdGVsc2VcXG4tXFx0XFx0XFx0XFx0Zm9saW9fYWRkX2ZpbGVfcm1hcF9wdGUoZm9saW8sIG5ldywgdm1hKTtcXG4tXFx0XFx0XFx0c2V0X3B0ZV9hdCh2bWEtXFx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUpO1xcbi1cXHRcXHR9XFxuK1xcdFxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKVxcbitcXHRcXHRcXHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIG5ldywgbnIsIHZtYSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHB2bXcuYWRkcmVzcywgcm1hcF9mbGFncyk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0Zm9saW9fYWRkX2ZpbGVfcm1hcF9wdGVzKGZvbGlvLCBuZXcsIG5yLCB2bWEpO1xcbitcXHRcXHRzZXRfcHRlcyh2bWEtXFx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsIG5yKTtcXG4gXFx0XFx0aWYgKFJFQURfT05DRSh2bWEtXFx1MDAzZXZtX2ZsYWdzKSBcXHUwMDI2IFZNX0xPQ0tFRClcXG4gXFx0XFx0XFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcXG4gXFxuQEAgLTQ1NSw3ICs1MjcsMTEgQEAgc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgY29tcG91bmRfb3JkZXIobmV3KSk7XFxuIFxcbiBcXHRcXHQvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovXFxuLVxcdFxcdHVwZGF0ZV9tbXVfY2FjaGUodm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTtcXG4rXFx0XFx0dXBkYXRlX21tdV9jYWNoZV9yYW5nZShOVUxMLCB2bWEsIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIG5yKTtcXG4rXFxuK1xcdFxcdC8qIFNraXAgdGhlIGJhdGNoZWQgUFRFcyAqL1xcbitcXHRcXHRwdm13LnB0ZSArPSBuciAtIDE7XFxuK1xcdFxcdHB2bXcuYWRkcmVzcyArPSAobnIgLSAxKSAqIFBBR0VfU0laRTtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIHRydWU7XFxuQEAgLTQ3NCw3ICs1NTAsOSBAQCB2b2lkIHJlbW92ZV9taWdyYXRpb25fcHRlcyhzdHJ1Y3QgZm9saW8gKnNyYywgc3RydWN0IGZvbGlvICpkc3QsXFxuIFxcdH07XFxuIFxcbiBcXHRzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgcndjID0ge1xcbi1cXHRcXHQucm1hcF9vbmUgPSByZW1vdmVfbWlncmF0aW9uX3B0ZSxcXG4rXFx0XFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKHNyYykgP1xcbitcXHRcXHRcXHRcXHRyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiIDpcXG4rXFx0XFx0XFx0XFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGUsXFxuIFxcdFxcdC5hcmcgPSBcXHUwMDI2cm1hcF93YWxrX2FyZyxcXG4gXFx0fTtcXG4gXFxuZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuY1xcbmluZGV4IGU4NTQ2Nzk1NTNiOWMzLi5jZmFjODVmNmY2OGE2OCAxMDA2NDRcXG4tLS0gYS9tbS9ybWFwLmNcXG4rKysgYi9tbS9ybWFwLmNcXG5AQCAtMjQwNSw2ICsyNDA1LDIyOSBAQCB2b2lkIHRyeV90b191bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBlbnVtIHR0dV9mbGFncyBmbGFncylcXG4gXFx0XFx0cm1hcF93YWxrKGZvbGlvLCBcXHUwMDI2cndjKTtcXG4gfVxcbiBcXG4rLyogQnVpbGQgdGhlIG1pZ3JhdGlvbiBzd2FwIFBURSB0aGF0IHJlcGxhY2VzIHB0ZXZhbCBmb3IgYSBwYWdlLiAqL1xcbitzdGF0aWMgcHRlX3QgbWFrZV9taWdyYXRpb25fc3dwX3B0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgcHRlX3QgcHRldmFsLFxcbitcXHRcXHRib29sIHdyaXRhYmxlLCBib29sIGFub25fZXhjbHVzaXZlKVxcbit7XFxuK1xcdHN3cF9lbnRyeV90IGVudHJ5O1xcbitcXHRwdGVfdCBzd3BfcHRlO1xcbitcXG4rXFx0aWYgKHdyaXRhYmxlKVxcbitcXHRcXHRlbnRyeSA9IG1ha2Vfd3JpdGFibGVfbWlncmF0aW9uX2VudHJ5KHBhZ2VfdG9fcGZuKHBhZ2UpKTtcXG4rXFx0ZWxzZSBpZiAoYW5vbl9leGNsdXNpdmUpXFxuK1xcdFxcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KFxcbitcXHRcXHRcXHRcXHRcXHRcXHRwYWdlX3RvX3BmbihwYWdlKSk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShwYWdlX3RvX3BmbihwYWdlKSk7XFxuK1xcbitcXHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XFxuK1xcdFxcdGlmIChwdGVfeW91bmcocHRldmFsKSlcXG4rXFx0XFx0XFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7XFxuK1xcdFxcdGlmIChwdGVfZGlydHkocHRldmFsKSlcXG4rXFx0XFx0XFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShlbnRyeSk7XFxuK1xcdFxcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcXG4rXFx0XFx0aWYgKHB0ZV9zb2Z0X2RpcnR5KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcXG4rXFx0XFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpO1xcbitcXHRcXHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcXG4rXFx0XFx0aWYgKHB0ZV9zd3BfdWZmZChwdGV2YWwpKVxcbitcXHRcXHRcXHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBzd3BfcHRlO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZXBsYWNlIHRoZSBodWdldGxiIHBhZ2UgdGFibGUgbWFwcGluZyBmb3IgZm9saW8gd2l0aCBtaWdyYXRpb24gZW50cmllcy5cXG4rICpcXG4rICogQGFyZzogZW51bSB0dHVfZmxhZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBhcmd1bWVudC5cXG4rICovXFxuK3N0YXRpYyBib29sIHRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuK1xcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcXG4re1xcbitcXHRjb25zdCB1bnNpZ25lZCBsb25nIGhzeiA9IGh1Z2VfcGFnZV9zaXplKGhzdGF0ZV92bWEodm1hKSk7XFxuK1xcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTtcXG4rXFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xcbitcXHRib29sIGFub25fZXhjbHVzaXZlLCB3cml0YWJsZSwgcmV0ID0gdHJ1ZTtcXG4rXFx0Ym9vbCBhbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcXG4rXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbitcXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xcbitcXHR1bnNpZ25lZCBsb25nIHBmbjtcXG4rXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdHB0ZV90IHB0ZXZhbDtcXG4rXFxuK1xcdHJhbmdlLmVuZCA9IHZtYV9hZGRyZXNzX2VuZChcXHUwMDI2cHZtdyk7XFxuK1xcdG1tdV9ub3RpZmllcl9yYW5nZV9pbml0KFxcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVxcdTAwM2V2bV9tbSxcXG4rXFx0XFx0XFx0XFx0YWRkcmVzcywgcmFuZ2UuZW5kKTtcXG4rXFx0LyogSWYgc2hhcmluZyBpcyBwb3NzaWJsZSwgc3RhcnQgYW5kIGVuZCB3aWxsIGJlIGFkanVzdGVkIGFjY29yZGluZ2x5LiAqL1xcbitcXHRhZGp1c3RfcmFuZ2VfaWZfcG1kX3NoYXJpbmdfcG9zc2libGUodm1hLCBcXHUwMDI2cmFuZ2Uuc3RhcnQsIFxcdTAwMjZyYW5nZS5lbmQpO1xcbitcXHRtbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydChcXHUwMDI2cmFuZ2UpO1xcbitcXG4rXFx0aWYgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFxcdTAwMjZwdm13KSkge1xcbitcXHRcXHRhZGRyZXNzID0gcHZtdy5hZGRyZXNzO1xcbitcXHRcXHRwdGV2YWwgPSBodWdlX3B0ZXBfZ2V0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSk7XFxuK1xcdFxcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpXFxuK1xcdFxcdFxcdHBmbiA9IHB0ZV9wZm4ocHRldmFsKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oc29mdGxlYWZfZnJvbV9wdGUocHRldmFsKSk7XFxuK1xcbitcXHRcXHRwYWdlID0gZm9saW9fcGFnZShmb2xpbywgcGZuIC0gZm9saW9fcGZuKGZvbGlvKSk7XFxuK1xcdFxcdGFub25fZXhjbHVzaXZlID0gYW5vbiBcXHUwMDI2XFx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS4gVGhlcmUgaXMgbm9cXG4rXFx0XFx0ICogd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heSBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sXFxuK1xcdFxcdCAqIHNvIHdlIG11c3QgZmx1c2ggdGhlbSBhbGwuIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWRcXG4rXFx0XFx0ICogYWJvdmUgdG8gY292ZXIgdGhpcyByYW5nZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUbyBjYWxsIGh1Z2VfcG1kX3Vuc2hhcmUsIGlfbW1hcF9yd3NlbSBtdXN0IGJlIGhlbGQgaW4gd3JpdGVcXG4rXFx0XFx0ICogbW9kZS4gQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkgZG8gdGhpcyBvdXRzaWRlIHJtYXBcXG4rXFx0XFx0ICogcm91dGluZXMuIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS5cXG4rXFx0XFx0ICogTG9jayBvcmRlciBkaWN0YXRlcyBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFIGlfbW1hcF9yd3NlbS5cXG4rXFx0XFx0ICogV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmQgZmFpbCBpZiB1bnN1Y2Nlc3NmdWwuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoIWFub24pIHtcXG4rXFx0XFx0XFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xcbitcXG4rXFx0XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgXFx1MDAyNiBUVFVfUk1BUF9MT0NLRUQpKTtcXG4rXFx0XFx0XFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpIHtcXG4rXFx0XFx0XFx0XFx0cmV0ID0gZmFsc2U7XFxuK1xcdFxcdFxcdFxcdGdvdG8gd2Fsa19kb25lO1xcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHR0bGJfZ2F0aGVyX21tdV92bWEoXFx1MDAyNnRsYiwgdm1hKTtcXG4rXFx0XFx0XFx0aWYgKGh1Z2VfcG1kX3Vuc2hhcmUoXFx1MDAyNnRsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHtcXG4rXFx0XFx0XFx0XFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XFxuK1xcdFxcdFxcdFxcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXFx1MDAyNnRsYiwgdm1hKTtcXG4rXFx0XFx0XFx0XFx0dGxiX2ZpbmlzaF9tbXUoXFx1MDAyNnRsYik7XFxuK1xcdFxcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdFxcdCAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLFxcbitcXHRcXHRcXHRcXHQgKiBjb25zZXF1ZW50bHkgdW5tYXBwaW5nIHRoZSBmb2xpby5cXG4rXFx0XFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdFxcdGdvdG8gd2Fsa19kb25lO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xcbitcXHRcXHRcXHR0bGJfZmluaXNoX21tdShcXHUwMDI2dGxiKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LyogTnVrZSB0aGUgaHVnZXRsYiBwYWdlIHRhYmxlIGVudHJ5ICovXFxuK1xcdFxcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcXG4rXFx0XFx0aWYgKGh1Z2VfcHRlX2RpcnR5KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbitcXHRcXHR3cml0YWJsZSA9IHB0ZV93cml0ZShwdGV2YWwpO1xcbitcXG4rXFx0XFx0Vk1fV0FSTl9PTl9GT0xJTyh3cml0YWJsZSBcXHUwMDI2XFx1MDAyNiBhbm9uIFxcdTAwMjZcXHUwMDI2ICFhbm9uX2V4Y2x1c2l2ZSwgZm9saW8pO1xcbitcXG4rXFx0XFx0aWYgKFBhZ2VIV1BvaXNvbihwYWdlKSkge1xcbitcXHRcXHRcXHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpO1xcbitcXHRcXHRcXHRodWdldGxiX2NvdW50X3N1Yihmb2xpb19ucl9wYWdlcyhmb2xpbyksIG1tKTtcXG4rXFx0XFx0XFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBoc3opO1xcbitcXHRcXHR9IGVsc2UgaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSBcXHUwMDI2XFx1MDAyNiBwdGVfdW51c2VkKHB0ZXZhbCkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIXVzZXJmYXVsdGZkX2FybWVkKHZtYSkpIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogVGhlIGd1ZXN0IGluZGljYXRlZCB0aGF0IHRoZSBwYWdlIGNvbnRlbnQgaXMgb2Ygbm9cXG4rXFx0XFx0XFx0ICogaW50ZXJlc3QgYW55bW9yZS4gU2ltcGx5IGRpc2NhcmQgdGhlIHB0ZSwgdm1zY2FuXFxuK1xcdFxcdFxcdCAqIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0LlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0cHRlX3Qgc3dwX3B0ZTtcXG4rXFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cXG4rXFx0XFx0XFx0ICogYXJjaGl0ZWN0dXJlcyB3aGVyZSB3ZSBjb3VsZCBoYXZlIFBGTiBzd2FwIFBURXMsXFxuK1xcdFxcdFxcdCAqIHNvIHdlJ2xsIG5vdCBjaGVjay9jYXJlLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0aWYgKGFyY2hfdW5tYXBfb25lKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXZhbCkgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdFxcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHB0ZXZhbCwgaHN6KTtcXG4rXFx0XFx0XFx0XFx0cmV0ID0gZmFsc2U7XFxuK1xcdFxcdFxcdFxcdGdvdG8gd2Fsa19kb25lO1xcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHQvKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xcbitcXHRcXHRcXHRpZiAoYW5vbl9leGNsdXNpdmUgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIGh1Z2V0bGJfdHJ5X3NoYXJlX2Fub25fcm1hcChmb2xpbykpIHtcXG4rXFx0XFx0XFx0XFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0cHRldmFsLCBoc3opO1xcbitcXHRcXHRcXHRcXHRyZXQgPSBmYWxzZTtcXG4rXFx0XFx0XFx0XFx0Z290byB3YWxrX2RvbmU7XFxuK1xcdFxcdFxcdH1cXG4rXFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIFN0b3JlIHRoZSBwZm4gb2YgdGhlIHBhZ2UgaW4gYSBzcGVjaWFsIG1pZ3JhdGlvblxcbitcXHRcXHRcXHQgKiBwdGUuIGRvX3N3YXBfcGFnZSgpIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWlncmF0aW9uXFxuK1xcdFxcdFxcdCAqIHB0ZSBpcyByZW1vdmVkIGFuZCB0aGVuIHJlc3RhcnQgZmF1bHQgaGFuZGxpbmcuXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRzd3BfcHRlID0gbWFrZV9taWdyYXRpb25fc3dwX3B0ZShwYWdlLCBwdGV2YWwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCB3cml0YWJsZSwgYW5vbl9leGNsdXNpdmUpO1xcbitcXHRcXHRcXHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlLCBoc3opO1xcbitcXHRcXHRcXHR0cmFjZV9zZXRfbWlncmF0aW9uX3B0ZShhZGRyZXNzLCBwdGVfdmFsKHN3cF9wdGUpLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRmb2xpb19vcmRlcihmb2xpbykpO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRodWdldGxiX3JlbW92ZV9ybWFwKGZvbGlvKTtcXG4rXFx0XFx0aWYgKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9MT0NLRUQpXFxuK1xcdFxcdFxcdG1sb2NrX2RyYWluX2xvY2FsKCk7XFxuK1xcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuK3dhbGtfZG9uZTpcXG4rXFx0XFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcXHUwMDI2cHZtdyk7XFxuK1xcdH1cXG4rXFxuK1xcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChcXHUwMDI2cmFuZ2UpO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2goc3RydWN0IGZvbGlvICpmb2xpbyxcXG4rXFx0XFx0c3RydWN0IHBhZ2Vfdm1hX21hcHBlZF93YWxrICpwdm13LCBwdGVfdCBwdGUsXFxuK1xcdFxcdHN0cnVjdCBwYWdlICpzdWJwYWdlLCBib29sIGFub25fZXhjbHVzaXZlKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIsIGFkZHIgPSBwdm13LVxcdTAwM2VhZGRyZXNzO1xcbitcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IHB2bXctXFx1MDAzZXZtYTtcXG4rXFx0dW5zaWduZWQgaW50IG1heF9uciwgbnIsIGk7XFxuK1xcbisjaWZkZWYgX19IQVZFX0FSQ0hfVU5NQVBfT05FXFxuK1xcdC8qIENhbm5vdCBiYXRjaCB1bm1hcCBpZiBhcmNoX3VubWFwX29uZSgpIGlzIGRlZmluZWQuICovXFxuK1xcdHJldHVybiAxO1xcbisjZW5kaWZcXG4rXFxuK1xcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXHRpZiAoZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIHx8IGZvbGlvX3Rlc3RfaGFzX2h3cG9pc29uZWQoZm9saW8pKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFx0aWYgKHB0ZV91bnVzZWQocHRlKSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHQvKiBXZSBtYXkgb25seSBiYXRjaCB3aXRoaW4gYSBzaW5nbGUgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLiAqL1xcbitcXHRlbmRfYWRkciA9IHBtZF9hZGRyX2VuZChhZGRyLCB2bWEtXFx1MDAzZXZtX2VuZCk7XFxuK1xcdG1heF9uciA9IChlbmRfYWRkciAtIGFkZHIpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdC8qXFxuK1xcdCAqIElmIHVubWFwIGZhaWxzLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHB0ZXMuIFRvIGF2b2lkIGFjY2lkZW50YWxseVxcbitcXHQgKiB1cGdyYWRpbmcgd3JpdGUgcGVybWlzc2lvbnMgZm9yIHB0ZXMgdGhhdCB3ZXJlIG5vdCBvcmlnaW5hbGx5IHdyaXRhYmxlLFxcbitcXHQgKiBhbmQgdG8gYXZvaWQgbG9zaW5nIHRoZSBzb2Z0LWRpcnR5IGJpdCwgdXNlIHRoZSBhcHByb3ByaWF0ZSBGUEIgZmxhZ3MuXFxuK1xcdCAqL1xcbitcXHRuciA9IGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdm13LVxcdTAwM2VwdGUsIFxcdTAwMjZwdGUsIG1heF9ucixcXG4rXFx0XFx0XFx0XFx0ICAgRlBCX1JFU1BFQ1RfV1JJVEUgfCBGUEJfUkVTUEVDVF9TT0ZUX0RJUlRZKTtcXG4rXFxuK1xcdC8qIExpbWl0IHBvc3NpYmxlIGJhdGNoIGNvdW50IHRvIGEgdW5pZm9ybSBQYWdlQW5vbkV4Y2x1c2l2ZSB2YWx1ZSAqL1xcbitcXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xcbitcXHRcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgbnI7IGkrKylcXG4rXFx0XFx0XFx0aWYgKFBhZ2VBbm9uRXhjbHVzaXZlKHN1YnBhZ2UgKyBpKSAhPSBhbm9uX2V4Y2x1c2l2ZSlcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdG5yID0gaTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIG5yO1xcbit9XFxuK1xcbiAvKlxcbiAgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50LlxcbiAgKlxcbkBAIC0yNDIxLDggKzI2NDQsNyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdHN0cnVjdCBwYWdlICpzdWJwYWdlO1xcbiBcXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xcbiBcXHRlbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcGZuO1xcbi1cXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuLCBlbmRfYWRkciwgbnJfcGFnZXM7XFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBXaGVuIHJhY2luZyBhZ2FpbnN0IGUuZy4gemFwX3B0ZV9yYW5nZSgpIG9uIGFub3RoZXIgY3B1LFxcbkBAIC0yNDM1LDI2ICsyNjU3LDEzIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIEZvciBUSFAsIHdlIGhhdmUgdG8gYXNzdW1lIHRoZSB3b3JzZSBjYXNlIGllIHBtZCBmb3IgaW52YWxpZGF0aW9uLlxcbi1cXHQgKiBGb3IgaHVnZXRsYiwgaXQgY291bGQgYmUgbXVjaCB3b3JzZSBpZiB3ZSBuZWVkIHRvIGRvIHB1ZFxcbi1cXHQgKiBpbnZhbGlkYXRpb24gaW4gdGhlIGNhc2Ugb2YgcG1kIHNoYXJpbmcuXFxuIFxcdCAqXFxuIFxcdCAqIE5vdGUgdGhhdCB0aGUgcGFnZSBjYW4gbm90IGJlIGZyZWUgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mXFxuLVxcdCAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS5cXG4rXFx0ICogdHJ5X3RvX21pZ3JhdGUoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIHBhZ2UuXFxuIFxcdCAqL1xcbiBcXHRyYW5nZS5lbmQgPSB2bWFfYWRkcmVzc19lbmQoXFx1MDAyNnB2bXcpO1xcbiBcXHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcXHUwMDI2cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS1cXHUwMDNldm1fbW0sXFxuIFxcdFxcdFxcdFxcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XFxuLVxcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIHNoYXJpbmcgaXMgcG9zc2libGUsIHN0YXJ0IGFuZCBlbmQgd2lsbCBiZSBhZGp1c3RlZFxcbi1cXHRcXHQgKiBhY2NvcmRpbmdseS5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsIFxcdTAwMjZyYW5nZS5zdGFydCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2cmFuZ2UuZW5kKTtcXG4tXFxuLVxcdFxcdC8qIFdlIG5lZWQgdGhlIGh1Z2UgcGFnZSBzaXplIGZvciBzZXRfaHVnZV9wdGVfYXQoKSAqL1xcbi1cXHRcXHRoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xcbi1cXHR9XFxuIFxcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFxcdTAwMjZyYW5nZSk7XFxuIFxcbiBcXHR3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoXFx1MDAyNnB2bXcpKSB7XFxuQEAgLTI0ODgsMTEgKzI2OTcsOCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdFZNX0JVR19PTl9GT0xJTyhmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pIHx8XFxuIFxcdFxcdFxcdFxcdFxcdCFmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbyksIGZvbGlvKTtcXG4gXFxuLVxcdFxcdFxcdGlmIChzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeShcXHUwMDI2cHZtdywgc3VicGFnZSkpIHtcXG4tXFx0XFx0XFx0XFx0cmV0ID0gZmFsc2U7XFxuLVxcdFxcdFxcdFxcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXFx1MDAyNnB2bXcpO1xcbi1cXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRpZiAoc2V0X3BtZF9taWdyYXRpb25fZW50cnkoXFx1MDAyNnB2bXcsIHN1YnBhZ2UpKVxcbitcXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAjZW5kaWZcXG4gXFx0XFx0fVxcbkBAIC0yNTAxLDEwICsyNzA3LDcgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHRWTV9CVUdfT05fRk9MSU8oIXB2bXcucHRlLCBmb2xpbyk7XFxuIFxcbiBcXHRcXHRhZGRyZXNzID0gcHZtdy5hZGRyZXNzO1xcbi1cXHRcXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcXG4tXFx0XFx0XFx0cHRldmFsID0gaHVnZV9wdGVwX2dldChtbSwgYWRkcmVzcywgcHZtdy5wdGUpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdHB0ZXZhbCA9IHB0ZXBfZ2V0KHB2bXcucHRlKTtcXG4rXFx0XFx0cHRldmFsID0gcHRlcF9nZXQocHZtdy5wdGUpO1xcbiBcXHRcXHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XFxuIFxcdFxcdFxcdHBmbiA9IHB0ZV9wZm4ocHRldmFsKTtcXG4gXFx0XFx0fSBlbHNlIHtcXG5AQCAtMjUxNSw2OCArMjcxOCwyMiBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdGNvbnN0IHNvZnRsZWFmX3QgZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3B0ZShwdGV2YWwpO1xcbiBcXG4gXFx0XFx0XFx0cGZuID0gc29mdGxlYWZfdG9fcGZuKGVudHJ5KTtcXG4tXFx0XFx0XFx0Vk1fV0FSTl9PTl9GT0xJTyhmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pLCBmb2xpbyk7XFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdHN1YnBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcXG4gXFx0XFx0YW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdFxcdFxcdCBQYWdlQW5vbkV4Y2x1c2l2ZShzdWJwYWdlKTtcXG4gXFxuLVxcdFxcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XFxuLVxcdFxcdFxcdGJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuLVxcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBodWdlX3BtZF91bnNoYXJlIG1heSB1bm1hcCBhbiBlbnRpcmUgUE1EIHBhZ2UuXFxuLVxcdFxcdFxcdCAqIFRoZXJlIGlzIG5vIHdheSBvZiBrbm93aW5nIGV4YWN0bHkgd2hpY2ggUE1EcyBtYXlcXG4tXFx0XFx0XFx0ICogYmUgY2FjaGVkIGZvciB0aGlzIG1tLCBzbyB3ZSBtdXN0IGZsdXNoIHRoZW0gYWxsLlxcbi1cXHRcXHRcXHQgKiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkIGFib3ZlIHRvIGNvdmVyIHRoaXNcXG4tXFx0XFx0XFx0ICogcmFuZ2UuXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xcbi1cXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZVxcbi1cXHRcXHRcXHQgKiBoZWxkIGluIHdyaXRlIG1vZGUuICBDYWxsZXIgbmVlZHMgdG8gZXhwbGljaXRseVxcbi1cXHRcXHRcXHQgKiBkbyB0aGlzIG91dHNpZGUgcm1hcCByb3V0aW5lcy5cXG4tXFx0XFx0XFx0ICpcXG4tXFx0XFx0XFx0ICogV2UgYWxzbyBtdXN0IGhvbGQgaHVnZXRsYiB2bWFfbG9jayBpbiB3cml0ZSBtb2RlLlxcbi1cXHRcXHRcXHQgKiBMb2NrIG9yZGVyIGRpY3RhdGVzIGFjcXVpcmluZyB2bWFfbG9jayBCRUZPUkVcXG4tXFx0XFx0XFx0ICogaV9tbWFwX3J3c2VtLiAgV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmRcXG4tXFx0XFx0XFx0ICogZmFpbCBpZiB1bnN1Y2Nlc3NmdWwuXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRpZiAoIWFub24pIHtcXG4tXFx0XFx0XFx0XFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xcbitcXHRcXHRucl9wYWdlcyA9IDE7XFxuK1xcdFxcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcXG4rXFx0XFx0XFx0bnJfcGFnZXMgPSBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaChmb2xpbywgXFx1MDAyNnB2bXcsIHB0ZXZhbCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgc3VicGFnZSwgYW5vbl9leGNsdXNpdmUpO1xcbiBcXG4tXFx0XFx0XFx0XFx0Vk1fQlVHX09OKCEoZmxhZ3MgXFx1MDAyNiBUVFVfUk1BUF9MT0NLRUQpKTtcXG4tXFx0XFx0XFx0XFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpIHtcXG4tXFx0XFx0XFx0XFx0XFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcXHUwMDI2cHZtdyk7XFxuLVxcdFxcdFxcdFxcdFxcdHJldCA9IGZhbHNlO1xcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHRlbmRfYWRkciA9IGFkZHJlc3MgKyBucl9wYWdlcyAqIFBBR0VfU0laRTtcXG4rXFx0XFx0XFx0Zmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBhZGRyZXNzLCBlbmRfYWRkcik7XFxuIFxcbi1cXHRcXHRcXHRcXHR0bGJfZ2F0aGVyX21tdV92bWEoXFx1MDAyNnRsYiwgdm1hKTtcXG4tXFx0XFx0XFx0XFx0aWYgKGh1Z2VfcG1kX3Vuc2hhcmUoXFx1MDAyNnRsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHtcXG4tXFx0XFx0XFx0XFx0XFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XFxuLVxcdFxcdFxcdFxcdFxcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXFx1MDAyNnRsYiwgdm1hKTtcXG4tXFx0XFx0XFx0XFx0XFx0dGxiX2ZpbmlzaF9tbXUoXFx1MDAyNnRsYik7XFxuLVxcdFxcdFxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdFxcdFxcdCAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLFxcbi1cXHRcXHRcXHRcXHRcXHQgKiBjb25zZXF1ZW50bHkgdW5tYXBwaW5nIHRoZSBmb2xpby5cXG4tXFx0XFx0XFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdFxcdFxcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXFx1MDAyNnB2bXcpO1xcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRcXHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcXG4tXFx0XFx0XFx0XFx0dGxiX2ZpbmlzaF9tbXUoXFx1MDAyNnRsYik7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0LyogTnVrZSB0aGUgaHVnZXRsYiBwYWdlIHRhYmxlIGVudHJ5ICovXFxuLVxcdFxcdFxcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcXG4tXFx0XFx0XFx0aWYgKHB0ZV9kaXJ0eShwdGV2YWwpKVxcbi1cXHRcXHRcXHRcXHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcXG4tXFx0XFx0XFx0d3JpdGFibGUgPSBwdGVfd3JpdGUocHRldmFsKTtcXG4tXFx0XFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcXG4tXFx0XFx0XFx0Zmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHJlc3MsIHBmbik7XFxuLVxcdFxcdFxcdC8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cnkuICovXFxuK1xcdFxcdFxcdC8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cmllcy4gKi9cXG4rXFx0XFx0XFx0cHRldmFsID0gZ2V0X2FuZF9jbGVhcl9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgbnJfcGFnZXMpO1xcbiBcXHRcXHRcXHRpZiAoc2hvdWxkX2RlZmVyX2ZsdXNoKG1tLCBmbGFncykpIHtcXG4gXFx0XFx0XFx0XFx0LypcXG4gXFx0XFx0XFx0XFx0ICogV2UgY2xlYXIgdGhlIFBURSBidXQgZG8gbm90IGZsdXNoIHNvIHBvdGVudGlhbGx5XFxuQEAgLTI1ODYsMTEgKzI3NDMsOSBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdFxcdCAqIHRyYW5zaXRpb24gb24gYSBjYWNoZWQgVExCIGVudHJ5IGlzIHdyaXR0ZW4gdGhyb3VnaFxcbiBcXHRcXHRcXHRcXHQgKiBhbmQgdHJhcHMgaWYgdGhlIFBURSBpcyB1bm1hcHBlZC5cXG4gXFx0XFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdFxcdHB0ZXZhbCA9IHB0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgYWRkcmVzcywgcHZtdy5wdGUpO1xcbi1cXG4tXFx0XFx0XFx0XFx0c2V0X3RsYl91YmNfZmx1c2hfcGVuZGluZyhtbSwgcHRldmFsLCBhZGRyZXNzLCBhZGRyZXNzICsgUEFHRV9TSVpFKTtcXG4rXFx0XFx0XFx0XFx0c2V0X3RsYl91YmNfZmx1c2hfcGVuZGluZyhtbSwgcHRldmFsLCBhZGRyZXNzLCBlbmRfYWRkcik7XFxuIFxcdFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdFxcdHB0ZXZhbCA9IHB0ZXBfY2xlYXJfZmx1c2godm1hLCBhZGRyZXNzLCBwdm13LnB0ZSk7XFxuK1xcdFxcdFxcdFxcdGZsdXNoX3RsYl9yYW5nZSh2bWEsIGFkZHJlc3MsIGVuZF9hZGRyKTtcXG4gXFx0XFx0XFx0fVxcbiBcXHRcXHRcXHRpZiAocHRlX2RpcnR5KHB0ZXZhbCkpXFxuIFxcdFxcdFxcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbkBAIC0yNjEzLDE0ICsyNzY4LDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHRcXHRWTV9XQVJOX09OX0ZPTElPKGZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSwgZm9saW8pO1xcbiBcXG4gXFx0XFx0XFx0cHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KHN1YnBhZ2UpKTtcXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcXG4tXFx0XFx0XFx0XFx0aHVnZXRsYl9jb3VudF9zdWIoZm9saW9fbnJfcGFnZXMoZm9saW8pLCBtbSk7XFxuLVxcdFxcdFxcdFxcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0aHN6KTtcXG4tXFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcXG4tXFx0XFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuLVxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcXG4rXFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuIFxcdFxcdH0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpIFxcdTAwMjZcXHUwMDI2IHB0ZV91bnVzZWQocHRldmFsKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHRcXHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xcbiBcXHRcXHRcXHQvKlxcbkBAIC0yNjM1LDggKzI3ODQsOCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdCAqL1xcbiBcXHRcXHRcXHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xcbiBcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRzd3BfZW50cnlfdCBlbnRyeTtcXG4gXFx0XFx0XFx0cHRlX3Qgc3dwX3B0ZTtcXG4rXFx0XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuIFxcbiBcXHRcXHRcXHQvKlxcbiBcXHRcXHRcXHQgKiBhcmNoX3VubWFwX29uZSgpIGlzIGV4cGVjdGVkIHRvIGJlIGEgTk9QIG9uXFxuQEAgLTI2NDQsMzIgKzI3OTMsMTUgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHRcXHQgKiBzbyB3ZSdsbCBub3QgY2hlY2svY2FyZS5cXG4gXFx0XFx0XFx0ICovXFxuIFxcdFxcdFxcdGlmIChhcmNoX3VubWFwX29uZShtbSwgdm1hLCBhZGRyZXNzLCBwdGV2YWwpIFxcdTAwM2MgMCkge1xcbi1cXHRcXHRcXHRcXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0XFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0cHRldmFsLCBoc3opO1xcbi1cXHRcXHRcXHRcXHRlbHNlXFxuLVxcdFxcdFxcdFxcdFxcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xcbi1cXHRcXHRcXHRcXHRyZXQgPSBmYWxzZTtcXG4tXFx0XFx0XFx0XFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcXHUwMDI2cHZtdyk7XFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHRcXHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xcbitcXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuIFxcdFxcdFxcdH1cXG4gXFxuLVxcdFxcdFxcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZSgpOiBjbGVhciBQVEUgZmlyc3QuICovXFxuLVxcdFxcdFxcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XFxuLVxcdFxcdFxcdFxcdGlmIChhbm9uX2V4Y2x1c2l2ZSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHRcXHQgICAgaHVnZXRsYl90cnlfc2hhcmVfYW5vbl9ybWFwKGZvbGlvKSkge1xcbi1cXHRcXHRcXHRcXHRcXHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHRwdGV2YWwsIGhzeik7XFxuLVxcdFxcdFxcdFxcdFxcdHJldCA9IGZhbHNlO1xcbi1cXHRcXHRcXHRcXHRcXHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFxcdTAwMjZwdm13KTtcXG4tXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0fSBlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHRcXHQgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZShmb2xpbywgc3VicGFnZSkpIHtcXG4tXFx0XFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuLVxcdFxcdFxcdFxcdHJldCA9IGZhbHNlO1xcbi1cXHRcXHRcXHRcXHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFxcdTAwMjZwdm13KTtcXG4tXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xcbitcXHRcXHRcXHRpZiAoYW5vbl9leGNsdXNpdmUgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhmb2xpbywgc3VicGFnZSwgbnJfcGFnZXMpKSB7XFxuK1xcdFxcdFxcdFxcdHNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7XFxuK1xcdFxcdFxcdFxcdGdvdG8gd2Fsa19hYm9ydDtcXG4gXFx0XFx0XFx0fVxcbiBcXG4gXFx0XFx0XFx0LypcXG5AQCAtMjY3Nyw1MiArMjgwOSw0MCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdCAqIHB0ZS4gZG9fc3dhcF9wYWdlKCkgd2lsbCB3YWl0IHVudGlsIHRoZSBtaWdyYXRpb25cXG4gXFx0XFx0XFx0ICogcHRlIGlzIHJlbW92ZWQgYW5kIHRoZW4gcmVzdGFydCBmYXVsdCBoYW5kbGluZy5cXG4gXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmICh3cml0YWJsZSlcXG4tXFx0XFx0XFx0XFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0cGFnZV90b19wZm4oc3VicGFnZSkpO1xcbi1cXHRcXHRcXHRlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSlcXG4tXFx0XFx0XFx0XFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkoXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTtcXG4tXFx0XFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRcXHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHRwYWdlX3RvX3BmbihzdWJwYWdlKSk7XFxuLVxcdFxcdFxcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcXG4tXFx0XFx0XFx0XFx0aWYgKHB0ZV95b3VuZyhwdGV2YWwpKVxcbi1cXHRcXHRcXHRcXHRcXHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X3lvdW5nKGVudHJ5KTtcXG4tXFx0XFx0XFx0XFx0aWYgKHB0ZV9kaXJ0eShwdGV2YWwpKVxcbi1cXHRcXHRcXHRcXHRcXHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTtcXG4tXFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpO1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3NvZnRfZGlydHkocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3VmZmQocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xcbi1cXHRcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRcXHRzd3BfcHRlID0gc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSk7XFxuLVxcdFxcdFxcdFxcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3N3cF91ZmZkKHB0ZXZhbCkpXFxuLVxcdFxcdFxcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0aHN6KTtcXG4tXFx0XFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRcXHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSk7XFxuK1xcdFxcdFxcdHN3cF9wdGUgPSBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKHN1YnBhZ2UsIHB0ZXZhbCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0IHdyaXRhYmxlLCBhbm9uX2V4Y2x1c2l2ZSk7XFxuIFxcdFxcdFxcdHRyYWNlX3NldF9taWdyYXRpb25fcHRlKGFkZHJlc3MsIHB0ZV92YWwoc3dwX3B0ZSksXFxuIFxcdFxcdFxcdFxcdFxcdFxcdGZvbGlvX29yZGVyKGZvbGlvKSk7XFxuK1xcbitcXHRcXHRcXHQvKiBTZXQgbnJfcGFnZXMgbWlncmF0aW9uIGVudHJpZXMsIGFkdmFuY2luZyB0aGUgUEZOLiAqL1xcbitcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xcbitcXHRcXHRcXHRcXHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzICsgKHVuc2lnbmVkIGxvbmcpaSAqIFBBR0VfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgcHZtdy5wdGUgKyBpLCBzd3BfcHRlKTtcXG4rXFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQoc3dwX3B0ZSk7XFxuK1xcdFxcdFxcdH1cXG4gXFx0XFx0XFx0LypcXG4gXFx0XFx0XFx0ICogTm8gbmVlZCB0byBpbnZhbGlkYXRlIGhlcmUgaXQgd2lsbCBzeW5jaHJvbml6ZSBvblxcbiBcXHRcXHRcXHQgKiBhZ2FpbnN0IHRoZSBzcGVjaWFsIHN3YXAgbWlncmF0aW9uIHB0ZS5cXG4gXFx0XFx0XFx0ICovXFxuIFxcdFxcdH1cXG4gXFxuLVxcdFxcdGlmICh1bmxpa2VseShmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSlcXG4tXFx0XFx0XFx0aHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7XFxuLVxcdFxcdGVsc2VcXG4tXFx0XFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcHRlKGZvbGlvLCBzdWJwYWdlLCB2bWEpO1xcbitcXHRcXHRmb2xpb19yZW1vdmVfcm1hcF9wdGVzKGZvbGlvLCBzdWJwYWdlLCBucl9wYWdlcywgdm1hKTtcXG4gXFx0XFx0aWYgKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9MT0NLRUQpXFxuIFxcdFxcdFxcdG1sb2NrX2RyYWluX2xvY2FsKCk7XFxuLVxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuK1xcdFxcdGZvbGlvX3B1dF9yZWZzKGZvbGlvLCBucl9wYWdlcyk7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBJZiB3ZSBiYXRjaGVkIHRoZSBlbnRpcmUgZm9saW8sIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0b1xcbitcXHRcXHQgKiB3YWxrOyBzdG9wIHJpZ2h0IGhlcmUuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAobnJfcGFnZXMgPT0gZm9saW9fbnJfcGFnZXMoZm9saW8pKVxcbitcXHRcXHRcXHRnb3RvIHdhbGtfZG9uZTtcXG4rXFx0XFx0Y29udGludWU7XFxuK3dhbGtfYWJvcnQ6XFxuK1xcdFxcdHJldCA9IGZhbHNlO1xcbit3YWxrX2RvbmU6XFxuK1xcdFxcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXFx1MDAyNnB2bXcpO1xcbitcXHRcXHRicmVhaztcXG4gXFx0fVxcbiBcXG4gXFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFxcdTAwMjZyYW5nZSk7XFxuQEAgLTI3NDEsNyArMjg2MSw4IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gdm9pZCB0cnlfdG9fbWlncmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBlbnVtIHR0dV9mbGFncyBmbGFncylcXG4ge1xcbiBcXHRzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgcndjID0ge1xcbi1cXHRcXHQucm1hcF9vbmUgPSB0cnlfdG9fbWlncmF0ZV9vbmUsXFxuK1xcdFxcdC5ybWFwX29uZSA9IGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgP1xcbitcXHRcXHRcXHRcXHR0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZSA6IHRyeV90b19taWdyYXRlX29uZSxcXG4gXFx0XFx0LmFyZyA9ICh2b2lkICopZmxhZ3MsXFxuIFxcdFxcdC5kb25lID0gZm9saW9fbm90X21hcHBlZCxcXG4gXFx0XFx0LmFub25fbG9jayA9IGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6MjMuMTM5ODU1MjQxWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTMxNDEzNTAwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNSUdSQVRJT05cIixcbiAgICBcIkhVR0VUTEJfUEFHRVwiLFxuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtaWdyYXRpb25fcHRlX2JhdGNoXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZVwiLFxuICAgIFwicmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYlwiLFxuICAgIFwicmVtb3ZlX21pZ3JhdGlvbl9wdGVzXCIsXG4gICAgXCJtYWtlX21pZ3JhdGlvbl9zd3BfcHRlXCIsXG4gICAgXCJ0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZVwiLFxuICAgIFwiZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2hcIixcbiAgICBcInRyeV90b19taWdyYXRlX29uZVwiLFxuICAgIFwidHJ5X3RvX21pZ3JhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGJhdGNoaW5nIGZvciBtaWdyYXRpb24gUFRFcyB0byBvcHRpbWl6ZSBtZW1vcnkgbWlncmF0aW9uLCBlc3BlY2lhbGx5IGZvciBsYXJnZSBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zIGluIG1tL21pZ3JhdGUuYyBhbmQgbW0vcm1hcC5jLiBGdXp6aW5nIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgYmF0Y2hpbmcgbG9naWMgY29ycmVjdGx5IGhhbmRsZXMgUFRFcywgcGVybWlzc2lvbnMsIGFuZCBlZGdlIGNhc2VzIGxpa2UgZGV2aWNlIHByaXZhdGUgZm9saW9zIG9yIGh1Z2V0bGIgcGFnZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYzZlMmJlMWUxYTYxYmJmYTgxMWQ3NWMxZDc3MDJhNGQ5OGM1ZTg4NVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gSnVsIDEyIDEzOjEyOjIwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ybWFwLmggYi9pbmNsdWRlL2xpbnV4L3JtYXAuaFxuaW5kZXggOGRjMDg3MWU1ZjAwMTEuLjY0OTI5NDkwYTdjZmNhIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmhcbisrKyBiL2luY2x1ZGUvbGludXgvcm1hcC5oXG5AQCAtNzA2LDE3ICs3MDYsMTggQEAgc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X2R1cF9hbm9uX3JtYXBfcG1kKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gfVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuLVx0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXG4ge1xuK1x0LyogZGV2aWNlIHByaXZhdGUgZm9saW9zIGNhbm5vdCBnZXQgcGlubmVkIHZpYSBHVVAuICovXG4rXHRjb25zdCBib29sIHBpbm5hYmxlID0gbGlrZWx5KCFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpO1xuK1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghUGFnZUFub25FeGNsdXNpdmUocGFnZSksIGZvbGlvKTtcbiBcdF9fZm9saW9fcm1hcF9zYW5pdHlfY2hlY2tzKGZvbGlvLCBwYWdlLCBucl9wYWdlcywgbGV2ZWwpO1xuIFxuLVx0LyogZGV2aWNlIHByaXZhdGUgZm9saW9zIGNhbm5vdCBnZXQgcGlubmVkIHZpYSBHVVAuICovXG4tXHRpZiAodW5saWtlbHkoZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKSkge1xuLVx0XHRDbGVhclBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbitcdC8qIFdlIG9ubHkgY2xlYXIgYW5vbi1leGNsdXNpdmUgZnJvbSBoZWFkIHBhZ2Ugb2YgUE1EIGZvbGlvICovXG4rXHRpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QTUQpXG4rXHRcdG5yX3BhZ2VzID0gMTtcbiBcbiBcdC8qXG4gXHQgKiBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHdoZW4gd2UgY2xlYXIgUGFnZUFub25FeGNsdXNpdmUsIHRoYXRcbkBAIC03NjAsMjkgKzc2MSwzOCBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoc3RydWN0IGZvbGlvICpmb2xpbyxcbiBcdCAqIHNvIHdlIHVzZSBleHBsaWNpdCBvbmVzIGhlcmUuXG4gXHQgKi9cbiBcbi1cdC8qIFBhaXJlZCB3aXRoIHRoZSBtZW1vcnkgYmFycmllciBpbiB0cnlfZ3JhYl9mb2xpbygpLiAqL1xuLVx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKVxuLVx0XHRzbXBfbWIoKTtcbitcdGlmIChwaW5uYWJsZSkge1xuK1x0XHQvKiBQYWlyZWQgd2l0aCB0aGUgbWVtb3J5IGJhcnJpZXIgaW4gdHJ5X2dyYWJfZm9saW8oKS4gKi9cbitcdFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKVxuK1x0XHRcdHNtcF9tYigpO1xuIFxuLVx0aWYgKHVubGlrZWx5KGZvbGlvX21heWJlX2RtYV9waW5uZWQoZm9saW8pKSlcbi1cdFx0cmV0dXJuIC1FQlVTWTtcbi1cdENsZWFyUGFnZUFub25FeGNsdXNpdmUocGFnZSk7XG4rXHRcdGlmICh1bmxpa2VseShmb2xpb19tYXliZV9kbWFfcGlubmVkKGZvbGlvKSkpXG4rXHRcdFx0cmV0dXJuIC1FQlVTWTtcbitcdH1cbitcbitcdGZvciAoOzspIHtcbitcdFx0Q2xlYXJQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbitcdFx0aWYgKC0tbnJfcGFnZXMgPT0gMClcbitcdFx0XHRicmVhaztcbitcdFx0cGFnZSsrO1xuK1x0fVxuIFxuIFx0LypcbiBcdCAqIFRoaXMgaXMgY29uY2VwdHVhbGx5IGEgc21wX3dtYigpIHBhaXJlZCB3aXRoIHRoZSBzbXBfcm1iKCkgaW5cbiBcdCAqIGd1cF9tdXN0X3Vuc2hhcmUoKS5cbiBcdCAqL1xuLVx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKVxuK1x0aWYgKHBpbm5hYmxlIFx1MDAyNlx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19IQVZFX0dVUF9GQVNUKSlcbiBcdFx0c21wX21iX19hZnRlcl9hdG9taWMoKTtcbiBcdHJldHVybiAwO1xuIH1cbiBcbiAvKipcbi0gKiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZSAtIHRyeSBtYXJraW5nIGFuIGV4Y2x1c2l2ZSBhbm9ueW1vdXMgcGFnZVxuLSAqXHRcdFx0XHQgICBtYXBwZWQgYnkgYSBQVEUgcG9zc2libHkgc2hhcmVkIHRvIHByZXBhcmVcbisgKiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMgLSB0cnkgbWFya2luZyBleGNsdXNpdmUgYW5vbnltb3VzIHBhZ2VzXG4rICpcdFx0XHRcdCAgIG1hcHBlZCBieSBQVEVzIHBvc3NpYmx5IHNoYXJlZCB0byBwcmVwYXJlXG4gICpcdFx0XHRcdCAgIGZvciBLU00gb3IgdGVtcG9yYXJ5IHVubWFwcGluZ1xuICAqIEBmb2xpbzpcdFRoZSBmb2xpbyB0byBzaGFyZSBhIG1hcHBpbmcgb2Zcbi0gKiBAcGFnZTpcdFRoZSBtYXBwZWQgZXhjbHVzaXZlIHBhZ2VcbisgKiBAcGFnZTpcdFRoZSBmaXJzdCBtYXBwZWQgZXhjbHVzaXZlIHBhZ2Ugb2YgdGhlIGJhdGNoIGluIHRoZSBmb2xpb1xuKyAqIEBucl9wYWdlczpcdFRoZSBudW1iZXIgb2YgcGFnZXMgdG8gc2hhcmUgaW4gdGhlIGZvbGlvIChiYXRjaCBzaXplKVxuICAqXG4gICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwYWdlIHRhYmxlIGxvY2sgYW5kIGhhcyB0byBoYXZlIHRoZSBwYWdlIHRhYmxlXG4gICogZW50cmllcyBjbGVhcmVkL2ludmFsaWRhdGVkLlxuQEAgLTc5NywxMSArODA3LDE5IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuICAqXG4gICogUmV0dXJucyAwIGlmIG1hcmtpbmcgdGhlIG1hcHBlZCBwYWdlIHBvc3NpYmx5IHNoYXJlZCBzdWNjZWVkZWQuIFJldHVybnNcbiAgKiAtRUJVU1kgb3RoZXJ3aXNlLlxuKyAqXG4rICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwYWdlIHRhYmxlIGxvY2suXG4gICovXG4rc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuK3tcbitcdHJldHVybiBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8sIHBhZ2UsIG5yX3BhZ2VzLCBQR1RBQkxFX0xFVkVMX1BURSk7XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgaW50IGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdHN0cnVjdCBwYWdlICpwYWdlKVxuIHtcbi1cdHJldHVybiBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8sIHBhZ2UsIDEsIFBHVEFCTEVfTEVWRUxfUFRFKTtcbitcdHJldHVybiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIDEpO1xuIH1cbiBcbiAvKipcbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggODc0YmU5NGNmMjU3MGUuLmE5MDcyMWY4YzY4NzdlIDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuKysrIGIvbW0vaW50ZXJuYWwuaFxuQEAgLTUwNSw2ICs1MDUsMjYgQEAgc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHB0ZV90IHB0ZSlcbiBcdHJldHVybiBwdGVfbW92ZV9zd3Bfb2Zmc2V0KHB0ZSwgMSk7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgaW50IHNvZnRsZWFmX3B0ZV9iYXRjaChwdGVfdCAqc3RhcnRfcHRlcCwgaW50IG1heF9uciwgcHRlX3QgcHRlKVxuK3tcbitcdHB0ZV90IGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlKTtcbitcdGNvbnN0IHB0ZV90ICplbmRfcHRlcCA9IHN0YXJ0X3B0ZXAgKyBtYXhfbnI7XG4rXHRwdGVfdCAqcHRlcCA9IHN0YXJ0X3B0ZXAgKyAxO1xuK1xuK1x0Vk1fV0FSTl9PTihtYXhfbnIgXHUwMDNjIDEpO1xuK1xuK1x0d2hpbGUgKHB0ZXAgXHUwMDNjIGVuZF9wdGVwKSB7XG4rXHRcdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xuK1xuK1x0XHRpZiAoIXB0ZV9zYW1lKHB0ZSwgZXhwZWN0ZWRfcHRlKSlcbitcdFx0XHRicmVhaztcbitcdFx0ZXhwZWN0ZWRfcHRlID0gcHRlX25leHRfc3dwX29mZnNldChleHBlY3RlZF9wdGUpO1xuK1x0XHRwdGVwKys7XG4rXHR9XG4rXG4rXHRyZXR1cm4gcHRlcCAtIHN0YXJ0X3B0ZXA7XG4rfVxuK1xuIC8qKlxuICAqIHN3YXBfcHRlX2JhdGNoIC0gZGV0ZWN0IGEgUFRFIGJhdGNoIGZvciBhIHNldCBvZiBjb250aWd1b3VzIHN3YXAgZW50cmllc1xuICAqIEBzdGFydF9wdGVwOiBQYWdlIHRhYmxlIHBvaW50ZXIgZm9yIHRoZSBmaXJzdCBlbnRyeS5cbkBAIC01MjIsMjMgKzU0Miw5IEBAIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX25leHRfc3dwX29mZnNldChwdGVfdCBwdGUpXG4gICovXG4gc3RhdGljIGlubGluZSBpbnQgc3dhcF9wdGVfYmF0Y2gocHRlX3QgKnN0YXJ0X3B0ZXAsIGludCBtYXhfbnIsIHB0ZV90IHB0ZSlcbiB7XG4tXHRwdGVfdCBleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHB0ZSk7XG4tXHRjb25zdCBwdGVfdCAqZW5kX3B0ZXAgPSBzdGFydF9wdGVwICsgbWF4X25yO1xuLVx0cHRlX3QgKnB0ZXAgPSBzdGFydF9wdGVwICsgMTtcbi1cbi1cdFZNX1dBUk5fT04obWF4X25yIFx1MDAzYyAxKTtcbiBcdFZNX1dBUk5fT04oIXNvZnRsZWFmX2lzX3N3YXAoc29mdGxlYWZfZnJvbV9wdGUocHRlKSkpO1xuIFxuLVx0d2hpbGUgKHB0ZXAgXHUwMDNjIGVuZF9wdGVwKSB7XG4tXHRcdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xuLVxuLVx0XHRpZiAoIXB0ZV9zYW1lKHB0ZSwgZXhwZWN0ZWRfcHRlKSlcbi1cdFx0XHRicmVhaztcbi1cdFx0ZXhwZWN0ZWRfcHRlID0gcHRlX25leHRfc3dwX29mZnNldChleHBlY3RlZF9wdGUpO1xuLVx0XHRwdGVwKys7XG4tXHR9XG4tXG4tXHRyZXR1cm4gcHRlcCAtIHN0YXJ0X3B0ZXA7XG4rXHRyZXR1cm4gc29mdGxlYWZfcHRlX2JhdGNoKHN0YXJ0X3B0ZXAsIG1heF9uciwgcHRlKTtcbiB9XG4gI2VuZGlmIC8qIENPTkZJR19NTVUgKi9cbiBcbmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmNcbmluZGV4IDIyMmM4YzE1Zjc4MmY3Li42ZDA1ZDNmNDEwOTVkNiAxMDA2NDRcbi0tLSBhL21tL21pZ3JhdGUuY1xuKysrIGIvbW0vbWlncmF0ZS5jXG5AQCAtMzQ1LDYgKzM0NSwxMTEgQEAgc3RydWN0IHJtYXBfd2Fsa19hcmcge1xuIFx0Ym9vbCBtYXBfdW51c2VkX3RvX3plcm9wYWdlO1xuIH07XG4gXG4rLypcbisgKiBEZXRlY3QgYSBiYXRjaCBvZiBjb250aWd1b3VzIG1pZ3JhdGlvbiBlbnRyaWVzOiBjb25zZWN1dGl2ZSAobm9uLXByZXNlbnQpIFBURXNcbisgKiBjb250YWluaW5nIG1pZ3JhdGlvbiBlbnRyaWVzIHdpdGggY29uc2VjdXRpdmUgb2Zmc2V0cyBhbmQgbWF0Y2hpbmcgcHRlIGJpdHMuXG4rICovXG4rc3RhdGljIHVuc2lnbmVkIGludCBtaWdyYXRpb25fcHRlX2JhdGNoKHN0cnVjdCBwYWdlX3ZtYV9tYXBwZWRfd2FsayAqcHZtdyxcbitcdFx0c3RydWN0IGZvbGlvICpmb2xpbywgcHRlX3QgZmlyc3RfcHRlLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeClcbit7XG4rXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IHB2bXctXHUwMDNldm1hO1xuK1x0dW5zaWduZWQgbG9uZyBlbmRfYWRkciA9IHBtZF9hZGRyX2VuZChwdm13LVx1MDAzZWFkZHJlc3MsIHZtYS1cdTAwM2V2bV9lbmQpO1xuK1x0dW5zaWduZWQgaW50IGZvbGlvX25yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuK1x0dW5zaWduZWQgaW50IG1heF9ucjtcbitcbitcdFZNX1dBUk5fT04oIXNvZnRsZWFmX2lzX21pZ3JhdGlvbihzb2Z0bGVhZl9mcm9tX3B0ZShmaXJzdF9wdGUpKSk7XG4rXG4rXHQvKiBCb3VuZCBieSBWTUEgLyBQTUQgZW5kIGFuZCBieSB0aGUgcmVtYWluaW5nIHN1YnBhZ2VzIG9mIHRoZSBmb2xpby4gKi9cbitcdG1heF9uciA9IG1pbigoZW5kX2FkZHIgLSBwdm13LVx1MDAzZWFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBmb2xpb19uciAtIHN0YXJ0X2lkeCk7XG4rXHRpZiAobWF4X25yIFx1MDAzYz0gMSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHRyZXR1cm4gc29mdGxlYWZfcHRlX2JhdGNoKHB2bXctXHUwMDNlcHRlLCBtYXhfbnIsIGZpcnN0X3B0ZSk7XG4rfVxuK1xuK3N0YXRpYyBwdGVfdCBtaWdyYXRpb25fc29mdGxlYWZfZW50cnlfdG9fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpuZXcsXG4rXHRcdHNvZnRsZWFmX3QgZW50cnksIHB0ZV90IG9sZF9wdGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHRybWFwX3QgKnJtYXBfZmxhZ3MpXG4re1xuK1x0cHRlX3QgcHRlID0gbWtfcHRlKG5ldywgUkVBRF9PTkNFKHZtYS1cdTAwM2V2bV9wYWdlX3Byb3QpKTtcbitcbitcdGlmICghc29mdGxlYWZfaXNfbWlncmF0aW9uX3lvdW5nKGVudHJ5KSlcbitcdFx0cHRlID0gcHRlX21rb2xkKHB0ZSk7XG4rXHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSkpXG4rXHRcdHB0ZSA9IHB0ZV9ta2RpcnR5KHB0ZSk7XG4rXHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KG9sZF9wdGUpKVxuK1x0XHRwdGUgPSBwdGVfbWtzb2Z0X2RpcnR5KHB0ZSk7XG4rXHRlbHNlXG4rXHRcdHB0ZSA9IHB0ZV9jbGVhcl9zb2Z0X2RpcnR5KHB0ZSk7XG4rXG4rXHRpZiAoc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KSlcbitcdFx0cHRlID0gcHRlX21rd3JpdGUocHRlLCB2bWEpO1xuK1x0ZWxzZSBpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuK1x0XHRwdGUgPSBwdGVfbWt1ZmZkKHB0ZSk7XG4rXG4rXHQvKiBTZWUgZG9fc3dhcF9wYWdlKCk6IHJlc3RvcmUgUEFHRV9OT05FIGZvciBSV1AgKi9cbitcdGlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkgXHUwMDI2XHUwMDI2IHVzZXJmYXVsdGZkX3J3cCh2bWEpKVxuK1x0XHRwdGUgPSBwdGVfbW9kaWZ5KHB0ZSwgUEFHRV9OT05FKTtcbitcbitcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiAhc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWQoZW50cnkpKVxuK1x0XHQqcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbitcbitcdHJldHVybiBwdGU7XG4rfVxuK1xuKy8qXG4rICogUmVzdG9yZSBhIHBvdGVudGlhbCBtaWdyYXRpb24gcHRlIHRvIGEgd29ya2luZyBwdGUgZW50cnkgZm9yIGh1Z2V0bGIgZm9saW9zLlxuKyAqL1xuKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFXG4rc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYihzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuK1x0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpXG4re1xuK1x0c3RydWN0IHJtYXBfd2Fsa19hcmcgKnJtYXBfd2Fsa19hcmcgPSBhcmc7XG4rXHRERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgcm1hcF93YWxrX2FyZy1cdTAwM2Vmb2xpbywgdm1hLCBhZGRyLCBQVk1XX1NZTkMgfCBQVk1XX01JR1JBVElPTik7XG4rXHRzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpO1xuK1x0dW5zaWduZWQgaW50IHNoaWZ0ID0gaHVnZV9wYWdlX3NoaWZ0KGgpO1xuK1x0dW5zaWduZWQgbG9uZyBwc2l6ZSA9IGh1Z2VfcGFnZV9zaXplKGgpO1xuK1xuK1x0aWYgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKSB7XG4rXHRcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xuK1x0XHRzdHJ1Y3QgcGFnZSAqbmV3ID0gZm9saW9fcGFnZShmb2xpbywgMCk7XG4rXHRcdHB0ZV90IG9sZF9wdGUsIHB0ZTtcbitcdFx0c29mdGxlYWZfdCBlbnRyeTtcbitcbitcdFx0b2xkX3B0ZSA9IGh1Z2VfcHRlcF9nZXQodm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTtcbitcdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3B0ZShvbGRfcHRlKTtcbitcbitcdFx0Zm9saW9fZ2V0KGZvbGlvKTtcbitcdFx0cHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSxcbitcdFx0XHRcdFx0XHQgICAgICB2bWEsIFx1MDAyNnJtYXBfZmxhZ3MpO1xuK1x0XHRwdGUgPSBhcmNoX21ha2VfaHVnZV9wdGUocHRlLCBzaGlmdCwgdm1hLVx1MDAzZXZtX2ZsYWdzKTtcbitcdFx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRcdFx0aHVnZXRsYl9hZGRfYW5vbl9ybWFwKGZvbGlvLCB2bWEsIHB2bXcuYWRkcmVzcyxcbitcdFx0XHRcdFx0ICAgICAgcm1hcF9mbGFncyk7XG4rXHRcdGVsc2VcbitcdFx0XHRodWdldGxiX2FkZF9maWxlX3JtYXAoZm9saW8pO1xuK1x0XHRzZXRfaHVnZV9wdGVfYXQodm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsIHBzaXplKTtcbitcbitcdFx0aWYgKFJFQURfT05DRSh2bWEtXHUwMDNldm1fZmxhZ3MpIFx1MDAyNiBWTV9MT0NLRUQpXG4rXHRcdFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcbitcbitcdFx0dHJhY2VfcmVtb3ZlX21pZ3JhdGlvbl9wdGUocHZtdy5hZGRyZXNzLCBwdGVfdmFsKHB0ZSksXG4rXHRcdFx0XHRcdCAgIGNvbXBvdW5kX29yZGVyKG5ldykpO1xuK1xuK1x0XHQvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovXG4rXHRcdHVwZGF0ZV9tbXVfY2FjaGUodm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTtcbitcdH1cbitcbitcdHJldHVybiB0cnVlO1xuK31cbisjZWxzZVxuK3N0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGIoc3RydWN0IGZvbGlvICpmb2xpbyxcbitcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxuK3tcbitcdHJldHVybiBmYWxzZTtcbit9XG4rI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi9cbitcbiAvKlxuICAqIFJlc3RvcmUgYSBwb3RlbnRpYWwgbWlncmF0aW9uIHB0ZSB0byBhIHdvcmtpbmcgcHRlIGVudHJ5XG4gICovXG5AQCAtMzUyLDYgKzQ1Nyw3IEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZylcbiB7XG4gXHRzdHJ1Y3Qgcm1hcF93YWxrX2FyZyAqcm1hcF93YWxrX2FyZyA9IGFyZztcbitcdGJvb2wgaXNfZGV2cHJpdiA9IGZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKTtcbiBcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBybWFwX3dhbGtfYXJnLVx1MDAzZWZvbGlvLCB2bWEsIGFkZHIsIFBWTVdfU1lOQyB8IFBWTVdfTUlHUkFUSU9OKTtcbiBcbiBcdHdoaWxlIChwYWdlX3ZtYV9tYXBwZWRfd2FsayhcdTAwMjZwdm13KSkge1xuQEAgLTM2MSw1NiArNDY3LDQwIEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdHNvZnRsZWFmX3QgZW50cnk7XG4gXHRcdHN0cnVjdCBwYWdlICpuZXc7XG4gXHRcdHVuc2lnbmVkIGxvbmcgaWR4ID0gMDtcbitcdFx0dW5zaWduZWQgaW50IG5yID0gMTtcbiBcbiBcdFx0LyogcGdvZmYgaXMgaW52YWxpZCBmb3Iga3NtIHBhZ2VzLCBidXQgdGhleSBhcmUgbmV2ZXIgbGFyZ2UgKi9cbi1cdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbitcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuIFx0XHRcdGlkeCA9IGxpbmVhcl9wYWdlX2luZGV4KHZtYSwgcHZtdy5hZGRyZXNzKSAtIHB2bXcucGdvZmY7XG4gXHRcdG5ldyA9IGZvbGlvX3BhZ2UoZm9saW8sIGlkeCk7XG4gXG4gI2lmZGVmIENPTkZJR19BUkNIX0hBU19QTURfU09GVExFQVZFU1xuIFx0XHQvKiBQTUQtbWFwcGVkIFRIUCBtaWdyYXRpb24gZW50cnkgKi9cbiBcdFx0aWYgKCFwdm13LnB0ZSkge1xuLVx0XHRcdFZNX0JVR19PTl9GT0xJTyhmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pIHx8XG4tXHRcdFx0XHRcdCFmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbyksIGZvbGlvKTtcbitcdFx0XHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSwgZm9saW8pO1xuIFx0XHRcdHJlbW92ZV9taWdyYXRpb25fcG1kKFx1MDAyNnB2bXcsIG5ldyk7XG4gXHRcdFx0Y29udGludWU7XG4gXHRcdH1cbiAjZW5kaWZcbi1cdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpXG4tXHRcdFx0b2xkX3B0ZSA9IGh1Z2VfcHRlcF9nZXQodm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsXG4tXHRcdFx0XHRcdFx0cHZtdy5wdGUpO1xuLVx0XHRlbHNlXG4tXHRcdFx0b2xkX3B0ZSA9IHB0ZXBfZ2V0KHB2bXcucHRlKTtcbitcdFx0b2xkX3B0ZSA9IHB0ZXBfZ2V0KHB2bXcucHRlKTtcbiBcdFx0aWYgKHJtYXBfd2Fsa19hcmctXHUwMDNlbWFwX3VudXNlZF90b196ZXJvcGFnZSBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgIHRyeV90b19tYXBfdW51c2VkX3RvX3plcm9wYWdlKFx1MDAyNnB2bXcsIGZvbGlvLCBvbGRfcHRlLCBpZHgpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb19nZXQoZm9saW8pO1xuLVx0XHRwdGUgPSBta19wdGUobmV3LCBSRUFEX09OQ0Uodm1hLVx1MDAzZXZtX3BhZ2VfcHJvdCkpO1xuLVxuIFx0XHRlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKG9sZF9wdGUpO1xuLVx0XHRpZiAoIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSkpXG4tXHRcdFx0cHRlID0gcHRlX21rb2xkKHB0ZSk7XG4tXHRcdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KSlcbi1cdFx0XHRwdGUgPSBwdGVfbWtkaXJ0eShwdGUpO1xuLVx0XHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KG9sZF9wdGUpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3NvZnRfZGlydHkocHRlKTtcbi1cdFx0ZWxzZVxuLVx0XHRcdHB0ZSA9IHB0ZV9jbGVhcl9zb2Z0X2RpcnR5KHB0ZSk7XG4gXG4tXHRcdGlmIChzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3dyaXRlKHB0ZSwgdm1hKTtcbi1cdFx0ZWxzZSBpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3VmZmQocHRlKTtcbi1cbi1cdFx0LyogU2VlIGRvX3N3YXBfcGFnZSgpOiByZXN0b3JlIFBBR0VfTk9ORSBmb3IgUldQICovXG4tXHRcdGlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkgXHUwMDI2XHUwMDI2IHVzZXJmYXVsdGZkX3J3cCh2bWEpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9tb2RpZnkocHRlLCBQQUdFX05PTkUpO1xuK1x0XHQvKlxuK1x0XHQgKiBUcnkgdG8gcmVzdG9yZSBuclx1MDAzZTEgY29udGlndW91cyBQVEVzIGluIG9uZSBzaG90LiBGYWxscyBiYWNrXG4rXHRcdCAqIHRvIG9yaWdpbmFsIHBlci1QVEUgcGF0aCAobnI9MSkgaWYgYmF0Y2hpbmcgaXMgbm90IHBvc3NpYmxlLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFybWFwX3dhbGtfYXJnLVx1MDAzZW1hcF91bnVzZWRfdG9femVyb3BhZ2UgXHUwMDI2XHUwMDI2IGxpa2VseSghaXNfZGV2cHJpdikpXG4rXHRcdFx0bnIgPSBtaWdyYXRpb25fcHRlX2JhdGNoKFx1MDAyNnB2bXcsIGZvbGlvLCBvbGRfcHRlLCBpZHgpO1xuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkKGVudHJ5KSlcbi1cdFx0XHRybWFwX2ZsYWdzIHw9IFJNQVBfRVhDTFVTSVZFO1xuK1x0XHRmb2xpb19yZWZfYWRkKGZvbGlvLCBucik7XG4rXHRcdHB0ZSA9IG1pZ3JhdGlvbl9zb2Z0bGVhZl9lbnRyeV90b19wdGUoZm9saW8sIG5ldywgZW50cnksIG9sZF9wdGUsXG4rXHRcdFx0XHRcdFx0ICAgICAgdm1hLCBcdTAwMjZybWFwX2ZsYWdzKTtcbiBcbi1cdFx0aWYgKHVubGlrZWx5KGlzX2RldmljZV9wcml2YXRlX3BhZ2UobmV3KSkpIHtcbitcdFx0aWYgKHVubGlrZWx5KGlzX2RldnByaXYpKSB7XG4gXHRcdFx0aWYgKHB0ZV93cml0ZShwdGUpKVxuIFx0XHRcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuIFx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4obmV3KSk7XG5AQCAtNDI0LDMwICs1MTQsMTIgQEAgc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcbiBcdFx0XHRcdHB0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHB0ZSk7XG4gXHRcdH1cbiBcbi0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRVxuLVx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdHN0cnVjdCBoc3RhdGUgKmggPSBoc3RhdGVfdm1hKHZtYSk7XG4tXHRcdFx0dW5zaWduZWQgaW50IHNoaWZ0ID0gaHVnZV9wYWdlX3NoaWZ0KGgpO1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgcHNpemUgPSBodWdlX3BhZ2Vfc2l6ZShoKTtcbi1cbi1cdFx0XHRwdGUgPSBhcmNoX21ha2VfaHVnZV9wdGUocHRlLCBzaGlmdCwgdm1hLVx1MDAzZXZtX2ZsYWdzKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbi1cdFx0XHRcdGh1Z2V0bGJfYWRkX2Fub25fcm1hcChmb2xpbywgdm1hLCBwdm13LmFkZHJlc3MsXG4tXHRcdFx0XHRcdFx0ICAgICAgcm1hcF9mbGFncyk7XG4tXHRcdFx0ZWxzZVxuLVx0XHRcdFx0aHVnZXRsYl9hZGRfZmlsZV9ybWFwKGZvbGlvKTtcbi1cdFx0XHRzZXRfaHVnZV9wdGVfYXQodm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsXG4tXHRcdFx0XHRcdHBzaXplKTtcbi1cdFx0fSBlbHNlXG4tI2VuZGlmXG4tXHRcdHtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbi1cdFx0XHRcdGZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlKGZvbGlvLCBuZXcsIHZtYSxcbi1cdFx0XHRcdFx0XHRcdHB2bXcuYWRkcmVzcywgcm1hcF9mbGFncyk7XG4tXHRcdFx0ZWxzZVxuLVx0XHRcdFx0Zm9saW9fYWRkX2ZpbGVfcm1hcF9wdGUoZm9saW8sIG5ldywgdm1hKTtcbi1cdFx0XHRzZXRfcHRlX2F0KHZtYS1cdTAwM2V2bV9tbSwgcHZtdy5hZGRyZXNzLCBwdm13LnB0ZSwgcHRlKTtcbi1cdFx0fVxuK1x0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbitcdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIG5ldywgbnIsIHZtYSxcbitcdFx0XHRcdFx0XHQgcHZtdy5hZGRyZXNzLCBybWFwX2ZsYWdzKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGZvbGlvX2FkZF9maWxlX3JtYXBfcHRlcyhmb2xpbywgbmV3LCBuciwgdm1hKTtcbitcdFx0c2V0X3B0ZXModm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsIG5yKTtcbiBcdFx0aWYgKFJFQURfT05DRSh2bWEtXHUwMDNldm1fZmxhZ3MpIFx1MDAyNiBWTV9MT0NLRUQpXG4gXHRcdFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcbiBcbkBAIC00NTUsNyArNTI3LDExIEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdFx0XHRcdCAgIGNvbXBvdW5kX29yZGVyKG5ldykpO1xuIFxuIFx0XHQvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovXG4tXHRcdHVwZGF0ZV9tbXVfY2FjaGUodm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTtcbitcdFx0dXBkYXRlX21tdV9jYWNoZV9yYW5nZShOVUxMLCB2bWEsIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIG5yKTtcbitcbitcdFx0LyogU2tpcCB0aGUgYmF0Y2hlZCBQVEVzICovXG4rXHRcdHB2bXcucHRlICs9IG5yIC0gMTtcbitcdFx0cHZtdy5hZGRyZXNzICs9IChuciAtIDEpICogUEFHRV9TSVpFO1xuIFx0fVxuIFxuIFx0cmV0dXJuIHRydWU7XG5AQCAtNDc0LDcgKzU1MCw5IEBAIHZvaWQgcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKHN0cnVjdCBmb2xpbyAqc3JjLCBzdHJ1Y3QgZm9saW8gKmRzdCxcbiBcdH07XG4gXG4gXHRzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgcndjID0ge1xuLVx0XHQucm1hcF9vbmUgPSByZW1vdmVfbWlncmF0aW9uX3B0ZSxcbitcdFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKHNyYykgP1xuK1x0XHRcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYiA6XG4rXHRcdFx0XHRyZW1vdmVfbWlncmF0aW9uX3B0ZSxcbiBcdFx0LmFyZyA9IFx1MDAyNnJtYXBfd2Fsa19hcmcsXG4gXHR9O1xuIFxuZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuY1xuaW5kZXggZTg1NDY3OTU1M2I5YzMuLmNmYWM4NWY2ZjY4YTY4IDEwMDY0NFxuLS0tIGEvbW0vcm1hcC5jXG4rKysgYi9tbS9ybWFwLmNcbkBAIC0yNDA1LDYgKzI0MDUsMjI5IEBAIHZvaWQgdHJ5X3RvX3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIGVudW0gdHR1X2ZsYWdzIGZsYWdzKVxuIFx0XHRybWFwX3dhbGsoZm9saW8sIFx1MDAyNnJ3Yyk7XG4gfVxuIFxuKy8qIEJ1aWxkIHRoZSBtaWdyYXRpb24gc3dhcCBQVEUgdGhhdCByZXBsYWNlcyBwdGV2YWwgZm9yIGEgcGFnZS4gKi9cbitzdGF0aWMgcHRlX3QgbWFrZV9taWdyYXRpb25fc3dwX3B0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgcHRlX3QgcHRldmFsLFxuK1x0XHRib29sIHdyaXRhYmxlLCBib29sIGFub25fZXhjbHVzaXZlKVxuK3tcbitcdHN3cF9lbnRyeV90IGVudHJ5O1xuK1x0cHRlX3Qgc3dwX3B0ZTtcbitcbitcdGlmICh3cml0YWJsZSlcbitcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwYWdlX3RvX3BmbihwYWdlKSk7XG4rXHRlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSlcbitcdFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkoXG4rXHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSkpO1xuK1x0ZWxzZVxuK1x0XHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KHBhZ2VfdG9fcGZuKHBhZ2UpKTtcbitcbitcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcbitcdFx0aWYgKHB0ZV95b3VuZyhwdGV2YWwpKVxuK1x0XHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoZW50cnkpO1xuK1x0XHRpZiAocHRlX2RpcnR5KHB0ZXZhbCkpXG4rXHRcdFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShlbnRyeSk7XG4rXHRcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbitcdFx0aWYgKHB0ZV9zb2Z0X2RpcnR5KHB0ZXZhbCkpXG4rXHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xuK1x0XHRpZiAocHRlX3VmZmQocHRldmFsKSlcbitcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4rXHR9IGVsc2Uge1xuK1x0XHRzd3BfcHRlID0gc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSk7XG4rXHRcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSlcbitcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4rXHRcdGlmIChwdGVfc3dwX3VmZmQocHRldmFsKSlcbitcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gc3dwX3B0ZTtcbit9XG4rXG4rLypcbisgKiBSZXBsYWNlIHRoZSBodWdldGxiIHBhZ2UgdGFibGUgbWFwcGluZyBmb3IgZm9saW8gd2l0aCBtaWdyYXRpb24gZW50cmllcy5cbisgKlxuKyAqIEBhcmc6IGVudW0gdHR1X2ZsYWdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgYXJndW1lbnQuXG4rICovXG4rc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmUoc3RydWN0IGZvbGlvICpmb2xpbyxcbitcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKVxuK3tcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgaHN6ID0gaHVnZV9wYWdlX3NpemUoaHN0YXRlX3ZtYSh2bWEpKTtcbitcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTtcbitcdGVudW0gdHR1X2ZsYWdzIGZsYWdzID0gKGVudW0gdHR1X2ZsYWdzKShsb25nKWFyZztcbitcdGJvb2wgYW5vbl9leGNsdXNpdmUsIHdyaXRhYmxlLCByZXQgPSB0cnVlO1xuK1x0Ym9vbCBhbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuK1x0c3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTtcbitcdHVuc2lnbmVkIGxvbmcgcGZuO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHRwdGVfdCBwdGV2YWw7XG4rXG4rXHRyYW5nZS5lbmQgPSB2bWFfYWRkcmVzc19lbmQoXHUwMDI2cHZtdyk7XG4rXHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVx1MDAzZXZtX21tLFxuK1x0XHRcdFx0YWRkcmVzcywgcmFuZ2UuZW5kKTtcbitcdC8qIElmIHNoYXJpbmcgaXMgcG9zc2libGUsIHN0YXJ0IGFuZCBlbmQgd2lsbCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseS4gKi9cbitcdGFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsIFx1MDAyNnJhbmdlLnN0YXJ0LCBcdTAwMjZyYW5nZS5lbmQpO1xuK1x0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoXHUwMDI2cmFuZ2UpO1xuK1xuK1x0aWYgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKSB7XG4rXHRcdGFkZHJlc3MgPSBwdm13LmFkZHJlc3M7XG4rXHRcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9nZXQobW0sIGFkZHJlc3MsIHB2bXcucHRlKTtcbitcdFx0aWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSlcbitcdFx0XHRwZm4gPSBwdGVfcGZuKHB0ZXZhbCk7XG4rXHRcdGVsc2VcbitcdFx0XHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oc29mdGxlYWZfZnJvbV9wdGUocHRldmFsKSk7XG4rXG4rXHRcdHBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcbitcdFx0YW5vbl9leGNsdXNpdmUgPSBhbm9uIFx1MDAyNlx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbitcbitcdFx0LypcbitcdFx0ICogaHVnZV9wbWRfdW5zaGFyZSBtYXkgdW5tYXAgYW4gZW50aXJlIFBNRCBwYWdlLiBUaGVyZSBpcyBub1xuK1x0XHQgKiB3YXkgb2Yga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5IGJlIGNhY2hlZCBmb3IgdGhpcyBtbSxcbitcdFx0ICogc28gd2UgbXVzdCBmbHVzaCB0aGVtIGFsbC4gc3RhcnQvZW5kIHdlcmUgYWxyZWFkeSBhZGp1c3RlZFxuK1x0XHQgKiBhYm92ZSB0byBjb3ZlciB0aGlzIHJhbmdlLlxuK1x0XHQgKi9cbitcdFx0Zmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbitcbitcdFx0LypcbitcdFx0ICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZSBoZWxkIGluIHdyaXRlXG4rXHRcdCAqIG1vZGUuIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5IGRvIHRoaXMgb3V0c2lkZSBybWFwXG4rXHRcdCAqIHJvdXRpbmVzLiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuXG4rXHRcdCAqIExvY2sgb3JkZXIgZGljdGF0ZXMgYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRSBpX21tYXBfcndzZW0uXG4rXHRcdCAqIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kIGZhaWwgaWYgdW5zdWNjZXNzZnVsLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFhbm9uKSB7XG4rXHRcdFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xuK1xuK1x0XHRcdFZNX1dBUk5fT05fT05DRSghKGZsYWdzIFx1MDAyNiBUVFVfUk1BUF9MT0NLRUQpKTtcbitcdFx0XHRpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSkge1xuK1x0XHRcdFx0cmV0ID0gZmFsc2U7XG4rXHRcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0XHR9XG4rXG4rXHRcdFx0dGxiX2dhdGhlcl9tbXVfdm1hKFx1MDAyNnRsYiwgdm1hKTtcbitcdFx0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4rXHRcdFx0XHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcbitcdFx0XHRcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXHUwMDI2dGxiLCB2bWEpO1xuK1x0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbitcdFx0XHRcdC8qXG4rXHRcdFx0XHQgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCxcbitcdFx0XHRcdCAqIGNvbnNlcXVlbnRseSB1bm1hcHBpbmcgdGhlIGZvbGlvLlxuK1x0XHRcdFx0ICovXG4rXHRcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0XHR9XG4rXHRcdFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XG4rXHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbitcdFx0fVxuK1xuK1x0XHQvKiBOdWtlIHRoZSBodWdldGxiIHBhZ2UgdGFibGUgZW50cnkgKi9cbitcdFx0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuK1x0XHRpZiAoaHVnZV9wdGVfZGlydHkocHRldmFsKSlcbitcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbitcdFx0d3JpdGFibGUgPSBwdGVfd3JpdGUocHRldmFsKTtcbitcbitcdFx0Vk1fV0FSTl9PTl9GT0xJTyh3cml0YWJsZSBcdTAwMjZcdTAwMjYgYW5vbiBcdTAwMjZcdTAwMjYgIWFub25fZXhjbHVzaXZlLCBmb2xpbyk7XG4rXG4rXHRcdGlmIChQYWdlSFdQb2lzb24ocGFnZSkpIHtcbitcdFx0XHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpO1xuK1x0XHRcdGh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pO1xuK1x0XHRcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgaHN6KTtcbitcdFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgXHUwMDI2XHUwMDI2IHB0ZV91bnVzZWQocHRldmFsKSBcdTAwMjZcdTAwMjZcbitcdFx0XHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogVGhlIGd1ZXN0IGluZGljYXRlZCB0aGF0IHRoZSBwYWdlIGNvbnRlbnQgaXMgb2Ygbm9cbitcdFx0XHQgKiBpbnRlcmVzdCBhbnltb3JlLiBTaW1wbHkgZGlzY2FyZCB0aGUgcHRlLCB2bXNjYW5cbitcdFx0XHQgKiB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdC5cbitcdFx0XHQgKi9cbitcdFx0XHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdHB0ZV90IHN3cF9wdGU7XG4rXG4rXHRcdFx0LypcbitcdFx0XHQgKiBhcmNoX3VubWFwX29uZSgpIGlzIGV4cGVjdGVkIHRvIGJlIGEgTk9QIG9uXG4rXHRcdFx0ICogYXJjaGl0ZWN0dXJlcyB3aGVyZSB3ZSBjb3VsZCBoYXZlIFBGTiBzd2FwIFBURXMsXG4rXHRcdFx0ICogc28gd2UnbGwgbm90IGNoZWNrL2NhcmUuXG4rXHRcdFx0ICovXG4rXHRcdFx0aWYgKGFyY2hfdW5tYXBfb25lKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXZhbCkgXHUwMDNjIDApIHtcbitcdFx0XHRcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsXG4rXHRcdFx0XHRcdFx0cHRldmFsLCBoc3opO1xuK1x0XHRcdFx0cmV0ID0gZmFsc2U7XG4rXHRcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0XHR9XG4rXG4rXHRcdFx0LyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbitcdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4rXHRcdFx0ICAgIGh1Z2V0bGJfdHJ5X3NoYXJlX2Fub25fcm1hcChmb2xpbykpIHtcbitcdFx0XHRcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsXG4rXHRcdFx0XHRcdFx0cHRldmFsLCBoc3opO1xuK1x0XHRcdFx0cmV0ID0gZmFsc2U7XG4rXHRcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0XHR9XG4rXG4rXHRcdFx0LypcbitcdFx0XHQgKiBTdG9yZSB0aGUgcGZuIG9mIHRoZSBwYWdlIGluIGEgc3BlY2lhbCBtaWdyYXRpb25cbitcdFx0XHQgKiBwdGUuIGRvX3N3YXBfcGFnZSgpIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWlncmF0aW9uXG4rXHRcdFx0ICogcHRlIGlzIHJlbW92ZWQgYW5kIHRoZW4gcmVzdGFydCBmYXVsdCBoYW5kbGluZy5cbitcdFx0XHQgKi9cbitcdFx0XHRzd3BfcHRlID0gbWFrZV9taWdyYXRpb25fc3dwX3B0ZShwYWdlLCBwdGV2YWwsXG4rXHRcdFx0XHRcdFx0XHQgd3JpdGFibGUsIGFub25fZXhjbHVzaXZlKTtcbitcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlLCBoc3opO1xuK1x0XHRcdHRyYWNlX3NldF9taWdyYXRpb25fcHRlKGFkZHJlc3MsIHB0ZV92YWwoc3dwX3B0ZSksXG4rXHRcdFx0XHRcdFx0Zm9saW9fb3JkZXIoZm9saW8pKTtcbitcdFx0fVxuK1xuK1x0XHRodWdldGxiX3JlbW92ZV9ybWFwKGZvbGlvKTtcbitcdFx0aWYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fTE9DS0VEKVxuK1x0XHRcdG1sb2NrX2RyYWluX2xvY2FsKCk7XG4rXHRcdGZvbGlvX3B1dChmb2xpbyk7XG4rd2Fsa19kb25lOlxuK1x0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuK1x0fVxuK1xuK1x0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFx1MDAyNnJhbmdlKTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdHN0cnVjdCBwYWdlX3ZtYV9tYXBwZWRfd2FsayAqcHZtdywgcHRlX3QgcHRlLFxuK1x0XHRzdHJ1Y3QgcGFnZSAqc3VicGFnZSwgYm9vbCBhbm9uX2V4Y2x1c2l2ZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyLCBhZGRyID0gcHZtdy1cdTAwM2VhZGRyZXNzO1xuK1x0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBwdm13LVx1MDAzZXZtYTtcbitcdHVuc2lnbmVkIGludCBtYXhfbnIsIG5yLCBpO1xuK1xuKyNpZmRlZiBfX0hBVkVfQVJDSF9VTk1BUF9PTkVcbitcdC8qIENhbm5vdCBiYXRjaCB1bm1hcCBpZiBhcmNoX3VubWFwX29uZSgpIGlzIGRlZmluZWQuICovXG4rXHRyZXR1cm4gMTtcbisjZW5kaWZcbitcbitcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4rXHRcdHJldHVybiAxO1xuK1x0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fCBmb2xpb190ZXN0X2hhc19od3BvaXNvbmVkKGZvbGlvKSlcbitcdFx0cmV0dXJuIDE7XG4rXHRpZiAocHRlX3VudXNlZChwdGUpKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdC8qIFdlIG1heSBvbmx5IGJhdGNoIHdpdGhpbiBhIHNpbmdsZSBWTUEgYW5kIGEgc2luZ2xlIHBhZ2UgdGFibGUuICovXG4rXHRlbmRfYWRkciA9IHBtZF9hZGRyX2VuZChhZGRyLCB2bWEtXHUwMDNldm1fZW5kKTtcbitcdG1heF9uciA9IChlbmRfYWRkciAtIGFkZHIpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0LypcbitcdCAqIElmIHVubWFwIGZhaWxzLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHB0ZXMuIFRvIGF2b2lkIGFjY2lkZW50YWxseVxuK1x0ICogdXBncmFkaW5nIHdyaXRlIHBlcm1pc3Npb25zIGZvciBwdGVzIHRoYXQgd2VyZSBub3Qgb3JpZ2luYWxseSB3cml0YWJsZSxcbitcdCAqIGFuZCB0byBhdm9pZCBsb3NpbmcgdGhlIHNvZnQtZGlydHkgYml0LCB1c2UgdGhlIGFwcHJvcHJpYXRlIEZQQiBmbGFncy5cbitcdCAqL1xuK1x0bnIgPSBmb2xpb19wdGVfYmF0Y2hfZmxhZ3MoZm9saW8sIHZtYSwgcHZtdy1cdTAwM2VwdGUsIFx1MDAyNnB0ZSwgbWF4X25yLFxuK1x0XHRcdFx0ICAgRlBCX1JFU1BFQ1RfV1JJVEUgfCBGUEJfUkVTUEVDVF9TT0ZUX0RJUlRZKTtcbitcbitcdC8qIExpbWl0IHBvc3NpYmxlIGJhdGNoIGNvdW50IHRvIGEgdW5pZm9ybSBQYWdlQW5vbkV4Y2x1c2l2ZSB2YWx1ZSAqL1xuK1x0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbitcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnI7IGkrKylcbitcdFx0XHRpZiAoUGFnZUFub25FeGNsdXNpdmUoc3VicGFnZSArIGkpICE9IGFub25fZXhjbHVzaXZlKVxuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdG5yID0gaTtcbitcdH1cbitcbitcdHJldHVybiBucjtcbit9XG4rXG4gLypcbiAgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50LlxuICAqXG5AQCAtMjQyMSw4ICsyNjQ0LDcgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2U7XG4gXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xuIFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuLVx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIHBmbiwgZW5kX2FkZHIsIG5yX3BhZ2VzO1xuIFxuIFx0LypcbiBcdCAqIFdoZW4gcmFjaW5nIGFnYWluc3QgZS5nLiB6YXBfcHRlX3JhbmdlKCkgb24gYW5vdGhlciBjcHUsXG5AQCAtMjQzNSwyNiArMjY1NywxMyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHQvKlxuIFx0ICogRm9yIFRIUCwgd2UgaGF2ZSB0byBhc3N1bWUgdGhlIHdvcnNlIGNhc2UgaWUgcG1kIGZvciBpbnZhbGlkYXRpb24uXG4tXHQgKiBGb3IgaHVnZXRsYiwgaXQgY291bGQgYmUgbXVjaCB3b3JzZSBpZiB3ZSBuZWVkIHRvIGRvIHB1ZFxuLVx0ICogaW52YWxpZGF0aW9uIGluIHRoZSBjYXNlIG9mIHBtZCBzaGFyaW5nLlxuIFx0ICpcbiBcdCAqIE5vdGUgdGhhdCB0aGUgcGFnZSBjYW4gbm90IGJlIGZyZWUgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mXG4tXHQgKiB0cnlfdG9fdW5tYXAoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIHBhZ2UuXG4rXHQgKiB0cnlfdG9fbWlncmF0ZSgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS5cbiBcdCAqL1xuIFx0cmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKFx1MDAyNnB2bXcpO1xuIFx0bW11X25vdGlmaWVyX3JhbmdlX2luaXQoXHUwMDI2cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS1cdTAwM2V2bV9tbSxcbiBcdFx0XHRcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XG4tXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBJZiBzaGFyaW5nIGlzIHBvc3NpYmxlLCBzdGFydCBhbmQgZW5kIHdpbGwgYmUgYWRqdXN0ZWRcbi1cdFx0ICogYWNjb3JkaW5nbHkuXG4tXHRcdCAqL1xuLVx0XHRhZGp1c3RfcmFuZ2VfaWZfcG1kX3NoYXJpbmdfcG9zc2libGUodm1hLCBcdTAwMjZyYW5nZS5zdGFydCxcbi1cdFx0XHRcdFx0XHQgICAgIFx1MDAyNnJhbmdlLmVuZCk7XG4tXG4tXHRcdC8qIFdlIG5lZWQgdGhlIGh1Z2UgcGFnZSBzaXplIGZvciBzZXRfaHVnZV9wdGVfYXQoKSAqL1xuLVx0XHRoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xuLVx0fVxuIFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoXHUwMDI2cmFuZ2UpO1xuIFxuIFx0d2hpbGUgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKSB7XG5AQCAtMjQ4OCwxMSArMjY5Nyw4IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSB8fFxuIFx0XHRcdFx0XHQhZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7XG4gXG4tXHRcdFx0aWYgKHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KFx1MDAyNnB2bXcsIHN1YnBhZ2UpKSB7XG4tXHRcdFx0XHRyZXQgPSBmYWxzZTtcbi1cdFx0XHRcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4tXHRcdFx0XHRicmVhaztcbi1cdFx0XHR9XG4rXHRcdFx0aWYgKHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KFx1MDAyNnB2bXcsIHN1YnBhZ2UpKVxuK1x0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuIFx0XHRcdGNvbnRpbnVlO1xuICNlbmRpZlxuIFx0XHR9XG5AQCAtMjUwMSwxMCArMjcwNyw3IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0Vk1fQlVHX09OX0ZPTElPKCFwdm13LnB0ZSwgZm9saW8pO1xuIFxuIFx0XHRhZGRyZXNzID0gcHZtdy5hZGRyZXNzO1xuLVx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbi1cdFx0XHRwdGV2YWwgPSBodWdlX3B0ZXBfZ2V0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRwdGV2YWwgPSBwdGVwX2dldChwdm13LnB0ZSk7XG4rXHRcdHB0ZXZhbCA9IHB0ZXBfZ2V0KHB2bXcucHRlKTtcbiBcdFx0aWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkge1xuIFx0XHRcdHBmbiA9IHB0ZV9wZm4ocHRldmFsKTtcbiBcdFx0fSBlbHNlIHtcbkBAIC0yNTE1LDY4ICsyNzE4LDIyIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRjb25zdCBzb2Z0bGVhZl90IGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wdGUocHRldmFsKTtcbiBcbiBcdFx0XHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oZW50cnkpO1xuLVx0XHRcdFZNX1dBUk5fT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSwgZm9saW8pO1xuIFx0XHR9XG4gXG4gXHRcdHN1YnBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcbiBcdFx0YW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNlxuIFx0XHRcdFx0IFBhZ2VBbm9uRXhjbHVzaXZlKHN1YnBhZ2UpO1xuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdGJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4tXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBodWdlX3BtZF91bnNoYXJlIG1heSB1bm1hcCBhbiBlbnRpcmUgUE1EIHBhZ2UuXG4tXHRcdFx0ICogVGhlcmUgaXMgbm8gd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heVxuLVx0XHRcdCAqIGJlIGNhY2hlZCBmb3IgdGhpcyBtbSwgc28gd2UgbXVzdCBmbHVzaCB0aGVtIGFsbC5cbi1cdFx0XHQgKiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkIGFib3ZlIHRvIGNvdmVyIHRoaXNcbi1cdFx0XHQgKiByYW5nZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuLVxuLVx0XHRcdC8qXG4tXHRcdFx0ICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZVxuLVx0XHRcdCAqIGhlbGQgaW4gd3JpdGUgbW9kZS4gIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5XG4tXHRcdFx0ICogZG8gdGhpcyBvdXRzaWRlIHJtYXAgcm91dGluZXMuXG4tXHRcdFx0ICpcbi1cdFx0XHQgKiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuXG4tXHRcdFx0ICogTG9jayBvcmRlciBkaWN0YXRlcyBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFXG4tXHRcdFx0ICogaV9tbWFwX3J3c2VtLiAgV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmRcbi1cdFx0XHQgKiBmYWlsIGlmIHVuc3VjY2Vzc2Z1bC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoIWFub24pIHtcbi1cdFx0XHRcdHN0cnVjdCBtbXVfZ2F0aGVyIHRsYjtcbitcdFx0bnJfcGFnZXMgPSAxO1xuK1x0XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4rXHRcdFx0bnJfcGFnZXMgPSBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaChmb2xpbywgXHUwMDI2cHZtdywgcHRldmFsLFxuK1x0XHRcdFx0XHRcdFx0ICAgc3VicGFnZSwgYW5vbl9leGNsdXNpdmUpO1xuIFxuLVx0XHRcdFx0Vk1fQlVHX09OKCEoZmxhZ3MgXHUwMDI2IFRUVV9STUFQX0xPQ0tFRCkpO1xuLVx0XHRcdFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpIHtcbi1cdFx0XHRcdFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcdTAwMjZwdm13KTtcbi1cdFx0XHRcdFx0cmV0ID0gZmFsc2U7XG4tXHRcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdFx0fVxuK1x0XHRcdGVuZF9hZGRyID0gYWRkcmVzcyArIG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuK1x0XHRcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgYWRkcmVzcywgZW5kX2FkZHIpO1xuIFxuLVx0XHRcdFx0dGxiX2dhdGhlcl9tbXVfdm1hKFx1MDAyNnRsYiwgdm1hKTtcbi1cdFx0XHRcdGlmIChodWdlX3BtZF91bnNoYXJlKFx1MDAyNnRsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHtcbi1cdFx0XHRcdFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XG4tXHRcdFx0XHRcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXHUwMDI2dGxiLCB2bWEpO1xuLVx0XHRcdFx0XHR0bGJfZmluaXNoX21tdShcdTAwMjZ0bGIpO1xuLVx0XHRcdFx0XHQvKlxuLVx0XHRcdFx0XHQgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCxcbi1cdFx0XHRcdFx0ICogY29uc2VxdWVudGx5IHVubWFwcGluZyB0aGUgZm9saW8uXG4tXHRcdFx0XHRcdCAqL1xuLVx0XHRcdFx0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuLVx0XHRcdFx0XHRicmVhaztcbi1cdFx0XHRcdH1cbi1cdFx0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuLVx0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbi1cdFx0XHR9XG4tXHRcdFx0LyogTnVrZSB0aGUgaHVnZXRsYiBwYWdlIHRhYmxlIGVudHJ5ICovXG4tXHRcdFx0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuLVx0XHRcdGlmIChwdGVfZGlydHkocHRldmFsKSlcbi1cdFx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0XHRcdHdyaXRhYmxlID0gcHRlX3dyaXRlKHB0ZXZhbCk7XG4tXHRcdH0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4tXHRcdFx0Zmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHJlc3MsIHBmbik7XG4tXHRcdFx0LyogTnVrZSB0aGUgcGFnZSB0YWJsZSBlbnRyeS4gKi9cbitcdFx0XHQvKiBOdWtlIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuICovXG4rXHRcdFx0cHRldmFsID0gZ2V0X2FuZF9jbGVhcl9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgbnJfcGFnZXMpO1xuIFx0XHRcdGlmIChzaG91bGRfZGVmZXJfZmx1c2gobW0sIGZsYWdzKSkge1xuIFx0XHRcdFx0LypcbiBcdFx0XHRcdCAqIFdlIGNsZWFyIHRoZSBQVEUgYnV0IGRvIG5vdCBmbHVzaCBzbyBwb3RlbnRpYWxseVxuQEAgLTI1ODYsMTEgKzI3NDMsOSBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0XHQgKiB0cmFuc2l0aW9uIG9uIGEgY2FjaGVkIFRMQiBlbnRyeSBpcyB3cml0dGVuIHRocm91Z2hcbiBcdFx0XHRcdCAqIGFuZCB0cmFwcyBpZiB0aGUgUFRFIGlzIHVubWFwcGVkLlxuIFx0XHRcdFx0ICovXG4tXHRcdFx0XHRwdGV2YWwgPSBwdGVwX2dldF9hbmRfY2xlYXIobW0sIGFkZHJlc3MsIHB2bXcucHRlKTtcbi1cbi1cdFx0XHRcdHNldF90bGJfdWJjX2ZsdXNoX3BlbmRpbmcobW0sIHB0ZXZhbCwgYWRkcmVzcywgYWRkcmVzcyArIFBBR0VfU0laRSk7XG4rXHRcdFx0XHRzZXRfdGxiX3ViY19mbHVzaF9wZW5kaW5nKG1tLCBwdGV2YWwsIGFkZHJlc3MsIGVuZF9hZGRyKTtcbiBcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0cHRldmFsID0gcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcbitcdFx0XHRcdGZsdXNoX3RsYl9yYW5nZSh2bWEsIGFkZHJlc3MsIGVuZF9hZGRyKTtcbiBcdFx0XHR9XG4gXHRcdFx0aWYgKHB0ZV9kaXJ0eShwdGV2YWwpKVxuIFx0XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG5AQCAtMjYxMywxNCArMjc2OCw4IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRWTV9XQVJOX09OX0ZPTElPKGZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSwgZm9saW8pO1xuIFxuIFx0XHRcdHB0ZXZhbCA9IHN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShzdWJwYWdlKSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcbi1cdFx0XHRcdGh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pO1xuLVx0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLFxuLVx0XHRcdFx0XHRcdGhzeik7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdGRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbi1cdFx0XHR9XG4rXHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbitcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbiBcdFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgXHUwMDI2XHUwMDI2IHB0ZV91bnVzZWQocHRldmFsKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuIFx0XHRcdC8qXG5AQCAtMjYzNSw4ICsyNzg0LDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdCAqL1xuIFx0XHRcdGRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0c3dwX2VudHJ5X3QgZW50cnk7XG4gXHRcdFx0cHRlX3Qgc3dwX3B0ZTtcbitcdFx0XHR1bnNpZ25lZCBpbnQgaTtcbiBcbiBcdFx0XHQvKlxuIFx0XHRcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cbkBAIC0yNjQ0LDMyICsyNzkzLDE1IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHQgKiBzbyB3ZSdsbCBub3QgY2hlY2svY2FyZS5cbiBcdFx0XHQgKi9cbiBcdFx0XHRpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSBcdTAwM2MgMCkge1xuLVx0XHRcdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpXG4tXHRcdFx0XHRcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsXG4tXHRcdFx0XHRcdFx0XHRwdGV2YWwsIGhzeik7XG4tXHRcdFx0XHRlbHNlXG4tXHRcdFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xuLVx0XHRcdFx0cmV0ID0gZmFsc2U7XG4tXHRcdFx0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuLVx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuK1x0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuIFx0XHRcdH1cbiBcbi1cdFx0XHQvKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XG4tXHRcdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQgICAgaHVnZXRsYl90cnlfc2hhcmVfYW5vbl9ybWFwKGZvbGlvKSkge1xuLVx0XHRcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLFxuLVx0XHRcdFx0XHRcdFx0cHRldmFsLCBoc3opO1xuLVx0XHRcdFx0XHRyZXQgPSBmYWxzZTtcbi1cdFx0XHRcdFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcdTAwMjZwdm13KTtcbi1cdFx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fSBlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSBcdTAwMjZcdTAwMjZcbi1cdFx0XHRcdCAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKGZvbGlvLCBzdWJwYWdlKSkge1xuLVx0XHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XG4tXHRcdFx0XHRyZXQgPSBmYWxzZTtcbi1cdFx0XHRcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4tXHRcdFx0XHRicmVhaztcbitcdFx0XHQvKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbitcdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4rXHRcdFx0ICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhmb2xpbywgc3VicGFnZSwgbnJfcGFnZXMpKSB7XG4rXHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuK1x0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuIFx0XHRcdH1cbiBcbiBcdFx0XHQvKlxuQEAgLTI2NzcsNTIgKzI4MDksNDAgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdCAqIHB0ZS4gZG9fc3dhcF9wYWdlKCkgd2lsbCB3YWl0IHVudGlsIHRoZSBtaWdyYXRpb25cbiBcdFx0XHQgKiBwdGUgaXMgcmVtb3ZlZCBhbmQgdGhlbiByZXN0YXJ0IGZhdWx0IGhhbmRsaW5nLlxuIFx0XHRcdCAqL1xuLVx0XHRcdGlmICh3cml0YWJsZSlcbi1cdFx0XHRcdGVudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkoXG4tXHRcdFx0XHRcdFx0XHRwYWdlX3RvX3BmbihzdWJwYWdlKSk7XG4tXHRcdFx0ZWxzZSBpZiAoYW5vbl9leGNsdXNpdmUpXG4tXHRcdFx0XHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfZXhjbHVzaXZlX21pZ3JhdGlvbl9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4oc3VicGFnZSkpO1xuLVx0XHRcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcbi1cdFx0XHRcdGlmIChwdGVfeW91bmcocHRldmFsKSlcbi1cdFx0XHRcdFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7XG4tXHRcdFx0XHRpZiAocHRlX2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfZGlydHkoZW50cnkpO1xuLVx0XHRcdFx0c3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpO1xuLVx0XHRcdFx0aWYgKHB0ZV9zb2Z0X2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcbi1cdFx0XHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbi1cdFx0XHRcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSlcbi1cdFx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xuLVx0XHRcdFx0aWYgKHB0ZV9zd3BfdWZmZChwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4tXHRcdFx0fVxuLVx0XHRcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKVxuLVx0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSxcbi1cdFx0XHRcdFx0XHRoc3opO1xuLVx0XHRcdGVsc2Vcbi1cdFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlKTtcbitcdFx0XHRzd3BfcHRlID0gbWFrZV9taWdyYXRpb25fc3dwX3B0ZShzdWJwYWdlLCBwdGV2YWwsXG4rXHRcdFx0XHRcdFx0XHQgd3JpdGFibGUsIGFub25fZXhjbHVzaXZlKTtcbiBcdFx0XHR0cmFjZV9zZXRfbWlncmF0aW9uX3B0ZShhZGRyZXNzLCBwdGVfdmFsKHN3cF9wdGUpLFxuIFx0XHRcdFx0XHRcdGZvbGlvX29yZGVyKGZvbGlvKSk7XG4rXG4rXHRcdFx0LyogU2V0IG5yX3BhZ2VzIG1pZ3JhdGlvbiBlbnRyaWVzLCBhZHZhbmNpbmcgdGhlIFBGTi4gKi9cbitcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzICsgKHVuc2lnbmVkIGxvbmcpaSAqIFBBR0VfU0laRSxcbitcdFx0XHRcdFx0ICAgcHZtdy5wdGUgKyBpLCBzd3BfcHRlKTtcbitcdFx0XHRcdHN3cF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHN3cF9wdGUpO1xuK1x0XHRcdH1cbiBcdFx0XHQvKlxuIFx0XHRcdCAqIE5vIG5lZWQgdG8gaW52YWxpZGF0ZSBoZXJlIGl0IHdpbGwgc3luY2hyb25pemUgb25cbiBcdFx0XHQgKiBhZ2FpbnN0IHRoZSBzcGVjaWFsIHN3YXAgbWlncmF0aW9uIHB0ZS5cbiBcdFx0XHQgKi9cbiBcdFx0fVxuIFxuLVx0XHRpZiAodW5saWtlbHkoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkpXG4tXHRcdFx0aHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRmb2xpb19yZW1vdmVfcm1hcF9wdGUoZm9saW8sIHN1YnBhZ2UsIHZtYSk7XG4rXHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xuIFx0XHRpZiAodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9MT0NLRUQpXG4gXHRcdFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcbi1cdFx0Zm9saW9fcHV0KGZvbGlvKTtcbitcdFx0Zm9saW9fcHV0X3JlZnMoZm9saW8sIG5yX3BhZ2VzKTtcbitcbitcdFx0LypcbitcdFx0ICogSWYgd2UgYmF0Y2hlZCB0aGUgZW50aXJlIGZvbGlvLCB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG9cbitcdFx0ICogd2Fsazsgc3RvcCByaWdodCBoZXJlLlxuK1x0XHQgKi9cbitcdFx0aWYgKG5yX3BhZ2VzID09IGZvbGlvX25yX3BhZ2VzKGZvbGlvKSlcbitcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0Y29udGludWU7XG4rd2Fsa19hYm9ydDpcbitcdFx0cmV0ID0gZmFsc2U7XG4rd2Fsa19kb25lOlxuK1x0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuK1x0XHRicmVhaztcbiBcdH1cbiBcbiBcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChcdTAwMjZyYW5nZSk7XG5AQCAtMjc0MSw3ICsyODYxLDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIHZvaWQgdHJ5X3RvX21pZ3JhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHtcbi1cdFx0LnJtYXBfb25lID0gdHJ5X3RvX21pZ3JhdGVfb25lLFxuK1x0XHQucm1hcF9vbmUgPSBmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pID9cbitcdFx0XHRcdHRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lIDogdHJ5X3RvX21pZ3JhdGVfb25lLFxuIFx0XHQuYXJnID0gKHZvaWQgKilmbGFncyxcbiBcdFx0LmRvbmUgPSBmb2xpb19ub3RfbWFwcGVkLFxuIFx0XHQuYW5vbl9sb2NrID0gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkLFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6MjMuMTM5ODU3MjExWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjU3NjE4NjEyMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBNZW1vcnkgTWFuYWdlbWVudCBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggaW4gZnJvbnQgb2YgbWUsIGFuZCBpdCBsb29rcyBsaWtlIGEgZmFpcmx5IHNpZ25pZmljYW50IGNoYW5nZSB0byB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLCBmb2N1c2luZyBvbiBgcm1hcC5jYCBhbmQgYG1pZ3JhdGUuY2AuIFNwZWNpZmljYWxseSwgaXQncyBpbnRyb2R1Y2luZyBzb21lIGJhdGNoaW5nIGZvciBtaWdyYXRpb24gUFRFcyDigJMgYG1pZ3JhdGlvbl9wdGVfYmF0Y2hgLCBgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzYCwgYW5kIGBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaGAgYXJlIHRoZSBrZXkgcGxheWVycyBoZXJlLiBJdCdzIHJlZmFjdG9yaW5nIGB0cnlfdG9fbWlncmF0ZV9vbmVgIHRvIHVzZSB0aGlzIGJhdGNoaW5nIGFwcHJvYWNoLCBhbmQgZXZlbiBwdWxsaW5nIG91dCBhIGRlZGljYXRlZCBgdHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmVgIGZ1bmN0aW9uIGZvciBIdWdldGxiIGZvbGlvcy4gSXQncyBhbHNvIHRvdWNoaW5nIGByZW1vdmVfbWlncmF0aW9uX3B0ZWAgd2l0aCBiYXRjaGluZyBpbiBtaW5kLlxuXG5HaXZlbiB0aGF0IHRoaXMgaXMgdG91Y2hpbmcgZnVuZGFtZW50YWwgbWVtb3J5IG1hbmFnZW1lbnQgLSBtaWdyYXRpb24gYW5kIHRoZSBybWFwIG1lY2hhbmlzbSAtIHRoaXMgaXMgYWJzb2x1dGVseSBzb21ldGhpbmcgdGhhdCBkZW1hbmRzIHRob3JvdWdoIGZ1enppbmcuIFdlIG5lZWQgdG8gYmUgY29uZmlkZW50IGluIGl0cyBjb3JyZWN0bmVzcywgZXNwZWNpYWxseSBhcm91bmQgUFRFIGhhbmRsaW5nLlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGdldCBzcGVjaWZpYy4gSSBuZWVkIHRvIG5haWwgZG93biB0aGUgYWZmZWN0ZWQgY29kZSBhbmQgd2hhdCB0aGUga2V5IGZ1bmN0aW9uYWwgYXJlYXMgYXJlLiBMZXQgbWUgbGlzdCB0aGUgcHJpbWFyeSBmdW5jdGlvbnMgSSBuZWVkIHRvIGZvY3VzIG9uIGR1cmluZyBmdXp6aW5nOlxuXG4qICAgYG1pZ3JhdGlvbl9wdGVfYmF0Y2hgXG4qICAgYHJlbW92ZV9taWdyYXRpb25fcHRlYFxuKiAgIGByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiYFxuKiAgIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWBcbiogICBgdHJ5X3RvX21pZ3JhdGVfb25lYFxuKiAgIGBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaGBcbiogICBgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzYFxuKiAgIGBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlYFxuXG5Pa2F5LCBub3cgbGV0J3MgdXNlIGBkZWZhdWx0X2FwaTpncmVwcGVyYCB0byBsb2NhdGUgdGhlc2UgZnVuY3Rpb25zIGFuZCB1bmRlcnN0YW5kIHRoZWlyIGNvbnRleHQgd2l0aGluIHRoZSBjb2RlLiBJJ2xsIG5lZWQgdG8gY2hlY2sgYm90aCBgbW0vbWlncmF0ZS5jYCBhbmQgYG1tL3JtYXAuY2AgdG8gcGlucG9pbnQgd2hlcmUgdGhlc2UgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBpbXBsZW1lbnRlZC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgaGFuZGxlIG9uIHdoZXJlIHRvIGZvY3VzIG15IGFuYWx5c2lzIGFuZCBmdXp6aW5nIGVmZm9ydHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MzAwLCJPdXRwdXRUb2tlbnMiOjk5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mjk0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6MjkuNzE2MDQ1OTU0WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQxMzUyODYwNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXihzdGF0aWN8dm9pZHxpbnR8Ym9vbHx1bnNpZ25lZCkuKiAobWlncmF0aW9uX3B0ZV9iYXRjaHxyZW1vdmVfbWlncmF0aW9uX3B0ZXxyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxifHRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lfHRyeV90b19taWdyYXRlX29uZXxmb2xpb19taWdyYXRlX3B0ZV9iYXRjaHxmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXN8bWFrZV9taWdyYXRpb25fc3dwX3B0ZSlcXFxcKFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3JtYXAuaD03MDg9c3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19mb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3JtYXAuaC04MTItICovXFxuaW5jbHVkZS9saW51eC9ybWFwLmg6ODEzOnN0YXRpYyBpbmxpbmUgaW50IGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbmluY2x1ZGUvbGludXgvcm1hcC5oLTgxNC1cXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4tLVxcbm1tL21pZ3JhdGUuYz0zNDM9c3RydWN0IHJtYXBfd2Fsa19hcmcge1xcbi0tXFxubW0vbWlncmF0ZS5jLTM1MS0gKi9cXG5tbS9taWdyYXRlLmM6MzUyOnN0YXRpYyB1bnNpZ25lZCBpbnQgbWlncmF0aW9uX3B0ZV9iYXRjaChzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsXFxubW0vbWlncmF0ZS5jLTM1My1cXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBwdGVfdCBmaXJzdF9wdGUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4KVxcbi0tXFxubW0vbWlncmF0ZS5jPTM3MD1zdGF0aWMgcHRlX3QgbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqbmV3LFxcbi0tXFxubW0vbWlncmF0ZS5jLTQwMy0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRVxcbm1tL21pZ3JhdGUuYzo0MDQ6c3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYihzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbm1tL21pZ3JhdGUuYy00MDUtXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxcbi0tXFxubW0vbWlncmF0ZS5jLTQ0NS0jZWxzZVxcbm1tL21pZ3JhdGUuYzo0NDY6c3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYihzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbm1tL21pZ3JhdGUuYy00NDctXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxcbi0tXFxubW0vbWlncmF0ZS5jLTQ1NS0gKi9cXG5tbS9taWdyYXRlLmM6NDU2OnN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxubW0vbWlncmF0ZS5jLTQ1Ny1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpXFxuLS1cXG5tbS9ybWFwLmM9MjM5Mz12b2lkIHRyeV90b191bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBlbnVtIHR0dV9mbGFncyBmbGFncylcXG4tLVxcbm1tL3JtYXAuYy0yNDA4LS8qIEJ1aWxkIHRoZSBtaWdyYXRpb24gc3dhcCBQVEUgdGhhdCByZXBsYWNlcyBwdGV2YWwgZm9yIGEgcGFnZS4gKi9cXG5tbS9ybWFwLmM6MjQwOTpzdGF0aWMgcHRlX3QgbWFrZV9taWdyYXRpb25fc3dwX3B0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgcHRlX3QgcHRldmFsLFxcbm1tL3JtYXAuYy0yNDEwLVxcdFxcdGJvb2wgd3JpdGFibGUsIGJvb2wgYW5vbl9leGNsdXNpdmUpXFxuLS1cXG5tbS9ybWFwLmMtMjQ0OC0gKi9cXG5tbS9ybWFwLmM6MjQ0OTpzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbm1tL3JtYXAuYy0yNDUwLVxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcXG4tLVxcbm1tL3JtYXAuYy0yNTg4LVxcbm1tL3JtYXAuYzoyNTg5OnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxubW0vcm1hcC5jLTI1OTAtXFx0XFx0c3RydWN0IHBhZ2Vfdm1hX21hcHBlZF93YWxrICpwdm13LCBwdGVfdCBwdGUsXFxuLS1cXG5tbS9ybWFwLmMtMjYzNi0gKi9cXG5tbS9ybWFwLmM6MjYzNzpzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxubW0vcm1hcC5jLTI2MzgtXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6MzMuODUxMzQwNTA0WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTIzNTk1OTY5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1pZ3JhdGlvbiBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEkgc2VlIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHNldCBvZiBmdW5jdGlvbnMgcmVsYXRlZCB0byBwYWdlIG1pZ3JhdGlvbi4gVGhlIGNvcmUgc2V0IGluY2x1ZGVzIGBtaWdyYXRpb25fcHRlX2JhdGNoYCwgYHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGJgLCBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVgLCBgbWFrZV9taWdyYXRpb25fc3dwX3B0ZWAsIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAsIGBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaGAsIGFuZCBgdHJ5X3RvX21pZ3JhdGVfb25lYC4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIGluc3RhbnRseSByZWNvZ25pemUgdGhlc2UgYXMgY3J1Y2lhbCBlbGVtZW50cyBpbiBoYW5kbGluZyB0aGUgbW92ZW1lbnQgb2YgcGFnZXMsIHBvdGVudGlhbGx5IGZyb20gb25lIHBoeXNpY2FsIGxvY2F0aW9uIHRvIGFub3RoZXIuIFRoZSBuYW1pbmcgY29udmVudGlvbnMgc3VnZ2VzdCBiYXRjaCBwcm9jZXNzaW5nIGFuZCBoYW5kbGluZyBvZiBIdWdlVExCIHBhZ2VzLCB3aGljaCBpcyBwcmVjaXNlbHkgdGhlIGtpbmQgb2YgbG93LWxldmVsIHN0dWZmIEkgbmVlZCB0byB1bmRlcnN0YW5kLlxuXG5Ob3csIGEgY3JpdGljYWwgcXVlc3Rpb24gYXJpc2VzOiBhcmUgdGhlcmUgYW55ICpzcGVjaWZpYyogY29uZmlndXJhdGlvbnMgdGhhdCBpbmZsdWVuY2UgdGhlaXIgYmVoYXZpb3Igb3IgY29tcGlsYXRpb24/IEZyb20gbXkgaW5pdGlhbCBzY2FuLCBpdCBsb29rcyBsaWtlIGBDT05GSUdfSFVHRVRMQl9QQUdFYCBpcyB0aGUga2V5IGZvciBmdW5jdGlvbnMgbGlrZSBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYmAgYW5kIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAsIHdoaWNoIG1ha2VzIHBlcmZlY3Qgc2Vuc2UuIEh1Z2VUTEIgcGFnZSBtaWdyYXRpb24gd2lsbCBhbHdheXMgbmVlZCB0aGlzIGVuYWJsZWQuIE9idmlvdXNseSwgYENPTkZJR19NSUdSQVRJT05gIGlzIGdvaW5nIHRvIGJlIG1hbmRhdG9yeS4gQnV0LCB3aGF0IGFib3V0IHRoZSBjb21waWxhdGlvbiBvZiBgbWlncmF0ZS5jYCBpdHNlbGY/IEl0J3MgZXNzZW50aWFsIHRvIGNvbmZpcm0gaWYgaXQncyBjb25kaXRpb25hbGx5IGluY2x1ZGVkLCBvciBpZiB0aGUgY29tcGlsZXIgYWx3YXlzIGJ1aWxkcyBpdC4gVGhlIGRldGFpbHMgd2lsbCBiZSBmb3VuZCBpbiBlaXRoZXIgYG1tL0tjb25maWdgIG9yIGBtbS9NYWtlZmlsZWAuIFRoYXQncyB3aGVyZSBJIG5lZWQgdG8gbG9vayBmb3IgcHJlY2lzZSBhbnN3ZXJzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTk1NCwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3MSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMjozOS4wODczMDM4ODRaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ4MjI2MTk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1pZ3JhdGVcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vTWFrZWZpbGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9OTc9b2JqLSQoQ09ORklHX01FTVRFU1QpXFx0XFx0Kz0gbWVtdGVzdC5vXFxubW0vTWFrZWZpbGU6OTg6b2JqLSQoQ09ORklHX01JR1JBVElPTikgKz0gbWlncmF0ZS5vXFxubW0vTWFrZWZpbGUtOTktb2JqLSQoQ09ORklHX05VTUEpICs9IG1lbW9yeS10aWVycy5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEyVDEzOjEyOjM5LjIzNTU0MDQ2M1oiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MzIyOTQ0NTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBgQ09ORklHX01JR1JBVElPTmAgaXMgZW5hYmxlZC4gVGhhdCdzIGZ1bmRhbWVudGFsLCBJJ2Qgc2F5LiBBbmQsIG9mIGNvdXJzZSwgZm9yIGFueXRoaW5nIGh1Z2V0bGItc3BlY2lmaWMsIEkgbmVlZCBgQ09ORklHX0hVR0VUTEJfUEFHRWAuIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuIE5vdywgZ2l2ZW4gdGhhdCBiYXRjaGluZyBpcyBtb3N0IGJlbmVmaWNpYWwgZm9yIGxhcmdlciBmb2xpb3MsIGl0J3Mgd29ydGggY2hlY2tpbmcgdGhlIHN0YXR1cyBvZiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhcyB3ZWxsLiBNaWdodCBhcyB3ZWxsIGJlIHRob3JvdWdoIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGFueSBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBJIHNob3VsZCBiZSBjb25zaWRlcmluZyBhdCB0aGUgc2FtZSB0aW1lLiBMZXQgbWUganVzdCBzY2FuIHRocm91Z2ggdGhlIHJlbGV2YW50IGRvY3VtZW50YXRpb24gYW5kIGNvbmZpZ3MgdG8gY29uZmlybS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY1NTQsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMjo0Mi43Njc4Mzk3MTdaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzY2MTc4NTUzLCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJDT05GSUdfTUlHUkFUSU9OXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEyVDEzOjEyOjQzLjEzNDAyOFoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI5MzMzNDA1MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgaG93IEknZCBhcHByb2FjaCB0aGlzIHRhc2ssIGFzIGlmIHRoZXNlIHdlcmUgbXkgaW50ZXJuYWwgdGhvdWdodHM6XG5cbioqTG9jYXRpbmcgdGhlIERlZmluaXRpb24gb2YgQ09ORklHX01JR1JBVElPTioqXG5cbkFscmlnaHQsIHNvIGBDT05GSUdfTUlHUkFUSU9OYCBpcyB0aGUgdGFyZ2V0LiBGaXJzdCBpbnN0aW5jdD8gTGV0J3MgdHJhY2UgYmFjayB0aGF0IG1hY3JvLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSBpdCdzIGRlZmluZWQgd2l0aGluIHRoZSBwcm9qZWN0LiBJJ2xsIG5lZWQgdG8ga25vdyB3aGVyZSBJIGNhbiBzZWUgaXRzIHZhbHVlLCB3aGF0IGl0IHJlbGF0ZXMgdG8sIGFuZCBob3cgaXQgaXMgYmVpbmcgdXNlZC4gV2hlcmUgaXMgdGhhdCBjb25maWcgb3B0aW9uIGRlZmluZWQ/IExldCdzIHBpbnBvaW50IHRoYXQgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb24uIEZyb20gdGhlcmUsIEkgY2FuIHVuZGVyc3RhbmQgaXQncyByb2xlIGluIHRoZSBhcmNoaXRlY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2ODA3LCJPdXRwdXRUb2tlbnMiOjE4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6NDYuMDY3MzcxMjc4WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzYzNTg1MDk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBNSUdSQVRJT05cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz02Nzc9Y29uZmlnIE5VTUFfTUlHUkFUSU9OXFxuLS1cXG5tbS9LY29uZmlnLTY4Ny1cXG5tbS9LY29uZmlnOjY4ODpjb25maWcgTUlHUkFUSU9OXFxubW0vS2NvbmZpZy02ODktXFx0Ym9vbFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMjo0OC44MzA5NjQzMzdaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUxMjUyNzMyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqS2NvbmZpZyBNdXNpbmdzKipcblxuUmlnaHQsIGxldCBtZSBzZWUuLi4gdGhhdCBgY29uZmlnIE1JR1JBVElPTmAgb3B0aW9uIEknbSBmYW1pbGlhciB3aXRoLCB0aGF0J3MgZGVmaW5lZCBpbiBgbW0vS2NvbmZpZ2AsIGlzbid0IGl0PyBHb29kLiBBaCwgYW5kIGEgcXVpY2sgc2FuaXR5IGNoZWNrIOKAkyBJIHJlbWVtYmVyIGl0J3MgYSBzaW1wbGUgYm9vbGVhbi4gTm90aGluZyBjb21wbGljYXRlZCB0aGVyZS4gTm93LCBqdXN0IHRvIGJlIHRob3JvdWdoIGFuZCBiZWNhdXNlIGl0J3MgaW4gdGhlIHNhbWUgZ2VuZXJhbCBhcmVhLCBsZXQgbWUgdGFrZSBhIHF1aWNrIGxvb2sgYXQgYENPTkZJR19IVUdFVExCX1BBR0VgIHdoaWxlIEknbSBhdCBpdCwganVzdCB0byBiZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwIGFuZCBhbnkgcG90ZW50aWFsIGludGVyYWN0aW9ucy4gTmVlZCB0byBrZWVwIHRoZSB3aG9sZSBwaWN0dXJlIGluIG1pbmQsIGFmdGVyIGFsbC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTcwNDQsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMjo1Mi4zNDM0OTQ0NTNaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2MzU4MDYzMDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEhVR0VUTEJfUEFHRVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL3NoL21tL0tjb25maWc9MTU4PWNob2ljZVxcbi0tXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE2My1cXG5hcmNoL3NoL21tL0tjb25maWc6MTY0OmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV82NEtcXG5hcmNoL3NoL21tL0tjb25maWctMTY1LVxcdGJvb2wgXFxcIjY0a0JcXFwiXFxuLS1cXG5hcmNoL3NoL21tL0tjb25maWctMTY3LVxcbmFyY2gvc2gvbW0vS2NvbmZpZzoxNjg6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzI1NktcXG5hcmNoL3NoL21tL0tjb25maWctMTY5LVxcdGJvb2wgXFxcIjI1NmtCXFxcIlxcbi0tXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE3MS1cXG5hcmNoL3NoL21tL0tjb25maWc6MTcyOmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV8xTUJcXG5hcmNoL3NoL21tL0tjb25maWctMTczLVxcdGJvb2wgXFxcIjFNQlxcXCJcXG5hcmNoL3NoL21tL0tjb25maWctMTc0LVxcbmFyY2gvc2gvbW0vS2NvbmZpZzoxNzU6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzRNQlxcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNzYtXFx0Ym9vbCBcXFwiNE1CXFxcIlxcbi0tXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE3OC1cXG5hcmNoL3NoL21tL0tjb25maWc6MTc5OmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV82NE1CXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE4MC1cXHRib29sIFxcXCI2NE1CXFxcIlxcbi0tXFxuZnMvS2NvbmZpZz0yNjI9aWYgSFVHRVRMQkZTXFxuZnMvS2NvbmZpZzoyNjM6Y29uZmlnIEhVR0VUTEJfUEFHRV9PUFRJTUlaRV9WTUVNTUFQX0RFRkFVTFRfT05cXG5mcy9LY29uZmlnLTI2NC1cXHRib29sIFxcXCJIdWdlVExCIFZtZW1tYXAgT3B0aW1pemF0aW9uIChIVk8pIGRlZmF1bHRzIHRvIG9uXFxcIlxcbi0tXFxuZnMvS2NvbmZpZz0yNzE9ZW5kaWYgIyBIVUdFVExCRlNcXG5mcy9LY29uZmlnLTI3Mi1cXG5mcy9LY29uZmlnOjI3Mzpjb25maWcgSFVHRVRMQl9QQUdFXFxuZnMvS2NvbmZpZy0yNzQtXFx0ZGVmX2Jvb2wgSFVHRVRMQkZTXFxuLS1cXG5mcy9LY29uZmlnLTI3Ni1cXG5mcy9LY29uZmlnOjI3Nzpjb25maWcgSFVHRVRMQl9QQUdFX09QVElNSVpFX1ZNRU1NQVBcXG5mcy9LY29uZmlnLTI3OC1cXHRkZWZfYm9vbCBIVUdFVExCX1BBR0VcXG4tLVxcbm1tL0tjb25maWc9Njk4PWNvbmZpZyBBUkNIX0hBU19QTURfU09GVExFQVZFU1xcbi0tXFxubW0vS2NvbmZpZy03MDAtXFxubW0vS2NvbmZpZzo3MDE6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFX1ZBUklBQkxFXFxubW0vS2NvbmZpZy03MDItXFx0ZGVmX2Jvb2wgblxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMjo1NC45NzkzMTEzNDFaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzI2OTUyNzAxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyBIdWdlIFBhZ2VzIGFuZCBEZXBlbmRlbmNpZXMqKlxuXG5BbHJpZ2h0LCBsZXQncyBzZWUuLi4gYEhVR0VUTEJfUEFHRWAgaXMgZGVmaW5lZCBpbiBgZnMvS2NvbmZpZ2AuIFRoYXQncyB0aGUgc3RhcnRpbmcgcG9pbnQuIEFuZCBhIHF1aWNrIGNoZWNrIHJldmVhbHMgdGhhdCBpdCdzIGRlcGVuZGVudCBvbiBgSFVHRVRMQkZTYC4gTWFrZXMgcGVyZmVjdCBzZW5zZS4gQ2FuJ3QgaGF2ZSBodWdlIHBhZ2VzIHdpdGhvdXQgdGhlIGZpbGUgc3lzdGVtIHN1cHBvcnQsIHJpZ2h0PyBOb3csIHRoZSBuZXh0IHF1ZXN0aW9uIGlzIGFib3V0IGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhhdCB0aWVzIGluLiBMZXQncyBzZWUgd2hhdCBJIGNhbiBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzg1MywiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEyVDEzOjEyOjU4LjI0ODg0MDUxM1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjY5NzIxODkxNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz04MzU9Y29uZmlnIE1NX0lEXFxuLS1cXG5tbS9LY29uZmlnLTgzNy1cXG5tbS9LY29uZmlnOjgzODptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vS2NvbmZpZy04MzktXFx0Ym9vbCBcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODU2PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04NjEtXFxubW0vS2NvbmZpZzo4NjI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xcbm1tL0tjb25maWctODYzLVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctODY4LVxcbm1tL0tjb25maWc6ODY5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXFxubW0vS2NvbmZpZy04NzAtXFx0XFx0Ym9vbCBcXFwibWFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWctODc3LVxcbm1tL0tjb25maWc6ODc4OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxcbm1tL0tjb25maWctODc5LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZz04ODU9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg5NC1cXG5tbS9LY29uZmlnOjg5NTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxcbm1tL0tjb25maWctODk2LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MDQtXFxubW0vS2NvbmZpZzo5MDU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05MDYtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MTItXFxubW0vS2NvbmZpZzo5MTM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTkxNC1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTIwLVxcbm1tL0tjb25maWc6OTIxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTIyLVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWc9OTMwPWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy05MzktXFxubW0vS2NvbmZpZzo5NDA6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTk0MS1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTQ4LVxcbm1tL0tjb25maWc6OTQ5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTUwLVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTU2LVxcbm1tL0tjb25maWc6OTU3OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05NTgtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk2NC1cXG5tbS9LY29uZmlnOjk2NTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTk2Ni1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEyVDEzOjEzOjAwLjk0NjA2NzA5OFoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTM0Njk0MzQ0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgTWVtb3J5IE1pZ3JhdGlvbiBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBoYW5kZWQgdGhpcyBwYXRjaCB0aGF0J3MgY2xlYXJseSBmb2N1c2VkIG9uIG9wdGltaXppbmcgbWVtb3J5IG1pZ3JhdGlvbiwgcGFydGljdWxhcmx5IGFyb3VuZCBoYW5kbGluZyBQVEVzIGluIGJhdGNoZXMuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB0aGUgY29yZSBmdW5jdGlvbnMgYWZmZWN0ZWQ6IGBtbS9taWdyYXRlLmNgIGFuZCBgbW0vcm1hcC5jYC4gSSd2ZSBnb25lIHRocm91Z2ggdGhlIGNvZGUgYW5kIEkndmUgaWRlbnRpZmllZCB0aGUga2V5IGZ1bmN0aW9ucyBJIG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGguXG5cbkkndmUgaW5pdGlhbGx5IGxpc3RlZCBhbGwgdGhlIGZ1bmN0aW9ucyBpbiB0aGF0IHJlZ2lvbiwgYnV0IEkgcXVpY2tseSByZWFsaXplZCB0aGF0IHR3byBvZiB0aGVtLCBgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzYCBhbmQgYHNvZnRsZWFmX3B0ZV9iYXRjaGAsIGFyZSBgc3RhdGljIGlubGluZWAgYW5kIGRlZmluZWQgaW4gaGVhZGVycy4gVGhlcmVmb3JlLCB0aGV5IG1pZ2h0IG5vdCBiZSBkaXJlY3RseSBmdXp6YWJsZSBhcyBzdGFuZGFsb25lIHVuaXRzLCBhbHRob3VnaCB0aGV5IGFyZSBjcml0aWNhbCB0byBjb25zaWRlciBhcyBwYXJ0IG9mIHRoZSBvdmVyYWxsIGZsb3cgb2YgdGhlIG5vbi1pbmxpbmUgZnVuY3Rpb25zLiBJJ3ZlIHJlLXByaW9yaXRpemVkIGFuZCByZW1vdmVkIHRob3NlIHN0YXRpYyBpbmxpbmVzIHRvIGdpdmUgbWUgYSBzaGFycGVyIGZvY3VzLlxuXG5TbywgaGVyZSdzIHRoZSBuYXJyb3dlZC1kb3duIGxpc3Qgb2YgZnVuY3Rpb25zIEkgcmVhbGx5IG5lZWQgdG8gZHJpbGwgZG93biBvbjogYG1pZ3JhdGlvbl9wdGVfYmF0Y2hgLCBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVgLCBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYmAsIGByZW1vdmVfbWlncmF0aW9uX3B0ZXNgLCBgbWFrZV9taWdyYXRpb25fc3dwX3B0ZWAsIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAsIGBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaGAsIGB0cnlfdG9fbWlncmF0ZV9vbmVgLCBhbmQgYHRyeV90b19taWdyYXRlYC5cblxuVGhlIHBhdGNoJ3MgZ29hbCBhcHBlYXJzIHRvIGJlIHNwZWVkaW5nIHRoaW5ncyB1cCwgc28gYmF0Y2hpbmcgUFRFIG9wZXJhdGlvbnMsIHByZXN1bWFibHkgZm9yIGxhcmdlciBmb2xpb3MuIFRoaXMgbWVhbnMgbXkgZnV6emluZyBuZWVkcyB0byBiZSBwYXJ0aWN1bGFybHkgcm9idXN0LCBjb3ZlcmluZyBhbGwgdGhlIHBvdGVudGlhbCBwZXJtdXRhdGlvbnMgb2YgUFRFIGhhbmRsaW5nLCBlc3BlY2lhbGx5IHdpdGggcGVybWlzc2lvbnMsIGFuZCBtYWtpbmcgc3VyZSB0aGUgYmF0Y2hpbmcgbG9naWMgZG9lc24ndCBpbnRyb2R1Y2UgYW55IHN1YnRsZSBlcnJvcnMgb3IgbGVha3Mgd2hlbiBoYW5kbGluZyBkZXZpY2UtcHJpdmF0ZSBmb2xpb3Mgb3IgaHVnZXRsYiBwYWdlcy4gRWRnZSBjYXNlcyBhcmUgZ29pbmcgdG8gYmUgbXkgZnJpZW5kcyBoZXJlLlxuXG5HaXZlbiB0aGUgY29kZSdzIGRlcGVuZGVuY2Ugb24gYG1tL21pZ3JhdGUuY2AsIGBNSUdSQVRJT05gIGlzIG15IGluaXRpYWwgY29uZmlnLiBJIHRoZW4gbmVlZCB0byBlbnN1cmUgdGhhdCBgSFVHRVRMQl9QQUdFYCBpcyBhbHNvIHNldCBiZWNhdXNlIG9mIGByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiYCBhbmQgYHRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lYC4gQWxzbywgc2luY2UgdGhlIHdob2xlIGJhdGNoaW5nIGNvbmNlcHQgaXMgbGFyZ2VseSBnZWFyZWQgdG93YXJkIGRlYWxpbmcgd2l0aCBsYXJnZXIgbWVtb3J5IGNodW5rcywgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBzaG91bGQgYWxzbyBiZSB1c2VkIHRvIGdldCBzb21lIGNvdmVyYWdlIGluIHRoYXQgc3BhY2UuXG5cbkkgdGhpbmsgSSd2ZSBnb3QgYSBzb2xpZCBwbGFuIGZvciBmdXp6aW5nIHRoaXMgcGF0Y2guIE5vdywgbGV0J3MgZ2V0IHRvIHdvcmshXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NzYxLCJPdXRwdXRUb2tlbnMiOjIxNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc0OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMzoxMi4yOTMwMTM4MTJaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjA5NzIwODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1JR1JBVElPTlwiLFxuICAgIFwiSFVHRVRMQl9QQUdFXCIsXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1pZ3JhdGlvbl9wdGVfYmF0Y2hcIixcbiAgICBcInJlbW92ZV9taWdyYXRpb25fcHRlXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZXNcIixcbiAgICBcIm1ha2VfbWlncmF0aW9uX3N3cF9wdGVcIixcbiAgICBcInRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lXCIsXG4gICAgXCJmb2xpb19taWdyYXRlX3B0ZV9iYXRjaFwiLFxuICAgIFwidHJ5X3RvX21pZ3JhdGVfb25lXCIsXG4gICAgXCJ0cnlfdG9fbWlncmF0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYmF0Y2hpbmcgZm9yIG1pZ3JhdGlvbiBQVEVzIHRvIG9wdGltaXplIG1lbW9yeSBtaWdyYXRpb24sIGVzcGVjaWFsbHkgZm9yIGxhcmdlIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgaW4gbW0vbWlncmF0ZS5jIGFuZCBtbS9ybWFwLmMuIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBiYXRjaGluZyBsb2dpYyBjb3JyZWN0bHkgaGFuZGxlcyBQVEVzLCBwZXJtaXNzaW9ucywgYW5kIGVkZ2UgY2FzZXMgbGlrZSBkZXZpY2UgcHJpdmF0ZSBmb2xpb3Mgb3IgaHVnZXRsYiBwYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNSUdSQVRJT05cIixcbiAgICBcIkhVR0VUTEJfUEFHRVwiLFxuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtaWdyYXRpb25fcHRlX2JhdGNoXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZVwiLFxuICAgIFwicmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYlwiLFxuICAgIFwicmVtb3ZlX21pZ3JhdGlvbl9wdGVzXCIsXG4gICAgXCJtYWtlX21pZ3JhdGlvbl9zd3BfcHRlXCIsXG4gICAgXCJ0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZVwiLFxuICAgIFwiZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2hcIixcbiAgICBcInRyeV90b19taWdyYXRlX29uZVwiLFxuICAgIFwidHJ5X3RvX21pZ3JhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGJhdGNoaW5nIGZvciBtaWdyYXRpb24gUFRFcyB0byBvcHRpbWl6ZSBtZW1vcnkgbWlncmF0aW9uLCBlc3BlY2lhbGx5IGZvciBsYXJnZSBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zIGluIG1tL21pZ3JhdGUuYyBhbmQgbW0vcm1hcC5jLiBGdXp6aW5nIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgYmF0Y2hpbmcgbG9naWMgY29ycmVjdGx5IGhhbmRsZXMgUFRFcywgcGVybWlzc2lvbnMsIGFuZCBlZGdlIGNhc2VzIGxpa2UgZGV2aWNlIHByaXZhdGUgZm9saW9zIG9yIGh1Z2V0bGIgcGFnZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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:*0,} --------- Name: series-workflowdtxc9[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-12 12:53:48 +0000 UTC FinishedAt: 2026-07-12 13:13:14 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "61cccb8363fcc282d4ae0555b8739dd227f5ad0b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MIGRATION", "HUGETLB_PAGE", "TRANSPARENT_HUGEPAGE" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "61cccb8363fcc282d4ae0555b8739dd227f5ad0b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MIGRATION", "HUGETLB_PAGE", "TRANSPARENT_HUGEPAGE" ], "series_id": "f6ed0914-22d0-4ad7-be5e-be4ed8fb9961" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "migration_pte_batch", "remove_migration_pte", "remove_migration_pte_hugetlb", "remove_migration_ptes", "make_migration_swp_pte", "try_to_migrate_hugetlb_one", "folio_migrate_pte_batch", "try_to_migrate_one", "try_to_migrate" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEyIDEzOjEyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01JR1JBVElPTiYjMzQ7LAogICAgJiMzNDtIVUdFVExCX1BBR0UmIzM0OywKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttaWdyYXRpb25fcHRlX2JhdGNoJiMzNDssCiAgICAmIzM0O3JlbW92ZV9taWdyYXRpb25fcHRlJiMzNDssCiAgICAmIzM0O3JlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGImIzM0OywKICAgICYjMzQ7cmVtb3ZlX21pZ3JhdGlvbl9wdGVzJiMzNDssCiAgICAmIzM0O21ha2VfbWlncmF0aW9uX3N3cF9wdGUmIzM0OywKICAgICYjMzQ7dHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmUmIzM0OywKICAgICYjMzQ7Zm9saW9fbWlncmF0ZV9wdGVfYmF0Y2gmIzM0OywKICAgICYjMzQ7dHJ5X3RvX21pZ3JhdGVfb25lJiMzNDssCiAgICAmIzM0O3RyeV90b19taWdyYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYmF0Y2hpbmcgZm9yIG1pZ3JhdGlvbiBQVEVzIHRvIG9wdGltaXplIG1lbW9yeSBtaWdyYXRpb24sIGVzcGVjaWFsbHkgZm9yIGxhcmdlIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgaW4gbW0vbWlncmF0ZS5jIGFuZCBtbS9ybWFwLmMuIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBiYXRjaGluZyBsb2dpYyBjb3JyZWN0bHkgaGFuZGxlcyBQVEVzLCBwZXJtaXNzaW9ucywgYW5kIGVkZ2UgY2FzZXMgbGlrZSBkZXZpY2UgcHJpdmF0ZSBmb2xpb3Mgb3IgaHVnZXRsYiBwYWdlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGM2ZTJiZTFlMWE2MWJiZmE4MTFkNzVjMWQ3NzAyYTRkOThjNWU4ODVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIEp1bCAxMiAxMzoxMjoyMCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JtYXAuaCBiL2luY2x1ZGUvbGludXgvcm1hcC5oXG5pbmRleCA4ZGMwODcxZTVmMDAxMS4uNjQ5Mjk0OTBhN2NmY2EgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3JtYXAuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ybWFwLmhcbkBAIC03MDYsMTcgJiM0Mzs3MDYsMTggQEAgc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X2R1cF9hbm9uX3JtYXBfcG1kKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gfVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuLVx0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywgZW51bSBwZ3RhYmxlX2xldmVsIGxldmVsKVxuIHtcbiYjNDM7XHQvKiBkZXZpY2UgcHJpdmF0ZSBmb2xpb3MgY2Fubm90IGdldCBwaW5uZWQgdmlhIEdVUC4gKi9cbiYjNDM7XHRjb25zdCBib29sIHBpbm5hYmxlID0gbGlrZWx5KCFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpO1xuJiM0MztcbiBcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbiBcdFZNX1dBUk5fT05fRk9MSU8oIVBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpLCBmb2xpbyk7XG4gXHRfX2ZvbGlvX3JtYXBfc2FuaXR5X2NoZWNrcyhmb2xpbywgcGFnZSwgbnJfcGFnZXMsIGxldmVsKTtcbiBcbi1cdC8qIGRldmljZSBwcml2YXRlIGZvbGlvcyBjYW5ub3QgZ2V0IHBpbm5lZCB2aWEgR1VQLiAqL1xuLVx0aWYgKHVubGlrZWx5KGZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSkpIHtcbi1cdFx0Q2xlYXJQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbi1cdFx0cmV0dXJuIDA7XG4tXHR9XG4mIzQzO1x0LyogV2Ugb25seSBjbGVhciBhbm9uLWV4Y2x1c2l2ZSBmcm9tIGhlYWQgcGFnZSBvZiBQTUQgZm9saW8gKi9cbiYjNDM7XHRpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QTUQpXG4mIzQzO1x0XHRucl9wYWdlcyA9IDE7XG4gXG4gXHQvKlxuIFx0ICogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIHdlIGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlLCB0aGF0XG5AQCAtNzYwLDI5ICYjNDM7NzYxLDM4IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIFx0ICogc28gd2UgdXNlIGV4cGxpY2l0IG9uZXMgaGVyZS5cbiBcdCAqL1xuIFxuLVx0LyogUGFpcmVkIHdpdGggdGhlIG1lbW9yeSBiYXJyaWVyIGluIHRyeV9ncmFiX2ZvbGlvKCkuICovXG4tXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpXG4tXHRcdHNtcF9tYigpO1xuJiM0MztcdGlmIChwaW5uYWJsZSkge1xuJiM0MztcdFx0LyogUGFpcmVkIHdpdGggdGhlIG1lbW9yeSBiYXJyaWVyIGluIHRyeV9ncmFiX2ZvbGlvKCkuICovXG4mIzQzO1x0XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpXG4mIzQzO1x0XHRcdHNtcF9tYigpO1xuIFxuLVx0aWYgKHVubGlrZWx5KGZvbGlvX21heWJlX2RtYV9waW5uZWQoZm9saW8pKSlcbi1cdFx0cmV0dXJuIC1FQlVTWTtcbi1cdENsZWFyUGFnZUFub25FeGNsdXNpdmUocGFnZSk7XG4mIzQzO1x0XHRpZiAodW5saWtlbHkoZm9saW9fbWF5YmVfZG1hX3Bpbm5lZChmb2xpbykpKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Zm9yICg7Oykge1xuJiM0MztcdFx0Q2xlYXJQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbiYjNDM7XHRcdGlmICgtLW5yX3BhZ2VzID09IDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0cGFnZSYjNDM7JiM0Mzs7XG4mIzQzO1x0fVxuIFxuIFx0LypcbiBcdCAqIFRoaXMgaXMgY29uY2VwdHVhbGx5IGEgc21wX3dtYigpIHBhaXJlZCB3aXRoIHRoZSBzbXBfcm1iKCkgaW5cbiBcdCAqIGd1cF9tdXN0X3Vuc2hhcmUoKS5cbiBcdCAqL1xuLVx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKVxuJiM0MztcdGlmIChwaW5uYWJsZSBcdTAwMjZcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpXG4gXHRcdHNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4gLyoqXG4tICogZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUgLSB0cnkgbWFya2luZyBhbiBleGNsdXNpdmUgYW5vbnltb3VzIHBhZ2Vcbi0gKlx0XHRcdFx0ICAgbWFwcGVkIGJ5IGEgUFRFIHBvc3NpYmx5IHNoYXJlZCB0byBwcmVwYXJlXG4mIzQzOyAqIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyAtIHRyeSBtYXJraW5nIGV4Y2x1c2l2ZSBhbm9ueW1vdXMgcGFnZXNcbiYjNDM7ICpcdFx0XHRcdCAgIG1hcHBlZCBieSBQVEVzIHBvc3NpYmx5IHNoYXJlZCB0byBwcmVwYXJlXG4gICpcdFx0XHRcdCAgIGZvciBLU00gb3IgdGVtcG9yYXJ5IHVubWFwcGluZ1xuICAqIEBmb2xpbzpcdFRoZSBmb2xpbyB0byBzaGFyZSBhIG1hcHBpbmcgb2Zcbi0gKiBAcGFnZTpcdFRoZSBtYXBwZWQgZXhjbHVzaXZlIHBhZ2VcbiYjNDM7ICogQHBhZ2U6XHRUaGUgZmlyc3QgbWFwcGVkIGV4Y2x1c2l2ZSBwYWdlIG9mIHRoZSBiYXRjaCBpbiB0aGUgZm9saW9cbiYjNDM7ICogQG5yX3BhZ2VzOlx0VGhlIG51bWJlciBvZiBwYWdlcyB0byBzaGFyZSBpbiB0aGUgZm9saW8gKGJhdGNoIHNpemUpXG4gICpcbiAgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgdGhlIHBhZ2UgdGFibGUgbG9jayBhbmQgaGFzIHRvIGhhdmUgdGhlIHBhZ2UgdGFibGVcbiAgKiBlbnRyaWVzIGNsZWFyZWQvaW52YWxpZGF0ZWQuXG5AQCAtNzk3LDExICYjNDM7ODA3LDE5IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuICAqXG4gICogUmV0dXJucyAwIGlmIG1hcmtpbmcgdGhlIG1hcHBlZCBwYWdlIHBvc3NpYmx5IHNoYXJlZCBzdWNjZWVkZWQuIFJldHVybnNcbiAgKiAtRUJVU1kgb3RoZXJ3aXNlLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgdGhlIHBhZ2UgdGFibGUgbG9jay5cbiAgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8sIHBhZ2UsIG5yX3BhZ2VzLCBQR1RBQkxFX0xFVkVMX1BURSk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcbiBcdFx0c3RydWN0IHBhZ2UgKnBhZ2UpXG4ge1xuLVx0cmV0dXJuIF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChmb2xpbywgcGFnZSwgMSwgUEdUQUJMRV9MRVZFTF9QVEUpO1xuJiM0MztcdHJldHVybiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIDEpO1xuIH1cbiBcbiAvKipcbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggODc0YmU5NGNmMjU3MGUuLmE5MDcyMWY4YzY4NzdlIDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaFxuQEAgLTUwNSw2ICYjNDM7NTA1LDI2IEBAIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX25leHRfc3dwX29mZnNldChwdGVfdCBwdGUpXG4gXHRyZXR1cm4gcHRlX21vdmVfc3dwX29mZnNldChwdGUsIDEpO1xuIH1cbiBcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgc29mdGxlYWZfcHRlX2JhdGNoKHB0ZV90ICpzdGFydF9wdGVwLCBpbnQgbWF4X25yLCBwdGVfdCBwdGUpXG4mIzQzO3tcbiYjNDM7XHRwdGVfdCBleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHB0ZSk7XG4mIzQzO1x0Y29uc3QgcHRlX3QgKmVuZF9wdGVwID0gc3RhcnRfcHRlcCAmIzQzOyBtYXhfbnI7XG4mIzQzO1x0cHRlX3QgKnB0ZXAgPSBzdGFydF9wdGVwICYjNDM7IDE7XG4mIzQzO1xuJiM0MztcdFZNX1dBUk5fT04obWF4X25yIFx1MDAzYyAxKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHB0ZXAgXHUwMDNjIGVuZF9wdGVwKSB7XG4mIzQzO1x0XHRwdGUgPSBwdGVwX2dldChwdGVwKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIXB0ZV9zYW1lKHB0ZSwgZXhwZWN0ZWRfcHRlKSlcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KGV4cGVjdGVkX3B0ZSk7XG4mIzQzO1x0XHRwdGVwJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBwdGVwIC0gc3RhcnRfcHRlcDtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiBzd2FwX3B0ZV9iYXRjaCAtIGRldGVjdCBhIFBURSBiYXRjaCBmb3IgYSBzZXQgb2YgY29udGlndW91cyBzd2FwIGVudHJpZXNcbiAgKiBAc3RhcnRfcHRlcDogUGFnZSB0YWJsZSBwb2ludGVyIGZvciB0aGUgZmlyc3QgZW50cnkuXG5AQCAtNTIyLDIzICYjNDM7NTQyLDkgQEAgc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHB0ZV90IHB0ZSlcbiAgKi9cbiBzdGF0aWMgaW5saW5lIGludCBzd2FwX3B0ZV9iYXRjaChwdGVfdCAqc3RhcnRfcHRlcCwgaW50IG1heF9uciwgcHRlX3QgcHRlKVxuIHtcbi1cdHB0ZV90IGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlKTtcbi1cdGNvbnN0IHB0ZV90ICplbmRfcHRlcCA9IHN0YXJ0X3B0ZXAgJiM0MzsgbWF4X25yO1xuLVx0cHRlX3QgKnB0ZXAgPSBzdGFydF9wdGVwICYjNDM7IDE7XG4tXG4tXHRWTV9XQVJOX09OKG1heF9uciBcdTAwM2MgMSk7XG4gXHRWTV9XQVJOX09OKCFzb2Z0bGVhZl9pc19zd2FwKHNvZnRsZWFmX2Zyb21fcHRlKHB0ZSkpKTtcbiBcbi1cdHdoaWxlIChwdGVwIFx1MDAzYyBlbmRfcHRlcCkge1xuLVx0XHRwdGUgPSBwdGVwX2dldChwdGVwKTtcbi1cbi1cdFx0aWYgKCFwdGVfc2FtZShwdGUsIGV4cGVjdGVkX3B0ZSkpXG4tXHRcdFx0YnJlYWs7XG4tXHRcdGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQoZXhwZWN0ZWRfcHRlKTtcbi1cdFx0cHRlcCYjNDM7JiM0Mzs7XG4tXHR9XG4tXG4tXHRyZXR1cm4gcHRlcCAtIHN0YXJ0X3B0ZXA7XG4mIzQzO1x0cmV0dXJuIHNvZnRsZWFmX3B0ZV9iYXRjaChzdGFydF9wdGVwLCBtYXhfbnIsIHB0ZSk7XG4gfVxuICNlbmRpZiAvKiBDT05GSUdfTU1VICovXG4gXG5kaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jXG5pbmRleCAyMjJjOGMxNWY3ODJmNy4uNmQwNWQzZjQxMDk1ZDYgMTAwNjQ0XG4tLS0gYS9tbS9taWdyYXRlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21pZ3JhdGUuY1xuQEAgLTM0NSw2ICYjNDM7MzQ1LDExMSBAQCBzdHJ1Y3Qgcm1hcF93YWxrX2FyZyB7XG4gXHRib29sIG1hcF91bnVzZWRfdG9femVyb3BhZ2U7XG4gfTtcbiBcbiYjNDM7LypcbiYjNDM7ICogRGV0ZWN0IGEgYmF0Y2ggb2YgY29udGlndW91cyBtaWdyYXRpb24gZW50cmllczogY29uc2VjdXRpdmUgKG5vbi1wcmVzZW50KSBQVEVzXG4mIzQzOyAqIGNvbnRhaW5pbmcgbWlncmF0aW9uIGVudHJpZXMgd2l0aCBjb25zZWN1dGl2ZSBvZmZzZXRzIGFuZCBtYXRjaGluZyBwdGUgYml0cy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlncmF0aW9uX3B0ZV9iYXRjaChzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsXG4mIzQzO1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBwdGVfdCBmaXJzdF9wdGUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBwdm13LVx1MDAzZXZtYTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyID0gcG1kX2FkZHJfZW5kKHB2bXctXHUwMDNlYWRkcmVzcywgdm1hLVx1MDAzZXZtX2VuZCk7XG4mIzQzO1x0dW5zaWduZWQgaW50IGZvbGlvX25yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfbnI7XG4mIzQzO1xuJiM0MztcdFZNX1dBUk5fT04oIXNvZnRsZWFmX2lzX21pZ3JhdGlvbihzb2Z0bGVhZl9mcm9tX3B0ZShmaXJzdF9wdGUpKSk7XG4mIzQzO1xuJiM0MztcdC8qIEJvdW5kIGJ5IFZNQSAvIFBNRCBlbmQgYW5kIGJ5IHRoZSByZW1haW5pbmcgc3VicGFnZXMgb2YgdGhlIGZvbGlvLiAqL1xuJiM0MztcdG1heF9uciA9IG1pbigoZW5kX2FkZHIgLSBwdm13LVx1MDAzZWFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBmb2xpb19uciAtIHN0YXJ0X2lkeCk7XG4mIzQzO1x0aWYgKG1heF9uciBcdTAwM2M9IDEpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHNvZnRsZWFmX3B0ZV9iYXRjaChwdm13LVx1MDAzZXB0ZSwgbWF4X25yLCBmaXJzdF9wdGUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgcHRlX3QgbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqbmV3LFxuJiM0MztcdFx0c29mdGxlYWZfdCBlbnRyeSwgcHRlX3Qgb2xkX3B0ZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHRybWFwX3QgKnJtYXBfZmxhZ3MpXG4mIzQzO3tcbiYjNDM7XHRwdGVfdCBwdGUgPSBta19wdGUobmV3LCBSRUFEX09OQ0Uodm1hLVx1MDAzZXZtX3BhZ2VfcHJvdCkpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSkpXG4mIzQzO1x0XHRwdGUgPSBwdGVfbWtvbGQocHRlKTtcbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSkpXG4mIzQzO1x0XHRwdGUgPSBwdGVfbWtkaXJ0eShwdGUpO1xuJiM0MztcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkob2xkX3B0ZSkpXG4mIzQzO1x0XHRwdGUgPSBwdGVfbWtzb2Z0X2RpcnR5KHB0ZSk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0cHRlID0gcHRlX2NsZWFyX3NvZnRfZGlydHkocHRlKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNvZnRsZWFmX2lzX21pZ3JhdGlvbl93cml0ZShlbnRyeSkpXG4mIzQzO1x0XHRwdGUgPSBwdGVfbWt3cml0ZShwdGUsIHZtYSk7XG4mIzQzO1x0ZWxzZSBpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuJiM0MztcdFx0cHRlID0gcHRlX21rdWZmZChwdGUpO1xuJiM0MztcbiYjNDM7XHQvKiBTZWUgZG9fc3dhcF9wYWdlKCk6IHJlc3RvcmUgUEFHRV9OT05FIGZvciBSV1AgKi9cbiYjNDM7XHRpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpIFx1MDAyNlx1MDAyNiB1c2VyZmF1bHRmZF9yd3Aodm1hKSlcbiYjNDM7XHRcdHB0ZSA9IHB0ZV9tb2RpZnkocHRlLCBQQUdFX05PTkUpO1xuJiM0MztcbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkKGVudHJ5KSlcbiYjNDM7XHRcdCpybWFwX2ZsYWdzIHw9IFJNQVBfRVhDTFVTSVZFO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcHRlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXN0b3JlIGEgcG90ZW50aWFsIG1pZ3JhdGlvbiBwdGUgdG8gYSB3b3JraW5nIHB0ZSBlbnRyeSBmb3IgaHVnZXRsYiBmb2xpb3MuXG4mIzQzOyAqL1xuJiM0MzsjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRVxuJiM0MztzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4mIzQzO1x0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgcm1hcF93YWxrX2FyZyAqcm1hcF93YWxrX2FyZyA9IGFyZztcbiYjNDM7XHRERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgcm1hcF93YWxrX2FyZy1cdTAwM2Vmb2xpbywgdm1hLCBhZGRyLCBQVk1XX1NZTkMgfCBQVk1XX01JR1JBVElPTik7XG4mIzQzO1x0c3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaCk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwc2l6ZSA9IGh1Z2VfcGFnZV9zaXplKGgpO1xuJiM0MztcbiYjNDM7XHRpZiAocGFnZV92bWFfbWFwcGVkX3dhbGsoXHUwMDI2cHZtdykpIHtcbiYjNDM7XHRcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xuJiM0MztcdFx0c3RydWN0IHBhZ2UgKm5ldyA9IGZvbGlvX3BhZ2UoZm9saW8sIDApO1xuJiM0MztcdFx0cHRlX3Qgb2xkX3B0ZSwgcHRlO1xuJiM0MztcdFx0c29mdGxlYWZfdCBlbnRyeTtcbiYjNDM7XG4mIzQzO1x0XHRvbGRfcHRlID0gaHVnZV9wdGVwX2dldCh2bWEtXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUpO1xuJiM0MztcdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3B0ZShvbGRfcHRlKTtcbiYjNDM7XG4mIzQzO1x0XHRmb2xpb19nZXQoZm9saW8pO1xuJiM0MztcdFx0cHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgdm1hLCBcdTAwMjZybWFwX2ZsYWdzKTtcbiYjNDM7XHRcdHB0ZSA9IGFyY2hfbWFrZV9odWdlX3B0ZShwdGUsIHNoaWZ0LCB2bWEtXHUwMDNldm1fZmxhZ3MpO1xuJiM0MztcdFx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4mIzQzO1x0XHRcdGh1Z2V0bGJfYWRkX2Fub25fcm1hcChmb2xpbywgdm1hLCBwdm13LmFkZHJlc3MsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBybWFwX2ZsYWdzKTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0aHVnZXRsYl9hZGRfZmlsZV9ybWFwKGZvbGlvKTtcbiYjNDM7XHRcdHNldF9odWdlX3B0ZV9hdCh2bWEtXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIHB0ZSwgcHNpemUpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSRUFEX09OQ0Uodm1hLVx1MDAzZXZtX2ZsYWdzKSBcdTAwMjYgVk1fTE9DS0VEKVxuJiM0MztcdFx0XHRtbG9ja19kcmFpbl9sb2NhbCgpO1xuJiM0MztcbiYjNDM7XHRcdHRyYWNlX3JlbW92ZV9taWdyYXRpb25fcHRlKHB2bXcuYWRkcmVzcywgcHRlX3ZhbChwdGUpLFxuJiM0MztcdFx0XHRcdFx0ICAgY29tcG91bmRfb3JkZXIobmV3KSk7XG4mIzQzO1xuJiM0MztcdFx0LyogTm8gbmVlZCB0byBpbnZhbGlkYXRlIC0gaXQgd2FzIG5vbi1wcmVzZW50IGJlZm9yZSAqL1xuJiM0MztcdFx0dXBkYXRlX21tdV9jYWNoZSh2bWEsIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7I2Vsc2VcbiYjNDM7c3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYihzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuJiM0MztcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZiAvKiBDT05GSUdfSFVHRVRMQl9QQUdFICovXG4mIzQzO1xuIC8qXG4gICogUmVzdG9yZSBhIHBvdGVudGlhbCBtaWdyYXRpb24gcHRlIHRvIGEgd29ya2luZyBwdGUgZW50cnlcbiAgKi9cbkBAIC0zNTIsNiAmIzQzOzQ1Nyw3IEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZylcbiB7XG4gXHRzdHJ1Y3Qgcm1hcF93YWxrX2FyZyAqcm1hcF93YWxrX2FyZyA9IGFyZztcbiYjNDM7XHRib29sIGlzX2RldnByaXYgPSBmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbyk7XG4gXHRERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgcm1hcF93YWxrX2FyZy1cdTAwM2Vmb2xpbywgdm1hLCBhZGRyLCBQVk1XX1NZTkMgfCBQVk1XX01JR1JBVElPTik7XG4gXG4gXHR3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoXHUwMDI2cHZtdykpIHtcbkBAIC0zNjEsNTYgJiM0Mzs0NjcsNDAgQEAgc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcbiBcdFx0c29mdGxlYWZfdCBlbnRyeTtcbiBcdFx0c3RydWN0IHBhZ2UgKm5ldztcbiBcdFx0dW5zaWduZWQgbG9uZyBpZHggPSAwO1xuJiM0MztcdFx0dW5zaWduZWQgaW50IG5yID0gMTtcbiBcbiBcdFx0LyogcGdvZmYgaXMgaW52YWxpZCBmb3Iga3NtIHBhZ2VzLCBidXQgdGhleSBhcmUgbmV2ZXIgbGFyZ2UgKi9cbi1cdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbiYjNDM7XHRcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSlcbiBcdFx0XHRpZHggPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIHB2bXcuYWRkcmVzcykgLSBwdm13LnBnb2ZmO1xuIFx0XHRuZXcgPSBmb2xpb19wYWdlKGZvbGlvLCBpZHgpO1xuIFxuICNpZmRlZiBDT05GSUdfQVJDSF9IQVNfUE1EX1NPRlRMRUFWRVNcbiBcdFx0LyogUE1ELW1hcHBlZCBUSFAgbWlncmF0aW9uIGVudHJ5ICovXG4gXHRcdGlmICghcHZtdy5wdGUpIHtcbi1cdFx0XHRWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSB8fFxuLVx0XHRcdFx0XHQhZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7XG4mIzQzO1x0XHRcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7XG4gXHRcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wbWQoXHUwMDI2cHZtdywgbmV3KTtcbiBcdFx0XHRjb250aW51ZTtcbiBcdFx0fVxuICNlbmRpZlxuLVx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbi1cdFx0XHRvbGRfcHRlID0gaHVnZV9wdGVwX2dldCh2bWEtXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcyxcbi1cdFx0XHRcdFx0XHRwdm13LnB0ZSk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRvbGRfcHRlID0gcHRlcF9nZXQocHZtdy5wdGUpO1xuJiM0MztcdFx0b2xkX3B0ZSA9IHB0ZXBfZ2V0KHB2bXcucHRlKTtcbiBcdFx0aWYgKHJtYXBfd2Fsa19hcmctXHUwMDNlbWFwX3VudXNlZF90b196ZXJvcGFnZSBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgIHRyeV90b19tYXBfdW51c2VkX3RvX3plcm9wYWdlKFx1MDAyNnB2bXcsIGZvbGlvLCBvbGRfcHRlLCBpZHgpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb19nZXQoZm9saW8pO1xuLVx0XHRwdGUgPSBta19wdGUobmV3LCBSRUFEX09OQ0Uodm1hLVx1MDAzZXZtX3BhZ2VfcHJvdCkpO1xuLVxuIFx0XHRlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKG9sZF9wdGUpO1xuLVx0XHRpZiAoIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSkpXG4tXHRcdFx0cHRlID0gcHRlX21rb2xkKHB0ZSk7XG4tXHRcdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KSlcbi1cdFx0XHRwdGUgPSBwdGVfbWtkaXJ0eShwdGUpO1xuLVx0XHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KG9sZF9wdGUpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3NvZnRfZGlydHkocHRlKTtcbi1cdFx0ZWxzZVxuLVx0XHRcdHB0ZSA9IHB0ZV9jbGVhcl9zb2Z0X2RpcnR5KHB0ZSk7XG4gXG4tXHRcdGlmIChzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3dyaXRlKHB0ZSwgdm1hKTtcbi1cdFx0ZWxzZSBpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3VmZmQocHRlKTtcbi1cbi1cdFx0LyogU2VlIGRvX3N3YXBfcGFnZSgpOiByZXN0b3JlIFBBR0VfTk9ORSBmb3IgUldQICovXG4tXHRcdGlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkgXHUwMDI2XHUwMDI2IHVzZXJmYXVsdGZkX3J3cCh2bWEpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9tb2RpZnkocHRlLCBQQUdFX05PTkUpO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFRyeSB0byByZXN0b3JlIG5yXHUwMDNlMSBjb250aWd1b3VzIFBURXMgaW4gb25lIHNob3QuIEZhbGxzIGJhY2tcbiYjNDM7XHRcdCAqIHRvIG9yaWdpbmFsIHBlci1QVEUgcGF0aCAobnI9MSkgaWYgYmF0Y2hpbmcgaXMgbm90IHBvc3NpYmxlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIXJtYXBfd2Fsa19hcmctXHUwMDNlbWFwX3VudXNlZF90b196ZXJvcGFnZSBcdTAwMjZcdTAwMjYgbGlrZWx5KCFpc19kZXZwcml2KSlcbiYjNDM7XHRcdFx0bnIgPSBtaWdyYXRpb25fcHRlX2JhdGNoKFx1MDAyNnB2bXcsIGZvbGlvLCBvbGRfcHRlLCBpZHgpO1xuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkKGVudHJ5KSlcbi1cdFx0XHRybWFwX2ZsYWdzIHw9IFJNQVBfRVhDTFVTSVZFO1xuJiM0MztcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgbnIpO1xuJiM0MztcdFx0cHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgdm1hLCBcdTAwMjZybWFwX2ZsYWdzKTtcbiBcbi1cdFx0aWYgKHVubGlrZWx5KGlzX2RldmljZV9wcml2YXRlX3BhZ2UobmV3KSkpIHtcbiYjNDM7XHRcdGlmICh1bmxpa2VseShpc19kZXZwcml2KSkge1xuIFx0XHRcdGlmIChwdGVfd3JpdGUocHRlKSlcbiBcdFx0XHRcdGVudHJ5ID0gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShcbiBcdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKG5ldykpO1xuQEAgLTQyNCwzMCAmIzQzOzUxNCwxMiBAQCBzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuIFx0XHRcdFx0cHRlID0gcHRlX3N3cF9ta3VmZmQocHRlKTtcbiBcdFx0fVxuIFxuLSNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFXG4tXHRcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XG4tXHRcdFx0c3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTtcbi1cdFx0XHR1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaCk7XG4tXHRcdFx0dW5zaWduZWQgbG9uZyBwc2l6ZSA9IGh1Z2VfcGFnZV9zaXplKGgpO1xuLVxuLVx0XHRcdHB0ZSA9IGFyY2hfbWFrZV9odWdlX3B0ZShwdGUsIHNoaWZ0LCB2bWEtXHUwMDNldm1fZmxhZ3MpO1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuLVx0XHRcdFx0aHVnZXRsYl9hZGRfYW5vbl9ybWFwKGZvbGlvLCB2bWEsIHB2bXcuYWRkcmVzcyxcbi1cdFx0XHRcdFx0XHQgICAgICBybWFwX2ZsYWdzKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRodWdldGxiX2FkZF9maWxlX3JtYXAoZm9saW8pO1xuLVx0XHRcdHNldF9odWdlX3B0ZV9hdCh2bWEtXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIHB0ZSxcbi1cdFx0XHRcdFx0cHNpemUpO1xuLVx0XHR9IGVsc2Vcbi0jZW5kaWZcbi1cdFx0e1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKVxuLVx0XHRcdFx0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGUoZm9saW8sIG5ldywgdm1hLFxuLVx0XHRcdFx0XHRcdFx0cHZtdy5hZGRyZXNzLCBybWFwX2ZsYWdzKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRmb2xpb19hZGRfZmlsZV9ybWFwX3B0ZShmb2xpbywgbmV3LCB2bWEpO1xuLVx0XHRcdHNldF9wdGVfYXQodm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUpO1xuLVx0XHR9XG4mIzQzO1x0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbiYjNDM7XHRcdFx0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKGZvbGlvLCBuZXcsIG5yLCB2bWEsXG4mIzQzO1x0XHRcdFx0XHRcdCBwdm13LmFkZHJlc3MsIHJtYXBfZmxhZ3MpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRmb2xpb19hZGRfZmlsZV9ybWFwX3B0ZXMoZm9saW8sIG5ldywgbnIsIHZtYSk7XG4mIzQzO1x0XHRzZXRfcHRlcyh2bWEtXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIHB0ZSwgbnIpO1xuIFx0XHRpZiAoUkVBRF9PTkNFKHZtYS1cdTAwM2V2bV9mbGFncykgXHUwMDI2IFZNX0xPQ0tFRClcbiBcdFx0XHRtbG9ja19kcmFpbl9sb2NhbCgpO1xuIFxuQEAgLTQ1NSw3ICYjNDM7NTI3LDExIEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdFx0XHRcdCAgIGNvbXBvdW5kX29yZGVyKG5ldykpO1xuIFxuIFx0XHQvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovXG4tXHRcdHVwZGF0ZV9tbXVfY2FjaGUodm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTtcbiYjNDM7XHRcdHVwZGF0ZV9tbXVfY2FjaGVfcmFuZ2UoTlVMTCwgdm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBucik7XG4mIzQzO1xuJiM0MztcdFx0LyogU2tpcCB0aGUgYmF0Y2hlZCBQVEVzICovXG4mIzQzO1x0XHRwdm13LnB0ZSAmIzQzOz0gbnIgLSAxO1xuJiM0MztcdFx0cHZtdy5hZGRyZXNzICYjNDM7PSAobnIgLSAxKSAqIFBBR0VfU0laRTtcbiBcdH1cbiBcbiBcdHJldHVybiB0cnVlO1xuQEAgLTQ3NCw3ICYjNDM7NTUwLDkgQEAgdm9pZCByZW1vdmVfbWlncmF0aW9uX3B0ZXMoc3RydWN0IGZvbGlvICpzcmMsIHN0cnVjdCBmb2xpbyAqZHN0LFxuIFx0fTtcbiBcbiBcdHN0cnVjdCBybWFwX3dhbGtfY29udHJvbCByd2MgPSB7XG4tXHRcdC5ybWFwX29uZSA9IHJlbW92ZV9taWdyYXRpb25fcHRlLFxuJiM0MztcdFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKHNyYykgP1xuJiM0MztcdFx0XHRcdHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGIgOlxuJiM0MztcdFx0XHRcdHJlbW92ZV9taWdyYXRpb25fcHRlLFxuIFx0XHQuYXJnID0gXHUwMDI2cm1hcF93YWxrX2FyZyxcbiBcdH07XG4gXG5kaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jXG5pbmRleCBlODU0Njc5NTUzYjljMy4uY2ZhYzg1ZjZmNjhhNjggMTAwNjQ0XG4tLS0gYS9tbS9ybWFwLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL3JtYXAuY1xuQEAgLTI0MDUsNiAmIzQzOzI0MDUsMjI5IEBAIHZvaWQgdHJ5X3RvX3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIGVudW0gdHR1X2ZsYWdzIGZsYWdzKVxuIFx0XHRybWFwX3dhbGsoZm9saW8sIFx1MDAyNnJ3Yyk7XG4gfVxuIFxuJiM0MzsvKiBCdWlsZCB0aGUgbWlncmF0aW9uIHN3YXAgUFRFIHRoYXQgcmVwbGFjZXMgcHRldmFsIGZvciBhIHBhZ2UuICovXG4mIzQzO3N0YXRpYyBwdGVfdCBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKHN0cnVjdCBwYWdlICpwYWdlLCBwdGVfdCBwdGV2YWwsXG4mIzQzO1x0XHRib29sIHdyaXRhYmxlLCBib29sIGFub25fZXhjbHVzaXZlKVxuJiM0Mzt7XG4mIzQzO1x0c3dwX2VudHJ5X3QgZW50cnk7XG4mIzQzO1x0cHRlX3Qgc3dwX3B0ZTtcbiYjNDM7XG4mIzQzO1x0aWYgKHdyaXRhYmxlKVxuJiM0MztcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwYWdlX3RvX3BmbihwYWdlKSk7XG4mIzQzO1x0ZWxzZSBpZiAoYW5vbl9leGNsdXNpdmUpXG4mIzQzO1x0XHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfZXhjbHVzaXZlX21pZ3JhdGlvbl9lbnRyeShcbiYjNDM7XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSkpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9taWdyYXRpb25fZW50cnkocGFnZV90b19wZm4ocGFnZSkpO1xuJiM0MztcbiYjNDM7XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4mIzQzO1x0XHRpZiAocHRlX3lvdW5nKHB0ZXZhbCkpXG4mIzQzO1x0XHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoZW50cnkpO1xuJiM0MztcdFx0aWYgKHB0ZV9kaXJ0eShwdGV2YWwpKVxuJiM0MztcdFx0XHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTtcbiYjNDM7XHRcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbiYjNDM7XHRcdGlmIChwdGVfc29mdF9kaXJ0eShwdGV2YWwpKVxuJiM0MztcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4mIzQzO1x0XHRpZiAocHRlX3VmZmQocHRldmFsKSlcbiYjNDM7XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzd3BfcHRlID0gc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSk7XG4mIzQzO1x0XHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KHB0ZXZhbCkpXG4mIzQzO1x0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcbiYjNDM7XHRcdGlmIChwdGVfc3dwX3VmZmQocHRldmFsKSlcbiYjNDM7XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHN3cF9wdGU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFJlcGxhY2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBtYXBwaW5nIGZvciBmb2xpbyB3aXRoIG1pZ3JhdGlvbiBlbnRyaWVzLlxuJiM0MzsgKlxuJiM0MzsgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmUoc3RydWN0IGZvbGlvICpmb2xpbyxcbiYjNDM7XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgaHN6ID0gaHVnZV9wYWdlX3NpemUoaHN0YXRlX3ZtYSh2bWEpKTtcbiYjNDM7XHRERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgZm9saW8sIHZtYSwgYWRkcmVzcywgMCk7XG4mIzQzO1x0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuJiM0MztcdGJvb2wgYW5vbl9leGNsdXNpdmUsIHdyaXRhYmxlLCByZXQgPSB0cnVlO1xuJiM0MztcdGJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4mIzQzO1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4mIzQzO1x0c3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHBmbjtcbiYjNDM7XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiYjNDM7XHRwdGVfdCBwdGV2YWw7XG4mIzQzO1xuJiM0MztcdHJhbmdlLmVuZCA9IHZtYV9hZGRyZXNzX2VuZChcdTAwMjZwdm13KTtcbiYjNDM7XHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVx1MDAzZXZtX21tLFxuJiM0MztcdFx0XHRcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XG4mIzQzO1x0LyogSWYgc2hhcmluZyBpcyBwb3NzaWJsZSwgc3RhcnQgYW5kIGVuZCB3aWxsIGJlIGFkanVzdGVkIGFjY29yZGluZ2x5LiAqL1xuJiM0MztcdGFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsIFx1MDAyNnJhbmdlLnN0YXJ0LCBcdTAwMjZyYW5nZS5lbmQpO1xuJiM0MztcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFx1MDAyNnJhbmdlKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKSB7XG4mIzQzO1x0XHRhZGRyZXNzID0gcHZtdy5hZGRyZXNzO1xuJiM0MztcdFx0cHRldmFsID0gaHVnZV9wdGVwX2dldChtbSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuJiM0MztcdFx0aWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSlcbiYjNDM7XHRcdFx0cGZuID0gcHRlX3BmbihwdGV2YWwpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oc29mdGxlYWZfZnJvbV9wdGUocHRldmFsKSk7XG4mIzQzO1xuJiM0MztcdFx0cGFnZSA9IGZvbGlvX3BhZ2UoZm9saW8sIHBmbiAtIGZvbGlvX3Bmbihmb2xpbykpO1xuJiM0MztcdFx0YW5vbl9leGNsdXNpdmUgPSBhbm9uIFx1MDAyNlx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogaHVnZV9wbWRfdW5zaGFyZSBtYXkgdW5tYXAgYW4gZW50aXJlIFBNRCBwYWdlLiBUaGVyZSBpcyBub1xuJiM0MztcdFx0ICogd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heSBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sXG4mIzQzO1x0XHQgKiBzbyB3ZSBtdXN0IGZsdXNoIHRoZW0gYWxsLiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkXG4mIzQzO1x0XHQgKiBhYm92ZSB0byBjb3ZlciB0aGlzIHJhbmdlLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUbyBjYWxsIGh1Z2VfcG1kX3Vuc2hhcmUsIGlfbW1hcF9yd3NlbSBtdXN0IGJlIGhlbGQgaW4gd3JpdGVcbiYjNDM7XHRcdCAqIG1vZGUuIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5IGRvIHRoaXMgb3V0c2lkZSBybWFwXG4mIzQzO1x0XHQgKiByb3V0aW5lcy4gV2UgYWxzbyBtdXN0IGhvbGQgaHVnZXRsYiB2bWFfbG9jayBpbiB3cml0ZSBtb2RlLlxuJiM0MztcdFx0ICogTG9jayBvcmRlciBkaWN0YXRlcyBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFIGlfbW1hcF9yd3NlbS5cbiYjNDM7XHRcdCAqIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kIGZhaWwgaWYgdW5zdWNjZXNzZnVsLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIWFub24pIHtcbiYjNDM7XHRcdFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xuJiM0MztcbiYjNDM7XHRcdFx0Vk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgXHUwMDI2IFRUVV9STUFQX0xPQ0tFRCkpO1xuJiM0MztcdFx0XHRpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSkge1xuJiM0MztcdFx0XHRcdHJldCA9IGZhbHNlO1xuJiM0MztcdFx0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHR0bGJfZ2F0aGVyX21tdV92bWEoXHUwMDI2dGxiLCB2bWEpO1xuJiM0MztcdFx0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4mIzQzO1x0XHRcdFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XG4mIzQzO1x0XHRcdFx0aHVnZV9wbWRfdW5zaGFyZV9mbHVzaChcdTAwMjZ0bGIsIHZtYSk7XG4mIzQzO1x0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbiYjNDM7XHRcdFx0XHQvKlxuJiM0MztcdFx0XHRcdCAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLFxuJiM0MztcdFx0XHRcdCAqIGNvbnNlcXVlbnRseSB1bm1hcHBpbmcgdGhlIGZvbGlvLlxuJiM0MztcdFx0XHRcdCAqL1xuJiM0MztcdFx0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuJiM0MztcdFx0XHR0bGJfZmluaXNoX21tdShcdTAwMjZ0bGIpO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIE51a2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBlbnRyeSAqL1xuJiM0MztcdFx0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuJiM0MztcdFx0aWYgKGh1Z2VfcHRlX2RpcnR5KHB0ZXZhbCkpXG4mIzQzO1x0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuJiM0MztcdFx0d3JpdGFibGUgPSBwdGVfd3JpdGUocHRldmFsKTtcbiYjNDM7XG4mIzQzO1x0XHRWTV9XQVJOX09OX0ZPTElPKHdyaXRhYmxlIFx1MDAyNlx1MDAyNiBhbm9uIFx1MDAyNlx1MDAyNiAhYW5vbl9leGNsdXNpdmUsIGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoUGFnZUhXUG9pc29uKHBhZ2UpKSB7XG4mIzQzO1x0XHRcdHB0ZXZhbCA9IHN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShwYWdlKSk7XG4mIzQzO1x0XHRcdGh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pO1xuJiM0MztcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIGhzeik7XG4mIzQzO1x0XHR9IGVsc2UgaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSBcdTAwMjZcdTAwMjYgcHRlX3VudXNlZChwdGV2YWwpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBUaGUgZ3Vlc3QgaW5kaWNhdGVkIHRoYXQgdGhlIHBhZ2UgY29udGVudCBpcyBvZiBub1xuJiM0MztcdFx0XHQgKiBpbnRlcmVzdCBhbnltb3JlLiBTaW1wbHkgZGlzY2FyZCB0aGUgcHRlLCB2bXNjYW5cbiYjNDM7XHRcdFx0ICogd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHJlc3QuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0cHRlX3Qgc3dwX3B0ZTtcbiYjNDM7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cbiYjNDM7XHRcdFx0ICogYXJjaGl0ZWN0dXJlcyB3aGVyZSB3ZSBjb3VsZCBoYXZlIFBGTiBzd2FwIFBURXMsXG4mIzQzO1x0XHRcdCAqIHNvIHdlJiMzOTtsbCBub3QgY2hlY2svY2FyZS5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdGlmIChhcmNoX3VubWFwX29uZShtbSwgdm1hLCBhZGRyZXNzLCBwdGV2YWwpIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcbiYjNDM7XHRcdFx0XHRcdFx0cHRldmFsLCBoc3opO1xuJiM0MztcdFx0XHRcdHJldCA9IGZhbHNlO1xuJiM0MztcdFx0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHQvKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xuJiM0MztcdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRcdCAgICBodWdldGxiX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8pKSB7XG4mIzQzO1x0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcbiYjNDM7XHRcdFx0XHRcdFx0cHRldmFsLCBoc3opO1xuJiM0MztcdFx0XHRcdHJldCA9IGZhbHNlO1xuJiM0MztcdFx0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBTdG9yZSB0aGUgcGZuIG9mIHRoZSBwYWdlIGluIGEgc3BlY2lhbCBtaWdyYXRpb25cbiYjNDM7XHRcdFx0ICogcHRlLiBkb19zd2FwX3BhZ2UoKSB3aWxsIHdhaXQgdW50aWwgdGhlIG1pZ3JhdGlvblxuJiM0MztcdFx0XHQgKiBwdGUgaXMgcmVtb3ZlZCBhbmQgdGhlbiByZXN0YXJ0IGZhdWx0IGhhbmRsaW5nLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0c3dwX3B0ZSA9IG1ha2VfbWlncmF0aW9uX3N3cF9wdGUocGFnZSwgcHRldmFsLFxuJiM0MztcdFx0XHRcdFx0XHRcdCB3cml0YWJsZSwgYW5vbl9leGNsdXNpdmUpO1xuJiM0MztcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlLCBoc3opO1xuJiM0MztcdFx0XHR0cmFjZV9zZXRfbWlncmF0aW9uX3B0ZShhZGRyZXNzLCBwdGVfdmFsKHN3cF9wdGUpLFxuJiM0MztcdFx0XHRcdFx0XHRmb2xpb19vcmRlcihmb2xpbykpO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pO1xuJiM0MztcdFx0aWYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fTE9DS0VEKVxuJiM0MztcdFx0XHRtbG9ja19kcmFpbl9sb2NhbCgpO1xuJiM0MztcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiYjNDM7d2Fsa19kb25lOlxuJiM0MztcdFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcdTAwMjZwdm13KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChcdTAwMjZyYW5nZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsIHB0ZV90IHB0ZSxcbiYjNDM7XHRcdHN0cnVjdCBwYWdlICpzdWJwYWdlLCBib29sIGFub25fZXhjbHVzaXZlKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbmRfYWRkciwgYWRkciA9IHB2bXctXHUwMDNlYWRkcmVzcztcbiYjNDM7XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IHB2bXctXHUwMDNldm1hO1xuJiM0MztcdHVuc2lnbmVkIGludCBtYXhfbnIsIG5yLCBpO1xuJiM0MztcbiYjNDM7I2lmZGVmIF9fSEFWRV9BUkNIX1VOTUFQX09ORVxuJiM0MztcdC8qIENhbm5vdCBiYXRjaCB1bm1hcCBpZiBhcmNoX3VubWFwX29uZSgpIGlzIGRlZmluZWQuICovXG4mIzQzO1x0cmV0dXJuIDE7XG4mIzQzOyNlbmRpZlxuJiM0MztcbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuJiM0MztcdFx0cmV0dXJuIDE7XG4mIzQzO1x0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fCBmb2xpb190ZXN0X2hhc19od3BvaXNvbmVkKGZvbGlvKSlcbiYjNDM7XHRcdHJldHVybiAxO1xuJiM0MztcdGlmIChwdGVfdW51c2VkKHB0ZSkpXG4mIzQzO1x0XHRyZXR1cm4gMTtcbiYjNDM7XG4mIzQzO1x0LyogV2UgbWF5IG9ubHkgYmF0Y2ggd2l0aGluIGEgc2luZ2xlIFZNQSBhbmQgYSBzaW5nbGUgcGFnZSB0YWJsZS4gKi9cbiYjNDM7XHRlbmRfYWRkciA9IHBtZF9hZGRyX2VuZChhZGRyLCB2bWEtXHUwMDNldm1fZW5kKTtcbiYjNDM7XHRtYXhfbnIgPSAoZW5kX2FkZHIgLSBhZGRyKSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHVubWFwIGZhaWxzLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHB0ZXMuIFRvIGF2b2lkIGFjY2lkZW50YWxseVxuJiM0MztcdCAqIHVwZ3JhZGluZyB3cml0ZSBwZXJtaXNzaW9ucyBmb3IgcHRlcyB0aGF0IHdlcmUgbm90IG9yaWdpbmFsbHkgd3JpdGFibGUsXG4mIzQzO1x0ICogYW5kIHRvIGF2b2lkIGxvc2luZyB0aGUgc29mdC1kaXJ0eSBiaXQsIHVzZSB0aGUgYXBwcm9wcmlhdGUgRlBCIGZsYWdzLlxuJiM0MztcdCAqL1xuJiM0MztcdG5yID0gZm9saW9fcHRlX2JhdGNoX2ZsYWdzKGZvbGlvLCB2bWEsIHB2bXctXHUwMDNlcHRlLCBcdTAwMjZwdGUsIG1heF9ucixcbiYjNDM7XHRcdFx0XHQgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9SRVNQRUNUX1NPRlRfRElSVFkpO1xuJiM0MztcbiYjNDM7XHQvKiBMaW1pdCBwb3NzaWJsZSBiYXRjaCBjb3VudCB0byBhIHVuaWZvcm0gUGFnZUFub25FeGNsdXNpdmUgdmFsdWUgKi9cbiYjNDM7XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuJiM0MztcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnI7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpZiAoUGFnZUFub25FeGNsdXNpdmUoc3VicGFnZSAmIzQzOyBpKSAhPSBhbm9uX2V4Y2x1c2l2ZSlcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdG5yID0gaTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBucjtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIEBhcmc6IGVudW0gdHR1X2ZsYWdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgYXJndW1lbnQuXG4gICpcbkBAIC0yNDIxLDggJiM0MzsyNjQ0LDcgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2U7XG4gXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xuIFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuLVx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm4sIGVuZF9hZGRyLCBucl9wYWdlcztcbiBcbiBcdC8qXG4gXHQgKiBXaGVuIHJhY2luZyBhZ2FpbnN0IGUuZy4gemFwX3B0ZV9yYW5nZSgpIG9uIGFub3RoZXIgY3B1LFxuQEAgLTI0MzUsMjYgJiM0MzsyNjU3LDEzIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcbiBcdC8qXG4gXHQgKiBGb3IgVEhQLCB3ZSBoYXZlIHRvIGFzc3VtZSB0aGUgd29yc2UgY2FzZSBpZSBwbWQgZm9yIGludmFsaWRhdGlvbi5cbi1cdCAqIEZvciBodWdldGxiLCBpdCBjb3VsZCBiZSBtdWNoIHdvcnNlIGlmIHdlIG5lZWQgdG8gZG8gcHVkXG4tXHQgKiBpbnZhbGlkYXRpb24gaW4gdGhlIGNhc2Ugb2YgcG1kIHNoYXJpbmcuXG4gXHQgKlxuIFx0ICogTm90ZSB0aGF0IHRoZSBwYWdlIGNhbiBub3QgYmUgZnJlZSBpbiB0aGlzIGZ1bmN0aW9uIGFzIGNhbGwgb2Zcbi1cdCAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS5cbiYjNDM7XHQgKiB0cnlfdG9fbWlncmF0ZSgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS5cbiBcdCAqL1xuIFx0cmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKFx1MDAyNnB2bXcpO1xuIFx0bW11X25vdGlmaWVyX3JhbmdlX2luaXQoXHUwMDI2cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS1cdTAwM2V2bV9tbSxcbiBcdFx0XHRcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XG4tXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBJZiBzaGFyaW5nIGlzIHBvc3NpYmxlLCBzdGFydCBhbmQgZW5kIHdpbGwgYmUgYWRqdXN0ZWRcbi1cdFx0ICogYWNjb3JkaW5nbHkuXG4tXHRcdCAqL1xuLVx0XHRhZGp1c3RfcmFuZ2VfaWZfcG1kX3NoYXJpbmdfcG9zc2libGUodm1hLCBcdTAwMjZyYW5nZS5zdGFydCxcbi1cdFx0XHRcdFx0XHQgICAgIFx1MDAyNnJhbmdlLmVuZCk7XG4tXG4tXHRcdC8qIFdlIG5lZWQgdGhlIGh1Z2UgcGFnZSBzaXplIGZvciBzZXRfaHVnZV9wdGVfYXQoKSAqL1xuLVx0XHRoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xuLVx0fVxuIFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoXHUwMDI2cmFuZ2UpO1xuIFxuIFx0d2hpbGUgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKSB7XG5AQCAtMjQ4OCwxMSAmIzQzOzI2OTcsOCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0Vk1fQlVHX09OX0ZPTElPKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgfHxcbiBcdFx0XHRcdFx0IWZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSwgZm9saW8pO1xuIFxuLVx0XHRcdGlmIChzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeShcdTAwMjZwdm13LCBzdWJwYWdlKSkge1xuLVx0XHRcdFx0cmV0ID0gZmFsc2U7XG4tXHRcdFx0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuLVx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0fVxuJiM0MztcdFx0XHRpZiAoc2V0X3BtZF9taWdyYXRpb25fZW50cnkoXHUwMDI2cHZtdywgc3VicGFnZSkpXG4mIzQzO1x0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuIFx0XHRcdGNvbnRpbnVlO1xuICNlbmRpZlxuIFx0XHR9XG5AQCAtMjUwMSwxMCAmIzQzOzI3MDcsNyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFZNX0JVR19PTl9GT0xJTyghcHZtdy5wdGUsIGZvbGlvKTtcbiBcbiBcdFx0YWRkcmVzcyA9IHB2bXcuYWRkcmVzcztcbi1cdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpXG4tXHRcdFx0cHRldmFsID0gaHVnZV9wdGVwX2dldChtbSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuLVx0XHRlbHNlXG4tXHRcdFx0cHRldmFsID0gcHRlcF9nZXQocHZtdy5wdGUpO1xuJiM0MztcdFx0cHRldmFsID0gcHRlcF9nZXQocHZtdy5wdGUpO1xuIFx0XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4gXHRcdFx0cGZuID0gcHRlX3BmbihwdGV2YWwpO1xuIFx0XHR9IGVsc2Uge1xuQEAgLTI1MTUsNjggJiM0MzsyNzE4LDIyIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRjb25zdCBzb2Z0bGVhZl90IGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wdGUocHRldmFsKTtcbiBcbiBcdFx0XHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oZW50cnkpO1xuLVx0XHRcdFZNX1dBUk5fT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSwgZm9saW8pO1xuIFx0XHR9XG4gXG4gXHRcdHN1YnBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcbiBcdFx0YW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNlxuIFx0XHRcdFx0IFBhZ2VBbm9uRXhjbHVzaXZlKHN1YnBhZ2UpO1xuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdGJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4tXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBodWdlX3BtZF91bnNoYXJlIG1heSB1bm1hcCBhbiBlbnRpcmUgUE1EIHBhZ2UuXG4tXHRcdFx0ICogVGhlcmUgaXMgbm8gd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heVxuLVx0XHRcdCAqIGJlIGNhY2hlZCBmb3IgdGhpcyBtbSwgc28gd2UgbXVzdCBmbHVzaCB0aGVtIGFsbC5cbi1cdFx0XHQgKiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkIGFib3ZlIHRvIGNvdmVyIHRoaXNcbi1cdFx0XHQgKiByYW5nZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuLVxuLVx0XHRcdC8qXG4tXHRcdFx0ICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZVxuLVx0XHRcdCAqIGhlbGQgaW4gd3JpdGUgbW9kZS4gIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5XG4tXHRcdFx0ICogZG8gdGhpcyBvdXRzaWRlIHJtYXAgcm91dGluZXMuXG4tXHRcdFx0ICpcbi1cdFx0XHQgKiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuXG4tXHRcdFx0ICogTG9jayBvcmRlciBkaWN0YXRlcyBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFXG4tXHRcdFx0ICogaV9tbWFwX3J3c2VtLiAgV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmRcbi1cdFx0XHQgKiBmYWlsIGlmIHVuc3VjY2Vzc2Z1bC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoIWFub24pIHtcbi1cdFx0XHRcdHN0cnVjdCBtbXVfZ2F0aGVyIHRsYjtcbiYjNDM7XHRcdG5yX3BhZ2VzID0gMTtcbiYjNDM7XHRcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcbiYjNDM7XHRcdFx0bnJfcGFnZXMgPSBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaChmb2xpbywgXHUwMDI2cHZtdywgcHRldmFsLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgIHN1YnBhZ2UsIGFub25fZXhjbHVzaXZlKTtcbiBcbi1cdFx0XHRcdFZNX0JVR19PTighKGZsYWdzIFx1MDAyNiBUVFVfUk1BUF9MT0NLRUQpKTtcbi1cdFx0XHRcdGlmICghaHVnZXRsYl92bWFfdHJ5bG9ja193cml0ZSh2bWEpKSB7XG4tXHRcdFx0XHRcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4tXHRcdFx0XHRcdHJldCA9IGZhbHNlO1xuLVx0XHRcdFx0XHRicmVhaztcbi1cdFx0XHRcdH1cbiYjNDM7XHRcdFx0ZW5kX2FkZHIgPSBhZGRyZXNzICYjNDM7IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuJiM0MztcdFx0XHRmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIGFkZHJlc3MsIGVuZF9hZGRyKTtcbiBcbi1cdFx0XHRcdHRsYl9nYXRoZXJfbW11X3ZtYShcdTAwMjZ0bGIsIHZtYSk7XG4tXHRcdFx0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4tXHRcdFx0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuLVx0XHRcdFx0XHRodWdlX3BtZF91bnNoYXJlX2ZsdXNoKFx1MDAyNnRsYiwgdm1hKTtcbi1cdFx0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbi1cdFx0XHRcdFx0Lypcbi1cdFx0XHRcdFx0ICogVGhlIFBNRCB0YWJsZSB3YXMgdW5tYXBwZWQsXG4tXHRcdFx0XHRcdCAqIGNvbnNlcXVlbnRseSB1bm1hcHBpbmcgdGhlIGZvbGlvLlxuLVx0XHRcdFx0XHQgKi9cbi1cdFx0XHRcdFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcdTAwMjZwdm13KTtcbi1cdFx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcbi1cdFx0XHRcdHRsYl9maW5pc2hfbW11KFx1MDAyNnRsYik7XG4tXHRcdFx0fVxuLVx0XHRcdC8qIE51a2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBlbnRyeSAqL1xuLVx0XHRcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcbi1cdFx0XHRpZiAocHRlX2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbi1cdFx0XHR3cml0YWJsZSA9IHB0ZV93cml0ZShwdGV2YWwpO1xuLVx0XHR9IGVsc2UgaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkge1xuLVx0XHRcdGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCBhZGRyZXNzLCBwZm4pO1xuLVx0XHRcdC8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cnkuICovXG4mIzQzO1x0XHRcdC8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cmllcy4gKi9cbiYjNDM7XHRcdFx0cHRldmFsID0gZ2V0X2FuZF9jbGVhcl9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgbnJfcGFnZXMpO1xuIFx0XHRcdGlmIChzaG91bGRfZGVmZXJfZmx1c2gobW0sIGZsYWdzKSkge1xuIFx0XHRcdFx0LypcbiBcdFx0XHRcdCAqIFdlIGNsZWFyIHRoZSBQVEUgYnV0IGRvIG5vdCBmbHVzaCBzbyBwb3RlbnRpYWxseVxuQEAgLTI1ODYsMTEgJiM0MzsyNzQzLDkgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdFx0ICogdHJhbnNpdGlvbiBvbiBhIGNhY2hlZCBUTEIgZW50cnkgaXMgd3JpdHRlbiB0aHJvdWdoXG4gXHRcdFx0XHQgKiBhbmQgdHJhcHMgaWYgdGhlIFBURSBpcyB1bm1hcHBlZC5cbiBcdFx0XHRcdCAqL1xuLVx0XHRcdFx0cHRldmFsID0gcHRlcF9nZXRfYW5kX2NsZWFyKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSk7XG4tXG4tXHRcdFx0XHRzZXRfdGxiX3ViY19mbHVzaF9wZW5kaW5nKG1tLCBwdGV2YWwsIGFkZHJlc3MsIGFkZHJlc3MgJiM0MzsgUEFHRV9TSVpFKTtcbiYjNDM7XHRcdFx0XHRzZXRfdGxiX3ViY19mbHVzaF9wZW5kaW5nKG1tLCBwdGV2YWwsIGFkZHJlc3MsIGVuZF9hZGRyKTtcbiBcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0cHRldmFsID0gcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcbiYjNDM7XHRcdFx0XHRmbHVzaF90bGJfcmFuZ2Uodm1hLCBhZGRyZXNzLCBlbmRfYWRkcik7XG4gXHRcdFx0fVxuIFx0XHRcdGlmIChwdGVfZGlydHkocHRldmFsKSlcbiBcdFx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuQEAgLTI2MTMsMTQgJiM0MzsyNzY4LDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdFZNX1dBUk5fT05fRk9MSU8oZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pLCBmb2xpbyk7XG4gXG4gXHRcdFx0cHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KHN1YnBhZ2UpKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdFx0aHVnZXRsYl9jb3VudF9zdWIoZm9saW9fbnJfcGFnZXMoZm9saW8pLCBtbSk7XG4tXHRcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsXG4tXHRcdFx0XHRcdFx0aHN6KTtcbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbi1cdFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xuLVx0XHRcdH1cbiYjNDM7XHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbiYjNDM7XHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XG4gXHRcdH0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpIFx1MDAyNlx1MDAyNiBwdGVfdW51c2VkKHB0ZXZhbCkgXHUwMDI2XHUwMDI2XG4gXHRcdFx0ICAgIXVzZXJmYXVsdGZkX2FybWVkKHZtYSkpIHtcbiBcdFx0XHQvKlxuQEAgLTI2MzUsOCAmIzQzOzI3ODQsOCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0ICovXG4gXHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRzd3BfZW50cnlfdCBlbnRyeTtcbiBcdFx0XHRwdGVfdCBzd3BfcHRlO1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgaTtcbiBcbiBcdFx0XHQvKlxuIFx0XHRcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cbkBAIC0yNjQ0LDMyICYjNDM7Mjc5MywxNSBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0ICogc28gd2UmIzM5O2xsIG5vdCBjaGVjay9jYXJlLlxuIFx0XHRcdCAqL1xuIFx0XHRcdGlmIChhcmNoX3VubWFwX29uZShtbSwgdm1hLCBhZGRyZXNzLCBwdGV2YWwpIFx1MDAzYyAwKSB7XG4tXHRcdFx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbi1cdFx0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcbi1cdFx0XHRcdFx0XHRcdHB0ZXZhbCwgaHN6KTtcbi1cdFx0XHRcdGVsc2Vcbi1cdFx0XHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XG4tXHRcdFx0XHRyZXQgPSBmYWxzZTtcbi1cdFx0XHRcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4tXHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuJiM0MztcdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbiBcdFx0XHR9XG4gXG4tXHRcdFx0LyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdFx0aWYgKGFub25fZXhjbHVzaXZlIFx1MDAyNlx1MDAyNlxuLVx0XHRcdFx0ICAgIGh1Z2V0bGJfdHJ5X3NoYXJlX2Fub25fcm1hcChmb2xpbykpIHtcbi1cdFx0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcbi1cdFx0XHRcdFx0XHRcdHB0ZXZhbCwgaHN6KTtcbi1cdFx0XHRcdFx0cmV0ID0gZmFsc2U7XG4tXHRcdFx0XHRcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4tXHRcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdFx0fVxuLVx0XHRcdH0gZWxzZSBpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZShmb2xpbywgc3VicGFnZSkpIHtcbi1cdFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xuLVx0XHRcdFx0cmV0ID0gZmFsc2U7XG4tXHRcdFx0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuLVx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xuJiM0MztcdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzKSkge1xuJiM0MztcdFx0XHRcdHNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7XG4mIzQzO1x0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuIFx0XHRcdH1cbiBcbiBcdFx0XHQvKlxuQEAgLTI2NzcsNTIgJiM0MzsyODA5LDQwIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHQgKiBwdGUuIGRvX3N3YXBfcGFnZSgpIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWlncmF0aW9uXG4gXHRcdFx0ICogcHRlIGlzIHJlbW92ZWQgYW5kIHRoZW4gcmVzdGFydCBmYXVsdCBoYW5kbGluZy5cbiBcdFx0XHQgKi9cbi1cdFx0XHRpZiAod3JpdGFibGUpXG4tXHRcdFx0XHRlbnRyeSA9IG1ha2Vfd3JpdGFibGVfbWlncmF0aW9uX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4oc3VicGFnZSkpO1xuLVx0XHRcdGVsc2UgaWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkoXG4tXHRcdFx0XHRcdFx0XHRwYWdlX3RvX3BmbihzdWJwYWdlKSk7XG4tXHRcdFx0ZWxzZVxuLVx0XHRcdFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTtcbi1cdFx0XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4tXHRcdFx0XHRpZiAocHRlX3lvdW5nKHB0ZXZhbCkpXG4tXHRcdFx0XHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoZW50cnkpO1xuLVx0XHRcdFx0aWYgKHB0ZV9kaXJ0eShwdGV2YWwpKVxuLVx0XHRcdFx0XHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTtcbi1cdFx0XHRcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbi1cdFx0XHRcdGlmIChwdGVfc29mdF9kaXJ0eShwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4tXHRcdFx0XHRpZiAocHRlX3VmZmQocHRldmFsKSlcbi1cdFx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xuLVx0XHRcdH0gZWxzZSB7XG4tXHRcdFx0XHRzd3BfcHRlID0gc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSk7XG4tXHRcdFx0XHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcbi1cdFx0XHRcdGlmIChwdGVfc3dwX3VmZmQocHRldmFsKSlcbi1cdFx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xuLVx0XHRcdH1cbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbi1cdFx0XHRcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHN3cF9wdGUsXG4tXHRcdFx0XHRcdFx0aHN6KTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSk7XG4mIzQzO1x0XHRcdHN3cF9wdGUgPSBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKHN1YnBhZ2UsIHB0ZXZhbCxcbiYjNDM7XHRcdFx0XHRcdFx0XHQgd3JpdGFibGUsIGFub25fZXhjbHVzaXZlKTtcbiBcdFx0XHR0cmFjZV9zZXRfbWlncmF0aW9uX3B0ZShhZGRyZXNzLCBwdGVfdmFsKHN3cF9wdGUpLFxuIFx0XHRcdFx0XHRcdGZvbGlvX29yZGVyKGZvbGlvKSk7XG4mIzQzO1xuJiM0MztcdFx0XHQvKiBTZXQgbnJfcGFnZXMgbWlncmF0aW9uIGVudHJpZXMsIGFkdmFuY2luZyB0aGUgUEZOLiAqL1xuJiM0MztcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzICYjNDM7ICh1bnNpZ25lZCBsb25nKWkgKiBQQUdFX1NJWkUsXG4mIzQzO1x0XHRcdFx0XHQgICBwdm13LnB0ZSAmIzQzOyBpLCBzd3BfcHRlKTtcbiYjNDM7XHRcdFx0XHRzd3BfcHRlID0gcHRlX25leHRfc3dwX29mZnNldChzd3BfcHRlKTtcbiYjNDM7XHRcdFx0fVxuIFx0XHRcdC8qXG4gXHRcdFx0ICogTm8gbmVlZCB0byBpbnZhbGlkYXRlIGhlcmUgaXQgd2lsbCBzeW5jaHJvbml6ZSBvblxuIFx0XHRcdCAqIGFnYWluc3QgdGhlIHNwZWNpYWwgc3dhcCBtaWdyYXRpb24gcHRlLlxuIFx0XHRcdCAqL1xuIFx0XHR9XG4gXG4tXHRcdGlmICh1bmxpa2VseShmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSlcbi1cdFx0XHRodWdldGxiX3JlbW92ZV9ybWFwKGZvbGlvKTtcbi1cdFx0ZWxzZVxuLVx0XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZShmb2xpbywgc3VicGFnZSwgdm1hKTtcbiYjNDM7XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xuIFx0XHRpZiAodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9MT0NLRUQpXG4gXHRcdFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcbi1cdFx0Zm9saW9fcHV0KGZvbGlvKTtcbiYjNDM7XHRcdGZvbGlvX3B1dF9yZWZzKGZvbGlvLCBucl9wYWdlcyk7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIElmIHdlIGJhdGNoZWQgdGhlIGVudGlyZSBmb2xpbywgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvXG4mIzQzO1x0XHQgKiB3YWxrOyBzdG9wIHJpZ2h0IGhlcmUuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmIChucl9wYWdlcyA9PSBmb2xpb19ucl9wYWdlcyhmb2xpbykpXG4mIzQzO1x0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0Y29udGludWU7XG4mIzQzO3dhbGtfYWJvcnQ6XG4mIzQzO1x0XHRyZXQgPSBmYWxzZTtcbiYjNDM7d2Fsa19kb25lOlxuJiM0MztcdFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcdTAwMjZwdm13KTtcbiYjNDM7XHRcdGJyZWFrO1xuIFx0fVxuIFxuIFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFx1MDAyNnJhbmdlKTtcbkBAIC0yNzQxLDcgJiM0MzsyODYxLDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIHZvaWQgdHJ5X3RvX21pZ3JhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHtcbi1cdFx0LnJtYXBfb25lID0gdHJ5X3RvX21pZ3JhdGVfb25lLFxuJiM0MztcdFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSA/XG4mIzQzO1x0XHRcdFx0dHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmUgOiB0cnlfdG9fbWlncmF0ZV9vbmUsXG4gXHRcdC5hcmcgPSAodm9pZCAqKWZsYWdzLFxuIFx0XHQuZG9uZSA9IGZvbGlvX25vdF9tYXBwZWQsXG4gXHRcdC5hbm9uX2xvY2sgPSBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTIgMTM6MTI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUlHUkFUSU9OJiMzNDssCiAgICAmIzM0O0hVR0VUTEJfUEFHRSYjMzQ7LAogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O21pZ3JhdGlvbl9wdGVfYmF0Y2gmIzM0OywKICAgICYjMzQ7cmVtb3ZlX21pZ3JhdGlvbl9wdGUmIzM0OywKICAgICYjMzQ7cmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYiYjMzQ7LAogICAgJiMzNDtyZW1vdmVfbWlncmF0aW9uX3B0ZXMmIzM0OywKICAgICYjMzQ7bWFrZV9taWdyYXRpb25fc3dwX3B0ZSYjMzQ7LAogICAgJiMzNDt0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZSYjMzQ7LAogICAgJiMzNDtmb2xpb19taWdyYXRlX3B0ZV9iYXRjaCYjMzQ7LAogICAgJiMzNDt0cnlfdG9fbWlncmF0ZV9vbmUmIzM0OywKICAgICYjMzQ7dHJ5X3RvX21pZ3JhdGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBiYXRjaGluZyBmb3IgbWlncmF0aW9uIFBURXMgdG8gb3B0aW1pemUgbWVtb3J5IG1pZ3JhdGlvbiwgZXNwZWNpYWxseSBmb3IgbGFyZ2UgZm9saW9zLiBJdCBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBpbiBtbS9taWdyYXRlLmMgYW5kIG1tL3JtYXAuYy4gRnV6emluZyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIGJhdGNoaW5nIGxvZ2ljIGNvcnJlY3RseSBoYW5kbGVzIFBURXMsIHBlcm1pc3Npb25zLCBhbmQgZWRnZSBjYXNlcyBsaWtlIGRldmljZSBwcml2YXRlIGZvbGlvcyBvciBodWdldGxiIHBhZ2VzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBjNmUyYmUxZTFhNjFiYmZhODExZDc1YzFkNzcwMmE0ZDk4YzVlODg1CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFN1biBKdWwgMTIgMTM6MTI6MjAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JtYXAuaCBiL2luY2x1ZGUvbGludXgvcm1hcC5oCmluZGV4IDhkYzA4NzFlNWYwMDExLi42NDkyOTQ5MGE3Y2ZjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ybWFwLmgKQEAgLTcwNiwxNyAmIzQzOzcwNiwxOCBAQCBzdGF0aWMgaW5saW5lIGludCBmb2xpb190cnlfZHVwX2Fub25fcm1hcF9wbWQoc3RydWN0IGZvbGlvICpmb2xpbywKIH0KIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19mb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sCi0JCXN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnJfcGFnZXMsIGVudW0gcGd0YWJsZV9sZXZlbCBsZXZlbCkKJiM0MzsJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpCiB7CiYjNDM7CS8qIGRldmljZSBwcml2YXRlIGZvbGlvcyBjYW5ub3QgZ2V0IHBpbm5lZCB2aWEgR1VQLiAqLwomIzQzOwljb25zdCBib29sIHBpbm5hYmxlID0gbGlrZWx5KCFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpOwomIzQzOwogCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKIAlWTV9XQVJOX09OX0ZPTElPKCFQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKSwgZm9saW8pOwogCV9fZm9saW9fcm1hcF9zYW5pdHlfY2hlY2tzKGZvbGlvLCBwYWdlLCBucl9wYWdlcywgbGV2ZWwpOwogCi0JLyogZGV2aWNlIHByaXZhdGUgZm9saW9zIGNhbm5vdCBnZXQgcGlubmVkIHZpYSBHVVAuICovCi0JaWYgKHVubGlrZWx5KGZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSkpIHsKLQkJQ2xlYXJQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTsKLQkJcmV0dXJuIDA7Ci0JfQomIzQzOwkvKiBXZSBvbmx5IGNsZWFyIGFub24tZXhjbHVzaXZlIGZyb20gaGVhZCBwYWdlIG9mIFBNRCBmb2xpbyAqLwomIzQzOwlpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QTUQpCiYjNDM7CQlucl9wYWdlcyA9IDE7CiAKIAkvKgogCSAqIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2hlbiB3ZSBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSwgdGhhdApAQCAtNzYwLDI5ICYjNDM7NzYxLDM4IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLAogCSAqIHNvIHdlIHVzZSBleHBsaWNpdCBvbmVzIGhlcmUuCiAJICovCiAKLQkvKiBQYWlyZWQgd2l0aCB0aGUgbWVtb3J5IGJhcnJpZXIgaW4gdHJ5X2dyYWJfZm9saW8oKS4gKi8KLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpCi0JCXNtcF9tYigpOwomIzQzOwlpZiAocGlubmFibGUpIHsKJiM0MzsJCS8qIFBhaXJlZCB3aXRoIHRoZSBtZW1vcnkgYmFycmllciBpbiB0cnlfZ3JhYl9mb2xpbygpLiAqLwomIzQzOwkJaWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKQomIzQzOwkJCXNtcF9tYigpOwogCi0JaWYgKHVubGlrZWx5KGZvbGlvX21heWJlX2RtYV9waW5uZWQoZm9saW8pKSkKLQkJcmV0dXJuIC1FQlVTWTsKLQlDbGVhclBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpOwomIzQzOwkJaWYgKHVubGlrZWx5KGZvbGlvX21heWJlX2RtYV9waW5uZWQoZm9saW8pKSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZvciAoOzspIHsKJiM0MzsJCUNsZWFyUGFnZUFub25FeGNsdXNpdmUocGFnZSk7CiYjNDM7CQlpZiAoLS1ucl9wYWdlcyA9PSAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJcGFnZSYjNDM7JiM0Mzs7CiYjNDM7CX0KIAogCS8qCiAJICogVGhpcyBpcyBjb25jZXB0dWFsbHkgYSBzbXBfd21iKCkgcGFpcmVkIHdpdGggdGhlIHNtcF9ybWIoKSBpbgogCSAqIGd1cF9tdXN0X3Vuc2hhcmUoKS4KIAkgKi8KLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpCiYjNDM7CWlmIChwaW5uYWJsZSAmYW1wOyZhbXA7IElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKQogCQlzbXBfbWJfX2FmdGVyX2F0b21pYygpOwogCXJldHVybiAwOwogfQogCiAvKioKLSAqIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlIC0gdHJ5IG1hcmtpbmcgYW4gZXhjbHVzaXZlIGFub255bW91cyBwYWdlCi0gKgkJCQkgICBtYXBwZWQgYnkgYSBQVEUgcG9zc2libHkgc2hhcmVkIHRvIHByZXBhcmUKJiM0MzsgKiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMgLSB0cnkgbWFya2luZyBleGNsdXNpdmUgYW5vbnltb3VzIHBhZ2VzCiYjNDM7ICoJCQkJICAgbWFwcGVkIGJ5IFBURXMgcG9zc2libHkgc2hhcmVkIHRvIHByZXBhcmUKICAqCQkJCSAgIGZvciBLU00gb3IgdGVtcG9yYXJ5IHVubWFwcGluZwogICogQGZvbGlvOglUaGUgZm9saW8gdG8gc2hhcmUgYSBtYXBwaW5nIG9mCi0gKiBAcGFnZToJVGhlIG1hcHBlZCBleGNsdXNpdmUgcGFnZQomIzQzOyAqIEBwYWdlOglUaGUgZmlyc3QgbWFwcGVkIGV4Y2x1c2l2ZSBwYWdlIG9mIHRoZSBiYXRjaCBpbiB0aGUgZm9saW8KJiM0MzsgKiBAbnJfcGFnZXM6CVRoZSBudW1iZXIgb2YgcGFnZXMgdG8gc2hhcmUgaW4gdGhlIGZvbGlvIChiYXRjaCBzaXplKQogICoKICAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCB0aGUgcGFnZSB0YWJsZSBsb2NrIGFuZCBoYXMgdG8gaGF2ZSB0aGUgcGFnZSB0YWJsZQogICogZW50cmllcyBjbGVhcmVkL2ludmFsaWRhdGVkLgpAQCAtNzk3LDExICYjNDM7ODA3LDE5IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLAogICoKICAqIFJldHVybnMgMCBpZiBtYXJraW5nIHRoZSBtYXBwZWQgcGFnZSBwb3NzaWJseSBzaGFyZWQgc3VjY2VlZGVkLiBSZXR1cm5zCiAgKiAtRUJVU1kgb3RoZXJ3aXNlLgomIzQzOyAqCiYjNDM7ICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwYWdlIHRhYmxlIGxvY2suCiAgKi8KJiM0MztzdGF0aWMgaW5saW5lIGludCBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoc3RydWN0IGZvbGlvICpmb2xpbywKJiM0MzsJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQomIzQzO3sKJiM0MzsJcmV0dXJuIF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChmb2xpbywgcGFnZSwgbnJfcGFnZXMsIFBHVEFCTEVfTEVWRUxfUFRFKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW5saW5lIGludCBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLAogCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlyZXR1cm4gX19mb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKGZvbGlvLCBwYWdlLCAxLCBQR1RBQkxFX0xFVkVMX1BURSk7CiYjNDM7CXJldHVybiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIDEpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IDg3NGJlOTRjZjI1NzBlLi5hOTA3MjFmOGM2ODc3ZSAxMDA2NDQKLS0tIGEvbW0vaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi9tbS9pbnRlcm5hbC5oCkBAIC01MDUsNiAmIzQzOzUwNSwyNiBAQCBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlX3QgcHRlKQogCXJldHVybiBwdGVfbW92ZV9zd3Bfb2Zmc2V0KHB0ZSwgMSk7CiB9CiAKJiM0MztzdGF0aWMgaW5saW5lIGludCBzb2Z0bGVhZl9wdGVfYmF0Y2gocHRlX3QgKnN0YXJ0X3B0ZXAsIGludCBtYXhfbnIsIHB0ZV90IHB0ZSkKJiM0Mzt7CiYjNDM7CXB0ZV90IGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlKTsKJiM0MzsJY29uc3QgcHRlX3QgKmVuZF9wdGVwID0gc3RhcnRfcHRlcCAmIzQzOyBtYXhfbnI7CiYjNDM7CXB0ZV90ICpwdGVwID0gc3RhcnRfcHRlcCAmIzQzOyAxOwomIzQzOwomIzQzOwlWTV9XQVJOX09OKG1heF9uciAmbHQ7IDEpOwomIzQzOwomIzQzOwl3aGlsZSAocHRlcCAmbHQ7IGVuZF9wdGVwKSB7CiYjNDM7CQlwdGUgPSBwdGVwX2dldChwdGVwKTsKJiM0MzsKJiM0MzsJCWlmICghcHRlX3NhbWUocHRlLCBleHBlY3RlZF9wdGUpKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJZXhwZWN0ZWRfcHRlID0gcHRlX25leHRfc3dwX29mZnNldChleHBlY3RlZF9wdGUpOwomIzQzOwkJcHRlcCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHB0ZXAgLSBzdGFydF9wdGVwOwomIzQzO30KJiM0MzsKIC8qKgogICogc3dhcF9wdGVfYmF0Y2ggLSBkZXRlY3QgYSBQVEUgYmF0Y2ggZm9yIGEgc2V0IG9mIGNvbnRpZ3VvdXMgc3dhcCBlbnRyaWVzCiAgKiBAc3RhcnRfcHRlcDogUGFnZSB0YWJsZSBwb2ludGVyIGZvciB0aGUgZmlyc3QgZW50cnkuCkBAIC01MjIsMjMgJiM0Mzs1NDIsOSBAQCBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlX3QgcHRlKQogICovCiBzdGF0aWMgaW5saW5lIGludCBzd2FwX3B0ZV9iYXRjaChwdGVfdCAqc3RhcnRfcHRlcCwgaW50IG1heF9uciwgcHRlX3QgcHRlKQogewotCXB0ZV90IGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlKTsKLQljb25zdCBwdGVfdCAqZW5kX3B0ZXAgPSBzdGFydF9wdGVwICYjNDM7IG1heF9ucjsKLQlwdGVfdCAqcHRlcCA9IHN0YXJ0X3B0ZXAgJiM0MzsgMTsKLQotCVZNX1dBUk5fT04obWF4X25yICZsdDsgMSk7CiAJVk1fV0FSTl9PTighc29mdGxlYWZfaXNfc3dhcChzb2Z0bGVhZl9mcm9tX3B0ZShwdGUpKSk7CiAKLQl3aGlsZSAocHRlcCAmbHQ7IGVuZF9wdGVwKSB7Ci0JCXB0ZSA9IHB0ZXBfZ2V0KHB0ZXApOwotCi0JCWlmICghcHRlX3NhbWUocHRlLCBleHBlY3RlZF9wdGUpKQotCQkJYnJlYWs7Ci0JCWV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQoZXhwZWN0ZWRfcHRlKTsKLQkJcHRlcCYjNDM7JiM0Mzs7Ci0JfQotCi0JcmV0dXJuIHB0ZXAgLSBzdGFydF9wdGVwOwomIzQzOwlyZXR1cm4gc29mdGxlYWZfcHRlX2JhdGNoKHN0YXJ0X3B0ZXAsIG1heF9uciwgcHRlKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfTU1VICovCiAKZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCAyMjJjOGMxNWY3ODJmNy4uNmQwNWQzZjQxMDk1ZDYgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9taWdyYXRlLmMKQEAgLTM0NSw2ICYjNDM7MzQ1LDExMSBAQCBzdHJ1Y3Qgcm1hcF93YWxrX2FyZyB7CiAJYm9vbCBtYXBfdW51c2VkX3RvX3plcm9wYWdlOwogfTsKIAomIzQzOy8qCiYjNDM7ICogRGV0ZWN0IGEgYmF0Y2ggb2YgY29udGlndW91cyBtaWdyYXRpb24gZW50cmllczogY29uc2VjdXRpdmUgKG5vbi1wcmVzZW50KSBQVEVzCiYjNDM7ICogY29udGFpbmluZyBtaWdyYXRpb24gZW50cmllcyB3aXRoIGNvbnNlY3V0aXZlIG9mZnNldHMgYW5kIG1hdGNoaW5nIHB0ZSBiaXRzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlncmF0aW9uX3B0ZV9iYXRjaChzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsCiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvLCBwdGVfdCBmaXJzdF9wdGUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4KQomIzQzO3sKJiM0MzsJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBwdm13LSZndDt2bWE7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZW5kX2FkZHIgPSBwbWRfYWRkcl9lbmQocHZtdy0mZ3Q7YWRkcmVzcywgdm1hLSZndDt2bV9lbmQpOwomIzQzOwl1bnNpZ25lZCBpbnQgZm9saW9fbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7CiYjNDM7CXVuc2lnbmVkIGludCBtYXhfbnI7CiYjNDM7CiYjNDM7CVZNX1dBUk5fT04oIXNvZnRsZWFmX2lzX21pZ3JhdGlvbihzb2Z0bGVhZl9mcm9tX3B0ZShmaXJzdF9wdGUpKSk7CiYjNDM7CiYjNDM7CS8qIEJvdW5kIGJ5IFZNQSAvIFBNRCBlbmQgYW5kIGJ5IHRoZSByZW1haW5pbmcgc3VicGFnZXMgb2YgdGhlIGZvbGlvLiAqLwomIzQzOwltYXhfbnIgPSBtaW4oKGVuZF9hZGRyIC0gcHZtdy0mZ3Q7YWRkcmVzcykgJmd0OyZndDsgUEFHRV9TSElGVCwgZm9saW9fbnIgLSBzdGFydF9pZHgpOwomIzQzOwlpZiAobWF4X25yICZsdDs9IDEpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHNvZnRsZWFmX3B0ZV9iYXRjaChwdm13LSZndDtwdGUsIG1heF9uciwgZmlyc3RfcHRlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHB0ZV90IG1pZ3JhdGlvbl9zb2Z0bGVhZl9lbnRyeV90b19wdGUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHBhZ2UgKm5ldywKJiM0MzsJCXNvZnRsZWFmX3QgZW50cnksIHB0ZV90IG9sZF9wdGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJcm1hcF90ICpybWFwX2ZsYWdzKQomIzQzO3sKJiM0MzsJcHRlX3QgcHRlID0gbWtfcHRlKG5ldywgUkVBRF9PTkNFKHZtYS0mZ3Q7dm1fcGFnZV9wcm90KSk7CiYjNDM7CiYjNDM7CWlmICghc29mdGxlYWZfaXNfbWlncmF0aW9uX3lvdW5nKGVudHJ5KSkKJiM0MzsJCXB0ZSA9IHB0ZV9ta29sZChwdGUpOwomIzQzOwlpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgJmFtcDsmYW1wOyBzb2Z0bGVhZl9pc19taWdyYXRpb25fZGlydHkoZW50cnkpKQomIzQzOwkJcHRlID0gcHRlX21rZGlydHkocHRlKTsKJiM0MzsJaWYgKHB0ZV9zd3Bfc29mdF9kaXJ0eShvbGRfcHRlKSkKJiM0MzsJCXB0ZSA9IHB0ZV9ta3NvZnRfZGlydHkocHRlKTsKJiM0MzsJZWxzZQomIzQzOwkJcHRlID0gcHRlX2NsZWFyX3NvZnRfZGlydHkocHRlKTsKJiM0MzsKJiM0MzsJaWYgKHNvZnRsZWFmX2lzX21pZ3JhdGlvbl93cml0ZShlbnRyeSkpCiYjNDM7CQlwdGUgPSBwdGVfbWt3cml0ZShwdGUsIHZtYSk7CiYjNDM7CWVsc2UgaWYgKHB0ZV9zd3BfdWZmZChvbGRfcHRlKSkKJiM0MzsJCXB0ZSA9IHB0ZV9ta3VmZmQocHRlKTsKJiM0MzsKJiM0MzsJLyogU2VlIGRvX3N3YXBfcGFnZSgpOiByZXN0b3JlIFBBR0VfTk9ORSBmb3IgUldQICovCiYjNDM7CWlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkgJmFtcDsmYW1wOyB1c2VyZmF1bHRmZF9yd3Aodm1hKSkKJiM0MzsJCXB0ZSA9IHB0ZV9tb2RpZnkocHRlLCBQQUdFX05PTkUpOwomIzQzOwomIzQzOwlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7ICFzb2Z0bGVhZl9pc19taWdyYXRpb25fcmVhZChlbnRyeSkpCiYjNDM7CQkqcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTsKJiM0MzsKJiM0MzsJcmV0dXJuIHB0ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZXN0b3JlIGEgcG90ZW50aWFsIG1pZ3JhdGlvbiBwdGUgdG8gYSB3b3JraW5nIHB0ZSBlbnRyeSBmb3IgaHVnZXRsYiBmb2xpb3MuCiYjNDM7ICovCiYjNDM7I2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKJiM0MztzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiKHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgcm1hcF93YWxrX2FyZyAqcm1hcF93YWxrX2FyZyA9IGFyZzsKJiM0MzsJREVGSU5FX0ZPTElPX1ZNQV9XQUxLKHB2bXcsIHJtYXBfd2Fsa19hcmctJmd0O2ZvbGlvLCB2bWEsIGFkZHIsIFBWTVdfU1lOQyB8IFBWTVdfTUlHUkFUSU9OKTsKJiM0MzsJc3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTsKJiM0MzsJdW5zaWduZWQgaW50IHNoaWZ0ID0gaHVnZV9wYWdlX3NoaWZ0KGgpOwomIzQzOwl1bnNpZ25lZCBsb25nIHBzaXplID0gaHVnZV9wYWdlX3NpemUoaCk7CiYjNDM7CiYjNDM7CWlmIChwYWdlX3ZtYV9tYXBwZWRfd2FsaygmYW1wO3B2bXcpKSB7CiYjNDM7CQlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKJiM0MzsJCXN0cnVjdCBwYWdlICpuZXcgPSBmb2xpb19wYWdlKGZvbGlvLCAwKTsKJiM0MzsJCXB0ZV90IG9sZF9wdGUsIHB0ZTsKJiM0MzsJCXNvZnRsZWFmX3QgZW50cnk7CiYjNDM7CiYjNDM7CQlvbGRfcHRlID0gaHVnZV9wdGVwX2dldCh2bWEtJmd0O3ZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTsKJiM0MzsJCWVudHJ5ID0gc29mdGxlYWZfZnJvbV9wdGUob2xkX3B0ZSk7CiYjNDM7CiYjNDM7CQlmb2xpb19nZXQoZm9saW8pOwomIzQzOwkJcHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSwKJiM0MzsJCQkJCQkgICAgICB2bWEsICZhbXA7cm1hcF9mbGFncyk7CiYjNDM7CQlwdGUgPSBhcmNoX21ha2VfaHVnZV9wdGUocHRlLCBzaGlmdCwgdm1hLSZndDt2bV9mbGFncyk7CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKJiM0MzsJCQlodWdldGxiX2FkZF9hbm9uX3JtYXAoZm9saW8sIHZtYSwgcHZtdy5hZGRyZXNzLAomIzQzOwkJCQkJICAgICAgcm1hcF9mbGFncyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJaHVnZXRsYl9hZGRfZmlsZV9ybWFwKGZvbGlvKTsKJiM0MzsJCXNldF9odWdlX3B0ZV9hdCh2bWEtJmd0O3ZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsIHBzaXplKTsKJiM0MzsKJiM0MzsJCWlmIChSRUFEX09OQ0Uodm1hLSZndDt2bV9mbGFncykgJmFtcDsgVk1fTE9DS0VEKQomIzQzOwkJCW1sb2NrX2RyYWluX2xvY2FsKCk7CiYjNDM7CiYjNDM7CQl0cmFjZV9yZW1vdmVfbWlncmF0aW9uX3B0ZShwdm13LmFkZHJlc3MsIHB0ZV92YWwocHRlKSwKJiM0MzsJCQkJCSAgIGNvbXBvdW5kX29yZGVyKG5ldykpOwomIzQzOwomIzQzOwkJLyogTm8gbmVlZCB0byBpbnZhbGlkYXRlIC0gaXQgd2FzIG5vbi1wcmVzZW50IGJlZm9yZSAqLwomIzQzOwkJdXBkYXRlX21tdV9jYWNoZSh2bWEsIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsjZWxzZQomIzQzO3N0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGIoc3RydWN0IGZvbGlvICpmb2xpbywKJiM0MzsJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7I2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KJiM0MzsKIC8qCiAgKiBSZXN0b3JlIGEgcG90ZW50aWFsIG1pZ3JhdGlvbiBwdGUgdG8gYSB3b3JraW5nIHB0ZSBlbnRyeQogICovCkBAIC0zNTIsNiAmIzQzOzQ1Nyw3IEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sCiAJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3Qgcm1hcF93YWxrX2FyZyAqcm1hcF93YWxrX2FyZyA9IGFyZzsKJiM0MzsJYm9vbCBpc19kZXZwcml2ID0gZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pOwogCURFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBybWFwX3dhbGtfYXJnLSZndDtmb2xpbywgdm1hLCBhZGRyLCBQVk1XX1NZTkMgfCBQVk1XX01JR1JBVElPTik7CiAKIAl3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoJmFtcDtwdm13KSkgewpAQCAtMzYxLDU2ICYjNDM7NDY3LDQwIEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sCiAJCXNvZnRsZWFmX3QgZW50cnk7CiAJCXN0cnVjdCBwYWdlICpuZXc7CiAJCXVuc2lnbmVkIGxvbmcgaWR4ID0gMDsKJiM0MzsJCXVuc2lnbmVkIGludCBuciA9IDE7CiAKIAkJLyogcGdvZmYgaXMgaW52YWxpZCBmb3Iga3NtIHBhZ2VzLCBidXQgdGhleSBhcmUgbmV2ZXIgbGFyZ2UgKi8KLQkJaWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pICZhbXA7JmFtcDsgIWZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpCiYjNDM7CQlpZiAoZm9saW9fdGVzdF9sYXJnZShmb2xpbykpCiAJCQlpZHggPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIHB2bXcuYWRkcmVzcykgLSBwdm13LnBnb2ZmOwogCQluZXcgPSBmb2xpb19wYWdlKGZvbGlvLCBpZHgpOwogCiAjaWZkZWYgQ09ORklHX0FSQ0hfSEFTX1BNRF9TT0ZUTEVBVkVTCiAJCS8qIFBNRC1tYXBwZWQgVEhQIG1pZ3JhdGlvbiBlbnRyeSAqLwogCQlpZiAoIXB2bXcucHRlKSB7Ci0JCQlWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSB8fAotCQkJCQkhZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7CiYjNDM7CQkJVk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbyksIGZvbGlvKTsKIAkJCXJlbW92ZV9taWdyYXRpb25fcG1kKCZhbXA7cHZtdywgbmV3KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAjZW5kaWYKLQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpCi0JCQlvbGRfcHRlID0gaHVnZV9wdGVwX2dldCh2bWEtJmd0O3ZtX21tLCBwdm13LmFkZHJlc3MsCi0JCQkJCQlwdm13LnB0ZSk7Ci0JCWVsc2UKLQkJCW9sZF9wdGUgPSBwdGVwX2dldChwdm13LnB0ZSk7CiYjNDM7CQlvbGRfcHRlID0gcHRlcF9nZXQocHZtdy5wdGUpOwogCQlpZiAocm1hcF93YWxrX2FyZy0mZ3Q7bWFwX3VudXNlZF90b196ZXJvcGFnZSAmYW1wOyZhbXA7CiAJCSAgICB0cnlfdG9fbWFwX3VudXNlZF90b196ZXJvcGFnZSgmYW1wO3B2bXcsIGZvbGlvLCBvbGRfcHRlLCBpZHgpKQogCQkJY29udGludWU7CiAKLQkJZm9saW9fZ2V0KGZvbGlvKTsKLQkJcHRlID0gbWtfcHRlKG5ldywgUkVBRF9PTkNFKHZtYS0mZ3Q7dm1fcGFnZV9wcm90KSk7Ci0KIAkJZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3B0ZShvbGRfcHRlKTsKLQkJaWYgKCFzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpKQotCQkJcHRlID0gcHRlX21rb2xkKHB0ZSk7Ci0JCWlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSAmYW1wOyZhbXA7IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSkpCi0JCQlwdGUgPSBwdGVfbWtkaXJ0eShwdGUpOwotCQlpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KG9sZF9wdGUpKQotCQkJcHRlID0gcHRlX21rc29mdF9kaXJ0eShwdGUpOwotCQllbHNlCi0JCQlwdGUgPSBwdGVfY2xlYXJfc29mdF9kaXJ0eShwdGUpOwogCi0JCWlmIChzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpKQotCQkJcHRlID0gcHRlX21rd3JpdGUocHRlLCB2bWEpOwotCQllbHNlIGlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkpCi0JCQlwdGUgPSBwdGVfbWt1ZmZkKHB0ZSk7Ci0KLQkJLyogU2VlIGRvX3N3YXBfcGFnZSgpOiByZXN0b3JlIFBBR0VfTk9ORSBmb3IgUldQICovCi0JCWlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkgJmFtcDsmYW1wOyB1c2VyZmF1bHRmZF9yd3Aodm1hKSkKLQkJCXB0ZSA9IHB0ZV9tb2RpZnkocHRlLCBQQUdFX05PTkUpOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRyeSB0byByZXN0b3JlIG5yJmd0OzEgY29udGlndW91cyBQVEVzIGluIG9uZSBzaG90LiBGYWxscyBiYWNrCiYjNDM7CQkgKiB0byBvcmlnaW5hbCBwZXItUFRFIHBhdGggKG5yPTEpIGlmIGJhdGNoaW5nIGlzIG5vdCBwb3NzaWJsZS4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKCFybWFwX3dhbGtfYXJnLSZndDttYXBfdW51c2VkX3RvX3plcm9wYWdlICZhbXA7JmFtcDsgbGlrZWx5KCFpc19kZXZwcml2KSkKJiM0MzsJCQluciA9IG1pZ3JhdGlvbl9wdGVfYmF0Y2goJmFtcDtwdm13LCBmb2xpbywgb2xkX3B0ZSwgaWR4KTsKIAotCQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7ICFzb2Z0bGVhZl9pc19taWdyYXRpb25fcmVhZChlbnRyeSkpCi0JCQlybWFwX2ZsYWdzIHw9IFJNQVBfRVhDTFVTSVZFOwomIzQzOwkJZm9saW9fcmVmX2FkZChmb2xpbywgbnIpOwomIzQzOwkJcHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSwKJiM0MzsJCQkJCQkgICAgICB2bWEsICZhbXA7cm1hcF9mbGFncyk7CiAKLQkJaWYgKHVubGlrZWx5KGlzX2RldmljZV9wcml2YXRlX3BhZ2UobmV3KSkpIHsKJiM0MzsJCWlmICh1bmxpa2VseShpc19kZXZwcml2KSkgewogCQkJaWYgKHB0ZV93cml0ZShwdGUpKQogCQkJCWVudHJ5ID0gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeSgKIAkJCQkJCQlwYWdlX3RvX3BmbihuZXcpKTsKQEAgLTQyNCwzMCAmIzQzOzUxNCwxMiBAQCBzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLAogCQkJCXB0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHB0ZSk7CiAJCX0KIAotI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKLQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHsKLQkJCXN0cnVjdCBoc3RhdGUgKmggPSBoc3RhdGVfdm1hKHZtYSk7Ci0JCQl1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaCk7Ci0JCQl1bnNpZ25lZCBsb25nIHBzaXplID0gaHVnZV9wYWdlX3NpemUoaCk7Ci0KLQkJCXB0ZSA9IGFyY2hfbWFrZV9odWdlX3B0ZShwdGUsIHNoaWZ0LCB2bWEtJmd0O3ZtX2ZsYWdzKTsKLQkJCWlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKQotCQkJCWh1Z2V0bGJfYWRkX2Fub25fcm1hcChmb2xpbywgdm1hLCBwdm13LmFkZHJlc3MsCi0JCQkJCQkgICAgICBybWFwX2ZsYWdzKTsKLQkJCWVsc2UKLQkJCQlodWdldGxiX2FkZF9maWxlX3JtYXAoZm9saW8pOwotCQkJc2V0X2h1Z2VfcHRlX2F0KHZtYS0mZ3Q7dm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIHB0ZSwKLQkJCQkJcHNpemUpOwotCQl9IGVsc2UKLSNlbmRpZgotCQl7Ci0JCQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKLQkJCQlmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZShmb2xpbywgbmV3LCB2bWEsCi0JCQkJCQkJcHZtdy5hZGRyZXNzLCBybWFwX2ZsYWdzKTsKLQkJCWVsc2UKLQkJCQlmb2xpb19hZGRfZmlsZV9ybWFwX3B0ZShmb2xpbywgbmV3LCB2bWEpOwotCQkJc2V0X3B0ZV9hdCh2bWEtJmd0O3ZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUpOwotCQl9CiYjNDM7CQlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkKJiM0MzsJCQlmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIG5ldywgbnIsIHZtYSwKJiM0MzsJCQkJCQkgcHZtdy5hZGRyZXNzLCBybWFwX2ZsYWdzKTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlmb2xpb19hZGRfZmlsZV9ybWFwX3B0ZXMoZm9saW8sIG5ldywgbnIsIHZtYSk7CiYjNDM7CQlzZXRfcHRlcyh2bWEtJmd0O3ZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsIG5yKTsKIAkJaWYgKFJFQURfT05DRSh2bWEtJmd0O3ZtX2ZsYWdzKSAmYW1wOyBWTV9MT0NLRUQpCiAJCQltbG9ja19kcmFpbl9sb2NhbCgpOwogCkBAIC00NTUsNyAmIzQzOzUyNywxMSBAQCBzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLAogCQkJCQkgICBjb21wb3VuZF9vcmRlcihuZXcpKTsKIAogCQkvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovCi0JCXVwZGF0ZV9tbXVfY2FjaGUodm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTsKJiM0MzsJCXVwZGF0ZV9tbXVfY2FjaGVfcmFuZ2UoTlVMTCwgdm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBucik7CiYjNDM7CiYjNDM7CQkvKiBTa2lwIHRoZSBiYXRjaGVkIFBURXMgKi8KJiM0MzsJCXB2bXcucHRlICYjNDM7PSBuciAtIDE7CiYjNDM7CQlwdm13LmFkZHJlc3MgJiM0Mzs9IChuciAtIDEpICogUEFHRV9TSVpFOwogCX0KIAogCXJldHVybiB0cnVlOwpAQCAtNDc0LDcgJiM0Mzs1NTAsOSBAQCB2b2lkIHJlbW92ZV9taWdyYXRpb25fcHRlcyhzdHJ1Y3QgZm9saW8gKnNyYywgc3RydWN0IGZvbGlvICpkc3QsCiAJfTsKIAogCXN0cnVjdCBybWFwX3dhbGtfY29udHJvbCByd2MgPSB7Ci0JCS5ybWFwX29uZSA9IHJlbW92ZV9taWdyYXRpb25fcHRlLAomIzQzOwkJLnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKHNyYykgPwomIzQzOwkJCQlyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiIDoKJiM0MzsJCQkJcmVtb3ZlX21pZ3JhdGlvbl9wdGUsCiAJCS5hcmcgPSAmYW1wO3JtYXBfd2Fsa19hcmcsCiAJfTsKIApkaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IGU4NTQ2Nzk1NTNiOWMzLi5jZmFjODVmNmY2OGE2OCAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3JtYXAuYwpAQCAtMjQwNSw2ICYjNDM7MjQwNSwyMjkgQEAgdm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpCiAJCXJtYXBfd2Fsayhmb2xpbywgJmFtcDtyd2MpOwogfQogCiYjNDM7LyogQnVpbGQgdGhlIG1pZ3JhdGlvbiBzd2FwIFBURSB0aGF0IHJlcGxhY2VzIHB0ZXZhbCBmb3IgYSBwYWdlLiAqLwomIzQzO3N0YXRpYyBwdGVfdCBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKHN0cnVjdCBwYWdlICpwYWdlLCBwdGVfdCBwdGV2YWwsCiYjNDM7CQlib29sIHdyaXRhYmxlLCBib29sIGFub25fZXhjbHVzaXZlKQomIzQzO3sKJiM0MzsJc3dwX2VudHJ5X3QgZW50cnk7CiYjNDM7CXB0ZV90IHN3cF9wdGU7CiYjNDM7CiYjNDM7CWlmICh3cml0YWJsZSkKJiM0MzsJCWVudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkocGFnZV90b19wZm4ocGFnZSkpOwomIzQzOwllbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSkKJiM0MzsJCWVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KAomIzQzOwkJCQkJCXBhZ2VfdG9fcGZuKHBhZ2UpKTsKJiM0MzsJZWxzZQomIzQzOwkJZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShwYWdlX3RvX3BmbihwYWdlKSk7CiYjNDM7CiYjNDM7CWlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHsKJiM0MzsJCWlmIChwdGVfeW91bmcocHRldmFsKSkKJiM0MzsJCQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X3lvdW5nKGVudHJ5KTsKJiM0MzsJCWlmIChwdGVfZGlydHkocHRldmFsKSkKJiM0MzsJCQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTsKJiM0MzsJCXN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTsKJiM0MzsJCWlmIChwdGVfc29mdF9kaXJ0eShwdGV2YWwpKQomIzQzOwkJCXN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTsKJiM0MzsJCWlmIChwdGVfdWZmZChwdGV2YWwpKQomIzQzOwkJCXN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTsKJiM0MzsJCWlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSkKJiM0MzsJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7CiYjNDM7CQlpZiAocHRlX3N3cF91ZmZkKHB0ZXZhbCkpCiYjNDM7CQkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBzd3BfcHRlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlcGxhY2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBtYXBwaW5nIGZvciBmb2xpbyB3aXRoIG1pZ3JhdGlvbiBlbnRyaWVzLgomIzQzOyAqCiYjNDM7ICogQGFyZzogZW51bSB0dHVfZmxhZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBhcmd1bWVudC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLAomIzQzOwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpOwomIzQzOwlERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgZm9saW8sIHZtYSwgYWRkcmVzcywgMCk7CiYjNDM7CWVudW0gdHR1X2ZsYWdzIGZsYWdzID0gKGVudW0gdHR1X2ZsYWdzKShsb25nKWFyZzsKJiM0MzsJYm9vbCBhbm9uX2V4Y2x1c2l2ZSwgd3JpdGFibGUsIHJldCA9IHRydWU7CiYjNDM7CWJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7CiYjNDM7CXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKJiM0MzsJc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm47CiYjNDM7CXN0cnVjdCBwYWdlICpwYWdlOwomIzQzOwlwdGVfdCBwdGV2YWw7CiYjNDM7CiYjNDM7CXJhbmdlLmVuZCA9IHZtYV9hZGRyZXNzX2VuZCgmYW1wO3B2bXcpOwomIzQzOwltbXVfbm90aWZpZXJfcmFuZ2VfaW5pdCgmYW1wO3JhbmdlLCBNTVVfTk9USUZZX0NMRUFSLCAwLCB2bWEtJmd0O3ZtX21tLAomIzQzOwkJCQlhZGRyZXNzLCByYW5nZS5lbmQpOwomIzQzOwkvKiBJZiBzaGFyaW5nIGlzIHBvc3NpYmxlLCBzdGFydCBhbmQgZW5kIHdpbGwgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuICovCiYjNDM7CWFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsICZhbXA7cmFuZ2Uuc3RhcnQsICZhbXA7cmFuZ2UuZW5kKTsKJiM0MzsJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoJmFtcDtyYW5nZSk7CiYjNDM7CiYjNDM7CWlmIChwYWdlX3ZtYV9tYXBwZWRfd2FsaygmYW1wO3B2bXcpKSB7CiYjNDM7CQlhZGRyZXNzID0gcHZtdy5hZGRyZXNzOwomIzQzOwkJcHRldmFsID0gaHVnZV9wdGVwX2dldChtbSwgYWRkcmVzcywgcHZtdy5wdGUpOwomIzQzOwkJaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkKJiM0MzsJCQlwZm4gPSBwdGVfcGZuKHB0ZXZhbCk7CiYjNDM7CQllbHNlCiYjNDM7CQkJcGZuID0gc29mdGxlYWZfdG9fcGZuKHNvZnRsZWFmX2Zyb21fcHRlKHB0ZXZhbCkpOwomIzQzOwomIzQzOwkJcGFnZSA9IGZvbGlvX3BhZ2UoZm9saW8sIHBmbiAtIGZvbGlvX3Bmbihmb2xpbykpOwomIzQzOwkJYW5vbl9leGNsdXNpdmUgPSBhbm9uICZhbXA7JmFtcDsgUGFnZUFub25FeGNsdXNpdmUocGFnZSk7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogaHVnZV9wbWRfdW5zaGFyZSBtYXkgdW5tYXAgYW4gZW50aXJlIFBNRCBwYWdlLiBUaGVyZSBpcyBubwomIzQzOwkJICogd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heSBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sCiYjNDM7CQkgKiBzbyB3ZSBtdXN0IGZsdXNoIHRoZW0gYWxsLiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkCiYjNDM7CQkgKiBhYm92ZSB0byBjb3ZlciB0aGlzIHJhbmdlLgomIzQzOwkJICovCiYjNDM7CQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRvIGNhbGwgaHVnZV9wbWRfdW5zaGFyZSwgaV9tbWFwX3J3c2VtIG11c3QgYmUgaGVsZCBpbiB3cml0ZQomIzQzOwkJICogbW9kZS4gQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkgZG8gdGhpcyBvdXRzaWRlIHJtYXAKJiM0MzsJCSAqIHJvdXRpbmVzLiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuCiYjNDM7CQkgKiBMb2NrIG9yZGVyIGRpY3RhdGVzIGFjcXVpcmluZyB2bWFfbG9jayBCRUZPUkUgaV9tbWFwX3J3c2VtLgomIzQzOwkJICogV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmQgZmFpbCBpZiB1bnN1Y2Nlc3NmdWwuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghYW5vbikgewomIzQzOwkJCXN0cnVjdCBtbXVfZ2F0aGVyIHRsYjsKJiM0MzsKJiM0MzsJCQlWTV9XQVJOX09OX09OQ0UoIShmbGFncyAmYW1wOyBUVFVfUk1BUF9MT0NLRUQpKTsKJiM0MzsJCQlpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSkgewomIzQzOwkJCQlyZXQgPSBmYWxzZTsKJiM0MzsJCQkJZ290byB3YWxrX2RvbmU7CiYjNDM7CQkJfQomIzQzOwomIzQzOwkJCXRsYl9nYXRoZXJfbW11X3ZtYSgmYW1wO3RsYiwgdm1hKTsKJiM0MzsJCQlpZiAoaHVnZV9wbWRfdW5zaGFyZSgmYW1wO3RsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHsKJiM0MzsJCQkJaHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7CiYjNDM7CQkJCWh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goJmFtcDt0bGIsIHZtYSk7CiYjNDM7CQkJCXRsYl9maW5pc2hfbW11KCZhbXA7dGxiKTsKJiM0MzsJCQkJLyoKJiM0MzsJCQkJICogVGhlIFBNRCB0YWJsZSB3YXMgdW5tYXBwZWQsCiYjNDM7CQkJCSAqIGNvbnNlcXVlbnRseSB1bm1hcHBpbmcgdGhlIGZvbGlvLgomIzQzOwkJCQkgKi8KJiM0MzsJCQkJZ290byB3YWxrX2RvbmU7CiYjNDM7CQkJfQomIzQzOwkJCWh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpOwomIzQzOwkJCXRsYl9maW5pc2hfbW11KCZhbXA7dGxiKTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qIE51a2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBlbnRyeSAqLwomIzQzOwkJcHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpOwomIzQzOwkJaWYgKGh1Z2VfcHRlX2RpcnR5KHB0ZXZhbCkpCiYjNDM7CQkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7CiYjNDM7CQl3cml0YWJsZSA9IHB0ZV93cml0ZShwdGV2YWwpOwomIzQzOwomIzQzOwkJVk1fV0FSTl9PTl9GT0xJTyh3cml0YWJsZSAmYW1wOyZhbXA7IGFub24gJmFtcDsmYW1wOyAhYW5vbl9leGNsdXNpdmUsIGZvbGlvKTsKJiM0MzsKJiM0MzsJCWlmIChQYWdlSFdQb2lzb24ocGFnZSkpIHsKJiM0MzsJCQlwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpOwomIzQzOwkJCWh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pOwomIzQzOwkJCXNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgaHN6KTsKJiM0MzsJCX0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpICZhbXA7JmFtcDsgcHRlX3VudXNlZChwdGV2YWwpICZhbXA7JmFtcDsKJiM0MzsJCQkgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkgewomIzQzOwkJCS8qCiYjNDM7CQkJICogVGhlIGd1ZXN0IGluZGljYXRlZCB0aGF0IHRoZSBwYWdlIGNvbnRlbnQgaXMgb2Ygbm8KJiM0MzsJCQkgKiBpbnRlcmVzdCBhbnltb3JlLiBTaW1wbHkgZGlzY2FyZCB0aGUgcHRlLCB2bXNjYW4KJiM0MzsJCQkgKiB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdC4KJiM0MzsJCQkgKi8KJiM0MzsJCQlkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpOwomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQlwdGVfdCBzd3BfcHRlOwomIzQzOwomIzQzOwkJCS8qCiYjNDM7CQkJICogYXJjaF91bm1hcF9vbmUoKSBpcyBleHBlY3RlZCB0byBiZSBhIE5PUCBvbgomIzQzOwkJCSAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgd2UgY291bGQgaGF2ZSBQRk4gc3dhcCBQVEVzLAomIzQzOwkJCSAqIHNvIHdlJiMzOTtsbCBub3QgY2hlY2svY2FyZS4KJiM0MzsJCQkgKi8KJiM0MzsJCQlpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSAmbHQ7IDApIHsKJiM0MzsJCQkJc2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwKJiM0MzsJCQkJCQlwdGV2YWwsIGhzeik7CiYjNDM7CQkJCXJldCA9IGZhbHNlOwomIzQzOwkJCQlnb3RvIHdhbGtfZG9uZTsKJiM0MzsJCQl9CiYjNDM7CiYjNDM7CQkJLyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKCk6IGNsZWFyIFBURSBmaXJzdC4gKi8KJiM0MzsJCQlpZiAoYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwomIzQzOwkJCSAgICBodWdldGxiX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8pKSB7CiYjNDM7CQkJCXNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsCiYjNDM7CQkJCQkJcHRldmFsLCBoc3opOwomIzQzOwkJCQlyZXQgPSBmYWxzZTsKJiM0MzsJCQkJZ290byB3YWxrX2RvbmU7CiYjNDM7CQkJfQomIzQzOwomIzQzOwkJCS8qCiYjNDM7CQkJICogU3RvcmUgdGhlIHBmbiBvZiB0aGUgcGFnZSBpbiBhIHNwZWNpYWwgbWlncmF0aW9uCiYjNDM7CQkJICogcHRlLiBkb19zd2FwX3BhZ2UoKSB3aWxsIHdhaXQgdW50aWwgdGhlIG1pZ3JhdGlvbgomIzQzOwkJCSAqIHB0ZSBpcyByZW1vdmVkIGFuZCB0aGVuIHJlc3RhcnQgZmF1bHQgaGFuZGxpbmcuCiYjNDM7CQkJICovCiYjNDM7CQkJc3dwX3B0ZSA9IG1ha2VfbWlncmF0aW9uX3N3cF9wdGUocGFnZSwgcHRldmFsLAomIzQzOwkJCQkJCQkgd3JpdGFibGUsIGFub25fZXhjbHVzaXZlKTsKJiM0MzsJCQlzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlLCBoc3opOwomIzQzOwkJCXRyYWNlX3NldF9taWdyYXRpb25fcHRlKGFkZHJlc3MsIHB0ZV92YWwoc3dwX3B0ZSksCiYjNDM7CQkJCQkJZm9saW9fb3JkZXIoZm9saW8pKTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pOwomIzQzOwkJaWYgKHZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fTE9DS0VEKQomIzQzOwkJCW1sb2NrX2RyYWluX2xvY2FsKCk7CiYjNDM7CQlmb2xpb19wdXQoZm9saW8pOwomIzQzO3dhbGtfZG9uZToKJiM0MzsJCXBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoJmFtcDtwdm13KTsKJiM0MzsJfQomIzQzOwomIzQzOwltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9lbmQoJmFtcDtyYW5nZSk7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsIHB0ZV90IHB0ZSwKJiM0MzsJCXN0cnVjdCBwYWdlICpzdWJwYWdlLCBib29sIGFub25fZXhjbHVzaXZlKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBlbmRfYWRkciwgYWRkciA9IHB2bXctJmd0O2FkZHJlc3M7CiYjNDM7CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gcHZtdy0mZ3Q7dm1hOwomIzQzOwl1bnNpZ25lZCBpbnQgbWF4X25yLCBuciwgaTsKJiM0MzsKJiM0MzsjaWZkZWYgX19IQVZFX0FSQ0hfVU5NQVBfT05FCiYjNDM7CS8qIENhbm5vdCBiYXRjaCB1bm1hcCBpZiBhcmNoX3VubWFwX29uZSgpIGlzIGRlZmluZWQuICovCiYjNDM7CXJldHVybiAxOwomIzQzOyNlbmRpZgomIzQzOwomIzQzOwlpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKQomIzQzOwkJcmV0dXJuIDE7CiYjNDM7CWlmIChmb2xpb19pc196b25lX2RldmljZShmb2xpbykgfHwgZm9saW9fdGVzdF9oYXNfaHdwb2lzb25lZChmb2xpbykpCiYjNDM7CQlyZXR1cm4gMTsKJiM0MzsJaWYgKHB0ZV91bnVzZWQocHRlKSkKJiM0MzsJCXJldHVybiAxOwomIzQzOwomIzQzOwkvKiBXZSBtYXkgb25seSBiYXRjaCB3aXRoaW4gYSBzaW5nbGUgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLiAqLwomIzQzOwllbmRfYWRkciA9IHBtZF9hZGRyX2VuZChhZGRyLCB2bWEtJmd0O3ZtX2VuZCk7CiYjNDM7CW1heF9uciA9IChlbmRfYWRkciAtIGFkZHIpICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CS8qCiYjNDM7CSAqIElmIHVubWFwIGZhaWxzLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHB0ZXMuIFRvIGF2b2lkIGFjY2lkZW50YWxseQomIzQzOwkgKiB1cGdyYWRpbmcgd3JpdGUgcGVybWlzc2lvbnMgZm9yIHB0ZXMgdGhhdCB3ZXJlIG5vdCBvcmlnaW5hbGx5IHdyaXRhYmxlLAomIzQzOwkgKiBhbmQgdG8gYXZvaWQgbG9zaW5nIHRoZSBzb2Z0LWRpcnR5IGJpdCwgdXNlIHRoZSBhcHByb3ByaWF0ZSBGUEIgZmxhZ3MuCiYjNDM7CSAqLwomIzQzOwluciA9IGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdm13LSZndDtwdGUsICZhbXA7cHRlLCBtYXhfbnIsCiYjNDM7CQkJCSAgIEZQQl9SRVNQRUNUX1dSSVRFIHwgRlBCX1JFU1BFQ1RfU09GVF9ESVJUWSk7CiYjNDM7CiYjNDM7CS8qIExpbWl0IHBvc3NpYmxlIGJhdGNoIGNvdW50IHRvIGEgdW5pZm9ybSBQYWdlQW5vbkV4Y2x1c2l2ZSB2YWx1ZSAqLwomIzQzOwlpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkgewomIzQzOwkJZm9yIChpID0gMTsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlpZiAoUGFnZUFub25FeGNsdXNpdmUoc3VicGFnZSAmIzQzOyBpKSAhPSBhbm9uX2V4Y2x1c2l2ZSkKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQluciA9IGk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIG5yOwomIzQzO30KJiM0MzsKIC8qCiAgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50LgogICoKQEAgLTI0MjEsOCAmIzQzOzI2NDQsNyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJc3RydWN0IHBhZ2UgKnN1YnBhZ2U7CiAJc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTsKIAllbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7Ci0JdW5zaWduZWQgbG9uZyBwZm47Ci0JdW5zaWduZWQgbG9uZyBoc3ogPSAwOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbiwgZW5kX2FkZHIsIG5yX3BhZ2VzOwogCiAJLyoKIAkgKiBXaGVuIHJhY2luZyBhZ2FpbnN0IGUuZy4gemFwX3B0ZV9yYW5nZSgpIG9uIGFub3RoZXIgY3B1LApAQCAtMjQzNSwyNiAmIzQzOzI2NTcsMTMgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCiAJLyoKIAkgKiBGb3IgVEhQLCB3ZSBoYXZlIHRvIGFzc3VtZSB0aGUgd29yc2UgY2FzZSBpZSBwbWQgZm9yIGludmFsaWRhdGlvbi4KLQkgKiBGb3IgaHVnZXRsYiwgaXQgY291bGQgYmUgbXVjaCB3b3JzZSBpZiB3ZSBuZWVkIHRvIGRvIHB1ZAotCSAqIGludmFsaWRhdGlvbiBpbiB0aGUgY2FzZSBvZiBwbWQgc2hhcmluZy4KIAkgKgogCSAqIE5vdGUgdGhhdCB0aGUgcGFnZSBjYW4gbm90IGJlIGZyZWUgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mCi0JICogdHJ5X3RvX3VubWFwKCkgbXVzdCBob2xkIGEgcmVmZXJlbmNlIG9uIHRoZSBwYWdlLgomIzQzOwkgKiB0cnlfdG9fbWlncmF0ZSgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS4KIAkgKi8KIAlyYW5nZS5lbmQgPSB2bWFfYWRkcmVzc19lbmQoJmFtcDtwdm13KTsKIAltbXVfbm90aWZpZXJfcmFuZ2VfaW5pdCgmYW1wO3JhbmdlLCBNTVVfTk9USUZZX0NMRUFSLCAwLCB2bWEtJmd0O3ZtX21tLAogCQkJCWFkZHJlc3MsIHJhbmdlLmVuZCk7Ci0JaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHsKLQkJLyoKLQkJICogSWYgc2hhcmluZyBpcyBwb3NzaWJsZSwgc3RhcnQgYW5kIGVuZCB3aWxsIGJlIGFkanVzdGVkCi0JCSAqIGFjY29yZGluZ2x5LgotCQkgKi8KLQkJYWRqdXN0X3JhbmdlX2lmX3BtZF9zaGFyaW5nX3Bvc3NpYmxlKHZtYSwgJmFtcDtyYW5nZS5zdGFydCwKLQkJCQkJCSAgICAgJmFtcDtyYW5nZS5lbmQpOwotCi0JCS8qIFdlIG5lZWQgdGhlIGh1Z2UgcGFnZSBzaXplIGZvciBzZXRfaHVnZV9wdGVfYXQoKSAqLwotCQloc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpOwotCX0KIAltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydCgmYW1wO3JhbmdlKTsKIAogCXdoaWxlIChwYWdlX3ZtYV9tYXBwZWRfd2FsaygmYW1wO3B2bXcpKSB7CkBAIC0yNDg4LDExICYjNDM7MjY5Nyw4IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCVZNX0JVR19PTl9GT0xJTyhmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pIHx8CiAJCQkJCSFmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbyksIGZvbGlvKTsKIAotCQkJaWYgKHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KCZhbXA7cHZtdywgc3VicGFnZSkpIHsKLQkJCQlyZXQgPSBmYWxzZTsKLQkJCQlwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKCZhbXA7cHZtdyk7Ci0JCQkJYnJlYWs7Ci0JCQl9CiYjNDM7CQkJaWYgKHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KCZhbXA7cHZtdywgc3VicGFnZSkpCiYjNDM7CQkJCWdvdG8gd2Fsa19hYm9ydDsKIAkJCWNvbnRpbnVlOwogI2VuZGlmCiAJCX0KQEAgLTI1MDEsMTAgJiM0MzsyNzA3LDcgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQlWTV9CVUdfT05fRk9MSU8oIXB2bXcucHRlLCBmb2xpbyk7CiAKIAkJYWRkcmVzcyA9IHB2bXcuYWRkcmVzczsKLQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpCi0JCQlwdGV2YWwgPSBodWdlX3B0ZXBfZ2V0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSk7Ci0JCWVsc2UKLQkJCXB0ZXZhbCA9IHB0ZXBfZ2V0KHB2bXcucHRlKTsKJiM0MzsJCXB0ZXZhbCA9IHB0ZXBfZ2V0KHB2bXcucHRlKTsKIAkJaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkgewogCQkJcGZuID0gcHRlX3BmbihwdGV2YWwpOwogCQl9IGVsc2UgewpAQCAtMjUxNSw2OCAmIzQzOzI3MTgsMjIgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJY29uc3Qgc29mdGxlYWZfdCBlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKHB0ZXZhbCk7CiAKIAkJCXBmbiA9IHNvZnRsZWFmX3RvX3BmbihlbnRyeSk7Ci0JCQlWTV9XQVJOX09OX0ZPTElPKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbyksIGZvbGlvKTsKIAkJfQogCiAJCXN1YnBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTsKIAkJYW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsKIAkJCQkgUGFnZUFub25FeGNsdXNpdmUoc3VicGFnZSk7CiAKLQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHsKLQkJCWJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7Ci0KLQkJCS8qCi0JCQkgKiBodWdlX3BtZF91bnNoYXJlIG1heSB1bm1hcCBhbiBlbnRpcmUgUE1EIHBhZ2UuCi0JCQkgKiBUaGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5Ci0JCQkgKiBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sIHNvIHdlIG11c3QgZmx1c2ggdGhlbSBhbGwuCi0JCQkgKiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkIGFib3ZlIHRvIGNvdmVyIHRoaXMKLQkJCSAqIHJhbmdlLgotCQkJICovCi0JCQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpOwotCi0JCQkvKgotCQkJICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZQotCQkJICogaGVsZCBpbiB3cml0ZSBtb2RlLiAgQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkKLQkJCSAqIGRvIHRoaXMgb3V0c2lkZSBybWFwIHJvdXRpbmVzLgotCQkJICoKLQkJCSAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS4KLQkJCSAqIExvY2sgb3JkZXIgZGljdGF0ZXMgYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRQotCQkJICogaV9tbWFwX3J3c2VtLiAgV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmQKLQkJCSAqIGZhaWwgaWYgdW5zdWNjZXNzZnVsLgotCQkJICovCi0JCQlpZiAoIWFub24pIHsKLQkJCQlzdHJ1Y3QgbW11X2dhdGhlciB0bGI7CiYjNDM7CQlucl9wYWdlcyA9IDE7CiYjNDM7CQlpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7CiYjNDM7CQkJbnJfcGFnZXMgPSBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaChmb2xpbywgJmFtcDtwdm13LCBwdGV2YWwsCiYjNDM7CQkJCQkJCSAgIHN1YnBhZ2UsIGFub25fZXhjbHVzaXZlKTsKIAotCQkJCVZNX0JVR19PTighKGZsYWdzICZhbXA7IFRUVV9STUFQX0xPQ0tFRCkpOwotCQkJCWlmICghaHVnZXRsYl92bWFfdHJ5bG9ja193cml0ZSh2bWEpKSB7Ci0JCQkJCXBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoJmFtcDtwdm13KTsKLQkJCQkJcmV0ID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KJiM0MzsJCQllbmRfYWRkciA9IGFkZHJlc3MgJiM0MzsgbnJfcGFnZXMgKiBQQUdFX1NJWkU7CiYjNDM7CQkJZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBhZGRyZXNzLCBlbmRfYWRkcik7CiAKLQkJCQl0bGJfZ2F0aGVyX21tdV92bWEoJmFtcDt0bGIsIHZtYSk7Ci0JCQkJaWYgKGh1Z2VfcG1kX3Vuc2hhcmUoJmFtcDt0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7Ci0JCQkJCWh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpOwotCQkJCQlodWdlX3BtZF91bnNoYXJlX2ZsdXNoKCZhbXA7dGxiLCB2bWEpOwotCQkJCQl0bGJfZmluaXNoX21tdSgmYW1wO3RsYik7Ci0JCQkJCS8qCi0JCQkJCSAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLAotCQkJCQkgKiBjb25zZXF1ZW50bHkgdW5tYXBwaW5nIHRoZSBmb2xpby4KLQkJCQkJICovCi0JCQkJCXBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoJmFtcDtwdm13KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpOwotCQkJCXRsYl9maW5pc2hfbW11KCZhbXA7dGxiKTsKLQkJCX0KLQkJCS8qIE51a2UgdGhlIGh1Z2V0bGIgcGFnZSB0YWJsZSBlbnRyeSAqLwotCQkJcHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpOwotCQkJaWYgKHB0ZV9kaXJ0eShwdGV2YWwpKQotCQkJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwotCQkJd3JpdGFibGUgPSBwdGVfd3JpdGUocHRldmFsKTsKLQkJfSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHsKLQkJCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLCBhZGRyZXNzLCBwZm4pOwotCQkJLyogTnVrZSB0aGUgcGFnZSB0YWJsZSBlbnRyeS4gKi8KJiM0MzsJCQkvKiBOdWtlIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuICovCiYjNDM7CQkJcHRldmFsID0gZ2V0X2FuZF9jbGVhcl9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgbnJfcGFnZXMpOwogCQkJaWYgKHNob3VsZF9kZWZlcl9mbHVzaChtbSwgZmxhZ3MpKSB7CiAJCQkJLyoKIAkJCQkgKiBXZSBjbGVhciB0aGUgUFRFIGJ1dCBkbyBub3QgZmx1c2ggc28gcG90ZW50aWFsbHkKQEAgLTI1ODYsMTEgJiM0MzsyNzQzLDkgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCSAqIHRyYW5zaXRpb24gb24gYSBjYWNoZWQgVExCIGVudHJ5IGlzIHdyaXR0ZW4gdGhyb3VnaAogCQkJCSAqIGFuZCB0cmFwcyBpZiB0aGUgUFRFIGlzIHVubWFwcGVkLgogCQkJCSAqLwotCQkJCXB0ZXZhbCA9IHB0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgYWRkcmVzcywgcHZtdy5wdGUpOwotCi0JCQkJc2V0X3RsYl91YmNfZmx1c2hfcGVuZGluZyhtbSwgcHRldmFsLCBhZGRyZXNzLCBhZGRyZXNzICYjNDM7IFBBR0VfU0laRSk7CiYjNDM7CQkJCXNldF90bGJfdWJjX2ZsdXNoX3BlbmRpbmcobW0sIHB0ZXZhbCwgYWRkcmVzcywgZW5kX2FkZHIpOwogCQkJfSBlbHNlIHsKLQkJCQlwdGV2YWwgPSBwdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpOwomIzQzOwkJCQlmbHVzaF90bGJfcmFuZ2Uodm1hLCBhZGRyZXNzLCBlbmRfYWRkcik7CiAJCQl9CiAJCQlpZiAocHRlX2RpcnR5KHB0ZXZhbCkpCiAJCQkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7CkBAIC0yNjEzLDE0ICYjNDM7Mjc2OCw4IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCVZNX1dBUk5fT05fRk9MSU8oZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pLCBmb2xpbyk7CiAKIAkJCXB0ZXZhbCA9IHN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShzdWJwYWdlKSk7Ci0JCQlpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkgewotCQkJCWh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pOwotCQkJCXNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwKLQkJCQkJCWhzeik7Ci0JCQl9IGVsc2UgewotCQkJCWRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7Ci0JCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7Ci0JCQl9CiYjNDM7CQkJZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTsKJiM0MzsJCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTsKIAkJfSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgJmFtcDsmYW1wOyBwdGVfdW51c2VkKHB0ZXZhbCkgJmFtcDsmYW1wOwogCQkJICAgIXVzZXJmYXVsdGZkX2FybWVkKHZtYSkpIHsKIAkJCS8qCkBAIC0yNjM1LDggJiM0MzsyNzg0LDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJICovCiAJCQlkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpOwogCQl9IGVsc2UgewotCQkJc3dwX2VudHJ5X3QgZW50cnk7CiAJCQlwdGVfdCBzd3BfcHRlOwomIzQzOwkJCXVuc2lnbmVkIGludCBpOwogCiAJCQkvKgogCQkJICogYXJjaF91bm1hcF9vbmUoKSBpcyBleHBlY3RlZCB0byBiZSBhIE5PUCBvbgpAQCAtMjY0NCwzMiAmIzQzOzI3OTMsMTUgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJICogc28gd2UmIzM5O2xsIG5vdCBjaGVjay9jYXJlLgogCQkJICovCiAJCQlpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSAmbHQ7IDApIHsKLQkJCQlpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkKLQkJCQkJc2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwKLQkJCQkJCQlwdGV2YWwsIGhzeik7Ci0JCQkJZWxzZQotCQkJCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTsKLQkJCQlyZXQgPSBmYWxzZTsKLQkJCQlwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKCZhbXA7cHZtdyk7Ci0JCQkJYnJlYWs7CiYjNDM7CQkJCXNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7CiYjNDM7CQkJCWdvdG8gd2Fsa19hYm9ydDsKIAkJCX0KIAotCQkJLyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKCk6IGNsZWFyIFBURSBmaXJzdC4gKi8KLQkJCWlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7Ci0JCQkJaWYgKGFub25fZXhjbHVzaXZlICZhbXA7JmFtcDsKLQkJCQkgICAgaHVnZXRsYl90cnlfc2hhcmVfYW5vbl9ybWFwKGZvbGlvKSkgewotCQkJCQlzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLAotCQkJCQkJCXB0ZXZhbCwgaHN6KTsKLQkJCQkJcmV0ID0gZmFsc2U7Ci0JCQkJCXBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoJmFtcDtwdm13KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSAmYW1wOyZhbXA7Ci0JCQkJICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoZm9saW8sIHN1YnBhZ2UpKSB7Ci0JCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7Ci0JCQkJcmV0ID0gZmFsc2U7Ci0JCQkJcGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZSgmYW1wO3B2bXcpOwotCQkJCWJyZWFrOwomIzQzOwkJCS8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoKTogY2xlYXIgUFRFIGZpcnN0LiAqLwomIzQzOwkJCWlmIChhbm9uX2V4Y2x1c2l2ZSAmYW1wOyZhbXA7CiYjNDM7CQkJICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhmb2xpbywgc3VicGFnZSwgbnJfcGFnZXMpKSB7CiYjNDM7CQkJCXNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7CiYjNDM7CQkJCWdvdG8gd2Fsa19hYm9ydDsKIAkJCX0KIAogCQkJLyoKQEAgLTI2NzcsNTIgJiM0MzsyODA5LDQwIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCSAqIHB0ZS4gZG9fc3dhcF9wYWdlKCkgd2lsbCB3YWl0IHVudGlsIHRoZSBtaWdyYXRpb24KIAkJCSAqIHB0ZSBpcyByZW1vdmVkIGFuZCB0aGVuIHJlc3RhcnQgZmF1bHQgaGFuZGxpbmcuCiAJCQkgKi8KLQkJCWlmICh3cml0YWJsZSkKLQkJCQllbnRyeSA9IG1ha2Vfd3JpdGFibGVfbWlncmF0aW9uX2VudHJ5KAotCQkJCQkJCXBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTsKLQkJCWVsc2UgaWYgKGFub25fZXhjbHVzaXZlKQotCQkJCWVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KAotCQkJCQkJCXBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTsKLQkJCWVsc2UKLQkJCQllbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KAotCQkJCQkJCXBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTsKLQkJCWlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHsKLQkJCQlpZiAocHRlX3lvdW5nKHB0ZXZhbCkpCi0JCQkJCWVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoZW50cnkpOwotCQkJCWlmIChwdGVfZGlydHkocHRldmFsKSkKLQkJCQkJZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShlbnRyeSk7Ci0JCQkJc3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpOwotCQkJCWlmIChwdGVfc29mdF9kaXJ0eShwdGV2YWwpKQotCQkJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7Ci0JCQkJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpCi0JCQkJCXN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpOwotCQkJCWlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSkKLQkJCQkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpOwotCQkJCWlmIChwdGVfc3dwX3VmZmQocHRldmFsKSkKLQkJCQkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpOwotCQkJfQotCQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpCi0JCQkJc2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSwKLQkJCQkJCWhzeik7Ci0JCQllbHNlCi0JCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHN3cF9wdGUpOwomIzQzOwkJCXN3cF9wdGUgPSBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKHN1YnBhZ2UsIHB0ZXZhbCwKJiM0MzsJCQkJCQkJIHdyaXRhYmxlLCBhbm9uX2V4Y2x1c2l2ZSk7CiAJCQl0cmFjZV9zZXRfbWlncmF0aW9uX3B0ZShhZGRyZXNzLCBwdGVfdmFsKHN3cF9wdGUpLAogCQkJCQkJZm9saW9fb3JkZXIoZm9saW8pKTsKJiM0MzsKJiM0MzsJCQkvKiBTZXQgbnJfcGFnZXMgbWlncmF0aW9uIGVudHJpZXMsIGFkdmFuY2luZyB0aGUgUEZOLiAqLwomIzQzOwkJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcyAmIzQzOyAodW5zaWduZWQgbG9uZylpICogUEFHRV9TSVpFLAomIzQzOwkJCQkJICAgcHZtdy5wdGUgJiM0MzsgaSwgc3dwX3B0ZSk7CiYjNDM7CQkJCXN3cF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHN3cF9wdGUpOwomIzQzOwkJCX0KIAkJCS8qCiAJCQkgKiBObyBuZWVkIHRvIGludmFsaWRhdGUgaGVyZSBpdCB3aWxsIHN5bmNocm9uaXplIG9uCiAJCQkgKiBhZ2FpbnN0IHRoZSBzcGVjaWFsIHN3YXAgbWlncmF0aW9uIHB0ZS4KIAkJCSAqLwogCQl9CiAKLQkJaWYgKHVubGlrZWx5KGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpKQotCQkJaHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7Ci0JCWVsc2UKLQkJCWZvbGlvX3JlbW92ZV9ybWFwX3B0ZShmb2xpbywgc3VicGFnZSwgdm1hKTsKJiM0MzsJCWZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpOwogCQlpZiAodm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9MT0NLRUQpCiAJCQltbG9ja19kcmFpbl9sb2NhbCgpOwotCQlmb2xpb19wdXQoZm9saW8pOwomIzQzOwkJZm9saW9fcHV0X3JlZnMoZm9saW8sIG5yX3BhZ2VzKTsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBJZiB3ZSBiYXRjaGVkIHRoZSBlbnRpcmUgZm9saW8sIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0bwomIzQzOwkJICogd2Fsazsgc3RvcCByaWdodCBoZXJlLgomIzQzOwkJICovCiYjNDM7CQlpZiAobnJfcGFnZXMgPT0gZm9saW9fbnJfcGFnZXMoZm9saW8pKQomIzQzOwkJCWdvdG8gd2Fsa19kb25lOwomIzQzOwkJY29udGludWU7CiYjNDM7d2Fsa19hYm9ydDoKJiM0MzsJCXJldCA9IGZhbHNlOwomIzQzO3dhbGtfZG9uZToKJiM0MzsJCXBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoJmFtcDtwdm13KTsKJiM0MzsJCWJyZWFrOwogCX0KIAogCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZCgmYW1wO3JhbmdlKTsKQEAgLTI3NDEsNyAmIzQzOzI4NjEsOCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiB2b2lkIHRyeV90b19taWdyYXRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIGVudW0gdHR1X2ZsYWdzIGZsYWdzKQogewogCXN0cnVjdCBybWFwX3dhbGtfY29udHJvbCByd2MgPSB7Ci0JCS5ybWFwX29uZSA9IHRyeV90b19taWdyYXRlX29uZSwKJiM0MzsJCS5ybWFwX29uZSA9IGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgPwomIzQzOwkJCQl0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZSA6IHRyeV90b19taWdyYXRlX29uZSwKIAkJLmFyZyA9ICh2b2lkICopZmxhZ3MsCiAJCS5kb25lID0gZm9saW9fbm90X21hcHBlZCwKIAkJLmFub25fbG9jayA9IGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCwKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTIgMTM6MTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQzMDAKCQkJCQkJCW91dHB1dDogOTkKCQkJCQkJCXRob3VnaHRzOiAyOTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgZ290IHRoaXMgcGF0Y2ggaW4gZnJvbnQgb2YgbWUsIGFuZCBpdCBsb29rcyBsaWtlIGEgZmFpcmx5IHNpZ25pZmljYW50IGNoYW5nZSB0byB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLCBmb2N1c2luZyBvbiBgcm1hcC5jYCBhbmQgYG1pZ3JhdGUuY2AuIFNwZWNpZmljYWxseSwgaXQmIzM5O3MgaW50cm9kdWNpbmcgc29tZSBiYXRjaGluZyBmb3IgbWlncmF0aW9uIFBURXMg4oCTIGBtaWdyYXRpb25fcHRlX2JhdGNoYCwgYGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlc2AsIGFuZCBgZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2hgIGFyZSB0aGUga2V5IHBsYXllcnMgaGVyZS4gSXQmIzM5O3MgcmVmYWN0b3JpbmcgYHRyeV90b19taWdyYXRlX29uZWAgdG8gdXNlIHRoaXMgYmF0Y2hpbmcgYXBwcm9hY2gsIGFuZCBldmVuIHB1bGxpbmcgb3V0IGEgZGVkaWNhdGVkIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAgZnVuY3Rpb24gZm9yIEh1Z2V0bGIgZm9saW9zLiBJdCYjMzk7cyBhbHNvIHRvdWNoaW5nIGByZW1vdmVfbWlncmF0aW9uX3B0ZWAgd2l0aCBiYXRjaGluZyBpbiBtaW5kLgoKR2l2ZW4gdGhhdCB0aGlzIGlzIHRvdWNoaW5nIGZ1bmRhbWVudGFsIG1lbW9yeSBtYW5hZ2VtZW50IC0gbWlncmF0aW9uIGFuZCB0aGUgcm1hcCBtZWNoYW5pc20gLSB0aGlzIGlzIGFic29sdXRlbHkgc29tZXRoaW5nIHRoYXQgZGVtYW5kcyB0aG9yb3VnaCBmdXp6aW5nLiBXZSBuZWVkIHRvIGJlIGNvbmZpZGVudCBpbiBpdHMgY29ycmVjdG5lc3MsIGVzcGVjaWFsbHkgYXJvdW5kIFBURSBoYW5kbGluZy4KCkFscmlnaHQsIHRpbWUgdG8gZ2V0IHNwZWNpZmljLiBJIG5lZWQgdG8gbmFpbCBkb3duIHRoZSBhZmZlY3RlZCBjb2RlIGFuZCB3aGF0IHRoZSBrZXkgZnVuY3Rpb25hbCBhcmVhcyBhcmUuIExldCBtZSBsaXN0IHRoZSBwcmltYXJ5IGZ1bmN0aW9ucyBJIG5lZWQgdG8gZm9jdXMgb24gZHVyaW5nIGZ1enppbmc6CgoqICAgYG1pZ3JhdGlvbl9wdGVfYmF0Y2hgCiogICBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVgCiogICBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYmAKKiAgIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAKKiAgIGB0cnlfdG9fbWlncmF0ZV9vbmVgCiogICBgZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2hgCiogICBgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzYAoqICAgYG1ha2VfbWlncmF0aW9uX3N3cF9wdGVgCgpPa2F5LCBub3cgbGV0JiMzOTtzIHVzZSBgZGVmYXVsdF9hcGk6Z3JlcHBlcmAgdG8gbG9jYXRlIHRoZXNlIGZ1bmN0aW9ucyBhbmQgdW5kZXJzdGFuZCB0aGVpciBjb250ZXh0IHdpdGhpbiB0aGUgY29kZS4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayBib3RoIGBtbS9taWdyYXRlLmNgIGFuZCBgbW0vcm1hcC5jYCB0byBwaW5wb2ludCB3aGVyZSB0aGVzZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGltcGxlbWVudGVkLiBUaGF0IHNob3VsZCBnaXZlIG1lIGEgZ29vZCBoYW5kbGUgb24gd2hlcmUgdG8gZm9jdXMgbXkgYW5hbHlzaXMgYW5kIGZ1enppbmcgZWZmb3J0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKHN0YXRpY3x2b2lkfGludHxib29sfHVuc2lnbmVkKS4qIChtaWdyYXRpb25fcHRlX2JhdGNofHJlbW92ZV9taWdyYXRpb25fcHRlfHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGJ8dHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmV8dHJ5X3RvX21pZ3JhdGVfb25lfGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNofGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlc3xtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKVxcKCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L3JtYXAuaD03MDg9c3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19mb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4tLVxuaW5jbHVkZS9saW51eC9ybWFwLmgtODEyLSAqL1xuaW5jbHVkZS9saW51eC9ybWFwLmg6ODEzOnN0YXRpYyBpbmxpbmUgaW50IGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuaW5jbHVkZS9saW51eC9ybWFwLmgtODE0LVx0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5tbS9taWdyYXRlLmM9MzQzPXN0cnVjdCBybWFwX3dhbGtfYXJnIHtcbi0tXG5tbS9taWdyYXRlLmMtMzUxLSAqL1xubW0vbWlncmF0ZS5jOjM1MjpzdGF0aWMgdW5zaWduZWQgaW50IG1pZ3JhdGlvbl9wdGVfYmF0Y2goc3RydWN0IHBhZ2Vfdm1hX21hcHBlZF93YWxrICpwdm13LFxubW0vbWlncmF0ZS5jLTM1My1cdFx0c3RydWN0IGZvbGlvICpmb2xpbywgcHRlX3QgZmlyc3RfcHRlLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeClcbi0tXG5tbS9taWdyYXRlLmM9MzcwPXN0YXRpYyBwdGVfdCBtaWdyYXRpb25fc29mdGxlYWZfZW50cnlfdG9fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpuZXcsXG4tLVxubW0vbWlncmF0ZS5jLTQwMy0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRVxubW0vbWlncmF0ZS5jOjQwNDpzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiKHN0cnVjdCBmb2xpbyAqZm9saW8sXG5tbS9taWdyYXRlLmMtNDA1LVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpXG4tLVxubW0vbWlncmF0ZS5jLTQ0NS0jZWxzZVxubW0vbWlncmF0ZS5jOjQ0NjpzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiKHN0cnVjdCBmb2xpbyAqZm9saW8sXG5tbS9taWdyYXRlLmMtNDQ3LVx0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpXG4tLVxubW0vbWlncmF0ZS5jLTQ1NS0gKi9cbm1tL21pZ3JhdGUuYzo0NTY6c3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcbm1tL21pZ3JhdGUuYy00NTctXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZylcbi0tXG5tbS9ybWFwLmM9MjM5Mz12b2lkIHRyeV90b191bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBlbnVtIHR0dV9mbGFncyBmbGFncylcbi0tXG5tbS9ybWFwLmMtMjQwOC0vKiBCdWlsZCB0aGUgbWlncmF0aW9uIHN3YXAgUFRFIHRoYXQgcmVwbGFjZXMgcHRldmFsIGZvciBhIHBhZ2UuICovXG5tbS9ybWFwLmM6MjQwOTpzdGF0aWMgcHRlX3QgbWFrZV9taWdyYXRpb25fc3dwX3B0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgcHRlX3QgcHRldmFsLFxubW0vcm1hcC5jLTI0MTAtXHRcdGJvb2wgd3JpdGFibGUsIGJvb2wgYW5vbl9leGNsdXNpdmUpXG4tLVxubW0vcm1hcC5jLTI0NDgtICovXG5tbS9ybWFwLmM6MjQ0OTpzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxubW0vcm1hcC5jLTI0NTAtXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcbi0tXG5tbS9ybWFwLmMtMjU4OC1cbm1tL3JtYXAuYzoyNTg5OnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sXG5tbS9ybWFwLmMtMjU5MC1cdFx0c3RydWN0IHBhZ2Vfdm1hX21hcHBlZF93YWxrICpwdm13LCBwdGVfdCBwdGUsXG4tLVxubW0vcm1hcC5jLTI2MzYtICovXG5tbS9ybWFwLmM6MjYzNzpzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9ybWFwLmMtMjYzOC1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTk1NAoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDE3MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1pZ3JhdGlvbiBGdW5jdGlvbnMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSSBzZWUgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBhIHNldCBvZiBmdW5jdGlvbnMgcmVsYXRlZCB0byBwYWdlIG1pZ3JhdGlvbi4gVGhlIGNvcmUgc2V0IGluY2x1ZGVzIGBtaWdyYXRpb25fcHRlX2JhdGNoYCwgYHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGJgLCBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVgLCBgbWFrZV9taWdyYXRpb25fc3dwX3B0ZWAsIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAsIGBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaGAsIGFuZCBgdHJ5X3RvX21pZ3JhdGVfb25lYC4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIGluc3RhbnRseSByZWNvZ25pemUgdGhlc2UgYXMgY3J1Y2lhbCBlbGVtZW50cyBpbiBoYW5kbGluZyB0aGUgbW92ZW1lbnQgb2YgcGFnZXMsIHBvdGVudGlhbGx5IGZyb20gb25lIHBoeXNpY2FsIGxvY2F0aW9uIHRvIGFub3RoZXIuIFRoZSBuYW1pbmcgY29udmVudGlvbnMgc3VnZ2VzdCBiYXRjaCBwcm9jZXNzaW5nIGFuZCBoYW5kbGluZyBvZiBIdWdlVExCIHBhZ2VzLCB3aGljaCBpcyBwcmVjaXNlbHkgdGhlIGtpbmQgb2YgbG93LWxldmVsIHN0dWZmIEkgbmVlZCB0byB1bmRlcnN0YW5kLgoKTm93LCBhIGNyaXRpY2FsIHF1ZXN0aW9uIGFyaXNlczogYXJlIHRoZXJlIGFueSAqc3BlY2lmaWMqIGNvbmZpZ3VyYXRpb25zIHRoYXQgaW5mbHVlbmNlIHRoZWlyIGJlaGF2aW9yIG9yIGNvbXBpbGF0aW9uPyBGcm9tIG15IGluaXRpYWwgc2NhbiwgaXQgbG9va3MgbGlrZSBgQ09ORklHX0hVR0VUTEJfUEFHRWAgaXMgdGhlIGtleSBmb3IgZnVuY3Rpb25zIGxpa2UgYHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGJgIGFuZCBgdHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmVgLCB3aGljaCBtYWtlcyBwZXJmZWN0IHNlbnNlLiBIdWdlVExCIHBhZ2UgbWlncmF0aW9uIHdpbGwgYWx3YXlzIG5lZWQgdGhpcyBlbmFibGVkLiBPYnZpb3VzbHksIGBDT05GSUdfTUlHUkFUSU9OYCBpcyBnb2luZyB0byBiZSBtYW5kYXRvcnkuIEJ1dCwgd2hhdCBhYm91dCB0aGUgY29tcGlsYXRpb24gb2YgYG1pZ3JhdGUuY2AgaXRzZWxmPyBJdCYjMzk7cyBlc3NlbnRpYWwgdG8gY29uZmlybSBpZiBpdCYjMzk7cyBjb25kaXRpb25hbGx5IGluY2x1ZGVkLCBvciBpZiB0aGUgY29tcGlsZXIgYWx3YXlzIGJ1aWxkcyBpdC4gVGhlIGRldGFpbHMgd2lsbCBiZSBmb3VuZCBpbiBlaXRoZXIgYG1tL0tjb25maWdgIG9yIGBtbS9NYWtlZmlsZWAuIFRoYXQmIzM5O3Mgd2hlcmUgSSBuZWVkIHRvIGxvb2sgZm9yIHByZWNpc2UgYW5zd2Vycy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttaWdyYXRlXFwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTk3PW9iai0kKENPTkZJR19NRU1URVNUKVx0XHQmIzQzOz0gbWVtdGVzdC5vXG5tbS9NYWtlZmlsZTo5ODpvYmotJChDT05GSUdfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZS5vXG5tbS9NYWtlZmlsZS05OS1vYmotJChDT05GSUdfTlVNQSkgJiM0Mzs9IG1lbW9yeS10aWVycy5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTIgMTM6MTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY1NTQKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA3NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIHNlZSwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBgQ09ORklHX01JR1JBVElPTmAgaXMgZW5hYmxlZC4gVGhhdCYjMzk7cyBmdW5kYW1lbnRhbCwgSSYjMzk7ZCBzYXkuIEFuZCwgb2YgY291cnNlLCBmb3IgYW55dGhpbmcgaHVnZXRsYi1zcGVjaWZpYywgSSBuZWVkIGBDT05GSUdfSFVHRVRMQl9QQUdFYC4gTWFrZXMgcGVyZmVjdCBzZW5zZS4gTm93LCBnaXZlbiB0aGF0IGJhdGNoaW5nIGlzIG1vc3QgYmVuZWZpY2lhbCBmb3IgbGFyZ2VyIGZvbGlvcywgaXQmIzM5O3Mgd29ydGggY2hlY2tpbmcgdGhlIHN0YXR1cyBvZiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhcyB3ZWxsLiBNaWdodCBhcyB3ZWxsIGJlIHRob3JvdWdoIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGFueSBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBJIHNob3VsZCBiZSBjb25zaWRlcmluZyBhdCB0aGUgc2FtZSB0aW1lLiBMZXQgbWUganVzdCBzY2FuIHRocm91Z2ggdGhlIHJlbGV2YW50IGRvY3VtZW50YXRpb24gYW5kIGNvbmZpZ3MgdG8gY29uZmlybS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR19NSUdSQVRJT04mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjgwNwoJCQkJCQkJb3V0cHV0OiAxOAoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgaG93IEkmIzM5O2QgYXBwcm9hY2ggdGhpcyB0YXNrLCBhcyBpZiB0aGVzZSB3ZXJlIG15IGludGVybmFsIHRob3VnaHRzOgoKKipMb2NhdGluZyB0aGUgRGVmaW5pdGlvbiBvZiBDT05GSUdfTUlHUkFUSU9OKioKCkFscmlnaHQsIHNvIGBDT05GSUdfTUlHUkFUSU9OYCBpcyB0aGUgdGFyZ2V0LiBGaXJzdCBpbnN0aW5jdD8gTGV0JiMzOTtzIHRyYWNlIGJhY2sgdGhhdCBtYWNyby4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXQmIzM5O3MgZGVmaW5lZCB3aXRoaW4gdGhlIHByb2plY3QuIEkmIzM5O2xsIG5lZWQgdG8ga25vdyB3aGVyZSBJIGNhbiBzZWUgaXRzIHZhbHVlLCB3aGF0IGl0IHJlbGF0ZXMgdG8sIGFuZCBob3cgaXQgaXMgYmVpbmcgdXNlZC4gV2hlcmUgaXMgdGhhdCBjb25maWcgb3B0aW9uIGRlZmluZWQ/IExldCYjMzk7cyBwaW5wb2ludCB0aGF0IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiBGcm9tIHRoZXJlLCBJIGNhbiB1bmRlcnN0YW5kIGl0JiMzOTtzIHJvbGUgaW4gdGhlIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTIgMTM6MTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIE1JR1JBVElPTiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTY3Nz1jb25maWcgTlVNQV9NSUdSQVRJT05cbi0tXG5tbS9LY29uZmlnLTY4Ny1cbm1tL0tjb25maWc6Njg4OmNvbmZpZyBNSUdSQVRJT05cbm1tL0tjb25maWctNjg5LVx0Ym9vbFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzA0NAoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKktjb25maWcgTXVzaW5ncyoqCgpSaWdodCwgbGV0IG1lIHNlZS4uLiB0aGF0IGBjb25maWcgTUlHUkFUSU9OYCBvcHRpb24gSSYjMzk7bSBmYW1pbGlhciB3aXRoLCB0aGF0JiMzOTtzIGRlZmluZWQgaW4gYG1tL0tjb25maWdgLCBpc24mIzM5O3QgaXQ/IEdvb2QuIEFoLCBhbmQgYSBxdWljayBzYW5pdHkgY2hlY2sg4oCTIEkgcmVtZW1iZXIgaXQmIzM5O3MgYSBzaW1wbGUgYm9vbGVhbi4gTm90aGluZyBjb21wbGljYXRlZCB0aGVyZS4gTm93LCBqdXN0IHRvIGJlIHRob3JvdWdoIGFuZCBiZWNhdXNlIGl0JiMzOTtzIGluIHRoZSBzYW1lIGdlbmVyYWwgYXJlYSwgbGV0IG1lIHRha2UgYSBxdWljayBsb29rIGF0IGBDT05GSUdfSFVHRVRMQl9QQUdFYCB3aGlsZSBJJiMzOTttIGF0IGl0LCBqdXN0IHRvIGJlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXAgYW5kIGFueSBwb3RlbnRpYWwgaW50ZXJhY3Rpb25zLiBOZWVkIHRvIGtlZXAgdGhlIHdob2xlIHBpY3R1cmUgaW4gbWluZCwgYWZ0ZXIgYWxsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgSFVHRVRMQl9QQUdFJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvc2gvbW0vS2NvbmZpZz0xNTg9Y2hvaWNlXG4tLVxuYXJjaC9zaC9tbS9LY29uZmlnLTE2My1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxNjQ6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzY0S1xuYXJjaC9zaC9tbS9LY29uZmlnLTE2NS1cdGJvb2wgXCYjMzQ7NjRrQlwmIzM0O1xuLS1cbmFyY2gvc2gvbW0vS2NvbmZpZy0xNjctXG5hcmNoL3NoL21tL0tjb25maWc6MTY4OmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV8yNTZLXG5hcmNoL3NoL21tL0tjb25maWctMTY5LVx0Ym9vbCBcJiMzNDsyNTZrQlwmIzM0O1xuLS1cbmFyY2gvc2gvbW0vS2NvbmZpZy0xNzEtXG5hcmNoL3NoL21tL0tjb25maWc6MTcyOmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV8xTUJcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNzMtXHRib29sIFwmIzM0OzFNQlwmIzM0O1xuYXJjaC9zaC9tbS9LY29uZmlnLTE3NC1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxNzU6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzRNQlxuYXJjaC9zaC9tbS9LY29uZmlnLTE3Ni1cdGJvb2wgXCYjMzQ7NE1CXCYjMzQ7XG4tLVxuYXJjaC9zaC9tbS9LY29uZmlnLTE3OC1cbmFyY2gvc2gvbW0vS2NvbmZpZzoxNzk6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzY0TUJcbmFyY2gvc2gvbW0vS2NvbmZpZy0xODAtXHRib29sIFwmIzM0OzY0TUJcJiMzNDtcbi0tXG5mcy9LY29uZmlnPTI2Mj1pZiBIVUdFVExCRlNcbmZzL0tjb25maWc6MjYzOmNvbmZpZyBIVUdFVExCX1BBR0VfT1BUSU1JWkVfVk1FTU1BUF9ERUZBVUxUX09OXG5mcy9LY29uZmlnLTI2NC1cdGJvb2wgXCYjMzQ7SHVnZVRMQiBWbWVtbWFwIE9wdGltaXphdGlvbiAoSFZPKSBkZWZhdWx0cyB0byBvblwmIzM0O1xuLS1cbmZzL0tjb25maWc9MjcxPWVuZGlmICMgSFVHRVRMQkZTXG5mcy9LY29uZmlnLTI3Mi1cbmZzL0tjb25maWc6MjczOmNvbmZpZyBIVUdFVExCX1BBR0VcbmZzL0tjb25maWctMjc0LVx0ZGVmX2Jvb2wgSFVHRVRMQkZTXG4tLVxuZnMvS2NvbmZpZy0yNzYtXG5mcy9LY29uZmlnOjI3Nzpjb25maWcgSFVHRVRMQl9QQUdFX09QVElNSVpFX1ZNRU1NQVBcbmZzL0tjb25maWctMjc4LVx0ZGVmX2Jvb2wgSFVHRVRMQl9QQUdFXG4tLVxubW0vS2NvbmZpZz02OTg9Y29uZmlnIEFSQ0hfSEFTX1BNRF9TT0ZUTEVBVkVTXG4tLVxubW0vS2NvbmZpZy03MDAtXG5tbS9LY29uZmlnOjcwMTpjb25maWcgSFVHRVRMQl9QQUdFX1NJWkVfVkFSSUFCTEVcbm1tL0tjb25maWctNzAyLVx0ZGVmX2Jvb2wgblxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMiAxMzoxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNzg1MwoJCQkJCQkJb3V0cHV0OiAyMgoJCQkJCQkJdGhvdWdodHM6IDQzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKkludmVzdGlnYXRpbmcgSHVnZSBQYWdlcyBhbmQgRGVwZW5kZW5jaWVzKioKCkFscmlnaHQsIGxldCYjMzk7cyBzZWUuLi4gYEhVR0VUTEJfUEFHRWAgaXMgZGVmaW5lZCBpbiBgZnMvS2NvbmZpZ2AuIFRoYXQmIzM5O3MgdGhlIHN0YXJ0aW5nIHBvaW50LiBBbmQgYSBxdWljayBjaGVjayByZXZlYWxzIHRoYXQgaXQmIzM5O3MgZGVwZW5kZW50IG9uIGBIVUdFVExCRlNgLiBNYWtlcyBwZXJmZWN0IHNlbnNlLiBDYW4mIzM5O3QgaGF2ZSBodWdlIHBhZ2VzIHdpdGhvdXQgdGhlIGZpbGUgc3lzdGVtIHN1cHBvcnQsIHJpZ2h0PyBOb3csIHRoZSBuZXh0IHF1ZXN0aW9uIGlzIGFib3V0IGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhhdCB0aWVzIGluLiBMZXQmIzM5O3Mgc2VlIHdoYXQgSSBjYW4gZmluZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTIgMTM6MTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9ODM1PWNvbmZpZyBNTV9JRFxuLS1cbm1tL0tjb25maWctODM3LVxubW0vS2NvbmZpZzo4Mzg6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxubW0vS2NvbmZpZy04MzktXHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg1Nj1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg2MS1cbm1tL0tjb25maWc6ODYyOlx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xubW0vS2NvbmZpZy04NjMtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NjgtXG5tbS9LY29uZmlnOjg2OTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXG5tbS9LY29uZmlnLTg3MC1cdFx0Ym9vbCBcJiMzNDttYWR2aXNlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04NzctXG5tbS9LY29uZmlnOjg3ODpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxubW0vS2NvbmZpZy04NzktXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTg4NT1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTg5NC1cbm1tL0tjb25maWc6ODk1Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcbm1tL0tjb25maWctODk2LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MDQtXG5tbS9LY29uZmlnOjkwNTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05MDYtXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05MTItXG5tbS9LY29uZmlnOjkxMzpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTkxNC1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTIwLVxubW0vS2NvbmZpZzo5MjE6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTIyLVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWc9OTMwPWNob2ljZVxuLS1cbm1tL0tjb25maWctOTM5LVxubW0vS2NvbmZpZzo5NDA6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9ORVZFUlxubW0vS2NvbmZpZy05NDEtXHRcdGJvb2wgXCYjMzQ7bmV2ZXJcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk0OC1cbm1tL0tjb25maWc6OTQ5Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQUxXQVlTXG5tbS9LY29uZmlnLTk1MC1cdFx0Ym9vbCBcJiMzNDthbHdheXNcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTk1Ni1cbm1tL0tjb25maWc6OTU3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfV0lUSElOX1NJWkVcbm1tL0tjb25maWctOTU4LVx0XHRib29sIFwmIzM0O3dpdGhpbl9zaXplXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NjQtXG5tbS9LY29uZmlnOjk2NTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FEVklTRVxubW0vS2NvbmZpZy05NjYtXHRcdGJvb2wgXCYjMzQ7YWR2aXNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEyIDEzOjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4NzYxCgkJCQkJCQlvdXRwdXQ6IDIxNgoJCQkJCQkJdGhvdWdodHM6IDc0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgTWVtb3J5IE1pZ3JhdGlvbiBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGhhbmRlZCB0aGlzIHBhdGNoIHRoYXQmIzM5O3MgY2xlYXJseSBmb2N1c2VkIG9uIG9wdGltaXppbmcgbWVtb3J5IG1pZ3JhdGlvbiwgcGFydGljdWxhcmx5IGFyb3VuZCBoYW5kbGluZyBQVEVzIGluIGJhdGNoZXMuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB0aGUgY29yZSBmdW5jdGlvbnMgYWZmZWN0ZWQ6IGBtbS9taWdyYXRlLmNgIGFuZCBgbW0vcm1hcC5jYC4gSSYjMzk7dmUgZ29uZSB0aHJvdWdoIHRoZSBjb2RlIGFuZCBJJiMzOTt2ZSBpZGVudGlmaWVkIHRoZSBrZXkgZnVuY3Rpb25zIEkgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aC4KCkkmIzM5O3ZlIGluaXRpYWxseSBsaXN0ZWQgYWxsIHRoZSBmdW5jdGlvbnMgaW4gdGhhdCByZWdpb24sIGJ1dCBJIHF1aWNrbHkgcmVhbGl6ZWQgdGhhdCB0d28gb2YgdGhlbSwgYGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlc2AgYW5kIGBzb2Z0bGVhZl9wdGVfYmF0Y2hgLCBhcmUgYHN0YXRpYyBpbmxpbmVgIGFuZCBkZWZpbmVkIGluIGhlYWRlcnMuIFRoZXJlZm9yZSwgdGhleSBtaWdodCBub3QgYmUgZGlyZWN0bHkgZnV6emFibGUgYXMgc3RhbmRhbG9uZSB1bml0cywgYWx0aG91Z2ggdGhleSBhcmUgY3JpdGljYWwgdG8gY29uc2lkZXIgYXMgcGFydCBvZiB0aGUgb3ZlcmFsbCBmbG93IG9mIHRoZSBub24taW5saW5lIGZ1bmN0aW9ucy4gSSYjMzk7dmUgcmUtcHJpb3JpdGl6ZWQgYW5kIHJlbW92ZWQgdGhvc2Ugc3RhdGljIGlubGluZXMgdG8gZ2l2ZSBtZSBhIHNoYXJwZXIgZm9jdXMuCgpTbywgaGVyZSYjMzk7cyB0aGUgbmFycm93ZWQtZG93biBsaXN0IG9mIGZ1bmN0aW9ucyBJIHJlYWxseSBuZWVkIHRvIGRyaWxsIGRvd24gb246IGBtaWdyYXRpb25fcHRlX2JhdGNoYCwgYHJlbW92ZV9taWdyYXRpb25fcHRlYCwgYHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGJgLCBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVzYCwgYG1ha2VfbWlncmF0aW9uX3N3cF9wdGVgLCBgdHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmVgLCBgZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2hgLCBgdHJ5X3RvX21pZ3JhdGVfb25lYCwgYW5kIGB0cnlfdG9fbWlncmF0ZWAuCgpUaGUgcGF0Y2gmIzM5O3MgZ29hbCBhcHBlYXJzIHRvIGJlIHNwZWVkaW5nIHRoaW5ncyB1cCwgc28gYmF0Y2hpbmcgUFRFIG9wZXJhdGlvbnMsIHByZXN1bWFibHkgZm9yIGxhcmdlciBmb2xpb3MuIFRoaXMgbWVhbnMgbXkgZnV6emluZyBuZWVkcyB0byBiZSBwYXJ0aWN1bGFybHkgcm9idXN0LCBjb3ZlcmluZyBhbGwgdGhlIHBvdGVudGlhbCBwZXJtdXRhdGlvbnMgb2YgUFRFIGhhbmRsaW5nLCBlc3BlY2lhbGx5IHdpdGggcGVybWlzc2lvbnMsIGFuZCBtYWtpbmcgc3VyZSB0aGUgYmF0Y2hpbmcgbG9naWMgZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSBzdWJ0bGUgZXJyb3JzIG9yIGxlYWtzIHdoZW4gaGFuZGxpbmcgZGV2aWNlLXByaXZhdGUgZm9saW9zIG9yIGh1Z2V0bGIgcGFnZXMuIEVkZ2UgY2FzZXMgYXJlIGdvaW5nIHRvIGJlIG15IGZyaWVuZHMgaGVyZS4KCkdpdmVuIHRoZSBjb2RlJiMzOTtzIGRlcGVuZGVuY2Ugb24gYG1tL21pZ3JhdGUuY2AsIGBNSUdSQVRJT05gIGlzIG15IGluaXRpYWwgY29uZmlnLiBJIHRoZW4gbmVlZCB0byBlbnN1cmUgdGhhdCBgSFVHRVRMQl9QQUdFYCBpcyBhbHNvIHNldCBiZWNhdXNlIG9mIGByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiYCBhbmQgYHRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lYC4gQWxzbywgc2luY2UgdGhlIHdob2xlIGJhdGNoaW5nIGNvbmNlcHQgaXMgbGFyZ2VseSBnZWFyZWQgdG93YXJkIGRlYWxpbmcgd2l0aCBsYXJnZXIgbWVtb3J5IGNodW5rcywgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBzaG91bGQgYWxzbyBiZSB1c2VkIHRvIGdldCBzb21lIGNvdmVyYWdlIGluIHRoYXQgc3BhY2UuCgpJIHRoaW5rIEkmIzM5O3ZlIGdvdCBhIHNvbGlkIHBsYW4gZm9yIGZ1enppbmcgdGhpcyBwYXRjaC4gTm93LCBsZXQmIzM5O3MgZ2V0IHRvIHdvcmshCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEyIDEzOjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNSUdSQVRJT04mIzM0OywKICAgICYjMzQ7SFVHRVRMQl9QQUdFJiMzNDssCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bWlncmF0aW9uX3B0ZV9iYXRjaCYjMzQ7LAogICAgJiMzNDtyZW1vdmVfbWlncmF0aW9uX3B0ZSYjMzQ7LAogICAgJiMzNDtyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiJiMzNDssCiAgICAmIzM0O3JlbW92ZV9taWdyYXRpb25fcHRlcyYjMzQ7LAogICAgJiMzNDttYWtlX21pZ3JhdGlvbl9zd3BfcHRlJiMzNDssCiAgICAmIzM0O3RyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lJiMzNDssCiAgICAmIzM0O2ZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoJiMzNDssCiAgICAmIzM0O3RyeV90b19taWdyYXRlX29uZSYjMzQ7LAogICAgJiMzNDt0cnlfdG9fbWlncmF0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGJhdGNoaW5nIGZvciBtaWdyYXRpb24gUFRFcyB0byBvcHRpbWl6ZSBtZW1vcnkgbWlncmF0aW9uLCBlc3BlY2lhbGx5IGZvciBsYXJnZSBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zIGluIG1tL21pZ3JhdGUuYyBhbmQgbW0vcm1hcC5jLiBGdXp6aW5nIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgYmF0Y2hpbmcgbG9naWMgY29ycmVjdGx5IGhhbmRsZXMgUFRFcywgcGVybWlzc2lvbnMsIGFuZCBlZGdlIGNhc2VzIGxpa2UgZGV2aWNlIHByaXZhdGUgZm9saW9zIG9yIGh1Z2V0bGIgcGFnZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01JR1JBVElPTiYjMzQ7LAogICAgJiMzNDtIVUdFVExCX1BBR0UmIzM0OywKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDttaWdyYXRpb25fcHRlX2JhdGNoJiMzNDssCiAgICAmIzM0O3JlbW92ZV9taWdyYXRpb25fcHRlJiMzNDssCiAgICAmIzM0O3JlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGImIzM0OywKICAgICYjMzQ7cmVtb3ZlX21pZ3JhdGlvbl9wdGVzJiMzNDssCiAgICAmIzM0O21ha2VfbWlncmF0aW9uX3N3cF9wdGUmIzM0OywKICAgICYjMzQ7dHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmUmIzM0OywKICAgICYjMzQ7Zm9saW9fbWlncmF0ZV9wdGVfYmF0Y2gmIzM0OywKICAgICYjMzQ7dHJ5X3RvX21pZ3JhdGVfb25lJiMzNDssCiAgICAmIzM0O3RyeV90b19taWdyYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYmF0Y2hpbmcgZm9yIG1pZ3JhdGlvbiBQVEVzIHRvIG9wdGltaXplIG1lbW9yeSBtaWdyYXRpb24sIGVzcGVjaWFsbHkgZm9yIGxhcmdlIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgaW4gbW0vbWlncmF0ZS5jIGFuZCBtbS9ybWFwLmMuIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBiYXRjaGluZyBsb2dpYyBjb3JyZWN0bHkgaGFuZGxlcyBQVEVzLCBwZXJtaXNzaW9ucywgYW5kIGVkZ2UgY2FzZXMgbGlrZSBkZXZpY2UgcHJpdmF0ZSBmb2xpb3Mgb3IgaHVnZXRsYiBwYWdlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEyVDEzOjEyOjIyLjA3ODI5ODczOFoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUwMzc1NzAxNjczLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1JR1JBVElPTlwiLFxuICAgIFwiSFVHRVRMQl9QQUdFXCIsXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1pZ3JhdGlvbl9wdGVfYmF0Y2hcIixcbiAgICBcInJlbW92ZV9taWdyYXRpb25fcHRlXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZXNcIixcbiAgICBcIm1ha2VfbWlncmF0aW9uX3N3cF9wdGVcIixcbiAgICBcInRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lXCIsXG4gICAgXCJmb2xpb19taWdyYXRlX3B0ZV9iYXRjaFwiLFxuICAgIFwidHJ5X3RvX21pZ3JhdGVfb25lXCIsXG4gICAgXCJ0cnlfdG9fbWlncmF0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYmF0Y2hpbmcgZm9yIG1pZ3JhdGlvbiBQVEVzIHRvIG9wdGltaXplIG1lbW9yeSBtaWdyYXRpb24sIGVzcGVjaWFsbHkgZm9yIGxhcmdlIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgaW4gbW0vbWlncmF0ZS5jIGFuZCBtbS9ybWFwLmMuIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBiYXRjaGluZyBsb2dpYyBjb3JyZWN0bHkgaGFuZGxlcyBQVEVzLCBwZXJtaXNzaW9ucywgYW5kIGVkZ2UgY2FzZXMgbGlrZSBkZXZpY2UgcHJpdmF0ZSBmb2xpb3Mgb3IgaHVnZXRsYiBwYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6MjIuMDc4MzA4NzM4WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDYwOTYzOTkzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYzZlMmJlMWUxYTYxYmJmYTgxMWQ3NWMxZDc3MDJhNGQ5OGM1ZTg4NVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU3VuIEp1bCAxMiAxMzoxMjoyMCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JtYXAuaCBiL2luY2x1ZGUvbGludXgvcm1hcC5oXFxuaW5kZXggOGRjMDg3MWU1ZjAwMTEuLjY0OTI5NDkwYTdjZmNhIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvcm1hcC5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9ybWFwLmhcXG5AQCAtNzA2LDE3ICs3MDYsMTggQEAgc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X2R1cF9hbm9uX3JtYXBfcG1kKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuIH1cXG4gXFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbi1cXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXFxuK1xcdFxcdHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXFxuIHtcXG4rXFx0LyogZGV2aWNlIHByaXZhdGUgZm9saW9zIGNhbm5vdCBnZXQgcGlubmVkIHZpYSBHVVAuICovXFxuK1xcdGNvbnN0IGJvb2wgcGlubmFibGUgPSBsaWtlbHkoIWZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSk7XFxuK1xcbiBcXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XFxuIFxcdFZNX1dBUk5fT05fRk9MSU8oIVBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpLCBmb2xpbyk7XFxuIFxcdF9fZm9saW9fcm1hcF9zYW5pdHlfY2hlY2tzKGZvbGlvLCBwYWdlLCBucl9wYWdlcywgbGV2ZWwpO1xcbiBcXG4tXFx0LyogZGV2aWNlIHByaXZhdGUgZm9saW9zIGNhbm5vdCBnZXQgcGlubmVkIHZpYSBHVVAuICovXFxuLVxcdGlmICh1bmxpa2VseShmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpKSB7XFxuLVxcdFxcdENsZWFyUGFnZUFub25FeGNsdXNpdmUocGFnZSk7XFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXHR9XFxuK1xcdC8qIFdlIG9ubHkgY2xlYXIgYW5vbi1leGNsdXNpdmUgZnJvbSBoZWFkIHBhZ2Ugb2YgUE1EIGZvbGlvICovXFxuK1xcdGlmIChsZXZlbCA9PSBQR1RBQkxFX0xFVkVMX1BNRClcXG4rXFx0XFx0bnJfcGFnZXMgPSAxO1xcbiBcXG4gXFx0LypcXG4gXFx0ICogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIHdlIGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlLCB0aGF0XFxuQEAgLTc2MCwyOSArNzYxLDM4IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbiBcXHQgKiBzbyB3ZSB1c2UgZXhwbGljaXQgb25lcyBoZXJlLlxcbiBcXHQgKi9cXG4gXFxuLVxcdC8qIFBhaXJlZCB3aXRoIHRoZSBtZW1vcnkgYmFycmllciBpbiB0cnlfZ3JhYl9mb2xpbygpLiAqL1xcbi1cXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpXFxuLVxcdFxcdHNtcF9tYigpO1xcbitcXHRpZiAocGlubmFibGUpIHtcXG4rXFx0XFx0LyogUGFpcmVkIHdpdGggdGhlIG1lbW9yeSBiYXJyaWVyIGluIHRyeV9ncmFiX2ZvbGlvKCkuICovXFxuK1xcdFxcdGlmIChJU19FTkFCTEVEKENPTkZJR19IQVZFX0dVUF9GQVNUKSlcXG4rXFx0XFx0XFx0c21wX21iKCk7XFxuIFxcbi1cXHRpZiAodW5saWtlbHkoZm9saW9fbWF5YmVfZG1hX3Bpbm5lZChmb2xpbykpKVxcbi1cXHRcXHRyZXR1cm4gLUVCVVNZO1xcbi1cXHRDbGVhclBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xcbitcXHRcXHRpZiAodW5saWtlbHkoZm9saW9fbWF5YmVfZG1hX3Bpbm5lZChmb2xpbykpKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKDs7KSB7XFxuK1xcdFxcdENsZWFyUGFnZUFub25FeGNsdXNpdmUocGFnZSk7XFxuK1xcdFxcdGlmICgtLW5yX3BhZ2VzID09IDApXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRwYWdlKys7XFxuK1xcdH1cXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFRoaXMgaXMgY29uY2VwdHVhbGx5IGEgc21wX3dtYigpIHBhaXJlZCB3aXRoIHRoZSBzbXBfcm1iKCkgaW5cXG4gXFx0ICogZ3VwX211c3RfdW5zaGFyZSgpLlxcbiBcXHQgKi9cXG4tXFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKVxcbitcXHRpZiAocGlubmFibGUgXFx1MDAyNlxcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfSEFWRV9HVVBfRkFTVCkpXFxuIFxcdFxcdHNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbiAvKipcXG4tICogZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUgLSB0cnkgbWFya2luZyBhbiBleGNsdXNpdmUgYW5vbnltb3VzIHBhZ2VcXG4tICpcXHRcXHRcXHRcXHQgICBtYXBwZWQgYnkgYSBQVEUgcG9zc2libHkgc2hhcmVkIHRvIHByZXBhcmVcXG4rICogZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzIC0gdHJ5IG1hcmtpbmcgZXhjbHVzaXZlIGFub255bW91cyBwYWdlc1xcbisgKlxcdFxcdFxcdFxcdCAgIG1hcHBlZCBieSBQVEVzIHBvc3NpYmx5IHNoYXJlZCB0byBwcmVwYXJlXFxuICAqXFx0XFx0XFx0XFx0ICAgZm9yIEtTTSBvciB0ZW1wb3JhcnkgdW5tYXBwaW5nXFxuICAqIEBmb2xpbzpcXHRUaGUgZm9saW8gdG8gc2hhcmUgYSBtYXBwaW5nIG9mXFxuLSAqIEBwYWdlOlxcdFRoZSBtYXBwZWQgZXhjbHVzaXZlIHBhZ2VcXG4rICogQHBhZ2U6XFx0VGhlIGZpcnN0IG1hcHBlZCBleGNsdXNpdmUgcGFnZSBvZiB0aGUgYmF0Y2ggaW4gdGhlIGZvbGlvXFxuKyAqIEBucl9wYWdlczpcXHRUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIHNoYXJlIGluIHRoZSBmb2xpbyAoYmF0Y2ggc2l6ZSlcXG4gICpcXG4gICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwYWdlIHRhYmxlIGxvY2sgYW5kIGhhcyB0byBoYXZlIHRoZSBwYWdlIHRhYmxlXFxuICAqIGVudHJpZXMgY2xlYXJlZC9pbnZhbGlkYXRlZC5cXG5AQCAtNzk3LDExICs4MDcsMTkgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19mb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuICAqXFxuICAqIFJldHVybnMgMCBpZiBtYXJraW5nIHRoZSBtYXBwZWQgcGFnZSBwb3NzaWJseSBzaGFyZWQgc3VjY2VlZGVkLiBSZXR1cm5zXFxuICAqIC1FQlVTWSBvdGhlcndpc2UuXFxuKyAqXFxuKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCB0aGUgcGFnZSB0YWJsZSBsb2NrLlxcbiAgKi9cXG4rc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuK1xcdFxcdHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbit7XFxuK1xcdHJldHVybiBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8sIHBhZ2UsIG5yX3BhZ2VzLCBQR1RBQkxFX0xFVkVMX1BURSk7XFxuK31cXG4rXFxuIHN0YXRpYyBpbmxpbmUgaW50IGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuIFxcdFxcdHN0cnVjdCBwYWdlICpwYWdlKVxcbiB7XFxuLVxcdHJldHVybiBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8sIHBhZ2UsIDEsIFBHVEFCTEVfTEVWRUxfUFRFKTtcXG4rXFx0cmV0dXJuIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhmb2xpbywgcGFnZSwgMSk7XFxuIH1cXG4gXFxuIC8qKlxcbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxcbmluZGV4IDg3NGJlOTRjZjI1NzBlLi5hOTA3MjFmOGM2ODc3ZSAxMDA2NDRcXG4tLS0gYS9tbS9pbnRlcm5hbC5oXFxuKysrIGIvbW0vaW50ZXJuYWwuaFxcbkBAIC01MDUsNiArNTA1LDI2IEBAIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX25leHRfc3dwX29mZnNldChwdGVfdCBwdGUpXFxuIFxcdHJldHVybiBwdGVfbW92ZV9zd3Bfb2Zmc2V0KHB0ZSwgMSk7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbmxpbmUgaW50IHNvZnRsZWFmX3B0ZV9iYXRjaChwdGVfdCAqc3RhcnRfcHRlcCwgaW50IG1heF9uciwgcHRlX3QgcHRlKVxcbit7XFxuK1xcdHB0ZV90IGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlKTtcXG4rXFx0Y29uc3QgcHRlX3QgKmVuZF9wdGVwID0gc3RhcnRfcHRlcCArIG1heF9ucjtcXG4rXFx0cHRlX3QgKnB0ZXAgPSBzdGFydF9wdGVwICsgMTtcXG4rXFxuK1xcdFZNX1dBUk5fT04obWF4X25yIFxcdTAwM2MgMSk7XFxuK1xcbitcXHR3aGlsZSAocHRlcCBcXHUwMDNjIGVuZF9wdGVwKSB7XFxuK1xcdFxcdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xcbitcXG4rXFx0XFx0aWYgKCFwdGVfc2FtZShwdGUsIGV4cGVjdGVkX3B0ZSkpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KGV4cGVjdGVkX3B0ZSk7XFxuK1xcdFxcdHB0ZXArKztcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHB0ZXAgLSBzdGFydF9wdGVwO1xcbit9XFxuK1xcbiAvKipcXG4gICogc3dhcF9wdGVfYmF0Y2ggLSBkZXRlY3QgYSBQVEUgYmF0Y2ggZm9yIGEgc2V0IG9mIGNvbnRpZ3VvdXMgc3dhcCBlbnRyaWVzXFxuICAqIEBzdGFydF9wdGVwOiBQYWdlIHRhYmxlIHBvaW50ZXIgZm9yIHRoZSBmaXJzdCBlbnRyeS5cXG5AQCAtNTIyLDIzICs1NDIsOSBAQCBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlX3QgcHRlKVxcbiAgKi9cXG4gc3RhdGljIGlubGluZSBpbnQgc3dhcF9wdGVfYmF0Y2gocHRlX3QgKnN0YXJ0X3B0ZXAsIGludCBtYXhfbnIsIHB0ZV90IHB0ZSlcXG4ge1xcbi1cXHRwdGVfdCBleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHB0ZSk7XFxuLVxcdGNvbnN0IHB0ZV90ICplbmRfcHRlcCA9IHN0YXJ0X3B0ZXAgKyBtYXhfbnI7XFxuLVxcdHB0ZV90ICpwdGVwID0gc3RhcnRfcHRlcCArIDE7XFxuLVxcbi1cXHRWTV9XQVJOX09OKG1heF9uciBcXHUwMDNjIDEpO1xcbiBcXHRWTV9XQVJOX09OKCFzb2Z0bGVhZl9pc19zd2FwKHNvZnRsZWFmX2Zyb21fcHRlKHB0ZSkpKTtcXG4gXFxuLVxcdHdoaWxlIChwdGVwIFxcdTAwM2MgZW5kX3B0ZXApIHtcXG4tXFx0XFx0cHRlID0gcHRlcF9nZXQocHRlcCk7XFxuLVxcbi1cXHRcXHRpZiAoIXB0ZV9zYW1lKHB0ZSwgZXhwZWN0ZWRfcHRlKSlcXG4tXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQoZXhwZWN0ZWRfcHRlKTtcXG4tXFx0XFx0cHRlcCsrO1xcbi1cXHR9XFxuLVxcbi1cXHRyZXR1cm4gcHRlcCAtIHN0YXJ0X3B0ZXA7XFxuK1xcdHJldHVybiBzb2Z0bGVhZl9wdGVfYmF0Y2goc3RhcnRfcHRlcCwgbWF4X25yLCBwdGUpO1xcbiB9XFxuICNlbmRpZiAvKiBDT05GSUdfTU1VICovXFxuIFxcbmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmNcXG5pbmRleCAyMjJjOGMxNWY3ODJmNy4uNmQwNWQzZjQxMDk1ZDYgMTAwNjQ0XFxuLS0tIGEvbW0vbWlncmF0ZS5jXFxuKysrIGIvbW0vbWlncmF0ZS5jXFxuQEAgLTM0NSw2ICszNDUsMTExIEBAIHN0cnVjdCBybWFwX3dhbGtfYXJnIHtcXG4gXFx0Ym9vbCBtYXBfdW51c2VkX3RvX3plcm9wYWdlO1xcbiB9O1xcbiBcXG4rLypcXG4rICogRGV0ZWN0IGEgYmF0Y2ggb2YgY29udGlndW91cyBtaWdyYXRpb24gZW50cmllczogY29uc2VjdXRpdmUgKG5vbi1wcmVzZW50KSBQVEVzXFxuKyAqIGNvbnRhaW5pbmcgbWlncmF0aW9uIGVudHJpZXMgd2l0aCBjb25zZWN1dGl2ZSBvZmZzZXRzIGFuZCBtYXRjaGluZyBwdGUgYml0cy5cXG4rICovXFxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWlncmF0aW9uX3B0ZV9iYXRjaChzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsXFxuK1xcdFxcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHB0ZV90IGZpcnN0X3B0ZSwgdW5zaWduZWQgbG9uZyBzdGFydF9pZHgpXFxuK3tcXG4rXFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBwdm13LVxcdTAwM2V2bWE7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIgPSBwbWRfYWRkcl9lbmQocHZtdy1cXHUwMDNlYWRkcmVzcywgdm1hLVxcdTAwM2V2bV9lbmQpO1xcbitcXHR1bnNpZ25lZCBpbnQgZm9saW9fbnIgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XFxuK1xcdHVuc2lnbmVkIGludCBtYXhfbnI7XFxuK1xcbitcXHRWTV9XQVJOX09OKCFzb2Z0bGVhZl9pc19taWdyYXRpb24oc29mdGxlYWZfZnJvbV9wdGUoZmlyc3RfcHRlKSkpO1xcbitcXG4rXFx0LyogQm91bmQgYnkgVk1BIC8gUE1EIGVuZCBhbmQgYnkgdGhlIHJlbWFpbmluZyBzdWJwYWdlcyBvZiB0aGUgZm9saW8uICovXFxuK1xcdG1heF9uciA9IG1pbigoZW5kX2FkZHIgLSBwdm13LVxcdTAwM2VhZGRyZXNzKSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZULCBmb2xpb19uciAtIHN0YXJ0X2lkeCk7XFxuK1xcdGlmIChtYXhfbnIgXFx1MDAzYz0gMSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHRyZXR1cm4gc29mdGxlYWZfcHRlX2JhdGNoKHB2bXctXFx1MDAzZXB0ZSwgbWF4X25yLCBmaXJzdF9wdGUpO1xcbit9XFxuK1xcbitzdGF0aWMgcHRlX3QgbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqbmV3LFxcbitcXHRcXHRzb2Z0bGVhZl90IGVudHJ5LCBwdGVfdCBvbGRfcHRlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0cm1hcF90ICpybWFwX2ZsYWdzKVxcbit7XFxuK1xcdHB0ZV90IHB0ZSA9IG1rX3B0ZShuZXcsIFJFQURfT05DRSh2bWEtXFx1MDAzZXZtX3BhZ2VfcHJvdCkpO1xcbitcXG4rXFx0aWYgKCFzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpKVxcbitcXHRcXHRwdGUgPSBwdGVfbWtvbGQocHRlKTtcXG4rXFx0aWYgKGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pIFxcdTAwMjZcXHUwMDI2IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSkpXFxuK1xcdFxcdHB0ZSA9IHB0ZV9ta2RpcnR5KHB0ZSk7XFxuK1xcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkob2xkX3B0ZSkpXFxuK1xcdFxcdHB0ZSA9IHB0ZV9ta3NvZnRfZGlydHkocHRlKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRwdGUgPSBwdGVfY2xlYXJfc29mdF9kaXJ0eShwdGUpO1xcbitcXG4rXFx0aWYgKHNvZnRsZWFmX2lzX21pZ3JhdGlvbl93cml0ZShlbnRyeSkpXFxuK1xcdFxcdHB0ZSA9IHB0ZV9ta3dyaXRlKHB0ZSwgdm1hKTtcXG4rXFx0ZWxzZSBpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxcbitcXHRcXHRwdGUgPSBwdGVfbWt1ZmZkKHB0ZSk7XFxuK1xcbitcXHQvKiBTZWUgZG9fc3dhcF9wYWdlKCk6IHJlc3RvcmUgUEFHRV9OT05FIGZvciBSV1AgKi9cXG4rXFx0aWYgKHB0ZV9zd3BfdWZmZChvbGRfcHRlKSBcXHUwMDI2XFx1MDAyNiB1c2VyZmF1bHRmZF9yd3Aodm1hKSlcXG4rXFx0XFx0cHRlID0gcHRlX21vZGlmeShwdGUsIFBBR0VfTk9ORSk7XFxuK1xcbitcXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiAhc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWQoZW50cnkpKVxcbitcXHRcXHQqcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcXG4rXFxuK1xcdHJldHVybiBwdGU7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFJlc3RvcmUgYSBwb3RlbnRpYWwgbWlncmF0aW9uIHB0ZSB0byBhIHdvcmtpbmcgcHRlIGVudHJ5IGZvciBodWdldGxiIGZvbGlvcy5cXG4rICovXFxuKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFXFxuK3N0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGIoc3RydWN0IGZvbGlvICpmb2xpbyxcXG4rXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxcbit7XFxuK1xcdHN0cnVjdCBybWFwX3dhbGtfYXJnICpybWFwX3dhbGtfYXJnID0gYXJnO1xcbitcXHRERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgcm1hcF93YWxrX2FyZy1cXHUwMDNlZm9saW8sIHZtYSwgYWRkciwgUFZNV19TWU5DIHwgUFZNV19NSUdSQVRJT04pO1xcbitcXHRzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpO1xcbitcXHR1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaCk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcHNpemUgPSBodWdlX3BhZ2Vfc2l6ZShoKTtcXG4rXFxuK1xcdGlmIChwYWdlX3ZtYV9tYXBwZWRfd2FsayhcXHUwMDI2cHZtdykpIHtcXG4rXFx0XFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XFxuK1xcdFxcdHN0cnVjdCBwYWdlICpuZXcgPSBmb2xpb19wYWdlKGZvbGlvLCAwKTtcXG4rXFx0XFx0cHRlX3Qgb2xkX3B0ZSwgcHRlO1xcbitcXHRcXHRzb2Z0bGVhZl90IGVudHJ5O1xcbitcXG4rXFx0XFx0b2xkX3B0ZSA9IGh1Z2VfcHRlcF9nZXQodm1hLVxcdTAwM2V2bV9tbSwgcHZtdy5hZGRyZXNzLCBwdm13LnB0ZSk7XFxuK1xcdFxcdGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wdGUob2xkX3B0ZSk7XFxuK1xcbitcXHRcXHRmb2xpb19nZXQoZm9saW8pO1xcbitcXHRcXHRwdGUgPSBtaWdyYXRpb25fc29mdGxlYWZfZW50cnlfdG9fcHRlKGZvbGlvLCBuZXcsIGVudHJ5LCBvbGRfcHRlLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICB2bWEsIFxcdTAwMjZybWFwX2ZsYWdzKTtcXG4rXFx0XFx0cHRlID0gYXJjaF9tYWtlX2h1Z2VfcHRlKHB0ZSwgc2hpZnQsIHZtYS1cXHUwMDNldm1fZmxhZ3MpO1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcXG4rXFx0XFx0XFx0aHVnZXRsYl9hZGRfYW5vbl9ybWFwKGZvbGlvLCB2bWEsIHB2bXcuYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgcm1hcF9mbGFncyk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0aHVnZXRsYl9hZGRfZmlsZV9ybWFwKGZvbGlvKTtcXG4rXFx0XFx0c2V0X2h1Z2VfcHRlX2F0KHZtYS1cXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIHB0ZSwgcHNpemUpO1xcbitcXG4rXFx0XFx0aWYgKFJFQURfT05DRSh2bWEtXFx1MDAzZXZtX2ZsYWdzKSBcXHUwMDI2IFZNX0xPQ0tFRClcXG4rXFx0XFx0XFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcXG4rXFxuK1xcdFxcdHRyYWNlX3JlbW92ZV9taWdyYXRpb25fcHRlKHB2bXcuYWRkcmVzcywgcHRlX3ZhbChwdGUpLFxcbitcXHRcXHRcXHRcXHRcXHQgICBjb21wb3VuZF9vcmRlcihuZXcpKTtcXG4rXFxuK1xcdFxcdC8qIE5vIG5lZWQgdG8gaW52YWxpZGF0ZSAtIGl0IHdhcyBub24tcHJlc2VudCBiZWZvcmUgKi9cXG4rXFx0XFx0dXBkYXRlX21tdV9jYWNoZSh2bWEsIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUpO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbisjZWxzZVxcbitzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuK1xcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZylcXG4re1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi9cXG4rXFxuIC8qXFxuICAqIFJlc3RvcmUgYSBwb3RlbnRpYWwgbWlncmF0aW9uIHB0ZSB0byBhIHdvcmtpbmcgcHRlIGVudHJ5XFxuICAqL1xcbkBAIC0zNTIsNiArNDU3LDcgQEAgc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcXG4gXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxcbiB7XFxuIFxcdHN0cnVjdCBybWFwX3dhbGtfYXJnICpybWFwX3dhbGtfYXJnID0gYXJnO1xcbitcXHRib29sIGlzX2RldnByaXYgPSBmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbyk7XFxuIFxcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBybWFwX3dhbGtfYXJnLVxcdTAwM2Vmb2xpbywgdm1hLCBhZGRyLCBQVk1XX1NZTkMgfCBQVk1XX01JR1JBVElPTik7XFxuIFxcbiBcXHR3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoXFx1MDAyNnB2bXcpKSB7XFxuQEAgLTM2MSw1NiArNDY3LDQwIEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuIFxcdFxcdHNvZnRsZWFmX3QgZW50cnk7XFxuIFxcdFxcdHN0cnVjdCBwYWdlICpuZXc7XFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgaWR4ID0gMDtcXG4rXFx0XFx0dW5zaWduZWQgaW50IG5yID0gMTtcXG4gXFxuIFxcdFxcdC8qIHBnb2ZmIGlzIGludmFsaWQgZm9yIGtzbSBwYWdlcywgYnV0IHRoZXkgYXJlIG5ldmVyIGxhcmdlICovXFxuLVxcdFxcdGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiAhZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcXG4rXFx0XFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxcbiBcXHRcXHRcXHRpZHggPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIHB2bXcuYWRkcmVzcykgLSBwdm13LnBnb2ZmO1xcbiBcXHRcXHRuZXcgPSBmb2xpb19wYWdlKGZvbGlvLCBpZHgpO1xcbiBcXG4gI2lmZGVmIENPTkZJR19BUkNIX0hBU19QTURfU09GVExFQVZFU1xcbiBcXHRcXHQvKiBQTUQtbWFwcGVkIFRIUCBtaWdyYXRpb24gZW50cnkgKi9cXG4gXFx0XFx0aWYgKCFwdm13LnB0ZSkge1xcbi1cXHRcXHRcXHRWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSB8fFxcbi1cXHRcXHRcXHRcXHRcXHQhZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7XFxuK1xcdFxcdFxcdFZNX1dBUk5fT05fT05DRV9GT0xJTyghZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7XFxuIFxcdFxcdFxcdHJlbW92ZV9taWdyYXRpb25fcG1kKFxcdTAwMjZwdm13LCBuZXcpO1xcbiBcXHRcXHRcXHRjb250aW51ZTtcXG4gXFx0XFx0fVxcbiAjZW5kaWZcXG4tXFx0XFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpXFxuLVxcdFxcdFxcdG9sZF9wdGUgPSBodWdlX3B0ZXBfZ2V0KHZtYS1cXHUwMDNldm1fbW0sIHB2bXcuYWRkcmVzcyxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0cHZtdy5wdGUpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdG9sZF9wdGUgPSBwdGVwX2dldChwdm13LnB0ZSk7XFxuK1xcdFxcdG9sZF9wdGUgPSBwdGVwX2dldChwdm13LnB0ZSk7XFxuIFxcdFxcdGlmIChybWFwX3dhbGtfYXJnLVxcdTAwM2VtYXBfdW51c2VkX3RvX3plcm9wYWdlIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdCAgICB0cnlfdG9fbWFwX3VudXNlZF90b196ZXJvcGFnZShcXHUwMDI2cHZtdywgZm9saW8sIG9sZF9wdGUsIGlkeCkpXFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiBcXG4tXFx0XFx0Zm9saW9fZ2V0KGZvbGlvKTtcXG4tXFx0XFx0cHRlID0gbWtfcHRlKG5ldywgUkVBRF9PTkNFKHZtYS1cXHUwMDNldm1fcGFnZV9wcm90KSk7XFxuLVxcbiBcXHRcXHRlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKG9sZF9wdGUpO1xcbi1cXHRcXHRpZiAoIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSkpXFxuLVxcdFxcdFxcdHB0ZSA9IHB0ZV9ta29sZChwdGUpO1xcbi1cXHRcXHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXFx1MDAyNlxcdTAwMjYgc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KSlcXG4tXFx0XFx0XFx0cHRlID0gcHRlX21rZGlydHkocHRlKTtcXG4tXFx0XFx0aWYgKHB0ZV9zd3Bfc29mdF9kaXJ0eShvbGRfcHRlKSlcXG4tXFx0XFx0XFx0cHRlID0gcHRlX21rc29mdF9kaXJ0eShwdGUpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdHB0ZSA9IHB0ZV9jbGVhcl9zb2Z0X2RpcnR5KHB0ZSk7XFxuIFxcbi1cXHRcXHRpZiAoc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KSlcXG4tXFx0XFx0XFx0cHRlID0gcHRlX21rd3JpdGUocHRlLCB2bWEpO1xcbi1cXHRcXHRlbHNlIGlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkpXFxuLVxcdFxcdFxcdHB0ZSA9IHB0ZV9ta3VmZmQocHRlKTtcXG4tXFxuLVxcdFxcdC8qIFNlZSBkb19zd2FwX3BhZ2UoKTogcmVzdG9yZSBQQUdFX05PTkUgZm9yIFJXUCAqL1xcbi1cXHRcXHRpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpIFxcdTAwMjZcXHUwMDI2IHVzZXJmYXVsdGZkX3J3cCh2bWEpKVxcbi1cXHRcXHRcXHRwdGUgPSBwdGVfbW9kaWZ5KHB0ZSwgUEFHRV9OT05FKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVHJ5IHRvIHJlc3RvcmUgbnJcXHUwMDNlMSBjb250aWd1b3VzIFBURXMgaW4gb25lIHNob3QuIEZhbGxzIGJhY2tcXG4rXFx0XFx0ICogdG8gb3JpZ2luYWwgcGVyLVBURSBwYXRoIChucj0xKSBpZiBiYXRjaGluZyBpcyBub3QgcG9zc2libGUuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoIXJtYXBfd2Fsa19hcmctXFx1MDAzZW1hcF91bnVzZWRfdG9femVyb3BhZ2UgXFx1MDAyNlxcdTAwMjYgbGlrZWx5KCFpc19kZXZwcml2KSlcXG4rXFx0XFx0XFx0bnIgPSBtaWdyYXRpb25fcHRlX2JhdGNoKFxcdTAwMjZwdm13LCBmb2xpbywgb2xkX3B0ZSwgaWR4KTtcXG4gXFxuLVxcdFxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2ICFzb2Z0bGVhZl9pc19taWdyYXRpb25fcmVhZChlbnRyeSkpXFxuLVxcdFxcdFxcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XFxuK1xcdFxcdGZvbGlvX3JlZl9hZGQoZm9saW8sIG5yKTtcXG4rXFx0XFx0cHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgdm1hLCBcXHUwMDI2cm1hcF9mbGFncyk7XFxuIFxcbi1cXHRcXHRpZiAodW5saWtlbHkoaXNfZGV2aWNlX3ByaXZhdGVfcGFnZShuZXcpKSkge1xcbitcXHRcXHRpZiAodW5saWtlbHkoaXNfZGV2cHJpdikpIHtcXG4gXFx0XFx0XFx0aWYgKHB0ZV93cml0ZShwdGUpKVxcbiBcXHRcXHRcXHRcXHRlbnRyeSA9IG1ha2Vfd3JpdGFibGVfZGV2aWNlX3ByaXZhdGVfZW50cnkoXFxuIFxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhZ2VfdG9fcGZuKG5ldykpO1xcbkBAIC00MjQsMzAgKzUxNCwxMiBAQCBzdGF0aWMgYm9vbCByZW1vdmVfbWlncmF0aW9uX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbiBcXHRcXHRcXHRcXHRwdGUgPSBwdGVfc3dwX21rdWZmZChwdGUpO1xcbiBcXHRcXHR9XFxuIFxcbi0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRVxcbi1cXHRcXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xcbi1cXHRcXHRcXHRzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpO1xcbi1cXHRcXHRcXHR1bnNpZ25lZCBpbnQgc2hpZnQgPSBodWdlX3BhZ2Vfc2hpZnQoaCk7XFxuLVxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgcHNpemUgPSBodWdlX3BhZ2Vfc2l6ZShoKTtcXG4tXFxuLVxcdFxcdFxcdHB0ZSA9IGFyY2hfbWFrZV9odWdlX3B0ZShwdGUsIHNoaWZ0LCB2bWEtXFx1MDAzZXZtX2ZsYWdzKTtcXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXFxuLVxcdFxcdFxcdFxcdGh1Z2V0bGJfYWRkX2Fub25fcm1hcChmb2xpbywgdm1hLCBwdm13LmFkZHJlc3MsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIHJtYXBfZmxhZ3MpO1xcbi1cXHRcXHRcXHRlbHNlXFxuLVxcdFxcdFxcdFxcdGh1Z2V0bGJfYWRkX2ZpbGVfcm1hcChmb2xpbyk7XFxuLVxcdFxcdFxcdHNldF9odWdlX3B0ZV9hdCh2bWEtXFx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsXFxuLVxcdFxcdFxcdFxcdFxcdHBzaXplKTtcXG4tXFx0XFx0fSBlbHNlXFxuLSNlbmRpZlxcbi1cXHRcXHR7XFxuLVxcdFxcdFxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKVxcbi1cXHRcXHRcXHRcXHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZShmb2xpbywgbmV3LCB2bWEsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdHB2bXcuYWRkcmVzcywgcm1hcF9mbGFncyk7XFxuLVxcdFxcdFxcdGVsc2VcXG4tXFx0XFx0XFx0XFx0Zm9saW9fYWRkX2ZpbGVfcm1hcF9wdGUoZm9saW8sIG5ldywgdm1hKTtcXG4tXFx0XFx0XFx0c2V0X3B0ZV9hdCh2bWEtXFx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUpO1xcbi1cXHRcXHR9XFxuK1xcdFxcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKVxcbitcXHRcXHRcXHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIG5ldywgbnIsIHZtYSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHB2bXcuYWRkcmVzcywgcm1hcF9mbGFncyk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0Zm9saW9fYWRkX2ZpbGVfcm1hcF9wdGVzKGZvbGlvLCBuZXcsIG5yLCB2bWEpO1xcbitcXHRcXHRzZXRfcHRlcyh2bWEtXFx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsIG5yKTtcXG4gXFx0XFx0aWYgKFJFQURfT05DRSh2bWEtXFx1MDAzZXZtX2ZsYWdzKSBcXHUwMDI2IFZNX0xPQ0tFRClcXG4gXFx0XFx0XFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcXG4gXFxuQEAgLTQ1NSw3ICs1MjcsMTEgQEAgc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgY29tcG91bmRfb3JkZXIobmV3KSk7XFxuIFxcbiBcXHRcXHQvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovXFxuLVxcdFxcdHVwZGF0ZV9tbXVfY2FjaGUodm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTtcXG4rXFx0XFx0dXBkYXRlX21tdV9jYWNoZV9yYW5nZShOVUxMLCB2bWEsIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIG5yKTtcXG4rXFxuK1xcdFxcdC8qIFNraXAgdGhlIGJhdGNoZWQgUFRFcyAqL1xcbitcXHRcXHRwdm13LnB0ZSArPSBuciAtIDE7XFxuK1xcdFxcdHB2bXcuYWRkcmVzcyArPSAobnIgLSAxKSAqIFBBR0VfU0laRTtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIHRydWU7XFxuQEAgLTQ3NCw3ICs1NTAsOSBAQCB2b2lkIHJlbW92ZV9taWdyYXRpb25fcHRlcyhzdHJ1Y3QgZm9saW8gKnNyYywgc3RydWN0IGZvbGlvICpkc3QsXFxuIFxcdH07XFxuIFxcbiBcXHRzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgcndjID0ge1xcbi1cXHRcXHQucm1hcF9vbmUgPSByZW1vdmVfbWlncmF0aW9uX3B0ZSxcXG4rXFx0XFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKHNyYykgP1xcbitcXHRcXHRcXHRcXHRyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiIDpcXG4rXFx0XFx0XFx0XFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGUsXFxuIFxcdFxcdC5hcmcgPSBcXHUwMDI2cm1hcF93YWxrX2FyZyxcXG4gXFx0fTtcXG4gXFxuZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuY1xcbmluZGV4IGU4NTQ2Nzk1NTNiOWMzLi5jZmFjODVmNmY2OGE2OCAxMDA2NDRcXG4tLS0gYS9tbS9ybWFwLmNcXG4rKysgYi9tbS9ybWFwLmNcXG5AQCAtMjQwNSw2ICsyNDA1LDIyOSBAQCB2b2lkIHRyeV90b191bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBlbnVtIHR0dV9mbGFncyBmbGFncylcXG4gXFx0XFx0cm1hcF93YWxrKGZvbGlvLCBcXHUwMDI2cndjKTtcXG4gfVxcbiBcXG4rLyogQnVpbGQgdGhlIG1pZ3JhdGlvbiBzd2FwIFBURSB0aGF0IHJlcGxhY2VzIHB0ZXZhbCBmb3IgYSBwYWdlLiAqL1xcbitzdGF0aWMgcHRlX3QgbWFrZV9taWdyYXRpb25fc3dwX3B0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgcHRlX3QgcHRldmFsLFxcbitcXHRcXHRib29sIHdyaXRhYmxlLCBib29sIGFub25fZXhjbHVzaXZlKVxcbit7XFxuK1xcdHN3cF9lbnRyeV90IGVudHJ5O1xcbitcXHRwdGVfdCBzd3BfcHRlO1xcbitcXG4rXFx0aWYgKHdyaXRhYmxlKVxcbitcXHRcXHRlbnRyeSA9IG1ha2Vfd3JpdGFibGVfbWlncmF0aW9uX2VudHJ5KHBhZ2VfdG9fcGZuKHBhZ2UpKTtcXG4rXFx0ZWxzZSBpZiAoYW5vbl9leGNsdXNpdmUpXFxuK1xcdFxcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KFxcbitcXHRcXHRcXHRcXHRcXHRcXHRwYWdlX3RvX3BmbihwYWdlKSk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShwYWdlX3RvX3BmbihwYWdlKSk7XFxuK1xcbitcXHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XFxuK1xcdFxcdGlmIChwdGVfeW91bmcocHRldmFsKSlcXG4rXFx0XFx0XFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7XFxuK1xcdFxcdGlmIChwdGVfZGlydHkocHRldmFsKSlcXG4rXFx0XFx0XFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShlbnRyeSk7XFxuK1xcdFxcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcXG4rXFx0XFx0aWYgKHB0ZV9zb2Z0X2RpcnR5KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcXG4rXFx0XFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpO1xcbitcXHRcXHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcXG4rXFx0XFx0aWYgKHB0ZV9zd3BfdWZmZChwdGV2YWwpKVxcbitcXHRcXHRcXHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBzd3BfcHRlO1xcbit9XFxuK1xcbisvKlxcbisgKiBSZXBsYWNlIHRoZSBodWdldGxiIHBhZ2UgdGFibGUgbWFwcGluZyBmb3IgZm9saW8gd2l0aCBtaWdyYXRpb24gZW50cmllcy5cXG4rICpcXG4rICogQGFyZzogZW51bSB0dHVfZmxhZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBhcmd1bWVudC5cXG4rICovXFxuK3N0YXRpYyBib29sIHRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuK1xcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcXG4re1xcbitcXHRjb25zdCB1bnNpZ25lZCBsb25nIGhzeiA9IGh1Z2VfcGFnZV9zaXplKGhzdGF0ZV92bWEodm1hKSk7XFxuK1xcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTtcXG4rXFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xcbitcXHRib29sIGFub25fZXhjbHVzaXZlLCB3cml0YWJsZSwgcmV0ID0gdHJ1ZTtcXG4rXFx0Ym9vbCBhbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcXG4rXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbitcXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xcbitcXHR1bnNpZ25lZCBsb25nIHBmbjtcXG4rXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdHB0ZV90IHB0ZXZhbDtcXG4rXFxuK1xcdHJhbmdlLmVuZCA9IHZtYV9hZGRyZXNzX2VuZChcXHUwMDI2cHZtdyk7XFxuK1xcdG1tdV9ub3RpZmllcl9yYW5nZV9pbml0KFxcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVxcdTAwM2V2bV9tbSxcXG4rXFx0XFx0XFx0XFx0YWRkcmVzcywgcmFuZ2UuZW5kKTtcXG4rXFx0LyogSWYgc2hhcmluZyBpcyBwb3NzaWJsZSwgc3RhcnQgYW5kIGVuZCB3aWxsIGJlIGFkanVzdGVkIGFjY29yZGluZ2x5LiAqL1xcbitcXHRhZGp1c3RfcmFuZ2VfaWZfcG1kX3NoYXJpbmdfcG9zc2libGUodm1hLCBcXHUwMDI2cmFuZ2Uuc3RhcnQsIFxcdTAwMjZyYW5nZS5lbmQpO1xcbitcXHRtbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydChcXHUwMDI2cmFuZ2UpO1xcbitcXG4rXFx0aWYgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFxcdTAwMjZwdm13KSkge1xcbitcXHRcXHRhZGRyZXNzID0gcHZtdy5hZGRyZXNzO1xcbitcXHRcXHRwdGV2YWwgPSBodWdlX3B0ZXBfZ2V0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSk7XFxuK1xcdFxcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpXFxuK1xcdFxcdFxcdHBmbiA9IHB0ZV9wZm4ocHRldmFsKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oc29mdGxlYWZfZnJvbV9wdGUocHRldmFsKSk7XFxuK1xcbitcXHRcXHRwYWdlID0gZm9saW9fcGFnZShmb2xpbywgcGZuIC0gZm9saW9fcGZuKGZvbGlvKSk7XFxuK1xcdFxcdGFub25fZXhjbHVzaXZlID0gYW5vbiBcXHUwMDI2XFx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS4gVGhlcmUgaXMgbm9cXG4rXFx0XFx0ICogd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heSBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sXFxuK1xcdFxcdCAqIHNvIHdlIG11c3QgZmx1c2ggdGhlbSBhbGwuIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWRcXG4rXFx0XFx0ICogYWJvdmUgdG8gY292ZXIgdGhpcyByYW5nZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUbyBjYWxsIGh1Z2VfcG1kX3Vuc2hhcmUsIGlfbW1hcF9yd3NlbSBtdXN0IGJlIGhlbGQgaW4gd3JpdGVcXG4rXFx0XFx0ICogbW9kZS4gQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkgZG8gdGhpcyBvdXRzaWRlIHJtYXBcXG4rXFx0XFx0ICogcm91dGluZXMuIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS5cXG4rXFx0XFx0ICogTG9jayBvcmRlciBkaWN0YXRlcyBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFIGlfbW1hcF9yd3NlbS5cXG4rXFx0XFx0ICogV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmQgZmFpbCBpZiB1bnN1Y2Nlc3NmdWwuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoIWFub24pIHtcXG4rXFx0XFx0XFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xcbitcXG4rXFx0XFx0XFx0Vk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgXFx1MDAyNiBUVFVfUk1BUF9MT0NLRUQpKTtcXG4rXFx0XFx0XFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpIHtcXG4rXFx0XFx0XFx0XFx0cmV0ID0gZmFsc2U7XFxuK1xcdFxcdFxcdFxcdGdvdG8gd2Fsa19kb25lO1xcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHR0bGJfZ2F0aGVyX21tdV92bWEoXFx1MDAyNnRsYiwgdm1hKTtcXG4rXFx0XFx0XFx0aWYgKGh1Z2VfcG1kX3Vuc2hhcmUoXFx1MDAyNnRsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHtcXG4rXFx0XFx0XFx0XFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XFxuK1xcdFxcdFxcdFxcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXFx1MDAyNnRsYiwgdm1hKTtcXG4rXFx0XFx0XFx0XFx0dGxiX2ZpbmlzaF9tbXUoXFx1MDAyNnRsYik7XFxuK1xcdFxcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdFxcdCAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLFxcbitcXHRcXHRcXHRcXHQgKiBjb25zZXF1ZW50bHkgdW5tYXBwaW5nIHRoZSBmb2xpby5cXG4rXFx0XFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdFxcdGdvdG8gd2Fsa19kb25lO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xcbitcXHRcXHRcXHR0bGJfZmluaXNoX21tdShcXHUwMDI2dGxiKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LyogTnVrZSB0aGUgaHVnZXRsYiBwYWdlIHRhYmxlIGVudHJ5ICovXFxuK1xcdFxcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcXG4rXFx0XFx0aWYgKGh1Z2VfcHRlX2RpcnR5KHB0ZXZhbCkpXFxuK1xcdFxcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbitcXHRcXHR3cml0YWJsZSA9IHB0ZV93cml0ZShwdGV2YWwpO1xcbitcXG4rXFx0XFx0Vk1fV0FSTl9PTl9GT0xJTyh3cml0YWJsZSBcXHUwMDI2XFx1MDAyNiBhbm9uIFxcdTAwMjZcXHUwMDI2ICFhbm9uX2V4Y2x1c2l2ZSwgZm9saW8pO1xcbitcXG4rXFx0XFx0aWYgKFBhZ2VIV1BvaXNvbihwYWdlKSkge1xcbitcXHRcXHRcXHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpO1xcbitcXHRcXHRcXHRodWdldGxiX2NvdW50X3N1Yihmb2xpb19ucl9wYWdlcyhmb2xpbyksIG1tKTtcXG4rXFx0XFx0XFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBoc3opO1xcbitcXHRcXHR9IGVsc2UgaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSBcXHUwMDI2XFx1MDAyNiBwdGVfdW51c2VkKHB0ZXZhbCkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIXVzZXJmYXVsdGZkX2FybWVkKHZtYSkpIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogVGhlIGd1ZXN0IGluZGljYXRlZCB0aGF0IHRoZSBwYWdlIGNvbnRlbnQgaXMgb2Ygbm9cXG4rXFx0XFx0XFx0ICogaW50ZXJlc3QgYW55bW9yZS4gU2ltcGx5IGRpc2NhcmQgdGhlIHB0ZSwgdm1zY2FuXFxuK1xcdFxcdFxcdCAqIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0LlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0cHRlX3Qgc3dwX3B0ZTtcXG4rXFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cXG4rXFx0XFx0XFx0ICogYXJjaGl0ZWN0dXJlcyB3aGVyZSB3ZSBjb3VsZCBoYXZlIFBGTiBzd2FwIFBURXMsXFxuK1xcdFxcdFxcdCAqIHNvIHdlJ2xsIG5vdCBjaGVjay9jYXJlLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0aWYgKGFyY2hfdW5tYXBfb25lKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXZhbCkgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdFxcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHB0ZXZhbCwgaHN6KTtcXG4rXFx0XFx0XFx0XFx0cmV0ID0gZmFsc2U7XFxuK1xcdFxcdFxcdFxcdGdvdG8gd2Fsa19kb25lO1xcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHQvKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xcbitcXHRcXHRcXHRpZiAoYW5vbl9leGNsdXNpdmUgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIGh1Z2V0bGJfdHJ5X3NoYXJlX2Fub25fcm1hcChmb2xpbykpIHtcXG4rXFx0XFx0XFx0XFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0cHRldmFsLCBoc3opO1xcbitcXHRcXHRcXHRcXHRyZXQgPSBmYWxzZTtcXG4rXFx0XFx0XFx0XFx0Z290byB3YWxrX2RvbmU7XFxuK1xcdFxcdFxcdH1cXG4rXFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIFN0b3JlIHRoZSBwZm4gb2YgdGhlIHBhZ2UgaW4gYSBzcGVjaWFsIG1pZ3JhdGlvblxcbitcXHRcXHRcXHQgKiBwdGUuIGRvX3N3YXBfcGFnZSgpIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWlncmF0aW9uXFxuK1xcdFxcdFxcdCAqIHB0ZSBpcyByZW1vdmVkIGFuZCB0aGVuIHJlc3RhcnQgZmF1bHQgaGFuZGxpbmcuXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRzd3BfcHRlID0gbWFrZV9taWdyYXRpb25fc3dwX3B0ZShwYWdlLCBwdGV2YWwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCB3cml0YWJsZSwgYW5vbl9leGNsdXNpdmUpO1xcbitcXHRcXHRcXHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlLCBoc3opO1xcbitcXHRcXHRcXHR0cmFjZV9zZXRfbWlncmF0aW9uX3B0ZShhZGRyZXNzLCBwdGVfdmFsKHN3cF9wdGUpLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRmb2xpb19vcmRlcihmb2xpbykpO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRodWdldGxiX3JlbW92ZV9ybWFwKGZvbGlvKTtcXG4rXFx0XFx0aWYgKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9MT0NLRUQpXFxuK1xcdFxcdFxcdG1sb2NrX2RyYWluX2xvY2FsKCk7XFxuK1xcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuK3dhbGtfZG9uZTpcXG4rXFx0XFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcXHUwMDI2cHZtdyk7XFxuK1xcdH1cXG4rXFxuK1xcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChcXHUwMDI2cmFuZ2UpO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2goc3RydWN0IGZvbGlvICpmb2xpbyxcXG4rXFx0XFx0c3RydWN0IHBhZ2Vfdm1hX21hcHBlZF93YWxrICpwdm13LCBwdGVfdCBwdGUsXFxuK1xcdFxcdHN0cnVjdCBwYWdlICpzdWJwYWdlLCBib29sIGFub25fZXhjbHVzaXZlKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIsIGFkZHIgPSBwdm13LVxcdTAwM2VhZGRyZXNzO1xcbitcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IHB2bXctXFx1MDAzZXZtYTtcXG4rXFx0dW5zaWduZWQgaW50IG1heF9uciwgbnIsIGk7XFxuK1xcbisjaWZkZWYgX19IQVZFX0FSQ0hfVU5NQVBfT05FXFxuK1xcdC8qIENhbm5vdCBiYXRjaCB1bm1hcCBpZiBhcmNoX3VubWFwX29uZSgpIGlzIGRlZmluZWQuICovXFxuK1xcdHJldHVybiAxO1xcbisjZW5kaWZcXG4rXFxuK1xcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXFxuK1xcdFxcdHJldHVybiAxO1xcbitcXHRpZiAoZm9saW9faXNfem9uZV9kZXZpY2UoZm9saW8pIHx8IGZvbGlvX3Rlc3RfaGFzX2h3cG9pc29uZWQoZm9saW8pKVxcbitcXHRcXHRyZXR1cm4gMTtcXG4rXFx0aWYgKHB0ZV91bnVzZWQocHRlKSlcXG4rXFx0XFx0cmV0dXJuIDE7XFxuK1xcbitcXHQvKiBXZSBtYXkgb25seSBiYXRjaCB3aXRoaW4gYSBzaW5nbGUgVk1BIGFuZCBhIHNpbmdsZSBwYWdlIHRhYmxlLiAqL1xcbitcXHRlbmRfYWRkciA9IHBtZF9hZGRyX2VuZChhZGRyLCB2bWEtXFx1MDAzZXZtX2VuZCk7XFxuK1xcdG1heF9uciA9IChlbmRfYWRkciAtIGFkZHIpIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdC8qXFxuK1xcdCAqIElmIHVubWFwIGZhaWxzLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHB0ZXMuIFRvIGF2b2lkIGFjY2lkZW50YWxseVxcbitcXHQgKiB1cGdyYWRpbmcgd3JpdGUgcGVybWlzc2lvbnMgZm9yIHB0ZXMgdGhhdCB3ZXJlIG5vdCBvcmlnaW5hbGx5IHdyaXRhYmxlLFxcbitcXHQgKiBhbmQgdG8gYXZvaWQgbG9zaW5nIHRoZSBzb2Z0LWRpcnR5IGJpdCwgdXNlIHRoZSBhcHByb3ByaWF0ZSBGUEIgZmxhZ3MuXFxuK1xcdCAqL1xcbitcXHRuciA9IGZvbGlvX3B0ZV9iYXRjaF9mbGFncyhmb2xpbywgdm1hLCBwdm13LVxcdTAwM2VwdGUsIFxcdTAwMjZwdGUsIG1heF9ucixcXG4rXFx0XFx0XFx0XFx0ICAgRlBCX1JFU1BFQ1RfV1JJVEUgfCBGUEJfUkVTUEVDVF9TT0ZUX0RJUlRZKTtcXG4rXFxuK1xcdC8qIExpbWl0IHBvc3NpYmxlIGJhdGNoIGNvdW50IHRvIGEgdW5pZm9ybSBQYWdlQW5vbkV4Y2x1c2l2ZSB2YWx1ZSAqL1xcbitcXHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xcbitcXHRcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgbnI7IGkrKylcXG4rXFx0XFx0XFx0aWYgKFBhZ2VBbm9uRXhjbHVzaXZlKHN1YnBhZ2UgKyBpKSAhPSBhbm9uX2V4Y2x1c2l2ZSlcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdG5yID0gaTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIG5yO1xcbit9XFxuK1xcbiAvKlxcbiAgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50LlxcbiAgKlxcbkBAIC0yNDIxLDggKzI2NDQsNyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdHN0cnVjdCBwYWdlICpzdWJwYWdlO1xcbiBcXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xcbiBcXHRlbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcGZuO1xcbi1cXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuLCBlbmRfYWRkciwgbnJfcGFnZXM7XFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBXaGVuIHJhY2luZyBhZ2FpbnN0IGUuZy4gemFwX3B0ZV9yYW5nZSgpIG9uIGFub3RoZXIgY3B1LFxcbkBAIC0yNDM1LDI2ICsyNjU3LDEzIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIEZvciBUSFAsIHdlIGhhdmUgdG8gYXNzdW1lIHRoZSB3b3JzZSBjYXNlIGllIHBtZCBmb3IgaW52YWxpZGF0aW9uLlxcbi1cXHQgKiBGb3IgaHVnZXRsYiwgaXQgY291bGQgYmUgbXVjaCB3b3JzZSBpZiB3ZSBuZWVkIHRvIGRvIHB1ZFxcbi1cXHQgKiBpbnZhbGlkYXRpb24gaW4gdGhlIGNhc2Ugb2YgcG1kIHNoYXJpbmcuXFxuIFxcdCAqXFxuIFxcdCAqIE5vdGUgdGhhdCB0aGUgcGFnZSBjYW4gbm90IGJlIGZyZWUgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mXFxuLVxcdCAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS5cXG4rXFx0ICogdHJ5X3RvX21pZ3JhdGUoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIHBhZ2UuXFxuIFxcdCAqL1xcbiBcXHRyYW5nZS5lbmQgPSB2bWFfYWRkcmVzc19lbmQoXFx1MDAyNnB2bXcpO1xcbiBcXHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcXHUwMDI2cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS1cXHUwMDNldm1fbW0sXFxuIFxcdFxcdFxcdFxcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XFxuLVxcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIHNoYXJpbmcgaXMgcG9zc2libGUsIHN0YXJ0IGFuZCBlbmQgd2lsbCBiZSBhZGp1c3RlZFxcbi1cXHRcXHQgKiBhY2NvcmRpbmdseS5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsIFxcdTAwMjZyYW5nZS5zdGFydCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2cmFuZ2UuZW5kKTtcXG4tXFxuLVxcdFxcdC8qIFdlIG5lZWQgdGhlIGh1Z2UgcGFnZSBzaXplIGZvciBzZXRfaHVnZV9wdGVfYXQoKSAqL1xcbi1cXHRcXHRoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xcbi1cXHR9XFxuIFxcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFxcdTAwMjZyYW5nZSk7XFxuIFxcbiBcXHR3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoXFx1MDAyNnB2bXcpKSB7XFxuQEAgLTI0ODgsMTEgKzI2OTcsOCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdFZNX0JVR19PTl9GT0xJTyhmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pIHx8XFxuIFxcdFxcdFxcdFxcdFxcdCFmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbyksIGZvbGlvKTtcXG4gXFxuLVxcdFxcdFxcdGlmIChzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeShcXHUwMDI2cHZtdywgc3VicGFnZSkpIHtcXG4tXFx0XFx0XFx0XFx0cmV0ID0gZmFsc2U7XFxuLVxcdFxcdFxcdFxcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXFx1MDAyNnB2bXcpO1xcbi1cXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRpZiAoc2V0X3BtZF9taWdyYXRpb25fZW50cnkoXFx1MDAyNnB2bXcsIHN1YnBhZ2UpKVxcbitcXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuIFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAjZW5kaWZcXG4gXFx0XFx0fVxcbkBAIC0yNTAxLDEwICsyNzA3LDcgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHRWTV9CVUdfT05fRk9MSU8oIXB2bXcucHRlLCBmb2xpbyk7XFxuIFxcbiBcXHRcXHRhZGRyZXNzID0gcHZtdy5hZGRyZXNzO1xcbi1cXHRcXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcXG4tXFx0XFx0XFx0cHRldmFsID0gaHVnZV9wdGVwX2dldChtbSwgYWRkcmVzcywgcHZtdy5wdGUpO1xcbi1cXHRcXHRlbHNlXFxuLVxcdFxcdFxcdHB0ZXZhbCA9IHB0ZXBfZ2V0KHB2bXcucHRlKTtcXG4rXFx0XFx0cHRldmFsID0gcHRlcF9nZXQocHZtdy5wdGUpO1xcbiBcXHRcXHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XFxuIFxcdFxcdFxcdHBmbiA9IHB0ZV9wZm4ocHRldmFsKTtcXG4gXFx0XFx0fSBlbHNlIHtcXG5AQCAtMjUxNSw2OCArMjcxOCwyMiBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdGNvbnN0IHNvZnRsZWFmX3QgZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3B0ZShwdGV2YWwpO1xcbiBcXG4gXFx0XFx0XFx0cGZuID0gc29mdGxlYWZfdG9fcGZuKGVudHJ5KTtcXG4tXFx0XFx0XFx0Vk1fV0FSTl9PTl9GT0xJTyhmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pLCBmb2xpbyk7XFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdHN1YnBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcXG4gXFx0XFx0YW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdFxcdFxcdCBQYWdlQW5vbkV4Y2x1c2l2ZShzdWJwYWdlKTtcXG4gXFxuLVxcdFxcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XFxuLVxcdFxcdFxcdGJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XFxuLVxcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBodWdlX3BtZF91bnNoYXJlIG1heSB1bm1hcCBhbiBlbnRpcmUgUE1EIHBhZ2UuXFxuLVxcdFxcdFxcdCAqIFRoZXJlIGlzIG5vIHdheSBvZiBrbm93aW5nIGV4YWN0bHkgd2hpY2ggUE1EcyBtYXlcXG4tXFx0XFx0XFx0ICogYmUgY2FjaGVkIGZvciB0aGlzIG1tLCBzbyB3ZSBtdXN0IGZsdXNoIHRoZW0gYWxsLlxcbi1cXHRcXHRcXHQgKiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkIGFib3ZlIHRvIGNvdmVyIHRoaXNcXG4tXFx0XFx0XFx0ICogcmFuZ2UuXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xcbi1cXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZVxcbi1cXHRcXHRcXHQgKiBoZWxkIGluIHdyaXRlIG1vZGUuICBDYWxsZXIgbmVlZHMgdG8gZXhwbGljaXRseVxcbi1cXHRcXHRcXHQgKiBkbyB0aGlzIG91dHNpZGUgcm1hcCByb3V0aW5lcy5cXG4tXFx0XFx0XFx0ICpcXG4tXFx0XFx0XFx0ICogV2UgYWxzbyBtdXN0IGhvbGQgaHVnZXRsYiB2bWFfbG9jayBpbiB3cml0ZSBtb2RlLlxcbi1cXHRcXHRcXHQgKiBMb2NrIG9yZGVyIGRpY3RhdGVzIGFjcXVpcmluZyB2bWFfbG9jayBCRUZPUkVcXG4tXFx0XFx0XFx0ICogaV9tbWFwX3J3c2VtLiAgV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmRcXG4tXFx0XFx0XFx0ICogZmFpbCBpZiB1bnN1Y2Nlc3NmdWwuXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRpZiAoIWFub24pIHtcXG4tXFx0XFx0XFx0XFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xcbitcXHRcXHRucl9wYWdlcyA9IDE7XFxuK1xcdFxcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcXG4rXFx0XFx0XFx0bnJfcGFnZXMgPSBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaChmb2xpbywgXFx1MDAyNnB2bXcsIHB0ZXZhbCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgc3VicGFnZSwgYW5vbl9leGNsdXNpdmUpO1xcbiBcXG4tXFx0XFx0XFx0XFx0Vk1fQlVHX09OKCEoZmxhZ3MgXFx1MDAyNiBUVFVfUk1BUF9MT0NLRUQpKTtcXG4tXFx0XFx0XFx0XFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpIHtcXG4tXFx0XFx0XFx0XFx0XFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcXHUwMDI2cHZtdyk7XFxuLVxcdFxcdFxcdFxcdFxcdHJldCA9IGZhbHNlO1xcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHRlbmRfYWRkciA9IGFkZHJlc3MgKyBucl9wYWdlcyAqIFBBR0VfU0laRTtcXG4rXFx0XFx0XFx0Zmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCBhZGRyZXNzLCBlbmRfYWRkcik7XFxuIFxcbi1cXHRcXHRcXHRcXHR0bGJfZ2F0aGVyX21tdV92bWEoXFx1MDAyNnRsYiwgdm1hKTtcXG4tXFx0XFx0XFx0XFx0aWYgKGh1Z2VfcG1kX3Vuc2hhcmUoXFx1MDAyNnRsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHtcXG4tXFx0XFx0XFx0XFx0XFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XFxuLVxcdFxcdFxcdFxcdFxcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXFx1MDAyNnRsYiwgdm1hKTtcXG4tXFx0XFx0XFx0XFx0XFx0dGxiX2ZpbmlzaF9tbXUoXFx1MDAyNnRsYik7XFxuLVxcdFxcdFxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdFxcdFxcdCAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLFxcbi1cXHRcXHRcXHRcXHRcXHQgKiBjb25zZXF1ZW50bHkgdW5tYXBwaW5nIHRoZSBmb2xpby5cXG4tXFx0XFx0XFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdFxcdFxcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXFx1MDAyNnB2bXcpO1xcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRcXHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcXG4tXFx0XFx0XFx0XFx0dGxiX2ZpbmlzaF9tbXUoXFx1MDAyNnRsYik7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0LyogTnVrZSB0aGUgaHVnZXRsYiBwYWdlIHRhYmxlIGVudHJ5ICovXFxuLVxcdFxcdFxcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcXG4tXFx0XFx0XFx0aWYgKHB0ZV9kaXJ0eShwdGV2YWwpKVxcbi1cXHRcXHRcXHRcXHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcXG4tXFx0XFx0XFx0d3JpdGFibGUgPSBwdGVfd3JpdGUocHRldmFsKTtcXG4tXFx0XFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcXG4tXFx0XFx0XFx0Zmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHJlc3MsIHBmbik7XFxuLVxcdFxcdFxcdC8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cnkuICovXFxuK1xcdFxcdFxcdC8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cmllcy4gKi9cXG4rXFx0XFx0XFx0cHRldmFsID0gZ2V0X2FuZF9jbGVhcl9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgbnJfcGFnZXMpO1xcbiBcXHRcXHRcXHRpZiAoc2hvdWxkX2RlZmVyX2ZsdXNoKG1tLCBmbGFncykpIHtcXG4gXFx0XFx0XFx0XFx0LypcXG4gXFx0XFx0XFx0XFx0ICogV2UgY2xlYXIgdGhlIFBURSBidXQgZG8gbm90IGZsdXNoIHNvIHBvdGVudGlhbGx5XFxuQEAgLTI1ODYsMTEgKzI3NDMsOSBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdFxcdCAqIHRyYW5zaXRpb24gb24gYSBjYWNoZWQgVExCIGVudHJ5IGlzIHdyaXR0ZW4gdGhyb3VnaFxcbiBcXHRcXHRcXHRcXHQgKiBhbmQgdHJhcHMgaWYgdGhlIFBURSBpcyB1bm1hcHBlZC5cXG4gXFx0XFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdFxcdHB0ZXZhbCA9IHB0ZXBfZ2V0X2FuZF9jbGVhcihtbSwgYWRkcmVzcywgcHZtdy5wdGUpO1xcbi1cXG4tXFx0XFx0XFx0XFx0c2V0X3RsYl91YmNfZmx1c2hfcGVuZGluZyhtbSwgcHRldmFsLCBhZGRyZXNzLCBhZGRyZXNzICsgUEFHRV9TSVpFKTtcXG4rXFx0XFx0XFx0XFx0c2V0X3RsYl91YmNfZmx1c2hfcGVuZGluZyhtbSwgcHRldmFsLCBhZGRyZXNzLCBlbmRfYWRkcik7XFxuIFxcdFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdFxcdHB0ZXZhbCA9IHB0ZXBfY2xlYXJfZmx1c2godm1hLCBhZGRyZXNzLCBwdm13LnB0ZSk7XFxuK1xcdFxcdFxcdFxcdGZsdXNoX3RsYl9yYW5nZSh2bWEsIGFkZHJlc3MsIGVuZF9hZGRyKTtcXG4gXFx0XFx0XFx0fVxcbiBcXHRcXHRcXHRpZiAocHRlX2RpcnR5KHB0ZXZhbCkpXFxuIFxcdFxcdFxcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbkBAIC0yNjEzLDE0ICsyNzY4LDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHRcXHRWTV9XQVJOX09OX0ZPTElPKGZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSwgZm9saW8pO1xcbiBcXG4gXFx0XFx0XFx0cHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KHN1YnBhZ2UpKTtcXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcXG4tXFx0XFx0XFx0XFx0aHVnZXRsYl9jb3VudF9zdWIoZm9saW9fbnJfcGFnZXMoZm9saW8pLCBtbSk7XFxuLVxcdFxcdFxcdFxcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0aHN6KTtcXG4tXFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcXG4tXFx0XFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuLVxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcXG4rXFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuIFxcdFxcdH0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpIFxcdTAwMjZcXHUwMDI2IHB0ZV91bnVzZWQocHRldmFsKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHRcXHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xcbiBcXHRcXHRcXHQvKlxcbkBAIC0yNjM1LDggKzI3ODQsOCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdCAqL1xcbiBcXHRcXHRcXHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xcbiBcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRzd3BfZW50cnlfdCBlbnRyeTtcXG4gXFx0XFx0XFx0cHRlX3Qgc3dwX3B0ZTtcXG4rXFx0XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuIFxcbiBcXHRcXHRcXHQvKlxcbiBcXHRcXHRcXHQgKiBhcmNoX3VubWFwX29uZSgpIGlzIGV4cGVjdGVkIHRvIGJlIGEgTk9QIG9uXFxuQEAgLTI2NDQsMzIgKzI3OTMsMTUgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHRcXHQgKiBzbyB3ZSdsbCBub3QgY2hlY2svY2FyZS5cXG4gXFx0XFx0XFx0ICovXFxuIFxcdFxcdFxcdGlmIChhcmNoX3VubWFwX29uZShtbSwgdm1hLCBhZGRyZXNzLCBwdGV2YWwpIFxcdTAwM2MgMCkge1xcbi1cXHRcXHRcXHRcXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0XFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0cHRldmFsLCBoc3opO1xcbi1cXHRcXHRcXHRcXHRlbHNlXFxuLVxcdFxcdFxcdFxcdFxcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xcbi1cXHRcXHRcXHRcXHRyZXQgPSBmYWxzZTtcXG4tXFx0XFx0XFx0XFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcXHUwMDI2cHZtdyk7XFxuLVxcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHRcXHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xcbitcXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuIFxcdFxcdFxcdH1cXG4gXFxuLVxcdFxcdFxcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZSgpOiBjbGVhciBQVEUgZmlyc3QuICovXFxuLVxcdFxcdFxcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XFxuLVxcdFxcdFxcdFxcdGlmIChhbm9uX2V4Y2x1c2l2ZSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHRcXHQgICAgaHVnZXRsYl90cnlfc2hhcmVfYW5vbl9ybWFwKGZvbGlvKSkge1xcbi1cXHRcXHRcXHRcXHRcXHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHRwdGV2YWwsIGhzeik7XFxuLVxcdFxcdFxcdFxcdFxcdHJldCA9IGZhbHNlO1xcbi1cXHRcXHRcXHRcXHRcXHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFxcdTAwMjZwdm13KTtcXG4tXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0fSBlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHRcXHQgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZShmb2xpbywgc3VicGFnZSkpIHtcXG4tXFx0XFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuLVxcdFxcdFxcdFxcdHJldCA9IGZhbHNlO1xcbi1cXHRcXHRcXHRcXHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFxcdTAwMjZwdm13KTtcXG4tXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xcbitcXHRcXHRcXHRpZiAoYW5vbl9leGNsdXNpdmUgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhmb2xpbywgc3VicGFnZSwgbnJfcGFnZXMpKSB7XFxuK1xcdFxcdFxcdFxcdHNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7XFxuK1xcdFxcdFxcdFxcdGdvdG8gd2Fsa19hYm9ydDtcXG4gXFx0XFx0XFx0fVxcbiBcXG4gXFx0XFx0XFx0LypcXG5AQCAtMjY3Nyw1MiArMjgwOSw0MCBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdCAqIHB0ZS4gZG9fc3dhcF9wYWdlKCkgd2lsbCB3YWl0IHVudGlsIHRoZSBtaWdyYXRpb25cXG4gXFx0XFx0XFx0ICogcHRlIGlzIHJlbW92ZWQgYW5kIHRoZW4gcmVzdGFydCBmYXVsdCBoYW5kbGluZy5cXG4gXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmICh3cml0YWJsZSlcXG4tXFx0XFx0XFx0XFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0cGFnZV90b19wZm4oc3VicGFnZSkpO1xcbi1cXHRcXHRcXHRlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSlcXG4tXFx0XFx0XFx0XFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkoXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTtcXG4tXFx0XFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRcXHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHRwYWdlX3RvX3BmbihzdWJwYWdlKSk7XFxuLVxcdFxcdFxcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcXG4tXFx0XFx0XFx0XFx0aWYgKHB0ZV95b3VuZyhwdGV2YWwpKVxcbi1cXHRcXHRcXHRcXHRcXHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X3lvdW5nKGVudHJ5KTtcXG4tXFx0XFx0XFx0XFx0aWYgKHB0ZV9kaXJ0eShwdGV2YWwpKVxcbi1cXHRcXHRcXHRcXHRcXHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTtcXG4tXFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpO1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3NvZnRfZGlydHkocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3VmZmQocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xcbi1cXHRcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRcXHRzd3BfcHRlID0gc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSk7XFxuLVxcdFxcdFxcdFxcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3N3cF91ZmZkKHB0ZXZhbCkpXFxuLVxcdFxcdFxcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcXG4tXFx0XFx0XFx0XFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0aHN6KTtcXG4tXFx0XFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRcXHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSk7XFxuK1xcdFxcdFxcdHN3cF9wdGUgPSBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlKHN1YnBhZ2UsIHB0ZXZhbCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0IHdyaXRhYmxlLCBhbm9uX2V4Y2x1c2l2ZSk7XFxuIFxcdFxcdFxcdHRyYWNlX3NldF9taWdyYXRpb25fcHRlKGFkZHJlc3MsIHB0ZV92YWwoc3dwX3B0ZSksXFxuIFxcdFxcdFxcdFxcdFxcdFxcdGZvbGlvX29yZGVyKGZvbGlvKSk7XFxuK1xcbitcXHRcXHRcXHQvKiBTZXQgbnJfcGFnZXMgbWlncmF0aW9uIGVudHJpZXMsIGFkdmFuY2luZyB0aGUgUEZOLiAqL1xcbitcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xcbitcXHRcXHRcXHRcXHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzICsgKHVuc2lnbmVkIGxvbmcpaSAqIFBBR0VfU0laRSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgcHZtdy5wdGUgKyBpLCBzd3BfcHRlKTtcXG4rXFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQoc3dwX3B0ZSk7XFxuK1xcdFxcdFxcdH1cXG4gXFx0XFx0XFx0LypcXG4gXFx0XFx0XFx0ICogTm8gbmVlZCB0byBpbnZhbGlkYXRlIGhlcmUgaXQgd2lsbCBzeW5jaHJvbml6ZSBvblxcbiBcXHRcXHRcXHQgKiBhZ2FpbnN0IHRoZSBzcGVjaWFsIHN3YXAgbWlncmF0aW9uIHB0ZS5cXG4gXFx0XFx0XFx0ICovXFxuIFxcdFxcdH1cXG4gXFxuLVxcdFxcdGlmICh1bmxpa2VseShmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSlcXG4tXFx0XFx0XFx0aHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7XFxuLVxcdFxcdGVsc2VcXG4tXFx0XFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcHRlKGZvbGlvLCBzdWJwYWdlLCB2bWEpO1xcbitcXHRcXHRmb2xpb19yZW1vdmVfcm1hcF9wdGVzKGZvbGlvLCBzdWJwYWdlLCBucl9wYWdlcywgdm1hKTtcXG4gXFx0XFx0aWYgKHZtYS1cXHUwMDNldm1fZmxhZ3MgXFx1MDAyNiBWTV9MT0NLRUQpXFxuIFxcdFxcdFxcdG1sb2NrX2RyYWluX2xvY2FsKCk7XFxuLVxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuK1xcdFxcdGZvbGlvX3B1dF9yZWZzKGZvbGlvLCBucl9wYWdlcyk7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBJZiB3ZSBiYXRjaGVkIHRoZSBlbnRpcmUgZm9saW8sIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0b1xcbitcXHRcXHQgKiB3YWxrOyBzdG9wIHJpZ2h0IGhlcmUuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAobnJfcGFnZXMgPT0gZm9saW9fbnJfcGFnZXMoZm9saW8pKVxcbitcXHRcXHRcXHRnb3RvIHdhbGtfZG9uZTtcXG4rXFx0XFx0Y29udGludWU7XFxuK3dhbGtfYWJvcnQ6XFxuK1xcdFxcdHJldCA9IGZhbHNlO1xcbit3YWxrX2RvbmU6XFxuK1xcdFxcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXFx1MDAyNnB2bXcpO1xcbitcXHRcXHRicmVhaztcXG4gXFx0fVxcbiBcXG4gXFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFxcdTAwMjZyYW5nZSk7XFxuQEAgLTI3NDEsNyArMjg2MSw4IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gdm9pZCB0cnlfdG9fbWlncmF0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBlbnVtIHR0dV9mbGFncyBmbGFncylcXG4ge1xcbiBcXHRzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgcndjID0ge1xcbi1cXHRcXHQucm1hcF9vbmUgPSB0cnlfdG9fbWlncmF0ZV9vbmUsXFxuK1xcdFxcdC5ybWFwX29uZSA9IGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgP1xcbitcXHRcXHRcXHRcXHR0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZSA6IHRyeV90b19taWdyYXRlX29uZSxcXG4gXFx0XFx0LmFyZyA9ICh2b2lkICopZmxhZ3MsXFxuIFxcdFxcdC5kb25lID0gZm9saW9fbm90X21hcHBlZCxcXG4gXFx0XFx0LmFub25fbG9jayA9IGZvbGlvX2xvY2tfYW5vbl92bWFfcmVhZCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6MjMuMTM5ODU1MjQxWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTMxNDEzNTAwMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNSUdSQVRJT05cIixcbiAgICBcIkhVR0VUTEJfUEFHRVwiLFxuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtaWdyYXRpb25fcHRlX2JhdGNoXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZVwiLFxuICAgIFwicmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYlwiLFxuICAgIFwicmVtb3ZlX21pZ3JhdGlvbl9wdGVzXCIsXG4gICAgXCJtYWtlX21pZ3JhdGlvbl9zd3BfcHRlXCIsXG4gICAgXCJ0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZVwiLFxuICAgIFwiZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2hcIixcbiAgICBcInRyeV90b19taWdyYXRlX29uZVwiLFxuICAgIFwidHJ5X3RvX21pZ3JhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGJhdGNoaW5nIGZvciBtaWdyYXRpb24gUFRFcyB0byBvcHRpbWl6ZSBtZW1vcnkgbWlncmF0aW9uLCBlc3BlY2lhbGx5IGZvciBsYXJnZSBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zIGluIG1tL21pZ3JhdGUuYyBhbmQgbW0vcm1hcC5jLiBGdXp6aW5nIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgYmF0Y2hpbmcgbG9naWMgY29ycmVjdGx5IGhhbmRsZXMgUFRFcywgcGVybWlzc2lvbnMsIGFuZCBlZGdlIGNhc2VzIGxpa2UgZGV2aWNlIHByaXZhdGUgZm9saW9zIG9yIGh1Z2V0bGIgcGFnZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYzZlMmJlMWUxYTYxYmJmYTgxMWQ3NWMxZDc3MDJhNGQ5OGM1ZTg4NVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gSnVsIDEyIDEzOjEyOjIwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ybWFwLmggYi9pbmNsdWRlL2xpbnV4L3JtYXAuaFxuaW5kZXggOGRjMDg3MWU1ZjAwMTEuLjY0OTI5NDkwYTdjZmNhIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmhcbisrKyBiL2luY2x1ZGUvbGludXgvcm1hcC5oXG5AQCAtNzA2LDE3ICs3MDYsMTggQEAgc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X2R1cF9hbm9uX3JtYXBfcG1kKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gfVxuIFxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuLVx0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBlbnVtIHBndGFibGVfbGV2ZWwgbGV2ZWwpXG4ge1xuK1x0LyogZGV2aWNlIHByaXZhdGUgZm9saW9zIGNhbm5vdCBnZXQgcGlubmVkIHZpYSBHVVAuICovXG4rXHRjb25zdCBib29sIHBpbm5hYmxlID0gbGlrZWx5KCFmb2xpb19pc19kZXZpY2VfcHJpdmF0ZShmb2xpbykpO1xuK1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9hbm9uKGZvbGlvKSwgZm9saW8pO1xuIFx0Vk1fV0FSTl9PTl9GT0xJTyghUGFnZUFub25FeGNsdXNpdmUocGFnZSksIGZvbGlvKTtcbiBcdF9fZm9saW9fcm1hcF9zYW5pdHlfY2hlY2tzKGZvbGlvLCBwYWdlLCBucl9wYWdlcywgbGV2ZWwpO1xuIFxuLVx0LyogZGV2aWNlIHByaXZhdGUgZm9saW9zIGNhbm5vdCBnZXQgcGlubmVkIHZpYSBHVVAuICovXG4tXHRpZiAodW5saWtlbHkoZm9saW9faXNfZGV2aWNlX3ByaXZhdGUoZm9saW8pKSkge1xuLVx0XHRDbGVhclBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbitcdC8qIFdlIG9ubHkgY2xlYXIgYW5vbi1leGNsdXNpdmUgZnJvbSBoZWFkIHBhZ2Ugb2YgUE1EIGZvbGlvICovXG4rXHRpZiAobGV2ZWwgPT0gUEdUQUJMRV9MRVZFTF9QTUQpXG4rXHRcdG5yX3BhZ2VzID0gMTtcbiBcbiBcdC8qXG4gXHQgKiBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHdoZW4gd2UgY2xlYXIgUGFnZUFub25FeGNsdXNpdmUsIHRoYXRcbkBAIC03NjAsMjkgKzc2MSwzOCBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoc3RydWN0IGZvbGlvICpmb2xpbyxcbiBcdCAqIHNvIHdlIHVzZSBleHBsaWNpdCBvbmVzIGhlcmUuXG4gXHQgKi9cbiBcbi1cdC8qIFBhaXJlZCB3aXRoIHRoZSBtZW1vcnkgYmFycmllciBpbiB0cnlfZ3JhYl9mb2xpbygpLiAqL1xuLVx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKVxuLVx0XHRzbXBfbWIoKTtcbitcdGlmIChwaW5uYWJsZSkge1xuK1x0XHQvKiBQYWlyZWQgd2l0aCB0aGUgbWVtb3J5IGJhcnJpZXIgaW4gdHJ5X2dyYWJfZm9saW8oKS4gKi9cbitcdFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKVxuK1x0XHRcdHNtcF9tYigpO1xuIFxuLVx0aWYgKHVubGlrZWx5KGZvbGlvX21heWJlX2RtYV9waW5uZWQoZm9saW8pKSlcbi1cdFx0cmV0dXJuIC1FQlVTWTtcbi1cdENsZWFyUGFnZUFub25FeGNsdXNpdmUocGFnZSk7XG4rXHRcdGlmICh1bmxpa2VseShmb2xpb19tYXliZV9kbWFfcGlubmVkKGZvbGlvKSkpXG4rXHRcdFx0cmV0dXJuIC1FQlVTWTtcbitcdH1cbitcbitcdGZvciAoOzspIHtcbitcdFx0Q2xlYXJQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbitcdFx0aWYgKC0tbnJfcGFnZXMgPT0gMClcbitcdFx0XHRicmVhaztcbitcdFx0cGFnZSsrO1xuK1x0fVxuIFxuIFx0LypcbiBcdCAqIFRoaXMgaXMgY29uY2VwdHVhbGx5IGEgc21wX3dtYigpIHBhaXJlZCB3aXRoIHRoZSBzbXBfcm1iKCkgaW5cbiBcdCAqIGd1cF9tdXN0X3Vuc2hhcmUoKS5cbiBcdCAqL1xuLVx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfR1VQX0ZBU1QpKVxuK1x0aWYgKHBpbm5hYmxlIFx1MDAyNlx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19IQVZFX0dVUF9GQVNUKSlcbiBcdFx0c21wX21iX19hZnRlcl9hdG9taWMoKTtcbiBcdHJldHVybiAwO1xuIH1cbiBcbiAvKipcbi0gKiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZSAtIHRyeSBtYXJraW5nIGFuIGV4Y2x1c2l2ZSBhbm9ueW1vdXMgcGFnZVxuLSAqXHRcdFx0XHQgICBtYXBwZWQgYnkgYSBQVEUgcG9zc2libHkgc2hhcmVkIHRvIHByZXBhcmVcbisgKiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMgLSB0cnkgbWFya2luZyBleGNsdXNpdmUgYW5vbnltb3VzIHBhZ2VzXG4rICpcdFx0XHRcdCAgIG1hcHBlZCBieSBQVEVzIHBvc3NpYmx5IHNoYXJlZCB0byBwcmVwYXJlXG4gICpcdFx0XHRcdCAgIGZvciBLU00gb3IgdGVtcG9yYXJ5IHVubWFwcGluZ1xuICAqIEBmb2xpbzpcdFRoZSBmb2xpbyB0byBzaGFyZSBhIG1hcHBpbmcgb2Zcbi0gKiBAcGFnZTpcdFRoZSBtYXBwZWQgZXhjbHVzaXZlIHBhZ2VcbisgKiBAcGFnZTpcdFRoZSBmaXJzdCBtYXBwZWQgZXhjbHVzaXZlIHBhZ2Ugb2YgdGhlIGJhdGNoIGluIHRoZSBmb2xpb1xuKyAqIEBucl9wYWdlczpcdFRoZSBudW1iZXIgb2YgcGFnZXMgdG8gc2hhcmUgaW4gdGhlIGZvbGlvIChiYXRjaCBzaXplKVxuICAqXG4gICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwYWdlIHRhYmxlIGxvY2sgYW5kIGhhcyB0byBoYXZlIHRoZSBwYWdlIHRhYmxlXG4gICogZW50cmllcyBjbGVhcmVkL2ludmFsaWRhdGVkLlxuQEAgLTc5NywxMSArODA3LDE5IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuICAqXG4gICogUmV0dXJucyAwIGlmIG1hcmtpbmcgdGhlIG1hcHBlZCBwYWdlIHBvc3NpYmx5IHNoYXJlZCBzdWNjZWVkZWQuIFJldHVybnNcbiAgKiAtRUJVU1kgb3RoZXJ3aXNlLlxuKyAqXG4rICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwYWdlIHRhYmxlIGxvY2suXG4gICovXG4rc3RhdGljIGlubGluZSBpbnQgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuK3tcbitcdHJldHVybiBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8sIHBhZ2UsIG5yX3BhZ2VzLCBQR1RBQkxFX0xFVkVMX1BURSk7XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgaW50IGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdHN0cnVjdCBwYWdlICpwYWdlKVxuIHtcbi1cdHJldHVybiBfX2ZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoZm9saW8sIHBhZ2UsIDEsIFBHVEFCTEVfTEVWRUxfUFRFKTtcbitcdHJldHVybiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIDEpO1xuIH1cbiBcbiAvKipcbmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaFxuaW5kZXggODc0YmU5NGNmMjU3MGUuLmE5MDcyMWY4YzY4NzdlIDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuKysrIGIvbW0vaW50ZXJuYWwuaFxuQEAgLTUwNSw2ICs1MDUsMjYgQEAgc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHB0ZV90IHB0ZSlcbiBcdHJldHVybiBwdGVfbW92ZV9zd3Bfb2Zmc2V0KHB0ZSwgMSk7XG4gfVxuIFxuK3N0YXRpYyBpbmxpbmUgaW50IHNvZnRsZWFmX3B0ZV9iYXRjaChwdGVfdCAqc3RhcnRfcHRlcCwgaW50IG1heF9uciwgcHRlX3QgcHRlKVxuK3tcbitcdHB0ZV90IGV4cGVjdGVkX3B0ZSA9IHB0ZV9uZXh0X3N3cF9vZmZzZXQocHRlKTtcbitcdGNvbnN0IHB0ZV90ICplbmRfcHRlcCA9IHN0YXJ0X3B0ZXAgKyBtYXhfbnI7XG4rXHRwdGVfdCAqcHRlcCA9IHN0YXJ0X3B0ZXAgKyAxO1xuK1xuK1x0Vk1fV0FSTl9PTihtYXhfbnIgXHUwMDNjIDEpO1xuK1xuK1x0d2hpbGUgKHB0ZXAgXHUwMDNjIGVuZF9wdGVwKSB7XG4rXHRcdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xuK1xuK1x0XHRpZiAoIXB0ZV9zYW1lKHB0ZSwgZXhwZWN0ZWRfcHRlKSlcbitcdFx0XHRicmVhaztcbitcdFx0ZXhwZWN0ZWRfcHRlID0gcHRlX25leHRfc3dwX29mZnNldChleHBlY3RlZF9wdGUpO1xuK1x0XHRwdGVwKys7XG4rXHR9XG4rXG4rXHRyZXR1cm4gcHRlcCAtIHN0YXJ0X3B0ZXA7XG4rfVxuK1xuIC8qKlxuICAqIHN3YXBfcHRlX2JhdGNoIC0gZGV0ZWN0IGEgUFRFIGJhdGNoIGZvciBhIHNldCBvZiBjb250aWd1b3VzIHN3YXAgZW50cmllc1xuICAqIEBzdGFydF9wdGVwOiBQYWdlIHRhYmxlIHBvaW50ZXIgZm9yIHRoZSBmaXJzdCBlbnRyeS5cbkBAIC01MjIsMjMgKzU0Miw5IEBAIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX25leHRfc3dwX29mZnNldChwdGVfdCBwdGUpXG4gICovXG4gc3RhdGljIGlubGluZSBpbnQgc3dhcF9wdGVfYmF0Y2gocHRlX3QgKnN0YXJ0X3B0ZXAsIGludCBtYXhfbnIsIHB0ZV90IHB0ZSlcbiB7XG4tXHRwdGVfdCBleHBlY3RlZF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHB0ZSk7XG4tXHRjb25zdCBwdGVfdCAqZW5kX3B0ZXAgPSBzdGFydF9wdGVwICsgbWF4X25yO1xuLVx0cHRlX3QgKnB0ZXAgPSBzdGFydF9wdGVwICsgMTtcbi1cbi1cdFZNX1dBUk5fT04obWF4X25yIFx1MDAzYyAxKTtcbiBcdFZNX1dBUk5fT04oIXNvZnRsZWFmX2lzX3N3YXAoc29mdGxlYWZfZnJvbV9wdGUocHRlKSkpO1xuIFxuLVx0d2hpbGUgKHB0ZXAgXHUwMDNjIGVuZF9wdGVwKSB7XG4tXHRcdHB0ZSA9IHB0ZXBfZ2V0KHB0ZXApO1xuLVxuLVx0XHRpZiAoIXB0ZV9zYW1lKHB0ZSwgZXhwZWN0ZWRfcHRlKSlcbi1cdFx0XHRicmVhaztcbi1cdFx0ZXhwZWN0ZWRfcHRlID0gcHRlX25leHRfc3dwX29mZnNldChleHBlY3RlZF9wdGUpO1xuLVx0XHRwdGVwKys7XG4tXHR9XG4tXG4tXHRyZXR1cm4gcHRlcCAtIHN0YXJ0X3B0ZXA7XG4rXHRyZXR1cm4gc29mdGxlYWZfcHRlX2JhdGNoKHN0YXJ0X3B0ZXAsIG1heF9uciwgcHRlKTtcbiB9XG4gI2VuZGlmIC8qIENPTkZJR19NTVUgKi9cbiBcbmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmNcbmluZGV4IDIyMmM4YzE1Zjc4MmY3Li42ZDA1ZDNmNDEwOTVkNiAxMDA2NDRcbi0tLSBhL21tL21pZ3JhdGUuY1xuKysrIGIvbW0vbWlncmF0ZS5jXG5AQCAtMzQ1LDYgKzM0NSwxMTEgQEAgc3RydWN0IHJtYXBfd2Fsa19hcmcge1xuIFx0Ym9vbCBtYXBfdW51c2VkX3RvX3plcm9wYWdlO1xuIH07XG4gXG4rLypcbisgKiBEZXRlY3QgYSBiYXRjaCBvZiBjb250aWd1b3VzIG1pZ3JhdGlvbiBlbnRyaWVzOiBjb25zZWN1dGl2ZSAobm9uLXByZXNlbnQpIFBURXNcbisgKiBjb250YWluaW5nIG1pZ3JhdGlvbiBlbnRyaWVzIHdpdGggY29uc2VjdXRpdmUgb2Zmc2V0cyBhbmQgbWF0Y2hpbmcgcHRlIGJpdHMuXG4rICovXG4rc3RhdGljIHVuc2lnbmVkIGludCBtaWdyYXRpb25fcHRlX2JhdGNoKHN0cnVjdCBwYWdlX3ZtYV9tYXBwZWRfd2FsayAqcHZtdyxcbitcdFx0c3RydWN0IGZvbGlvICpmb2xpbywgcHRlX3QgZmlyc3RfcHRlLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2lkeClcbit7XG4rXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IHB2bXctXHUwMDNldm1hO1xuK1x0dW5zaWduZWQgbG9uZyBlbmRfYWRkciA9IHBtZF9hZGRyX2VuZChwdm13LVx1MDAzZWFkZHJlc3MsIHZtYS1cdTAwM2V2bV9lbmQpO1xuK1x0dW5zaWduZWQgaW50IGZvbGlvX25yID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xuK1x0dW5zaWduZWQgaW50IG1heF9ucjtcbitcbitcdFZNX1dBUk5fT04oIXNvZnRsZWFmX2lzX21pZ3JhdGlvbihzb2Z0bGVhZl9mcm9tX3B0ZShmaXJzdF9wdGUpKSk7XG4rXG4rXHQvKiBCb3VuZCBieSBWTUEgLyBQTUQgZW5kIGFuZCBieSB0aGUgcmVtYWluaW5nIHN1YnBhZ2VzIG9mIHRoZSBmb2xpby4gKi9cbitcdG1heF9uciA9IG1pbigoZW5kX2FkZHIgLSBwdm13LVx1MDAzZWFkZHJlc3MpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZULCBmb2xpb19uciAtIHN0YXJ0X2lkeCk7XG4rXHRpZiAobWF4X25yIFx1MDAzYz0gMSlcbitcdFx0cmV0dXJuIDE7XG4rXG4rXHRyZXR1cm4gc29mdGxlYWZfcHRlX2JhdGNoKHB2bXctXHUwMDNlcHRlLCBtYXhfbnIsIGZpcnN0X3B0ZSk7XG4rfVxuK1xuK3N0YXRpYyBwdGVfdCBtaWdyYXRpb25fc29mdGxlYWZfZW50cnlfdG9fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpuZXcsXG4rXHRcdHNvZnRsZWFmX3QgZW50cnksIHB0ZV90IG9sZF9wdGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHRybWFwX3QgKnJtYXBfZmxhZ3MpXG4re1xuK1x0cHRlX3QgcHRlID0gbWtfcHRlKG5ldywgUkVBRF9PTkNFKHZtYS1cdTAwM2V2bV9wYWdlX3Byb3QpKTtcbitcbitcdGlmICghc29mdGxlYWZfaXNfbWlncmF0aW9uX3lvdW5nKGVudHJ5KSlcbitcdFx0cHRlID0gcHRlX21rb2xkKHB0ZSk7XG4rXHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSkpXG4rXHRcdHB0ZSA9IHB0ZV9ta2RpcnR5KHB0ZSk7XG4rXHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KG9sZF9wdGUpKVxuK1x0XHRwdGUgPSBwdGVfbWtzb2Z0X2RpcnR5KHB0ZSk7XG4rXHRlbHNlXG4rXHRcdHB0ZSA9IHB0ZV9jbGVhcl9zb2Z0X2RpcnR5KHB0ZSk7XG4rXG4rXHRpZiAoc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KSlcbitcdFx0cHRlID0gcHRlX21rd3JpdGUocHRlLCB2bWEpO1xuK1x0ZWxzZSBpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuK1x0XHRwdGUgPSBwdGVfbWt1ZmZkKHB0ZSk7XG4rXG4rXHQvKiBTZWUgZG9fc3dhcF9wYWdlKCk6IHJlc3RvcmUgUEFHRV9OT05FIGZvciBSV1AgKi9cbitcdGlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkgXHUwMDI2XHUwMDI2IHVzZXJmYXVsdGZkX3J3cCh2bWEpKVxuK1x0XHRwdGUgPSBwdGVfbW9kaWZ5KHB0ZSwgUEFHRV9OT05FKTtcbitcbitcdGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNiAhc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWQoZW50cnkpKVxuK1x0XHQqcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbitcbitcdHJldHVybiBwdGU7XG4rfVxuK1xuKy8qXG4rICogUmVzdG9yZSBhIHBvdGVudGlhbCBtaWdyYXRpb24gcHRlIHRvIGEgd29ya2luZyBwdGUgZW50cnkgZm9yIGh1Z2V0bGIgZm9saW9zLlxuKyAqL1xuKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFXG4rc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYihzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuK1x0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpXG4re1xuK1x0c3RydWN0IHJtYXBfd2Fsa19hcmcgKnJtYXBfd2Fsa19hcmcgPSBhcmc7XG4rXHRERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgcm1hcF93YWxrX2FyZy1cdTAwM2Vmb2xpbywgdm1hLCBhZGRyLCBQVk1XX1NZTkMgfCBQVk1XX01JR1JBVElPTik7XG4rXHRzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX3ZtYSh2bWEpO1xuK1x0dW5zaWduZWQgaW50IHNoaWZ0ID0gaHVnZV9wYWdlX3NoaWZ0KGgpO1xuK1x0dW5zaWduZWQgbG9uZyBwc2l6ZSA9IGh1Z2VfcGFnZV9zaXplKGgpO1xuK1xuK1x0aWYgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKSB7XG4rXHRcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xuK1x0XHRzdHJ1Y3QgcGFnZSAqbmV3ID0gZm9saW9fcGFnZShmb2xpbywgMCk7XG4rXHRcdHB0ZV90IG9sZF9wdGUsIHB0ZTtcbitcdFx0c29mdGxlYWZfdCBlbnRyeTtcbitcbitcdFx0b2xkX3B0ZSA9IGh1Z2VfcHRlcF9nZXQodm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTtcbitcdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3B0ZShvbGRfcHRlKTtcbitcbitcdFx0Zm9saW9fZ2V0KGZvbGlvKTtcbitcdFx0cHRlID0gbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShmb2xpbywgbmV3LCBlbnRyeSwgb2xkX3B0ZSxcbitcdFx0XHRcdFx0XHQgICAgICB2bWEsIFx1MDAyNnJtYXBfZmxhZ3MpO1xuK1x0XHRwdGUgPSBhcmNoX21ha2VfaHVnZV9wdGUocHRlLCBzaGlmdCwgdm1hLVx1MDAzZXZtX2ZsYWdzKTtcbitcdFx0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpXG4rXHRcdFx0aHVnZXRsYl9hZGRfYW5vbl9ybWFwKGZvbGlvLCB2bWEsIHB2bXcuYWRkcmVzcyxcbitcdFx0XHRcdFx0ICAgICAgcm1hcF9mbGFncyk7XG4rXHRcdGVsc2VcbitcdFx0XHRodWdldGxiX2FkZF9maWxlX3JtYXAoZm9saW8pO1xuK1x0XHRzZXRfaHVnZV9wdGVfYXQodm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsIHBzaXplKTtcbitcbitcdFx0aWYgKFJFQURfT05DRSh2bWEtXHUwMDNldm1fZmxhZ3MpIFx1MDAyNiBWTV9MT0NLRUQpXG4rXHRcdFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcbitcbitcdFx0dHJhY2VfcmVtb3ZlX21pZ3JhdGlvbl9wdGUocHZtdy5hZGRyZXNzLCBwdGVfdmFsKHB0ZSksXG4rXHRcdFx0XHRcdCAgIGNvbXBvdW5kX29yZGVyKG5ldykpO1xuK1xuK1x0XHQvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovXG4rXHRcdHVwZGF0ZV9tbXVfY2FjaGUodm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTtcbitcdH1cbitcbitcdHJldHVybiB0cnVlO1xuK31cbisjZWxzZVxuK3N0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGIoc3RydWN0IGZvbGlvICpmb2xpbyxcbitcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxuK3tcbitcdHJldHVybiBmYWxzZTtcbit9XG4rI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi9cbitcbiAvKlxuICAqIFJlc3RvcmUgYSBwb3RlbnRpYWwgbWlncmF0aW9uIHB0ZSB0byBhIHdvcmtpbmcgcHRlIGVudHJ5XG4gICovXG5AQCAtMzUyLDYgKzQ1Nyw3IEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmFyZylcbiB7XG4gXHRzdHJ1Y3Qgcm1hcF93YWxrX2FyZyAqcm1hcF93YWxrX2FyZyA9IGFyZztcbitcdGJvb2wgaXNfZGV2cHJpdiA9IGZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKTtcbiBcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBybWFwX3dhbGtfYXJnLVx1MDAzZWZvbGlvLCB2bWEsIGFkZHIsIFBWTVdfU1lOQyB8IFBWTVdfTUlHUkFUSU9OKTtcbiBcbiBcdHdoaWxlIChwYWdlX3ZtYV9tYXBwZWRfd2FsayhcdTAwMjZwdm13KSkge1xuQEAgLTM2MSw1NiArNDY3LDQwIEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdHNvZnRsZWFmX3QgZW50cnk7XG4gXHRcdHN0cnVjdCBwYWdlICpuZXc7XG4gXHRcdHVuc2lnbmVkIGxvbmcgaWR4ID0gMDtcbitcdFx0dW5zaWduZWQgaW50IG5yID0gMTtcbiBcbiBcdFx0LyogcGdvZmYgaXMgaW52YWxpZCBmb3Iga3NtIHBhZ2VzLCBidXQgdGhleSBhcmUgbmV2ZXIgbGFyZ2UgKi9cbi1cdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pIFx1MDAyNlx1MDAyNiAhZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbitcdFx0aWYgKGZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKVxuIFx0XHRcdGlkeCA9IGxpbmVhcl9wYWdlX2luZGV4KHZtYSwgcHZtdy5hZGRyZXNzKSAtIHB2bXcucGdvZmY7XG4gXHRcdG5ldyA9IGZvbGlvX3BhZ2UoZm9saW8sIGlkeCk7XG4gXG4gI2lmZGVmIENPTkZJR19BUkNIX0hBU19QTURfU09GVExFQVZFU1xuIFx0XHQvKiBQTUQtbWFwcGVkIFRIUCBtaWdyYXRpb24gZW50cnkgKi9cbiBcdFx0aWYgKCFwdm13LnB0ZSkge1xuLVx0XHRcdFZNX0JVR19PTl9GT0xJTyhmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pIHx8XG4tXHRcdFx0XHRcdCFmb2xpb190ZXN0X3BtZF9tYXBwYWJsZShmb2xpbyksIGZvbGlvKTtcbitcdFx0XHRWTV9XQVJOX09OX09OQ0VfRk9MSU8oIWZvbGlvX3Rlc3RfcG1kX21hcHBhYmxlKGZvbGlvKSwgZm9saW8pO1xuIFx0XHRcdHJlbW92ZV9taWdyYXRpb25fcG1kKFx1MDAyNnB2bXcsIG5ldyk7XG4gXHRcdFx0Y29udGludWU7XG4gXHRcdH1cbiAjZW5kaWZcbi1cdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpXG4tXHRcdFx0b2xkX3B0ZSA9IGh1Z2VfcHRlcF9nZXQodm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsXG4tXHRcdFx0XHRcdFx0cHZtdy5wdGUpO1xuLVx0XHRlbHNlXG4tXHRcdFx0b2xkX3B0ZSA9IHB0ZXBfZ2V0KHB2bXcucHRlKTtcbitcdFx0b2xkX3B0ZSA9IHB0ZXBfZ2V0KHB2bXcucHRlKTtcbiBcdFx0aWYgKHJtYXBfd2Fsa19hcmctXHUwMDNlbWFwX3VudXNlZF90b196ZXJvcGFnZSBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgIHRyeV90b19tYXBfdW51c2VkX3RvX3plcm9wYWdlKFx1MDAyNnB2bXcsIGZvbGlvLCBvbGRfcHRlLCBpZHgpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHRmb2xpb19nZXQoZm9saW8pO1xuLVx0XHRwdGUgPSBta19wdGUobmV3LCBSRUFEX09OQ0Uodm1hLVx1MDAzZXZtX3BhZ2VfcHJvdCkpO1xuLVxuIFx0XHRlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKG9sZF9wdGUpO1xuLVx0XHRpZiAoIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSkpXG4tXHRcdFx0cHRlID0gcHRlX21rb2xkKHB0ZSk7XG4tXHRcdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KSlcbi1cdFx0XHRwdGUgPSBwdGVfbWtkaXJ0eShwdGUpO1xuLVx0XHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KG9sZF9wdGUpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3NvZnRfZGlydHkocHRlKTtcbi1cdFx0ZWxzZVxuLVx0XHRcdHB0ZSA9IHB0ZV9jbGVhcl9zb2Z0X2RpcnR5KHB0ZSk7XG4gXG4tXHRcdGlmIChzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3dyaXRlKHB0ZSwgdm1hKTtcbi1cdFx0ZWxzZSBpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9ta3VmZmQocHRlKTtcbi1cbi1cdFx0LyogU2VlIGRvX3N3YXBfcGFnZSgpOiByZXN0b3JlIFBBR0VfTk9ORSBmb3IgUldQICovXG4tXHRcdGlmIChwdGVfc3dwX3VmZmQob2xkX3B0ZSkgXHUwMDI2XHUwMDI2IHVzZXJmYXVsdGZkX3J3cCh2bWEpKVxuLVx0XHRcdHB0ZSA9IHB0ZV9tb2RpZnkocHRlLCBQQUdFX05PTkUpO1xuK1x0XHQvKlxuK1x0XHQgKiBUcnkgdG8gcmVzdG9yZSBuclx1MDAzZTEgY29udGlndW91cyBQVEVzIGluIG9uZSBzaG90LiBGYWxscyBiYWNrXG4rXHRcdCAqIHRvIG9yaWdpbmFsIHBlci1QVEUgcGF0aCAobnI9MSkgaWYgYmF0Y2hpbmcgaXMgbm90IHBvc3NpYmxlLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFybWFwX3dhbGtfYXJnLVx1MDAzZW1hcF91bnVzZWRfdG9femVyb3BhZ2UgXHUwMDI2XHUwMDI2IGxpa2VseSghaXNfZGV2cHJpdikpXG4rXHRcdFx0bnIgPSBtaWdyYXRpb25fcHRlX2JhdGNoKFx1MDAyNnB2bXcsIGZvbGlvLCBvbGRfcHRlLCBpZHgpO1xuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjYgIXNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkKGVudHJ5KSlcbi1cdFx0XHRybWFwX2ZsYWdzIHw9IFJNQVBfRVhDTFVTSVZFO1xuK1x0XHRmb2xpb19yZWZfYWRkKGZvbGlvLCBucik7XG4rXHRcdHB0ZSA9IG1pZ3JhdGlvbl9zb2Z0bGVhZl9lbnRyeV90b19wdGUoZm9saW8sIG5ldywgZW50cnksIG9sZF9wdGUsXG4rXHRcdFx0XHRcdFx0ICAgICAgdm1hLCBcdTAwMjZybWFwX2ZsYWdzKTtcbiBcbi1cdFx0aWYgKHVubGlrZWx5KGlzX2RldmljZV9wcml2YXRlX3BhZ2UobmV3KSkpIHtcbitcdFx0aWYgKHVubGlrZWx5KGlzX2RldnByaXYpKSB7XG4gXHRcdFx0aWYgKHB0ZV93cml0ZShwdGUpKVxuIFx0XHRcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuIFx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4obmV3KSk7XG5AQCAtNDI0LDMwICs1MTQsMTIgQEAgc3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGUoc3RydWN0IGZvbGlvICpmb2xpbyxcbiBcdFx0XHRcdHB0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHB0ZSk7XG4gXHRcdH1cbiBcbi0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRVxuLVx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdHN0cnVjdCBoc3RhdGUgKmggPSBoc3RhdGVfdm1hKHZtYSk7XG4tXHRcdFx0dW5zaWduZWQgaW50IHNoaWZ0ID0gaHVnZV9wYWdlX3NoaWZ0KGgpO1xuLVx0XHRcdHVuc2lnbmVkIGxvbmcgcHNpemUgPSBodWdlX3BhZ2Vfc2l6ZShoKTtcbi1cbi1cdFx0XHRwdGUgPSBhcmNoX21ha2VfaHVnZV9wdGUocHRlLCBzaGlmdCwgdm1hLVx1MDAzZXZtX2ZsYWdzKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbi1cdFx0XHRcdGh1Z2V0bGJfYWRkX2Fub25fcm1hcChmb2xpbywgdm1hLCBwdm13LmFkZHJlc3MsXG4tXHRcdFx0XHRcdFx0ICAgICAgcm1hcF9mbGFncyk7XG4tXHRcdFx0ZWxzZVxuLVx0XHRcdFx0aHVnZXRsYl9hZGRfZmlsZV9ybWFwKGZvbGlvKTtcbi1cdFx0XHRzZXRfaHVnZV9wdGVfYXQodm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsXG4tXHRcdFx0XHRcdHBzaXplKTtcbi1cdFx0fSBlbHNlXG4tI2VuZGlmXG4tXHRcdHtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbi1cdFx0XHRcdGZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlKGZvbGlvLCBuZXcsIHZtYSxcbi1cdFx0XHRcdFx0XHRcdHB2bXcuYWRkcmVzcywgcm1hcF9mbGFncyk7XG4tXHRcdFx0ZWxzZVxuLVx0XHRcdFx0Zm9saW9fYWRkX2ZpbGVfcm1hcF9wdGUoZm9saW8sIG5ldywgdm1hKTtcbi1cdFx0XHRzZXRfcHRlX2F0KHZtYS1cdTAwM2V2bV9tbSwgcHZtdy5hZGRyZXNzLCBwdm13LnB0ZSwgcHRlKTtcbi1cdFx0fVxuK1x0XHRpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSlcbitcdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIG5ldywgbnIsIHZtYSxcbitcdFx0XHRcdFx0XHQgcHZtdy5hZGRyZXNzLCBybWFwX2ZsYWdzKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGZvbGlvX2FkZF9maWxlX3JtYXBfcHRlcyhmb2xpbywgbmV3LCBuciwgdm1hKTtcbitcdFx0c2V0X3B0ZXModm1hLVx1MDAzZXZtX21tLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlLCBwdGUsIG5yKTtcbiBcdFx0aWYgKFJFQURfT05DRSh2bWEtXHUwMDNldm1fZmxhZ3MpIFx1MDAyNiBWTV9MT0NLRUQpXG4gXHRcdFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcbiBcbkBAIC00NTUsNyArNTI3LDExIEBAIHN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdFx0XHRcdCAgIGNvbXBvdW5kX29yZGVyKG5ldykpO1xuIFxuIFx0XHQvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovXG4tXHRcdHVwZGF0ZV9tbXVfY2FjaGUodm1hLCBwdm13LmFkZHJlc3MsIHB2bXcucHRlKTtcbitcdFx0dXBkYXRlX21tdV9jYWNoZV9yYW5nZShOVUxMLCB2bWEsIHB2bXcuYWRkcmVzcywgcHZtdy5wdGUsIG5yKTtcbitcbitcdFx0LyogU2tpcCB0aGUgYmF0Y2hlZCBQVEVzICovXG4rXHRcdHB2bXcucHRlICs9IG5yIC0gMTtcbitcdFx0cHZtdy5hZGRyZXNzICs9IChuciAtIDEpICogUEFHRV9TSVpFO1xuIFx0fVxuIFxuIFx0cmV0dXJuIHRydWU7XG5AQCAtNDc0LDcgKzU1MCw5IEBAIHZvaWQgcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKHN0cnVjdCBmb2xpbyAqc3JjLCBzdHJ1Y3QgZm9saW8gKmRzdCxcbiBcdH07XG4gXG4gXHRzdHJ1Y3Qgcm1hcF93YWxrX2NvbnRyb2wgcndjID0ge1xuLVx0XHQucm1hcF9vbmUgPSByZW1vdmVfbWlncmF0aW9uX3B0ZSxcbitcdFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKHNyYykgP1xuK1x0XHRcdFx0cmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYiA6XG4rXHRcdFx0XHRyZW1vdmVfbWlncmF0aW9uX3B0ZSxcbiBcdFx0LmFyZyA9IFx1MDAyNnJtYXBfd2Fsa19hcmcsXG4gXHR9O1xuIFxuZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuY1xuaW5kZXggZTg1NDY3OTU1M2I5YzMuLmNmYWM4NWY2ZjY4YTY4IDEwMDY0NFxuLS0tIGEvbW0vcm1hcC5jXG4rKysgYi9tbS9ybWFwLmNcbkBAIC0yNDA1LDYgKzI0MDUsMjI5IEBAIHZvaWQgdHJ5X3RvX3VubWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sIGVudW0gdHR1X2ZsYWdzIGZsYWdzKVxuIFx0XHRybWFwX3dhbGsoZm9saW8sIFx1MDAyNnJ3Yyk7XG4gfVxuIFxuKy8qIEJ1aWxkIHRoZSBtaWdyYXRpb24gc3dhcCBQVEUgdGhhdCByZXBsYWNlcyBwdGV2YWwgZm9yIGEgcGFnZS4gKi9cbitzdGF0aWMgcHRlX3QgbWFrZV9taWdyYXRpb25fc3dwX3B0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgcHRlX3QgcHRldmFsLFxuK1x0XHRib29sIHdyaXRhYmxlLCBib29sIGFub25fZXhjbHVzaXZlKVxuK3tcbitcdHN3cF9lbnRyeV90IGVudHJ5O1xuK1x0cHRlX3Qgc3dwX3B0ZTtcbitcbitcdGlmICh3cml0YWJsZSlcbitcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwYWdlX3RvX3BmbihwYWdlKSk7XG4rXHRlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSlcbitcdFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkoXG4rXHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSkpO1xuK1x0ZWxzZVxuK1x0XHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KHBhZ2VfdG9fcGZuKHBhZ2UpKTtcbitcbitcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcbitcdFx0aWYgKHB0ZV95b3VuZyhwdGV2YWwpKVxuK1x0XHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoZW50cnkpO1xuK1x0XHRpZiAocHRlX2RpcnR5KHB0ZXZhbCkpXG4rXHRcdFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShlbnRyeSk7XG4rXHRcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbitcdFx0aWYgKHB0ZV9zb2Z0X2RpcnR5KHB0ZXZhbCkpXG4rXHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xuK1x0XHRpZiAocHRlX3VmZmQocHRldmFsKSlcbitcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4rXHR9IGVsc2Uge1xuK1x0XHRzd3BfcHRlID0gc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSk7XG4rXHRcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSlcbitcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4rXHRcdGlmIChwdGVfc3dwX3VmZmQocHRldmFsKSlcbitcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gc3dwX3B0ZTtcbit9XG4rXG4rLypcbisgKiBSZXBsYWNlIHRoZSBodWdldGxiIHBhZ2UgdGFibGUgbWFwcGluZyBmb3IgZm9saW8gd2l0aCBtaWdyYXRpb24gZW50cmllcy5cbisgKlxuKyAqIEBhcmc6IGVudW0gdHR1X2ZsYWdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgYXJndW1lbnQuXG4rICovXG4rc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmUoc3RydWN0IGZvbGlvICpmb2xpbyxcbitcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKVxuK3tcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgaHN6ID0gaHVnZV9wYWdlX3NpemUoaHN0YXRlX3ZtYSh2bWEpKTtcbitcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTtcbitcdGVudW0gdHR1X2ZsYWdzIGZsYWdzID0gKGVudW0gdHR1X2ZsYWdzKShsb25nKWFyZztcbitcdGJvb2wgYW5vbl9leGNsdXNpdmUsIHdyaXRhYmxlLCByZXQgPSB0cnVlO1xuK1x0Ym9vbCBhbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcbitcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuK1x0c3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTtcbitcdHVuc2lnbmVkIGxvbmcgcGZuO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHRwdGVfdCBwdGV2YWw7XG4rXG4rXHRyYW5nZS5lbmQgPSB2bWFfYWRkcmVzc19lbmQoXHUwMDI2cHZtdyk7XG4rXHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVx1MDAzZXZtX21tLFxuK1x0XHRcdFx0YWRkcmVzcywgcmFuZ2UuZW5kKTtcbitcdC8qIElmIHNoYXJpbmcgaXMgcG9zc2libGUsIHN0YXJ0IGFuZCBlbmQgd2lsbCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseS4gKi9cbitcdGFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsIFx1MDAyNnJhbmdlLnN0YXJ0LCBcdTAwMjZyYW5nZS5lbmQpO1xuK1x0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoXHUwMDI2cmFuZ2UpO1xuK1xuK1x0aWYgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKSB7XG4rXHRcdGFkZHJlc3MgPSBwdm13LmFkZHJlc3M7XG4rXHRcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9nZXQobW0sIGFkZHJlc3MsIHB2bXcucHRlKTtcbitcdFx0aWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSlcbitcdFx0XHRwZm4gPSBwdGVfcGZuKHB0ZXZhbCk7XG4rXHRcdGVsc2VcbitcdFx0XHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oc29mdGxlYWZfZnJvbV9wdGUocHRldmFsKSk7XG4rXG4rXHRcdHBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcbitcdFx0YW5vbl9leGNsdXNpdmUgPSBhbm9uIFx1MDAyNlx1MDAyNiBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbitcbitcdFx0LypcbitcdFx0ICogaHVnZV9wbWRfdW5zaGFyZSBtYXkgdW5tYXAgYW4gZW50aXJlIFBNRCBwYWdlLiBUaGVyZSBpcyBub1xuK1x0XHQgKiB3YXkgb2Yga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5IGJlIGNhY2hlZCBmb3IgdGhpcyBtbSxcbitcdFx0ICogc28gd2UgbXVzdCBmbHVzaCB0aGVtIGFsbC4gc3RhcnQvZW5kIHdlcmUgYWxyZWFkeSBhZGp1c3RlZFxuK1x0XHQgKiBhYm92ZSB0byBjb3ZlciB0aGlzIHJhbmdlLlxuK1x0XHQgKi9cbitcdFx0Zmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbitcbitcdFx0LypcbitcdFx0ICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZSBoZWxkIGluIHdyaXRlXG4rXHRcdCAqIG1vZGUuIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5IGRvIHRoaXMgb3V0c2lkZSBybWFwXG4rXHRcdCAqIHJvdXRpbmVzLiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuXG4rXHRcdCAqIExvY2sgb3JkZXIgZGljdGF0ZXMgYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRSBpX21tYXBfcndzZW0uXG4rXHRcdCAqIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kIGZhaWwgaWYgdW5zdWNjZXNzZnVsLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFhbm9uKSB7XG4rXHRcdFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xuK1xuK1x0XHRcdFZNX1dBUk5fT05fT05DRSghKGZsYWdzIFx1MDAyNiBUVFVfUk1BUF9MT0NLRUQpKTtcbitcdFx0XHRpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSkge1xuK1x0XHRcdFx0cmV0ID0gZmFsc2U7XG4rXHRcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0XHR9XG4rXG4rXHRcdFx0dGxiX2dhdGhlcl9tbXVfdm1hKFx1MDAyNnRsYiwgdm1hKTtcbitcdFx0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4rXHRcdFx0XHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcbitcdFx0XHRcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXHUwMDI2dGxiLCB2bWEpO1xuK1x0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbitcdFx0XHRcdC8qXG4rXHRcdFx0XHQgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCxcbitcdFx0XHRcdCAqIGNvbnNlcXVlbnRseSB1bm1hcHBpbmcgdGhlIGZvbGlvLlxuK1x0XHRcdFx0ICovXG4rXHRcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0XHR9XG4rXHRcdFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XG4rXHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbitcdFx0fVxuK1xuK1x0XHQvKiBOdWtlIHRoZSBodWdldGxiIHBhZ2UgdGFibGUgZW50cnkgKi9cbitcdFx0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuK1x0XHRpZiAoaHVnZV9wdGVfZGlydHkocHRldmFsKSlcbitcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbitcdFx0d3JpdGFibGUgPSBwdGVfd3JpdGUocHRldmFsKTtcbitcbitcdFx0Vk1fV0FSTl9PTl9GT0xJTyh3cml0YWJsZSBcdTAwMjZcdTAwMjYgYW5vbiBcdTAwMjZcdTAwMjYgIWFub25fZXhjbHVzaXZlLCBmb2xpbyk7XG4rXG4rXHRcdGlmIChQYWdlSFdQb2lzb24ocGFnZSkpIHtcbitcdFx0XHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpO1xuK1x0XHRcdGh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pO1xuK1x0XHRcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgaHN6KTtcbitcdFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgXHUwMDI2XHUwMDI2IHB0ZV91bnVzZWQocHRldmFsKSBcdTAwMjZcdTAwMjZcbitcdFx0XHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogVGhlIGd1ZXN0IGluZGljYXRlZCB0aGF0IHRoZSBwYWdlIGNvbnRlbnQgaXMgb2Ygbm9cbitcdFx0XHQgKiBpbnRlcmVzdCBhbnltb3JlLiBTaW1wbHkgZGlzY2FyZCB0aGUgcHRlLCB2bXNjYW5cbitcdFx0XHQgKiB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdC5cbitcdFx0XHQgKi9cbitcdFx0XHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdHB0ZV90IHN3cF9wdGU7XG4rXG4rXHRcdFx0LypcbitcdFx0XHQgKiBhcmNoX3VubWFwX29uZSgpIGlzIGV4cGVjdGVkIHRvIGJlIGEgTk9QIG9uXG4rXHRcdFx0ICogYXJjaGl0ZWN0dXJlcyB3aGVyZSB3ZSBjb3VsZCBoYXZlIFBGTiBzd2FwIFBURXMsXG4rXHRcdFx0ICogc28gd2UnbGwgbm90IGNoZWNrL2NhcmUuXG4rXHRcdFx0ICovXG4rXHRcdFx0aWYgKGFyY2hfdW5tYXBfb25lKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXZhbCkgXHUwMDNjIDApIHtcbitcdFx0XHRcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsXG4rXHRcdFx0XHRcdFx0cHRldmFsLCBoc3opO1xuK1x0XHRcdFx0cmV0ID0gZmFsc2U7XG4rXHRcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0XHR9XG4rXG4rXHRcdFx0LyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbitcdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4rXHRcdFx0ICAgIGh1Z2V0bGJfdHJ5X3NoYXJlX2Fub25fcm1hcChmb2xpbykpIHtcbitcdFx0XHRcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsXG4rXHRcdFx0XHRcdFx0cHRldmFsLCBoc3opO1xuK1x0XHRcdFx0cmV0ID0gZmFsc2U7XG4rXHRcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0XHR9XG4rXG4rXHRcdFx0LypcbitcdFx0XHQgKiBTdG9yZSB0aGUgcGZuIG9mIHRoZSBwYWdlIGluIGEgc3BlY2lhbCBtaWdyYXRpb25cbitcdFx0XHQgKiBwdGUuIGRvX3N3YXBfcGFnZSgpIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWlncmF0aW9uXG4rXHRcdFx0ICogcHRlIGlzIHJlbW92ZWQgYW5kIHRoZW4gcmVzdGFydCBmYXVsdCBoYW5kbGluZy5cbitcdFx0XHQgKi9cbitcdFx0XHRzd3BfcHRlID0gbWFrZV9taWdyYXRpb25fc3dwX3B0ZShwYWdlLCBwdGV2YWwsXG4rXHRcdFx0XHRcdFx0XHQgd3JpdGFibGUsIGFub25fZXhjbHVzaXZlKTtcbitcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlLCBoc3opO1xuK1x0XHRcdHRyYWNlX3NldF9taWdyYXRpb25fcHRlKGFkZHJlc3MsIHB0ZV92YWwoc3dwX3B0ZSksXG4rXHRcdFx0XHRcdFx0Zm9saW9fb3JkZXIoZm9saW8pKTtcbitcdFx0fVxuK1xuK1x0XHRodWdldGxiX3JlbW92ZV9ybWFwKGZvbGlvKTtcbitcdFx0aWYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fTE9DS0VEKVxuK1x0XHRcdG1sb2NrX2RyYWluX2xvY2FsKCk7XG4rXHRcdGZvbGlvX3B1dChmb2xpbyk7XG4rd2Fsa19kb25lOlxuK1x0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuK1x0fVxuK1xuK1x0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFx1MDAyNnJhbmdlKTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdHN0cnVjdCBwYWdlX3ZtYV9tYXBwZWRfd2FsayAqcHZtdywgcHRlX3QgcHRlLFxuK1x0XHRzdHJ1Y3QgcGFnZSAqc3VicGFnZSwgYm9vbCBhbm9uX2V4Y2x1c2l2ZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIGVuZF9hZGRyLCBhZGRyID0gcHZtdy1cdTAwM2VhZGRyZXNzO1xuK1x0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBwdm13LVx1MDAzZXZtYTtcbitcdHVuc2lnbmVkIGludCBtYXhfbnIsIG5yLCBpO1xuK1xuKyNpZmRlZiBfX0hBVkVfQVJDSF9VTk1BUF9PTkVcbitcdC8qIENhbm5vdCBiYXRjaCB1bm1hcCBpZiBhcmNoX3VubWFwX29uZSgpIGlzIGRlZmluZWQuICovXG4rXHRyZXR1cm4gMTtcbisjZW5kaWZcbitcbitcdGlmICghZm9saW9fdGVzdF9sYXJnZShmb2xpbykpXG4rXHRcdHJldHVybiAxO1xuK1x0aWYgKGZvbGlvX2lzX3pvbmVfZGV2aWNlKGZvbGlvKSB8fCBmb2xpb190ZXN0X2hhc19od3BvaXNvbmVkKGZvbGlvKSlcbitcdFx0cmV0dXJuIDE7XG4rXHRpZiAocHRlX3VudXNlZChwdGUpKVxuK1x0XHRyZXR1cm4gMTtcbitcbitcdC8qIFdlIG1heSBvbmx5IGJhdGNoIHdpdGhpbiBhIHNpbmdsZSBWTUEgYW5kIGEgc2luZ2xlIHBhZ2UgdGFibGUuICovXG4rXHRlbmRfYWRkciA9IHBtZF9hZGRyX2VuZChhZGRyLCB2bWEtXHUwMDNldm1fZW5kKTtcbitcdG1heF9uciA9IChlbmRfYWRkciAtIGFkZHIpIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0LypcbitcdCAqIElmIHVubWFwIGZhaWxzLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHB0ZXMuIFRvIGF2b2lkIGFjY2lkZW50YWxseVxuK1x0ICogdXBncmFkaW5nIHdyaXRlIHBlcm1pc3Npb25zIGZvciBwdGVzIHRoYXQgd2VyZSBub3Qgb3JpZ2luYWxseSB3cml0YWJsZSxcbitcdCAqIGFuZCB0byBhdm9pZCBsb3NpbmcgdGhlIHNvZnQtZGlydHkgYml0LCB1c2UgdGhlIGFwcHJvcHJpYXRlIEZQQiBmbGFncy5cbitcdCAqL1xuK1x0bnIgPSBmb2xpb19wdGVfYmF0Y2hfZmxhZ3MoZm9saW8sIHZtYSwgcHZtdy1cdTAwM2VwdGUsIFx1MDAyNnB0ZSwgbWF4X25yLFxuK1x0XHRcdFx0ICAgRlBCX1JFU1BFQ1RfV1JJVEUgfCBGUEJfUkVTUEVDVF9TT0ZUX0RJUlRZKTtcbitcbitcdC8qIExpbWl0IHBvc3NpYmxlIGJhdGNoIGNvdW50IHRvIGEgdW5pZm9ybSBQYWdlQW5vbkV4Y2x1c2l2ZSB2YWx1ZSAqL1xuK1x0aWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbitcdFx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnI7IGkrKylcbitcdFx0XHRpZiAoUGFnZUFub25FeGNsdXNpdmUoc3VicGFnZSArIGkpICE9IGFub25fZXhjbHVzaXZlKVxuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdG5yID0gaTtcbitcdH1cbitcbitcdHJldHVybiBucjtcbit9XG4rXG4gLypcbiAgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50LlxuICAqXG5AQCAtMjQyMSw4ICsyNjQ0LDcgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0c3RydWN0IHBhZ2UgKnN1YnBhZ2U7XG4gXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xuIFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuLVx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIHBmbiwgZW5kX2FkZHIsIG5yX3BhZ2VzO1xuIFxuIFx0LypcbiBcdCAqIFdoZW4gcmFjaW5nIGFnYWluc3QgZS5nLiB6YXBfcHRlX3JhbmdlKCkgb24gYW5vdGhlciBjcHUsXG5AQCAtMjQzNSwyNiArMjY1NywxMyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHQvKlxuIFx0ICogRm9yIFRIUCwgd2UgaGF2ZSB0byBhc3N1bWUgdGhlIHdvcnNlIGNhc2UgaWUgcG1kIGZvciBpbnZhbGlkYXRpb24uXG4tXHQgKiBGb3IgaHVnZXRsYiwgaXQgY291bGQgYmUgbXVjaCB3b3JzZSBpZiB3ZSBuZWVkIHRvIGRvIHB1ZFxuLVx0ICogaW52YWxpZGF0aW9uIGluIHRoZSBjYXNlIG9mIHBtZCBzaGFyaW5nLlxuIFx0ICpcbiBcdCAqIE5vdGUgdGhhdCB0aGUgcGFnZSBjYW4gbm90IGJlIGZyZWUgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mXG4tXHQgKiB0cnlfdG9fdW5tYXAoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIHBhZ2UuXG4rXHQgKiB0cnlfdG9fbWlncmF0ZSgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS5cbiBcdCAqL1xuIFx0cmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKFx1MDAyNnB2bXcpO1xuIFx0bW11X25vdGlmaWVyX3JhbmdlX2luaXQoXHUwMDI2cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS1cdTAwM2V2bV9tbSxcbiBcdFx0XHRcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XG4tXHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBJZiBzaGFyaW5nIGlzIHBvc3NpYmxlLCBzdGFydCBhbmQgZW5kIHdpbGwgYmUgYWRqdXN0ZWRcbi1cdFx0ICogYWNjb3JkaW5nbHkuXG4tXHRcdCAqL1xuLVx0XHRhZGp1c3RfcmFuZ2VfaWZfcG1kX3NoYXJpbmdfcG9zc2libGUodm1hLCBcdTAwMjZyYW5nZS5zdGFydCxcbi1cdFx0XHRcdFx0XHQgICAgIFx1MDAyNnJhbmdlLmVuZCk7XG4tXG4tXHRcdC8qIFdlIG5lZWQgdGhlIGh1Z2UgcGFnZSBzaXplIGZvciBzZXRfaHVnZV9wdGVfYXQoKSAqL1xuLVx0XHRoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xuLVx0fVxuIFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoXHUwMDI2cmFuZ2UpO1xuIFxuIFx0d2hpbGUgKHBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKSB7XG5AQCAtMjQ4OCwxMSArMjY5Nyw4IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSB8fFxuIFx0XHRcdFx0XHQhZm9saW9fdGVzdF9wbWRfbWFwcGFibGUoZm9saW8pLCBmb2xpbyk7XG4gXG4tXHRcdFx0aWYgKHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KFx1MDAyNnB2bXcsIHN1YnBhZ2UpKSB7XG4tXHRcdFx0XHRyZXQgPSBmYWxzZTtcbi1cdFx0XHRcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4tXHRcdFx0XHRicmVhaztcbi1cdFx0XHR9XG4rXHRcdFx0aWYgKHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KFx1MDAyNnB2bXcsIHN1YnBhZ2UpKVxuK1x0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuIFx0XHRcdGNvbnRpbnVlO1xuICNlbmRpZlxuIFx0XHR9XG5AQCAtMjUwMSwxMCArMjcwNyw3IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0Vk1fQlVHX09OX0ZPTElPKCFwdm13LnB0ZSwgZm9saW8pO1xuIFxuIFx0XHRhZGRyZXNzID0gcHZtdy5hZGRyZXNzO1xuLVx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSlcbi1cdFx0XHRwdGV2YWwgPSBodWdlX3B0ZXBfZ2V0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRwdGV2YWwgPSBwdGVwX2dldChwdm13LnB0ZSk7XG4rXHRcdHB0ZXZhbCA9IHB0ZXBfZ2V0KHB2bXcucHRlKTtcbiBcdFx0aWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkge1xuIFx0XHRcdHBmbiA9IHB0ZV9wZm4ocHRldmFsKTtcbiBcdFx0fSBlbHNlIHtcbkBAIC0yNTE1LDY4ICsyNzE4LDIyIEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRjb25zdCBzb2Z0bGVhZl90IGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wdGUocHRldmFsKTtcbiBcbiBcdFx0XHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oZW50cnkpO1xuLVx0XHRcdFZNX1dBUk5fT05fRk9MSU8oZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSwgZm9saW8pO1xuIFx0XHR9XG4gXG4gXHRcdHN1YnBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcbiBcdFx0YW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNlxuIFx0XHRcdFx0IFBhZ2VBbm9uRXhjbHVzaXZlKHN1YnBhZ2UpO1xuIFxuLVx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdGJvb2wgYW5vbiA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbyk7XG4tXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBodWdlX3BtZF91bnNoYXJlIG1heSB1bm1hcCBhbiBlbnRpcmUgUE1EIHBhZ2UuXG4tXHRcdFx0ICogVGhlcmUgaXMgbm8gd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heVxuLVx0XHRcdCAqIGJlIGNhY2hlZCBmb3IgdGhpcyBtbSwgc28gd2UgbXVzdCBmbHVzaCB0aGVtIGFsbC5cbi1cdFx0XHQgKiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkIGFib3ZlIHRvIGNvdmVyIHRoaXNcbi1cdFx0XHQgKiByYW5nZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuLVxuLVx0XHRcdC8qXG4tXHRcdFx0ICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZVxuLVx0XHRcdCAqIGhlbGQgaW4gd3JpdGUgbW9kZS4gIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5XG4tXHRcdFx0ICogZG8gdGhpcyBvdXRzaWRlIHJtYXAgcm91dGluZXMuXG4tXHRcdFx0ICpcbi1cdFx0XHQgKiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuXG4tXHRcdFx0ICogTG9jayBvcmRlciBkaWN0YXRlcyBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFXG4tXHRcdFx0ICogaV9tbWFwX3J3c2VtLiAgV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmRcbi1cdFx0XHQgKiBmYWlsIGlmIHVuc3VjY2Vzc2Z1bC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoIWFub24pIHtcbi1cdFx0XHRcdHN0cnVjdCBtbXVfZ2F0aGVyIHRsYjtcbitcdFx0bnJfcGFnZXMgPSAxO1xuK1x0XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4rXHRcdFx0bnJfcGFnZXMgPSBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaChmb2xpbywgXHUwMDI2cHZtdywgcHRldmFsLFxuK1x0XHRcdFx0XHRcdFx0ICAgc3VicGFnZSwgYW5vbl9leGNsdXNpdmUpO1xuIFxuLVx0XHRcdFx0Vk1fQlVHX09OKCEoZmxhZ3MgXHUwMDI2IFRUVV9STUFQX0xPQ0tFRCkpO1xuLVx0XHRcdFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpIHtcbi1cdFx0XHRcdFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcdTAwMjZwdm13KTtcbi1cdFx0XHRcdFx0cmV0ID0gZmFsc2U7XG4tXHRcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdFx0fVxuK1x0XHRcdGVuZF9hZGRyID0gYWRkcmVzcyArIG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuK1x0XHRcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgYWRkcmVzcywgZW5kX2FkZHIpO1xuIFxuLVx0XHRcdFx0dGxiX2dhdGhlcl9tbXVfdm1hKFx1MDAyNnRsYiwgdm1hKTtcbi1cdFx0XHRcdGlmIChodWdlX3BtZF91bnNoYXJlKFx1MDAyNnRsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHtcbi1cdFx0XHRcdFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XG4tXHRcdFx0XHRcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXHUwMDI2dGxiLCB2bWEpO1xuLVx0XHRcdFx0XHR0bGJfZmluaXNoX21tdShcdTAwMjZ0bGIpO1xuLVx0XHRcdFx0XHQvKlxuLVx0XHRcdFx0XHQgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCxcbi1cdFx0XHRcdFx0ICogY29uc2VxdWVudGx5IHVubWFwcGluZyB0aGUgZm9saW8uXG4tXHRcdFx0XHRcdCAqL1xuLVx0XHRcdFx0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuLVx0XHRcdFx0XHRicmVhaztcbi1cdFx0XHRcdH1cbi1cdFx0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuLVx0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbi1cdFx0XHR9XG4tXHRcdFx0LyogTnVrZSB0aGUgaHVnZXRsYiBwYWdlIHRhYmxlIGVudHJ5ICovXG4tXHRcdFx0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuLVx0XHRcdGlmIChwdGVfZGlydHkocHRldmFsKSlcbi1cdFx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0XHRcdHdyaXRhYmxlID0gcHRlX3dyaXRlKHB0ZXZhbCk7XG4tXHRcdH0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4tXHRcdFx0Zmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHJlc3MsIHBmbik7XG4tXHRcdFx0LyogTnVrZSB0aGUgcGFnZSB0YWJsZSBlbnRyeS4gKi9cbitcdFx0XHQvKiBOdWtlIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuICovXG4rXHRcdFx0cHRldmFsID0gZ2V0X2FuZF9jbGVhcl9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgbnJfcGFnZXMpO1xuIFx0XHRcdGlmIChzaG91bGRfZGVmZXJfZmx1c2gobW0sIGZsYWdzKSkge1xuIFx0XHRcdFx0LypcbiBcdFx0XHRcdCAqIFdlIGNsZWFyIHRoZSBQVEUgYnV0IGRvIG5vdCBmbHVzaCBzbyBwb3RlbnRpYWxseVxuQEAgLTI1ODYsMTEgKzI3NDMsOSBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0XHQgKiB0cmFuc2l0aW9uIG9uIGEgY2FjaGVkIFRMQiBlbnRyeSBpcyB3cml0dGVuIHRocm91Z2hcbiBcdFx0XHRcdCAqIGFuZCB0cmFwcyBpZiB0aGUgUFRFIGlzIHVubWFwcGVkLlxuIFx0XHRcdFx0ICovXG4tXHRcdFx0XHRwdGV2YWwgPSBwdGVwX2dldF9hbmRfY2xlYXIobW0sIGFkZHJlc3MsIHB2bXcucHRlKTtcbi1cbi1cdFx0XHRcdHNldF90bGJfdWJjX2ZsdXNoX3BlbmRpbmcobW0sIHB0ZXZhbCwgYWRkcmVzcywgYWRkcmVzcyArIFBBR0VfU0laRSk7XG4rXHRcdFx0XHRzZXRfdGxiX3ViY19mbHVzaF9wZW5kaW5nKG1tLCBwdGV2YWwsIGFkZHJlc3MsIGVuZF9hZGRyKTtcbiBcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0cHRldmFsID0gcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcbitcdFx0XHRcdGZsdXNoX3RsYl9yYW5nZSh2bWEsIGFkZHJlc3MsIGVuZF9hZGRyKTtcbiBcdFx0XHR9XG4gXHRcdFx0aWYgKHB0ZV9kaXJ0eShwdGV2YWwpKVxuIFx0XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG5AQCAtMjYxMywxNCArMjc2OCw4IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRWTV9XQVJOX09OX0ZPTElPKGZvbGlvX2lzX2RldmljZV9wcml2YXRlKGZvbGlvKSwgZm9saW8pO1xuIFxuIFx0XHRcdHB0ZXZhbCA9IHN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShzdWJwYWdlKSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcbi1cdFx0XHRcdGh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pO1xuLVx0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLFxuLVx0XHRcdFx0XHRcdGhzeik7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdGRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbi1cdFx0XHR9XG4rXHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbitcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbiBcdFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgXHUwMDI2XHUwMDI2IHB0ZV91bnVzZWQocHRldmFsKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuIFx0XHRcdC8qXG5AQCAtMjYzNSw4ICsyNzg0LDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdCAqL1xuIFx0XHRcdGRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0c3dwX2VudHJ5X3QgZW50cnk7XG4gXHRcdFx0cHRlX3Qgc3dwX3B0ZTtcbitcdFx0XHR1bnNpZ25lZCBpbnQgaTtcbiBcbiBcdFx0XHQvKlxuIFx0XHRcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cbkBAIC0yNjQ0LDMyICsyNzkzLDE1IEBAIHN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHQgKiBzbyB3ZSdsbCBub3QgY2hlY2svY2FyZS5cbiBcdFx0XHQgKi9cbiBcdFx0XHRpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSBcdTAwM2MgMCkge1xuLVx0XHRcdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpXG4tXHRcdFx0XHRcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsXG4tXHRcdFx0XHRcdFx0XHRwdGV2YWwsIGhzeik7XG4tXHRcdFx0XHRlbHNlXG4tXHRcdFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xuLVx0XHRcdFx0cmV0ID0gZmFsc2U7XG4tXHRcdFx0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuLVx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuK1x0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuIFx0XHRcdH1cbiBcbi1cdFx0XHQvKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xuLVx0XHRcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XG4tXHRcdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdFx0XHQgICAgaHVnZXRsYl90cnlfc2hhcmVfYW5vbl9ybWFwKGZvbGlvKSkge1xuLVx0XHRcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLFxuLVx0XHRcdFx0XHRcdFx0cHRldmFsLCBoc3opO1xuLVx0XHRcdFx0XHRyZXQgPSBmYWxzZTtcbi1cdFx0XHRcdFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcdTAwMjZwdm13KTtcbi1cdFx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0XHR9XG4tXHRcdFx0fSBlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSBcdTAwMjZcdTAwMjZcbi1cdFx0XHRcdCAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKGZvbGlvLCBzdWJwYWdlKSkge1xuLVx0XHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XG4tXHRcdFx0XHRyZXQgPSBmYWxzZTtcbi1cdFx0XHRcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4tXHRcdFx0XHRicmVhaztcbitcdFx0XHQvKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbitcdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4rXHRcdFx0ICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhmb2xpbywgc3VicGFnZSwgbnJfcGFnZXMpKSB7XG4rXHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuK1x0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuIFx0XHRcdH1cbiBcbiBcdFx0XHQvKlxuQEAgLTI2NzcsNTIgKzI4MDksNDAgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdCAqIHB0ZS4gZG9fc3dhcF9wYWdlKCkgd2lsbCB3YWl0IHVudGlsIHRoZSBtaWdyYXRpb25cbiBcdFx0XHQgKiBwdGUgaXMgcmVtb3ZlZCBhbmQgdGhlbiByZXN0YXJ0IGZhdWx0IGhhbmRsaW5nLlxuIFx0XHRcdCAqL1xuLVx0XHRcdGlmICh3cml0YWJsZSlcbi1cdFx0XHRcdGVudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkoXG4tXHRcdFx0XHRcdFx0XHRwYWdlX3RvX3BmbihzdWJwYWdlKSk7XG4tXHRcdFx0ZWxzZSBpZiAoYW5vbl9leGNsdXNpdmUpXG4tXHRcdFx0XHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfZXhjbHVzaXZlX21pZ3JhdGlvbl9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHN1YnBhZ2UpKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4oc3VicGFnZSkpO1xuLVx0XHRcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcbi1cdFx0XHRcdGlmIChwdGVfeW91bmcocHRldmFsKSlcbi1cdFx0XHRcdFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7XG4tXHRcdFx0XHRpZiAocHRlX2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfZGlydHkoZW50cnkpO1xuLVx0XHRcdFx0c3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpO1xuLVx0XHRcdFx0aWYgKHB0ZV9zb2Z0X2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcbi1cdFx0XHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbi1cdFx0XHRcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSlcbi1cdFx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xuLVx0XHRcdFx0aWYgKHB0ZV9zd3BfdWZmZChwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4tXHRcdFx0fVxuLVx0XHRcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKVxuLVx0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSxcbi1cdFx0XHRcdFx0XHRoc3opO1xuLVx0XHRcdGVsc2Vcbi1cdFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlKTtcbitcdFx0XHRzd3BfcHRlID0gbWFrZV9taWdyYXRpb25fc3dwX3B0ZShzdWJwYWdlLCBwdGV2YWwsXG4rXHRcdFx0XHRcdFx0XHQgd3JpdGFibGUsIGFub25fZXhjbHVzaXZlKTtcbiBcdFx0XHR0cmFjZV9zZXRfbWlncmF0aW9uX3B0ZShhZGRyZXNzLCBwdGVfdmFsKHN3cF9wdGUpLFxuIFx0XHRcdFx0XHRcdGZvbGlvX29yZGVyKGZvbGlvKSk7XG4rXG4rXHRcdFx0LyogU2V0IG5yX3BhZ2VzIG1pZ3JhdGlvbiBlbnRyaWVzLCBhZHZhbmNpbmcgdGhlIFBGTi4gKi9cbitcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzICsgKHVuc2lnbmVkIGxvbmcpaSAqIFBBR0VfU0laRSxcbitcdFx0XHRcdFx0ICAgcHZtdy5wdGUgKyBpLCBzd3BfcHRlKTtcbitcdFx0XHRcdHN3cF9wdGUgPSBwdGVfbmV4dF9zd3Bfb2Zmc2V0KHN3cF9wdGUpO1xuK1x0XHRcdH1cbiBcdFx0XHQvKlxuIFx0XHRcdCAqIE5vIG5lZWQgdG8gaW52YWxpZGF0ZSBoZXJlIGl0IHdpbGwgc3luY2hyb25pemUgb25cbiBcdFx0XHQgKiBhZ2FpbnN0IHRoZSBzcGVjaWFsIHN3YXAgbWlncmF0aW9uIHB0ZS5cbiBcdFx0XHQgKi9cbiBcdFx0fVxuIFxuLVx0XHRpZiAodW5saWtlbHkoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkpXG4tXHRcdFx0aHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7XG4tXHRcdGVsc2Vcbi1cdFx0XHRmb2xpb19yZW1vdmVfcm1hcF9wdGUoZm9saW8sIHN1YnBhZ2UsIHZtYSk7XG4rXHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xuIFx0XHRpZiAodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9MT0NLRUQpXG4gXHRcdFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcbi1cdFx0Zm9saW9fcHV0KGZvbGlvKTtcbitcdFx0Zm9saW9fcHV0X3JlZnMoZm9saW8sIG5yX3BhZ2VzKTtcbitcbitcdFx0LypcbitcdFx0ICogSWYgd2UgYmF0Y2hlZCB0aGUgZW50aXJlIGZvbGlvLCB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG9cbitcdFx0ICogd2Fsazsgc3RvcCByaWdodCBoZXJlLlxuK1x0XHQgKi9cbitcdFx0aWYgKG5yX3BhZ2VzID09IGZvbGlvX25yX3BhZ2VzKGZvbGlvKSlcbitcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0Y29udGludWU7XG4rd2Fsa19hYm9ydDpcbitcdFx0cmV0ID0gZmFsc2U7XG4rd2Fsa19kb25lOlxuK1x0XHRwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKFx1MDAyNnB2bXcpO1xuK1x0XHRicmVhaztcbiBcdH1cbiBcbiBcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChcdTAwMjZyYW5nZSk7XG5AQCAtMjc0MSw3ICsyODYxLDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIHZvaWQgdHJ5X3RvX21pZ3JhdGUoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHtcbi1cdFx0LnJtYXBfb25lID0gdHJ5X3RvX21pZ3JhdGVfb25lLFxuK1x0XHQucm1hcF9vbmUgPSBmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pID9cbitcdFx0XHRcdHRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lIDogdHJ5X3RvX21pZ3JhdGVfb25lLFxuIFx0XHQuYXJnID0gKHZvaWQgKilmbGFncyxcbiBcdFx0LmRvbmUgPSBmb2xpb19ub3RfbWFwcGVkLFxuIFx0XHQuYW5vbl9sb2NrID0gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkLFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6MjMuMTM5ODU3MjExWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjU3NjE4NjEyMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBNZW1vcnkgTWFuYWdlbWVudCBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggaW4gZnJvbnQgb2YgbWUsIGFuZCBpdCBsb29rcyBsaWtlIGEgZmFpcmx5IHNpZ25pZmljYW50IGNoYW5nZSB0byB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLCBmb2N1c2luZyBvbiBgcm1hcC5jYCBhbmQgYG1pZ3JhdGUuY2AuIFNwZWNpZmljYWxseSwgaXQncyBpbnRyb2R1Y2luZyBzb21lIGJhdGNoaW5nIGZvciBtaWdyYXRpb24gUFRFcyDigJMgYG1pZ3JhdGlvbl9wdGVfYmF0Y2hgLCBgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzYCwgYW5kIGBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaGAgYXJlIHRoZSBrZXkgcGxheWVycyBoZXJlLiBJdCdzIHJlZmFjdG9yaW5nIGB0cnlfdG9fbWlncmF0ZV9vbmVgIHRvIHVzZSB0aGlzIGJhdGNoaW5nIGFwcHJvYWNoLCBhbmQgZXZlbiBwdWxsaW5nIG91dCBhIGRlZGljYXRlZCBgdHJ5X3RvX21pZ3JhdGVfaHVnZXRsYl9vbmVgIGZ1bmN0aW9uIGZvciBIdWdldGxiIGZvbGlvcy4gSXQncyBhbHNvIHRvdWNoaW5nIGByZW1vdmVfbWlncmF0aW9uX3B0ZWAgd2l0aCBiYXRjaGluZyBpbiBtaW5kLlxuXG5HaXZlbiB0aGF0IHRoaXMgaXMgdG91Y2hpbmcgZnVuZGFtZW50YWwgbWVtb3J5IG1hbmFnZW1lbnQgLSBtaWdyYXRpb24gYW5kIHRoZSBybWFwIG1lY2hhbmlzbSAtIHRoaXMgaXMgYWJzb2x1dGVseSBzb21ldGhpbmcgdGhhdCBkZW1hbmRzIHRob3JvdWdoIGZ1enppbmcuIFdlIG5lZWQgdG8gYmUgY29uZmlkZW50IGluIGl0cyBjb3JyZWN0bmVzcywgZXNwZWNpYWxseSBhcm91bmQgUFRFIGhhbmRsaW5nLlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGdldCBzcGVjaWZpYy4gSSBuZWVkIHRvIG5haWwgZG93biB0aGUgYWZmZWN0ZWQgY29kZSBhbmQgd2hhdCB0aGUga2V5IGZ1bmN0aW9uYWwgYXJlYXMgYXJlLiBMZXQgbWUgbGlzdCB0aGUgcHJpbWFyeSBmdW5jdGlvbnMgSSBuZWVkIHRvIGZvY3VzIG9uIGR1cmluZyBmdXp6aW5nOlxuXG4qICAgYG1pZ3JhdGlvbl9wdGVfYmF0Y2hgXG4qICAgYHJlbW92ZV9taWdyYXRpb25fcHRlYFxuKiAgIGByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiYFxuKiAgIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWBcbiogICBgdHJ5X3RvX21pZ3JhdGVfb25lYFxuKiAgIGBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaGBcbiogICBgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzYFxuKiAgIGBtYWtlX21pZ3JhdGlvbl9zd3BfcHRlYFxuXG5Pa2F5LCBub3cgbGV0J3MgdXNlIGBkZWZhdWx0X2FwaTpncmVwcGVyYCB0byBsb2NhdGUgdGhlc2UgZnVuY3Rpb25zIGFuZCB1bmRlcnN0YW5kIHRoZWlyIGNvbnRleHQgd2l0aGluIHRoZSBjb2RlLiBJJ2xsIG5lZWQgdG8gY2hlY2sgYm90aCBgbW0vbWlncmF0ZS5jYCBhbmQgYG1tL3JtYXAuY2AgdG8gcGlucG9pbnQgd2hlcmUgdGhlc2UgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBpbXBsZW1lbnRlZC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgaGFuZGxlIG9uIHdoZXJlIHRvIGZvY3VzIG15IGFuYWx5c2lzIGFuZCBmdXp6aW5nIGVmZm9ydHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MzAwLCJPdXRwdXRUb2tlbnMiOjk5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mjk0LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6MjkuNzE2MDQ1OTU0WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQxMzUyODYwNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXihzdGF0aWN8dm9pZHxpbnR8Ym9vbHx1bnNpZ25lZCkuKiAobWlncmF0aW9uX3B0ZV9iYXRjaHxyZW1vdmVfbWlncmF0aW9uX3B0ZXxyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxifHRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lfHRyeV90b19taWdyYXRlX29uZXxmb2xpb19taWdyYXRlX3B0ZV9iYXRjaHxmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZXN8bWFrZV9taWdyYXRpb25fc3dwX3B0ZSlcXFxcKFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3JtYXAuaD03MDg9c3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19mb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3JtYXAuaC04MTItICovXFxuaW5jbHVkZS9saW51eC9ybWFwLmg6ODEzOnN0YXRpYyBpbmxpbmUgaW50IGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlcyhzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbmluY2x1ZGUvbGludXgvcm1hcC5oLTgxNC1cXHRcXHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4tLVxcbm1tL21pZ3JhdGUuYz0zNDM9c3RydWN0IHJtYXBfd2Fsa19hcmcge1xcbi0tXFxubW0vbWlncmF0ZS5jLTM1MS0gKi9cXG5tbS9taWdyYXRlLmM6MzUyOnN0YXRpYyB1bnNpZ25lZCBpbnQgbWlncmF0aW9uX3B0ZV9iYXRjaChzdHJ1Y3QgcGFnZV92bWFfbWFwcGVkX3dhbGsgKnB2bXcsXFxubW0vbWlncmF0ZS5jLTM1My1cXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBwdGVfdCBmaXJzdF9wdGUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfaWR4KVxcbi0tXFxubW0vbWlncmF0ZS5jPTM3MD1zdGF0aWMgcHRlX3QgbWlncmF0aW9uX3NvZnRsZWFmX2VudHJ5X3RvX3B0ZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqbmV3LFxcbi0tXFxubW0vbWlncmF0ZS5jLTQwMy0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRVxcbm1tL21pZ3JhdGUuYzo0MDQ6c3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYihzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbm1tL21pZ3JhdGUuYy00MDUtXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxcbi0tXFxubW0vbWlncmF0ZS5jLTQ0NS0jZWxzZVxcbm1tL21pZ3JhdGUuYzo0NDY6c3RhdGljIGJvb2wgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYihzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbm1tL21pZ3JhdGUuYy00NDctXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYXJnKVxcbi0tXFxubW0vbWlncmF0ZS5jLTQ1NS0gKi9cXG5tbS9taWdyYXRlLmM6NDU2OnN0YXRpYyBib29sIHJlbW92ZV9taWdyYXRpb25fcHRlKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxubW0vbWlncmF0ZS5jLTQ1Ny1cXHRcXHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICphcmcpXFxuLS1cXG5tbS9ybWFwLmM9MjM5Mz12b2lkIHRyeV90b191bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBlbnVtIHR0dV9mbGFncyBmbGFncylcXG4tLVxcbm1tL3JtYXAuYy0yNDA4LS8qIEJ1aWxkIHRoZSBtaWdyYXRpb24gc3dhcCBQVEUgdGhhdCByZXBsYWNlcyBwdGV2YWwgZm9yIGEgcGFnZS4gKi9cXG5tbS9ybWFwLmM6MjQwOTpzdGF0aWMgcHRlX3QgbWFrZV9taWdyYXRpb25fc3dwX3B0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgcHRlX3QgcHRldmFsLFxcbm1tL3JtYXAuYy0yNDEwLVxcdFxcdGJvb2wgd3JpdGFibGUsIGJvb2wgYW5vbl9leGNsdXNpdmUpXFxuLS1cXG5tbS9ybWFwLmMtMjQ0OC0gKi9cXG5tbS9ybWFwLmM6MjQ0OTpzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbm1tL3JtYXAuYy0yNDUwLVxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcXG4tLVxcbm1tL3JtYXAuYy0yNTg4LVxcbm1tL3JtYXAuYzoyNTg5OnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX21pZ3JhdGVfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxubW0vcm1hcC5jLTI1OTAtXFx0XFx0c3RydWN0IHBhZ2Vfdm1hX21hcHBlZF93YWxrICpwdm13LCBwdGVfdCBwdGUsXFxuLS1cXG5tbS9ybWFwLmMtMjYzNi0gKi9cXG5tbS9ybWFwLmM6MjYzNzpzdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxubW0vcm1hcC5jLTI2MzgtXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6MzMuODUxMzQwNTA0WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTIzNTk1OTY5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIE1pZ3JhdGlvbiBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEkgc2VlIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHNldCBvZiBmdW5jdGlvbnMgcmVsYXRlZCB0byBwYWdlIG1pZ3JhdGlvbi4gVGhlIGNvcmUgc2V0IGluY2x1ZGVzIGBtaWdyYXRpb25fcHRlX2JhdGNoYCwgYHJlbW92ZV9taWdyYXRpb25fcHRlX2h1Z2V0bGJgLCBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVgLCBgbWFrZV9taWdyYXRpb25fc3dwX3B0ZWAsIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAsIGBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaGAsIGFuZCBgdHJ5X3RvX21pZ3JhdGVfb25lYC4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIGluc3RhbnRseSByZWNvZ25pemUgdGhlc2UgYXMgY3J1Y2lhbCBlbGVtZW50cyBpbiBoYW5kbGluZyB0aGUgbW92ZW1lbnQgb2YgcGFnZXMsIHBvdGVudGlhbGx5IGZyb20gb25lIHBoeXNpY2FsIGxvY2F0aW9uIHRvIGFub3RoZXIuIFRoZSBuYW1pbmcgY29udmVudGlvbnMgc3VnZ2VzdCBiYXRjaCBwcm9jZXNzaW5nIGFuZCBoYW5kbGluZyBvZiBIdWdlVExCIHBhZ2VzLCB3aGljaCBpcyBwcmVjaXNlbHkgdGhlIGtpbmQgb2YgbG93LWxldmVsIHN0dWZmIEkgbmVlZCB0byB1bmRlcnN0YW5kLlxuXG5Ob3csIGEgY3JpdGljYWwgcXVlc3Rpb24gYXJpc2VzOiBhcmUgdGhlcmUgYW55ICpzcGVjaWZpYyogY29uZmlndXJhdGlvbnMgdGhhdCBpbmZsdWVuY2UgdGhlaXIgYmVoYXZpb3Igb3IgY29tcGlsYXRpb24/IEZyb20gbXkgaW5pdGlhbCBzY2FuLCBpdCBsb29rcyBsaWtlIGBDT05GSUdfSFVHRVRMQl9QQUdFYCBpcyB0aGUga2V5IGZvciBmdW5jdGlvbnMgbGlrZSBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYmAgYW5kIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAsIHdoaWNoIG1ha2VzIHBlcmZlY3Qgc2Vuc2UuIEh1Z2VUTEIgcGFnZSBtaWdyYXRpb24gd2lsbCBhbHdheXMgbmVlZCB0aGlzIGVuYWJsZWQuIE9idmlvdXNseSwgYENPTkZJR19NSUdSQVRJT05gIGlzIGdvaW5nIHRvIGJlIG1hbmRhdG9yeS4gQnV0LCB3aGF0IGFib3V0IHRoZSBjb21waWxhdGlvbiBvZiBgbWlncmF0ZS5jYCBpdHNlbGY/IEl0J3MgZXNzZW50aWFsIHRvIGNvbmZpcm0gaWYgaXQncyBjb25kaXRpb25hbGx5IGluY2x1ZGVkLCBvciBpZiB0aGUgY29tcGlsZXIgYWx3YXlzIGJ1aWxkcyBpdC4gVGhlIGRldGFpbHMgd2lsbCBiZSBmb3VuZCBpbiBlaXRoZXIgYG1tL0tjb25maWdgIG9yIGBtbS9NYWtlZmlsZWAuIFRoYXQncyB3aGVyZSBJIG5lZWQgdG8gbG9vayBmb3IgcHJlY2lzZSBhbnN3ZXJzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTk1NCwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3MSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMjozOS4wODczMDM4ODRaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ4MjI2MTk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm1pZ3JhdGVcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vTWFrZWZpbGVcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9OTc9b2JqLSQoQ09ORklHX01FTVRFU1QpXFx0XFx0Kz0gbWVtdGVzdC5vXFxubW0vTWFrZWZpbGU6OTg6b2JqLSQoQ09ORklHX01JR1JBVElPTikgKz0gbWlncmF0ZS5vXFxubW0vTWFrZWZpbGUtOTktb2JqLSQoQ09ORklHX05VTUEpICs9IG1lbW9yeS10aWVycy5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEyVDEzOjEyOjM5LjIzNTU0MDQ2M1oiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MzIyOTQ0NTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBgQ09ORklHX01JR1JBVElPTmAgaXMgZW5hYmxlZC4gVGhhdCdzIGZ1bmRhbWVudGFsLCBJJ2Qgc2F5LiBBbmQsIG9mIGNvdXJzZSwgZm9yIGFueXRoaW5nIGh1Z2V0bGItc3BlY2lmaWMsIEkgbmVlZCBgQ09ORklHX0hVR0VUTEJfUEFHRWAuIE1ha2VzIHBlcmZlY3Qgc2Vuc2UuIE5vdywgZ2l2ZW4gdGhhdCBiYXRjaGluZyBpcyBtb3N0IGJlbmVmaWNpYWwgZm9yIGxhcmdlciBmb2xpb3MsIGl0J3Mgd29ydGggY2hlY2tpbmcgdGhlIHN0YXR1cyBvZiBgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhcyB3ZWxsLiBNaWdodCBhcyB3ZWxsIGJlIHRob3JvdWdoIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGFueSBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBJIHNob3VsZCBiZSBjb25zaWRlcmluZyBhdCB0aGUgc2FtZSB0aW1lLiBMZXQgbWUganVzdCBzY2FuIHRocm91Z2ggdGhlIHJlbGV2YW50IGRvY3VtZW50YXRpb24gYW5kIGNvbmZpZ3MgdG8gY29uZmlybS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY1NTQsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMjo0Mi43Njc4Mzk3MTdaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzY2MTc4NTUzLCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJDT05GSUdfTUlHUkFUSU9OXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEyVDEzOjEyOjQzLjEzNDAyOFoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI5MzMzNDA1MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgaG93IEknZCBhcHByb2FjaCB0aGlzIHRhc2ssIGFzIGlmIHRoZXNlIHdlcmUgbXkgaW50ZXJuYWwgdGhvdWdodHM6XG5cbioqTG9jYXRpbmcgdGhlIERlZmluaXRpb24gb2YgQ09ORklHX01JR1JBVElPTioqXG5cbkFscmlnaHQsIHNvIGBDT05GSUdfTUlHUkFUSU9OYCBpcyB0aGUgdGFyZ2V0LiBGaXJzdCBpbnN0aW5jdD8gTGV0J3MgdHJhY2UgYmFjayB0aGF0IG1hY3JvLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSBpdCdzIGRlZmluZWQgd2l0aGluIHRoZSBwcm9qZWN0LiBJJ2xsIG5lZWQgdG8ga25vdyB3aGVyZSBJIGNhbiBzZWUgaXRzIHZhbHVlLCB3aGF0IGl0IHJlbGF0ZXMgdG8sIGFuZCBob3cgaXQgaXMgYmVpbmcgdXNlZC4gV2hlcmUgaXMgdGhhdCBjb25maWcgb3B0aW9uIGRlZmluZWQ/IExldCdzIHBpbnBvaW50IHRoYXQgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb24uIEZyb20gdGhlcmUsIEkgY2FuIHVuZGVyc3RhbmQgaXQncyByb2xlIGluIHRoZSBhcmNoaXRlY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2ODA3LCJPdXRwdXRUb2tlbnMiOjE4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTJUMTM6MTI6NDYuMDY3MzcxMjc4WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzYzNTg1MDk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBNSUdSQVRJT05cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz02Nzc9Y29uZmlnIE5VTUFfTUlHUkFUSU9OXFxuLS1cXG5tbS9LY29uZmlnLTY4Ny1cXG5tbS9LY29uZmlnOjY4ODpjb25maWcgTUlHUkFUSU9OXFxubW0vS2NvbmZpZy02ODktXFx0Ym9vbFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMjo0OC44MzA5NjQzMzdaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUxMjUyNzMyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqS2NvbmZpZyBNdXNpbmdzKipcblxuUmlnaHQsIGxldCBtZSBzZWUuLi4gdGhhdCBgY29uZmlnIE1JR1JBVElPTmAgb3B0aW9uIEknbSBmYW1pbGlhciB3aXRoLCB0aGF0J3MgZGVmaW5lZCBpbiBgbW0vS2NvbmZpZ2AsIGlzbid0IGl0PyBHb29kLiBBaCwgYW5kIGEgcXVpY2sgc2FuaXR5IGNoZWNrIOKAkyBJIHJlbWVtYmVyIGl0J3MgYSBzaW1wbGUgYm9vbGVhbi4gTm90aGluZyBjb21wbGljYXRlZCB0aGVyZS4gTm93LCBqdXN0IHRvIGJlIHRob3JvdWdoIGFuZCBiZWNhdXNlIGl0J3MgaW4gdGhlIHNhbWUgZ2VuZXJhbCBhcmVhLCBsZXQgbWUgdGFrZSBhIHF1aWNrIGxvb2sgYXQgYENPTkZJR19IVUdFVExCX1BBR0VgIHdoaWxlIEknbSBhdCBpdCwganVzdCB0byBiZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwIGFuZCBhbnkgcG90ZW50aWFsIGludGVyYWN0aW9ucy4gTmVlZCB0byBrZWVwIHRoZSB3aG9sZSBwaWN0dXJlIGluIG1pbmQsIGFmdGVyIGFsbC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTcwNDQsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMjo1Mi4zNDM0OTQ0NTNaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2MzU4MDYzMDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEhVR0VUTEJfUEFHRVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL3NoL21tL0tjb25maWc9MTU4PWNob2ljZVxcbi0tXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE2My1cXG5hcmNoL3NoL21tL0tjb25maWc6MTY0OmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV82NEtcXG5hcmNoL3NoL21tL0tjb25maWctMTY1LVxcdGJvb2wgXFxcIjY0a0JcXFwiXFxuLS1cXG5hcmNoL3NoL21tL0tjb25maWctMTY3LVxcbmFyY2gvc2gvbW0vS2NvbmZpZzoxNjg6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzI1NktcXG5hcmNoL3NoL21tL0tjb25maWctMTY5LVxcdGJvb2wgXFxcIjI1NmtCXFxcIlxcbi0tXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE3MS1cXG5hcmNoL3NoL21tL0tjb25maWc6MTcyOmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV8xTUJcXG5hcmNoL3NoL21tL0tjb25maWctMTczLVxcdGJvb2wgXFxcIjFNQlxcXCJcXG5hcmNoL3NoL21tL0tjb25maWctMTc0LVxcbmFyY2gvc2gvbW0vS2NvbmZpZzoxNzU6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFXzRNQlxcbmFyY2gvc2gvbW0vS2NvbmZpZy0xNzYtXFx0Ym9vbCBcXFwiNE1CXFxcIlxcbi0tXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE3OC1cXG5hcmNoL3NoL21tL0tjb25maWc6MTc5OmNvbmZpZyBIVUdFVExCX1BBR0VfU0laRV82NE1CXFxuYXJjaC9zaC9tbS9LY29uZmlnLTE4MC1cXHRib29sIFxcXCI2NE1CXFxcIlxcbi0tXFxuZnMvS2NvbmZpZz0yNjI9aWYgSFVHRVRMQkZTXFxuZnMvS2NvbmZpZzoyNjM6Y29uZmlnIEhVR0VUTEJfUEFHRV9PUFRJTUlaRV9WTUVNTUFQX0RFRkFVTFRfT05cXG5mcy9LY29uZmlnLTI2NC1cXHRib29sIFxcXCJIdWdlVExCIFZtZW1tYXAgT3B0aW1pemF0aW9uIChIVk8pIGRlZmF1bHRzIHRvIG9uXFxcIlxcbi0tXFxuZnMvS2NvbmZpZz0yNzE9ZW5kaWYgIyBIVUdFVExCRlNcXG5mcy9LY29uZmlnLTI3Mi1cXG5mcy9LY29uZmlnOjI3Mzpjb25maWcgSFVHRVRMQl9QQUdFXFxuZnMvS2NvbmZpZy0yNzQtXFx0ZGVmX2Jvb2wgSFVHRVRMQkZTXFxuLS1cXG5mcy9LY29uZmlnLTI3Ni1cXG5mcy9LY29uZmlnOjI3Nzpjb25maWcgSFVHRVRMQl9QQUdFX09QVElNSVpFX1ZNRU1NQVBcXG5mcy9LY29uZmlnLTI3OC1cXHRkZWZfYm9vbCBIVUdFVExCX1BBR0VcXG4tLVxcbm1tL0tjb25maWc9Njk4PWNvbmZpZyBBUkNIX0hBU19QTURfU09GVExFQVZFU1xcbi0tXFxubW0vS2NvbmZpZy03MDAtXFxubW0vS2NvbmZpZzo3MDE6Y29uZmlnIEhVR0VUTEJfUEFHRV9TSVpFX1ZBUklBQkxFXFxubW0vS2NvbmZpZy03MDItXFx0ZGVmX2Jvb2wgblxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMjo1NC45NzkzMTEzNDFaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzI2OTUyNzAxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyBIdWdlIFBhZ2VzIGFuZCBEZXBlbmRlbmNpZXMqKlxuXG5BbHJpZ2h0LCBsZXQncyBzZWUuLi4gYEhVR0VUTEJfUEFHRWAgaXMgZGVmaW5lZCBpbiBgZnMvS2NvbmZpZ2AuIFRoYXQncyB0aGUgc3RhcnRpbmcgcG9pbnQuIEFuZCBhIHF1aWNrIGNoZWNrIHJldmVhbHMgdGhhdCBpdCdzIGRlcGVuZGVudCBvbiBgSFVHRVRMQkZTYC4gTWFrZXMgcGVyZmVjdCBzZW5zZS4gQ2FuJ3QgaGF2ZSBodWdlIHBhZ2VzIHdpdGhvdXQgdGhlIGZpbGUgc3lzdGVtIHN1cHBvcnQsIHJpZ2h0PyBOb3csIHRoZSBuZXh0IHF1ZXN0aW9uIGlzIGFib3V0IGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLiBJIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdGhhdCB0aWVzIGluLiBMZXQncyBzZWUgd2hhdCBJIGNhbiBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzg1MywiT3V0cHV0VG9rZW5zIjoyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEyVDEzOjEyOjU4LjI0ODg0MDUxM1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjY5NzIxODkxNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz04MzU9Y29uZmlnIE1NX0lEXFxuLS1cXG5tbS9LY29uZmlnLTgzNy1cXG5tbS9LY29uZmlnOjgzODptZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXFxubW0vS2NvbmZpZy04MzktXFx0Ym9vbCBcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydFxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODU2PWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04NjEtXFxubW0vS2NvbmZpZzo4NjI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xcbm1tL0tjb25maWctODYzLVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctODY4LVxcbm1tL0tjb25maWc6ODY5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9NQURWSVNFXFxubW0vS2NvbmZpZy04NzAtXFx0XFx0Ym9vbCBcXFwibWFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWctODc3LVxcbm1tL0tjb25maWc6ODc4OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ORVZFUlxcbm1tL0tjb25maWctODc5LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZz04ODU9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTg5NC1cXG5tbS9LY29uZmlnOjg5NTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9ORVZFUlxcbm1tL0tjb25maWctODk2LVxcdFxcdGJvb2wgXFxcIm5ldmVyXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MDQtXFxubW0vS2NvbmZpZzo5MDU6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQUxXQVlTXFxubW0vS2NvbmZpZy05MDYtXFx0XFx0Ym9vbCBcXFwiYWx3YXlzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05MTItXFxubW0vS2NvbmZpZzo5MTM6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfV0lUSElOX1NJWkVcXG5tbS9LY29uZmlnLTkxNC1cXHRcXHRib29sIFxcXCJ3aXRoaW5fc2l6ZVxcXCJcXG4tLVxcbm1tL0tjb25maWctOTIwLVxcbm1tL0tjb25maWc6OTIxOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FEVklTRVxcbm1tL0tjb25maWctOTIyLVxcdFxcdGJvb2wgXFxcImFkdmlzZVxcXCJcXG4tLVxcbm1tL0tjb25maWc9OTMwPWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy05MzktXFxubW0vS2NvbmZpZzo5NDA6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTk0MS1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTQ4LVxcbm1tL0tjb25maWc6OTQ5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTUwLVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTU2LVxcbm1tL0tjb25maWc6OTU3OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05NTgtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk2NC1cXG5tbS9LY29uZmlnOjk2NTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTk2Ni1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEyVDEzOjEzOjAwLjk0NjA2NzA5OFoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTM0Njk0MzQ0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgTWVtb3J5IE1pZ3JhdGlvbiBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiBoYW5kZWQgdGhpcyBwYXRjaCB0aGF0J3MgY2xlYXJseSBmb2N1c2VkIG9uIG9wdGltaXppbmcgbWVtb3J5IG1pZ3JhdGlvbiwgcGFydGljdWxhcmx5IGFyb3VuZCBoYW5kbGluZyBQVEVzIGluIGJhdGNoZXMuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiB0aGUgY29yZSBmdW5jdGlvbnMgYWZmZWN0ZWQ6IGBtbS9taWdyYXRlLmNgIGFuZCBgbW0vcm1hcC5jYC4gSSd2ZSBnb25lIHRocm91Z2ggdGhlIGNvZGUgYW5kIEkndmUgaWRlbnRpZmllZCB0aGUga2V5IGZ1bmN0aW9ucyBJIG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGguXG5cbkkndmUgaW5pdGlhbGx5IGxpc3RlZCBhbGwgdGhlIGZ1bmN0aW9ucyBpbiB0aGF0IHJlZ2lvbiwgYnV0IEkgcXVpY2tseSByZWFsaXplZCB0aGF0IHR3byBvZiB0aGVtLCBgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGVzYCBhbmQgYHNvZnRsZWFmX3B0ZV9iYXRjaGAsIGFyZSBgc3RhdGljIGlubGluZWAgYW5kIGRlZmluZWQgaW4gaGVhZGVycy4gVGhlcmVmb3JlLCB0aGV5IG1pZ2h0IG5vdCBiZSBkaXJlY3RseSBmdXp6YWJsZSBhcyBzdGFuZGFsb25lIHVuaXRzLCBhbHRob3VnaCB0aGV5IGFyZSBjcml0aWNhbCB0byBjb25zaWRlciBhcyBwYXJ0IG9mIHRoZSBvdmVyYWxsIGZsb3cgb2YgdGhlIG5vbi1pbmxpbmUgZnVuY3Rpb25zLiBJJ3ZlIHJlLXByaW9yaXRpemVkIGFuZCByZW1vdmVkIHRob3NlIHN0YXRpYyBpbmxpbmVzIHRvIGdpdmUgbWUgYSBzaGFycGVyIGZvY3VzLlxuXG5TbywgaGVyZSdzIHRoZSBuYXJyb3dlZC1kb3duIGxpc3Qgb2YgZnVuY3Rpb25zIEkgcmVhbGx5IG5lZWQgdG8gZHJpbGwgZG93biBvbjogYG1pZ3JhdGlvbl9wdGVfYmF0Y2hgLCBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVgLCBgcmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYmAsIGByZW1vdmVfbWlncmF0aW9uX3B0ZXNgLCBgbWFrZV9taWdyYXRpb25fc3dwX3B0ZWAsIGB0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZWAsIGBmb2xpb19taWdyYXRlX3B0ZV9iYXRjaGAsIGB0cnlfdG9fbWlncmF0ZV9vbmVgLCBhbmQgYHRyeV90b19taWdyYXRlYC5cblxuVGhlIHBhdGNoJ3MgZ29hbCBhcHBlYXJzIHRvIGJlIHNwZWVkaW5nIHRoaW5ncyB1cCwgc28gYmF0Y2hpbmcgUFRFIG9wZXJhdGlvbnMsIHByZXN1bWFibHkgZm9yIGxhcmdlciBmb2xpb3MuIFRoaXMgbWVhbnMgbXkgZnV6emluZyBuZWVkcyB0byBiZSBwYXJ0aWN1bGFybHkgcm9idXN0LCBjb3ZlcmluZyBhbGwgdGhlIHBvdGVudGlhbCBwZXJtdXRhdGlvbnMgb2YgUFRFIGhhbmRsaW5nLCBlc3BlY2lhbGx5IHdpdGggcGVybWlzc2lvbnMsIGFuZCBtYWtpbmcgc3VyZSB0aGUgYmF0Y2hpbmcgbG9naWMgZG9lc24ndCBpbnRyb2R1Y2UgYW55IHN1YnRsZSBlcnJvcnMgb3IgbGVha3Mgd2hlbiBoYW5kbGluZyBkZXZpY2UtcHJpdmF0ZSBmb2xpb3Mgb3IgaHVnZXRsYiBwYWdlcy4gRWRnZSBjYXNlcyBhcmUgZ29pbmcgdG8gYmUgbXkgZnJpZW5kcyBoZXJlLlxuXG5HaXZlbiB0aGUgY29kZSdzIGRlcGVuZGVuY2Ugb24gYG1tL21pZ3JhdGUuY2AsIGBNSUdSQVRJT05gIGlzIG15IGluaXRpYWwgY29uZmlnLiBJIHRoZW4gbmVlZCB0byBlbnN1cmUgdGhhdCBgSFVHRVRMQl9QQUdFYCBpcyBhbHNvIHNldCBiZWNhdXNlIG9mIGByZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiYCBhbmQgYHRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lYC4gQWxzbywgc2luY2UgdGhlIHdob2xlIGJhdGNoaW5nIGNvbmNlcHQgaXMgbGFyZ2VseSBnZWFyZWQgdG93YXJkIGRlYWxpbmcgd2l0aCBsYXJnZXIgbWVtb3J5IGNodW5rcywgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBzaG91bGQgYWxzbyBiZSB1c2VkIHRvIGdldCBzb21lIGNvdmVyYWdlIGluIHRoYXQgc3BhY2UuXG5cbkkgdGhpbmsgSSd2ZSBnb3QgYSBzb2xpZCBwbGFuIGZvciBmdXp6aW5nIHRoaXMgcGF0Y2guIE5vdywgbGV0J3MgZ2V0IHRvIHdvcmshXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NzYxLCJPdXRwdXRUb2tlbnMiOjIxNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc0OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xMlQxMzoxMzoxMi4yOTMwMTM4MTJaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjA5NzIwODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1JR1JBVElPTlwiLFxuICAgIFwiSFVHRVRMQl9QQUdFXCIsXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm1pZ3JhdGlvbl9wdGVfYmF0Y2hcIixcbiAgICBcInJlbW92ZV9taWdyYXRpb25fcHRlXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZV9odWdldGxiXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZXNcIixcbiAgICBcIm1ha2VfbWlncmF0aW9uX3N3cF9wdGVcIixcbiAgICBcInRyeV90b19taWdyYXRlX2h1Z2V0bGJfb25lXCIsXG4gICAgXCJmb2xpb19taWdyYXRlX3B0ZV9iYXRjaFwiLFxuICAgIFwidHJ5X3RvX21pZ3JhdGVfb25lXCIsXG4gICAgXCJ0cnlfdG9fbWlncmF0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYmF0Y2hpbmcgZm9yIG1pZ3JhdGlvbiBQVEVzIHRvIG9wdGltaXplIG1lbW9yeSBtaWdyYXRpb24sIGVzcGVjaWFsbHkgZm9yIGxhcmdlIGZvbGlvcy4gSXQgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgaW4gbW0vbWlncmF0ZS5jIGFuZCBtbS9ybWFwLmMuIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBiYXRjaGluZyBsb2dpYyBjb3JyZWN0bHkgaGFuZGxlcyBQVEVzLCBwZXJtaXNzaW9ucywgYW5kIGVkZ2UgY2FzZXMgbGlrZSBkZXZpY2UgcHJpdmF0ZSBmb2xpb3Mgb3IgaHVnZXRsYiBwYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNSUdSQVRJT05cIixcbiAgICBcIkhVR0VUTEJfUEFHRVwiLFxuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJtaWdyYXRpb25fcHRlX2JhdGNoXCIsXG4gICAgXCJyZW1vdmVfbWlncmF0aW9uX3B0ZVwiLFxuICAgIFwicmVtb3ZlX21pZ3JhdGlvbl9wdGVfaHVnZXRsYlwiLFxuICAgIFwicmVtb3ZlX21pZ3JhdGlvbl9wdGVzXCIsXG4gICAgXCJtYWtlX21pZ3JhdGlvbl9zd3BfcHRlXCIsXG4gICAgXCJ0cnlfdG9fbWlncmF0ZV9odWdldGxiX29uZVwiLFxuICAgIFwiZm9saW9fbWlncmF0ZV9wdGVfYmF0Y2hcIixcbiAgICBcInRyeV90b19taWdyYXRlX29uZVwiLFxuICAgIFwidHJ5X3RvX21pZ3JhdGVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGJhdGNoaW5nIGZvciBtaWdyYXRpb24gUFRFcyB0byBvcHRpbWl6ZSBtZW1vcnkgbWlncmF0aW9uLCBlc3BlY2lhbGx5IGZvciBsYXJnZSBmb2xpb3MuIEl0IG1vZGlmaWVzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zIGluIG1tL21pZ3JhdGUuYyBhbmQgbW0vcm1hcC5jLiBGdXp6aW5nIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgYmF0Y2hpbmcgbG9naWMgY29ycmVjdGx5IGhhbmRsZXMgUFRFcywgcGVybWlzc2lvbnMsIGFuZCBlZGdlIGNhc2VzIGxpa2UgZGV2aWNlIHByaXZhdGUgZm9saW9zIG9yIGh1Z2V0bGIgcGFnZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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:*0,} --------- Name: series-workflowdtxc9[1] Phase: Succeeded StartedAt: 2026-07-12 13:14:01 +0000 UTC FinishedAt: 2026-07-12 13:14:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-12 13:14:01 +0000 UTC FinishedAt: 2026-07-12 13:14:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2] Phase: Succeeded StartedAt: 2026-07-12 13:14:01 +0000 UTC FinishedAt: 2026-07-12 17:53:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-12 13:14:01 +0000 UTC FinishedAt: 2026-07-12 17:53:58 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-12 13:14:01 +0000 UTC FinishedAt: 2026-07-12 13:14:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-12 13:14:01 +0000 UTC FinishedAt: 2026-07-12 13:14:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-convert-artifact-2166850930/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-12 13:14:22 +0000 UTC FinishedAt: 2026-07-12 13:54:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-12 13:14:22 +0000 UTC FinishedAt: 2026-07-12 13:54:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*c9ba89c4-74f0-42bc-8d10-ae09b96f2a54,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-convert-artifact-2166850930/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "4aa6676d-01d7-46e0-8022-31a9b8f7bad8", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-build-action-270077168/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-12 13:14:22 +0000 UTC FinishedAt: 2026-07-12 13:54:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*c9ba89c4-74f0-42bc-8d10-ae09b96f2a54,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-convert-artifact-2166850930/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "4aa6676d-01d7-46e0-8022-31a9b8f7bad8", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-build-action-270077168/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-12 13:54:40 +0000 UTC FinishedAt: 2026-07-12 13:54:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-12 13:54:40 +0000 UTC FinishedAt: 2026-07-12 13:54:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-12 13:54:40 +0000 UTC FinishedAt: 2026-07-12 13:54:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-12 13:54:40 +0000 UTC FinishedAt: 2026-07-12 13:54:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-convert-artifact-2185271949/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-12 13:54:50 +0000 UTC FinishedAt: 2026-07-12 13:57:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-12 13:54:50 +0000 UTC FinishedAt: 2026-07-12 13:56:51 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*4aa6676d-01d7-46e0-8022-31a9b8f7bad8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-build-action-270077168/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-12 13:57:01 +0000 UTC FinishedAt: 2026-07-12 13:57:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-12 13:57:01 +0000 UTC FinishedAt: 2026-07-12 13:57:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-12 13:57:01 +0000 UTC FinishedAt: 2026-07-12 14:46:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-12 13:57:01 +0000 UTC FinishedAt: 2026-07-12 14:46:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*c9ba89c4-74f0-42bc-8d10-ae09b96f2a54,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-convert-artifact-2185271949/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "a27db994-58f5-48f4-a7f5-528b63f5a7c6", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-build-action-342960233/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-12 13:57:01 +0000 UTC FinishedAt: 2026-07-12 14:46:37 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*c9ba89c4-74f0-42bc-8d10-ae09b96f2a54,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-convert-artifact-2185271949/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "a27db994-58f5-48f4-a7f5-528b63f5a7c6", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-build-action-342960233/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-12 14:46:47 +0000 UTC FinishedAt: 2026-07-12 14:46:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-12 14:46:47 +0000 UTC FinishedAt: 2026-07-12 14:46:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-12 14:46:47 +0000 UTC FinishedAt: 2026-07-12 14:48:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-12 14:46:47 +0000 UTC FinishedAt: 2026-07-12 14:48:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a27db994-58f5-48f4-a7f5-528b63f5a7c6,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-build-action-342960233/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-12 14:48:50 +0000 UTC FinishedAt: 2026-07-12 17:53:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-12 14:48:50 +0000 UTC FinishedAt: 2026-07-12 17:53:58 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*4aa6676d-01d7-46e0-8022-31a9b8f7bad8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a27db994-58f5-48f4-a7f5-528b63f5a7c6,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-build-action-270077168/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-build-action-342960233/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-12 14:48:50 +0000 UTC FinishedAt: 2026-07-12 14:49:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-12 14:48:50 +0000 UTC FinishedAt: 2026-07-12 14:48:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-convert-artifact-2731935602/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-12 14:48:50 +0000 UTC FinishedAt: 2026-07-12 14:48:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-12 14:48:50 +0000 UTC FinishedAt: 2026-07-12 14:48:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-12 14:48:50 +0000 UTC FinishedAt: 2026-07-12 14:48:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-12 14:49:00 +0000 UTC FinishedAt: 2026-07-12 17:53:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdtxc9[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["migration_pte_batch","remove_migration_pte","remove_migration_pte_hugetlb","remove_migration_ptes","make_migration_swp_pte","try_to_migrate_hugetlb_one","folio_migrate_pte_batch","try_to_migrate_one","try_to_migrate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"61cccb8363fcc282d4ae0555b8739dd227f5ad0b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MIGRATION","HUGETLB_PAGE","TRANSPARENT_HUGEPAGE"],"series_id":"f6ed0914-22d0-4ad7-be5e-be4ed8fb9961","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-12 14:49:00 +0000 UTC FinishedAt: 2026-07-12 17:53:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*4aa6676d-01d7-46e0-8022-31a9b8f7bad8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*a27db994-58f5-48f4-a7f5-528b63f5a7c6,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-build-action-270077168/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-build-action-342960233/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdtxc9/series-workflowdtxc9-convert-artifact-2731935602/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}