Name: series-workflowsgngr Phase: Succeeded StartedAt: 2026-09-03 08:52:35 +0000 UTC FinishedAt: 2026-09-03 12:58:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[0] Phase: Succeeded StartedAt: 2026-09-03 08:52:35 +0000 UTC FinishedAt: 2026-09-03 09:17:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[0].run-triage Phase: Succeeded StartedAt: 2026-09-03 08:52:35 +0000 UTC FinishedAt: 2026-09-03 09:17:58 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "21860bb220225edeb87e9c831e6bf25c620e2126", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FILE_LOCKING", "PROC_FS", "PID_NS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "21860bb220225edeb87e9c831e6bf25c620e2126", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FILE_LOCKING", "PROC_FS", "PID_NS" ], "series_id": "04cc005e-55c6-4c17-a6a7-199323764e97" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "locks_show" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZJTEVfTE9DS0lORyYjMzQ7LAogICAgJiMzNDtQUk9DX0ZTJiMzNDssCiAgICAmIzM0O1BJRF9OUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2xvY2tzX3Nob3cmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIGBsb2Nrc19zaG93KClgIGluIGBmcy9sb2Nrcy5jYCB0byBwcm9wZXJseSBmaWx0ZXIgb3BlbiBmaWxlIGRlc2NyaXB0b3IgKE9GRCkgbG9ja3MgaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoZSBjaGFuZ2VzIG9ubHkgaW50cm9kdWNlIHNjYWxhciBzdGFjayB2YXJpYWJsZXMgKGB2aXNpYmxlYCBpbml0aWFsaXplZCB0byBgZmFsc2VgLCBgcGlkYCBwb2ludGVyIGFzc2lnbmVkIGZyb20gYGZpbmRfcGlkX25zKClgKSBhbmQgcGVyZm9ybSBuYW1lc3BhY2UgdHJhbnNsYXRpb24gY2hlY2tzIHVuZGVyIFJDVS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCwgYWxsb2NhdGVkLCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gcGFkZGluZyBvciBzdHJ1Y3QgZmllbGRzIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGBsb2Nrc19zaG93KClgIGluIGZzL2xvY2tzLmMgdG8gcHJvcGVybHkgZmlsdGVyIE9wZW4gRmlsZSBEZXNjcmlwdGlvbiAoT0ZEKSBsb2NrcyB3aGVuIHJlYWRpbmcgL3Byb2MvbG9ja3MgZnJvbSB3aXRoaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoaXMgaXMgY29yZSBmaWxlc3lzdGVtIGxvZ2ljIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5ZDA5OWEzM2Q2ODM4NmYxNDViZmE4M2E0Y2U0MmNlYjI2YzlkZmY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAwOToxNjoxMiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuY1xuaW5kZXggNmU0ZmY3ZmNlYzA1My4uNGFmMTM4NTY4MmU0ZSAxMDA2NDRcbi0tLSBhL2ZzL2xvY2tzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2xvY2tzLmNcbkBAIC0zMDIyLDYgJiM0MzszMDIyLDI1IEBAIHN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXG4gXG4gXHRjdXIgPSBobGlzdF9lbnRyeSh2LCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUsIGZsY19saW5rKTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE9GRCBsb2NrcyBhcmUgcmVwb3J0ZWQgd2l0aCBwaWQgLTEsIHNvIHRoZSBmaWx0ZXIgYmVsb3cgY2Fubm90IHNlZVxuJiM0MztcdCAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuXG4mIzQzO1x0ICogUmVtb3RlIGxvY2tzIGtlZXAgYSBuZWdhdGl2ZSBmbGNfcGlkIGFuZCBzdGF5IHZpc2libGUgYXMgYmVmb3JlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICgoY3VyLVx1MDAzZWZsY19mbGFncyBcdTAwMjYgRkxfT0ZETENLKSBcdTAwMjZcdTAwMjYgY3VyLVx1MDAzZWZsY19waWQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHByb2NfcGlkbnMgIT0gXHUwMDI2aW5pdF9waWRfbnMpIHtcbiYjNDM7XHRcdHN0cnVjdCBwaWQgKnBpZDtcbiYjNDM7XHRcdGJvb2wgdmlzaWJsZSA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRcdHBpZCA9IGZpbmRfcGlkX25zKGN1ci1cdTAwM2VmbGNfcGlkLCBcdTAwMjZpbml0X3BpZF9ucyk7XG4mIzQzO1x0XHRpZiAocGlkKVxuJiM0MztcdFx0XHR2aXNpYmxlID0gcGlkX25yX25zKHBpZCwgcHJvY19waWRucykgIT0gMDtcbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdFx0aWYgKCF2aXNpYmxlKVxuJiM0MztcdFx0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuIFx0XHRyZXR1cm4gMDtcbiBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtGSUxFX0xPQ0tJTkcmIzM0OywKICAgICYjMzQ7UFJPQ19GUyYjMzQ7LAogICAgJiMzNDtQSURfTlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtsb2Nrc19zaG93JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGBsb2Nrc19zaG93KClgIGluIGZzL2xvY2tzLmMgdG8gcHJvcGVybHkgZmlsdGVyIE9wZW4gRmlsZSBEZXNjcmlwdGlvbiAoT0ZEKSBsb2NrcyB3aGVuIHJlYWRpbmcgL3Byb2MvbG9ja3MgZnJvbSB3aXRoaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoaXMgaXMgY29yZSBmaWxlc3lzdGVtIGxvZ2ljIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA5ZDA5OWEzM2Q2ODM4NmYxNDViZmE4M2E0Y2U0MmNlYjI2YzlkZmY0CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMyAwOToxNjoxMiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jCmluZGV4IDZlNGZmN2ZjZWMwNTMuLjRhZjEzODU2ODJlNGUgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tzLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvbG9ja3MuYwpAQCAtMzAyMiw2ICYjNDM7MzAyMiwyNSBAQCBzdGF0aWMgaW50IGxvY2tzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KQogCiAJY3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7CiAKJiM0MzsJLyoKJiM0MzsJICogT0ZEIGxvY2tzIGFyZSByZXBvcnRlZCB3aXRoIHBpZCAtMSwgc28gdGhlIGZpbHRlciBiZWxvdyBjYW5ub3Qgc2VlCiYjNDM7CSAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuCiYjNDM7CSAqIFJlbW90ZSBsb2NrcyBrZWVwIGEgbmVnYXRpdmUgZmxjX3BpZCBhbmQgc3RheSB2aXNpYmxlIGFzIGJlZm9yZS4KJiM0MzsJICovCiYjNDM7CWlmICgoY3VyLSZndDtmbGNfZmxhZ3MgJmFtcDsgRkxfT0ZETENLKSAmYW1wOyZhbXA7IGN1ci0mZ3Q7ZmxjX3BpZCAmZ3Q7IDAgJmFtcDsmYW1wOwomIzQzOwkgICAgcHJvY19waWRucyAhPSAmYW1wO2luaXRfcGlkX25zKSB7CiYjNDM7CQlzdHJ1Y3QgcGlkICpwaWQ7CiYjNDM7CQlib29sIHZpc2libGUgPSBmYWxzZTsKJiM0MzsKJiM0MzsJCXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJCXBpZCA9IGZpbmRfcGlkX25zKGN1ci0mZ3Q7ZmxjX3BpZCwgJmFtcDtpbml0X3BpZF9ucyk7CiYjNDM7CQlpZiAocGlkKQomIzQzOwkJCXZpc2libGUgPSBwaWRfbnJfbnMocGlkLCBwcm9jX3BpZG5zKSAhPSAwOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CQlpZiAoIXZpc2libGUpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKIAlpZiAobG9ja3NfdHJhbnNsYXRlX3BpZChjdXIsIHByb2NfcGlkbnMpID09IDApCiAJCXJldHVybiAwOwogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNTkKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOgoKKipEaXZpbmcgaW50byB0aGUgYGZzL2xvY2tzLmNgIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaCwgYW5kIG15IGZpcnN0IHN0ZXAgaXMgYWx3YXlzIHRvIHBpbnBvaW50IHRoZSBleGFjdCBsb2NhdGlvbi4gQWxyaWdodCwgdGhlIHBhdGNoIHRhcmdldHMgYGZzL2xvY2tzLmNgLiBHb29kLCB0aGF0IG5hcnJvd3MgdGhlIHNjb3BlIGNvbnNpZGVyYWJseS4gTm93LCBzaW5jZSBJIGRvbiYjMzk7dCBoYXZlIHRoZSBwYXRjaCBpdHNlbGYgcmlnaHQgaW4gZnJvbnQgb2YgbWUsIEkgbmVlZCB0byBnZXQgbXkgYmVhcmluZ3MuIEkmIzM5O20gZ29pbmcgdG8gY2VudGVyIG15IG1lbnRhbCBtb2RlbCBhcm91bmQgbGluZSAzMDIyIHdpdGhpbiB0aGF0IGZpbGUuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGltbWVkaWF0ZSBjb250ZXh0IEkgbmVlZCB0byBzdGFydCBmb3JtaW5nIGEgY2xlYXIgcGljdHVyZSBvZiB3aGF0JiMzOTtzIGJlaW5nIG1vZGlmaWVkIGFuZCB3aHkuIEkmIzM5O2xsIG5lZWQgdG8gY29uc2lkZXIgd2hhdCBjb2RlIHN1cnJvdW5kcyB0aGF0IGxpbmUuIEFyZSB3ZSBkZWFsaW5nIHdpdGggbXV0ZXhlcywgc3BpbmxvY2tzLCBvciBzb21ldGhpbmcgbW9yZSBzcGVjaWFsaXplZD8gVW5kZXJzdGFuZGluZyB0aGF0IGNvbnRleHQgd2lsbCBkaWN0YXRlIGhvdyBJIGFwcHJvYWNoIHVuZGVyc3RhbmRpbmcgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgY2hhbmdlLiBUaW1lIHRvIGdldCBteSBtZW50YWwgY29tcGlsZXIgZmlyaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDMwMDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MzAwMDpcdFxuMzAwMTpcdFx0LyogTlVMTCBub2RlIG9yIHJvb3Qgbm9kZSAqL1xuMzAwMjpcdFx0aWYgKG5vZGUgPT0gTlVMTCB8fCBub2RlLVx1MDAzZWZsY19ibG9ja2VyID09IE5VTEwpXG4zMDAzOlx0XHRcdHJldHVybiBOVUxMO1xuMzAwNDpcdFxuMzAwNTpcdFx0LyogTmV4dCBtZW1iZXIgaW4gdGhlIGxpbmtlZCBsaXN0IGNvdWxkIGJlIGl0c2VsZiAqL1xuMzAwNjpcdFx0dG1wID0gbGlzdF9uZXh0X2VudHJ5KG5vZGUsIGZsY19ibG9ja2VkX21lbWJlcik7XG4zMDA3Olx0XHRpZiAobGlzdF9lbnRyeV9pc19oZWFkKHRtcCwgXHUwMDI2bm9kZS1cdTAwM2VmbGNfYmxvY2tlci1cdTAwM2VmbGNfYmxvY2tlZF9yZXF1ZXN0cyxcbjMwMDg6XHRcdFx0XHQgICAgICAgZmxjX2Jsb2NrZWRfbWVtYmVyKVxuMzAwOTpcdFx0XHR8fCB0bXAgPT0gbm9kZSkge1xuMzAxMDpcdFx0XHRyZXR1cm4gTlVMTDtcbjMwMTE6XHRcdH1cbjMwMTI6XHRcbjMwMTM6XHRcdHJldHVybiB0bXA7XG4zMDE0Olx0fVxuMzAxNTpcdFxuMzAxNjpcdHN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXG4zMDE3Olx0e1xuMzAxODpcdFx0c3RydWN0IGxvY2tzX2l0ZXJhdG9yICppdGVyID0gZi1cdTAwM2Vwcml2YXRlO1xuMzAxOTpcdFx0c3RydWN0IGZpbGVfbG9ja19jb3JlICpjdXIsICp0bXA7XG4zMDIwOlx0XHRzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcHJvY19waWRucyA9IHByb2NfcGlkX25zKGZpbGVfaW5vZGUoZi1cdTAwM2VmaWxlKS1cdTAwM2VpX3NiKTtcbjMwMjE6XHRcdGludCBsZXZlbCA9IDA7XG4zMDIyOlx0XG4zMDIzOlx0XHRjdXIgPSBobGlzdF9lbnRyeSh2LCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUsIGZsY19saW5rKTtcbjMwMjQ6XHRcbjMwMjU6XHRcdC8qXG4zMDI2Olx0XHQgKiBPRkQgbG9ja3MgYXJlIHJlcG9ydGVkIHdpdGggcGlkIC0xLCBzbyB0aGUgZmlsdGVyIGJlbG93IGNhbm5vdCBzZWVcbjMwMjc6XHRcdCAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuXG4zMDI4Olx0XHQgKiBSZW1vdGUgbG9ja3Mga2VlcCBhIG5lZ2F0aXZlIGZsY19waWQgYW5kIHN0YXkgdmlzaWJsZSBhcyBiZWZvcmUuXG4zMDI5Olx0XHQgKi9cbjMwMzA6XHRcdGlmICgoY3VyLVx1MDAzZWZsY19mbGFncyBcdTAwMjYgRkxfT0ZETENLKSBcdTAwMjZcdTAwMjYgY3VyLVx1MDAzZWZsY19waWQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2XG4zMDMxOlx0XHQgICAgcHJvY19waWRucyAhPSBcdTAwMjZpbml0X3BpZF9ucykge1xuMzAzMjpcdFx0XHRzdHJ1Y3QgcGlkICpwaWQ7XG4zMDMzOlx0XHRcdGJvb2wgdmlzaWJsZSA9IGZhbHNlO1xuMzAzNDpcdFxuMzAzNTpcdFx0XHRyY3VfcmVhZF9sb2NrKCk7XG4zMDM2Olx0XHRcdHBpZCA9IGZpbmRfcGlkX25zKGN1ci1cdTAwM2VmbGNfcGlkLCBcdTAwMjZpbml0X3BpZF9ucyk7XG4zMDM3Olx0XHRcdGlmIChwaWQpXG4zMDM4Olx0XHRcdFx0dmlzaWJsZSA9IHBpZF9ucl9ucyhwaWQsIHByb2NfcGlkbnMpICE9IDA7XG4zMDM5Olx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuMzA0MDpcdFx0XHRpZiAoIXZpc2libGUpXG4zMDQxOlx0XHRcdFx0cmV0dXJuIDA7XG4zMDQyOlx0XHR9XG4zMDQzOlx0XG4zMDQ0Olx0XHRpZiAobG9ja3NfdHJhbnNsYXRlX3BpZChjdXIsIHByb2NfcGlkbnMpID09IDApXG4zMDQ1Olx0XHRcdHJldHVybiAwO1xuMzA0NjpcdFxuMzA0NzpcdFx0LyogVmlldyB0aGlzIGNyb3NzZWQgbGlua2VkIGxpc3QgYXMgYSBiaW5hcnkgdHJlZSwgdGhlIGZpcnN0IG1lbWJlciBvZiBmbGNfYmxvY2tlZF9yZXF1ZXN0c1xuMzA0ODpcdFx0ICogaXMgdGhlIGxlZnQgY2hpbGQgb2YgY3VycmVudCBub2RlLCB0aGUgbmV4dCBzaWxpYmluZyBpbiBmbGNfYmxvY2tlZF9tZW1iZXIgaXMgdGhlXG4zMDQ5Olx0XHQgKiByaWdodCBjaGlsZCwgd2UgY2FuIGFsc2UgZ2V0IHRoZSBwYXJlbnQgb2YgY3VycmVudCBub2RlIGZyb20gZmxjX2Jsb2NrZXIsIHNvIHRoaXNcbjMwNTA6XHRcdCAqIHF1ZXN0aW9uIGJlY29tZXMgdHJhdmVyc2FsIG9mIGEgYmluYXJ5IHRyZWVcbjMwNTE6XHRcdCAqL1xuMzA1MjpcdFx0d2hpbGUgKGN1ciAhPSBOVUxMKSB7XG4zMDUzOlx0XHRcdGlmIChsZXZlbClcbjMwNTQ6XHRcdFx0XHRsb2NrX2dldF9zdGF0dXMoZiwgY3VyLCBpdGVyLVx1MDAzZWxpX3BvcywgXCYjMzQ7LVx1MDAzZSBcJiMzNDssIGxldmVsKTtcbjMwNTU6XHRcdFx0ZWxzZVxuMzA1NjpcdFx0XHRcdGxvY2tfZ2V0X3N0YXR1cyhmLCBjdXIsIGl0ZXItXHUwMDNlbGlfcG9zLCBcJiMzNDtcJiMzNDssIGxldmVsKTtcbjMwNTc6XHRcbjMwNTg6XHRcdFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNmN1ci1cdTAwM2VmbGNfYmxvY2tlZF9yZXF1ZXN0cykpIHtcbjMwNTk6XHRcdFx0XHQvKiBUdXJuIGxlZnQgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNTA2CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqQW5hbHl6aW5nIGBsb2Nrc19zaG93YCBpbiBgZnMvbG9ja3MuY2AqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW4uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIGBsb2Nrc19zaG93YCBmdW5jdGlvbiBpcyBkb2luZywgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgYGZzL2xvY2tzLmNgIGZpbGUuIFRoaXMgc3VnZ2VzdHMgaXQmIzM5O3MgbGlrZWx5IGludm9sdmVkIGluIGRpc3BsYXlpbmcgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBmaWxlIGxvY2tzLiBHaXZlbiBteSBleHBlcnRpc2UsIEkmIzM5O20gYWxyZWFkeSBmb3JtdWxhdGluZyBzb21lIGh5cG90aGVzZXMuIEl0IGNvdWxkIGJlIGZvciBkZWJ1Z2dpbmcsIHN5c3RlbSBtb25pdG9yaW5nLCBtYXliZSBldmVuIHVzZXItbGV2ZWwgdmlzaWJpbGl0eSBpbnRvIGhlbGQgbG9ja3MuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGNsdWVzIGluIGl0cyBmdW5jdGlvbiBzaWduYXR1cmUsIHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGl0IGFjY2Vzc2VzLCBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBrZXJuZWwmIzM5O3MgbG9jayBtYW5hZ2VtZW50IHN1YnN5c3RlbXMuIEkmIzM5O2xsIGJlIGZvY3VzZWQgb24gaG93IGl0IHByZXNlbnRzIHRoaXMgbG9jayBpbmZvcm1hdGlvbi4gSSBleHBlY3QgSSYjMzk7bGwgYmUgcXVpY2tseSBwYXJzaW5nIHRoZSBmdW5jdGlvbiYjMzk7cyBjb2RlIHRvIGRldGVybWluZSB0aGUgZGF0YSBpdCBhY2Nlc3NlcywgZm9ybWF0cywgYW5kIGlmIHRoZXJlIGFyZSBhbnkgb2J2aW91cyBwZXJmb3JtYW5jZSBjb25jZXJucy4gS25vd2luZyB0aGUgY29udGV4dCB3aXRoaW4gdGhlIGtlcm5lbCBpcyBwYXJhbW91bnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bG9ja3Nfc2hvdyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2xvY2tzLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYz0yOTk3PXN0YXRpYyBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmdldF9uZXh0X2Jsb2NrZWRfbWVtYmVyKHN0cnVjdCBmaWxlX2xvY2tfY29yZSAqbm9kZSlcbi0tXG5mcy9sb2Nrcy5jLTMwMTUtXG5mcy9sb2Nrcy5jOjMwMTY6c3RhdGljIGludCBsb2Nrc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdilcbmZzL2xvY2tzLmMtMzAxNy17XG4tLVxuZnMvbG9ja3MuYz0zMTQzPXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbG9ja3Nfc2VxX29wZXJhdGlvbnMgPSB7XG4tLVxuZnMvbG9ja3MuYy0zMTQ2LVx0LnN0b3BcdD0gbG9ja3Nfc3RvcCxcbmZzL2xvY2tzLmM6MzE0NzpcdC5zaG93XHQ9IGxvY2tzX3Nob3csXG5mcy9sb2Nrcy5jLTMxNDgtfTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzOTM2CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipUcmFjaW5nIHRoZSBSZWdpc3RyYXRpb24gb2YgYGxvY2tzX3NlcV9vcGVyYXRpb25zYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSBgbG9ja3Nfc2VxX29wZXJhdGlvbnNgIGlzIGFjdHVhbGx5IGJlaW5nIHJlZ2lzdGVyZWQuIEl0JiMzOTtzIHRoYXQgY3JpdGljYWwgcG9pbnQgb2YgaW5pdGlhbGl6YXRpb24gdGhhdCBJJiMzOTttIGFmdGVyLCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdyB0aGF0IGhhcHBlbnMgKmJlZm9yZSogYW55IG9mIHRoZSBsb2NrcyBhcmUgdXNlZC4gSSBjb3VsZCBtYW51YWxseSBsb29rIHRocm91Z2ggdGhlIHNvdXJjZSB0cmVlLCBidXQgdGhhdCBmZWVscyBpbmVmZmljaWVudCBhbmQgZXJyb3ItcHJvbmUsIGVzcGVjaWFsbHkgd2l0aCBhbGwgdGhlIGFic3RyYWN0aW9uIGxheWVycy4gSSBuZWVkIHRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIHBvaW50IG9mIHJlZ2lzdHJhdGlvbi4gVGhpcyBsaWtlbHkgaW52b2x2ZXMgc29tZSBmb3JtIG9mIG1hY3JvIG9yIGZ1bmN0aW9uIHBvaW50ZXIgdGFibGUuIEkmIzM5O20gdGhpbmtpbmcgYSBzdGF0aWMgYW5hbHlzaXMgYXBwcm9hY2ggaXMgcHJvYmFibHkgdGhlIGJlc3QuIEkmIzM5O2xsIG5lZWQgdG8ga25vdyB3aGVyZSBpdCYjMzk7cyBkZWZpbmVkIGFuZCBob3cgdGhhdCYjMzk7cyBiZWluZyB1c2VkLiBJIHdpbGwgbG9vayBmb3IgaG93IHRoYXQgc3RydWN0IGlzIGJlaW5nIHJlZmVyZW5jZWQuIEl0JiMzOTtzIHZlcnkgbGlrZWx5LCBnaXZlbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24sIHRoYXQgaXQmIzM5O3MgcGFydCBvZiBzb21lIGdsb2JhbCBzdHJ1Y3R1cmUsIG9yIHBhc3NlZCB0byBzb21lIGluaXQgZnVuY3Rpb24uIFRoZSBnb2FsIGlzIHRvIHF1aWNrbHkgZmluZCB0aGUga2V5IGZ1bmN0aW9uIG9yIGRhdGEgc3RydWN0dXJlIHJlc3BvbnNpYmxlIGZvciBiaW5kaW5nIHRoYXQgYGxvY2tzX3NlcV9vcGVyYXRpb25zYCBzdHJ1Y3R1cmUuIFRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBkaXZlIGludG8gdGhlIGNhbGwgc2l0ZXMgb2YgdGhhdCBzdHJ1Y3R1cmUsIHNvIEkgY2FuIHVuZGVyc3RhbmQgdGhlIG9yZGVyIGFuZCBzZXR1cCBvZiB0aGUgb3BlcmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsb2Nrc19zZXFfb3BlcmF0aW9ucyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9sb2Nrcy5jPTMxMzY9c3RhdGljIHZvaWQgbG9ja3Nfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXG4tLVxuZnMvbG9ja3MuYy0zMTQyLVxuZnMvbG9ja3MuYzozMTQzOnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbG9ja3Nfc2VxX29wZXJhdGlvbnMgPSB7XG5mcy9sb2Nrcy5jLTMxNDQtXHQuc3RhcnRcdD0gbG9ja3Nfc3RhcnQsXG4tLVxuZnMvbG9ja3MuYz0zMTUwPXN0YXRpYyBpbnQgX19pbml0IHByb2NfbG9ja3NfaW5pdCh2b2lkKVxuZnMvbG9ja3MuYy0zMTUxLXtcbmZzL2xvY2tzLmM6MzE1MjpcdHByb2NfY3JlYXRlX3NlcV9wcml2YXRlKFwmIzM0O2xvY2tzXCYjMzQ7LCAwLCBOVUxMLCBcdTAwMjZsb2Nrc19zZXFfb3BlcmF0aW9ucyxcbmZzL2xvY2tzLmMtMzE1My1cdFx0XHRzaXplb2Yoc3RydWN0IGxvY2tzX2l0ZXJhdG9yKSwgTlVMTCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDQzMgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDE2NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYC9wcm9jL2xvY2tzYCBhbmQgT0ZEIExvY2tzIGluIGEgTmFtZXNwYWNlZCBDb250ZXh0KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgL3Byb2MvbG9ja3NgIGhlcmUsIHNwZWNpZmljYWxseSBpbiBhIHNjZW5hcmlvIHdoZXJlIHdlIGhhdmUgT0ZEIGxvY2tzIHRoYXQgc3BhbiBkaWZmZXJlbnQgUElEIG5hbWVzcGFjZXMuIFRoZSBxdWVzdGlvbiBpczogaXMgdGhpcyBhIHBvdGVudGlhbCBhdHRhY2sgc3VyZmFjZSB3b3J0aCBpbnZlc3RpZ2F0aW5nIHdpdGggZnV6emluZz8gTGV0JiMzOTtzIGJyZWFrIGl0IGRvd24gYW5kIHNlZS4KClRoZSBzdGFydGluZyBwb2ludCBpcyB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBwYXRjaCBkb2VzLCByaWdodD8gRXNzZW50aWFsbHksIGl0JiMzOTtzIGFib3V0IGhvdyB0aGUga2VybmVsIHJlcG9ydHMgT0ZEIGxvY2tzIHdpdGhpbiBgL3Byb2MvbG9ja3NgLiBXaGVuIGAvcHJvYy9sb2Nrc2AgaXMgcmVhZCwgdGhlIGBsb2Nrc19zaG93KClgIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwbGF5aW5nIHRoZSBsb2NrIGluZm9ybWF0aW9uLiBOb3csIHRoZSBjcnV4IG9mIHRoZSBpc3N1ZSB3aXRoIE9GRCBsb2NrcyBpcyB0aGF0IHRoZXkmIzM5O3JlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yLCBub3QgdGhlIFBJRCBkaXJlY3RseS4gU28sIHdoZW4gdGhlIG91dHB1dCBuZWVkcyBhIFBJRCwgaXQgcmVwb3J0cyAtMSwgYnV0IGluIHRoZSBrZXJuZWwmIzM5O3MgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24sIGBmbGNfcGlkYCBob2xkcyB0aGUgb3duaW5nIHRocmVhZCBncm91cCBJRCAodGdpZCkuCgpUaGUgY29kZSB1c2VkIGBsb2Nrc190cmFuc2xhdGVfcGlkYCB0byByZXNvbHZlIHRoZSBQSUQsIHNvIG15IG5leHQgc3RlcCBpcyB0byBsb29rIGF0IHdoYXQgdGhhdCBmdW5jdGlvbiBkb2VzLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSByZWFsIGRldGFpbCB3aWxsIGxpa2VseSBiZS4gVGhhdCBpcyB3aGVyZSBJIGNhbiBhbmFseXplIHRoZSBiZWhhdmlvdXIgYW5kIGRlY2lkZSBpZiB0aGlzIGlzIGEgZ29vZCBhdHRhY2sgc3VyZmFjZSB0byBleHBsb2l0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsb2Nrc190cmFuc2xhdGVfcGlkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9sb2Nrcy5jPTIzNjU9RVhQT1JUX1NZTUJPTF9HUEwodmZzX3Rlc3RfbG9jayk7XG4tLVxuZnMvbG9ja3MuYy0yMzY3LS8qKlxuZnMvbG9ja3MuYzoyMzY4OiAqIGxvY2tzX3RyYW5zbGF0ZV9waWQgLSB0cmFuc2xhdGUgYSBmaWxlX2xvY2smIzM5O3MgZmxfcGlkIG51bWJlciBpbnRvIGEgbmFtZXNwYWNlXG5mcy9sb2Nrcy5jLTIzNjktICogQGZsOiBUaGUgZmlsZV9sb2NrIHdobyYjMzk7cyBmbF9waWQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcbi0tXG5mcy9sb2Nrcy5jLTIzNzMtICovXG5mcy9sb2Nrcy5jOjIzNzQ6c3RhdGljIHBpZF90IGxvY2tzX3RyYW5zbGF0ZV9waWQoc3RydWN0IGZpbGVfbG9ja19jb3JlICpmbCwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKVxuZnMvbG9ja3MuYy0yMzc1LXtcbi0tXG5mcy9sb2Nrcy5jPTI0MDE9c3RhdGljIGludCBwb3NpeF9sb2NrX3RvX2Zsb2NrKHN0cnVjdCBmbG9jayAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxuZnMvbG9ja3MuYy0yNDAyLXtcbmZzL2xvY2tzLmM6MjQwMzpcdGZsb2NrLVx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcdTAwMjZmbC1cdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xuZnMvbG9ja3MuYy0yNDA0LSNpZiBCSVRTX1BFUl9MT05HID09IDMyXG4tLVxuZnMvbG9ja3MuYz0yNDIzPXN0YXRpYyB2b2lkIHBvc2l4X2xvY2tfdG9fZmxvY2s2NChzdHJ1Y3QgZmxvY2s2NCAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxuZnMvbG9ja3MuYy0yNDI0LXtcbmZzL2xvY2tzLmM6MjQyNTpcdGZsb2NrLVx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcdTAwMjZmbC1cdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xuZnMvbG9ja3MuYy0yNDI2LVx0ZmxvY2stXHUwMDNlbF9zdGFydCA9IGZsLVx1MDAzZWZsX3N0YXJ0O1xuLS1cbmZzL2xvY2tzLmM9MjkyMT1zdGF0aWMgdm9pZCBsb2NrX2dldF9zdGF0dXMoc3RydWN0IHNlcV9maWxlICpmLCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsYyxcbi0tXG5mcy9sb2Nrcy5jLTI5MjktXG5mcy9sb2Nrcy5jOjI5MzA6XHRwaWQgPSBsb2Nrc190cmFuc2xhdGVfcGlkKGZsYywgcHJvY19waWRucyk7XG5mcy9sb2Nrcy5jLTI5MzEtXG4tLVxuZnMvbG9ja3MuYz0zMDE2PXN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXG4tLVxuZnMvbG9ja3MuYy0zMDQzLVxuZnMvbG9ja3MuYzozMDQ0Olx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuZnMvbG9ja3MuYy0zMDQ1LVx0XHRyZXR1cm4gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTQ5MAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIHRoZSBgbG9ja3NfdHJhbnNsYXRlX3BpZGAgSW1wbGVtZW50YXRpb24qKgoKT2theSwgdGltZSB0byBkaXZlIGludG8gYGxvY2tzX3RyYW5zbGF0ZV9waWRgLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoaXMgc3BlY2lmaWMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYW5kIHdoZXJlIGl0IHNpdHMgaW4gdGhlIGxhcmdlciBsb2NraW5nIHNjaGVtZS4gSXQmIzM5O3MgY3J1Y2lhbCwgb2J2aW91c2x5LCBiZWNhdXNlIGlmIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggUElEIHRyYW5zbGF0aW9uIHdpdGhpbiB0aGUgbG9jayBoaWVyYXJjaHksIHRoZXJlIGNvdWxkIGJlIHN1YnRsZSByYWNlIGNvbmRpdGlvbnMgb3IgdW5leHBlY3RlZCBiZWhhdmlvcnMgSSBuZWVkIHRvIGJlIGF3YXJlIG9mLiBJJiMzOTtsbCBuZWVkIHRvIGNvbnNpZGVyIHRoaW5ncyBsaWtlOiB3aGF0IGFyZSB0aGUgY29uY3VycmVuY3kgcHJpbWl0aXZlcyBiZWluZyB1c2VkPyBBcmUgdGhlcmUgcG90ZW50aWFsIGRlYWRsb2NrcywgYW5kIGlmIHNvLCB1bmRlciB3aGF0IGNvbmRpdGlvbnM/IEhvdyBkb2VzIHRoaXMgZnVuY3Rpb24gaGFuZGxlIGRpZmZlcmVudCBQSUQgbmFtZXNwYWNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcz8gSXMgdGhlcmUgYW55dGhpbmcgdW51c3VhbCBhYm91dCB0aGUgYWxnb3JpdGhtIGl0IHVzZXMsIG9yIGlzIGl0IGEgZmFpcmx5IHN0YW5kYXJkIHRyYW5zbGF0aW9uIGxvZ2ljPyBJJiMzOTtsbCBwcm9iYWJseSBzdGFydCBieSBxdWlja2x5IGdsYW5jaW5nIGF0IHRoZSBzb3VyY2UgY29kZSB0byBnZXQgYSBoaWdoLWxldmVsIHZpZXcsIHRoZW4gem9vbSBpbiBvbiBhbnkgYXJlYXMgdGhhdCBzZWVtIGNvbXBsZXggb3IgcG90ZW50aWFsbHkgcHJvYmxlbWF0aWMuIFNwZWNpZmljYWxseSwgSSYjMzk7bGwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgbG9jayBhY3F1aXNpdGlvbi9yZWxlYXNlIG9yZGVyIGFuZCB0aGUgYXRvbWljIG9wZXJhdGlvbnMgaW52b2x2ZWQuIEkgbWlnaHQgYWxzbyB3YW50IHRvIGNvbnN1bHQgdGhlIHJlbGV2YW50IGRlc2lnbiBkb2N1bWVudHMgb3IgY29tbWVudHMgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkga25vd24gY2F2ZWF0cyBvciBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucyB0byBrZWVwIGluIG1pbmQuIExldCYjMzk7cyBzZWUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9sb2Nrcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjM3MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMzcwOlx0ICogQG5zOiBUaGUgbmFtZXNwYWNlIGludG8gd2hpY2ggdGhlIHBpZCBzaG91bGQgYmUgdHJhbnNsYXRlZFxuMjM3MTpcdCAqXG4yMzcyOlx0ICogVXNlZCB0byB0cmFuc2xhdGUgYSBmbF9waWQgaW50byBhIG5hbWVzcGFjZSB2aXJ0dWFsIHBpZCBudW1iZXJcbjIzNzM6XHQgKi9cbjIzNzQ6XHRzdGF0aWMgcGlkX3QgbG9ja3NfdHJhbnNsYXRlX3BpZChzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpXG4yMzc1Olx0e1xuMjM3NjpcdFx0cGlkX3Qgdm5yO1xuMjM3NzpcdFx0c3RydWN0IHBpZCAqcGlkO1xuMjM3ODpcdFxuMjM3OTpcdFx0aWYgKGZsLVx1MDAzZWZsY19mbGFncyBcdTAwMjYgRkxfT0ZETENLKVxuMjM4MDpcdFx0XHRyZXR1cm4gLTE7XG4yMzgxOlx0XG4yMzgyOlx0XHQvKiBSZW1vdGUgbG9ja3MgcmVwb3J0IGEgbmVnYXRpdmUgcGlkIHZhbHVlICovXG4yMzgzOlx0XHRpZiAoZmwtXHUwMDNlZmxjX3BpZCBcdTAwM2M9IDApXG4yMzg0Olx0XHRcdHJldHVybiBmbC1cdTAwM2VmbGNfcGlkO1xuMjM4NTpcdFxuMjM4NjpcdFx0LypcbjIzODc6XHRcdCAqIElmIHRoZSBmbG9jayBvd25lciBwcm9jZXNzIGlzIGRlYWQgYW5kIGl0cyBwaWQgaGFzIGJlZW4gYWxyZWFkeVxuMjM4ODpcdFx0ICogZnJlZWQsIHRoZSB0cmFuc2xhdGlvbiBiZWxvdyB3b24mIzM5O3Qgd29yaywgYnV0IHdlIHN0aWxsIHdhbnQgdG8gc2hvd1xuMjM4OTpcdFx0ICogZmxvY2sgb3duZXIgcGlkIG51bWJlciBpbiBpbml0IHBpZG5zLlxuMjM5MDpcdFx0ICovXG4yMzkxOlx0XHRpZiAobnMgPT0gXHUwMDI2aW5pdF9waWRfbnMpXG4yMzkyOlx0XHRcdHJldHVybiAocGlkX3QpIGZsLVx1MDAzZWZsY19waWQ7XG4yMzkzOlx0XG4yMzk0Olx0XHRyY3VfcmVhZF9sb2NrKCk7XG4yMzk1Olx0XHRwaWQgPSBmaW5kX3BpZF9ucyhmbC1cdTAwM2VmbGNfcGlkLCBcdTAwMjZpbml0X3BpZF9ucyk7XG4yMzk2Olx0XHR2bnIgPSBwaWRfbnJfbnMocGlkLCBucyk7XG4yMzk3Olx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIzOTg6XHRcdHJldHVybiB2bnI7XG4yMzk5Olx0fVxuMjQwMDpcdFxuMjQwMTpcdHN0YXRpYyBpbnQgcG9zaXhfbG9ja190b19mbG9jayhzdHJ1Y3QgZmxvY2sgKmZsb2NrLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbClcbjI0MDI6XHR7XG4yNDAzOlx0XHRmbG9jay1cdTAwM2VsX3BpZCA9IGxvY2tzX3RyYW5zbGF0ZV9waWQoXHUwMDI2ZmwtXHUwMDNlYywgdGFza19hY3RpdmVfcGlkX25zKGN1cnJlbnQpKTtcbjI0MDQ6XHQjaWYgQklUU19QRVJfTE9ORyA9PSAzMlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MzUwCgkJCQkJCQlvdXRwdXQ6IDI1CgkJCQkJCQl0aG91Z2h0czogNjAxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBgL3Byb2MvbG9ja3NgIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5vdGljZWQgdGhpcyBwYXRjaCBkZWFscyB3aXRoIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBhbmQgaG93IGl0IGhhbmRsZXMgYEZMX09GRExDS2AgbG9ja3MuIEkgc2VlIHRoYXQsIHByZXZpb3VzbHksIGBsb2Nrc190cmFuc2xhdGVfcGlkYCByZXR1cm5lZCAtMSBmb3IgT0ZETENLLCB3aGljaCB3YXMgcHJvYmxlbWF0aWMgYmVjYXVzZSBpdCBieXBhc3NlZCB0aGUgZXhpc3RpbmcgY2hlY2sgaW4gYGxvY2tzX3Nob3dgLiBUaGlzIG1lYW50IE9GRExDSyBsb2NrcyB3ZXJlIGFsd2F5cyBzaG93aW5nIHVwIGluIGAvcHJvYy9sb2Nrc2AsIGV2ZW4gaWYgdGhlIG93bmluZyBQSUQgd2FzbiYjMzk7dCB2aXNpYmxlIGluIHRoZSBjdXJyZW50IFBJRCBuYW1lc3BhY2XigJRlZmZlY3RpdmVseSBkaXNwbGF5aW5nIGEgbG9jayBiZWxvbmdpbmcgdG8gUElEIDAuIFRoYXQmIzM5O3MgYSBkZWZpbml0ZSBidWcuCgpUaGUgcGF0Y2ggaXRzZWxmIGFkZHJlc3NlcyB0aGlzLiBJdCBhZGRzIGEgY3J1Y2lhbCBjaGVjayB3aXRoaW4gYGxvY2tzX3Nob3dgIHRvIGZpbHRlciBPRkQgbG9ja3MuIE5vdywgaWYgdGhlIGxvY2sgaXMgYW4gT0ZEIGxvY2sgKGBGTF9PRkRMQ0tgKSAqYW5kKiBoYXMgYSBQSUQgZ3JlYXRlciB0aGFuIHplcm8sICphbmQqIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBpc24mIzM5O3QgdGhlIGluaXRpYWwgUElEIG5hbWVzcGFjZSwgaXQgc3BlY2lmaWNhbGx5IHZlcmlmaWVzIGlmIHRoZSBQSUQgaXMgYWN0dWFsbHkgdmlzaWJsZSB3aXRoaW4gdGhlIGN1cnJlbnQgYHByb2NfcGlkbnNgLiBJZiBpdCYjMzk7cyAqbm90KiB2aXNpYmxlLCBpdCByZXR1cm5zIDAsIGVzc2VudGlhbGx5IGhpZGluZyB0aGF0IGxvY2sgZW50cnkgZnJvbSBgL3Byb2MvbG9ja3NgLiBUaGF0JiMzOTtzIGEgY2xlYW4sIHRhcmdldGVkIGZpeC4KCk5vdywgdGhlIHJlYWwgcXVlc3Rpb24gaXM6IElzIHRoaXMgcGF0Y2ggZnV6ei13b3J0aHk/IExldCYjMzk7cyBjaGVjayB0aGUgY3JpdGVyaWEuIEl0IHNwZWNpZmljYWxseSBzYXlzIHRvICpub3QqIGZ1enogaWYgdGhlIGNoYW5nZXMgYXJlIGRvY3VtZW50YXRpb24sIGNvbW1lbnRzLCBkZWNvcmF0aXZlIGxvZ2dpbmcsIGNvbnN0YW50IGNoYW5nZXMgdGhhdCBkb24mIzM5O3QgYWx0ZXIgZXhlY3V0aW9uLCB1bnJlYWNoYWJsZSBjb2RlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgdmVuZG9yLXNwZWNpZmljIGhhcmR3YXJlIGRyaXZlcnMgdGhhdCBhcmUgdW5hdmFpbGFibGUgaW4gdmlydHVhbGl6YXRpb24sIGFuZCB0ZWFyZG93biBjYWxsYmFja3MuCgpUaGlzIHBhdGNoLCBob3dldmVyLCAqKmFic29sdXRlbHkqKiBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMuIEl0IHRvdWNoZXMgdGhlIGAvcHJvYy9sb2Nrc2AgZmlsZSwgd2hpY2ggaXMgYSBrZXkgY29tcG9uZW50IGZvciB0cmFjaW5nIGFuZCBtb25pdG9yaW5nIGZpbGUgbG9ja3MuIFJlYWRpbmcgb3Igb3BlbmluZyBgL3Byb2MvbG9ja3NgIHVzaW5nIGByZWFkKClgLCBgc2VxX3JlYWRgLCBvciBgZmNudGwoZmQsIEZfT0ZEX1NFVExLLCAuLi4pYCBpcyBjb21wbGV0ZWx5IGFjaGlldmFibGUgZnJvbSB1c2Vyc3BhY2UgaW4gKmFueSogdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQuIFRoaXMgaXMgYWNjZXNzaWJsZSBhbmQgcmVwcmVzZW50cyBjb3JlIGtlcm5lbCBsb2dpYyB0aGF0IGlzIGhpZ2hseSByZWxldmFudCB0byB0eXBpY2FsIHVzYWdlLCBldmVuIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIFFFTVUgb3IgR0NFLgoKVGhlcmVmb3JlLCAqeWVzKiwgSSB0aGluayB0aGlzIGlzIGEgY2FuZGlkYXRlIGZvciBmdXp6aW5nLiBJIG5lZWQgdG8gbm93IGRldGVybWluZSB0aGUgYmVzdCBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIHRvIG1heGltaXplIGNvdmVyYWdlIGFuZCBlZmZlY3RpdmVuZXNzLiBJJiMzOTtsbCBuZWVkIHRvIGRpZyBpbnRvIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbnMgYW5kIGhvdyBgZnMvbG9ja3MuY2AgYW5kIGAvcHJvYy9sb2Nrc2AgYXJlIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgYW4gZWZmZWN0aXZlIGZ1enppbmcgY2FtcGFpZ24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2xvY2tzXFwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9NYWtlZmlsZT0zMz1vYmotJChDT05GSUdfRlNfVkVSSVRZKVx0XHQmIzQzOz0gdmVyaXR5L1xuZnMvTWFrZWZpbGU6MzQ6b2JqLSQoQ09ORklHX0ZJTEVfTE9DS0lORykgICAgICAmIzQzOz0gbG9ja3Mub1xuZnMvTWFrZWZpbGUtMzUtb2JqLSQoQ09ORklHX0JJTkZNVF9NSVNDKVx0JiM0Mzs9IGJpbmZtdF9taXNjLm9cbi0tXG5mcy9jZXBoL01ha2VmaWxlPTY9b2JqLSQoQ09ORklHX0NFUEhfRlMpICYjNDM7PSBjZXBoLm9cbmZzL2NlcGgvTWFrZWZpbGUtNy1cbmZzL2NlcGgvTWFrZWZpbGU6ODpjZXBoLXkgOj0gc3VwZXIubyBpbm9kZS5vIGRpci5vIGZpbGUubyBsb2Nrcy5vIGFkZHIubyBpb2N0bC5vIFxcXG5mcy9jZXBoL01ha2VmaWxlLTktXHRleHBvcnQubyBjYXBzLm8gc25hcC5vIHhhdHRyLm8gcXVvdGEubyBpby5vIFxcXG4tLVxuZnMvb2NmczIvTWFrZWZpbGU9MTE9b2NmczItb2JqcyA6PSBcXFxuLS1cbmZzL29jZnMyL01ha2VmaWxlLTI2LVx0bG9jYWxhbGxvYy5vIFx0XHRcXFxuZnMvb2NmczIvTWFrZWZpbGU6Mjc6XHRsb2Nrcy5vXHRcdFx0XFxcbmZzL29jZnMyL01ha2VmaWxlLTI4LVx0bW1hcC5vIFx0XHRcdFxcXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc3NTkKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipLY29uZmlnIERpdmU6IGBDT05GSUdfRklMRV9MT0NLSU5HYCoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgdHJhY2sgZG93biBgQ09ORklHX0ZJTEVfTE9DS0lOR2AuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgZ3JlcHBpbmcgdGhlIEtjb25maWcgZmlsZXMuIFRoaXMgb25lJiMzOTtzIGltcG9ydGFudDsgZmlsZSBsb2NraW5nIGNhbiBoYXZlIHNpZ25pZmljYW50IGltcGxpY2F0aW9ucyBmb3IgZmlsZXN5c3RlbSBjb25jdXJyZW5jeSBhbmQgZGF0YSBpbnRlZ3JpdHksIGRlcGVuZGluZyBvbiBob3cgaXQmIzM5O3MgaW1wbGVtZW50ZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBzY29wZSBhbmQgZGVwZW5kZW5jaWVzLiBBcmUgd2UgdGFsa2luZyBhYm91dCBhZHZpc29yeSBsb2NrcywgbWFuZGF0b3J5IGxvY2tzLCBvciBzb21ldGhpbmcgbW9yZSBudWFuY2VkPyBXaGF0IGZpbGVzeXN0ZW1zIGFyZSBhZmZlY3RlZD8gSG93IGlzIHRoaXMgZmVhdHVyZSAqYWN0dWFsbHkqIGJlaW5nIHVzZWQsIGFuZCB3aGF0IGFyZSB0aGUgYXJndW1lbnRzIGZvciBhbmQgYWdhaW5zdCBpdHMgcHJlc2VuY2Ugb3IgYWJzZW5jZSBpbiBkaWZmZXJlbnQgY29udGV4dHM/IEl0JiMzOTtzIGdvaW5nIHRvIGJlIGludGVyZXN0aW5nIHRvIHNlZSBob3cgdGhpcyBpcyBjb25maWd1cmVkIGFuZCB3aGVyZSBpdCBzaXRzIGluIHRoZSBicm9hZGVyIGZlYXR1cmUgc2V0LiBUaW1lIHRvIGRpZyBpbiBhbmQgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRklMRV9MT0NLSU5HJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL0tjb25maWc9MTA4PWNvbmZpZyBFWFBPUlRGU19CTE9DS19PUFNcbi0tXG5mcy9LY29uZmlnLTExMy1cbmZzL0tjb25maWc6MTE0OmNvbmZpZyBGSUxFX0xPQ0tJTkdcbmZzL0tjb25maWctMTE1LVx0Ym9vbCBcJiMzNDtFbmFibGUgUE9TSVggZmlsZSBsb2NraW5nIEFQSVwmIzM0OyBpZiBFWFBFUlRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODA2MwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBLY29uZmlnIGZvciBGaWxlIFN5c3RlbSBEZXBlbmRlbmNpZXMqKgoKT2theSwgc28gSSYjMzk7bSB0cnlpbmcgdG8gZmlndXJlIG91dCBzb21lIHNwZWNpZmljcyB3aXRoaW4gdGhlIGZpbGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBjaGVjayBgZnMvS2NvbmZpZ2AuIFRoYXQmIzM5O3MgdXN1YWxseSB0aGUgZ28tdG8gc3BvdCBmb3IgZmlsZSBzeXN0ZW0tcmVsYXRlZCBvcHRpb25zIGFuZCBkZXBlbmRlbmNpZXMuIFNwZWNpZmljYWxseSwgSSYjMzk7bGwgc3RhcnQgYXJvdW5kIGxpbmUgMTE0LiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIGVpdGhlciBkaXJlY3QgZGVwZW5kZW5jaWVzIHRoYXQgbWlnaHQgc2hlZCBsaWdodCBvbiB0aGlzIGlzc3VlLCBvciBwZXJoYXBzIHNvbWUgaW5kaXJlY3QgZGVwZW5kZW5jaWVzIHRocm91Z2ggb3RoZXIgY29uZmlnIHN5bWJvbHMuIEl0JiMzOTtzIGEgc29saWQgZmlyc3Qgc3RlcCB0byBnZXQgYSBsYXkgb2YgdGhlIGxhbmQgYW5kIHVuZGVyc3RhbmQgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBkaWZmZXJlbnQgZmlsZSBzeXN0ZW0gZmVhdHVyZXMuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGp1bXBpbmctb2ZmIHBvaW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDExMDpcdFx0aGVscFxuIDExMTpcdFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBleHBvcnQgb3BlcmF0aW9ucyBmb3IgYSBmaWxlc3lzdGVtIHRvIHN1cHBvcnRcbiAxMTI6XHRcdCAgZXh0ZXJuYWwgYmxvY2sgSU8uXG4gMTEzOlx0XG4gMTE0Olx0Y29uZmlnIEZJTEVfTE9DS0lOR1xuIDExNTpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgUE9TSVggZmlsZSBsb2NraW5nIEFQSVwmIzM0OyBpZiBFWFBFUlRcbiAxMTY6XHRcdGRlZmF1bHQgeVxuIDExNzpcdFx0aGVscFxuIDExODpcdFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHN0YW5kYXJkIGZpbGUgbG9ja2luZyBzdXBwb3J0LCByZXF1aXJlZFxuIDExOTpcdFx0ICBmb3IgZmlsZXN5c3RlbXMgbGlrZSBORlMgYW5kIGZvciB0aGUgZmxvY2soKSBzeXN0ZW1cbiAxMjA6XHRcdCAgY2FsbC4gRGlzYWJsaW5nIHRoaXMgb3B0aW9uIHNhdmVzIGFib3V0IDExay5cbiAxMjE6XHRcbiAxMjI6XHRzb3VyY2UgXCYjMzQ7ZnMvY3J5cHRvL0tjb25maWdcJiMzNDtcbiAxMjM6XHRcbiAxMjQ6XHRzb3VyY2UgXCYjMzQ7ZnMvdmVyaXR5L0tjb25maWdcJiMzNDtcbiAxMjU6XHRcbiAxMjY6XHRzb3VyY2UgXCYjMzQ7ZnMvbm90aWZ5L0tjb25maWdcJiMzNDtcbiAxMjc6XHRcbiAxMjg6XHRzb3VyY2UgXCYjMzQ7ZnMvcXVvdGEvS2NvbmZpZ1wmIzM0O1xuIDEyOTpcdFxuIDEzMDpcdHNvdXJjZSBcJiMzNDtmcy9hdXRvZnMvS2NvbmZpZ1wmIzM0O1xuIDEzMTpcdHNvdXJjZSBcJiMzNDtmcy9mdXNlL0tjb25maWdcJiMzNDtcbiAxMzI6XHRzb3VyY2UgXCYjMzQ7ZnMvb3ZlcmxheWZzL0tjb25maWdcJiMzNDtcbiAxMzM6XHRcbiAxMzQ6XHRtZW51IFwmIzM0O0NhY2hlc1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NjA3CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogNDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBnb2luZyBvbiB3aXRoIGAvcHJvYy9sb2Nrc2AuIE15IGZpcnN0IHRob3VnaHQgaXMsIGlzIHRoaXMgZGVwZW5kZW50IG9uIGFueSBzcGVjaWZpYyBrZXJuZWwgY29uZmlndXJhdGlvbnMsIGxpa2UgYENPTkZJR19QUk9DX0ZTYCBvciBgQ09ORklHX1BJRF9OU2A/IEkgbmVlZCB0byBiZSBzdXJlIHRoZSBzeXN0ZW0gaGFzIHdoYXQgaXQgbmVlZHMgYmVmb3JlIEkgc3RhcnQgZGl2aW5nIGRlZXBlci4KCk5vdywgdG8gdW5kZXJzdGFuZCBpdHMgaW5pdGlhbGl6YXRpb24sIEkgc2hvdWxkIGNoZWNrIHRoZSBgcHJvY19sb2Nrc19pbml0YCBmdW5jdGlvbi4gVGhhdCB3aWxsIGJlIGluIGBmcy9sb2Nrcy5jYC4gVGhhdCBmdW5jdGlvbiBzaG91bGQgbGF5IG91dCB0aGUgZm91bmRhdGlvbnMgSSBhbSBsb29raW5nIGZvci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cHJvY19sb2Nrc19pbml0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2xvY2tzLmM9MzE0Mz1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxvY2tzX3NlcV9vcGVyYXRpb25zID0ge1xuLS1cbmZzL2xvY2tzLmMtMzE0OS1cbmZzL2xvY2tzLmM6MzE1MDpzdGF0aWMgaW50IF9faW5pdCBwcm9jX2xvY2tzX2luaXQodm9pZClcbmZzL2xvY2tzLmMtMzE1MS17XG4tLVxuZnMvbG9ja3MuYy0zMTU1LX1cbmZzL2xvY2tzLmM6MzE1Njpmc19pbml0Y2FsbChwcm9jX2xvY2tzX2luaXQpO1xuZnMvbG9ja3MuYy0zMTU3LSNlbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4OTI3CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHByb3ZpZGVkIHNuaXBwZXQsIGFzIGlmIGl0IHdlcmUgbXkgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgZnMvbG9ja3MuY2AqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBmcy9sb2Nrcy5jYC4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIGhvdyBgcHJvY19sb2Nrc19pbml0YCBpcyBiZWluZyBoYW5kbGVkLiBUaGUgYCNpZmRlZmAgZGlyZWN0aXZlIGFyb3VuZCB0aGF0IGZ1bmN0aW9uIGlzIHdoYXQgSSYjMzk7bSBmb2N1c2luZyBvbi4gSXQmIzM5O3MgYSBrZXkgZGV0YWlsIHRvIHVuZGVyc3RhbmQgdGhlIGZsZXhpYmlsaXR5IG9mIHRoZSBsb2NraW5nIGltcGxlbWVudGF0aW9uLiBJIG5lZWQgdG8gZmlndXJlIG91dCB1bmRlciB3aGF0IGNvbmRpdGlvbnMgdGhpcyBpbml0aWFsaXphdGlvbiBpcyBpbmNsdWRlZCBvciBleGNsdWRlZC4gSSYjMzk7bSBhbHJlYWR5IHRoaW5raW5nIGFib3V0IHdoYXQgcHJlcHJvY2Vzc29yIG1hY3JvcyBhcmUgaW52b2x2ZWQgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uIGFuZCBidWlsZCBzZXR0aW5ncyBvZiB0aGlzIHBhcnRpY3VsYXIga2VybmVsIHZlcnNpb24uIEVzc2VudGlhbGx5LCBJJiMzOTttIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQtZGVwZW5kZW50IGJlaGF2aW9yIG9mIGBwcm9jX2xvY2tzX2luaXRgIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0gbG9ja2luZyBtb2R1bGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI5MDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjkwMDpcdFxuMjkwMTpcdFx0Y3R4ID0gbG9ja3NfaW5vZGVfY29udGV4dChpbm9kZSk7XG4yOTAyOlx0XHRpZiAoIWN0eClcbjI5MDM6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMjkwNDpcdFxuMjkwNTpcdFx0c3Bpbl9sb2NrKFx1MDAyNmN0eC1cdTAwM2VmbGNfbG9jayk7XG4yOTA2Olx0XHRyZXQgPSAhbGlzdF9lbXB0eShcdTAwMjZjdHgtXHUwMDNlZmxjX3Bvc2l4KSB8fCAhbGlzdF9lbXB0eShcdTAwMjZjdHgtXHUwMDNlZmxjX2Zsb2NrKTtcbjI5MDc6XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmN0eC1cdTAwM2VmbGNfbG9jayk7XG4yOTA4Olx0XHRyZXR1cm4gcmV0O1xuMjkwOTpcdH1cbjI5MTA6XHRFWFBPUlRfU1lNQk9MX0dQTCh2ZnNfaW5vZGVfaGFzX2xvY2tzKTtcbjI5MTE6XHRcbjI5MTI6XHQjaWZkZWYgQ09ORklHX1BST0NfRlNcbjI5MTM6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9wcm9jX2ZzLmhcdTAwM2VcbjI5MTQ6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9zZXFfZmlsZS5oXHUwMDNlXG4yOTE1Olx0XG4yOTE2Olx0c3RydWN0IGxvY2tzX2l0ZXJhdG9yIHtcbjI5MTc6XHRcdGludFx0bGlfY3B1O1xuMjkxODpcdFx0bG9mZl90XHRsaV9wb3M7XG4yOTE5Olx0fTtcbjI5MjA6XHRcbjI5MjE6XHRzdGF0aWMgdm9pZCBsb2NrX2dldF9zdGF0dXMoc3RydWN0IHNlcV9maWxlICpmLCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsYyxcbjI5MjI6XHRcdFx0XHQgICAgbG9mZl90IGlkLCBjaGFyICpwZngsIGludCByZXBlYXQpXG4yOTIzOlx0e1xuMjkyNDpcdFx0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XG4yOTI1Olx0XHR1bnNpZ25lZCBpbnQgcGlkO1xuMjkyNjpcdFx0c3RydWN0IHBpZF9uYW1lc3BhY2UgKnByb2NfcGlkbnMgPSBwcm9jX3BpZF9ucyhmaWxlX2lub2RlKGYtXHUwMDNlZmlsZSktXHUwMDNlaV9zYik7XG4yOTI3Olx0XHRpbnQgdHlwZSA9IGZsYy1cdTAwM2VmbGNfdHlwZTtcbjI5Mjg6XHRcdHN0cnVjdCBmaWxlX2xvY2sgKmZsID0gZmlsZV9sb2NrKGZsYyk7XG4yOTI5Olx0XG4yOTMwOlx0XHRwaWQgPSBsb2Nrc190cmFuc2xhdGVfcGlkKGZsYywgcHJvY19waWRucyk7XG4yOTMxOlx0XG4yOTMyOlx0XHQvKlxuMjkzMzpcdFx0ICogSWYgbG9jayBvd25lciBpcyBkZWFkIChhbmQgcGlkIGlzIGZyZWVkKSBvciBub3QgdmlzaWJsZSBpbiBjdXJyZW50XG4yOTM0Olx0XHQgKiBwaWRucywgemVybyBpcyBzaG93biBhcyBhIHBpZCB2YWx1ZS4gQ2hlY2sgbG9jayBpbmZvIGZyb21cbjI5MzU6XHRcdCAqIGluaXRfcGlkX25zIHRvIGdldCBzYXZlZCBsb2NrIHBpZCB2YWx1ZS5cbjI5MzY6XHRcdCAqL1xuMjkzNzpcdFx0aWYgKGZsYy1cdTAwM2VmbGNfZmlsZSAhPSBOVUxMKVxuMjkzODpcdFx0XHRpbm9kZSA9IGZpbGVfaW5vZGUoZmxjLVx1MDAzZWZsY19maWxlKTtcbjI5Mzk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTc4MQoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDkxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktlcm5lbCBDb25maWd1cmF0aW9uIEV4cGxvcmF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSBhbmQgaW1tZWRpYXRlbHkgSSBzZWUgYSBjcnVjaWFsIHBvaW50IG9uIGxpbmUgMjkxMjogaXQmIzM5O3MgYCNpZmRlZiBDT05GSUdfUFJPQ19GU2AhIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LCBjb25maXJtaW5nIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIHByb2MgZmlsZXN5c3RlbS4gVGhlbiwganVzdCBhIGJpdCBmdXJ0aGVyIGRvd24sIG9uIGxpbmUgMzAzMCwgYSBjaGVjayBmb3IgYHByb2NfcGlkbnMgIT0gJmFtcDtpbml0X3BpZF9uc2AgcG9wcyB1cC4gVGhhdCYjMzk7cyBhIGRpcmVjdCBjb25uZWN0aW9uIHRvIFBJRCBuYW1lc3BhY2VzIGFuZCBJIGFtIGNlcnRhaW4gdGhpcyBtdXN0IHJlbGF0ZSB0byBgQ09ORklHX1BJRF9OU2AuIFNvLCBub3cgSSBuZWVkIHRvIGNvbmZpcm0gdGhvc2UgdGhyZWUgY29uZmlndXJhdGlvbnM6IGBDT05GSUdfUFJPQ19GU2AsIGBDT05GSUdfUElEX05TYCwgYW5kIGFsc28sIGp1c3QgdG8gYmUgdGhvcm91Z2gsIGxldCYjMzk7cyBzZWUgd2hlcmUgYENPTkZJR19GSUxFX0xPQ0tJTkdgIGNvbWVzIGluLiBJdCYjMzk7cyB0aW1lIHRvIGNvbmZpcm0gdGhlc2UgcmVsYXRpb25zaGlwcywgYW5kIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIGV4YWN0bHkgaG93IGBQSURfTlNgIGlzIGRlZmluZWQgdG8gZ2V0IGEgZnVsbCB1bmRlcnN0YW5kaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgUElEX05TJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5pdC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5pdC9LY29uZmlnPTE0NDY9Y29uZmlnIFVTRVJfTlNcbi0tXG5pbml0L0tjb25maWctMTQ1OS1cbmluaXQvS2NvbmZpZzoxNDYwOmNvbmZpZyBQSURfTlNcbmluaXQvS2NvbmZpZy0xNDYxLVx0Ym9vbCBcJiMzNDtQSUQgTmFtZXNwYWNlc1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDE3MgoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQmIzM5O3MgaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipDaGVja2luZyBgQ09ORklHX1BST0NfRlNgIGluIGBmcy9wcm9jL0tjb25maWdgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIHByb2MgZmlsZXN5c3RlbSBjb25maWd1cmF0aW9uLiBJdCYjMzk7cyBzZWNvbmQgbmF0dXJlIGF0IHRoaXMgcG9pbnQg4oCTIEkmIzM5O20gdGhpbmtpbmcsICYjMzQ7TGV0JiMzOTtzIGNoZWNrIGBDT05GSUdfUFJPQ19GU2AgaW4gYGZzL3Byb2MvS2NvbmZpZ2AuJiMzNDsgR290dGEgbWFrZSBzdXJlIHRoaXMgZnVuZGFtZW50YWwgY29tcG9uZW50IGlzIGVuYWJsZWQgb3IgcHJvcGVybHkgY29uZmlndXJlZC4gS25vd2luZyB0aGlzLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGVsc2UgcmVsaWVzIG9uIGl0LCBhbmQgd2hhdCBteSBnb2FsIG9mIHVuZGVyc3RhbmRpbmcgdGhlIGN1cnJlbnQgc3lzdGVtLiBHb3R0YSBlbnN1cmUgaXQmIzM5O3Mgc2V0IGNvcnJlY3RseS4gQWZ0ZXIgYWxsLCBgcHJvY2ZzYCBpcyBwcmFjdGljYWxseSB0aGUgYmFja2JvbmUgZm9yIHN5c3RlbSBtb25pdG9yaW5nLCBkZWJ1Z2dpbmcsIGFuZCBwcm92aWRpbmcgaW5mb3JtYXRpb24gdG8gdXNlcnNwYWNlLiBJJiMzOTtsbCBuZWVkIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBjaGVjayBpcyBnb2luZyB0byBiZSBwYXJ0IG9mIGEgYmlnZ2VyIHByb2plY3Q7IHRoZXJlZm9yZSwgSSBtdXN0IGVuc3VyZSBJIGRvIG15IGR1ZSBkaWxpZ2VuY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBQUk9DX0ZTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL3Byb2MvS2NvbmZpZy0xLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuZnMvcHJvYy9LY29uZmlnOjI6Y29uZmlnIFBST0NfRlNcbmZzL3Byb2MvS2NvbmZpZy0zLVx0Ym9vbCBcJiMzNDsvcHJvYyBmaWxlIHN5c3RlbSBzdXBwb3J0XCYjMzQ7IGlmIEVYUEVSVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDQ3NAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDcyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBGb2N1c1N5bWJvbHMgYW5kIExvY2sgSW5mb3JtYXRpb24qKgoKT2theSwgc28gd2UmIzM5O3JlIGxvb2tpbmcgYXQgYEZvY3VzU3ltYm9sc2AsIGFuZCB0aGUgcGF0Y2ggaGlnaGxpZ2h0cyBhIG1vZGlmaWNhdGlvbiB0byBgbG9ja3Nfc2hvd2AuIEhtbSwgdGhhdCByaW5ncyBhIGJlbGwuIFdhaXQgYSBtaW51dGUsIGlzbiYjMzk7dCBgbG9ja3Nfc2hvd2AgZGVmaW5lZCBhcyBgc3RhdGljYCB3aXRoaW4gYGZzL2xvY2tzLmNgPyBZZXAsIGl0IGlzLiBBbHJpZ2h0LCB0aGF0IGNoYW5nZXMgdGhlIGFwcHJvYWNoIGEgYml0LiBOb3cgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgKnVzZWQqLiBTaW5jZSBpdCYjMzk7cyBzdGF0aWMsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBlbnRyeXBvaW50cyB0aGF0IGludm9sdmUgaXQsIGFuZCBzcGVjaWZpY2FsbHksIHdoYXQgZnVuY3Rpb25zICpjYWxsKiBgbG9ja3Nfc2hvd2AgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4gTGV0JiMzOTtzIHN0YXJ0IGJ5IGRpZ2dpbmcgaW50byB0aGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyBhbmQgaWRlbnRpZnkgdGhlIGNhbGxlcnMuIFRoYXQgc2hvdWxkIHBhaW50IGEgY2xlYXJlciBwaWN0dXJlIG9mIGl0cyByb2xlIGluIHRoaXMgc3lzdGVtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2xvY2tzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMTM1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzMxMzU6XHRcbjMxMzY6XHRzdGF0aWMgdm9pZCBsb2Nrc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdilcbjMxMzc6XHRcdF9fcmVsZWFzZXMoXHUwMDI2YmxvY2tlZF9sb2NrX2xvY2spXG4zMTM4Olx0e1xuMzEzOTpcdFx0c3Bpbl91bmxvY2soXHUwMDI2YmxvY2tlZF9sb2NrX2xvY2spO1xuMzE0MDpcdFx0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNmZpbGVfcndzZW0pO1xuMzE0MTpcdH1cbjMxNDI6XHRcbjMxNDM6XHRzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxvY2tzX3NlcV9vcGVyYXRpb25zID0ge1xuMzE0NDpcdFx0LnN0YXJ0XHQ9IGxvY2tzX3N0YXJ0LFxuMzE0NTpcdFx0Lm5leHRcdD0gbG9ja3NfbmV4dCxcbjMxNDY6XHRcdC5zdG9wXHQ9IGxvY2tzX3N0b3AsXG4zMTQ3Olx0XHQuc2hvd1x0PSBsb2Nrc19zaG93LFxuMzE0ODpcdH07XG4zMTQ5Olx0XG4zMTUwOlx0c3RhdGljIGludCBfX2luaXQgcHJvY19sb2Nrc19pbml0KHZvaWQpXG4zMTUxOlx0e1xuMzE1MjpcdFx0cHJvY19jcmVhdGVfc2VxX3ByaXZhdGUoXCYjMzQ7bG9ja3NcJiMzNDssIDAsIE5VTEwsIFx1MDAyNmxvY2tzX3NlcV9vcGVyYXRpb25zLFxuMzE1MzpcdFx0XHRcdHNpemVvZihzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IpLCBOVUxMKTtcbjMxNTQ6XHRcdHJldHVybiAwO1xuMzE1NTpcdH1cbjMxNTY6XHRmc19pbml0Y2FsbChwcm9jX2xvY2tzX2luaXQpO1xuMzE1NzpcdCNlbmRpZlxuMzE1ODpcdFxuMzE1OTpcdHN0YXRpYyBpbnQgX19pbml0IGZpbGVsb2NrX2luaXQodm9pZClcbjMxNjA6XHR7XG4zMTYxOlx0XHRpbnQgaTtcbjMxNjI6XHRcbjMxNjM6XHRcdGZsY3R4X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoXCYjMzQ7ZmlsZV9sb2NrX2N0eFwmIzM0OyxcbjMxNjQ6XHRcdFx0XHRzaXplb2Yoc3RydWN0IGZpbGVfbG9ja19jb250ZXh0KSwgMCwgU0xBQl9QQU5JQywgTlVMTCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMTkwCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMTQzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTG9ja3MgSW1wbGVtZW50YXRpb24qKgoKT2theSwgc28gYGxvY2tzX3Nob3dgIGlzIGEgZnVuY3Rpb24gcG9pbnRlciB3aXRoaW4gYGxvY2tzX3NlcV9vcGVyYXRpb25zYCwgc3BlY2lmaWNhbGx5IGZvciB0aGUgYC5zaG93YCBvcGVyYXRpb24uIFRoZSBjcml0aWNhbCBwb2ludCBpcyB0aGF0IGl0cyBhZGRyZXNzIGlzIGJlaW5nIHRha2VuLiBCZWNhdXNlIG9mIHRoaXMsIGV2ZW4gaWYgaXQgd2VyZSBhIHN0YXRpYyBmdW5jdGlvbiwgdGhlIGNvbXBpbGVyICp3b24mIzM5O3QqIGlubGluZSBpdC4gSXQmIzM5O2xsIGhhdmUgaXRzIG93biBkaXN0aW5jdCBzeW1ib2wgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZS4gVGhpcyBoYXMgaW1wbGljYXRpb25zIGZvciBob3cgaXQmIzM5O3MgcmVzb2x2ZWQgYW5kIGxpbmtlZC4KCkFscmlnaHQsIGJlZm9yZSBkaXZpbmcgdG9vIGRlZXAsIGxldCYjMzk7cyBicm9hZGVuIHRoZSBzY29wZS4gSSBuZWVkIHRvIHNlZSB0aGUgYnJvYWRlciBjb250ZXh0IHdpdGhpbiBgZnMvbG9ja3MuY2AuIEFyZSB0aGVyZSBvdGhlciBmdW5jdGlvbnMgd2l0aGluIHRoYXQgZmlsZSBkaXJlY3RseSByZWxhdGVkIHRvIE9GRCAoT3BlbiBGaWxlIERlc2NyaXB0aW9uKSBsb2NrcyBvciwgY3J1Y2lhbGx5LCByZWxhdGVkIHRvIGBsb2Nrc19zaG93YCBpdHNlbGY/IEl0JiMzOTtzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXBzLgoKSG9sZCBvbiBhIHNlY29uZCwgYmVmb3JlIEkgZ2V0IGNhcnJpZWQgYXdheS4gTGV0JiMzOTtzIHN0ZXAgYmFjayBhbmQgY29uc2lkZXIgdGhlICplbnRyeSBwb2ludHMqIGZvciBgZmNudGxgIGxvY2tzLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGNyaXRpY2FsIGZ1bmN0aW9uczogYGZjbnRsX3NldGxrYCwgYGZjbnRsX3NldGxrNjRgLCBgZG9fbG9ja19maWxlX3dhaXRgLCBgdmZzX2xvY2tfZmlsZWAuLi4gdGhpbmdzIGxpa2UgdGhhdC4gV2UgcmVhbGx5IG5lZWQgdG8gbG9vayBhdCB0aGVzZSBlbnRyeSBwb2ludHMgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdy4gSSBuZWVkIHRvIHNlYXJjaCBmb3IgdGhvc2UgYGZjbnRsYCBsb2NrIGVudHJ5cG9pbnRzIHRvIGdldCBhIGZ1bGwgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmNudGxfc2V0bGsmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZmNudGwuYz00NDQ9c3RhdGljIGxvbmcgZG9fZmNudGwoaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyxcbi0tXG5mcy9mY250bC5jLTQ5OS1cdFx0XHRyZXR1cm4gLUVGQVVMVDtcbmZzL2ZjbnRsLmM6NTAwOlx0XHRlcnIgPSBmY250bF9zZXRsayhmZCwgZmlscCwgY21kLCBcdTAwMjZmbG9jayk7XG5mcy9mY250bC5jLTUwMS1cdFx0YnJlYWs7XG4tLVxuZnMvZmNudGwuYz02MDg9U1lTQ0FMTF9ERUZJTkUzKGZjbnRsNjQsIHVuc2lnbmVkIGludCwgZmQsIHVuc2lnbmVkIGludCwgY21kLFxuLS1cbmZzL2ZjbnRsLmMtNjQ0LVx0XHRcdGJyZWFrO1xuZnMvZmNudGwuYzo2NDU6XHRcdGVyciA9IGZjbnRsX3NldGxrNjQoZmQsIGZkX2ZpbGUoZiksIGNtZCwgXHUwMDI2ZmxvY2spO1xuZnMvZmNudGwuYy02NDYtXHRcdGJyZWFrO1xuLS1cbmZzL2ZjbnRsLmM9NzQzPXN0YXRpYyBsb25nIGRvX2NvbXBhdF9mY250bDY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCxcbi0tXG5mcy9mY250bC5jLTc4Ny1cdFx0XHRicmVhaztcbmZzL2ZjbnRsLmM6Nzg4Olx0XHRlcnIgPSBmY250bF9zZXRsayhmZCwgZmRfZmlsZShmKSwgY29udmVydF9mY250bF9jbWQoY21kKSwgXHUwMDI2ZmxvY2spO1xuZnMvZmNudGwuYy03ODktXHRcdGJyZWFrO1xuLS1cbmZzL2ZjbnRsLmMtNzk2LVx0XHRcdGJyZWFrO1xuZnMvZmNudGwuYzo3OTc6XHRcdGVyciA9IGZjbnRsX3NldGxrKGZkLCBmZF9maWxlKGYpLCBjb252ZXJ0X2ZjbnRsX2NtZChjbWQpLCBcdTAwMjZmbG9jayk7XG5mcy9mY250bC5jLTc5OC1cdFx0YnJlYWs7XG4tLVxuZnMvbG9ja3MuYz0yNTQ4PWNoZWNrX2Ztb2RlX2Zvcl9zZXRsayhzdHJ1Y3QgZmlsZV9sb2NrICpmbClcbi0tXG5mcy9sb2Nrcy5jLTI1NjQtICovXG5mcy9sb2Nrcy5jOjI1NjU6aW50IGZjbnRsX3NldGxrKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXG5mcy9sb2Nrcy5jLTI1NjYtXHRcdHN0cnVjdCBmbG9jayAqZmxvY2spXG4tLVxuZnMvbG9ja3MuYy0yNjM1LW91dDpcbmZzL2xvY2tzLmM6MjYzNjpcdHRyYWNlX2ZjbnRsX3NldGxrKGlub2RlLCBmaWxlX2xvY2ssIGVycm9yKTtcbmZzL2xvY2tzLmMtMjYzNy1cdGxvY2tzX2ZyZWVfbG9jayhmaWxlX2xvY2spO1xuLS1cbmZzL2xvY2tzLmM9MjY0NT1pbnQgZmNudGxfZ2V0bGs2NChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGZsb2NrNjQgKmZsb2NrKVxuLS1cbmZzL2xvY2tzLmMtMjY4Ny0gKi9cbmZzL2xvY2tzLmM6MjY4ODppbnQgZmNudGxfc2V0bGs2NCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuZnMvbG9ja3MuYy0yNjg5LVx0XHRzdHJ1Y3QgZmxvY2s2NCAqZmxvY2spXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMjkyCgkJCQkJCQlvdXRwdXQ6IDEwMwoJCQkJCQkJdGhvdWdodHM6IDIyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciBgbG9ja3Nfc2hvd2AqKgoKT2theSwgc28gdGhpcyBwYXRjaCAqc3BlY2lmaWNhbGx5KiB0b3VjaGVzIHRoZSBgbG9ja3Nfc2hvd2AgZnVuY3Rpb24uIExldCBtZSBxdWlja2x5IGNvbmZpcm0gdGhhdCBieSBjaGVja2luZyB0aGUgZGlmZi4gWXVwLCBqdXN0IGBsb2Nrc19zaG93YCBpbiBgZnMvbG9ja3MuY2AuIEdvb2QuCgpOb3csIGlzIHRoaXMgZXZlbiAqd29ydGgqIGZ1enppbmc/IEFic29sdXRlbHkuIEl0JiMzOTtzIGtlcm5lbCBjb3JlIGxvZ2ljLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBgL3Byb2MvbG9ja3NgIGFuZCBob3cgaXQgaGFuZGxlcyBPRkQgbG9ja3MgYWNyb3NzIFBJRCBuYW1lc3BhY2VzLiBUaGF0JiMzOTtzIGEgZGVmaW5pdGUgJiMzNDt5ZXMmIzM0OyBpbiBteSBib29rLgoKTXkgZnV6emluZyBmb2N1cyB3aWxsIGRlZmluaXRlbHkgYmUgb24gYGxvY2tzX3Nob3dgLiBJJiMzOTtsbCBjb25zaWRlciBhZGRpbmcgYGZjbnRsX3NldGxrYCBhbmQgYGZjbnRsX3NldGxrNjRgIGlmIEkgZmluZCB0aGV5IG9mZmVyIHNvbWUgY292ZXJhZ2UsIGJ1dCBgbG9ja3Nfc2hvd2AgaXMgdGhlIGRpcmVjdCB0YXJnZXQuCgpUaGUgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMgYXJlIGNsZWFyOiBgRklMRV9MT0NLSU5HYCwgYFBST0NfRlNgLCBhbmQgYFBJRF9OU2AuIEdvdCBpdC4gTm8gcHJlZml4LCBqdXN0IHRoZSBzeW1ib2xzIGFzLWlzLgoKQWxyaWdodCwgZG91YmxlLWNoZWNraW5nIGV2ZXJ5dGhpbmfigKYgV2UmIzM5O3ZlIGV4dHJhY3RlZCB0aGUgZnVuY3Rpb24sIGlkZW50aWZpZWQgdGhlIENPTkZJRyBvcHRpb25zLCBhbmQgY29uZmlybWVkIGl0JiMzOTtzIHdvcnRoIGZ1enppbmcuIEkmIzM5O20gcmVhZHkgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLiBMZXQmIzM5O3MgZ2V0IHRoaXMgZnV6emluZyBydW4gZ29pbmchCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtGSUxFX0xPQ0tJTkcmIzM0OywKICAgICYjMzQ7UFJPQ19GUyYjMzQ7LAogICAgJiMzNDtQSURfTlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtsb2Nrc19zaG93JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGBsb2Nrc19zaG93KClgIGluIGZzL2xvY2tzLmMgdG8gcHJvcGVybHkgZmlsdGVyIE9wZW4gRmlsZSBEZXNjcmlwdGlvbiAoT0ZEKSBsb2NrcyB3aGVuIHJlYWRpbmcgL3Byb2MvbG9ja3MgZnJvbSB3aXRoaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoaXMgaXMgY29yZSBmaWxlc3lzdGVtIGxvZ2ljIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZJTEVfTE9DS0lORyYjMzQ7LAogICAgJiMzNDtQUk9DX0ZTJiMzNDssCiAgICAmIzM0O1BJRF9OUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2xvY2tzX3Nob3cmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgYGxvY2tzX3Nob3coKWAgaW4gZnMvbG9ja3MuYyB0byBwcm9wZXJseSBmaWx0ZXIgT3BlbiBGaWxlIERlc2NyaXB0aW9uIChPRkQpIGxvY2tzIHdoZW4gcmVhZGluZyAvcHJvYy9sb2NrcyBmcm9tIHdpdGhpbiBub24taW5pdCBQSUQgbmFtZXNwYWNlcy4gVGhpcyBpcyBjb3JlIGZpbGVzeXN0ZW0gbG9naWMgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgYGxvY2tzX3Nob3coKWAgaW4gYGZzL2xvY2tzLmNgIHRvIHByb3Blcmx5IGZpbHRlciBvcGVuIGZpbGUgZGVzY3JpcHRvciAoT0ZEKSBsb2NrcyBpbiBub24taW5pdCBQSUQgbmFtZXNwYWNlcy4gVGhlIGNoYW5nZXMgb25seSBpbnRyb2R1Y2Ugc2NhbGFyIHN0YWNrIHZhcmlhYmxlcyAoYHZpc2libGVgIGluaXRpYWxpemVkIHRvIGBmYWxzZWAsIGBwaWRgIHBvaW50ZXIgYXNzaWduZWQgZnJvbSBgZmluZF9waWRfbnMoKWApIGFuZCBwZXJmb3JtIG5hbWVzcGFjZSB0cmFuc2xhdGlvbiBjaGVja3MgdW5kZXIgUkNVLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkLCBhbGxvY2F0ZWQsIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBwYWRkaW5nIG9yIHN0cnVjdCBmaWVsZHMgYXJlIGxlZnQgdW5pbml0aWFsaXplZC4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWQwOTlhMzNkNjgzODZmMTQ1YmZhODNhNGNlNDJjZWIyNmM5ZGZmNApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgU2VwIDMgMDk6MTY6MTIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuYwppbmRleCA2ZTRmZjdmY2VjMDUzLi40YWYxMzg1NjgyZTRlIDEwMDY0NAotLS0gYS9mcy9sb2Nrcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2xvY2tzLmMKQEAgLTMwMjIsNiAmIzQzOzMwMjIsMjUgQEAgc3RhdGljIGludCBsb2Nrc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdikKIAogCWN1ciA9IGhsaXN0X2VudHJ5KHYsIHN0cnVjdCBmaWxlX2xvY2tfY29yZSwgZmxjX2xpbmspOwogCiYjNDM7CS8qCiYjNDM7CSAqIE9GRCBsb2NrcyBhcmUgcmVwb3J0ZWQgd2l0aCBwaWQgLTEsIHNvIHRoZSBmaWx0ZXIgYmVsb3cgY2Fubm90IHNlZQomIzQzOwkgKiB0aGVpciBvd25lcjsgZmxjX3BpZCBob2xkcyB0aGUgb3duZXIgdGdpZCwgc28gZmlsdGVyIG9uIGl0LgomIzQzOwkgKiBSZW1vdGUgbG9ja3Mga2VlcCBhIG5lZ2F0aXZlIGZsY19waWQgYW5kIHN0YXkgdmlzaWJsZSBhcyBiZWZvcmUuCiYjNDM7CSAqLwomIzQzOwlpZiAoKGN1ci0mZ3Q7ZmxjX2ZsYWdzICZhbXA7IEZMX09GRExDSykgJmFtcDsmYW1wOyBjdXItJmd0O2ZsY19waWQgJmd0OyAwICZhbXA7JmFtcDsKJiM0MzsJICAgIHByb2NfcGlkbnMgIT0gJmFtcDtpbml0X3BpZF9ucykgewomIzQzOwkJc3RydWN0IHBpZCAqcGlkOwomIzQzOwkJYm9vbCB2aXNpYmxlID0gZmFsc2U7CiYjNDM7CiYjNDM7CQlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CQlwaWQgPSBmaW5kX3BpZF9ucyhjdXItJmd0O2ZsY19waWQsICZhbXA7aW5pdF9waWRfbnMpOwomIzQzOwkJaWYgKHBpZCkKJiM0MzsJCQl2aXNpYmxlID0gcGlkX25yX25zKHBpZCwgcHJvY19waWRucykgIT0gMDsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJaWYgKCF2aXNpYmxlKQomIzQzOwkJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiAJaWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKQogCQlyZXR1cm4gMDsKIAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjI1NgoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGFuYWx5c2lzIG9mIHRoZSBzaXR1YXRpb246CgoqKkRlY29uc3RydWN0aW5nIHRoZSBQYXRjaCoqCgpPa2F5LCB0aW1lIHRvIGdldCB0byB3b3JrLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaC4gVGhlIGluc3RydWN0aW9ucyBhcmUgc3RyYWlnaHRmb3J3YXJkIGVub3VnaDogYW5hbHl6ZSB0aGUgY2hhbmdlcy4gSXQgbG9va3MgbGlrZSB0aGUgdGFyZ2V0IGlzIGEgbW9kaWZpY2F0aW9uIHRvIGBmcy9sb2Nrcy5jYCwgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgYGxvY2tzX3Nob3dgIGZ1bmN0aW9uLCB3aGljaCBpcyBhIGtleSBhcmVhIGZvciBsb2NrIHZpc3VhbGl6YXRpb24uIEdpdmVuIHRoZSBuYXR1cmUgb2YgdGhpcywgSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgZXhpc3RpbmcgbG9ja2luZyBpbmZyYXN0cnVjdHVyZSB3b3JrcyB0byBpZGVudGlmeSBhbnkgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuIEl0IGFwcGVhcnMgdGhhdCB0aGUgbW9kaWZpY2F0aW9ucyBhcmUgaW4gb3IgYXJvdW5kIGxpbmUgMzAyMiwgc28gSSB3aWxsIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIGlkZW50aWZ5IGFueSBhcmVhcyBvZiBjb25jZXJuLiBJJiMzOTtsbCB1c2UgYHJlYWQtZmlsZWAgb3IgYGdyZXBwZXJgIHRvIHF1aWNrbHkgYnJpbmcgdGhlIHJlbGV2YW50IHNlY3Rpb24gaW50byB2aWV3LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2xvY2tzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMDEwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzMwMTA6XHRcdFx0cmV0dXJuIE5VTEw7XG4zMDExOlx0XHR9XG4zMDEyOlx0XG4zMDEzOlx0XHRyZXR1cm4gdG1wO1xuMzAxNDpcdH1cbjMwMTU6XHRcbjMwMTY6XHRzdGF0aWMgaW50IGxvY2tzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxuMzAxNzpcdHtcbjMwMTg6XHRcdHN0cnVjdCBsb2Nrc19pdGVyYXRvciAqaXRlciA9IGYtXHUwMDNlcHJpdmF0ZTtcbjMwMTk6XHRcdHN0cnVjdCBmaWxlX2xvY2tfY29yZSAqY3VyLCAqdG1wO1xuMzAyMDpcdFx0c3RydWN0IHBpZF9uYW1lc3BhY2UgKnByb2NfcGlkbnMgPSBwcm9jX3BpZF9ucyhmaWxlX2lub2RlKGYtXHUwMDNlZmlsZSktXHUwMDNlaV9zYik7XG4zMDIxOlx0XHRpbnQgbGV2ZWwgPSAwO1xuMzAyMjpcdFxuMzAyMzpcdFx0Y3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7XG4zMDI0Olx0XG4zMDI1Olx0XHQvKlxuMzAyNjpcdFx0ICogT0ZEIGxvY2tzIGFyZSByZXBvcnRlZCB3aXRoIHBpZCAtMSwgc28gdGhlIGZpbHRlciBiZWxvdyBjYW5ub3Qgc2VlXG4zMDI3Olx0XHQgKiB0aGVpciBvd25lcjsgZmxjX3BpZCBob2xkcyB0aGUgb3duZXIgdGdpZCwgc28gZmlsdGVyIG9uIGl0LlxuMzAyODpcdFx0ICogUmVtb3RlIGxvY2tzIGtlZXAgYSBuZWdhdGl2ZSBmbGNfcGlkIGFuZCBzdGF5IHZpc2libGUgYXMgYmVmb3JlLlxuMzAyOTpcdFx0ICovXG4zMDMwOlx0XHRpZiAoKGN1ci1cdTAwM2VmbGNfZmxhZ3MgXHUwMDI2IEZMX09GRExDSykgXHUwMDI2XHUwMDI2IGN1ci1cdTAwM2VmbGNfcGlkIFx1MDAzZSAwIFx1MDAyNlx1MDAyNlxuMzAzMTpcdFx0ICAgIHByb2NfcGlkbnMgIT0gXHUwMDI2aW5pdF9waWRfbnMpIHtcbjMwMzI6XHRcdFx0c3RydWN0IHBpZCAqcGlkO1xuMzAzMzpcdFx0XHRib29sIHZpc2libGUgPSBmYWxzZTtcbjMwMzQ6XHRcbjMwMzU6XHRcdFx0cmN1X3JlYWRfbG9jaygpO1xuMzAzNjpcdFx0XHRwaWQgPSBmaW5kX3BpZF9ucyhjdXItXHUwMDNlZmxjX3BpZCwgXHUwMDI2aW5pdF9waWRfbnMpO1xuMzAzNzpcdFx0XHRpZiAocGlkKVxuMzAzODpcdFx0XHRcdHZpc2libGUgPSBwaWRfbnJfbnMocGlkLCBwcm9jX3BpZG5zKSAhPSAwO1xuMzAzOTpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjMwNDA6XHRcdFx0aWYgKCF2aXNpYmxlKVxuMzA0MTpcdFx0XHRcdHJldHVybiAwO1xuMzA0MjpcdFx0fVxuMzA0MzpcdFxuMzA0NDpcdFx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuMzA0NTpcdFx0XHRyZXR1cm4gMDtcbjMwNDY6XHRcbjMwNDc6XHRcdC8qIFZpZXcgdGhpcyBjcm9zc2VkIGxpbmtlZCBsaXN0IGFzIGEgYmluYXJ5IHRyZWUsIHRoZSBmaXJzdCBtZW1iZXIgb2YgZmxjX2Jsb2NrZWRfcmVxdWVzdHNcbjMwNDg6XHRcdCAqIGlzIHRoZSBsZWZ0IGNoaWxkIG9mIGN1cnJlbnQgbm9kZSwgdGhlIG5leHQgc2lsaWJpbmcgaW4gZmxjX2Jsb2NrZWRfbWVtYmVyIGlzIHRoZVxuMzA0OTpcdFx0ICogcmlnaHQgY2hpbGQsIHdlIGNhbiBhbHNlIGdldCB0aGUgcGFyZW50IG9mIGN1cnJlbnQgbm9kZSBmcm9tIGZsY19ibG9ja2VyLCBzbyB0aGlzXG4zMDUwOlx0XHQgKiBxdWVzdGlvbiBiZWNvbWVzIHRyYXZlcnNhbCBvZiBhIGJpbmFyeSB0cmVlXG4zMDUxOlx0XHQgKi9cbjMwNTI6XHRcdHdoaWxlIChjdXIgIT0gTlVMTCkge1xuMzA1MzpcdFx0XHRpZiAobGV2ZWwpXG4zMDU0Olx0XHRcdFx0bG9ja19nZXRfc3RhdHVzKGYsIGN1ciwgaXRlci1cdTAwM2VsaV9wb3MsIFwmIzM0Oy1cdTAwM2UgXCYjMzQ7LCBsZXZlbCk7XG4zMDU1Olx0XHRcdGVsc2VcbjMwNTY6XHRcdFx0XHRsb2NrX2dldF9zdGF0dXMoZiwgY3VyLCBpdGVyLVx1MDAzZWxpX3BvcywgXCYjMzQ7XCYjMzQ7LCBsZXZlbCk7XG4zMDU3Olx0XG4zMDU4Olx0XHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZjdXItXHUwMDNlZmxjX2Jsb2NrZWRfcmVxdWVzdHMpKSB7XG4zMDU5Olx0XHRcdFx0LyogVHVybiBsZWZ0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMzMzMKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipJbnZlc3RpZ2F0aW5nIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBhbmQgYGZsY19waWRgIEluaXRpYWxpemF0aW9uL1VzYWdlKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBgbG9ja3NfdHJhbnNsYXRlX3BpZGAgYW5kIHRoZSBgZmxjX3BpZGAgdmFyaWFibGVzLiBJdCYjMzk7cyB0aW1lIHRvIHRyYWNlIHRoZSBjb250cm9sIGZsb3cgdG8gdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHRoZSBmb3JtZXIgb24gdGhlIGxhdHRlci4gSSB3YW50IHRvIHNlZSAqZXhhY3RseSogaG93IGBmbGNfcGlkYCBpcyBpbml0aWFsaXplZCwgd2hlcmUgaXQmIzM5O3MgbW9kaWZpZWQsIGFuZCB1bmRlciB3aGF0IGNvbmRpdGlvbnMuIFRoZSBnb2FsIGlzIHRvIGZ1bGx5IHVuZGVyc3RhbmQgaG93IHRoZXNlIHR3byBjb21wb25lbnRzIHJlbGF0ZSBhbmQgaWYgdGhlcmUgYXJlIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBpbmNvcnJlY3Qgc3RhdGVzLCBvciBpbmVmZmljaWVuY2llcy4gSSBuZWVkIHRvIGVuc3VyZSB0aGV5IGFsaWduLCB0aGF0IHRoZSBQSUQgdHJhbnNsYXRpb24gaXMgaGFwcGVuaW5nIGNvcnJlY3RseSBpbiByZWxhdGlvbiB0byB0aGUgRkxDLiBJJiMzOTttIGdvaW5nIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgdGhlIGxvY2tzIHBvdGVudGlhbGx5IGJlaW5nIGFjcXVpcmVkLCBhbmQgYW55IHNoYXJlZCByZXNvdXJjZXMgdGhhdCBjb3VsZCBhZmZlY3QgdGhlaXIgaW50ZXJhY3Rpb24uIFRpbWUgdG8gZGlnIGluIGFuZCBjbGFyaWZ5IGFueSBudWFuY2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsb2Nrc190cmFuc2xhdGVfcGlkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9sb2Nrcy5jPTIzNjU9RVhQT1JUX1NZTUJPTF9HUEwodmZzX3Rlc3RfbG9jayk7XG4tLVxuZnMvbG9ja3MuYy0yMzY3LS8qKlxuZnMvbG9ja3MuYzoyMzY4OiAqIGxvY2tzX3RyYW5zbGF0ZV9waWQgLSB0cmFuc2xhdGUgYSBmaWxlX2xvY2smIzM5O3MgZmxfcGlkIG51bWJlciBpbnRvIGEgbmFtZXNwYWNlXG5mcy9sb2Nrcy5jLTIzNjktICogQGZsOiBUaGUgZmlsZV9sb2NrIHdobyYjMzk7cyBmbF9waWQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcbi0tXG5mcy9sb2Nrcy5jLTIzNzMtICovXG5mcy9sb2Nrcy5jOjIzNzQ6c3RhdGljIHBpZF90IGxvY2tzX3RyYW5zbGF0ZV9waWQoc3RydWN0IGZpbGVfbG9ja19jb3JlICpmbCwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKVxuZnMvbG9ja3MuYy0yMzc1LXtcbi0tXG5mcy9sb2Nrcy5jPTI0MDE9c3RhdGljIGludCBwb3NpeF9sb2NrX3RvX2Zsb2NrKHN0cnVjdCBmbG9jayAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxuZnMvbG9ja3MuYy0yNDAyLXtcbmZzL2xvY2tzLmM6MjQwMzpcdGZsb2NrLVx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcdTAwMjZmbC1cdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xuZnMvbG9ja3MuYy0yNDA0LSNpZiBCSVRTX1BFUl9MT05HID09IDMyXG4tLVxuZnMvbG9ja3MuYz0yNDIzPXN0YXRpYyB2b2lkIHBvc2l4X2xvY2tfdG9fZmxvY2s2NChzdHJ1Y3QgZmxvY2s2NCAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxuZnMvbG9ja3MuYy0yNDI0LXtcbmZzL2xvY2tzLmM6MjQyNTpcdGZsb2NrLVx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcdTAwMjZmbC1cdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xuZnMvbG9ja3MuYy0yNDI2LVx0ZmxvY2stXHUwMDNlbF9zdGFydCA9IGZsLVx1MDAzZWZsX3N0YXJ0O1xuLS1cbmZzL2xvY2tzLmM9MjkyMT1zdGF0aWMgdm9pZCBsb2NrX2dldF9zdGF0dXMoc3RydWN0IHNlcV9maWxlICpmLCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsYyxcbi0tXG5mcy9sb2Nrcy5jLTI5MjktXG5mcy9sb2Nrcy5jOjI5MzA6XHRwaWQgPSBsb2Nrc190cmFuc2xhdGVfcGlkKGZsYywgcHJvY19waWRucyk7XG5mcy9sb2Nrcy5jLTI5MzEtXG4tLVxuZnMvbG9ja3MuYz0zMDE2PXN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXG4tLVxuZnMvbG9ja3MuYy0zMDQzLVxuZnMvbG9ja3MuYzozMDQ0Olx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuZnMvbG9ja3MuYy0zMDQ1LVx0XHRyZXR1cm4gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDIwMwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgbG9ja3NfdHJhbnNsYXRlX3BpZGAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBkZWZpbml0aW9uLiBJdCYjMzk7cyBjcnVjaWFsLCBvYnZpb3VzbHksIGdpdmVuIGl0cyBuYW1lLCBzbyBJJiMzOTtsbCBuZWVkIHRvIHJlYWxseSB1bnBhY2sgaXRzIHB1cnBvc2UgYW5kIGltcGxlbWVudGF0aW9uLiBXaGF0IGV4YWN0bHkgaXMgaXQgZG9pbmcgd2l0aCBQSURzPyBIb3cgZG9lcyBpdCBmaXQgaW50byB0aGUgYnJvYWRlciBsb2NraW5nIG1lY2hhbmlzbSBJJiMzOTttIGZhbWlsaWFyIHdpdGg/IEkmIzM5O2xsIHByb2JhYmx5IHN0YXJ0IGJ5IHRyYWNpbmcgdGhlIGZ1bmN0aW9uJiMzOTtzIGNhbGxzIGFuZCBkZXBlbmRlbmNpZXMsIHNlZWluZyB3aGF0IG90aGVyIHBhcnRzIG9mIHRoZSBzeXN0ZW0gaW50ZXJhY3Qgd2l0aCBpdC4gRnJvbSB0aGVyZSwgSSYjMzk7bGwgbmVlZCB0byBzZWUgd2hldGhlciBpdCBtYWtlcyB1c2Ugb2Yga2VybmVsIHN0cnVjdHVyZXMgdGhhdCBhcmUgc3RhbmRhcmQsIG9yIHdoZXRoZXIgaXQgY29udGFpbnMgc29tZSBiZXNwb2tlIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgdW5pcXVlIHRvIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBvciBhcHBsaWNhdGlvbiB0aGlzIGNvZGUgaXMgZm9yLiBJJiMzOTttIGdvaW5nIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgdHlwZXMgaXQmIzM5O3Mgd29ya2luZyB3aXRoIGFuZCBob3cgdGhleSByZWxhdGUgdG8gcHJvY2VzcyBpZGVudGlmaWVycy4gVW5kZXJzdGFuZGluZyBpdHMgcm9sZSBpbiB0cmFuc2xhdGluZyBvciBtYW5pcHVsYXRpbmcgUElEcyBpcyBrZXkgdG8gZ3Jhc3BpbmcgdGhlIG92ZXJhbGwgbG9ja2luZyBzdHJhdGVneS4gVGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIzNjgsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjM2ODpcdCAqIGxvY2tzX3RyYW5zbGF0ZV9waWQgLSB0cmFuc2xhdGUgYSBmaWxlX2xvY2smIzM5O3MgZmxfcGlkIG51bWJlciBpbnRvIGEgbmFtZXNwYWNlXG4yMzY5Olx0ICogQGZsOiBUaGUgZmlsZV9sb2NrIHdobyYjMzk7cyBmbF9waWQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcbjIzNzA6XHQgKiBAbnM6IFRoZSBuYW1lc3BhY2UgaW50byB3aGljaCB0aGUgcGlkIHNob3VsZCBiZSB0cmFuc2xhdGVkXG4yMzcxOlx0ICpcbjIzNzI6XHQgKiBVc2VkIHRvIHRyYW5zbGF0ZSBhIGZsX3BpZCBpbnRvIGEgbmFtZXNwYWNlIHZpcnR1YWwgcGlkIG51bWJlclxuMjM3MzpcdCAqL1xuMjM3NDpcdHN0YXRpYyBwaWRfdCBsb2Nrc190cmFuc2xhdGVfcGlkKHN0cnVjdCBmaWxlX2xvY2tfY29yZSAqZmwsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucylcbjIzNzU6XHR7XG4yMzc2Olx0XHRwaWRfdCB2bnI7XG4yMzc3Olx0XHRzdHJ1Y3QgcGlkICpwaWQ7XG4yMzc4Olx0XG4yMzc5Olx0XHRpZiAoZmwtXHUwMDNlZmxjX2ZsYWdzIFx1MDAyNiBGTF9PRkRMQ0spXG4yMzgwOlx0XHRcdHJldHVybiAtMTtcbjIzODE6XHRcbjIzODI6XHRcdC8qIFJlbW90ZSBsb2NrcyByZXBvcnQgYSBuZWdhdGl2ZSBwaWQgdmFsdWUgKi9cbjIzODM6XHRcdGlmIChmbC1cdTAwM2VmbGNfcGlkIFx1MDAzYz0gMClcbjIzODQ6XHRcdFx0cmV0dXJuIGZsLVx1MDAzZWZsY19waWQ7XG4yMzg1Olx0XG4yMzg2Olx0XHQvKlxuMjM4NzpcdFx0ICogSWYgdGhlIGZsb2NrIG93bmVyIHByb2Nlc3MgaXMgZGVhZCBhbmQgaXRzIHBpZCBoYXMgYmVlbiBhbHJlYWR5XG4yMzg4Olx0XHQgKiBmcmVlZCwgdGhlIHRyYW5zbGF0aW9uIGJlbG93IHdvbiYjMzk7dCB3b3JrLCBidXQgd2Ugc3RpbGwgd2FudCB0byBzaG93XG4yMzg5Olx0XHQgKiBmbG9jayBvd25lciBwaWQgbnVtYmVyIGluIGluaXQgcGlkbnMuXG4yMzkwOlx0XHQgKi9cbjIzOTE6XHRcdGlmIChucyA9PSBcdTAwMjZpbml0X3BpZF9ucylcbjIzOTI6XHRcdFx0cmV0dXJuIChwaWRfdCkgZmwtXHUwMDNlZmxjX3BpZDtcbjIzOTM6XHRcbjIzOTQ6XHRcdHJjdV9yZWFkX2xvY2soKTtcbjIzOTU6XHRcdHBpZCA9IGZpbmRfcGlkX25zKGZsLVx1MDAzZWZsY19waWQsIFx1MDAyNmluaXRfcGlkX25zKTtcbjIzOTY6XHRcdHZuciA9IHBpZF9ucl9ucyhwaWQsIG5zKTtcbjIzOTc6XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuMjM5ODpcdFx0cmV0dXJuIHZucjtcbjIzOTk6XHR9XG4yNDAwOlx0XG4yNDAxOlx0c3RhdGljIGludCBwb3NpeF9sb2NrX3RvX2Zsb2NrKHN0cnVjdCBmbG9jayAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxuMjQwMjpcdHtcbjI0MDM6XHRcdGZsb2NrLVx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcdTAwMjZmbC1cdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xuMjQwNDpcdCNpZiBCSVRTX1BFUl9MT05HID09IDMyXG4yNDA1Olx0XHQvKlxuMjQwNjpcdFx0ICogTWFrZSBzdXJlIHdlIGNhbiByZXByZXNlbnQgdGhlIHBvc2l4IGxvY2sgdmlhXG4yNDA3Olx0XHQgKiBsZWdhY3kgMzJiaXQgZmxvY2suXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUxMjQKCQkJCQkJCW91dHB1dDogMTUzCgkJCQkJCQl0aG91Z2h0czogODA4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYC9wcm9jL2xvY2tzYCBQYXRjaCBmb3IgS01TQU4gTmVlZHMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSXQgbG9va3MgbGlrZSB3ZSYjMzk7cmUgZml4aW5nIGEgYnVnIHJlbGF0ZWQgdG8gaG93IE9GRCAoT3BlbiBGaWxlIERlc2NyaXB0b3IpIGxvY2tzIGFyZSBkaXNwbGF5ZWQgaW4gYC9wcm9jL2xvY2tzYCBhY3Jvc3MgZGlmZmVyZW50IFBJRCBuYW1lc3BhY2VzLiBUaGUgaW5pdGlhbCBpc3N1ZSBpcyB0aGF0IGBsb2Nrc190cmFuc2xhdGVfcGlkYCByZXR1cm5zIC0xIGZvciBgRkxfT0ZETENLYCAodGhlIGZsYWcgZm9yIE9GRCBsb2NrcykuIFRoaXMgbGVhZHMgdG8gYSBzaXR1YXRpb24gd2hlcmUgdGhlIGZpbHRlciBpbiBgbG9ja3Nfc2hvd2AgdG8gZmlsdGVyIGxvY2tzIGJ5IFBJRCBuYW1lc3BhY2UgaXNuJiMzOTt0IHdvcmtpbmcgY29ycmVjdGx5IGZvciBPRkQgbG9ja3MuIFNwZWNpZmljYWxseSwgaXQgd2FzIGRpc3BsYXlpbmcgT0ZEIGxvY2tzIGV2ZW4gaWYgdGhleSBkaWRuJiMzOTt0IGJlbG9uZyB0byB0aGUgY3VycmVudCBQSUQgbmFtZXNwYWNlLgoKVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgY2hlY2sgd2l0aGluIGBsb2Nrc19zaG93YC4gTm93LCBpZiBpdCYjMzk7cyBhbiBPRkQgbG9jayAqYW5kKiBpdCYjMzk7cyBub3QgaW4gdGhlIGluaXQgbmFtZXNwYWNlLCB3ZSBwZXJmb3JtIGFuIGV4cGxpY2l0IHZpc2liaWxpdHkgY2hlY2sgdXNpbmcgYGZpbmRfcGlkX25zYCBhbmQgYHBpZF9ucl9uc2AuIFRoaXMgZW5zdXJlcyB0aGUgbG9jayBpcyBvbmx5IHNob3duIGlmIHRoZSBQSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NrIGFjdHVhbGx5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBQSUQgbmFtZXNwYWNlLiBTZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLgoKTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IEtNU0FOLiBXZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoICpyZXF1aXJlcyogS01TQU4gdG8gY2F0Y2ggcG90ZW50aWFsIGlzc3Vlcy4gRmlyc3QsIGxldCYjMzk7cyBhZGRyZXNzIHRoZSBzcGVjaWZpYyBLTVNBTiBjb25jZXJuczoKCjEuICAqKkRvZXMgaXQgdG91Y2ggdW5pbml0aWFsaXplZCBtZW1vcnksIGNyZWF0ZSBuZXcgYWxsb2NhdGlvbnMsIG9yIGNvcHkgdW5pbml0aWFsaXplZCBkYXRhIHRvIHVzZXJzcGFjZT8qKiBOby4gVGhlIHBhdGNoIHJlYWRzIGV4aXN0aW5nIGBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmVgIGZpZWxkcyAoYGZsY19mbGFnc2AsIGBmbGNfcGlkYCkuIEl0IGFsbG9jYXRlcyBvbmx5IGxvY2FsIHN0YWNrIHZhcmlhYmxlcyAoYHBpZGAsIGB2aXNpYmxlYCkgd2hpY2ggYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLiBJdCBjYWxscyBzdGFuZGFyZCBrZXJuZWwgZnVuY3Rpb25zIChgcmN1X3JlYWRfbG9ja2AsIGBmaW5kX3BpZF9uc2AsIGBwaWRfbnJfbnNgLCBgcmN1X3JlYWRfdW5sb2NrYCkuIEl0ICpmaWx0ZXJzKiBlbnRyaWVzLCBtZWFuaW5nIGl0JiMzOTtzIG9ubHkgbW9kaWZ5aW5nIHRoZSBvdXRwdXQgc3RyZWFtLiBUaGVyZSYjMzk7cyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIG9yIGNvcHkgaW50byB1c2Vyc3BhY2UuCgoyLiAgKipEb2VzIGl0IGludHJvZHVjZSByaXNrcyB0aGF0IGFyZSBPTkxZIGNhdWdodCBieSBLTVNBTj8qKiBOby4gS01TQU4gZm9jdXNlcyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MuIFRoaXMgcGF0Y2ggaXMgZnVuZGFtZW50YWxseSBhYm91dCBQSUQgbmFtZXNwYWNlIGZpbHRlcmluZyBhbmQgbG9jayBkaXNwbGF5IGxvZ2ljLiBUaGUgcG90ZW50aWFsIGlzc3VlcyBoZXJlIGFyZSByZWxhdGVkIHRvIFJDVSB1c2FnZSwgcG9pbnRlciBkZXJlZmVyZW5jaW5nLCBhbmQgb3ZlcmFsbCBjb3JyZWN0bmVzcy4gU3RhbmRhcmQgdG9vbHMgbGlrZSBLQVNBTiBhbmQgbG9ja2RlcCwgYWxvbmcgd2l0aCB1bml0IHRlc3RzLCBhcmUgbW9yZSB0aGFuIHN1ZmZpY2llbnQgdG8gY292ZXIgdGhlc2Uga2luZHMgb2Ygcmlza3MuCgpUaGUgcnVsZSBpcyBjbGVhcjogKklmIGEgYnVnIGNhbiBiZSBjYXVnaHQgYnkgS0FTQU4sIExvY2tkZXAgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycywgdGhlcmUgaXMgbm8gbmVlZCB0byBydW4gS01TQU4qLiBBIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIGNvc3RseS4KClRoZXJlZm9yZSwgYE5lZWRzS01TQU5gIGlzIGRlZmluaXRlbHkgYGZhbHNlYC4KCioqS01TQU5SZWFzb25pbmc6KioKClRoZSBwYXRjaCBhZGRzIGEgUElEIG5hbWVzcGFjZSB2aXNpYmlsaXR5IGNoZWNrIGZvciBPRkQgbG9ja3MgaW4gYGZzL2xvY2tzLmM6bG9ja3Nfc2hvdygpYC4gSXQgb3BlcmF0ZXMgb24gZXhpc3RpbmcgZmlsZSBsb2NrIHN0cnVjdHVyZXMgKGBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmVgKSBhbmQgdXNlcyBzdGFjay1hbGxvY2F0ZWQgc2NhbGFyIHZhcmlhYmxlcyAoYHBpZGAsIGB2aXNpYmxlYCkgdGhhdCBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIE5vIG5ldyBidWZmZXJzLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGtlcm5lbC10by11c2VyIGluZm8gbGVha3MgYXJlIGludHJvZHVjZWQgb3IgZXhwb3NlZC4gVGhlcmVmb3JlLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gSXQmIzM5O3MgYSBjbGVhbiBmaXggd2l0aCBzdGFuZGFyZCBtZW1vcnkgc2FmZXR5IGNvbnNpZGVyYXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIGBsb2Nrc19zaG93KClgIGluIGBmcy9sb2Nrcy5jYCB0byBwcm9wZXJseSBmaWx0ZXIgb3BlbiBmaWxlIGRlc2NyaXB0b3IgKE9GRCkgbG9ja3MgaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoZSBjaGFuZ2VzIG9ubHkgaW50cm9kdWNlIHNjYWxhciBzdGFjayB2YXJpYWJsZXMgKGB2aXNpYmxlYCBpbml0aWFsaXplZCB0byBgZmFsc2VgLCBgcGlkYCBwb2ludGVyIGFzc2lnbmVkIGZyb20gYGZpbmRfcGlkX25zKClgKSBhbmQgcGVyZm9ybSBuYW1lc3BhY2UgdHJhbnNsYXRpb24gY2hlY2tzIHVuZGVyIFJDVS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCwgYWxsb2NhdGVkLCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gcGFkZGluZyBvciBzdHJ1Y3QgZmllbGRzIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIGBsb2Nrc19zaG93KClgIGluIGBmcy9sb2Nrcy5jYCB0byBwcm9wZXJseSBmaWx0ZXIgb3BlbiBmaWxlIGRlc2NyaXB0b3IgKE9GRCkgbG9ja3MgaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoZSBjaGFuZ2VzIG9ubHkgaW50cm9kdWNlIHNjYWxhciBzdGFjayB2YXJpYWJsZXMgKGB2aXNpYmxlYCBpbml0aWFsaXplZCB0byBgZmFsc2VgLCBgcGlkYCBwb2ludGVyIGFzc2lnbmVkIGZyb20gYGZpbmRfcGlkX25zKClgKSBhbmQgcGVyZm9ybSBuYW1lc3BhY2UgdHJhbnNsYXRpb24gY2hlY2tzIHVuZGVyIFJDVS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCwgYWxsb2NhdGVkLCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gcGFkZGluZyBvciBzdHJ1Y3QgZmllbGRzIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjEyLjg3NjM3NTczMVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyOTE5OTU4NDY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkZJTEVfTE9DS0lOR1wiLFxuICAgIFwiUFJPQ19GU1wiLFxuICAgIFwiUElEX05TXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibG9ja3Nfc2hvd1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBgbG9ja3Nfc2hvdygpYCBpbiBgZnMvbG9ja3MuY2AgdG8gcHJvcGVybHkgZmlsdGVyIG9wZW4gZmlsZSBkZXNjcmlwdG9yIChPRkQpIGxvY2tzIGluIG5vbi1pbml0IFBJRCBuYW1lc3BhY2VzLiBUaGUgY2hhbmdlcyBvbmx5IGludHJvZHVjZSBzY2FsYXIgc3RhY2sgdmFyaWFibGVzIChgdmlzaWJsZWAgaW5pdGlhbGl6ZWQgdG8gYGZhbHNlYCwgYHBpZGAgcG9pbnRlciBhc3NpZ25lZCBmcm9tIGBmaW5kX3BpZF9ucygpYCkgYW5kIHBlcmZvcm0gbmFtZXNwYWNlIHRyYW5zbGF0aW9uIGNoZWNrcyB1bmRlciBSQ1UuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQsIGFsbG9jYXRlZCwgb3IgY29waWVkIHRvIHVzZXJzcGFjZSwgYW5kIG5vIHBhZGRpbmcgb3Igc3RydWN0IGZpZWxkcyBhcmUgbGVmdCB1bmluaXRpYWxpemVkLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGBsb2Nrc19zaG93KClgIGluIGZzL2xvY2tzLmMgdG8gcHJvcGVybHkgZmlsdGVyIE9wZW4gRmlsZSBEZXNjcmlwdGlvbiAoT0ZEKSBsb2NrcyB3aGVuIHJlYWRpbmcgL3Byb2MvbG9ja3MgZnJvbSB3aXRoaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoaXMgaXMgY29yZSBmaWxlc3lzdGVtIGxvZ2ljIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjEyLjg3NjM4MDU5MVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzcyMzgyMDQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgOWQwOTlhMzNkNjgzODZmMTQ1YmZhODNhNGNlNDJjZWIyNmM5ZGZmNFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVGh1IFNlcCAzIDA5OjE2OjEyIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jXFxuaW5kZXggNmU0ZmY3ZmNlYzA1My4uNGFmMTM4NTY4MmU0ZSAxMDA2NDRcXG4tLS0gYS9mcy9sb2Nrcy5jXFxuKysrIGIvZnMvbG9ja3MuY1xcbkBAIC0zMDIyLDYgKzMwMjIsMjUgQEAgc3RhdGljIGludCBsb2Nrc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdilcXG4gXFxuIFxcdGN1ciA9IGhsaXN0X2VudHJ5KHYsIHN0cnVjdCBmaWxlX2xvY2tfY29yZSwgZmxjX2xpbmspO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogT0ZEIGxvY2tzIGFyZSByZXBvcnRlZCB3aXRoIHBpZCAtMSwgc28gdGhlIGZpbHRlciBiZWxvdyBjYW5ub3Qgc2VlXFxuK1xcdCAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuXFxuK1xcdCAqIFJlbW90ZSBsb2NrcyBrZWVwIGEgbmVnYXRpdmUgZmxjX3BpZCBhbmQgc3RheSB2aXNpYmxlIGFzIGJlZm9yZS5cXG4rXFx0ICovXFxuK1xcdGlmICgoY3VyLVxcdTAwM2VmbGNfZmxhZ3MgXFx1MDAyNiBGTF9PRkRMQ0spIFxcdTAwMjZcXHUwMDI2IGN1ci1cXHUwMDNlZmxjX3BpZCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIHByb2NfcGlkbnMgIT0gXFx1MDAyNmluaXRfcGlkX25zKSB7XFxuK1xcdFxcdHN0cnVjdCBwaWQgKnBpZDtcXG4rXFx0XFx0Ym9vbCB2aXNpYmxlID0gZmFsc2U7XFxuK1xcbitcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuK1xcdFxcdHBpZCA9IGZpbmRfcGlkX25zKGN1ci1cXHUwMDNlZmxjX3BpZCwgXFx1MDAyNmluaXRfcGlkX25zKTtcXG4rXFx0XFx0aWYgKHBpZClcXG4rXFx0XFx0XFx0dmlzaWJsZSA9IHBpZF9ucl9ucyhwaWQsIHByb2NfcGlkbnMpICE9IDA7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRcXHRpZiAoIXZpc2libGUpXFxuK1xcdFxcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbiBcXHRpZiAobG9ja3NfdHJhbnNsYXRlX3BpZChjdXIsIHByb2NfcGlkbnMpID09IDApXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6MTMuMjQ5NDgwMDg2WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1MTY5MDgxNjI3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJGSUxFX0xPQ0tJTkdcIixcbiAgICBcIlBST0NfRlNcIixcbiAgICBcIlBJRF9OU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImxvY2tzX3Nob3dcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgbG9ja3Nfc2hvdygpYCBpbiBmcy9sb2Nrcy5jIHRvIHByb3Blcmx5IGZpbHRlciBPcGVuIEZpbGUgRGVzY3JpcHRpb24gKE9GRCkgbG9ja3Mgd2hlbiByZWFkaW5nIC9wcm9jL2xvY2tzIGZyb20gd2l0aGluIG5vbi1pbml0IFBJRCBuYW1lc3BhY2VzLiBUaGlzIGlzIGNvcmUgZmlsZXN5c3RlbSBsb2dpYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA5ZDA5OWEzM2Q2ODM4NmYxNDViZmE4M2E0Y2U0MmNlYjI2YzlkZmY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAwOToxNjoxMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jXG5pbmRleCA2ZTRmZjdmY2VjMDUzLi40YWYxMzg1NjgyZTRlIDEwMDY0NFxuLS0tIGEvZnMvbG9ja3MuY1xuKysrIGIvZnMvbG9ja3MuY1xuQEAgLTMwMjIsNiArMzAyMiwyNSBAQCBzdGF0aWMgaW50IGxvY2tzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxuIFxuIFx0Y3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7XG4gXG4rXHQvKlxuK1x0ICogT0ZEIGxvY2tzIGFyZSByZXBvcnRlZCB3aXRoIHBpZCAtMSwgc28gdGhlIGZpbHRlciBiZWxvdyBjYW5ub3Qgc2VlXG4rXHQgKiB0aGVpciBvd25lcjsgZmxjX3BpZCBob2xkcyB0aGUgb3duZXIgdGdpZCwgc28gZmlsdGVyIG9uIGl0LlxuK1x0ICogUmVtb3RlIGxvY2tzIGtlZXAgYSBuZWdhdGl2ZSBmbGNfcGlkIGFuZCBzdGF5IHZpc2libGUgYXMgYmVmb3JlLlxuK1x0ICovXG4rXHRpZiAoKGN1ci1cdTAwM2VmbGNfZmxhZ3MgXHUwMDI2IEZMX09GRExDSykgXHUwMDI2XHUwMDI2IGN1ci1cdTAwM2VmbGNfcGlkIFx1MDAzZSAwIFx1MDAyNlx1MDAyNlxuK1x0ICAgIHByb2NfcGlkbnMgIT0gXHUwMDI2aW5pdF9waWRfbnMpIHtcbitcdFx0c3RydWN0IHBpZCAqcGlkO1xuK1x0XHRib29sIHZpc2libGUgPSBmYWxzZTtcbitcbitcdFx0cmN1X3JlYWRfbG9jaygpO1xuK1x0XHRwaWQgPSBmaW5kX3BpZF9ucyhjdXItXHUwMDNlZmxjX3BpZCwgXHUwMDI2aW5pdF9waWRfbnMpO1xuK1x0XHRpZiAocGlkKVxuK1x0XHRcdHZpc2libGUgPSBwaWRfbnJfbnMocGlkLCBwcm9jX3BpZG5zKSAhPSAwO1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0aWYgKCF2aXNpYmxlKVxuK1x0XHRcdHJldHVybiAwO1xuK1x0fVxuK1xuIFx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuIFx0XHRyZXR1cm4gMDtcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjEzLjI0OTQ4MTU3NloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY0OTgzMTc5MTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBgZnMvbG9ja3MuY2AgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaCwgYW5kIG15IGZpcnN0IHN0ZXAgaXMgYWx3YXlzIHRvIHBpbnBvaW50IHRoZSBleGFjdCBsb2NhdGlvbi4gQWxyaWdodCwgdGhlIHBhdGNoIHRhcmdldHMgYGZzL2xvY2tzLmNgLiBHb29kLCB0aGF0IG5hcnJvd3MgdGhlIHNjb3BlIGNvbnNpZGVyYWJseS4gTm93LCBzaW5jZSBJIGRvbid0IGhhdmUgdGhlIHBhdGNoIGl0c2VsZiByaWdodCBpbiBmcm9udCBvZiBtZSwgSSBuZWVkIHRvIGdldCBteSBiZWFyaW5ncy4gSSdtIGdvaW5nIHRvIGNlbnRlciBteSBtZW50YWwgbW9kZWwgYXJvdW5kIGxpbmUgMzAyMiB3aXRoaW4gdGhhdCBmaWxlLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBpbW1lZGlhdGUgY29udGV4dCBJIG5lZWQgdG8gc3RhcnQgZm9ybWluZyBhIGNsZWFyIHBpY3R1cmUgb2Ygd2hhdCdzIGJlaW5nIG1vZGlmaWVkIGFuZCB3aHkuIEknbGwgbmVlZCB0byBjb25zaWRlciB3aGF0IGNvZGUgc3Vycm91bmRzIHRoYXQgbGluZS4gQXJlIHdlIGRlYWxpbmcgd2l0aCBtdXRleGVzLCBzcGlubG9ja3MsIG9yIHNvbWV0aGluZyBtb3JlIHNwZWNpYWxpemVkPyBVbmRlcnN0YW5kaW5nIHRoYXQgY29udGV4dCB3aWxsIGRpY3RhdGUgaG93IEkgYXBwcm9hY2ggdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIHRoZSBjaGFuZ2UuIFRpbWUgdG8gZ2V0IG15IG1lbnRhbCBjb21waWxlciBmaXJpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyNTksIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjE5Ljc0NzgwMTk3NloiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4Njg5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9sb2Nrcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMwMDAsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjMwMDA6XFx0XFxuMzAwMTpcXHRcXHQvKiBOVUxMIG5vZGUgb3Igcm9vdCBub2RlICovXFxuMzAwMjpcXHRcXHRpZiAobm9kZSA9PSBOVUxMIHx8IG5vZGUtXFx1MDAzZWZsY19ibG9ja2VyID09IE5VTEwpXFxuMzAwMzpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4zMDA0OlxcdFxcbjMwMDU6XFx0XFx0LyogTmV4dCBtZW1iZXIgaW4gdGhlIGxpbmtlZCBsaXN0IGNvdWxkIGJlIGl0c2VsZiAqL1xcbjMwMDY6XFx0XFx0dG1wID0gbGlzdF9uZXh0X2VudHJ5KG5vZGUsIGZsY19ibG9ja2VkX21lbWJlcik7XFxuMzAwNzpcXHRcXHRpZiAobGlzdF9lbnRyeV9pc19oZWFkKHRtcCwgXFx1MDAyNm5vZGUtXFx1MDAzZWZsY19ibG9ja2VyLVxcdTAwM2VmbGNfYmxvY2tlZF9yZXF1ZXN0cyxcXG4zMDA4OlxcdFxcdFxcdFxcdCAgICAgICBmbGNfYmxvY2tlZF9tZW1iZXIpXFxuMzAwOTpcXHRcXHRcXHR8fCB0bXAgPT0gbm9kZSkge1xcbjMwMTA6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuMzAxMTpcXHRcXHR9XFxuMzAxMjpcXHRcXG4zMDEzOlxcdFxcdHJldHVybiB0bXA7XFxuMzAxNDpcXHR9XFxuMzAxNTpcXHRcXG4zMDE2OlxcdHN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXFxuMzAxNzpcXHR7XFxuMzAxODpcXHRcXHRzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IgKml0ZXIgPSBmLVxcdTAwM2Vwcml2YXRlO1xcbjMwMTk6XFx0XFx0c3RydWN0IGZpbGVfbG9ja19jb3JlICpjdXIsICp0bXA7XFxuMzAyMDpcXHRcXHRzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcHJvY19waWRucyA9IHByb2NfcGlkX25zKGZpbGVfaW5vZGUoZi1cXHUwMDNlZmlsZSktXFx1MDAzZWlfc2IpO1xcbjMwMjE6XFx0XFx0aW50IGxldmVsID0gMDtcXG4zMDIyOlxcdFxcbjMwMjM6XFx0XFx0Y3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7XFxuMzAyNDpcXHRcXG4zMDI1OlxcdFxcdC8qXFxuMzAyNjpcXHRcXHQgKiBPRkQgbG9ja3MgYXJlIHJlcG9ydGVkIHdpdGggcGlkIC0xLCBzbyB0aGUgZmlsdGVyIGJlbG93IGNhbm5vdCBzZWVcXG4zMDI3OlxcdFxcdCAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuXFxuMzAyODpcXHRcXHQgKiBSZW1vdGUgbG9ja3Mga2VlcCBhIG5lZ2F0aXZlIGZsY19waWQgYW5kIHN0YXkgdmlzaWJsZSBhcyBiZWZvcmUuXFxuMzAyOTpcXHRcXHQgKi9cXG4zMDMwOlxcdFxcdGlmICgoY3VyLVxcdTAwM2VmbGNfZmxhZ3MgXFx1MDAyNiBGTF9PRkRMQ0spIFxcdTAwMjZcXHUwMDI2IGN1ci1cXHUwMDNlZmxjX3BpZCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjZcXG4zMDMxOlxcdFxcdCAgICBwcm9jX3BpZG5zICE9IFxcdTAwMjZpbml0X3BpZF9ucykge1xcbjMwMzI6XFx0XFx0XFx0c3RydWN0IHBpZCAqcGlkO1xcbjMwMzM6XFx0XFx0XFx0Ym9vbCB2aXNpYmxlID0gZmFsc2U7XFxuMzAzNDpcXHRcXG4zMDM1OlxcdFxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4zMDM2OlxcdFxcdFxcdHBpZCA9IGZpbmRfcGlkX25zKGN1ci1cXHUwMDNlZmxjX3BpZCwgXFx1MDAyNmluaXRfcGlkX25zKTtcXG4zMDM3OlxcdFxcdFxcdGlmIChwaWQpXFxuMzAzODpcXHRcXHRcXHRcXHR2aXNpYmxlID0gcGlkX25yX25zKHBpZCwgcHJvY19waWRucykgIT0gMDtcXG4zMDM5OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbjMwNDA6XFx0XFx0XFx0aWYgKCF2aXNpYmxlKVxcbjMwNDE6XFx0XFx0XFx0XFx0cmV0dXJuIDA7XFxuMzA0MjpcXHRcXHR9XFxuMzA0MzpcXHRcXG4zMDQ0OlxcdFxcdGlmIChsb2Nrc190cmFuc2xhdGVfcGlkKGN1ciwgcHJvY19waWRucykgPT0gMClcXG4zMDQ1OlxcdFxcdFxcdHJldHVybiAwO1xcbjMwNDY6XFx0XFxuMzA0NzpcXHRcXHQvKiBWaWV3IHRoaXMgY3Jvc3NlZCBsaW5rZWQgbGlzdCBhcyBhIGJpbmFyeSB0cmVlLCB0aGUgZmlyc3QgbWVtYmVyIG9mIGZsY19ibG9ja2VkX3JlcXVlc3RzXFxuMzA0ODpcXHRcXHQgKiBpcyB0aGUgbGVmdCBjaGlsZCBvZiBjdXJyZW50IG5vZGUsIHRoZSBuZXh0IHNpbGliaW5nIGluIGZsY19ibG9ja2VkX21lbWJlciBpcyB0aGVcXG4zMDQ5OlxcdFxcdCAqIHJpZ2h0IGNoaWxkLCB3ZSBjYW4gYWxzZSBnZXQgdGhlIHBhcmVudCBvZiBjdXJyZW50IG5vZGUgZnJvbSBmbGNfYmxvY2tlciwgc28gdGhpc1xcbjMwNTA6XFx0XFx0ICogcXVlc3Rpb24gYmVjb21lcyB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZVxcbjMwNTE6XFx0XFx0ICovXFxuMzA1MjpcXHRcXHR3aGlsZSAoY3VyICE9IE5VTEwpIHtcXG4zMDUzOlxcdFxcdFxcdGlmIChsZXZlbClcXG4zMDU0OlxcdFxcdFxcdFxcdGxvY2tfZ2V0X3N0YXR1cyhmLCBjdXIsIGl0ZXItXFx1MDAzZWxpX3BvcywgXFxcIi1cXHUwMDNlIFxcXCIsIGxldmVsKTtcXG4zMDU1OlxcdFxcdFxcdGVsc2VcXG4zMDU2OlxcdFxcdFxcdFxcdGxvY2tfZ2V0X3N0YXR1cyhmLCBjdXIsIGl0ZXItXFx1MDAzZWxpX3BvcywgXFxcIlxcXCIsIGxldmVsKTtcXG4zMDU3OlxcdFxcbjMwNTg6XFx0XFx0XFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZjdXItXFx1MDAzZWZsY19ibG9ja2VkX3JlcXVlc3RzKSkge1xcbjMwNTk6XFx0XFx0XFx0XFx0LyogVHVybiBsZWZ0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjE5Ljc0Nzk5MDgwNloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMzODQ3NjQzNTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKkFuYWx5emluZyBgbG9ja3Nfc2hvd2AgaW4gYGZzL2xvY2tzLmNgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgYGxvY2tzX3Nob3dgIGZ1bmN0aW9uIGlzIGRvaW5nLCBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBgZnMvbG9ja3MuY2AgZmlsZS4gVGhpcyBzdWdnZXN0cyBpdCdzIGxpa2VseSBpbnZvbHZlZCBpbiBkaXNwbGF5aW5nIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZmlsZSBsb2Nrcy4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJJ20gYWxyZWFkeSBmb3JtdWxhdGluZyBzb21lIGh5cG90aGVzZXMuIEl0IGNvdWxkIGJlIGZvciBkZWJ1Z2dpbmcsIHN5c3RlbSBtb25pdG9yaW5nLCBtYXliZSBldmVuIHVzZXItbGV2ZWwgdmlzaWJpbGl0eSBpbnRvIGhlbGQgbG9ja3MuIEknbGwgYmUgbG9va2luZyBmb3IgY2x1ZXMgaW4gaXRzIGZ1bmN0aW9uIHNpZ25hdHVyZSwgd2hhdCBkYXRhIHN0cnVjdHVyZXMgaXQgYWNjZXNzZXMsIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIGtlcm5lbCdzIGxvY2sgbWFuYWdlbWVudCBzdWJzeXN0ZW1zLiBJJ2xsIGJlIGZvY3VzZWQgb24gaG93IGl0IHByZXNlbnRzIHRoaXMgbG9jayBpbmZvcm1hdGlvbi4gSSBleHBlY3QgSSdsbCBiZSBxdWlja2x5IHBhcnNpbmcgdGhlIGZ1bmN0aW9uJ3MgY29kZSB0byBkZXRlcm1pbmUgdGhlIGRhdGEgaXQgYWNjZXNzZXMsIGZvcm1hdHMsIGFuZCBpZiB0aGVyZSBhcmUgYW55IG9idmlvdXMgcGVyZm9ybWFuY2UgY29uY2VybnMuIEtub3dpbmcgdGhlIGNvbnRleHQgd2l0aGluIHRoZSBrZXJuZWwgaXMgcGFyYW1vdW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjozNTA2LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjoyMy4xMzI3NjIxMjVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDg0NDczOTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibG9ja3Nfc2hvd1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9sb2Nrcy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2xvY2tzLmM9Mjk5Nz1zdGF0aWMgc3RydWN0IGZpbGVfbG9ja19jb3JlICpnZXRfbmV4dF9ibG9ja2VkX21lbWJlcihzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKm5vZGUpXFxuLS1cXG5mcy9sb2Nrcy5jLTMwMTUtXFxuZnMvbG9ja3MuYzozMDE2OnN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXFxuZnMvbG9ja3MuYy0zMDE3LXtcXG4tLVxcbmZzL2xvY2tzLmM9MzE0Mz1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxvY2tzX3NlcV9vcGVyYXRpb25zID0ge1xcbi0tXFxuZnMvbG9ja3MuYy0zMTQ2LVxcdC5zdG9wXFx0PSBsb2Nrc19zdG9wLFxcbmZzL2xvY2tzLmM6MzE0NzpcXHQuc2hvd1xcdD0gbG9ja3Nfc2hvdyxcXG5mcy9sb2Nrcy5jLTMxNDgtfTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6MjMuMTgxMjE1NDczWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjMxNjYxMTg3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipUcmFjaW5nIHRoZSBSZWdpc3RyYXRpb24gb2YgYGxvY2tzX3NlcV9vcGVyYXRpb25zYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoZXJlIGBsb2Nrc19zZXFfb3BlcmF0aW9uc2AgaXMgYWN0dWFsbHkgYmVpbmcgcmVnaXN0ZXJlZC4gSXQncyB0aGF0IGNyaXRpY2FsIHBvaW50IG9mIGluaXRpYWxpemF0aW9uIHRoYXQgSSdtIGFmdGVyLCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdyB0aGF0IGhhcHBlbnMgKmJlZm9yZSogYW55IG9mIHRoZSBsb2NrcyBhcmUgdXNlZC4gSSBjb3VsZCBtYW51YWxseSBsb29rIHRocm91Z2ggdGhlIHNvdXJjZSB0cmVlLCBidXQgdGhhdCBmZWVscyBpbmVmZmljaWVudCBhbmQgZXJyb3ItcHJvbmUsIGVzcGVjaWFsbHkgd2l0aCBhbGwgdGhlIGFic3RyYWN0aW9uIGxheWVycy4gSSBuZWVkIHRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIHBvaW50IG9mIHJlZ2lzdHJhdGlvbi4gVGhpcyBsaWtlbHkgaW52b2x2ZXMgc29tZSBmb3JtIG9mIG1hY3JvIG9yIGZ1bmN0aW9uIHBvaW50ZXIgdGFibGUuIEknbSB0aGlua2luZyBhIHN0YXRpYyBhbmFseXNpcyBhcHByb2FjaCBpcyBwcm9iYWJseSB0aGUgYmVzdC4gSSdsbCBuZWVkIHRvIGtub3cgd2hlcmUgaXQncyBkZWZpbmVkIGFuZCBob3cgdGhhdCdzIGJlaW5nIHVzZWQuIEkgd2lsbCBsb29rIGZvciBob3cgdGhhdCBzdHJ1Y3QgaXMgYmVpbmcgcmVmZXJlbmNlZC4gSXQncyB2ZXJ5IGxpa2VseSwgZ2l2ZW4gdGhlIG5hbWluZyBjb252ZW50aW9uLCB0aGF0IGl0J3MgcGFydCBvZiBzb21lIGdsb2JhbCBzdHJ1Y3R1cmUsIG9yIHBhc3NlZCB0byBzb21lIGluaXQgZnVuY3Rpb24uIFRoZSBnb2FsIGlzIHRvIHF1aWNrbHkgZmluZCB0aGUga2V5IGZ1bmN0aW9uIG9yIGRhdGEgc3RydWN0dXJlIHJlc3BvbnNpYmxlIGZvciBiaW5kaW5nIHRoYXQgYGxvY2tzX3NlcV9vcGVyYXRpb25zYCBzdHJ1Y3R1cmUuIFRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBkaXZlIGludG8gdGhlIGNhbGwgc2l0ZXMgb2YgdGhhdCBzdHJ1Y3R1cmUsIHNvIEkgY2FuIHVuZGVyc3RhbmQgdGhlIG9yZGVyIGFuZCBzZXR1cCBvZiB0aGUgb3BlcmF0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzkzNiwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjI1LjQ5NzgzMDExN1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MTkwMDAwNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJsb2Nrc19zZXFfb3BlcmF0aW9uc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvbG9ja3MuYz0zMTM2PXN0YXRpYyB2b2lkIGxvY2tzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxcbi0tXFxuZnMvbG9ja3MuYy0zMTQyLVxcbmZzL2xvY2tzLmM6MzE0MzpzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxvY2tzX3NlcV9vcGVyYXRpb25zID0ge1xcbmZzL2xvY2tzLmMtMzE0NC1cXHQuc3RhcnRcXHQ9IGxvY2tzX3N0YXJ0LFxcbi0tXFxuZnMvbG9ja3MuYz0zMTUwPXN0YXRpYyBpbnQgX19pbml0IHByb2NfbG9ja3NfaW5pdCh2b2lkKVxcbmZzL2xvY2tzLmMtMzE1MS17XFxuZnMvbG9ja3MuYzozMTUyOlxcdHByb2NfY3JlYXRlX3NlcV9wcml2YXRlKFxcXCJsb2Nrc1xcXCIsIDAsIE5VTEwsIFxcdTAwMjZsb2Nrc19zZXFfb3BlcmF0aW9ucyxcXG5mcy9sb2Nrcy5jLTMxNTMtXFx0XFx0XFx0c2l6ZW9mKHN0cnVjdCBsb2Nrc19pdGVyYXRvciksIE5VTEwpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjoyNS41Njk3MzgyNTRaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2OTg2NTkyMzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBgL3Byb2MvbG9ja3NgIGFuZCBPRkQgTG9ja3MgaW4gYSBOYW1lc3BhY2VkIENvbnRleHQqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgL3Byb2MvbG9ja3NgIGhlcmUsIHNwZWNpZmljYWxseSBpbiBhIHNjZW5hcmlvIHdoZXJlIHdlIGhhdmUgT0ZEIGxvY2tzIHRoYXQgc3BhbiBkaWZmZXJlbnQgUElEIG5hbWVzcGFjZXMuIFRoZSBxdWVzdGlvbiBpczogaXMgdGhpcyBhIHBvdGVudGlhbCBhdHRhY2sgc3VyZmFjZSB3b3J0aCBpbnZlc3RpZ2F0aW5nIHdpdGggZnV6emluZz8gTGV0J3MgYnJlYWsgaXQgZG93biBhbmQgc2VlLlxuXG5UaGUgc3RhcnRpbmcgcG9pbnQgaXMgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgcGF0Y2ggZG9lcywgcmlnaHQ/IEVzc2VudGlhbGx5LCBpdCdzIGFib3V0IGhvdyB0aGUga2VybmVsIHJlcG9ydHMgT0ZEIGxvY2tzIHdpdGhpbiBgL3Byb2MvbG9ja3NgLiBXaGVuIGAvcHJvYy9sb2Nrc2AgaXMgcmVhZCwgdGhlIGBsb2Nrc19zaG93KClgIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwbGF5aW5nIHRoZSBsb2NrIGluZm9ybWF0aW9uLiBOb3csIHRoZSBjcnV4IG9mIHRoZSBpc3N1ZSB3aXRoIE9GRCBsb2NrcyBpcyB0aGF0IHRoZXkncmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IsIG5vdCB0aGUgUElEIGRpcmVjdGx5LiBTbywgd2hlbiB0aGUgb3V0cHV0IG5lZWRzIGEgUElELCBpdCByZXBvcnRzIC0xLCBidXQgaW4gdGhlIGtlcm5lbCdzIGludGVybmFsIHJlcHJlc2VudGF0aW9uLCBgZmxjX3BpZGAgaG9sZHMgdGhlIG93bmluZyB0aHJlYWQgZ3JvdXAgSUQgKHRnaWQpLlxuXG5UaGUgY29kZSB1c2VkIGBsb2Nrc190cmFuc2xhdGVfcGlkYCB0byByZXNvbHZlIHRoZSBQSUQsIHNvIG15IG5leHQgc3RlcCBpcyB0byBsb29rIGF0IHdoYXQgdGhhdCBmdW5jdGlvbiBkb2VzLiBUaGF0J3Mgd2hlcmUgdGhlIHJlYWwgZGV0YWlsIHdpbGwgbGlrZWx5IGJlLiBUaGF0IGlzIHdoZXJlIEkgY2FuIGFuYWx5emUgdGhlIGJlaGF2aW91ciBhbmQgZGVjaWRlIGlmIHRoaXMgaXMgYSBnb29kIGF0dGFjayBzdXJmYWNlIHRvIGV4cGxvaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ0MzIsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6MzIuNTU2MzMzNzQzWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MzE4MTc3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJsb2Nrc190cmFuc2xhdGVfcGlkXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2xvY2tzLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvbG9ja3MuYz0yMzY1PUVYUE9SVF9TWU1CT0xfR1BMKHZmc190ZXN0X2xvY2spO1xcbi0tXFxuZnMvbG9ja3MuYy0yMzY3LS8qKlxcbmZzL2xvY2tzLmM6MjM2ODogKiBsb2Nrc190cmFuc2xhdGVfcGlkIC0gdHJhbnNsYXRlIGEgZmlsZV9sb2NrJ3MgZmxfcGlkIG51bWJlciBpbnRvIGEgbmFtZXNwYWNlXFxuZnMvbG9ja3MuYy0yMzY5LSAqIEBmbDogVGhlIGZpbGVfbG9jayB3aG8ncyBmbF9waWQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcXG4tLVxcbmZzL2xvY2tzLmMtMjM3My0gKi9cXG5mcy9sb2Nrcy5jOjIzNzQ6c3RhdGljIHBpZF90IGxvY2tzX3RyYW5zbGF0ZV9waWQoc3RydWN0IGZpbGVfbG9ja19jb3JlICpmbCwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKVxcbmZzL2xvY2tzLmMtMjM3NS17XFxuLS1cXG5mcy9sb2Nrcy5jPTI0MDE9c3RhdGljIGludCBwb3NpeF9sb2NrX3RvX2Zsb2NrKHN0cnVjdCBmbG9jayAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxcbmZzL2xvY2tzLmMtMjQwMi17XFxuZnMvbG9ja3MuYzoyNDAzOlxcdGZsb2NrLVxcdTAwM2VsX3BpZCA9IGxvY2tzX3RyYW5zbGF0ZV9waWQoXFx1MDAyNmZsLVxcdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xcbmZzL2xvY2tzLmMtMjQwNC0jaWYgQklUU19QRVJfTE9ORyA9PSAzMlxcbi0tXFxuZnMvbG9ja3MuYz0yNDIzPXN0YXRpYyB2b2lkIHBvc2l4X2xvY2tfdG9fZmxvY2s2NChzdHJ1Y3QgZmxvY2s2NCAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxcbmZzL2xvY2tzLmMtMjQyNC17XFxuZnMvbG9ja3MuYzoyNDI1OlxcdGZsb2NrLVxcdTAwM2VsX3BpZCA9IGxvY2tzX3RyYW5zbGF0ZV9waWQoXFx1MDAyNmZsLVxcdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xcbmZzL2xvY2tzLmMtMjQyNi1cXHRmbG9jay1cXHUwMDNlbF9zdGFydCA9IGZsLVxcdTAwM2VmbF9zdGFydDtcXG4tLVxcbmZzL2xvY2tzLmM9MjkyMT1zdGF0aWMgdm9pZCBsb2NrX2dldF9zdGF0dXMoc3RydWN0IHNlcV9maWxlICpmLCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsYyxcXG4tLVxcbmZzL2xvY2tzLmMtMjkyOS1cXG5mcy9sb2Nrcy5jOjI5MzA6XFx0cGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChmbGMsIHByb2NfcGlkbnMpO1xcbmZzL2xvY2tzLmMtMjkzMS1cXG4tLVxcbmZzL2xvY2tzLmM9MzAxNj1zdGF0aWMgaW50IGxvY2tzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxcbi0tXFxuZnMvbG9ja3MuYy0zMDQzLVxcbmZzL2xvY2tzLmM6MzA0NDpcXHRpZiAobG9ja3NfdHJhbnNsYXRlX3BpZChjdXIsIHByb2NfcGlkbnMpID09IDApXFxuZnMvbG9ja3MuYy0zMDQ1LVxcdFxcdHJldHVybiAwO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjozMi42MTk1MjMxNVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTk4MzA5NjgxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyB0aGUgYGxvY2tzX3RyYW5zbGF0ZV9waWRgIEltcGxlbWVudGF0aW9uKipcblxuT2theSwgdGltZSB0byBkaXZlIGludG8gYGxvY2tzX3RyYW5zbGF0ZV9waWRgLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoaXMgc3BlY2lmaWMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYW5kIHdoZXJlIGl0IHNpdHMgaW4gdGhlIGxhcmdlciBsb2NraW5nIHNjaGVtZS4gSXQncyBjcnVjaWFsLCBvYnZpb3VzbHksIGJlY2F1c2UgaWYgd2UncmUgZGVhbGluZyB3aXRoIFBJRCB0cmFuc2xhdGlvbiB3aXRoaW4gdGhlIGxvY2sgaGllcmFyY2h5LCB0aGVyZSBjb3VsZCBiZSBzdWJ0bGUgcmFjZSBjb25kaXRpb25zIG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3JzIEkgbmVlZCB0byBiZSBhd2FyZSBvZi4gSSdsbCBuZWVkIHRvIGNvbnNpZGVyIHRoaW5ncyBsaWtlOiB3aGF0IGFyZSB0aGUgY29uY3VycmVuY3kgcHJpbWl0aXZlcyBiZWluZyB1c2VkPyBBcmUgdGhlcmUgcG90ZW50aWFsIGRlYWRsb2NrcywgYW5kIGlmIHNvLCB1bmRlciB3aGF0IGNvbmRpdGlvbnM/IEhvdyBkb2VzIHRoaXMgZnVuY3Rpb24gaGFuZGxlIGRpZmZlcmVudCBQSUQgbmFtZXNwYWNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcz8gSXMgdGhlcmUgYW55dGhpbmcgdW51c3VhbCBhYm91dCB0aGUgYWxnb3JpdGhtIGl0IHVzZXMsIG9yIGlzIGl0IGEgZmFpcmx5IHN0YW5kYXJkIHRyYW5zbGF0aW9uIGxvZ2ljPyBJJ2xsIHByb2JhYmx5IHN0YXJ0IGJ5IHF1aWNrbHkgZ2xhbmNpbmcgYXQgdGhlIHNvdXJjZSBjb2RlIHRvIGdldCBhIGhpZ2gtbGV2ZWwgdmlldywgdGhlbiB6b29tIGluIG9uIGFueSBhcmVhcyB0aGF0IHNlZW0gY29tcGxleCBvciBwb3RlbnRpYWxseSBwcm9ibGVtYXRpYy4gU3BlY2lmaWNhbGx5LCBJJ2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGxvY2sgYWNxdWlzaXRpb24vcmVsZWFzZSBvcmRlciBhbmQgdGhlIGF0b21pYyBvcGVyYXRpb25zIGludm9sdmVkLiBJIG1pZ2h0IGFsc28gd2FudCB0byBjb25zdWx0IHRoZSByZWxldmFudCBkZXNpZ24gZG9jdW1lbnRzIG9yIGNvbW1lbnRzIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGtub3duIGNhdmVhdHMgb3IgcGVyZm9ybWFuY2UgY29uc2lkZXJhdGlvbnMgdG8ga2VlcCBpbiBtaW5kLiBMZXQncyBzZWUuLi5cblxuXG4iLCJJbnB1dFRva2VucyI6NTQ5MCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjM1LjIxNzgzNTE2MloiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjk3NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvbG9ja3MuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMzcwLFxuICBcIkxpbmVDb3VudFwiOiAzNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMzcwOlxcdCAqIEBuczogVGhlIG5hbWVzcGFjZSBpbnRvIHdoaWNoIHRoZSBwaWQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcXG4yMzcxOlxcdCAqXFxuMjM3MjpcXHQgKiBVc2VkIHRvIHRyYW5zbGF0ZSBhIGZsX3BpZCBpbnRvIGEgbmFtZXNwYWNlIHZpcnR1YWwgcGlkIG51bWJlclxcbjIzNzM6XFx0ICovXFxuMjM3NDpcXHRzdGF0aWMgcGlkX3QgbG9ja3NfdHJhbnNsYXRlX3BpZChzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpXFxuMjM3NTpcXHR7XFxuMjM3NjpcXHRcXHRwaWRfdCB2bnI7XFxuMjM3NzpcXHRcXHRzdHJ1Y3QgcGlkICpwaWQ7XFxuMjM3ODpcXHRcXG4yMzc5OlxcdFxcdGlmIChmbC1cXHUwMDNlZmxjX2ZsYWdzIFxcdTAwMjYgRkxfT0ZETENLKVxcbjIzODA6XFx0XFx0XFx0cmV0dXJuIC0xO1xcbjIzODE6XFx0XFxuMjM4MjpcXHRcXHQvKiBSZW1vdGUgbG9ja3MgcmVwb3J0IGEgbmVnYXRpdmUgcGlkIHZhbHVlICovXFxuMjM4MzpcXHRcXHRpZiAoZmwtXFx1MDAzZWZsY19waWQgXFx1MDAzYz0gMClcXG4yMzg0OlxcdFxcdFxcdHJldHVybiBmbC1cXHUwMDNlZmxjX3BpZDtcXG4yMzg1OlxcdFxcbjIzODY6XFx0XFx0LypcXG4yMzg3OlxcdFxcdCAqIElmIHRoZSBmbG9jayBvd25lciBwcm9jZXNzIGlzIGRlYWQgYW5kIGl0cyBwaWQgaGFzIGJlZW4gYWxyZWFkeVxcbjIzODg6XFx0XFx0ICogZnJlZWQsIHRoZSB0cmFuc2xhdGlvbiBiZWxvdyB3b24ndCB3b3JrLCBidXQgd2Ugc3RpbGwgd2FudCB0byBzaG93XFxuMjM4OTpcXHRcXHQgKiBmbG9jayBvd25lciBwaWQgbnVtYmVyIGluIGluaXQgcGlkbnMuXFxuMjM5MDpcXHRcXHQgKi9cXG4yMzkxOlxcdFxcdGlmIChucyA9PSBcXHUwMDI2aW5pdF9waWRfbnMpXFxuMjM5MjpcXHRcXHRcXHRyZXR1cm4gKHBpZF90KSBmbC1cXHUwMDNlZmxjX3BpZDtcXG4yMzkzOlxcdFxcbjIzOTQ6XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbjIzOTU6XFx0XFx0cGlkID0gZmluZF9waWRfbnMoZmwtXFx1MDAzZWZsY19waWQsIFxcdTAwMjZpbml0X3BpZF9ucyk7XFxuMjM5NjpcXHRcXHR2bnIgPSBwaWRfbnJfbnMocGlkLCBucyk7XFxuMjM5NzpcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4yMzk4OlxcdFxcdHJldHVybiB2bnI7XFxuMjM5OTpcXHR9XFxuMjQwMDpcXHRcXG4yNDAxOlxcdHN0YXRpYyBpbnQgcG9zaXhfbG9ja190b19mbG9jayhzdHJ1Y3QgZmxvY2sgKmZsb2NrLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbClcXG4yNDAyOlxcdHtcXG4yNDAzOlxcdFxcdGZsb2NrLVxcdTAwM2VsX3BpZCA9IGxvY2tzX3RyYW5zbGF0ZV9waWQoXFx1MDAyNmZsLVxcdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xcbjI0MDQ6XFx0I2lmIEJJVFNfUEVSX0xPTkcgPT0gMzJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6MzUuMjE3OTY2NDIyWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUyMDczMjIxNDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIGAvcHJvYy9sb2Nrc2AgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5vdGljZWQgdGhpcyBwYXRjaCBkZWFscyB3aXRoIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBhbmQgaG93IGl0IGhhbmRsZXMgYEZMX09GRExDS2AgbG9ja3MuIEkgc2VlIHRoYXQsIHByZXZpb3VzbHksIGBsb2Nrc190cmFuc2xhdGVfcGlkYCByZXR1cm5lZCAtMSBmb3IgT0ZETENLLCB3aGljaCB3YXMgcHJvYmxlbWF0aWMgYmVjYXVzZSBpdCBieXBhc3NlZCB0aGUgZXhpc3RpbmcgY2hlY2sgaW4gYGxvY2tzX3Nob3dgLiBUaGlzIG1lYW50IE9GRExDSyBsb2NrcyB3ZXJlIGFsd2F5cyBzaG93aW5nIHVwIGluIGAvcHJvYy9sb2Nrc2AsIGV2ZW4gaWYgdGhlIG93bmluZyBQSUQgd2Fzbid0IHZpc2libGUgaW4gdGhlIGN1cnJlbnQgUElEIG5hbWVzcGFjZeKAlGVmZmVjdGl2ZWx5IGRpc3BsYXlpbmcgYSBsb2NrIGJlbG9uZ2luZyB0byBQSUQgMC4gVGhhdCdzIGEgZGVmaW5pdGUgYnVnLlxuXG5UaGUgcGF0Y2ggaXRzZWxmIGFkZHJlc3NlcyB0aGlzLiBJdCBhZGRzIGEgY3J1Y2lhbCBjaGVjayB3aXRoaW4gYGxvY2tzX3Nob3dgIHRvIGZpbHRlciBPRkQgbG9ja3MuIE5vdywgaWYgdGhlIGxvY2sgaXMgYW4gT0ZEIGxvY2sgKGBGTF9PRkRMQ0tgKSAqYW5kKiBoYXMgYSBQSUQgZ3JlYXRlciB0aGFuIHplcm8sICphbmQqIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBpc24ndCB0aGUgaW5pdGlhbCBQSUQgbmFtZXNwYWNlLCBpdCBzcGVjaWZpY2FsbHkgdmVyaWZpZXMgaWYgdGhlIFBJRCBpcyBhY3R1YWxseSB2aXNpYmxlIHdpdGhpbiB0aGUgY3VycmVudCBgcHJvY19waWRuc2AuIElmIGl0J3MgKm5vdCogdmlzaWJsZSwgaXQgcmV0dXJucyAwLCBlc3NlbnRpYWxseSBoaWRpbmcgdGhhdCBsb2NrIGVudHJ5IGZyb20gYC9wcm9jL2xvY2tzYC4gVGhhdCdzIGEgY2xlYW4sIHRhcmdldGVkIGZpeC5cblxuTm93LCB0aGUgcmVhbCBxdWVzdGlvbiBpczogSXMgdGhpcyBwYXRjaCBmdXp6LXdvcnRoeT8gTGV0J3MgY2hlY2sgdGhlIGNyaXRlcmlhLiBJdCBzcGVjaWZpY2FsbHkgc2F5cyB0byAqbm90KiBmdXp6IGlmIHRoZSBjaGFuZ2VzIGFyZSBkb2N1bWVudGF0aW9uLCBjb21tZW50cywgZGVjb3JhdGl2ZSBsb2dnaW5nLCBjb25zdGFudCBjaGFuZ2VzIHRoYXQgZG9uJ3QgYWx0ZXIgZXhlY3V0aW9uLCB1bnJlYWNoYWJsZSBjb2RlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgdmVuZG9yLXNwZWNpZmljIGhhcmR3YXJlIGRyaXZlcnMgdGhhdCBhcmUgdW5hdmFpbGFibGUgaW4gdmlydHVhbGl6YXRpb24sIGFuZCB0ZWFyZG93biBjYWxsYmFja3MuXG5cblRoaXMgcGF0Y2gsIGhvd2V2ZXIsICoqYWJzb2x1dGVseSoqIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy4gSXQgdG91Y2hlcyB0aGUgYC9wcm9jL2xvY2tzYCBmaWxlLCB3aGljaCBpcyBhIGtleSBjb21wb25lbnQgZm9yIHRyYWNpbmcgYW5kIG1vbml0b3JpbmcgZmlsZSBsb2Nrcy4gUmVhZGluZyBvciBvcGVuaW5nIGAvcHJvYy9sb2Nrc2AgdXNpbmcgYHJlYWQoKWAsIGBzZXFfcmVhZGAsIG9yIGBmY250bChmZCwgRl9PRkRfU0VUTEssIC4uLilgIGlzIGNvbXBsZXRlbHkgYWNoaWV2YWJsZSBmcm9tIHVzZXJzcGFjZSBpbiAqYW55KiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudC4gVGhpcyBpcyBhY2Nlc3NpYmxlIGFuZCByZXByZXNlbnRzIGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgaXMgaGlnaGx5IHJlbGV2YW50IHRvIHR5cGljYWwgdXNhZ2UsIGV2ZW4gaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgUUVNVSBvciBHQ0UuXG5cblRoZXJlZm9yZSwgKnllcyosIEkgdGhpbmsgdGhpcyBpcyBhIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSBuZWVkIHRvIG5vdyBkZXRlcm1pbmUgdGhlIGJlc3QgYEZvY3VzU3ltYm9sc2AgYW5kIGBFbmFibGVDb25maWdzYCB0byBtYXhpbWl6ZSBjb3ZlcmFnZSBhbmQgZWZmZWN0aXZlbmVzcy4gSSdsbCBuZWVkIHRvIGRpZyBpbnRvIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbnMgYW5kIGhvdyBgZnMvbG9ja3MuY2AgYW5kIGAvcHJvYy9sb2Nrc2AgYXJlIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgYW4gZWZmZWN0aXZlIGZ1enppbmcgY2FtcGFpZ24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYzNTAsIk91dHB1dFRva2VucyI6MjUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MDEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo0MC40MjUyOTEzMzZaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3NjA5MjQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImxvY2tzXFxcXC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9NYWtlZmlsZT0zMz1vYmotJChDT05GSUdfRlNfVkVSSVRZKVxcdFxcdCs9IHZlcml0eS9cXG5mcy9NYWtlZmlsZTozNDpvYmotJChDT05GSUdfRklMRV9MT0NLSU5HKSAgICAgICs9IGxvY2tzLm9cXG5mcy9NYWtlZmlsZS0zNS1vYmotJChDT05GSUdfQklORk1UX01JU0MpXFx0Kz0gYmluZm10X21pc2Mub1xcbi0tXFxuZnMvY2VwaC9NYWtlZmlsZT02PW9iai0kKENPTkZJR19DRVBIX0ZTKSArPSBjZXBoLm9cXG5mcy9jZXBoL01ha2VmaWxlLTctXFxuZnMvY2VwaC9NYWtlZmlsZTo4OmNlcGgteSA6PSBzdXBlci5vIGlub2RlLm8gZGlyLm8gZmlsZS5vIGxvY2tzLm8gYWRkci5vIGlvY3RsLm8gXFxcXFxcbmZzL2NlcGgvTWFrZWZpbGUtOS1cXHRleHBvcnQubyBjYXBzLm8gc25hcC5vIHhhdHRyLm8gcXVvdGEubyBpby5vIFxcXFxcXG4tLVxcbmZzL29jZnMyL01ha2VmaWxlPTExPW9jZnMyLW9ianMgOj0gXFxcXFxcbi0tXFxuZnMvb2NmczIvTWFrZWZpbGUtMjYtXFx0bG9jYWxhbGxvYy5vIFxcdFxcdFxcXFxcXG5mcy9vY2ZzMi9NYWtlZmlsZToyNzpcXHRsb2Nrcy5vXFx0XFx0XFx0XFxcXFxcbmZzL29jZnMyL01ha2VmaWxlLTI4LVxcdG1tYXAubyBcXHRcXHRcXHRcXFxcXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjQwLjUwMjkwNTQ0MloiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTA4NDI0MzMzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipLY29uZmlnIERpdmU6IGBDT05GSUdfRklMRV9MT0NLSU5HYCoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IGFuZCB0cmFjayBkb3duIGBDT05GSUdfRklMRV9MT0NLSU5HYC4gSSdtIGdvaW5nIHRvIHN0YXJ0IGJ5IGdyZXBwaW5nIHRoZSBLY29uZmlnIGZpbGVzLiBUaGlzIG9uZSdzIGltcG9ydGFudDsgZmlsZSBsb2NraW5nIGNhbiBoYXZlIHNpZ25pZmljYW50IGltcGxpY2F0aW9ucyBmb3IgZmlsZXN5c3RlbSBjb25jdXJyZW5jeSBhbmQgZGF0YSBpbnRlZ3JpdHksIGRlcGVuZGluZyBvbiBob3cgaXQncyBpbXBsZW1lbnRlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHNjb3BlIGFuZCBkZXBlbmRlbmNpZXMuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGFkdmlzb3J5IGxvY2tzLCBtYW5kYXRvcnkgbG9ja3MsIG9yIHNvbWV0aGluZyBtb3JlIG51YW5jZWQ/IFdoYXQgZmlsZXN5c3RlbXMgYXJlIGFmZmVjdGVkPyBIb3cgaXMgdGhpcyBmZWF0dXJlICphY3R1YWxseSogYmVpbmcgdXNlZCwgYW5kIHdoYXQgYXJlIHRoZSBhcmd1bWVudHMgZm9yIGFuZCBhZ2FpbnN0IGl0cyBwcmVzZW5jZSBvciBhYnNlbmNlIGluIGRpZmZlcmVudCBjb250ZXh0cz8gSXQncyBnb2luZyB0byBiZSBpbnRlcmVzdGluZyB0byBzZWUgaG93IHRoaXMgaXMgY29uZmlndXJlZCBhbmQgd2hlcmUgaXQgc2l0cyBpbiB0aGUgYnJvYWRlciBmZWF0dXJlIHNldC4gVGltZSB0byBkaWcgaW4gYW5kIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzc1OSwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjQyLjYxMTMzMTczNVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzQ4NTc0MTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEZJTEVfTE9DS0lOR1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvS2NvbmZpZz0xMDg9Y29uZmlnIEVYUE9SVEZTX0JMT0NLX09QU1xcbi0tXFxuZnMvS2NvbmZpZy0xMTMtXFxuZnMvS2NvbmZpZzoxMTQ6Y29uZmlnIEZJTEVfTE9DS0lOR1xcbmZzL0tjb25maWctMTE1LVxcdGJvb2wgXFxcIkVuYWJsZSBQT1NJWCBmaWxlIGxvY2tpbmcgQVBJXFxcIiBpZiBFWFBFUlRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6NDIuNjg2MTkyNzMyWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyNDI1NTMzMDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIEtjb25maWcgZm9yIEZpbGUgU3lzdGVtIERlcGVuZGVuY2llcyoqXG5cbk9rYXksIHNvIEknbSB0cnlpbmcgdG8gZmlndXJlIG91dCBzb21lIHNwZWNpZmljcyB3aXRoaW4gdGhlIGZpbGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBjaGVjayBgZnMvS2NvbmZpZ2AuIFRoYXQncyB1c3VhbGx5IHRoZSBnby10byBzcG90IGZvciBmaWxlIHN5c3RlbS1yZWxhdGVkIG9wdGlvbnMgYW5kIGRlcGVuZGVuY2llcy4gU3BlY2lmaWNhbGx5LCBJJ2xsIHN0YXJ0IGFyb3VuZCBsaW5lIDExNC4gSSdtIGV4cGVjdGluZyB0byBmaW5kIGVpdGhlciBkaXJlY3QgZGVwZW5kZW5jaWVzIHRoYXQgbWlnaHQgc2hlZCBsaWdodCBvbiB0aGlzIGlzc3VlLCBvciBwZXJoYXBzIHNvbWUgaW5kaXJlY3QgZGVwZW5kZW5jaWVzIHRocm91Z2ggb3RoZXIgY29uZmlnIHN5bWJvbHMuIEl0J3MgYSBzb2xpZCBmaXJzdCBzdGVwIHRvIGdldCBhIGxheSBvZiB0aGUgbGFuZCBhbmQgdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGRpZmZlcmVudCBmaWxlIHN5c3RlbSBmZWF0dXJlcy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QganVtcGluZy1vZmYgcG9pbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjgwNjMsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo0NC45Mjg3NDg0MzhaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzYyNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTAsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMTA6XFx0XFx0aGVscFxcbiAxMTE6XFx0XFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBleHBvcnQgb3BlcmF0aW9ucyBmb3IgYSBmaWxlc3lzdGVtIHRvIHN1cHBvcnRcXG4gMTEyOlxcdFxcdCAgZXh0ZXJuYWwgYmxvY2sgSU8uXFxuIDExMzpcXHRcXG4gMTE0OlxcdGNvbmZpZyBGSUxFX0xPQ0tJTkdcXG4gMTE1OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBQT1NJWCBmaWxlIGxvY2tpbmcgQVBJXFxcIiBpZiBFWFBFUlRcXG4gMTE2OlxcdFxcdGRlZmF1bHQgeVxcbiAxMTc6XFx0XFx0aGVscFxcbiAxMTg6XFx0XFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHN0YW5kYXJkIGZpbGUgbG9ja2luZyBzdXBwb3J0LCByZXF1aXJlZFxcbiAxMTk6XFx0XFx0ICBmb3IgZmlsZXN5c3RlbXMgbGlrZSBORlMgYW5kIGZvciB0aGUgZmxvY2soKSBzeXN0ZW1cXG4gMTIwOlxcdFxcdCAgY2FsbC4gRGlzYWJsaW5nIHRoaXMgb3B0aW9uIHNhdmVzIGFib3V0IDExay5cXG4gMTIxOlxcdFxcbiAxMjI6XFx0c291cmNlIFxcXCJmcy9jcnlwdG8vS2NvbmZpZ1xcXCJcXG4gMTIzOlxcdFxcbiAxMjQ6XFx0c291cmNlIFxcXCJmcy92ZXJpdHkvS2NvbmZpZ1xcXCJcXG4gMTI1OlxcdFxcbiAxMjY6XFx0c291cmNlIFxcXCJmcy9ub3RpZnkvS2NvbmZpZ1xcXCJcXG4gMTI3OlxcdFxcbiAxMjg6XFx0c291cmNlIFxcXCJmcy9xdW90YS9LY29uZmlnXFxcIlxcbiAxMjk6XFx0XFxuIDEzMDpcXHRzb3VyY2UgXFxcImZzL2F1dG9mcy9LY29uZmlnXFxcIlxcbiAxMzE6XFx0c291cmNlIFxcXCJmcy9mdXNlL0tjb25maWdcXFwiXFxuIDEzMjpcXHRzb3VyY2UgXFxcImZzL292ZXJsYXlmcy9LY29uZmlnXFxcIlxcbiAxMzM6XFx0XFxuIDEzNDpcXHRtZW51IFxcXCJDYWNoZXNcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjQ0LjkyODgyNzQ2OVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDE4MzQxMTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBzZWUgd2hhdCdzIGdvaW5nIG9uIHdpdGggYC9wcm9jL2xvY2tzYC4gTXkgZmlyc3QgdGhvdWdodCBpcywgaXMgdGhpcyBkZXBlbmRlbnQgb24gYW55IHNwZWNpZmljIGtlcm5lbCBjb25maWd1cmF0aW9ucywgbGlrZSBgQ09ORklHX1BST0NfRlNgIG9yIGBDT05GSUdfUElEX05TYD8gSSBuZWVkIHRvIGJlIHN1cmUgdGhlIHN5c3RlbSBoYXMgd2hhdCBpdCBuZWVkcyBiZWZvcmUgSSBzdGFydCBkaXZpbmcgZGVlcGVyLlxuXG5Ob3csIHRvIHVuZGVyc3RhbmQgaXRzIGluaXRpYWxpemF0aW9uLCBJIHNob3VsZCBjaGVjayB0aGUgYHByb2NfbG9ja3NfaW5pdGAgZnVuY3Rpb24uIFRoYXQgd2lsbCBiZSBpbiBgZnMvbG9ja3MuY2AuIFRoYXQgZnVuY3Rpb24gc2hvdWxkIGxheSBvdXQgdGhlIGZvdW5kYXRpb25zIEkgYW0gbG9va2luZyBmb3IuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg2MDcsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjQ3LjM0NzE3MDk4OFoiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzEyNjg1MjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicHJvY19sb2Nrc19pbml0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9sb2Nrcy5jPTMxNDM9c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsb2Nrc19zZXFfb3BlcmF0aW9ucyA9IHtcXG4tLVxcbmZzL2xvY2tzLmMtMzE0OS1cXG5mcy9sb2Nrcy5jOjMxNTA6c3RhdGljIGludCBfX2luaXQgcHJvY19sb2Nrc19pbml0KHZvaWQpXFxuZnMvbG9ja3MuYy0zMTUxLXtcXG4tLVxcbmZzL2xvY2tzLmMtMzE1NS19XFxuZnMvbG9ja3MuYzozMTU2OmZzX2luaXRjYWxsKHByb2NfbG9ja3NfaW5pdCk7XFxuZnMvbG9ja3MuYy0zMTU3LSNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo0Ny40MTg0NDUxNTVaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTc3NDg1MzY0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGFuYWx5c2lzIG9mIHRoZSBwcm92aWRlZCBzbmlwcGV0LCBhcyBpZiBpdCB3ZXJlIG15IHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBgZnMvbG9ja3MuY2AqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgZnMvbG9ja3MuY2AuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiBob3cgYHByb2NfbG9ja3NfaW5pdGAgaXMgYmVpbmcgaGFuZGxlZC4gVGhlIGAjaWZkZWZgIGRpcmVjdGl2ZSBhcm91bmQgdGhhdCBmdW5jdGlvbiBpcyB3aGF0IEknbSBmb2N1c2luZyBvbi4gSXQncyBhIGtleSBkZXRhaWwgdG8gdW5kZXJzdGFuZCB0aGUgZmxleGliaWxpdHkgb2YgdGhlIGxvY2tpbmcgaW1wbGVtZW50YXRpb24uIEkgbmVlZCB0byBmaWd1cmUgb3V0IHVuZGVyIHdoYXQgY29uZGl0aW9ucyB0aGlzIGluaXRpYWxpemF0aW9uIGlzIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLiBJJ20gYWxyZWFkeSB0aGlua2luZyBhYm91dCB3aGF0IHByZXByb2Nlc3NvciBtYWNyb3MgYXJlIGludm9sdmVkIGFuZCBob3cgdGhleSByZWxhdGUgdG8gdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbiBhbmQgYnVpbGQgc2V0dGluZ3Mgb2YgdGhpcyBwYXJ0aWN1bGFyIGtlcm5lbCB2ZXJzaW9uLiBFc3NlbnRpYWxseSwgSSdtIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQtZGVwZW5kZW50IGJlaGF2aW9yIG9mIGBwcm9jX2xvY2tzX2luaXRgIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0gbG9ja2luZyBtb2R1bGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg5MjcsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo0OS4xOTMzMDExOTFaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM2NjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2xvY2tzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjkwMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjkwMDpcXHRcXG4yOTAxOlxcdFxcdGN0eCA9IGxvY2tzX2lub2RlX2NvbnRleHQoaW5vZGUpO1xcbjI5MDI6XFx0XFx0aWYgKCFjdHgpXFxuMjkwMzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuMjkwNDpcXHRcXG4yOTA1OlxcdFxcdHNwaW5fbG9jayhcXHUwMDI2Y3R4LVxcdTAwM2VmbGNfbG9jayk7XFxuMjkwNjpcXHRcXHRyZXQgPSAhbGlzdF9lbXB0eShcXHUwMDI2Y3R4LVxcdTAwM2VmbGNfcG9zaXgpIHx8ICFsaXN0X2VtcHR5KFxcdTAwMjZjdHgtXFx1MDAzZWZsY19mbG9jayk7XFxuMjkwNzpcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2Y3R4LVxcdTAwM2VmbGNfbG9jayk7XFxuMjkwODpcXHRcXHRyZXR1cm4gcmV0O1xcbjI5MDk6XFx0fVxcbjI5MTA6XFx0RVhQT1JUX1NZTUJPTF9HUEwodmZzX2lub2RlX2hhc19sb2Nrcyk7XFxuMjkxMTpcXHRcXG4yOTEyOlxcdCNpZmRlZiBDT05GSUdfUFJPQ19GU1xcbjI5MTM6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Byb2NfZnMuaFxcdTAwM2VcXG4yOTE0OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9zZXFfZmlsZS5oXFx1MDAzZVxcbjI5MTU6XFx0XFxuMjkxNjpcXHRzdHJ1Y3QgbG9ja3NfaXRlcmF0b3Ige1xcbjI5MTc6XFx0XFx0aW50XFx0bGlfY3B1O1xcbjI5MTg6XFx0XFx0bG9mZl90XFx0bGlfcG9zO1xcbjI5MTk6XFx0fTtcXG4yOTIwOlxcdFxcbjI5MjE6XFx0c3RhdGljIHZvaWQgbG9ja19nZXRfc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqZiwgc3RydWN0IGZpbGVfbG9ja19jb3JlICpmbGMsXFxuMjkyMjpcXHRcXHRcXHRcXHQgICAgbG9mZl90IGlkLCBjaGFyICpwZngsIGludCByZXBlYXQpXFxuMjkyMzpcXHR7XFxuMjkyNDpcXHRcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDtcXG4yOTI1OlxcdFxcdHVuc2lnbmVkIGludCBwaWQ7XFxuMjkyNjpcXHRcXHRzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcHJvY19waWRucyA9IHByb2NfcGlkX25zKGZpbGVfaW5vZGUoZi1cXHUwMDNlZmlsZSktXFx1MDAzZWlfc2IpO1xcbjI5Mjc6XFx0XFx0aW50IHR5cGUgPSBmbGMtXFx1MDAzZWZsY190eXBlO1xcbjI5Mjg6XFx0XFx0c3RydWN0IGZpbGVfbG9jayAqZmwgPSBmaWxlX2xvY2soZmxjKTtcXG4yOTI5OlxcdFxcbjI5MzA6XFx0XFx0cGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChmbGMsIHByb2NfcGlkbnMpO1xcbjI5MzE6XFx0XFxuMjkzMjpcXHRcXHQvKlxcbjI5MzM6XFx0XFx0ICogSWYgbG9jayBvd25lciBpcyBkZWFkIChhbmQgcGlkIGlzIGZyZWVkKSBvciBub3QgdmlzaWJsZSBpbiBjdXJyZW50XFxuMjkzNDpcXHRcXHQgKiBwaWRucywgemVybyBpcyBzaG93biBhcyBhIHBpZCB2YWx1ZS4gQ2hlY2sgbG9jayBpbmZvIGZyb21cXG4yOTM1OlxcdFxcdCAqIGluaXRfcGlkX25zIHRvIGdldCBzYXZlZCBsb2NrIHBpZCB2YWx1ZS5cXG4yOTM2OlxcdFxcdCAqL1xcbjI5Mzc6XFx0XFx0aWYgKGZsYy1cXHUwMDNlZmxjX2ZpbGUgIT0gTlVMTClcXG4yOTM4OlxcdFxcdFxcdGlub2RlID0gZmlsZV9pbm9kZShmbGMtXFx1MDAzZWZsY19maWxlKTtcXG4yOTM5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo0OS4xOTM0Mzk4MjFaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjIxMjc1NzI3OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLZXJuZWwgQ29uZmlndXJhdGlvbiBFeHBsb3JhdGlvbioqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBjb2RlIGFuZCBpbW1lZGlhdGVseSBJIHNlZSBhIGNydWNpYWwgcG9pbnQgb24gbGluZSAyOTEyOiBpdCdzIGAjaWZkZWYgQ09ORklHX1BST0NfRlNgISBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LCBjb25maXJtaW5nIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIHByb2MgZmlsZXN5c3RlbS4gVGhlbiwganVzdCBhIGJpdCBmdXJ0aGVyIGRvd24sIG9uIGxpbmUgMzAzMCwgYSBjaGVjayBmb3IgYHByb2NfcGlkbnMgIT0gXHUwMDI2aW5pdF9waWRfbnNgIHBvcHMgdXAuIFRoYXQncyBhIGRpcmVjdCBjb25uZWN0aW9uIHRvIFBJRCBuYW1lc3BhY2VzIGFuZCBJIGFtIGNlcnRhaW4gdGhpcyBtdXN0IHJlbGF0ZSB0byBgQ09ORklHX1BJRF9OU2AuIFNvLCBub3cgSSBuZWVkIHRvIGNvbmZpcm0gdGhvc2UgdGhyZWUgY29uZmlndXJhdGlvbnM6IGBDT05GSUdfUFJPQ19GU2AsIGBDT05GSUdfUElEX05TYCwgYW5kIGFsc28sIGp1c3QgdG8gYmUgdGhvcm91Z2gsIGxldCdzIHNlZSB3aGVyZSBgQ09ORklHX0ZJTEVfTE9DS0lOR2AgY29tZXMgaW4uIEl0J3MgdGltZSB0byBjb25maXJtIHRoZXNlIHJlbGF0aW9uc2hpcHMsIGFuZCBJJ2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIGV4YWN0bHkgaG93IGBQSURfTlNgIGlzIGRlZmluZWQgdG8gZ2V0IGEgZnVsbCB1bmRlcnN0YW5kaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NzgxLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1MS40MDYyMDA0NzlaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2MDkxODQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBQSURfTlNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5pdC9LY29uZmlnPTE0NDY9Y29uZmlnIFVTRVJfTlNcXG4tLVxcbmluaXQvS2NvbmZpZy0xNDU5LVxcbmluaXQvS2NvbmZpZzoxNDYwOmNvbmZpZyBQSURfTlNcXG5pbml0L0tjb25maWctMTQ2MS1cXHRib29sIFxcXCJQSUQgTmFtZXNwYWNlc1xcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6NTEuNDUyMjk5MTU3WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwMjMyNDIxODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW50ZXJuYWwgbW9ub2xvZ3VlOlxuXG4qKkNoZWNraW5nIGBDT05GSUdfUFJPQ19GU2AgaW4gYGZzL3Byb2MvS2NvbmZpZ2AqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBwcm9jIGZpbGVzeXN0ZW0gY29uZmlndXJhdGlvbi4gSXQncyBzZWNvbmQgbmF0dXJlIGF0IHRoaXMgcG9pbnQg4oCTIEknbSB0aGlua2luZywgXCJMZXQncyBjaGVjayBgQ09ORklHX1BST0NfRlNgIGluIGBmcy9wcm9jL0tjb25maWdgLlwiIEdvdHRhIG1ha2Ugc3VyZSB0aGlzIGZ1bmRhbWVudGFsIGNvbXBvbmVudCBpcyBlbmFibGVkIG9yIHByb3Blcmx5IGNvbmZpZ3VyZWQuIEtub3dpbmcgdGhpcywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBlbHNlIHJlbGllcyBvbiBpdCwgYW5kIHdoYXQgbXkgZ29hbCBvZiB1bmRlcnN0YW5kaW5nIHRoZSBjdXJyZW50IHN5c3RlbS4gR290dGEgZW5zdXJlIGl0J3Mgc2V0IGNvcnJlY3RseS4gQWZ0ZXIgYWxsLCBgcHJvY2ZzYCBpcyBwcmFjdGljYWxseSB0aGUgYmFja2JvbmUgZm9yIHN5c3RlbSBtb25pdG9yaW5nLCBkZWJ1Z2dpbmcsIGFuZCBwcm92aWRpbmcgaW5mb3JtYXRpb24gdG8gdXNlcnNwYWNlLiBJJ2xsIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCB0aGlzIGNoZWNrIGlzIGdvaW5nIHRvIGJlIHBhcnQgb2YgYSBiaWdnZXIgcHJvamVjdDsgdGhlcmVmb3JlLCBJIG11c3QgZW5zdXJlIEkgZG8gbXkgZHVlIGRpbGlnZW5jZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxNzIsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1My40NzU1NDQwNDNaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyMjk5NjY3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBQUk9DX0ZTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9wcm9jL0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG5mcy9wcm9jL0tjb25maWc6Mjpjb25maWcgUFJPQ19GU1xcbmZzL3Byb2MvS2NvbmZpZy0zLVxcdGJvb2wgXFxcIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnRcXFwiIGlmIEVYUEVSVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1My41NDc4NDg1MloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTc0NDk4NjYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBGb2N1c1N5bWJvbHMgYW5kIExvY2sgSW5mb3JtYXRpb24qKlxuXG5Pa2F5LCBzbyB3ZSdyZSBsb29raW5nIGF0IGBGb2N1c1N5bWJvbHNgLCBhbmQgdGhlIHBhdGNoIGhpZ2hsaWdodHMgYSBtb2RpZmljYXRpb24gdG8gYGxvY2tzX3Nob3dgLiBIbW0sIHRoYXQgcmluZ3MgYSBiZWxsLiBXYWl0IGEgbWludXRlLCBpc24ndCBgbG9ja3Nfc2hvd2AgZGVmaW5lZCBhcyBgc3RhdGljYCB3aXRoaW4gYGZzL2xvY2tzLmNgPyBZZXAsIGl0IGlzLiBBbHJpZ2h0LCB0aGF0IGNoYW5nZXMgdGhlIGFwcHJvYWNoIGEgYml0LiBOb3cgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgKnVzZWQqLiBTaW5jZSBpdCdzIHN0YXRpYywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGVudHJ5cG9pbnRzIHRoYXQgaW52b2x2ZSBpdCwgYW5kIHNwZWNpZmljYWxseSwgd2hhdCBmdW5jdGlvbnMgKmNhbGwqIGBsb2Nrc19zaG93YCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiBMZXQncyBzdGFydCBieSBkaWdnaW5nIGludG8gdGhlIHNlcXVlbmNlIG9wZXJhdGlvbnMgYW5kIGlkZW50aWZ5IHRoZSBjYWxsZXJzLiBUaGF0IHNob3VsZCBwYWludCBhIGNsZWFyZXIgcGljdHVyZSBvZiBpdHMgcm9sZSBpbiB0aGlzIHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA0NzQsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1Ni4xMjIzNTEyMDNaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM5NDQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2xvY2tzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzEzNSxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMzEzNTpcXHRcXG4zMTM2OlxcdHN0YXRpYyB2b2lkIGxvY2tzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxcbjMxMzc6XFx0XFx0X19yZWxlYXNlcyhcXHUwMDI2YmxvY2tlZF9sb2NrX2xvY2spXFxuMzEzODpcXHR7XFxuMzEzOTpcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2YmxvY2tlZF9sb2NrX2xvY2spO1xcbjMxNDA6XFx0XFx0cGVyY3B1X3VwX3dyaXRlKFxcdTAwMjZmaWxlX3J3c2VtKTtcXG4zMTQxOlxcdH1cXG4zMTQyOlxcdFxcbjMxNDM6XFx0c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsb2Nrc19zZXFfb3BlcmF0aW9ucyA9IHtcXG4zMTQ0OlxcdFxcdC5zdGFydFxcdD0gbG9ja3Nfc3RhcnQsXFxuMzE0NTpcXHRcXHQubmV4dFxcdD0gbG9ja3NfbmV4dCxcXG4zMTQ2OlxcdFxcdC5zdG9wXFx0PSBsb2Nrc19zdG9wLFxcbjMxNDc6XFx0XFx0LnNob3dcXHQ9IGxvY2tzX3Nob3csXFxuMzE0ODpcXHR9O1xcbjMxNDk6XFx0XFxuMzE1MDpcXHRzdGF0aWMgaW50IF9faW5pdCBwcm9jX2xvY2tzX2luaXQodm9pZClcXG4zMTUxOlxcdHtcXG4zMTUyOlxcdFxcdHByb2NfY3JlYXRlX3NlcV9wcml2YXRlKFxcXCJsb2Nrc1xcXCIsIDAsIE5VTEwsIFxcdTAwMjZsb2Nrc19zZXFfb3BlcmF0aW9ucyxcXG4zMTUzOlxcdFxcdFxcdFxcdHNpemVvZihzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IpLCBOVUxMKTtcXG4zMTU0OlxcdFxcdHJldHVybiAwO1xcbjMxNTU6XFx0fVxcbjMxNTY6XFx0ZnNfaW5pdGNhbGwocHJvY19sb2Nrc19pbml0KTtcXG4zMTU3OlxcdCNlbmRpZlxcbjMxNTg6XFx0XFxuMzE1OTpcXHRzdGF0aWMgaW50IF9faW5pdCBmaWxlbG9ja19pbml0KHZvaWQpXFxuMzE2MDpcXHR7XFxuMzE2MTpcXHRcXHRpbnQgaTtcXG4zMTYyOlxcdFxcbjMxNjM6XFx0XFx0ZmxjdHhfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShcXFwiZmlsZV9sb2NrX2N0eFxcXCIsXFxuMzE2NDpcXHRcXHRcXHRcXHRzaXplb2Yoc3RydWN0IGZpbGVfbG9ja19jb250ZXh0KSwgMCwgU0xBQl9QQU5JQywgTlVMTCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjU2LjEyMjQ5MzE1M1oiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozMTcwMjA4NDA4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTG9ja3MgSW1wbGVtZW50YXRpb24qKlxuXG5Pa2F5LCBzbyBgbG9ja3Nfc2hvd2AgaXMgYSBmdW5jdGlvbiBwb2ludGVyIHdpdGhpbiBgbG9ja3Nfc2VxX29wZXJhdGlvbnNgLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBgLnNob3dgIG9wZXJhdGlvbi4gVGhlIGNyaXRpY2FsIHBvaW50IGlzIHRoYXQgaXRzIGFkZHJlc3MgaXMgYmVpbmcgdGFrZW4uIEJlY2F1c2Ugb2YgdGhpcywgZXZlbiBpZiBpdCB3ZXJlIGEgc3RhdGljIGZ1bmN0aW9uLCB0aGUgY29tcGlsZXIgKndvbid0KiBpbmxpbmUgaXQuIEl0J2xsIGhhdmUgaXRzIG93biBkaXN0aW5jdCBzeW1ib2wgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZS4gVGhpcyBoYXMgaW1wbGljYXRpb25zIGZvciBob3cgaXQncyByZXNvbHZlZCBhbmQgbGlua2VkLlxuXG5BbHJpZ2h0LCBiZWZvcmUgZGl2aW5nIHRvbyBkZWVwLCBsZXQncyBicm9hZGVuIHRoZSBzY29wZS4gSSBuZWVkIHRvIHNlZSB0aGUgYnJvYWRlciBjb250ZXh0IHdpdGhpbiBgZnMvbG9ja3MuY2AuIEFyZSB0aGVyZSBvdGhlciBmdW5jdGlvbnMgd2l0aGluIHRoYXQgZmlsZSBkaXJlY3RseSByZWxhdGVkIHRvIE9GRCAoT3BlbiBGaWxlIERlc2NyaXB0aW9uKSBsb2NrcyBvciwgY3J1Y2lhbGx5LCByZWxhdGVkIHRvIGBsb2Nrc19zaG93YCBpdHNlbGY/IEl0J3MgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIHJlbGF0aW9uc2hpcHMuXG5cbkhvbGQgb24gYSBzZWNvbmQsIGJlZm9yZSBJIGdldCBjYXJyaWVkIGF3YXkuIExldCdzIHN0ZXAgYmFjayBhbmQgY29uc2lkZXIgdGhlICplbnRyeSBwb2ludHMqIGZvciBgZmNudGxgIGxvY2tzLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGNyaXRpY2FsIGZ1bmN0aW9uczogYGZjbnRsX3NldGxrYCwgYGZjbnRsX3NldGxrNjRgLCBgZG9fbG9ja19maWxlX3dhaXRgLCBgdmZzX2xvY2tfZmlsZWAuLi4gdGhpbmdzIGxpa2UgdGhhdC4gV2UgcmVhbGx5IG5lZWQgdG8gbG9vayBhdCB0aGVzZSBlbnRyeSBwb2ludHMgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdy4gSSBuZWVkIHRvIHNlYXJjaCBmb3IgdGhvc2UgYGZjbnRsYCBsb2NrIGVudHJ5cG9pbnRzIHRvIGdldCBhIGZ1bGwgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTExOTAsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1OS4yOTI3MDQ3NjFaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjczNTI1NjI3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZjbnRsX3NldGxrXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9mY250bC5jPTQ0ND1zdGF0aWMgbG9uZyBkb19mY250bChpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLFxcbi0tXFxuZnMvZmNudGwuYy00OTktXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuZnMvZmNudGwuYzo1MDA6XFx0XFx0ZXJyID0gZmNudGxfc2V0bGsoZmQsIGZpbHAsIGNtZCwgXFx1MDAyNmZsb2NrKTtcXG5mcy9mY250bC5jLTUwMS1cXHRcXHRicmVhaztcXG4tLVxcbmZzL2ZjbnRsLmM9NjA4PVNZU0NBTExfREVGSU5FMyhmY250bDY0LCB1bnNpZ25lZCBpbnQsIGZkLCB1bnNpZ25lZCBpbnQsIGNtZCxcXG4tLVxcbmZzL2ZjbnRsLmMtNjQ0LVxcdFxcdFxcdGJyZWFrO1xcbmZzL2ZjbnRsLmM6NjQ1OlxcdFxcdGVyciA9IGZjbnRsX3NldGxrNjQoZmQsIGZkX2ZpbGUoZiksIGNtZCwgXFx1MDAyNmZsb2NrKTtcXG5mcy9mY250bC5jLTY0Ni1cXHRcXHRicmVhaztcXG4tLVxcbmZzL2ZjbnRsLmM9NzQzPXN0YXRpYyBsb25nIGRvX2NvbXBhdF9mY250bDY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCxcXG4tLVxcbmZzL2ZjbnRsLmMtNzg3LVxcdFxcdFxcdGJyZWFrO1xcbmZzL2ZjbnRsLmM6Nzg4OlxcdFxcdGVyciA9IGZjbnRsX3NldGxrKGZkLCBmZF9maWxlKGYpLCBjb252ZXJ0X2ZjbnRsX2NtZChjbWQpLCBcXHUwMDI2ZmxvY2spO1xcbmZzL2ZjbnRsLmMtNzg5LVxcdFxcdGJyZWFrO1xcbi0tXFxuZnMvZmNudGwuYy03OTYtXFx0XFx0XFx0YnJlYWs7XFxuZnMvZmNudGwuYzo3OTc6XFx0XFx0ZXJyID0gZmNudGxfc2V0bGsoZmQsIGZkX2ZpbGUoZiksIGNvbnZlcnRfZmNudGxfY21kKGNtZCksIFxcdTAwMjZmbG9jayk7XFxuZnMvZmNudGwuYy03OTgtXFx0XFx0YnJlYWs7XFxuLS1cXG5mcy9sb2Nrcy5jPTI1NDg9Y2hlY2tfZm1vZGVfZm9yX3NldGxrKHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxcbi0tXFxuZnMvbG9ja3MuYy0yNTY0LSAqL1xcbmZzL2xvY2tzLmM6MjU2NTppbnQgZmNudGxfc2V0bGsodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcXG5mcy9sb2Nrcy5jLTI1NjYtXFx0XFx0c3RydWN0IGZsb2NrICpmbG9jaylcXG4tLVxcbmZzL2xvY2tzLmMtMjYzNS1vdXQ6XFxuZnMvbG9ja3MuYzoyNjM2OlxcdHRyYWNlX2ZjbnRsX3NldGxrKGlub2RlLCBmaWxlX2xvY2ssIGVycm9yKTtcXG5mcy9sb2Nrcy5jLTI2MzctXFx0bG9ja3NfZnJlZV9sb2NrKGZpbGVfbG9jayk7XFxuLS1cXG5mcy9sb2Nrcy5jPTI2NDU9aW50IGZjbnRsX2dldGxrNjQoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBmbG9jazY0ICpmbG9jaylcXG4tLVxcbmZzL2xvY2tzLmMtMjY4Ny0gKi9cXG5mcy9sb2Nrcy5jOjI2ODg6aW50IGZjbnRsX3NldGxrNjQodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcXG5mcy9sb2Nrcy5jLTI2ODktXFx0XFx0c3RydWN0IGZsb2NrNjQgKmZsb2NrKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1OS4zNjYyMzU5NDhaIiwiU2VxIjozMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTQ5ODExNzUwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciBgbG9ja3Nfc2hvd2AqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoICpzcGVjaWZpY2FsbHkqIHRvdWNoZXMgdGhlIGBsb2Nrc19zaG93YCBmdW5jdGlvbi4gTGV0IG1lIHF1aWNrbHkgY29uZmlybSB0aGF0IGJ5IGNoZWNraW5nIHRoZSBkaWZmLiBZdXAsIGp1c3QgYGxvY2tzX3Nob3dgIGluIGBmcy9sb2Nrcy5jYC4gR29vZC5cblxuTm93LCBpcyB0aGlzIGV2ZW4gKndvcnRoKiBmdXp6aW5nPyBBYnNvbHV0ZWx5LiBJdCdzIGtlcm5lbCBjb3JlIGxvZ2ljLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBgL3Byb2MvbG9ja3NgIGFuZCBob3cgaXQgaGFuZGxlcyBPRkQgbG9ja3MgYWNyb3NzIFBJRCBuYW1lc3BhY2VzLiBUaGF0J3MgYSBkZWZpbml0ZSBcInllc1wiIGluIG15IGJvb2suXG5cbk15IGZ1enppbmcgZm9jdXMgd2lsbCBkZWZpbml0ZWx5IGJlIG9uIGBsb2Nrc19zaG93YC4gSSdsbCBjb25zaWRlciBhZGRpbmcgYGZjbnRsX3NldGxrYCBhbmQgYGZjbnRsX3NldGxrNjRgIGlmIEkgZmluZCB0aGV5IG9mZmVyIHNvbWUgY292ZXJhZ2UsIGJ1dCBgbG9ja3Nfc2hvd2AgaXMgdGhlIGRpcmVjdCB0YXJnZXQuXG5cblRoZSBjb25maWd1cmF0aW9uIHJlcXVpcmVtZW50cyBhcmUgY2xlYXI6IGBGSUxFX0xPQ0tJTkdgLCBgUFJPQ19GU2AsIGFuZCBgUElEX05TYC4gR290IGl0LiBObyBwcmVmaXgsIGp1c3QgdGhlIHN5bWJvbHMgYXMtaXMuXG5cbkFscmlnaHQsIGRvdWJsZS1jaGVja2luZyBldmVyeXRoaW5n4oCmIFdlJ3ZlIGV4dHJhY3RlZCB0aGUgZnVuY3Rpb24sIGlkZW50aWZpZWQgdGhlIENPTkZJRyBvcHRpb25zLCBhbmQgY29uZmlybWVkIGl0J3Mgd29ydGggZnV6emluZy4gSSdtIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC4gTGV0J3MgZ2V0IHRoaXMgZnV6emluZyBydW4gZ29pbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMjkyLCJPdXRwdXRUb2tlbnMiOjEwMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNzowNC44NjQzNTYxNDlaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NTkzNjc1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRklMRV9MT0NLSU5HXCIsXG4gICAgXCJQUk9DX0ZTXCIsXG4gICAgXCJQSURfTlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJsb2Nrc19zaG93XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgYGxvY2tzX3Nob3coKWAgaW4gZnMvbG9ja3MuYyB0byBwcm9wZXJseSBmaWx0ZXIgT3BlbiBGaWxlIERlc2NyaXB0aW9uIChPRkQpIGxvY2tzIHdoZW4gcmVhZGluZyAvcHJvYy9sb2NrcyBmcm9tIHdpdGhpbiBub24taW5pdCBQSUQgbmFtZXNwYWNlcy4gVGhpcyBpcyBjb3JlIGZpbGVzeXN0ZW0gbG9naWMgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJGSUxFX0xPQ0tJTkdcIixcbiAgICBcIlBST0NfRlNcIixcbiAgICBcIlBJRF9OU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImxvY2tzX3Nob3dcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgbG9ja3Nfc2hvdygpYCBpbiBmcy9sb2Nrcy5jIHRvIHByb3Blcmx5IGZpbHRlciBPcGVuIEZpbGUgRGVzY3JpcHRpb24gKE9GRCkgbG9ja3Mgd2hlbiByZWFkaW5nIC9wcm9jL2xvY2tzIGZyb20gd2l0aGluIG5vbi1pbml0IFBJRCBuYW1lc3BhY2VzLiBUaGlzIGlzIGNvcmUgZmlsZXN5c3RlbSBsb2dpYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNzowNC45NDAzMDA0MDZaIiwiU2VxIjozMywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwODU2MDI1MTMzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTc6MDQuOTQwNzUwNDg2WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MjA4NTU1NzExMTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgYGxvY2tzX3Nob3coKWAgaW4gYGZzL2xvY2tzLmNgIHRvIHByb3Blcmx5IGZpbHRlciBvcGVuIGZpbGUgZGVzY3JpcHRvciAoT0ZEKSBsb2NrcyBpbiBub24taW5pdCBQSUQgbmFtZXNwYWNlcy4gVGhlIGNoYW5nZXMgb25seSBpbnRyb2R1Y2Ugc2NhbGFyIHN0YWNrIHZhcmlhYmxlcyAoYHZpc2libGVgIGluaXRpYWxpemVkIHRvIGBmYWxzZWAsIGBwaWRgIHBvaW50ZXIgYXNzaWduZWQgZnJvbSBgZmluZF9waWRfbnMoKWApIGFuZCBwZXJmb3JtIG5hbWVzcGFjZSB0cmFuc2xhdGlvbiBjaGVja3MgdW5kZXIgUkNVLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkLCBhbGxvY2F0ZWQsIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBwYWRkaW5nIG9yIHN0cnVjdCBmaWVsZHMgYXJlIGxlZnQgdW5pbml0aWFsaXplZC4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA5ZDA5OWEzM2Q2ODM4NmYxNDViZmE4M2E0Y2U0MmNlYjI2YzlkZmY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAwOToxNjoxMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jXG5pbmRleCA2ZTRmZjdmY2VjMDUzLi40YWYxMzg1NjgyZTRlIDEwMDY0NFxuLS0tIGEvZnMvbG9ja3MuY1xuKysrIGIvZnMvbG9ja3MuY1xuQEAgLTMwMjIsNiArMzAyMiwyNSBAQCBzdGF0aWMgaW50IGxvY2tzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxuIFxuIFx0Y3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7XG4gXG4rXHQvKlxuK1x0ICogT0ZEIGxvY2tzIGFyZSByZXBvcnRlZCB3aXRoIHBpZCAtMSwgc28gdGhlIGZpbHRlciBiZWxvdyBjYW5ub3Qgc2VlXG4rXHQgKiB0aGVpciBvd25lcjsgZmxjX3BpZCBob2xkcyB0aGUgb3duZXIgdGdpZCwgc28gZmlsdGVyIG9uIGl0LlxuK1x0ICogUmVtb3RlIGxvY2tzIGtlZXAgYSBuZWdhdGl2ZSBmbGNfcGlkIGFuZCBzdGF5IHZpc2libGUgYXMgYmVmb3JlLlxuK1x0ICovXG4rXHRpZiAoKGN1ci1cdTAwM2VmbGNfZmxhZ3MgXHUwMDI2IEZMX09GRExDSykgXHUwMDI2XHUwMDI2IGN1ci1cdTAwM2VmbGNfcGlkIFx1MDAzZSAwIFx1MDAyNlx1MDAyNlxuK1x0ICAgIHByb2NfcGlkbnMgIT0gXHUwMDI2aW5pdF9waWRfbnMpIHtcbitcdFx0c3RydWN0IHBpZCAqcGlkO1xuK1x0XHRib29sIHZpc2libGUgPSBmYWxzZTtcbitcbitcdFx0cmN1X3JlYWRfbG9jaygpO1xuK1x0XHRwaWQgPSBmaW5kX3BpZF9ucyhjdXItXHUwMDNlZmxjX3BpZCwgXHUwMDI2aW5pdF9waWRfbnMpO1xuK1x0XHRpZiAocGlkKVxuK1x0XHRcdHZpc2libGUgPSBwaWRfbnJfbnMocGlkLCBwcm9jX3BpZG5zKSAhPSAwO1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0aWYgKCF2aXNpYmxlKVxuK1x0XHRcdHJldHVybiAwO1xuK1x0fVxuK1xuIFx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuIFx0XHRyZXR1cm4gMDtcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE3OjA0Ljk0MDc1MTM3NloiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3Njk0OTk5NjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbjpcblxuKipEZWNvbnN0cnVjdGluZyB0aGUgUGF0Y2gqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCB0byB3b3JrLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaC4gVGhlIGluc3RydWN0aW9ucyBhcmUgc3RyYWlnaHRmb3J3YXJkIGVub3VnaDogYW5hbHl6ZSB0aGUgY2hhbmdlcy4gSXQgbG9va3MgbGlrZSB0aGUgdGFyZ2V0IGlzIGEgbW9kaWZpY2F0aW9uIHRvIGBmcy9sb2Nrcy5jYCwgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgYGxvY2tzX3Nob3dgIGZ1bmN0aW9uLCB3aGljaCBpcyBhIGtleSBhcmVhIGZvciBsb2NrIHZpc3VhbGl6YXRpb24uIEdpdmVuIHRoZSBuYXR1cmUgb2YgdGhpcywgSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBleGlzdGluZyBsb2NraW5nIGluZnJhc3RydWN0dXJlIHdvcmtzIHRvIGlkZW50aWZ5IGFueSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy4gSXQgYXBwZWFycyB0aGF0IHRoZSBtb2RpZmljYXRpb25zIGFyZSBpbiBvciBhcm91bmQgbGluZSAzMDIyLCBzbyBJIHdpbGwgaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgaWRlbnRpZnkgYW55IGFyZWFzIG9mIGNvbmNlcm4uIEknbGwgdXNlIGByZWFkLWZpbGVgIG9yIGBncmVwcGVyYCB0byBxdWlja2x5IGJyaW5nIHRoZSByZWxldmFudCBzZWN0aW9uIGludG8gdmlldy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI1NiwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTc6MTIuNjM1NzUzOTE2WiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5MDA5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9sb2Nrcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMwMTAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjMwMTA6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuMzAxMTpcXHRcXHR9XFxuMzAxMjpcXHRcXG4zMDEzOlxcdFxcdHJldHVybiB0bXA7XFxuMzAxNDpcXHR9XFxuMzAxNTpcXHRcXG4zMDE2OlxcdHN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXFxuMzAxNzpcXHR7XFxuMzAxODpcXHRcXHRzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IgKml0ZXIgPSBmLVxcdTAwM2Vwcml2YXRlO1xcbjMwMTk6XFx0XFx0c3RydWN0IGZpbGVfbG9ja19jb3JlICpjdXIsICp0bXA7XFxuMzAyMDpcXHRcXHRzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcHJvY19waWRucyA9IHByb2NfcGlkX25zKGZpbGVfaW5vZGUoZi1cXHUwMDNlZmlsZSktXFx1MDAzZWlfc2IpO1xcbjMwMjE6XFx0XFx0aW50IGxldmVsID0gMDtcXG4zMDIyOlxcdFxcbjMwMjM6XFx0XFx0Y3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7XFxuMzAyNDpcXHRcXG4zMDI1OlxcdFxcdC8qXFxuMzAyNjpcXHRcXHQgKiBPRkQgbG9ja3MgYXJlIHJlcG9ydGVkIHdpdGggcGlkIC0xLCBzbyB0aGUgZmlsdGVyIGJlbG93IGNhbm5vdCBzZWVcXG4zMDI3OlxcdFxcdCAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuXFxuMzAyODpcXHRcXHQgKiBSZW1vdGUgbG9ja3Mga2VlcCBhIG5lZ2F0aXZlIGZsY19waWQgYW5kIHN0YXkgdmlzaWJsZSBhcyBiZWZvcmUuXFxuMzAyOTpcXHRcXHQgKi9cXG4zMDMwOlxcdFxcdGlmICgoY3VyLVxcdTAwM2VmbGNfZmxhZ3MgXFx1MDAyNiBGTF9PRkRMQ0spIFxcdTAwMjZcXHUwMDI2IGN1ci1cXHUwMDNlZmxjX3BpZCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjZcXG4zMDMxOlxcdFxcdCAgICBwcm9jX3BpZG5zICE9IFxcdTAwMjZpbml0X3BpZF9ucykge1xcbjMwMzI6XFx0XFx0XFx0c3RydWN0IHBpZCAqcGlkO1xcbjMwMzM6XFx0XFx0XFx0Ym9vbCB2aXNpYmxlID0gZmFsc2U7XFxuMzAzNDpcXHRcXG4zMDM1OlxcdFxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4zMDM2OlxcdFxcdFxcdHBpZCA9IGZpbmRfcGlkX25zKGN1ci1cXHUwMDNlZmxjX3BpZCwgXFx1MDAyNmluaXRfcGlkX25zKTtcXG4zMDM3OlxcdFxcdFxcdGlmIChwaWQpXFxuMzAzODpcXHRcXHRcXHRcXHR2aXNpYmxlID0gcGlkX25yX25zKHBpZCwgcHJvY19waWRucykgIT0gMDtcXG4zMDM5OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbjMwNDA6XFx0XFx0XFx0aWYgKCF2aXNpYmxlKVxcbjMwNDE6XFx0XFx0XFx0XFx0cmV0dXJuIDA7XFxuMzA0MjpcXHRcXHR9XFxuMzA0MzpcXHRcXG4zMDQ0OlxcdFxcdGlmIChsb2Nrc190cmFuc2xhdGVfcGlkKGN1ciwgcHJvY19waWRucykgPT0gMClcXG4zMDQ1OlxcdFxcdFxcdHJldHVybiAwO1xcbjMwNDY6XFx0XFxuMzA0NzpcXHRcXHQvKiBWaWV3IHRoaXMgY3Jvc3NlZCBsaW5rZWQgbGlzdCBhcyBhIGJpbmFyeSB0cmVlLCB0aGUgZmlyc3QgbWVtYmVyIG9mIGZsY19ibG9ja2VkX3JlcXVlc3RzXFxuMzA0ODpcXHRcXHQgKiBpcyB0aGUgbGVmdCBjaGlsZCBvZiBjdXJyZW50IG5vZGUsIHRoZSBuZXh0IHNpbGliaW5nIGluIGZsY19ibG9ja2VkX21lbWJlciBpcyB0aGVcXG4zMDQ5OlxcdFxcdCAqIHJpZ2h0IGNoaWxkLCB3ZSBjYW4gYWxzZSBnZXQgdGhlIHBhcmVudCBvZiBjdXJyZW50IG5vZGUgZnJvbSBmbGNfYmxvY2tlciwgc28gdGhpc1xcbjMwNTA6XFx0XFx0ICogcXVlc3Rpb24gYmVjb21lcyB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZVxcbjMwNTE6XFx0XFx0ICovXFxuMzA1MjpcXHRcXHR3aGlsZSAoY3VyICE9IE5VTEwpIHtcXG4zMDUzOlxcdFxcdFxcdGlmIChsZXZlbClcXG4zMDU0OlxcdFxcdFxcdFxcdGxvY2tfZ2V0X3N0YXR1cyhmLCBjdXIsIGl0ZXItXFx1MDAzZWxpX3BvcywgXFxcIi1cXHUwMDNlIFxcXCIsIGxldmVsKTtcXG4zMDU1OlxcdFxcdFxcdGVsc2VcXG4zMDU2OlxcdFxcdFxcdFxcdGxvY2tfZ2V0X3N0YXR1cyhmLCBjdXIsIGl0ZXItXFx1MDAzZWxpX3BvcywgXFxcIlxcXCIsIGxldmVsKTtcXG4zMDU3OlxcdFxcbjMwNTg6XFx0XFx0XFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZjdXItXFx1MDAzZWZsY19ibG9ja2VkX3JlcXVlc3RzKSkge1xcbjMwNTk6XFx0XFx0XFx0XFx0LyogVHVybiBsZWZ0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE3OjEyLjYzNTk0NjE4NloiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNDMxMDA3Nzk3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipJbnZlc3RpZ2F0aW5nIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBhbmQgYGZsY19waWRgIEluaXRpYWxpemF0aW9uL1VzYWdlKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gYGxvY2tzX3RyYW5zbGF0ZV9waWRgIGFuZCB0aGUgYGZsY19waWRgIHZhcmlhYmxlcy4gSXQncyB0aW1lIHRvIHRyYWNlIHRoZSBjb250cm9sIGZsb3cgdG8gdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHRoZSBmb3JtZXIgb24gdGhlIGxhdHRlci4gSSB3YW50IHRvIHNlZSAqZXhhY3RseSogaG93IGBmbGNfcGlkYCBpcyBpbml0aWFsaXplZCwgd2hlcmUgaXQncyBtb2RpZmllZCwgYW5kIHVuZGVyIHdoYXQgY29uZGl0aW9ucy4gVGhlIGdvYWwgaXMgdG8gZnVsbHkgdW5kZXJzdGFuZCBob3cgdGhlc2UgdHdvIGNvbXBvbmVudHMgcmVsYXRlIGFuZCBpZiB0aGVyZSBhcmUgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGluY29ycmVjdCBzdGF0ZXMsIG9yIGluZWZmaWNpZW5jaWVzLiBJIG5lZWQgdG8gZW5zdXJlIHRoZXkgYWxpZ24sIHRoYXQgdGhlIFBJRCB0cmFuc2xhdGlvbiBpcyBoYXBwZW5pbmcgY29ycmVjdGx5IGluIHJlbGF0aW9uIHRvIHRoZSBGTEMuIEknbSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIHRoZSBsb2NrcyBwb3RlbnRpYWxseSBiZWluZyBhY3F1aXJlZCwgYW5kIGFueSBzaGFyZWQgcmVzb3VyY2VzIHRoYXQgY291bGQgYWZmZWN0IHRoZWlyIGludGVyYWN0aW9uLiBUaW1lIHRvIGRpZyBpbiBhbmQgY2xhcmlmeSBhbnkgbnVhbmNlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzMzMywiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTc6MTYuMDY2OTU3MDIzWiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNTg2NTE2MDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibG9ja3NfdHJhbnNsYXRlX3BpZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9sb2Nrcy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2xvY2tzLmM9MjM2NT1FWFBPUlRfU1lNQk9MX0dQTCh2ZnNfdGVzdF9sb2NrKTtcXG4tLVxcbmZzL2xvY2tzLmMtMjM2Ny0vKipcXG5mcy9sb2Nrcy5jOjIzNjg6ICogbG9ja3NfdHJhbnNsYXRlX3BpZCAtIHRyYW5zbGF0ZSBhIGZpbGVfbG9jaydzIGZsX3BpZCBudW1iZXIgaW50byBhIG5hbWVzcGFjZVxcbmZzL2xvY2tzLmMtMjM2OS0gKiBAZmw6IFRoZSBmaWxlX2xvY2sgd2hvJ3MgZmxfcGlkIHNob3VsZCBiZSB0cmFuc2xhdGVkXFxuLS1cXG5mcy9sb2Nrcy5jLTIzNzMtICovXFxuZnMvbG9ja3MuYzoyMzc0OnN0YXRpYyBwaWRfdCBsb2Nrc190cmFuc2xhdGVfcGlkKHN0cnVjdCBmaWxlX2xvY2tfY29yZSAqZmwsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucylcXG5mcy9sb2Nrcy5jLTIzNzUte1xcbi0tXFxuZnMvbG9ja3MuYz0yNDAxPXN0YXRpYyBpbnQgcG9zaXhfbG9ja190b19mbG9jayhzdHJ1Y3QgZmxvY2sgKmZsb2NrLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbClcXG5mcy9sb2Nrcy5jLTI0MDIte1xcbmZzL2xvY2tzLmM6MjQwMzpcXHRmbG9jay1cXHUwMDNlbF9waWQgPSBsb2Nrc190cmFuc2xhdGVfcGlkKFxcdTAwMjZmbC1cXHUwMDNlYywgdGFza19hY3RpdmVfcGlkX25zKGN1cnJlbnQpKTtcXG5mcy9sb2Nrcy5jLTI0MDQtI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzJcXG4tLVxcbmZzL2xvY2tzLmM9MjQyMz1zdGF0aWMgdm9pZCBwb3NpeF9sb2NrX3RvX2Zsb2NrNjQoc3RydWN0IGZsb2NrNjQgKmZsb2NrLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbClcXG5mcy9sb2Nrcy5jLTI0MjQte1xcbmZzL2xvY2tzLmM6MjQyNTpcXHRmbG9jay1cXHUwMDNlbF9waWQgPSBsb2Nrc190cmFuc2xhdGVfcGlkKFxcdTAwMjZmbC1cXHUwMDNlYywgdGFza19hY3RpdmVfcGlkX25zKGN1cnJlbnQpKTtcXG5mcy9sb2Nrcy5jLTI0MjYtXFx0ZmxvY2stXFx1MDAzZWxfc3RhcnQgPSBmbC1cXHUwMDNlZmxfc3RhcnQ7XFxuLS1cXG5mcy9sb2Nrcy5jPTI5MjE9c3RhdGljIHZvaWQgbG9ja19nZXRfc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqZiwgc3RydWN0IGZpbGVfbG9ja19jb3JlICpmbGMsXFxuLS1cXG5mcy9sb2Nrcy5jLTI5MjktXFxuZnMvbG9ja3MuYzoyOTMwOlxcdHBpZCA9IGxvY2tzX3RyYW5zbGF0ZV9waWQoZmxjLCBwcm9jX3BpZG5zKTtcXG5mcy9sb2Nrcy5jLTI5MzEtXFxuLS1cXG5mcy9sb2Nrcy5jPTMwMTY9c3RhdGljIGludCBsb2Nrc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdilcXG4tLVxcbmZzL2xvY2tzLmMtMzA0My1cXG5mcy9sb2Nrcy5jOjMwNDQ6XFx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxcbmZzL2xvY2tzLmMtMzA0NS1cXHRcXHRyZXR1cm4gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTc6MTYuNDI1NjE0MjI4WiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI4MTgxNjc1MzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGBsb2Nrc190cmFuc2xhdGVfcGlkYCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBkZWZpbml0aW9uLiBJdCdzIGNydWNpYWwsIG9idmlvdXNseSwgZ2l2ZW4gaXRzIG5hbWUsIHNvIEknbGwgbmVlZCB0byByZWFsbHkgdW5wYWNrIGl0cyBwdXJwb3NlIGFuZCBpbXBsZW1lbnRhdGlvbi4gV2hhdCBleGFjdGx5IGlzIGl0IGRvaW5nIHdpdGggUElEcz8gSG93IGRvZXMgaXQgZml0IGludG8gdGhlIGJyb2FkZXIgbG9ja2luZyBtZWNoYW5pc20gSSdtIGZhbWlsaWFyIHdpdGg/IEknbGwgcHJvYmFibHkgc3RhcnQgYnkgdHJhY2luZyB0aGUgZnVuY3Rpb24ncyBjYWxscyBhbmQgZGVwZW5kZW5jaWVzLCBzZWVpbmcgd2hhdCBvdGhlciBwYXJ0cyBvZiB0aGUgc3lzdGVtIGludGVyYWN0IHdpdGggaXQuIEZyb20gdGhlcmUsIEknbGwgbmVlZCB0byBzZWUgd2hldGhlciBpdCBtYWtlcyB1c2Ugb2Yga2VybmVsIHN0cnVjdHVyZXMgdGhhdCBhcmUgc3RhbmRhcmQsIG9yIHdoZXRoZXIgaXQgY29udGFpbnMgc29tZSBiZXNwb2tlIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgdW5pcXVlIHRvIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBvciBhcHBsaWNhdGlvbiB0aGlzIGNvZGUgaXMgZm9yLiBJJ20gZ29pbmcgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGF0YSB0eXBlcyBpdCdzIHdvcmtpbmcgd2l0aCBhbmQgaG93IHRoZXkgcmVsYXRlIHRvIHByb2Nlc3MgaWRlbnRpZmllcnMuIFVuZGVyc3RhbmRpbmcgaXRzIHJvbGUgaW4gdHJhbnNsYXRpbmcgb3IgbWFuaXB1bGF0aW5nIFBJRHMgaXMga2V5IHRvIGdyYXNwaW5nIHRoZSBvdmVyYWxsIGxvY2tpbmcgc3RyYXRlZ3kuIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjAzLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTc6MTkuMjQzNzg1NTAxWiIsIlNlcSI6NDAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4NTY5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9sb2Nrcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIzNjgsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIzNjg6XFx0ICogbG9ja3NfdHJhbnNsYXRlX3BpZCAtIHRyYW5zbGF0ZSBhIGZpbGVfbG9jaydzIGZsX3BpZCBudW1iZXIgaW50byBhIG5hbWVzcGFjZVxcbjIzNjk6XFx0ICogQGZsOiBUaGUgZmlsZV9sb2NrIHdobydzIGZsX3BpZCBzaG91bGQgYmUgdHJhbnNsYXRlZFxcbjIzNzA6XFx0ICogQG5zOiBUaGUgbmFtZXNwYWNlIGludG8gd2hpY2ggdGhlIHBpZCBzaG91bGQgYmUgdHJhbnNsYXRlZFxcbjIzNzE6XFx0ICpcXG4yMzcyOlxcdCAqIFVzZWQgdG8gdHJhbnNsYXRlIGEgZmxfcGlkIGludG8gYSBuYW1lc3BhY2UgdmlydHVhbCBwaWQgbnVtYmVyXFxuMjM3MzpcXHQgKi9cXG4yMzc0OlxcdHN0YXRpYyBwaWRfdCBsb2Nrc190cmFuc2xhdGVfcGlkKHN0cnVjdCBmaWxlX2xvY2tfY29yZSAqZmwsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucylcXG4yMzc1OlxcdHtcXG4yMzc2OlxcdFxcdHBpZF90IHZucjtcXG4yMzc3OlxcdFxcdHN0cnVjdCBwaWQgKnBpZDtcXG4yMzc4OlxcdFxcbjIzNzk6XFx0XFx0aWYgKGZsLVxcdTAwM2VmbGNfZmxhZ3MgXFx1MDAyNiBGTF9PRkRMQ0spXFxuMjM4MDpcXHRcXHRcXHRyZXR1cm4gLTE7XFxuMjM4MTpcXHRcXG4yMzgyOlxcdFxcdC8qIFJlbW90ZSBsb2NrcyByZXBvcnQgYSBuZWdhdGl2ZSBwaWQgdmFsdWUgKi9cXG4yMzgzOlxcdFxcdGlmIChmbC1cXHUwMDNlZmxjX3BpZCBcXHUwMDNjPSAwKVxcbjIzODQ6XFx0XFx0XFx0cmV0dXJuIGZsLVxcdTAwM2VmbGNfcGlkO1xcbjIzODU6XFx0XFxuMjM4NjpcXHRcXHQvKlxcbjIzODc6XFx0XFx0ICogSWYgdGhlIGZsb2NrIG93bmVyIHByb2Nlc3MgaXMgZGVhZCBhbmQgaXRzIHBpZCBoYXMgYmVlbiBhbHJlYWR5XFxuMjM4ODpcXHRcXHQgKiBmcmVlZCwgdGhlIHRyYW5zbGF0aW9uIGJlbG93IHdvbid0IHdvcmssIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIHNob3dcXG4yMzg5OlxcdFxcdCAqIGZsb2NrIG93bmVyIHBpZCBudW1iZXIgaW4gaW5pdCBwaWRucy5cXG4yMzkwOlxcdFxcdCAqL1xcbjIzOTE6XFx0XFx0aWYgKG5zID09IFxcdTAwMjZpbml0X3BpZF9ucylcXG4yMzkyOlxcdFxcdFxcdHJldHVybiAocGlkX3QpIGZsLVxcdTAwM2VmbGNfcGlkO1xcbjIzOTM6XFx0XFxuMjM5NDpcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuMjM5NTpcXHRcXHRwaWQgPSBmaW5kX3BpZF9ucyhmbC1cXHUwMDNlZmxjX3BpZCwgXFx1MDAyNmluaXRfcGlkX25zKTtcXG4yMzk2OlxcdFxcdHZuciA9IHBpZF9ucl9ucyhwaWQsIG5zKTtcXG4yMzk3OlxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbjIzOTg6XFx0XFx0cmV0dXJuIHZucjtcXG4yMzk5OlxcdH1cXG4yNDAwOlxcdFxcbjI0MDE6XFx0c3RhdGljIGludCBwb3NpeF9sb2NrX3RvX2Zsb2NrKHN0cnVjdCBmbG9jayAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxcbjI0MDI6XFx0e1xcbjI0MDM6XFx0XFx0ZmxvY2stXFx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcXHUwMDI2ZmwtXFx1MDAzZWMsIHRhc2tfYWN0aXZlX3BpZF9ucyhjdXJyZW50KSk7XFxuMjQwNDpcXHQjaWYgQklUU19QRVJfTE9ORyA9PSAzMlxcbjI0MDU6XFx0XFx0LypcXG4yNDA2OlxcdFxcdCAqIE1ha2Ugc3VyZSB3ZSBjYW4gcmVwcmVzZW50IHRoZSBwb3NpeCBsb2NrIHZpYVxcbjI0MDc6XFx0XFx0ICogbGVnYWN5IDMyYml0IGZsb2NrLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNzoxOS4yNDM5NzI3NjFaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjU1MjMyMjI1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGAvcHJvYy9sb2Nrc2AgUGF0Y2ggZm9yIEtNU0FOIE5lZWRzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJdCBsb29rcyBsaWtlIHdlJ3JlIGZpeGluZyBhIGJ1ZyByZWxhdGVkIHRvIGhvdyBPRkQgKE9wZW4gRmlsZSBEZXNjcmlwdG9yKSBsb2NrcyBhcmUgZGlzcGxheWVkIGluIGAvcHJvYy9sb2Nrc2AgYWNyb3NzIGRpZmZlcmVudCBQSUQgbmFtZXNwYWNlcy4gVGhlIGluaXRpYWwgaXNzdWUgaXMgdGhhdCBgbG9ja3NfdHJhbnNsYXRlX3BpZGAgcmV0dXJucyAtMSBmb3IgYEZMX09GRExDS2AgKHRoZSBmbGFnIGZvciBPRkQgbG9ja3MpLiBUaGlzIGxlYWRzIHRvIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBmaWx0ZXIgaW4gYGxvY2tzX3Nob3dgIHRvIGZpbHRlciBsb2NrcyBieSBQSUQgbmFtZXNwYWNlIGlzbid0IHdvcmtpbmcgY29ycmVjdGx5IGZvciBPRkQgbG9ja3MuIFNwZWNpZmljYWxseSwgaXQgd2FzIGRpc3BsYXlpbmcgT0ZEIGxvY2tzIGV2ZW4gaWYgdGhleSBkaWRuJ3QgYmVsb25nIHRvIHRoZSBjdXJyZW50IFBJRCBuYW1lc3BhY2UuXG5cblRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGNoZWNrIHdpdGhpbiBgbG9ja3Nfc2hvd2AuIE5vdywgaWYgaXQncyBhbiBPRkQgbG9jayAqYW5kKiBpdCdzIG5vdCBpbiB0aGUgaW5pdCBuYW1lc3BhY2UsIHdlIHBlcmZvcm0gYW4gZXhwbGljaXQgdmlzaWJpbGl0eSBjaGVjayB1c2luZyBgZmluZF9waWRfbnNgIGFuZCBgcGlkX25yX25zYC4gVGhpcyBlbnN1cmVzIHRoZSBsb2NrIGlzIG9ubHkgc2hvd24gaWYgdGhlIFBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGxvY2sgYWN0dWFsbHkgZXhpc3RzIGluIHRoZSBjdXJyZW50IFBJRCBuYW1lc3BhY2UuIFNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2guXG5cbk5vdywgdGhlIGltcG9ydGFudCBwYXJ0OiBLTVNBTi4gV2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCAqcmVxdWlyZXMqIEtNU0FOIHRvIGNhdGNoIHBvdGVudGlhbCBpc3N1ZXMuIEZpcnN0LCBsZXQncyBhZGRyZXNzIHRoZSBzcGVjaWZpYyBLTVNBTiBjb25jZXJuczpcblxuMS4gICoqRG9lcyBpdCB0b3VjaCB1bmluaXRpYWxpemVkIG1lbW9yeSwgY3JlYXRlIG5ldyBhbGxvY2F0aW9ucywgb3IgY29weSB1bmluaXRpYWxpemVkIGRhdGEgdG8gdXNlcnNwYWNlPyoqIE5vLiBUaGUgcGF0Y2ggcmVhZHMgZXhpc3RpbmcgYHN0cnVjdCBmaWxlX2xvY2tfY29yZWAgZmllbGRzIChgZmxjX2ZsYWdzYCwgYGZsY19waWRgKS4gSXQgYWxsb2NhdGVzIG9ubHkgbG9jYWwgc3RhY2sgdmFyaWFibGVzIChgcGlkYCwgYHZpc2libGVgKSB3aGljaCBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEl0IGNhbGxzIHN0YW5kYXJkIGtlcm5lbCBmdW5jdGlvbnMgKGByY3VfcmVhZF9sb2NrYCwgYGZpbmRfcGlkX25zYCwgYHBpZF9ucl9uc2AsIGByY3VfcmVhZF91bmxvY2tgKS4gSXQgKmZpbHRlcnMqIGVudHJpZXMsIG1lYW5pbmcgaXQncyBvbmx5IG1vZGlmeWluZyB0aGUgb3V0cHV0IHN0cmVhbS4gVGhlcmUncyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIG9yIGNvcHkgaW50byB1c2Vyc3BhY2UuXG5cbjIuICAqKkRvZXMgaXQgaW50cm9kdWNlIHJpc2tzIHRoYXQgYXJlIE9OTFkgY2F1Z2h0IGJ5IEtNU0FOPyoqIE5vLiBLTVNBTiBmb2N1c2VzIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2Vzcy4gVGhpcyBwYXRjaCBpcyBmdW5kYW1lbnRhbGx5IGFib3V0IFBJRCBuYW1lc3BhY2UgZmlsdGVyaW5nIGFuZCBsb2NrIGRpc3BsYXkgbG9naWMuIFRoZSBwb3RlbnRpYWwgaXNzdWVzIGhlcmUgYXJlIHJlbGF0ZWQgdG8gUkNVIHVzYWdlLCBwb2ludGVyIGRlcmVmZXJlbmNpbmcsIGFuZCBvdmVyYWxsIGNvcnJlY3RuZXNzLiBTdGFuZGFyZCB0b29scyBsaWtlIEtBU0FOIGFuZCBsb2NrZGVwLCBhbG9uZyB3aXRoIHVuaXQgdGVzdHMsIGFyZSBtb3JlIHRoYW4gc3VmZmljaWVudCB0byBjb3ZlciB0aGVzZSBraW5kcyBvZiByaXNrcy5cblxuVGhlIHJ1bGUgaXMgY2xlYXI6ICpJZiBhIGJ1ZyBjYW4gYmUgY2F1Z2h0IGJ5IEtBU0FOLCBMb2NrZGVwIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcnVuIEtNU0FOKi4gQSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBjb3N0bHkuXG5cblRoZXJlZm9yZSwgYE5lZWRzS01TQU5gIGlzIGRlZmluaXRlbHkgYGZhbHNlYC5cblxuKipLTVNBTlJlYXNvbmluZzoqKlxuXG5UaGUgcGF0Y2ggYWRkcyBhIFBJRCBuYW1lc3BhY2UgdmlzaWJpbGl0eSBjaGVjayBmb3IgT0ZEIGxvY2tzIGluIGBmcy9sb2Nrcy5jOmxvY2tzX3Nob3coKWAuIEl0IG9wZXJhdGVzIG9uIGV4aXN0aW5nIGZpbGUgbG9jayBzdHJ1Y3R1cmVzIChgc3RydWN0IGZpbGVfbG9ja19jb3JlYCkgYW5kIHVzZXMgc3RhY2stYWxsb2NhdGVkIHNjYWxhciB2YXJpYWJsZXMgKGBwaWRgLCBgdmlzaWJsZWApIHRoYXQgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLiBObyBuZXcgYnVmZmVycywgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBvciBrZXJuZWwtdG8tdXNlciBpbmZvIGxlYWtzIGFyZSBpbnRyb2R1Y2VkIG9yIGV4cG9zZWQuIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIEl0J3MgYSBjbGVhbiBmaXggd2l0aCBzdGFuZGFyZCBtZW1vcnkgc2FmZXR5IGNvbnNpZGVyYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MTI0LCJPdXRwdXRUb2tlbnMiOjE1MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgwOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE3OjI1Ljc5NjI5NzUzOVoiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4MTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBgbG9ja3Nfc2hvdygpYCBpbiBgZnMvbG9ja3MuY2AgdG8gcHJvcGVybHkgZmlsdGVyIG9wZW4gZmlsZSBkZXNjcmlwdG9yIChPRkQpIGxvY2tzIGluIG5vbi1pbml0IFBJRCBuYW1lc3BhY2VzLiBUaGUgY2hhbmdlcyBvbmx5IGludHJvZHVjZSBzY2FsYXIgc3RhY2sgdmFyaWFibGVzIChgdmlzaWJsZWAgaW5pdGlhbGl6ZWQgdG8gYGZhbHNlYCwgYHBpZGAgcG9pbnRlciBhc3NpZ25lZCBmcm9tIGBmaW5kX3BpZF9ucygpYCkgYW5kIHBlcmZvcm0gbmFtZXNwYWNlIHRyYW5zbGF0aW9uIGNoZWNrcyB1bmRlciBSQ1UuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQsIGFsbG9jYXRlZCwgb3IgY29waWVkIHRvIHVzZXJzcGFjZSwgYW5kIG5vIHBhZGRpbmcgb3Igc3RydWN0IGZpZWxkcyBhcmUgbGVmdCB1bmluaXRpYWxpemVkLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgYGxvY2tzX3Nob3coKWAgaW4gYGZzL2xvY2tzLmNgIHRvIHByb3Blcmx5IGZpbHRlciBvcGVuIGZpbGUgZGVzY3JpcHRvciAoT0ZEKSBsb2NrcyBpbiBub24taW5pdCBQSUQgbmFtZXNwYWNlcy4gVGhlIGNoYW5nZXMgb25seSBpbnRyb2R1Y2Ugc2NhbGFyIHN0YWNrIHZhcmlhYmxlcyAoYHZpc2libGVgIGluaXRpYWxpemVkIHRvIGBmYWxzZWAsIGBwaWRgIHBvaW50ZXIgYXNzaWduZWQgZnJvbSBgZmluZF9waWRfbnMoKWApIGFuZCBwZXJmb3JtIG5hbWVzcGFjZSB0cmFuc2xhdGlvbiBjaGVja3MgdW5kZXIgUkNVLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkLCBhbGxvY2F0ZWQsIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBwYWRkaW5nIG9yIHN0cnVjdCBmaWVsZHMgYXJlIGxlZnQgdW5pbml0aWFsaXplZC4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowsgngr[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-03 08:52:35 +0000 UTC FinishedAt: 2026-09-03 09:17:27 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "21860bb220225edeb87e9c831e6bf25c620e2126", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FILE_LOCKING", "PROC_FS", "PID_NS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "21860bb220225edeb87e9c831e6bf25c620e2126", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "FILE_LOCKING", "PROC_FS", "PID_NS" ], "series_id": "04cc005e-55c6-4c17-a6a7-199323764e97" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "locks_show" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZJTEVfTE9DS0lORyYjMzQ7LAogICAgJiMzNDtQUk9DX0ZTJiMzNDssCiAgICAmIzM0O1BJRF9OUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2xvY2tzX3Nob3cmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIGBsb2Nrc19zaG93KClgIGluIGBmcy9sb2Nrcy5jYCB0byBwcm9wZXJseSBmaWx0ZXIgb3BlbiBmaWxlIGRlc2NyaXB0b3IgKE9GRCkgbG9ja3MgaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoZSBjaGFuZ2VzIG9ubHkgaW50cm9kdWNlIHNjYWxhciBzdGFjayB2YXJpYWJsZXMgKGB2aXNpYmxlYCBpbml0aWFsaXplZCB0byBgZmFsc2VgLCBgcGlkYCBwb2ludGVyIGFzc2lnbmVkIGZyb20gYGZpbmRfcGlkX25zKClgKSBhbmQgcGVyZm9ybSBuYW1lc3BhY2UgdHJhbnNsYXRpb24gY2hlY2tzIHVuZGVyIFJDVS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCwgYWxsb2NhdGVkLCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gcGFkZGluZyBvciBzdHJ1Y3QgZmllbGRzIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGBsb2Nrc19zaG93KClgIGluIGZzL2xvY2tzLmMgdG8gcHJvcGVybHkgZmlsdGVyIE9wZW4gRmlsZSBEZXNjcmlwdGlvbiAoT0ZEKSBsb2NrcyB3aGVuIHJlYWRpbmcgL3Byb2MvbG9ja3MgZnJvbSB3aXRoaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoaXMgaXMgY29yZSBmaWxlc3lzdGVtIGxvZ2ljIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5ZDA5OWEzM2Q2ODM4NmYxNDViZmE4M2E0Y2U0MmNlYjI2YzlkZmY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAwOToxNjoxMiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuY1xuaW5kZXggNmU0ZmY3ZmNlYzA1My4uNGFmMTM4NTY4MmU0ZSAxMDA2NDRcbi0tLSBhL2ZzL2xvY2tzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2xvY2tzLmNcbkBAIC0zMDIyLDYgJiM0MzszMDIyLDI1IEBAIHN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXG4gXG4gXHRjdXIgPSBobGlzdF9lbnRyeSh2LCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUsIGZsY19saW5rKTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE9GRCBsb2NrcyBhcmUgcmVwb3J0ZWQgd2l0aCBwaWQgLTEsIHNvIHRoZSBmaWx0ZXIgYmVsb3cgY2Fubm90IHNlZVxuJiM0MztcdCAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuXG4mIzQzO1x0ICogUmVtb3RlIGxvY2tzIGtlZXAgYSBuZWdhdGl2ZSBmbGNfcGlkIGFuZCBzdGF5IHZpc2libGUgYXMgYmVmb3JlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICgoY3VyLVx1MDAzZWZsY19mbGFncyBcdTAwMjYgRkxfT0ZETENLKSBcdTAwMjZcdTAwMjYgY3VyLVx1MDAzZWZsY19waWQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIHByb2NfcGlkbnMgIT0gXHUwMDI2aW5pdF9waWRfbnMpIHtcbiYjNDM7XHRcdHN0cnVjdCBwaWQgKnBpZDtcbiYjNDM7XHRcdGJvb2wgdmlzaWJsZSA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRcdHBpZCA9IGZpbmRfcGlkX25zKGN1ci1cdTAwM2VmbGNfcGlkLCBcdTAwMjZpbml0X3BpZF9ucyk7XG4mIzQzO1x0XHRpZiAocGlkKVxuJiM0MztcdFx0XHR2aXNpYmxlID0gcGlkX25yX25zKHBpZCwgcHJvY19waWRucykgIT0gMDtcbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdFx0aWYgKCF2aXNpYmxlKVxuJiM0MztcdFx0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuIFx0XHRyZXR1cm4gMDtcbiBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtGSUxFX0xPQ0tJTkcmIzM0OywKICAgICYjMzQ7UFJPQ19GUyYjMzQ7LAogICAgJiMzNDtQSURfTlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtsb2Nrc19zaG93JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGBsb2Nrc19zaG93KClgIGluIGZzL2xvY2tzLmMgdG8gcHJvcGVybHkgZmlsdGVyIE9wZW4gRmlsZSBEZXNjcmlwdGlvbiAoT0ZEKSBsb2NrcyB3aGVuIHJlYWRpbmcgL3Byb2MvbG9ja3MgZnJvbSB3aXRoaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoaXMgaXMgY29yZSBmaWxlc3lzdGVtIGxvZ2ljIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA5ZDA5OWEzM2Q2ODM4NmYxNDViZmE4M2E0Y2U0MmNlYjI2YzlkZmY0CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMyAwOToxNjoxMiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jCmluZGV4IDZlNGZmN2ZjZWMwNTMuLjRhZjEzODU2ODJlNGUgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tzLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvbG9ja3MuYwpAQCAtMzAyMiw2ICYjNDM7MzAyMiwyNSBAQCBzdGF0aWMgaW50IGxvY2tzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KQogCiAJY3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7CiAKJiM0MzsJLyoKJiM0MzsJICogT0ZEIGxvY2tzIGFyZSByZXBvcnRlZCB3aXRoIHBpZCAtMSwgc28gdGhlIGZpbHRlciBiZWxvdyBjYW5ub3Qgc2VlCiYjNDM7CSAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuCiYjNDM7CSAqIFJlbW90ZSBsb2NrcyBrZWVwIGEgbmVnYXRpdmUgZmxjX3BpZCBhbmQgc3RheSB2aXNpYmxlIGFzIGJlZm9yZS4KJiM0MzsJICovCiYjNDM7CWlmICgoY3VyLSZndDtmbGNfZmxhZ3MgJmFtcDsgRkxfT0ZETENLKSAmYW1wOyZhbXA7IGN1ci0mZ3Q7ZmxjX3BpZCAmZ3Q7IDAgJmFtcDsmYW1wOwomIzQzOwkgICAgcHJvY19waWRucyAhPSAmYW1wO2luaXRfcGlkX25zKSB7CiYjNDM7CQlzdHJ1Y3QgcGlkICpwaWQ7CiYjNDM7CQlib29sIHZpc2libGUgPSBmYWxzZTsKJiM0MzsKJiM0MzsJCXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJCXBpZCA9IGZpbmRfcGlkX25zKGN1ci0mZ3Q7ZmxjX3BpZCwgJmFtcDtpbml0X3BpZF9ucyk7CiYjNDM7CQlpZiAocGlkKQomIzQzOwkJCXZpc2libGUgPSBwaWRfbnJfbnMocGlkLCBwcm9jX3BpZG5zKSAhPSAwOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CQlpZiAoIXZpc2libGUpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKIAlpZiAobG9ja3NfdHJhbnNsYXRlX3BpZChjdXIsIHByb2NfcGlkbnMpID09IDApCiAJCXJldHVybiAwOwogCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNTkKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOgoKKipEaXZpbmcgaW50byB0aGUgYGZzL2xvY2tzLmNgIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaCwgYW5kIG15IGZpcnN0IHN0ZXAgaXMgYWx3YXlzIHRvIHBpbnBvaW50IHRoZSBleGFjdCBsb2NhdGlvbi4gQWxyaWdodCwgdGhlIHBhdGNoIHRhcmdldHMgYGZzL2xvY2tzLmNgLiBHb29kLCB0aGF0IG5hcnJvd3MgdGhlIHNjb3BlIGNvbnNpZGVyYWJseS4gTm93LCBzaW5jZSBJIGRvbiYjMzk7dCBoYXZlIHRoZSBwYXRjaCBpdHNlbGYgcmlnaHQgaW4gZnJvbnQgb2YgbWUsIEkgbmVlZCB0byBnZXQgbXkgYmVhcmluZ3MuIEkmIzM5O20gZ29pbmcgdG8gY2VudGVyIG15IG1lbnRhbCBtb2RlbCBhcm91bmQgbGluZSAzMDIyIHdpdGhpbiB0aGF0IGZpbGUuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGltbWVkaWF0ZSBjb250ZXh0IEkgbmVlZCB0byBzdGFydCBmb3JtaW5nIGEgY2xlYXIgcGljdHVyZSBvZiB3aGF0JiMzOTtzIGJlaW5nIG1vZGlmaWVkIGFuZCB3aHkuIEkmIzM5O2xsIG5lZWQgdG8gY29uc2lkZXIgd2hhdCBjb2RlIHN1cnJvdW5kcyB0aGF0IGxpbmUuIEFyZSB3ZSBkZWFsaW5nIHdpdGggbXV0ZXhlcywgc3BpbmxvY2tzLCBvciBzb21ldGhpbmcgbW9yZSBzcGVjaWFsaXplZD8gVW5kZXJzdGFuZGluZyB0aGF0IGNvbnRleHQgd2lsbCBkaWN0YXRlIGhvdyBJIGFwcHJvYWNoIHVuZGVyc3RhbmRpbmcgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgY2hhbmdlLiBUaW1lIHRvIGdldCBteSBtZW50YWwgY29tcGlsZXIgZmlyaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDMwMDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MzAwMDpcdFxuMzAwMTpcdFx0LyogTlVMTCBub2RlIG9yIHJvb3Qgbm9kZSAqL1xuMzAwMjpcdFx0aWYgKG5vZGUgPT0gTlVMTCB8fCBub2RlLVx1MDAzZWZsY19ibG9ja2VyID09IE5VTEwpXG4zMDAzOlx0XHRcdHJldHVybiBOVUxMO1xuMzAwNDpcdFxuMzAwNTpcdFx0LyogTmV4dCBtZW1iZXIgaW4gdGhlIGxpbmtlZCBsaXN0IGNvdWxkIGJlIGl0c2VsZiAqL1xuMzAwNjpcdFx0dG1wID0gbGlzdF9uZXh0X2VudHJ5KG5vZGUsIGZsY19ibG9ja2VkX21lbWJlcik7XG4zMDA3Olx0XHRpZiAobGlzdF9lbnRyeV9pc19oZWFkKHRtcCwgXHUwMDI2bm9kZS1cdTAwM2VmbGNfYmxvY2tlci1cdTAwM2VmbGNfYmxvY2tlZF9yZXF1ZXN0cyxcbjMwMDg6XHRcdFx0XHQgICAgICAgZmxjX2Jsb2NrZWRfbWVtYmVyKVxuMzAwOTpcdFx0XHR8fCB0bXAgPT0gbm9kZSkge1xuMzAxMDpcdFx0XHRyZXR1cm4gTlVMTDtcbjMwMTE6XHRcdH1cbjMwMTI6XHRcbjMwMTM6XHRcdHJldHVybiB0bXA7XG4zMDE0Olx0fVxuMzAxNTpcdFxuMzAxNjpcdHN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXG4zMDE3Olx0e1xuMzAxODpcdFx0c3RydWN0IGxvY2tzX2l0ZXJhdG9yICppdGVyID0gZi1cdTAwM2Vwcml2YXRlO1xuMzAxOTpcdFx0c3RydWN0IGZpbGVfbG9ja19jb3JlICpjdXIsICp0bXA7XG4zMDIwOlx0XHRzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcHJvY19waWRucyA9IHByb2NfcGlkX25zKGZpbGVfaW5vZGUoZi1cdTAwM2VmaWxlKS1cdTAwM2VpX3NiKTtcbjMwMjE6XHRcdGludCBsZXZlbCA9IDA7XG4zMDIyOlx0XG4zMDIzOlx0XHRjdXIgPSBobGlzdF9lbnRyeSh2LCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUsIGZsY19saW5rKTtcbjMwMjQ6XHRcbjMwMjU6XHRcdC8qXG4zMDI2Olx0XHQgKiBPRkQgbG9ja3MgYXJlIHJlcG9ydGVkIHdpdGggcGlkIC0xLCBzbyB0aGUgZmlsdGVyIGJlbG93IGNhbm5vdCBzZWVcbjMwMjc6XHRcdCAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuXG4zMDI4Olx0XHQgKiBSZW1vdGUgbG9ja3Mga2VlcCBhIG5lZ2F0aXZlIGZsY19waWQgYW5kIHN0YXkgdmlzaWJsZSBhcyBiZWZvcmUuXG4zMDI5Olx0XHQgKi9cbjMwMzA6XHRcdGlmICgoY3VyLVx1MDAzZWZsY19mbGFncyBcdTAwMjYgRkxfT0ZETENLKSBcdTAwMjZcdTAwMjYgY3VyLVx1MDAzZWZsY19waWQgXHUwMDNlIDAgXHUwMDI2XHUwMDI2XG4zMDMxOlx0XHQgICAgcHJvY19waWRucyAhPSBcdTAwMjZpbml0X3BpZF9ucykge1xuMzAzMjpcdFx0XHRzdHJ1Y3QgcGlkICpwaWQ7XG4zMDMzOlx0XHRcdGJvb2wgdmlzaWJsZSA9IGZhbHNlO1xuMzAzNDpcdFxuMzAzNTpcdFx0XHRyY3VfcmVhZF9sb2NrKCk7XG4zMDM2Olx0XHRcdHBpZCA9IGZpbmRfcGlkX25zKGN1ci1cdTAwM2VmbGNfcGlkLCBcdTAwMjZpbml0X3BpZF9ucyk7XG4zMDM3Olx0XHRcdGlmIChwaWQpXG4zMDM4Olx0XHRcdFx0dmlzaWJsZSA9IHBpZF9ucl9ucyhwaWQsIHByb2NfcGlkbnMpICE9IDA7XG4zMDM5Olx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuMzA0MDpcdFx0XHRpZiAoIXZpc2libGUpXG4zMDQxOlx0XHRcdFx0cmV0dXJuIDA7XG4zMDQyOlx0XHR9XG4zMDQzOlx0XG4zMDQ0Olx0XHRpZiAobG9ja3NfdHJhbnNsYXRlX3BpZChjdXIsIHByb2NfcGlkbnMpID09IDApXG4zMDQ1Olx0XHRcdHJldHVybiAwO1xuMzA0NjpcdFxuMzA0NzpcdFx0LyogVmlldyB0aGlzIGNyb3NzZWQgbGlua2VkIGxpc3QgYXMgYSBiaW5hcnkgdHJlZSwgdGhlIGZpcnN0IG1lbWJlciBvZiBmbGNfYmxvY2tlZF9yZXF1ZXN0c1xuMzA0ODpcdFx0ICogaXMgdGhlIGxlZnQgY2hpbGQgb2YgY3VycmVudCBub2RlLCB0aGUgbmV4dCBzaWxpYmluZyBpbiBmbGNfYmxvY2tlZF9tZW1iZXIgaXMgdGhlXG4zMDQ5Olx0XHQgKiByaWdodCBjaGlsZCwgd2UgY2FuIGFsc2UgZ2V0IHRoZSBwYXJlbnQgb2YgY3VycmVudCBub2RlIGZyb20gZmxjX2Jsb2NrZXIsIHNvIHRoaXNcbjMwNTA6XHRcdCAqIHF1ZXN0aW9uIGJlY29tZXMgdHJhdmVyc2FsIG9mIGEgYmluYXJ5IHRyZWVcbjMwNTE6XHRcdCAqL1xuMzA1MjpcdFx0d2hpbGUgKGN1ciAhPSBOVUxMKSB7XG4zMDUzOlx0XHRcdGlmIChsZXZlbClcbjMwNTQ6XHRcdFx0XHRsb2NrX2dldF9zdGF0dXMoZiwgY3VyLCBpdGVyLVx1MDAzZWxpX3BvcywgXCYjMzQ7LVx1MDAzZSBcJiMzNDssIGxldmVsKTtcbjMwNTU6XHRcdFx0ZWxzZVxuMzA1NjpcdFx0XHRcdGxvY2tfZ2V0X3N0YXR1cyhmLCBjdXIsIGl0ZXItXHUwMDNlbGlfcG9zLCBcJiMzNDtcJiMzNDssIGxldmVsKTtcbjMwNTc6XHRcbjMwNTg6XHRcdFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNmN1ci1cdTAwM2VmbGNfYmxvY2tlZF9yZXF1ZXN0cykpIHtcbjMwNTk6XHRcdFx0XHQvKiBUdXJuIGxlZnQgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNTA2CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqQW5hbHl6aW5nIGBsb2Nrc19zaG93YCBpbiBgZnMvbG9ja3MuY2AqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW4uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIGBsb2Nrc19zaG93YCBmdW5jdGlvbiBpcyBkb2luZywgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgYGZzL2xvY2tzLmNgIGZpbGUuIFRoaXMgc3VnZ2VzdHMgaXQmIzM5O3MgbGlrZWx5IGludm9sdmVkIGluIGRpc3BsYXlpbmcgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBmaWxlIGxvY2tzLiBHaXZlbiBteSBleHBlcnRpc2UsIEkmIzM5O20gYWxyZWFkeSBmb3JtdWxhdGluZyBzb21lIGh5cG90aGVzZXMuIEl0IGNvdWxkIGJlIGZvciBkZWJ1Z2dpbmcsIHN5c3RlbSBtb25pdG9yaW5nLCBtYXliZSBldmVuIHVzZXItbGV2ZWwgdmlzaWJpbGl0eSBpbnRvIGhlbGQgbG9ja3MuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGNsdWVzIGluIGl0cyBmdW5jdGlvbiBzaWduYXR1cmUsIHdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGl0IGFjY2Vzc2VzLCBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBrZXJuZWwmIzM5O3MgbG9jayBtYW5hZ2VtZW50IHN1YnN5c3RlbXMuIEkmIzM5O2xsIGJlIGZvY3VzZWQgb24gaG93IGl0IHByZXNlbnRzIHRoaXMgbG9jayBpbmZvcm1hdGlvbi4gSSBleHBlY3QgSSYjMzk7bGwgYmUgcXVpY2tseSBwYXJzaW5nIHRoZSBmdW5jdGlvbiYjMzk7cyBjb2RlIHRvIGRldGVybWluZSB0aGUgZGF0YSBpdCBhY2Nlc3NlcywgZm9ybWF0cywgYW5kIGlmIHRoZXJlIGFyZSBhbnkgb2J2aW91cyBwZXJmb3JtYW5jZSBjb25jZXJucy4gS25vd2luZyB0aGUgY29udGV4dCB3aXRoaW4gdGhlIGtlcm5lbCBpcyBwYXJhbW91bnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bG9ja3Nfc2hvdyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2xvY2tzLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYz0yOTk3PXN0YXRpYyBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmdldF9uZXh0X2Jsb2NrZWRfbWVtYmVyKHN0cnVjdCBmaWxlX2xvY2tfY29yZSAqbm9kZSlcbi0tXG5mcy9sb2Nrcy5jLTMwMTUtXG5mcy9sb2Nrcy5jOjMwMTY6c3RhdGljIGludCBsb2Nrc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdilcbmZzL2xvY2tzLmMtMzAxNy17XG4tLVxuZnMvbG9ja3MuYz0zMTQzPXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbG9ja3Nfc2VxX29wZXJhdGlvbnMgPSB7XG4tLVxuZnMvbG9ja3MuYy0zMTQ2LVx0LnN0b3BcdD0gbG9ja3Nfc3RvcCxcbmZzL2xvY2tzLmM6MzE0NzpcdC5zaG93XHQ9IGxvY2tzX3Nob3csXG5mcy9sb2Nrcy5jLTMxNDgtfTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzOTM2CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipUcmFjaW5nIHRoZSBSZWdpc3RyYXRpb24gb2YgYGxvY2tzX3NlcV9vcGVyYXRpb25zYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSBgbG9ja3Nfc2VxX29wZXJhdGlvbnNgIGlzIGFjdHVhbGx5IGJlaW5nIHJlZ2lzdGVyZWQuIEl0JiMzOTtzIHRoYXQgY3JpdGljYWwgcG9pbnQgb2YgaW5pdGlhbGl6YXRpb24gdGhhdCBJJiMzOTttIGFmdGVyLCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdyB0aGF0IGhhcHBlbnMgKmJlZm9yZSogYW55IG9mIHRoZSBsb2NrcyBhcmUgdXNlZC4gSSBjb3VsZCBtYW51YWxseSBsb29rIHRocm91Z2ggdGhlIHNvdXJjZSB0cmVlLCBidXQgdGhhdCBmZWVscyBpbmVmZmljaWVudCBhbmQgZXJyb3ItcHJvbmUsIGVzcGVjaWFsbHkgd2l0aCBhbGwgdGhlIGFic3RyYWN0aW9uIGxheWVycy4gSSBuZWVkIHRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIHBvaW50IG9mIHJlZ2lzdHJhdGlvbi4gVGhpcyBsaWtlbHkgaW52b2x2ZXMgc29tZSBmb3JtIG9mIG1hY3JvIG9yIGZ1bmN0aW9uIHBvaW50ZXIgdGFibGUuIEkmIzM5O20gdGhpbmtpbmcgYSBzdGF0aWMgYW5hbHlzaXMgYXBwcm9hY2ggaXMgcHJvYmFibHkgdGhlIGJlc3QuIEkmIzM5O2xsIG5lZWQgdG8ga25vdyB3aGVyZSBpdCYjMzk7cyBkZWZpbmVkIGFuZCBob3cgdGhhdCYjMzk7cyBiZWluZyB1c2VkLiBJIHdpbGwgbG9vayBmb3IgaG93IHRoYXQgc3RydWN0IGlzIGJlaW5nIHJlZmVyZW5jZWQuIEl0JiMzOTtzIHZlcnkgbGlrZWx5LCBnaXZlbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24sIHRoYXQgaXQmIzM5O3MgcGFydCBvZiBzb21lIGdsb2JhbCBzdHJ1Y3R1cmUsIG9yIHBhc3NlZCB0byBzb21lIGluaXQgZnVuY3Rpb24uIFRoZSBnb2FsIGlzIHRvIHF1aWNrbHkgZmluZCB0aGUga2V5IGZ1bmN0aW9uIG9yIGRhdGEgc3RydWN0dXJlIHJlc3BvbnNpYmxlIGZvciBiaW5kaW5nIHRoYXQgYGxvY2tzX3NlcV9vcGVyYXRpb25zYCBzdHJ1Y3R1cmUuIFRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBkaXZlIGludG8gdGhlIGNhbGwgc2l0ZXMgb2YgdGhhdCBzdHJ1Y3R1cmUsIHNvIEkgY2FuIHVuZGVyc3RhbmQgdGhlIG9yZGVyIGFuZCBzZXR1cCBvZiB0aGUgb3BlcmF0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsb2Nrc19zZXFfb3BlcmF0aW9ucyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9sb2Nrcy5jPTMxMzY9c3RhdGljIHZvaWQgbG9ja3Nfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXG4tLVxuZnMvbG9ja3MuYy0zMTQyLVxuZnMvbG9ja3MuYzozMTQzOnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbG9ja3Nfc2VxX29wZXJhdGlvbnMgPSB7XG5mcy9sb2Nrcy5jLTMxNDQtXHQuc3RhcnRcdD0gbG9ja3Nfc3RhcnQsXG4tLVxuZnMvbG9ja3MuYz0zMTUwPXN0YXRpYyBpbnQgX19pbml0IHByb2NfbG9ja3NfaW5pdCh2b2lkKVxuZnMvbG9ja3MuYy0zMTUxLXtcbmZzL2xvY2tzLmM6MzE1MjpcdHByb2NfY3JlYXRlX3NlcV9wcml2YXRlKFwmIzM0O2xvY2tzXCYjMzQ7LCAwLCBOVUxMLCBcdTAwMjZsb2Nrc19zZXFfb3BlcmF0aW9ucyxcbmZzL2xvY2tzLmMtMzE1My1cdFx0XHRzaXplb2Yoc3RydWN0IGxvY2tzX2l0ZXJhdG9yKSwgTlVMTCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDQzMgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDE2NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYC9wcm9jL2xvY2tzYCBhbmQgT0ZEIExvY2tzIGluIGEgTmFtZXNwYWNlZCBDb250ZXh0KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBgL3Byb2MvbG9ja3NgIGhlcmUsIHNwZWNpZmljYWxseSBpbiBhIHNjZW5hcmlvIHdoZXJlIHdlIGhhdmUgT0ZEIGxvY2tzIHRoYXQgc3BhbiBkaWZmZXJlbnQgUElEIG5hbWVzcGFjZXMuIFRoZSBxdWVzdGlvbiBpczogaXMgdGhpcyBhIHBvdGVudGlhbCBhdHRhY2sgc3VyZmFjZSB3b3J0aCBpbnZlc3RpZ2F0aW5nIHdpdGggZnV6emluZz8gTGV0JiMzOTtzIGJyZWFrIGl0IGRvd24gYW5kIHNlZS4KClRoZSBzdGFydGluZyBwb2ludCBpcyB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBwYXRjaCBkb2VzLCByaWdodD8gRXNzZW50aWFsbHksIGl0JiMzOTtzIGFib3V0IGhvdyB0aGUga2VybmVsIHJlcG9ydHMgT0ZEIGxvY2tzIHdpdGhpbiBgL3Byb2MvbG9ja3NgLiBXaGVuIGAvcHJvYy9sb2Nrc2AgaXMgcmVhZCwgdGhlIGBsb2Nrc19zaG93KClgIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwbGF5aW5nIHRoZSBsb2NrIGluZm9ybWF0aW9uLiBOb3csIHRoZSBjcnV4IG9mIHRoZSBpc3N1ZSB3aXRoIE9GRCBsb2NrcyBpcyB0aGF0IHRoZXkmIzM5O3JlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yLCBub3QgdGhlIFBJRCBkaXJlY3RseS4gU28sIHdoZW4gdGhlIG91dHB1dCBuZWVkcyBhIFBJRCwgaXQgcmVwb3J0cyAtMSwgYnV0IGluIHRoZSBrZXJuZWwmIzM5O3MgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24sIGBmbGNfcGlkYCBob2xkcyB0aGUgb3duaW5nIHRocmVhZCBncm91cCBJRCAodGdpZCkuCgpUaGUgY29kZSB1c2VkIGBsb2Nrc190cmFuc2xhdGVfcGlkYCB0byByZXNvbHZlIHRoZSBQSUQsIHNvIG15IG5leHQgc3RlcCBpcyB0byBsb29rIGF0IHdoYXQgdGhhdCBmdW5jdGlvbiBkb2VzLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSByZWFsIGRldGFpbCB3aWxsIGxpa2VseSBiZS4gVGhhdCBpcyB3aGVyZSBJIGNhbiBhbmFseXplIHRoZSBiZWhhdmlvdXIgYW5kIGRlY2lkZSBpZiB0aGlzIGlzIGEgZ29vZCBhdHRhY2sgc3VyZmFjZSB0byBleHBsb2l0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsb2Nrc190cmFuc2xhdGVfcGlkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9sb2Nrcy5jPTIzNjU9RVhQT1JUX1NZTUJPTF9HUEwodmZzX3Rlc3RfbG9jayk7XG4tLVxuZnMvbG9ja3MuYy0yMzY3LS8qKlxuZnMvbG9ja3MuYzoyMzY4OiAqIGxvY2tzX3RyYW5zbGF0ZV9waWQgLSB0cmFuc2xhdGUgYSBmaWxlX2xvY2smIzM5O3MgZmxfcGlkIG51bWJlciBpbnRvIGEgbmFtZXNwYWNlXG5mcy9sb2Nrcy5jLTIzNjktICogQGZsOiBUaGUgZmlsZV9sb2NrIHdobyYjMzk7cyBmbF9waWQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcbi0tXG5mcy9sb2Nrcy5jLTIzNzMtICovXG5mcy9sb2Nrcy5jOjIzNzQ6c3RhdGljIHBpZF90IGxvY2tzX3RyYW5zbGF0ZV9waWQoc3RydWN0IGZpbGVfbG9ja19jb3JlICpmbCwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKVxuZnMvbG9ja3MuYy0yMzc1LXtcbi0tXG5mcy9sb2Nrcy5jPTI0MDE9c3RhdGljIGludCBwb3NpeF9sb2NrX3RvX2Zsb2NrKHN0cnVjdCBmbG9jayAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxuZnMvbG9ja3MuYy0yNDAyLXtcbmZzL2xvY2tzLmM6MjQwMzpcdGZsb2NrLVx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcdTAwMjZmbC1cdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xuZnMvbG9ja3MuYy0yNDA0LSNpZiBCSVRTX1BFUl9MT05HID09IDMyXG4tLVxuZnMvbG9ja3MuYz0yNDIzPXN0YXRpYyB2b2lkIHBvc2l4X2xvY2tfdG9fZmxvY2s2NChzdHJ1Y3QgZmxvY2s2NCAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxuZnMvbG9ja3MuYy0yNDI0LXtcbmZzL2xvY2tzLmM6MjQyNTpcdGZsb2NrLVx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcdTAwMjZmbC1cdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xuZnMvbG9ja3MuYy0yNDI2LVx0ZmxvY2stXHUwMDNlbF9zdGFydCA9IGZsLVx1MDAzZWZsX3N0YXJ0O1xuLS1cbmZzL2xvY2tzLmM9MjkyMT1zdGF0aWMgdm9pZCBsb2NrX2dldF9zdGF0dXMoc3RydWN0IHNlcV9maWxlICpmLCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsYyxcbi0tXG5mcy9sb2Nrcy5jLTI5MjktXG5mcy9sb2Nrcy5jOjI5MzA6XHRwaWQgPSBsb2Nrc190cmFuc2xhdGVfcGlkKGZsYywgcHJvY19waWRucyk7XG5mcy9sb2Nrcy5jLTI5MzEtXG4tLVxuZnMvbG9ja3MuYz0zMDE2PXN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXG4tLVxuZnMvbG9ja3MuYy0zMDQzLVxuZnMvbG9ja3MuYzozMDQ0Olx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuZnMvbG9ja3MuYy0zMDQ1LVx0XHRyZXR1cm4gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTQ5MAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIHRoZSBgbG9ja3NfdHJhbnNsYXRlX3BpZGAgSW1wbGVtZW50YXRpb24qKgoKT2theSwgdGltZSB0byBkaXZlIGludG8gYGxvY2tzX3RyYW5zbGF0ZV9waWRgLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoaXMgc3BlY2lmaWMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYW5kIHdoZXJlIGl0IHNpdHMgaW4gdGhlIGxhcmdlciBsb2NraW5nIHNjaGVtZS4gSXQmIzM5O3MgY3J1Y2lhbCwgb2J2aW91c2x5LCBiZWNhdXNlIGlmIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggUElEIHRyYW5zbGF0aW9uIHdpdGhpbiB0aGUgbG9jayBoaWVyYXJjaHksIHRoZXJlIGNvdWxkIGJlIHN1YnRsZSByYWNlIGNvbmRpdGlvbnMgb3IgdW5leHBlY3RlZCBiZWhhdmlvcnMgSSBuZWVkIHRvIGJlIGF3YXJlIG9mLiBJJiMzOTtsbCBuZWVkIHRvIGNvbnNpZGVyIHRoaW5ncyBsaWtlOiB3aGF0IGFyZSB0aGUgY29uY3VycmVuY3kgcHJpbWl0aXZlcyBiZWluZyB1c2VkPyBBcmUgdGhlcmUgcG90ZW50aWFsIGRlYWRsb2NrcywgYW5kIGlmIHNvLCB1bmRlciB3aGF0IGNvbmRpdGlvbnM/IEhvdyBkb2VzIHRoaXMgZnVuY3Rpb24gaGFuZGxlIGRpZmZlcmVudCBQSUQgbmFtZXNwYWNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcz8gSXMgdGhlcmUgYW55dGhpbmcgdW51c3VhbCBhYm91dCB0aGUgYWxnb3JpdGhtIGl0IHVzZXMsIG9yIGlzIGl0IGEgZmFpcmx5IHN0YW5kYXJkIHRyYW5zbGF0aW9uIGxvZ2ljPyBJJiMzOTtsbCBwcm9iYWJseSBzdGFydCBieSBxdWlja2x5IGdsYW5jaW5nIGF0IHRoZSBzb3VyY2UgY29kZSB0byBnZXQgYSBoaWdoLWxldmVsIHZpZXcsIHRoZW4gem9vbSBpbiBvbiBhbnkgYXJlYXMgdGhhdCBzZWVtIGNvbXBsZXggb3IgcG90ZW50aWFsbHkgcHJvYmxlbWF0aWMuIFNwZWNpZmljYWxseSwgSSYjMzk7bGwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgbG9jayBhY3F1aXNpdGlvbi9yZWxlYXNlIG9yZGVyIGFuZCB0aGUgYXRvbWljIG9wZXJhdGlvbnMgaW52b2x2ZWQuIEkgbWlnaHQgYWxzbyB3YW50IHRvIGNvbnN1bHQgdGhlIHJlbGV2YW50IGRlc2lnbiBkb2N1bWVudHMgb3IgY29tbWVudHMgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkga25vd24gY2F2ZWF0cyBvciBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucyB0byBrZWVwIGluIG1pbmQuIExldCYjMzk7cyBzZWUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9sb2Nrcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjM3MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMzcwOlx0ICogQG5zOiBUaGUgbmFtZXNwYWNlIGludG8gd2hpY2ggdGhlIHBpZCBzaG91bGQgYmUgdHJhbnNsYXRlZFxuMjM3MTpcdCAqXG4yMzcyOlx0ICogVXNlZCB0byB0cmFuc2xhdGUgYSBmbF9waWQgaW50byBhIG5hbWVzcGFjZSB2aXJ0dWFsIHBpZCBudW1iZXJcbjIzNzM6XHQgKi9cbjIzNzQ6XHRzdGF0aWMgcGlkX3QgbG9ja3NfdHJhbnNsYXRlX3BpZChzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpXG4yMzc1Olx0e1xuMjM3NjpcdFx0cGlkX3Qgdm5yO1xuMjM3NzpcdFx0c3RydWN0IHBpZCAqcGlkO1xuMjM3ODpcdFxuMjM3OTpcdFx0aWYgKGZsLVx1MDAzZWZsY19mbGFncyBcdTAwMjYgRkxfT0ZETENLKVxuMjM4MDpcdFx0XHRyZXR1cm4gLTE7XG4yMzgxOlx0XG4yMzgyOlx0XHQvKiBSZW1vdGUgbG9ja3MgcmVwb3J0IGEgbmVnYXRpdmUgcGlkIHZhbHVlICovXG4yMzgzOlx0XHRpZiAoZmwtXHUwMDNlZmxjX3BpZCBcdTAwM2M9IDApXG4yMzg0Olx0XHRcdHJldHVybiBmbC1cdTAwM2VmbGNfcGlkO1xuMjM4NTpcdFxuMjM4NjpcdFx0LypcbjIzODc6XHRcdCAqIElmIHRoZSBmbG9jayBvd25lciBwcm9jZXNzIGlzIGRlYWQgYW5kIGl0cyBwaWQgaGFzIGJlZW4gYWxyZWFkeVxuMjM4ODpcdFx0ICogZnJlZWQsIHRoZSB0cmFuc2xhdGlvbiBiZWxvdyB3b24mIzM5O3Qgd29yaywgYnV0IHdlIHN0aWxsIHdhbnQgdG8gc2hvd1xuMjM4OTpcdFx0ICogZmxvY2sgb3duZXIgcGlkIG51bWJlciBpbiBpbml0IHBpZG5zLlxuMjM5MDpcdFx0ICovXG4yMzkxOlx0XHRpZiAobnMgPT0gXHUwMDI2aW5pdF9waWRfbnMpXG4yMzkyOlx0XHRcdHJldHVybiAocGlkX3QpIGZsLVx1MDAzZWZsY19waWQ7XG4yMzkzOlx0XG4yMzk0Olx0XHRyY3VfcmVhZF9sb2NrKCk7XG4yMzk1Olx0XHRwaWQgPSBmaW5kX3BpZF9ucyhmbC1cdTAwM2VmbGNfcGlkLCBcdTAwMjZpbml0X3BpZF9ucyk7XG4yMzk2Olx0XHR2bnIgPSBwaWRfbnJfbnMocGlkLCBucyk7XG4yMzk3Olx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjIzOTg6XHRcdHJldHVybiB2bnI7XG4yMzk5Olx0fVxuMjQwMDpcdFxuMjQwMTpcdHN0YXRpYyBpbnQgcG9zaXhfbG9ja190b19mbG9jayhzdHJ1Y3QgZmxvY2sgKmZsb2NrLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbClcbjI0MDI6XHR7XG4yNDAzOlx0XHRmbG9jay1cdTAwM2VsX3BpZCA9IGxvY2tzX3RyYW5zbGF0ZV9waWQoXHUwMDI2ZmwtXHUwMDNlYywgdGFza19hY3RpdmVfcGlkX25zKGN1cnJlbnQpKTtcbjI0MDQ6XHQjaWYgQklUU19QRVJfTE9ORyA9PSAzMlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MzUwCgkJCQkJCQlvdXRwdXQ6IDI1CgkJCQkJCQl0aG91Z2h0czogNjAxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBgL3Byb2MvbG9ja3NgIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5vdGljZWQgdGhpcyBwYXRjaCBkZWFscyB3aXRoIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBhbmQgaG93IGl0IGhhbmRsZXMgYEZMX09GRExDS2AgbG9ja3MuIEkgc2VlIHRoYXQsIHByZXZpb3VzbHksIGBsb2Nrc190cmFuc2xhdGVfcGlkYCByZXR1cm5lZCAtMSBmb3IgT0ZETENLLCB3aGljaCB3YXMgcHJvYmxlbWF0aWMgYmVjYXVzZSBpdCBieXBhc3NlZCB0aGUgZXhpc3RpbmcgY2hlY2sgaW4gYGxvY2tzX3Nob3dgLiBUaGlzIG1lYW50IE9GRExDSyBsb2NrcyB3ZXJlIGFsd2F5cyBzaG93aW5nIHVwIGluIGAvcHJvYy9sb2Nrc2AsIGV2ZW4gaWYgdGhlIG93bmluZyBQSUQgd2FzbiYjMzk7dCB2aXNpYmxlIGluIHRoZSBjdXJyZW50IFBJRCBuYW1lc3BhY2XigJRlZmZlY3RpdmVseSBkaXNwbGF5aW5nIGEgbG9jayBiZWxvbmdpbmcgdG8gUElEIDAuIFRoYXQmIzM5O3MgYSBkZWZpbml0ZSBidWcuCgpUaGUgcGF0Y2ggaXRzZWxmIGFkZHJlc3NlcyB0aGlzLiBJdCBhZGRzIGEgY3J1Y2lhbCBjaGVjayB3aXRoaW4gYGxvY2tzX3Nob3dgIHRvIGZpbHRlciBPRkQgbG9ja3MuIE5vdywgaWYgdGhlIGxvY2sgaXMgYW4gT0ZEIGxvY2sgKGBGTF9PRkRMQ0tgKSAqYW5kKiBoYXMgYSBQSUQgZ3JlYXRlciB0aGFuIHplcm8sICphbmQqIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBpc24mIzM5O3QgdGhlIGluaXRpYWwgUElEIG5hbWVzcGFjZSwgaXQgc3BlY2lmaWNhbGx5IHZlcmlmaWVzIGlmIHRoZSBQSUQgaXMgYWN0dWFsbHkgdmlzaWJsZSB3aXRoaW4gdGhlIGN1cnJlbnQgYHByb2NfcGlkbnNgLiBJZiBpdCYjMzk7cyAqbm90KiB2aXNpYmxlLCBpdCByZXR1cm5zIDAsIGVzc2VudGlhbGx5IGhpZGluZyB0aGF0IGxvY2sgZW50cnkgZnJvbSBgL3Byb2MvbG9ja3NgLiBUaGF0JiMzOTtzIGEgY2xlYW4sIHRhcmdldGVkIGZpeC4KCk5vdywgdGhlIHJlYWwgcXVlc3Rpb24gaXM6IElzIHRoaXMgcGF0Y2ggZnV6ei13b3J0aHk/IExldCYjMzk7cyBjaGVjayB0aGUgY3JpdGVyaWEuIEl0IHNwZWNpZmljYWxseSBzYXlzIHRvICpub3QqIGZ1enogaWYgdGhlIGNoYW5nZXMgYXJlIGRvY3VtZW50YXRpb24sIGNvbW1lbnRzLCBkZWNvcmF0aXZlIGxvZ2dpbmcsIGNvbnN0YW50IGNoYW5nZXMgdGhhdCBkb24mIzM5O3QgYWx0ZXIgZXhlY3V0aW9uLCB1bnJlYWNoYWJsZSBjb2RlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgdmVuZG9yLXNwZWNpZmljIGhhcmR3YXJlIGRyaXZlcnMgdGhhdCBhcmUgdW5hdmFpbGFibGUgaW4gdmlydHVhbGl6YXRpb24sIGFuZCB0ZWFyZG93biBjYWxsYmFja3MuCgpUaGlzIHBhdGNoLCBob3dldmVyLCAqKmFic29sdXRlbHkqKiBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMuIEl0IHRvdWNoZXMgdGhlIGAvcHJvYy9sb2Nrc2AgZmlsZSwgd2hpY2ggaXMgYSBrZXkgY29tcG9uZW50IGZvciB0cmFjaW5nIGFuZCBtb25pdG9yaW5nIGZpbGUgbG9ja3MuIFJlYWRpbmcgb3Igb3BlbmluZyBgL3Byb2MvbG9ja3NgIHVzaW5nIGByZWFkKClgLCBgc2VxX3JlYWRgLCBvciBgZmNudGwoZmQsIEZfT0ZEX1NFVExLLCAuLi4pYCBpcyBjb21wbGV0ZWx5IGFjaGlldmFibGUgZnJvbSB1c2Vyc3BhY2UgaW4gKmFueSogdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQuIFRoaXMgaXMgYWNjZXNzaWJsZSBhbmQgcmVwcmVzZW50cyBjb3JlIGtlcm5lbCBsb2dpYyB0aGF0IGlzIGhpZ2hseSByZWxldmFudCB0byB0eXBpY2FsIHVzYWdlLCBldmVuIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIFFFTVUgb3IgR0NFLgoKVGhlcmVmb3JlLCAqeWVzKiwgSSB0aGluayB0aGlzIGlzIGEgY2FuZGlkYXRlIGZvciBmdXp6aW5nLiBJIG5lZWQgdG8gbm93IGRldGVybWluZSB0aGUgYmVzdCBgRm9jdXNTeW1ib2xzYCBhbmQgYEVuYWJsZUNvbmZpZ3NgIHRvIG1heGltaXplIGNvdmVyYWdlIGFuZCBlZmZlY3RpdmVuZXNzLiBJJiMzOTtsbCBuZWVkIHRvIGRpZyBpbnRvIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbnMgYW5kIGhvdyBgZnMvbG9ja3MuY2AgYW5kIGAvcHJvYy9sb2Nrc2AgYXJlIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgYW4gZWZmZWN0aXZlIGZ1enppbmcgY2FtcGFpZ24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2xvY2tzXFwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9NYWtlZmlsZT0zMz1vYmotJChDT05GSUdfRlNfVkVSSVRZKVx0XHQmIzQzOz0gdmVyaXR5L1xuZnMvTWFrZWZpbGU6MzQ6b2JqLSQoQ09ORklHX0ZJTEVfTE9DS0lORykgICAgICAmIzQzOz0gbG9ja3Mub1xuZnMvTWFrZWZpbGUtMzUtb2JqLSQoQ09ORklHX0JJTkZNVF9NSVNDKVx0JiM0Mzs9IGJpbmZtdF9taXNjLm9cbi0tXG5mcy9jZXBoL01ha2VmaWxlPTY9b2JqLSQoQ09ORklHX0NFUEhfRlMpICYjNDM7PSBjZXBoLm9cbmZzL2NlcGgvTWFrZWZpbGUtNy1cbmZzL2NlcGgvTWFrZWZpbGU6ODpjZXBoLXkgOj0gc3VwZXIubyBpbm9kZS5vIGRpci5vIGZpbGUubyBsb2Nrcy5vIGFkZHIubyBpb2N0bC5vIFxcXG5mcy9jZXBoL01ha2VmaWxlLTktXHRleHBvcnQubyBjYXBzLm8gc25hcC5vIHhhdHRyLm8gcXVvdGEubyBpby5vIFxcXG4tLVxuZnMvb2NmczIvTWFrZWZpbGU9MTE9b2NmczItb2JqcyA6PSBcXFxuLS1cbmZzL29jZnMyL01ha2VmaWxlLTI2LVx0bG9jYWxhbGxvYy5vIFx0XHRcXFxuZnMvb2NmczIvTWFrZWZpbGU6Mjc6XHRsb2Nrcy5vXHRcdFx0XFxcbmZzL29jZnMyL01ha2VmaWxlLTI4LVx0bW1hcC5vIFx0XHRcdFxcXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc3NTkKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipLY29uZmlnIERpdmU6IGBDT05GSUdfRklMRV9MT0NLSU5HYCoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgdHJhY2sgZG93biBgQ09ORklHX0ZJTEVfTE9DS0lOR2AuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgZ3JlcHBpbmcgdGhlIEtjb25maWcgZmlsZXMuIFRoaXMgb25lJiMzOTtzIGltcG9ydGFudDsgZmlsZSBsb2NraW5nIGNhbiBoYXZlIHNpZ25pZmljYW50IGltcGxpY2F0aW9ucyBmb3IgZmlsZXN5c3RlbSBjb25jdXJyZW5jeSBhbmQgZGF0YSBpbnRlZ3JpdHksIGRlcGVuZGluZyBvbiBob3cgaXQmIzM5O3MgaW1wbGVtZW50ZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBzY29wZSBhbmQgZGVwZW5kZW5jaWVzLiBBcmUgd2UgdGFsa2luZyBhYm91dCBhZHZpc29yeSBsb2NrcywgbWFuZGF0b3J5IGxvY2tzLCBvciBzb21ldGhpbmcgbW9yZSBudWFuY2VkPyBXaGF0IGZpbGVzeXN0ZW1zIGFyZSBhZmZlY3RlZD8gSG93IGlzIHRoaXMgZmVhdHVyZSAqYWN0dWFsbHkqIGJlaW5nIHVzZWQsIGFuZCB3aGF0IGFyZSB0aGUgYXJndW1lbnRzIGZvciBhbmQgYWdhaW5zdCBpdHMgcHJlc2VuY2Ugb3IgYWJzZW5jZSBpbiBkaWZmZXJlbnQgY29udGV4dHM/IEl0JiMzOTtzIGdvaW5nIHRvIGJlIGludGVyZXN0aW5nIHRvIHNlZSBob3cgdGhpcyBpcyBjb25maWd1cmVkIGFuZCB3aGVyZSBpdCBzaXRzIGluIHRoZSBicm9hZGVyIGZlYXR1cmUgc2V0LiBUaW1lIHRvIGRpZyBpbiBhbmQgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgRklMRV9MT0NLSU5HJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL0tjb25maWc9MTA4PWNvbmZpZyBFWFBPUlRGU19CTE9DS19PUFNcbi0tXG5mcy9LY29uZmlnLTExMy1cbmZzL0tjb25maWc6MTE0OmNvbmZpZyBGSUxFX0xPQ0tJTkdcbmZzL0tjb25maWctMTE1LVx0Ym9vbCBcJiMzNDtFbmFibGUgUE9TSVggZmlsZSBsb2NraW5nIEFQSVwmIzM0OyBpZiBFWFBFUlRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODA2MwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBLY29uZmlnIGZvciBGaWxlIFN5c3RlbSBEZXBlbmRlbmNpZXMqKgoKT2theSwgc28gSSYjMzk7bSB0cnlpbmcgdG8gZmlndXJlIG91dCBzb21lIHNwZWNpZmljcyB3aXRoaW4gdGhlIGZpbGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBjaGVjayBgZnMvS2NvbmZpZ2AuIFRoYXQmIzM5O3MgdXN1YWxseSB0aGUgZ28tdG8gc3BvdCBmb3IgZmlsZSBzeXN0ZW0tcmVsYXRlZCBvcHRpb25zIGFuZCBkZXBlbmRlbmNpZXMuIFNwZWNpZmljYWxseSwgSSYjMzk7bGwgc3RhcnQgYXJvdW5kIGxpbmUgMTE0LiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIGVpdGhlciBkaXJlY3QgZGVwZW5kZW5jaWVzIHRoYXQgbWlnaHQgc2hlZCBsaWdodCBvbiB0aGlzIGlzc3VlLCBvciBwZXJoYXBzIHNvbWUgaW5kaXJlY3QgZGVwZW5kZW5jaWVzIHRocm91Z2ggb3RoZXIgY29uZmlnIHN5bWJvbHMuIEl0JiMzOTtzIGEgc29saWQgZmlyc3Qgc3RlcCB0byBnZXQgYSBsYXkgb2YgdGhlIGxhbmQgYW5kIHVuZGVyc3RhbmQgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBkaWZmZXJlbnQgZmlsZSBzeXN0ZW0gZmVhdHVyZXMuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGp1bXBpbmctb2ZmIHBvaW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDExMDpcdFx0aGVscFxuIDExMTpcdFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBleHBvcnQgb3BlcmF0aW9ucyBmb3IgYSBmaWxlc3lzdGVtIHRvIHN1cHBvcnRcbiAxMTI6XHRcdCAgZXh0ZXJuYWwgYmxvY2sgSU8uXG4gMTEzOlx0XG4gMTE0Olx0Y29uZmlnIEZJTEVfTE9DS0lOR1xuIDExNTpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgUE9TSVggZmlsZSBsb2NraW5nIEFQSVwmIzM0OyBpZiBFWFBFUlRcbiAxMTY6XHRcdGRlZmF1bHQgeVxuIDExNzpcdFx0aGVscFxuIDExODpcdFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHN0YW5kYXJkIGZpbGUgbG9ja2luZyBzdXBwb3J0LCByZXF1aXJlZFxuIDExOTpcdFx0ICBmb3IgZmlsZXN5c3RlbXMgbGlrZSBORlMgYW5kIGZvciB0aGUgZmxvY2soKSBzeXN0ZW1cbiAxMjA6XHRcdCAgY2FsbC4gRGlzYWJsaW5nIHRoaXMgb3B0aW9uIHNhdmVzIGFib3V0IDExay5cbiAxMjE6XHRcbiAxMjI6XHRzb3VyY2UgXCYjMzQ7ZnMvY3J5cHRvL0tjb25maWdcJiMzNDtcbiAxMjM6XHRcbiAxMjQ6XHRzb3VyY2UgXCYjMzQ7ZnMvdmVyaXR5L0tjb25maWdcJiMzNDtcbiAxMjU6XHRcbiAxMjY6XHRzb3VyY2UgXCYjMzQ7ZnMvbm90aWZ5L0tjb25maWdcJiMzNDtcbiAxMjc6XHRcbiAxMjg6XHRzb3VyY2UgXCYjMzQ7ZnMvcXVvdGEvS2NvbmZpZ1wmIzM0O1xuIDEyOTpcdFxuIDEzMDpcdHNvdXJjZSBcJiMzNDtmcy9hdXRvZnMvS2NvbmZpZ1wmIzM0O1xuIDEzMTpcdHNvdXJjZSBcJiMzNDtmcy9mdXNlL0tjb25maWdcJiMzNDtcbiAxMzI6XHRzb3VyY2UgXCYjMzQ7ZnMvb3ZlcmxheWZzL0tjb25maWdcJiMzNDtcbiAxMzM6XHRcbiAxMzQ6XHRtZW51IFwmIzM0O0NhY2hlc1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NjA3CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogNDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBzZWUgd2hhdCYjMzk7cyBnb2luZyBvbiB3aXRoIGAvcHJvYy9sb2Nrc2AuIE15IGZpcnN0IHRob3VnaHQgaXMsIGlzIHRoaXMgZGVwZW5kZW50IG9uIGFueSBzcGVjaWZpYyBrZXJuZWwgY29uZmlndXJhdGlvbnMsIGxpa2UgYENPTkZJR19QUk9DX0ZTYCBvciBgQ09ORklHX1BJRF9OU2A/IEkgbmVlZCB0byBiZSBzdXJlIHRoZSBzeXN0ZW0gaGFzIHdoYXQgaXQgbmVlZHMgYmVmb3JlIEkgc3RhcnQgZGl2aW5nIGRlZXBlci4KCk5vdywgdG8gdW5kZXJzdGFuZCBpdHMgaW5pdGlhbGl6YXRpb24sIEkgc2hvdWxkIGNoZWNrIHRoZSBgcHJvY19sb2Nrc19pbml0YCBmdW5jdGlvbi4gVGhhdCB3aWxsIGJlIGluIGBmcy9sb2Nrcy5jYC4gVGhhdCBmdW5jdGlvbiBzaG91bGQgbGF5IG91dCB0aGUgZm91bmRhdGlvbnMgSSBhbSBsb29raW5nIGZvci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cHJvY19sb2Nrc19pbml0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2xvY2tzLmM9MzE0Mz1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxvY2tzX3NlcV9vcGVyYXRpb25zID0ge1xuLS1cbmZzL2xvY2tzLmMtMzE0OS1cbmZzL2xvY2tzLmM6MzE1MDpzdGF0aWMgaW50IF9faW5pdCBwcm9jX2xvY2tzX2luaXQodm9pZClcbmZzL2xvY2tzLmMtMzE1MS17XG4tLVxuZnMvbG9ja3MuYy0zMTU1LX1cbmZzL2xvY2tzLmM6MzE1Njpmc19pbml0Y2FsbChwcm9jX2xvY2tzX2luaXQpO1xuZnMvbG9ja3MuYy0zMTU3LSNlbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4OTI3CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYW5hbHlzaXMgb2YgdGhlIHByb3ZpZGVkIHNuaXBwZXQsIGFzIGlmIGl0IHdlcmUgbXkgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgZnMvbG9ja3MuY2AqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBmcy9sb2Nrcy5jYC4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIGhvdyBgcHJvY19sb2Nrc19pbml0YCBpcyBiZWluZyBoYW5kbGVkLiBUaGUgYCNpZmRlZmAgZGlyZWN0aXZlIGFyb3VuZCB0aGF0IGZ1bmN0aW9uIGlzIHdoYXQgSSYjMzk7bSBmb2N1c2luZyBvbi4gSXQmIzM5O3MgYSBrZXkgZGV0YWlsIHRvIHVuZGVyc3RhbmQgdGhlIGZsZXhpYmlsaXR5IG9mIHRoZSBsb2NraW5nIGltcGxlbWVudGF0aW9uLiBJIG5lZWQgdG8gZmlndXJlIG91dCB1bmRlciB3aGF0IGNvbmRpdGlvbnMgdGhpcyBpbml0aWFsaXphdGlvbiBpcyBpbmNsdWRlZCBvciBleGNsdWRlZC4gSSYjMzk7bSBhbHJlYWR5IHRoaW5raW5nIGFib3V0IHdoYXQgcHJlcHJvY2Vzc29yIG1hY3JvcyBhcmUgaW52b2x2ZWQgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uIGFuZCBidWlsZCBzZXR0aW5ncyBvZiB0aGlzIHBhcnRpY3VsYXIga2VybmVsIHZlcnNpb24uIEVzc2VudGlhbGx5LCBJJiMzOTttIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQtZGVwZW5kZW50IGJlaGF2aW9yIG9mIGBwcm9jX2xvY2tzX2luaXRgIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0gbG9ja2luZyBtb2R1bGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI5MDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjkwMDpcdFxuMjkwMTpcdFx0Y3R4ID0gbG9ja3NfaW5vZGVfY29udGV4dChpbm9kZSk7XG4yOTAyOlx0XHRpZiAoIWN0eClcbjI5MDM6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMjkwNDpcdFxuMjkwNTpcdFx0c3Bpbl9sb2NrKFx1MDAyNmN0eC1cdTAwM2VmbGNfbG9jayk7XG4yOTA2Olx0XHRyZXQgPSAhbGlzdF9lbXB0eShcdTAwMjZjdHgtXHUwMDNlZmxjX3Bvc2l4KSB8fCAhbGlzdF9lbXB0eShcdTAwMjZjdHgtXHUwMDNlZmxjX2Zsb2NrKTtcbjI5MDc6XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmN0eC1cdTAwM2VmbGNfbG9jayk7XG4yOTA4Olx0XHRyZXR1cm4gcmV0O1xuMjkwOTpcdH1cbjI5MTA6XHRFWFBPUlRfU1lNQk9MX0dQTCh2ZnNfaW5vZGVfaGFzX2xvY2tzKTtcbjI5MTE6XHRcbjI5MTI6XHQjaWZkZWYgQ09ORklHX1BST0NfRlNcbjI5MTM6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9wcm9jX2ZzLmhcdTAwM2VcbjI5MTQ6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9zZXFfZmlsZS5oXHUwMDNlXG4yOTE1Olx0XG4yOTE2Olx0c3RydWN0IGxvY2tzX2l0ZXJhdG9yIHtcbjI5MTc6XHRcdGludFx0bGlfY3B1O1xuMjkxODpcdFx0bG9mZl90XHRsaV9wb3M7XG4yOTE5Olx0fTtcbjI5MjA6XHRcbjI5MjE6XHRzdGF0aWMgdm9pZCBsb2NrX2dldF9zdGF0dXMoc3RydWN0IHNlcV9maWxlICpmLCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsYyxcbjI5MjI6XHRcdFx0XHQgICAgbG9mZl90IGlkLCBjaGFyICpwZngsIGludCByZXBlYXQpXG4yOTIzOlx0e1xuMjkyNDpcdFx0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XG4yOTI1Olx0XHR1bnNpZ25lZCBpbnQgcGlkO1xuMjkyNjpcdFx0c3RydWN0IHBpZF9uYW1lc3BhY2UgKnByb2NfcGlkbnMgPSBwcm9jX3BpZF9ucyhmaWxlX2lub2RlKGYtXHUwMDNlZmlsZSktXHUwMDNlaV9zYik7XG4yOTI3Olx0XHRpbnQgdHlwZSA9IGZsYy1cdTAwM2VmbGNfdHlwZTtcbjI5Mjg6XHRcdHN0cnVjdCBmaWxlX2xvY2sgKmZsID0gZmlsZV9sb2NrKGZsYyk7XG4yOTI5Olx0XG4yOTMwOlx0XHRwaWQgPSBsb2Nrc190cmFuc2xhdGVfcGlkKGZsYywgcHJvY19waWRucyk7XG4yOTMxOlx0XG4yOTMyOlx0XHQvKlxuMjkzMzpcdFx0ICogSWYgbG9jayBvd25lciBpcyBkZWFkIChhbmQgcGlkIGlzIGZyZWVkKSBvciBub3QgdmlzaWJsZSBpbiBjdXJyZW50XG4yOTM0Olx0XHQgKiBwaWRucywgemVybyBpcyBzaG93biBhcyBhIHBpZCB2YWx1ZS4gQ2hlY2sgbG9jayBpbmZvIGZyb21cbjI5MzU6XHRcdCAqIGluaXRfcGlkX25zIHRvIGdldCBzYXZlZCBsb2NrIHBpZCB2YWx1ZS5cbjI5MzY6XHRcdCAqL1xuMjkzNzpcdFx0aWYgKGZsYy1cdTAwM2VmbGNfZmlsZSAhPSBOVUxMKVxuMjkzODpcdFx0XHRpbm9kZSA9IGZpbGVfaW5vZGUoZmxjLVx1MDAzZWZsY19maWxlKTtcbjI5Mzk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTc4MQoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDkxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktlcm5lbCBDb25maWd1cmF0aW9uIEV4cGxvcmF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSBhbmQgaW1tZWRpYXRlbHkgSSBzZWUgYSBjcnVjaWFsIHBvaW50IG9uIGxpbmUgMjkxMjogaXQmIzM5O3MgYCNpZmRlZiBDT05GSUdfUFJPQ19GU2AhIFRoYXQmIzM5O3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LCBjb25maXJtaW5nIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIHByb2MgZmlsZXN5c3RlbS4gVGhlbiwganVzdCBhIGJpdCBmdXJ0aGVyIGRvd24sIG9uIGxpbmUgMzAzMCwgYSBjaGVjayBmb3IgYHByb2NfcGlkbnMgIT0gJmFtcDtpbml0X3BpZF9uc2AgcG9wcyB1cC4gVGhhdCYjMzk7cyBhIGRpcmVjdCBjb25uZWN0aW9uIHRvIFBJRCBuYW1lc3BhY2VzIGFuZCBJIGFtIGNlcnRhaW4gdGhpcyBtdXN0IHJlbGF0ZSB0byBgQ09ORklHX1BJRF9OU2AuIFNvLCBub3cgSSBuZWVkIHRvIGNvbmZpcm0gdGhvc2UgdGhyZWUgY29uZmlndXJhdGlvbnM6IGBDT05GSUdfUFJPQ19GU2AsIGBDT05GSUdfUElEX05TYCwgYW5kIGFsc28sIGp1c3QgdG8gYmUgdGhvcm91Z2gsIGxldCYjMzk7cyBzZWUgd2hlcmUgYENPTkZJR19GSUxFX0xPQ0tJTkdgIGNvbWVzIGluLiBJdCYjMzk7cyB0aW1lIHRvIGNvbmZpcm0gdGhlc2UgcmVsYXRpb25zaGlwcywgYW5kIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIGV4YWN0bHkgaG93IGBQSURfTlNgIGlzIGRlZmluZWQgdG8gZ2V0IGEgZnVsbCB1bmRlcnN0YW5kaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgUElEX05TJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5pdC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5pdC9LY29uZmlnPTE0NDY9Y29uZmlnIFVTRVJfTlNcbi0tXG5pbml0L0tjb25maWctMTQ1OS1cbmluaXQvS2NvbmZpZzoxNDYwOmNvbmZpZyBQSURfTlNcbmluaXQvS2NvbmZpZy0xNDYxLVx0Ym9vbCBcJiMzNDtQSUQgTmFtZXNwYWNlc1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDE3MgoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQmIzM5O3MgaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipDaGVja2luZyBgQ09ORklHX1BST0NfRlNgIGluIGBmcy9wcm9jL0tjb25maWdgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIHByb2MgZmlsZXN5c3RlbSBjb25maWd1cmF0aW9uLiBJdCYjMzk7cyBzZWNvbmQgbmF0dXJlIGF0IHRoaXMgcG9pbnQg4oCTIEkmIzM5O20gdGhpbmtpbmcsICYjMzQ7TGV0JiMzOTtzIGNoZWNrIGBDT05GSUdfUFJPQ19GU2AgaW4gYGZzL3Byb2MvS2NvbmZpZ2AuJiMzNDsgR290dGEgbWFrZSBzdXJlIHRoaXMgZnVuZGFtZW50YWwgY29tcG9uZW50IGlzIGVuYWJsZWQgb3IgcHJvcGVybHkgY29uZmlndXJlZC4gS25vd2luZyB0aGlzLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGVsc2UgcmVsaWVzIG9uIGl0LCBhbmQgd2hhdCBteSBnb2FsIG9mIHVuZGVyc3RhbmRpbmcgdGhlIGN1cnJlbnQgc3lzdGVtLiBHb3R0YSBlbnN1cmUgaXQmIzM5O3Mgc2V0IGNvcnJlY3RseS4gQWZ0ZXIgYWxsLCBgcHJvY2ZzYCBpcyBwcmFjdGljYWxseSB0aGUgYmFja2JvbmUgZm9yIHN5c3RlbSBtb25pdG9yaW5nLCBkZWJ1Z2dpbmcsIGFuZCBwcm92aWRpbmcgaW5mb3JtYXRpb24gdG8gdXNlcnNwYWNlLiBJJiMzOTtsbCBuZWVkIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBjaGVjayBpcyBnb2luZyB0byBiZSBwYXJ0IG9mIGEgYmlnZ2VyIHByb2plY3Q7IHRoZXJlZm9yZSwgSSBtdXN0IGVuc3VyZSBJIGRvIG15IGR1ZSBkaWxpZ2VuY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBQUk9DX0ZTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL3Byb2MvS2NvbmZpZy0xLSMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuZnMvcHJvYy9LY29uZmlnOjI6Y29uZmlnIFBST0NfRlNcbmZzL3Byb2MvS2NvbmZpZy0zLVx0Ym9vbCBcJiMzNDsvcHJvYyBmaWxlIHN5c3RlbSBzdXBwb3J0XCYjMzQ7IGlmIEVYUEVSVFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDQ3NAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDcyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBGb2N1c1N5bWJvbHMgYW5kIExvY2sgSW5mb3JtYXRpb24qKgoKT2theSwgc28gd2UmIzM5O3JlIGxvb2tpbmcgYXQgYEZvY3VzU3ltYm9sc2AsIGFuZCB0aGUgcGF0Y2ggaGlnaGxpZ2h0cyBhIG1vZGlmaWNhdGlvbiB0byBgbG9ja3Nfc2hvd2AuIEhtbSwgdGhhdCByaW5ncyBhIGJlbGwuIFdhaXQgYSBtaW51dGUsIGlzbiYjMzk7dCBgbG9ja3Nfc2hvd2AgZGVmaW5lZCBhcyBgc3RhdGljYCB3aXRoaW4gYGZzL2xvY2tzLmNgPyBZZXAsIGl0IGlzLiBBbHJpZ2h0LCB0aGF0IGNoYW5nZXMgdGhlIGFwcHJvYWNoIGEgYml0LiBOb3cgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgKnVzZWQqLiBTaW5jZSBpdCYjMzk7cyBzdGF0aWMsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBlbnRyeXBvaW50cyB0aGF0IGludm9sdmUgaXQsIGFuZCBzcGVjaWZpY2FsbHksIHdoYXQgZnVuY3Rpb25zICpjYWxsKiBgbG9ja3Nfc2hvd2AgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4gTGV0JiMzOTtzIHN0YXJ0IGJ5IGRpZ2dpbmcgaW50byB0aGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyBhbmQgaWRlbnRpZnkgdGhlIGNhbGxlcnMuIFRoYXQgc2hvdWxkIHBhaW50IGEgY2xlYXJlciBwaWN0dXJlIG9mIGl0cyByb2xlIGluIHRoaXMgc3lzdGVtLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2xvY2tzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMTM1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzMxMzU6XHRcbjMxMzY6XHRzdGF0aWMgdm9pZCBsb2Nrc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdilcbjMxMzc6XHRcdF9fcmVsZWFzZXMoXHUwMDI2YmxvY2tlZF9sb2NrX2xvY2spXG4zMTM4Olx0e1xuMzEzOTpcdFx0c3Bpbl91bmxvY2soXHUwMDI2YmxvY2tlZF9sb2NrX2xvY2spO1xuMzE0MDpcdFx0cGVyY3B1X3VwX3dyaXRlKFx1MDAyNmZpbGVfcndzZW0pO1xuMzE0MTpcdH1cbjMxNDI6XHRcbjMxNDM6XHRzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxvY2tzX3NlcV9vcGVyYXRpb25zID0ge1xuMzE0NDpcdFx0LnN0YXJ0XHQ9IGxvY2tzX3N0YXJ0LFxuMzE0NTpcdFx0Lm5leHRcdD0gbG9ja3NfbmV4dCxcbjMxNDY6XHRcdC5zdG9wXHQ9IGxvY2tzX3N0b3AsXG4zMTQ3Olx0XHQuc2hvd1x0PSBsb2Nrc19zaG93LFxuMzE0ODpcdH07XG4zMTQ5Olx0XG4zMTUwOlx0c3RhdGljIGludCBfX2luaXQgcHJvY19sb2Nrc19pbml0KHZvaWQpXG4zMTUxOlx0e1xuMzE1MjpcdFx0cHJvY19jcmVhdGVfc2VxX3ByaXZhdGUoXCYjMzQ7bG9ja3NcJiMzNDssIDAsIE5VTEwsIFx1MDAyNmxvY2tzX3NlcV9vcGVyYXRpb25zLFxuMzE1MzpcdFx0XHRcdHNpemVvZihzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IpLCBOVUxMKTtcbjMxNTQ6XHRcdHJldHVybiAwO1xuMzE1NTpcdH1cbjMxNTY6XHRmc19pbml0Y2FsbChwcm9jX2xvY2tzX2luaXQpO1xuMzE1NzpcdCNlbmRpZlxuMzE1ODpcdFxuMzE1OTpcdHN0YXRpYyBpbnQgX19pbml0IGZpbGVsb2NrX2luaXQodm9pZClcbjMxNjA6XHR7XG4zMTYxOlx0XHRpbnQgaTtcbjMxNjI6XHRcbjMxNjM6XHRcdGZsY3R4X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoXCYjMzQ7ZmlsZV9sb2NrX2N0eFwmIzM0OyxcbjMxNjQ6XHRcdFx0XHRzaXplb2Yoc3RydWN0IGZpbGVfbG9ja19jb250ZXh0KSwgMCwgU0xBQl9QQU5JQywgTlVMTCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMTkwCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMTQzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTG9ja3MgSW1wbGVtZW50YXRpb24qKgoKT2theSwgc28gYGxvY2tzX3Nob3dgIGlzIGEgZnVuY3Rpb24gcG9pbnRlciB3aXRoaW4gYGxvY2tzX3NlcV9vcGVyYXRpb25zYCwgc3BlY2lmaWNhbGx5IGZvciB0aGUgYC5zaG93YCBvcGVyYXRpb24uIFRoZSBjcml0aWNhbCBwb2ludCBpcyB0aGF0IGl0cyBhZGRyZXNzIGlzIGJlaW5nIHRha2VuLiBCZWNhdXNlIG9mIHRoaXMsIGV2ZW4gaWYgaXQgd2VyZSBhIHN0YXRpYyBmdW5jdGlvbiwgdGhlIGNvbXBpbGVyICp3b24mIzM5O3QqIGlubGluZSBpdC4gSXQmIzM5O2xsIGhhdmUgaXRzIG93biBkaXN0aW5jdCBzeW1ib2wgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZS4gVGhpcyBoYXMgaW1wbGljYXRpb25zIGZvciBob3cgaXQmIzM5O3MgcmVzb2x2ZWQgYW5kIGxpbmtlZC4KCkFscmlnaHQsIGJlZm9yZSBkaXZpbmcgdG9vIGRlZXAsIGxldCYjMzk7cyBicm9hZGVuIHRoZSBzY29wZS4gSSBuZWVkIHRvIHNlZSB0aGUgYnJvYWRlciBjb250ZXh0IHdpdGhpbiBgZnMvbG9ja3MuY2AuIEFyZSB0aGVyZSBvdGhlciBmdW5jdGlvbnMgd2l0aGluIHRoYXQgZmlsZSBkaXJlY3RseSByZWxhdGVkIHRvIE9GRCAoT3BlbiBGaWxlIERlc2NyaXB0aW9uKSBsb2NrcyBvciwgY3J1Y2lhbGx5LCByZWxhdGVkIHRvIGBsb2Nrc19zaG93YCBpdHNlbGY/IEl0JiMzOTtzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXBzLgoKSG9sZCBvbiBhIHNlY29uZCwgYmVmb3JlIEkgZ2V0IGNhcnJpZWQgYXdheS4gTGV0JiMzOTtzIHN0ZXAgYmFjayBhbmQgY29uc2lkZXIgdGhlICplbnRyeSBwb2ludHMqIGZvciBgZmNudGxgIGxvY2tzLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGNyaXRpY2FsIGZ1bmN0aW9uczogYGZjbnRsX3NldGxrYCwgYGZjbnRsX3NldGxrNjRgLCBgZG9fbG9ja19maWxlX3dhaXRgLCBgdmZzX2xvY2tfZmlsZWAuLi4gdGhpbmdzIGxpa2UgdGhhdC4gV2UgcmVhbGx5IG5lZWQgdG8gbG9vayBhdCB0aGVzZSBlbnRyeSBwb2ludHMgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdy4gSSBuZWVkIHRvIHNlYXJjaCBmb3IgdGhvc2UgYGZjbnRsYCBsb2NrIGVudHJ5cG9pbnRzIHRvIGdldCBhIGZ1bGwgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmNudGxfc2V0bGsmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZmNudGwuYz00NDQ9c3RhdGljIGxvbmcgZG9fZmNudGwoaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyxcbi0tXG5mcy9mY250bC5jLTQ5OS1cdFx0XHRyZXR1cm4gLUVGQVVMVDtcbmZzL2ZjbnRsLmM6NTAwOlx0XHRlcnIgPSBmY250bF9zZXRsayhmZCwgZmlscCwgY21kLCBcdTAwMjZmbG9jayk7XG5mcy9mY250bC5jLTUwMS1cdFx0YnJlYWs7XG4tLVxuZnMvZmNudGwuYz02MDg9U1lTQ0FMTF9ERUZJTkUzKGZjbnRsNjQsIHVuc2lnbmVkIGludCwgZmQsIHVuc2lnbmVkIGludCwgY21kLFxuLS1cbmZzL2ZjbnRsLmMtNjQ0LVx0XHRcdGJyZWFrO1xuZnMvZmNudGwuYzo2NDU6XHRcdGVyciA9IGZjbnRsX3NldGxrNjQoZmQsIGZkX2ZpbGUoZiksIGNtZCwgXHUwMDI2ZmxvY2spO1xuZnMvZmNudGwuYy02NDYtXHRcdGJyZWFrO1xuLS1cbmZzL2ZjbnRsLmM9NzQzPXN0YXRpYyBsb25nIGRvX2NvbXBhdF9mY250bDY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCxcbi0tXG5mcy9mY250bC5jLTc4Ny1cdFx0XHRicmVhaztcbmZzL2ZjbnRsLmM6Nzg4Olx0XHRlcnIgPSBmY250bF9zZXRsayhmZCwgZmRfZmlsZShmKSwgY29udmVydF9mY250bF9jbWQoY21kKSwgXHUwMDI2ZmxvY2spO1xuZnMvZmNudGwuYy03ODktXHRcdGJyZWFrO1xuLS1cbmZzL2ZjbnRsLmMtNzk2LVx0XHRcdGJyZWFrO1xuZnMvZmNudGwuYzo3OTc6XHRcdGVyciA9IGZjbnRsX3NldGxrKGZkLCBmZF9maWxlKGYpLCBjb252ZXJ0X2ZjbnRsX2NtZChjbWQpLCBcdTAwMjZmbG9jayk7XG5mcy9mY250bC5jLTc5OC1cdFx0YnJlYWs7XG4tLVxuZnMvbG9ja3MuYz0yNTQ4PWNoZWNrX2Ztb2RlX2Zvcl9zZXRsayhzdHJ1Y3QgZmlsZV9sb2NrICpmbClcbi0tXG5mcy9sb2Nrcy5jLTI1NjQtICovXG5mcy9sb2Nrcy5jOjI1NjU6aW50IGZjbnRsX3NldGxrKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXG5mcy9sb2Nrcy5jLTI1NjYtXHRcdHN0cnVjdCBmbG9jayAqZmxvY2spXG4tLVxuZnMvbG9ja3MuYy0yNjM1LW91dDpcbmZzL2xvY2tzLmM6MjYzNjpcdHRyYWNlX2ZjbnRsX3NldGxrKGlub2RlLCBmaWxlX2xvY2ssIGVycm9yKTtcbmZzL2xvY2tzLmMtMjYzNy1cdGxvY2tzX2ZyZWVfbG9jayhmaWxlX2xvY2spO1xuLS1cbmZzL2xvY2tzLmM9MjY0NT1pbnQgZmNudGxfZ2V0bGs2NChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGZsb2NrNjQgKmZsb2NrKVxuLS1cbmZzL2xvY2tzLmMtMjY4Ny0gKi9cbmZzL2xvY2tzLmM6MjY4ODppbnQgZmNudGxfc2V0bGs2NCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuZnMvbG9ja3MuYy0yNjg5LVx0XHRzdHJ1Y3QgZmxvY2s2NCAqZmxvY2spXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMjkyCgkJCQkJCQlvdXRwdXQ6IDEwMwoJCQkJCQkJdGhvdWdodHM6IDIyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciBgbG9ja3Nfc2hvd2AqKgoKT2theSwgc28gdGhpcyBwYXRjaCAqc3BlY2lmaWNhbGx5KiB0b3VjaGVzIHRoZSBgbG9ja3Nfc2hvd2AgZnVuY3Rpb24uIExldCBtZSBxdWlja2x5IGNvbmZpcm0gdGhhdCBieSBjaGVja2luZyB0aGUgZGlmZi4gWXVwLCBqdXN0IGBsb2Nrc19zaG93YCBpbiBgZnMvbG9ja3MuY2AuIEdvb2QuCgpOb3csIGlzIHRoaXMgZXZlbiAqd29ydGgqIGZ1enppbmc/IEFic29sdXRlbHkuIEl0JiMzOTtzIGtlcm5lbCBjb3JlIGxvZ2ljLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBgL3Byb2MvbG9ja3NgIGFuZCBob3cgaXQgaGFuZGxlcyBPRkQgbG9ja3MgYWNyb3NzIFBJRCBuYW1lc3BhY2VzLiBUaGF0JiMzOTtzIGEgZGVmaW5pdGUgJiMzNDt5ZXMmIzM0OyBpbiBteSBib29rLgoKTXkgZnV6emluZyBmb2N1cyB3aWxsIGRlZmluaXRlbHkgYmUgb24gYGxvY2tzX3Nob3dgLiBJJiMzOTtsbCBjb25zaWRlciBhZGRpbmcgYGZjbnRsX3NldGxrYCBhbmQgYGZjbnRsX3NldGxrNjRgIGlmIEkgZmluZCB0aGV5IG9mZmVyIHNvbWUgY292ZXJhZ2UsIGJ1dCBgbG9ja3Nfc2hvd2AgaXMgdGhlIGRpcmVjdCB0YXJnZXQuCgpUaGUgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMgYXJlIGNsZWFyOiBgRklMRV9MT0NLSU5HYCwgYFBST0NfRlNgLCBhbmQgYFBJRF9OU2AuIEdvdCBpdC4gTm8gcHJlZml4LCBqdXN0IHRoZSBzeW1ib2xzIGFzLWlzLgoKQWxyaWdodCwgZG91YmxlLWNoZWNraW5nIGV2ZXJ5dGhpbmfigKYgV2UmIzM5O3ZlIGV4dHJhY3RlZCB0aGUgZnVuY3Rpb24sIGlkZW50aWZpZWQgdGhlIENPTkZJRyBvcHRpb25zLCBhbmQgY29uZmlybWVkIGl0JiMzOTtzIHdvcnRoIGZ1enppbmcuIEkmIzM5O20gcmVhZHkgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLiBMZXQmIzM5O3MgZ2V0IHRoaXMgZnV6emluZyBydW4gZ29pbmchCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtGSUxFX0xPQ0tJTkcmIzM0OywKICAgICYjMzQ7UFJPQ19GUyYjMzQ7LAogICAgJiMzNDtQSURfTlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtsb2Nrc19zaG93JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGBsb2Nrc19zaG93KClgIGluIGZzL2xvY2tzLmMgdG8gcHJvcGVybHkgZmlsdGVyIE9wZW4gRmlsZSBEZXNjcmlwdGlvbiAoT0ZEKSBsb2NrcyB3aGVuIHJlYWRpbmcgL3Byb2MvbG9ja3MgZnJvbSB3aXRoaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoaXMgaXMgY29yZSBmaWxlc3lzdGVtIGxvZ2ljIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0ZJTEVfTE9DS0lORyYjMzQ7LAogICAgJiMzNDtQUk9DX0ZTJiMzNDssCiAgICAmIzM0O1BJRF9OUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2xvY2tzX3Nob3cmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgYGxvY2tzX3Nob3coKWAgaW4gZnMvbG9ja3MuYyB0byBwcm9wZXJseSBmaWx0ZXIgT3BlbiBGaWxlIERlc2NyaXB0aW9uIChPRkQpIGxvY2tzIHdoZW4gcmVhZGluZyAvcHJvYy9sb2NrcyBmcm9tIHdpdGhpbiBub24taW5pdCBQSUQgbmFtZXNwYWNlcy4gVGhpcyBpcyBjb3JlIGZpbGVzeXN0ZW0gbG9naWMgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgYGxvY2tzX3Nob3coKWAgaW4gYGZzL2xvY2tzLmNgIHRvIHByb3Blcmx5IGZpbHRlciBvcGVuIGZpbGUgZGVzY3JpcHRvciAoT0ZEKSBsb2NrcyBpbiBub24taW5pdCBQSUQgbmFtZXNwYWNlcy4gVGhlIGNoYW5nZXMgb25seSBpbnRyb2R1Y2Ugc2NhbGFyIHN0YWNrIHZhcmlhYmxlcyAoYHZpc2libGVgIGluaXRpYWxpemVkIHRvIGBmYWxzZWAsIGBwaWRgIHBvaW50ZXIgYXNzaWduZWQgZnJvbSBgZmluZF9waWRfbnMoKWApIGFuZCBwZXJmb3JtIG5hbWVzcGFjZSB0cmFuc2xhdGlvbiBjaGVja3MgdW5kZXIgUkNVLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkLCBhbGxvY2F0ZWQsIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBwYWRkaW5nIG9yIHN0cnVjdCBmaWVsZHMgYXJlIGxlZnQgdW5pbml0aWFsaXplZC4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWQwOTlhMzNkNjgzODZmMTQ1YmZhODNhNGNlNDJjZWIyNmM5ZGZmNApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgU2VwIDMgMDk6MTY6MTIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuYwppbmRleCA2ZTRmZjdmY2VjMDUzLi40YWYxMzg1NjgyZTRlIDEwMDY0NAotLS0gYS9mcy9sb2Nrcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2xvY2tzLmMKQEAgLTMwMjIsNiAmIzQzOzMwMjIsMjUgQEAgc3RhdGljIGludCBsb2Nrc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdikKIAogCWN1ciA9IGhsaXN0X2VudHJ5KHYsIHN0cnVjdCBmaWxlX2xvY2tfY29yZSwgZmxjX2xpbmspOwogCiYjNDM7CS8qCiYjNDM7CSAqIE9GRCBsb2NrcyBhcmUgcmVwb3J0ZWQgd2l0aCBwaWQgLTEsIHNvIHRoZSBmaWx0ZXIgYmVsb3cgY2Fubm90IHNlZQomIzQzOwkgKiB0aGVpciBvd25lcjsgZmxjX3BpZCBob2xkcyB0aGUgb3duZXIgdGdpZCwgc28gZmlsdGVyIG9uIGl0LgomIzQzOwkgKiBSZW1vdGUgbG9ja3Mga2VlcCBhIG5lZ2F0aXZlIGZsY19waWQgYW5kIHN0YXkgdmlzaWJsZSBhcyBiZWZvcmUuCiYjNDM7CSAqLwomIzQzOwlpZiAoKGN1ci0mZ3Q7ZmxjX2ZsYWdzICZhbXA7IEZMX09GRExDSykgJmFtcDsmYW1wOyBjdXItJmd0O2ZsY19waWQgJmd0OyAwICZhbXA7JmFtcDsKJiM0MzsJICAgIHByb2NfcGlkbnMgIT0gJmFtcDtpbml0X3BpZF9ucykgewomIzQzOwkJc3RydWN0IHBpZCAqcGlkOwomIzQzOwkJYm9vbCB2aXNpYmxlID0gZmFsc2U7CiYjNDM7CiYjNDM7CQlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CQlwaWQgPSBmaW5kX3BpZF9ucyhjdXItJmd0O2ZsY19waWQsICZhbXA7aW5pdF9waWRfbnMpOwomIzQzOwkJaWYgKHBpZCkKJiM0MzsJCQl2aXNpYmxlID0gcGlkX25yX25zKHBpZCwgcHJvY19waWRucykgIT0gMDsKJiM0MzsJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJaWYgKCF2aXNpYmxlKQomIzQzOwkJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiAJaWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKQogCQlyZXR1cm4gMDsKIAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjI1NgoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGFuYWx5c2lzIG9mIHRoZSBzaXR1YXRpb246CgoqKkRlY29uc3RydWN0aW5nIHRoZSBQYXRjaCoqCgpPa2F5LCB0aW1lIHRvIGdldCB0byB3b3JrLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaC4gVGhlIGluc3RydWN0aW9ucyBhcmUgc3RyYWlnaHRmb3J3YXJkIGVub3VnaDogYW5hbHl6ZSB0aGUgY2hhbmdlcy4gSXQgbG9va3MgbGlrZSB0aGUgdGFyZ2V0IGlzIGEgbW9kaWZpY2F0aW9uIHRvIGBmcy9sb2Nrcy5jYCwgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgYGxvY2tzX3Nob3dgIGZ1bmN0aW9uLCB3aGljaCBpcyBhIGtleSBhcmVhIGZvciBsb2NrIHZpc3VhbGl6YXRpb24uIEdpdmVuIHRoZSBuYXR1cmUgb2YgdGhpcywgSSYjMzk7bGwgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgZXhpc3RpbmcgbG9ja2luZyBpbmZyYXN0cnVjdHVyZSB3b3JrcyB0byBpZGVudGlmeSBhbnkgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuIEl0IGFwcGVhcnMgdGhhdCB0aGUgbW9kaWZpY2F0aW9ucyBhcmUgaW4gb3IgYXJvdW5kIGxpbmUgMzAyMiwgc28gSSB3aWxsIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIGlkZW50aWZ5IGFueSBhcmVhcyBvZiBjb25jZXJuLiBJJiMzOTtsbCB1c2UgYHJlYWQtZmlsZWAgb3IgYGdyZXBwZXJgIHRvIHF1aWNrbHkgYnJpbmcgdGhlIHJlbGV2YW50IHNlY3Rpb24gaW50byB2aWV3LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2xvY2tzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMDEwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzMwMTA6XHRcdFx0cmV0dXJuIE5VTEw7XG4zMDExOlx0XHR9XG4zMDEyOlx0XG4zMDEzOlx0XHRyZXR1cm4gdG1wO1xuMzAxNDpcdH1cbjMwMTU6XHRcbjMwMTY6XHRzdGF0aWMgaW50IGxvY2tzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxuMzAxNzpcdHtcbjMwMTg6XHRcdHN0cnVjdCBsb2Nrc19pdGVyYXRvciAqaXRlciA9IGYtXHUwMDNlcHJpdmF0ZTtcbjMwMTk6XHRcdHN0cnVjdCBmaWxlX2xvY2tfY29yZSAqY3VyLCAqdG1wO1xuMzAyMDpcdFx0c3RydWN0IHBpZF9uYW1lc3BhY2UgKnByb2NfcGlkbnMgPSBwcm9jX3BpZF9ucyhmaWxlX2lub2RlKGYtXHUwMDNlZmlsZSktXHUwMDNlaV9zYik7XG4zMDIxOlx0XHRpbnQgbGV2ZWwgPSAwO1xuMzAyMjpcdFxuMzAyMzpcdFx0Y3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7XG4zMDI0Olx0XG4zMDI1Olx0XHQvKlxuMzAyNjpcdFx0ICogT0ZEIGxvY2tzIGFyZSByZXBvcnRlZCB3aXRoIHBpZCAtMSwgc28gdGhlIGZpbHRlciBiZWxvdyBjYW5ub3Qgc2VlXG4zMDI3Olx0XHQgKiB0aGVpciBvd25lcjsgZmxjX3BpZCBob2xkcyB0aGUgb3duZXIgdGdpZCwgc28gZmlsdGVyIG9uIGl0LlxuMzAyODpcdFx0ICogUmVtb3RlIGxvY2tzIGtlZXAgYSBuZWdhdGl2ZSBmbGNfcGlkIGFuZCBzdGF5IHZpc2libGUgYXMgYmVmb3JlLlxuMzAyOTpcdFx0ICovXG4zMDMwOlx0XHRpZiAoKGN1ci1cdTAwM2VmbGNfZmxhZ3MgXHUwMDI2IEZMX09GRExDSykgXHUwMDI2XHUwMDI2IGN1ci1cdTAwM2VmbGNfcGlkIFx1MDAzZSAwIFx1MDAyNlx1MDAyNlxuMzAzMTpcdFx0ICAgIHByb2NfcGlkbnMgIT0gXHUwMDI2aW5pdF9waWRfbnMpIHtcbjMwMzI6XHRcdFx0c3RydWN0IHBpZCAqcGlkO1xuMzAzMzpcdFx0XHRib29sIHZpc2libGUgPSBmYWxzZTtcbjMwMzQ6XHRcbjMwMzU6XHRcdFx0cmN1X3JlYWRfbG9jaygpO1xuMzAzNjpcdFx0XHRwaWQgPSBmaW5kX3BpZF9ucyhjdXItXHUwMDNlZmxjX3BpZCwgXHUwMDI2aW5pdF9waWRfbnMpO1xuMzAzNzpcdFx0XHRpZiAocGlkKVxuMzAzODpcdFx0XHRcdHZpc2libGUgPSBwaWRfbnJfbnMocGlkLCBwcm9jX3BpZG5zKSAhPSAwO1xuMzAzOTpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbjMwNDA6XHRcdFx0aWYgKCF2aXNpYmxlKVxuMzA0MTpcdFx0XHRcdHJldHVybiAwO1xuMzA0MjpcdFx0fVxuMzA0MzpcdFxuMzA0NDpcdFx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuMzA0NTpcdFx0XHRyZXR1cm4gMDtcbjMwNDY6XHRcbjMwNDc6XHRcdC8qIFZpZXcgdGhpcyBjcm9zc2VkIGxpbmtlZCBsaXN0IGFzIGEgYmluYXJ5IHRyZWUsIHRoZSBmaXJzdCBtZW1iZXIgb2YgZmxjX2Jsb2NrZWRfcmVxdWVzdHNcbjMwNDg6XHRcdCAqIGlzIHRoZSBsZWZ0IGNoaWxkIG9mIGN1cnJlbnQgbm9kZSwgdGhlIG5leHQgc2lsaWJpbmcgaW4gZmxjX2Jsb2NrZWRfbWVtYmVyIGlzIHRoZVxuMzA0OTpcdFx0ICogcmlnaHQgY2hpbGQsIHdlIGNhbiBhbHNlIGdldCB0aGUgcGFyZW50IG9mIGN1cnJlbnQgbm9kZSBmcm9tIGZsY19ibG9ja2VyLCBzbyB0aGlzXG4zMDUwOlx0XHQgKiBxdWVzdGlvbiBiZWNvbWVzIHRyYXZlcnNhbCBvZiBhIGJpbmFyeSB0cmVlXG4zMDUxOlx0XHQgKi9cbjMwNTI6XHRcdHdoaWxlIChjdXIgIT0gTlVMTCkge1xuMzA1MzpcdFx0XHRpZiAobGV2ZWwpXG4zMDU0Olx0XHRcdFx0bG9ja19nZXRfc3RhdHVzKGYsIGN1ciwgaXRlci1cdTAwM2VsaV9wb3MsIFwmIzM0Oy1cdTAwM2UgXCYjMzQ7LCBsZXZlbCk7XG4zMDU1Olx0XHRcdGVsc2VcbjMwNTY6XHRcdFx0XHRsb2NrX2dldF9zdGF0dXMoZiwgY3VyLCBpdGVyLVx1MDAzZWxpX3BvcywgXCYjMzQ7XCYjMzQ7LCBsZXZlbCk7XG4zMDU3Olx0XG4zMDU4Olx0XHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZjdXItXHUwMDNlZmxjX2Jsb2NrZWRfcmVxdWVzdHMpKSB7XG4zMDU5Olx0XHRcdFx0LyogVHVybiBsZWZ0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMzMzMKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipJbnZlc3RpZ2F0aW5nIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBhbmQgYGZsY19waWRgIEluaXRpYWxpemF0aW9uL1VzYWdlKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBgbG9ja3NfdHJhbnNsYXRlX3BpZGAgYW5kIHRoZSBgZmxjX3BpZGAgdmFyaWFibGVzLiBJdCYjMzk7cyB0aW1lIHRvIHRyYWNlIHRoZSBjb250cm9sIGZsb3cgdG8gdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHRoZSBmb3JtZXIgb24gdGhlIGxhdHRlci4gSSB3YW50IHRvIHNlZSAqZXhhY3RseSogaG93IGBmbGNfcGlkYCBpcyBpbml0aWFsaXplZCwgd2hlcmUgaXQmIzM5O3MgbW9kaWZpZWQsIGFuZCB1bmRlciB3aGF0IGNvbmRpdGlvbnMuIFRoZSBnb2FsIGlzIHRvIGZ1bGx5IHVuZGVyc3RhbmQgaG93IHRoZXNlIHR3byBjb21wb25lbnRzIHJlbGF0ZSBhbmQgaWYgdGhlcmUgYXJlIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBpbmNvcnJlY3Qgc3RhdGVzLCBvciBpbmVmZmljaWVuY2llcy4gSSBuZWVkIHRvIGVuc3VyZSB0aGV5IGFsaWduLCB0aGF0IHRoZSBQSUQgdHJhbnNsYXRpb24gaXMgaGFwcGVuaW5nIGNvcnJlY3RseSBpbiByZWxhdGlvbiB0byB0aGUgRkxDLiBJJiMzOTttIGdvaW5nIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgdGhlIGxvY2tzIHBvdGVudGlhbGx5IGJlaW5nIGFjcXVpcmVkLCBhbmQgYW55IHNoYXJlZCByZXNvdXJjZXMgdGhhdCBjb3VsZCBhZmZlY3QgdGhlaXIgaW50ZXJhY3Rpb24uIFRpbWUgdG8gZGlnIGluIGFuZCBjbGFyaWZ5IGFueSBudWFuY2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtsb2Nrc190cmFuc2xhdGVfcGlkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9sb2Nrcy5jPTIzNjU9RVhQT1JUX1NZTUJPTF9HUEwodmZzX3Rlc3RfbG9jayk7XG4tLVxuZnMvbG9ja3MuYy0yMzY3LS8qKlxuZnMvbG9ja3MuYzoyMzY4OiAqIGxvY2tzX3RyYW5zbGF0ZV9waWQgLSB0cmFuc2xhdGUgYSBmaWxlX2xvY2smIzM5O3MgZmxfcGlkIG51bWJlciBpbnRvIGEgbmFtZXNwYWNlXG5mcy9sb2Nrcy5jLTIzNjktICogQGZsOiBUaGUgZmlsZV9sb2NrIHdobyYjMzk7cyBmbF9waWQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcbi0tXG5mcy9sb2Nrcy5jLTIzNzMtICovXG5mcy9sb2Nrcy5jOjIzNzQ6c3RhdGljIHBpZF90IGxvY2tzX3RyYW5zbGF0ZV9waWQoc3RydWN0IGZpbGVfbG9ja19jb3JlICpmbCwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKVxuZnMvbG9ja3MuYy0yMzc1LXtcbi0tXG5mcy9sb2Nrcy5jPTI0MDE9c3RhdGljIGludCBwb3NpeF9sb2NrX3RvX2Zsb2NrKHN0cnVjdCBmbG9jayAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxuZnMvbG9ja3MuYy0yNDAyLXtcbmZzL2xvY2tzLmM6MjQwMzpcdGZsb2NrLVx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcdTAwMjZmbC1cdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xuZnMvbG9ja3MuYy0yNDA0LSNpZiBCSVRTX1BFUl9MT05HID09IDMyXG4tLVxuZnMvbG9ja3MuYz0yNDIzPXN0YXRpYyB2b2lkIHBvc2l4X2xvY2tfdG9fZmxvY2s2NChzdHJ1Y3QgZmxvY2s2NCAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxuZnMvbG9ja3MuYy0yNDI0LXtcbmZzL2xvY2tzLmM6MjQyNTpcdGZsb2NrLVx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcdTAwMjZmbC1cdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xuZnMvbG9ja3MuYy0yNDI2LVx0ZmxvY2stXHUwMDNlbF9zdGFydCA9IGZsLVx1MDAzZWZsX3N0YXJ0O1xuLS1cbmZzL2xvY2tzLmM9MjkyMT1zdGF0aWMgdm9pZCBsb2NrX2dldF9zdGF0dXMoc3RydWN0IHNlcV9maWxlICpmLCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsYyxcbi0tXG5mcy9sb2Nrcy5jLTI5MjktXG5mcy9sb2Nrcy5jOjI5MzA6XHRwaWQgPSBsb2Nrc190cmFuc2xhdGVfcGlkKGZsYywgcHJvY19waWRucyk7XG5mcy9sb2Nrcy5jLTI5MzEtXG4tLVxuZnMvbG9ja3MuYz0zMDE2PXN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXG4tLVxuZnMvbG9ja3MuYy0zMDQzLVxuZnMvbG9ja3MuYzozMDQ0Olx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuZnMvbG9ja3MuYy0zMDQ1LVx0XHRyZXR1cm4gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMDk6MTc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDIwMwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgbG9ja3NfdHJhbnNsYXRlX3BpZGAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBkZWZpbml0aW9uLiBJdCYjMzk7cyBjcnVjaWFsLCBvYnZpb3VzbHksIGdpdmVuIGl0cyBuYW1lLCBzbyBJJiMzOTtsbCBuZWVkIHRvIHJlYWxseSB1bnBhY2sgaXRzIHB1cnBvc2UgYW5kIGltcGxlbWVudGF0aW9uLiBXaGF0IGV4YWN0bHkgaXMgaXQgZG9pbmcgd2l0aCBQSURzPyBIb3cgZG9lcyBpdCBmaXQgaW50byB0aGUgYnJvYWRlciBsb2NraW5nIG1lY2hhbmlzbSBJJiMzOTttIGZhbWlsaWFyIHdpdGg/IEkmIzM5O2xsIHByb2JhYmx5IHN0YXJ0IGJ5IHRyYWNpbmcgdGhlIGZ1bmN0aW9uJiMzOTtzIGNhbGxzIGFuZCBkZXBlbmRlbmNpZXMsIHNlZWluZyB3aGF0IG90aGVyIHBhcnRzIG9mIHRoZSBzeXN0ZW0gaW50ZXJhY3Qgd2l0aCBpdC4gRnJvbSB0aGVyZSwgSSYjMzk7bGwgbmVlZCB0byBzZWUgd2hldGhlciBpdCBtYWtlcyB1c2Ugb2Yga2VybmVsIHN0cnVjdHVyZXMgdGhhdCBhcmUgc3RhbmRhcmQsIG9yIHdoZXRoZXIgaXQgY29udGFpbnMgc29tZSBiZXNwb2tlIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgdW5pcXVlIHRvIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBvciBhcHBsaWNhdGlvbiB0aGlzIGNvZGUgaXMgZm9yLiBJJiMzOTttIGdvaW5nIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgdHlwZXMgaXQmIzM5O3Mgd29ya2luZyB3aXRoIGFuZCBob3cgdGhleSByZWxhdGUgdG8gcHJvY2VzcyBpZGVudGlmaWVycy4gVW5kZXJzdGFuZGluZyBpdHMgcm9sZSBpbiB0cmFuc2xhdGluZyBvciBtYW5pcHVsYXRpbmcgUElEcyBpcyBrZXkgdG8gZ3Jhc3BpbmcgdGhlIG92ZXJhbGwgbG9ja2luZyBzdHJhdGVneS4gVGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvbG9ja3MuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIzNjgsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjM2ODpcdCAqIGxvY2tzX3RyYW5zbGF0ZV9waWQgLSB0cmFuc2xhdGUgYSBmaWxlX2xvY2smIzM5O3MgZmxfcGlkIG51bWJlciBpbnRvIGEgbmFtZXNwYWNlXG4yMzY5Olx0ICogQGZsOiBUaGUgZmlsZV9sb2NrIHdobyYjMzk7cyBmbF9waWQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcbjIzNzA6XHQgKiBAbnM6IFRoZSBuYW1lc3BhY2UgaW50byB3aGljaCB0aGUgcGlkIHNob3VsZCBiZSB0cmFuc2xhdGVkXG4yMzcxOlx0ICpcbjIzNzI6XHQgKiBVc2VkIHRvIHRyYW5zbGF0ZSBhIGZsX3BpZCBpbnRvIGEgbmFtZXNwYWNlIHZpcnR1YWwgcGlkIG51bWJlclxuMjM3MzpcdCAqL1xuMjM3NDpcdHN0YXRpYyBwaWRfdCBsb2Nrc190cmFuc2xhdGVfcGlkKHN0cnVjdCBmaWxlX2xvY2tfY29yZSAqZmwsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucylcbjIzNzU6XHR7XG4yMzc2Olx0XHRwaWRfdCB2bnI7XG4yMzc3Olx0XHRzdHJ1Y3QgcGlkICpwaWQ7XG4yMzc4Olx0XG4yMzc5Olx0XHRpZiAoZmwtXHUwMDNlZmxjX2ZsYWdzIFx1MDAyNiBGTF9PRkRMQ0spXG4yMzgwOlx0XHRcdHJldHVybiAtMTtcbjIzODE6XHRcbjIzODI6XHRcdC8qIFJlbW90ZSBsb2NrcyByZXBvcnQgYSBuZWdhdGl2ZSBwaWQgdmFsdWUgKi9cbjIzODM6XHRcdGlmIChmbC1cdTAwM2VmbGNfcGlkIFx1MDAzYz0gMClcbjIzODQ6XHRcdFx0cmV0dXJuIGZsLVx1MDAzZWZsY19waWQ7XG4yMzg1Olx0XG4yMzg2Olx0XHQvKlxuMjM4NzpcdFx0ICogSWYgdGhlIGZsb2NrIG93bmVyIHByb2Nlc3MgaXMgZGVhZCBhbmQgaXRzIHBpZCBoYXMgYmVlbiBhbHJlYWR5XG4yMzg4Olx0XHQgKiBmcmVlZCwgdGhlIHRyYW5zbGF0aW9uIGJlbG93IHdvbiYjMzk7dCB3b3JrLCBidXQgd2Ugc3RpbGwgd2FudCB0byBzaG93XG4yMzg5Olx0XHQgKiBmbG9jayBvd25lciBwaWQgbnVtYmVyIGluIGluaXQgcGlkbnMuXG4yMzkwOlx0XHQgKi9cbjIzOTE6XHRcdGlmIChucyA9PSBcdTAwMjZpbml0X3BpZF9ucylcbjIzOTI6XHRcdFx0cmV0dXJuIChwaWRfdCkgZmwtXHUwMDNlZmxjX3BpZDtcbjIzOTM6XHRcbjIzOTQ6XHRcdHJjdV9yZWFkX2xvY2soKTtcbjIzOTU6XHRcdHBpZCA9IGZpbmRfcGlkX25zKGZsLVx1MDAzZWZsY19waWQsIFx1MDAyNmluaXRfcGlkX25zKTtcbjIzOTY6XHRcdHZuciA9IHBpZF9ucl9ucyhwaWQsIG5zKTtcbjIzOTc6XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuMjM5ODpcdFx0cmV0dXJuIHZucjtcbjIzOTk6XHR9XG4yNDAwOlx0XG4yNDAxOlx0c3RhdGljIGludCBwb3NpeF9sb2NrX3RvX2Zsb2NrKHN0cnVjdCBmbG9jayAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxuMjQwMjpcdHtcbjI0MDM6XHRcdGZsb2NrLVx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcdTAwMjZmbC1cdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xuMjQwNDpcdCNpZiBCSVRTX1BFUl9MT05HID09IDMyXG4yNDA1Olx0XHQvKlxuMjQwNjpcdFx0ICogTWFrZSBzdXJlIHdlIGNhbiByZXByZXNlbnQgdGhlIHBvc2l4IGxvY2sgdmlhXG4yNDA3Olx0XHQgKiBsZWdhY3kgMzJiaXQgZmxvY2suXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDA5OjE3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUxMjQKCQkJCQkJCW91dHB1dDogMTUzCgkJCQkJCQl0aG91Z2h0czogODA4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYC9wcm9jL2xvY2tzYCBQYXRjaCBmb3IgS01TQU4gTmVlZHMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSXQgbG9va3MgbGlrZSB3ZSYjMzk7cmUgZml4aW5nIGEgYnVnIHJlbGF0ZWQgdG8gaG93IE9GRCAoT3BlbiBGaWxlIERlc2NyaXB0b3IpIGxvY2tzIGFyZSBkaXNwbGF5ZWQgaW4gYC9wcm9jL2xvY2tzYCBhY3Jvc3MgZGlmZmVyZW50IFBJRCBuYW1lc3BhY2VzLiBUaGUgaW5pdGlhbCBpc3N1ZSBpcyB0aGF0IGBsb2Nrc190cmFuc2xhdGVfcGlkYCByZXR1cm5zIC0xIGZvciBgRkxfT0ZETENLYCAodGhlIGZsYWcgZm9yIE9GRCBsb2NrcykuIFRoaXMgbGVhZHMgdG8gYSBzaXR1YXRpb24gd2hlcmUgdGhlIGZpbHRlciBpbiBgbG9ja3Nfc2hvd2AgdG8gZmlsdGVyIGxvY2tzIGJ5IFBJRCBuYW1lc3BhY2UgaXNuJiMzOTt0IHdvcmtpbmcgY29ycmVjdGx5IGZvciBPRkQgbG9ja3MuIFNwZWNpZmljYWxseSwgaXQgd2FzIGRpc3BsYXlpbmcgT0ZEIGxvY2tzIGV2ZW4gaWYgdGhleSBkaWRuJiMzOTt0IGJlbG9uZyB0byB0aGUgY3VycmVudCBQSUQgbmFtZXNwYWNlLgoKVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgY2hlY2sgd2l0aGluIGBsb2Nrc19zaG93YC4gTm93LCBpZiBpdCYjMzk7cyBhbiBPRkQgbG9jayAqYW5kKiBpdCYjMzk7cyBub3QgaW4gdGhlIGluaXQgbmFtZXNwYWNlLCB3ZSBwZXJmb3JtIGFuIGV4cGxpY2l0IHZpc2liaWxpdHkgY2hlY2sgdXNpbmcgYGZpbmRfcGlkX25zYCBhbmQgYHBpZF9ucl9uc2AuIFRoaXMgZW5zdXJlcyB0aGUgbG9jayBpcyBvbmx5IHNob3duIGlmIHRoZSBQSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NrIGFjdHVhbGx5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBQSUQgbmFtZXNwYWNlLiBTZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLgoKTm93LCB0aGUgaW1wb3J0YW50IHBhcnQ6IEtNU0FOLiBXZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoICpyZXF1aXJlcyogS01TQU4gdG8gY2F0Y2ggcG90ZW50aWFsIGlzc3Vlcy4gRmlyc3QsIGxldCYjMzk7cyBhZGRyZXNzIHRoZSBzcGVjaWZpYyBLTVNBTiBjb25jZXJuczoKCjEuICAqKkRvZXMgaXQgdG91Y2ggdW5pbml0aWFsaXplZCBtZW1vcnksIGNyZWF0ZSBuZXcgYWxsb2NhdGlvbnMsIG9yIGNvcHkgdW5pbml0aWFsaXplZCBkYXRhIHRvIHVzZXJzcGFjZT8qKiBOby4gVGhlIHBhdGNoIHJlYWRzIGV4aXN0aW5nIGBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmVgIGZpZWxkcyAoYGZsY19mbGFnc2AsIGBmbGNfcGlkYCkuIEl0IGFsbG9jYXRlcyBvbmx5IGxvY2FsIHN0YWNrIHZhcmlhYmxlcyAoYHBpZGAsIGB2aXNpYmxlYCkgd2hpY2ggYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLiBJdCBjYWxscyBzdGFuZGFyZCBrZXJuZWwgZnVuY3Rpb25zIChgcmN1X3JlYWRfbG9ja2AsIGBmaW5kX3BpZF9uc2AsIGBwaWRfbnJfbnNgLCBgcmN1X3JlYWRfdW5sb2NrYCkuIEl0ICpmaWx0ZXJzKiBlbnRyaWVzLCBtZWFuaW5nIGl0JiMzOTtzIG9ubHkgbW9kaWZ5aW5nIHRoZSBvdXRwdXQgc3RyZWFtLiBUaGVyZSYjMzk7cyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIG9yIGNvcHkgaW50byB1c2Vyc3BhY2UuCgoyLiAgKipEb2VzIGl0IGludHJvZHVjZSByaXNrcyB0aGF0IGFyZSBPTkxZIGNhdWdodCBieSBLTVNBTj8qKiBOby4gS01TQU4gZm9jdXNlcyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MuIFRoaXMgcGF0Y2ggaXMgZnVuZGFtZW50YWxseSBhYm91dCBQSUQgbmFtZXNwYWNlIGZpbHRlcmluZyBhbmQgbG9jayBkaXNwbGF5IGxvZ2ljLiBUaGUgcG90ZW50aWFsIGlzc3VlcyBoZXJlIGFyZSByZWxhdGVkIHRvIFJDVSB1c2FnZSwgcG9pbnRlciBkZXJlZmVyZW5jaW5nLCBhbmQgb3ZlcmFsbCBjb3JyZWN0bmVzcy4gU3RhbmRhcmQgdG9vbHMgbGlrZSBLQVNBTiBhbmQgbG9ja2RlcCwgYWxvbmcgd2l0aCB1bml0IHRlc3RzLCBhcmUgbW9yZSB0aGFuIHN1ZmZpY2llbnQgdG8gY292ZXIgdGhlc2Uga2luZHMgb2Ygcmlza3MuCgpUaGUgcnVsZSBpcyBjbGVhcjogKklmIGEgYnVnIGNhbiBiZSBjYXVnaHQgYnkgS0FTQU4sIExvY2tkZXAgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycywgdGhlcmUgaXMgbm8gbmVlZCB0byBydW4gS01TQU4qLiBBIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIGNvc3RseS4KClRoZXJlZm9yZSwgYE5lZWRzS01TQU5gIGlzIGRlZmluaXRlbHkgYGZhbHNlYC4KCioqS01TQU5SZWFzb25pbmc6KioKClRoZSBwYXRjaCBhZGRzIGEgUElEIG5hbWVzcGFjZSB2aXNpYmlsaXR5IGNoZWNrIGZvciBPRkQgbG9ja3MgaW4gYGZzL2xvY2tzLmM6bG9ja3Nfc2hvdygpYC4gSXQgb3BlcmF0ZXMgb24gZXhpc3RpbmcgZmlsZSBsb2NrIHN0cnVjdHVyZXMgKGBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmVgKSBhbmQgdXNlcyBzdGFjay1hbGxvY2F0ZWQgc2NhbGFyIHZhcmlhYmxlcyAoYHBpZGAsIGB2aXNpYmxlYCkgdGhhdCBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIE5vIG5ldyBidWZmZXJzLCB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMsIG9yIGtlcm5lbC10by11c2VyIGluZm8gbGVha3MgYXJlIGludHJvZHVjZWQgb3IgZXhwb3NlZC4gVGhlcmVmb3JlLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgdGhhdCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gSXQmIzM5O3MgYSBjbGVhbiBmaXggd2l0aCBzdGFuZGFyZCBtZW1vcnkgc2FmZXR5IGNvbnNpZGVyYXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAwOToxNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIGBsb2Nrc19zaG93KClgIGluIGBmcy9sb2Nrcy5jYCB0byBwcm9wZXJseSBmaWx0ZXIgb3BlbiBmaWxlIGRlc2NyaXB0b3IgKE9GRCkgbG9ja3MgaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoZSBjaGFuZ2VzIG9ubHkgaW50cm9kdWNlIHNjYWxhciBzdGFjayB2YXJpYWJsZXMgKGB2aXNpYmxlYCBpbml0aWFsaXplZCB0byBgZmFsc2VgLCBgcGlkYCBwb2ludGVyIGFzc2lnbmVkIGZyb20gYGZpbmRfcGlkX25zKClgKSBhbmQgcGVyZm9ybSBuYW1lc3BhY2UgdHJhbnNsYXRpb24gY2hlY2tzIHVuZGVyIFJDVS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCwgYWxsb2NhdGVkLCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gcGFkZGluZyBvciBzdHJ1Y3QgZmllbGRzIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIGBsb2Nrc19zaG93KClgIGluIGBmcy9sb2Nrcy5jYCB0byBwcm9wZXJseSBmaWx0ZXIgb3BlbiBmaWxlIGRlc2NyaXB0b3IgKE9GRCkgbG9ja3MgaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoZSBjaGFuZ2VzIG9ubHkgaW50cm9kdWNlIHNjYWxhciBzdGFjayB2YXJpYWJsZXMgKGB2aXNpYmxlYCBpbml0aWFsaXplZCB0byBgZmFsc2VgLCBgcGlkYCBwb2ludGVyIGFzc2lnbmVkIGZyb20gYGZpbmRfcGlkX25zKClgKSBhbmQgcGVyZm9ybSBuYW1lc3BhY2UgdHJhbnNsYXRpb24gY2hlY2tzIHVuZGVyIFJDVS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCwgYWxsb2NhdGVkLCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gcGFkZGluZyBvciBzdHJ1Y3QgZmllbGRzIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjEyLjg3NjM3NTczMVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyOTE5OTU4NDY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkZJTEVfTE9DS0lOR1wiLFxuICAgIFwiUFJPQ19GU1wiLFxuICAgIFwiUElEX05TXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibG9ja3Nfc2hvd1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBgbG9ja3Nfc2hvdygpYCBpbiBgZnMvbG9ja3MuY2AgdG8gcHJvcGVybHkgZmlsdGVyIG9wZW4gZmlsZSBkZXNjcmlwdG9yIChPRkQpIGxvY2tzIGluIG5vbi1pbml0IFBJRCBuYW1lc3BhY2VzLiBUaGUgY2hhbmdlcyBvbmx5IGludHJvZHVjZSBzY2FsYXIgc3RhY2sgdmFyaWFibGVzIChgdmlzaWJsZWAgaW5pdGlhbGl6ZWQgdG8gYGZhbHNlYCwgYHBpZGAgcG9pbnRlciBhc3NpZ25lZCBmcm9tIGBmaW5kX3BpZF9ucygpYCkgYW5kIHBlcmZvcm0gbmFtZXNwYWNlIHRyYW5zbGF0aW9uIGNoZWNrcyB1bmRlciBSQ1UuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQsIGFsbG9jYXRlZCwgb3IgY29waWVkIHRvIHVzZXJzcGFjZSwgYW5kIG5vIHBhZGRpbmcgb3Igc3RydWN0IGZpZWxkcyBhcmUgbGVmdCB1bmluaXRpYWxpemVkLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGBsb2Nrc19zaG93KClgIGluIGZzL2xvY2tzLmMgdG8gcHJvcGVybHkgZmlsdGVyIE9wZW4gRmlsZSBEZXNjcmlwdGlvbiAoT0ZEKSBsb2NrcyB3aGVuIHJlYWRpbmcgL3Byb2MvbG9ja3MgZnJvbSB3aXRoaW4gbm9uLWluaXQgUElEIG5hbWVzcGFjZXMuIFRoaXMgaXMgY29yZSBmaWxlc3lzdGVtIGxvZ2ljIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjEyLjg3NjM4MDU5MVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzcyMzgyMDQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgOWQwOTlhMzNkNjgzODZmMTQ1YmZhODNhNGNlNDJjZWIyNmM5ZGZmNFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVGh1IFNlcCAzIDA5OjE2OjEyIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jXFxuaW5kZXggNmU0ZmY3ZmNlYzA1My4uNGFmMTM4NTY4MmU0ZSAxMDA2NDRcXG4tLS0gYS9mcy9sb2Nrcy5jXFxuKysrIGIvZnMvbG9ja3MuY1xcbkBAIC0zMDIyLDYgKzMwMjIsMjUgQEAgc3RhdGljIGludCBsb2Nrc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdilcXG4gXFxuIFxcdGN1ciA9IGhsaXN0X2VudHJ5KHYsIHN0cnVjdCBmaWxlX2xvY2tfY29yZSwgZmxjX2xpbmspO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogT0ZEIGxvY2tzIGFyZSByZXBvcnRlZCB3aXRoIHBpZCAtMSwgc28gdGhlIGZpbHRlciBiZWxvdyBjYW5ub3Qgc2VlXFxuK1xcdCAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuXFxuK1xcdCAqIFJlbW90ZSBsb2NrcyBrZWVwIGEgbmVnYXRpdmUgZmxjX3BpZCBhbmQgc3RheSB2aXNpYmxlIGFzIGJlZm9yZS5cXG4rXFx0ICovXFxuK1xcdGlmICgoY3VyLVxcdTAwM2VmbGNfZmxhZ3MgXFx1MDAyNiBGTF9PRkRMQ0spIFxcdTAwMjZcXHUwMDI2IGN1ci1cXHUwMDNlZmxjX3BpZCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIHByb2NfcGlkbnMgIT0gXFx1MDAyNmluaXRfcGlkX25zKSB7XFxuK1xcdFxcdHN0cnVjdCBwaWQgKnBpZDtcXG4rXFx0XFx0Ym9vbCB2aXNpYmxlID0gZmFsc2U7XFxuK1xcbitcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuK1xcdFxcdHBpZCA9IGZpbmRfcGlkX25zKGN1ci1cXHUwMDNlZmxjX3BpZCwgXFx1MDAyNmluaXRfcGlkX25zKTtcXG4rXFx0XFx0aWYgKHBpZClcXG4rXFx0XFx0XFx0dmlzaWJsZSA9IHBpZF9ucl9ucyhwaWQsIHByb2NfcGlkbnMpICE9IDA7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRcXHRpZiAoIXZpc2libGUpXFxuK1xcdFxcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbiBcXHRpZiAobG9ja3NfdHJhbnNsYXRlX3BpZChjdXIsIHByb2NfcGlkbnMpID09IDApXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6MTMuMjQ5NDgwMDg2WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1MTY5MDgxNjI3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJGSUxFX0xPQ0tJTkdcIixcbiAgICBcIlBST0NfRlNcIixcbiAgICBcIlBJRF9OU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImxvY2tzX3Nob3dcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgbG9ja3Nfc2hvdygpYCBpbiBmcy9sb2Nrcy5jIHRvIHByb3Blcmx5IGZpbHRlciBPcGVuIEZpbGUgRGVzY3JpcHRpb24gKE9GRCkgbG9ja3Mgd2hlbiByZWFkaW5nIC9wcm9jL2xvY2tzIGZyb20gd2l0aGluIG5vbi1pbml0IFBJRCBuYW1lc3BhY2VzLiBUaGlzIGlzIGNvcmUgZmlsZXN5c3RlbSBsb2dpYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA5ZDA5OWEzM2Q2ODM4NmYxNDViZmE4M2E0Y2U0MmNlYjI2YzlkZmY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAwOToxNjoxMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jXG5pbmRleCA2ZTRmZjdmY2VjMDUzLi40YWYxMzg1NjgyZTRlIDEwMDY0NFxuLS0tIGEvZnMvbG9ja3MuY1xuKysrIGIvZnMvbG9ja3MuY1xuQEAgLTMwMjIsNiArMzAyMiwyNSBAQCBzdGF0aWMgaW50IGxvY2tzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxuIFxuIFx0Y3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7XG4gXG4rXHQvKlxuK1x0ICogT0ZEIGxvY2tzIGFyZSByZXBvcnRlZCB3aXRoIHBpZCAtMSwgc28gdGhlIGZpbHRlciBiZWxvdyBjYW5ub3Qgc2VlXG4rXHQgKiB0aGVpciBvd25lcjsgZmxjX3BpZCBob2xkcyB0aGUgb3duZXIgdGdpZCwgc28gZmlsdGVyIG9uIGl0LlxuK1x0ICogUmVtb3RlIGxvY2tzIGtlZXAgYSBuZWdhdGl2ZSBmbGNfcGlkIGFuZCBzdGF5IHZpc2libGUgYXMgYmVmb3JlLlxuK1x0ICovXG4rXHRpZiAoKGN1ci1cdTAwM2VmbGNfZmxhZ3MgXHUwMDI2IEZMX09GRExDSykgXHUwMDI2XHUwMDI2IGN1ci1cdTAwM2VmbGNfcGlkIFx1MDAzZSAwIFx1MDAyNlx1MDAyNlxuK1x0ICAgIHByb2NfcGlkbnMgIT0gXHUwMDI2aW5pdF9waWRfbnMpIHtcbitcdFx0c3RydWN0IHBpZCAqcGlkO1xuK1x0XHRib29sIHZpc2libGUgPSBmYWxzZTtcbitcbitcdFx0cmN1X3JlYWRfbG9jaygpO1xuK1x0XHRwaWQgPSBmaW5kX3BpZF9ucyhjdXItXHUwMDNlZmxjX3BpZCwgXHUwMDI2aW5pdF9waWRfbnMpO1xuK1x0XHRpZiAocGlkKVxuK1x0XHRcdHZpc2libGUgPSBwaWRfbnJfbnMocGlkLCBwcm9jX3BpZG5zKSAhPSAwO1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0aWYgKCF2aXNpYmxlKVxuK1x0XHRcdHJldHVybiAwO1xuK1x0fVxuK1xuIFx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuIFx0XHRyZXR1cm4gMDtcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjEzLjI0OTQ4MTU3NloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY0OTgzMTc5MTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBgZnMvbG9ja3MuY2AgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaCwgYW5kIG15IGZpcnN0IHN0ZXAgaXMgYWx3YXlzIHRvIHBpbnBvaW50IHRoZSBleGFjdCBsb2NhdGlvbi4gQWxyaWdodCwgdGhlIHBhdGNoIHRhcmdldHMgYGZzL2xvY2tzLmNgLiBHb29kLCB0aGF0IG5hcnJvd3MgdGhlIHNjb3BlIGNvbnNpZGVyYWJseS4gTm93LCBzaW5jZSBJIGRvbid0IGhhdmUgdGhlIHBhdGNoIGl0c2VsZiByaWdodCBpbiBmcm9udCBvZiBtZSwgSSBuZWVkIHRvIGdldCBteSBiZWFyaW5ncy4gSSdtIGdvaW5nIHRvIGNlbnRlciBteSBtZW50YWwgbW9kZWwgYXJvdW5kIGxpbmUgMzAyMiB3aXRoaW4gdGhhdCBmaWxlLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBpbW1lZGlhdGUgY29udGV4dCBJIG5lZWQgdG8gc3RhcnQgZm9ybWluZyBhIGNsZWFyIHBpY3R1cmUgb2Ygd2hhdCdzIGJlaW5nIG1vZGlmaWVkIGFuZCB3aHkuIEknbGwgbmVlZCB0byBjb25zaWRlciB3aGF0IGNvZGUgc3Vycm91bmRzIHRoYXQgbGluZS4gQXJlIHdlIGRlYWxpbmcgd2l0aCBtdXRleGVzLCBzcGlubG9ja3MsIG9yIHNvbWV0aGluZyBtb3JlIHNwZWNpYWxpemVkPyBVbmRlcnN0YW5kaW5nIHRoYXQgY29udGV4dCB3aWxsIGRpY3RhdGUgaG93IEkgYXBwcm9hY2ggdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIHRoZSBjaGFuZ2UuIFRpbWUgdG8gZ2V0IG15IG1lbnRhbCBjb21waWxlciBmaXJpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyNTksIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjE5Ljc0NzgwMTk3NloiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4Njg5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9sb2Nrcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMwMDAsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjMwMDA6XFx0XFxuMzAwMTpcXHRcXHQvKiBOVUxMIG5vZGUgb3Igcm9vdCBub2RlICovXFxuMzAwMjpcXHRcXHRpZiAobm9kZSA9PSBOVUxMIHx8IG5vZGUtXFx1MDAzZWZsY19ibG9ja2VyID09IE5VTEwpXFxuMzAwMzpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4zMDA0OlxcdFxcbjMwMDU6XFx0XFx0LyogTmV4dCBtZW1iZXIgaW4gdGhlIGxpbmtlZCBsaXN0IGNvdWxkIGJlIGl0c2VsZiAqL1xcbjMwMDY6XFx0XFx0dG1wID0gbGlzdF9uZXh0X2VudHJ5KG5vZGUsIGZsY19ibG9ja2VkX21lbWJlcik7XFxuMzAwNzpcXHRcXHRpZiAobGlzdF9lbnRyeV9pc19oZWFkKHRtcCwgXFx1MDAyNm5vZGUtXFx1MDAzZWZsY19ibG9ja2VyLVxcdTAwM2VmbGNfYmxvY2tlZF9yZXF1ZXN0cyxcXG4zMDA4OlxcdFxcdFxcdFxcdCAgICAgICBmbGNfYmxvY2tlZF9tZW1iZXIpXFxuMzAwOTpcXHRcXHRcXHR8fCB0bXAgPT0gbm9kZSkge1xcbjMwMTA6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuMzAxMTpcXHRcXHR9XFxuMzAxMjpcXHRcXG4zMDEzOlxcdFxcdHJldHVybiB0bXA7XFxuMzAxNDpcXHR9XFxuMzAxNTpcXHRcXG4zMDE2OlxcdHN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXFxuMzAxNzpcXHR7XFxuMzAxODpcXHRcXHRzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IgKml0ZXIgPSBmLVxcdTAwM2Vwcml2YXRlO1xcbjMwMTk6XFx0XFx0c3RydWN0IGZpbGVfbG9ja19jb3JlICpjdXIsICp0bXA7XFxuMzAyMDpcXHRcXHRzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcHJvY19waWRucyA9IHByb2NfcGlkX25zKGZpbGVfaW5vZGUoZi1cXHUwMDNlZmlsZSktXFx1MDAzZWlfc2IpO1xcbjMwMjE6XFx0XFx0aW50IGxldmVsID0gMDtcXG4zMDIyOlxcdFxcbjMwMjM6XFx0XFx0Y3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7XFxuMzAyNDpcXHRcXG4zMDI1OlxcdFxcdC8qXFxuMzAyNjpcXHRcXHQgKiBPRkQgbG9ja3MgYXJlIHJlcG9ydGVkIHdpdGggcGlkIC0xLCBzbyB0aGUgZmlsdGVyIGJlbG93IGNhbm5vdCBzZWVcXG4zMDI3OlxcdFxcdCAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuXFxuMzAyODpcXHRcXHQgKiBSZW1vdGUgbG9ja3Mga2VlcCBhIG5lZ2F0aXZlIGZsY19waWQgYW5kIHN0YXkgdmlzaWJsZSBhcyBiZWZvcmUuXFxuMzAyOTpcXHRcXHQgKi9cXG4zMDMwOlxcdFxcdGlmICgoY3VyLVxcdTAwM2VmbGNfZmxhZ3MgXFx1MDAyNiBGTF9PRkRMQ0spIFxcdTAwMjZcXHUwMDI2IGN1ci1cXHUwMDNlZmxjX3BpZCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjZcXG4zMDMxOlxcdFxcdCAgICBwcm9jX3BpZG5zICE9IFxcdTAwMjZpbml0X3BpZF9ucykge1xcbjMwMzI6XFx0XFx0XFx0c3RydWN0IHBpZCAqcGlkO1xcbjMwMzM6XFx0XFx0XFx0Ym9vbCB2aXNpYmxlID0gZmFsc2U7XFxuMzAzNDpcXHRcXG4zMDM1OlxcdFxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4zMDM2OlxcdFxcdFxcdHBpZCA9IGZpbmRfcGlkX25zKGN1ci1cXHUwMDNlZmxjX3BpZCwgXFx1MDAyNmluaXRfcGlkX25zKTtcXG4zMDM3OlxcdFxcdFxcdGlmIChwaWQpXFxuMzAzODpcXHRcXHRcXHRcXHR2aXNpYmxlID0gcGlkX25yX25zKHBpZCwgcHJvY19waWRucykgIT0gMDtcXG4zMDM5OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbjMwNDA6XFx0XFx0XFx0aWYgKCF2aXNpYmxlKVxcbjMwNDE6XFx0XFx0XFx0XFx0cmV0dXJuIDA7XFxuMzA0MjpcXHRcXHR9XFxuMzA0MzpcXHRcXG4zMDQ0OlxcdFxcdGlmIChsb2Nrc190cmFuc2xhdGVfcGlkKGN1ciwgcHJvY19waWRucykgPT0gMClcXG4zMDQ1OlxcdFxcdFxcdHJldHVybiAwO1xcbjMwNDY6XFx0XFxuMzA0NzpcXHRcXHQvKiBWaWV3IHRoaXMgY3Jvc3NlZCBsaW5rZWQgbGlzdCBhcyBhIGJpbmFyeSB0cmVlLCB0aGUgZmlyc3QgbWVtYmVyIG9mIGZsY19ibG9ja2VkX3JlcXVlc3RzXFxuMzA0ODpcXHRcXHQgKiBpcyB0aGUgbGVmdCBjaGlsZCBvZiBjdXJyZW50IG5vZGUsIHRoZSBuZXh0IHNpbGliaW5nIGluIGZsY19ibG9ja2VkX21lbWJlciBpcyB0aGVcXG4zMDQ5OlxcdFxcdCAqIHJpZ2h0IGNoaWxkLCB3ZSBjYW4gYWxzZSBnZXQgdGhlIHBhcmVudCBvZiBjdXJyZW50IG5vZGUgZnJvbSBmbGNfYmxvY2tlciwgc28gdGhpc1xcbjMwNTA6XFx0XFx0ICogcXVlc3Rpb24gYmVjb21lcyB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZVxcbjMwNTE6XFx0XFx0ICovXFxuMzA1MjpcXHRcXHR3aGlsZSAoY3VyICE9IE5VTEwpIHtcXG4zMDUzOlxcdFxcdFxcdGlmIChsZXZlbClcXG4zMDU0OlxcdFxcdFxcdFxcdGxvY2tfZ2V0X3N0YXR1cyhmLCBjdXIsIGl0ZXItXFx1MDAzZWxpX3BvcywgXFxcIi1cXHUwMDNlIFxcXCIsIGxldmVsKTtcXG4zMDU1OlxcdFxcdFxcdGVsc2VcXG4zMDU2OlxcdFxcdFxcdFxcdGxvY2tfZ2V0X3N0YXR1cyhmLCBjdXIsIGl0ZXItXFx1MDAzZWxpX3BvcywgXFxcIlxcXCIsIGxldmVsKTtcXG4zMDU3OlxcdFxcbjMwNTg6XFx0XFx0XFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZjdXItXFx1MDAzZWZsY19ibG9ja2VkX3JlcXVlc3RzKSkge1xcbjMwNTk6XFx0XFx0XFx0XFx0LyogVHVybiBsZWZ0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjE5Ljc0Nzk5MDgwNloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMzODQ3NjQzNTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKkFuYWx5emluZyBgbG9ja3Nfc2hvd2AgaW4gYGZzL2xvY2tzLmNgKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGUgYGxvY2tzX3Nob3dgIGZ1bmN0aW9uIGlzIGRvaW5nLCBzcGVjaWZpY2FsbHkgd2l0aGluIHRoZSBgZnMvbG9ja3MuY2AgZmlsZS4gVGhpcyBzdWdnZXN0cyBpdCdzIGxpa2VseSBpbnZvbHZlZCBpbiBkaXNwbGF5aW5nIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZmlsZSBsb2Nrcy4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJJ20gYWxyZWFkeSBmb3JtdWxhdGluZyBzb21lIGh5cG90aGVzZXMuIEl0IGNvdWxkIGJlIGZvciBkZWJ1Z2dpbmcsIHN5c3RlbSBtb25pdG9yaW5nLCBtYXliZSBldmVuIHVzZXItbGV2ZWwgdmlzaWJpbGl0eSBpbnRvIGhlbGQgbG9ja3MuIEknbGwgYmUgbG9va2luZyBmb3IgY2x1ZXMgaW4gaXRzIGZ1bmN0aW9uIHNpZ25hdHVyZSwgd2hhdCBkYXRhIHN0cnVjdHVyZXMgaXQgYWNjZXNzZXMsIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIGtlcm5lbCdzIGxvY2sgbWFuYWdlbWVudCBzdWJzeXN0ZW1zLiBJJ2xsIGJlIGZvY3VzZWQgb24gaG93IGl0IHByZXNlbnRzIHRoaXMgbG9jayBpbmZvcm1hdGlvbi4gSSBleHBlY3QgSSdsbCBiZSBxdWlja2x5IHBhcnNpbmcgdGhlIGZ1bmN0aW9uJ3MgY29kZSB0byBkZXRlcm1pbmUgdGhlIGRhdGEgaXQgYWNjZXNzZXMsIGZvcm1hdHMsIGFuZCBpZiB0aGVyZSBhcmUgYW55IG9idmlvdXMgcGVyZm9ybWFuY2UgY29uY2VybnMuIEtub3dpbmcgdGhlIGNvbnRleHQgd2l0aGluIHRoZSBrZXJuZWwgaXMgcGFyYW1vdW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjozNTA2LCJPdXRwdXRUb2tlbnMiOjI4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjoyMy4xMzI3NjIxMjVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDg0NDczOTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibG9ja3Nfc2hvd1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9sb2Nrcy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2xvY2tzLmM9Mjk5Nz1zdGF0aWMgc3RydWN0IGZpbGVfbG9ja19jb3JlICpnZXRfbmV4dF9ibG9ja2VkX21lbWJlcihzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKm5vZGUpXFxuLS1cXG5mcy9sb2Nrcy5jLTMwMTUtXFxuZnMvbG9ja3MuYzozMDE2OnN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXFxuZnMvbG9ja3MuYy0zMDE3LXtcXG4tLVxcbmZzL2xvY2tzLmM9MzE0Mz1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxvY2tzX3NlcV9vcGVyYXRpb25zID0ge1xcbi0tXFxuZnMvbG9ja3MuYy0zMTQ2LVxcdC5zdG9wXFx0PSBsb2Nrc19zdG9wLFxcbmZzL2xvY2tzLmM6MzE0NzpcXHQuc2hvd1xcdD0gbG9ja3Nfc2hvdyxcXG5mcy9sb2Nrcy5jLTMxNDgtfTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6MjMuMTgxMjE1NDczWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjMxNjYxMTg3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipUcmFjaW5nIHRoZSBSZWdpc3RyYXRpb24gb2YgYGxvY2tzX3NlcV9vcGVyYXRpb25zYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IHdoZXJlIGBsb2Nrc19zZXFfb3BlcmF0aW9uc2AgaXMgYWN0dWFsbHkgYmVpbmcgcmVnaXN0ZXJlZC4gSXQncyB0aGF0IGNyaXRpY2FsIHBvaW50IG9mIGluaXRpYWxpemF0aW9uIHRoYXQgSSdtIGFmdGVyLCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdyB0aGF0IGhhcHBlbnMgKmJlZm9yZSogYW55IG9mIHRoZSBsb2NrcyBhcmUgdXNlZC4gSSBjb3VsZCBtYW51YWxseSBsb29rIHRocm91Z2ggdGhlIHNvdXJjZSB0cmVlLCBidXQgdGhhdCBmZWVscyBpbmVmZmljaWVudCBhbmQgZXJyb3ItcHJvbmUsIGVzcGVjaWFsbHkgd2l0aCBhbGwgdGhlIGFic3RyYWN0aW9uIGxheWVycy4gSSBuZWVkIHRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIHBvaW50IG9mIHJlZ2lzdHJhdGlvbi4gVGhpcyBsaWtlbHkgaW52b2x2ZXMgc29tZSBmb3JtIG9mIG1hY3JvIG9yIGZ1bmN0aW9uIHBvaW50ZXIgdGFibGUuIEknbSB0aGlua2luZyBhIHN0YXRpYyBhbmFseXNpcyBhcHByb2FjaCBpcyBwcm9iYWJseSB0aGUgYmVzdC4gSSdsbCBuZWVkIHRvIGtub3cgd2hlcmUgaXQncyBkZWZpbmVkIGFuZCBob3cgdGhhdCdzIGJlaW5nIHVzZWQuIEkgd2lsbCBsb29rIGZvciBob3cgdGhhdCBzdHJ1Y3QgaXMgYmVpbmcgcmVmZXJlbmNlZC4gSXQncyB2ZXJ5IGxpa2VseSwgZ2l2ZW4gdGhlIG5hbWluZyBjb252ZW50aW9uLCB0aGF0IGl0J3MgcGFydCBvZiBzb21lIGdsb2JhbCBzdHJ1Y3R1cmUsIG9yIHBhc3NlZCB0byBzb21lIGluaXQgZnVuY3Rpb24uIFRoZSBnb2FsIGlzIHRvIHF1aWNrbHkgZmluZCB0aGUga2V5IGZ1bmN0aW9uIG9yIGRhdGEgc3RydWN0dXJlIHJlc3BvbnNpYmxlIGZvciBiaW5kaW5nIHRoYXQgYGxvY2tzX3NlcV9vcGVyYXRpb25zYCBzdHJ1Y3R1cmUuIFRoZSBuZXh0IGxvZ2ljYWwgc3RlcCBpcyB0byBkaXZlIGludG8gdGhlIGNhbGwgc2l0ZXMgb2YgdGhhdCBzdHJ1Y3R1cmUsIHNvIEkgY2FuIHVuZGVyc3RhbmQgdGhlIG9yZGVyIGFuZCBzZXR1cCBvZiB0aGUgb3BlcmF0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzkzNiwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjI1LjQ5NzgzMDExN1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3MTkwMDAwNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJsb2Nrc19zZXFfb3BlcmF0aW9uc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvbG9ja3MuYz0zMTM2PXN0YXRpYyB2b2lkIGxvY2tzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxcbi0tXFxuZnMvbG9ja3MuYy0zMTQyLVxcbmZzL2xvY2tzLmM6MzE0MzpzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxvY2tzX3NlcV9vcGVyYXRpb25zID0ge1xcbmZzL2xvY2tzLmMtMzE0NC1cXHQuc3RhcnRcXHQ9IGxvY2tzX3N0YXJ0LFxcbi0tXFxuZnMvbG9ja3MuYz0zMTUwPXN0YXRpYyBpbnQgX19pbml0IHByb2NfbG9ja3NfaW5pdCh2b2lkKVxcbmZzL2xvY2tzLmMtMzE1MS17XFxuZnMvbG9ja3MuYzozMTUyOlxcdHByb2NfY3JlYXRlX3NlcV9wcml2YXRlKFxcXCJsb2Nrc1xcXCIsIDAsIE5VTEwsIFxcdTAwMjZsb2Nrc19zZXFfb3BlcmF0aW9ucyxcXG5mcy9sb2Nrcy5jLTMxNTMtXFx0XFx0XFx0c2l6ZW9mKHN0cnVjdCBsb2Nrc19pdGVyYXRvciksIE5VTEwpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjoyNS41Njk3MzgyNTRaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2OTg2NTkyMzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBgL3Byb2MvbG9ja3NgIGFuZCBPRkQgTG9ja3MgaW4gYSBOYW1lc3BhY2VkIENvbnRleHQqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgL3Byb2MvbG9ja3NgIGhlcmUsIHNwZWNpZmljYWxseSBpbiBhIHNjZW5hcmlvIHdoZXJlIHdlIGhhdmUgT0ZEIGxvY2tzIHRoYXQgc3BhbiBkaWZmZXJlbnQgUElEIG5hbWVzcGFjZXMuIFRoZSBxdWVzdGlvbiBpczogaXMgdGhpcyBhIHBvdGVudGlhbCBhdHRhY2sgc3VyZmFjZSB3b3J0aCBpbnZlc3RpZ2F0aW5nIHdpdGggZnV6emluZz8gTGV0J3MgYnJlYWsgaXQgZG93biBhbmQgc2VlLlxuXG5UaGUgc3RhcnRpbmcgcG9pbnQgaXMgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgcGF0Y2ggZG9lcywgcmlnaHQ/IEVzc2VudGlhbGx5LCBpdCdzIGFib3V0IGhvdyB0aGUga2VybmVsIHJlcG9ydHMgT0ZEIGxvY2tzIHdpdGhpbiBgL3Byb2MvbG9ja3NgLiBXaGVuIGAvcHJvYy9sb2Nrc2AgaXMgcmVhZCwgdGhlIGBsb2Nrc19zaG93KClgIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwbGF5aW5nIHRoZSBsb2NrIGluZm9ybWF0aW9uLiBOb3csIHRoZSBjcnV4IG9mIHRoZSBpc3N1ZSB3aXRoIE9GRCBsb2NrcyBpcyB0aGF0IHRoZXkncmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IsIG5vdCB0aGUgUElEIGRpcmVjdGx5LiBTbywgd2hlbiB0aGUgb3V0cHV0IG5lZWRzIGEgUElELCBpdCByZXBvcnRzIC0xLCBidXQgaW4gdGhlIGtlcm5lbCdzIGludGVybmFsIHJlcHJlc2VudGF0aW9uLCBgZmxjX3BpZGAgaG9sZHMgdGhlIG93bmluZyB0aHJlYWQgZ3JvdXAgSUQgKHRnaWQpLlxuXG5UaGUgY29kZSB1c2VkIGBsb2Nrc190cmFuc2xhdGVfcGlkYCB0byByZXNvbHZlIHRoZSBQSUQsIHNvIG15IG5leHQgc3RlcCBpcyB0byBsb29rIGF0IHdoYXQgdGhhdCBmdW5jdGlvbiBkb2VzLiBUaGF0J3Mgd2hlcmUgdGhlIHJlYWwgZGV0YWlsIHdpbGwgbGlrZWx5IGJlLiBUaGF0IGlzIHdoZXJlIEkgY2FuIGFuYWx5emUgdGhlIGJlaGF2aW91ciBhbmQgZGVjaWRlIGlmIHRoaXMgaXMgYSBnb29kIGF0dGFjayBzdXJmYWNlIHRvIGV4cGxvaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ0MzIsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6MzIuNTU2MzMzNzQzWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MzE4MTc3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJsb2Nrc190cmFuc2xhdGVfcGlkXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2xvY2tzLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvbG9ja3MuYz0yMzY1PUVYUE9SVF9TWU1CT0xfR1BMKHZmc190ZXN0X2xvY2spO1xcbi0tXFxuZnMvbG9ja3MuYy0yMzY3LS8qKlxcbmZzL2xvY2tzLmM6MjM2ODogKiBsb2Nrc190cmFuc2xhdGVfcGlkIC0gdHJhbnNsYXRlIGEgZmlsZV9sb2NrJ3MgZmxfcGlkIG51bWJlciBpbnRvIGEgbmFtZXNwYWNlXFxuZnMvbG9ja3MuYy0yMzY5LSAqIEBmbDogVGhlIGZpbGVfbG9jayB3aG8ncyBmbF9waWQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcXG4tLVxcbmZzL2xvY2tzLmMtMjM3My0gKi9cXG5mcy9sb2Nrcy5jOjIzNzQ6c3RhdGljIHBpZF90IGxvY2tzX3RyYW5zbGF0ZV9waWQoc3RydWN0IGZpbGVfbG9ja19jb3JlICpmbCwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKVxcbmZzL2xvY2tzLmMtMjM3NS17XFxuLS1cXG5mcy9sb2Nrcy5jPTI0MDE9c3RhdGljIGludCBwb3NpeF9sb2NrX3RvX2Zsb2NrKHN0cnVjdCBmbG9jayAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxcbmZzL2xvY2tzLmMtMjQwMi17XFxuZnMvbG9ja3MuYzoyNDAzOlxcdGZsb2NrLVxcdTAwM2VsX3BpZCA9IGxvY2tzX3RyYW5zbGF0ZV9waWQoXFx1MDAyNmZsLVxcdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xcbmZzL2xvY2tzLmMtMjQwNC0jaWYgQklUU19QRVJfTE9ORyA9PSAzMlxcbi0tXFxuZnMvbG9ja3MuYz0yNDIzPXN0YXRpYyB2b2lkIHBvc2l4X2xvY2tfdG9fZmxvY2s2NChzdHJ1Y3QgZmxvY2s2NCAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxcbmZzL2xvY2tzLmMtMjQyNC17XFxuZnMvbG9ja3MuYzoyNDI1OlxcdGZsb2NrLVxcdTAwM2VsX3BpZCA9IGxvY2tzX3RyYW5zbGF0ZV9waWQoXFx1MDAyNmZsLVxcdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xcbmZzL2xvY2tzLmMtMjQyNi1cXHRmbG9jay1cXHUwMDNlbF9zdGFydCA9IGZsLVxcdTAwM2VmbF9zdGFydDtcXG4tLVxcbmZzL2xvY2tzLmM9MjkyMT1zdGF0aWMgdm9pZCBsb2NrX2dldF9zdGF0dXMoc3RydWN0IHNlcV9maWxlICpmLCBzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsYyxcXG4tLVxcbmZzL2xvY2tzLmMtMjkyOS1cXG5mcy9sb2Nrcy5jOjI5MzA6XFx0cGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChmbGMsIHByb2NfcGlkbnMpO1xcbmZzL2xvY2tzLmMtMjkzMS1cXG4tLVxcbmZzL2xvY2tzLmM9MzAxNj1zdGF0aWMgaW50IGxvY2tzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxcbi0tXFxuZnMvbG9ja3MuYy0zMDQzLVxcbmZzL2xvY2tzLmM6MzA0NDpcXHRpZiAobG9ja3NfdHJhbnNsYXRlX3BpZChjdXIsIHByb2NfcGlkbnMpID09IDApXFxuZnMvbG9ja3MuYy0zMDQ1LVxcdFxcdHJldHVybiAwO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjozMi42MTk1MjMxNVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTk4MzA5NjgxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyB0aGUgYGxvY2tzX3RyYW5zbGF0ZV9waWRgIEltcGxlbWVudGF0aW9uKipcblxuT2theSwgdGltZSB0byBkaXZlIGludG8gYGxvY2tzX3RyYW5zbGF0ZV9waWRgLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoaXMgc3BlY2lmaWMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYW5kIHdoZXJlIGl0IHNpdHMgaW4gdGhlIGxhcmdlciBsb2NraW5nIHNjaGVtZS4gSXQncyBjcnVjaWFsLCBvYnZpb3VzbHksIGJlY2F1c2UgaWYgd2UncmUgZGVhbGluZyB3aXRoIFBJRCB0cmFuc2xhdGlvbiB3aXRoaW4gdGhlIGxvY2sgaGllcmFyY2h5LCB0aGVyZSBjb3VsZCBiZSBzdWJ0bGUgcmFjZSBjb25kaXRpb25zIG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3JzIEkgbmVlZCB0byBiZSBhd2FyZSBvZi4gSSdsbCBuZWVkIHRvIGNvbnNpZGVyIHRoaW5ncyBsaWtlOiB3aGF0IGFyZSB0aGUgY29uY3VycmVuY3kgcHJpbWl0aXZlcyBiZWluZyB1c2VkPyBBcmUgdGhlcmUgcG90ZW50aWFsIGRlYWRsb2NrcywgYW5kIGlmIHNvLCB1bmRlciB3aGF0IGNvbmRpdGlvbnM/IEhvdyBkb2VzIHRoaXMgZnVuY3Rpb24gaGFuZGxlIGRpZmZlcmVudCBQSUQgbmFtZXNwYWNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcz8gSXMgdGhlcmUgYW55dGhpbmcgdW51c3VhbCBhYm91dCB0aGUgYWxnb3JpdGhtIGl0IHVzZXMsIG9yIGlzIGl0IGEgZmFpcmx5IHN0YW5kYXJkIHRyYW5zbGF0aW9uIGxvZ2ljPyBJJ2xsIHByb2JhYmx5IHN0YXJ0IGJ5IHF1aWNrbHkgZ2xhbmNpbmcgYXQgdGhlIHNvdXJjZSBjb2RlIHRvIGdldCBhIGhpZ2gtbGV2ZWwgdmlldywgdGhlbiB6b29tIGluIG9uIGFueSBhcmVhcyB0aGF0IHNlZW0gY29tcGxleCBvciBwb3RlbnRpYWxseSBwcm9ibGVtYXRpYy4gU3BlY2lmaWNhbGx5LCBJJ2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGxvY2sgYWNxdWlzaXRpb24vcmVsZWFzZSBvcmRlciBhbmQgdGhlIGF0b21pYyBvcGVyYXRpb25zIGludm9sdmVkLiBJIG1pZ2h0IGFsc28gd2FudCB0byBjb25zdWx0IHRoZSByZWxldmFudCBkZXNpZ24gZG9jdW1lbnRzIG9yIGNvbW1lbnRzIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGtub3duIGNhdmVhdHMgb3IgcGVyZm9ybWFuY2UgY29uc2lkZXJhdGlvbnMgdG8ga2VlcCBpbiBtaW5kLiBMZXQncyBzZWUuLi5cblxuXG4iLCJJbnB1dFRva2VucyI6NTQ5MCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjM1LjIxNzgzNTE2MloiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjk3NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvbG9ja3MuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMzcwLFxuICBcIkxpbmVDb3VudFwiOiAzNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMzcwOlxcdCAqIEBuczogVGhlIG5hbWVzcGFjZSBpbnRvIHdoaWNoIHRoZSBwaWQgc2hvdWxkIGJlIHRyYW5zbGF0ZWRcXG4yMzcxOlxcdCAqXFxuMjM3MjpcXHQgKiBVc2VkIHRvIHRyYW5zbGF0ZSBhIGZsX3BpZCBpbnRvIGEgbmFtZXNwYWNlIHZpcnR1YWwgcGlkIG51bWJlclxcbjIzNzM6XFx0ICovXFxuMjM3NDpcXHRzdGF0aWMgcGlkX3QgbG9ja3NfdHJhbnNsYXRlX3BpZChzdHJ1Y3QgZmlsZV9sb2NrX2NvcmUgKmZsLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpXFxuMjM3NTpcXHR7XFxuMjM3NjpcXHRcXHRwaWRfdCB2bnI7XFxuMjM3NzpcXHRcXHRzdHJ1Y3QgcGlkICpwaWQ7XFxuMjM3ODpcXHRcXG4yMzc5OlxcdFxcdGlmIChmbC1cXHUwMDNlZmxjX2ZsYWdzIFxcdTAwMjYgRkxfT0ZETENLKVxcbjIzODA6XFx0XFx0XFx0cmV0dXJuIC0xO1xcbjIzODE6XFx0XFxuMjM4MjpcXHRcXHQvKiBSZW1vdGUgbG9ja3MgcmVwb3J0IGEgbmVnYXRpdmUgcGlkIHZhbHVlICovXFxuMjM4MzpcXHRcXHRpZiAoZmwtXFx1MDAzZWZsY19waWQgXFx1MDAzYz0gMClcXG4yMzg0OlxcdFxcdFxcdHJldHVybiBmbC1cXHUwMDNlZmxjX3BpZDtcXG4yMzg1OlxcdFxcbjIzODY6XFx0XFx0LypcXG4yMzg3OlxcdFxcdCAqIElmIHRoZSBmbG9jayBvd25lciBwcm9jZXNzIGlzIGRlYWQgYW5kIGl0cyBwaWQgaGFzIGJlZW4gYWxyZWFkeVxcbjIzODg6XFx0XFx0ICogZnJlZWQsIHRoZSB0cmFuc2xhdGlvbiBiZWxvdyB3b24ndCB3b3JrLCBidXQgd2Ugc3RpbGwgd2FudCB0byBzaG93XFxuMjM4OTpcXHRcXHQgKiBmbG9jayBvd25lciBwaWQgbnVtYmVyIGluIGluaXQgcGlkbnMuXFxuMjM5MDpcXHRcXHQgKi9cXG4yMzkxOlxcdFxcdGlmIChucyA9PSBcXHUwMDI2aW5pdF9waWRfbnMpXFxuMjM5MjpcXHRcXHRcXHRyZXR1cm4gKHBpZF90KSBmbC1cXHUwMDNlZmxjX3BpZDtcXG4yMzkzOlxcdFxcbjIzOTQ6XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbjIzOTU6XFx0XFx0cGlkID0gZmluZF9waWRfbnMoZmwtXFx1MDAzZWZsY19waWQsIFxcdTAwMjZpbml0X3BpZF9ucyk7XFxuMjM5NjpcXHRcXHR2bnIgPSBwaWRfbnJfbnMocGlkLCBucyk7XFxuMjM5NzpcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4yMzk4OlxcdFxcdHJldHVybiB2bnI7XFxuMjM5OTpcXHR9XFxuMjQwMDpcXHRcXG4yNDAxOlxcdHN0YXRpYyBpbnQgcG9zaXhfbG9ja190b19mbG9jayhzdHJ1Y3QgZmxvY2sgKmZsb2NrLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbClcXG4yNDAyOlxcdHtcXG4yNDAzOlxcdFxcdGZsb2NrLVxcdTAwM2VsX3BpZCA9IGxvY2tzX3RyYW5zbGF0ZV9waWQoXFx1MDAyNmZsLVxcdTAwM2VjLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpO1xcbjI0MDQ6XFx0I2lmIEJJVFNfUEVSX0xPTkcgPT0gMzJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6MzUuMjE3OTY2NDIyWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUyMDczMjIxNDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIGAvcHJvYy9sb2Nrc2AgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5vdGljZWQgdGhpcyBwYXRjaCBkZWFscyB3aXRoIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBhbmQgaG93IGl0IGhhbmRsZXMgYEZMX09GRExDS2AgbG9ja3MuIEkgc2VlIHRoYXQsIHByZXZpb3VzbHksIGBsb2Nrc190cmFuc2xhdGVfcGlkYCByZXR1cm5lZCAtMSBmb3IgT0ZETENLLCB3aGljaCB3YXMgcHJvYmxlbWF0aWMgYmVjYXVzZSBpdCBieXBhc3NlZCB0aGUgZXhpc3RpbmcgY2hlY2sgaW4gYGxvY2tzX3Nob3dgLiBUaGlzIG1lYW50IE9GRExDSyBsb2NrcyB3ZXJlIGFsd2F5cyBzaG93aW5nIHVwIGluIGAvcHJvYy9sb2Nrc2AsIGV2ZW4gaWYgdGhlIG93bmluZyBQSUQgd2Fzbid0IHZpc2libGUgaW4gdGhlIGN1cnJlbnQgUElEIG5hbWVzcGFjZeKAlGVmZmVjdGl2ZWx5IGRpc3BsYXlpbmcgYSBsb2NrIGJlbG9uZ2luZyB0byBQSUQgMC4gVGhhdCdzIGEgZGVmaW5pdGUgYnVnLlxuXG5UaGUgcGF0Y2ggaXRzZWxmIGFkZHJlc3NlcyB0aGlzLiBJdCBhZGRzIGEgY3J1Y2lhbCBjaGVjayB3aXRoaW4gYGxvY2tzX3Nob3dgIHRvIGZpbHRlciBPRkQgbG9ja3MuIE5vdywgaWYgdGhlIGxvY2sgaXMgYW4gT0ZEIGxvY2sgKGBGTF9PRkRMQ0tgKSAqYW5kKiBoYXMgYSBQSUQgZ3JlYXRlciB0aGFuIHplcm8sICphbmQqIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBpc24ndCB0aGUgaW5pdGlhbCBQSUQgbmFtZXNwYWNlLCBpdCBzcGVjaWZpY2FsbHkgdmVyaWZpZXMgaWYgdGhlIFBJRCBpcyBhY3R1YWxseSB2aXNpYmxlIHdpdGhpbiB0aGUgY3VycmVudCBgcHJvY19waWRuc2AuIElmIGl0J3MgKm5vdCogdmlzaWJsZSwgaXQgcmV0dXJucyAwLCBlc3NlbnRpYWxseSBoaWRpbmcgdGhhdCBsb2NrIGVudHJ5IGZyb20gYC9wcm9jL2xvY2tzYC4gVGhhdCdzIGEgY2xlYW4sIHRhcmdldGVkIGZpeC5cblxuTm93LCB0aGUgcmVhbCBxdWVzdGlvbiBpczogSXMgdGhpcyBwYXRjaCBmdXp6LXdvcnRoeT8gTGV0J3MgY2hlY2sgdGhlIGNyaXRlcmlhLiBJdCBzcGVjaWZpY2FsbHkgc2F5cyB0byAqbm90KiBmdXp6IGlmIHRoZSBjaGFuZ2VzIGFyZSBkb2N1bWVudGF0aW9uLCBjb21tZW50cywgZGVjb3JhdGl2ZSBsb2dnaW5nLCBjb25zdGFudCBjaGFuZ2VzIHRoYXQgZG9uJ3QgYWx0ZXIgZXhlY3V0aW9uLCB1bnJlYWNoYWJsZSBjb2RlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgdmVuZG9yLXNwZWNpZmljIGhhcmR3YXJlIGRyaXZlcnMgdGhhdCBhcmUgdW5hdmFpbGFibGUgaW4gdmlydHVhbGl6YXRpb24sIGFuZCB0ZWFyZG93biBjYWxsYmFja3MuXG5cblRoaXMgcGF0Y2gsIGhvd2V2ZXIsICoqYWJzb2x1dGVseSoqIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYy4gSXQgdG91Y2hlcyB0aGUgYC9wcm9jL2xvY2tzYCBmaWxlLCB3aGljaCBpcyBhIGtleSBjb21wb25lbnQgZm9yIHRyYWNpbmcgYW5kIG1vbml0b3JpbmcgZmlsZSBsb2Nrcy4gUmVhZGluZyBvciBvcGVuaW5nIGAvcHJvYy9sb2Nrc2AgdXNpbmcgYHJlYWQoKWAsIGBzZXFfcmVhZGAsIG9yIGBmY250bChmZCwgRl9PRkRfU0VUTEssIC4uLilgIGlzIGNvbXBsZXRlbHkgYWNoaWV2YWJsZSBmcm9tIHVzZXJzcGFjZSBpbiAqYW55KiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudC4gVGhpcyBpcyBhY2Nlc3NpYmxlIGFuZCByZXByZXNlbnRzIGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgaXMgaGlnaGx5IHJlbGV2YW50IHRvIHR5cGljYWwgdXNhZ2UsIGV2ZW4gaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgUUVNVSBvciBHQ0UuXG5cblRoZXJlZm9yZSwgKnllcyosIEkgdGhpbmsgdGhpcyBpcyBhIGNhbmRpZGF0ZSBmb3IgZnV6emluZy4gSSBuZWVkIHRvIG5vdyBkZXRlcm1pbmUgdGhlIGJlc3QgYEZvY3VzU3ltYm9sc2AgYW5kIGBFbmFibGVDb25maWdzYCB0byBtYXhpbWl6ZSBjb3ZlcmFnZSBhbmQgZWZmZWN0aXZlbmVzcy4gSSdsbCBuZWVkIHRvIGRpZyBpbnRvIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbnMgYW5kIGhvdyBgZnMvbG9ja3MuY2AgYW5kIGAvcHJvYy9sb2Nrc2AgYXJlIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgYW4gZWZmZWN0aXZlIGZ1enppbmcgY2FtcGFpZ24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYzNTAsIk91dHB1dFRva2VucyI6MjUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MDEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo0MC40MjUyOTEzMzZaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3NjA5MjQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImxvY2tzXFxcXC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9NYWtlZmlsZT0zMz1vYmotJChDT05GSUdfRlNfVkVSSVRZKVxcdFxcdCs9IHZlcml0eS9cXG5mcy9NYWtlZmlsZTozNDpvYmotJChDT05GSUdfRklMRV9MT0NLSU5HKSAgICAgICs9IGxvY2tzLm9cXG5mcy9NYWtlZmlsZS0zNS1vYmotJChDT05GSUdfQklORk1UX01JU0MpXFx0Kz0gYmluZm10X21pc2Mub1xcbi0tXFxuZnMvY2VwaC9NYWtlZmlsZT02PW9iai0kKENPTkZJR19DRVBIX0ZTKSArPSBjZXBoLm9cXG5mcy9jZXBoL01ha2VmaWxlLTctXFxuZnMvY2VwaC9NYWtlZmlsZTo4OmNlcGgteSA6PSBzdXBlci5vIGlub2RlLm8gZGlyLm8gZmlsZS5vIGxvY2tzLm8gYWRkci5vIGlvY3RsLm8gXFxcXFxcbmZzL2NlcGgvTWFrZWZpbGUtOS1cXHRleHBvcnQubyBjYXBzLm8gc25hcC5vIHhhdHRyLm8gcXVvdGEubyBpby5vIFxcXFxcXG4tLVxcbmZzL29jZnMyL01ha2VmaWxlPTExPW9jZnMyLW9ianMgOj0gXFxcXFxcbi0tXFxuZnMvb2NmczIvTWFrZWZpbGUtMjYtXFx0bG9jYWxhbGxvYy5vIFxcdFxcdFxcXFxcXG5mcy9vY2ZzMi9NYWtlZmlsZToyNzpcXHRsb2Nrcy5vXFx0XFx0XFx0XFxcXFxcbmZzL29jZnMyL01ha2VmaWxlLTI4LVxcdG1tYXAubyBcXHRcXHRcXHRcXFxcXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjQwLjUwMjkwNTQ0MloiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTA4NDI0MzMzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipLY29uZmlnIERpdmU6IGBDT05GSUdfRklMRV9MT0NLSU5HYCoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IGFuZCB0cmFjayBkb3duIGBDT05GSUdfRklMRV9MT0NLSU5HYC4gSSdtIGdvaW5nIHRvIHN0YXJ0IGJ5IGdyZXBwaW5nIHRoZSBLY29uZmlnIGZpbGVzLiBUaGlzIG9uZSdzIGltcG9ydGFudDsgZmlsZSBsb2NraW5nIGNhbiBoYXZlIHNpZ25pZmljYW50IGltcGxpY2F0aW9ucyBmb3IgZmlsZXN5c3RlbSBjb25jdXJyZW5jeSBhbmQgZGF0YSBpbnRlZ3JpdHksIGRlcGVuZGluZyBvbiBob3cgaXQncyBpbXBsZW1lbnRlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHNjb3BlIGFuZCBkZXBlbmRlbmNpZXMuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGFkdmlzb3J5IGxvY2tzLCBtYW5kYXRvcnkgbG9ja3MsIG9yIHNvbWV0aGluZyBtb3JlIG51YW5jZWQ/IFdoYXQgZmlsZXN5c3RlbXMgYXJlIGFmZmVjdGVkPyBIb3cgaXMgdGhpcyBmZWF0dXJlICphY3R1YWxseSogYmVpbmcgdXNlZCwgYW5kIHdoYXQgYXJlIHRoZSBhcmd1bWVudHMgZm9yIGFuZCBhZ2FpbnN0IGl0cyBwcmVzZW5jZSBvciBhYnNlbmNlIGluIGRpZmZlcmVudCBjb250ZXh0cz8gSXQncyBnb2luZyB0byBiZSBpbnRlcmVzdGluZyB0byBzZWUgaG93IHRoaXMgaXMgY29uZmlndXJlZCBhbmQgd2hlcmUgaXQgc2l0cyBpbiB0aGUgYnJvYWRlciBmZWF0dXJlIHNldC4gVGltZSB0byBkaWcgaW4gYW5kIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzc1OSwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjQyLjYxMTMzMTczNVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzQ4NTc0MTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEZJTEVfTE9DS0lOR1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvS2NvbmZpZz0xMDg9Y29uZmlnIEVYUE9SVEZTX0JMT0NLX09QU1xcbi0tXFxuZnMvS2NvbmZpZy0xMTMtXFxuZnMvS2NvbmZpZzoxMTQ6Y29uZmlnIEZJTEVfTE9DS0lOR1xcbmZzL0tjb25maWctMTE1LVxcdGJvb2wgXFxcIkVuYWJsZSBQT1NJWCBmaWxlIGxvY2tpbmcgQVBJXFxcIiBpZiBFWFBFUlRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6NDIuNjg2MTkyNzMyWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyNDI1NTMzMDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIEtjb25maWcgZm9yIEZpbGUgU3lzdGVtIERlcGVuZGVuY2llcyoqXG5cbk9rYXksIHNvIEknbSB0cnlpbmcgdG8gZmlndXJlIG91dCBzb21lIHNwZWNpZmljcyB3aXRoaW4gdGhlIGZpbGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBjaGVjayBgZnMvS2NvbmZpZ2AuIFRoYXQncyB1c3VhbGx5IHRoZSBnby10byBzcG90IGZvciBmaWxlIHN5c3RlbS1yZWxhdGVkIG9wdGlvbnMgYW5kIGRlcGVuZGVuY2llcy4gU3BlY2lmaWNhbGx5LCBJJ2xsIHN0YXJ0IGFyb3VuZCBsaW5lIDExNC4gSSdtIGV4cGVjdGluZyB0byBmaW5kIGVpdGhlciBkaXJlY3QgZGVwZW5kZW5jaWVzIHRoYXQgbWlnaHQgc2hlZCBsaWdodCBvbiB0aGlzIGlzc3VlLCBvciBwZXJoYXBzIHNvbWUgaW5kaXJlY3QgZGVwZW5kZW5jaWVzIHRocm91Z2ggb3RoZXIgY29uZmlnIHN5bWJvbHMuIEl0J3MgYSBzb2xpZCBmaXJzdCBzdGVwIHRvIGdldCBhIGxheSBvZiB0aGUgbGFuZCBhbmQgdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGRpZmZlcmVudCBmaWxlIHN5c3RlbSBmZWF0dXJlcy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QganVtcGluZy1vZmYgcG9pbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjgwNjMsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo0NC45Mjg3NDg0MzhaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzYyNDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTAsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMTA6XFx0XFx0aGVscFxcbiAxMTE6XFx0XFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBleHBvcnQgb3BlcmF0aW9ucyBmb3IgYSBmaWxlc3lzdGVtIHRvIHN1cHBvcnRcXG4gMTEyOlxcdFxcdCAgZXh0ZXJuYWwgYmxvY2sgSU8uXFxuIDExMzpcXHRcXG4gMTE0OlxcdGNvbmZpZyBGSUxFX0xPQ0tJTkdcXG4gMTE1OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBQT1NJWCBmaWxlIGxvY2tpbmcgQVBJXFxcIiBpZiBFWFBFUlRcXG4gMTE2OlxcdFxcdGRlZmF1bHQgeVxcbiAxMTc6XFx0XFx0aGVscFxcbiAxMTg6XFx0XFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHN0YW5kYXJkIGZpbGUgbG9ja2luZyBzdXBwb3J0LCByZXF1aXJlZFxcbiAxMTk6XFx0XFx0ICBmb3IgZmlsZXN5c3RlbXMgbGlrZSBORlMgYW5kIGZvciB0aGUgZmxvY2soKSBzeXN0ZW1cXG4gMTIwOlxcdFxcdCAgY2FsbC4gRGlzYWJsaW5nIHRoaXMgb3B0aW9uIHNhdmVzIGFib3V0IDExay5cXG4gMTIxOlxcdFxcbiAxMjI6XFx0c291cmNlIFxcXCJmcy9jcnlwdG8vS2NvbmZpZ1xcXCJcXG4gMTIzOlxcdFxcbiAxMjQ6XFx0c291cmNlIFxcXCJmcy92ZXJpdHkvS2NvbmZpZ1xcXCJcXG4gMTI1OlxcdFxcbiAxMjY6XFx0c291cmNlIFxcXCJmcy9ub3RpZnkvS2NvbmZpZ1xcXCJcXG4gMTI3OlxcdFxcbiAxMjg6XFx0c291cmNlIFxcXCJmcy9xdW90YS9LY29uZmlnXFxcIlxcbiAxMjk6XFx0XFxuIDEzMDpcXHRzb3VyY2UgXFxcImZzL2F1dG9mcy9LY29uZmlnXFxcIlxcbiAxMzE6XFx0c291cmNlIFxcXCJmcy9mdXNlL0tjb25maWdcXFwiXFxuIDEzMjpcXHRzb3VyY2UgXFxcImZzL292ZXJsYXlmcy9LY29uZmlnXFxcIlxcbiAxMzM6XFx0XFxuIDEzNDpcXHRtZW51IFxcXCJDYWNoZXNcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjQ0LjkyODgyNzQ2OVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDE4MzQxMTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBzZWUgd2hhdCdzIGdvaW5nIG9uIHdpdGggYC9wcm9jL2xvY2tzYC4gTXkgZmlyc3QgdGhvdWdodCBpcywgaXMgdGhpcyBkZXBlbmRlbnQgb24gYW55IHNwZWNpZmljIGtlcm5lbCBjb25maWd1cmF0aW9ucywgbGlrZSBgQ09ORklHX1BST0NfRlNgIG9yIGBDT05GSUdfUElEX05TYD8gSSBuZWVkIHRvIGJlIHN1cmUgdGhlIHN5c3RlbSBoYXMgd2hhdCBpdCBuZWVkcyBiZWZvcmUgSSBzdGFydCBkaXZpbmcgZGVlcGVyLlxuXG5Ob3csIHRvIHVuZGVyc3RhbmQgaXRzIGluaXRpYWxpemF0aW9uLCBJIHNob3VsZCBjaGVjayB0aGUgYHByb2NfbG9ja3NfaW5pdGAgZnVuY3Rpb24uIFRoYXQgd2lsbCBiZSBpbiBgZnMvbG9ja3MuY2AuIFRoYXQgZnVuY3Rpb24gc2hvdWxkIGxheSBvdXQgdGhlIGZvdW5kYXRpb25zIEkgYW0gbG9va2luZyBmb3IuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg2MDcsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjQ3LjM0NzE3MDk4OFoiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzEyNjg1MjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicHJvY19sb2Nrc19pbml0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9sb2Nrcy5jPTMxNDM9c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsb2Nrc19zZXFfb3BlcmF0aW9ucyA9IHtcXG4tLVxcbmZzL2xvY2tzLmMtMzE0OS1cXG5mcy9sb2Nrcy5jOjMxNTA6c3RhdGljIGludCBfX2luaXQgcHJvY19sb2Nrc19pbml0KHZvaWQpXFxuZnMvbG9ja3MuYy0zMTUxLXtcXG4tLVxcbmZzL2xvY2tzLmMtMzE1NS19XFxuZnMvbG9ja3MuYzozMTU2OmZzX2luaXRjYWxsKHByb2NfbG9ja3NfaW5pdCk7XFxuZnMvbG9ja3MuYy0zMTU3LSNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo0Ny40MTg0NDUxNTVaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTc3NDg1MzY0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGFuYWx5c2lzIG9mIHRoZSBwcm92aWRlZCBzbmlwcGV0LCBhcyBpZiBpdCB3ZXJlIG15IHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBgZnMvbG9ja3MuY2AqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgZnMvbG9ja3MuY2AuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiBob3cgYHByb2NfbG9ja3NfaW5pdGAgaXMgYmVpbmcgaGFuZGxlZC4gVGhlIGAjaWZkZWZgIGRpcmVjdGl2ZSBhcm91bmQgdGhhdCBmdW5jdGlvbiBpcyB3aGF0IEknbSBmb2N1c2luZyBvbi4gSXQncyBhIGtleSBkZXRhaWwgdG8gdW5kZXJzdGFuZCB0aGUgZmxleGliaWxpdHkgb2YgdGhlIGxvY2tpbmcgaW1wbGVtZW50YXRpb24uIEkgbmVlZCB0byBmaWd1cmUgb3V0IHVuZGVyIHdoYXQgY29uZGl0aW9ucyB0aGlzIGluaXRpYWxpemF0aW9uIGlzIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLiBJJ20gYWxyZWFkeSB0aGlua2luZyBhYm91dCB3aGF0IHByZXByb2Nlc3NvciBtYWNyb3MgYXJlIGludm9sdmVkIGFuZCBob3cgdGhleSByZWxhdGUgdG8gdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbiBhbmQgYnVpbGQgc2V0dGluZ3Mgb2YgdGhpcyBwYXJ0aWN1bGFyIGtlcm5lbCB2ZXJzaW9uLiBFc3NlbnRpYWxseSwgSSdtIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQtZGVwZW5kZW50IGJlaGF2aW9yIG9mIGBwcm9jX2xvY2tzX2luaXRgIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0gbG9ja2luZyBtb2R1bGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg5MjcsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo0OS4xOTMzMDExOTFaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM2NjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2xvY2tzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjkwMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjkwMDpcXHRcXG4yOTAxOlxcdFxcdGN0eCA9IGxvY2tzX2lub2RlX2NvbnRleHQoaW5vZGUpO1xcbjI5MDI6XFx0XFx0aWYgKCFjdHgpXFxuMjkwMzpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuMjkwNDpcXHRcXG4yOTA1OlxcdFxcdHNwaW5fbG9jayhcXHUwMDI2Y3R4LVxcdTAwM2VmbGNfbG9jayk7XFxuMjkwNjpcXHRcXHRyZXQgPSAhbGlzdF9lbXB0eShcXHUwMDI2Y3R4LVxcdTAwM2VmbGNfcG9zaXgpIHx8ICFsaXN0X2VtcHR5KFxcdTAwMjZjdHgtXFx1MDAzZWZsY19mbG9jayk7XFxuMjkwNzpcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2Y3R4LVxcdTAwM2VmbGNfbG9jayk7XFxuMjkwODpcXHRcXHRyZXR1cm4gcmV0O1xcbjI5MDk6XFx0fVxcbjI5MTA6XFx0RVhQT1JUX1NZTUJPTF9HUEwodmZzX2lub2RlX2hhc19sb2Nrcyk7XFxuMjkxMTpcXHRcXG4yOTEyOlxcdCNpZmRlZiBDT05GSUdfUFJPQ19GU1xcbjI5MTM6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Byb2NfZnMuaFxcdTAwM2VcXG4yOTE0OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9zZXFfZmlsZS5oXFx1MDAzZVxcbjI5MTU6XFx0XFxuMjkxNjpcXHRzdHJ1Y3QgbG9ja3NfaXRlcmF0b3Ige1xcbjI5MTc6XFx0XFx0aW50XFx0bGlfY3B1O1xcbjI5MTg6XFx0XFx0bG9mZl90XFx0bGlfcG9zO1xcbjI5MTk6XFx0fTtcXG4yOTIwOlxcdFxcbjI5MjE6XFx0c3RhdGljIHZvaWQgbG9ja19nZXRfc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqZiwgc3RydWN0IGZpbGVfbG9ja19jb3JlICpmbGMsXFxuMjkyMjpcXHRcXHRcXHRcXHQgICAgbG9mZl90IGlkLCBjaGFyICpwZngsIGludCByZXBlYXQpXFxuMjkyMzpcXHR7XFxuMjkyNDpcXHRcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDtcXG4yOTI1OlxcdFxcdHVuc2lnbmVkIGludCBwaWQ7XFxuMjkyNjpcXHRcXHRzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcHJvY19waWRucyA9IHByb2NfcGlkX25zKGZpbGVfaW5vZGUoZi1cXHUwMDNlZmlsZSktXFx1MDAzZWlfc2IpO1xcbjI5Mjc6XFx0XFx0aW50IHR5cGUgPSBmbGMtXFx1MDAzZWZsY190eXBlO1xcbjI5Mjg6XFx0XFx0c3RydWN0IGZpbGVfbG9jayAqZmwgPSBmaWxlX2xvY2soZmxjKTtcXG4yOTI5OlxcdFxcbjI5MzA6XFx0XFx0cGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChmbGMsIHByb2NfcGlkbnMpO1xcbjI5MzE6XFx0XFxuMjkzMjpcXHRcXHQvKlxcbjI5MzM6XFx0XFx0ICogSWYgbG9jayBvd25lciBpcyBkZWFkIChhbmQgcGlkIGlzIGZyZWVkKSBvciBub3QgdmlzaWJsZSBpbiBjdXJyZW50XFxuMjkzNDpcXHRcXHQgKiBwaWRucywgemVybyBpcyBzaG93biBhcyBhIHBpZCB2YWx1ZS4gQ2hlY2sgbG9jayBpbmZvIGZyb21cXG4yOTM1OlxcdFxcdCAqIGluaXRfcGlkX25zIHRvIGdldCBzYXZlZCBsb2NrIHBpZCB2YWx1ZS5cXG4yOTM2OlxcdFxcdCAqL1xcbjI5Mzc6XFx0XFx0aWYgKGZsYy1cXHUwMDNlZmxjX2ZpbGUgIT0gTlVMTClcXG4yOTM4OlxcdFxcdFxcdGlub2RlID0gZmlsZV9pbm9kZShmbGMtXFx1MDAzZWZsY19maWxlKTtcXG4yOTM5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo0OS4xOTM0Mzk4MjFaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjIxMjc1NzI3OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLZXJuZWwgQ29uZmlndXJhdGlvbiBFeHBsb3JhdGlvbioqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBjb2RlIGFuZCBpbW1lZGlhdGVseSBJIHNlZSBhIGNydWNpYWwgcG9pbnQgb24gbGluZSAyOTEyOiBpdCdzIGAjaWZkZWYgQ09ORklHX1BST0NfRlNgISBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LCBjb25maXJtaW5nIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIHByb2MgZmlsZXN5c3RlbS4gVGhlbiwganVzdCBhIGJpdCBmdXJ0aGVyIGRvd24sIG9uIGxpbmUgMzAzMCwgYSBjaGVjayBmb3IgYHByb2NfcGlkbnMgIT0gXHUwMDI2aW5pdF9waWRfbnNgIHBvcHMgdXAuIFRoYXQncyBhIGRpcmVjdCBjb25uZWN0aW9uIHRvIFBJRCBuYW1lc3BhY2VzIGFuZCBJIGFtIGNlcnRhaW4gdGhpcyBtdXN0IHJlbGF0ZSB0byBgQ09ORklHX1BJRF9OU2AuIFNvLCBub3cgSSBuZWVkIHRvIGNvbmZpcm0gdGhvc2UgdGhyZWUgY29uZmlndXJhdGlvbnM6IGBDT05GSUdfUFJPQ19GU2AsIGBDT05GSUdfUElEX05TYCwgYW5kIGFsc28sIGp1c3QgdG8gYmUgdGhvcm91Z2gsIGxldCdzIHNlZSB3aGVyZSBgQ09ORklHX0ZJTEVfTE9DS0lOR2AgY29tZXMgaW4uIEl0J3MgdGltZSB0byBjb25maXJtIHRoZXNlIHJlbGF0aW9uc2hpcHMsIGFuZCBJJ2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIGV4YWN0bHkgaG93IGBQSURfTlNgIGlzIGRlZmluZWQgdG8gZ2V0IGEgZnVsbCB1bmRlcnN0YW5kaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NzgxLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1MS40MDYyMDA0NzlaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2MDkxODQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBQSURfTlNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5pdC9LY29uZmlnPTE0NDY9Y29uZmlnIFVTRVJfTlNcXG4tLVxcbmluaXQvS2NvbmZpZy0xNDU5LVxcbmluaXQvS2NvbmZpZzoxNDYwOmNvbmZpZyBQSURfTlNcXG5pbml0L0tjb25maWctMTQ2MS1cXHRib29sIFxcXCJQSUQgTmFtZXNwYWNlc1xcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTY6NTEuNDUyMjk5MTU3WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwMjMyNDIxODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW50ZXJuYWwgbW9ub2xvZ3VlOlxuXG4qKkNoZWNraW5nIGBDT05GSUdfUFJPQ19GU2AgaW4gYGZzL3Byb2MvS2NvbmZpZ2AqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBwcm9jIGZpbGVzeXN0ZW0gY29uZmlndXJhdGlvbi4gSXQncyBzZWNvbmQgbmF0dXJlIGF0IHRoaXMgcG9pbnQg4oCTIEknbSB0aGlua2luZywgXCJMZXQncyBjaGVjayBgQ09ORklHX1BST0NfRlNgIGluIGBmcy9wcm9jL0tjb25maWdgLlwiIEdvdHRhIG1ha2Ugc3VyZSB0aGlzIGZ1bmRhbWVudGFsIGNvbXBvbmVudCBpcyBlbmFibGVkIG9yIHByb3Blcmx5IGNvbmZpZ3VyZWQuIEtub3dpbmcgdGhpcywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBlbHNlIHJlbGllcyBvbiBpdCwgYW5kIHdoYXQgbXkgZ29hbCBvZiB1bmRlcnN0YW5kaW5nIHRoZSBjdXJyZW50IHN5c3RlbS4gR290dGEgZW5zdXJlIGl0J3Mgc2V0IGNvcnJlY3RseS4gQWZ0ZXIgYWxsLCBgcHJvY2ZzYCBpcyBwcmFjdGljYWxseSB0aGUgYmFja2JvbmUgZm9yIHN5c3RlbSBtb25pdG9yaW5nLCBkZWJ1Z2dpbmcsIGFuZCBwcm92aWRpbmcgaW5mb3JtYXRpb24gdG8gdXNlcnNwYWNlLiBJJ2xsIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCB0aGlzIGNoZWNrIGlzIGdvaW5nIHRvIGJlIHBhcnQgb2YgYSBiaWdnZXIgcHJvamVjdDsgdGhlcmVmb3JlLCBJIG11c3QgZW5zdXJlIEkgZG8gbXkgZHVlIGRpbGlnZW5jZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxNzIsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1My40NzU1NDQwNDNaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyMjk5NjY3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBQUk9DX0ZTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9wcm9jL0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG5mcy9wcm9jL0tjb25maWc6Mjpjb25maWcgUFJPQ19GU1xcbmZzL3Byb2MvS2NvbmZpZy0zLVxcdGJvb2wgXFxcIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnRcXFwiIGlmIEVYUEVSVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1My41NDc4NDg1MloiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTc0NDk4NjYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBGb2N1c1N5bWJvbHMgYW5kIExvY2sgSW5mb3JtYXRpb24qKlxuXG5Pa2F5LCBzbyB3ZSdyZSBsb29raW5nIGF0IGBGb2N1c1N5bWJvbHNgLCBhbmQgdGhlIHBhdGNoIGhpZ2hsaWdodHMgYSBtb2RpZmljYXRpb24gdG8gYGxvY2tzX3Nob3dgLiBIbW0sIHRoYXQgcmluZ3MgYSBiZWxsLiBXYWl0IGEgbWludXRlLCBpc24ndCBgbG9ja3Nfc2hvd2AgZGVmaW5lZCBhcyBgc3RhdGljYCB3aXRoaW4gYGZzL2xvY2tzLmNgPyBZZXAsIGl0IGlzLiBBbHJpZ2h0LCB0aGF0IGNoYW5nZXMgdGhlIGFwcHJvYWNoIGEgYml0LiBOb3cgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgKnVzZWQqLiBTaW5jZSBpdCdzIHN0YXRpYywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGVudHJ5cG9pbnRzIHRoYXQgaW52b2x2ZSBpdCwgYW5kIHNwZWNpZmljYWxseSwgd2hhdCBmdW5jdGlvbnMgKmNhbGwqIGBsb2Nrc19zaG93YCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LiBMZXQncyBzdGFydCBieSBkaWdnaW5nIGludG8gdGhlIHNlcXVlbmNlIG9wZXJhdGlvbnMgYW5kIGlkZW50aWZ5IHRoZSBjYWxsZXJzLiBUaGF0IHNob3VsZCBwYWludCBhIGNsZWFyZXIgcGljdHVyZSBvZiBpdHMgcm9sZSBpbiB0aGlzIHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA0NzQsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1Ni4xMjIzNTEyMDNaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM5NDQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2xvY2tzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzEzNSxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMzEzNTpcXHRcXG4zMTM2OlxcdHN0YXRpYyB2b2lkIGxvY2tzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxcbjMxMzc6XFx0XFx0X19yZWxlYXNlcyhcXHUwMDI2YmxvY2tlZF9sb2NrX2xvY2spXFxuMzEzODpcXHR7XFxuMzEzOTpcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2YmxvY2tlZF9sb2NrX2xvY2spO1xcbjMxNDA6XFx0XFx0cGVyY3B1X3VwX3dyaXRlKFxcdTAwMjZmaWxlX3J3c2VtKTtcXG4zMTQxOlxcdH1cXG4zMTQyOlxcdFxcbjMxNDM6XFx0c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsb2Nrc19zZXFfb3BlcmF0aW9ucyA9IHtcXG4zMTQ0OlxcdFxcdC5zdGFydFxcdD0gbG9ja3Nfc3RhcnQsXFxuMzE0NTpcXHRcXHQubmV4dFxcdD0gbG9ja3NfbmV4dCxcXG4zMTQ2OlxcdFxcdC5zdG9wXFx0PSBsb2Nrc19zdG9wLFxcbjMxNDc6XFx0XFx0LnNob3dcXHQ9IGxvY2tzX3Nob3csXFxuMzE0ODpcXHR9O1xcbjMxNDk6XFx0XFxuMzE1MDpcXHRzdGF0aWMgaW50IF9faW5pdCBwcm9jX2xvY2tzX2luaXQodm9pZClcXG4zMTUxOlxcdHtcXG4zMTUyOlxcdFxcdHByb2NfY3JlYXRlX3NlcV9wcml2YXRlKFxcXCJsb2Nrc1xcXCIsIDAsIE5VTEwsIFxcdTAwMjZsb2Nrc19zZXFfb3BlcmF0aW9ucyxcXG4zMTUzOlxcdFxcdFxcdFxcdHNpemVvZihzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IpLCBOVUxMKTtcXG4zMTU0OlxcdFxcdHJldHVybiAwO1xcbjMxNTU6XFx0fVxcbjMxNTY6XFx0ZnNfaW5pdGNhbGwocHJvY19sb2Nrc19pbml0KTtcXG4zMTU3OlxcdCNlbmRpZlxcbjMxNTg6XFx0XFxuMzE1OTpcXHRzdGF0aWMgaW50IF9faW5pdCBmaWxlbG9ja19pbml0KHZvaWQpXFxuMzE2MDpcXHR7XFxuMzE2MTpcXHRcXHRpbnQgaTtcXG4zMTYyOlxcdFxcbjMxNjM6XFx0XFx0ZmxjdHhfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShcXFwiZmlsZV9sb2NrX2N0eFxcXCIsXFxuMzE2NDpcXHRcXHRcXHRcXHRzaXplb2Yoc3RydWN0IGZpbGVfbG9ja19jb250ZXh0KSwgMCwgU0xBQl9QQU5JQywgTlVMTCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE2OjU2LjEyMjQ5MzE1M1oiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozMTcwMjA4NDA4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTG9ja3MgSW1wbGVtZW50YXRpb24qKlxuXG5Pa2F5LCBzbyBgbG9ja3Nfc2hvd2AgaXMgYSBmdW5jdGlvbiBwb2ludGVyIHdpdGhpbiBgbG9ja3Nfc2VxX29wZXJhdGlvbnNgLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBgLnNob3dgIG9wZXJhdGlvbi4gVGhlIGNyaXRpY2FsIHBvaW50IGlzIHRoYXQgaXRzIGFkZHJlc3MgaXMgYmVpbmcgdGFrZW4uIEJlY2F1c2Ugb2YgdGhpcywgZXZlbiBpZiBpdCB3ZXJlIGEgc3RhdGljIGZ1bmN0aW9uLCB0aGUgY29tcGlsZXIgKndvbid0KiBpbmxpbmUgaXQuIEl0J2xsIGhhdmUgaXRzIG93biBkaXN0aW5jdCBzeW1ib2wgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZS4gVGhpcyBoYXMgaW1wbGljYXRpb25zIGZvciBob3cgaXQncyByZXNvbHZlZCBhbmQgbGlua2VkLlxuXG5BbHJpZ2h0LCBiZWZvcmUgZGl2aW5nIHRvbyBkZWVwLCBsZXQncyBicm9hZGVuIHRoZSBzY29wZS4gSSBuZWVkIHRvIHNlZSB0aGUgYnJvYWRlciBjb250ZXh0IHdpdGhpbiBgZnMvbG9ja3MuY2AuIEFyZSB0aGVyZSBvdGhlciBmdW5jdGlvbnMgd2l0aGluIHRoYXQgZmlsZSBkaXJlY3RseSByZWxhdGVkIHRvIE9GRCAoT3BlbiBGaWxlIERlc2NyaXB0aW9uKSBsb2NrcyBvciwgY3J1Y2lhbGx5LCByZWxhdGVkIHRvIGBsb2Nrc19zaG93YCBpdHNlbGY/IEl0J3MgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIHJlbGF0aW9uc2hpcHMuXG5cbkhvbGQgb24gYSBzZWNvbmQsIGJlZm9yZSBJIGdldCBjYXJyaWVkIGF3YXkuIExldCdzIHN0ZXAgYmFjayBhbmQgY29uc2lkZXIgdGhlICplbnRyeSBwb2ludHMqIGZvciBgZmNudGxgIGxvY2tzLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGNyaXRpY2FsIGZ1bmN0aW9uczogYGZjbnRsX3NldGxrYCwgYGZjbnRsX3NldGxrNjRgLCBgZG9fbG9ja19maWxlX3dhaXRgLCBgdmZzX2xvY2tfZmlsZWAuLi4gdGhpbmdzIGxpa2UgdGhhdC4gV2UgcmVhbGx5IG5lZWQgdG8gbG9vayBhdCB0aGVzZSBlbnRyeSBwb2ludHMgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdy4gSSBuZWVkIHRvIHNlYXJjaCBmb3IgdGhvc2UgYGZjbnRsYCBsb2NrIGVudHJ5cG9pbnRzIHRvIGdldCBhIGZ1bGwgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTExOTAsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1OS4yOTI3MDQ3NjFaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjczNTI1NjI3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZjbnRsX3NldGxrXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9mY250bC5jPTQ0ND1zdGF0aWMgbG9uZyBkb19mY250bChpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLFxcbi0tXFxuZnMvZmNudGwuYy00OTktXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuZnMvZmNudGwuYzo1MDA6XFx0XFx0ZXJyID0gZmNudGxfc2V0bGsoZmQsIGZpbHAsIGNtZCwgXFx1MDAyNmZsb2NrKTtcXG5mcy9mY250bC5jLTUwMS1cXHRcXHRicmVhaztcXG4tLVxcbmZzL2ZjbnRsLmM9NjA4PVNZU0NBTExfREVGSU5FMyhmY250bDY0LCB1bnNpZ25lZCBpbnQsIGZkLCB1bnNpZ25lZCBpbnQsIGNtZCxcXG4tLVxcbmZzL2ZjbnRsLmMtNjQ0LVxcdFxcdFxcdGJyZWFrO1xcbmZzL2ZjbnRsLmM6NjQ1OlxcdFxcdGVyciA9IGZjbnRsX3NldGxrNjQoZmQsIGZkX2ZpbGUoZiksIGNtZCwgXFx1MDAyNmZsb2NrKTtcXG5mcy9mY250bC5jLTY0Ni1cXHRcXHRicmVhaztcXG4tLVxcbmZzL2ZjbnRsLmM9NzQzPXN0YXRpYyBsb25nIGRvX2NvbXBhdF9mY250bDY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCxcXG4tLVxcbmZzL2ZjbnRsLmMtNzg3LVxcdFxcdFxcdGJyZWFrO1xcbmZzL2ZjbnRsLmM6Nzg4OlxcdFxcdGVyciA9IGZjbnRsX3NldGxrKGZkLCBmZF9maWxlKGYpLCBjb252ZXJ0X2ZjbnRsX2NtZChjbWQpLCBcXHUwMDI2ZmxvY2spO1xcbmZzL2ZjbnRsLmMtNzg5LVxcdFxcdGJyZWFrO1xcbi0tXFxuZnMvZmNudGwuYy03OTYtXFx0XFx0XFx0YnJlYWs7XFxuZnMvZmNudGwuYzo3OTc6XFx0XFx0ZXJyID0gZmNudGxfc2V0bGsoZmQsIGZkX2ZpbGUoZiksIGNvbnZlcnRfZmNudGxfY21kKGNtZCksIFxcdTAwMjZmbG9jayk7XFxuZnMvZmNudGwuYy03OTgtXFx0XFx0YnJlYWs7XFxuLS1cXG5mcy9sb2Nrcy5jPTI1NDg9Y2hlY2tfZm1vZGVfZm9yX3NldGxrKHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxcbi0tXFxuZnMvbG9ja3MuYy0yNTY0LSAqL1xcbmZzL2xvY2tzLmM6MjU2NTppbnQgZmNudGxfc2V0bGsodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcXG5mcy9sb2Nrcy5jLTI1NjYtXFx0XFx0c3RydWN0IGZsb2NrICpmbG9jaylcXG4tLVxcbmZzL2xvY2tzLmMtMjYzNS1vdXQ6XFxuZnMvbG9ja3MuYzoyNjM2OlxcdHRyYWNlX2ZjbnRsX3NldGxrKGlub2RlLCBmaWxlX2xvY2ssIGVycm9yKTtcXG5mcy9sb2Nrcy5jLTI2MzctXFx0bG9ja3NfZnJlZV9sb2NrKGZpbGVfbG9jayk7XFxuLS1cXG5mcy9sb2Nrcy5jPTI2NDU9aW50IGZjbnRsX2dldGxrNjQoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBmbG9jazY0ICpmbG9jaylcXG4tLVxcbmZzL2xvY2tzLmMtMjY4Ny0gKi9cXG5mcy9sb2Nrcy5jOjI2ODg6aW50IGZjbnRsX3NldGxrNjQodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcXG5mcy9sb2Nrcy5jLTI2ODktXFx0XFx0c3RydWN0IGZsb2NrNjQgKmZsb2NrKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNjo1OS4zNjYyMzU5NDhaIiwiU2VxIjozMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTQ5ODExNzUwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBGdXp6aW5nIFN0cmF0ZWd5IGZvciBgbG9ja3Nfc2hvd2AqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoICpzcGVjaWZpY2FsbHkqIHRvdWNoZXMgdGhlIGBsb2Nrc19zaG93YCBmdW5jdGlvbi4gTGV0IG1lIHF1aWNrbHkgY29uZmlybSB0aGF0IGJ5IGNoZWNraW5nIHRoZSBkaWZmLiBZdXAsIGp1c3QgYGxvY2tzX3Nob3dgIGluIGBmcy9sb2Nrcy5jYC4gR29vZC5cblxuTm93LCBpcyB0aGlzIGV2ZW4gKndvcnRoKiBmdXp6aW5nPyBBYnNvbHV0ZWx5LiBJdCdzIGtlcm5lbCBjb3JlIGxvZ2ljLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBgL3Byb2MvbG9ja3NgIGFuZCBob3cgaXQgaGFuZGxlcyBPRkQgbG9ja3MgYWNyb3NzIFBJRCBuYW1lc3BhY2VzLiBUaGF0J3MgYSBkZWZpbml0ZSBcInllc1wiIGluIG15IGJvb2suXG5cbk15IGZ1enppbmcgZm9jdXMgd2lsbCBkZWZpbml0ZWx5IGJlIG9uIGBsb2Nrc19zaG93YC4gSSdsbCBjb25zaWRlciBhZGRpbmcgYGZjbnRsX3NldGxrYCBhbmQgYGZjbnRsX3NldGxrNjRgIGlmIEkgZmluZCB0aGV5IG9mZmVyIHNvbWUgY292ZXJhZ2UsIGJ1dCBgbG9ja3Nfc2hvd2AgaXMgdGhlIGRpcmVjdCB0YXJnZXQuXG5cblRoZSBjb25maWd1cmF0aW9uIHJlcXVpcmVtZW50cyBhcmUgY2xlYXI6IGBGSUxFX0xPQ0tJTkdgLCBgUFJPQ19GU2AsIGFuZCBgUElEX05TYC4gR290IGl0LiBObyBwcmVmaXgsIGp1c3QgdGhlIHN5bWJvbHMgYXMtaXMuXG5cbkFscmlnaHQsIGRvdWJsZS1jaGVja2luZyBldmVyeXRoaW5n4oCmIFdlJ3ZlIGV4dHJhY3RlZCB0aGUgZnVuY3Rpb24sIGlkZW50aWZpZWQgdGhlIENPTkZJRyBvcHRpb25zLCBhbmQgY29uZmlybWVkIGl0J3Mgd29ydGggZnV6emluZy4gSSdtIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC4gTGV0J3MgZ2V0IHRoaXMgZnV6emluZyBydW4gZ29pbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMjkyLCJPdXRwdXRUb2tlbnMiOjEwMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIyNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNzowNC44NjQzNTYxNDlaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NTkzNjc1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRklMRV9MT0NLSU5HXCIsXG4gICAgXCJQUk9DX0ZTXCIsXG4gICAgXCJQSURfTlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJsb2Nrc19zaG93XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgYGxvY2tzX3Nob3coKWAgaW4gZnMvbG9ja3MuYyB0byBwcm9wZXJseSBmaWx0ZXIgT3BlbiBGaWxlIERlc2NyaXB0aW9uIChPRkQpIGxvY2tzIHdoZW4gcmVhZGluZyAvcHJvYy9sb2NrcyBmcm9tIHdpdGhpbiBub24taW5pdCBQSUQgbmFtZXNwYWNlcy4gVGhpcyBpcyBjb3JlIGZpbGVzeXN0ZW0gbG9naWMgYWNjZXNzaWJsZSBmcm9tIHVzZXJzcGFjZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJGSUxFX0xPQ0tJTkdcIixcbiAgICBcIlBST0NfRlNcIixcbiAgICBcIlBJRF9OU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImxvY2tzX3Nob3dcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgbG9ja3Nfc2hvdygpYCBpbiBmcy9sb2Nrcy5jIHRvIHByb3Blcmx5IGZpbHRlciBPcGVuIEZpbGUgRGVzY3JpcHRpb24gKE9GRCkgbG9ja3Mgd2hlbiByZWFkaW5nIC9wcm9jL2xvY2tzIGZyb20gd2l0aGluIG5vbi1pbml0IFBJRCBuYW1lc3BhY2VzLiBUaGlzIGlzIGNvcmUgZmlsZXN5c3RlbSBsb2dpYyBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNzowNC45NDAzMDA0MDZaIiwiU2VxIjozMywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwODU2MDI1MTMzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTc6MDQuOTQwNzUwNDg2WiIsIlNlcSI6MzQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MjA4NTU1NzExMTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgYGxvY2tzX3Nob3coKWAgaW4gYGZzL2xvY2tzLmNgIHRvIHByb3Blcmx5IGZpbHRlciBvcGVuIGZpbGUgZGVzY3JpcHRvciAoT0ZEKSBsb2NrcyBpbiBub24taW5pdCBQSUQgbmFtZXNwYWNlcy4gVGhlIGNoYW5nZXMgb25seSBpbnRyb2R1Y2Ugc2NhbGFyIHN0YWNrIHZhcmlhYmxlcyAoYHZpc2libGVgIGluaXRpYWxpemVkIHRvIGBmYWxzZWAsIGBwaWRgIHBvaW50ZXIgYXNzaWduZWQgZnJvbSBgZmluZF9waWRfbnMoKWApIGFuZCBwZXJmb3JtIG5hbWVzcGFjZSB0cmFuc2xhdGlvbiBjaGVja3MgdW5kZXIgUkNVLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkLCBhbGxvY2F0ZWQsIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBwYWRkaW5nIG9yIHN0cnVjdCBmaWVsZHMgYXJlIGxlZnQgdW5pbml0aWFsaXplZC4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA5ZDA5OWEzM2Q2ODM4NmYxNDViZmE4M2E0Y2U0MmNlYjI2YzlkZmY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAwOToxNjoxMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jXG5pbmRleCA2ZTRmZjdmY2VjMDUzLi40YWYxMzg1NjgyZTRlIDEwMDY0NFxuLS0tIGEvZnMvbG9ja3MuY1xuKysrIGIvZnMvbG9ja3MuY1xuQEAgLTMwMjIsNiArMzAyMiwyNSBAQCBzdGF0aWMgaW50IGxvY2tzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KVxuIFxuIFx0Y3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7XG4gXG4rXHQvKlxuK1x0ICogT0ZEIGxvY2tzIGFyZSByZXBvcnRlZCB3aXRoIHBpZCAtMSwgc28gdGhlIGZpbHRlciBiZWxvdyBjYW5ub3Qgc2VlXG4rXHQgKiB0aGVpciBvd25lcjsgZmxjX3BpZCBob2xkcyB0aGUgb3duZXIgdGdpZCwgc28gZmlsdGVyIG9uIGl0LlxuK1x0ICogUmVtb3RlIGxvY2tzIGtlZXAgYSBuZWdhdGl2ZSBmbGNfcGlkIGFuZCBzdGF5IHZpc2libGUgYXMgYmVmb3JlLlxuK1x0ICovXG4rXHRpZiAoKGN1ci1cdTAwM2VmbGNfZmxhZ3MgXHUwMDI2IEZMX09GRExDSykgXHUwMDI2XHUwMDI2IGN1ci1cdTAwM2VmbGNfcGlkIFx1MDAzZSAwIFx1MDAyNlx1MDAyNlxuK1x0ICAgIHByb2NfcGlkbnMgIT0gXHUwMDI2aW5pdF9waWRfbnMpIHtcbitcdFx0c3RydWN0IHBpZCAqcGlkO1xuK1x0XHRib29sIHZpc2libGUgPSBmYWxzZTtcbitcbitcdFx0cmN1X3JlYWRfbG9jaygpO1xuK1x0XHRwaWQgPSBmaW5kX3BpZF9ucyhjdXItXHUwMDNlZmxjX3BpZCwgXHUwMDI2aW5pdF9waWRfbnMpO1xuK1x0XHRpZiAocGlkKVxuK1x0XHRcdHZpc2libGUgPSBwaWRfbnJfbnMocGlkLCBwcm9jX3BpZG5zKSAhPSAwO1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0aWYgKCF2aXNpYmxlKVxuK1x0XHRcdHJldHVybiAwO1xuK1x0fVxuK1xuIFx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxuIFx0XHRyZXR1cm4gMDtcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE3OjA0Ljk0MDc1MTM3NloiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3Njk0OTk5NjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYW5hbHlzaXMgb2YgdGhlIHNpdHVhdGlvbjpcblxuKipEZWNvbnN0cnVjdGluZyB0aGUgUGF0Y2gqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCB0byB3b3JrLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaC4gVGhlIGluc3RydWN0aW9ucyBhcmUgc3RyYWlnaHRmb3J3YXJkIGVub3VnaDogYW5hbHl6ZSB0aGUgY2hhbmdlcy4gSXQgbG9va3MgbGlrZSB0aGUgdGFyZ2V0IGlzIGEgbW9kaWZpY2F0aW9uIHRvIGBmcy9sb2Nrcy5jYCwgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgYGxvY2tzX3Nob3dgIGZ1bmN0aW9uLCB3aGljaCBpcyBhIGtleSBhcmVhIGZvciBsb2NrIHZpc3VhbGl6YXRpb24uIEdpdmVuIHRoZSBuYXR1cmUgb2YgdGhpcywgSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBleGlzdGluZyBsb2NraW5nIGluZnJhc3RydWN0dXJlIHdvcmtzIHRvIGlkZW50aWZ5IGFueSBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy4gSXQgYXBwZWFycyB0aGF0IHRoZSBtb2RpZmljYXRpb25zIGFyZSBpbiBvciBhcm91bmQgbGluZSAzMDIyLCBzbyBJIHdpbGwgaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgaWRlbnRpZnkgYW55IGFyZWFzIG9mIGNvbmNlcm4uIEknbGwgdXNlIGByZWFkLWZpbGVgIG9yIGBncmVwcGVyYCB0byBxdWlja2x5IGJyaW5nIHRoZSByZWxldmFudCBzZWN0aW9uIGludG8gdmlldy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI1NiwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTc6MTIuNjM1NzUzOTE2WiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5MDA5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9sb2Nrcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDMwMTAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjMwMTA6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuMzAxMTpcXHRcXHR9XFxuMzAxMjpcXHRcXG4zMDEzOlxcdFxcdHJldHVybiB0bXA7XFxuMzAxNDpcXHR9XFxuMzAxNTpcXHRcXG4zMDE2OlxcdHN0YXRpYyBpbnQgbG9ja3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpXFxuMzAxNzpcXHR7XFxuMzAxODpcXHRcXHRzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IgKml0ZXIgPSBmLVxcdTAwM2Vwcml2YXRlO1xcbjMwMTk6XFx0XFx0c3RydWN0IGZpbGVfbG9ja19jb3JlICpjdXIsICp0bXA7XFxuMzAyMDpcXHRcXHRzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcHJvY19waWRucyA9IHByb2NfcGlkX25zKGZpbGVfaW5vZGUoZi1cXHUwMDNlZmlsZSktXFx1MDAzZWlfc2IpO1xcbjMwMjE6XFx0XFx0aW50IGxldmVsID0gMDtcXG4zMDIyOlxcdFxcbjMwMjM6XFx0XFx0Y3VyID0gaGxpc3RfZW50cnkodiwgc3RydWN0IGZpbGVfbG9ja19jb3JlLCBmbGNfbGluayk7XFxuMzAyNDpcXHRcXG4zMDI1OlxcdFxcdC8qXFxuMzAyNjpcXHRcXHQgKiBPRkQgbG9ja3MgYXJlIHJlcG9ydGVkIHdpdGggcGlkIC0xLCBzbyB0aGUgZmlsdGVyIGJlbG93IGNhbm5vdCBzZWVcXG4zMDI3OlxcdFxcdCAqIHRoZWlyIG93bmVyOyBmbGNfcGlkIGhvbGRzIHRoZSBvd25lciB0Z2lkLCBzbyBmaWx0ZXIgb24gaXQuXFxuMzAyODpcXHRcXHQgKiBSZW1vdGUgbG9ja3Mga2VlcCBhIG5lZ2F0aXZlIGZsY19waWQgYW5kIHN0YXkgdmlzaWJsZSBhcyBiZWZvcmUuXFxuMzAyOTpcXHRcXHQgKi9cXG4zMDMwOlxcdFxcdGlmICgoY3VyLVxcdTAwM2VmbGNfZmxhZ3MgXFx1MDAyNiBGTF9PRkRMQ0spIFxcdTAwMjZcXHUwMDI2IGN1ci1cXHUwMDNlZmxjX3BpZCBcXHUwMDNlIDAgXFx1MDAyNlxcdTAwMjZcXG4zMDMxOlxcdFxcdCAgICBwcm9jX3BpZG5zICE9IFxcdTAwMjZpbml0X3BpZF9ucykge1xcbjMwMzI6XFx0XFx0XFx0c3RydWN0IHBpZCAqcGlkO1xcbjMwMzM6XFx0XFx0XFx0Ym9vbCB2aXNpYmxlID0gZmFsc2U7XFxuMzAzNDpcXHRcXG4zMDM1OlxcdFxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4zMDM2OlxcdFxcdFxcdHBpZCA9IGZpbmRfcGlkX25zKGN1ci1cXHUwMDNlZmxjX3BpZCwgXFx1MDAyNmluaXRfcGlkX25zKTtcXG4zMDM3OlxcdFxcdFxcdGlmIChwaWQpXFxuMzAzODpcXHRcXHRcXHRcXHR2aXNpYmxlID0gcGlkX25yX25zKHBpZCwgcHJvY19waWRucykgIT0gMDtcXG4zMDM5OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbjMwNDA6XFx0XFx0XFx0aWYgKCF2aXNpYmxlKVxcbjMwNDE6XFx0XFx0XFx0XFx0cmV0dXJuIDA7XFxuMzA0MjpcXHRcXHR9XFxuMzA0MzpcXHRcXG4zMDQ0OlxcdFxcdGlmIChsb2Nrc190cmFuc2xhdGVfcGlkKGN1ciwgcHJvY19waWRucykgPT0gMClcXG4zMDQ1OlxcdFxcdFxcdHJldHVybiAwO1xcbjMwNDY6XFx0XFxuMzA0NzpcXHRcXHQvKiBWaWV3IHRoaXMgY3Jvc3NlZCBsaW5rZWQgbGlzdCBhcyBhIGJpbmFyeSB0cmVlLCB0aGUgZmlyc3QgbWVtYmVyIG9mIGZsY19ibG9ja2VkX3JlcXVlc3RzXFxuMzA0ODpcXHRcXHQgKiBpcyB0aGUgbGVmdCBjaGlsZCBvZiBjdXJyZW50IG5vZGUsIHRoZSBuZXh0IHNpbGliaW5nIGluIGZsY19ibG9ja2VkX21lbWJlciBpcyB0aGVcXG4zMDQ5OlxcdFxcdCAqIHJpZ2h0IGNoaWxkLCB3ZSBjYW4gYWxzZSBnZXQgdGhlIHBhcmVudCBvZiBjdXJyZW50IG5vZGUgZnJvbSBmbGNfYmxvY2tlciwgc28gdGhpc1xcbjMwNTA6XFx0XFx0ICogcXVlc3Rpb24gYmVjb21lcyB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZVxcbjMwNTE6XFx0XFx0ICovXFxuMzA1MjpcXHRcXHR3aGlsZSAoY3VyICE9IE5VTEwpIHtcXG4zMDUzOlxcdFxcdFxcdGlmIChsZXZlbClcXG4zMDU0OlxcdFxcdFxcdFxcdGxvY2tfZ2V0X3N0YXR1cyhmLCBjdXIsIGl0ZXItXFx1MDAzZWxpX3BvcywgXFxcIi1cXHUwMDNlIFxcXCIsIGxldmVsKTtcXG4zMDU1OlxcdFxcdFxcdGVsc2VcXG4zMDU2OlxcdFxcdFxcdFxcdGxvY2tfZ2V0X3N0YXR1cyhmLCBjdXIsIGl0ZXItXFx1MDAzZWxpX3BvcywgXFxcIlxcXCIsIGxldmVsKTtcXG4zMDU3OlxcdFxcbjMwNTg6XFx0XFx0XFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZjdXItXFx1MDAzZWZsY19ibG9ja2VkX3JlcXVlc3RzKSkge1xcbjMwNTk6XFx0XFx0XFx0XFx0LyogVHVybiBsZWZ0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE3OjEyLjYzNTk0NjE4NloiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNDMxMDA3Nzk3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipJbnZlc3RpZ2F0aW5nIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBhbmQgYGZsY19waWRgIEluaXRpYWxpemF0aW9uL1VzYWdlKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgaW50ZXJhY3Rpb25zIGJldHdlZW4gYGxvY2tzX3RyYW5zbGF0ZV9waWRgIGFuZCB0aGUgYGZsY19waWRgIHZhcmlhYmxlcy4gSXQncyB0aW1lIHRvIHRyYWNlIHRoZSBjb250cm9sIGZsb3cgdG8gdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHRoZSBmb3JtZXIgb24gdGhlIGxhdHRlci4gSSB3YW50IHRvIHNlZSAqZXhhY3RseSogaG93IGBmbGNfcGlkYCBpcyBpbml0aWFsaXplZCwgd2hlcmUgaXQncyBtb2RpZmllZCwgYW5kIHVuZGVyIHdoYXQgY29uZGl0aW9ucy4gVGhlIGdvYWwgaXMgdG8gZnVsbHkgdW5kZXJzdGFuZCBob3cgdGhlc2UgdHdvIGNvbXBvbmVudHMgcmVsYXRlIGFuZCBpZiB0aGVyZSBhcmUgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGluY29ycmVjdCBzdGF0ZXMsIG9yIGluZWZmaWNpZW5jaWVzLiBJIG5lZWQgdG8gZW5zdXJlIHRoZXkgYWxpZ24sIHRoYXQgdGhlIFBJRCB0cmFuc2xhdGlvbiBpcyBoYXBwZW5pbmcgY29ycmVjdGx5IGluIHJlbGF0aW9uIHRvIHRoZSBGTEMuIEknbSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIHRoZSBsb2NrcyBwb3RlbnRpYWxseSBiZWluZyBhY3F1aXJlZCwgYW5kIGFueSBzaGFyZWQgcmVzb3VyY2VzIHRoYXQgY291bGQgYWZmZWN0IHRoZWlyIGludGVyYWN0aW9uLiBUaW1lIHRvIGRpZyBpbiBhbmQgY2xhcmlmeSBhbnkgbnVhbmNlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MzMzMywiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTc6MTYuMDY2OTU3MDIzWiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNTg2NTE2MDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibG9ja3NfdHJhbnNsYXRlX3BpZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9sb2Nrcy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2xvY2tzLmM9MjM2NT1FWFBPUlRfU1lNQk9MX0dQTCh2ZnNfdGVzdF9sb2NrKTtcXG4tLVxcbmZzL2xvY2tzLmMtMjM2Ny0vKipcXG5mcy9sb2Nrcy5jOjIzNjg6ICogbG9ja3NfdHJhbnNsYXRlX3BpZCAtIHRyYW5zbGF0ZSBhIGZpbGVfbG9jaydzIGZsX3BpZCBudW1iZXIgaW50byBhIG5hbWVzcGFjZVxcbmZzL2xvY2tzLmMtMjM2OS0gKiBAZmw6IFRoZSBmaWxlX2xvY2sgd2hvJ3MgZmxfcGlkIHNob3VsZCBiZSB0cmFuc2xhdGVkXFxuLS1cXG5mcy9sb2Nrcy5jLTIzNzMtICovXFxuZnMvbG9ja3MuYzoyMzc0OnN0YXRpYyBwaWRfdCBsb2Nrc190cmFuc2xhdGVfcGlkKHN0cnVjdCBmaWxlX2xvY2tfY29yZSAqZmwsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucylcXG5mcy9sb2Nrcy5jLTIzNzUte1xcbi0tXFxuZnMvbG9ja3MuYz0yNDAxPXN0YXRpYyBpbnQgcG9zaXhfbG9ja190b19mbG9jayhzdHJ1Y3QgZmxvY2sgKmZsb2NrLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbClcXG5mcy9sb2Nrcy5jLTI0MDIte1xcbmZzL2xvY2tzLmM6MjQwMzpcXHRmbG9jay1cXHUwMDNlbF9waWQgPSBsb2Nrc190cmFuc2xhdGVfcGlkKFxcdTAwMjZmbC1cXHUwMDNlYywgdGFza19hY3RpdmVfcGlkX25zKGN1cnJlbnQpKTtcXG5mcy9sb2Nrcy5jLTI0MDQtI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzJcXG4tLVxcbmZzL2xvY2tzLmM9MjQyMz1zdGF0aWMgdm9pZCBwb3NpeF9sb2NrX3RvX2Zsb2NrNjQoc3RydWN0IGZsb2NrNjQgKmZsb2NrLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbClcXG5mcy9sb2Nrcy5jLTI0MjQte1xcbmZzL2xvY2tzLmM6MjQyNTpcXHRmbG9jay1cXHUwMDNlbF9waWQgPSBsb2Nrc190cmFuc2xhdGVfcGlkKFxcdTAwMjZmbC1cXHUwMDNlYywgdGFza19hY3RpdmVfcGlkX25zKGN1cnJlbnQpKTtcXG5mcy9sb2Nrcy5jLTI0MjYtXFx0ZmxvY2stXFx1MDAzZWxfc3RhcnQgPSBmbC1cXHUwMDNlZmxfc3RhcnQ7XFxuLS1cXG5mcy9sb2Nrcy5jPTI5MjE9c3RhdGljIHZvaWQgbG9ja19nZXRfc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqZiwgc3RydWN0IGZpbGVfbG9ja19jb3JlICpmbGMsXFxuLS1cXG5mcy9sb2Nrcy5jLTI5MjktXFxuZnMvbG9ja3MuYzoyOTMwOlxcdHBpZCA9IGxvY2tzX3RyYW5zbGF0ZV9waWQoZmxjLCBwcm9jX3BpZG5zKTtcXG5mcy9sb2Nrcy5jLTI5MzEtXFxuLS1cXG5mcy9sb2Nrcy5jPTMwMTY9c3RhdGljIGludCBsb2Nrc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdilcXG4tLVxcbmZzL2xvY2tzLmMtMzA0My1cXG5mcy9sb2Nrcy5jOjMwNDQ6XFx0aWYgKGxvY2tzX3RyYW5zbGF0ZV9waWQoY3VyLCBwcm9jX3BpZG5zKSA9PSAwKVxcbmZzL2xvY2tzLmMtMzA0NS1cXHRcXHRyZXR1cm4gMDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTc6MTYuNDI1NjE0MjI4WiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI4MTgxNjc1MzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGBsb2Nrc190cmFuc2xhdGVfcGlkYCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBsb2Nrc190cmFuc2xhdGVfcGlkYCBkZWZpbml0aW9uLiBJdCdzIGNydWNpYWwsIG9idmlvdXNseSwgZ2l2ZW4gaXRzIG5hbWUsIHNvIEknbGwgbmVlZCB0byByZWFsbHkgdW5wYWNrIGl0cyBwdXJwb3NlIGFuZCBpbXBsZW1lbnRhdGlvbi4gV2hhdCBleGFjdGx5IGlzIGl0IGRvaW5nIHdpdGggUElEcz8gSG93IGRvZXMgaXQgZml0IGludG8gdGhlIGJyb2FkZXIgbG9ja2luZyBtZWNoYW5pc20gSSdtIGZhbWlsaWFyIHdpdGg/IEknbGwgcHJvYmFibHkgc3RhcnQgYnkgdHJhY2luZyB0aGUgZnVuY3Rpb24ncyBjYWxscyBhbmQgZGVwZW5kZW5jaWVzLCBzZWVpbmcgd2hhdCBvdGhlciBwYXJ0cyBvZiB0aGUgc3lzdGVtIGludGVyYWN0IHdpdGggaXQuIEZyb20gdGhlcmUsIEknbGwgbmVlZCB0byBzZWUgd2hldGhlciBpdCBtYWtlcyB1c2Ugb2Yga2VybmVsIHN0cnVjdHVyZXMgdGhhdCBhcmUgc3RhbmRhcmQsIG9yIHdoZXRoZXIgaXQgY29udGFpbnMgc29tZSBiZXNwb2tlIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgdW5pcXVlIHRvIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBvciBhcHBsaWNhdGlvbiB0aGlzIGNvZGUgaXMgZm9yLiBJJ20gZ29pbmcgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGF0YSB0eXBlcyBpdCdzIHdvcmtpbmcgd2l0aCBhbmQgaG93IHRoZXkgcmVsYXRlIHRvIHByb2Nlc3MgaWRlbnRpZmllcnMuIFVuZGVyc3RhbmRpbmcgaXRzIHJvbGUgaW4gdHJhbnNsYXRpbmcgb3IgbWFuaXB1bGF0aW5nIFBJRHMgaXMga2V5IHRvIGdyYXNwaW5nIHRoZSBvdmVyYWxsIGxvY2tpbmcgc3RyYXRlZ3kuIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjAzLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMDk6MTc6MTkuMjQzNzg1NTAxWiIsIlNlcSI6NDAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4NTY5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9sb2Nrcy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIzNjgsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIzNjg6XFx0ICogbG9ja3NfdHJhbnNsYXRlX3BpZCAtIHRyYW5zbGF0ZSBhIGZpbGVfbG9jaydzIGZsX3BpZCBudW1iZXIgaW50byBhIG5hbWVzcGFjZVxcbjIzNjk6XFx0ICogQGZsOiBUaGUgZmlsZV9sb2NrIHdobydzIGZsX3BpZCBzaG91bGQgYmUgdHJhbnNsYXRlZFxcbjIzNzA6XFx0ICogQG5zOiBUaGUgbmFtZXNwYWNlIGludG8gd2hpY2ggdGhlIHBpZCBzaG91bGQgYmUgdHJhbnNsYXRlZFxcbjIzNzE6XFx0ICpcXG4yMzcyOlxcdCAqIFVzZWQgdG8gdHJhbnNsYXRlIGEgZmxfcGlkIGludG8gYSBuYW1lc3BhY2UgdmlydHVhbCBwaWQgbnVtYmVyXFxuMjM3MzpcXHQgKi9cXG4yMzc0OlxcdHN0YXRpYyBwaWRfdCBsb2Nrc190cmFuc2xhdGVfcGlkKHN0cnVjdCBmaWxlX2xvY2tfY29yZSAqZmwsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucylcXG4yMzc1OlxcdHtcXG4yMzc2OlxcdFxcdHBpZF90IHZucjtcXG4yMzc3OlxcdFxcdHN0cnVjdCBwaWQgKnBpZDtcXG4yMzc4OlxcdFxcbjIzNzk6XFx0XFx0aWYgKGZsLVxcdTAwM2VmbGNfZmxhZ3MgXFx1MDAyNiBGTF9PRkRMQ0spXFxuMjM4MDpcXHRcXHRcXHRyZXR1cm4gLTE7XFxuMjM4MTpcXHRcXG4yMzgyOlxcdFxcdC8qIFJlbW90ZSBsb2NrcyByZXBvcnQgYSBuZWdhdGl2ZSBwaWQgdmFsdWUgKi9cXG4yMzgzOlxcdFxcdGlmIChmbC1cXHUwMDNlZmxjX3BpZCBcXHUwMDNjPSAwKVxcbjIzODQ6XFx0XFx0XFx0cmV0dXJuIGZsLVxcdTAwM2VmbGNfcGlkO1xcbjIzODU6XFx0XFxuMjM4NjpcXHRcXHQvKlxcbjIzODc6XFx0XFx0ICogSWYgdGhlIGZsb2NrIG93bmVyIHByb2Nlc3MgaXMgZGVhZCBhbmQgaXRzIHBpZCBoYXMgYmVlbiBhbHJlYWR5XFxuMjM4ODpcXHRcXHQgKiBmcmVlZCwgdGhlIHRyYW5zbGF0aW9uIGJlbG93IHdvbid0IHdvcmssIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIHNob3dcXG4yMzg5OlxcdFxcdCAqIGZsb2NrIG93bmVyIHBpZCBudW1iZXIgaW4gaW5pdCBwaWRucy5cXG4yMzkwOlxcdFxcdCAqL1xcbjIzOTE6XFx0XFx0aWYgKG5zID09IFxcdTAwMjZpbml0X3BpZF9ucylcXG4yMzkyOlxcdFxcdFxcdHJldHVybiAocGlkX3QpIGZsLVxcdTAwM2VmbGNfcGlkO1xcbjIzOTM6XFx0XFxuMjM5NDpcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuMjM5NTpcXHRcXHRwaWQgPSBmaW5kX3BpZF9ucyhmbC1cXHUwMDNlZmxjX3BpZCwgXFx1MDAyNmluaXRfcGlkX25zKTtcXG4yMzk2OlxcdFxcdHZuciA9IHBpZF9ucl9ucyhwaWQsIG5zKTtcXG4yMzk3OlxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbjIzOTg6XFx0XFx0cmV0dXJuIHZucjtcXG4yMzk5OlxcdH1cXG4yNDAwOlxcdFxcbjI0MDE6XFx0c3RhdGljIGludCBwb3NpeF9sb2NrX3RvX2Zsb2NrKHN0cnVjdCBmbG9jayAqZmxvY2ssIHN0cnVjdCBmaWxlX2xvY2sgKmZsKVxcbjI0MDI6XFx0e1xcbjI0MDM6XFx0XFx0ZmxvY2stXFx1MDAzZWxfcGlkID0gbG9ja3NfdHJhbnNsYXRlX3BpZChcXHUwMDI2ZmwtXFx1MDAzZWMsIHRhc2tfYWN0aXZlX3BpZF9ucyhjdXJyZW50KSk7XFxuMjQwNDpcXHQjaWYgQklUU19QRVJfTE9ORyA9PSAzMlxcbjI0MDU6XFx0XFx0LypcXG4yNDA2OlxcdFxcdCAqIE1ha2Ugc3VyZSB3ZSBjYW4gcmVwcmVzZW50IHRoZSBwb3NpeCBsb2NrIHZpYVxcbjI0MDc6XFx0XFx0ICogbGVnYWN5IDMyYml0IGZsb2NrLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QwOToxNzoxOS4yNDM5NzI3NjFaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjU1MjMyMjI1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGAvcHJvYy9sb2Nrc2AgUGF0Y2ggZm9yIEtNU0FOIE5lZWRzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJdCBsb29rcyBsaWtlIHdlJ3JlIGZpeGluZyBhIGJ1ZyByZWxhdGVkIHRvIGhvdyBPRkQgKE9wZW4gRmlsZSBEZXNjcmlwdG9yKSBsb2NrcyBhcmUgZGlzcGxheWVkIGluIGAvcHJvYy9sb2Nrc2AgYWNyb3NzIGRpZmZlcmVudCBQSUQgbmFtZXNwYWNlcy4gVGhlIGluaXRpYWwgaXNzdWUgaXMgdGhhdCBgbG9ja3NfdHJhbnNsYXRlX3BpZGAgcmV0dXJucyAtMSBmb3IgYEZMX09GRExDS2AgKHRoZSBmbGFnIGZvciBPRkQgbG9ja3MpLiBUaGlzIGxlYWRzIHRvIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBmaWx0ZXIgaW4gYGxvY2tzX3Nob3dgIHRvIGZpbHRlciBsb2NrcyBieSBQSUQgbmFtZXNwYWNlIGlzbid0IHdvcmtpbmcgY29ycmVjdGx5IGZvciBPRkQgbG9ja3MuIFNwZWNpZmljYWxseSwgaXQgd2FzIGRpc3BsYXlpbmcgT0ZEIGxvY2tzIGV2ZW4gaWYgdGhleSBkaWRuJ3QgYmVsb25nIHRvIHRoZSBjdXJyZW50IFBJRCBuYW1lc3BhY2UuXG5cblRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGNoZWNrIHdpdGhpbiBgbG9ja3Nfc2hvd2AuIE5vdywgaWYgaXQncyBhbiBPRkQgbG9jayAqYW5kKiBpdCdzIG5vdCBpbiB0aGUgaW5pdCBuYW1lc3BhY2UsIHdlIHBlcmZvcm0gYW4gZXhwbGljaXQgdmlzaWJpbGl0eSBjaGVjayB1c2luZyBgZmluZF9waWRfbnNgIGFuZCBgcGlkX25yX25zYC4gVGhpcyBlbnN1cmVzIHRoZSBsb2NrIGlzIG9ubHkgc2hvd24gaWYgdGhlIFBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGxvY2sgYWN0dWFsbHkgZXhpc3RzIGluIHRoZSBjdXJyZW50IFBJRCBuYW1lc3BhY2UuIFNlZW1zIHN0cmFpZ2h0Zm9yd2FyZCBlbm91Z2guXG5cbk5vdywgdGhlIGltcG9ydGFudCBwYXJ0OiBLTVNBTi4gV2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCAqcmVxdWlyZXMqIEtNU0FOIHRvIGNhdGNoIHBvdGVudGlhbCBpc3N1ZXMuIEZpcnN0LCBsZXQncyBhZGRyZXNzIHRoZSBzcGVjaWZpYyBLTVNBTiBjb25jZXJuczpcblxuMS4gICoqRG9lcyBpdCB0b3VjaCB1bmluaXRpYWxpemVkIG1lbW9yeSwgY3JlYXRlIG5ldyBhbGxvY2F0aW9ucywgb3IgY29weSB1bmluaXRpYWxpemVkIGRhdGEgdG8gdXNlcnNwYWNlPyoqIE5vLiBUaGUgcGF0Y2ggcmVhZHMgZXhpc3RpbmcgYHN0cnVjdCBmaWxlX2xvY2tfY29yZWAgZmllbGRzIChgZmxjX2ZsYWdzYCwgYGZsY19waWRgKS4gSXQgYWxsb2NhdGVzIG9ubHkgbG9jYWwgc3RhY2sgdmFyaWFibGVzIChgcGlkYCwgYHZpc2libGVgKSB3aGljaCBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEl0IGNhbGxzIHN0YW5kYXJkIGtlcm5lbCBmdW5jdGlvbnMgKGByY3VfcmVhZF9sb2NrYCwgYGZpbmRfcGlkX25zYCwgYHBpZF9ucl9uc2AsIGByY3VfcmVhZF91bmxvY2tgKS4gSXQgKmZpbHRlcnMqIGVudHJpZXMsIG1lYW5pbmcgaXQncyBvbmx5IG1vZGlmeWluZyB0aGUgb3V0cHV0IHN0cmVhbS4gVGhlcmUncyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkIG9yIGNvcHkgaW50byB1c2Vyc3BhY2UuXG5cbjIuICAqKkRvZXMgaXQgaW50cm9kdWNlIHJpc2tzIHRoYXQgYXJlIE9OTFkgY2F1Z2h0IGJ5IEtNU0FOPyoqIE5vLiBLTVNBTiBmb2N1c2VzIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2Vzcy4gVGhpcyBwYXRjaCBpcyBmdW5kYW1lbnRhbGx5IGFib3V0IFBJRCBuYW1lc3BhY2UgZmlsdGVyaW5nIGFuZCBsb2NrIGRpc3BsYXkgbG9naWMuIFRoZSBwb3RlbnRpYWwgaXNzdWVzIGhlcmUgYXJlIHJlbGF0ZWQgdG8gUkNVIHVzYWdlLCBwb2ludGVyIGRlcmVmZXJlbmNpbmcsIGFuZCBvdmVyYWxsIGNvcnJlY3RuZXNzLiBTdGFuZGFyZCB0b29scyBsaWtlIEtBU0FOIGFuZCBsb2NrZGVwLCBhbG9uZyB3aXRoIHVuaXQgdGVzdHMsIGFyZSBtb3JlIHRoYW4gc3VmZmljaWVudCB0byBjb3ZlciB0aGVzZSBraW5kcyBvZiByaXNrcy5cblxuVGhlIHJ1bGUgaXMgY2xlYXI6ICpJZiBhIGJ1ZyBjYW4gYmUgY2F1Z2h0IGJ5IEtBU0FOLCBMb2NrZGVwIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcnVuIEtNU0FOKi4gQSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBjb3N0bHkuXG5cblRoZXJlZm9yZSwgYE5lZWRzS01TQU5gIGlzIGRlZmluaXRlbHkgYGZhbHNlYC5cblxuKipLTVNBTlJlYXNvbmluZzoqKlxuXG5UaGUgcGF0Y2ggYWRkcyBhIFBJRCBuYW1lc3BhY2UgdmlzaWJpbGl0eSBjaGVjayBmb3IgT0ZEIGxvY2tzIGluIGBmcy9sb2Nrcy5jOmxvY2tzX3Nob3coKWAuIEl0IG9wZXJhdGVzIG9uIGV4aXN0aW5nIGZpbGUgbG9jayBzdHJ1Y3R1cmVzIChgc3RydWN0IGZpbGVfbG9ja19jb3JlYCkgYW5kIHVzZXMgc3RhY2stYWxsb2NhdGVkIHNjYWxhciB2YXJpYWJsZXMgKGBwaWRgLCBgdmlzaWJsZWApIHRoYXQgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLiBObyBuZXcgYnVmZmVycywgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBvciBrZXJuZWwtdG8tdXNlciBpbmZvIGxlYWtzIGFyZSBpbnRyb2R1Y2VkIG9yIGV4cG9zZWQuIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHRoYXQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIEl0J3MgYSBjbGVhbiBmaXggd2l0aCBzdGFuZGFyZCBtZW1vcnkgc2FmZXR5IGNvbnNpZGVyYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MTI0LCJPdXRwdXRUb2tlbnMiOjE1MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgwOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDA5OjE3OjI1Ljc5NjI5NzUzOVoiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4MTcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBgbG9ja3Nfc2hvdygpYCBpbiBgZnMvbG9ja3MuY2AgdG8gcHJvcGVybHkgZmlsdGVyIG9wZW4gZmlsZSBkZXNjcmlwdG9yIChPRkQpIGxvY2tzIGluIG5vbi1pbml0IFBJRCBuYW1lc3BhY2VzLiBUaGUgY2hhbmdlcyBvbmx5IGludHJvZHVjZSBzY2FsYXIgc3RhY2sgdmFyaWFibGVzIChgdmlzaWJsZWAgaW5pdGlhbGl6ZWQgdG8gYGZhbHNlYCwgYHBpZGAgcG9pbnRlciBhc3NpZ25lZCBmcm9tIGBmaW5kX3BpZF9ucygpYCkgYW5kIHBlcmZvcm0gbmFtZXNwYWNlIHRyYW5zbGF0aW9uIGNoZWNrcyB1bmRlciBSQ1UuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHJlYWQsIGFsbG9jYXRlZCwgb3IgY29waWVkIHRvIHVzZXJzcGFjZSwgYW5kIG5vIHBhZGRpbmcgb3Igc3RydWN0IGZpZWxkcyBhcmUgbGVmdCB1bmluaXRpYWxpemVkLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgYGxvY2tzX3Nob3coKWAgaW4gYGZzL2xvY2tzLmNgIHRvIHByb3Blcmx5IGZpbHRlciBvcGVuIGZpbGUgZGVzY3JpcHRvciAoT0ZEKSBsb2NrcyBpbiBub24taW5pdCBQSUQgbmFtZXNwYWNlcy4gVGhlIGNoYW5nZXMgb25seSBpbnRyb2R1Y2Ugc2NhbGFyIHN0YWNrIHZhcmlhYmxlcyAoYHZpc2libGVgIGluaXRpYWxpemVkIHRvIGBmYWxzZWAsIGBwaWRgIHBvaW50ZXIgYXNzaWduZWQgZnJvbSBgZmluZF9waWRfbnMoKWApIGFuZCBwZXJmb3JtIG5hbWVzcGFjZSB0cmFuc2xhdGlvbiBjaGVja3MgdW5kZXIgUkNVLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkLCBhbGxvY2F0ZWQsIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBwYWRkaW5nIG9yIHN0cnVjdCBmaWVsZHMgYXJlIGxlZnQgdW5pbml0aWFsaXplZC4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowsgngr[1] Phase: Succeeded StartedAt: 2026-09-03 09:17:58 +0000 UTC FinishedAt: 2026-09-03 09:17:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-03 09:17:58 +0000 UTC FinishedAt: 2026-09-03 09:17:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2] Phase: Succeeded StartedAt: 2026-09-03 09:17:58 +0000 UTC FinishedAt: 2026-09-03 12:58:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-03 09:17:58 +0000 UTC FinishedAt: 2026-09-03 12:58:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-03 09:17:58 +0000 UTC FinishedAt: 2026-09-03 09:18:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-03 09:17:58 +0000 UTC FinishedAt: 2026-09-03 09:18:05 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.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-workflowsgngr/series-workflowsgngr-convert-artifact-1412063809/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-03 09:18:08 +0000 UTC FinishedAt: 2026-09-03 09:36:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-03 09:18:08 +0000 UTC FinishedAt: 2026-09-03 09:36:33 +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:*1d4d5643-6d26-446d-8104-e9a07bba497c,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-workflowsgngr/series-workflowsgngr-convert-artifact-1412063809/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": "0903b748-04cf-4db7-8a17-f4b9f29b9eec", "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-workflowsgngr/series-workflowsgngr-build-action-238520431/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-03 09:18:08 +0000 UTC FinishedAt: 2026-09-03 09:36:23 +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:*1d4d5643-6d26-446d-8104-e9a07bba497c,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-workflowsgngr/series-workflowsgngr-convert-artifact-1412063809/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": "0903b748-04cf-4db7-8a17-f4b9f29b9eec", "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-workflowsgngr/series-workflowsgngr-build-action-238520431/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-03 09:36:33 +0000 UTC FinishedAt: 2026-09-03 09:36:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-03 09:36:33 +0000 UTC FinishedAt: 2026-09-03 09:36:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-03 09:36:33 +0000 UTC FinishedAt: 2026-09-03 09:36:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-03 09:36:33 +0000 UTC FinishedAt: 2026-09-03 09:36:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.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-workflowsgngr/series-workflowsgngr-convert-artifact-1412918804/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-03 09:36:43 +0000 UTC FinishedAt: 2026-09-03 09:38:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-03 09:36:43 +0000 UTC FinishedAt: 2026-09-03 09:38:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*0903b748-04cf-4db7-8a17-f4b9f29b9eec,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-workflowsgngr/series-workflowsgngr-build-action-238520431/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-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-03 09:38:37 +0000 UTC FinishedAt: 2026-09-03 09:38:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-03 09:38:37 +0000 UTC FinishedAt: 2026-09-03 09:38:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-03 09:38:37 +0000 UTC FinishedAt: 2026-09-03 09:55:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-03 09:38:37 +0000 UTC FinishedAt: 2026-09-03 09:55:21 +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:*1d4d5643-6d26-446d-8104-e9a07bba497c,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-workflowsgngr/series-workflowsgngr-convert-artifact-1412918804/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": "9d5d7513-296a-4381-ac7d-a59b52a27b2b", "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-workflowsgngr/series-workflowsgngr-build-action-3380598496/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-03 09:38:37 +0000 UTC FinishedAt: 2026-09-03 09:55:11 +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:*1d4d5643-6d26-446d-8104-e9a07bba497c,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-workflowsgngr/series-workflowsgngr-convert-artifact-1412918804/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": "9d5d7513-296a-4381-ac7d-a59b52a27b2b", "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-workflowsgngr/series-workflowsgngr-build-action-3380598496/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-03 09:55:21 +0000 UTC FinishedAt: 2026-09-03 09:55:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-03 09:55:21 +0000 UTC FinishedAt: 2026-09-03 09:55:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-03 09:55:21 +0000 UTC FinishedAt: 2026-09-03 09:57:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-03 09:55:21 +0000 UTC FinishedAt: 2026-09-03 09:57:12 +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:*9d5d7513-296a-4381-ac7d-a59b52a27b2b,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-workflowsgngr/series-workflowsgngr-build-action-3380598496/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-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-03 09:57:22 +0000 UTC FinishedAt: 2026-09-03 12:58:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-03 09:57:22 +0000 UTC FinishedAt: 2026-09-03 12:58:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},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:*0903b748-04cf-4db7-8a17-f4b9f29b9eec,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9d5d7513-296a-4381-ac7d-a59b52a27b2b,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-workflowsgngr/series-workflowsgngr-build-action-238520431/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-workflowsgngr/series-workflowsgngr-build-action-3380598496/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-03 09:57:22 +0000 UTC FinishedAt: 2026-09-03 09:57:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-03 09:57:22 +0000 UTC FinishedAt: 2026-09-03 09:57:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},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-workflowsgngr/series-workflowsgngr-convert-artifact-2851495997/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-03 09:57:22 +0000 UTC FinishedAt: 2026-09-03 09:57:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-03 09:57:22 +0000 UTC FinishedAt: 2026-09-03 09:57:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-03 09:57:22 +0000 UTC FinishedAt: 2026-09-03 09:57:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-03 09:57:32 +0000 UTC FinishedAt: 2026-09-03 12:58:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowsgngr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["locks_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["FILE_LOCKING","PROC_FS","PID_NS"],"series_id":"04cc005e-55c6-4c17-a6a7-199323764e97","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-03 09:57:32 +0000 UTC FinishedAt: 2026-09-03 12:58:45 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*0903b748-04cf-4db7-8a17-f4b9f29b9eec,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9d5d7513-296a-4381-ac7d-a59b52a27b2b,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-workflowsgngr/series-workflowsgngr-build-action-238520431/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-workflowsgngr/series-workflowsgngr-build-action-3380598496/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-workflowsgngr/series-workflowsgngr-convert-artifact-2851495997/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,}