Name: series-workflowgb424 Phase: Succeeded StartedAt: 2026-09-15 12:19:57 +0000 UTC FinishedAt: 2026-09-15 16:06:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[0] Phase: Succeeded StartedAt: 2026-09-15 12:19:57 +0000 UTC FinishedAt: 2026-09-15 12:26:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[0].run-triage Phase: Succeeded StartedAt: 2026-09-15 12:19:57 +0000 UTC FinishedAt: 2026-09-15 12:26:02 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "b08a65b93426d86e3f354d655d6225397b591877", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "GUP_TEST", "DEBUG_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "b08a65b93426d86e3f354d655d6225397b591877", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "GUP_TEST", "DEBUG_FS" ], "series_id": "b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "__gup_test_ioctl", "gup_test_ioctl" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "", "base_commit": "b08a65b93426d86e3f354d655d6225397b591877", "base_tree": "mm-new" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0dVUF9URVNUJiMzNDssCiAgICAmIzM0O0RFQlVHX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19ndXBfdGVzdF9pb2N0bCYjMzQ7LAogICAgJiMzNDtndXBfdGVzdF9pb2N0bCYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1tL2d1cF90ZXN0LmMgdG8gYWRkIGlucHV0IHBhcmFtZXRlciB2YWxpZGF0aW9uIChjaGVja2luZyB0aGF0IGd1cC1cdTAwM2VzaXplIGlzIG5vbi16ZXJvIGFuZCBQQUdFX0FMSUdORUQsIGFuZCB0aGF0IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcblxuVGhlIGlzc3VlcyBhZGRyZXNzZWQgYnkgdGhpcyBwYXRjaCBhcmUgaW5maW5pdGUgbG9vcHMgKHdoZW4gbnJfcGFnZXNfcGVyX2NhbGwgaXMgMCkgYW5kIG91dC1vZi1ib3VuZHMgYnVmZmVyIGluZGV4aW5nIG9uIHRoZSBgcGFnZXNgIGFycmF5ICh3aGVuIGd1cC1cdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXG5cbkFsbCBidWZmZXJzIGludm9sdmVkICh0aGUgc3RhY2stYWxsb2NhdGVkIHN0cnVjdCBndXBfdGVzdCBhbmQgdGhlIGhlYXAtYWxsb2NhdGVkIHBhZ2VzIGFycmF5KSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGNvcHlfZnJvbV91c2VyKCkgYW5kIGt2Y2FsbG9jKCkuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgc3RydWN0IHBhZGRpbmcgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGlzIGNoYW5nZS4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgaW5wdXQgdmFsaWRhdGlvbiBjaGVja3MgYW5kIGl0ZXJhdGlvbiBsb2dpYyBmb3IgcGFnZSBwaW5uaW5nIGFuZCBnZXRfdXNlcl9wYWdlcyBsb29wcyBpbiBfX2d1cF90ZXN0X2lvY3RsKCkgKG1tL2d1cF90ZXN0LmMpLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgYm91bmRhcnkgY29uZGl0aW9uIGhhbmRsaW5nIGFuZCBwb3RlbnRpYWwgcmVncmVzc2lvbnMgaW4gcGFnZSByYW5nZSBoYW5kbGluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDRiYjVmZDI0M2NjZDZlZDUwNmIzZDNmYzY5MzkyZTk3YWY3MTFlM2JcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIFNlcCAxNSAxMjoyMTozOSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xuaW5kZXggMTg1YmEzYmI4ZWQxMC4uYmE3NGJmM2Y0MTA0OCAxMDA2NDRcbi0tLSBhL21tL2d1cF90ZXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2d1cF90ZXN0LmNcbkBAIC0xMTYsNyAmIzQzOzExNiw4IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIFx0Ym9vbCBuZWVkc19tbWFwX2xvY2sgPVxuIFx0XHRjbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLIFx1MDAyNlx1MDAyNiBjbWQgIT0gUElOX0ZBU1RfQkVOQ0hNQVJLO1xuIFxuLVx0aWYgKGd1cC1cdTAwM2VhZGRyIFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVx1MDAzZXNpemUgXHUwMDNlIFVMT05HX01BWClcbiYjNDM7XHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYIHx8ICFndXAtXHUwMDNlc2l6ZSB8fFxuJiM0MztcdCAgICAhZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsIHx8ICFQQUdFX0FMSUdORUQoZ3VwLVx1MDAzZXNpemUpKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG4gXHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxuQEAgLTEzOSwxMSAmIzQzOzE0MCw5IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRpZiAobnIgIT0gZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxuIFx0XHRcdGJyZWFrO1xuIFxuJiM0MztcdFx0bnIgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBuciwgKGVuZCAtIGFkZHIpIC8gUEFHRV9TSVpFKTtcbiYjNDM7XG4gXHRcdG5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFO1xuLVx0XHRpZiAobmV4dCBcdTAwM2UgZW5kKSB7XG4tXHRcdFx0bmV4dCA9IGVuZDtcbi1cdFx0XHRuciA9IChuZXh0IC0gYWRkcikgLyBQQUdFX1NJWkU7XG4tXHRcdH1cbiBcbiBcdFx0c3dpdGNoIChjbWQpIHtcbiBcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7R1VQX1RFU1QmIzM0OywKICAgICYjMzQ7REVCVUdfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX2d1cF90ZXN0X2lvY3RsJiMzNDssCiAgICAmIzM0O2d1cF90ZXN0X2lvY3RsJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGlucHV0IHZhbGlkYXRpb24gY2hlY2tzIGFuZCBpdGVyYXRpb24gbG9naWMgZm9yIHBhZ2UgcGlubmluZyBhbmQgZ2V0X3VzZXJfcGFnZXMgbG9vcHMgaW4gX19ndXBfdGVzdF9pb2N0bCgpIChtbS9ndXBfdGVzdC5jKS4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW9jdGxzIG9uIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIGJvdW5kYXJ5IGNvbmRpdGlvbiBoYW5kbGluZyBhbmQgcG90ZW50aWFsIHJlZ3Jlc3Npb25zIGluIHBhZ2UgcmFuZ2UgaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA0YmI1ZmQyNDNjY2Q2ZWQ1MDZiM2QzZmM2OTM5MmU5N2FmNzExZTNiCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBTZXAgMTUgMTI6MjE6MzkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuYwppbmRleCAxODViYTNiYjhlZDEwLi5iYTc0YmYzZjQxMDQ4IDEwMDY0NAotLS0gYS9tbS9ndXBfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2d1cF90ZXN0LmMKQEAgLTExNiw3ICYjNDM7MTE2LDggQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsCiAJYm9vbCBuZWVkc19tbWFwX2xvY2sgPQogCQljbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLICZhbXA7JmFtcDsgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSzsKIAotCWlmIChndXAtJmd0O2FkZHIgJmd0OyBVTE9OR19NQVggfHwgZ3VwLSZndDtzaXplICZndDsgVUxPTkdfTUFYKQomIzQzOwlpZiAoZ3VwLSZndDthZGRyICZndDsgVUxPTkdfTUFYIHx8IGd1cC0mZ3Q7c2l6ZSAmZ3Q7IFVMT05HX01BWCB8fCAhZ3VwLSZndDtzaXplIHx8CiYjNDM7CSAgICAhZ3VwLSZndDtucl9wYWdlc19wZXJfY2FsbCB8fCAhUEFHRV9BTElHTkVEKGd1cC0mZ3Q7c2l6ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLSZndDthZGRyLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC0mZ3Q7c2l6ZSwgJmFtcDtlbmQpKQpAQCAtMTM5LDExICYjNDM7MTQwLDkgQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsCiAJCWlmIChuciAhPSBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsKQogCQkJYnJlYWs7CiAKJiM0MzsJCW5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7CiYjNDM7CiAJCW5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFOwotCQlpZiAobmV4dCAmZ3Q7IGVuZCkgewotCQkJbmV4dCA9IGVuZDsKLQkJCW5yID0gKG5leHQgLSBhZGRyKSAvIFBBR0VfU0laRTsKLQkJfQogCiAJCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDg0CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBLZXJuZWwgUGF0Y2g6IG1tL2d1cF90ZXN0LmMqKgoKQWxyaWdodCwgSSBzZWUgd2hhdCYjMzk7cyBiZWluZyBhc2tlZCBoZXJlLiBXZSYjMzk7cmUgbG9va2luZyBhdCBldmFsdWF0aW5nIGEga2VybmVsIHBhdGNoLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBhbWQ2NCBhcmNoaXRlY3R1cmUuIE15IGZpcnN0IHN0ZXAgaXMgdG8gZGl2ZSByaWdodCBpbiB3aXRoIHRoZSBlc3RhYmxpc2hlZCB0b29saW5nIOKAkyBsZXQmIzM5O3MgZ2V0IHRoZSBjb21taXQgZGV0YWlscyBhbmQgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuIEl0IHNlZW1zIHRoZSBmaWxlIG9mIGludGVyZXN0IGlzIGBtbS9ndXBfdGVzdC5jYC4gR2l2ZW4gdGhlIHRhc2ssIGFuZCB0aGUgZm9jdXMgb24ga2VybmVsIG1lbW9yeSBtYW5hZ2VtZW50LCBJJiMzOTtsbCBiZSBob25pbmcgaW4gb24gdGhlIGNvZGUgYXJvdW5kIGxpbmUgMTE2LiBUaGF0IGFyZWEgd2lsbCBwcm92aWRlIGEgc29saWQgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGludGVudCBhbmQgdGhlIHBvdGVudGlhbCBpbXBhY3Qgb2YgdGhlIHByb3Bvc2VkIGNoYW5nZXMgd2l0aGluIHRoZSBgZ3VwX3Rlc3QuY2AgbW9kdWxlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIHBhdGNoIHdpdGhpbiBpdHMgYnJvYWRlciBjb250ZXh0IHRvIHByb3Blcmx5IGV2YWx1YXRlIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vZ3VwX3Rlc3QuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTAwOlx0XHRcdFx0XHRpbmRleF90b19kdW1wLCBndXAtXHUwMDNlYWRkcik7XG4gMTAxOlx0XHRcdFx0ZHVtcF9wYWdlKHBhZ2VzW2luZGV4X3RvX2R1bXBdLFxuIDEwMjpcdFx0XHRcdFx0ICBcJiMzNDtndXBfdGVzdDogZHVtcF9wYWdlcygpIHRlc3RcJiMzNDspO1xuIDEwMzpcdFx0XHR9XG4gMTA0Olx0XHR9XG4gMTA1Olx0fVxuIDEwNjpcdFxuIDEwNzpcdHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIDEwODpcdFx0XHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcbiAxMDk6XHR7XG4gMTEwOlx0XHRrdGltZV90IHN0YXJ0X3RpbWUsIGVuZF90aW1lO1xuIDExMTpcdFx0dW5zaWduZWQgbG9uZyBpLCBucl9wYWdlcywgYWRkciwgbmV4dDtcbiAxMTI6XHRcdGxvbmcgbnI7XG4gMTEzOlx0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xuIDExNDpcdFx0dW5zaWduZWQgbG9uZyBlbmQ7XG4gMTE1Olx0XHRpbnQgcmV0ID0gMDtcbiAxMTY6XHRcdGJvb2wgbmVlZHNfbW1hcF9sb2NrID1cbiAxMTc6XHRcdFx0Y21kICE9IEdVUF9GQVNUX0JFTkNITUFSSyBcdTAwMjZcdTAwMjYgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSztcbiAxMTg6XHRcbiAxMTk6XHRcdGlmIChndXAtXHUwMDNlYWRkciBcdTAwM2UgVUxPTkdfTUFYIHx8IGd1cC1cdTAwM2VzaXplIFx1MDAzZSBVTE9OR19NQVggfHwgIWd1cC1cdTAwM2VzaXplIHx8XG4gMTIwOlx0XHQgICAgIWd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbCB8fCAhUEFHRV9BTElHTkVEKGd1cC1cdTAwM2VzaXplKSlcbiAxMjE6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMTIyOlx0XHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KCh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VhZGRyLFxuIDEyMzpcdFx0XHRcdCAgICAgICAodW5zaWduZWQgbG9uZylndXAtXHUwMDNlc2l6ZSwgXHUwMDI2ZW5kKSlcbiAxMjQ6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMTI1Olx0XG4gMTI2Olx0XHRucl9wYWdlcyA9IGd1cC1cdTAwM2VzaXplIC8gUEFHRV9TSVpFO1xuIDEyNzpcdFx0cGFnZXMgPSBrdmNhbGxvYyhucl9wYWdlcywgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpO1xuIDEyODpcdFx0aWYgKCFwYWdlcylcbiAxMjk6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMTMwOlx0XG4gMTMxOlx0XHRpZiAobmVlZHNfbW1hcF9sb2NrIFx1MDAyNlx1MDAyNiBtbWFwX3JlYWRfbG9ja19raWxsYWJsZShjdXJyZW50LVx1MDAzZW1tKSkge1xuIDEzMjpcdFx0XHRyZXQgPSAtRUlOVFI7XG4gMTMzOlx0XHRcdGdvdG8gZnJlZV9wYWdlcztcbiAxMzQ6XHRcdH1cbiAxMzU6XHRcbiAxMzY6XHRcdGkgPSAwO1xuIDEzNzpcdFx0bnIgPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGw7XG4gMTM4Olx0XHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XG4gMTM5Olx0XHRmb3IgKGFkZHIgPSBndXAtXHUwMDNlYWRkcjsgYWRkciBcdTAwM2MgZW5kOyBhZGRyID0gbmV4dCkge1xuIDE0MDpcdFx0XHRpZiAobnIgIT0gZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxuIDE0MTpcdFx0XHRcdGJyZWFrO1xuIDE0MjpcdFxuIDE0MzpcdFx0XHRuciA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG5yLCAoZW5kIC0gYWRkcikgLyBQQUdFX1NJWkUpO1xuIDE0NDpcdFxuIDE0NTpcdFx0XHRuZXh0ID0gYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRTtcbiAxNDY6XHRcbiAxNDc6XHRcdFx0c3dpdGNoIChjbWQpIHtcbiAxNDg6XHRcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4gMTQ5Olx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1MDpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTE6XHRcdFx0XHRicmVhaztcbiAxNTI6XHRcdFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcbiAxNTM6XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNTQ6XHRcdFx0XHRicmVhaztcbiAxNTU6XHRcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMTU2Olx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1NzpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTg6XHRcdFx0XHRicmVhaztcbiAxNTk6XHRcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAxNjA6XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNjE6XHRcdFx0XHRicmVhaztcbiAxNjI6XHRcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxuIDE2MzpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXG4gMTY0Olx0XHRcdFx0XHRcdCAgICBndXAtXHUwMDNlZ3VwX2ZsYWdzIHwgRk9MTF9MT05HVEVSTSxcbiAxNjU6XHRcdFx0XHRcdFx0ICAgIHBhZ2VzICYjNDM7IGkpO1xuIDE2NjpcdFx0XHRcdGJyZWFrO1xuIDE2NzpcdFx0XHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxuIDE2ODpcdFx0XHRcdGlmIChndXAtXHUwMDNldGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXG4gMTY5Olx0XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3MDpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzE6XHRcdFx0XHRlbHNlXG4gMTcyOlx0XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3MzpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzQ6XHRcdFx0XHRicmVhaztcbiAxNzU6XHRcdFx0ZGVmYXVsdDpcbiAxNzY6XHRcdFx0XHRyZXQgPSAtRUlOVkFMO1xuIDE3NzpcdFx0XHRcdGdvdG8gdW5sb2NrO1xuIDE3ODpcdFx0XHR9XG4gMTc5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDYxNAoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gZ3VwX3Rlc3QqKgoKT2theSwgc28gYGd1cF90ZXN0YC4uLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoaXMuIEZpcnN0LCBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IHdoYXQgdGhpcyB0aGluZyAqaXMqLiBXaGF0JiMzOTtzIGl0cyBwdXJwb3NlPyBIb3cgaXMgaXQgaW1wbGVtZW50ZWQ/IEkmIzM5O2xsIHByb2JhYmx5IHN0YXJ0IHdpdGggdGhlIHNvdXJjZSBjb2RlLCBidXQgSSBhbHNvIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcHVibGljIGludGVyZmFjZS4gV2hlcmUmIzM5O3MgaXQgZXhwb3NlZCB0byBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsPyBXaGF0IGZ1bmN0aW9ucyBvciBzdHJ1Y3R1cmVzIGFyZSBhdmFpbGFibGUgZm9yIG90aGVyIG1vZHVsZXMgb3Igc3Vic3lzdGVtcyB0byBpbnRlcmFjdCB3aXRoPwoKVGhlbiwgdGhlIGtleSBpcyBnb2luZyB0byBiZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zLiBXaGF0IEtjb25maWcgc3ltYm9scyBjb250cm9sIHRoZSBpbmNsdXNpb24gb3IgYmVoYXZpb3Igb2YgYGd1cF90ZXN0YD8gSXMgaXQgbW9kdWxhciwgb3IgYnVpbHQtaW4/IEFyZSB0aGVyZSBhbnkgZGVwZW5kZW5jaWVzIHRoYXQgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgdGhhdCBlbmFibGUgY2VydGFpbiB0ZXN0IGNhc2VzIG9yIGZ1bmN0aW9uYWxpdGllcz8gVW5kZXJzdGFuZGluZyB0aGUgS2NvbmZpZyBvcHRpb25zIHdpbGwgYmUgY3J1Y2lhbCBmb3IgcmVwcm9kdWNpbmcgYW5kIGFuYWx5emluZyBpdCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLiBJIG5lZWQgdG8ga25vdyBob3cgdG8gZW5hYmxlIG9yIGRpc2FibGUgaXQsIGFuZCB3aGF0IHRoZSBkZXBlbmRlbmNpZXMgYXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2d1cF90ZXN0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9MTI5Mz1jb25maWcgR1VQX1RFU1Rcbi0tXG5tbS9LY29uZmlnLTEyOTYtXHRoZWxwXG5tbS9LY29uZmlnOjEyOTc6XHQgIFByb3ZpZGVzIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0LCB3aGljaCBpbiB0dXJuIHByb3ZpZGVzIGEgd2F5XG5tbS9LY29uZmlnLTEyOTgtXHQgIHRvIG1ha2UgaW9jdGwgY2FsbHMgdGhhdCBjYW4gbGF1bmNoIGtlcm5lbC1iYXNlZCB1bml0IHRlc3RzIGZvclxuLS1cbm1tL0tjb25maWctMTMxMC1cbm1tL0tjb25maWc6MTMxMTpcdCAgU2VlIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmNcbm1tL0tjb25maWctMTMxMi1cbi0tXG5tbS9NYWtlZmlsZT0xMTA9b2JqLSQoQ09ORklHX0NHUk9VUF9IVUdFVExCKSAmIzQzOz0gaHVnZXRsYl9jZ3JvdXAub1xubW0vTWFrZWZpbGU6MTExOm9iai0kKENPTkZJR19HVVBfVEVTVCkgJiM0Mzs9IGd1cF90ZXN0Lm9cbm1tL01ha2VmaWxlLTExMi1vYmotJChDT05GSUdfRE1BUE9PTF9URVNUKSAmIzQzOz0gZG1hcG9vbF90ZXN0Lm9cbi0tXG5tbS9ndXBfdGVzdC5jLTgtI2luY2x1ZGUgXHUwMDNjbGludXgvaGlnaG1lbS5oXHUwMDNlXG5tbS9ndXBfdGVzdC5jOjk6I2luY2x1ZGUgXCYjMzQ7Z3VwX3Rlc3QuaFwmIzM0O1xubW0vZ3VwX3Rlc3QuYy0xMC1cbm1tL2d1cF90ZXN0LmM6MTE6c3RydWN0IGd1cF90ZXN0X2RhdGEge1xubW0vZ3VwX3Rlc3QuYy0xMi1cdHN0cnVjdCBtdXRleCBsb25ndGVybV9tdXRleDtcbi0tXG5tbS9ndXBfdGVzdC5jPTE3PXN0YXRpYyB2b2lkIHB1dF9iYWNrX3BhZ2VzKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG5tbS9ndXBfdGVzdC5jOjE4Olx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIHVuc2lnbmVkIGludCBndXBfdGVzdF9mbGFncylcbm1tL2d1cF90ZXN0LmMtMTkte1xuLS1cbm1tL2d1cF90ZXN0LmMtMzQtXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxubW0vZ3VwX3Rlc3QuYzozNTpcdFx0aWYgKGd1cF90ZXN0X2ZsYWdzIFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTikge1xubW0vZ3VwX3Rlc3QuYy0zNi1cdFx0XHR1bnBpbl91c2VyX3BhZ2VzKHBhZ2VzLCBucl9wYWdlcyk7XG4tLVxubW0vZ3VwX3Rlc3QuYz00Nj1zdGF0aWMgdm9pZCB2ZXJpZnlfZG1hX3Bpbm5lZCh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuLS1cbm1tL2d1cF90ZXN0LmMtNjEtXG5tbS9ndXBfdGVzdC5jOjYyOlx0XHRcdFx0ZHVtcF9wYWdlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIFwmIzM0O2d1cF90ZXN0IGZhaWx1cmVcJiMzNDspO1xubW0vZ3VwX3Rlc3QuYy02My1cdFx0XHRcdGJyZWFrO1xuLS1cbm1tL2d1cF90ZXN0LmMtNjctXHRcdFx0XHQgICAgIGkpKSB7XG5tbS9ndXBfdGVzdC5jOjY4Olx0XHRcdFx0ZHVtcF9wYWdlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIFwmIzM0O2d1cF90ZXN0IGZhaWx1cmVcJiMzNDspO1xubW0vZ3VwX3Rlc3QuYy02OS1cdFx0XHRcdGJyZWFrO1xuLS1cbm1tL2d1cF90ZXN0LmMtNzUtXG5tbS9ndXBfdGVzdC5jOjc2OnN0YXRpYyB2b2lkIGR1bXBfcGFnZXNfdGVzdChzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcbm1tL2d1cF90ZXN0LmMtNzctXHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4tLVxubW0vZ3VwX3Rlc3QuYy0xMDEtXHRcdFx0ZHVtcF9wYWdlKHBhZ2VzW2luZGV4X3RvX2R1bXBdLFxubW0vZ3VwX3Rlc3QuYzoxMDI6XHRcdFx0XHQgIFwmIzM0O2d1cF90ZXN0OiBkdW1wX3BhZ2VzKCkgdGVzdFwmIzM0Oyk7XG5tbS9ndXBfdGVzdC5jLTEwMy1cdFx0fVxuLS1cbm1tL2d1cF90ZXN0LmMtMTA2LVxubW0vZ3VwX3Rlc3QuYzoxMDc6c3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXG5tbS9ndXBfdGVzdC5jOjEwODpcdFx0c3RydWN0IGd1cF90ZXN0ICpndXApXG5tbS9ndXBfdGVzdC5jLTEwOS17XG4tLVxubW0vZ3VwX3Rlc3QuYy0yMTUtXG5tbS9ndXBfdGVzdC5jOjIxNjpzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcbm1tL2d1cF90ZXN0LmMtMjE3LXtcbi0tXG5tbS9ndXBfdGVzdC5jLTIyNy1cbm1tL2d1cF90ZXN0LmM6MjI4OnN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhLFxubW0vZ3VwX3Rlc3QuYy0yMjktXHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuLS1cbm1tL2d1cF90ZXN0LmMtMjk0LVxubW0vZ3VwX3Rlc3QuYzoyOTU6c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcbm1tL2d1cF90ZXN0LmMtMjk2LVx0XHR1bnNpZ25lZCBsb25nIGFyZylcbi0tXG5tbS9ndXBfdGVzdC5jPTMyMT1zdGF0aWMgbG9uZyBwaW5fbG9uZ3Rlcm1fdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4tLVxubW0vZ3VwX3Rlc3QuYy0zMjMte1xubW0vZ3VwX3Rlc3QuYzozMjQ6XHRzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSA9IGZpbGVwLVx1MDAzZXByaXZhdGVfZGF0YTtcbm1tL2d1cF90ZXN0LmMtMzI1LVx0aW50IHJldCA9IC1FSU5WQUw7XG4tLVxubW0vZ3VwX3Rlc3QuYy0zNDYtXG5tbS9ndXBfdGVzdC5jOjM0NzpzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG5tbS9ndXBfdGVzdC5jLTM0OC1cdFx0dW5zaWduZWQgbG9uZyBhcmcpXG5tbS9ndXBfdGVzdC5jLTM0OS17XG5tbS9ndXBfdGVzdC5jOjM1MDpcdHN0cnVjdCBndXBfdGVzdCBndXA7XG5tbS9ndXBfdGVzdC5jLTM1MS1cdGludCByZXQ7XG4tLVxubW0vZ3VwX3Rlc3QuYy0zNzEtXG5tbS9ndXBfdGVzdC5jOjM3MjpcdHJldCA9IF9fZ3VwX3Rlc3RfaW9jdGwoY21kLCBcdTAwMjZndXApO1xubW0vZ3VwX3Rlc3QuYy0zNzMtXHRpZiAocmV0KVxuLS1cbm1tL2d1cF90ZXN0LmMtMzgxLVxubW0vZ3VwX3Rlc3QuYzozODI6c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxubW0vZ3VwX3Rlc3QuYy0zODMte1xubW0vZ3VwX3Rlc3QuYzozODQ6XHRzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YTtcbm1tL2d1cF90ZXN0LmMtMzg1LVx0aW50IHJldDtcbi0tXG5tbS9ndXBfdGVzdC5jLTQwMS1cbm1tL2d1cF90ZXN0LmM6NDAyOnN0YXRpYyBpbnQgZ3VwX3Rlc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbm1tL2d1cF90ZXN0LmMtNDAzLXtcbm1tL2d1cF90ZXN0LmM6NDA0Olx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbm1tL2d1cF90ZXN0LmMtNDA1LVxuLS1cbm1tL2d1cF90ZXN0LmMtNDEzLVxubW0vZ3VwX3Rlc3QuYzo0MTQ6c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ3VwX3Rlc3RfZm9wcyA9IHtcbm1tL2d1cF90ZXN0LmM6NDE1Olx0Lm9wZW4gPSBndXBfdGVzdF9vcGVuLFxubW0vZ3VwX3Rlc3QuYzo0MTY6XHQudW5sb2NrZWRfaW9jdGwgPSBndXBfdGVzdF9pb2N0bCxcbm1tL2d1cF90ZXN0LmMtNDE3LVx0LmNvbXBhdF9pb2N0bCA9IGNvbXBhdF9wdHJfaW9jdGwsXG5tbS9ndXBfdGVzdC5jOjQxODpcdC5yZWxlYXNlID0gZ3VwX3Rlc3RfcmVsZWFzZSxcbm1tL2d1cF90ZXN0LmMtNDE5LX07XG5tbS9ndXBfdGVzdC5jLTQyMC1cbm1tL2d1cF90ZXN0LmM6NDIxOnN0YXRpYyBpbnQgX19pbml0IGd1cF90ZXN0X2luaXQodm9pZClcbm1tL2d1cF90ZXN0LmMtNDIyLXtcbm1tL2d1cF90ZXN0LmM6NDIzOlx0ZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoXCYjMzQ7Z3VwX3Rlc3RcJiMzNDssIDA2MDAsIE5VTEwsIE5VTEwsXG5tbS9ndXBfdGVzdC5jOjQyNDpcdFx0XHRcdCAgIFx1MDAyNmd1cF90ZXN0X2ZvcHMpO1xubW0vZ3VwX3Rlc3QuYy00MjUtXG4tLVxubW0vZ3VwX3Rlc3QuYy00MjgtXG5tbS9ndXBfdGVzdC5jOjQyOTpsYXRlX2luaXRjYWxsKGd1cF90ZXN0X2luaXQpO1xuLS1cbm1tL2d1cF90ZXN0LmgtNi1cbm1tL2d1cF90ZXN0Lmg6NzojZGVmaW5lIEdVUF9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDEsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6ODojZGVmaW5lIFBJTl9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDIsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6OTojZGVmaW5lIFBJTl9MT05HVEVSTV9CRU5DSE1BUktcdF9JT1dSKCYjMzk7ZyYjMzk7LCAzLCBzdHJ1Y3QgZ3VwX3Rlc3QpXG5tbS9ndXBfdGVzdC5oOjEwOiNkZWZpbmUgR1VQX0JBU0lDX1RFU1RcdFx0X0lPV1IoJiMzOTtnJiMzOTssIDQsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6MTE6I2RlZmluZSBQSU5fQkFTSUNfVEVTVFx0XHRfSU9XUigmIzM5O2cmIzM5OywgNSwgc3RydWN0IGd1cF90ZXN0KVxubW0vZ3VwX3Rlc3QuaDoxMjojZGVmaW5lIERVTVBfVVNFUl9QQUdFU19URVNUXHRfSU9XUigmIzM5O2cmIzM5OywgNiwgc3RydWN0IGd1cF90ZXN0KVxubW0vZ3VwX3Rlc3QuaC0xMy0jZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUXHRfSU9XKCYjMzk7ZyYjMzk7LCA3LCBzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QpXG4tLVxubW0vZ3VwX3Rlc3QuaC0yMC1cbm1tL2d1cF90ZXN0Lmg6MjE6c3RydWN0IGd1cF90ZXN0IHtcbm1tL2d1cF90ZXN0LmgtMjItXHRfX3U2NCBnZXRfZGVsdGFfdXNlYztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3MTczCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgS2VybmVsIENvbmZpZ3VyYXRpb24qKgoKT2theSwgdGltZSB0byB0cm91Ymxlc2hvb3QgdGhpcy4gTXkgZ3V0IGZlZWxpbmcgaXMgdGVsbGluZyBtZSB0aGUgaXNzdWUgbWlnaHQgYmUgbHVya2luZyB3aXRoaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGZpbGVzLiBMZXQgbWUgemVybyBpbiBvbiBgbW0vS2NvbmZpZ2AuIEl0JiMzOTtzIGEga2V5IGZpbGUgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMsIGFuZCB0aGVyZSYjMzk7cyBhIHN0cm9uZyBjaGFuY2UgdGhlIHByb2JsZW0gcmVsYXRlcyB0byBzb21ldGhpbmcgaW4gdGhhdCBhcmVhLiBOb3csIGJhc2VkIG9uIHByZXZpb3VzIGV4cGVyaWVuY2VzLCBJJiMzOTttIGdvaW5nIHRvIGp1bXAgdG8gYXJvdW5kIGxpbmUgMTI5My4gVGhhdCByZWdpb24gb2Z0ZW4gY29udGFpbnMgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBzcGVjaWZpYyBtZW1vcnkgYWxsb2NhdGlvbiBmZWF0dXJlcyBvciBwb3RlbnRpYWxseSBjb25mbGljdGluZyBzZXR0aW5ncyB0aGF0IGNvdWxkIGJlIHJlbGV2YW50IHRvIHRoZSBpc3N1ZSBJJiMzOTttIGZhY2luZy4gSSYjMzk7bGwgc3RhcnQgbXkgaW52ZXN0aWdhdGlvbiB0aGVyZSBhbmQgc2VlIHdoYXQganVtcHMgb3V0LiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50LCBhIGRlcGVuZGVuY3ksIG9yIG1heWJlIGV2ZW4gYSBjb25maWd1cmF0aW9uIG9wdGlvbiB3aXRoIGFuIHVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSB0aGF0JiMzOTtzIGNhdXNpbmcgdGhlIHByb2JsZW0uIExldCYjMzk7cyBzZWUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMjkwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzEyOTA6XHRcdCAgaW5mb3JtYXRpb24gaW5jbHVkZXMgZ2xvYmFsIGFuZCBwZXIgY2h1bmsgc3RhdGlzdGljcywgd2hpY2ggY2FuXG4xMjkxOlx0XHQgIGJlIHVzZWQgdG8gaGVscCB1bmRlcnN0YW5kIHBlcmNwdSBtZW1vcnkgdXNhZ2UuXG4xMjkyOlx0XG4xMjkzOlx0Y29uZmlnIEdVUF9URVNUXG4xMjk0Olx0XHRib29sIFwmIzM0O0VuYWJsZSBpbmZyYXN0cnVjdHVyZSBmb3IgZ2V0X3VzZXJfcGFnZXMoKS1yZWxhdGVkIHVuaXQgdGVzdHNcJiMzNDtcbjEyOTU6XHRcdGRlcGVuZHMgb24gREVCVUdfRlNcbjEyOTY6XHRcdGhlbHBcbjEyOTc6XHRcdCAgUHJvdmlkZXMgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QsIHdoaWNoIGluIHR1cm4gcHJvdmlkZXMgYSB3YXlcbjEyOTg6XHRcdCAgdG8gbWFrZSBpb2N0bCBjYWxscyB0aGF0IGNhbiBsYXVuY2gga2VybmVsLWJhc2VkIHVuaXQgdGVzdHMgZm9yXG4xMjk5Olx0XHQgIHRoZSBnZXRfdXNlcl9wYWdlcyooKSBhbmQgcGluX3VzZXJfcGFnZXMqKCkgZmFtaWx5IG9mIEFQSSBjYWxscy5cbjEzMDA6XHRcbjEzMDE6XHRcdCAgVGhlc2UgdGVzdHMgaW5jbHVkZSBiZW5jaG1hcmsgdGVzdGluZyBvZiB0aGUgX2Zhc3QgdmFyaWFudHMgb2ZcbjEzMDI6XHRcdCAgZ2V0X3VzZXJfcGFnZXMqKCkgYW5kIHBpbl91c2VyX3BhZ2VzKigpLCBhcyB3ZWxsIGFzIHNtb2tlIHRlc3RzIG9mXG4xMzAzOlx0XHQgIHRoZSBub24tX2Zhc3QgdmFyaWFudHMuXG4xMzA0Olx0XG4xMzA1Olx0XHQgIFRoZXJlIGlzIGFsc28gYSBzdWItdGVzdCB0aGF0IGFsbG93cyBydW5uaW5nIGR1bXBfcGFnZSgpIG9uIGFueVxuMTMwNjpcdFx0ICBvZiB1cCB0byBlaWdodCBwYWdlcyAoc2VsZWN0ZWQgYnkgY29tbWFuZCBsaW5lIGFyZ3MpIHdpdGhpbiB0aGVcbjEzMDc6XHRcdCAgcmFuZ2Ugb2YgdXNlci1zcGFjZSBhZGRyZXNzZXMuIFRoZXNlIHBhZ2VzIGFyZSBlaXRoZXIgcGlubmVkIHZpYVxuMTMwODpcdFx0ICBwaW5fdXNlcl9wYWdlcyooKSwgb3IgcGlubmVkIHZpYSBnZXRfdXNlcl9wYWdlcyooKSwgYXMgc3BlY2lmaWVkXG4xMzA5Olx0XHQgIGJ5IG90aGVyIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuXG4xMzEwOlx0XG4xMzExOlx0XHQgIFNlZSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jXG4xMzEyOlx0XG4xMzEzOlx0Y29tbWVudCBcJiMzNDtHVVBfVEVTVCBuZWVkcyB0byBoYXZlIERFQlVHX0ZTIGVuYWJsZWRcJiMzNDtcbjEzMTQ6XHRcdGRlcGVuZHMgb24gIUdVUF9URVNUIFx1MDAyNlx1MDAyNiAhREVCVUdfRlNcbjEzMTU6XHRcbjEzMTY6XHRjb25maWcgR1VQX0dFVF9QWFhfTE9XX0hJR0hcbjEzMTc6XHRcdGJvb2xcbjEzMTg6XHRcbjEzMTk6XHRjb25maWcgRE1BUE9PTF9URVNUXG4xMzIwOlx0XHR0cmlzdGF0ZSBcJiMzNDtFbmFibGUgYSBtb2R1bGUgdG8gcnVuIHRpbWUgdGVzdHMgb24gZG1hX3Bvb2xcJiMzNDtcbjEzMjE6XHRcdGRlcGVuZHMgb24gSEFTX0RNQVxuMTMyMjpcdFx0aGVscFxuMTMyMzpcdFx0ICBQcm92aWRlcyBhIHRlc3QgbW9kdWxlIHRoYXQgd2lsbCBhbGxvY2F0ZSBhbmQgZnJlZSBtYW55IGJsb2NrcyBvZlxuMTMyNDpcdFx0ICB2YXJpb3VzIHNpemVzIGFuZCByZXBvcnQgaG93IGxvbmcgaXQgdGFrZXMuIFRoaXMgaXMgaW50ZW5kZWQgdG9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3OTk1CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNDYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgR1VQIFRlc3QgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIHRha2UgYW5vdGhlciBsb29rIGF0IHRoaXMgYG1tL2d1cF90ZXN0LmNgIHBhdGNoLiBGaXJzdCBnbGFuY2Ugc2hvd3Mgc29tZSBhZGRpdGlvbnMsIGEgZmV3IG5ldyBjaGVja3MsIGFuZCBhIGNoYW5nZSB0byB0aGUgbG9vcCBoYW5kbGluZy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBiZWluZyBhZGRyZXNzZWQgaGVyZSwgc28gbGV0JiMzOTtzIGJyZWFrIGl0IGRvd24uCgpUaGUgaW5pdGlhbCBgaWZgIHN0YXRlbWVudCBub3cgaW5jbHVkZXMgYWRkaXRpb25hbCBjaGVja3M6IGAhZ3VwLSZndDtzaXplYCwgYCFndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsYCwgYW5kIGAhUEFHRV9BTElHTkVEKGd1cC0mZ3Q7c2l6ZSlgLiBDbGVhcmx5LCB3ZSYjMzk7cmUgdHJ5aW5nIHRvIHZhbGlkYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIG1vcmUgcmlnb3JvdXNseS4gWmVyby1zaXplZCByZXF1ZXN0cywgbWlzc2luZyBgbnJfcGFnZXNfcGVyX2NhbGxgLCBvciBtaXNhbGlnbmVkIHNpemVzIGFyZSBub3cgY29uc2lkZXJlZCBpbnZhbGlkLiBUaGlzIHNlZW1zIHJlYXNvbmFibGU7IHByZXZlbnRpbmcgdGhlc2Uga2luZHMgb2YgZWRnZSBjYXNlcyB1cGZyb250IGlzIGEgZ29vZCBwcmFjdGljZSB0byBhdm9pZCB1bmV4cGVjdGVkIGJlaGF2aW9yIGxhdGVyLgoKVGhlIGNvcmUgb2YgdGhlIGNoYW5nZSBsaWVzIHdpdGhpbiB0aGUgbWFpbiBsb29wLiBQcmV2aW91c2x5LCB0aGUgY29kZSBjYWxjdWxhdGVkIGBuZXh0YCBhbmQgdGhlbiBoYWQgYSByZWR1bmRhbnQgY2hlY2svYWRqdXN0bWVudCBpZiBgbmV4dGAgZXhjZWVkZWQgYGVuZGAuIE5vdywgdGhlcmUmIzM5O3MgYSBuZXcgbGluZSB0aGF0IGNsYW1wcyB0aGUgYG5yYCB2YWx1ZSBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHNpemUuIFRoaXMgc3VnZ2VzdHMgdGhlIG9yaWdpbmFsIGNhbGN1bGF0aW9uIGhhZCBwb3RlbnRpYWwgb3ZlcmZsb3cgaXNzdWVzLCBhbmQgdGhpcyByZXZpc2VkIGNvZGUgc2VlbXMgdG8gYmUgYW4gaW1wcm92ZW1lbnQgaW4gZW5zdXJpbmcgYG5yYCBkb2VzbiYjMzk7dCBleGNlZWQgdGhlIGJvdW5kcyBvZiB0aGUgcHJvdmlkZWQgcmVnaW9uLCBldmVuIHdoZW4gdGhlIHByb3ZpZGVkIHZhbHVlIGZvciBgZ3VwLSZndDtzaXplYCBjb3VsZCBoYXZlIHJlc3VsdGVkIGluIGFuIG92ZXJmbG93IGNhbGN1bGF0aW9uIGluIGBuZXh0ID0gYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRTtgLgoKSSYjMzk7bSB0aGlua2luZyB0aGlzIGxpa2VseSByZXNvbHZlcyBhbiBpc3N1ZSB3aGVyZSB0aGUgY2FsY3VsYXRpb24gb2YgYG5leHRgIGNvdWxkIHJlc3VsdCBpbiBhbiBpbnZhbGlkIGFkZHJlc3MgdGhhdCBsZWFkcyB0byBhbiBvdXQtb2YtYm91bmRzIHJlYWQgb3Igd3JpdGUuIFByZXZlbnRpbmcgdGhpcyBraW5kIG9mIG92ZXJmbG93IGlzIGNydWNpYWwgZm9yIG1lbW9yeSBtYW5hZ2VtZW50LCBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggdXNlci1wcm92aWRlZCBwYXJhbWV0ZXJzLgoKSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVudCBhbmQgb3JpZ2luYWwgbW90aXZhdGlvbiBiZWhpbmQgdGhpcyBjaGFuZ2UuIE5vdyBJIHNob3VsZCBsb29rIGF0IHRoZSBjb21taXQgbG9nIGZvciBgbW0vZ3VwX3Rlc3QuY2AgdG8gc2VlIHRoZSBjb250ZXh0IGFuZCB0aGUgc3BlY2lmaWMgcHJvYmxlbSB0aGF0IHdhcyBiZWluZyBmaXhlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTM1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDU1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMzU6XHRcbiAxMzY6XHRcdGkgPSAwO1xuIDEzNzpcdFx0bnIgPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGw7XG4gMTM4Olx0XHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XG4gMTM5Olx0XHRmb3IgKGFkZHIgPSBndXAtXHUwMDNlYWRkcjsgYWRkciBcdTAwM2MgZW5kOyBhZGRyID0gbmV4dCkge1xuIDE0MDpcdFx0XHRpZiAobnIgIT0gZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxuIDE0MTpcdFx0XHRcdGJyZWFrO1xuIDE0MjpcdFxuIDE0MzpcdFx0XHRuciA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG5yLCAoZW5kIC0gYWRkcikgLyBQQUdFX1NJWkUpO1xuIDE0NDpcdFxuIDE0NTpcdFx0XHRuZXh0ID0gYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRTtcbiAxNDY6XHRcbiAxNDc6XHRcdFx0c3dpdGNoIChjbWQpIHtcbiAxNDg6XHRcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4gMTQ5Olx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1MDpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTE6XHRcdFx0XHRicmVhaztcbiAxNTI6XHRcdFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcbiAxNTM6XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNTQ6XHRcdFx0XHRicmVhaztcbiAxNTU6XHRcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMTU2Olx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1NzpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTg6XHRcdFx0XHRicmVhaztcbiAxNTk6XHRcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAxNjA6XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNjE6XHRcdFx0XHRicmVhaztcbiAxNjI6XHRcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxuIDE2MzpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXG4gMTY0Olx0XHRcdFx0XHRcdCAgICBndXAtXHUwMDNlZ3VwX2ZsYWdzIHwgRk9MTF9MT05HVEVSTSxcbiAxNjU6XHRcdFx0XHRcdFx0ICAgIHBhZ2VzICYjNDM7IGkpO1xuIDE2NjpcdFx0XHRcdGJyZWFrO1xuIDE2NzpcdFx0XHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxuIDE2ODpcdFx0XHRcdGlmIChndXAtXHUwMDNldGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXG4gMTY5Olx0XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3MDpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzE6XHRcdFx0XHRlbHNlXG4gMTcyOlx0XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3MzpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzQ6XHRcdFx0XHRicmVhaztcbiAxNzU6XHRcdFx0ZGVmYXVsdDpcbiAxNzY6XHRcdFx0XHRyZXQgPSAtRUlOVkFMO1xuIDE3NzpcdFx0XHRcdGdvdG8gdW5sb2NrO1xuIDE3ODpcdFx0XHR9XG4gMTc5Olx0XG4gMTgwOlx0XHRcdGlmIChuciBcdTAwM2M9IDApXG4gMTgxOlx0XHRcdFx0YnJlYWs7XG4gMTgyOlx0XHRcdGkgJiM0Mzs9IG5yO1xuIDE4MzpcdFx0fVxuIDE4NDpcdFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcbiAxODU6XHRcbiAxODY6XHRcdC8qIFNoaWZ0aW5nIHRoZSBtZWFuaW5nIG9mIG5yX3BhZ2VzOiBub3cgaXQgaXMgYWN0dWFsIG51bWJlciBwaW5uZWQ6ICovXG4gMTg3Olx0XHRucl9wYWdlcyA9IGk7XG4gMTg4Olx0XG4gMTg5Olx0XHRndXAtXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk3NTEKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxMzY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgRmVhc2liaWxpdHk6IEEgRGVlcCBEaXZlIGludG8gZ3VwX3Rlc3QuYyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIGNvZGUgcmVsYXRlZCB0byBgZ2V0X3VzZXJfcGFnZXMoKWAsIHNwZWNpZmljYWxseSB3aXRoaW4gYG1tL2d1cF90ZXN0LmNgLiBUaGUgaW5pdGlhbCBjb2RlIGhhZCBwb3RlbnRpYWwgb3ZlcmZsb3cgaXNzdWVzIHdpdGggYGFkZHIgJiM0MzsgbnIgKiBQQUdFX1NJWkVgLCBhbmQgc29tZSB6ZXJvLXNpemUgYWxsb2NhdGlvbnMgdGhhdCBjb3VsZCBjYXVzZSBwcm9ibGVtcy4gVGhlIGNvcnJlY3Rpb24gYWRkcmVzc2VzIHRob3NlIG92ZXJmbG93cyB3aXRoIGFuIG92ZXJmbG93LXNhZmUgY2hlY2ssIGFuZCBkZWFscyB3aXRoIHNvbWUgcG90ZW50aWFsIG51bGwtcG9pbnRlci1lc3F1ZSBjb25kaXRpb25zLgoKTXkgaW1tZWRpYXRlIHRob3VnaHQgaXM6IGNhbiB0aGlzIGNvZGUgKmFjdHVhbGx5KiBiZSBmdXp6ZWQ/IFRoZSBjZW50cmFsIHF1ZXN0aW9uIGlzIHJlYWNoYWJpbGl0eS4gVGhlIHBhdGNoIGNvZGUgY3JlYXRlcyBgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RgIHZpYSBkZWJ1Z2ZzLCBhbmQgaW9jdGxzIGNhbiBiZSBpc3N1ZWQgYnkgdXNlcnNwYWNlLiBCdXQgdGhlIGluc3RydWN0aW9ucyBtYWtlIGl0IGNsZWFyLCByZWFjaGFiaWxpdHkgaXMgdGhlIHByaW1hcnkgZ2F0ZTogaWYgdGhlIGNvZGUgY2FuJiMzOTt0IGV4ZWN1dGUgaW4gYSBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudCwgaXQmIzM5O3MgYSBuby1nbyBmb3IgZnV6emluZy4KCk5vdywgbGV0JiMzOTtzIGFwcGx5IHRoZSAqbmVnYXRpdmUqIGNyaXRlcmlhIGZyb20gdGhlIGluc3RydWN0aW9ucy4gRG9lcyBpdCBmYWxsIGludG8gYW55IG9mIHRob3NlIGNhdGVnb3JpZXM/CgoqICAgKipOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzPyoqIE5vcGUsIGl0JiMzOTtzIGtlcm5lbCBDIGNvZGUuIE5vdCBkb2N1bWVudGF0aW9uLCBzY3JpcHRzLCBvciB1c2VyLXNwYWNlIHN0dWZmLgoqICAgKipTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU/KiogTm9wZSwgaXQgZG9lc24mIzM5O3QgcmVxdWlyZSBzcGVjaWZpYyBoYXJkd2FyZS4gSXQmIzM5O3Mgbm90IGEgZHJpdmVyIGZvciBhIGZhbmN5IEFTSUMgb3IgU21hcnROSUMuCiogICAqKlVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRocz8qKiBJdCYjMzk7cyBub3QgYSB0ZWFyZG93biBjYWxsYmFjaywgbm9yIHNwZWNpZmljIHRvIHNvbWUgYml6YXJyZSBhcmNoaXRlY3R1cmUuIEl0JiMzOTtzIGFtZDY0LWNvbXBhdGlibGUsIGFuZCB0aGUgZGVidWdmcyBmaWxlIGNyZWF0ZWQgdmlhIGBsYXRlX2luaXRjYWxsYCBtZWFucyBpdCYjMzk7cyBhdmFpbGFibGUgdG8gdXNlcnNwYWNlLgoKU28sIHRoZSBuZXh0IG9idmlvdXMgcXVlc3Rpb24gaXM6IElzIHRoaXMgcmVhY2hhYmxlIGZyb20gYSBzdGFuZGFyZCBRRU1VIG9yIEdDRSBlbnZpcm9ubWVudD8KClllcywgc2luY2UgZGVidWdmcyBpcyBtb3VudGVkIGluIHN0YW5kYXJkIExpbnV4LCBhbmQgaW9jdGxzIGNhbiBiZSBpc3N1ZWQgdG8gYGd1cF90ZXN0YCB2aWEgdXNlcnNwYWNlLiBJJiMzOTt2ZSBjaGVja2VkIGRlYnVnZnMgcGVybWlzc2lvbnMgaW4gYGd1cF90ZXN0LmNgOiBUaGUgZGVidWdmcyBmaWxlIGlzIGNyZWF0ZWQgYXMgMDYwMCAtIHNvIHJvb3QgY2FuIGFjY2VzcyBpdC4gU3l6a2FsbGVyIHJ1bnMgYXMgcm9vdCAob3Igd2l0aCBjYXBhYmlsaXRpZXMpIGluIG1hbnkgc2NlbmFyaW9zLCBzbyB0aGlzIGNoZWNrIGlzIHZhbGlkLgoKSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzLiBgR1VQX1RFU1RgIGRlcGVuZHMgb24gYERFQlVHX0ZTYCB3aGljaCBkZXBlbmRzIG9uIHZhcmlvdXMgZGVidWdnaW5nIGNvbmZpZyBvcHRpb25zLCBidXQgaXQgbG9va3MgbGlrZSB0aGUgdGVzdHMgaW4gYGd1cF90ZXN0LmNgIGFyZSBlbmFibGVkIHVuZGVyIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uLgoKT2theSwgbGV0JiMzOTtzIGFwcGx5IHRoZSAqcG9zaXRpdmUqIGNyaXRlcmlhIGZyb20gdGhlIGluc3RydWN0aW9ucyB0byBiZSBzdXJlOgoKKiAgICoqQ29yZSBTdWJzeXN0ZW1zPyoqIFllcywgaXQgaXMgYSBtZW1vcnkgbWFuYWdlbWVudCBpc3N1ZSwgYXMgdGhlIGNvZGUgbW9kaWZpZXMgYGdldF91c2VyX3BhZ2VzKClgCiogICAqKlJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwcz8qKiBZZXMsIHRoZSBjb2RlIGlzIHJlZmFjdG9yaW5nIGFuZCBjaGFuZ2luZyBwYXJ0cyBvZiBtZW1vcnkgbWFuYWdlbWVudC4KKiAgICoqUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzPyoqIFllcywgd2UgYXJlIGludHJvZHVjaW5nIGRlZmVuc2l2ZSBjaGVja3MuCgpUaGVyZWZvcmUsIHRoaXMgY29kZSBwYXRoICppcyogcmVhY2hhYmxlLCBhbmQgKnNob3VsZCogYmUgZnV6emVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBERUJVR19GUyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNzg0CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEZWJ1Z2dpbmcgdGhlIEZpbGVzeXN0ZW0gQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gYERFQlVHX0ZTYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBgS2NvbmZpZ2AgZmlsZXMuIFRoYXQmIzM5O3MgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIEkmIzM5O2xsIGZpbmQgaXRzIGRlZmluaXRpb24sIGFueSBkZXBlbmRlbmNpZXMsIGFuZCBhc3NvY2lhdGVkIGhlbHAgdGV4dC4gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0byBsb29rIGluIGFsbCB0aGUgcmVsZXZhbnQgc3ViZGlyZWN0b3JpZXMgZm9yIGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIGhvdyBpdCYjMzk7cyB1c2VkIGFuZCB3aGF0IGl0IGNvbnRyb2xzLiBGaW5kaW5nIGl0cyBkZXBlbmRlbmNpZXMgd2lsbCBiZSBrZXkgdG8gdW5kZXJzdGFuZGluZyBpZiBpdCYjMzk7cyBlbmFibGVkIGJ5IHNvbWV0aGluZyBlbHNlIEkmIzM5O20gYWxyZWFkeSB1c2luZywgb3IgaWYgaXQgY2FuIGJlIGVuYWJsZWQgaW5kZXBlbmRlbnRseS4gSSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCBhbnkgd2FybmluZ3MgYWJvdXQgdXNpbmcgdGhpcy4gTGV0JiMzOTtzIHN0YXJ0IHRoZSBzZWFyY2guLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIERFQlVHX0ZTXFxiJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2xpYi9LY29uZmlnLmRlYnVnPTY4Mz1jb25maWcgTUFHSUNfU1lTUlFfU0VSSUFMX1NFUVVFTkNFXG4tLVxubGliL0tjb25maWcuZGVidWctNjkyLVxubGliL0tjb25maWcuZGVidWc6NjkzOmNvbmZpZyBERUJVR19GU1xubGliL0tjb25maWcuZGVidWctNjk0LVx0Ym9vbCBcJiMzNDtEZWJ1ZyBGaWxlc3lzdGVtXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMDYwCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqUGVlcmluZyBpbnRvIHRoZSBEZWJ1Z2dpbmcgSGVhcnQgb2YgdGhlIENvbmZpZ3VyYXRpb24gQmVhc3QqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZywgJiMzNDtXaGVyZSYjMzk7cyB0aGUgYmVzdCBwbGFjZSB0byBkaWcgaW50byB0aGlzIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbiBpc3N1ZT8mIzM0OyBJbW1lZGlhdGVseSwgbXkgbWluZCBob25lcyBpbiBvbiBgbGliL0tjb25maWcuZGVidWdgLiBJdCYjMzk7cyBhbG1vc3Qgc2Vjb25kIG5hdHVyZSDigJMgdGhhdCBmaWxlIGlzIGEgY29yZSBjb21wb25lbnQgZm9yIGRlYnVnIGNvbmZpZ3VyYXRpb25zLiBOb3csIEkgaGF2ZSB0byB6ZXJvIGluLCBsZXQmIzM5O3Mgc2VlLCBhcm91bmQgbGluZSA2OTMuIFRoYXQmIzM5O3MgYSByZWFzb25hYmxlIGFyZWEgdG8gc3RhcnQgbG9va2luZywgSSYjMzk7bGwgYmV0IGl04oCZcyByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHF1ZXJ5LiBGcm9tIHRoYXQgbG9jYXRpb24sIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGtleSBkaXJlY3RpdmVzLCBkZXBlbmRlbmNpZXMsIG9yIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIGRlYnVnIHBhcmFtZXRlcnMgaW4gcGxheS4gTGV0JiMzOTtzIHNlZSB3aGF04oCZcyB0aGVyZSwgaXQgY291bGQgY29udGFpbiB0aGUgYW5zd2VyLCBvciBhIGdvb2QgY2x1ZSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtsaWIvS2NvbmZpZy5kZWJ1ZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDY5MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjkwOlx0XG4gNjkxOlx0XHQgIElmIHVuc3VyZSwgbGVhdmUgYW4gZW1wdHkgc3RyaW5nIGFuZCB0aGUgb3B0aW9uIHdpbGwgbm90IGJlIGVuYWJsZWQuXG4gNjkyOlx0XG4gNjkzOlx0Y29uZmlnIERFQlVHX0ZTXG4gNjk0Olx0XHRib29sIFwmIzM0O0RlYnVnIEZpbGVzeXN0ZW1cJiMzNDtcbiA2OTU6XHRcdGhlbHBcbiA2OTY6XHRcdCAgZGVidWdmcyBpcyBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gdGhhdCBrZXJuZWwgZGV2ZWxvcGVycyB1c2UgdG8gcHV0XG4gNjk3Olx0XHQgIGRlYnVnZ2luZyBmaWxlcyBpbnRvLiAgRW5hYmxlIHRoaXMgb3B0aW9uIHRvIGJlIGFibGUgdG8gcmVhZCBhbmRcbiA2OTg6XHRcdCAgd3JpdGUgdG8gdGhlc2UgZmlsZXMuXG4gNjk5Olx0XG4gNzAwOlx0XHQgIEZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9uIHRoZSBkZWJ1Z2ZzIEFQSSwgc2VlXG4gNzAxOlx0XHQgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvLlxuIDcwMjpcdFxuIDcwMzpcdFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuIDcwNDpcdFxuIDcwNTpcdGNob2ljZVxuIDcwNjpcdFx0cHJvbXB0IFwmIzM0O0RlYnVnZnMgZGVmYXVsdCBhY2Nlc3NcJiMzNDtcbiA3MDc6XHRcdGRlcGVuZHMgb24gREVCVUdfRlNcbiA3MDg6XHRcdGRlZmF1bHQgREVCVUdfRlNfQUxMT1dfQUxMXG4gNzA5Olx0XHRoZWxwXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNTQzCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqQW5hbHl6aW5nIERlcGVuZGVuY2llcyBhbmQgSU9DVEwgQ2FsbHMqKgoKQWxyaWdodCwgc28gYERFQlVHX0ZTYCBpcyBhIHN0YW5kYWxvbmUgcGllY2UsIHdoaWNoIGlzIHVzZWZ1bCB0byBrbm93LiBIb3dldmVyLCBJIHNlZSBgR1VQX1RFU1RgIHJlbGllcyBvbiBgREVCVUdfRlNgLiBUaGF0IHJlbGF0aW9uc2hpcCB3aWxsIGJlIGltcG9ydGFudCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgb3ZlcmFsbCBhcmNoaXRlY3R1cmUuCgpNeSBmb2N1cyBzaG91bGQgYmUgb24gaG93IGBHVVBfVEVTVGAgaXMgbGV2ZXJhZ2luZyBgREVCVUdfRlNgLiBJJiMzOTtsbCBpbW1lZGlhdGVseSBkcmlsbCBkb3duIGludG8gYF9fZ3VwX3Rlc3RfaW9jdGxgIGFuZCBpdHMgY2FsbGVycyB3aXRoaW4gYG1tL2d1cF90ZXN0LmNgLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250cm9sIGZsb3csIHRoZSBkYXRhIGJlaW5nIHBhc3NlZCwgYW5kIGhvdyB0aGUgaW50ZXJhY3Rpb24gd2l0aCBgREVCVUdfRlNgIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIHdpdGhpbiB0aGF0IElPQ1RMLiBVbmRlcnN0YW5kaW5nIHRoZSBzcGVjaWZpY3Mgb2YgdGhpcyBpbnRlcmFjdGlvbiBpcyBjcml0aWNhbCB0byB1bmRlcnN0YW5kaW5nIGhvdyB0aGluZ3Mgd29yayBvdmVyYWxsLiBJIHdhbnQgdG8gc2VlIGlmIHRoZSBkZXBlbmRlbmN5IGlzIHB1cmVseSBhIGNvbmZpZ3VyYXRpb24gdGhpbmcsIG9yIGlmIGBERUJVR19GU2AgZnVuY3Rpb25zIGFyZSBhY3RpdmVseSB1dGlsaXplZCBkdXJpbmcgSU9DVEwgcHJvY2Vzc2luZy4gVGhlIGRldmlsJiMzOTtzIGluIHRoZSBkZXRhaWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM0NTpcdH1cbiAzNDY6XHRcbiAzNDc6XHRzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4gMzQ4Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDM0OTpcdHtcbiAzNTA6XHRcdHN0cnVjdCBndXBfdGVzdCBndXA7XG4gMzUxOlx0XHRpbnQgcmV0O1xuIDM1MjpcdFxuIDM1MzpcdFx0c3dpdGNoIChjbWQpIHtcbiAzNTQ6XHRcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxuIDM1NTpcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMzU2Olx0XHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XG4gMzU3Olx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxuIDM1ODpcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAzNTk6XHRcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XG4gMzYwOlx0XHRcdGJyZWFrO1xuIDM2MTpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVDpcbiAzNjI6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RPUDpcbiAzNjM6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcbiAzNjQ6XHRcdFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XG4gMzY1Olx0XHRkZWZhdWx0OlxuIDM2NjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzNjc6XHRcdH1cbiAzNjg6XHRcbiAzNjk6XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZndXAsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGd1cCkpKVxuIDM3MDpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzNzE6XHRcbiAzNzI6XHRcdHJldCA9IF9fZ3VwX3Rlc3RfaW9jdGwoY21kLCBcdTAwMjZndXApO1xuIDM3MzpcdFx0aWYgKHJldClcbiAzNzQ6XHRcdFx0cmV0dXJuIHJldDtcbiAzNzU6XHRcbiAzNzY6XHRcdGlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBcdTAwMjZndXAsIHNpemVvZihndXApKSlcbiAzNzc6XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gMzc4Olx0XG4gMzc5Olx0XHRyZXR1cm4gMDtcbiAzODA6XHR9XG4gMzgxOlx0XG4gMzgyOlx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuIDM4MzpcdHtcbiAzODQ6XHRcdHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzQwNwoJCQkJCQkJb3V0cHV0OiA0NwoJCQkJCQkJdGhvdWdodHM6IDMyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIGBndXBfdGVzdF9pb2N0bGAgRnVuY3Rpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBgZ3VwX3Rlc3RfaW9jdGxgIGZ1bmN0aW9uYWxpdHkuIEZpcnN0LCBpdCBsb29rcyBsaWtlIGl0JiMzOTtzIGhhbmRsaW5nIGEgc2V0IG9mIGNvbW1hbmRzOiBgR1VQX0ZBU1RfQkVOQ0hNQVJLYCwgYFBJTl9GQVNUX0JFTkNITUFSS2AsIGBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLYCwgYEdVUF9CQVNJQ19URVNUYCwgYFBJTl9CQVNJQ19URVNUYCwgYW5kIGBEVU1QX1VTRVJfUEFHRVNfVEVTVGAuIEludGVyZXN0aW5nLiBUaGUgbmV4dCBzdGVwIGlzIGEgYGNvcHlfZnJvbV91c2VyYCBjYWxsIHRvIGdldCBhIGBndXBgIHN0cnVjdCBmcm9tIHVzZXJzcGFjZS4gVGhlbiBpdCBoYW5kcyBvZmYgdGhlIHByb2Nlc3NpbmcgdG8gYF9fZ3VwX3Rlc3RfaW9jdGwoY21kLCAmYW1wO2d1cClgLgoKTm93LCBpcyBgX19ndXBfdGVzdF9pb2N0bGAgc3RhdGljPyBZZXAsIGl0IGlzLiBUaGUgY29tcGlsZXIgd2lsbCBsaWtlbHkgaW5saW5lIGl0LiBUaGF0JiMzOTtzIGdvb2QgdG8ga25vdyBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMuIEkgd29uZGVyIHRob3VnaCwgd2hhdCBvdGhlciBlbnRyeSBwb2ludHMgZXhpc3QuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBhbSBjb3ZlcmluZyBhbGwgY2FsbHMgdG8gdGhpcyBtZXRob2QuIAoKTGV0IG1lIGNsYXJpZnkgbXkgbWVtb3J5LiBXYWl0LCBgZ3VwX3Rlc3RfaW9jdGxgIGl0c2VsZiBpcyBkZWNsYXJlZCBzdGF0aWMhIExpbmUgMzQ3IGRlY2xhcmVzIGl0OiBgc3RhdGljIGxvbmcgZ3VwX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylgCgpBbHNvLCBsZXQmIzM5O3MgdGFrZSBhIHF1aWNrIGxvb2sgYXQgYGd1cF90ZXN0X2luaXRgIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgbW9kdWxlIGlzIGluaXRpYWxpemVkLgoKVG8gYmUgdGhvcm91Z2gsIEkgc2hvdWxkIHNlYXJjaCB0aHJvdWdoIGBtbS9ndXBfdGVzdC5jYCBmb3IgYW55IG90aGVyIG5vbi1zdGF0aWMgb3IgZXhwb3J0ZWQgZnVuY3Rpb25zLiBMZXQmIzM5O3MgYGdyZXBgIGZvciB0aG9zZS4gVGhhdCB3aWxsIHNvbGlkaWZ5IG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIG1vZHVsZSYjMzk7cyBpbnRlcmZhY2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteW2EtekEtWl9dW2EtekEtWjAtOV9dKiAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMtMTAtXG5tbS9ndXBfdGVzdC5jOjExOnN0cnVjdCBndXBfdGVzdF9kYXRhIHtcbm1tL2d1cF90ZXN0LmMtMTItXHRzdHJ1Y3QgbXV0ZXggbG9uZ3Rlcm1fbXV0ZXg7XG4tLVxubW0vZ3VwX3Rlc3QuYy0xNi1cbm1tL2d1cF90ZXN0LmM6MTc6c3RhdGljIHZvaWQgcHV0X2JhY2tfcGFnZXModW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcbm1tL2d1cF90ZXN0LmMtMTgtXHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcywgdW5zaWduZWQgaW50IGd1cF90ZXN0X2ZsYWdzKVxuLS1cbm1tL2d1cF90ZXN0LmMtNDUtXG5tbS9ndXBfdGVzdC5jOjQ2OnN0YXRpYyB2b2lkIHZlcmlmeV9kbWFfcGlubmVkKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG5tbS9ndXBfdGVzdC5jLTQ3LVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4tLVxubW0vZ3VwX3Rlc3QuYy03NS1cbm1tL2d1cF90ZXN0LmM6NzY6c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxubW0vZ3VwX3Rlc3QuYy03Ny1cdFx0XHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5tbS9ndXBfdGVzdC5jLTEwNi1cbm1tL2d1cF90ZXN0LmM6MTA3OnN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxubW0vZ3VwX3Rlc3QuYy0xMDgtXHRcdHN0cnVjdCBndXBfdGVzdCAqZ3VwKVxuLS1cbm1tL2d1cF90ZXN0LmMtMjE1LVxubW0vZ3VwX3Rlc3QuYzoyMTY6c3RhdGljIGlubGluZSB2b2lkIHBpbl9sb25ndGVybV90ZXN0X3N0b3Aoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEpXG5tbS9ndXBfdGVzdC5jLTIxNy17XG4tLVxubW0vZ3VwX3Rlc3QuYy0yMjctXG5tbS9ndXBfdGVzdC5jOjIyODpzdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdGFydChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcbm1tL2d1cF90ZXN0LmMtMjI5LVx0XHR1bnNpZ25lZCBsb25nIGFyZylcbi0tXG5tbS9ndXBfdGVzdC5jLTI5NC1cbm1tL2d1cF90ZXN0LmM6Mjk1OnN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXG5tbS9ndXBfdGVzdC5jLTI5Ni1cdFx0dW5zaWduZWQgbG9uZyBhcmcpXG4tLVxubW0vZ3VwX3Rlc3QuYy0zMjAtXG5tbS9ndXBfdGVzdC5jOjMyMTpzdGF0aWMgbG9uZyBwaW5fbG9uZ3Rlcm1fdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG5tbS9ndXBfdGVzdC5jLTMyMi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFyZylcbi0tXG5tbS9ndXBfdGVzdC5jLTM0Ni1cbm1tL2d1cF90ZXN0LmM6MzQ3OnN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcbm1tL2d1cF90ZXN0LmMtMzQ4LVx0XHR1bnNpZ25lZCBsb25nIGFyZylcbi0tXG5tbS9ndXBfdGVzdC5jLTM4MS1cbm1tL2d1cF90ZXN0LmM6MzgyOnN0YXRpYyBpbnQgZ3VwX3Rlc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbm1tL2d1cF90ZXN0LmMtMzgzLXtcbi0tXG5tbS9ndXBfdGVzdC5jLTQwMS1cbm1tL2d1cF90ZXN0LmM6NDAyOnN0YXRpYyBpbnQgZ3VwX3Rlc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbm1tL2d1cF90ZXN0LmMtNDAzLXtcbi0tXG5tbS9ndXBfdGVzdC5jLTQxMy1cbm1tL2d1cF90ZXN0LmM6NDE0OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGd1cF90ZXN0X2ZvcHMgPSB7XG5tbS9ndXBfdGVzdC5jLTQxNS1cdC5vcGVuID0gZ3VwX3Rlc3Rfb3Blbixcbi0tXG5tbS9ndXBfdGVzdC5jLTQyMC1cbm1tL2d1cF90ZXN0LmM6NDIxOnN0YXRpYyBpbnQgX19pbml0IGd1cF90ZXN0X2luaXQodm9pZClcbm1tL2d1cF90ZXN0LmMtNDIyLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUwNzEKCQkJCQkJCW91dHB1dDogMTQ1CgkJCQkJCQl0aG91Z2h0czogMTA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldCBBc3Nlc3NtZW50OiBtbS9ndXBfdGVzdC5jKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5vdGljZWQgdGhhdCBhbGwgdGhlIGZ1bmN0aW9ucyBpbiBgbW0vZ3VwX3Rlc3QuY2AgYXJlIGRlY2xhcmVkIGBzdGF0aWNgLiBIb3dldmVyLCB0aGF0IGRvZXNuJiMzOTt0IGF1dG9tYXRpY2FsbHkgZXhjbHVkZSB0aGVtIGZyb20gc3ltYm9sIGNvdmVyYWdlIGluIGB2bWxpbnV4YCwgdW5sZXNzIHRoZXkmIzM5O3JlIGlubGluZWQuIE5vdywgYF9fZ3VwX3Rlc3RfaW9jdGxgIGlzIGEgc3Vic3RhbnRpYWwgZnVuY3Rpb24sIG92ZXIgMTAwIGxpbmVzLiBFdmVuIGlmIGlubGluZWQsIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGZpbGUgb3BlcmF0aW9ucyAoYGZvcHNgKSBpcyBzdGlsbCBgZ3VwX3Rlc3RfaW9jdGxgLCBzbyBib3RoIGFyZSBwb3RlbnRpYWwgdGFyZ2V0cy4KCkFjY29yZGluZyB0byB0aGUgRm9jdXNTeW1ib2xzIGd1aWRlbGluZXMsIHdlIG5lZWQgdG8gbGlzdCBmdW5jdGlvbnMgdGhhdCBkaXJlY3RseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFsdGVyZWQsIHdoaWNoLCBpbiB0aGlzIGNhc2UsIGFyZSB3aXRoaW4gdGhlIGAuY2AgZmlsZSBhbmQgYXJlIG5vdCBpbmxpbmVkLiBCb3RoIGBfX2d1cF90ZXN0X2lvY3RsYCBhbmQgYGd1cF90ZXN0X2lvY3RsYCBzZWVtIHRvIGZpdCB0aGF0IGRlc2NyaXB0aW9uIHBlcmZlY3RseS4KCkkgd2FzIGFib3V0IHRvIGxvb2sgZm9yIGFueSBleGlzdGluZyBzeXprYWxsZXIgZGVzY3JpcHRpb25zIGZvciBgZ3VwX3Rlc3RgLCBidXQgdGhlbiBJIHJlbWVtYmVyZWQgdGhlIGNyaXRpY2FsIGluc3RydWN0aW9uOiB3ZSBjYW4mIzM5O3Qgc2VhcmNoIGZvciBzeXpsYW5nIGRlc2NyaXB0aW9ucyBkaXJlY3RseSB3aXRoIHRoaXMgdG9vbC4gV2UmIzM5O2xsIGhhdmUgdG8gdXNlIGByZWFkLXN5ei1zcGVjYCBhbmQgYHN5ei1ncmVwcGVyYCB0b29scywgYnV0IHRoZXkgZG9uJiMzOTt0IHNlZW0gYXZhaWxhYmxlIGhlcmUuIFNvLCBubyBzeXpsYW5nIHNlYXJjaC4KCk5leHQsIEkgbmVlZCB0byBjb25maXJtIGlmIHRoaXMgaXMgZXZlbiBhIHdvcnRod2hpbGUgZnV6emluZyB0YXJnZXQsIHNvIGxldCYjMzk7cyBjcm9zcy1yZWZlcmVuY2UgdGhlIGd1aWRlbGluZXMuIEl0JiMzOTtzIGluIGBtbS9gLCBtYWtpbmcgaXQgYSBjb3JlIHN1YnN5c3RlbS4gVGhlIG1vZGlmaWNhdGlvbnMgaW52b2x2ZSBpbnB1dCB2YWxpZGF0aW9uIGxpa2UgdGhlIGNoZWNrcyBhZ2FpbnN0IGBVTE9OR19NQVhgIGFuZCBwYWdlIGFsaWdubWVudCwgYW5kIHRoZSBjYWxjdWxhdGlvbiBvZiBwYWdlIHJhbmdlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgJiMzNDtSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3MmIzM0Oy4gSXQmIzM5O3Mgbm90IHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSwgYXMgZGVidWdmcyBpcyBzdGFuZGFyZCBhbmQgYWNjZXNzaWJsZSwgcGFydGljdWxhcmx5IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4gVGhlcmVmb3JlLCBpdCBkZWZpbml0ZWx5IG1lZXRzIHRoZSBjcml0ZXJpYSwgc28gYFdvcnRoRnV6emluZz10cnVlYC4KCk5vdyBmb3IgY29uZmlnIGRlcGVuZGVuY2llcy4gTG9va2luZyBhdCBgbW0vS2NvbmZpZ2AsIGl0JiMzOTtzIGNsZWFyIHdlIG5lZWQgYEdVUF9URVNUYCBhbmQgYERFQlVHX0ZTYCBlbmFibGVkLgoKVG8gc3VtbWFyaXplLCBteSBmb2N1cyBzeW1ib2xzIHdpbGwgYmUgYF9fZ3VwX3Rlc3RfaW9jdGxgIGFuZCBgZ3VwX3Rlc3RfaW9jdGxgLgoKTXkgcmVhc29uaW5nPyBUaGlzIHBhdGNoIHNwZWNpZmljYWxseSBhbHRlcnMgaW5wdXQgdmFsaWRhdGlvbiBhbmQgcGFnZSBjYWxjdWxhdGlvbiBpbiBgX19ndXBfdGVzdF9pb2N0bGAgd2l0aGluIGBtbS9ndXBfdGVzdC5jYCwgYW4gaW50ZXJmYWNlIGV4cG9zZWQgdGhyb3VnaCBkZWJ1Z2ZzIHRvIHVzZXJzcGFjZSAoYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCkuIFRoZSBjaGFuZ2VzIGRpcmVjdGx5IGltcGFjdCBob3cgcGFnZSByYW5nZXMgYW5kIGxvb3AgaXRlcmF0aW9ucyBhcmUgY2FsY3VsYXRlZCBmb3IgYGdldF91c2VyX3BhZ2VzYCB0ZXN0cy4gSXQmIzM5O3MgYSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IHRlc3QgaW50ZXJmYWNlIHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMsIHNvIGZ1enppbmcgY2FuIGhlbHAgdmVyaWZ5IGJvdW5kYXJ5IGNvbmRpdGlvbnMgYW5kIHBvdGVudGlhbGx5IHJldmVhbCBtZW1vcnktcmVsYXRlZCBpc3N1ZXMuCgpGaW5hbGx5LCBqdXN0IHRvIGJlIGFic29sdXRlbHkgc3VyZSwgbGV0JiMzOTtzIHZlcmlmeSBldmVyeXRoaW5nIGlzIGluIG9yZGVyOgoKKiAgIGBFbmFibGVDb25maWdzYDogYFsmIzM0O0dVUF9URVNUJiMzNDssICYjMzQ7REVCVUdfRlMmIzM0O11gCiogICBgRm9jdXNTeW1ib2xzYDogYFsmIzM0O19fZ3VwX3Rlc3RfaW9jdGwmIzM0OywgJiMzNDtndXBfdGVzdF9pb2N0bCYjMzQ7XWAKKiAgIGBXb3J0aEZ1enppbmdgOiBgdHJ1ZWAKKiAgIGBSZWFzb25pbmdgOiBDb25jaXNlIGV4cGxhbmF0aW9uIHByb3ZpZGVkIGFib3ZlLgoKWWVwLCBsb29rcyBnb29kLiBXZSBhcmUgcmVhZHkgdG8gaW52b2tlIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtHVVBfVEVTVCYjMzQ7LAogICAgJiMzNDtERUJVR19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O19fZ3VwX3Rlc3RfaW9jdGwmIzM0OywKICAgICYjMzQ7Z3VwX3Rlc3RfaW9jdGwmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgaW5wdXQgdmFsaWRhdGlvbiBjaGVja3MgYW5kIGl0ZXJhdGlvbiBsb2dpYyBmb3IgcGFnZSBwaW5uaW5nIGFuZCBnZXRfdXNlcl9wYWdlcyBsb29wcyBpbiBfX2d1cF90ZXN0X2lvY3RsKCkgKG1tL2d1cF90ZXN0LmMpLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgYm91bmRhcnkgY29uZGl0aW9uIGhhbmRsaW5nIGFuZCBwb3RlbnRpYWwgcmVncmVzc2lvbnMgaW4gcGFnZSByYW5nZSBoYW5kbGluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7R1VQX1RFU1QmIzM0OywKICAgICYjMzQ7REVCVUdfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX2d1cF90ZXN0X2lvY3RsJiMzNDssCiAgICAmIzM0O2d1cF90ZXN0X2lvY3RsJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGlucHV0IHZhbGlkYXRpb24gY2hlY2tzIGFuZCBpdGVyYXRpb24gbG9naWMgZm9yIHBhZ2UgcGlubmluZyBhbmQgZ2V0X3VzZXJfcGFnZXMgbG9vcHMgaW4gX19ndXBfdGVzdF9pb2N0bCgpIChtbS9ndXBfdGVzdC5jKS4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW9jdGxzIG9uIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIGJvdW5kYXJ5IGNvbmRpdGlvbiBoYW5kbGluZyBhbmQgcG90ZW50aWFsIHJlZ3Jlc3Npb25zIGluIHBhZ2UgcmFuZ2UgaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBtbS9ndXBfdGVzdC5jIHRvIGFkZCBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAoY2hlY2tpbmcgdGhhdCBndXAtXHUwMDNlc2l6ZSBpcyBub24temVybyBhbmQgUEFHRV9BTElHTkVELCBhbmQgdGhhdCBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgaXMgbm9uLXplcm8pIGFuZCBzaW1wbGlmaWVzIHRoZSBwZXItaXRlcmF0aW9uIHBhZ2UgY291bnQgY2FsY3VsYXRpb24gdXNpbmcgbWluX3QoKS4gXG5cblRoZSBpc3N1ZXMgYWRkcmVzc2VkIGJ5IHRoaXMgcGF0Y2ggYXJlIGluZmluaXRlIGxvb3BzICh3aGVuIG5yX3BhZ2VzX3Blcl9jYWxsIGlzIDApIGFuZCBvdXQtb2YtYm91bmRzIGJ1ZmZlciBpbmRleGluZyBvbiB0aGUgYHBhZ2VzYCBhcnJheSAod2hlbiBndXAtXHUwMDNlc2l6ZSB3YXMgbm90IHBhZ2UtYWxpZ25lZCkuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGRldGVjdGVkIGJ5IGxvY2t1cC93YXRjaGRvZyBkZXRlY3RvcnMgYW5kIEtBU0FOIChLZXJuZWxBZGRyZXNzU2FuaXRpemVyKSwgcmVzcGVjdGl2ZWx5LlxuXG5BbGwgYnVmZmVycyBpbnZvbHZlZCAodGhlIHN0YWNrLWFsbG9jYXRlZCBzdHJ1Y3QgZ3VwX3Rlc3QgYW5kIHRoZSBoZWFwLWFsbG9jYXRlZCBwYWdlcyBhcnJheSkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIHZpYSBjb3B5X2Zyb21fdXNlcigpIGFuZCBrdmNhbGxvYygpLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIHN0cnVjdCBwYWRkaW5nIGluZm8tbGVha3MsIG9yIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGludHJvZHVjZWQgb3IgbW9kaWZpZWQgYnkgdGhpcyBjaGFuZ2UuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA0YmI1ZmQyNDNjY2Q2ZWQ1MDZiM2QzZmM2OTM5MmU5N2FmNzExZTNiCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBTZXAgMTUgMTI6MjE6MzkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuYwppbmRleCAxODViYTNiYjhlZDEwLi5iYTc0YmYzZjQxMDQ4IDEwMDY0NAotLS0gYS9tbS9ndXBfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2d1cF90ZXN0LmMKQEAgLTExNiw3ICYjNDM7MTE2LDggQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsCiAJYm9vbCBuZWVkc19tbWFwX2xvY2sgPQogCQljbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLICZhbXA7JmFtcDsgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSzsKIAotCWlmIChndXAtJmd0O2FkZHIgJmd0OyBVTE9OR19NQVggfHwgZ3VwLSZndDtzaXplICZndDsgVUxPTkdfTUFYKQomIzQzOwlpZiAoZ3VwLSZndDthZGRyICZndDsgVUxPTkdfTUFYIHx8IGd1cC0mZ3Q7c2l6ZSAmZ3Q7IFVMT05HX01BWCB8fCAhZ3VwLSZndDtzaXplIHx8CiYjNDM7CSAgICAhZ3VwLSZndDtucl9wYWdlc19wZXJfY2FsbCB8fCAhUEFHRV9BTElHTkVEKGd1cC0mZ3Q7c2l6ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLSZndDthZGRyLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC0mZ3Q7c2l6ZSwgJmFtcDtlbmQpKQpAQCAtMTM5LDExICYjNDM7MTQwLDkgQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsCiAJCWlmIChuciAhPSBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsKQogCQkJYnJlYWs7CiAKJiM0MzsJCW5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7CiYjNDM7CiAJCW5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFOwotCQlpZiAobmV4dCAmZ3Q7IGVuZCkgewotCQkJbmV4dCA9IGVuZDsKLQkJCW5yID0gKG5leHQgLSBhZGRyKSAvIFBBR0VfU0laRTsKLQkJfQogCiAJCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjI5NgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDY3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGFuYWx5c2lzIG9mIHRoZSBzaXR1YXRpb246CgoqKktNU0FOIEZ1enppbmcgU2Vzc2lvbiBBc3Nlc3NtZW50KioKCk9rYXksIHNvIHRoZSB0YXNrIGF0IGhhbmQgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2ggbmVjZXNzaXRhdGVzIGl0cyBvd24sIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGZpcnN0IGluc3RpbmN0LCBhcyBhbHdheXMsIGlzIHRvIGRpdmUgaW50byB0aGUgY29kZS4gSSBuZWVkIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgdGhlIHBhdGNoJiMzOTtzIGltcGFjdC4gU3BlY2lmaWNhbGx5LCBJJiMzOTtsbCBzdGFydCBieSBpbnNwZWN0aW5nIHRoZSBwYXRjaCBpdHNlbGYsIGFuZCB0aGVuIEkmIzM5O2xsIHR1cm4gbXkgYXR0ZW50aW9uIHRvIGBtbS9ndXBfdGVzdC5jYCDigJMgdGhhdCBzZWVtcyBsaWtlIGEgbGlrZWx5IGFyZWEgdG8gZmluZCByZWxhdGVkIGNvZGUgb3IgY29udGV4dCwgZXNwZWNpYWxseSBnaXZlbiB0aGUgJiMzNDtndXAmIzM0OyBpbiB0aGUgZmlsZSBuYW1lLCBzdWdnZXN0aW5nIGludGVyYWN0aW9ucyB3aXRoIEdldCBVc2VyIFBhZ2VzLgoKVG8gZXhwZWRpdGUgdGhpcywgSSYjMzk7bGwgdXNlIGEgYHJlYWQtZmlsZWAgY29tbWFuZCwgemVyb2luZyBpbiBvbiB0aGUgcmVsZXZhbnQgc2VjdGlvbiBvZiBgbW0vZ3VwX3Rlc3QuY2Ag4oCTIEkmIzM5O2xsIHN0YXJ0IGFyb3VuZCBsaW5lIDExNi4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgaW5pdGlhbCB2aWV3IG9mIHRoZSBjb2RlIHN1cnJvdW5kaW5nIHRoZSBwYXRjaCYjMzk7cyBzY29wZS4gSSYjMzk7bSBsb29raW5nIGZvciBhbnl0aGluZyB0aGF0IHNjcmVhbXMgJiMzNDttZW1vcnkgc2FmZXR5LCYjMzQ7IHBvdGVudGlhbGx5IG5ldyBhbGxvY2F0aW9uIHNjaGVtZXMsIGNoYW5nZWQgcG9pbnRlciBhcml0aG1ldGljLCBvciBhbnkgY2hhbmdlcyB0byBob3cgdGhlIGtlcm5lbCBpbnRlcmFjdHMgd2l0aCB1c2VyLXNwYWNlIG1lbW9yeSDigJMgYWxsIHJlZCBmbGFncyB0aGF0IHdvdWxkIHB1c2ggbWUgdG93YXJkIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24uIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhhdCBhIGNhcmVmdWwgYXNzZXNzbWVudCBvZiB0aGlzIGNvZGUgaXMgdGhlIGtleSB0byBhbiBpbmZvcm1lZCBkZWNpc2lvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgOTA6XHRcdFx0XHRndXAtXHUwMDNld2hpY2hfcGFnZXNbaV0gPSAwO1xuICA5MTpcdFx0XHR9XG4gIDkyOlx0XHR9XG4gIDkzOlx0XG4gIDk0Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSYjNDM7JiM0MzspIHtcbiAgOTU6XHRcdFx0aW5kZXhfdG9fZHVtcCA9IGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXTtcbiAgOTY6XHRcbiAgOTc6XHRcdFx0aWYgKGluZGV4X3RvX2R1bXApIHtcbiAgOTg6XHRcdFx0XHRpbmRleF90b19kdW1wLS07IC8vIERlY29kZSBmcm9tIDEtYmFzZWQsIHRvIDAtYmFzZWRcbiAgOTk6XHRcdFx0XHRwcl9pbmZvKFwmIzM0Oy0tLS0gcGFnZSAjJXUsIHN0YXJ0aW5nIGZyb20gdXNlciB2aXJ0IGFkZHI6IDB4JWxseFxcblwmIzM0OyxcbiAxMDA6XHRcdFx0XHRcdGluZGV4X3RvX2R1bXAsIGd1cC1cdTAwM2VhZGRyKTtcbiAxMDE6XHRcdFx0XHRkdW1wX3BhZ2UocGFnZXNbaW5kZXhfdG9fZHVtcF0sXG4gMTAyOlx0XHRcdFx0XHQgIFwmIzM0O2d1cF90ZXN0OiBkdW1wX3BhZ2VzKCkgdGVzdFwmIzM0Oyk7XG4gMTAzOlx0XHRcdH1cbiAxMDQ6XHRcdH1cbiAxMDU6XHR9XG4gMTA2Olx0XG4gMTA3Olx0c3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXG4gMTA4Olx0XHRcdHN0cnVjdCBndXBfdGVzdCAqZ3VwKVxuIDEwOTpcdHtcbiAxMTA6XHRcdGt0aW1lX3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7XG4gMTExOlx0XHR1bnNpZ25lZCBsb25nIGksIG5yX3BhZ2VzLCBhZGRyLCBuZXh0O1xuIDExMjpcdFx0bG9uZyBucjtcbiAxMTM6XHRcdHN0cnVjdCBwYWdlICoqcGFnZXM7XG4gMTE0Olx0XHR1bnNpZ25lZCBsb25nIGVuZDtcbiAxMTU6XHRcdGludCByZXQgPSAwO1xuIDExNjpcdFx0Ym9vbCBuZWVkc19tbWFwX2xvY2sgPVxuIDExNzpcdFx0XHRjbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLIFx1MDAyNlx1MDAyNiBjbWQgIT0gUElOX0ZBU1RfQkVOQ0hNQVJLO1xuIDExODpcdFxuIDExOTpcdFx0aWYgKGd1cC1cdTAwM2VhZGRyIFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVx1MDAzZXNpemUgXHUwMDNlIFVMT05HX01BWCB8fCAhZ3VwLVx1MDAzZXNpemUgfHxcbiAxMjA6XHRcdCAgICAhZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsIHx8ICFQQUdFX0FMSUdORUQoZ3VwLVx1MDAzZXNpemUpKVxuIDEyMTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjI6XHRcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG4gMTIzOlx0XHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxuIDEyNDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjU6XHRcbiAxMjY6XHRcdG5yX3BhZ2VzID0gZ3VwLVx1MDAzZXNpemUgLyBQQUdFX1NJWkU7XG4gMTI3Olx0XHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XG4gMTI4Olx0XHRpZiAoIXBhZ2VzKVxuIDEyOTpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAxMzA6XHRcbiAxMzE6XHRcdGlmIChuZWVkc19tbWFwX2xvY2sgXHUwMDI2XHUwMDI2IG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKGN1cnJlbnQtXHUwMDNlbW0pKSB7XG4gMTMyOlx0XHRcdHJldCA9IC1FSU5UUjtcbiAxMzM6XHRcdFx0Z290byBmcmVlX3BhZ2VzO1xuIDEzNDpcdFx0fVxuIDEzNTpcdFxuIDEzNjpcdFx0aSA9IDA7XG4gMTM3Olx0XHRuciA9IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcbiAxMzg6XHRcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcbiAxMzk6XHRcdGZvciAoYWRkciA9IGd1cC1cdTAwM2VhZGRyOyBhZGRyIFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XG4gMTQwOlx0XHRcdGlmIChuciAhPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwpXG4gMTQxOlx0XHRcdFx0YnJlYWs7XG4gMTQyOlx0XG4gMTQzOlx0XHRcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XG4gMTQ0Olx0XG4gMTQ1Olx0XHRcdG5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFO1xuIDE0NjpcdFxuIDE0NzpcdFx0XHRzd2l0Y2ggKGNtZCkge1xuIDE0ODpcdFx0XHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcbiAxNDk6XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG4gMTUwOlx0XHRcdFx0XHRcdFx0IHBhZ2VzICYjNDM7IGkpO1xuIDE1MTpcdFx0XHRcdGJyZWFrO1xuIDE1MjpcdFx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxuIDE1MzpcdFx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICYjNDM7IGkpO1xuIDE1NDpcdFx0XHRcdGJyZWFrO1xuIDE1NTpcdFx0XHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcbiAxNTY6XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG4gMTU3Olx0XHRcdFx0XHRcdFx0IHBhZ2VzICYjNDM7IGkpO1xuIDE1ODpcdFx0XHRcdGJyZWFrO1xuIDE1OTpcdFx0XHRjYXNlIFBJTl9CQVNJQ19URVNUOlxuIDE2MDpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICYjNDM7IGkpO1xuIDE2MTpcdFx0XHRcdGJyZWFrO1xuIDE2MjpcdFx0XHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XG4gMTYzOlx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBucixcbiAxNjQ6XHRcdFx0XHRcdFx0ICAgIGd1cC1cdTAwM2VndXBfZmxhZ3MgfCBGT0xMX0xPTkdURVJNLFxuIDE2NTpcdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4gMTY2Olx0XHRcdFx0YnJlYWs7XG4gMTY3Olx0XHRcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XG4gMTY4Olx0XHRcdFx0aWYgKGd1cC1cdTAwM2V0ZXN0X2ZsYWdzIFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTilcbiAxNjk6XHRcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG4gMTcwOlx0XHRcdFx0XHRcdFx0ICAgIHBhZ2VzICYjNDM7IGkpO1xuIDE3MTpcdFx0XHRcdGVsc2VcbiAxNzI6XHRcdFx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG4gMTczOlx0XHRcdFx0XHRcdFx0ICAgIHBhZ2VzICYjNDM7IGkpO1xuIDE3NDpcdFx0XHRcdGJyZWFrO1xuIDE3NTpcdFx0XHRkZWZhdWx0OlxuIDE3NjpcdFx0XHRcdHJldCA9IC1FSU5WQUw7XG4gMTc3Olx0XHRcdFx0Z290byB1bmxvY2s7XG4gMTc4Olx0XHRcdH1cbiAxNzk6XHRcbiAxODA6XHRcdFx0aWYgKG5yIFx1MDAzYz0gMClcbiAxODE6XHRcdFx0XHRicmVhaztcbiAxODI6XHRcdFx0aSAmIzQzOz0gbnI7XG4gMTgzOlx0XHR9XG4gMTg0Olx0XHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xuIDE4NTpcdFxuIDE4NjpcdFx0LyogU2hpZnRpbmcgdGhlIG1lYW5pbmcgb2YgbnJfcGFnZXM6IG5vdyBpdCBpcyBhY3R1YWwgbnVtYmVyIHBpbm5lZDogKi9cbiAxODc6XHRcdG5yX3BhZ2VzID0gaTtcbiAxODg6XHRcbiAxODk6XHRcdGd1cC1cdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDI0NAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBpZiB0aGV5JiMzOTtyZSBteSBvd246CgoqKkRpdmluZyBpbnRvIGd1cF90ZXN0LmMgZm9yIERlZXBlciBVbmRlcnN0YW5kaW5nKioKClJpZ2h0LCBsZXQmIzM5O3Mgc2VlLi4uIEkgbmVlZCB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIGhvdyB0aGlzIGBndXBfdGVzdGAgaW9jdGwgYWN0dWFsbHkgZnVuY3Rpb25zLiBJJiMzOTttIGdvaW5nIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgY29kZSB3aXRoaW4gYG1tL2d1cF90ZXN0LmNgLiBUaGUgY29yZSBxdWVzdGlvbiBJJiMzOTttIHRyeWluZyB0byBhbnN3ZXIgaXMgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIGBndXBgIGZ1bmN0aW9uYWxpdHksIGFuZCBzcGVjaWZpY2FsbHksIHdoYXTigJlzIGdvaW5nIG9uIHdpdGggdGhlc2UgYHBhZ2VzYCB0aGV5JiMzOTtyZSBtZW50aW9uaW5nLiBJJiMzOTttIGhvcGluZyBieSBmb2xsb3dpbmcgdGhlIGV4ZWN1dGlvbiBwYXRoLCBJIGNhbiB1bmNvdmVyIHRoZSBkZXRhaWxzIG9mIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCB0aGUgbWVjaGFuaWNzIGJlaGluZCBgZ3VwX3Rlc3RgLiBJIGV4cGVjdCB0byBmaW5kIHNvbWUgaW50ZXJlc3RpbmcgY2FzZXMgd2hlcmUgYGd1cGAgaXMgYmVpbmcgdGVzdGVkIHdpdGggc29tZSBjb21wbGV4IHBhZ2UgbWFwcGluZ3MgYW5kIHNjZW5hcmlvcy4gSXQmIzM5O3MgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vZ3VwX3Rlc3QuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTkwOlx0XHRndXAtXHUwMDNlc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuIDE5MTpcdFxuIDE5MjpcdFx0LypcbiAxOTM6XHRcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxuIDE5NDpcdFx0ICogc3RhdGU6IHByaW50IGEgd2FybmluZyBpZiBhbnkgbm9uLWRtYS1waW5uZWQgcGFnZXMgYXJlIGZvdW5kOlxuIDE5NTpcdFx0ICovXG4gMTk2Olx0XHR2ZXJpZnlfZG1hX3Bpbm5lZChjbWQsIHBhZ2VzLCBucl9wYWdlcyk7XG4gMTk3Olx0XG4gMTk4Olx0XHRpZiAoY21kID09IERVTVBfVVNFUl9QQUdFU19URVNUKVxuIDE5OTpcdFx0XHRkdW1wX3BhZ2VzX3Rlc3QoZ3VwLCBwYWdlcywgbnJfcGFnZXMpO1xuIDIwMDpcdFxuIDIwMTpcdFx0c3RhcnRfdGltZSA9IGt0aW1lX2dldCgpO1xuIDIwMjpcdFxuIDIwMzpcdFx0cHV0X2JhY2tfcGFnZXMoY21kLCBwYWdlcywgbnJfcGFnZXMsIGd1cC1cdTAwM2V0ZXN0X2ZsYWdzKTtcbiAyMDQ6XHRcbiAyMDU6XHRcdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XG4gMjA2Olx0XHRndXAtXHUwMDNlcHV0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XG4gMjA3Olx0XG4gMjA4Olx0dW5sb2NrOlxuIDIwOTpcdFx0aWYgKG5lZWRzX21tYXBfbG9jaylcbiAyMTA6XHRcdFx0bW1hcF9yZWFkX3VubG9jayhjdXJyZW50LVx1MDAzZW1tKTtcbiAyMTE6XHRmcmVlX3BhZ2VzOlxuIDIxMjpcdFx0a3ZmcmVlKHBhZ2VzKTtcbiAyMTM6XHRcdHJldHVybiByZXQ7XG4gMjE0Olx0fVxuIDIxNTpcdFxuIDIxNjpcdHN0YXRpYyBpbmxpbmUgdm9pZCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdG9wKHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhKVxuIDIxNzpcdHtcbiAyMTg6XHRcdGlmIChkYXRhLVx1MDAzZWxvbmd0ZXJtX3BhZ2VzKSB7XG4gMjE5Olx0XHRcdGlmIChkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzKVxuIDIyMDpcdFx0XHRcdHVucGluX3VzZXJfcGFnZXMoZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcyxcbiAyMjE6XHRcdFx0XHRcdFx0IGRhdGEtXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMpO1xuIDIyMjpcdFx0XHRrdmZyZWUoZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcyk7XG4gMjIzOlx0XHRcdGRhdGEtXHUwMDNlbG9uZ3Rlcm1fcGFnZXMgPSBOVUxMO1xuIDIyNDpcdFx0XHRkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzID0gMDtcbiAyMjU6XHRcdH1cbiAyMjY6XHR9XG4gMjI3Olx0XG4gMjI4Olx0c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RhcnQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXG4gMjI5Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDIzMDpcdHtcbiAyMzE6XHRcdGxvbmcgbnJfcGFnZXMsIGN1cl9wYWdlcywgYWRkciwgcmVtYWluaW5nX3BhZ2VzO1xuIDIzMjpcdFx0aW50IGd1cF9mbGFncyA9IEZPTExfTE9OR1RFUk07XG4gMjMzOlx0XHRzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QgYXJncztcbiAyMzQ6XHRcdHN0cnVjdCBwYWdlICoqcGFnZXM7XG4gMjM1Olx0XHRpbnQgcmV0ID0gMDtcbiAyMzY6XHRcdGJvb2wgZmFzdDtcbiAyMzc6XHRcbiAyMzg6XHRcdGlmIChkYXRhLVx1MDAzZWxvbmd0ZXJtX3BhZ2VzKVxuIDIzOTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyNDA6XHRcbiAyNDE6XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZhcmdzLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihhcmdzKSkpXG4gMjQyOlx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDI0MzpcdFxuIDI0NDpcdFx0aWYgKGFyZ3MuZmxhZ3MgXHUwMDI2XG4gMjQ1Olx0XHQgICAgfihQSU5fTE9OR1RFUk1fVEVTVF9GTEFHX1VTRV9XUklURXxQSU5fTE9OR1RFUk1fVEVTVF9GTEFHX1VTRV9GQVNUKSlcbiAyNDY6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMjQ3Olx0XHRpZiAoIUlTX0FMSUdORUQoYXJncy5hZGRyIHwgYXJncy5zaXplLCBQQUdFX1NJWkUpKVxuIDI0ODpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyNDk6XHRcdGlmIChhcmdzLnNpemUgXHUwMDNlIExPTkdfTUFYKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NDIzCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OgoKKipJbnZlc3RpZ2F0aW5nIGBfX2d1cF90ZXN0X2lvY3RsYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB0aGUgY2FsbGVyIG9mIGBfX2d1cF90ZXN0X2lvY3RsYC4gSSBrbm93IHRoYXQgbmFtZSBpcyBmYW1pbGlhciwgYnV0IEkgbmVlZCB0byBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5IG9mIHdoZXJlIGl0JiMzOTtzIHVzZWQuIFNpbmNlIEkmIzM5O20gd29ya2luZyBpbiB0aGUga2VybmVsLCBhIGBncmVwYCBzaG91bGQgYmUgdGhlIHF1aWNrZXN0IHdheSB0byBmaW5kIGl0LiBBbHRlcm5hdGl2ZWx5LCBJIHNob3VsZCBiZSBhYmxlIHRvIGp1c3QgbG9vayBhcm91bmQgbGluZSAyNzAsIGlmIEkga25vdyB3aGVyZSB0aGF0IGlzIGluIHRoZSBjb2RlLiBJJiMzOTttIHByb2JhYmx5IGFmdGVyIHdoZXJlIHRoaXMgY2FsbCBpcyBtYWRlLCBhbmQgd2hhdCBjb2RlIHBhdGggbGVhZHMgdG8gdGhhdCBwb2ludC4gVGhpcyB3aWxsIGdpdmUgbWUgYW4gdW5kZXJzdGFuZGluZyBvZiBpdHMgcHVycG9zZSBhbmQgdXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI3MDpcdFxuIDI3MTpcdFx0d2hpbGUgKG5yX3BhZ2VzIC0gZGF0YS1cdTAwM2Vsb25ndGVybV9ucl9wYWdlcykge1xuIDI3MjpcdFx0XHRyZW1haW5pbmdfcGFnZXMgPSBucl9wYWdlcyAtIGRhdGEtXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXM7XG4gMjczOlx0XHRcdGFkZHIgPSBhcmdzLmFkZHIgJiM0MzsgZGF0YS1cdTAwM2Vsb25ndGVybV9ucl9wYWdlcyAqIFBBR0VfU0laRTtcbiAyNzQ6XHRcbiAyNzU6XHRcdFx0aWYgKGZhc3QpXG4gMjc2Olx0XHRcdFx0Y3VyX3BhZ2VzID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCByZW1haW5pbmdfcGFnZXMsXG4gMjc3Olx0XHRcdFx0XHRcdFx0XHRndXBfZmxhZ3MsIHBhZ2VzKTtcbiAyNzg6XHRcdFx0ZWxzZVxuIDI3OTpcdFx0XHRcdGN1cl9wYWdlcyA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIHJlbWFpbmluZ19wYWdlcyxcbiAyODA6XHRcdFx0XHRcdFx0XHQgICBndXBfZmxhZ3MsIHBhZ2VzKTtcbiAyODE6XHRcdFx0aWYgKGN1cl9wYWdlcyBcdTAwM2MgMCkge1xuIDI4MjpcdFx0XHRcdHBpbl9sb25ndGVybV90ZXN0X3N0b3AoZGF0YSk7XG4gMjgzOlx0XHRcdFx0cmV0ID0gY3VyX3BhZ2VzO1xuIDI4NDpcdFx0XHRcdGJyZWFrO1xuIDI4NTpcdFx0XHR9XG4gMjg2Olx0XHRcdGRhdGEtXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgJiM0Mzs9IGN1cl9wYWdlcztcbiAyODc6XHRcdFx0cGFnZXMgJiM0Mzs9IGN1cl9wYWdlcztcbiAyODg6XHRcdH1cbiAyODk6XHRcbiAyOTA6XHRcdGlmICghZmFzdClcbiAyOTE6XHRcdFx0bW1hcF9yZWFkX3VubG9jayhjdXJyZW50LVx1MDAzZW1tKTtcbiAyOTI6XHRcdHJldHVybiByZXQ7XG4gMjkzOlx0fVxuIDI5NDpcdFxuIDI5NTpcdHN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXG4gMjk2Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDI5NzpcdHtcbiAyOTg6XHRcdF9fdTY0IHVzZXJfYWRkcjtcbiAyOTk6XHRcdHVuc2lnbmVkIGxvbmcgaTtcbiAzMDA6XHRcbiAzMDE6XHRcdGlmICghZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcylcbiAzMDI6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzAzOlx0XG4gMzA0Olx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2dXNlcl9hZGRyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1c2VyX2FkZHIpKSlcbiAzMDU6XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gMzA2Olx0XG4gMzA3Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuIDMwODpcdFx0XHR2b2lkICphZGRyID0ga21hcF9sb2NhbF9wYWdlKGRhdGEtXHUwMDNlbG9uZ3Rlcm1fcGFnZXNbaV0pO1xuIDMwOTpcdFx0XHR1bnNpZ25lZCBsb25nIHJldDtcbiAzMTA6XHRcbiAzMTE6XHRcdFx0cmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXVzZXJfYWRkciwgYWRkcixcbiAzMTI6XHRcdFx0XHRcdCAgIFBBR0VfU0laRSk7XG4gMzEzOlx0XHRcdGt1bm1hcF9sb2NhbChhZGRyKTtcbiAzMTQ6XHRcdFx0aWYgKHJldClcbiAzMTU6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzMTY6XHRcdFx0dXNlcl9hZGRyICYjNDM7PSBQQUdFX1NJWkU7XG4gMzE3Olx0XHR9XG4gMzE4Olx0XHRyZXR1cm4gMDtcbiAzMTk6XHR9XG4gMzIwOlx0XG4gMzIxOlx0c3RhdGljIGxvbmcgcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxuIDMyMjpcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuIDMyMzpcdHtcbiAzMjQ6XHRcdHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhID0gZmlsZXAtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIDMyNTpcdFx0aW50IHJldCA9IC1FSU5WQUw7XG4gMzI2Olx0XG4gMzI3Olx0XHRpZiAobXV0ZXhfbG9ja19raWxsYWJsZShcdTAwMjZkYXRhLVx1MDAzZWxvbmd0ZXJtX211dGV4KSlcbiAzMjg6XHRcdFx0cmV0dXJuIC1FSU5UUjtcbiAzMjk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjUwNAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGEgc2Vhc29uZWQgcHJvZmVzc2lvbmFsIGluIHRoZSBmaWVsZCwgc3BlYWtpbmcgZGlyZWN0bHkgdG8geW91OgoKKipEaXZpbmcgRGVlcGVyIGludG8gYGd1cF90ZXN0X2lvY3RsYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eSBvZiB0aGlzIGBndXBfdGVzdF9pb2N0bGAgY29kZS4gVGhlIGluaXRpYWwgYXNzZXNzbWVudCBpcyB1c3VhbGx5IGp1c3QgdGhlIHRpcCBvZiB0aGUgaWNlYmVyZywgaXNuJiMzOTt0IGl0PyBNeSBtaW5kIGltbWVkaWF0ZWx5IHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbiYjMzk7cyBwdXJwb3NlIHdpdGhpbiB0aGUgbGFyZ2VyIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRleHQuIFdoYXQmIzM5O3MgaXQgZG9pbmc/IFdoYXQmIzM5O3MgaXQgKmludGVuZGVkKiB0byBkbz8gSSYjMzk7bSBhbHJlYWR5IGFudGljaXBhdGluZyB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdW5kZXJseWluZyBwYWdlIHRhYmxlcywgdGhlIHBvdGVudGlhbCBmb3IgbG9ja2luZyBpc3N1ZXMsIGFuZCB0aGUgd2F5cyB0aGlzIHRlc3QgbWlnaHQgdHJpZ2dlciBzcGVjaWZpYyBlZGdlIGNhc2VzIHdpdGhpbiB0aGUgR1VQIChHZXQgVXNlciBQYWdlKSBtZWNoYW5pc20uIAoKSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgYXJndW1lbnRzIGl0IHRha2VzIGFuZCBob3cgdGhleSBtYXAgdG8gc3BlY2lmaWMgbWVtb3J5IHJlZ2lvbnMsIHByb3RlY3Rpb24gZmxhZ3MsIG9yIGVycm9yIGNvbmRpdGlvbnMuIFdoYXQgYXJlIHRoZSBjb21tb24gZmFpbHVyZSBwYXRocywgYW5kIG1vcmUgaW1wb3J0YW50bHksIGhvdyBhcmUgdGhleSBiZWluZyBoYW5kbGVkPyBFcnJvciBoYW5kbGluZyBpcyBjcml0aWNhbCwgc28gSSYjMzk7bGwgYmUgbG9va2luZyBjbG9zZWx5IGF0IGhvdyBpdCBkZWFscyB3aXRoIGludmFsaWQgbWVtb3J5IGFkZHJlc3NlcywgcGVybWlzc2lvbnMgaXNzdWVzLCBhbmQgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGlzIHVzZWQgd2l0aGluIHRoZSBzeXN0ZW0gYW5kIHdoYXQgaXQgaGVscHMgdmFsaWRhdGUuIEkgd2lsbCBhbHNvIG1ha2Ugc29tZSBub3RlcyBvZiB3aGF0IHRvIGxvb2sgZm9yIGF0IG90aGVyIGxvY2F0aW9ucyBpbiB0aGUgc291cmNlLCB3aGVyZSBpdCBtaWdodCBiZSBjYWxsZWQgZnJvbSBhbmQgdGhlIGNvbnRleHRzIHRoZSBkYXRhIGZsb3dzLgoKTXkgZm9jdXMgbmFycm93cy4gT2theSwgbm93IGxldCYjMzk7cyBwdWxsIHVwIHRoZSBhY3R1YWwgc291cmNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDMzMDpcdFx0c3dpdGNoIChjbWQpIHtcbiAzMzE6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RBUlQ6XG4gMzMyOlx0XHRcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KGRhdGEsIGFyZyk7XG4gMzMzOlx0XHRcdGJyZWFrO1xuIDMzNDpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxuIDMzNTpcdFx0XHRwaW5fbG9uZ3Rlcm1fdGVzdF9zdG9wKGRhdGEpO1xuIDMzNjpcdFx0XHRyZXQgPSAwO1xuIDMzNzpcdFx0XHRicmVhaztcbiAzMzg6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcbiAzMzk6XHRcdFx0cmV0ID0gcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChkYXRhLCBhcmcpO1xuIDM0MDpcdFx0XHRicmVhaztcbiAzNDE6XHRcdH1cbiAzNDI6XHRcbiAzNDM6XHRcdG11dGV4X3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWxvbmd0ZXJtX211dGV4KTtcbiAzNDQ6XHRcdHJldHVybiByZXQ7XG4gMzQ1Olx0fVxuIDM0NjpcdFxuIDM0NzpcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcbiAzNDg6XHRcdFx0dW5zaWduZWQgbG9uZyBhcmcpXG4gMzQ5Olx0e1xuIDM1MDpcdFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcbiAzNTE6XHRcdGludCByZXQ7XG4gMzUyOlx0XG4gMzUzOlx0XHRzd2l0Y2ggKGNtZCkge1xuIDM1NDpcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4gMzU1Olx0XHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcbiAzNTY6XHRcdGNhc2UgUElOX0xPTkdURVJNX0JFTkNITUFSSzpcbiAzNTc6XHRcdGNhc2UgR1VQX0JBU0lDX1RFU1Q6XG4gMzU4Olx0XHRjYXNlIFBJTl9CQVNJQ19URVNUOlxuIDM1OTpcdFx0Y2FzZSBEVU1QX1VTRVJfUEFHRVNfVEVTVDpcbiAzNjA6XHRcdFx0YnJlYWs7XG4gMzYxOlx0XHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxuIDM2MjpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxuIDM2MzpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEOlxuIDM2NDpcdFx0XHRyZXR1cm4gcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoZmlsZXAsIGNtZCwgYXJnKTtcbiAzNjU6XHRcdGRlZmF1bHQ6XG4gMzY2Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDM2NzpcdFx0fVxuIDM2ODpcdFxuIDM2OTpcdFx0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNmd1cCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZ3VwKSkpXG4gMzcwOlx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDM3MTpcdFxuIDM3MjpcdFx0cmV0ID0gX19ndXBfdGVzdF9pb2N0bChjbWQsIFx1MDAyNmd1cCk7XG4gMzczOlx0XHRpZiAocmV0KVxuIDM3NDpcdFx0XHRyZXR1cm4gcmV0O1xuIDM3NTpcdFxuIDM3NjpcdFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFx1MDAyNmd1cCwgc2l6ZW9mKGd1cCkpKVxuIDM3NzpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzNzg6XHRcbiAzNzk6XHRcdHJldHVybiAwO1xuIDM4MDpcdH1cbiAzODE6XHRcbiAzODI6XHRzdGF0aWMgaW50IGd1cF90ZXN0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4gMzgzOlx0e1xuIDM4NDpcdFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XG4gMzg1Olx0XHRpbnQgcmV0O1xuIDM4NjpcdFxuIDM4NzpcdFx0ZGF0YSA9IGt6YWxsb2Nfb2JqKCpkYXRhKTtcbiAzODg6XHRcdGlmICghZGF0YSlcbiAzODk6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc2ODgKCQkJCQkJCW91dHB1dDogNDcKCQkJCQkJCXRob3VnaHRzOiAxODQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgR1VQIFRlc3QgSU9DVEwgUGF0Y2gqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBgZ3VwX3Rlc3QuY2AgcGF0Y2guIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB0cmFjZSB0aGUgZXhlY3V0aW9uIGZsb3cgYW5kIHBpbnBvaW50IHRoZSBwb3RlbnRpYWwgaXNzdWVzIHRoYXQgdGhpcyBmaXggYWRkcmVzc2VzLiBGaXJzdCwgSSYjMzk7bSBjaGVja2luZyB0aGUgY29uZGl0aW9ucyB0aGF0IGFyZSBub3cgYWRkZWQ6IGBndXAtJmd0O3NpemVgIG11c3QgYmUgbm9uLXplcm8sIGAhZ3VwLSZndDtucl9wYWdlc19wZXJfY2FsbGAgbXVzdCBiZSBub24temVybywgYW5kIGBndXAtJmd0O3NpemVgIG11c3QgYmUgcGFnZSBhbGlnbmVkLiBQcmV2aW91c2x5LCBvbmx5IGBndXAtJmd0O2FkZHJgIGFuZCBgZ3VwLSZndDtzaXplYCB3ZXJlIGNoZWNrZWQgdG8gYmUgd2l0aGluIHRoZSBgVUxPTkdfTUFYYCBsaW1pdC4KCk5vdyBJJiMzOTttIGZvY3VzaW5nIG9uIHRoZSBjb3JlIGxvb3AgbG9naWMuIFRoZSBvcmlnaW5hbCBjb2RlIGhhcyB0aGUgbG9vcCBgZm9yIChhZGRyID0gZ3VwLSZndDthZGRyOyBhZGRyICZsdDsgZW5kOyBhZGRyID0gbmV4dClgLiBJbnNpZGUgdGhlIGxvb3AsIGBucmAgc3RhcnRzIHdpdGggdGhlIGBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsYC4gVGhlIGNyaXRpY2FsIHBhcnQgc2VlbXMgdG8gYmUgaG93IGBuZXh0YCBhbmQgYG5yYCBhcmUgdXBkYXRlZCwgZXNwZWNpYWxseSBjb25zaWRlcmluZyB0aGUgaW50ZXJhY3Rpb24gd2l0aCBgZ2V0X3VzZXJfcGFnZXMoKWAuCgpJIGNhbiBzZWUgYSBwb3RlbnRpYWwgcHJvYmxlbSBpZiBgZ3VwLSZndDtzaXplYCBpc24mIzM5O3QgcGFnZS1hbGlnbmVkLiBGb3IgaW5zdGFuY2UsIGlmIGBndXAtJmd0O3NpemVgIGlzIDEsIGBucl9wYWdlc2AgYmVjb21lcyAwLiBUaGUgYGt2Y2FsbG9jYCBhbGxvY2F0ZXMgemVybyBwYWdlcywgYW5kIGBlbmRgIGJlY29tZXMgYGFkZHIgJiM0MzsgMWAuIElmIGBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsICZndDs9IDFgIHRoZW4gYG5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFYCwgaWYgYG5leHQgJmd0OyBlbmRgIHdlIHNldCBgbmV4dGAgdG8gYGVuZGAsIGFuZCBjYWxjdWxhdGUgYG5yID0gMGAuIFNvLCBpZiBgbnJgIHN0YXJ0cyBhdCAxLCBgZ2V0X3VzZXJfcGFnZXMoKWAgbWlnaHQgZ2V0IGNhbGxlZCB3aXRoIGBuciA9IDBgLiAgVGhpcyBzZWVtcyBiZW5pZ24sIGJ1dCBpdCBsb29rcyBsaWtlIHdlJiMzOTtyZSBwYXNzaW5nIGluIGFuIGludmFsaWQgYHBhZ2VzYCBhcnJheSwgYW5kIHBvdGVudGlhbGx5IGluIGxhdGVyIGl0ZXJhdGlvbnMgdGhpcyBtaWdodCByZXN1bHQgaW4gbWVtb3J5IGNvcnJ1cHRpb24gYnkgcGFzc2luZyB0aGUgd3JvbmcgcGFnZSBwb2ludGVyLgoKVGhlbiBJIGFtIHRoaW5raW5nLCB3aGF0IGlmIGBndXAtJmd0O3NpemUgPT0gMGA/IFRoZSBsb29wIHdvbiYjMzk7dCBydW4uIFRoYXQgc2VlbXMgZmluZS4gSG93ZXZlciwgd2hhdCBpZiBgZ3VwLSZndDtucl9wYWdlc19wZXJfY2FsbCA9PSAwYD8gSW5zaWRlIHRoZSBsb29wLCBpZiBgbnIgPT0gMGAsIHRoZSBjb21wYXJpc29uIGBuciAhPSBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsYCBiZWNvbWVzIGBmYWxzZWAuIEkgY2FuIHNlZSB0aGF0IGBuZXh0YCBzdGF5cyBgYWRkcmAsIGFuZCBgZ2V0X3VzZXJfcGFnZXNgIGNhbGxlZCB3aXRoIGBuciA9IDBgLiBBbmQgYnJlYWtzIHRoZSBsb29wLCB0aGF0IHNlZW1zIGZpbmUuCgpPa2F5LCBsZXQmIzM5O3MgdHJhY2Ugd2l0aCBhIHNsaWdodGx5IG1vcmUgY29tcGxleCBleGFtcGxlIG5vdy4gSWYgYGd1cC0mZ3Q7c2l6ZWAgaXMgNDA5NyAoYSBwYWdlIHBsdXMgMSBieXRlKSBhbmQgYGd1cC0mZ3Q7bnJfcGFnZXNfcGVyX2NhbGxgIGlzIDEsIHRoZSBjb2RlIGNhbGN1bGF0ZXMgYG5yX3BhZ2VzID0gMWAuICBgcGFnZXNgIGFsbG9jYXRlZCBjb3JyZWN0bHkgd2l0aCBzaXplIDEuIEluIHRoZSBmaXJzdCBpdGVyYXRpb24sIHdpdGggdGhlIG9yaWdpbmFsIGNvZGUsIGBuZXh0YCBiZWNvbWVzIGBhZGRyICYjNDM7IDQwOTZgLiBTaW5jZSBgbmV4dGAgaXMgbm90IGdyZWF0ZXIgdGhhbiBgZW5kYCwgYGdldF91c2VyX3BhZ2VzYCBnZXRzIGNhbGxlZCB3aXRoIGBuciA9IDFgLiBJbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgYGFkZHJgIGJlY29tZXMgYGFkZHIgJiM0MzsgNDA5NmAuIE5vdywgYGFkZHIgJmx0OyBlbmRgLCB0aGUgbG9vcCBjb250aW51ZXMuIGBuZXh0ID0gYWRkciAmIzQzOyA0MDk2YC4gSG93ZXZlciwgc2luY2UgYG5leHQgJmd0OyBlbmRgLCBgbmV4dCA9IGVuZGAsIGFuZCBgbnJgIGdldHMgc2V0IHRvIDAuIFNvLCBvbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgd2UgZW5kIHVwIGNhbGxpbmcgYGdldF91c2VyX3BhZ2VzKClgIHdpdGggYG5yID0gMGAgYnV0IGFjY2Vzc2luZyB0aGUgYHBhZ2VzYCBhcnJheSBhdCBpbmRleCBgMWAsIHNvIG91dCBvZiBib3VuZHMuCgpOb3cgdGhlIG5ldyBjb2RlIHdpdGggYG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7YC4gTGV0JiMzOTtzIHNlZSBob3cgdGhhdCBjaGFuZ2UgaGVscHMgdGhlIHByb2JsZW0uIE5vdywgaWYgdGhlIGBndXAtJmd0O3NpemVgIGlzIG5vdCBwYWdlIGFsaWduZWQgYW5kIHdlIG9ubHkgaGF2ZSBvbmUgcGFnZSAoZS5nLiA0MDk3KSwgdGhlIG5ldyBjb2RlIG1ha2VzIHN1cmUgdGhhdCBvbiB0aGUgbGFzdCBpdGVyYXRpb24sIGl0IHVzZXMgYSBwYXJ0aWFsIHBhZ2UuIFRoZSBtb3N0IGltcG9ydGFudCBkaWZmZXJlbmNlIG5vdyBpcyB0aGF0IHdlIGFyZSBsaW1pdGluZyBgbnJgIHRvIHRoZSBzaXplIG9mIHRoZSByZW1haW5pbmcgcGFnZXMuCgpUaGUgb3JpZ2luYWwgY29kZSYjMzk7cyBsb2dpYyBvZiB1cGRhdGluZyBgbnJgIGxvb2tzIHdyb25nLiBJZiB0aGUgcmVtYWluaW5nIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZSwgaXQgY291bGQgcmVzdWx0IGluIG91dC1vZi1ib3VuZHMgYWNjZXNzIHRvIHRoZSBgcGFnZXNgIGFycmF5LCBhbmQgcG90ZW50aWFsbHkgY2F1c2luZyBhIHdyaXRlIHRvIGluY29ycmVjdCBtZW1vcnkgYWRkcmVzc2VzLiBUaGUgbmV3IGxpbmUgYG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7YCBlbGVnYW50bHkgc29sdmVzIHRoaXMgYnkgZW5zdXJpbmcgYG5yYCBpcyB0aGUgbWluaW11bSBiZXR3ZWVuIHRoZSByZXF1ZXN0ZWQgcGFnZXMgcGVyIGNhbGwgYW5kIGhvdyBtYW55IHdob2xlIHBhZ2VzIGFyZSBsZWZ0LgoKSSBuZWVkIHRvIGNvbmZpcm0gYnkgc2VhcmNoaW5nIHRoZSBnaXQgbG9nIGZvciBhIHNpbWlsYXIgZml4LiBUaGlzIHBhdGNoIGNvcnJlY3RseSBoYW5kbGVzIGNhc2VzIHdoZXJlIGBndXAtJmd0O3NpemVgIGlzIG5vdCBwYWdlLWFsaWduZWQsIGBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsYCBpcyB6ZXJvLCBhbmQgcG90ZW50aWFsIGZvciBtZW1vcnkgZXJyb3JzIHJlbGF0ZWQgdG8gdW5kZXItYWxsb2NhdGlvbgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21pbl90XFwodW5zaWduZWQgbG9uZywgbnIsIFxcKGVuZCAtIGFkZHJcXCkgLyBQQUdFX1NJWkVcXCkmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmM9MTA3PXN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuLS1cbm1tL2d1cF90ZXN0LmMtMTQyLVxubW0vZ3VwX3Rlc3QuYzoxNDM6XHRcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XG5tbS9ndXBfdGVzdC5jLTE0NC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA3MDgKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxMDc0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgR1VQIFRlc3QgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QgdGhvdWdodCwgSSYjMzk7ZCB1c3VhbGx5IGNoZWNrIHRoZSBjb21taXQgaGlzdG9yeSB3aXRoIGBnaXQgbG9nYCwgYnV0IHdlIGRvbiYjMzk7dCBoYXZlIHRoYXQgdG9vbCBoYW5keS4gTm8gcHJvYmxlbS4gV2UmIzM5O2xsIGdvIHJpZ2h0IGludG8gdGhlIHBhdGNoIGl0c2VsZiBhbmQgc2VlIHdoYXQmIzM5O3MgY2hhbmdlZC4gVGhlIHByaW1hcnkgZm9jdXMgaGVyZSBpcyBvbiB1bmRlcnN0YW5kaW5nIHRoZSBpbnRlcmFjdGlvbiBvZiB0aGlzIGNvZGUgd2l0aCBLQVNBTiBhbmQgS01TQU4sIHNvIHdlIG5lZWQgdG8gYmUgbWV0aWN1bG91cy4KCkxvb2tpbmcgYXQgdGhlIGRpZmYsIGl0JiMzOTtzIGNsZWFyIHRoZSBwYXRjaCBwcmltYXJpbHkgZm9jdXNlcyBvbiBgbW0vZ3VwX3Rlc3QuY2AgYW5kIHNwZWNpZmljYWxseSB0aGUgYF9fZ3VwX3Rlc3RfaW9jdGxgIGZ1bmN0aW9uLiBUaGUgZmlyc3QgcGFydCBpbnRyb2R1Y2VzIHNvbWUgY3J1Y2lhbCB2YWxpZGF0aW9uIGNoZWNrcy4gV2UmIzM5O3JlIG5vdyB2YWxpZGF0aW5nIGBndXAtJmd0O3NpemVgLCBtYWtpbmcgc3VyZSBpdCYjMzk7cyBub24temVybywgdGhhdCBgZ3VwLSZndDtucl9wYWdlc19wZXJfY2FsbGAgaXMgYWxzbyBub24temVybyBhbmQgdGhhdCBgZ3VwLSZndDtzaXplYCBpcyBwYWdlLWFsaWduZWQuIFRoYXQmIzM5O3MgZ29vZCwgaXQgdGlnaHRlbnMgdXAgdGhlIGlucHV0IGFzc3VtcHRpb25zLgoKVGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBwYXRjaCBjbGVhbnMgdXAgYSBjYWxjdWxhdGlvbiBpbnZvbHZpbmcgYG5yYCBhbmQgYG5leHRgLCBzcGVjaWZpY2FsbHk6IEl0IGFkanVzdHMgdGhlIGNhbGN1bGF0aW9uIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhbGN1bGF0ZWQgYG5leHRgIHdvdWxkIGhhdmUgZXhjZWVkZWQgdGhlIGBlbmRgIHZhbHVlLCBpdCBjb3JyZWN0cyB0aGUgY2FsY3VsYXRpb24gbG9naWMsIGFuZCBpdCB3aWxsIG5vdyBlbnN1cmUgdGhhdCB0aGVzZSB2YWx1ZXMgYXJlIG1vcmUgcHJlY2lzZS4gVGhlIGltcHJvdmVkIGZvcm11bGEgbG9va3MgbW9yZSByb2J1c3QuIFdpdGggdGhlIHNpemUgbm93IGd1YXJhbnRlZWQgdG8gYmUgcGFnZS1hbGlnbmVkIGFuZCBub24temVybywgdGhpcyBzaW1wbGlmaWVkIGNhbGN1bGF0aW9uIGlzIG5vdyBhbHNvIGV4YWN0LCBtYWtpbmcgdGhlIGNvZGUgbW9yZSByZWxpYWJsZS4KCk5vdywgdGhlIGltcG9ydGFudCBwYXJ0OiBEb2VzIHRoaXMgdG91Y2ggdW5pbml0aWFsaXplZCBtZW1vcnk/IE5vLCBhbmQgZG9lcyBpdCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5IGFueSBzdHJ1Y3QgY29waWVkIHRvIHVzZXJzcGFjZSB0aGF0IGNvdWxkIGhhdmUgdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIGZpZWxkcz8gTGV0JiMzOTtzIGNoZWNrLiAgSSBuZWVkIHRvIGNoZWNrIGhvdyB0aGUgYGd1cGAgc3RydWN0IGlzIGhhbmRsZWQuICBBaGEhICBJIHNlZSB0aGUgYGNvcHlfZnJvbV91c2VyYCBhbmQgYGNvcHlfdG9fdXNlcmAgY2FsbHMgd2l0aGluIGBndXBfdGVzdF9pb2N0bGAuIFRoZSBjb2RlICpjb3BpZXMqIGBndXBgIGZyb20gdXNlcnNwYWNlLCB3aGljaCBtZWFucyBhbGwgYnl0ZXMgKGluY2x1ZGluZyBhbnkgcGFkZGluZykgYXJlIGluaXRpYWxpemVkIGZyb20gdXNlcnNwYWNlICpiZWZvcmUqIHRoZSBmdW5jdGlvbiBpcyBldmVuIGVudGVyZWQuICBUaGlzIGlzIGEgY3JpdGljYWwgcG9pbnQgZnJvbSBhIHNlY3VyaXR5IGFuZCBtZW1vcnkgc2FmZXR5IHBlcnNwZWN0aXZlLiBGdXJ0aGVybW9yZSwgaW4gdGhlIGhhcHB5IHBhdGggKHdoZW4gdGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIHdpdGggdGhlIGdvb2QgcmV0dXJuKSwgdGhlIHJlc3VsdHMgYXJlIGNvcGllZCBiYWNrLiBUaGUga2V5IGlzLCB0aGF0IGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgYW4gZXJyb3IsIHRoZW4gdGhlcmUgaXMgbm8gYGNvcHlfdG9fdXNlcmAgY2FsbCwgd2hpY2ggaXMgYWxzbyBpbXBvcnRhbnQuIFRoZSBhZGRlZCBpbnB1dCB2YWxpZGF0aW9ucyBlYXJsaWVyIHNob3VsZCBwcmV2ZW50IHRoZSBzaXR1YXRpb24uIFRoaXMgaGVscHMgZW5zdXJlIHRoYXQgdGhlIGBndXBgIHN0cnVjdCBpcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgYW5kIGFueSBjaGFuZ2VzIG1hZGUgZHVyaW5nIHRoZSBgX19ndXBfdGVzdF9pb2N0bGAgZXhlY3V0aW9uIGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHVzZXItc3BhY2UuCgpMZXQmIzM5O3MgZG8gYSBxdWljayBzY2FuIG9mIGFsbCBhY2Nlc3NlcyB0byBgZ3VwYCBpbiB0aGUgZmlsZSBqdXN0IHRvIGJlIGV4dHJhIHN1cmUsIGJ1dCBJJiMzOTttIGZlZWxpbmcgY29uZmlkZW50IGFib3V0IHRoaXMgcGF0Y2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2d1cC1cdTAwM2UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmM9NzY9c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuLS1cbm1tL2d1cF90ZXN0LmMtODYtXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSYjNDM7JiM0MzspIHtcbm1tL2d1cF90ZXN0LmM6ODc6XHRcdGlmIChndXAtXHUwMDNld2hpY2hfcGFnZXNbaV0gXHUwMDNlIG5yX3BhZ2VzKSB7XG5tbS9ndXBfdGVzdC5jLTg4LVx0XHRcdHByX3dhcm4oXCYjMzQ7WkVST0lORyBkdWUgdG8gb3V0IG9mIHJhbmdlOiAud2hpY2hfcGFnZXNbJXVdOiAldVxcblwmIzM0Oyxcbm1tL2d1cF90ZXN0LmM6ODk6XHRcdFx0XHRpLCBndXAtXHUwMDNld2hpY2hfcGFnZXNbaV0pO1xubW0vZ3VwX3Rlc3QuYzo5MDpcdFx0XHRndXAtXHUwMDNld2hpY2hfcGFnZXNbaV0gPSAwO1xubW0vZ3VwX3Rlc3QuYy05MS1cdFx0fVxuLS1cbm1tL2d1cF90ZXN0LmMtOTQtXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSYjNDM7JiM0MzspIHtcbm1tL2d1cF90ZXN0LmM6OTU6XHRcdGluZGV4X3RvX2R1bXAgPSBndXAtXHUwMDNld2hpY2hfcGFnZXNbaV07XG5tbS9ndXBfdGVzdC5jLTk2LVxuLS1cbm1tL2d1cF90ZXN0LmMtOTktXHRcdFx0cHJfaW5mbyhcJiMzNDstLS0tIHBhZ2UgIyV1LCBzdGFydGluZyBmcm9tIHVzZXIgdmlydCBhZGRyOiAweCVsbHhcXG5cJiMzNDssXG5tbS9ndXBfdGVzdC5jOjEwMDpcdFx0XHRcdGluZGV4X3RvX2R1bXAsIGd1cC1cdTAwM2VhZGRyKTtcbm1tL2d1cF90ZXN0LmMtMTAxLVx0XHRcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcbi0tXG5tbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbi0tXG5tbS9ndXBfdGVzdC5jLTExOC1cbm1tL2d1cF90ZXN0LmM6MTE5Olx0aWYgKGd1cC1cdTAwM2VhZGRyIFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVx1MDAzZXNpemUgXHUwMDNlIFVMT05HX01BWCB8fCAhZ3VwLVx1MDAzZXNpemUgfHxcbm1tL2d1cF90ZXN0LmM6MTIwOlx0ICAgICFndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgfHwgIVBBR0VfQUxJR05FRChndXAtXHUwMDNlc2l6ZSkpXG5tbS9ndXBfdGVzdC5jLTEyMS1cdFx0cmV0dXJuIC1FSU5WQUw7XG5tbS9ndXBfdGVzdC5jOjEyMjpcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG5tbS9ndXBfdGVzdC5jOjEyMzpcdFx0XHQgICAgICAgKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZXNpemUsIFx1MDAyNmVuZCkpXG5tbS9ndXBfdGVzdC5jLTEyNC1cdFx0cmV0dXJuIC1FSU5WQUw7XG5tbS9ndXBfdGVzdC5jLTEyNS1cbm1tL2d1cF90ZXN0LmM6MTI2Olx0bnJfcGFnZXMgPSBndXAtXHUwMDNlc2l6ZSAvIFBBR0VfU0laRTtcbm1tL2d1cF90ZXN0LmMtMTI3LVx0cGFnZXMgPSBrdmNhbGxvYyhucl9wYWdlcywgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpO1xuLS1cbm1tL2d1cF90ZXN0LmMtMTM2LVx0aSA9IDA7XG5tbS9ndXBfdGVzdC5jOjEzNzpcdG5yID0gZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsO1xubW0vZ3VwX3Rlc3QuYy0xMzgtXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XG5tbS9ndXBfdGVzdC5jOjEzOTpcdGZvciAoYWRkciA9IGd1cC1cdTAwM2VhZGRyOyBhZGRyIFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XG5tbS9ndXBfdGVzdC5jOjE0MDpcdFx0aWYgKG5yICE9IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbClcbm1tL2d1cF90ZXN0LmMtMTQxLVx0XHRcdGJyZWFrO1xuLS1cbm1tL2d1cF90ZXN0LmMtMTQ4LVx0XHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcbm1tL2d1cF90ZXN0LmM6MTQ5Olx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbm1tL2d1cF90ZXN0LmMtMTUwLVx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbi0tXG5tbS9ndXBfdGVzdC5jLTE1Mi1cdFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcbm1tL2d1cF90ZXN0LmM6MTUzOlx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICYjNDM7IGkpO1xubW0vZ3VwX3Rlc3QuYy0xNTQtXHRcdFx0YnJlYWs7XG5tbS9ndXBfdGVzdC5jLTE1NS1cdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG5tbS9ndXBfdGVzdC5jOjE1NjpcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG5tbS9ndXBfdGVzdC5jLTE1Ny1cdFx0XHRcdFx0XHQgcGFnZXMgJiM0MzsgaSk7XG4tLVxubW0vZ3VwX3Rlc3QuYy0xNTktXHRcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XG5tbS9ndXBfdGVzdC5jOjE2MDpcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbm1tL2d1cF90ZXN0LmMtMTYxLVx0XHRcdGJyZWFrO1xuLS1cbm1tL2d1cF90ZXN0LmMtMTYzLVx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXG5tbS9ndXBfdGVzdC5jOjE2NDpcdFx0XHRcdFx0ICAgIGd1cC1cdTAwM2VndXBfZmxhZ3MgfCBGT0xMX0xPTkdURVJNLFxubW0vZ3VwX3Rlc3QuYy0xNjUtXHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbi0tXG5tbS9ndXBfdGVzdC5jLTE2Ny1cdFx0Y2FzZSBEVU1QX1VTRVJfUEFHRVNfVEVTVDpcbm1tL2d1cF90ZXN0LmM6MTY4Olx0XHRcdGlmIChndXAtXHUwMDNldGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXG5tbS9ndXBfdGVzdC5jOjE2OTpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG5tbS9ndXBfdGVzdC5jLTE3MC1cdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG5tbS9ndXBfdGVzdC5jLTE3MS1cdFx0XHRlbHNlXG5tbS9ndXBfdGVzdC5jOjE3MjpcdFx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG5tbS9ndXBfdGVzdC5jLTE3My1cdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4tLVxubW0vZ3VwX3Rlc3QuYy0xODgtXG5tbS9ndXBfdGVzdC5jOjE4OTpcdGd1cC1cdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcbm1tL2d1cF90ZXN0LmM6MTkwOlx0Z3VwLVx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcbm1tL2d1cF90ZXN0LmMtMTkxLVxuLS1cbm1tL2d1cF90ZXN0LmMtMjAyLVxubW0vZ3VwX3Rlc3QuYzoyMDM6XHRwdXRfYmFja19wYWdlcyhjbWQsIHBhZ2VzLCBucl9wYWdlcywgZ3VwLVx1MDAzZXRlc3RfZmxhZ3MpO1xubW0vZ3VwX3Rlc3QuYy0yMDQtXG5tbS9ndXBfdGVzdC5jLTIwNS1cdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XG5tbS9ndXBfdGVzdC5jOjIwNjpcdGd1cC1cdTAwM2VwdXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcbm1tL2d1cF90ZXN0LmMtMjA3LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDA5MwoJCQkJCQkJb3V0cHV0OiAyNDMKCQkJCQkJCXRob3VnaHRzOiAxNTEwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIFJlYXNvbmluZzogTmVlZHNLTVNBTiA9IGZhbHNlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoZSBwYXRjaCBpbiBxdWVzdGlvbiBzaWduaWZpY2FudGx5IHN0cmVuZ3RoZW5zIHRoZSBgZ3VwX3Rlc3RgIGlvY3RsIGhhbmRsZXIuIE15IGFzc2Vzc21lbnQgaXMgdGhhdCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgIGhlcmUuCgpUaGUgcGF0Y2ggaXRzZWxmIGZvY3VzZXMgb24gaW5wdXQgdmFsaWRhdGlvbiBhbmQgbG9vcCBjYWxjdWxhdGlvbiBjb3JyZWN0aW9ucy4gU3BlY2lmaWNhbGx5OiBpdCBhZGRzIGNoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgaW5wdXQgYGd1cC0mZ3Q7c2l6ZWAgYW5kIGBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsYCBhcmUgdmFsaWQgdmFsdWVzIChwb3NpdGl2ZSwgbm90IGV4Y2VlZGluZyBgVUxPTkdfTUFYYCwgYW5kIGBndXAtJmd0O3NpemVgIGlzIHBhZ2UtYWxpZ25lZCkuIEl0IGFsc28gbW9kaWZpZXMgdGhlIGxvb3AgY2FsY3VsYXRpb24gdG8gdXNlIGBtaW5fdGAgd2hpY2ggc2ltcGxpZmllcyB0aGUgY2FsY3VsYXRpb25zLCBwcmV2ZW50aW5nIG91dC1vZi1ib3VuZHMgYWNjZXNzLgoKQmVmb3JlIHRoZSBwYXRjaCwgYSB6ZXJvIG9yIHVuYWxpZ25lZCBgZ3VwLSZndDtzaXplYCBvciBhIHplcm8gYGd1cC0mZ3Q7bnJfcGFnZXNfcGVyX2NhbGxgIHdvdWxkIGxlYWQgdG8gZWl0aGVyIGluZmluaXRlIGxvb3BzIChiZWNhdXNlIHRoZSBsb29wIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiB3b3VsZCBuZXZlciBiZSBtZXQpIG9yIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIGluIHRoZSBgcGFnZXNgIGFycmF5IGR1ZSB0byBpbmNvcnJlY3QgbG9vcCBpdGVyYXRpb24uCgpOb3csIGxldCYjMzk7cyBleGFtaW5lIHRoZSBLTVNBTiBjcml0ZXJpYToKCjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZToqKiBOb3BlLiBUaGUgaW9jdGwgY29waWVzICpmcm9tKiB1c2Vyc3BhY2UgKnRvKiB0aGUga2VybmVsLCBpbml0aWFsaXppbmcgdGhlIGBndXBgIHN0cnVjdC4gVGhlcmUmIzM5O3Mgbm8gZGF0YSBiZWluZyBzZW50ICp0byogdXNlcnNwYWNlIHRoYXQgY291bGQgaGF2ZSB1bmluaXRpYWxpemVkIG1lbW9yeS4KMi4gICoqQ29uZGl0aW9uYWwgbG9naWMgb24gdW5pbml0aWFsaXplZCBkYXRhOioqIE5vLiBBbGwgdmFyaWFibGVzLCBpbmNsdWRpbmcgdGhlIGBndXBgIHN0cnVjdCwgYW5kIGxvY2FsIHZhcmlhYmxlcyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGFyZSBpbml0aWFsaXplZC4gYGt2Y2FsbG9jYCB6ZXJvLWluaXRpYWxpemVzIHRoZSBgcGFnZXNgIGFycmF5LCBhbmQgYGNvcHlfZnJvbV91c2VyYCBwb3B1bGF0ZXMgdGhlIHVzZXItc3VwcGxpZWQgdmFsdWVzLiBUaGUgbG9naWMgbm93ICpwcmV2ZW50cyogaXNzdWVzLCByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyB0aGVtLgozLiAgKipDb21wbGV4IGRhdGEgc3RydWN0dXJlIGFsbG9jYXRpb24vaW5pdGlhbGl6YXRpb246KiogIGBrdmNhbGxvY2AgaXMgdXNlZCB0byBhbGxvY2F0ZSB0aGUgYHBhZ2VzYCBhcnJheSB3aGljaCBpcyB6ZXJvLWluaXRpYWxpemVkIGFuZCB0aGVuIHBvcHVsYXRlZCwgYXMgd2VsbCBhcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYGd1cGAgZnJvbSB0aGUgdXNlcnNwYWNlIGJ1ZmZlci4gTm8gdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIHJlYWQgaW4gcmVhY2hhYmxlIGNvZGUuCjQuICAqKkJvdW5kcyBjaGVja3MgYWZmZWN0aW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXM6KiogVGhlIHBhdGNoIGZpeGVzIGJvdW5kcyBjaGVja3MgaW4gdGhlIGxvb3AgY2FsY3VsYXRpb24gdG8gcHJldmVudCBhY2Nlc3NpbmcgbWVtb3J5IG91dHNpZGUgb2YgdGhlIGFsbG9jYXRlZCBgcGFnZXNgIGFycmF5LCBzbyBpdCByZWR1Y2VzLCByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZywgcmlzayBvZiB1bmluaXRpYWxpemVkIGFjY2Vzcy4KClRoZSBtYWluIHJpc2tzIGFkZHJlc3NlZCBieSB0aGUgcGF0Y2ggYXJlIGFjdHVhbGx5IG91dC1vZi1ib3VuZHMgYXJyYXkgYWNjZXNzIChLQVNBTikgYW5kIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wcyBvciBzb2Z0bG9ja3VwcyAoZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIG1lY2hhbmlzbXMpLiBUaGVzZSBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5IGV4aXN0aW5nIGtlcm5lbCBkZWJ1Z2dlcnMuIFRoZXJlJiMzOTtzIG5vIGV2aWRlbmNlIG9mIG5ldyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIFRodXMsIGBOZWVkc0tNU0FOID0gZmFsc2VgLiBJJiMzOTttIGNvbmZpZGVudCBpbiB0aGlzIGFzc2Vzc21lbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1tL2d1cF90ZXN0LmMgdG8gYWRkIGlucHV0IHBhcmFtZXRlciB2YWxpZGF0aW9uIChjaGVja2luZyB0aGF0IGd1cC1cdTAwM2VzaXplIGlzIG5vbi16ZXJvIGFuZCBQQUdFX0FMSUdORUQsIGFuZCB0aGF0IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcblxuVGhlIGlzc3VlcyBhZGRyZXNzZWQgYnkgdGhpcyBwYXRjaCBhcmUgaW5maW5pdGUgbG9vcHMgKHdoZW4gbnJfcGFnZXNfcGVyX2NhbGwgaXMgMCkgYW5kIG91dC1vZi1ib3VuZHMgYnVmZmVyIGluZGV4aW5nIG9uIHRoZSBgcGFnZXNgIGFycmF5ICh3aGVuIGd1cC1cdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXG5cbkFsbCBidWZmZXJzIGludm9sdmVkICh0aGUgc3RhY2stYWxsb2NhdGVkIHN0cnVjdCBndXBfdGVzdCBhbmQgdGhlIGhlYXAtYWxsb2NhdGVkIHBhZ2VzIGFycmF5KSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGNvcHlfZnJvbV91c2VyKCkgYW5kIGt2Y2FsbG9jKCkuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgc3RydWN0IHBhZGRpbmcgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGlzIGNoYW5nZS4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1tL2d1cF90ZXN0LmMgdG8gYWRkIGlucHV0IHBhcmFtZXRlciB2YWxpZGF0aW9uIChjaGVja2luZyB0aGF0IGd1cC1cdTAwM2VzaXplIGlzIG5vbi16ZXJvIGFuZCBQQUdFX0FMSUdORUQsIGFuZCB0aGF0IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcblxuVGhlIGlzc3VlcyBhZGRyZXNzZWQgYnkgdGhpcyBwYXRjaCBhcmUgaW5maW5pdGUgbG9vcHMgKHdoZW4gbnJfcGFnZXNfcGVyX2NhbGwgaXMgMCkgYW5kIG91dC1vZi1ib3VuZHMgYnVmZmVyIGluZGV4aW5nIG9uIHRoZSBgcGFnZXNgIGFycmF5ICh3aGVuIGd1cC1cdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXG5cbkFsbCBidWZmZXJzIGludm9sdmVkICh0aGUgc3RhY2stYWxsb2NhdGVkIHN0cnVjdCBndXBfdGVzdCBhbmQgdGhlIGhlYXAtYWxsb2NhdGVkIHBhZ2VzIGFycmF5KSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGNvcHlfZnJvbV91c2VyKCkgYW5kIGt2Y2FsbG9jKCkuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgc3RydWN0IHBhZGRpbmcgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGlzIGNoYW5nZS4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjE6MzkuNzU3ODI4ODA5WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUwODc0OTE0NzYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkdVUF9URVNUXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fZ3VwX3Rlc3RfaW9jdGxcIixcbiAgICBcImd1cF90ZXN0X2lvY3RsXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBtbS9ndXBfdGVzdC5jIHRvIGFkZCBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAoY2hlY2tpbmcgdGhhdCBndXAtXFx1MDAzZXNpemUgaXMgbm9uLXplcm8gYW5kIFBBR0VfQUxJR05FRCwgYW5kIHRoYXQgZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcXG5cXG5UaGUgaXNzdWVzIGFkZHJlc3NlZCBieSB0aGlzIHBhdGNoIGFyZSBpbmZpbml0ZSBsb29wcyAod2hlbiBucl9wYWdlc19wZXJfY2FsbCBpcyAwKSBhbmQgb3V0LW9mLWJvdW5kcyBidWZmZXIgaW5kZXhpbmcgb24gdGhlIGBwYWdlc2AgYXJyYXkgKHdoZW4gZ3VwLVxcdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXFxuXFxuQWxsIGJ1ZmZlcnMgaW52b2x2ZWQgKHRoZSBzdGFjay1hbGxvY2F0ZWQgc3RydWN0IGd1cF90ZXN0IGFuZCB0aGUgaGVhcC1hbGxvY2F0ZWQgcGFnZXMgYXJyYXkpIGFyZSBmdWxseSBpbml0aWFsaXplZCB2aWEgY29weV9mcm9tX3VzZXIoKSBhbmQga3ZjYWxsb2MoKS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBzdHJ1Y3QgcGFkZGluZyBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoaXMgY2hhbmdlLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGlucHV0IHZhbGlkYXRpb24gY2hlY2tzIGFuZCBpdGVyYXRpb24gbG9naWMgZm9yIHBhZ2UgcGlubmluZyBhbmQgZ2V0X3VzZXJfcGFnZXMgbG9vcHMgaW4gX19ndXBfdGVzdF9pb2N0bCgpIChtbS9ndXBfdGVzdC5jKS4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW9jdGxzIG9uIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIGJvdW5kYXJ5IGNvbmRpdGlvbiBoYW5kbGluZyBhbmQgcG90ZW50aWFsIHJlZ3Jlc3Npb25zIGluIHBhZ2UgcmFuZ2UgaGFuZGxpbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIxOjM5Ljc1NzgzMTg3OVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDE2ODUzOTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNGJiNWZkMjQzY2NkNmVkNTA2YjNkM2ZjNjkzOTJlOTdhZjcxMWUzYlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIFNlcCAxNSAxMjoyMTozOSAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xcbmluZGV4IDE4NWJhM2JiOGVkMTAuLmJhNzRiZjNmNDEwNDggMTAwNjQ0XFxuLS0tIGEvbW0vZ3VwX3Rlc3QuY1xcbisrKyBiL21tL2d1cF90ZXN0LmNcXG5AQCAtMTE2LDcgKzExNiw4IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxcbiBcXHRib29sIG5lZWRzX21tYXBfbG9jayA9XFxuIFxcdFxcdGNtZCAhPSBHVVBfRkFTVF9CRU5DSE1BUksgXFx1MDAyNlxcdTAwMjYgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSztcXG4gXFxuLVxcdGlmIChndXAtXFx1MDAzZWFkZHIgXFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVxcdTAwM2VzaXplIFxcdTAwM2UgVUxPTkdfTUFYKVxcbitcXHRpZiAoZ3VwLVxcdTAwM2VhZGRyIFxcdTAwM2UgVUxPTkdfTUFYIHx8IGd1cC1cXHUwMDNlc2l6ZSBcXHUwMDNlIFVMT05HX01BWCB8fCAhZ3VwLVxcdTAwM2VzaXplIHx8XFxuK1xcdCAgICAhZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbCB8fCAhUEFHRV9BTElHTkVEKGd1cC1cXHUwMDNlc2l6ZSkpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KCh1bnNpZ25lZCBsb25nKWd1cC1cXHUwMDNlYWRkcixcXG4gXFx0XFx0XFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cXHUwMDNlc2l6ZSwgXFx1MDAyNmVuZCkpXFxuQEAgLTEzOSwxMSArMTQwLDkgQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXFxuIFxcdFxcdGlmIChuciAhPSBndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFxuK1xcdFxcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XFxuK1xcbiBcXHRcXHRuZXh0ID0gYWRkciArIG5yICogUEFHRV9TSVpFO1xcbi1cXHRcXHRpZiAobmV4dCBcXHUwMDNlIGVuZCkge1xcbi1cXHRcXHRcXHRuZXh0ID0gZW5kO1xcbi1cXHRcXHRcXHRuciA9IChuZXh0IC0gYWRkcikgLyBQQUdFX1NJWkU7XFxuLVxcdFxcdH1cXG4gXFxuIFxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIFxcdFxcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyMTo0MC4xNzU0MzM1OFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTQxMTM2NzE0ODA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkdVUF9URVNUXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fZ3VwX3Rlc3RfaW9jdGxcIixcbiAgICBcImd1cF90ZXN0X2lvY3RsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgaW5wdXQgdmFsaWRhdGlvbiBjaGVja3MgYW5kIGl0ZXJhdGlvbiBsb2dpYyBmb3IgcGFnZSBwaW5uaW5nIGFuZCBnZXRfdXNlcl9wYWdlcyBsb29wcyBpbiBfX2d1cF90ZXN0X2lvY3RsKCkgKG1tL2d1cF90ZXN0LmMpLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgYm91bmRhcnkgY29uZGl0aW9uIGhhbmRsaW5nIGFuZCBwb3RlbnRpYWwgcmVncmVzc2lvbnMgaW4gcGFnZSByYW5nZSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA0YmI1ZmQyNDNjY2Q2ZWQ1MDZiM2QzZmM2OTM5MmU5N2FmNzExZTNiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBTZXAgMTUgMTI6MjE6MzkgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xuaW5kZXggMTg1YmEzYmI4ZWQxMC4uYmE3NGJmM2Y0MTA0OCAxMDA2NDRcbi0tLSBhL21tL2d1cF90ZXN0LmNcbisrKyBiL21tL2d1cF90ZXN0LmNcbkBAIC0xMTYsNyArMTE2LDggQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXG4gXHRib29sIG5lZWRzX21tYXBfbG9jayA9XG4gXHRcdGNtZCAhPSBHVVBfRkFTVF9CRU5DSE1BUksgXHUwMDI2XHUwMDI2IGNtZCAhPSBQSU5fRkFTVF9CRU5DSE1BUks7XG4gXG4tXHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYKVxuK1x0aWYgKGd1cC1cdTAwM2VhZGRyIFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVx1MDAzZXNpemUgXHUwMDNlIFVMT05HX01BWCB8fCAhZ3VwLVx1MDAzZXNpemUgfHxcbitcdCAgICAhZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsIHx8ICFQQUdFX0FMSUdORUQoZ3VwLVx1MDAzZXNpemUpKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG4gXHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxuQEAgLTEzOSwxMSArMTQwLDkgQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXG4gXHRcdGlmIChuciAhPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwpXG4gXHRcdFx0YnJlYWs7XG4gXG4rXHRcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XG4rXG4gXHRcdG5leHQgPSBhZGRyICsgbnIgKiBQQUdFX1NJWkU7XG4tXHRcdGlmIChuZXh0IFx1MDAzZSBlbmQpIHtcbi1cdFx0XHRuZXh0ID0gZW5kO1xuLVx0XHRcdG5yID0gKG5leHQgLSBhZGRyKSAvIFBBR0VfU0laRTtcbi1cdFx0fVxuIFxuIFx0XHRzd2l0Y2ggKGNtZCkge1xuIFx0XHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIxOjQwLjE3NTQzNTQzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzI0NzI3ODQ4MTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBLZXJuZWwgUGF0Y2g6IG1tL2d1cF90ZXN0LmMqKlxuXG5BbHJpZ2h0LCBJIHNlZSB3aGF0J3MgYmVpbmcgYXNrZWQgaGVyZS4gV2UncmUgbG9va2luZyBhdCBldmFsdWF0aW5nIGEga2VybmVsIHBhdGNoLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBhbWQ2NCBhcmNoaXRlY3R1cmUuIE15IGZpcnN0IHN0ZXAgaXMgdG8gZGl2ZSByaWdodCBpbiB3aXRoIHRoZSBlc3RhYmxpc2hlZCB0b29saW5nIOKAkyBsZXQncyBnZXQgdGhlIGNvbW1pdCBkZXRhaWxzIGFuZCB0aGUgc3Vycm91bmRpbmcgY29udGV4dC4gSXQgc2VlbXMgdGhlIGZpbGUgb2YgaW50ZXJlc3QgaXMgYG1tL2d1cF90ZXN0LmNgLiBHaXZlbiB0aGUgdGFzaywgYW5kIHRoZSBmb2N1cyBvbiBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQsIEknbGwgYmUgaG9uaW5nIGluIG9uIHRoZSBjb2RlIGFyb3VuZCBsaW5lIDExNi4gVGhhdCBhcmVhIHdpbGwgcHJvdmlkZSBhIHNvbGlkIHN0YXJ0aW5nIHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBpbnRlbnQgYW5kIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBwcm9wb3NlZCBjaGFuZ2VzIHdpdGhpbiB0aGUgYGd1cF90ZXN0LmNgIG1vZHVsZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaCB3aXRoaW4gaXRzIGJyb2FkZXIgY29udGV4dCB0byBwcm9wZXJseSBldmFsdWF0ZSBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzA4NCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6MTIuNjQ4MjIzMDU5WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTIwMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMDA6XFx0XFx0XFx0XFx0XFx0aW5kZXhfdG9fZHVtcCwgZ3VwLVxcdTAwM2VhZGRyKTtcXG4gMTAxOlxcdFxcdFxcdFxcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcXG4gMTAyOlxcdFxcdFxcdFxcdFxcdCAgXFxcImd1cF90ZXN0OiBkdW1wX3BhZ2VzKCkgdGVzdFxcXCIpO1xcbiAxMDM6XFx0XFx0XFx0fVxcbiAxMDQ6XFx0XFx0fVxcbiAxMDU6XFx0fVxcbiAxMDY6XFx0XFxuIDEwNzpcXHRzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG4gMTA4OlxcdFxcdFxcdHN0cnVjdCBndXBfdGVzdCAqZ3VwKVxcbiAxMDk6XFx0e1xcbiAxMTA6XFx0XFx0a3RpbWVfdCBzdGFydF90aW1lLCBlbmRfdGltZTtcXG4gMTExOlxcdFxcdHVuc2lnbmVkIGxvbmcgaSwgbnJfcGFnZXMsIGFkZHIsIG5leHQ7XFxuIDExMjpcXHRcXHRsb25nIG5yO1xcbiAxMTM6XFx0XFx0c3RydWN0IHBhZ2UgKipwYWdlcztcXG4gMTE0OlxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kO1xcbiAxMTU6XFx0XFx0aW50IHJldCA9IDA7XFxuIDExNjpcXHRcXHRib29sIG5lZWRzX21tYXBfbG9jayA9XFxuIDExNzpcXHRcXHRcXHRjbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLIFxcdTAwMjZcXHUwMDI2IGNtZCAhPSBQSU5fRkFTVF9CRU5DSE1BUks7XFxuIDExODpcXHRcXG4gMTE5OlxcdFxcdGlmIChndXAtXFx1MDAzZWFkZHIgXFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVxcdTAwM2VzaXplIFxcdTAwM2UgVUxPTkdfTUFYIHx8ICFndXAtXFx1MDAzZXNpemUgfHxcXG4gMTIwOlxcdFxcdCAgICAhZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbCB8fCAhUEFHRV9BTElHTkVEKGd1cC1cXHUwMDNlc2l6ZSkpXFxuIDEyMTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMTIyOlxcdFxcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVxcdTAwM2VhZGRyLFxcbiAxMjM6XFx0XFx0XFx0XFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cXHUwMDNlc2l6ZSwgXFx1MDAyNmVuZCkpXFxuIDEyNDpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMTI1OlxcdFxcbiAxMjY6XFx0XFx0bnJfcGFnZXMgPSBndXAtXFx1MDAzZXNpemUgLyBQQUdFX1NJWkU7XFxuIDEyNzpcXHRcXHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XFxuIDEyODpcXHRcXHRpZiAoIXBhZ2VzKVxcbiAxMjk6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIDEzMDpcXHRcXG4gMTMxOlxcdFxcdGlmIChuZWVkc19tbWFwX2xvY2sgXFx1MDAyNlxcdTAwMjYgbW1hcF9yZWFkX2xvY2tfa2lsbGFibGUoY3VycmVudC1cXHUwMDNlbW0pKSB7XFxuIDEzMjpcXHRcXHRcXHRyZXQgPSAtRUlOVFI7XFxuIDEzMzpcXHRcXHRcXHRnb3RvIGZyZWVfcGFnZXM7XFxuIDEzNDpcXHRcXHR9XFxuIDEzNTpcXHRcXG4gMTM2OlxcdFxcdGkgPSAwO1xcbiAxMzc6XFx0XFx0bnIgPSBndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsO1xcbiAxMzg6XFx0XFx0c3RhcnRfdGltZSA9IGt0aW1lX2dldCgpO1xcbiAxMzk6XFx0XFx0Zm9yIChhZGRyID0gZ3VwLVxcdTAwM2VhZGRyOyBhZGRyIFxcdTAwM2MgZW5kOyBhZGRyID0gbmV4dCkge1xcbiAxNDA6XFx0XFx0XFx0aWYgKG5yICE9IGd1cC1cXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwpXFxuIDE0MTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTQyOlxcdFxcbiAxNDM6XFx0XFx0XFx0bnIgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBuciwgKGVuZCAtIGFkZHIpIC8gUEFHRV9TSVpFKTtcXG4gMTQ0OlxcdFxcbiAxNDU6XFx0XFx0XFx0bmV4dCA9IGFkZHIgKyBuciAqIFBBR0VfU0laRTtcXG4gMTQ2OlxcdFxcbiAxNDc6XFx0XFx0XFx0c3dpdGNoIChjbWQpIHtcXG4gMTQ4OlxcdFxcdFxcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxcbiAxNDk6XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTUwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCBwYWdlcyArIGkpO1xcbiAxNTE6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1MjpcXHRcXHRcXHRjYXNlIEdVUF9CQVNJQ19URVNUOlxcbiAxNTM6XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxuIDE1NDpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTU1OlxcdFxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAxNTY6XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTU3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCBwYWdlcyArIGkpO1xcbiAxNTg6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1OTpcXHRcXHRcXHRjYXNlIFBJTl9CQVNJQ19URVNUOlxcbiAxNjA6XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxuIDE2MTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTYyOlxcdFxcdFxcdGNhc2UgUElOX0xPTkdURVJNX0JFTkNITUFSSzpcXG4gMTYzOlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXFxuIDE2NDpcXHRcXHRcXHRcXHRcXHRcXHQgICAgZ3VwLVxcdTAwM2VndXBfZmxhZ3MgfCBGT0xMX0xPTkdURVJNLFxcbiAxNjU6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE2NjpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTY3OlxcdFxcdFxcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XFxuIDE2ODpcXHRcXHRcXHRcXHRpZiAoZ3VwLVxcdTAwM2V0ZXN0X2ZsYWdzIFxcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXFxuIDE2OTpcXHRcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTcwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNzE6XFx0XFx0XFx0XFx0ZWxzZVxcbiAxNzI6XFx0XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE3MzpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4gMTc0OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNzU6XFx0XFx0XFx0ZGVmYXVsdDpcXG4gMTc2OlxcdFxcdFxcdFxcdHJldCA9IC1FSU5WQUw7XFxuIDE3NzpcXHRcXHRcXHRcXHRnb3RvIHVubG9jaztcXG4gMTc4OlxcdFxcdFxcdH1cXG4gMTc5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyMjoxMi42NDgzMTczMDlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyODI5OTA3OTA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGd1cF90ZXN0KipcblxuT2theSwgc28gYGd1cF90ZXN0YC4uLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoaXMuIEZpcnN0LCBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IHdoYXQgdGhpcyB0aGluZyAqaXMqLiBXaGF0J3MgaXRzIHB1cnBvc2U/IEhvdyBpcyBpdCBpbXBsZW1lbnRlZD8gSSdsbCBwcm9iYWJseSBzdGFydCB3aXRoIHRoZSBzb3VyY2UgY29kZSwgYnV0IEkgYWxzbyBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHB1YmxpYyBpbnRlcmZhY2UuIFdoZXJlJ3MgaXQgZXhwb3NlZCB0byBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsPyBXaGF0IGZ1bmN0aW9ucyBvciBzdHJ1Y3R1cmVzIGFyZSBhdmFpbGFibGUgZm9yIG90aGVyIG1vZHVsZXMgb3Igc3Vic3lzdGVtcyB0byBpbnRlcmFjdCB3aXRoP1xuXG5UaGVuLCB0aGUga2V5IGlzIGdvaW5nIHRvIGJlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuIFdoYXQgS2NvbmZpZyBzeW1ib2xzIGNvbnRyb2wgdGhlIGluY2x1c2lvbiBvciBiZWhhdmlvciBvZiBgZ3VwX3Rlc3RgPyBJcyBpdCBtb2R1bGFyLCBvciBidWlsdC1pbj8gQXJlIHRoZXJlIGFueSBkZXBlbmRlbmNpZXMgdGhhdCBJIG5lZWQgdG8gYmUgYXdhcmUgb2Y/IEFyZSB0aGVyZSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyB0aGF0IGVuYWJsZSBjZXJ0YWluIHRlc3QgY2FzZXMgb3IgZnVuY3Rpb25hbGl0aWVzPyBVbmRlcnN0YW5kaW5nIHRoZSBLY29uZmlnIG9wdGlvbnMgd2lsbCBiZSBjcnVjaWFsIGZvciByZXByb2R1Y2luZyBhbmQgYW5hbHl6aW5nIGl0IGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuIEkgbmVlZCB0byBrbm93IGhvdyB0byBlbmFibGUgb3IgZGlzYWJsZSBpdCwgYW5kIHdoYXQgdGhlIGRlcGVuZGVuY2llcyBhcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ2MTQsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjE1LjQ3ODIyNzA2NVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTk3ODUyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJndXBfdGVzdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz0xMjkzPWNvbmZpZyBHVVBfVEVTVFxcbi0tXFxubW0vS2NvbmZpZy0xMjk2LVxcdGhlbHBcXG5tbS9LY29uZmlnOjEyOTc6XFx0ICBQcm92aWRlcyAvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCwgd2hpY2ggaW4gdHVybiBwcm92aWRlcyBhIHdheVxcbm1tL0tjb25maWctMTI5OC1cXHQgIHRvIG1ha2UgaW9jdGwgY2FsbHMgdGhhdCBjYW4gbGF1bmNoIGtlcm5lbC1iYXNlZCB1bml0IHRlc3RzIGZvclxcbi0tXFxubW0vS2NvbmZpZy0xMzEwLVxcbm1tL0tjb25maWc6MTMxMTpcXHQgIFNlZSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jXFxubW0vS2NvbmZpZy0xMzEyLVxcbi0tXFxubW0vTWFrZWZpbGU9MTEwPW9iai0kKENPTkZJR19DR1JPVVBfSFVHRVRMQikgKz0gaHVnZXRsYl9jZ3JvdXAub1xcbm1tL01ha2VmaWxlOjExMTpvYmotJChDT05GSUdfR1VQX1RFU1QpICs9IGd1cF90ZXN0Lm9cXG5tbS9NYWtlZmlsZS0xMTItb2JqLSQoQ09ORklHX0RNQVBPT0xfVEVTVCkgKz0gZG1hcG9vbF90ZXN0Lm9cXG4tLVxcbm1tL2d1cF90ZXN0LmMtOC0jaW5jbHVkZSBcXHUwMDNjbGludXgvaGlnaG1lbS5oXFx1MDAzZVxcbm1tL2d1cF90ZXN0LmM6OTojaW5jbHVkZSBcXFwiZ3VwX3Rlc3QuaFxcXCJcXG5tbS9ndXBfdGVzdC5jLTEwLVxcbm1tL2d1cF90ZXN0LmM6MTE6c3RydWN0IGd1cF90ZXN0X2RhdGEge1xcbm1tL2d1cF90ZXN0LmMtMTItXFx0c3RydWN0IG11dGV4IGxvbmd0ZXJtX211dGV4O1xcbi0tXFxubW0vZ3VwX3Rlc3QuYz0xNz1zdGF0aWMgdm9pZCBwdXRfYmFja19wYWdlcyh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbm1tL2d1cF90ZXN0LmM6MTg6XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcywgdW5zaWduZWQgaW50IGd1cF90ZXN0X2ZsYWdzKVxcbm1tL2d1cF90ZXN0LmMtMTkte1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy0zNC1cXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbm1tL2d1cF90ZXN0LmM6MzU6XFx0XFx0aWYgKGd1cF90ZXN0X2ZsYWdzIFxcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pIHtcXG5tbS9ndXBfdGVzdC5jLTM2LVxcdFxcdFxcdHVucGluX3VzZXJfcGFnZXMocGFnZXMsIG5yX3BhZ2VzKTtcXG4tLVxcbm1tL2d1cF90ZXN0LmM9NDY9c3RhdGljIHZvaWQgdmVyaWZ5X2RtYV9waW5uZWQodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtNjEtXFxubW0vZ3VwX3Rlc3QuYzo2MjpcXHRcXHRcXHRcXHRkdW1wX3BhZ2UoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlLCBcXFwiZ3VwX3Rlc3QgZmFpbHVyZVxcXCIpO1xcbm1tL2d1cF90ZXN0LmMtNjMtXFx0XFx0XFx0XFx0YnJlYWs7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTY3LVxcdFxcdFxcdFxcdCAgICAgaSkpIHtcXG5tbS9ndXBfdGVzdC5jOjY4OlxcdFxcdFxcdFxcdGR1bXBfcGFnZShcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIFxcXCJndXBfdGVzdCBmYWlsdXJlXFxcIik7XFxubW0vZ3VwX3Rlc3QuYy02OS1cXHRcXHRcXHRcXHRicmVhaztcXG4tLVxcbm1tL2d1cF90ZXN0LmMtNzUtXFxubW0vZ3VwX3Rlc3QuYzo3NjpzdGF0aWMgdm9pZCBkdW1wX3BhZ2VzX3Rlc3Qoc3RydWN0IGd1cF90ZXN0ICpndXAsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxubW0vZ3VwX3Rlc3QuYy03Ny1cXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTAxLVxcdFxcdFxcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcXG5tbS9ndXBfdGVzdC5jOjEwMjpcXHRcXHRcXHRcXHQgIFxcXCJndXBfdGVzdDogZHVtcF9wYWdlcygpIHRlc3RcXFwiKTtcXG5tbS9ndXBfdGVzdC5jLTEwMy1cXHRcXHR9XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTEwNi1cXG5tbS9ndXBfdGVzdC5jOjEwNzpzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG5tbS9ndXBfdGVzdC5jOjEwODpcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcXG5tbS9ndXBfdGVzdC5jLTEwOS17XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTIxNS1cXG5tbS9ndXBfdGVzdC5jOjIxNjpzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcXG5tbS9ndXBfdGVzdC5jLTIxNy17XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTIyNy1cXG5tbS9ndXBfdGVzdC5jOjIyODpzdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdGFydChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcXG5tbS9ndXBfdGVzdC5jLTIyOS1cXHRcXHR1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMjk0LVxcbm1tL2d1cF90ZXN0LmM6Mjk1OnN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXFxubW0vZ3VwX3Rlc3QuYy0yOTYtXFx0XFx0dW5zaWduZWQgbG9uZyBhcmcpXFxuLS1cXG5tbS9ndXBfdGVzdC5jPTMyMT1zdGF0aWMgbG9uZyBwaW5fbG9uZ3Rlcm1fdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTMyMy17XFxubW0vZ3VwX3Rlc3QuYzozMjQ6XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlcC1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbm1tL2d1cF90ZXN0LmMtMzI1LVxcdGludCByZXQgPSAtRUlOVkFMO1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy0zNDYtXFxubW0vZ3VwX3Rlc3QuYzozNDc6c3RhdGljIGxvbmcgZ3VwX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxcbm1tL2d1cF90ZXN0LmMtMzQ4LVxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbm1tL2d1cF90ZXN0LmMtMzQ5LXtcXG5tbS9ndXBfdGVzdC5jOjM1MDpcXHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwO1xcbm1tL2d1cF90ZXN0LmMtMzUxLVxcdGludCByZXQ7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTM3MS1cXG5tbS9ndXBfdGVzdC5jOjM3MjpcXHRyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgXFx1MDAyNmd1cCk7XFxubW0vZ3VwX3Rlc3QuYy0zNzMtXFx0aWYgKHJldClcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMzgxLVxcbm1tL2d1cF90ZXN0LmM6MzgyOnN0YXRpYyBpbnQgZ3VwX3Rlc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG5tbS9ndXBfdGVzdC5jLTM4My17XFxubW0vZ3VwX3Rlc3QuYzozODQ6XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XFxubW0vZ3VwX3Rlc3QuYy0zODUtXFx0aW50IHJldDtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtNDAxLVxcbm1tL2d1cF90ZXN0LmM6NDAyOnN0YXRpYyBpbnQgZ3VwX3Rlc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG5tbS9ndXBfdGVzdC5jLTQwMy17XFxubW0vZ3VwX3Rlc3QuYzo0MDQ6XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxubW0vZ3VwX3Rlc3QuYy00MDUtXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTQxMy1cXG5tbS9ndXBfdGVzdC5jOjQxNDpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBndXBfdGVzdF9mb3BzID0ge1xcbm1tL2d1cF90ZXN0LmM6NDE1OlxcdC5vcGVuID0gZ3VwX3Rlc3Rfb3BlbixcXG5tbS9ndXBfdGVzdC5jOjQxNjpcXHQudW5sb2NrZWRfaW9jdGwgPSBndXBfdGVzdF9pb2N0bCxcXG5tbS9ndXBfdGVzdC5jLTQxNy1cXHQuY29tcGF0X2lvY3RsID0gY29tcGF0X3B0cl9pb2N0bCxcXG5tbS9ndXBfdGVzdC5jOjQxODpcXHQucmVsZWFzZSA9IGd1cF90ZXN0X3JlbGVhc2UsXFxubW0vZ3VwX3Rlc3QuYy00MTktfTtcXG5tbS9ndXBfdGVzdC5jLTQyMC1cXG5tbS9ndXBfdGVzdC5jOjQyMTpzdGF0aWMgaW50IF9faW5pdCBndXBfdGVzdF9pbml0KHZvaWQpXFxubW0vZ3VwX3Rlc3QuYy00MjIte1xcbm1tL2d1cF90ZXN0LmM6NDIzOlxcdGRlYnVnZnNfY3JlYXRlX2ZpbGVfdW5zYWZlKFxcXCJndXBfdGVzdFxcXCIsIDA2MDAsIE5VTEwsIE5VTEwsXFxubW0vZ3VwX3Rlc3QuYzo0MjQ6XFx0XFx0XFx0XFx0ICAgXFx1MDAyNmd1cF90ZXN0X2ZvcHMpO1xcbm1tL2d1cF90ZXN0LmMtNDI1LVxcbi0tXFxubW0vZ3VwX3Rlc3QuYy00MjgtXFxubW0vZ3VwX3Rlc3QuYzo0Mjk6bGF0ZV9pbml0Y2FsbChndXBfdGVzdF9pbml0KTtcXG4tLVxcbm1tL2d1cF90ZXN0LmgtNi1cXG5tbS9ndXBfdGVzdC5oOjc6I2RlZmluZSBHVVBfRkFTVF9CRU5DSE1BUktcXHRfSU9XUignZycsIDEsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oOjg6I2RlZmluZSBQSU5fRkFTVF9CRU5DSE1BUktcXHRfSU9XUignZycsIDIsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oOjk6I2RlZmluZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLXFx0X0lPV1IoJ2cnLCAzLCBzdHJ1Y3QgZ3VwX3Rlc3QpXFxubW0vZ3VwX3Rlc3QuaDoxMDojZGVmaW5lIEdVUF9CQVNJQ19URVNUXFx0XFx0X0lPV1IoJ2cnLCA0LCBzdHJ1Y3QgZ3VwX3Rlc3QpXFxubW0vZ3VwX3Rlc3QuaDoxMTojZGVmaW5lIFBJTl9CQVNJQ19URVNUXFx0XFx0X0lPV1IoJ2cnLCA1LCBzdHJ1Y3QgZ3VwX3Rlc3QpXFxubW0vZ3VwX3Rlc3QuaDoxMjojZGVmaW5lIERVTVBfVVNFUl9QQUdFU19URVNUXFx0X0lPV1IoJ2cnLCA2LCBzdHJ1Y3QgZ3VwX3Rlc3QpXFxubW0vZ3VwX3Rlc3QuaC0xMy0jZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUXFx0X0lPVygnZycsIDcsIHN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdClcXG4tLVxcbm1tL2d1cF90ZXN0LmgtMjAtXFxubW0vZ3VwX3Rlc3QuaDoyMTpzdHJ1Y3QgZ3VwX3Rlc3Qge1xcbm1tL2d1cF90ZXN0LmgtMjItXFx0X191NjQgZ2V0X2RlbHRhX3VzZWM7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjE1LjUyODIxMTQzM1oiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY5MzczNTIyNDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIEtlcm5lbCBDb25maWd1cmF0aW9uKipcblxuT2theSwgdGltZSB0byB0cm91Ymxlc2hvb3QgdGhpcy4gTXkgZ3V0IGZlZWxpbmcgaXMgdGVsbGluZyBtZSB0aGUgaXNzdWUgbWlnaHQgYmUgbHVya2luZyB3aXRoaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGZpbGVzLiBMZXQgbWUgemVybyBpbiBvbiBgbW0vS2NvbmZpZ2AuIEl0J3MgYSBrZXkgZmlsZSBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucywgYW5kIHRoZXJlJ3MgYSBzdHJvbmcgY2hhbmNlIHRoZSBwcm9ibGVtIHJlbGF0ZXMgdG8gc29tZXRoaW5nIGluIHRoYXQgYXJlYS4gTm93LCBiYXNlZCBvbiBwcmV2aW91cyBleHBlcmllbmNlcywgSSdtIGdvaW5nIHRvIGp1bXAgdG8gYXJvdW5kIGxpbmUgMTI5My4gVGhhdCByZWdpb24gb2Z0ZW4gY29udGFpbnMgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBzcGVjaWZpYyBtZW1vcnkgYWxsb2NhdGlvbiBmZWF0dXJlcyBvciBwb3RlbnRpYWxseSBjb25mbGljdGluZyBzZXR0aW5ncyB0aGF0IGNvdWxkIGJlIHJlbGV2YW50IHRvIHRoZSBpc3N1ZSBJJ20gZmFjaW5nLiBJJ2xsIHN0YXJ0IG15IGludmVzdGlnYXRpb24gdGhlcmUgYW5kIHNlZSB3aGF0IGp1bXBzIG91dC4gSSdtIGV4cGVjdGluZyB0byBmaW5kIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50LCBhIGRlcGVuZGVuY3ksIG9yIG1heWJlIGV2ZW4gYSBjb25maWd1cmF0aW9uIG9wdGlvbiB3aXRoIGFuIHVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSB0aGF0J3MgY2F1c2luZyB0aGUgcHJvYmxlbS4gTGV0J3Mgc2VlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjcxNzMsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyMjoyMi40NjU1Njc2NTJaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzMwNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMjkwLFxuICBcIkxpbmVDb3VudFwiOiAzNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMjkwOlxcdFxcdCAgaW5mb3JtYXRpb24gaW5jbHVkZXMgZ2xvYmFsIGFuZCBwZXIgY2h1bmsgc3RhdGlzdGljcywgd2hpY2ggY2FuXFxuMTI5MTpcXHRcXHQgIGJlIHVzZWQgdG8gaGVscCB1bmRlcnN0YW5kIHBlcmNwdSBtZW1vcnkgdXNhZ2UuXFxuMTI5MjpcXHRcXG4xMjkzOlxcdGNvbmZpZyBHVVBfVEVTVFxcbjEyOTQ6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIGluZnJhc3RydWN0dXJlIGZvciBnZXRfdXNlcl9wYWdlcygpLXJlbGF0ZWQgdW5pdCB0ZXN0c1xcXCJcXG4xMjk1OlxcdFxcdGRlcGVuZHMgb24gREVCVUdfRlNcXG4xMjk2OlxcdFxcdGhlbHBcXG4xMjk3OlxcdFxcdCAgUHJvdmlkZXMgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QsIHdoaWNoIGluIHR1cm4gcHJvdmlkZXMgYSB3YXlcXG4xMjk4OlxcdFxcdCAgdG8gbWFrZSBpb2N0bCBjYWxscyB0aGF0IGNhbiBsYXVuY2gga2VybmVsLWJhc2VkIHVuaXQgdGVzdHMgZm9yXFxuMTI5OTpcXHRcXHQgIHRoZSBnZXRfdXNlcl9wYWdlcyooKSBhbmQgcGluX3VzZXJfcGFnZXMqKCkgZmFtaWx5IG9mIEFQSSBjYWxscy5cXG4xMzAwOlxcdFxcbjEzMDE6XFx0XFx0ICBUaGVzZSB0ZXN0cyBpbmNsdWRlIGJlbmNobWFyayB0ZXN0aW5nIG9mIHRoZSBfZmFzdCB2YXJpYW50cyBvZlxcbjEzMDI6XFx0XFx0ICBnZXRfdXNlcl9wYWdlcyooKSBhbmQgcGluX3VzZXJfcGFnZXMqKCksIGFzIHdlbGwgYXMgc21va2UgdGVzdHMgb2ZcXG4xMzAzOlxcdFxcdCAgdGhlIG5vbi1fZmFzdCB2YXJpYW50cy5cXG4xMzA0OlxcdFxcbjEzMDU6XFx0XFx0ICBUaGVyZSBpcyBhbHNvIGEgc3ViLXRlc3QgdGhhdCBhbGxvd3MgcnVubmluZyBkdW1wX3BhZ2UoKSBvbiBhbnlcXG4xMzA2OlxcdFxcdCAgb2YgdXAgdG8gZWlnaHQgcGFnZXMgKHNlbGVjdGVkIGJ5IGNvbW1hbmQgbGluZSBhcmdzKSB3aXRoaW4gdGhlXFxuMTMwNzpcXHRcXHQgIHJhbmdlIG9mIHVzZXItc3BhY2UgYWRkcmVzc2VzLiBUaGVzZSBwYWdlcyBhcmUgZWl0aGVyIHBpbm5lZCB2aWFcXG4xMzA4OlxcdFxcdCAgcGluX3VzZXJfcGFnZXMqKCksIG9yIHBpbm5lZCB2aWEgZ2V0X3VzZXJfcGFnZXMqKCksIGFzIHNwZWNpZmllZFxcbjEzMDk6XFx0XFx0ICBieSBvdGhlciBjb21tYW5kIGxpbmUgYXJndW1lbnRzLlxcbjEzMTA6XFx0XFxuMTMxMTpcXHRcXHQgIFNlZSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jXFxuMTMxMjpcXHRcXG4xMzEzOlxcdGNvbW1lbnQgXFxcIkdVUF9URVNUIG5lZWRzIHRvIGhhdmUgREVCVUdfRlMgZW5hYmxlZFxcXCJcXG4xMzE0OlxcdFxcdGRlcGVuZHMgb24gIUdVUF9URVNUIFxcdTAwMjZcXHUwMDI2ICFERUJVR19GU1xcbjEzMTU6XFx0XFxuMTMxNjpcXHRjb25maWcgR1VQX0dFVF9QWFhfTE9XX0hJR0hcXG4xMzE3OlxcdFxcdGJvb2xcXG4xMzE4OlxcdFxcbjEzMTk6XFx0Y29uZmlnIERNQVBPT0xfVEVTVFxcbjEzMjA6XFx0XFx0dHJpc3RhdGUgXFxcIkVuYWJsZSBhIG1vZHVsZSB0byBydW4gdGltZSB0ZXN0cyBvbiBkbWFfcG9vbFxcXCJcXG4xMzIxOlxcdFxcdGRlcGVuZHMgb24gSEFTX0RNQVxcbjEzMjI6XFx0XFx0aGVscFxcbjEzMjM6XFx0XFx0ICBQcm92aWRlcyBhIHRlc3QgbW9kdWxlIHRoYXQgd2lsbCBhbGxvY2F0ZSBhbmQgZnJlZSBtYW55IGJsb2NrcyBvZlxcbjEzMjQ6XFx0XFx0ICB2YXJpb3VzIHNpemVzIGFuZCByZXBvcnQgaG93IGxvbmcgaXQgdGFrZXMuIFRoaXMgaXMgaW50ZW5kZWQgdG9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6MjIuNDY1NzAzNzYyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NjMxMTQyMTA0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEdVUCBUZXN0IFBhdGNoKipcblxuT2theSwgbGV0J3MgdGFrZSBhbm90aGVyIGxvb2sgYXQgdGhpcyBgbW0vZ3VwX3Rlc3QuY2AgcGF0Y2guIEZpcnN0IGdsYW5jZSBzaG93cyBzb21lIGFkZGl0aW9ucywgYSBmZXcgbmV3IGNoZWNrcywgYW5kIGEgY2hhbmdlIHRvIHRoZSBsb29wIGhhbmRsaW5nLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgYmVpbmcgYWRkcmVzc2VkIGhlcmUsIHNvIGxldCdzIGJyZWFrIGl0IGRvd24uXG5cblRoZSBpbml0aWFsIGBpZmAgc3RhdGVtZW50IG5vdyBpbmNsdWRlcyBhZGRpdGlvbmFsIGNoZWNrczogYCFndXAtXHUwMDNlc2l6ZWAsIGAhZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsYCwgYW5kIGAhUEFHRV9BTElHTkVEKGd1cC1cdTAwM2VzaXplKWAuIENsZWFybHksIHdlJ3JlIHRyeWluZyB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBtb3JlIHJpZ29yb3VzbHkuIFplcm8tc2l6ZWQgcmVxdWVzdHMsIG1pc3NpbmcgYG5yX3BhZ2VzX3Blcl9jYWxsYCwgb3IgbWlzYWxpZ25lZCBzaXplcyBhcmUgbm93IGNvbnNpZGVyZWQgaW52YWxpZC4gVGhpcyBzZWVtcyByZWFzb25hYmxlOyBwcmV2ZW50aW5nIHRoZXNlIGtpbmRzIG9mIGVkZ2UgY2FzZXMgdXBmcm9udCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gYXZvaWQgdW5leHBlY3RlZCBiZWhhdmlvciBsYXRlci5cblxuVGhlIGNvcmUgb2YgdGhlIGNoYW5nZSBsaWVzIHdpdGhpbiB0aGUgbWFpbiBsb29wLiBQcmV2aW91c2x5LCB0aGUgY29kZSBjYWxjdWxhdGVkIGBuZXh0YCBhbmQgdGhlbiBoYWQgYSByZWR1bmRhbnQgY2hlY2svYWRqdXN0bWVudCBpZiBgbmV4dGAgZXhjZWVkZWQgYGVuZGAuIE5vdywgdGhlcmUncyBhIG5ldyBsaW5lIHRoYXQgY2xhbXBzIHRoZSBgbnJgIHZhbHVlIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgc2l6ZS4gVGhpcyBzdWdnZXN0cyB0aGUgb3JpZ2luYWwgY2FsY3VsYXRpb24gaGFkIHBvdGVudGlhbCBvdmVyZmxvdyBpc3N1ZXMsIGFuZCB0aGlzIHJldmlzZWQgY29kZSBzZWVtcyB0byBiZSBhbiBpbXByb3ZlbWVudCBpbiBlbnN1cmluZyBgbnJgIGRvZXNuJ3QgZXhjZWVkIHRoZSBib3VuZHMgb2YgdGhlIHByb3ZpZGVkIHJlZ2lvbiwgZXZlbiB3aGVuIHRoZSBwcm92aWRlZCB2YWx1ZSBmb3IgYGd1cC1cdTAwM2VzaXplYCBjb3VsZCBoYXZlIHJlc3VsdGVkIGluIGFuIG92ZXJmbG93IGNhbGN1bGF0aW9uIGluIGBuZXh0ID0gYWRkciArIG5yICogUEFHRV9TSVpFO2AuXG5cbkknbSB0aGlua2luZyB0aGlzIGxpa2VseSByZXNvbHZlcyBhbiBpc3N1ZSB3aGVyZSB0aGUgY2FsY3VsYXRpb24gb2YgYG5leHRgIGNvdWxkIHJlc3VsdCBpbiBhbiBpbnZhbGlkIGFkZHJlc3MgdGhhdCBsZWFkcyB0byBhbiBvdXQtb2YtYm91bmRzIHJlYWQgb3Igd3JpdGUuIFByZXZlbnRpbmcgdGhpcyBraW5kIG9mIG92ZXJmbG93IGlzIGNydWNpYWwgZm9yIG1lbW9yeSBtYW5hZ2VtZW50LCBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggdXNlci1wcm92aWRlZCBwYXJhbWV0ZXJzLlxuXG5JIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW50ZW50IGFuZCBvcmlnaW5hbCBtb3RpdmF0aW9uIGJlaGluZCB0aGlzIGNoYW5nZS4gTm93IEkgc2hvdWxkIGxvb2sgYXQgdGhlIGNvbW1pdCBsb2cgZm9yIGBtbS9ndXBfdGVzdC5jYCB0byBzZWUgdGhlIGNvbnRleHQgYW5kIHRoZSBzcGVjaWZpYyBwcm9ibGVtIHRoYXQgd2FzIGJlaW5nIGZpeGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3OTk1LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDYzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6MjguNzc3MTI4NDhaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODMyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMzUsXG4gIFwiTGluZUNvdW50XCI6IDU1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMzU6XFx0XFxuIDEzNjpcXHRcXHRpID0gMDtcXG4gMTM3OlxcdFxcdG5yID0gZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcXG4gMTM4OlxcdFxcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMTM5OlxcdFxcdGZvciAoYWRkciA9IGd1cC1cXHUwMDNlYWRkcjsgYWRkciBcXHUwMDNjIGVuZDsgYWRkciA9IG5leHQpIHtcXG4gMTQwOlxcdFxcdFxcdGlmIChuciAhPSBndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxcbiAxNDE6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE0MjpcXHRcXG4gMTQzOlxcdFxcdFxcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XFxuIDE0NDpcXHRcXG4gMTQ1OlxcdFxcdFxcdG5leHQgPSBhZGRyICsgbnIgKiBQQUdFX1NJWkU7XFxuIDE0NjpcXHRcXG4gMTQ3OlxcdFxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDE0ODpcXHRcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMTQ5OlxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE1MDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4gMTUxOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNTI6XFx0XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMTUzOlxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyArIGkpO1xcbiAxNTQ6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1NTpcXHRcXHRcXHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcXG4gMTU2OlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE1NzpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4gMTU4OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNTk6XFx0XFx0XFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcXG4gMTYwOlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyArIGkpO1xcbiAxNjE6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2MjpcXHRcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XFxuIDE2MzpcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLFxcbiAxNjQ6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzIHwgRk9MTF9MT05HVEVSTSxcXG4gMTY1OlxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNjY6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2NzpcXHRcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAxNjg6XFx0XFx0XFx0XFx0aWYgKGd1cC1cXHUwMDNldGVzdF9mbGFncyBcXHUwMDI2IEdVUF9URVNUX0ZMQUdfRFVNUF9QQUdFU19VU0VfUElOKVxcbiAxNjk6XFx0XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE3MDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4gMTcxOlxcdFxcdFxcdFxcdGVsc2VcXG4gMTcyOlxcdFxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNzM6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE3NDpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTc1OlxcdFxcdFxcdGRlZmF1bHQ6XFxuIDE3NjpcXHRcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbiAxNzc6XFx0XFx0XFx0XFx0Z290byB1bmxvY2s7XFxuIDE3ODpcXHRcXHRcXHR9XFxuIDE3OTpcXHRcXG4gMTgwOlxcdFxcdFxcdGlmIChuciBcXHUwMDNjPSAwKVxcbiAxODE6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE4MjpcXHRcXHRcXHRpICs9IG5yO1xcbiAxODM6XFx0XFx0fVxcbiAxODQ6XFx0XFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMTg1OlxcdFxcbiAxODY6XFx0XFx0LyogU2hpZnRpbmcgdGhlIG1lYW5pbmcgb2YgbnJfcGFnZXM6IG5vdyBpdCBpcyBhY3R1YWwgbnVtYmVyIHBpbm5lZDogKi9cXG4gMTg3OlxcdFxcdG5yX3BhZ2VzID0gaTtcXG4gMTg4OlxcdFxcbiAxODk6XFx0XFx0Z3VwLVxcdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6MjguNzc3MjE0MzZaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6Nzc3NDUyNTQyMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIEZlYXNpYmlsaXR5OiBBIERlZXAgRGl2ZSBpbnRvIGd1cF90ZXN0LmMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgdG91Y2hpbmcgY29kZSByZWxhdGVkIHRvIGBnZXRfdXNlcl9wYWdlcygpYCwgc3BlY2lmaWNhbGx5IHdpdGhpbiBgbW0vZ3VwX3Rlc3QuY2AuIFRoZSBpbml0aWFsIGNvZGUgaGFkIHBvdGVudGlhbCBvdmVyZmxvdyBpc3N1ZXMgd2l0aCBgYWRkciArIG5yICogUEFHRV9TSVpFYCwgYW5kIHNvbWUgemVyby1zaXplIGFsbG9jYXRpb25zIHRoYXQgY291bGQgY2F1c2UgcHJvYmxlbXMuIFRoZSBjb3JyZWN0aW9uIGFkZHJlc3NlcyB0aG9zZSBvdmVyZmxvd3Mgd2l0aCBhbiBvdmVyZmxvdy1zYWZlIGNoZWNrLCBhbmQgZGVhbHMgd2l0aCBzb21lIHBvdGVudGlhbCBudWxsLXBvaW50ZXItZXNxdWUgY29uZGl0aW9ucy5cblxuTXkgaW1tZWRpYXRlIHRob3VnaHQgaXM6IGNhbiB0aGlzIGNvZGUgKmFjdHVhbGx5KiBiZSBmdXp6ZWQ/IFRoZSBjZW50cmFsIHF1ZXN0aW9uIGlzIHJlYWNoYWJpbGl0eS4gVGhlIHBhdGNoIGNvZGUgY3JlYXRlcyBgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RgIHZpYSBkZWJ1Z2ZzLCBhbmQgaW9jdGxzIGNhbiBiZSBpc3N1ZWQgYnkgdXNlcnNwYWNlLiBCdXQgdGhlIGluc3RydWN0aW9ucyBtYWtlIGl0IGNsZWFyLCByZWFjaGFiaWxpdHkgaXMgdGhlIHByaW1hcnkgZ2F0ZTogaWYgdGhlIGNvZGUgY2FuJ3QgZXhlY3V0ZSBpbiBhIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50LCBpdCdzIGEgbm8tZ28gZm9yIGZ1enppbmcuXG5cbk5vdywgbGV0J3MgYXBwbHkgdGhlICpuZWdhdGl2ZSogY3JpdGVyaWEgZnJvbSB0aGUgaW5zdHJ1Y3Rpb25zLiBEb2VzIGl0IGZhbGwgaW50byBhbnkgb2YgdGhvc2UgY2F0ZWdvcmllcz9cblxuKiAgICoqTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlcz8qKiBOb3BlLCBpdCdzIGtlcm5lbCBDIGNvZGUuIE5vdCBkb2N1bWVudGF0aW9uLCBzY3JpcHRzLCBvciB1c2VyLXNwYWNlIHN0dWZmLlxuKiAgICoqU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlPyoqIE5vcGUsIGl0IGRvZXNuJ3QgcmVxdWlyZSBzcGVjaWZpYyBoYXJkd2FyZS4gSXQncyBub3QgYSBkcml2ZXIgZm9yIGEgZmFuY3kgQVNJQyBvciBTbWFydE5JQy5cbiogICAqKlVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRocz8qKiBJdCdzIG5vdCBhIHRlYXJkb3duIGNhbGxiYWNrLCBub3Igc3BlY2lmaWMgdG8gc29tZSBiaXphcnJlIGFyY2hpdGVjdHVyZS4gSXQncyBhbWQ2NC1jb21wYXRpYmxlLCBhbmQgdGhlIGRlYnVnZnMgZmlsZSBjcmVhdGVkIHZpYSBgbGF0ZV9pbml0Y2FsbGAgbWVhbnMgaXQncyBhdmFpbGFibGUgdG8gdXNlcnNwYWNlLlxuXG5TbywgdGhlIG5leHQgb2J2aW91cyBxdWVzdGlvbiBpczogSXMgdGhpcyByZWFjaGFibGUgZnJvbSBhIHN0YW5kYXJkIFFFTVUgb3IgR0NFIGVudmlyb25tZW50P1xuXG5ZZXMsIHNpbmNlIGRlYnVnZnMgaXMgbW91bnRlZCBpbiBzdGFuZGFyZCBMaW51eCwgYW5kIGlvY3RscyBjYW4gYmUgaXNzdWVkIHRvIGBndXBfdGVzdGAgdmlhIHVzZXJzcGFjZS4gSSd2ZSBjaGVja2VkIGRlYnVnZnMgcGVybWlzc2lvbnMgaW4gYGd1cF90ZXN0LmNgOiBUaGUgZGVidWdmcyBmaWxlIGlzIGNyZWF0ZWQgYXMgMDYwMCAtIHNvIHJvb3QgY2FuIGFjY2VzcyBpdC4gU3l6a2FsbGVyIHJ1bnMgYXMgcm9vdCAob3Igd2l0aCBjYXBhYmlsaXRpZXMpIGluIG1hbnkgc2NlbmFyaW9zLCBzbyB0aGlzIGNoZWNrIGlzIHZhbGlkLlxuXG5JIG5lZWQgdG8gY29uZmlybSB0aGUgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMuIGBHVVBfVEVTVGAgZGVwZW5kcyBvbiBgREVCVUdfRlNgIHdoaWNoIGRlcGVuZHMgb24gdmFyaW91cyBkZWJ1Z2dpbmcgY29uZmlnIG9wdGlvbnMsIGJ1dCBpdCBsb29rcyBsaWtlIHRoZSB0ZXN0cyBpbiBgZ3VwX3Rlc3QuY2AgYXJlIGVuYWJsZWQgdW5kZXIgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24uXG5cbk9rYXksIGxldCdzIGFwcGx5IHRoZSAqcG9zaXRpdmUqIGNyaXRlcmlhIGZyb20gdGhlIGluc3RydWN0aW9ucyB0byBiZSBzdXJlOlxuXG4qICAgKipDb3JlIFN1YnN5c3RlbXM/KiogWWVzLCBpdCBpcyBhIG1lbW9yeSBtYW5hZ2VtZW50IGlzc3VlLCBhcyB0aGUgY29kZSBtb2RpZmllcyBgZ2V0X3VzZXJfcGFnZXMoKWBcbiogICAqKlJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwcz8qKiBZZXMsIHRoZSBjb2RlIGlzIHJlZmFjdG9yaW5nIGFuZCBjaGFuZ2luZyBwYXJ0cyBvZiBtZW1vcnkgbWFuYWdlbWVudC5cbiogICAqKlJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrcz8qKiBZZXMsIHdlIGFyZSBpbnRyb2R1Y2luZyBkZWZlbnNpdmUgY2hlY2tzLlxuXG5UaGVyZWZvcmUsIHRoaXMgY29kZSBwYXRoICppcyogcmVhY2hhYmxlLCBhbmQgKnNob3VsZCogYmUgZnV6emVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NzUxLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTM2NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjM2LjU1MTc1MTQwMloiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzU4NTQzMjMsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBERUJVR19GU1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjM2LjYyNzYxMjQzNVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNDY0MTQwMjI1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRlYnVnZ2luZyB0aGUgRmlsZXN5c3RlbSBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHRyYWNrIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGBERUJVR19GU2AuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHN0YXJ0IGRpZ2dpbmcgdGhyb3VnaCB0aGUgYEtjb25maWdgIGZpbGVzLiBUaGF0J3MgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIEknbGwgZmluZCBpdHMgZGVmaW5pdGlvbiwgYW55IGRlcGVuZGVuY2llcywgYW5kIGFzc29jaWF0ZWQgaGVscCB0ZXh0LiBJJ2xsIG5lZWQgdG8gcmVtZW1iZXIgdG8gbG9vayBpbiBhbGwgdGhlIHJlbGV2YW50IHN1YmRpcmVjdG9yaWVzIGZvciBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiBob3cgaXQncyB1c2VkIGFuZCB3aGF0IGl0IGNvbnRyb2xzLiBGaW5kaW5nIGl0cyBkZXBlbmRlbmNpZXMgd2lsbCBiZSBrZXkgdG8gdW5kZXJzdGFuZGluZyBpZiBpdCdzIGVuYWJsZWQgYnkgc29tZXRoaW5nIGVsc2UgSSdtIGFscmVhZHkgdXNpbmcsIG9yIGlmIGl0IGNhbiBiZSBlbmFibGVkIGluZGVwZW5kZW50bHkuIEkgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgYW55IHdhcm5pbmdzIGFib3V0IHVzaW5nIHRoaXMuIExldCdzIHN0YXJ0IHRoZSBzZWFyY2guLi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE3ODQsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyMjozOS4wOTE3NjEyM1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQwNTM0MTQ5OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgREVCVUdfRlNcXFxcYlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJsaWIvS2NvbmZpZy5kZWJ1Zz02ODM9Y29uZmlnIE1BR0lDX1NZU1JRX1NFUklBTF9TRVFVRU5DRVxcbi0tXFxubGliL0tjb25maWcuZGVidWctNjkyLVxcbmxpYi9LY29uZmlnLmRlYnVnOjY5Mzpjb25maWcgREVCVUdfRlNcXG5saWIvS2NvbmZpZy5kZWJ1Zy02OTQtXFx0Ym9vbCBcXFwiRGVidWcgRmlsZXN5c3RlbVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6NDEuNDk3MTA3OTc5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI2MTQwODg5OTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKlBlZXJpbmcgaW50byB0aGUgRGVidWdnaW5nIEhlYXJ0IG9mIHRoZSBDb25maWd1cmF0aW9uIEJlYXN0KipcblxuT2theSwgc28gSSdtIHRoaW5raW5nLCBcIldoZXJlJ3MgdGhlIGJlc3QgcGxhY2UgdG8gZGlnIGludG8gdGhpcyBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24gaXNzdWU/XCIgSW1tZWRpYXRlbHksIG15IG1pbmQgaG9uZXMgaW4gb24gYGxpYi9LY29uZmlnLmRlYnVnYC4gSXQncyBhbG1vc3Qgc2Vjb25kIG5hdHVyZSDigJMgdGhhdCBmaWxlIGlzIGEgY29yZSBjb21wb25lbnQgZm9yIGRlYnVnIGNvbmZpZ3VyYXRpb25zLiBOb3csIEkgaGF2ZSB0byB6ZXJvIGluLCBsZXQncyBzZWUsIGFyb3VuZCBsaW5lIDY5My4gVGhhdCdzIGEgcmVhc29uYWJsZSBhcmVhIHRvIHN0YXJ0IGxvb2tpbmcsIEknbGwgYmV0IGl04oCZcyByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHF1ZXJ5LiBGcm9tIHRoYXQgbG9jYXRpb24sIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUga2V5IGRpcmVjdGl2ZXMsIGRlcGVuZGVuY2llcywgb3IgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byB0aGUgZGVidWcgcGFyYW1ldGVycyBpbiBwbGF5LiBMZXQncyBzZWUgd2hhdOKAmXMgdGhlcmUsIGl0IGNvdWxkIGNvbnRhaW4gdGhlIGFuc3dlciwgb3IgYSBnb29kIGNsdWUhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMDYwLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6NDQuMTExMTk5ODM4WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NDgyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJsaWIvS2NvbmZpZy5kZWJ1Z1wiLFxuICBcIkZpcnN0TGluZVwiOiA2OTAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2OTA6XFx0XFxuIDY5MTpcXHRcXHQgIElmIHVuc3VyZSwgbGVhdmUgYW4gZW1wdHkgc3RyaW5nIGFuZCB0aGUgb3B0aW9uIHdpbGwgbm90IGJlIGVuYWJsZWQuXFxuIDY5MjpcXHRcXG4gNjkzOlxcdGNvbmZpZyBERUJVR19GU1xcbiA2OTQ6XFx0XFx0Ym9vbCBcXFwiRGVidWcgRmlsZXN5c3RlbVxcXCJcXG4gNjk1OlxcdFxcdGhlbHBcXG4gNjk2OlxcdFxcdCAgZGVidWdmcyBpcyBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gdGhhdCBrZXJuZWwgZGV2ZWxvcGVycyB1c2UgdG8gcHV0XFxuIDY5NzpcXHRcXHQgIGRlYnVnZ2luZyBmaWxlcyBpbnRvLiAgRW5hYmxlIHRoaXMgb3B0aW9uIHRvIGJlIGFibGUgdG8gcmVhZCBhbmRcXG4gNjk4OlxcdFxcdCAgd3JpdGUgdG8gdGhlc2UgZmlsZXMuXFxuIDY5OTpcXHRcXG4gNzAwOlxcdFxcdCAgRm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb24gdGhlIGRlYnVnZnMgQVBJLCBzZWVcXG4gNzAxOlxcdFxcdCAgRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy8uXFxuIDcwMjpcXHRcXG4gNzAzOlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgTi5cXG4gNzA0OlxcdFxcbiA3MDU6XFx0Y2hvaWNlXFxuIDcwNjpcXHRcXHRwcm9tcHQgXFxcIkRlYnVnZnMgZGVmYXVsdCBhY2Nlc3NcXFwiXFxuIDcwNzpcXHRcXHRkZXBlbmRzIG9uIERFQlVHX0ZTXFxuIDcwODpcXHRcXHRkZWZhdWx0IERFQlVHX0ZTX0FMTE9XX0FMTFxcbiA3MDk6XFx0XFx0aGVscFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyMjo0NC4xMTEzNTY2ODhaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjMwMDc4OTcwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqQW5hbHl6aW5nIERlcGVuZGVuY2llcyBhbmQgSU9DVEwgQ2FsbHMqKlxuXG5BbHJpZ2h0LCBzbyBgREVCVUdfRlNgIGlzIGEgc3RhbmRhbG9uZSBwaWVjZSwgd2hpY2ggaXMgdXNlZnVsIHRvIGtub3cuIEhvd2V2ZXIsIEkgc2VlIGBHVVBfVEVTVGAgcmVsaWVzIG9uIGBERUJVR19GU2AuIFRoYXQgcmVsYXRpb25zaGlwIHdpbGwgYmUgaW1wb3J0YW50IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZS5cblxuTXkgZm9jdXMgc2hvdWxkIGJlIG9uIGhvdyBgR1VQX1RFU1RgIGlzIGxldmVyYWdpbmcgYERFQlVHX0ZTYC4gSSdsbCBpbW1lZGlhdGVseSBkcmlsbCBkb3duIGludG8gYF9fZ3VwX3Rlc3RfaW9jdGxgIGFuZCBpdHMgY2FsbGVycyB3aXRoaW4gYG1tL2d1cF90ZXN0LmNgLiBUaGF0J3Mgd2hlcmUgdGhlIHJ1YmJlciBtZWV0cyB0aGUgcm9hZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdywgdGhlIGRhdGEgYmVpbmcgcGFzc2VkLCBhbmQgaG93IHRoZSBpbnRlcmFjdGlvbiB3aXRoIGBERUJVR19GU2AgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQgd2l0aGluIHRoYXQgSU9DVEwuIFVuZGVyc3RhbmRpbmcgdGhlIHNwZWNpZmljcyBvZiB0aGlzIGludGVyYWN0aW9uIGlzIGNyaXRpY2FsIHRvIHVuZGVyc3RhbmRpbmcgaG93IHRoaW5ncyB3b3JrIG92ZXJhbGwuIEkgd2FudCB0byBzZWUgaWYgdGhlIGRlcGVuZGVuY3kgaXMgcHVyZWx5IGEgY29uZmlndXJhdGlvbiB0aGluZywgb3IgaWYgYERFQlVHX0ZTYCBmdW5jdGlvbnMgYXJlIGFjdGl2ZWx5IHV0aWxpemVkIGR1cmluZyBJT0NUTCBwcm9jZXNzaW5nLiBUaGUgZGV2aWwncyBpbiB0aGUgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI1NDMsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjQ2LjQxMjE0OTgyN1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDY4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9ndXBfdGVzdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM0NSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDM0NTpcXHR9XFxuIDM0NjpcXHRcXG4gMzQ3OlxcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG4gMzQ4OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzNDk6XFx0e1xcbiAzNTA6XFx0XFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcXG4gMzUxOlxcdFxcdGludCByZXQ7XFxuIDM1MjpcXHRcXG4gMzUzOlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDM1NDpcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMzU1OlxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAzNTY6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAzNTc6XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMzU4OlxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuIDM1OTpcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAzNjA6XFx0XFx0XFx0YnJlYWs7XFxuIDM2MTpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzNjI6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzNjM6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEOlxcbiAzNjQ6XFx0XFx0XFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XFxuIDM2NTpcXHRcXHRkZWZhdWx0OlxcbiAzNjY6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDM2NzpcXHRcXHR9XFxuIDM2ODpcXHRcXG4gMzY5OlxcdFxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcXG4gMzcwOlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzE6XFx0XFxuIDM3MjpcXHRcXHRyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgXFx1MDAyNmd1cCk7XFxuIDM3MzpcXHRcXHRpZiAocmV0KVxcbiAzNzQ6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMzc1OlxcdFxcbiAzNzY6XFx0XFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFxcdTAwMjZndXAsIHNpemVvZihndXApKSlcXG4gMzc3OlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzg6XFx0XFxuIDM3OTpcXHRcXHRyZXR1cm4gMDtcXG4gMzgwOlxcdH1cXG4gMzgxOlxcdFxcbiAzODI6XFx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbiAzODM6XFx0e1xcbiAzODQ6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjQ2LjQxMjIyNzYxN1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDg4NjE5NDU4NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGBndXBfdGVzdF9pb2N0bGAgRnVuY3Rpb24qKlxuXG5Pa2F5LCBsZXQncyBicmVhayBkb3duIHRoaXMgYGd1cF90ZXN0X2lvY3RsYCBmdW5jdGlvbmFsaXR5LiBGaXJzdCwgaXQgbG9va3MgbGlrZSBpdCdzIGhhbmRsaW5nIGEgc2V0IG9mIGNvbW1hbmRzOiBgR1VQX0ZBU1RfQkVOQ0hNQVJLYCwgYFBJTl9GQVNUX0JFTkNITUFSS2AsIGBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLYCwgYEdVUF9CQVNJQ19URVNUYCwgYFBJTl9CQVNJQ19URVNUYCwgYW5kIGBEVU1QX1VTRVJfUEFHRVNfVEVTVGAuIEludGVyZXN0aW5nLiBUaGUgbmV4dCBzdGVwIGlzIGEgYGNvcHlfZnJvbV91c2VyYCBjYWxsIHRvIGdldCBhIGBndXBgIHN0cnVjdCBmcm9tIHVzZXJzcGFjZS4gVGhlbiBpdCBoYW5kcyBvZmYgdGhlIHByb2Nlc3NpbmcgdG8gYF9fZ3VwX3Rlc3RfaW9jdGwoY21kLCBcdTAwMjZndXApYC5cblxuTm93LCBpcyBgX19ndXBfdGVzdF9pb2N0bGAgc3RhdGljPyBZZXAsIGl0IGlzLiBUaGUgY29tcGlsZXIgd2lsbCBsaWtlbHkgaW5saW5lIGl0LiBUaGF0J3MgZ29vZCB0byBrbm93IGZvciBwZXJmb3JtYW5jZSBhbmFseXNpcy4gSSB3b25kZXIgdGhvdWdoLCB3aGF0IG90aGVyIGVudHJ5IHBvaW50cyBleGlzdC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGFtIGNvdmVyaW5nIGFsbCBjYWxscyB0byB0aGlzIG1ldGhvZC4gXG5cbkxldCBtZSBjbGFyaWZ5IG15IG1lbW9yeS4gV2FpdCwgYGd1cF90ZXN0X2lvY3RsYCBpdHNlbGYgaXMgZGVjbGFyZWQgc3RhdGljISBMaW5lIDM0NyBkZWNsYXJlcyBpdDogYHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpYFxuXG5BbHNvLCBsZXQncyB0YWtlIGEgcXVpY2sgbG9vayBhdCBgZ3VwX3Rlc3RfaW5pdGAgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQuXG5cblRvIGJlIHRob3JvdWdoLCBJIHNob3VsZCBzZWFyY2ggdGhyb3VnaCBgbW0vZ3VwX3Rlc3QuY2AgZm9yIGFueSBvdGhlciBub24tc3RhdGljIG9yIGV4cG9ydGVkIGZ1bmN0aW9ucy4gTGV0J3MgYGdyZXBgIGZvciB0aG9zZS4gVGhhdCB3aWxsIHNvbGlkaWZ5IG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIG1vZHVsZSdzIGludGVyZmFjZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDA3LCJPdXRwdXRUb2tlbnMiOjQ3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjM6MDcuMjk4NDI0MjM0WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTUwODM4NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeW2EtekEtWl9dW2EtekEtWjAtOV9dKiBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vZ3VwX3Rlc3QuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9ndXBfdGVzdC5jLTEwLVxcbm1tL2d1cF90ZXN0LmM6MTE6c3RydWN0IGd1cF90ZXN0X2RhdGEge1xcbm1tL2d1cF90ZXN0LmMtMTItXFx0c3RydWN0IG11dGV4IGxvbmd0ZXJtX211dGV4O1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy0xNi1cXG5tbS9ndXBfdGVzdC5jOjE3OnN0YXRpYyB2b2lkIHB1dF9iYWNrX3BhZ2VzKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxubW0vZ3VwX3Rlc3QuYy0xOC1cXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCB1bnNpZ25lZCBpbnQgZ3VwX3Rlc3RfZmxhZ3MpXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTQ1LVxcbm1tL2d1cF90ZXN0LmM6NDY6c3RhdGljIHZvaWQgdmVyaWZ5X2RtYV9waW5uZWQodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG5tbS9ndXBfdGVzdC5jLTQ3LVxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTc1LVxcbm1tL2d1cF90ZXN0LmM6NzY6c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbm1tL2d1cF90ZXN0LmMtNzctXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTEwNi1cXG5tbS9ndXBfdGVzdC5jOjEwNzpzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG5tbS9ndXBfdGVzdC5jLTEwOC1cXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMjE1LVxcbm1tL2d1cF90ZXN0LmM6MjE2OnN0YXRpYyBpbmxpbmUgdm9pZCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdG9wKHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhKVxcbm1tL2d1cF90ZXN0LmMtMjE3LXtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMjI3LVxcbm1tL2d1cF90ZXN0LmM6MjI4OnN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhLFxcbm1tL2d1cF90ZXN0LmMtMjI5LVxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxubW0vZ3VwX3Rlc3QuYy0yOTQtXFxubW0vZ3VwX3Rlc3QuYzoyOTU6c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcXG5tbS9ndXBfdGVzdC5jLTI5Ni1cXHRcXHR1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMzIwLVxcbm1tL2d1cF90ZXN0LmM6MzIxOnN0YXRpYyBsb25nIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG5tbS9ndXBfdGVzdC5jLTMyMi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhcmcpXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTM0Ni1cXG5tbS9ndXBfdGVzdC5jOjM0NzpzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXFxubW0vZ3VwX3Rlc3QuYy0zNDgtXFx0XFx0dW5zaWduZWQgbG9uZyBhcmcpXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTM4MS1cXG5tbS9ndXBfdGVzdC5jOjM4MjpzdGF0aWMgaW50IGd1cF90ZXN0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXFxubW0vZ3VwX3Rlc3QuYy0zODMte1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy00MDEtXFxubW0vZ3VwX3Rlc3QuYzo0MDI6c3RhdGljIGludCBndXBfdGVzdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbm1tL2d1cF90ZXN0LmMtNDAzLXtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtNDEzLVxcbm1tL2d1cF90ZXN0LmM6NDE0OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGd1cF90ZXN0X2ZvcHMgPSB7XFxubW0vZ3VwX3Rlc3QuYy00MTUtXFx0Lm9wZW4gPSBndXBfdGVzdF9vcGVuLFxcbi0tXFxubW0vZ3VwX3Rlc3QuYy00MjAtXFxubW0vZ3VwX3Rlc3QuYzo0MjE6c3RhdGljIGludCBfX2luaXQgZ3VwX3Rlc3RfaW5pdCh2b2lkKVxcbm1tL2d1cF90ZXN0LmMtNDIyLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjM6MDcuMzQzOTM2Nzc4WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjUzODkwOTg4Nzc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IEFzc2Vzc21lbnQ6IG1tL2d1cF90ZXN0LmMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5vdGljZWQgdGhhdCBhbGwgdGhlIGZ1bmN0aW9ucyBpbiBgbW0vZ3VwX3Rlc3QuY2AgYXJlIGRlY2xhcmVkIGBzdGF0aWNgLiBIb3dldmVyLCB0aGF0IGRvZXNuJ3QgYXV0b21hdGljYWxseSBleGNsdWRlIHRoZW0gZnJvbSBzeW1ib2wgY292ZXJhZ2UgaW4gYHZtbGludXhgLCB1bmxlc3MgdGhleSdyZSBpbmxpbmVkLiBOb3csIGBfX2d1cF90ZXN0X2lvY3RsYCBpcyBhIHN1YnN0YW50aWFsIGZ1bmN0aW9uLCBvdmVyIDEwMCBsaW5lcy4gRXZlbiBpZiBpbmxpbmVkLCB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBmaWxlIG9wZXJhdGlvbnMgKGBmb3BzYCkgaXMgc3RpbGwgYGd1cF90ZXN0X2lvY3RsYCwgc28gYm90aCBhcmUgcG90ZW50aWFsIHRhcmdldHMuXG5cbkFjY29yZGluZyB0byB0aGUgRm9jdXNTeW1ib2xzIGd1aWRlbGluZXMsIHdlIG5lZWQgdG8gbGlzdCBmdW5jdGlvbnMgdGhhdCBkaXJlY3RseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFsdGVyZWQsIHdoaWNoLCBpbiB0aGlzIGNhc2UsIGFyZSB3aXRoaW4gdGhlIGAuY2AgZmlsZSBhbmQgYXJlIG5vdCBpbmxpbmVkLiBCb3RoIGBfX2d1cF90ZXN0X2lvY3RsYCBhbmQgYGd1cF90ZXN0X2lvY3RsYCBzZWVtIHRvIGZpdCB0aGF0IGRlc2NyaXB0aW9uIHBlcmZlY3RseS5cblxuSSB3YXMgYWJvdXQgdG8gbG9vayBmb3IgYW55IGV4aXN0aW5nIHN5emthbGxlciBkZXNjcmlwdGlvbnMgZm9yIGBndXBfdGVzdGAsIGJ1dCB0aGVuIEkgcmVtZW1iZXJlZCB0aGUgY3JpdGljYWwgaW5zdHJ1Y3Rpb246IHdlIGNhbid0IHNlYXJjaCBmb3Igc3l6bGFuZyBkZXNjcmlwdGlvbnMgZGlyZWN0bHkgd2l0aCB0aGlzIHRvb2wuIFdlJ2xsIGhhdmUgdG8gdXNlIGByZWFkLXN5ei1zcGVjYCBhbmQgYHN5ei1ncmVwcGVyYCB0b29scywgYnV0IHRoZXkgZG9uJ3Qgc2VlbSBhdmFpbGFibGUgaGVyZS4gU28sIG5vIHN5emxhbmcgc2VhcmNoLlxuXG5OZXh0LCBJIG5lZWQgdG8gY29uZmlybSBpZiB0aGlzIGlzIGV2ZW4gYSB3b3J0aHdoaWxlIGZ1enppbmcgdGFyZ2V0LCBzbyBsZXQncyBjcm9zcy1yZWZlcmVuY2UgdGhlIGd1aWRlbGluZXMuIEl0J3MgaW4gYG1tL2AsIG1ha2luZyBpdCBhIGNvcmUgc3Vic3lzdGVtLiBUaGUgbW9kaWZpY2F0aW9ucyBpbnZvbHZlIGlucHV0IHZhbGlkYXRpb24gbGlrZSB0aGUgY2hlY2tzIGFnYWluc3QgYFVMT05HX01BWGAgYW5kIHBhZ2UgYWxpZ25tZW50LCBhbmQgdGhlIGNhbGN1bGF0aW9uIG9mIHBhZ2UgcmFuZ2VzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBcIlJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrc1wiLiBJdCdzIG5vdCBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUsIGFzIGRlYnVnZnMgaXMgc3RhbmRhcmQgYW5kIGFjY2Vzc2libGUsIHBhcnRpY3VsYXJseSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuIFRoZXJlZm9yZSwgaXQgZGVmaW5pdGVseSBtZWV0cyB0aGUgY3JpdGVyaWEsIHNvIGBXb3J0aEZ1enppbmc9dHJ1ZWAuXG5cbk5vdyBmb3IgY29uZmlnIGRlcGVuZGVuY2llcy4gTG9va2luZyBhdCBgbW0vS2NvbmZpZ2AsIGl0J3MgY2xlYXIgd2UgbmVlZCBgR1VQX1RFU1RgIGFuZCBgREVCVUdfRlNgIGVuYWJsZWQuXG5cblRvIHN1bW1hcml6ZSwgbXkgZm9jdXMgc3ltYm9scyB3aWxsIGJlIGBfX2d1cF90ZXN0X2lvY3RsYCBhbmQgYGd1cF90ZXN0X2lvY3RsYC5cblxuTXkgcmVhc29uaW5nPyBUaGlzIHBhdGNoIHNwZWNpZmljYWxseSBhbHRlcnMgaW5wdXQgdmFsaWRhdGlvbiBhbmQgcGFnZSBjYWxjdWxhdGlvbiBpbiBgX19ndXBfdGVzdF9pb2N0bGAgd2l0aGluIGBtbS9ndXBfdGVzdC5jYCwgYW4gaW50ZXJmYWNlIGV4cG9zZWQgdGhyb3VnaCBkZWJ1Z2ZzIHRvIHVzZXJzcGFjZSAoYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCkuIFRoZSBjaGFuZ2VzIGRpcmVjdGx5IGltcGFjdCBob3cgcGFnZSByYW5nZXMgYW5kIGxvb3AgaXRlcmF0aW9ucyBhcmUgY2FsY3VsYXRlZCBmb3IgYGdldF91c2VyX3BhZ2VzYCB0ZXN0cy4gSXQncyBhIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgdGVzdCBpbnRlcmZhY2UgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgc28gZnV6emluZyBjYW4gaGVscCB2ZXJpZnkgYm91bmRhcnkgY29uZGl0aW9ucyBhbmQgcG90ZW50aWFsbHkgcmV2ZWFsIG1lbW9yeS1yZWxhdGVkIGlzc3Vlcy5cblxuRmluYWxseSwganVzdCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUsIGxldCdzIHZlcmlmeSBldmVyeXRoaW5nIGlzIGluIG9yZGVyOlxuXG4qICAgYEVuYWJsZUNvbmZpZ3NgOiBgW1wiR1VQX1RFU1RcIiwgXCJERUJVR19GU1wiXWBcbiogICBgRm9jdXNTeW1ib2xzYDogYFtcIl9fZ3VwX3Rlc3RfaW9jdGxcIiwgXCJndXBfdGVzdF9pb2N0bFwiXWBcbiogICBgV29ydGhGdXp6aW5nYDogYHRydWVgXG4qICAgYFJlYXNvbmluZ2A6IENvbmNpc2UgZXhwbGFuYXRpb24gcHJvdmlkZWQgYWJvdmUuXG5cblllcCwgbG9va3MgZ29vZC4gV2UgYXJlIHJlYWR5IHRvIGludm9rZSBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTA3MSwiT3V0cHV0VG9rZW5zIjoxNDUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDQzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjAxLjIzNDkyODQ3NVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3MjE2MzA0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJHVVBfVEVTVFwiLFxuICAgIFwiREVCVUdfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJfX2d1cF90ZXN0X2lvY3RsXCIsXG4gICAgXCJndXBfdGVzdF9pb2N0bFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGlucHV0IHZhbGlkYXRpb24gY2hlY2tzIGFuZCBpdGVyYXRpb24gbG9naWMgZm9yIHBhZ2UgcGlubmluZyBhbmQgZ2V0X3VzZXJfcGFnZXMgbG9vcHMgaW4gX19ndXBfdGVzdF9pb2N0bCgpIChtbS9ndXBfdGVzdC5jKS4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW9jdGxzIG9uIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIGJvdW5kYXJ5IGNvbmRpdGlvbiBoYW5kbGluZyBhbmQgcG90ZW50aWFsIHJlZ3Jlc3Npb25zIGluIHBhZ2UgcmFuZ2UgaGFuZGxpbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiR1VQX1RFU1RcIixcbiAgICBcIkRFQlVHX0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19ndXBfdGVzdF9pb2N0bFwiLFxuICAgIFwiZ3VwX3Rlc3RfaW9jdGxcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBpbnB1dCB2YWxpZGF0aW9uIGNoZWNrcyBhbmQgaXRlcmF0aW9uIGxvZ2ljIGZvciBwYWdlIHBpbm5pbmcgYW5kIGdldF91c2VyX3BhZ2VzIGxvb3BzIGluIF9fZ3VwX3Rlc3RfaW9jdGwoKSAobW0vZ3VwX3Rlc3QuYykuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGlvY3RscyBvbiAvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nIGZvciBib3VuZGFyeSBjb25kaXRpb24gaGFuZGxpbmcgYW5kIHBvdGVudGlhbCByZWdyZXNzaW9ucyBpbiBwYWdlIHJhbmdlIGhhbmRsaW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyNDowMS4zMTIxNTIxNTlaIiwiU2VxIjoyMywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwOTMyMDU4MjQwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjAxLjMxMjcxMTk4WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTA5MzIwMDE4NjM5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBtbS9ndXBfdGVzdC5jIHRvIGFkZCBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAoY2hlY2tpbmcgdGhhdCBndXAtXFx1MDAzZXNpemUgaXMgbm9uLXplcm8gYW5kIFBBR0VfQUxJR05FRCwgYW5kIHRoYXQgZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcXG5cXG5UaGUgaXNzdWVzIGFkZHJlc3NlZCBieSB0aGlzIHBhdGNoIGFyZSBpbmZpbml0ZSBsb29wcyAod2hlbiBucl9wYWdlc19wZXJfY2FsbCBpcyAwKSBhbmQgb3V0LW9mLWJvdW5kcyBidWZmZXIgaW5kZXhpbmcgb24gdGhlIGBwYWdlc2AgYXJyYXkgKHdoZW4gZ3VwLVxcdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXFxuXFxuQWxsIGJ1ZmZlcnMgaW52b2x2ZWQgKHRoZSBzdGFjay1hbGxvY2F0ZWQgc3RydWN0IGd1cF90ZXN0IGFuZCB0aGUgaGVhcC1hbGxvY2F0ZWQgcGFnZXMgYXJyYXkpIGFyZSBmdWxseSBpbml0aWFsaXplZCB2aWEgY29weV9mcm9tX3VzZXIoKSBhbmQga3ZjYWxsb2MoKS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBzdHJ1Y3QgcGFkZGluZyBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoaXMgY2hhbmdlLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDRiYjVmZDI0M2NjZDZlZDUwNmIzZDNmYzY5MzkyZTk3YWY3MTFlM2JcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIFNlcCAxNSAxMjoyMTozOSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2d1cF90ZXN0LmMgYi9tbS9ndXBfdGVzdC5jXG5pbmRleCAxODViYTNiYjhlZDEwLi5iYTc0YmYzZjQxMDQ4IDEwMDY0NFxuLS0tIGEvbW0vZ3VwX3Rlc3QuY1xuKysrIGIvbW0vZ3VwX3Rlc3QuY1xuQEAgLTExNiw3ICsxMTYsOCBAQCBzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbiBcdGJvb2wgbmVlZHNfbW1hcF9sb2NrID1cbiBcdFx0Y21kICE9IEdVUF9GQVNUX0JFTkNITUFSSyBcdTAwMjZcdTAwMjYgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSztcbiBcbi1cdGlmIChndXAtXHUwMDNlYWRkciBcdTAwM2UgVUxPTkdfTUFYIHx8IGd1cC1cdTAwM2VzaXplIFx1MDAzZSBVTE9OR19NQVgpXG4rXHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYIHx8ICFndXAtXHUwMDNlc2l6ZSB8fFxuK1x0ICAgICFndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgfHwgIVBBR0VfQUxJR05FRChndXAtXHUwMDNlc2l6ZSkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0aWYgKGNoZWNrX2FkZF9vdmVyZmxvdygodW5zaWduZWQgbG9uZylndXAtXHUwMDNlYWRkcixcbiBcdFx0XHQgICAgICAgKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZXNpemUsIFx1MDAyNmVuZCkpXG5AQCAtMTM5LDExICsxNDAsOSBAQCBzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbiBcdFx0aWYgKG5yICE9IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbClcbiBcdFx0XHRicmVhaztcbiBcbitcdFx0bnIgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBuciwgKGVuZCAtIGFkZHIpIC8gUEFHRV9TSVpFKTtcbitcbiBcdFx0bmV4dCA9IGFkZHIgKyBuciAqIFBBR0VfU0laRTtcbi1cdFx0aWYgKG5leHQgXHUwMDNlIGVuZCkge1xuLVx0XHRcdG5leHQgPSBlbmQ7XG4tXHRcdFx0bnIgPSAobmV4dCAtIGFkZHIpIC8gUEFHRV9TSVpFO1xuLVx0XHR9XG4gXG4gXHRcdHN3aXRjaCAoY21kKSB7XG4gXHRcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjQ6MDEuMzEyNzEzMDQ5WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjk1NjU1NzYzODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOlxuXG4qKktNU0FOIEZ1enppbmcgU2Vzc2lvbiBBc3Nlc3NtZW50KipcblxuT2theSwgc28gdGhlIHRhc2sgYXQgaGFuZCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBuZWNlc3NpdGF0ZXMgaXRzIG93biwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gTXkgZmlyc3QgaW5zdGluY3QsIGFzIGFsd2F5cywgaXMgdG8gZGl2ZSBpbnRvIHRoZSBjb2RlLiBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgcGF0Y2gncyBpbXBhY3QuIFNwZWNpZmljYWxseSwgSSdsbCBzdGFydCBieSBpbnNwZWN0aW5nIHRoZSBwYXRjaCBpdHNlbGYsIGFuZCB0aGVuIEknbGwgdHVybiBteSBhdHRlbnRpb24gdG8gYG1tL2d1cF90ZXN0LmNgIOKAkyB0aGF0IHNlZW1zIGxpa2UgYSBsaWtlbHkgYXJlYSB0byBmaW5kIHJlbGF0ZWQgY29kZSBvciBjb250ZXh0LCBlc3BlY2lhbGx5IGdpdmVuIHRoZSBcImd1cFwiIGluIHRoZSBmaWxlIG5hbWUsIHN1Z2dlc3RpbmcgaW50ZXJhY3Rpb25zIHdpdGggR2V0IFVzZXIgUGFnZXMuXG5cblRvIGV4cGVkaXRlIHRoaXMsIEknbGwgdXNlIGEgYHJlYWQtZmlsZWAgY29tbWFuZCwgemVyb2luZyBpbiBvbiB0aGUgcmVsZXZhbnQgc2VjdGlvbiBvZiBgbW0vZ3VwX3Rlc3QuY2Ag4oCTIEknbGwgc3RhcnQgYXJvdW5kIGxpbmUgMTE2LiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgZ29vZCBpbml0aWFsIHZpZXcgb2YgdGhlIGNvZGUgc3Vycm91bmRpbmcgdGhlIHBhdGNoJ3Mgc2NvcGUuIEknbSBsb29raW5nIGZvciBhbnl0aGluZyB0aGF0IHNjcmVhbXMgXCJtZW1vcnkgc2FmZXR5LFwiIHBvdGVudGlhbGx5IG5ldyBhbGxvY2F0aW9uIHNjaGVtZXMsIGNoYW5nZWQgcG9pbnRlciBhcml0aG1ldGljLCBvciBhbnkgY2hhbmdlcyB0byBob3cgdGhlIGtlcm5lbCBpbnRlcmFjdHMgd2l0aCB1c2VyLXNwYWNlIG1lbW9yeSDigJMgYWxsIHJlZCBmbGFncyB0aGF0IHdvdWxkIHB1c2ggbWUgdG93YXJkIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24uIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhhdCBhIGNhcmVmdWwgYXNzZXNzbWVudCBvZiB0aGlzIGNvZGUgaXMgdGhlIGtleSB0byBhbiBpbmZvcm1lZCBkZWNpc2lvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI5NiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY3LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjQ6MTAuODc4MjkyOTQxWiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNDMxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9ndXBfdGVzdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDkwLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA5MDpcXHRcXHRcXHRcXHRndXAtXFx1MDAzZXdoaWNoX3BhZ2VzW2ldID0gMDtcXG4gIDkxOlxcdFxcdFxcdH1cXG4gIDkyOlxcdFxcdH1cXG4gIDkzOlxcdFxcbiAgOTQ6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpKyspIHtcXG4gIDk1OlxcdFxcdFxcdGluZGV4X3RvX2R1bXAgPSBndXAtXFx1MDAzZXdoaWNoX3BhZ2VzW2ldO1xcbiAgOTY6XFx0XFxuICA5NzpcXHRcXHRcXHRpZiAoaW5kZXhfdG9fZHVtcCkge1xcbiAgOTg6XFx0XFx0XFx0XFx0aW5kZXhfdG9fZHVtcC0tOyAvLyBEZWNvZGUgZnJvbSAxLWJhc2VkLCB0byAwLWJhc2VkXFxuICA5OTpcXHRcXHRcXHRcXHRwcl9pbmZvKFxcXCItLS0tIHBhZ2UgIyV1LCBzdGFydGluZyBmcm9tIHVzZXIgdmlydCBhZGRyOiAweCVsbHhcXFxcblxcXCIsXFxuIDEwMDpcXHRcXHRcXHRcXHRcXHRpbmRleF90b19kdW1wLCBndXAtXFx1MDAzZWFkZHIpO1xcbiAxMDE6XFx0XFx0XFx0XFx0ZHVtcF9wYWdlKHBhZ2VzW2luZGV4X3RvX2R1bXBdLFxcbiAxMDI6XFx0XFx0XFx0XFx0XFx0ICBcXFwiZ3VwX3Rlc3Q6IGR1bXBfcGFnZXMoKSB0ZXN0XFxcIik7XFxuIDEwMzpcXHRcXHRcXHR9XFxuIDEwNDpcXHRcXHR9XFxuIDEwNTpcXHR9XFxuIDEwNjpcXHRcXG4gMTA3OlxcdHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxcbiAxMDg6XFx0XFx0XFx0c3RydWN0IGd1cF90ZXN0ICpndXApXFxuIDEwOTpcXHR7XFxuIDExMDpcXHRcXHRrdGltZV90IHN0YXJ0X3RpbWUsIGVuZF90aW1lO1xcbiAxMTE6XFx0XFx0dW5zaWduZWQgbG9uZyBpLCBucl9wYWdlcywgYWRkciwgbmV4dDtcXG4gMTEyOlxcdFxcdGxvbmcgbnI7XFxuIDExMzpcXHRcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xcbiAxMTQ6XFx0XFx0dW5zaWduZWQgbG9uZyBlbmQ7XFxuIDExNTpcXHRcXHRpbnQgcmV0ID0gMDtcXG4gMTE2OlxcdFxcdGJvb2wgbmVlZHNfbW1hcF9sb2NrID1cXG4gMTE3OlxcdFxcdFxcdGNtZCAhPSBHVVBfRkFTVF9CRU5DSE1BUksgXFx1MDAyNlxcdTAwMjYgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSztcXG4gMTE4OlxcdFxcbiAxMTk6XFx0XFx0aWYgKGd1cC1cXHUwMDNlYWRkciBcXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXFx1MDAzZXNpemUgXFx1MDAzZSBVTE9OR19NQVggfHwgIWd1cC1cXHUwMDNlc2l6ZSB8fFxcbiAxMjA6XFx0XFx0ICAgICFndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsIHx8ICFQQUdFX0FMSUdORUQoZ3VwLVxcdTAwM2VzaXplKSlcXG4gMTIxOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAxMjI6XFx0XFx0aWYgKGNoZWNrX2FkZF9vdmVyZmxvdygodW5zaWduZWQgbG9uZylndXAtXFx1MDAzZWFkZHIsXFxuIDEyMzpcXHRcXHRcXHRcXHQgICAgICAgKHVuc2lnbmVkIGxvbmcpZ3VwLVxcdTAwM2VzaXplLCBcXHUwMDI2ZW5kKSlcXG4gMTI0OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAxMjU6XFx0XFxuIDEyNjpcXHRcXHRucl9wYWdlcyA9IGd1cC1cXHUwMDNlc2l6ZSAvIFBBR0VfU0laRTtcXG4gMTI3OlxcdFxcdHBhZ2VzID0ga3ZjYWxsb2MobnJfcGFnZXMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcXG4gMTI4OlxcdFxcdGlmICghcGFnZXMpXFxuIDEyOTpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gMTMwOlxcdFxcbiAxMzE6XFx0XFx0aWYgKG5lZWRzX21tYXBfbG9jayBcXHUwMDI2XFx1MDAyNiBtbWFwX3JlYWRfbG9ja19raWxsYWJsZShjdXJyZW50LVxcdTAwM2VtbSkpIHtcXG4gMTMyOlxcdFxcdFxcdHJldCA9IC1FSU5UUjtcXG4gMTMzOlxcdFxcdFxcdGdvdG8gZnJlZV9wYWdlcztcXG4gMTM0OlxcdFxcdH1cXG4gMTM1OlxcdFxcbiAxMzY6XFx0XFx0aSA9IDA7XFxuIDEzNzpcXHRcXHRuciA9IGd1cC1cXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGw7XFxuIDEzODpcXHRcXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDEzOTpcXHRcXHRmb3IgKGFkZHIgPSBndXAtXFx1MDAzZWFkZHI7IGFkZHIgXFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XFxuIDE0MDpcXHRcXHRcXHRpZiAobnIgIT0gZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbClcXG4gMTQxOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNDI6XFx0XFxuIDE0MzpcXHRcXHRcXHRuciA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG5yLCAoZW5kIC0gYWRkcikgLyBQQUdFX1NJWkUpO1xcbiAxNDQ6XFx0XFxuIDE0NTpcXHRcXHRcXHRuZXh0ID0gYWRkciArIG5yICogUEFHRV9TSVpFO1xcbiAxNDY6XFx0XFxuIDE0NzpcXHRcXHRcXHRzd2l0Y2ggKGNtZCkge1xcbiAxNDg6XFx0XFx0XFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XFxuIDE0OTpcXHRcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNTA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0IHBhZ2VzICsgaSk7XFxuIDE1MTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTUyOlxcdFxcdFxcdGNhc2UgR1VQX0JBU0lDX1RFU1Q6XFxuIDE1MzpcXHRcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncywgcGFnZXMgKyBpKTtcXG4gMTU0OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNTU6XFx0XFx0XFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XFxuIDE1NjpcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNTc6XFx0XFx0XFx0XFx0XFx0XFx0XFx0IHBhZ2VzICsgaSk7XFxuIDE1ODpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTU5OlxcdFxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuIDE2MDpcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncywgcGFnZXMgKyBpKTtcXG4gMTYxOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNjI6XFx0XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAxNjM6XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBucixcXG4gMTY0OlxcdFxcdFxcdFxcdFxcdFxcdCAgICBndXAtXFx1MDAzZWd1cF9mbGFncyB8IEZPTExfTE9OR1RFUk0sXFxuIDE2NTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4gMTY2OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNjc6XFx0XFx0XFx0Y2FzZSBEVU1QX1VTRVJfUEFHRVNfVEVTVDpcXG4gMTY4OlxcdFxcdFxcdFxcdGlmIChndXAtXFx1MDAzZXRlc3RfZmxhZ3MgXFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTilcXG4gMTY5OlxcdFxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNzA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE3MTpcXHRcXHRcXHRcXHRlbHNlXFxuIDE3MjpcXHRcXHRcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTczOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNzQ6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE3NTpcXHRcXHRcXHRkZWZhdWx0OlxcbiAxNzY6XFx0XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4gMTc3OlxcdFxcdFxcdFxcdGdvdG8gdW5sb2NrO1xcbiAxNzg6XFx0XFx0XFx0fVxcbiAxNzk6XFx0XFxuIDE4MDpcXHRcXHRcXHRpZiAobnIgXFx1MDAzYz0gMClcXG4gMTgxOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxODI6XFx0XFx0XFx0aSArPSBucjtcXG4gMTgzOlxcdFxcdH1cXG4gMTg0OlxcdFxcdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDE4NTpcXHRcXG4gMTg2OlxcdFxcdC8qIFNoaWZ0aW5nIHRoZSBtZWFuaW5nIG9mIG5yX3BhZ2VzOiBub3cgaXQgaXMgYWN0dWFsIG51bWJlciBwaW5uZWQ6ICovXFxuIDE4NzpcXHRcXHRucl9wYWdlcyA9IGk7XFxuIDE4ODpcXHRcXG4gMTg5OlxcdFxcdGd1cC1cXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjEwLjg3ODQzNzExMVoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxNDU0OTY1NDg3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBpZiB0aGV5J3JlIG15IG93bjpcblxuKipEaXZpbmcgaW50byBndXBfdGVzdC5jIGZvciBEZWVwZXIgVW5kZXJzdGFuZGluZyoqXG5cblJpZ2h0LCBsZXQncyBzZWUuLi4gSSBuZWVkIHRvIGdldCBhIGJldHRlciBoYW5kbGUgb24gaG93IHRoaXMgYGd1cF90ZXN0YCBpb2N0bCBhY3R1YWxseSBmdW5jdGlvbnMuIEknbSBnb2luZyB0byBkaWcgZGVlcGVyIGludG8gdGhlIGNvZGUgd2l0aGluIGBtbS9ndXBfdGVzdC5jYC4gVGhlIGNvcmUgcXVlc3Rpb24gSSdtIHRyeWluZyB0byBhbnN3ZXIgaXMgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIGBndXBgIGZ1bmN0aW9uYWxpdHksIGFuZCBzcGVjaWZpY2FsbHksIHdoYXTigJlzIGdvaW5nIG9uIHdpdGggdGhlc2UgYHBhZ2VzYCB0aGV5J3JlIG1lbnRpb25pbmcuIEknbSBob3BpbmcgYnkgZm9sbG93aW5nIHRoZSBleGVjdXRpb24gcGF0aCwgSSBjYW4gdW5jb3ZlciB0aGUgZGV0YWlscyBvZiBtZW1vcnkgbWFuYWdlbWVudCBhbmQgdGhlIG1lY2hhbmljcyBiZWhpbmQgYGd1cF90ZXN0YC4gSSBleHBlY3QgdG8gZmluZCBzb21lIGludGVyZXN0aW5nIGNhc2VzIHdoZXJlIGBndXBgIGlzIGJlaW5nIHRlc3RlZCB3aXRoIHNvbWUgY29tcGxleCBwYWdlIG1hcHBpbmdzIGFuZCBzY2VuYXJpb3MuIEl0J3MgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQyNDQsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjI1LjQyODA5NTIxNloiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NDMzMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9ndXBfdGVzdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5MCxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE5MDpcXHRcXHRndXAtXFx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcXG4gMTkxOlxcdFxcbiAxOTI6XFx0XFx0LypcXG4gMTkzOlxcdFxcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxcbiAxOTQ6XFx0XFx0ICogc3RhdGU6IHByaW50IGEgd2FybmluZyBpZiBhbnkgbm9uLWRtYS1waW5uZWQgcGFnZXMgYXJlIGZvdW5kOlxcbiAxOTU6XFx0XFx0ICovXFxuIDE5NjpcXHRcXHR2ZXJpZnlfZG1hX3Bpbm5lZChjbWQsIHBhZ2VzLCBucl9wYWdlcyk7XFxuIDE5NzpcXHRcXG4gMTk4OlxcdFxcdGlmIChjbWQgPT0gRFVNUF9VU0VSX1BBR0VTX1RFU1QpXFxuIDE5OTpcXHRcXHRcXHRkdW1wX3BhZ2VzX3Rlc3QoZ3VwLCBwYWdlcywgbnJfcGFnZXMpO1xcbiAyMDA6XFx0XFxuIDIwMTpcXHRcXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDIwMjpcXHRcXG4gMjAzOlxcdFxcdHB1dF9iYWNrX3BhZ2VzKGNtZCwgcGFnZXMsIG5yX3BhZ2VzLCBndXAtXFx1MDAzZXRlc3RfZmxhZ3MpO1xcbiAyMDQ6XFx0XFxuIDIwNTpcXHRcXHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xcbiAyMDY6XFx0XFx0Z3VwLVxcdTAwM2VwdXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcXG4gMjA3OlxcdFxcbiAyMDg6XFx0dW5sb2NrOlxcbiAyMDk6XFx0XFx0aWYgKG5lZWRzX21tYXBfbG9jaylcXG4gMjEwOlxcdFxcdFxcdG1tYXBfcmVhZF91bmxvY2soY3VycmVudC1cXHUwMDNlbW0pO1xcbiAyMTE6XFx0ZnJlZV9wYWdlczpcXG4gMjEyOlxcdFxcdGt2ZnJlZShwYWdlcyk7XFxuIDIxMzpcXHRcXHRyZXR1cm4gcmV0O1xcbiAyMTQ6XFx0fVxcbiAyMTU6XFx0XFxuIDIxNjpcXHRzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcXG4gMjE3OlxcdHtcXG4gMjE4OlxcdFxcdGlmIChkYXRhLVxcdTAwM2Vsb25ndGVybV9wYWdlcykge1xcbiAyMTk6XFx0XFx0XFx0aWYgKGRhdGEtXFx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzKVxcbiAyMjA6XFx0XFx0XFx0XFx0dW5waW5fdXNlcl9wYWdlcyhkYXRhLVxcdTAwM2Vsb25ndGVybV9wYWdlcyxcXG4gMjIxOlxcdFxcdFxcdFxcdFxcdFxcdCBkYXRhLVxcdTAwM2Vsb25ndGVybV9ucl9wYWdlcyk7XFxuIDIyMjpcXHRcXHRcXHRrdmZyZWUoZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMpO1xcbiAyMjM6XFx0XFx0XFx0ZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMgPSBOVUxMO1xcbiAyMjQ6XFx0XFx0XFx0ZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgPSAwO1xcbiAyMjU6XFx0XFx0fVxcbiAyMjY6XFx0fVxcbiAyMjc6XFx0XFxuIDIyODpcXHRzdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdGFydChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcXG4gMjI5OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAyMzA6XFx0e1xcbiAyMzE6XFx0XFx0bG9uZyBucl9wYWdlcywgY3VyX3BhZ2VzLCBhZGRyLCByZW1haW5pbmdfcGFnZXM7XFxuIDIzMjpcXHRcXHRpbnQgZ3VwX2ZsYWdzID0gRk9MTF9MT05HVEVSTTtcXG4gMjMzOlxcdFxcdHN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdCBhcmdzO1xcbiAyMzQ6XFx0XFx0c3RydWN0IHBhZ2UgKipwYWdlcztcXG4gMjM1OlxcdFxcdGludCByZXQgPSAwO1xcbiAyMzY6XFx0XFx0Ym9vbCBmYXN0O1xcbiAyMzc6XFx0XFxuIDIzODpcXHRcXHRpZiAoZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMpXFxuIDIzOTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMjQwOlxcdFxcbiAyNDE6XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZhcmdzLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihhcmdzKSkpXFxuIDI0MjpcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gMjQzOlxcdFxcbiAyNDQ6XFx0XFx0aWYgKGFyZ3MuZmxhZ3MgXFx1MDAyNlxcbiAyNDU6XFx0XFx0ICAgIH4oUElOX0xPTkdURVJNX1RFU1RfRkxBR19VU0VfV1JJVEV8UElOX0xPTkdURVJNX1RFU1RfRkxBR19VU0VfRkFTVCkpXFxuIDI0NjpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMjQ3OlxcdFxcdGlmICghSVNfQUxJR05FRChhcmdzLmFkZHIgfCBhcmdzLnNpemUsIFBBR0VfU0laRSkpXFxuIDI0ODpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMjQ5OlxcdFxcdGlmIChhcmdzLnNpemUgXFx1MDAzZSBMT05HX01BWClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjQ6MjUuNDI4MTkyMTM2WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMyODMyODk3MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgaXQ6XG5cbioqSW52ZXN0aWdhdGluZyBgX19ndXBfdGVzdF9pb2N0bGAqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB0aGUgY2FsbGVyIG9mIGBfX2d1cF90ZXN0X2lvY3RsYC4gSSBrbm93IHRoYXQgbmFtZSBpcyBmYW1pbGlhciwgYnV0IEkgbmVlZCB0byBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5IG9mIHdoZXJlIGl0J3MgdXNlZC4gU2luY2UgSSdtIHdvcmtpbmcgaW4gdGhlIGtlcm5lbCwgYSBgZ3JlcGAgc2hvdWxkIGJlIHRoZSBxdWlja2VzdCB3YXkgdG8gZmluZCBpdC4gQWx0ZXJuYXRpdmVseSwgSSBzaG91bGQgYmUgYWJsZSB0byBqdXN0IGxvb2sgYXJvdW5kIGxpbmUgMjcwLCBpZiBJIGtub3cgd2hlcmUgdGhhdCBpcyBpbiB0aGUgY29kZS4gSSdtIHByb2JhYmx5IGFmdGVyIHdoZXJlIHRoaXMgY2FsbCBpcyBtYWRlLCBhbmQgd2hhdCBjb2RlIHBhdGggbGVhZHMgdG8gdGhhdCBwb2ludC4gVGhpcyB3aWxsIGdpdmUgbWUgYW4gdW5kZXJzdGFuZGluZyBvZiBpdHMgcHVycG9zZSBhbmQgdXNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDIzLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyNDoyOC43MTE0ODUwNThaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIzNjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjcwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjcwOlxcdFxcbiAyNzE6XFx0XFx0d2hpbGUgKG5yX3BhZ2VzIC0gZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMpIHtcXG4gMjcyOlxcdFxcdFxcdHJlbWFpbmluZ19wYWdlcyA9IG5yX3BhZ2VzIC0gZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXM7XFxuIDI3MzpcXHRcXHRcXHRhZGRyID0gYXJncy5hZGRyICsgZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgKiBQQUdFX1NJWkU7XFxuIDI3NDpcXHRcXG4gMjc1OlxcdFxcdFxcdGlmIChmYXN0KVxcbiAyNzY6XFx0XFx0XFx0XFx0Y3VyX3BhZ2VzID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCByZW1haW5pbmdfcGFnZXMsXFxuIDI3NzpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRndXBfZmxhZ3MsIHBhZ2VzKTtcXG4gMjc4OlxcdFxcdFxcdGVsc2VcXG4gMjc5OlxcdFxcdFxcdFxcdGN1cl9wYWdlcyA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIHJlbWFpbmluZ19wYWdlcyxcXG4gMjgwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGd1cF9mbGFncywgcGFnZXMpO1xcbiAyODE6XFx0XFx0XFx0aWYgKGN1cl9wYWdlcyBcXHUwMDNjIDApIHtcXG4gMjgyOlxcdFxcdFxcdFxcdHBpbl9sb25ndGVybV90ZXN0X3N0b3AoZGF0YSk7XFxuIDI4MzpcXHRcXHRcXHRcXHRyZXQgPSBjdXJfcGFnZXM7XFxuIDI4NDpcXHRcXHRcXHRcXHRicmVhaztcXG4gMjg1OlxcdFxcdFxcdH1cXG4gMjg2OlxcdFxcdFxcdGRhdGEtXFx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzICs9IGN1cl9wYWdlcztcXG4gMjg3OlxcdFxcdFxcdHBhZ2VzICs9IGN1cl9wYWdlcztcXG4gMjg4OlxcdFxcdH1cXG4gMjg5OlxcdFxcbiAyOTA6XFx0XFx0aWYgKCFmYXN0KVxcbiAyOTE6XFx0XFx0XFx0bW1hcF9yZWFkX3VubG9jayhjdXJyZW50LVxcdTAwM2VtbSk7XFxuIDI5MjpcXHRcXHRyZXR1cm4gcmV0O1xcbiAyOTM6XFx0fVxcbiAyOTQ6XFx0XFxuIDI5NTpcXHRzdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9yZWFkKHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhLFxcbiAyOTY6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhcmcpXFxuIDI5NzpcXHR7XFxuIDI5ODpcXHRcXHRfX3U2NCB1c2VyX2FkZHI7XFxuIDI5OTpcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuIDMwMDpcXHRcXG4gMzAxOlxcdFxcdGlmICghZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMpXFxuIDMwMjpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzAzOlxcdFxcbiAzMDQ6XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZ1c2VyX2FkZHIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHVzZXJfYWRkcikpKVxcbiAzMDU6XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIDMwNjpcXHRcXG4gMzA3OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBkYXRhLVxcdTAwM2Vsb25ndGVybV9ucl9wYWdlczsgaSsrKSB7XFxuIDMwODpcXHRcXHRcXHR2b2lkICphZGRyID0ga21hcF9sb2NhbF9wYWdlKGRhdGEtXFx1MDAzZWxvbmd0ZXJtX3BhZ2VzW2ldKTtcXG4gMzA5OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgcmV0O1xcbiAzMTA6XFx0XFxuIDMxMTpcXHRcXHRcXHRyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpdXNlcl9hZGRyLCBhZGRyLFxcbiAzMTI6XFx0XFx0XFx0XFx0XFx0ICAgUEFHRV9TSVpFKTtcXG4gMzEzOlxcdFxcdFxcdGt1bm1hcF9sb2NhbChhZGRyKTtcXG4gMzE0OlxcdFxcdFxcdGlmIChyZXQpXFxuIDMxNTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gMzE2OlxcdFxcdFxcdHVzZXJfYWRkciArPSBQQUdFX1NJWkU7XFxuIDMxNzpcXHRcXHR9XFxuIDMxODpcXHRcXHRyZXR1cm4gMDtcXG4gMzE5OlxcdH1cXG4gMzIwOlxcdFxcbiAzMjE6XFx0c3RhdGljIGxvbmcgcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxcbiAzMjI6XFx0XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzMjM6XFx0e1xcbiAzMjQ6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlcC1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbiAzMjU6XFx0XFx0aW50IHJldCA9IC1FSU5WQUw7XFxuIDMyNjpcXHRcXG4gMzI3OlxcdFxcdGlmIChtdXRleF9sb2NrX2tpbGxhYmxlKFxcdTAwMjZkYXRhLVxcdTAwM2Vsb25ndGVybV9tdXRleCkpXFxuIDMyODpcXHRcXHRcXHRyZXR1cm4gLUVJTlRSO1xcbiAzMjk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjI4LjcxMTYxMDk3OFoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjozOTUzMzIyNzQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgYSBzZWFzb25lZCBwcm9mZXNzaW9uYWwgaW4gdGhlIGZpZWxkLCBzcGVha2luZyBkaXJlY3RseSB0byB5b3U6XG5cbioqRGl2aW5nIERlZXBlciBpbnRvIGBndXBfdGVzdF9pb2N0bGAqKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIHRoaXMgYGd1cF90ZXN0X2lvY3RsYCBjb2RlLiBUaGUgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHVzdWFsbHkganVzdCB0aGUgdGlwIG9mIHRoZSBpY2ViZXJnLCBpc24ndCBpdD8gTXkgbWluZCBpbW1lZGlhdGVseSBzdGFydHMgcnVubmluZyB0aHJvdWdoIHRoZSBpbXBsaWNhdGlvbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24ncyBwdXJwb3NlIHdpdGhpbiB0aGUgbGFyZ2VyIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRleHQuIFdoYXQncyBpdCBkb2luZz8gV2hhdCdzIGl0ICppbnRlbmRlZCogdG8gZG8/IEknbSBhbHJlYWR5IGFudGljaXBhdGluZyB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdW5kZXJseWluZyBwYWdlIHRhYmxlcywgdGhlIHBvdGVudGlhbCBmb3IgbG9ja2luZyBpc3N1ZXMsIGFuZCB0aGUgd2F5cyB0aGlzIHRlc3QgbWlnaHQgdHJpZ2dlciBzcGVjaWZpYyBlZGdlIGNhc2VzIHdpdGhpbiB0aGUgR1VQIChHZXQgVXNlciBQYWdlKSBtZWNoYW5pc20uIFxuXG5JJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGFyZ3VtZW50cyBpdCB0YWtlcyBhbmQgaG93IHRoZXkgbWFwIHRvIHNwZWNpZmljIG1lbW9yeSByZWdpb25zLCBwcm90ZWN0aW9uIGZsYWdzLCBvciBlcnJvciBjb25kaXRpb25zLiBXaGF0IGFyZSB0aGUgY29tbW9uIGZhaWx1cmUgcGF0aHMsIGFuZCBtb3JlIGltcG9ydGFudGx5LCBob3cgYXJlIHRoZXkgYmVpbmcgaGFuZGxlZD8gRXJyb3IgaGFuZGxpbmcgaXMgY3JpdGljYWwsIHNvIEknbGwgYmUgbG9va2luZyBjbG9zZWx5IGF0IGhvdyBpdCBkZWFscyB3aXRoIGludmFsaWQgbWVtb3J5IGFkZHJlc3NlcywgcGVybWlzc2lvbnMgaXNzdWVzLCBhbmQgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGlzIHVzZWQgd2l0aGluIHRoZSBzeXN0ZW0gYW5kIHdoYXQgaXQgaGVscHMgdmFsaWRhdGUuIEkgd2lsbCBhbHNvIG1ha2Ugc29tZSBub3RlcyBvZiB3aGF0IHRvIGxvb2sgZm9yIGF0IG90aGVyIGxvY2F0aW9ucyBpbiB0aGUgc291cmNlLCB3aGVyZSBpdCBtaWdodCBiZSBjYWxsZWQgZnJvbSBhbmQgdGhlIGNvbnRleHRzIHRoZSBkYXRhIGZsb3dzLlxuXG5NeSBmb2N1cyBuYXJyb3dzLiBPa2F5LCBub3cgbGV0J3MgcHVsbCB1cCB0aGUgYWN0dWFsIHNvdXJjZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NjUwNCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjQ6MzIuNjY0OTM1ODUzWiIsIlNlcSI6MzIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgxOTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzMwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzMwOlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDMzMTpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzMzI6XFx0XFx0XFx0cmV0ID0gcGluX2xvbmd0ZXJtX3Rlc3Rfc3RhcnQoZGF0YSwgYXJnKTtcXG4gMzMzOlxcdFxcdFxcdGJyZWFrO1xcbiAzMzQ6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzMzU6XFx0XFx0XFx0cGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChkYXRhKTtcXG4gMzM2OlxcdFxcdFxcdHJldCA9IDA7XFxuIDMzNzpcXHRcXHRcXHRicmVhaztcXG4gMzM4OlxcdFxcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcXG4gMzM5OlxcdFxcdFxcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoZGF0YSwgYXJnKTtcXG4gMzQwOlxcdFxcdFxcdGJyZWFrO1xcbiAzNDE6XFx0XFx0fVxcbiAzNDI6XFx0XFxuIDM0MzpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmRhdGEtXFx1MDAzZWxvbmd0ZXJtX211dGV4KTtcXG4gMzQ0OlxcdFxcdHJldHVybiByZXQ7XFxuIDM0NTpcXHR9XFxuIDM0NjpcXHRcXG4gMzQ3OlxcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG4gMzQ4OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzNDk6XFx0e1xcbiAzNTA6XFx0XFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcXG4gMzUxOlxcdFxcdGludCByZXQ7XFxuIDM1MjpcXHRcXG4gMzUzOlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDM1NDpcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMzU1OlxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAzNTY6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAzNTc6XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMzU4OlxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuIDM1OTpcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAzNjA6XFx0XFx0XFx0YnJlYWs7XFxuIDM2MTpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzNjI6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzNjM6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEOlxcbiAzNjQ6XFx0XFx0XFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XFxuIDM2NTpcXHRcXHRkZWZhdWx0OlxcbiAzNjY6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDM2NzpcXHRcXHR9XFxuIDM2ODpcXHRcXG4gMzY5OlxcdFxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcXG4gMzcwOlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzE6XFx0XFxuIDM3MjpcXHRcXHRyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgXFx1MDAyNmd1cCk7XFxuIDM3MzpcXHRcXHRpZiAocmV0KVxcbiAzNzQ6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMzc1OlxcdFxcbiAzNzY6XFx0XFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFxcdTAwMjZndXAsIHNpemVvZihndXApKSlcXG4gMzc3OlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzg6XFx0XFxuIDM3OTpcXHRcXHRyZXR1cm4gMDtcXG4gMzgwOlxcdH1cXG4gMzgxOlxcdFxcbiAzODI6XFx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbiAzODM6XFx0e1xcbiAzODQ6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XFxuIDM4NTpcXHRcXHRpbnQgcmV0O1xcbiAzODY6XFx0XFxuIDM4NzpcXHRcXHRkYXRhID0ga3phbGxvY19vYmooKmRhdGEpO1xcbiAzODg6XFx0XFx0aWYgKCFkYXRhKVxcbiAzODk6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjMyLjY2NTAyNDQ0M1oiLCJTZXEiOjMzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjozMzgwMTk5NzkxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEdVUCBUZXN0IElPQ1RMIFBhdGNoKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgZG93biB0aGlzIGBndXBfdGVzdC5jYCBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBleGVjdXRpb24gZmxvdyBhbmQgcGlucG9pbnQgdGhlIHBvdGVudGlhbCBpc3N1ZXMgdGhhdCB0aGlzIGZpeCBhZGRyZXNzZXMuIEZpcnN0LCBJJ20gY2hlY2tpbmcgdGhlIGNvbmRpdGlvbnMgdGhhdCBhcmUgbm93IGFkZGVkOiBgZ3VwLVx1MDAzZXNpemVgIG11c3QgYmUgbm9uLXplcm8sIGAhZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsYCBtdXN0IGJlIG5vbi16ZXJvLCBhbmQgYGd1cC1cdTAwM2VzaXplYCBtdXN0IGJlIHBhZ2UgYWxpZ25lZC4gUHJldmlvdXNseSwgb25seSBgZ3VwLVx1MDAzZWFkZHJgIGFuZCBgZ3VwLVx1MDAzZXNpemVgIHdlcmUgY2hlY2tlZCB0byBiZSB3aXRoaW4gdGhlIGBVTE9OR19NQVhgIGxpbWl0LlxuXG5Ob3cgSSdtIGZvY3VzaW5nIG9uIHRoZSBjb3JlIGxvb3AgbG9naWMuIFRoZSBvcmlnaW5hbCBjb2RlIGhhcyB0aGUgbG9vcCBgZm9yIChhZGRyID0gZ3VwLVx1MDAzZWFkZHI7IGFkZHIgXHUwMDNjIGVuZDsgYWRkciA9IG5leHQpYC4gSW5zaWRlIHRoZSBsb29wLCBgbnJgIHN0YXJ0cyB3aXRoIHRoZSBgZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsYC4gVGhlIGNyaXRpY2FsIHBhcnQgc2VlbXMgdG8gYmUgaG93IGBuZXh0YCBhbmQgYG5yYCBhcmUgdXBkYXRlZCwgZXNwZWNpYWxseSBjb25zaWRlcmluZyB0aGUgaW50ZXJhY3Rpb24gd2l0aCBgZ2V0X3VzZXJfcGFnZXMoKWAuXG5cbkkgY2FuIHNlZSBhIHBvdGVudGlhbCBwcm9ibGVtIGlmIGBndXAtXHUwMDNlc2l6ZWAgaXNuJ3QgcGFnZS1hbGlnbmVkLiBGb3IgaW5zdGFuY2UsIGlmIGBndXAtXHUwMDNlc2l6ZWAgaXMgMSwgYG5yX3BhZ2VzYCBiZWNvbWVzIDAuIFRoZSBga3ZjYWxsb2NgIGFsbG9jYXRlcyB6ZXJvIHBhZ2VzLCBhbmQgYGVuZGAgYmVjb21lcyBgYWRkciArIDFgLiBJZiBgZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsIFx1MDAzZT0gMWAgdGhlbiBgbmV4dCA9IGFkZHIgKyBuciAqIFBBR0VfU0laRWAsIGlmIGBuZXh0IFx1MDAzZSBlbmRgIHdlIHNldCBgbmV4dGAgdG8gYGVuZGAsIGFuZCBjYWxjdWxhdGUgYG5yID0gMGAuIFNvLCBpZiBgbnJgIHN0YXJ0cyBhdCAxLCBgZ2V0X3VzZXJfcGFnZXMoKWAgbWlnaHQgZ2V0IGNhbGxlZCB3aXRoIGBuciA9IDBgLiAgVGhpcyBzZWVtcyBiZW5pZ24sIGJ1dCBpdCBsb29rcyBsaWtlIHdlJ3JlIHBhc3NpbmcgaW4gYW4gaW52YWxpZCBgcGFnZXNgIGFycmF5LCBhbmQgcG90ZW50aWFsbHkgaW4gbGF0ZXIgaXRlcmF0aW9ucyB0aGlzIG1pZ2h0IHJlc3VsdCBpbiBtZW1vcnkgY29ycnVwdGlvbiBieSBwYXNzaW5nIHRoZSB3cm9uZyBwYWdlIHBvaW50ZXIuXG5cblRoZW4gSSBhbSB0aGlua2luZywgd2hhdCBpZiBgZ3VwLVx1MDAzZXNpemUgPT0gMGA/IFRoZSBsb29wIHdvbid0IHJ1bi4gVGhhdCBzZWVtcyBmaW5lLiBIb3dldmVyLCB3aGF0IGlmIGBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgPT0gMGA/IEluc2lkZSB0aGUgbG9vcCwgaWYgYG5yID09IDBgLCB0aGUgY29tcGFyaXNvbiBgbnIgIT0gZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsYCBiZWNvbWVzIGBmYWxzZWAuIEkgY2FuIHNlZSB0aGF0IGBuZXh0YCBzdGF5cyBgYWRkcmAsIGFuZCBgZ2V0X3VzZXJfcGFnZXNgIGNhbGxlZCB3aXRoIGBuciA9IDBgLiBBbmQgYnJlYWtzIHRoZSBsb29wLCB0aGF0IHNlZW1zIGZpbmUuXG5cbk9rYXksIGxldCdzIHRyYWNlIHdpdGggYSBzbGlnaHRseSBtb3JlIGNvbXBsZXggZXhhbXBsZSBub3cuIElmIGBndXAtXHUwMDNlc2l6ZWAgaXMgNDA5NyAoYSBwYWdlIHBsdXMgMSBieXRlKSBhbmQgYGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbGAgaXMgMSwgdGhlIGNvZGUgY2FsY3VsYXRlcyBgbnJfcGFnZXMgPSAxYC4gIGBwYWdlc2AgYWxsb2NhdGVkIGNvcnJlY3RseSB3aXRoIHNpemUgMS4gSW4gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgd2l0aCB0aGUgb3JpZ2luYWwgY29kZSwgYG5leHRgIGJlY29tZXMgYGFkZHIgKyA0MDk2YC4gU2luY2UgYG5leHRgIGlzIG5vdCBncmVhdGVyIHRoYW4gYGVuZGAsIGBnZXRfdXNlcl9wYWdlc2AgZ2V0cyBjYWxsZWQgd2l0aCBgbnIgPSAxYC4gSW4gdGhlIHNlY29uZCBpdGVyYXRpb24sIGBhZGRyYCBiZWNvbWVzIGBhZGRyICsgNDA5NmAuIE5vdywgYGFkZHIgXHUwMDNjIGVuZGAsIHRoZSBsb29wIGNvbnRpbnVlcy4gYG5leHQgPSBhZGRyICsgNDA5NmAuIEhvd2V2ZXIsIHNpbmNlIGBuZXh0IFx1MDAzZSBlbmRgLCBgbmV4dCA9IGVuZGAsIGFuZCBgbnJgIGdldHMgc2V0IHRvIDAuIFNvLCBvbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgd2UgZW5kIHVwIGNhbGxpbmcgYGdldF91c2VyX3BhZ2VzKClgIHdpdGggYG5yID0gMGAgYnV0IGFjY2Vzc2luZyB0aGUgYHBhZ2VzYCBhcnJheSBhdCBpbmRleCBgMWAsIHNvIG91dCBvZiBib3VuZHMuXG5cbk5vdyB0aGUgbmV3IGNvZGUgd2l0aCBgbnIgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBuciwgKGVuZCAtIGFkZHIpIC8gUEFHRV9TSVpFKTtgLiBMZXQncyBzZWUgaG93IHRoYXQgY2hhbmdlIGhlbHBzIHRoZSBwcm9ibGVtLiBOb3csIGlmIHRoZSBgZ3VwLVx1MDAzZXNpemVgIGlzIG5vdCBwYWdlIGFsaWduZWQgYW5kIHdlIG9ubHkgaGF2ZSBvbmUgcGFnZSAoZS5nLiA0MDk3KSwgdGhlIG5ldyBjb2RlIG1ha2VzIHN1cmUgdGhhdCBvbiB0aGUgbGFzdCBpdGVyYXRpb24sIGl0IHVzZXMgYSBwYXJ0aWFsIHBhZ2UuIFRoZSBtb3N0IGltcG9ydGFudCBkaWZmZXJlbmNlIG5vdyBpcyB0aGF0IHdlIGFyZSBsaW1pdGluZyBgbnJgIHRvIHRoZSBzaXplIG9mIHRoZSByZW1haW5pbmcgcGFnZXMuXG5cblRoZSBvcmlnaW5hbCBjb2RlJ3MgbG9naWMgb2YgdXBkYXRpbmcgYG5yYCBsb29rcyB3cm9uZy4gSWYgdGhlIHJlbWFpbmluZyBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBwYWdlIHNpemUsIGl0IGNvdWxkIHJlc3VsdCBpbiBvdXQtb2YtYm91bmRzIGFjY2VzcyB0byB0aGUgYHBhZ2VzYCBhcnJheSwgYW5kIHBvdGVudGlhbGx5IGNhdXNpbmcgYSB3cml0ZSB0byBpbmNvcnJlY3QgbWVtb3J5IGFkZHJlc3Nlcy4gVGhlIG5ldyBsaW5lIGBuciA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG5yLCAoZW5kIC0gYWRkcikgLyBQQUdFX1NJWkUpO2AgZWxlZ2FudGx5IHNvbHZlcyB0aGlzIGJ5IGVuc3VyaW5nIGBucmAgaXMgdGhlIG1pbmltdW0gYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHBhZ2VzIHBlciBjYWxsIGFuZCBob3cgbWFueSB3aG9sZSBwYWdlcyBhcmUgbGVmdC5cblxuSSBuZWVkIHRvIGNvbmZpcm0gYnkgc2VhcmNoaW5nIHRoZSBnaXQgbG9nIGZvciBhIHNpbWlsYXIgZml4LiBUaGlzIHBhdGNoIGNvcnJlY3RseSBoYW5kbGVzIGNhc2VzIHdoZXJlIGBndXAtXHUwMDNlc2l6ZWAgaXMgbm90IHBhZ2UtYWxpZ25lZCwgYGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbGAgaXMgemVybywgYW5kIHBvdGVudGlhbCBmb3IgbWVtb3J5IGVycm9ycyByZWxhdGVkIHRvIHVuZGVyLWFsbG9jYXRpb25cblxuIiwiSW5wdXRUb2tlbnMiOjc2ODgsIk91dHB1dFRva2VucyI6NDcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODQyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjU6MDYuNDY3MDI2NDg3WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NzY2ODg2NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtaW5fdFxcXFwodW5zaWduZWQgbG9uZywgbnIsIFxcXFwoZW5kIC0gYWRkclxcXFwpIC8gUEFHRV9TSVpFXFxcXClcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vZ3VwX3Rlc3QuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTQyLVxcbm1tL2d1cF90ZXN0LmM6MTQzOlxcdFxcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XFxubW0vZ3VwX3Rlc3QuYy0xNDQtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI1OjA2LjUxNDcwNDgwM1oiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxNzI1OTg0MDcxNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEdVUCBUZXN0IFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCB0aG91Z2h0LCBJJ2QgdXN1YWxseSBjaGVjayB0aGUgY29tbWl0IGhpc3Rvcnkgd2l0aCBgZ2l0IGxvZ2AsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoYXQgdG9vbCBoYW5keS4gTm8gcHJvYmxlbS4gV2UnbGwgZ28gcmlnaHQgaW50byB0aGUgcGF0Y2ggaXRzZWxmIGFuZCBzZWUgd2hhdCdzIGNoYW5nZWQuIFRoZSBwcmltYXJ5IGZvY3VzIGhlcmUgaXMgb24gdW5kZXJzdGFuZGluZyB0aGUgaW50ZXJhY3Rpb24gb2YgdGhpcyBjb2RlIHdpdGggS0FTQU4gYW5kIEtNU0FOLCBzbyB3ZSBuZWVkIHRvIGJlIG1ldGljdWxvdXMuXG5cbkxvb2tpbmcgYXQgdGhlIGRpZmYsIGl0J3MgY2xlYXIgdGhlIHBhdGNoIHByaW1hcmlseSBmb2N1c2VzIG9uIGBtbS9ndXBfdGVzdC5jYCBhbmQgc3BlY2lmaWNhbGx5IHRoZSBgX19ndXBfdGVzdF9pb2N0bGAgZnVuY3Rpb24uIFRoZSBmaXJzdCBwYXJ0IGludHJvZHVjZXMgc29tZSBjcnVjaWFsIHZhbGlkYXRpb24gY2hlY2tzLiBXZSdyZSBub3cgdmFsaWRhdGluZyBgZ3VwLVx1MDAzZXNpemVgLCBtYWtpbmcgc3VyZSBpdCdzIG5vbi16ZXJvLCB0aGF0IGBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGxgIGlzIGFsc28gbm9uLXplcm8gYW5kIHRoYXQgYGd1cC1cdTAwM2VzaXplYCBpcyBwYWdlLWFsaWduZWQuIFRoYXQncyBnb29kLCBpdCB0aWdodGVucyB1cCB0aGUgaW5wdXQgYXNzdW1wdGlvbnMuXG5cblRoZSBzZWNvbmQgcGFydCBvZiB0aGUgcGF0Y2ggY2xlYW5zIHVwIGEgY2FsY3VsYXRpb24gaW52b2x2aW5nIGBucmAgYW5kIGBuZXh0YCwgc3BlY2lmaWNhbGx5OiBJdCBhZGp1c3RzIHRoZSBjYWxjdWxhdGlvbiB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjYWxjdWxhdGVkIGBuZXh0YCB3b3VsZCBoYXZlIGV4Y2VlZGVkIHRoZSBgZW5kYCB2YWx1ZSwgaXQgY29ycmVjdHMgdGhlIGNhbGN1bGF0aW9uIGxvZ2ljLCBhbmQgaXQgd2lsbCBub3cgZW5zdXJlIHRoYXQgdGhlc2UgdmFsdWVzIGFyZSBtb3JlIHByZWNpc2UuIFRoZSBpbXByb3ZlZCBmb3JtdWxhIGxvb2tzIG1vcmUgcm9idXN0LiBXaXRoIHRoZSBzaXplIG5vdyBndWFyYW50ZWVkIHRvIGJlIHBhZ2UtYWxpZ25lZCBhbmQgbm9uLXplcm8sIHRoaXMgc2ltcGxpZmllZCBjYWxjdWxhdGlvbiBpcyBub3cgYWxzbyBleGFjdCwgbWFraW5nIHRoZSBjb2RlIG1vcmUgcmVsaWFibGUuXG5cbk5vdywgdGhlIGltcG9ydGFudCBwYXJ0OiBEb2VzIHRoaXMgdG91Y2ggdW5pbml0aWFsaXplZCBtZW1vcnk/IE5vLCBhbmQgZG9lcyBpdCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5IGFueSBzdHJ1Y3QgY29waWVkIHRvIHVzZXJzcGFjZSB0aGF0IGNvdWxkIGhhdmUgdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIGZpZWxkcz8gTGV0J3MgY2hlY2suICBJIG5lZWQgdG8gY2hlY2sgaG93IHRoZSBgZ3VwYCBzdHJ1Y3QgaXMgaGFuZGxlZC4gIEFoYSEgIEkgc2VlIHRoZSBgY29weV9mcm9tX3VzZXJgIGFuZCBgY29weV90b191c2VyYCBjYWxscyB3aXRoaW4gYGd1cF90ZXN0X2lvY3RsYC4gVGhlIGNvZGUgKmNvcGllcyogYGd1cGAgZnJvbSB1c2Vyc3BhY2UsIHdoaWNoIG1lYW5zIGFsbCBieXRlcyAoaW5jbHVkaW5nIGFueSBwYWRkaW5nKSBhcmUgaW5pdGlhbGl6ZWQgZnJvbSB1c2Vyc3BhY2UgKmJlZm9yZSogdGhlIGZ1bmN0aW9uIGlzIGV2ZW4gZW50ZXJlZC4gIFRoaXMgaXMgYSBjcml0aWNhbCBwb2ludCBmcm9tIGEgc2VjdXJpdHkgYW5kIG1lbW9yeSBzYWZldHkgcGVyc3BlY3RpdmUuIEZ1cnRoZXJtb3JlLCBpbiB0aGUgaGFwcHkgcGF0aCAod2hlbiB0aGUgZnVuY3Rpb24gZXhlY3V0ZXMgd2l0aCB0aGUgZ29vZCByZXR1cm4pLCB0aGUgcmVzdWx0cyBhcmUgY29waWVkIGJhY2suIFRoZSBrZXkgaXMsIHRoYXQgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvciwgdGhlbiB0aGVyZSBpcyBubyBgY29weV90b191c2VyYCBjYWxsLCB3aGljaCBpcyBhbHNvIGltcG9ydGFudC4gVGhlIGFkZGVkIGlucHV0IHZhbGlkYXRpb25zIGVhcmxpZXIgc2hvdWxkIHByZXZlbnQgdGhlIHNpdHVhdGlvbi4gVGhpcyBoZWxwcyBlbnN1cmUgdGhhdCB0aGUgYGd1cGAgc3RydWN0IGlzIGNvcnJlY3RseSBpbml0aWFsaXplZCBhbmQgYW55IGNoYW5nZXMgbWFkZSBkdXJpbmcgdGhlIGBfX2d1cF90ZXN0X2lvY3RsYCBleGVjdXRpb24gYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgdXNlci1zcGFjZS5cblxuTGV0J3MgZG8gYSBxdWljayBzY2FuIG9mIGFsbCBhY2Nlc3NlcyB0byBgZ3VwYCBpbiB0aGUgZmlsZSBqdXN0IHRvIGJlIGV4dHJhIHN1cmUsIGJ1dCBJJ20gZmVlbGluZyBjb25maWRlbnQgYWJvdXQgdGhpcyBwYXRjaC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA3MDgsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDc0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI1OjIzLjc3NDU0OTE1WiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTYxODE1MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJndXAtXFx1MDAzZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9ndXBfdGVzdC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cF90ZXN0LmM9NzY9c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbi0tXFxubW0vZ3VwX3Rlc3QuYy04Ni1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVA7IGkrKykge1xcbm1tL2d1cF90ZXN0LmM6ODc6XFx0XFx0aWYgKGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0gXFx1MDAzZSBucl9wYWdlcykge1xcbm1tL2d1cF90ZXN0LmMtODgtXFx0XFx0XFx0cHJfd2FybihcXFwiWkVST0lORyBkdWUgdG8gb3V0IG9mIHJhbmdlOiAud2hpY2hfcGFnZXNbJXVdOiAldVxcXFxuXFxcIixcXG5tbS9ndXBfdGVzdC5jOjg5OlxcdFxcdFxcdFxcdGksIGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0pO1xcbm1tL2d1cF90ZXN0LmM6OTA6XFx0XFx0XFx0Z3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXSA9IDA7XFxubW0vZ3VwX3Rlc3QuYy05MS1cXHRcXHR9XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTk0LVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSsrKSB7XFxubW0vZ3VwX3Rlc3QuYzo5NTpcXHRcXHRpbmRleF90b19kdW1wID0gZ3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXTtcXG5tbS9ndXBfdGVzdC5jLTk2LVxcbi0tXFxubW0vZ3VwX3Rlc3QuYy05OS1cXHRcXHRcXHRwcl9pbmZvKFxcXCItLS0tIHBhZ2UgIyV1LCBzdGFydGluZyBmcm9tIHVzZXIgdmlydCBhZGRyOiAweCVsbHhcXFxcblxcXCIsXFxubW0vZ3VwX3Rlc3QuYzoxMDA6XFx0XFx0XFx0XFx0aW5kZXhfdG9fZHVtcCwgZ3VwLVxcdTAwM2VhZGRyKTtcXG5tbS9ndXBfdGVzdC5jLTEwMS1cXHRcXHRcXHRkdW1wX3BhZ2UocGFnZXNbaW5kZXhfdG9fZHVtcF0sXFxuLS1cXG5tbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTE4LVxcbm1tL2d1cF90ZXN0LmM6MTE5OlxcdGlmIChndXAtXFx1MDAzZWFkZHIgXFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVxcdTAwM2VzaXplIFxcdTAwM2UgVUxPTkdfTUFYIHx8ICFndXAtXFx1MDAzZXNpemUgfHxcXG5tbS9ndXBfdGVzdC5jOjEyMDpcXHQgICAgIWd1cC1cXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgfHwgIVBBR0VfQUxJR05FRChndXAtXFx1MDAzZXNpemUpKVxcbm1tL2d1cF90ZXN0LmMtMTIxLVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbm1tL2d1cF90ZXN0LmM6MTIyOlxcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVxcdTAwM2VhZGRyLFxcbm1tL2d1cF90ZXN0LmM6MTIzOlxcdFxcdFxcdCAgICAgICAodW5zaWduZWQgbG9uZylndXAtXFx1MDAzZXNpemUsIFxcdTAwMjZlbmQpKVxcbm1tL2d1cF90ZXN0LmMtMTI0LVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbm1tL2d1cF90ZXN0LmMtMTI1LVxcbm1tL2d1cF90ZXN0LmM6MTI2OlxcdG5yX3BhZ2VzID0gZ3VwLVxcdTAwM2VzaXplIC8gUEFHRV9TSVpFO1xcbm1tL2d1cF90ZXN0LmMtMTI3LVxcdHBhZ2VzID0ga3ZjYWxsb2MobnJfcGFnZXMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTM2LVxcdGkgPSAwO1xcbm1tL2d1cF90ZXN0LmM6MTM3OlxcdG5yID0gZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcXG5tbS9ndXBfdGVzdC5jLTEzOC1cXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XFxubW0vZ3VwX3Rlc3QuYzoxMzk6XFx0Zm9yIChhZGRyID0gZ3VwLVxcdTAwM2VhZGRyOyBhZGRyIFxcdTAwM2MgZW5kOyBhZGRyID0gbmV4dCkge1xcbm1tL2d1cF90ZXN0LmM6MTQwOlxcdFxcdGlmIChuciAhPSBndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxcbm1tL2d1cF90ZXN0LmMtMTQxLVxcdFxcdFxcdGJyZWFrO1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy0xNDgtXFx0XFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XFxubW0vZ3VwX3Rlc3QuYzoxNDk6XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG5tbS9ndXBfdGVzdC5jLTE1MC1cXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTUyLVxcdFxcdGNhc2UgR1VQX0JBU0lDX1RFU1Q6XFxubW0vZ3VwX3Rlc3QuYzoxNTM6XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxubW0vZ3VwX3Rlc3QuYy0xNTQtXFx0XFx0XFx0YnJlYWs7XFxubW0vZ3VwX3Rlc3QuYy0xNTUtXFx0XFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XFxubW0vZ3VwX3Rlc3QuYzoxNTY6XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG5tbS9ndXBfdGVzdC5jLTE1Ny1cXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTU5LVxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxubW0vZ3VwX3Rlc3QuYzoxNjA6XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxubW0vZ3VwX3Rlc3QuYy0xNjEtXFx0XFx0XFx0YnJlYWs7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTE2My1cXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLFxcbm1tL2d1cF90ZXN0LmM6MTY0OlxcdFxcdFxcdFxcdFxcdCAgICBndXAtXFx1MDAzZWd1cF9mbGFncyB8IEZPTExfTE9OR1RFUk0sXFxubW0vZ3VwX3Rlc3QuYy0xNjUtXFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTE2Ny1cXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbm1tL2d1cF90ZXN0LmM6MTY4OlxcdFxcdFxcdGlmIChndXAtXFx1MDAzZXRlc3RfZmxhZ3MgXFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTilcXG5tbS9ndXBfdGVzdC5jOjE2OTpcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG5tbS9ndXBfdGVzdC5jLTE3MC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG5tbS9ndXBfdGVzdC5jLTE3MS1cXHRcXHRcXHRlbHNlXFxubW0vZ3VwX3Rlc3QuYzoxNzI6XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxubW0vZ3VwX3Rlc3QuYy0xNzMtXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTE4OC1cXG5tbS9ndXBfdGVzdC5jOjE4OTpcXHRndXAtXFx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xcbm1tL2d1cF90ZXN0LmM6MTkwOlxcdGd1cC1cXHUwMDNlc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xcbm1tL2d1cF90ZXN0LmMtMTkxLVxcbi0tXFxubW0vZ3VwX3Rlc3QuYy0yMDItXFxubW0vZ3VwX3Rlc3QuYzoyMDM6XFx0cHV0X2JhY2tfcGFnZXMoY21kLCBwYWdlcywgbnJfcGFnZXMsIGd1cC1cXHUwMDNldGVzdF9mbGFncyk7XFxubW0vZ3VwX3Rlc3QuYy0yMDQtXFxubW0vZ3VwX3Rlc3QuYy0yMDUtXFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcXG5tbS9ndXBfdGVzdC5jOjIwNjpcXHRndXAtXFx1MDAzZXB1dF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xcbm1tL2d1cF90ZXN0LmMtMjA3LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyNToyMy44MjAxNzA0ODNaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjY4MTI1MzYwODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gUmVhc29uaW5nOiBOZWVkc0tNU0FOID0gZmFsc2UqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoZSBwYXRjaCBpbiBxdWVzdGlvbiBzaWduaWZpY2FudGx5IHN0cmVuZ3RoZW5zIHRoZSBgZ3VwX3Rlc3RgIGlvY3RsIGhhbmRsZXIuIE15IGFzc2Vzc21lbnQgaXMgdGhhdCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgIGhlcmUuXG5cblRoZSBwYXRjaCBpdHNlbGYgZm9jdXNlcyBvbiBpbnB1dCB2YWxpZGF0aW9uIGFuZCBsb29wIGNhbGN1bGF0aW9uIGNvcnJlY3Rpb25zLiBTcGVjaWZpY2FsbHk6IGl0IGFkZHMgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSBpbnB1dCBgZ3VwLVx1MDAzZXNpemVgIGFuZCBgZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsYCBhcmUgdmFsaWQgdmFsdWVzIChwb3NpdGl2ZSwgbm90IGV4Y2VlZGluZyBgVUxPTkdfTUFYYCwgYW5kIGBndXAtXHUwMDNlc2l6ZWAgaXMgcGFnZS1hbGlnbmVkKS4gSXQgYWxzbyBtb2RpZmllcyB0aGUgbG9vcCBjYWxjdWxhdGlvbiB0byB1c2UgYG1pbl90YCB3aGljaCBzaW1wbGlmaWVzIHRoZSBjYWxjdWxhdGlvbnMsIHByZXZlbnRpbmcgb3V0LW9mLWJvdW5kcyBhY2Nlc3MuXG5cbkJlZm9yZSB0aGUgcGF0Y2gsIGEgemVybyBvciB1bmFsaWduZWQgYGd1cC1cdTAwM2VzaXplYCBvciBhIHplcm8gYGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbGAgd291bGQgbGVhZCB0byBlaXRoZXIgaW5maW5pdGUgbG9vcHMgKGJlY2F1c2UgdGhlIGxvb3AgdGVybWluYXRpb24gY29uZGl0aW9uIHdvdWxkIG5ldmVyIGJlIG1ldCkgb3Igb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzZXMgaW4gdGhlIGBwYWdlc2AgYXJyYXkgZHVlIHRvIGluY29ycmVjdCBsb29wIGl0ZXJhdGlvbi5cblxuTm93LCBsZXQncyBleGFtaW5lIHRoZSBLTVNBTiBjcml0ZXJpYTpcblxuMS4gICoqS2VybmVsIHN0cnVjdHVyZXMgdG8gdXNlcnNwYWNlOioqIE5vcGUuIFRoZSBpb2N0bCBjb3BpZXMgKmZyb20qIHVzZXJzcGFjZSAqdG8qIHRoZSBrZXJuZWwsIGluaXRpYWxpemluZyB0aGUgYGd1cGAgc3RydWN0LiBUaGVyZSdzIG5vIGRhdGEgYmVpbmcgc2VudCAqdG8qIHVzZXJzcGFjZSB0aGF0IGNvdWxkIGhhdmUgdW5pbml0aWFsaXplZCBtZW1vcnkuXG4yLiAgKipDb25kaXRpb25hbCBsb2dpYyBvbiB1bmluaXRpYWxpemVkIGRhdGE6KiogTm8uIEFsbCB2YXJpYWJsZXMsIGluY2x1ZGluZyB0aGUgYGd1cGAgc3RydWN0LCBhbmQgbG9jYWwgdmFyaWFibGVzIHdpdGhpbiB0aGUgZnVuY3Rpb24gYXJlIGluaXRpYWxpemVkLiBga3ZjYWxsb2NgIHplcm8taW5pdGlhbGl6ZXMgdGhlIGBwYWdlc2AgYXJyYXksIGFuZCBgY29weV9mcm9tX3VzZXJgIHBvcHVsYXRlcyB0aGUgdXNlci1zdXBwbGllZCB2YWx1ZXMuIFRoZSBsb2dpYyBub3cgKnByZXZlbnRzKiBpc3N1ZXMsIHJhdGhlciB0aGFuIGludHJvZHVjaW5nIHRoZW0uXG4zLiAgKipDb21wbGV4IGRhdGEgc3RydWN0dXJlIGFsbG9jYXRpb24vaW5pdGlhbGl6YXRpb246KiogIGBrdmNhbGxvY2AgaXMgdXNlZCB0byBhbGxvY2F0ZSB0aGUgYHBhZ2VzYCBhcnJheSB3aGljaCBpcyB6ZXJvLWluaXRpYWxpemVkIGFuZCB0aGVuIHBvcHVsYXRlZCwgYXMgd2VsbCBhcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYGd1cGAgZnJvbSB0aGUgdXNlcnNwYWNlIGJ1ZmZlci4gTm8gdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIHJlYWQgaW4gcmVhY2hhYmxlIGNvZGUuXG40LiAgKipCb3VuZHMgY2hlY2tzIGFmZmVjdGluZyB1bmluaXRpYWxpemVkIGJ5dGVzOioqIFRoZSBwYXRjaCBmaXhlcyBib3VuZHMgY2hlY2tzIGluIHRoZSBsb29wIGNhbGN1bGF0aW9uIHRvIHByZXZlbnQgYWNjZXNzaW5nIG1lbW9yeSBvdXRzaWRlIG9mIHRoZSBhbGxvY2F0ZWQgYHBhZ2VzYCBhcnJheSwgc28gaXQgcmVkdWNlcywgcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcsIHJpc2sgb2YgdW5pbml0aWFsaXplZCBhY2Nlc3MuXG5cblRoZSBtYWluIHJpc2tzIGFkZHJlc3NlZCBieSB0aGUgcGF0Y2ggYXJlIGFjdHVhbGx5IG91dC1vZi1ib3VuZHMgYXJyYXkgYWNjZXNzIChLQVNBTikgYW5kIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wcyBvciBzb2Z0bG9ja3VwcyAoZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIG1lY2hhbmlzbXMpLiBUaGVzZSBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5IGV4aXN0aW5nIGtlcm5lbCBkZWJ1Z2dlcnMuIFRoZXJlJ3Mgbm8gZXZpZGVuY2Ugb2YgbmV3IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaC4gVGh1cywgYE5lZWRzS01TQU4gPSBmYWxzZWAuIEknbSBjb25maWRlbnQgaW4gdGhpcyBhc3Nlc3NtZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDA5MywiT3V0cHV0VG9rZW5zIjoyNDMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTEwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI1OjUwLjYzMjcwODk4OVoiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5NTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgbW0vZ3VwX3Rlc3QuYyB0byBhZGQgaW5wdXQgcGFyYW1ldGVyIHZhbGlkYXRpb24gKGNoZWNraW5nIHRoYXQgZ3VwLVxcdTAwM2VzaXplIGlzIG5vbi16ZXJvIGFuZCBQQUdFX0FMSUdORUQsIGFuZCB0aGF0IGd1cC1cXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgaXMgbm9uLXplcm8pIGFuZCBzaW1wbGlmaWVzIHRoZSBwZXItaXRlcmF0aW9uIHBhZ2UgY291bnQgY2FsY3VsYXRpb24gdXNpbmcgbWluX3QoKS4gXFxuXFxuVGhlIGlzc3VlcyBhZGRyZXNzZWQgYnkgdGhpcyBwYXRjaCBhcmUgaW5maW5pdGUgbG9vcHMgKHdoZW4gbnJfcGFnZXNfcGVyX2NhbGwgaXMgMCkgYW5kIG91dC1vZi1ib3VuZHMgYnVmZmVyIGluZGV4aW5nIG9uIHRoZSBgcGFnZXNgIGFycmF5ICh3aGVuIGd1cC1cXHUwMDNlc2l6ZSB3YXMgbm90IHBhZ2UtYWxpZ25lZCkuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGRldGVjdGVkIGJ5IGxvY2t1cC93YXRjaGRvZyBkZXRlY3RvcnMgYW5kIEtBU0FOIChLZXJuZWxBZGRyZXNzU2FuaXRpemVyKSwgcmVzcGVjdGl2ZWx5LlxcblxcbkFsbCBidWZmZXJzIGludm9sdmVkICh0aGUgc3RhY2stYWxsb2NhdGVkIHN0cnVjdCBndXBfdGVzdCBhbmQgdGhlIGhlYXAtYWxsb2NhdGVkIHBhZ2VzIGFycmF5KSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGNvcHlfZnJvbV91c2VyKCkgYW5kIGt2Y2FsbG9jKCkuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgc3RydWN0IHBhZGRpbmcgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGlzIGNoYW5nZS4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBtbS9ndXBfdGVzdC5jIHRvIGFkZCBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAoY2hlY2tpbmcgdGhhdCBndXAtXFx1MDAzZXNpemUgaXMgbm9uLXplcm8gYW5kIFBBR0VfQUxJR05FRCwgYW5kIHRoYXQgZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcXG5cXG5UaGUgaXNzdWVzIGFkZHJlc3NlZCBieSB0aGlzIHBhdGNoIGFyZSBpbmZpbml0ZSBsb29wcyAod2hlbiBucl9wYWdlc19wZXJfY2FsbCBpcyAwKSBhbmQgb3V0LW9mLWJvdW5kcyBidWZmZXIgaW5kZXhpbmcgb24gdGhlIGBwYWdlc2AgYXJyYXkgKHdoZW4gZ3VwLVxcdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXFxuXFxuQWxsIGJ1ZmZlcnMgaW52b2x2ZWQgKHRoZSBzdGFjay1hbGxvY2F0ZWQgc3RydWN0IGd1cF90ZXN0IGFuZCB0aGUgaGVhcC1hbGxvY2F0ZWQgcGFnZXMgYXJyYXkpIGFyZSBmdWxseSBpbml0aWFsaXplZCB2aWEgY29weV9mcm9tX3VzZXIoKSBhbmQga3ZjYWxsb2MoKS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBzdHJ1Y3QgcGFkZGluZyBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoaXMgY2hhbmdlLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowgb424[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-15 12:19:57 +0000 UTC FinishedAt: 2026-09-15 12:25:52 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "b08a65b93426d86e3f354d655d6225397b591877", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "GUP_TEST", "DEBUG_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "b08a65b93426d86e3f354d655d6225397b591877", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "GUP_TEST", "DEBUG_FS" ], "series_id": "b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "__gup_test_ioctl", "gup_test_ioctl" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "", "base_commit": "b08a65b93426d86e3f354d655d6225397b591877", "base_tree": "mm-new" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0dVUF9URVNUJiMzNDssCiAgICAmIzM0O0RFQlVHX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19ndXBfdGVzdF9pb2N0bCYjMzQ7LAogICAgJiMzNDtndXBfdGVzdF9pb2N0bCYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1tL2d1cF90ZXN0LmMgdG8gYWRkIGlucHV0IHBhcmFtZXRlciB2YWxpZGF0aW9uIChjaGVja2luZyB0aGF0IGd1cC1cdTAwM2VzaXplIGlzIG5vbi16ZXJvIGFuZCBQQUdFX0FMSUdORUQsIGFuZCB0aGF0IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcblxuVGhlIGlzc3VlcyBhZGRyZXNzZWQgYnkgdGhpcyBwYXRjaCBhcmUgaW5maW5pdGUgbG9vcHMgKHdoZW4gbnJfcGFnZXNfcGVyX2NhbGwgaXMgMCkgYW5kIG91dC1vZi1ib3VuZHMgYnVmZmVyIGluZGV4aW5nIG9uIHRoZSBgcGFnZXNgIGFycmF5ICh3aGVuIGd1cC1cdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXG5cbkFsbCBidWZmZXJzIGludm9sdmVkICh0aGUgc3RhY2stYWxsb2NhdGVkIHN0cnVjdCBndXBfdGVzdCBhbmQgdGhlIGhlYXAtYWxsb2NhdGVkIHBhZ2VzIGFycmF5KSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGNvcHlfZnJvbV91c2VyKCkgYW5kIGt2Y2FsbG9jKCkuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgc3RydWN0IHBhZGRpbmcgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGlzIGNoYW5nZS4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgaW5wdXQgdmFsaWRhdGlvbiBjaGVja3MgYW5kIGl0ZXJhdGlvbiBsb2dpYyBmb3IgcGFnZSBwaW5uaW5nIGFuZCBnZXRfdXNlcl9wYWdlcyBsb29wcyBpbiBfX2d1cF90ZXN0X2lvY3RsKCkgKG1tL2d1cF90ZXN0LmMpLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgYm91bmRhcnkgY29uZGl0aW9uIGhhbmRsaW5nIGFuZCBwb3RlbnRpYWwgcmVncmVzc2lvbnMgaW4gcGFnZSByYW5nZSBoYW5kbGluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDRiYjVmZDI0M2NjZDZlZDUwNmIzZDNmYzY5MzkyZTk3YWY3MTFlM2JcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIFNlcCAxNSAxMjoyMTozOSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xuaW5kZXggMTg1YmEzYmI4ZWQxMC4uYmE3NGJmM2Y0MTA0OCAxMDA2NDRcbi0tLSBhL21tL2d1cF90ZXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2d1cF90ZXN0LmNcbkBAIC0xMTYsNyAmIzQzOzExNiw4IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIFx0Ym9vbCBuZWVkc19tbWFwX2xvY2sgPVxuIFx0XHRjbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLIFx1MDAyNlx1MDAyNiBjbWQgIT0gUElOX0ZBU1RfQkVOQ0hNQVJLO1xuIFxuLVx0aWYgKGd1cC1cdTAwM2VhZGRyIFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVx1MDAzZXNpemUgXHUwMDNlIFVMT05HX01BWClcbiYjNDM7XHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYIHx8ICFndXAtXHUwMDNlc2l6ZSB8fFxuJiM0MztcdCAgICAhZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsIHx8ICFQQUdFX0FMSUdORUQoZ3VwLVx1MDAzZXNpemUpKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG4gXHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxuQEAgLTEzOSwxMSAmIzQzOzE0MCw5IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRpZiAobnIgIT0gZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxuIFx0XHRcdGJyZWFrO1xuIFxuJiM0MztcdFx0bnIgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBuciwgKGVuZCAtIGFkZHIpIC8gUEFHRV9TSVpFKTtcbiYjNDM7XG4gXHRcdG5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFO1xuLVx0XHRpZiAobmV4dCBcdTAwM2UgZW5kKSB7XG4tXHRcdFx0bmV4dCA9IGVuZDtcbi1cdFx0XHRuciA9IChuZXh0IC0gYWRkcikgLyBQQUdFX1NJWkU7XG4tXHRcdH1cbiBcbiBcdFx0c3dpdGNoIChjbWQpIHtcbiBcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7R1VQX1RFU1QmIzM0OywKICAgICYjMzQ7REVCVUdfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX2d1cF90ZXN0X2lvY3RsJiMzNDssCiAgICAmIzM0O2d1cF90ZXN0X2lvY3RsJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGlucHV0IHZhbGlkYXRpb24gY2hlY2tzIGFuZCBpdGVyYXRpb24gbG9naWMgZm9yIHBhZ2UgcGlubmluZyBhbmQgZ2V0X3VzZXJfcGFnZXMgbG9vcHMgaW4gX19ndXBfdGVzdF9pb2N0bCgpIChtbS9ndXBfdGVzdC5jKS4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW9jdGxzIG9uIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIGJvdW5kYXJ5IGNvbmRpdGlvbiBoYW5kbGluZyBhbmQgcG90ZW50aWFsIHJlZ3Jlc3Npb25zIGluIHBhZ2UgcmFuZ2UgaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA0YmI1ZmQyNDNjY2Q2ZWQ1MDZiM2QzZmM2OTM5MmU5N2FmNzExZTNiCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBTZXAgMTUgMTI6MjE6MzkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuYwppbmRleCAxODViYTNiYjhlZDEwLi5iYTc0YmYzZjQxMDQ4IDEwMDY0NAotLS0gYS9tbS9ndXBfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2d1cF90ZXN0LmMKQEAgLTExNiw3ICYjNDM7MTE2LDggQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsCiAJYm9vbCBuZWVkc19tbWFwX2xvY2sgPQogCQljbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLICZhbXA7JmFtcDsgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSzsKIAotCWlmIChndXAtJmd0O2FkZHIgJmd0OyBVTE9OR19NQVggfHwgZ3VwLSZndDtzaXplICZndDsgVUxPTkdfTUFYKQomIzQzOwlpZiAoZ3VwLSZndDthZGRyICZndDsgVUxPTkdfTUFYIHx8IGd1cC0mZ3Q7c2l6ZSAmZ3Q7IFVMT05HX01BWCB8fCAhZ3VwLSZndDtzaXplIHx8CiYjNDM7CSAgICAhZ3VwLSZndDtucl9wYWdlc19wZXJfY2FsbCB8fCAhUEFHRV9BTElHTkVEKGd1cC0mZ3Q7c2l6ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLSZndDthZGRyLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC0mZ3Q7c2l6ZSwgJmFtcDtlbmQpKQpAQCAtMTM5LDExICYjNDM7MTQwLDkgQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsCiAJCWlmIChuciAhPSBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsKQogCQkJYnJlYWs7CiAKJiM0MzsJCW5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7CiYjNDM7CiAJCW5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFOwotCQlpZiAobmV4dCAmZ3Q7IGVuZCkgewotCQkJbmV4dCA9IGVuZDsKLQkJCW5yID0gKG5leHQgLSBhZGRyKSAvIFBBR0VfU0laRTsKLQkJfQogCiAJCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDg0CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBLZXJuZWwgUGF0Y2g6IG1tL2d1cF90ZXN0LmMqKgoKQWxyaWdodCwgSSBzZWUgd2hhdCYjMzk7cyBiZWluZyBhc2tlZCBoZXJlLiBXZSYjMzk7cmUgbG9va2luZyBhdCBldmFsdWF0aW5nIGEga2VybmVsIHBhdGNoLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBhbWQ2NCBhcmNoaXRlY3R1cmUuIE15IGZpcnN0IHN0ZXAgaXMgdG8gZGl2ZSByaWdodCBpbiB3aXRoIHRoZSBlc3RhYmxpc2hlZCB0b29saW5nIOKAkyBsZXQmIzM5O3MgZ2V0IHRoZSBjb21taXQgZGV0YWlscyBhbmQgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuIEl0IHNlZW1zIHRoZSBmaWxlIG9mIGludGVyZXN0IGlzIGBtbS9ndXBfdGVzdC5jYC4gR2l2ZW4gdGhlIHRhc2ssIGFuZCB0aGUgZm9jdXMgb24ga2VybmVsIG1lbW9yeSBtYW5hZ2VtZW50LCBJJiMzOTtsbCBiZSBob25pbmcgaW4gb24gdGhlIGNvZGUgYXJvdW5kIGxpbmUgMTE2LiBUaGF0IGFyZWEgd2lsbCBwcm92aWRlIGEgc29saWQgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGludGVudCBhbmQgdGhlIHBvdGVudGlhbCBpbXBhY3Qgb2YgdGhlIHByb3Bvc2VkIGNoYW5nZXMgd2l0aGluIHRoZSBgZ3VwX3Rlc3QuY2AgbW9kdWxlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIHBhdGNoIHdpdGhpbiBpdHMgYnJvYWRlciBjb250ZXh0IHRvIHByb3Blcmx5IGV2YWx1YXRlIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vZ3VwX3Rlc3QuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTAwOlx0XHRcdFx0XHRpbmRleF90b19kdW1wLCBndXAtXHUwMDNlYWRkcik7XG4gMTAxOlx0XHRcdFx0ZHVtcF9wYWdlKHBhZ2VzW2luZGV4X3RvX2R1bXBdLFxuIDEwMjpcdFx0XHRcdFx0ICBcJiMzNDtndXBfdGVzdDogZHVtcF9wYWdlcygpIHRlc3RcJiMzNDspO1xuIDEwMzpcdFx0XHR9XG4gMTA0Olx0XHR9XG4gMTA1Olx0fVxuIDEwNjpcdFxuIDEwNzpcdHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIDEwODpcdFx0XHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcbiAxMDk6XHR7XG4gMTEwOlx0XHRrdGltZV90IHN0YXJ0X3RpbWUsIGVuZF90aW1lO1xuIDExMTpcdFx0dW5zaWduZWQgbG9uZyBpLCBucl9wYWdlcywgYWRkciwgbmV4dDtcbiAxMTI6XHRcdGxvbmcgbnI7XG4gMTEzOlx0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xuIDExNDpcdFx0dW5zaWduZWQgbG9uZyBlbmQ7XG4gMTE1Olx0XHRpbnQgcmV0ID0gMDtcbiAxMTY6XHRcdGJvb2wgbmVlZHNfbW1hcF9sb2NrID1cbiAxMTc6XHRcdFx0Y21kICE9IEdVUF9GQVNUX0JFTkNITUFSSyBcdTAwMjZcdTAwMjYgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSztcbiAxMTg6XHRcbiAxMTk6XHRcdGlmIChndXAtXHUwMDNlYWRkciBcdTAwM2UgVUxPTkdfTUFYIHx8IGd1cC1cdTAwM2VzaXplIFx1MDAzZSBVTE9OR19NQVggfHwgIWd1cC1cdTAwM2VzaXplIHx8XG4gMTIwOlx0XHQgICAgIWd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbCB8fCAhUEFHRV9BTElHTkVEKGd1cC1cdTAwM2VzaXplKSlcbiAxMjE6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMTIyOlx0XHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KCh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VhZGRyLFxuIDEyMzpcdFx0XHRcdCAgICAgICAodW5zaWduZWQgbG9uZylndXAtXHUwMDNlc2l6ZSwgXHUwMDI2ZW5kKSlcbiAxMjQ6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMTI1Olx0XG4gMTI2Olx0XHRucl9wYWdlcyA9IGd1cC1cdTAwM2VzaXplIC8gUEFHRV9TSVpFO1xuIDEyNzpcdFx0cGFnZXMgPSBrdmNhbGxvYyhucl9wYWdlcywgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpO1xuIDEyODpcdFx0aWYgKCFwYWdlcylcbiAxMjk6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMTMwOlx0XG4gMTMxOlx0XHRpZiAobmVlZHNfbW1hcF9sb2NrIFx1MDAyNlx1MDAyNiBtbWFwX3JlYWRfbG9ja19raWxsYWJsZShjdXJyZW50LVx1MDAzZW1tKSkge1xuIDEzMjpcdFx0XHRyZXQgPSAtRUlOVFI7XG4gMTMzOlx0XHRcdGdvdG8gZnJlZV9wYWdlcztcbiAxMzQ6XHRcdH1cbiAxMzU6XHRcbiAxMzY6XHRcdGkgPSAwO1xuIDEzNzpcdFx0bnIgPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGw7XG4gMTM4Olx0XHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XG4gMTM5Olx0XHRmb3IgKGFkZHIgPSBndXAtXHUwMDNlYWRkcjsgYWRkciBcdTAwM2MgZW5kOyBhZGRyID0gbmV4dCkge1xuIDE0MDpcdFx0XHRpZiAobnIgIT0gZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxuIDE0MTpcdFx0XHRcdGJyZWFrO1xuIDE0MjpcdFxuIDE0MzpcdFx0XHRuciA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG5yLCAoZW5kIC0gYWRkcikgLyBQQUdFX1NJWkUpO1xuIDE0NDpcdFxuIDE0NTpcdFx0XHRuZXh0ID0gYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRTtcbiAxNDY6XHRcbiAxNDc6XHRcdFx0c3dpdGNoIChjbWQpIHtcbiAxNDg6XHRcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4gMTQ5Olx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1MDpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTE6XHRcdFx0XHRicmVhaztcbiAxNTI6XHRcdFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcbiAxNTM6XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNTQ6XHRcdFx0XHRicmVhaztcbiAxNTU6XHRcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMTU2Olx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1NzpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTg6XHRcdFx0XHRicmVhaztcbiAxNTk6XHRcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAxNjA6XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNjE6XHRcdFx0XHRicmVhaztcbiAxNjI6XHRcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxuIDE2MzpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXG4gMTY0Olx0XHRcdFx0XHRcdCAgICBndXAtXHUwMDNlZ3VwX2ZsYWdzIHwgRk9MTF9MT05HVEVSTSxcbiAxNjU6XHRcdFx0XHRcdFx0ICAgIHBhZ2VzICYjNDM7IGkpO1xuIDE2NjpcdFx0XHRcdGJyZWFrO1xuIDE2NzpcdFx0XHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxuIDE2ODpcdFx0XHRcdGlmIChndXAtXHUwMDNldGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXG4gMTY5Olx0XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3MDpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzE6XHRcdFx0XHRlbHNlXG4gMTcyOlx0XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3MzpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzQ6XHRcdFx0XHRicmVhaztcbiAxNzU6XHRcdFx0ZGVmYXVsdDpcbiAxNzY6XHRcdFx0XHRyZXQgPSAtRUlOVkFMO1xuIDE3NzpcdFx0XHRcdGdvdG8gdW5sb2NrO1xuIDE3ODpcdFx0XHR9XG4gMTc5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDYxNAoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gZ3VwX3Rlc3QqKgoKT2theSwgc28gYGd1cF90ZXN0YC4uLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoaXMuIEZpcnN0LCBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IHdoYXQgdGhpcyB0aGluZyAqaXMqLiBXaGF0JiMzOTtzIGl0cyBwdXJwb3NlPyBIb3cgaXMgaXQgaW1wbGVtZW50ZWQ/IEkmIzM5O2xsIHByb2JhYmx5IHN0YXJ0IHdpdGggdGhlIHNvdXJjZSBjb2RlLCBidXQgSSBhbHNvIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcHVibGljIGludGVyZmFjZS4gV2hlcmUmIzM5O3MgaXQgZXhwb3NlZCB0byBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsPyBXaGF0IGZ1bmN0aW9ucyBvciBzdHJ1Y3R1cmVzIGFyZSBhdmFpbGFibGUgZm9yIG90aGVyIG1vZHVsZXMgb3Igc3Vic3lzdGVtcyB0byBpbnRlcmFjdCB3aXRoPwoKVGhlbiwgdGhlIGtleSBpcyBnb2luZyB0byBiZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zLiBXaGF0IEtjb25maWcgc3ltYm9scyBjb250cm9sIHRoZSBpbmNsdXNpb24gb3IgYmVoYXZpb3Igb2YgYGd1cF90ZXN0YD8gSXMgaXQgbW9kdWxhciwgb3IgYnVpbHQtaW4/IEFyZSB0aGVyZSBhbnkgZGVwZW5kZW5jaWVzIHRoYXQgSSBuZWVkIHRvIGJlIGF3YXJlIG9mPyBBcmUgdGhlcmUgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgdGhhdCBlbmFibGUgY2VydGFpbiB0ZXN0IGNhc2VzIG9yIGZ1bmN0aW9uYWxpdGllcz8gVW5kZXJzdGFuZGluZyB0aGUgS2NvbmZpZyBvcHRpb25zIHdpbGwgYmUgY3J1Y2lhbCBmb3IgcmVwcm9kdWNpbmcgYW5kIGFuYWx5emluZyBpdCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLiBJIG5lZWQgdG8ga25vdyBob3cgdG8gZW5hYmxlIG9yIGRpc2FibGUgaXQsIGFuZCB3aGF0IHRoZSBkZXBlbmRlbmNpZXMgYXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2d1cF90ZXN0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9MTI5Mz1jb25maWcgR1VQX1RFU1Rcbi0tXG5tbS9LY29uZmlnLTEyOTYtXHRoZWxwXG5tbS9LY29uZmlnOjEyOTc6XHQgIFByb3ZpZGVzIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0LCB3aGljaCBpbiB0dXJuIHByb3ZpZGVzIGEgd2F5XG5tbS9LY29uZmlnLTEyOTgtXHQgIHRvIG1ha2UgaW9jdGwgY2FsbHMgdGhhdCBjYW4gbGF1bmNoIGtlcm5lbC1iYXNlZCB1bml0IHRlc3RzIGZvclxuLS1cbm1tL0tjb25maWctMTMxMC1cbm1tL0tjb25maWc6MTMxMTpcdCAgU2VlIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmNcbm1tL0tjb25maWctMTMxMi1cbi0tXG5tbS9NYWtlZmlsZT0xMTA9b2JqLSQoQ09ORklHX0NHUk9VUF9IVUdFVExCKSAmIzQzOz0gaHVnZXRsYl9jZ3JvdXAub1xubW0vTWFrZWZpbGU6MTExOm9iai0kKENPTkZJR19HVVBfVEVTVCkgJiM0Mzs9IGd1cF90ZXN0Lm9cbm1tL01ha2VmaWxlLTExMi1vYmotJChDT05GSUdfRE1BUE9PTF9URVNUKSAmIzQzOz0gZG1hcG9vbF90ZXN0Lm9cbi0tXG5tbS9ndXBfdGVzdC5jLTgtI2luY2x1ZGUgXHUwMDNjbGludXgvaGlnaG1lbS5oXHUwMDNlXG5tbS9ndXBfdGVzdC5jOjk6I2luY2x1ZGUgXCYjMzQ7Z3VwX3Rlc3QuaFwmIzM0O1xubW0vZ3VwX3Rlc3QuYy0xMC1cbm1tL2d1cF90ZXN0LmM6MTE6c3RydWN0IGd1cF90ZXN0X2RhdGEge1xubW0vZ3VwX3Rlc3QuYy0xMi1cdHN0cnVjdCBtdXRleCBsb25ndGVybV9tdXRleDtcbi0tXG5tbS9ndXBfdGVzdC5jPTE3PXN0YXRpYyB2b2lkIHB1dF9iYWNrX3BhZ2VzKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG5tbS9ndXBfdGVzdC5jOjE4Olx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIHVuc2lnbmVkIGludCBndXBfdGVzdF9mbGFncylcbm1tL2d1cF90ZXN0LmMtMTkte1xuLS1cbm1tL2d1cF90ZXN0LmMtMzQtXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxubW0vZ3VwX3Rlc3QuYzozNTpcdFx0aWYgKGd1cF90ZXN0X2ZsYWdzIFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTikge1xubW0vZ3VwX3Rlc3QuYy0zNi1cdFx0XHR1bnBpbl91c2VyX3BhZ2VzKHBhZ2VzLCBucl9wYWdlcyk7XG4tLVxubW0vZ3VwX3Rlc3QuYz00Nj1zdGF0aWMgdm9pZCB2ZXJpZnlfZG1hX3Bpbm5lZCh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuLS1cbm1tL2d1cF90ZXN0LmMtNjEtXG5tbS9ndXBfdGVzdC5jOjYyOlx0XHRcdFx0ZHVtcF9wYWdlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIFwmIzM0O2d1cF90ZXN0IGZhaWx1cmVcJiMzNDspO1xubW0vZ3VwX3Rlc3QuYy02My1cdFx0XHRcdGJyZWFrO1xuLS1cbm1tL2d1cF90ZXN0LmMtNjctXHRcdFx0XHQgICAgIGkpKSB7XG5tbS9ndXBfdGVzdC5jOjY4Olx0XHRcdFx0ZHVtcF9wYWdlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIFwmIzM0O2d1cF90ZXN0IGZhaWx1cmVcJiMzNDspO1xubW0vZ3VwX3Rlc3QuYy02OS1cdFx0XHRcdGJyZWFrO1xuLS1cbm1tL2d1cF90ZXN0LmMtNzUtXG5tbS9ndXBfdGVzdC5jOjc2OnN0YXRpYyB2b2lkIGR1bXBfcGFnZXNfdGVzdChzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcbm1tL2d1cF90ZXN0LmMtNzctXHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4tLVxubW0vZ3VwX3Rlc3QuYy0xMDEtXHRcdFx0ZHVtcF9wYWdlKHBhZ2VzW2luZGV4X3RvX2R1bXBdLFxubW0vZ3VwX3Rlc3QuYzoxMDI6XHRcdFx0XHQgIFwmIzM0O2d1cF90ZXN0OiBkdW1wX3BhZ2VzKCkgdGVzdFwmIzM0Oyk7XG5tbS9ndXBfdGVzdC5jLTEwMy1cdFx0fVxuLS1cbm1tL2d1cF90ZXN0LmMtMTA2LVxubW0vZ3VwX3Rlc3QuYzoxMDc6c3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXG5tbS9ndXBfdGVzdC5jOjEwODpcdFx0c3RydWN0IGd1cF90ZXN0ICpndXApXG5tbS9ndXBfdGVzdC5jLTEwOS17XG4tLVxubW0vZ3VwX3Rlc3QuYy0yMTUtXG5tbS9ndXBfdGVzdC5jOjIxNjpzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcbm1tL2d1cF90ZXN0LmMtMjE3LXtcbi0tXG5tbS9ndXBfdGVzdC5jLTIyNy1cbm1tL2d1cF90ZXN0LmM6MjI4OnN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhLFxubW0vZ3VwX3Rlc3QuYy0yMjktXHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuLS1cbm1tL2d1cF90ZXN0LmMtMjk0LVxubW0vZ3VwX3Rlc3QuYzoyOTU6c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcbm1tL2d1cF90ZXN0LmMtMjk2LVx0XHR1bnNpZ25lZCBsb25nIGFyZylcbi0tXG5tbS9ndXBfdGVzdC5jPTMyMT1zdGF0aWMgbG9uZyBwaW5fbG9uZ3Rlcm1fdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4tLVxubW0vZ3VwX3Rlc3QuYy0zMjMte1xubW0vZ3VwX3Rlc3QuYzozMjQ6XHRzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSA9IGZpbGVwLVx1MDAzZXByaXZhdGVfZGF0YTtcbm1tL2d1cF90ZXN0LmMtMzI1LVx0aW50IHJldCA9IC1FSU5WQUw7XG4tLVxubW0vZ3VwX3Rlc3QuYy0zNDYtXG5tbS9ndXBfdGVzdC5jOjM0NzpzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG5tbS9ndXBfdGVzdC5jLTM0OC1cdFx0dW5zaWduZWQgbG9uZyBhcmcpXG5tbS9ndXBfdGVzdC5jLTM0OS17XG5tbS9ndXBfdGVzdC5jOjM1MDpcdHN0cnVjdCBndXBfdGVzdCBndXA7XG5tbS9ndXBfdGVzdC5jLTM1MS1cdGludCByZXQ7XG4tLVxubW0vZ3VwX3Rlc3QuYy0zNzEtXG5tbS9ndXBfdGVzdC5jOjM3MjpcdHJldCA9IF9fZ3VwX3Rlc3RfaW9jdGwoY21kLCBcdTAwMjZndXApO1xubW0vZ3VwX3Rlc3QuYy0zNzMtXHRpZiAocmV0KVxuLS1cbm1tL2d1cF90ZXN0LmMtMzgxLVxubW0vZ3VwX3Rlc3QuYzozODI6c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxubW0vZ3VwX3Rlc3QuYy0zODMte1xubW0vZ3VwX3Rlc3QuYzozODQ6XHRzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YTtcbm1tL2d1cF90ZXN0LmMtMzg1LVx0aW50IHJldDtcbi0tXG5tbS9ndXBfdGVzdC5jLTQwMS1cbm1tL2d1cF90ZXN0LmM6NDAyOnN0YXRpYyBpbnQgZ3VwX3Rlc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbm1tL2d1cF90ZXN0LmMtNDAzLXtcbm1tL2d1cF90ZXN0LmM6NDA0Olx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbm1tL2d1cF90ZXN0LmMtNDA1LVxuLS1cbm1tL2d1cF90ZXN0LmMtNDEzLVxubW0vZ3VwX3Rlc3QuYzo0MTQ6c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ3VwX3Rlc3RfZm9wcyA9IHtcbm1tL2d1cF90ZXN0LmM6NDE1Olx0Lm9wZW4gPSBndXBfdGVzdF9vcGVuLFxubW0vZ3VwX3Rlc3QuYzo0MTY6XHQudW5sb2NrZWRfaW9jdGwgPSBndXBfdGVzdF9pb2N0bCxcbm1tL2d1cF90ZXN0LmMtNDE3LVx0LmNvbXBhdF9pb2N0bCA9IGNvbXBhdF9wdHJfaW9jdGwsXG5tbS9ndXBfdGVzdC5jOjQxODpcdC5yZWxlYXNlID0gZ3VwX3Rlc3RfcmVsZWFzZSxcbm1tL2d1cF90ZXN0LmMtNDE5LX07XG5tbS9ndXBfdGVzdC5jLTQyMC1cbm1tL2d1cF90ZXN0LmM6NDIxOnN0YXRpYyBpbnQgX19pbml0IGd1cF90ZXN0X2luaXQodm9pZClcbm1tL2d1cF90ZXN0LmMtNDIyLXtcbm1tL2d1cF90ZXN0LmM6NDIzOlx0ZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoXCYjMzQ7Z3VwX3Rlc3RcJiMzNDssIDA2MDAsIE5VTEwsIE5VTEwsXG5tbS9ndXBfdGVzdC5jOjQyNDpcdFx0XHRcdCAgIFx1MDAyNmd1cF90ZXN0X2ZvcHMpO1xubW0vZ3VwX3Rlc3QuYy00MjUtXG4tLVxubW0vZ3VwX3Rlc3QuYy00MjgtXG5tbS9ndXBfdGVzdC5jOjQyOTpsYXRlX2luaXRjYWxsKGd1cF90ZXN0X2luaXQpO1xuLS1cbm1tL2d1cF90ZXN0LmgtNi1cbm1tL2d1cF90ZXN0Lmg6NzojZGVmaW5lIEdVUF9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDEsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6ODojZGVmaW5lIFBJTl9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDIsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6OTojZGVmaW5lIFBJTl9MT05HVEVSTV9CRU5DSE1BUktcdF9JT1dSKCYjMzk7ZyYjMzk7LCAzLCBzdHJ1Y3QgZ3VwX3Rlc3QpXG5tbS9ndXBfdGVzdC5oOjEwOiNkZWZpbmUgR1VQX0JBU0lDX1RFU1RcdFx0X0lPV1IoJiMzOTtnJiMzOTssIDQsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6MTE6I2RlZmluZSBQSU5fQkFTSUNfVEVTVFx0XHRfSU9XUigmIzM5O2cmIzM5OywgNSwgc3RydWN0IGd1cF90ZXN0KVxubW0vZ3VwX3Rlc3QuaDoxMjojZGVmaW5lIERVTVBfVVNFUl9QQUdFU19URVNUXHRfSU9XUigmIzM5O2cmIzM5OywgNiwgc3RydWN0IGd1cF90ZXN0KVxubW0vZ3VwX3Rlc3QuaC0xMy0jZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUXHRfSU9XKCYjMzk7ZyYjMzk7LCA3LCBzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QpXG4tLVxubW0vZ3VwX3Rlc3QuaC0yMC1cbm1tL2d1cF90ZXN0Lmg6MjE6c3RydWN0IGd1cF90ZXN0IHtcbm1tL2d1cF90ZXN0LmgtMjItXHRfX3U2NCBnZXRfZGVsdGFfdXNlYztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3MTczCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgS2VybmVsIENvbmZpZ3VyYXRpb24qKgoKT2theSwgdGltZSB0byB0cm91Ymxlc2hvb3QgdGhpcy4gTXkgZ3V0IGZlZWxpbmcgaXMgdGVsbGluZyBtZSB0aGUgaXNzdWUgbWlnaHQgYmUgbHVya2luZyB3aXRoaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGZpbGVzLiBMZXQgbWUgemVybyBpbiBvbiBgbW0vS2NvbmZpZ2AuIEl0JiMzOTtzIGEga2V5IGZpbGUgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMsIGFuZCB0aGVyZSYjMzk7cyBhIHN0cm9uZyBjaGFuY2UgdGhlIHByb2JsZW0gcmVsYXRlcyB0byBzb21ldGhpbmcgaW4gdGhhdCBhcmVhLiBOb3csIGJhc2VkIG9uIHByZXZpb3VzIGV4cGVyaWVuY2VzLCBJJiMzOTttIGdvaW5nIHRvIGp1bXAgdG8gYXJvdW5kIGxpbmUgMTI5My4gVGhhdCByZWdpb24gb2Z0ZW4gY29udGFpbnMgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBzcGVjaWZpYyBtZW1vcnkgYWxsb2NhdGlvbiBmZWF0dXJlcyBvciBwb3RlbnRpYWxseSBjb25mbGljdGluZyBzZXR0aW5ncyB0aGF0IGNvdWxkIGJlIHJlbGV2YW50IHRvIHRoZSBpc3N1ZSBJJiMzOTttIGZhY2luZy4gSSYjMzk7bGwgc3RhcnQgbXkgaW52ZXN0aWdhdGlvbiB0aGVyZSBhbmQgc2VlIHdoYXQganVtcHMgb3V0LiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50LCBhIGRlcGVuZGVuY3ksIG9yIG1heWJlIGV2ZW4gYSBjb25maWd1cmF0aW9uIG9wdGlvbiB3aXRoIGFuIHVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSB0aGF0JiMzOTtzIGNhdXNpbmcgdGhlIHByb2JsZW0uIExldCYjMzk7cyBzZWUuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMjkwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzEyOTA6XHRcdCAgaW5mb3JtYXRpb24gaW5jbHVkZXMgZ2xvYmFsIGFuZCBwZXIgY2h1bmsgc3RhdGlzdGljcywgd2hpY2ggY2FuXG4xMjkxOlx0XHQgIGJlIHVzZWQgdG8gaGVscCB1bmRlcnN0YW5kIHBlcmNwdSBtZW1vcnkgdXNhZ2UuXG4xMjkyOlx0XG4xMjkzOlx0Y29uZmlnIEdVUF9URVNUXG4xMjk0Olx0XHRib29sIFwmIzM0O0VuYWJsZSBpbmZyYXN0cnVjdHVyZSBmb3IgZ2V0X3VzZXJfcGFnZXMoKS1yZWxhdGVkIHVuaXQgdGVzdHNcJiMzNDtcbjEyOTU6XHRcdGRlcGVuZHMgb24gREVCVUdfRlNcbjEyOTY6XHRcdGhlbHBcbjEyOTc6XHRcdCAgUHJvdmlkZXMgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QsIHdoaWNoIGluIHR1cm4gcHJvdmlkZXMgYSB3YXlcbjEyOTg6XHRcdCAgdG8gbWFrZSBpb2N0bCBjYWxscyB0aGF0IGNhbiBsYXVuY2gga2VybmVsLWJhc2VkIHVuaXQgdGVzdHMgZm9yXG4xMjk5Olx0XHQgIHRoZSBnZXRfdXNlcl9wYWdlcyooKSBhbmQgcGluX3VzZXJfcGFnZXMqKCkgZmFtaWx5IG9mIEFQSSBjYWxscy5cbjEzMDA6XHRcbjEzMDE6XHRcdCAgVGhlc2UgdGVzdHMgaW5jbHVkZSBiZW5jaG1hcmsgdGVzdGluZyBvZiB0aGUgX2Zhc3QgdmFyaWFudHMgb2ZcbjEzMDI6XHRcdCAgZ2V0X3VzZXJfcGFnZXMqKCkgYW5kIHBpbl91c2VyX3BhZ2VzKigpLCBhcyB3ZWxsIGFzIHNtb2tlIHRlc3RzIG9mXG4xMzAzOlx0XHQgIHRoZSBub24tX2Zhc3QgdmFyaWFudHMuXG4xMzA0Olx0XG4xMzA1Olx0XHQgIFRoZXJlIGlzIGFsc28gYSBzdWItdGVzdCB0aGF0IGFsbG93cyBydW5uaW5nIGR1bXBfcGFnZSgpIG9uIGFueVxuMTMwNjpcdFx0ICBvZiB1cCB0byBlaWdodCBwYWdlcyAoc2VsZWN0ZWQgYnkgY29tbWFuZCBsaW5lIGFyZ3MpIHdpdGhpbiB0aGVcbjEzMDc6XHRcdCAgcmFuZ2Ugb2YgdXNlci1zcGFjZSBhZGRyZXNzZXMuIFRoZXNlIHBhZ2VzIGFyZSBlaXRoZXIgcGlubmVkIHZpYVxuMTMwODpcdFx0ICBwaW5fdXNlcl9wYWdlcyooKSwgb3IgcGlubmVkIHZpYSBnZXRfdXNlcl9wYWdlcyooKSwgYXMgc3BlY2lmaWVkXG4xMzA5Olx0XHQgIGJ5IG90aGVyIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuXG4xMzEwOlx0XG4xMzExOlx0XHQgIFNlZSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jXG4xMzEyOlx0XG4xMzEzOlx0Y29tbWVudCBcJiMzNDtHVVBfVEVTVCBuZWVkcyB0byBoYXZlIERFQlVHX0ZTIGVuYWJsZWRcJiMzNDtcbjEzMTQ6XHRcdGRlcGVuZHMgb24gIUdVUF9URVNUIFx1MDAyNlx1MDAyNiAhREVCVUdfRlNcbjEzMTU6XHRcbjEzMTY6XHRjb25maWcgR1VQX0dFVF9QWFhfTE9XX0hJR0hcbjEzMTc6XHRcdGJvb2xcbjEzMTg6XHRcbjEzMTk6XHRjb25maWcgRE1BUE9PTF9URVNUXG4xMzIwOlx0XHR0cmlzdGF0ZSBcJiMzNDtFbmFibGUgYSBtb2R1bGUgdG8gcnVuIHRpbWUgdGVzdHMgb24gZG1hX3Bvb2xcJiMzNDtcbjEzMjE6XHRcdGRlcGVuZHMgb24gSEFTX0RNQVxuMTMyMjpcdFx0aGVscFxuMTMyMzpcdFx0ICBQcm92aWRlcyBhIHRlc3QgbW9kdWxlIHRoYXQgd2lsbCBhbGxvY2F0ZSBhbmQgZnJlZSBtYW55IGJsb2NrcyBvZlxuMTMyNDpcdFx0ICB2YXJpb3VzIHNpemVzIGFuZCByZXBvcnQgaG93IGxvbmcgaXQgdGFrZXMuIFRoaXMgaXMgaW50ZW5kZWQgdG9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3OTk1CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNDYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgR1VQIFRlc3QgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIHRha2UgYW5vdGhlciBsb29rIGF0IHRoaXMgYG1tL2d1cF90ZXN0LmNgIHBhdGNoLiBGaXJzdCBnbGFuY2Ugc2hvd3Mgc29tZSBhZGRpdGlvbnMsIGEgZmV3IG5ldyBjaGVja3MsIGFuZCBhIGNoYW5nZSB0byB0aGUgbG9vcCBoYW5kbGluZy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBiZWluZyBhZGRyZXNzZWQgaGVyZSwgc28gbGV0JiMzOTtzIGJyZWFrIGl0IGRvd24uCgpUaGUgaW5pdGlhbCBgaWZgIHN0YXRlbWVudCBub3cgaW5jbHVkZXMgYWRkaXRpb25hbCBjaGVja3M6IGAhZ3VwLSZndDtzaXplYCwgYCFndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsYCwgYW5kIGAhUEFHRV9BTElHTkVEKGd1cC0mZ3Q7c2l6ZSlgLiBDbGVhcmx5LCB3ZSYjMzk7cmUgdHJ5aW5nIHRvIHZhbGlkYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIG1vcmUgcmlnb3JvdXNseS4gWmVyby1zaXplZCByZXF1ZXN0cywgbWlzc2luZyBgbnJfcGFnZXNfcGVyX2NhbGxgLCBvciBtaXNhbGlnbmVkIHNpemVzIGFyZSBub3cgY29uc2lkZXJlZCBpbnZhbGlkLiBUaGlzIHNlZW1zIHJlYXNvbmFibGU7IHByZXZlbnRpbmcgdGhlc2Uga2luZHMgb2YgZWRnZSBjYXNlcyB1cGZyb250IGlzIGEgZ29vZCBwcmFjdGljZSB0byBhdm9pZCB1bmV4cGVjdGVkIGJlaGF2aW9yIGxhdGVyLgoKVGhlIGNvcmUgb2YgdGhlIGNoYW5nZSBsaWVzIHdpdGhpbiB0aGUgbWFpbiBsb29wLiBQcmV2aW91c2x5LCB0aGUgY29kZSBjYWxjdWxhdGVkIGBuZXh0YCBhbmQgdGhlbiBoYWQgYSByZWR1bmRhbnQgY2hlY2svYWRqdXN0bWVudCBpZiBgbmV4dGAgZXhjZWVkZWQgYGVuZGAuIE5vdywgdGhlcmUmIzM5O3MgYSBuZXcgbGluZSB0aGF0IGNsYW1wcyB0aGUgYG5yYCB2YWx1ZSBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHNpemUuIFRoaXMgc3VnZ2VzdHMgdGhlIG9yaWdpbmFsIGNhbGN1bGF0aW9uIGhhZCBwb3RlbnRpYWwgb3ZlcmZsb3cgaXNzdWVzLCBhbmQgdGhpcyByZXZpc2VkIGNvZGUgc2VlbXMgdG8gYmUgYW4gaW1wcm92ZW1lbnQgaW4gZW5zdXJpbmcgYG5yYCBkb2VzbiYjMzk7dCBleGNlZWQgdGhlIGJvdW5kcyBvZiB0aGUgcHJvdmlkZWQgcmVnaW9uLCBldmVuIHdoZW4gdGhlIHByb3ZpZGVkIHZhbHVlIGZvciBgZ3VwLSZndDtzaXplYCBjb3VsZCBoYXZlIHJlc3VsdGVkIGluIGFuIG92ZXJmbG93IGNhbGN1bGF0aW9uIGluIGBuZXh0ID0gYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRTtgLgoKSSYjMzk7bSB0aGlua2luZyB0aGlzIGxpa2VseSByZXNvbHZlcyBhbiBpc3N1ZSB3aGVyZSB0aGUgY2FsY3VsYXRpb24gb2YgYG5leHRgIGNvdWxkIHJlc3VsdCBpbiBhbiBpbnZhbGlkIGFkZHJlc3MgdGhhdCBsZWFkcyB0byBhbiBvdXQtb2YtYm91bmRzIHJlYWQgb3Igd3JpdGUuIFByZXZlbnRpbmcgdGhpcyBraW5kIG9mIG92ZXJmbG93IGlzIGNydWNpYWwgZm9yIG1lbW9yeSBtYW5hZ2VtZW50LCBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggdXNlci1wcm92aWRlZCBwYXJhbWV0ZXJzLgoKSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVudCBhbmQgb3JpZ2luYWwgbW90aXZhdGlvbiBiZWhpbmQgdGhpcyBjaGFuZ2UuIE5vdyBJIHNob3VsZCBsb29rIGF0IHRoZSBjb21taXQgbG9nIGZvciBgbW0vZ3VwX3Rlc3QuY2AgdG8gc2VlIHRoZSBjb250ZXh0IGFuZCB0aGUgc3BlY2lmaWMgcHJvYmxlbSB0aGF0IHdhcyBiZWluZyBmaXhlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTM1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDU1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMzU6XHRcbiAxMzY6XHRcdGkgPSAwO1xuIDEzNzpcdFx0bnIgPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGw7XG4gMTM4Olx0XHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XG4gMTM5Olx0XHRmb3IgKGFkZHIgPSBndXAtXHUwMDNlYWRkcjsgYWRkciBcdTAwM2MgZW5kOyBhZGRyID0gbmV4dCkge1xuIDE0MDpcdFx0XHRpZiAobnIgIT0gZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxuIDE0MTpcdFx0XHRcdGJyZWFrO1xuIDE0MjpcdFxuIDE0MzpcdFx0XHRuciA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG5yLCAoZW5kIC0gYWRkcikgLyBQQUdFX1NJWkUpO1xuIDE0NDpcdFxuIDE0NTpcdFx0XHRuZXh0ID0gYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRTtcbiAxNDY6XHRcbiAxNDc6XHRcdFx0c3dpdGNoIChjbWQpIHtcbiAxNDg6XHRcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4gMTQ5Olx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1MDpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTE6XHRcdFx0XHRicmVhaztcbiAxNTI6XHRcdFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcbiAxNTM6XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNTQ6XHRcdFx0XHRicmVhaztcbiAxNTU6XHRcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMTU2Olx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1NzpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTg6XHRcdFx0XHRicmVhaztcbiAxNTk6XHRcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAxNjA6XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNjE6XHRcdFx0XHRicmVhaztcbiAxNjI6XHRcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxuIDE2MzpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXG4gMTY0Olx0XHRcdFx0XHRcdCAgICBndXAtXHUwMDNlZ3VwX2ZsYWdzIHwgRk9MTF9MT05HVEVSTSxcbiAxNjU6XHRcdFx0XHRcdFx0ICAgIHBhZ2VzICYjNDM7IGkpO1xuIDE2NjpcdFx0XHRcdGJyZWFrO1xuIDE2NzpcdFx0XHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxuIDE2ODpcdFx0XHRcdGlmIChndXAtXHUwMDNldGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXG4gMTY5Olx0XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3MDpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzE6XHRcdFx0XHRlbHNlXG4gMTcyOlx0XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3MzpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzQ6XHRcdFx0XHRicmVhaztcbiAxNzU6XHRcdFx0ZGVmYXVsdDpcbiAxNzY6XHRcdFx0XHRyZXQgPSAtRUlOVkFMO1xuIDE3NzpcdFx0XHRcdGdvdG8gdW5sb2NrO1xuIDE3ODpcdFx0XHR9XG4gMTc5Olx0XG4gMTgwOlx0XHRcdGlmIChuciBcdTAwM2M9IDApXG4gMTgxOlx0XHRcdFx0YnJlYWs7XG4gMTgyOlx0XHRcdGkgJiM0Mzs9IG5yO1xuIDE4MzpcdFx0fVxuIDE4NDpcdFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcbiAxODU6XHRcbiAxODY6XHRcdC8qIFNoaWZ0aW5nIHRoZSBtZWFuaW5nIG9mIG5yX3BhZ2VzOiBub3cgaXQgaXMgYWN0dWFsIG51bWJlciBwaW5uZWQ6ICovXG4gMTg3Olx0XHRucl9wYWdlcyA9IGk7XG4gMTg4Olx0XG4gMTg5Olx0XHRndXAtXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk3NTEKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxMzY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgRmVhc2liaWxpdHk6IEEgRGVlcCBEaXZlIGludG8gZ3VwX3Rlc3QuYyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIGNvZGUgcmVsYXRlZCB0byBgZ2V0X3VzZXJfcGFnZXMoKWAsIHNwZWNpZmljYWxseSB3aXRoaW4gYG1tL2d1cF90ZXN0LmNgLiBUaGUgaW5pdGlhbCBjb2RlIGhhZCBwb3RlbnRpYWwgb3ZlcmZsb3cgaXNzdWVzIHdpdGggYGFkZHIgJiM0MzsgbnIgKiBQQUdFX1NJWkVgLCBhbmQgc29tZSB6ZXJvLXNpemUgYWxsb2NhdGlvbnMgdGhhdCBjb3VsZCBjYXVzZSBwcm9ibGVtcy4gVGhlIGNvcnJlY3Rpb24gYWRkcmVzc2VzIHRob3NlIG92ZXJmbG93cyB3aXRoIGFuIG92ZXJmbG93LXNhZmUgY2hlY2ssIGFuZCBkZWFscyB3aXRoIHNvbWUgcG90ZW50aWFsIG51bGwtcG9pbnRlci1lc3F1ZSBjb25kaXRpb25zLgoKTXkgaW1tZWRpYXRlIHRob3VnaHQgaXM6IGNhbiB0aGlzIGNvZGUgKmFjdHVhbGx5KiBiZSBmdXp6ZWQ/IFRoZSBjZW50cmFsIHF1ZXN0aW9uIGlzIHJlYWNoYWJpbGl0eS4gVGhlIHBhdGNoIGNvZGUgY3JlYXRlcyBgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RgIHZpYSBkZWJ1Z2ZzLCBhbmQgaW9jdGxzIGNhbiBiZSBpc3N1ZWQgYnkgdXNlcnNwYWNlLiBCdXQgdGhlIGluc3RydWN0aW9ucyBtYWtlIGl0IGNsZWFyLCByZWFjaGFiaWxpdHkgaXMgdGhlIHByaW1hcnkgZ2F0ZTogaWYgdGhlIGNvZGUgY2FuJiMzOTt0IGV4ZWN1dGUgaW4gYSBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudCwgaXQmIzM5O3MgYSBuby1nbyBmb3IgZnV6emluZy4KCk5vdywgbGV0JiMzOTtzIGFwcGx5IHRoZSAqbmVnYXRpdmUqIGNyaXRlcmlhIGZyb20gdGhlIGluc3RydWN0aW9ucy4gRG9lcyBpdCBmYWxsIGludG8gYW55IG9mIHRob3NlIGNhdGVnb3JpZXM/CgoqICAgKipOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzPyoqIE5vcGUsIGl0JiMzOTtzIGtlcm5lbCBDIGNvZGUuIE5vdCBkb2N1bWVudGF0aW9uLCBzY3JpcHRzLCBvciB1c2VyLXNwYWNlIHN0dWZmLgoqICAgKipTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU/KiogTm9wZSwgaXQgZG9lc24mIzM5O3QgcmVxdWlyZSBzcGVjaWZpYyBoYXJkd2FyZS4gSXQmIzM5O3Mgbm90IGEgZHJpdmVyIGZvciBhIGZhbmN5IEFTSUMgb3IgU21hcnROSUMuCiogICAqKlVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRocz8qKiBJdCYjMzk7cyBub3QgYSB0ZWFyZG93biBjYWxsYmFjaywgbm9yIHNwZWNpZmljIHRvIHNvbWUgYml6YXJyZSBhcmNoaXRlY3R1cmUuIEl0JiMzOTtzIGFtZDY0LWNvbXBhdGlibGUsIGFuZCB0aGUgZGVidWdmcyBmaWxlIGNyZWF0ZWQgdmlhIGBsYXRlX2luaXRjYWxsYCBtZWFucyBpdCYjMzk7cyBhdmFpbGFibGUgdG8gdXNlcnNwYWNlLgoKU28sIHRoZSBuZXh0IG9idmlvdXMgcXVlc3Rpb24gaXM6IElzIHRoaXMgcmVhY2hhYmxlIGZyb20gYSBzdGFuZGFyZCBRRU1VIG9yIEdDRSBlbnZpcm9ubWVudD8KClllcywgc2luY2UgZGVidWdmcyBpcyBtb3VudGVkIGluIHN0YW5kYXJkIExpbnV4LCBhbmQgaW9jdGxzIGNhbiBiZSBpc3N1ZWQgdG8gYGd1cF90ZXN0YCB2aWEgdXNlcnNwYWNlLiBJJiMzOTt2ZSBjaGVja2VkIGRlYnVnZnMgcGVybWlzc2lvbnMgaW4gYGd1cF90ZXN0LmNgOiBUaGUgZGVidWdmcyBmaWxlIGlzIGNyZWF0ZWQgYXMgMDYwMCAtIHNvIHJvb3QgY2FuIGFjY2VzcyBpdC4gU3l6a2FsbGVyIHJ1bnMgYXMgcm9vdCAob3Igd2l0aCBjYXBhYmlsaXRpZXMpIGluIG1hbnkgc2NlbmFyaW9zLCBzbyB0aGlzIGNoZWNrIGlzIHZhbGlkLgoKSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzLiBgR1VQX1RFU1RgIGRlcGVuZHMgb24gYERFQlVHX0ZTYCB3aGljaCBkZXBlbmRzIG9uIHZhcmlvdXMgZGVidWdnaW5nIGNvbmZpZyBvcHRpb25zLCBidXQgaXQgbG9va3MgbGlrZSB0aGUgdGVzdHMgaW4gYGd1cF90ZXN0LmNgIGFyZSBlbmFibGVkIHVuZGVyIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uLgoKT2theSwgbGV0JiMzOTtzIGFwcGx5IHRoZSAqcG9zaXRpdmUqIGNyaXRlcmlhIGZyb20gdGhlIGluc3RydWN0aW9ucyB0byBiZSBzdXJlOgoKKiAgICoqQ29yZSBTdWJzeXN0ZW1zPyoqIFllcywgaXQgaXMgYSBtZW1vcnkgbWFuYWdlbWVudCBpc3N1ZSwgYXMgdGhlIGNvZGUgbW9kaWZpZXMgYGdldF91c2VyX3BhZ2VzKClgCiogICAqKlJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwcz8qKiBZZXMsIHRoZSBjb2RlIGlzIHJlZmFjdG9yaW5nIGFuZCBjaGFuZ2luZyBwYXJ0cyBvZiBtZW1vcnkgbWFuYWdlbWVudC4KKiAgICoqUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzPyoqIFllcywgd2UgYXJlIGludHJvZHVjaW5nIGRlZmVuc2l2ZSBjaGVja3MuCgpUaGVyZWZvcmUsIHRoaXMgY29kZSBwYXRoICppcyogcmVhY2hhYmxlLCBhbmQgKnNob3VsZCogYmUgZnV6emVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBERUJVR19GUyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNzg0CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEZWJ1Z2dpbmcgdGhlIEZpbGVzeXN0ZW0gQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gYERFQlVHX0ZTYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBgS2NvbmZpZ2AgZmlsZXMuIFRoYXQmIzM5O3MgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIEkmIzM5O2xsIGZpbmQgaXRzIGRlZmluaXRpb24sIGFueSBkZXBlbmRlbmNpZXMsIGFuZCBhc3NvY2lhdGVkIGhlbHAgdGV4dC4gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0byBsb29rIGluIGFsbCB0aGUgcmVsZXZhbnQgc3ViZGlyZWN0b3JpZXMgZm9yIGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIGhvdyBpdCYjMzk7cyB1c2VkIGFuZCB3aGF0IGl0IGNvbnRyb2xzLiBGaW5kaW5nIGl0cyBkZXBlbmRlbmNpZXMgd2lsbCBiZSBrZXkgdG8gdW5kZXJzdGFuZGluZyBpZiBpdCYjMzk7cyBlbmFibGVkIGJ5IHNvbWV0aGluZyBlbHNlIEkmIzM5O20gYWxyZWFkeSB1c2luZywgb3IgaWYgaXQgY2FuIGJlIGVuYWJsZWQgaW5kZXBlbmRlbnRseS4gSSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCBhbnkgd2FybmluZ3MgYWJvdXQgdXNpbmcgdGhpcy4gTGV0JiMzOTtzIHN0YXJ0IHRoZSBzZWFyY2guLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIERFQlVHX0ZTXFxiJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2xpYi9LY29uZmlnLmRlYnVnPTY4Mz1jb25maWcgTUFHSUNfU1lTUlFfU0VSSUFMX1NFUVVFTkNFXG4tLVxubGliL0tjb25maWcuZGVidWctNjkyLVxubGliL0tjb25maWcuZGVidWc6NjkzOmNvbmZpZyBERUJVR19GU1xubGliL0tjb25maWcuZGVidWctNjk0LVx0Ym9vbCBcJiMzNDtEZWJ1ZyBGaWxlc3lzdGVtXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMDYwCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqUGVlcmluZyBpbnRvIHRoZSBEZWJ1Z2dpbmcgSGVhcnQgb2YgdGhlIENvbmZpZ3VyYXRpb24gQmVhc3QqKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZywgJiMzNDtXaGVyZSYjMzk7cyB0aGUgYmVzdCBwbGFjZSB0byBkaWcgaW50byB0aGlzIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbiBpc3N1ZT8mIzM0OyBJbW1lZGlhdGVseSwgbXkgbWluZCBob25lcyBpbiBvbiBgbGliL0tjb25maWcuZGVidWdgLiBJdCYjMzk7cyBhbG1vc3Qgc2Vjb25kIG5hdHVyZSDigJMgdGhhdCBmaWxlIGlzIGEgY29yZSBjb21wb25lbnQgZm9yIGRlYnVnIGNvbmZpZ3VyYXRpb25zLiBOb3csIEkgaGF2ZSB0byB6ZXJvIGluLCBsZXQmIzM5O3Mgc2VlLCBhcm91bmQgbGluZSA2OTMuIFRoYXQmIzM5O3MgYSByZWFzb25hYmxlIGFyZWEgdG8gc3RhcnQgbG9va2luZywgSSYjMzk7bGwgYmV0IGl04oCZcyByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHF1ZXJ5LiBGcm9tIHRoYXQgbG9jYXRpb24sIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGtleSBkaXJlY3RpdmVzLCBkZXBlbmRlbmNpZXMsIG9yIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIGRlYnVnIHBhcmFtZXRlcnMgaW4gcGxheS4gTGV0JiMzOTtzIHNlZSB3aGF04oCZcyB0aGVyZSwgaXQgY291bGQgY29udGFpbiB0aGUgYW5zd2VyLCBvciBhIGdvb2QgY2x1ZSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtsaWIvS2NvbmZpZy5kZWJ1ZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDY5MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjkwOlx0XG4gNjkxOlx0XHQgIElmIHVuc3VyZSwgbGVhdmUgYW4gZW1wdHkgc3RyaW5nIGFuZCB0aGUgb3B0aW9uIHdpbGwgbm90IGJlIGVuYWJsZWQuXG4gNjkyOlx0XG4gNjkzOlx0Y29uZmlnIERFQlVHX0ZTXG4gNjk0Olx0XHRib29sIFwmIzM0O0RlYnVnIEZpbGVzeXN0ZW1cJiMzNDtcbiA2OTU6XHRcdGhlbHBcbiA2OTY6XHRcdCAgZGVidWdmcyBpcyBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gdGhhdCBrZXJuZWwgZGV2ZWxvcGVycyB1c2UgdG8gcHV0XG4gNjk3Olx0XHQgIGRlYnVnZ2luZyBmaWxlcyBpbnRvLiAgRW5hYmxlIHRoaXMgb3B0aW9uIHRvIGJlIGFibGUgdG8gcmVhZCBhbmRcbiA2OTg6XHRcdCAgd3JpdGUgdG8gdGhlc2UgZmlsZXMuXG4gNjk5Olx0XG4gNzAwOlx0XHQgIEZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9uIHRoZSBkZWJ1Z2ZzIEFQSSwgc2VlXG4gNzAxOlx0XHQgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvLlxuIDcwMjpcdFxuIDcwMzpcdFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuIDcwNDpcdFxuIDcwNTpcdGNob2ljZVxuIDcwNjpcdFx0cHJvbXB0IFwmIzM0O0RlYnVnZnMgZGVmYXVsdCBhY2Nlc3NcJiMzNDtcbiA3MDc6XHRcdGRlcGVuZHMgb24gREVCVUdfRlNcbiA3MDg6XHRcdGRlZmF1bHQgREVCVUdfRlNfQUxMT1dfQUxMXG4gNzA5Olx0XHRoZWxwXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNTQzCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93bjoKCioqQW5hbHl6aW5nIERlcGVuZGVuY2llcyBhbmQgSU9DVEwgQ2FsbHMqKgoKQWxyaWdodCwgc28gYERFQlVHX0ZTYCBpcyBhIHN0YW5kYWxvbmUgcGllY2UsIHdoaWNoIGlzIHVzZWZ1bCB0byBrbm93LiBIb3dldmVyLCBJIHNlZSBgR1VQX1RFU1RgIHJlbGllcyBvbiBgREVCVUdfRlNgLiBUaGF0IHJlbGF0aW9uc2hpcCB3aWxsIGJlIGltcG9ydGFudCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgb3ZlcmFsbCBhcmNoaXRlY3R1cmUuCgpNeSBmb2N1cyBzaG91bGQgYmUgb24gaG93IGBHVVBfVEVTVGAgaXMgbGV2ZXJhZ2luZyBgREVCVUdfRlNgLiBJJiMzOTtsbCBpbW1lZGlhdGVseSBkcmlsbCBkb3duIGludG8gYF9fZ3VwX3Rlc3RfaW9jdGxgIGFuZCBpdHMgY2FsbGVycyB3aXRoaW4gYG1tL2d1cF90ZXN0LmNgLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250cm9sIGZsb3csIHRoZSBkYXRhIGJlaW5nIHBhc3NlZCwgYW5kIGhvdyB0aGUgaW50ZXJhY3Rpb24gd2l0aCBgREVCVUdfRlNgIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIHdpdGhpbiB0aGF0IElPQ1RMLiBVbmRlcnN0YW5kaW5nIHRoZSBzcGVjaWZpY3Mgb2YgdGhpcyBpbnRlcmFjdGlvbiBpcyBjcml0aWNhbCB0byB1bmRlcnN0YW5kaW5nIGhvdyB0aGluZ3Mgd29yayBvdmVyYWxsLiBJIHdhbnQgdG8gc2VlIGlmIHRoZSBkZXBlbmRlbmN5IGlzIHB1cmVseSBhIGNvbmZpZ3VyYXRpb24gdGhpbmcsIG9yIGlmIGBERUJVR19GU2AgZnVuY3Rpb25zIGFyZSBhY3RpdmVseSB1dGlsaXplZCBkdXJpbmcgSU9DVEwgcHJvY2Vzc2luZy4gVGhlIGRldmlsJiMzOTtzIGluIHRoZSBkZXRhaWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM0NTpcdH1cbiAzNDY6XHRcbiAzNDc6XHRzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4gMzQ4Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDM0OTpcdHtcbiAzNTA6XHRcdHN0cnVjdCBndXBfdGVzdCBndXA7XG4gMzUxOlx0XHRpbnQgcmV0O1xuIDM1MjpcdFxuIDM1MzpcdFx0c3dpdGNoIChjbWQpIHtcbiAzNTQ6XHRcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxuIDM1NTpcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMzU2Olx0XHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XG4gMzU3Olx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxuIDM1ODpcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAzNTk6XHRcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XG4gMzYwOlx0XHRcdGJyZWFrO1xuIDM2MTpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVDpcbiAzNjI6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RPUDpcbiAzNjM6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcbiAzNjQ6XHRcdFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XG4gMzY1Olx0XHRkZWZhdWx0OlxuIDM2NjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzNjc6XHRcdH1cbiAzNjg6XHRcbiAzNjk6XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZndXAsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGd1cCkpKVxuIDM3MDpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzNzE6XHRcbiAzNzI6XHRcdHJldCA9IF9fZ3VwX3Rlc3RfaW9jdGwoY21kLCBcdTAwMjZndXApO1xuIDM3MzpcdFx0aWYgKHJldClcbiAzNzQ6XHRcdFx0cmV0dXJuIHJldDtcbiAzNzU6XHRcbiAzNzY6XHRcdGlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBcdTAwMjZndXAsIHNpemVvZihndXApKSlcbiAzNzc6XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gMzc4Olx0XG4gMzc5Olx0XHRyZXR1cm4gMDtcbiAzODA6XHR9XG4gMzgxOlx0XG4gMzgyOlx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuIDM4MzpcdHtcbiAzODQ6XHRcdHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzQwNwoJCQkJCQkJb3V0cHV0OiA0NwoJCQkJCQkJdGhvdWdodHM6IDMyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIGBndXBfdGVzdF9pb2N0bGAgRnVuY3Rpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBgZ3VwX3Rlc3RfaW9jdGxgIGZ1bmN0aW9uYWxpdHkuIEZpcnN0LCBpdCBsb29rcyBsaWtlIGl0JiMzOTtzIGhhbmRsaW5nIGEgc2V0IG9mIGNvbW1hbmRzOiBgR1VQX0ZBU1RfQkVOQ0hNQVJLYCwgYFBJTl9GQVNUX0JFTkNITUFSS2AsIGBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLYCwgYEdVUF9CQVNJQ19URVNUYCwgYFBJTl9CQVNJQ19URVNUYCwgYW5kIGBEVU1QX1VTRVJfUEFHRVNfVEVTVGAuIEludGVyZXN0aW5nLiBUaGUgbmV4dCBzdGVwIGlzIGEgYGNvcHlfZnJvbV91c2VyYCBjYWxsIHRvIGdldCBhIGBndXBgIHN0cnVjdCBmcm9tIHVzZXJzcGFjZS4gVGhlbiBpdCBoYW5kcyBvZmYgdGhlIHByb2Nlc3NpbmcgdG8gYF9fZ3VwX3Rlc3RfaW9jdGwoY21kLCAmYW1wO2d1cClgLgoKTm93LCBpcyBgX19ndXBfdGVzdF9pb2N0bGAgc3RhdGljPyBZZXAsIGl0IGlzLiBUaGUgY29tcGlsZXIgd2lsbCBsaWtlbHkgaW5saW5lIGl0LiBUaGF0JiMzOTtzIGdvb2QgdG8ga25vdyBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMuIEkgd29uZGVyIHRob3VnaCwgd2hhdCBvdGhlciBlbnRyeSBwb2ludHMgZXhpc3QuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBhbSBjb3ZlcmluZyBhbGwgY2FsbHMgdG8gdGhpcyBtZXRob2QuIAoKTGV0IG1lIGNsYXJpZnkgbXkgbWVtb3J5LiBXYWl0LCBgZ3VwX3Rlc3RfaW9jdGxgIGl0c2VsZiBpcyBkZWNsYXJlZCBzdGF0aWMhIExpbmUgMzQ3IGRlY2xhcmVzIGl0OiBgc3RhdGljIGxvbmcgZ3VwX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylgCgpBbHNvLCBsZXQmIzM5O3MgdGFrZSBhIHF1aWNrIGxvb2sgYXQgYGd1cF90ZXN0X2luaXRgIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgbW9kdWxlIGlzIGluaXRpYWxpemVkLgoKVG8gYmUgdGhvcm91Z2gsIEkgc2hvdWxkIHNlYXJjaCB0aHJvdWdoIGBtbS9ndXBfdGVzdC5jYCBmb3IgYW55IG90aGVyIG5vbi1zdGF0aWMgb3IgZXhwb3J0ZWQgZnVuY3Rpb25zLiBMZXQmIzM5O3MgYGdyZXBgIGZvciB0aG9zZS4gVGhhdCB3aWxsIHNvbGlkaWZ5IG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIG1vZHVsZSYjMzk7cyBpbnRlcmZhY2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteW2EtekEtWl9dW2EtekEtWjAtOV9dKiAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMtMTAtXG5tbS9ndXBfdGVzdC5jOjExOnN0cnVjdCBndXBfdGVzdF9kYXRhIHtcbm1tL2d1cF90ZXN0LmMtMTItXHRzdHJ1Y3QgbXV0ZXggbG9uZ3Rlcm1fbXV0ZXg7XG4tLVxubW0vZ3VwX3Rlc3QuYy0xNi1cbm1tL2d1cF90ZXN0LmM6MTc6c3RhdGljIHZvaWQgcHV0X2JhY2tfcGFnZXModW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcbm1tL2d1cF90ZXN0LmMtMTgtXHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcywgdW5zaWduZWQgaW50IGd1cF90ZXN0X2ZsYWdzKVxuLS1cbm1tL2d1cF90ZXN0LmMtNDUtXG5tbS9ndXBfdGVzdC5jOjQ2OnN0YXRpYyB2b2lkIHZlcmlmeV9kbWFfcGlubmVkKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG5tbS9ndXBfdGVzdC5jLTQ3LVx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4tLVxubW0vZ3VwX3Rlc3QuYy03NS1cbm1tL2d1cF90ZXN0LmM6NzY6c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxubW0vZ3VwX3Rlc3QuYy03Ny1cdFx0XHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5tbS9ndXBfdGVzdC5jLTEwNi1cbm1tL2d1cF90ZXN0LmM6MTA3OnN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxubW0vZ3VwX3Rlc3QuYy0xMDgtXHRcdHN0cnVjdCBndXBfdGVzdCAqZ3VwKVxuLS1cbm1tL2d1cF90ZXN0LmMtMjE1LVxubW0vZ3VwX3Rlc3QuYzoyMTY6c3RhdGljIGlubGluZSB2b2lkIHBpbl9sb25ndGVybV90ZXN0X3N0b3Aoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEpXG5tbS9ndXBfdGVzdC5jLTIxNy17XG4tLVxubW0vZ3VwX3Rlc3QuYy0yMjctXG5tbS9ndXBfdGVzdC5jOjIyODpzdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdGFydChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcbm1tL2d1cF90ZXN0LmMtMjI5LVx0XHR1bnNpZ25lZCBsb25nIGFyZylcbi0tXG5tbS9ndXBfdGVzdC5jLTI5NC1cbm1tL2d1cF90ZXN0LmM6Mjk1OnN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXG5tbS9ndXBfdGVzdC5jLTI5Ni1cdFx0dW5zaWduZWQgbG9uZyBhcmcpXG4tLVxubW0vZ3VwX3Rlc3QuYy0zMjAtXG5tbS9ndXBfdGVzdC5jOjMyMTpzdGF0aWMgbG9uZyBwaW5fbG9uZ3Rlcm1fdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG5tbS9ndXBfdGVzdC5jLTMyMi1cdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFyZylcbi0tXG5tbS9ndXBfdGVzdC5jLTM0Ni1cbm1tL2d1cF90ZXN0LmM6MzQ3OnN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcbm1tL2d1cF90ZXN0LmMtMzQ4LVx0XHR1bnNpZ25lZCBsb25nIGFyZylcbi0tXG5tbS9ndXBfdGVzdC5jLTM4MS1cbm1tL2d1cF90ZXN0LmM6MzgyOnN0YXRpYyBpbnQgZ3VwX3Rlc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbm1tL2d1cF90ZXN0LmMtMzgzLXtcbi0tXG5tbS9ndXBfdGVzdC5jLTQwMS1cbm1tL2d1cF90ZXN0LmM6NDAyOnN0YXRpYyBpbnQgZ3VwX3Rlc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbm1tL2d1cF90ZXN0LmMtNDAzLXtcbi0tXG5tbS9ndXBfdGVzdC5jLTQxMy1cbm1tL2d1cF90ZXN0LmM6NDE0OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGd1cF90ZXN0X2ZvcHMgPSB7XG5tbS9ndXBfdGVzdC5jLTQxNS1cdC5vcGVuID0gZ3VwX3Rlc3Rfb3Blbixcbi0tXG5tbS9ndXBfdGVzdC5jLTQyMC1cbm1tL2d1cF90ZXN0LmM6NDIxOnN0YXRpYyBpbnQgX19pbml0IGd1cF90ZXN0X2luaXQodm9pZClcbm1tL2d1cF90ZXN0LmMtNDIyLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUwNzEKCQkJCQkJCW91dHB1dDogMTQ1CgkJCQkJCQl0aG91Z2h0czogMTA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldCBBc3Nlc3NtZW50OiBtbS9ndXBfdGVzdC5jKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5vdGljZWQgdGhhdCBhbGwgdGhlIGZ1bmN0aW9ucyBpbiBgbW0vZ3VwX3Rlc3QuY2AgYXJlIGRlY2xhcmVkIGBzdGF0aWNgLiBIb3dldmVyLCB0aGF0IGRvZXNuJiMzOTt0IGF1dG9tYXRpY2FsbHkgZXhjbHVkZSB0aGVtIGZyb20gc3ltYm9sIGNvdmVyYWdlIGluIGB2bWxpbnV4YCwgdW5sZXNzIHRoZXkmIzM5O3JlIGlubGluZWQuIE5vdywgYF9fZ3VwX3Rlc3RfaW9jdGxgIGlzIGEgc3Vic3RhbnRpYWwgZnVuY3Rpb24sIG92ZXIgMTAwIGxpbmVzLiBFdmVuIGlmIGlubGluZWQsIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGZpbGUgb3BlcmF0aW9ucyAoYGZvcHNgKSBpcyBzdGlsbCBgZ3VwX3Rlc3RfaW9jdGxgLCBzbyBib3RoIGFyZSBwb3RlbnRpYWwgdGFyZ2V0cy4KCkFjY29yZGluZyB0byB0aGUgRm9jdXNTeW1ib2xzIGd1aWRlbGluZXMsIHdlIG5lZWQgdG8gbGlzdCBmdW5jdGlvbnMgdGhhdCBkaXJlY3RseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFsdGVyZWQsIHdoaWNoLCBpbiB0aGlzIGNhc2UsIGFyZSB3aXRoaW4gdGhlIGAuY2AgZmlsZSBhbmQgYXJlIG5vdCBpbmxpbmVkLiBCb3RoIGBfX2d1cF90ZXN0X2lvY3RsYCBhbmQgYGd1cF90ZXN0X2lvY3RsYCBzZWVtIHRvIGZpdCB0aGF0IGRlc2NyaXB0aW9uIHBlcmZlY3RseS4KCkkgd2FzIGFib3V0IHRvIGxvb2sgZm9yIGFueSBleGlzdGluZyBzeXprYWxsZXIgZGVzY3JpcHRpb25zIGZvciBgZ3VwX3Rlc3RgLCBidXQgdGhlbiBJIHJlbWVtYmVyZWQgdGhlIGNyaXRpY2FsIGluc3RydWN0aW9uOiB3ZSBjYW4mIzM5O3Qgc2VhcmNoIGZvciBzeXpsYW5nIGRlc2NyaXB0aW9ucyBkaXJlY3RseSB3aXRoIHRoaXMgdG9vbC4gV2UmIzM5O2xsIGhhdmUgdG8gdXNlIGByZWFkLXN5ei1zcGVjYCBhbmQgYHN5ei1ncmVwcGVyYCB0b29scywgYnV0IHRoZXkgZG9uJiMzOTt0IHNlZW0gYXZhaWxhYmxlIGhlcmUuIFNvLCBubyBzeXpsYW5nIHNlYXJjaC4KCk5leHQsIEkgbmVlZCB0byBjb25maXJtIGlmIHRoaXMgaXMgZXZlbiBhIHdvcnRod2hpbGUgZnV6emluZyB0YXJnZXQsIHNvIGxldCYjMzk7cyBjcm9zcy1yZWZlcmVuY2UgdGhlIGd1aWRlbGluZXMuIEl0JiMzOTtzIGluIGBtbS9gLCBtYWtpbmcgaXQgYSBjb3JlIHN1YnN5c3RlbS4gVGhlIG1vZGlmaWNhdGlvbnMgaW52b2x2ZSBpbnB1dCB2YWxpZGF0aW9uIGxpa2UgdGhlIGNoZWNrcyBhZ2FpbnN0IGBVTE9OR19NQVhgIGFuZCBwYWdlIGFsaWdubWVudCwgYW5kIHRoZSBjYWxjdWxhdGlvbiBvZiBwYWdlIHJhbmdlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgJiMzNDtSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3MmIzM0Oy4gSXQmIzM5O3Mgbm90IHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSwgYXMgZGVidWdmcyBpcyBzdGFuZGFyZCBhbmQgYWNjZXNzaWJsZSwgcGFydGljdWxhcmx5IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4gVGhlcmVmb3JlLCBpdCBkZWZpbml0ZWx5IG1lZXRzIHRoZSBjcml0ZXJpYSwgc28gYFdvcnRoRnV6emluZz10cnVlYC4KCk5vdyBmb3IgY29uZmlnIGRlcGVuZGVuY2llcy4gTG9va2luZyBhdCBgbW0vS2NvbmZpZ2AsIGl0JiMzOTtzIGNsZWFyIHdlIG5lZWQgYEdVUF9URVNUYCBhbmQgYERFQlVHX0ZTYCBlbmFibGVkLgoKVG8gc3VtbWFyaXplLCBteSBmb2N1cyBzeW1ib2xzIHdpbGwgYmUgYF9fZ3VwX3Rlc3RfaW9jdGxgIGFuZCBgZ3VwX3Rlc3RfaW9jdGxgLgoKTXkgcmVhc29uaW5nPyBUaGlzIHBhdGNoIHNwZWNpZmljYWxseSBhbHRlcnMgaW5wdXQgdmFsaWRhdGlvbiBhbmQgcGFnZSBjYWxjdWxhdGlvbiBpbiBgX19ndXBfdGVzdF9pb2N0bGAgd2l0aGluIGBtbS9ndXBfdGVzdC5jYCwgYW4gaW50ZXJmYWNlIGV4cG9zZWQgdGhyb3VnaCBkZWJ1Z2ZzIHRvIHVzZXJzcGFjZSAoYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCkuIFRoZSBjaGFuZ2VzIGRpcmVjdGx5IGltcGFjdCBob3cgcGFnZSByYW5nZXMgYW5kIGxvb3AgaXRlcmF0aW9ucyBhcmUgY2FsY3VsYXRlZCBmb3IgYGdldF91c2VyX3BhZ2VzYCB0ZXN0cy4gSXQmIzM5O3MgYSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IHRlc3QgaW50ZXJmYWNlIHJlYWNoYWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMsIHNvIGZ1enppbmcgY2FuIGhlbHAgdmVyaWZ5IGJvdW5kYXJ5IGNvbmRpdGlvbnMgYW5kIHBvdGVudGlhbGx5IHJldmVhbCBtZW1vcnktcmVsYXRlZCBpc3N1ZXMuCgpGaW5hbGx5LCBqdXN0IHRvIGJlIGFic29sdXRlbHkgc3VyZSwgbGV0JiMzOTtzIHZlcmlmeSBldmVyeXRoaW5nIGlzIGluIG9yZGVyOgoKKiAgIGBFbmFibGVDb25maWdzYDogYFsmIzM0O0dVUF9URVNUJiMzNDssICYjMzQ7REVCVUdfRlMmIzM0O11gCiogICBgRm9jdXNTeW1ib2xzYDogYFsmIzM0O19fZ3VwX3Rlc3RfaW9jdGwmIzM0OywgJiMzNDtndXBfdGVzdF9pb2N0bCYjMzQ7XWAKKiAgIGBXb3J0aEZ1enppbmdgOiBgdHJ1ZWAKKiAgIGBSZWFzb25pbmdgOiBDb25jaXNlIGV4cGxhbmF0aW9uIHByb3ZpZGVkIGFib3ZlLgoKWWVwLCBsb29rcyBnb29kLiBXZSBhcmUgcmVhZHkgdG8gaW52b2tlIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtHVVBfVEVTVCYjMzQ7LAogICAgJiMzNDtERUJVR19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O19fZ3VwX3Rlc3RfaW9jdGwmIzM0OywKICAgICYjMzQ7Z3VwX3Rlc3RfaW9jdGwmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgaW5wdXQgdmFsaWRhdGlvbiBjaGVja3MgYW5kIGl0ZXJhdGlvbiBsb2dpYyBmb3IgcGFnZSBwaW5uaW5nIGFuZCBnZXRfdXNlcl9wYWdlcyBsb29wcyBpbiBfX2d1cF90ZXN0X2lvY3RsKCkgKG1tL2d1cF90ZXN0LmMpLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgYm91bmRhcnkgY29uZGl0aW9uIGhhbmRsaW5nIGFuZCBwb3RlbnRpYWwgcmVncmVzc2lvbnMgaW4gcGFnZSByYW5nZSBoYW5kbGluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7R1VQX1RFU1QmIzM0OywKICAgICYjMzQ7REVCVUdfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtfX2d1cF90ZXN0X2lvY3RsJiMzNDssCiAgICAmIzM0O2d1cF90ZXN0X2lvY3RsJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGlucHV0IHZhbGlkYXRpb24gY2hlY2tzIGFuZCBpdGVyYXRpb24gbG9naWMgZm9yIHBhZ2UgcGlubmluZyBhbmQgZ2V0X3VzZXJfcGFnZXMgbG9vcHMgaW4gX19ndXBfdGVzdF9pb2N0bCgpIChtbS9ndXBfdGVzdC5jKS4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW9jdGxzIG9uIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIGJvdW5kYXJ5IGNvbmRpdGlvbiBoYW5kbGluZyBhbmQgcG90ZW50aWFsIHJlZ3Jlc3Npb25zIGluIHBhZ2UgcmFuZ2UgaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBtbS9ndXBfdGVzdC5jIHRvIGFkZCBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAoY2hlY2tpbmcgdGhhdCBndXAtXHUwMDNlc2l6ZSBpcyBub24temVybyBhbmQgUEFHRV9BTElHTkVELCBhbmQgdGhhdCBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgaXMgbm9uLXplcm8pIGFuZCBzaW1wbGlmaWVzIHRoZSBwZXItaXRlcmF0aW9uIHBhZ2UgY291bnQgY2FsY3VsYXRpb24gdXNpbmcgbWluX3QoKS4gXG5cblRoZSBpc3N1ZXMgYWRkcmVzc2VkIGJ5IHRoaXMgcGF0Y2ggYXJlIGluZmluaXRlIGxvb3BzICh3aGVuIG5yX3BhZ2VzX3Blcl9jYWxsIGlzIDApIGFuZCBvdXQtb2YtYm91bmRzIGJ1ZmZlciBpbmRleGluZyBvbiB0aGUgYHBhZ2VzYCBhcnJheSAod2hlbiBndXAtXHUwMDNlc2l6ZSB3YXMgbm90IHBhZ2UtYWxpZ25lZCkuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGRldGVjdGVkIGJ5IGxvY2t1cC93YXRjaGRvZyBkZXRlY3RvcnMgYW5kIEtBU0FOIChLZXJuZWxBZGRyZXNzU2FuaXRpemVyKSwgcmVzcGVjdGl2ZWx5LlxuXG5BbGwgYnVmZmVycyBpbnZvbHZlZCAodGhlIHN0YWNrLWFsbG9jYXRlZCBzdHJ1Y3QgZ3VwX3Rlc3QgYW5kIHRoZSBoZWFwLWFsbG9jYXRlZCBwYWdlcyBhcnJheSkgYXJlIGZ1bGx5IGluaXRpYWxpemVkIHZpYSBjb3B5X2Zyb21fdXNlcigpIGFuZCBrdmNhbGxvYygpLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIHN0cnVjdCBwYWRkaW5nIGluZm8tbGVha3MsIG9yIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGludHJvZHVjZWQgb3IgbW9kaWZpZWQgYnkgdGhpcyBjaGFuZ2UuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBqdXN0aWZpZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA0YmI1ZmQyNDNjY2Q2ZWQ1MDZiM2QzZmM2OTM5MmU5N2FmNzExZTNiCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFR1ZSBTZXAgMTUgMTI6MjE6MzkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuYwppbmRleCAxODViYTNiYjhlZDEwLi5iYTc0YmYzZjQxMDQ4IDEwMDY0NAotLS0gYS9tbS9ndXBfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2d1cF90ZXN0LmMKQEAgLTExNiw3ICYjNDM7MTE2LDggQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsCiAJYm9vbCBuZWVkc19tbWFwX2xvY2sgPQogCQljbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLICZhbXA7JmFtcDsgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSzsKIAotCWlmIChndXAtJmd0O2FkZHIgJmd0OyBVTE9OR19NQVggfHwgZ3VwLSZndDtzaXplICZndDsgVUxPTkdfTUFYKQomIzQzOwlpZiAoZ3VwLSZndDthZGRyICZndDsgVUxPTkdfTUFYIHx8IGd1cC0mZ3Q7c2l6ZSAmZ3Q7IFVMT05HX01BWCB8fCAhZ3VwLSZndDtzaXplIHx8CiYjNDM7CSAgICAhZ3VwLSZndDtucl9wYWdlc19wZXJfY2FsbCB8fCAhUEFHRV9BTElHTkVEKGd1cC0mZ3Q7c2l6ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLSZndDthZGRyLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC0mZ3Q7c2l6ZSwgJmFtcDtlbmQpKQpAQCAtMTM5LDExICYjNDM7MTQwLDkgQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsCiAJCWlmIChuciAhPSBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsKQogCQkJYnJlYWs7CiAKJiM0MzsJCW5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7CiYjNDM7CiAJCW5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFOwotCQlpZiAobmV4dCAmZ3Q7IGVuZCkgewotCQkJbmV4dCA9IGVuZDsKLQkJCW5yID0gKG5leHQgLSBhZGRyKSAvIFBBR0VfU0laRTsKLQkJfQogCiAJCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjI5NgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDY3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGFuYWx5c2lzIG9mIHRoZSBzaXR1YXRpb246CgoqKktNU0FOIEZ1enppbmcgU2Vzc2lvbiBBc3Nlc3NtZW50KioKCk9rYXksIHNvIHRoZSB0YXNrIGF0IGhhbmQgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2ggbmVjZXNzaXRhdGVzIGl0cyBvd24sIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIE15IGZpcnN0IGluc3RpbmN0LCBhcyBhbHdheXMsIGlzIHRvIGRpdmUgaW50byB0aGUgY29kZS4gSSBuZWVkIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgdGhlIHBhdGNoJiMzOTtzIGltcGFjdC4gU3BlY2lmaWNhbGx5LCBJJiMzOTtsbCBzdGFydCBieSBpbnNwZWN0aW5nIHRoZSBwYXRjaCBpdHNlbGYsIGFuZCB0aGVuIEkmIzM5O2xsIHR1cm4gbXkgYXR0ZW50aW9uIHRvIGBtbS9ndXBfdGVzdC5jYCDigJMgdGhhdCBzZWVtcyBsaWtlIGEgbGlrZWx5IGFyZWEgdG8gZmluZCByZWxhdGVkIGNvZGUgb3IgY29udGV4dCwgZXNwZWNpYWxseSBnaXZlbiB0aGUgJiMzNDtndXAmIzM0OyBpbiB0aGUgZmlsZSBuYW1lLCBzdWdnZXN0aW5nIGludGVyYWN0aW9ucyB3aXRoIEdldCBVc2VyIFBhZ2VzLgoKVG8gZXhwZWRpdGUgdGhpcywgSSYjMzk7bGwgdXNlIGEgYHJlYWQtZmlsZWAgY29tbWFuZCwgemVyb2luZyBpbiBvbiB0aGUgcmVsZXZhbnQgc2VjdGlvbiBvZiBgbW0vZ3VwX3Rlc3QuY2Ag4oCTIEkmIzM5O2xsIHN0YXJ0IGFyb3VuZCBsaW5lIDExNi4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgaW5pdGlhbCB2aWV3IG9mIHRoZSBjb2RlIHN1cnJvdW5kaW5nIHRoZSBwYXRjaCYjMzk7cyBzY29wZS4gSSYjMzk7bSBsb29raW5nIGZvciBhbnl0aGluZyB0aGF0IHNjcmVhbXMgJiMzNDttZW1vcnkgc2FmZXR5LCYjMzQ7IHBvdGVudGlhbGx5IG5ldyBhbGxvY2F0aW9uIHNjaGVtZXMsIGNoYW5nZWQgcG9pbnRlciBhcml0aG1ldGljLCBvciBhbnkgY2hhbmdlcyB0byBob3cgdGhlIGtlcm5lbCBpbnRlcmFjdHMgd2l0aCB1c2VyLXNwYWNlIG1lbW9yeSDigJMgYWxsIHJlZCBmbGFncyB0aGF0IHdvdWxkIHB1c2ggbWUgdG93YXJkIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24uIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhhdCBhIGNhcmVmdWwgYXNzZXNzbWVudCBvZiB0aGlzIGNvZGUgaXMgdGhlIGtleSB0byBhbiBpbmZvcm1lZCBkZWNpc2lvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgOTA6XHRcdFx0XHRndXAtXHUwMDNld2hpY2hfcGFnZXNbaV0gPSAwO1xuICA5MTpcdFx0XHR9XG4gIDkyOlx0XHR9XG4gIDkzOlx0XG4gIDk0Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSYjNDM7JiM0MzspIHtcbiAgOTU6XHRcdFx0aW5kZXhfdG9fZHVtcCA9IGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXTtcbiAgOTY6XHRcbiAgOTc6XHRcdFx0aWYgKGluZGV4X3RvX2R1bXApIHtcbiAgOTg6XHRcdFx0XHRpbmRleF90b19kdW1wLS07IC8vIERlY29kZSBmcm9tIDEtYmFzZWQsIHRvIDAtYmFzZWRcbiAgOTk6XHRcdFx0XHRwcl9pbmZvKFwmIzM0Oy0tLS0gcGFnZSAjJXUsIHN0YXJ0aW5nIGZyb20gdXNlciB2aXJ0IGFkZHI6IDB4JWxseFxcblwmIzM0OyxcbiAxMDA6XHRcdFx0XHRcdGluZGV4X3RvX2R1bXAsIGd1cC1cdTAwM2VhZGRyKTtcbiAxMDE6XHRcdFx0XHRkdW1wX3BhZ2UocGFnZXNbaW5kZXhfdG9fZHVtcF0sXG4gMTAyOlx0XHRcdFx0XHQgIFwmIzM0O2d1cF90ZXN0OiBkdW1wX3BhZ2VzKCkgdGVzdFwmIzM0Oyk7XG4gMTAzOlx0XHRcdH1cbiAxMDQ6XHRcdH1cbiAxMDU6XHR9XG4gMTA2Olx0XG4gMTA3Olx0c3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXG4gMTA4Olx0XHRcdHN0cnVjdCBndXBfdGVzdCAqZ3VwKVxuIDEwOTpcdHtcbiAxMTA6XHRcdGt0aW1lX3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7XG4gMTExOlx0XHR1bnNpZ25lZCBsb25nIGksIG5yX3BhZ2VzLCBhZGRyLCBuZXh0O1xuIDExMjpcdFx0bG9uZyBucjtcbiAxMTM6XHRcdHN0cnVjdCBwYWdlICoqcGFnZXM7XG4gMTE0Olx0XHR1bnNpZ25lZCBsb25nIGVuZDtcbiAxMTU6XHRcdGludCByZXQgPSAwO1xuIDExNjpcdFx0Ym9vbCBuZWVkc19tbWFwX2xvY2sgPVxuIDExNzpcdFx0XHRjbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLIFx1MDAyNlx1MDAyNiBjbWQgIT0gUElOX0ZBU1RfQkVOQ0hNQVJLO1xuIDExODpcdFxuIDExOTpcdFx0aWYgKGd1cC1cdTAwM2VhZGRyIFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVx1MDAzZXNpemUgXHUwMDNlIFVMT05HX01BWCB8fCAhZ3VwLVx1MDAzZXNpemUgfHxcbiAxMjA6XHRcdCAgICAhZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsIHx8ICFQQUdFX0FMSUdORUQoZ3VwLVx1MDAzZXNpemUpKVxuIDEyMTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjI6XHRcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG4gMTIzOlx0XHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxuIDEyNDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjU6XHRcbiAxMjY6XHRcdG5yX3BhZ2VzID0gZ3VwLVx1MDAzZXNpemUgLyBQQUdFX1NJWkU7XG4gMTI3Olx0XHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XG4gMTI4Olx0XHRpZiAoIXBhZ2VzKVxuIDEyOTpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAxMzA6XHRcbiAxMzE6XHRcdGlmIChuZWVkc19tbWFwX2xvY2sgXHUwMDI2XHUwMDI2IG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKGN1cnJlbnQtXHUwMDNlbW0pKSB7XG4gMTMyOlx0XHRcdHJldCA9IC1FSU5UUjtcbiAxMzM6XHRcdFx0Z290byBmcmVlX3BhZ2VzO1xuIDEzNDpcdFx0fVxuIDEzNTpcdFxuIDEzNjpcdFx0aSA9IDA7XG4gMTM3Olx0XHRuciA9IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcbiAxMzg6XHRcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcbiAxMzk6XHRcdGZvciAoYWRkciA9IGd1cC1cdTAwM2VhZGRyOyBhZGRyIFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XG4gMTQwOlx0XHRcdGlmIChuciAhPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwpXG4gMTQxOlx0XHRcdFx0YnJlYWs7XG4gMTQyOlx0XG4gMTQzOlx0XHRcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XG4gMTQ0Olx0XG4gMTQ1Olx0XHRcdG5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFO1xuIDE0NjpcdFxuIDE0NzpcdFx0XHRzd2l0Y2ggKGNtZCkge1xuIDE0ODpcdFx0XHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcbiAxNDk6XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG4gMTUwOlx0XHRcdFx0XHRcdFx0IHBhZ2VzICYjNDM7IGkpO1xuIDE1MTpcdFx0XHRcdGJyZWFrO1xuIDE1MjpcdFx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxuIDE1MzpcdFx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICYjNDM7IGkpO1xuIDE1NDpcdFx0XHRcdGJyZWFrO1xuIDE1NTpcdFx0XHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcbiAxNTY6XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG4gMTU3Olx0XHRcdFx0XHRcdFx0IHBhZ2VzICYjNDM7IGkpO1xuIDE1ODpcdFx0XHRcdGJyZWFrO1xuIDE1OTpcdFx0XHRjYXNlIFBJTl9CQVNJQ19URVNUOlxuIDE2MDpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICYjNDM7IGkpO1xuIDE2MTpcdFx0XHRcdGJyZWFrO1xuIDE2MjpcdFx0XHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XG4gMTYzOlx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBucixcbiAxNjQ6XHRcdFx0XHRcdFx0ICAgIGd1cC1cdTAwM2VndXBfZmxhZ3MgfCBGT0xMX0xPTkdURVJNLFxuIDE2NTpcdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4gMTY2Olx0XHRcdFx0YnJlYWs7XG4gMTY3Olx0XHRcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XG4gMTY4Olx0XHRcdFx0aWYgKGd1cC1cdTAwM2V0ZXN0X2ZsYWdzIFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTilcbiAxNjk6XHRcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG4gMTcwOlx0XHRcdFx0XHRcdFx0ICAgIHBhZ2VzICYjNDM7IGkpO1xuIDE3MTpcdFx0XHRcdGVsc2VcbiAxNzI6XHRcdFx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG4gMTczOlx0XHRcdFx0XHRcdFx0ICAgIHBhZ2VzICYjNDM7IGkpO1xuIDE3NDpcdFx0XHRcdGJyZWFrO1xuIDE3NTpcdFx0XHRkZWZhdWx0OlxuIDE3NjpcdFx0XHRcdHJldCA9IC1FSU5WQUw7XG4gMTc3Olx0XHRcdFx0Z290byB1bmxvY2s7XG4gMTc4Olx0XHRcdH1cbiAxNzk6XHRcbiAxODA6XHRcdFx0aWYgKG5yIFx1MDAzYz0gMClcbiAxODE6XHRcdFx0XHRicmVhaztcbiAxODI6XHRcdFx0aSAmIzQzOz0gbnI7XG4gMTgzOlx0XHR9XG4gMTg0Olx0XHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xuIDE4NTpcdFxuIDE4NjpcdFx0LyogU2hpZnRpbmcgdGhlIG1lYW5pbmcgb2YgbnJfcGFnZXM6IG5vdyBpdCBpcyBhY3R1YWwgbnVtYmVyIHBpbm5lZDogKi9cbiAxODc6XHRcdG5yX3BhZ2VzID0gaTtcbiAxODg6XHRcbiAxODk6XHRcdGd1cC1cdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDI0NAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBpZiB0aGV5JiMzOTtyZSBteSBvd246CgoqKkRpdmluZyBpbnRvIGd1cF90ZXN0LmMgZm9yIERlZXBlciBVbmRlcnN0YW5kaW5nKioKClJpZ2h0LCBsZXQmIzM5O3Mgc2VlLi4uIEkgbmVlZCB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIGhvdyB0aGlzIGBndXBfdGVzdGAgaW9jdGwgYWN0dWFsbHkgZnVuY3Rpb25zLiBJJiMzOTttIGdvaW5nIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgY29kZSB3aXRoaW4gYG1tL2d1cF90ZXN0LmNgLiBUaGUgY29yZSBxdWVzdGlvbiBJJiMzOTttIHRyeWluZyB0byBhbnN3ZXIgaXMgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIGBndXBgIGZ1bmN0aW9uYWxpdHksIGFuZCBzcGVjaWZpY2FsbHksIHdoYXTigJlzIGdvaW5nIG9uIHdpdGggdGhlc2UgYHBhZ2VzYCB0aGV5JiMzOTtyZSBtZW50aW9uaW5nLiBJJiMzOTttIGhvcGluZyBieSBmb2xsb3dpbmcgdGhlIGV4ZWN1dGlvbiBwYXRoLCBJIGNhbiB1bmNvdmVyIHRoZSBkZXRhaWxzIG9mIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCB0aGUgbWVjaGFuaWNzIGJlaGluZCBgZ3VwX3Rlc3RgLiBJIGV4cGVjdCB0byBmaW5kIHNvbWUgaW50ZXJlc3RpbmcgY2FzZXMgd2hlcmUgYGd1cGAgaXMgYmVpbmcgdGVzdGVkIHdpdGggc29tZSBjb21wbGV4IHBhZ2UgbWFwcGluZ3MgYW5kIHNjZW5hcmlvcy4gSXQmIzM5O3MgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vZ3VwX3Rlc3QuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTkwOlx0XHRndXAtXHUwMDNlc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuIDE5MTpcdFxuIDE5MjpcdFx0LypcbiAxOTM6XHRcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxuIDE5NDpcdFx0ICogc3RhdGU6IHByaW50IGEgd2FybmluZyBpZiBhbnkgbm9uLWRtYS1waW5uZWQgcGFnZXMgYXJlIGZvdW5kOlxuIDE5NTpcdFx0ICovXG4gMTk2Olx0XHR2ZXJpZnlfZG1hX3Bpbm5lZChjbWQsIHBhZ2VzLCBucl9wYWdlcyk7XG4gMTk3Olx0XG4gMTk4Olx0XHRpZiAoY21kID09IERVTVBfVVNFUl9QQUdFU19URVNUKVxuIDE5OTpcdFx0XHRkdW1wX3BhZ2VzX3Rlc3QoZ3VwLCBwYWdlcywgbnJfcGFnZXMpO1xuIDIwMDpcdFxuIDIwMTpcdFx0c3RhcnRfdGltZSA9IGt0aW1lX2dldCgpO1xuIDIwMjpcdFxuIDIwMzpcdFx0cHV0X2JhY2tfcGFnZXMoY21kLCBwYWdlcywgbnJfcGFnZXMsIGd1cC1cdTAwM2V0ZXN0X2ZsYWdzKTtcbiAyMDQ6XHRcbiAyMDU6XHRcdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XG4gMjA2Olx0XHRndXAtXHUwMDNlcHV0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XG4gMjA3Olx0XG4gMjA4Olx0dW5sb2NrOlxuIDIwOTpcdFx0aWYgKG5lZWRzX21tYXBfbG9jaylcbiAyMTA6XHRcdFx0bW1hcF9yZWFkX3VubG9jayhjdXJyZW50LVx1MDAzZW1tKTtcbiAyMTE6XHRmcmVlX3BhZ2VzOlxuIDIxMjpcdFx0a3ZmcmVlKHBhZ2VzKTtcbiAyMTM6XHRcdHJldHVybiByZXQ7XG4gMjE0Olx0fVxuIDIxNTpcdFxuIDIxNjpcdHN0YXRpYyBpbmxpbmUgdm9pZCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdG9wKHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhKVxuIDIxNzpcdHtcbiAyMTg6XHRcdGlmIChkYXRhLVx1MDAzZWxvbmd0ZXJtX3BhZ2VzKSB7XG4gMjE5Olx0XHRcdGlmIChkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzKVxuIDIyMDpcdFx0XHRcdHVucGluX3VzZXJfcGFnZXMoZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcyxcbiAyMjE6XHRcdFx0XHRcdFx0IGRhdGEtXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMpO1xuIDIyMjpcdFx0XHRrdmZyZWUoZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcyk7XG4gMjIzOlx0XHRcdGRhdGEtXHUwMDNlbG9uZ3Rlcm1fcGFnZXMgPSBOVUxMO1xuIDIyNDpcdFx0XHRkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzID0gMDtcbiAyMjU6XHRcdH1cbiAyMjY6XHR9XG4gMjI3Olx0XG4gMjI4Olx0c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RhcnQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXG4gMjI5Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDIzMDpcdHtcbiAyMzE6XHRcdGxvbmcgbnJfcGFnZXMsIGN1cl9wYWdlcywgYWRkciwgcmVtYWluaW5nX3BhZ2VzO1xuIDIzMjpcdFx0aW50IGd1cF9mbGFncyA9IEZPTExfTE9OR1RFUk07XG4gMjMzOlx0XHRzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QgYXJncztcbiAyMzQ6XHRcdHN0cnVjdCBwYWdlICoqcGFnZXM7XG4gMjM1Olx0XHRpbnQgcmV0ID0gMDtcbiAyMzY6XHRcdGJvb2wgZmFzdDtcbiAyMzc6XHRcbiAyMzg6XHRcdGlmIChkYXRhLVx1MDAzZWxvbmd0ZXJtX3BhZ2VzKVxuIDIzOTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyNDA6XHRcbiAyNDE6XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZhcmdzLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihhcmdzKSkpXG4gMjQyOlx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDI0MzpcdFxuIDI0NDpcdFx0aWYgKGFyZ3MuZmxhZ3MgXHUwMDI2XG4gMjQ1Olx0XHQgICAgfihQSU5fTE9OR1RFUk1fVEVTVF9GTEFHX1VTRV9XUklURXxQSU5fTE9OR1RFUk1fVEVTVF9GTEFHX1VTRV9GQVNUKSlcbiAyNDY6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMjQ3Olx0XHRpZiAoIUlTX0FMSUdORUQoYXJncy5hZGRyIHwgYXJncy5zaXplLCBQQUdFX1NJWkUpKVxuIDI0ODpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAyNDk6XHRcdGlmIChhcmdzLnNpemUgXHUwMDNlIExPTkdfTUFYKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NDIzCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OgoKKipJbnZlc3RpZ2F0aW5nIGBfX2d1cF90ZXN0X2lvY3RsYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB0aGUgY2FsbGVyIG9mIGBfX2d1cF90ZXN0X2lvY3RsYC4gSSBrbm93IHRoYXQgbmFtZSBpcyBmYW1pbGlhciwgYnV0IEkgbmVlZCB0byBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5IG9mIHdoZXJlIGl0JiMzOTtzIHVzZWQuIFNpbmNlIEkmIzM5O20gd29ya2luZyBpbiB0aGUga2VybmVsLCBhIGBncmVwYCBzaG91bGQgYmUgdGhlIHF1aWNrZXN0IHdheSB0byBmaW5kIGl0LiBBbHRlcm5hdGl2ZWx5LCBJIHNob3VsZCBiZSBhYmxlIHRvIGp1c3QgbG9vayBhcm91bmQgbGluZSAyNzAsIGlmIEkga25vdyB3aGVyZSB0aGF0IGlzIGluIHRoZSBjb2RlLiBJJiMzOTttIHByb2JhYmx5IGFmdGVyIHdoZXJlIHRoaXMgY2FsbCBpcyBtYWRlLCBhbmQgd2hhdCBjb2RlIHBhdGggbGVhZHMgdG8gdGhhdCBwb2ludC4gVGhpcyB3aWxsIGdpdmUgbWUgYW4gdW5kZXJzdGFuZGluZyBvZiBpdHMgcHVycG9zZSBhbmQgdXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI3MDpcdFxuIDI3MTpcdFx0d2hpbGUgKG5yX3BhZ2VzIC0gZGF0YS1cdTAwM2Vsb25ndGVybV9ucl9wYWdlcykge1xuIDI3MjpcdFx0XHRyZW1haW5pbmdfcGFnZXMgPSBucl9wYWdlcyAtIGRhdGEtXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXM7XG4gMjczOlx0XHRcdGFkZHIgPSBhcmdzLmFkZHIgJiM0MzsgZGF0YS1cdTAwM2Vsb25ndGVybV9ucl9wYWdlcyAqIFBBR0VfU0laRTtcbiAyNzQ6XHRcbiAyNzU6XHRcdFx0aWYgKGZhc3QpXG4gMjc2Olx0XHRcdFx0Y3VyX3BhZ2VzID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCByZW1haW5pbmdfcGFnZXMsXG4gMjc3Olx0XHRcdFx0XHRcdFx0XHRndXBfZmxhZ3MsIHBhZ2VzKTtcbiAyNzg6XHRcdFx0ZWxzZVxuIDI3OTpcdFx0XHRcdGN1cl9wYWdlcyA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIHJlbWFpbmluZ19wYWdlcyxcbiAyODA6XHRcdFx0XHRcdFx0XHQgICBndXBfZmxhZ3MsIHBhZ2VzKTtcbiAyODE6XHRcdFx0aWYgKGN1cl9wYWdlcyBcdTAwM2MgMCkge1xuIDI4MjpcdFx0XHRcdHBpbl9sb25ndGVybV90ZXN0X3N0b3AoZGF0YSk7XG4gMjgzOlx0XHRcdFx0cmV0ID0gY3VyX3BhZ2VzO1xuIDI4NDpcdFx0XHRcdGJyZWFrO1xuIDI4NTpcdFx0XHR9XG4gMjg2Olx0XHRcdGRhdGEtXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgJiM0Mzs9IGN1cl9wYWdlcztcbiAyODc6XHRcdFx0cGFnZXMgJiM0Mzs9IGN1cl9wYWdlcztcbiAyODg6XHRcdH1cbiAyODk6XHRcbiAyOTA6XHRcdGlmICghZmFzdClcbiAyOTE6XHRcdFx0bW1hcF9yZWFkX3VubG9jayhjdXJyZW50LVx1MDAzZW1tKTtcbiAyOTI6XHRcdHJldHVybiByZXQ7XG4gMjkzOlx0fVxuIDI5NDpcdFxuIDI5NTpcdHN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXG4gMjk2Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDI5NzpcdHtcbiAyOTg6XHRcdF9fdTY0IHVzZXJfYWRkcjtcbiAyOTk6XHRcdHVuc2lnbmVkIGxvbmcgaTtcbiAzMDA6XHRcbiAzMDE6XHRcdGlmICghZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcylcbiAzMDI6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzAzOlx0XG4gMzA0Olx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2dXNlcl9hZGRyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1c2VyX2FkZHIpKSlcbiAzMDU6XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gMzA2Olx0XG4gMzA3Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuIDMwODpcdFx0XHR2b2lkICphZGRyID0ga21hcF9sb2NhbF9wYWdlKGRhdGEtXHUwMDNlbG9uZ3Rlcm1fcGFnZXNbaV0pO1xuIDMwOTpcdFx0XHR1bnNpZ25lZCBsb25nIHJldDtcbiAzMTA6XHRcbiAzMTE6XHRcdFx0cmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXVzZXJfYWRkciwgYWRkcixcbiAzMTI6XHRcdFx0XHRcdCAgIFBBR0VfU0laRSk7XG4gMzEzOlx0XHRcdGt1bm1hcF9sb2NhbChhZGRyKTtcbiAzMTQ6XHRcdFx0aWYgKHJldClcbiAzMTU6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzMTY6XHRcdFx0dXNlcl9hZGRyICYjNDM7PSBQQUdFX1NJWkU7XG4gMzE3Olx0XHR9XG4gMzE4Olx0XHRyZXR1cm4gMDtcbiAzMTk6XHR9XG4gMzIwOlx0XG4gMzIxOlx0c3RhdGljIGxvbmcgcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxuIDMyMjpcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuIDMyMzpcdHtcbiAzMjQ6XHRcdHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhID0gZmlsZXAtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIDMyNTpcdFx0aW50IHJldCA9IC1FSU5WQUw7XG4gMzI2Olx0XG4gMzI3Olx0XHRpZiAobXV0ZXhfbG9ja19raWxsYWJsZShcdTAwMjZkYXRhLVx1MDAzZWxvbmd0ZXJtX211dGV4KSlcbiAzMjg6XHRcdFx0cmV0dXJuIC1FSU5UUjtcbiAzMjk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjUwNAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGEgc2Vhc29uZWQgcHJvZmVzc2lvbmFsIGluIHRoZSBmaWVsZCwgc3BlYWtpbmcgZGlyZWN0bHkgdG8geW91OgoKKipEaXZpbmcgRGVlcGVyIGludG8gYGd1cF90ZXN0X2lvY3RsYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZ2V0IGludG8gdGhlIG5pdHR5LWdyaXR0eSBvZiB0aGlzIGBndXBfdGVzdF9pb2N0bGAgY29kZS4gVGhlIGluaXRpYWwgYXNzZXNzbWVudCBpcyB1c3VhbGx5IGp1c3QgdGhlIHRpcCBvZiB0aGUgaWNlYmVyZywgaXNuJiMzOTt0IGl0PyBNeSBtaW5kIGltbWVkaWF0ZWx5IHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbiYjMzk7cyBwdXJwb3NlIHdpdGhpbiB0aGUgbGFyZ2VyIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRleHQuIFdoYXQmIzM5O3MgaXQgZG9pbmc/IFdoYXQmIzM5O3MgaXQgKmludGVuZGVkKiB0byBkbz8gSSYjMzk7bSBhbHJlYWR5IGFudGljaXBhdGluZyB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdW5kZXJseWluZyBwYWdlIHRhYmxlcywgdGhlIHBvdGVudGlhbCBmb3IgbG9ja2luZyBpc3N1ZXMsIGFuZCB0aGUgd2F5cyB0aGlzIHRlc3QgbWlnaHQgdHJpZ2dlciBzcGVjaWZpYyBlZGdlIGNhc2VzIHdpdGhpbiB0aGUgR1VQIChHZXQgVXNlciBQYWdlKSBtZWNoYW5pc20uIAoKSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgYXJndW1lbnRzIGl0IHRha2VzIGFuZCBob3cgdGhleSBtYXAgdG8gc3BlY2lmaWMgbWVtb3J5IHJlZ2lvbnMsIHByb3RlY3Rpb24gZmxhZ3MsIG9yIGVycm9yIGNvbmRpdGlvbnMuIFdoYXQgYXJlIHRoZSBjb21tb24gZmFpbHVyZSBwYXRocywgYW5kIG1vcmUgaW1wb3J0YW50bHksIGhvdyBhcmUgdGhleSBiZWluZyBoYW5kbGVkPyBFcnJvciBoYW5kbGluZyBpcyBjcml0aWNhbCwgc28gSSYjMzk7bGwgYmUgbG9va2luZyBjbG9zZWx5IGF0IGhvdyBpdCBkZWFscyB3aXRoIGludmFsaWQgbWVtb3J5IGFkZHJlc3NlcywgcGVybWlzc2lvbnMgaXNzdWVzLCBhbmQgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGlzIHVzZWQgd2l0aGluIHRoZSBzeXN0ZW0gYW5kIHdoYXQgaXQgaGVscHMgdmFsaWRhdGUuIEkgd2lsbCBhbHNvIG1ha2Ugc29tZSBub3RlcyBvZiB3aGF0IHRvIGxvb2sgZm9yIGF0IG90aGVyIGxvY2F0aW9ucyBpbiB0aGUgc291cmNlLCB3aGVyZSBpdCBtaWdodCBiZSBjYWxsZWQgZnJvbSBhbmQgdGhlIGNvbnRleHRzIHRoZSBkYXRhIGZsb3dzLgoKTXkgZm9jdXMgbmFycm93cy4gT2theSwgbm93IGxldCYjMzk7cyBwdWxsIHVwIHRoZSBhY3R1YWwgc291cmNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzMzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDMzMDpcdFx0c3dpdGNoIChjbWQpIHtcbiAzMzE6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RBUlQ6XG4gMzMyOlx0XHRcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KGRhdGEsIGFyZyk7XG4gMzMzOlx0XHRcdGJyZWFrO1xuIDMzNDpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxuIDMzNTpcdFx0XHRwaW5fbG9uZ3Rlcm1fdGVzdF9zdG9wKGRhdGEpO1xuIDMzNjpcdFx0XHRyZXQgPSAwO1xuIDMzNzpcdFx0XHRicmVhaztcbiAzMzg6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcbiAzMzk6XHRcdFx0cmV0ID0gcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChkYXRhLCBhcmcpO1xuIDM0MDpcdFx0XHRicmVhaztcbiAzNDE6XHRcdH1cbiAzNDI6XHRcbiAzNDM6XHRcdG11dGV4X3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWxvbmd0ZXJtX211dGV4KTtcbiAzNDQ6XHRcdHJldHVybiByZXQ7XG4gMzQ1Olx0fVxuIDM0NjpcdFxuIDM0NzpcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcbiAzNDg6XHRcdFx0dW5zaWduZWQgbG9uZyBhcmcpXG4gMzQ5Olx0e1xuIDM1MDpcdFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcbiAzNTE6XHRcdGludCByZXQ7XG4gMzUyOlx0XG4gMzUzOlx0XHRzd2l0Y2ggKGNtZCkge1xuIDM1NDpcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4gMzU1Olx0XHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcbiAzNTY6XHRcdGNhc2UgUElOX0xPTkdURVJNX0JFTkNITUFSSzpcbiAzNTc6XHRcdGNhc2UgR1VQX0JBU0lDX1RFU1Q6XG4gMzU4Olx0XHRjYXNlIFBJTl9CQVNJQ19URVNUOlxuIDM1OTpcdFx0Y2FzZSBEVU1QX1VTRVJfUEFHRVNfVEVTVDpcbiAzNjA6XHRcdFx0YnJlYWs7XG4gMzYxOlx0XHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxuIDM2MjpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxuIDM2MzpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEOlxuIDM2NDpcdFx0XHRyZXR1cm4gcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoZmlsZXAsIGNtZCwgYXJnKTtcbiAzNjU6XHRcdGRlZmF1bHQ6XG4gMzY2Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDM2NzpcdFx0fVxuIDM2ODpcdFxuIDM2OTpcdFx0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNmd1cCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZ3VwKSkpXG4gMzcwOlx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDM3MTpcdFxuIDM3MjpcdFx0cmV0ID0gX19ndXBfdGVzdF9pb2N0bChjbWQsIFx1MDAyNmd1cCk7XG4gMzczOlx0XHRpZiAocmV0KVxuIDM3NDpcdFx0XHRyZXR1cm4gcmV0O1xuIDM3NTpcdFxuIDM3NjpcdFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFx1MDAyNmd1cCwgc2l6ZW9mKGd1cCkpKVxuIDM3NzpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzNzg6XHRcbiAzNzk6XHRcdHJldHVybiAwO1xuIDM4MDpcdH1cbiAzODE6XHRcbiAzODI6XHRzdGF0aWMgaW50IGd1cF90ZXN0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4gMzgzOlx0e1xuIDM4NDpcdFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XG4gMzg1Olx0XHRpbnQgcmV0O1xuIDM4NjpcdFxuIDM4NzpcdFx0ZGF0YSA9IGt6YWxsb2Nfb2JqKCpkYXRhKTtcbiAzODg6XHRcdGlmICghZGF0YSlcbiAzODk6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc2ODgKCQkJCQkJCW91dHB1dDogNDcKCQkJCQkJCXRob3VnaHRzOiAxODQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgR1VQIFRlc3QgSU9DVEwgUGF0Y2gqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBgZ3VwX3Rlc3QuY2AgcGF0Y2guIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB0cmFjZSB0aGUgZXhlY3V0aW9uIGZsb3cgYW5kIHBpbnBvaW50IHRoZSBwb3RlbnRpYWwgaXNzdWVzIHRoYXQgdGhpcyBmaXggYWRkcmVzc2VzLiBGaXJzdCwgSSYjMzk7bSBjaGVja2luZyB0aGUgY29uZGl0aW9ucyB0aGF0IGFyZSBub3cgYWRkZWQ6IGBndXAtJmd0O3NpemVgIG11c3QgYmUgbm9uLXplcm8sIGAhZ3VwLSZndDtucl9wYWdlc19wZXJfY2FsbGAgbXVzdCBiZSBub24temVybywgYW5kIGBndXAtJmd0O3NpemVgIG11c3QgYmUgcGFnZSBhbGlnbmVkLiBQcmV2aW91c2x5LCBvbmx5IGBndXAtJmd0O2FkZHJgIGFuZCBgZ3VwLSZndDtzaXplYCB3ZXJlIGNoZWNrZWQgdG8gYmUgd2l0aGluIHRoZSBgVUxPTkdfTUFYYCBsaW1pdC4KCk5vdyBJJiMzOTttIGZvY3VzaW5nIG9uIHRoZSBjb3JlIGxvb3AgbG9naWMuIFRoZSBvcmlnaW5hbCBjb2RlIGhhcyB0aGUgbG9vcCBgZm9yIChhZGRyID0gZ3VwLSZndDthZGRyOyBhZGRyICZsdDsgZW5kOyBhZGRyID0gbmV4dClgLiBJbnNpZGUgdGhlIGxvb3AsIGBucmAgc3RhcnRzIHdpdGggdGhlIGBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsYC4gVGhlIGNyaXRpY2FsIHBhcnQgc2VlbXMgdG8gYmUgaG93IGBuZXh0YCBhbmQgYG5yYCBhcmUgdXBkYXRlZCwgZXNwZWNpYWxseSBjb25zaWRlcmluZyB0aGUgaW50ZXJhY3Rpb24gd2l0aCBgZ2V0X3VzZXJfcGFnZXMoKWAuCgpJIGNhbiBzZWUgYSBwb3RlbnRpYWwgcHJvYmxlbSBpZiBgZ3VwLSZndDtzaXplYCBpc24mIzM5O3QgcGFnZS1hbGlnbmVkLiBGb3IgaW5zdGFuY2UsIGlmIGBndXAtJmd0O3NpemVgIGlzIDEsIGBucl9wYWdlc2AgYmVjb21lcyAwLiBUaGUgYGt2Y2FsbG9jYCBhbGxvY2F0ZXMgemVybyBwYWdlcywgYW5kIGBlbmRgIGJlY29tZXMgYGFkZHIgJiM0MzsgMWAuIElmIGBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsICZndDs9IDFgIHRoZW4gYG5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFYCwgaWYgYG5leHQgJmd0OyBlbmRgIHdlIHNldCBgbmV4dGAgdG8gYGVuZGAsIGFuZCBjYWxjdWxhdGUgYG5yID0gMGAuIFNvLCBpZiBgbnJgIHN0YXJ0cyBhdCAxLCBgZ2V0X3VzZXJfcGFnZXMoKWAgbWlnaHQgZ2V0IGNhbGxlZCB3aXRoIGBuciA9IDBgLiAgVGhpcyBzZWVtcyBiZW5pZ24sIGJ1dCBpdCBsb29rcyBsaWtlIHdlJiMzOTtyZSBwYXNzaW5nIGluIGFuIGludmFsaWQgYHBhZ2VzYCBhcnJheSwgYW5kIHBvdGVudGlhbGx5IGluIGxhdGVyIGl0ZXJhdGlvbnMgdGhpcyBtaWdodCByZXN1bHQgaW4gbWVtb3J5IGNvcnJ1cHRpb24gYnkgcGFzc2luZyB0aGUgd3JvbmcgcGFnZSBwb2ludGVyLgoKVGhlbiBJIGFtIHRoaW5raW5nLCB3aGF0IGlmIGBndXAtJmd0O3NpemUgPT0gMGA/IFRoZSBsb29wIHdvbiYjMzk7dCBydW4uIFRoYXQgc2VlbXMgZmluZS4gSG93ZXZlciwgd2hhdCBpZiBgZ3VwLSZndDtucl9wYWdlc19wZXJfY2FsbCA9PSAwYD8gSW5zaWRlIHRoZSBsb29wLCBpZiBgbnIgPT0gMGAsIHRoZSBjb21wYXJpc29uIGBuciAhPSBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsYCBiZWNvbWVzIGBmYWxzZWAuIEkgY2FuIHNlZSB0aGF0IGBuZXh0YCBzdGF5cyBgYWRkcmAsIGFuZCBgZ2V0X3VzZXJfcGFnZXNgIGNhbGxlZCB3aXRoIGBuciA9IDBgLiBBbmQgYnJlYWtzIHRoZSBsb29wLCB0aGF0IHNlZW1zIGZpbmUuCgpPa2F5LCBsZXQmIzM5O3MgdHJhY2Ugd2l0aCBhIHNsaWdodGx5IG1vcmUgY29tcGxleCBleGFtcGxlIG5vdy4gSWYgYGd1cC0mZ3Q7c2l6ZWAgaXMgNDA5NyAoYSBwYWdlIHBsdXMgMSBieXRlKSBhbmQgYGd1cC0mZ3Q7bnJfcGFnZXNfcGVyX2NhbGxgIGlzIDEsIHRoZSBjb2RlIGNhbGN1bGF0ZXMgYG5yX3BhZ2VzID0gMWAuICBgcGFnZXNgIGFsbG9jYXRlZCBjb3JyZWN0bHkgd2l0aCBzaXplIDEuIEluIHRoZSBmaXJzdCBpdGVyYXRpb24sIHdpdGggdGhlIG9yaWdpbmFsIGNvZGUsIGBuZXh0YCBiZWNvbWVzIGBhZGRyICYjNDM7IDQwOTZgLiBTaW5jZSBgbmV4dGAgaXMgbm90IGdyZWF0ZXIgdGhhbiBgZW5kYCwgYGdldF91c2VyX3BhZ2VzYCBnZXRzIGNhbGxlZCB3aXRoIGBuciA9IDFgLiBJbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgYGFkZHJgIGJlY29tZXMgYGFkZHIgJiM0MzsgNDA5NmAuIE5vdywgYGFkZHIgJmx0OyBlbmRgLCB0aGUgbG9vcCBjb250aW51ZXMuIGBuZXh0ID0gYWRkciAmIzQzOyA0MDk2YC4gSG93ZXZlciwgc2luY2UgYG5leHQgJmd0OyBlbmRgLCBgbmV4dCA9IGVuZGAsIGFuZCBgbnJgIGdldHMgc2V0IHRvIDAuIFNvLCBvbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgd2UgZW5kIHVwIGNhbGxpbmcgYGdldF91c2VyX3BhZ2VzKClgIHdpdGggYG5yID0gMGAgYnV0IGFjY2Vzc2luZyB0aGUgYHBhZ2VzYCBhcnJheSBhdCBpbmRleCBgMWAsIHNvIG91dCBvZiBib3VuZHMuCgpOb3cgdGhlIG5ldyBjb2RlIHdpdGggYG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7YC4gTGV0JiMzOTtzIHNlZSBob3cgdGhhdCBjaGFuZ2UgaGVscHMgdGhlIHByb2JsZW0uIE5vdywgaWYgdGhlIGBndXAtJmd0O3NpemVgIGlzIG5vdCBwYWdlIGFsaWduZWQgYW5kIHdlIG9ubHkgaGF2ZSBvbmUgcGFnZSAoZS5nLiA0MDk3KSwgdGhlIG5ldyBjb2RlIG1ha2VzIHN1cmUgdGhhdCBvbiB0aGUgbGFzdCBpdGVyYXRpb24sIGl0IHVzZXMgYSBwYXJ0aWFsIHBhZ2UuIFRoZSBtb3N0IGltcG9ydGFudCBkaWZmZXJlbmNlIG5vdyBpcyB0aGF0IHdlIGFyZSBsaW1pdGluZyBgbnJgIHRvIHRoZSBzaXplIG9mIHRoZSByZW1haW5pbmcgcGFnZXMuCgpUaGUgb3JpZ2luYWwgY29kZSYjMzk7cyBsb2dpYyBvZiB1cGRhdGluZyBgbnJgIGxvb2tzIHdyb25nLiBJZiB0aGUgcmVtYWluaW5nIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZSwgaXQgY291bGQgcmVzdWx0IGluIG91dC1vZi1ib3VuZHMgYWNjZXNzIHRvIHRoZSBgcGFnZXNgIGFycmF5LCBhbmQgcG90ZW50aWFsbHkgY2F1c2luZyBhIHdyaXRlIHRvIGluY29ycmVjdCBtZW1vcnkgYWRkcmVzc2VzLiBUaGUgbmV3IGxpbmUgYG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7YCBlbGVnYW50bHkgc29sdmVzIHRoaXMgYnkgZW5zdXJpbmcgYG5yYCBpcyB0aGUgbWluaW11bSBiZXR3ZWVuIHRoZSByZXF1ZXN0ZWQgcGFnZXMgcGVyIGNhbGwgYW5kIGhvdyBtYW55IHdob2xlIHBhZ2VzIGFyZSBsZWZ0LgoKSSBuZWVkIHRvIGNvbmZpcm0gYnkgc2VhcmNoaW5nIHRoZSBnaXQgbG9nIGZvciBhIHNpbWlsYXIgZml4LiBUaGlzIHBhdGNoIGNvcnJlY3RseSBoYW5kbGVzIGNhc2VzIHdoZXJlIGBndXAtJmd0O3NpemVgIGlzIG5vdCBwYWdlLWFsaWduZWQsIGBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsYCBpcyB6ZXJvLCBhbmQgcG90ZW50aWFsIGZvciBtZW1vcnkgZXJyb3JzIHJlbGF0ZWQgdG8gdW5kZXItYWxsb2NhdGlvbgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O21pbl90XFwodW5zaWduZWQgbG9uZywgbnIsIFxcKGVuZCAtIGFkZHJcXCkgLyBQQUdFX1NJWkVcXCkmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmM9MTA3PXN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuLS1cbm1tL2d1cF90ZXN0LmMtMTQyLVxubW0vZ3VwX3Rlc3QuYzoxNDM6XHRcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XG5tbS9ndXBfdGVzdC5jLTE0NC1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTUgMTI6MjU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTA3MDgKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxMDc0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgR1VQIFRlc3QgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QgdGhvdWdodCwgSSYjMzk7ZCB1c3VhbGx5IGNoZWNrIHRoZSBjb21taXQgaGlzdG9yeSB3aXRoIGBnaXQgbG9nYCwgYnV0IHdlIGRvbiYjMzk7dCBoYXZlIHRoYXQgdG9vbCBoYW5keS4gTm8gcHJvYmxlbS4gV2UmIzM5O2xsIGdvIHJpZ2h0IGludG8gdGhlIHBhdGNoIGl0c2VsZiBhbmQgc2VlIHdoYXQmIzM5O3MgY2hhbmdlZC4gVGhlIHByaW1hcnkgZm9jdXMgaGVyZSBpcyBvbiB1bmRlcnN0YW5kaW5nIHRoZSBpbnRlcmFjdGlvbiBvZiB0aGlzIGNvZGUgd2l0aCBLQVNBTiBhbmQgS01TQU4sIHNvIHdlIG5lZWQgdG8gYmUgbWV0aWN1bG91cy4KCkxvb2tpbmcgYXQgdGhlIGRpZmYsIGl0JiMzOTtzIGNsZWFyIHRoZSBwYXRjaCBwcmltYXJpbHkgZm9jdXNlcyBvbiBgbW0vZ3VwX3Rlc3QuY2AgYW5kIHNwZWNpZmljYWxseSB0aGUgYF9fZ3VwX3Rlc3RfaW9jdGxgIGZ1bmN0aW9uLiBUaGUgZmlyc3QgcGFydCBpbnRyb2R1Y2VzIHNvbWUgY3J1Y2lhbCB2YWxpZGF0aW9uIGNoZWNrcy4gV2UmIzM5O3JlIG5vdyB2YWxpZGF0aW5nIGBndXAtJmd0O3NpemVgLCBtYWtpbmcgc3VyZSBpdCYjMzk7cyBub24temVybywgdGhhdCBgZ3VwLSZndDtucl9wYWdlc19wZXJfY2FsbGAgaXMgYWxzbyBub24temVybyBhbmQgdGhhdCBgZ3VwLSZndDtzaXplYCBpcyBwYWdlLWFsaWduZWQuIFRoYXQmIzM5O3MgZ29vZCwgaXQgdGlnaHRlbnMgdXAgdGhlIGlucHV0IGFzc3VtcHRpb25zLgoKVGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBwYXRjaCBjbGVhbnMgdXAgYSBjYWxjdWxhdGlvbiBpbnZvbHZpbmcgYG5yYCBhbmQgYG5leHRgLCBzcGVjaWZpY2FsbHk6IEl0IGFkanVzdHMgdGhlIGNhbGN1bGF0aW9uIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhbGN1bGF0ZWQgYG5leHRgIHdvdWxkIGhhdmUgZXhjZWVkZWQgdGhlIGBlbmRgIHZhbHVlLCBpdCBjb3JyZWN0cyB0aGUgY2FsY3VsYXRpb24gbG9naWMsIGFuZCBpdCB3aWxsIG5vdyBlbnN1cmUgdGhhdCB0aGVzZSB2YWx1ZXMgYXJlIG1vcmUgcHJlY2lzZS4gVGhlIGltcHJvdmVkIGZvcm11bGEgbG9va3MgbW9yZSByb2J1c3QuIFdpdGggdGhlIHNpemUgbm93IGd1YXJhbnRlZWQgdG8gYmUgcGFnZS1hbGlnbmVkIGFuZCBub24temVybywgdGhpcyBzaW1wbGlmaWVkIGNhbGN1bGF0aW9uIGlzIG5vdyBhbHNvIGV4YWN0LCBtYWtpbmcgdGhlIGNvZGUgbW9yZSByZWxpYWJsZS4KCk5vdywgdGhlIGltcG9ydGFudCBwYXJ0OiBEb2VzIHRoaXMgdG91Y2ggdW5pbml0aWFsaXplZCBtZW1vcnk/IE5vLCBhbmQgZG9lcyBpdCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5IGFueSBzdHJ1Y3QgY29waWVkIHRvIHVzZXJzcGFjZSB0aGF0IGNvdWxkIGhhdmUgdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIGZpZWxkcz8gTGV0JiMzOTtzIGNoZWNrLiAgSSBuZWVkIHRvIGNoZWNrIGhvdyB0aGUgYGd1cGAgc3RydWN0IGlzIGhhbmRsZWQuICBBaGEhICBJIHNlZSB0aGUgYGNvcHlfZnJvbV91c2VyYCBhbmQgYGNvcHlfdG9fdXNlcmAgY2FsbHMgd2l0aGluIGBndXBfdGVzdF9pb2N0bGAuIFRoZSBjb2RlICpjb3BpZXMqIGBndXBgIGZyb20gdXNlcnNwYWNlLCB3aGljaCBtZWFucyBhbGwgYnl0ZXMgKGluY2x1ZGluZyBhbnkgcGFkZGluZykgYXJlIGluaXRpYWxpemVkIGZyb20gdXNlcnNwYWNlICpiZWZvcmUqIHRoZSBmdW5jdGlvbiBpcyBldmVuIGVudGVyZWQuICBUaGlzIGlzIGEgY3JpdGljYWwgcG9pbnQgZnJvbSBhIHNlY3VyaXR5IGFuZCBtZW1vcnkgc2FmZXR5IHBlcnNwZWN0aXZlLiBGdXJ0aGVybW9yZSwgaW4gdGhlIGhhcHB5IHBhdGggKHdoZW4gdGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIHdpdGggdGhlIGdvb2QgcmV0dXJuKSwgdGhlIHJlc3VsdHMgYXJlIGNvcGllZCBiYWNrLiBUaGUga2V5IGlzLCB0aGF0IGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgYW4gZXJyb3IsIHRoZW4gdGhlcmUgaXMgbm8gYGNvcHlfdG9fdXNlcmAgY2FsbCwgd2hpY2ggaXMgYWxzbyBpbXBvcnRhbnQuIFRoZSBhZGRlZCBpbnB1dCB2YWxpZGF0aW9ucyBlYXJsaWVyIHNob3VsZCBwcmV2ZW50IHRoZSBzaXR1YXRpb24uIFRoaXMgaGVscHMgZW5zdXJlIHRoYXQgdGhlIGBndXBgIHN0cnVjdCBpcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgYW5kIGFueSBjaGFuZ2VzIG1hZGUgZHVyaW5nIHRoZSBgX19ndXBfdGVzdF9pb2N0bGAgZXhlY3V0aW9uIGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHVzZXItc3BhY2UuCgpMZXQmIzM5O3MgZG8gYSBxdWljayBzY2FuIG9mIGFsbCBhY2Nlc3NlcyB0byBgZ3VwYCBpbiB0aGUgZmlsZSBqdXN0IHRvIGJlIGV4dHJhIHN1cmUsIGJ1dCBJJiMzOTttIGZlZWxpbmcgY29uZmlkZW50IGFib3V0IHRoaXMgcGF0Y2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2d1cC1cdTAwM2UmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmM9NzY9c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuLS1cbm1tL2d1cF90ZXN0LmMtODYtXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSYjNDM7JiM0MzspIHtcbm1tL2d1cF90ZXN0LmM6ODc6XHRcdGlmIChndXAtXHUwMDNld2hpY2hfcGFnZXNbaV0gXHUwMDNlIG5yX3BhZ2VzKSB7XG5tbS9ndXBfdGVzdC5jLTg4LVx0XHRcdHByX3dhcm4oXCYjMzQ7WkVST0lORyBkdWUgdG8gb3V0IG9mIHJhbmdlOiAud2hpY2hfcGFnZXNbJXVdOiAldVxcblwmIzM0Oyxcbm1tL2d1cF90ZXN0LmM6ODk6XHRcdFx0XHRpLCBndXAtXHUwMDNld2hpY2hfcGFnZXNbaV0pO1xubW0vZ3VwX3Rlc3QuYzo5MDpcdFx0XHRndXAtXHUwMDNld2hpY2hfcGFnZXNbaV0gPSAwO1xubW0vZ3VwX3Rlc3QuYy05MS1cdFx0fVxuLS1cbm1tL2d1cF90ZXN0LmMtOTQtXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSYjNDM7JiM0MzspIHtcbm1tL2d1cF90ZXN0LmM6OTU6XHRcdGluZGV4X3RvX2R1bXAgPSBndXAtXHUwMDNld2hpY2hfcGFnZXNbaV07XG5tbS9ndXBfdGVzdC5jLTk2LVxuLS1cbm1tL2d1cF90ZXN0LmMtOTktXHRcdFx0cHJfaW5mbyhcJiMzNDstLS0tIHBhZ2UgIyV1LCBzdGFydGluZyBmcm9tIHVzZXIgdmlydCBhZGRyOiAweCVsbHhcXG5cJiMzNDssXG5tbS9ndXBfdGVzdC5jOjEwMDpcdFx0XHRcdGluZGV4X3RvX2R1bXAsIGd1cC1cdTAwM2VhZGRyKTtcbm1tL2d1cF90ZXN0LmMtMTAxLVx0XHRcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcbi0tXG5tbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbi0tXG5tbS9ndXBfdGVzdC5jLTExOC1cbm1tL2d1cF90ZXN0LmM6MTE5Olx0aWYgKGd1cC1cdTAwM2VhZGRyIFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVx1MDAzZXNpemUgXHUwMDNlIFVMT05HX01BWCB8fCAhZ3VwLVx1MDAzZXNpemUgfHxcbm1tL2d1cF90ZXN0LmM6MTIwOlx0ICAgICFndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgfHwgIVBBR0VfQUxJR05FRChndXAtXHUwMDNlc2l6ZSkpXG5tbS9ndXBfdGVzdC5jLTEyMS1cdFx0cmV0dXJuIC1FSU5WQUw7XG5tbS9ndXBfdGVzdC5jOjEyMjpcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG5tbS9ndXBfdGVzdC5jOjEyMzpcdFx0XHQgICAgICAgKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZXNpemUsIFx1MDAyNmVuZCkpXG5tbS9ndXBfdGVzdC5jLTEyNC1cdFx0cmV0dXJuIC1FSU5WQUw7XG5tbS9ndXBfdGVzdC5jLTEyNS1cbm1tL2d1cF90ZXN0LmM6MTI2Olx0bnJfcGFnZXMgPSBndXAtXHUwMDNlc2l6ZSAvIFBBR0VfU0laRTtcbm1tL2d1cF90ZXN0LmMtMTI3LVx0cGFnZXMgPSBrdmNhbGxvYyhucl9wYWdlcywgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpO1xuLS1cbm1tL2d1cF90ZXN0LmMtMTM2LVx0aSA9IDA7XG5tbS9ndXBfdGVzdC5jOjEzNzpcdG5yID0gZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsO1xubW0vZ3VwX3Rlc3QuYy0xMzgtXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XG5tbS9ndXBfdGVzdC5jOjEzOTpcdGZvciAoYWRkciA9IGd1cC1cdTAwM2VhZGRyOyBhZGRyIFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XG5tbS9ndXBfdGVzdC5jOjE0MDpcdFx0aWYgKG5yICE9IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbClcbm1tL2d1cF90ZXN0LmMtMTQxLVx0XHRcdGJyZWFrO1xuLS1cbm1tL2d1cF90ZXN0LmMtMTQ4LVx0XHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcbm1tL2d1cF90ZXN0LmM6MTQ5Olx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbm1tL2d1cF90ZXN0LmMtMTUwLVx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbi0tXG5tbS9ndXBfdGVzdC5jLTE1Mi1cdFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcbm1tL2d1cF90ZXN0LmM6MTUzOlx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICYjNDM7IGkpO1xubW0vZ3VwX3Rlc3QuYy0xNTQtXHRcdFx0YnJlYWs7XG5tbS9ndXBfdGVzdC5jLTE1NS1cdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG5tbS9ndXBfdGVzdC5jOjE1NjpcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG5tbS9ndXBfdGVzdC5jLTE1Ny1cdFx0XHRcdFx0XHQgcGFnZXMgJiM0MzsgaSk7XG4tLVxubW0vZ3VwX3Rlc3QuYy0xNTktXHRcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XG5tbS9ndXBfdGVzdC5jOjE2MDpcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbm1tL2d1cF90ZXN0LmMtMTYxLVx0XHRcdGJyZWFrO1xuLS1cbm1tL2d1cF90ZXN0LmMtMTYzLVx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXG5tbS9ndXBfdGVzdC5jOjE2NDpcdFx0XHRcdFx0ICAgIGd1cC1cdTAwM2VndXBfZmxhZ3MgfCBGT0xMX0xPTkdURVJNLFxubW0vZ3VwX3Rlc3QuYy0xNjUtXHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbi0tXG5tbS9ndXBfdGVzdC5jLTE2Ny1cdFx0Y2FzZSBEVU1QX1VTRVJfUEFHRVNfVEVTVDpcbm1tL2d1cF90ZXN0LmM6MTY4Olx0XHRcdGlmIChndXAtXHUwMDNldGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXG5tbS9ndXBfdGVzdC5jOjE2OTpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG5tbS9ndXBfdGVzdC5jLTE3MC1cdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG5tbS9ndXBfdGVzdC5jLTE3MS1cdFx0XHRlbHNlXG5tbS9ndXBfdGVzdC5jOjE3MjpcdFx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG5tbS9ndXBfdGVzdC5jLTE3My1cdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4tLVxubW0vZ3VwX3Rlc3QuYy0xODgtXG5tbS9ndXBfdGVzdC5jOjE4OTpcdGd1cC1cdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcbm1tL2d1cF90ZXN0LmM6MTkwOlx0Z3VwLVx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcbm1tL2d1cF90ZXN0LmMtMTkxLVxuLS1cbm1tL2d1cF90ZXN0LmMtMjAyLVxubW0vZ3VwX3Rlc3QuYzoyMDM6XHRwdXRfYmFja19wYWdlcyhjbWQsIHBhZ2VzLCBucl9wYWdlcywgZ3VwLVx1MDAzZXRlc3RfZmxhZ3MpO1xubW0vZ3VwX3Rlc3QuYy0yMDQtXG5tbS9ndXBfdGVzdC5jLTIwNS1cdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XG5tbS9ndXBfdGVzdC5jOjIwNjpcdGd1cC1cdTAwM2VwdXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcbm1tL2d1cF90ZXN0LmMtMjA3LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xNSAxMjoyNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDA5MwoJCQkJCQkJb3V0cHV0OiAyNDMKCQkJCQkJCXRob3VnaHRzOiAxNTEwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIFJlYXNvbmluZzogTmVlZHNLTVNBTiA9IGZhbHNlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoZSBwYXRjaCBpbiBxdWVzdGlvbiBzaWduaWZpY2FudGx5IHN0cmVuZ3RoZW5zIHRoZSBgZ3VwX3Rlc3RgIGlvY3RsIGhhbmRsZXIuIE15IGFzc2Vzc21lbnQgaXMgdGhhdCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgIGhlcmUuCgpUaGUgcGF0Y2ggaXRzZWxmIGZvY3VzZXMgb24gaW5wdXQgdmFsaWRhdGlvbiBhbmQgbG9vcCBjYWxjdWxhdGlvbiBjb3JyZWN0aW9ucy4gU3BlY2lmaWNhbGx5OiBpdCBhZGRzIGNoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgaW5wdXQgYGd1cC0mZ3Q7c2l6ZWAgYW5kIGBndXAtJmd0O25yX3BhZ2VzX3Blcl9jYWxsYCBhcmUgdmFsaWQgdmFsdWVzIChwb3NpdGl2ZSwgbm90IGV4Y2VlZGluZyBgVUxPTkdfTUFYYCwgYW5kIGBndXAtJmd0O3NpemVgIGlzIHBhZ2UtYWxpZ25lZCkuIEl0IGFsc28gbW9kaWZpZXMgdGhlIGxvb3AgY2FsY3VsYXRpb24gdG8gdXNlIGBtaW5fdGAgd2hpY2ggc2ltcGxpZmllcyB0aGUgY2FsY3VsYXRpb25zLCBwcmV2ZW50aW5nIG91dC1vZi1ib3VuZHMgYWNjZXNzLgoKQmVmb3JlIHRoZSBwYXRjaCwgYSB6ZXJvIG9yIHVuYWxpZ25lZCBgZ3VwLSZndDtzaXplYCBvciBhIHplcm8gYGd1cC0mZ3Q7bnJfcGFnZXNfcGVyX2NhbGxgIHdvdWxkIGxlYWQgdG8gZWl0aGVyIGluZmluaXRlIGxvb3BzIChiZWNhdXNlIHRoZSBsb29wIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiB3b3VsZCBuZXZlciBiZSBtZXQpIG9yIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIGluIHRoZSBgcGFnZXNgIGFycmF5IGR1ZSB0byBpbmNvcnJlY3QgbG9vcCBpdGVyYXRpb24uCgpOb3csIGxldCYjMzk7cyBleGFtaW5lIHRoZSBLTVNBTiBjcml0ZXJpYToKCjEuICAqKktlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXJzcGFjZToqKiBOb3BlLiBUaGUgaW9jdGwgY29waWVzICpmcm9tKiB1c2Vyc3BhY2UgKnRvKiB0aGUga2VybmVsLCBpbml0aWFsaXppbmcgdGhlIGBndXBgIHN0cnVjdC4gVGhlcmUmIzM5O3Mgbm8gZGF0YSBiZWluZyBzZW50ICp0byogdXNlcnNwYWNlIHRoYXQgY291bGQgaGF2ZSB1bmluaXRpYWxpemVkIG1lbW9yeS4KMi4gICoqQ29uZGl0aW9uYWwgbG9naWMgb24gdW5pbml0aWFsaXplZCBkYXRhOioqIE5vLiBBbGwgdmFyaWFibGVzLCBpbmNsdWRpbmcgdGhlIGBndXBgIHN0cnVjdCwgYW5kIGxvY2FsIHZhcmlhYmxlcyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGFyZSBpbml0aWFsaXplZC4gYGt2Y2FsbG9jYCB6ZXJvLWluaXRpYWxpemVzIHRoZSBgcGFnZXNgIGFycmF5LCBhbmQgYGNvcHlfZnJvbV91c2VyYCBwb3B1bGF0ZXMgdGhlIHVzZXItc3VwcGxpZWQgdmFsdWVzLiBUaGUgbG9naWMgbm93ICpwcmV2ZW50cyogaXNzdWVzLCByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyB0aGVtLgozLiAgKipDb21wbGV4IGRhdGEgc3RydWN0dXJlIGFsbG9jYXRpb24vaW5pdGlhbGl6YXRpb246KiogIGBrdmNhbGxvY2AgaXMgdXNlZCB0byBhbGxvY2F0ZSB0aGUgYHBhZ2VzYCBhcnJheSB3aGljaCBpcyB6ZXJvLWluaXRpYWxpemVkIGFuZCB0aGVuIHBvcHVsYXRlZCwgYXMgd2VsbCBhcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYGd1cGAgZnJvbSB0aGUgdXNlcnNwYWNlIGJ1ZmZlci4gTm8gdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIHJlYWQgaW4gcmVhY2hhYmxlIGNvZGUuCjQuICAqKkJvdW5kcyBjaGVja3MgYWZmZWN0aW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXM6KiogVGhlIHBhdGNoIGZpeGVzIGJvdW5kcyBjaGVja3MgaW4gdGhlIGxvb3AgY2FsY3VsYXRpb24gdG8gcHJldmVudCBhY2Nlc3NpbmcgbWVtb3J5IG91dHNpZGUgb2YgdGhlIGFsbG9jYXRlZCBgcGFnZXNgIGFycmF5LCBzbyBpdCByZWR1Y2VzLCByYXRoZXIgdGhhbiBpbnRyb2R1Y2luZywgcmlzayBvZiB1bmluaXRpYWxpemVkIGFjY2Vzcy4KClRoZSBtYWluIHJpc2tzIGFkZHJlc3NlZCBieSB0aGUgcGF0Y2ggYXJlIGFjdHVhbGx5IG91dC1vZi1ib3VuZHMgYXJyYXkgYWNjZXNzIChLQVNBTikgYW5kIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wcyBvciBzb2Z0bG9ja3VwcyAoZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIG1lY2hhbmlzbXMpLiBUaGVzZSBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5IGV4aXN0aW5nIGtlcm5lbCBkZWJ1Z2dlcnMuIFRoZXJlJiMzOTtzIG5vIGV2aWRlbmNlIG9mIG5ldyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIFRodXMsIGBOZWVkc0tNU0FOID0gZmFsc2VgLiBJJiMzOTttIGNvbmZpZGVudCBpbiB0aGlzIGFzc2Vzc21lbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzE1IDEyOjI1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1tL2d1cF90ZXN0LmMgdG8gYWRkIGlucHV0IHBhcmFtZXRlciB2YWxpZGF0aW9uIChjaGVja2luZyB0aGF0IGd1cC1cdTAwM2VzaXplIGlzIG5vbi16ZXJvIGFuZCBQQUdFX0FMSUdORUQsIGFuZCB0aGF0IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcblxuVGhlIGlzc3VlcyBhZGRyZXNzZWQgYnkgdGhpcyBwYXRjaCBhcmUgaW5maW5pdGUgbG9vcHMgKHdoZW4gbnJfcGFnZXNfcGVyX2NhbGwgaXMgMCkgYW5kIG91dC1vZi1ib3VuZHMgYnVmZmVyIGluZGV4aW5nIG9uIHRoZSBgcGFnZXNgIGFycmF5ICh3aGVuIGd1cC1cdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXG5cbkFsbCBidWZmZXJzIGludm9sdmVkICh0aGUgc3RhY2stYWxsb2NhdGVkIHN0cnVjdCBndXBfdGVzdCBhbmQgdGhlIGhlYXAtYWxsb2NhdGVkIHBhZ2VzIGFycmF5KSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGNvcHlfZnJvbV91c2VyKCkgYW5kIGt2Y2FsbG9jKCkuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgc3RydWN0IHBhZGRpbmcgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGlzIGNoYW5nZS4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1tL2d1cF90ZXN0LmMgdG8gYWRkIGlucHV0IHBhcmFtZXRlciB2YWxpZGF0aW9uIChjaGVja2luZyB0aGF0IGd1cC1cdTAwM2VzaXplIGlzIG5vbi16ZXJvIGFuZCBQQUdFX0FMSUdORUQsIGFuZCB0aGF0IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcblxuVGhlIGlzc3VlcyBhZGRyZXNzZWQgYnkgdGhpcyBwYXRjaCBhcmUgaW5maW5pdGUgbG9vcHMgKHdoZW4gbnJfcGFnZXNfcGVyX2NhbGwgaXMgMCkgYW5kIG91dC1vZi1ib3VuZHMgYnVmZmVyIGluZGV4aW5nIG9uIHRoZSBgcGFnZXNgIGFycmF5ICh3aGVuIGd1cC1cdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXG5cbkFsbCBidWZmZXJzIGludm9sdmVkICh0aGUgc3RhY2stYWxsb2NhdGVkIHN0cnVjdCBndXBfdGVzdCBhbmQgdGhlIGhlYXAtYWxsb2NhdGVkIHBhZ2VzIGFycmF5KSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGNvcHlfZnJvbV91c2VyKCkgYW5kIGt2Y2FsbG9jKCkuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgc3RydWN0IHBhZGRpbmcgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGlzIGNoYW5nZS4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjE6MzkuNzU3ODI4ODA5WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUwODc0OTE0NzYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkdVUF9URVNUXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fZ3VwX3Rlc3RfaW9jdGxcIixcbiAgICBcImd1cF90ZXN0X2lvY3RsXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBtbS9ndXBfdGVzdC5jIHRvIGFkZCBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAoY2hlY2tpbmcgdGhhdCBndXAtXFx1MDAzZXNpemUgaXMgbm9uLXplcm8gYW5kIFBBR0VfQUxJR05FRCwgYW5kIHRoYXQgZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcXG5cXG5UaGUgaXNzdWVzIGFkZHJlc3NlZCBieSB0aGlzIHBhdGNoIGFyZSBpbmZpbml0ZSBsb29wcyAod2hlbiBucl9wYWdlc19wZXJfY2FsbCBpcyAwKSBhbmQgb3V0LW9mLWJvdW5kcyBidWZmZXIgaW5kZXhpbmcgb24gdGhlIGBwYWdlc2AgYXJyYXkgKHdoZW4gZ3VwLVxcdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXFxuXFxuQWxsIGJ1ZmZlcnMgaW52b2x2ZWQgKHRoZSBzdGFjay1hbGxvY2F0ZWQgc3RydWN0IGd1cF90ZXN0IGFuZCB0aGUgaGVhcC1hbGxvY2F0ZWQgcGFnZXMgYXJyYXkpIGFyZSBmdWxseSBpbml0aWFsaXplZCB2aWEgY29weV9mcm9tX3VzZXIoKSBhbmQga3ZjYWxsb2MoKS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBzdHJ1Y3QgcGFkZGluZyBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoaXMgY2hhbmdlLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGlucHV0IHZhbGlkYXRpb24gY2hlY2tzIGFuZCBpdGVyYXRpb24gbG9naWMgZm9yIHBhZ2UgcGlubmluZyBhbmQgZ2V0X3VzZXJfcGFnZXMgbG9vcHMgaW4gX19ndXBfdGVzdF9pb2N0bCgpIChtbS9ndXBfdGVzdC5jKS4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW9jdGxzIG9uIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIGJvdW5kYXJ5IGNvbmRpdGlvbiBoYW5kbGluZyBhbmQgcG90ZW50aWFsIHJlZ3Jlc3Npb25zIGluIHBhZ2UgcmFuZ2UgaGFuZGxpbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIxOjM5Ljc1NzgzMTg3OVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDE2ODUzOTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNGJiNWZkMjQzY2NkNmVkNTA2YjNkM2ZjNjkzOTJlOTdhZjcxMWUzYlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIFNlcCAxNSAxMjoyMTozOSAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xcbmluZGV4IDE4NWJhM2JiOGVkMTAuLmJhNzRiZjNmNDEwNDggMTAwNjQ0XFxuLS0tIGEvbW0vZ3VwX3Rlc3QuY1xcbisrKyBiL21tL2d1cF90ZXN0LmNcXG5AQCAtMTE2LDcgKzExNiw4IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxcbiBcXHRib29sIG5lZWRzX21tYXBfbG9jayA9XFxuIFxcdFxcdGNtZCAhPSBHVVBfRkFTVF9CRU5DSE1BUksgXFx1MDAyNlxcdTAwMjYgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSztcXG4gXFxuLVxcdGlmIChndXAtXFx1MDAzZWFkZHIgXFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVxcdTAwM2VzaXplIFxcdTAwM2UgVUxPTkdfTUFYKVxcbitcXHRpZiAoZ3VwLVxcdTAwM2VhZGRyIFxcdTAwM2UgVUxPTkdfTUFYIHx8IGd1cC1cXHUwMDNlc2l6ZSBcXHUwMDNlIFVMT05HX01BWCB8fCAhZ3VwLVxcdTAwM2VzaXplIHx8XFxuK1xcdCAgICAhZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbCB8fCAhUEFHRV9BTElHTkVEKGd1cC1cXHUwMDNlc2l6ZSkpXFxuIFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KCh1bnNpZ25lZCBsb25nKWd1cC1cXHUwMDNlYWRkcixcXG4gXFx0XFx0XFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cXHUwMDNlc2l6ZSwgXFx1MDAyNmVuZCkpXFxuQEAgLTEzOSwxMSArMTQwLDkgQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXFxuIFxcdFxcdGlmIChuciAhPSBndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFxuK1xcdFxcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XFxuK1xcbiBcXHRcXHRuZXh0ID0gYWRkciArIG5yICogUEFHRV9TSVpFO1xcbi1cXHRcXHRpZiAobmV4dCBcXHUwMDNlIGVuZCkge1xcbi1cXHRcXHRcXHRuZXh0ID0gZW5kO1xcbi1cXHRcXHRcXHRuciA9IChuZXh0IC0gYWRkcikgLyBQQUdFX1NJWkU7XFxuLVxcdFxcdH1cXG4gXFxuIFxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIFxcdFxcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyMTo0MC4xNzU0MzM1OFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTQxMTM2NzE0ODA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkdVUF9URVNUXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fZ3VwX3Rlc3RfaW9jdGxcIixcbiAgICBcImd1cF90ZXN0X2lvY3RsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgaW5wdXQgdmFsaWRhdGlvbiBjaGVja3MgYW5kIGl0ZXJhdGlvbiBsb2dpYyBmb3IgcGFnZSBwaW5uaW5nIGFuZCBnZXRfdXNlcl9wYWdlcyBsb29wcyBpbiBfX2d1cF90ZXN0X2lvY3RsKCkgKG1tL2d1cF90ZXN0LmMpLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBpb2N0bHMgb24gL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgYm91bmRhcnkgY29uZGl0aW9uIGhhbmRsaW5nIGFuZCBwb3RlbnRpYWwgcmVncmVzc2lvbnMgaW4gcGFnZSByYW5nZSBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA0YmI1ZmQyNDNjY2Q2ZWQ1MDZiM2QzZmM2OTM5MmU5N2FmNzExZTNiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBTZXAgMTUgMTI6MjE6MzkgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xuaW5kZXggMTg1YmEzYmI4ZWQxMC4uYmE3NGJmM2Y0MTA0OCAxMDA2NDRcbi0tLSBhL21tL2d1cF90ZXN0LmNcbisrKyBiL21tL2d1cF90ZXN0LmNcbkBAIC0xMTYsNyArMTE2LDggQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXG4gXHRib29sIG5lZWRzX21tYXBfbG9jayA9XG4gXHRcdGNtZCAhPSBHVVBfRkFTVF9CRU5DSE1BUksgXHUwMDI2XHUwMDI2IGNtZCAhPSBQSU5fRkFTVF9CRU5DSE1BUks7XG4gXG4tXHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYKVxuK1x0aWYgKGd1cC1cdTAwM2VhZGRyIFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVx1MDAzZXNpemUgXHUwMDNlIFVMT05HX01BWCB8fCAhZ3VwLVx1MDAzZXNpemUgfHxcbitcdCAgICAhZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsIHx8ICFQQUdFX0FMSUdORUQoZ3VwLVx1MDAzZXNpemUpKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG4gXHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxuQEAgLTEzOSwxMSArMTQwLDkgQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXG4gXHRcdGlmIChuciAhPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwpXG4gXHRcdFx0YnJlYWs7XG4gXG4rXHRcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XG4rXG4gXHRcdG5leHQgPSBhZGRyICsgbnIgKiBQQUdFX1NJWkU7XG4tXHRcdGlmIChuZXh0IFx1MDAzZSBlbmQpIHtcbi1cdFx0XHRuZXh0ID0gZW5kO1xuLVx0XHRcdG5yID0gKG5leHQgLSBhZGRyKSAvIFBBR0VfU0laRTtcbi1cdFx0fVxuIFxuIFx0XHRzd2l0Y2ggKGNtZCkge1xuIFx0XHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIxOjQwLjE3NTQzNTQzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzI0NzI3ODQ4MTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBLZXJuZWwgUGF0Y2g6IG1tL2d1cF90ZXN0LmMqKlxuXG5BbHJpZ2h0LCBJIHNlZSB3aGF0J3MgYmVpbmcgYXNrZWQgaGVyZS4gV2UncmUgbG9va2luZyBhdCBldmFsdWF0aW5nIGEga2VybmVsIHBhdGNoLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBhbWQ2NCBhcmNoaXRlY3R1cmUuIE15IGZpcnN0IHN0ZXAgaXMgdG8gZGl2ZSByaWdodCBpbiB3aXRoIHRoZSBlc3RhYmxpc2hlZCB0b29saW5nIOKAkyBsZXQncyBnZXQgdGhlIGNvbW1pdCBkZXRhaWxzIGFuZCB0aGUgc3Vycm91bmRpbmcgY29udGV4dC4gSXQgc2VlbXMgdGhlIGZpbGUgb2YgaW50ZXJlc3QgaXMgYG1tL2d1cF90ZXN0LmNgLiBHaXZlbiB0aGUgdGFzaywgYW5kIHRoZSBmb2N1cyBvbiBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQsIEknbGwgYmUgaG9uaW5nIGluIG9uIHRoZSBjb2RlIGFyb3VuZCBsaW5lIDExNi4gVGhhdCBhcmVhIHdpbGwgcHJvdmlkZSBhIHNvbGlkIHN0YXJ0aW5nIHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBpbnRlbnQgYW5kIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBwcm9wb3NlZCBjaGFuZ2VzIHdpdGhpbiB0aGUgYGd1cF90ZXN0LmNgIG1vZHVsZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBwYXRjaCB3aXRoaW4gaXRzIGJyb2FkZXIgY29udGV4dCB0byBwcm9wZXJseSBldmFsdWF0ZSBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzA4NCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY5LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6MTIuNjQ4MjIzMDU5WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTIwMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMDA6XFx0XFx0XFx0XFx0XFx0aW5kZXhfdG9fZHVtcCwgZ3VwLVxcdTAwM2VhZGRyKTtcXG4gMTAxOlxcdFxcdFxcdFxcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcXG4gMTAyOlxcdFxcdFxcdFxcdFxcdCAgXFxcImd1cF90ZXN0OiBkdW1wX3BhZ2VzKCkgdGVzdFxcXCIpO1xcbiAxMDM6XFx0XFx0XFx0fVxcbiAxMDQ6XFx0XFx0fVxcbiAxMDU6XFx0fVxcbiAxMDY6XFx0XFxuIDEwNzpcXHRzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG4gMTA4OlxcdFxcdFxcdHN0cnVjdCBndXBfdGVzdCAqZ3VwKVxcbiAxMDk6XFx0e1xcbiAxMTA6XFx0XFx0a3RpbWVfdCBzdGFydF90aW1lLCBlbmRfdGltZTtcXG4gMTExOlxcdFxcdHVuc2lnbmVkIGxvbmcgaSwgbnJfcGFnZXMsIGFkZHIsIG5leHQ7XFxuIDExMjpcXHRcXHRsb25nIG5yO1xcbiAxMTM6XFx0XFx0c3RydWN0IHBhZ2UgKipwYWdlcztcXG4gMTE0OlxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kO1xcbiAxMTU6XFx0XFx0aW50IHJldCA9IDA7XFxuIDExNjpcXHRcXHRib29sIG5lZWRzX21tYXBfbG9jayA9XFxuIDExNzpcXHRcXHRcXHRjbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLIFxcdTAwMjZcXHUwMDI2IGNtZCAhPSBQSU5fRkFTVF9CRU5DSE1BUks7XFxuIDExODpcXHRcXG4gMTE5OlxcdFxcdGlmIChndXAtXFx1MDAzZWFkZHIgXFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVxcdTAwM2VzaXplIFxcdTAwM2UgVUxPTkdfTUFYIHx8ICFndXAtXFx1MDAzZXNpemUgfHxcXG4gMTIwOlxcdFxcdCAgICAhZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbCB8fCAhUEFHRV9BTElHTkVEKGd1cC1cXHUwMDNlc2l6ZSkpXFxuIDEyMTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMTIyOlxcdFxcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVxcdTAwM2VhZGRyLFxcbiAxMjM6XFx0XFx0XFx0XFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cXHUwMDNlc2l6ZSwgXFx1MDAyNmVuZCkpXFxuIDEyNDpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMTI1OlxcdFxcbiAxMjY6XFx0XFx0bnJfcGFnZXMgPSBndXAtXFx1MDAzZXNpemUgLyBQQUdFX1NJWkU7XFxuIDEyNzpcXHRcXHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XFxuIDEyODpcXHRcXHRpZiAoIXBhZ2VzKVxcbiAxMjk6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIDEzMDpcXHRcXG4gMTMxOlxcdFxcdGlmIChuZWVkc19tbWFwX2xvY2sgXFx1MDAyNlxcdTAwMjYgbW1hcF9yZWFkX2xvY2tfa2lsbGFibGUoY3VycmVudC1cXHUwMDNlbW0pKSB7XFxuIDEzMjpcXHRcXHRcXHRyZXQgPSAtRUlOVFI7XFxuIDEzMzpcXHRcXHRcXHRnb3RvIGZyZWVfcGFnZXM7XFxuIDEzNDpcXHRcXHR9XFxuIDEzNTpcXHRcXG4gMTM2OlxcdFxcdGkgPSAwO1xcbiAxMzc6XFx0XFx0bnIgPSBndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsO1xcbiAxMzg6XFx0XFx0c3RhcnRfdGltZSA9IGt0aW1lX2dldCgpO1xcbiAxMzk6XFx0XFx0Zm9yIChhZGRyID0gZ3VwLVxcdTAwM2VhZGRyOyBhZGRyIFxcdTAwM2MgZW5kOyBhZGRyID0gbmV4dCkge1xcbiAxNDA6XFx0XFx0XFx0aWYgKG5yICE9IGd1cC1cXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwpXFxuIDE0MTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTQyOlxcdFxcbiAxNDM6XFx0XFx0XFx0bnIgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBuciwgKGVuZCAtIGFkZHIpIC8gUEFHRV9TSVpFKTtcXG4gMTQ0OlxcdFxcbiAxNDU6XFx0XFx0XFx0bmV4dCA9IGFkZHIgKyBuciAqIFBBR0VfU0laRTtcXG4gMTQ2OlxcdFxcbiAxNDc6XFx0XFx0XFx0c3dpdGNoIChjbWQpIHtcXG4gMTQ4OlxcdFxcdFxcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxcbiAxNDk6XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTUwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCBwYWdlcyArIGkpO1xcbiAxNTE6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1MjpcXHRcXHRcXHRjYXNlIEdVUF9CQVNJQ19URVNUOlxcbiAxNTM6XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxuIDE1NDpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTU1OlxcdFxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAxNTY6XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTU3OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCBwYWdlcyArIGkpO1xcbiAxNTg6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1OTpcXHRcXHRcXHRjYXNlIFBJTl9CQVNJQ19URVNUOlxcbiAxNjA6XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxuIDE2MTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTYyOlxcdFxcdFxcdGNhc2UgUElOX0xPTkdURVJNX0JFTkNITUFSSzpcXG4gMTYzOlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXFxuIDE2NDpcXHRcXHRcXHRcXHRcXHRcXHQgICAgZ3VwLVxcdTAwM2VndXBfZmxhZ3MgfCBGT0xMX0xPTkdURVJNLFxcbiAxNjU6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE2NjpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTY3OlxcdFxcdFxcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XFxuIDE2ODpcXHRcXHRcXHRcXHRpZiAoZ3VwLVxcdTAwM2V0ZXN0X2ZsYWdzIFxcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXFxuIDE2OTpcXHRcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTcwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNzE6XFx0XFx0XFx0XFx0ZWxzZVxcbiAxNzI6XFx0XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE3MzpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4gMTc0OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNzU6XFx0XFx0XFx0ZGVmYXVsdDpcXG4gMTc2OlxcdFxcdFxcdFxcdHJldCA9IC1FSU5WQUw7XFxuIDE3NzpcXHRcXHRcXHRcXHRnb3RvIHVubG9jaztcXG4gMTc4OlxcdFxcdFxcdH1cXG4gMTc5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyMjoxMi42NDgzMTczMDlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyODI5OTA3OTA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGd1cF90ZXN0KipcblxuT2theSwgc28gYGd1cF90ZXN0YC4uLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoaXMuIEZpcnN0LCBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IHdoYXQgdGhpcyB0aGluZyAqaXMqLiBXaGF0J3MgaXRzIHB1cnBvc2U/IEhvdyBpcyBpdCBpbXBsZW1lbnRlZD8gSSdsbCBwcm9iYWJseSBzdGFydCB3aXRoIHRoZSBzb3VyY2UgY29kZSwgYnV0IEkgYWxzbyBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHB1YmxpYyBpbnRlcmZhY2UuIFdoZXJlJ3MgaXQgZXhwb3NlZCB0byBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsPyBXaGF0IGZ1bmN0aW9ucyBvciBzdHJ1Y3R1cmVzIGFyZSBhdmFpbGFibGUgZm9yIG90aGVyIG1vZHVsZXMgb3Igc3Vic3lzdGVtcyB0byBpbnRlcmFjdCB3aXRoP1xuXG5UaGVuLCB0aGUga2V5IGlzIGdvaW5nIHRvIGJlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuIFdoYXQgS2NvbmZpZyBzeW1ib2xzIGNvbnRyb2wgdGhlIGluY2x1c2lvbiBvciBiZWhhdmlvciBvZiBgZ3VwX3Rlc3RgPyBJcyBpdCBtb2R1bGFyLCBvciBidWlsdC1pbj8gQXJlIHRoZXJlIGFueSBkZXBlbmRlbmNpZXMgdGhhdCBJIG5lZWQgdG8gYmUgYXdhcmUgb2Y/IEFyZSB0aGVyZSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyB0aGF0IGVuYWJsZSBjZXJ0YWluIHRlc3QgY2FzZXMgb3IgZnVuY3Rpb25hbGl0aWVzPyBVbmRlcnN0YW5kaW5nIHRoZSBLY29uZmlnIG9wdGlvbnMgd2lsbCBiZSBjcnVjaWFsIGZvciByZXByb2R1Y2luZyBhbmQgYW5hbHl6aW5nIGl0IGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuIEkgbmVlZCB0byBrbm93IGhvdyB0byBlbmFibGUgb3IgZGlzYWJsZSBpdCwgYW5kIHdoYXQgdGhlIGRlcGVuZGVuY2llcyBhcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ2MTQsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjE1LjQ3ODIyNzA2NVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTk3ODUyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJndXBfdGVzdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vS2NvbmZpZz0xMjkzPWNvbmZpZyBHVVBfVEVTVFxcbi0tXFxubW0vS2NvbmZpZy0xMjk2LVxcdGhlbHBcXG5tbS9LY29uZmlnOjEyOTc6XFx0ICBQcm92aWRlcyAvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCwgd2hpY2ggaW4gdHVybiBwcm92aWRlcyBhIHdheVxcbm1tL0tjb25maWctMTI5OC1cXHQgIHRvIG1ha2UgaW9jdGwgY2FsbHMgdGhhdCBjYW4gbGF1bmNoIGtlcm5lbC1iYXNlZCB1bml0IHRlc3RzIGZvclxcbi0tXFxubW0vS2NvbmZpZy0xMzEwLVxcbm1tL0tjb25maWc6MTMxMTpcXHQgIFNlZSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jXFxubW0vS2NvbmZpZy0xMzEyLVxcbi0tXFxubW0vTWFrZWZpbGU9MTEwPW9iai0kKENPTkZJR19DR1JPVVBfSFVHRVRMQikgKz0gaHVnZXRsYl9jZ3JvdXAub1xcbm1tL01ha2VmaWxlOjExMTpvYmotJChDT05GSUdfR1VQX1RFU1QpICs9IGd1cF90ZXN0Lm9cXG5tbS9NYWtlZmlsZS0xMTItb2JqLSQoQ09ORklHX0RNQVBPT0xfVEVTVCkgKz0gZG1hcG9vbF90ZXN0Lm9cXG4tLVxcbm1tL2d1cF90ZXN0LmMtOC0jaW5jbHVkZSBcXHUwMDNjbGludXgvaGlnaG1lbS5oXFx1MDAzZVxcbm1tL2d1cF90ZXN0LmM6OTojaW5jbHVkZSBcXFwiZ3VwX3Rlc3QuaFxcXCJcXG5tbS9ndXBfdGVzdC5jLTEwLVxcbm1tL2d1cF90ZXN0LmM6MTE6c3RydWN0IGd1cF90ZXN0X2RhdGEge1xcbm1tL2d1cF90ZXN0LmMtMTItXFx0c3RydWN0IG11dGV4IGxvbmd0ZXJtX211dGV4O1xcbi0tXFxubW0vZ3VwX3Rlc3QuYz0xNz1zdGF0aWMgdm9pZCBwdXRfYmFja19wYWdlcyh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbm1tL2d1cF90ZXN0LmM6MTg6XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcywgdW5zaWduZWQgaW50IGd1cF90ZXN0X2ZsYWdzKVxcbm1tL2d1cF90ZXN0LmMtMTkte1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy0zNC1cXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbm1tL2d1cF90ZXN0LmM6MzU6XFx0XFx0aWYgKGd1cF90ZXN0X2ZsYWdzIFxcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pIHtcXG5tbS9ndXBfdGVzdC5jLTM2LVxcdFxcdFxcdHVucGluX3VzZXJfcGFnZXMocGFnZXMsIG5yX3BhZ2VzKTtcXG4tLVxcbm1tL2d1cF90ZXN0LmM9NDY9c3RhdGljIHZvaWQgdmVyaWZ5X2RtYV9waW5uZWQodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtNjEtXFxubW0vZ3VwX3Rlc3QuYzo2MjpcXHRcXHRcXHRcXHRkdW1wX3BhZ2UoXFx1MDAyNmZvbGlvLVxcdTAwM2VwYWdlLCBcXFwiZ3VwX3Rlc3QgZmFpbHVyZVxcXCIpO1xcbm1tL2d1cF90ZXN0LmMtNjMtXFx0XFx0XFx0XFx0YnJlYWs7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTY3LVxcdFxcdFxcdFxcdCAgICAgaSkpIHtcXG5tbS9ndXBfdGVzdC5jOjY4OlxcdFxcdFxcdFxcdGR1bXBfcGFnZShcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIFxcXCJndXBfdGVzdCBmYWlsdXJlXFxcIik7XFxubW0vZ3VwX3Rlc3QuYy02OS1cXHRcXHRcXHRcXHRicmVhaztcXG4tLVxcbm1tL2d1cF90ZXN0LmMtNzUtXFxubW0vZ3VwX3Rlc3QuYzo3NjpzdGF0aWMgdm9pZCBkdW1wX3BhZ2VzX3Rlc3Qoc3RydWN0IGd1cF90ZXN0ICpndXAsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxubW0vZ3VwX3Rlc3QuYy03Ny1cXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTAxLVxcdFxcdFxcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcXG5tbS9ndXBfdGVzdC5jOjEwMjpcXHRcXHRcXHRcXHQgIFxcXCJndXBfdGVzdDogZHVtcF9wYWdlcygpIHRlc3RcXFwiKTtcXG5tbS9ndXBfdGVzdC5jLTEwMy1cXHRcXHR9XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTEwNi1cXG5tbS9ndXBfdGVzdC5jOjEwNzpzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG5tbS9ndXBfdGVzdC5jOjEwODpcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcXG5tbS9ndXBfdGVzdC5jLTEwOS17XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTIxNS1cXG5tbS9ndXBfdGVzdC5jOjIxNjpzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcXG5tbS9ndXBfdGVzdC5jLTIxNy17XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTIyNy1cXG5tbS9ndXBfdGVzdC5jOjIyODpzdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdGFydChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcXG5tbS9ndXBfdGVzdC5jLTIyOS1cXHRcXHR1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMjk0LVxcbm1tL2d1cF90ZXN0LmM6Mjk1OnN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXFxubW0vZ3VwX3Rlc3QuYy0yOTYtXFx0XFx0dW5zaWduZWQgbG9uZyBhcmcpXFxuLS1cXG5tbS9ndXBfdGVzdC5jPTMyMT1zdGF0aWMgbG9uZyBwaW5fbG9uZ3Rlcm1fdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTMyMy17XFxubW0vZ3VwX3Rlc3QuYzozMjQ6XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlcC1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbm1tL2d1cF90ZXN0LmMtMzI1LVxcdGludCByZXQgPSAtRUlOVkFMO1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy0zNDYtXFxubW0vZ3VwX3Rlc3QuYzozNDc6c3RhdGljIGxvbmcgZ3VwX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxcbm1tL2d1cF90ZXN0LmMtMzQ4LVxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbm1tL2d1cF90ZXN0LmMtMzQ5LXtcXG5tbS9ndXBfdGVzdC5jOjM1MDpcXHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwO1xcbm1tL2d1cF90ZXN0LmMtMzUxLVxcdGludCByZXQ7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTM3MS1cXG5tbS9ndXBfdGVzdC5jOjM3MjpcXHRyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgXFx1MDAyNmd1cCk7XFxubW0vZ3VwX3Rlc3QuYy0zNzMtXFx0aWYgKHJldClcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMzgxLVxcbm1tL2d1cF90ZXN0LmM6MzgyOnN0YXRpYyBpbnQgZ3VwX3Rlc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG5tbS9ndXBfdGVzdC5jLTM4My17XFxubW0vZ3VwX3Rlc3QuYzozODQ6XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XFxubW0vZ3VwX3Rlc3QuYy0zODUtXFx0aW50IHJldDtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtNDAxLVxcbm1tL2d1cF90ZXN0LmM6NDAyOnN0YXRpYyBpbnQgZ3VwX3Rlc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG5tbS9ndXBfdGVzdC5jLTQwMy17XFxubW0vZ3VwX3Rlc3QuYzo0MDQ6XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxubW0vZ3VwX3Rlc3QuYy00MDUtXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTQxMy1cXG5tbS9ndXBfdGVzdC5jOjQxNDpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBndXBfdGVzdF9mb3BzID0ge1xcbm1tL2d1cF90ZXN0LmM6NDE1OlxcdC5vcGVuID0gZ3VwX3Rlc3Rfb3BlbixcXG5tbS9ndXBfdGVzdC5jOjQxNjpcXHQudW5sb2NrZWRfaW9jdGwgPSBndXBfdGVzdF9pb2N0bCxcXG5tbS9ndXBfdGVzdC5jLTQxNy1cXHQuY29tcGF0X2lvY3RsID0gY29tcGF0X3B0cl9pb2N0bCxcXG5tbS9ndXBfdGVzdC5jOjQxODpcXHQucmVsZWFzZSA9IGd1cF90ZXN0X3JlbGVhc2UsXFxubW0vZ3VwX3Rlc3QuYy00MTktfTtcXG5tbS9ndXBfdGVzdC5jLTQyMC1cXG5tbS9ndXBfdGVzdC5jOjQyMTpzdGF0aWMgaW50IF9faW5pdCBndXBfdGVzdF9pbml0KHZvaWQpXFxubW0vZ3VwX3Rlc3QuYy00MjIte1xcbm1tL2d1cF90ZXN0LmM6NDIzOlxcdGRlYnVnZnNfY3JlYXRlX2ZpbGVfdW5zYWZlKFxcXCJndXBfdGVzdFxcXCIsIDA2MDAsIE5VTEwsIE5VTEwsXFxubW0vZ3VwX3Rlc3QuYzo0MjQ6XFx0XFx0XFx0XFx0ICAgXFx1MDAyNmd1cF90ZXN0X2ZvcHMpO1xcbm1tL2d1cF90ZXN0LmMtNDI1LVxcbi0tXFxubW0vZ3VwX3Rlc3QuYy00MjgtXFxubW0vZ3VwX3Rlc3QuYzo0Mjk6bGF0ZV9pbml0Y2FsbChndXBfdGVzdF9pbml0KTtcXG4tLVxcbm1tL2d1cF90ZXN0LmgtNi1cXG5tbS9ndXBfdGVzdC5oOjc6I2RlZmluZSBHVVBfRkFTVF9CRU5DSE1BUktcXHRfSU9XUignZycsIDEsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oOjg6I2RlZmluZSBQSU5fRkFTVF9CRU5DSE1BUktcXHRfSU9XUignZycsIDIsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oOjk6I2RlZmluZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLXFx0X0lPV1IoJ2cnLCAzLCBzdHJ1Y3QgZ3VwX3Rlc3QpXFxubW0vZ3VwX3Rlc3QuaDoxMDojZGVmaW5lIEdVUF9CQVNJQ19URVNUXFx0XFx0X0lPV1IoJ2cnLCA0LCBzdHJ1Y3QgZ3VwX3Rlc3QpXFxubW0vZ3VwX3Rlc3QuaDoxMTojZGVmaW5lIFBJTl9CQVNJQ19URVNUXFx0XFx0X0lPV1IoJ2cnLCA1LCBzdHJ1Y3QgZ3VwX3Rlc3QpXFxubW0vZ3VwX3Rlc3QuaDoxMjojZGVmaW5lIERVTVBfVVNFUl9QQUdFU19URVNUXFx0X0lPV1IoJ2cnLCA2LCBzdHJ1Y3QgZ3VwX3Rlc3QpXFxubW0vZ3VwX3Rlc3QuaC0xMy0jZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUXFx0X0lPVygnZycsIDcsIHN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdClcXG4tLVxcbm1tL2d1cF90ZXN0LmgtMjAtXFxubW0vZ3VwX3Rlc3QuaDoyMTpzdHJ1Y3QgZ3VwX3Rlc3Qge1xcbm1tL2d1cF90ZXN0LmgtMjItXFx0X191NjQgZ2V0X2RlbHRhX3VzZWM7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjE1LjUyODIxMTQzM1oiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjY5MzczNTIyNDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIEtlcm5lbCBDb25maWd1cmF0aW9uKipcblxuT2theSwgdGltZSB0byB0cm91Ymxlc2hvb3QgdGhpcy4gTXkgZ3V0IGZlZWxpbmcgaXMgdGVsbGluZyBtZSB0aGUgaXNzdWUgbWlnaHQgYmUgbHVya2luZyB3aXRoaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGZpbGVzLiBMZXQgbWUgemVybyBpbiBvbiBgbW0vS2NvbmZpZ2AuIEl0J3MgYSBrZXkgZmlsZSBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucywgYW5kIHRoZXJlJ3MgYSBzdHJvbmcgY2hhbmNlIHRoZSBwcm9ibGVtIHJlbGF0ZXMgdG8gc29tZXRoaW5nIGluIHRoYXQgYXJlYS4gTm93LCBiYXNlZCBvbiBwcmV2aW91cyBleHBlcmllbmNlcywgSSdtIGdvaW5nIHRvIGp1bXAgdG8gYXJvdW5kIGxpbmUgMTI5My4gVGhhdCByZWdpb24gb2Z0ZW4gY29udGFpbnMgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBzcGVjaWZpYyBtZW1vcnkgYWxsb2NhdGlvbiBmZWF0dXJlcyBvciBwb3RlbnRpYWxseSBjb25mbGljdGluZyBzZXR0aW5ncyB0aGF0IGNvdWxkIGJlIHJlbGV2YW50IHRvIHRoZSBpc3N1ZSBJJ20gZmFjaW5nLiBJJ2xsIHN0YXJ0IG15IGludmVzdGlnYXRpb24gdGhlcmUgYW5kIHNlZSB3aGF0IGp1bXBzIG91dC4gSSdtIGV4cGVjdGluZyB0byBmaW5kIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50LCBhIGRlcGVuZGVuY3ksIG9yIG1heWJlIGV2ZW4gYSBjb25maWd1cmF0aW9uIG9wdGlvbiB3aXRoIGFuIHVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSB0aGF0J3MgY2F1c2luZyB0aGUgcHJvYmxlbS4gTGV0J3Mgc2VlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjcxNzMsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyMjoyMi40NjU1Njc2NTJaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzMwNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMjkwLFxuICBcIkxpbmVDb3VudFwiOiAzNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxMjkwOlxcdFxcdCAgaW5mb3JtYXRpb24gaW5jbHVkZXMgZ2xvYmFsIGFuZCBwZXIgY2h1bmsgc3RhdGlzdGljcywgd2hpY2ggY2FuXFxuMTI5MTpcXHRcXHQgIGJlIHVzZWQgdG8gaGVscCB1bmRlcnN0YW5kIHBlcmNwdSBtZW1vcnkgdXNhZ2UuXFxuMTI5MjpcXHRcXG4xMjkzOlxcdGNvbmZpZyBHVVBfVEVTVFxcbjEyOTQ6XFx0XFx0Ym9vbCBcXFwiRW5hYmxlIGluZnJhc3RydWN0dXJlIGZvciBnZXRfdXNlcl9wYWdlcygpLXJlbGF0ZWQgdW5pdCB0ZXN0c1xcXCJcXG4xMjk1OlxcdFxcdGRlcGVuZHMgb24gREVCVUdfRlNcXG4xMjk2OlxcdFxcdGhlbHBcXG4xMjk3OlxcdFxcdCAgUHJvdmlkZXMgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QsIHdoaWNoIGluIHR1cm4gcHJvdmlkZXMgYSB3YXlcXG4xMjk4OlxcdFxcdCAgdG8gbWFrZSBpb2N0bCBjYWxscyB0aGF0IGNhbiBsYXVuY2gga2VybmVsLWJhc2VkIHVuaXQgdGVzdHMgZm9yXFxuMTI5OTpcXHRcXHQgIHRoZSBnZXRfdXNlcl9wYWdlcyooKSBhbmQgcGluX3VzZXJfcGFnZXMqKCkgZmFtaWx5IG9mIEFQSSBjYWxscy5cXG4xMzAwOlxcdFxcbjEzMDE6XFx0XFx0ICBUaGVzZSB0ZXN0cyBpbmNsdWRlIGJlbmNobWFyayB0ZXN0aW5nIG9mIHRoZSBfZmFzdCB2YXJpYW50cyBvZlxcbjEzMDI6XFx0XFx0ICBnZXRfdXNlcl9wYWdlcyooKSBhbmQgcGluX3VzZXJfcGFnZXMqKCksIGFzIHdlbGwgYXMgc21va2UgdGVzdHMgb2ZcXG4xMzAzOlxcdFxcdCAgdGhlIG5vbi1fZmFzdCB2YXJpYW50cy5cXG4xMzA0OlxcdFxcbjEzMDU6XFx0XFx0ICBUaGVyZSBpcyBhbHNvIGEgc3ViLXRlc3QgdGhhdCBhbGxvd3MgcnVubmluZyBkdW1wX3BhZ2UoKSBvbiBhbnlcXG4xMzA2OlxcdFxcdCAgb2YgdXAgdG8gZWlnaHQgcGFnZXMgKHNlbGVjdGVkIGJ5IGNvbW1hbmQgbGluZSBhcmdzKSB3aXRoaW4gdGhlXFxuMTMwNzpcXHRcXHQgIHJhbmdlIG9mIHVzZXItc3BhY2UgYWRkcmVzc2VzLiBUaGVzZSBwYWdlcyBhcmUgZWl0aGVyIHBpbm5lZCB2aWFcXG4xMzA4OlxcdFxcdCAgcGluX3VzZXJfcGFnZXMqKCksIG9yIHBpbm5lZCB2aWEgZ2V0X3VzZXJfcGFnZXMqKCksIGFzIHNwZWNpZmllZFxcbjEzMDk6XFx0XFx0ICBieSBvdGhlciBjb21tYW5kIGxpbmUgYXJndW1lbnRzLlxcbjEzMTA6XFx0XFxuMTMxMTpcXHRcXHQgIFNlZSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jXFxuMTMxMjpcXHRcXG4xMzEzOlxcdGNvbW1lbnQgXFxcIkdVUF9URVNUIG5lZWRzIHRvIGhhdmUgREVCVUdfRlMgZW5hYmxlZFxcXCJcXG4xMzE0OlxcdFxcdGRlcGVuZHMgb24gIUdVUF9URVNUIFxcdTAwMjZcXHUwMDI2ICFERUJVR19GU1xcbjEzMTU6XFx0XFxuMTMxNjpcXHRjb25maWcgR1VQX0dFVF9QWFhfTE9XX0hJR0hcXG4xMzE3OlxcdFxcdGJvb2xcXG4xMzE4OlxcdFxcbjEzMTk6XFx0Y29uZmlnIERNQVBPT0xfVEVTVFxcbjEzMjA6XFx0XFx0dHJpc3RhdGUgXFxcIkVuYWJsZSBhIG1vZHVsZSB0byBydW4gdGltZSB0ZXN0cyBvbiBkbWFfcG9vbFxcXCJcXG4xMzIxOlxcdFxcdGRlcGVuZHMgb24gSEFTX0RNQVxcbjEzMjI6XFx0XFx0aGVscFxcbjEzMjM6XFx0XFx0ICBQcm92aWRlcyBhIHRlc3QgbW9kdWxlIHRoYXQgd2lsbCBhbGxvY2F0ZSBhbmQgZnJlZSBtYW55IGJsb2NrcyBvZlxcbjEzMjQ6XFx0XFx0ICB2YXJpb3VzIHNpemVzIGFuZCByZXBvcnQgaG93IGxvbmcgaXQgdGFrZXMuIFRoaXMgaXMgaW50ZW5kZWQgdG9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6MjIuNDY1NzAzNzYyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NjMxMTQyMTA0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEdVUCBUZXN0IFBhdGNoKipcblxuT2theSwgbGV0J3MgdGFrZSBhbm90aGVyIGxvb2sgYXQgdGhpcyBgbW0vZ3VwX3Rlc3QuY2AgcGF0Y2guIEZpcnN0IGdsYW5jZSBzaG93cyBzb21lIGFkZGl0aW9ucywgYSBmZXcgbmV3IGNoZWNrcywgYW5kIGEgY2hhbmdlIHRvIHRoZSBsb29wIGhhbmRsaW5nLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgYmVpbmcgYWRkcmVzc2VkIGhlcmUsIHNvIGxldCdzIGJyZWFrIGl0IGRvd24uXG5cblRoZSBpbml0aWFsIGBpZmAgc3RhdGVtZW50IG5vdyBpbmNsdWRlcyBhZGRpdGlvbmFsIGNoZWNrczogYCFndXAtXHUwMDNlc2l6ZWAsIGAhZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsYCwgYW5kIGAhUEFHRV9BTElHTkVEKGd1cC1cdTAwM2VzaXplKWAuIENsZWFybHksIHdlJ3JlIHRyeWluZyB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgcGFyYW1ldGVycyBtb3JlIHJpZ29yb3VzbHkuIFplcm8tc2l6ZWQgcmVxdWVzdHMsIG1pc3NpbmcgYG5yX3BhZ2VzX3Blcl9jYWxsYCwgb3IgbWlzYWxpZ25lZCBzaXplcyBhcmUgbm93IGNvbnNpZGVyZWQgaW52YWxpZC4gVGhpcyBzZWVtcyByZWFzb25hYmxlOyBwcmV2ZW50aW5nIHRoZXNlIGtpbmRzIG9mIGVkZ2UgY2FzZXMgdXBmcm9udCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gYXZvaWQgdW5leHBlY3RlZCBiZWhhdmlvciBsYXRlci5cblxuVGhlIGNvcmUgb2YgdGhlIGNoYW5nZSBsaWVzIHdpdGhpbiB0aGUgbWFpbiBsb29wLiBQcmV2aW91c2x5LCB0aGUgY29kZSBjYWxjdWxhdGVkIGBuZXh0YCBhbmQgdGhlbiBoYWQgYSByZWR1bmRhbnQgY2hlY2svYWRqdXN0bWVudCBpZiBgbmV4dGAgZXhjZWVkZWQgYGVuZGAuIE5vdywgdGhlcmUncyBhIG5ldyBsaW5lIHRoYXQgY2xhbXBzIHRoZSBgbnJgIHZhbHVlIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgc2l6ZS4gVGhpcyBzdWdnZXN0cyB0aGUgb3JpZ2luYWwgY2FsY3VsYXRpb24gaGFkIHBvdGVudGlhbCBvdmVyZmxvdyBpc3N1ZXMsIGFuZCB0aGlzIHJldmlzZWQgY29kZSBzZWVtcyB0byBiZSBhbiBpbXByb3ZlbWVudCBpbiBlbnN1cmluZyBgbnJgIGRvZXNuJ3QgZXhjZWVkIHRoZSBib3VuZHMgb2YgdGhlIHByb3ZpZGVkIHJlZ2lvbiwgZXZlbiB3aGVuIHRoZSBwcm92aWRlZCB2YWx1ZSBmb3IgYGd1cC1cdTAwM2VzaXplYCBjb3VsZCBoYXZlIHJlc3VsdGVkIGluIGFuIG92ZXJmbG93IGNhbGN1bGF0aW9uIGluIGBuZXh0ID0gYWRkciArIG5yICogUEFHRV9TSVpFO2AuXG5cbkknbSB0aGlua2luZyB0aGlzIGxpa2VseSByZXNvbHZlcyBhbiBpc3N1ZSB3aGVyZSB0aGUgY2FsY3VsYXRpb24gb2YgYG5leHRgIGNvdWxkIHJlc3VsdCBpbiBhbiBpbnZhbGlkIGFkZHJlc3MgdGhhdCBsZWFkcyB0byBhbiBvdXQtb2YtYm91bmRzIHJlYWQgb3Igd3JpdGUuIFByZXZlbnRpbmcgdGhpcyBraW5kIG9mIG92ZXJmbG93IGlzIGNydWNpYWwgZm9yIG1lbW9yeSBtYW5hZ2VtZW50LCBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggdXNlci1wcm92aWRlZCBwYXJhbWV0ZXJzLlxuXG5JIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW50ZW50IGFuZCBvcmlnaW5hbCBtb3RpdmF0aW9uIGJlaGluZCB0aGlzIGNoYW5nZS4gTm93IEkgc2hvdWxkIGxvb2sgYXQgdGhlIGNvbW1pdCBsb2cgZm9yIGBtbS9ndXBfdGVzdC5jYCB0byBzZWUgdGhlIGNvbnRleHQgYW5kIHRoZSBzcGVjaWZpYyBwcm9ibGVtIHRoYXQgd2FzIGJlaW5nIGZpeGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3OTk1LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDYzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6MjguNzc3MTI4NDhaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODMyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMzUsXG4gIFwiTGluZUNvdW50XCI6IDU1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxMzU6XFx0XFxuIDEzNjpcXHRcXHRpID0gMDtcXG4gMTM3OlxcdFxcdG5yID0gZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcXG4gMTM4OlxcdFxcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMTM5OlxcdFxcdGZvciAoYWRkciA9IGd1cC1cXHUwMDNlYWRkcjsgYWRkciBcXHUwMDNjIGVuZDsgYWRkciA9IG5leHQpIHtcXG4gMTQwOlxcdFxcdFxcdGlmIChuciAhPSBndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxcbiAxNDE6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE0MjpcXHRcXG4gMTQzOlxcdFxcdFxcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XFxuIDE0NDpcXHRcXG4gMTQ1OlxcdFxcdFxcdG5leHQgPSBhZGRyICsgbnIgKiBQQUdFX1NJWkU7XFxuIDE0NjpcXHRcXG4gMTQ3OlxcdFxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDE0ODpcXHRcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMTQ5OlxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE1MDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4gMTUxOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNTI6XFx0XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMTUzOlxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyArIGkpO1xcbiAxNTQ6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1NTpcXHRcXHRcXHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcXG4gMTU2OlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE1NzpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4gMTU4OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNTk6XFx0XFx0XFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcXG4gMTYwOlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyArIGkpO1xcbiAxNjE6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2MjpcXHRcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XFxuIDE2MzpcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLFxcbiAxNjQ6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzIHwgRk9MTF9MT05HVEVSTSxcXG4gMTY1OlxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNjY6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2NzpcXHRcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAxNjg6XFx0XFx0XFx0XFx0aWYgKGd1cC1cXHUwMDNldGVzdF9mbGFncyBcXHUwMDI2IEdVUF9URVNUX0ZMQUdfRFVNUF9QQUdFU19VU0VfUElOKVxcbiAxNjk6XFx0XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE3MDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4gMTcxOlxcdFxcdFxcdFxcdGVsc2VcXG4gMTcyOlxcdFxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNzM6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE3NDpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTc1OlxcdFxcdFxcdGRlZmF1bHQ6XFxuIDE3NjpcXHRcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbiAxNzc6XFx0XFx0XFx0XFx0Z290byB1bmxvY2s7XFxuIDE3ODpcXHRcXHRcXHR9XFxuIDE3OTpcXHRcXG4gMTgwOlxcdFxcdFxcdGlmIChuciBcXHUwMDNjPSAwKVxcbiAxODE6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE4MjpcXHRcXHRcXHRpICs9IG5yO1xcbiAxODM6XFx0XFx0fVxcbiAxODQ6XFx0XFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMTg1OlxcdFxcbiAxODY6XFx0XFx0LyogU2hpZnRpbmcgdGhlIG1lYW5pbmcgb2YgbnJfcGFnZXM6IG5vdyBpdCBpcyBhY3R1YWwgbnVtYmVyIHBpbm5lZDogKi9cXG4gMTg3OlxcdFxcdG5yX3BhZ2VzID0gaTtcXG4gMTg4OlxcdFxcbiAxODk6XFx0XFx0Z3VwLVxcdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6MjguNzc3MjE0MzZaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6Nzc3NDUyNTQyMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIEZlYXNpYmlsaXR5OiBBIERlZXAgRGl2ZSBpbnRvIGd1cF90ZXN0LmMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaXMgdG91Y2hpbmcgY29kZSByZWxhdGVkIHRvIGBnZXRfdXNlcl9wYWdlcygpYCwgc3BlY2lmaWNhbGx5IHdpdGhpbiBgbW0vZ3VwX3Rlc3QuY2AuIFRoZSBpbml0aWFsIGNvZGUgaGFkIHBvdGVudGlhbCBvdmVyZmxvdyBpc3N1ZXMgd2l0aCBgYWRkciArIG5yICogUEFHRV9TSVpFYCwgYW5kIHNvbWUgemVyby1zaXplIGFsbG9jYXRpb25zIHRoYXQgY291bGQgY2F1c2UgcHJvYmxlbXMuIFRoZSBjb3JyZWN0aW9uIGFkZHJlc3NlcyB0aG9zZSBvdmVyZmxvd3Mgd2l0aCBhbiBvdmVyZmxvdy1zYWZlIGNoZWNrLCBhbmQgZGVhbHMgd2l0aCBzb21lIHBvdGVudGlhbCBudWxsLXBvaW50ZXItZXNxdWUgY29uZGl0aW9ucy5cblxuTXkgaW1tZWRpYXRlIHRob3VnaHQgaXM6IGNhbiB0aGlzIGNvZGUgKmFjdHVhbGx5KiBiZSBmdXp6ZWQ/IFRoZSBjZW50cmFsIHF1ZXN0aW9uIGlzIHJlYWNoYWJpbGl0eS4gVGhlIHBhdGNoIGNvZGUgY3JlYXRlcyBgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RgIHZpYSBkZWJ1Z2ZzLCBhbmQgaW9jdGxzIGNhbiBiZSBpc3N1ZWQgYnkgdXNlcnNwYWNlLiBCdXQgdGhlIGluc3RydWN0aW9ucyBtYWtlIGl0IGNsZWFyLCByZWFjaGFiaWxpdHkgaXMgdGhlIHByaW1hcnkgZ2F0ZTogaWYgdGhlIGNvZGUgY2FuJ3QgZXhlY3V0ZSBpbiBhIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50LCBpdCdzIGEgbm8tZ28gZm9yIGZ1enppbmcuXG5cbk5vdywgbGV0J3MgYXBwbHkgdGhlICpuZWdhdGl2ZSogY3JpdGVyaWEgZnJvbSB0aGUgaW5zdHJ1Y3Rpb25zLiBEb2VzIGl0IGZhbGwgaW50byBhbnkgb2YgdGhvc2UgY2F0ZWdvcmllcz9cblxuKiAgICoqTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlcz8qKiBOb3BlLCBpdCdzIGtlcm5lbCBDIGNvZGUuIE5vdCBkb2N1bWVudGF0aW9uLCBzY3JpcHRzLCBvciB1c2VyLXNwYWNlIHN0dWZmLlxuKiAgICoqU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlPyoqIE5vcGUsIGl0IGRvZXNuJ3QgcmVxdWlyZSBzcGVjaWZpYyBoYXJkd2FyZS4gSXQncyBub3QgYSBkcml2ZXIgZm9yIGEgZmFuY3kgQVNJQyBvciBTbWFydE5JQy5cbiogICAqKlVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRocz8qKiBJdCdzIG5vdCBhIHRlYXJkb3duIGNhbGxiYWNrLCBub3Igc3BlY2lmaWMgdG8gc29tZSBiaXphcnJlIGFyY2hpdGVjdHVyZS4gSXQncyBhbWQ2NC1jb21wYXRpYmxlLCBhbmQgdGhlIGRlYnVnZnMgZmlsZSBjcmVhdGVkIHZpYSBgbGF0ZV9pbml0Y2FsbGAgbWVhbnMgaXQncyBhdmFpbGFibGUgdG8gdXNlcnNwYWNlLlxuXG5TbywgdGhlIG5leHQgb2J2aW91cyBxdWVzdGlvbiBpczogSXMgdGhpcyByZWFjaGFibGUgZnJvbSBhIHN0YW5kYXJkIFFFTVUgb3IgR0NFIGVudmlyb25tZW50P1xuXG5ZZXMsIHNpbmNlIGRlYnVnZnMgaXMgbW91bnRlZCBpbiBzdGFuZGFyZCBMaW51eCwgYW5kIGlvY3RscyBjYW4gYmUgaXNzdWVkIHRvIGBndXBfdGVzdGAgdmlhIHVzZXJzcGFjZS4gSSd2ZSBjaGVja2VkIGRlYnVnZnMgcGVybWlzc2lvbnMgaW4gYGd1cF90ZXN0LmNgOiBUaGUgZGVidWdmcyBmaWxlIGlzIGNyZWF0ZWQgYXMgMDYwMCAtIHNvIHJvb3QgY2FuIGFjY2VzcyBpdC4gU3l6a2FsbGVyIHJ1bnMgYXMgcm9vdCAob3Igd2l0aCBjYXBhYmlsaXRpZXMpIGluIG1hbnkgc2NlbmFyaW9zLCBzbyB0aGlzIGNoZWNrIGlzIHZhbGlkLlxuXG5JIG5lZWQgdG8gY29uZmlybSB0aGUgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMuIGBHVVBfVEVTVGAgZGVwZW5kcyBvbiBgREVCVUdfRlNgIHdoaWNoIGRlcGVuZHMgb24gdmFyaW91cyBkZWJ1Z2dpbmcgY29uZmlnIG9wdGlvbnMsIGJ1dCBpdCBsb29rcyBsaWtlIHRoZSB0ZXN0cyBpbiBgZ3VwX3Rlc3QuY2AgYXJlIGVuYWJsZWQgdW5kZXIgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24uXG5cbk9rYXksIGxldCdzIGFwcGx5IHRoZSAqcG9zaXRpdmUqIGNyaXRlcmlhIGZyb20gdGhlIGluc3RydWN0aW9ucyB0byBiZSBzdXJlOlxuXG4qICAgKipDb3JlIFN1YnN5c3RlbXM/KiogWWVzLCBpdCBpcyBhIG1lbW9yeSBtYW5hZ2VtZW50IGlzc3VlLCBhcyB0aGUgY29kZSBtb2RpZmllcyBgZ2V0X3VzZXJfcGFnZXMoKWBcbiogICAqKlJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwcz8qKiBZZXMsIHRoZSBjb2RlIGlzIHJlZmFjdG9yaW5nIGFuZCBjaGFuZ2luZyBwYXJ0cyBvZiBtZW1vcnkgbWFuYWdlbWVudC5cbiogICAqKlJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrcz8qKiBZZXMsIHdlIGFyZSBpbnRyb2R1Y2luZyBkZWZlbnNpdmUgY2hlY2tzLlxuXG5UaGVyZWZvcmUsIHRoaXMgY29kZSBwYXRoICppcyogcmVhY2hhYmxlLCBhbmQgKnNob3VsZCogYmUgZnV6emVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NzUxLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTM2NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjM2LjU1MTc1MTQwMloiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzU4NTQzMjMsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBERUJVR19GU1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjM2LjYyNzYxMjQzNVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNDY0MTQwMjI1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRlYnVnZ2luZyB0aGUgRmlsZXN5c3RlbSBDb25maWd1cmF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHRyYWNrIGRvd24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGBERUJVR19GU2AuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHN0YXJ0IGRpZ2dpbmcgdGhyb3VnaCB0aGUgYEtjb25maWdgIGZpbGVzLiBUaGF0J3MgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIEknbGwgZmluZCBpdHMgZGVmaW5pdGlvbiwgYW55IGRlcGVuZGVuY2llcywgYW5kIGFzc29jaWF0ZWQgaGVscCB0ZXh0LiBJJ2xsIG5lZWQgdG8gcmVtZW1iZXIgdG8gbG9vayBpbiBhbGwgdGhlIHJlbGV2YW50IHN1YmRpcmVjdG9yaWVzIGZvciBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiBob3cgaXQncyB1c2VkIGFuZCB3aGF0IGl0IGNvbnRyb2xzLiBGaW5kaW5nIGl0cyBkZXBlbmRlbmNpZXMgd2lsbCBiZSBrZXkgdG8gdW5kZXJzdGFuZGluZyBpZiBpdCdzIGVuYWJsZWQgYnkgc29tZXRoaW5nIGVsc2UgSSdtIGFscmVhZHkgdXNpbmcsIG9yIGlmIGl0IGNhbiBiZSBlbmFibGVkIGluZGVwZW5kZW50bHkuIEkgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgYW55IHdhcm5pbmdzIGFib3V0IHVzaW5nIHRoaXMuIExldCdzIHN0YXJ0IHRoZSBzZWFyY2guLi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE3ODQsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyMjozOS4wOTE3NjEyM1oiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQwNTM0MTQ5OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgREVCVUdfRlNcXFxcYlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJsaWIvS2NvbmZpZy5kZWJ1Zz02ODM9Y29uZmlnIE1BR0lDX1NZU1JRX1NFUklBTF9TRVFVRU5DRVxcbi0tXFxubGliL0tjb25maWcuZGVidWctNjkyLVxcbmxpYi9LY29uZmlnLmRlYnVnOjY5Mzpjb25maWcgREVCVUdfRlNcXG5saWIvS2NvbmZpZy5kZWJ1Zy02OTQtXFx0Ym9vbCBcXFwiRGVidWcgRmlsZXN5c3RlbVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6NDEuNDk3MTA3OTc5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI2MTQwODg5OTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKlBlZXJpbmcgaW50byB0aGUgRGVidWdnaW5nIEhlYXJ0IG9mIHRoZSBDb25maWd1cmF0aW9uIEJlYXN0KipcblxuT2theSwgc28gSSdtIHRoaW5raW5nLCBcIldoZXJlJ3MgdGhlIGJlc3QgcGxhY2UgdG8gZGlnIGludG8gdGhpcyBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24gaXNzdWU/XCIgSW1tZWRpYXRlbHksIG15IG1pbmQgaG9uZXMgaW4gb24gYGxpYi9LY29uZmlnLmRlYnVnYC4gSXQncyBhbG1vc3Qgc2Vjb25kIG5hdHVyZSDigJMgdGhhdCBmaWxlIGlzIGEgY29yZSBjb21wb25lbnQgZm9yIGRlYnVnIGNvbmZpZ3VyYXRpb25zLiBOb3csIEkgaGF2ZSB0byB6ZXJvIGluLCBsZXQncyBzZWUsIGFyb3VuZCBsaW5lIDY5My4gVGhhdCdzIGEgcmVhc29uYWJsZSBhcmVhIHRvIHN0YXJ0IGxvb2tpbmcsIEknbGwgYmV0IGl04oCZcyByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHF1ZXJ5LiBGcm9tIHRoYXQgbG9jYXRpb24sIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUga2V5IGRpcmVjdGl2ZXMsIGRlcGVuZGVuY2llcywgb3IgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byB0aGUgZGVidWcgcGFyYW1ldGVycyBpbiBwbGF5LiBMZXQncyBzZWUgd2hhdOKAmXMgdGhlcmUsIGl0IGNvdWxkIGNvbnRhaW4gdGhlIGFuc3dlciwgb3IgYSBnb29kIGNsdWUhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMDYwLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjI6NDQuMTExMTk5ODM4WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NDgyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJsaWIvS2NvbmZpZy5kZWJ1Z1wiLFxuICBcIkZpcnN0TGluZVwiOiA2OTAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2OTA6XFx0XFxuIDY5MTpcXHRcXHQgIElmIHVuc3VyZSwgbGVhdmUgYW4gZW1wdHkgc3RyaW5nIGFuZCB0aGUgb3B0aW9uIHdpbGwgbm90IGJlIGVuYWJsZWQuXFxuIDY5MjpcXHRcXG4gNjkzOlxcdGNvbmZpZyBERUJVR19GU1xcbiA2OTQ6XFx0XFx0Ym9vbCBcXFwiRGVidWcgRmlsZXN5c3RlbVxcXCJcXG4gNjk1OlxcdFxcdGhlbHBcXG4gNjk2OlxcdFxcdCAgZGVidWdmcyBpcyBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gdGhhdCBrZXJuZWwgZGV2ZWxvcGVycyB1c2UgdG8gcHV0XFxuIDY5NzpcXHRcXHQgIGRlYnVnZ2luZyBmaWxlcyBpbnRvLiAgRW5hYmxlIHRoaXMgb3B0aW9uIHRvIGJlIGFibGUgdG8gcmVhZCBhbmRcXG4gNjk4OlxcdFxcdCAgd3JpdGUgdG8gdGhlc2UgZmlsZXMuXFxuIDY5OTpcXHRcXG4gNzAwOlxcdFxcdCAgRm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb24gdGhlIGRlYnVnZnMgQVBJLCBzZWVcXG4gNzAxOlxcdFxcdCAgRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy8uXFxuIDcwMjpcXHRcXG4gNzAzOlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgTi5cXG4gNzA0OlxcdFxcbiA3MDU6XFx0Y2hvaWNlXFxuIDcwNjpcXHRcXHRwcm9tcHQgXFxcIkRlYnVnZnMgZGVmYXVsdCBhY2Nlc3NcXFwiXFxuIDcwNzpcXHRcXHRkZXBlbmRzIG9uIERFQlVHX0ZTXFxuIDcwODpcXHRcXHRkZWZhdWx0IERFQlVHX0ZTX0FMTE9XX0FMTFxcbiA3MDk6XFx0XFx0aGVscFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyMjo0NC4xMTEzNTY2ODhaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjMwMDc4OTcwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqQW5hbHl6aW5nIERlcGVuZGVuY2llcyBhbmQgSU9DVEwgQ2FsbHMqKlxuXG5BbHJpZ2h0LCBzbyBgREVCVUdfRlNgIGlzIGEgc3RhbmRhbG9uZSBwaWVjZSwgd2hpY2ggaXMgdXNlZnVsIHRvIGtub3cuIEhvd2V2ZXIsIEkgc2VlIGBHVVBfVEVTVGAgcmVsaWVzIG9uIGBERUJVR19GU2AuIFRoYXQgcmVsYXRpb25zaGlwIHdpbGwgYmUgaW1wb3J0YW50IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZS5cblxuTXkgZm9jdXMgc2hvdWxkIGJlIG9uIGhvdyBgR1VQX1RFU1RgIGlzIGxldmVyYWdpbmcgYERFQlVHX0ZTYC4gSSdsbCBpbW1lZGlhdGVseSBkcmlsbCBkb3duIGludG8gYF9fZ3VwX3Rlc3RfaW9jdGxgIGFuZCBpdHMgY2FsbGVycyB3aXRoaW4gYG1tL2d1cF90ZXN0LmNgLiBUaGF0J3Mgd2hlcmUgdGhlIHJ1YmJlciBtZWV0cyB0aGUgcm9hZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdywgdGhlIGRhdGEgYmVpbmcgcGFzc2VkLCBhbmQgaG93IHRoZSBpbnRlcmFjdGlvbiB3aXRoIGBERUJVR19GU2AgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQgd2l0aGluIHRoYXQgSU9DVEwuIFVuZGVyc3RhbmRpbmcgdGhlIHNwZWNpZmljcyBvZiB0aGlzIGludGVyYWN0aW9uIGlzIGNyaXRpY2FsIHRvIHVuZGVyc3RhbmRpbmcgaG93IHRoaW5ncyB3b3JrIG92ZXJhbGwuIEkgd2FudCB0byBzZWUgaWYgdGhlIGRlcGVuZGVuY3kgaXMgcHVyZWx5IGEgY29uZmlndXJhdGlvbiB0aGluZywgb3IgaWYgYERFQlVHX0ZTYCBmdW5jdGlvbnMgYXJlIGFjdGl2ZWx5IHV0aWxpemVkIGR1cmluZyBJT0NUTCBwcm9jZXNzaW5nLiBUaGUgZGV2aWwncyBpbiB0aGUgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI1NDMsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjQ2LjQxMjE0OTgyN1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDY4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9ndXBfdGVzdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM0NSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDM0NTpcXHR9XFxuIDM0NjpcXHRcXG4gMzQ3OlxcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG4gMzQ4OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzNDk6XFx0e1xcbiAzNTA6XFx0XFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcXG4gMzUxOlxcdFxcdGludCByZXQ7XFxuIDM1MjpcXHRcXG4gMzUzOlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDM1NDpcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMzU1OlxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAzNTY6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAzNTc6XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMzU4OlxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuIDM1OTpcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAzNjA6XFx0XFx0XFx0YnJlYWs7XFxuIDM2MTpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzNjI6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzNjM6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEOlxcbiAzNjQ6XFx0XFx0XFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XFxuIDM2NTpcXHRcXHRkZWZhdWx0OlxcbiAzNjY6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDM2NzpcXHRcXHR9XFxuIDM2ODpcXHRcXG4gMzY5OlxcdFxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcXG4gMzcwOlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzE6XFx0XFxuIDM3MjpcXHRcXHRyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgXFx1MDAyNmd1cCk7XFxuIDM3MzpcXHRcXHRpZiAocmV0KVxcbiAzNzQ6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMzc1OlxcdFxcbiAzNzY6XFx0XFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFxcdTAwMjZndXAsIHNpemVvZihndXApKSlcXG4gMzc3OlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzg6XFx0XFxuIDM3OTpcXHRcXHRyZXR1cm4gMDtcXG4gMzgwOlxcdH1cXG4gMzgxOlxcdFxcbiAzODI6XFx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbiAzODM6XFx0e1xcbiAzODQ6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjIyOjQ2LjQxMjIyNzYxN1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDg4NjE5NDU4NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGBndXBfdGVzdF9pb2N0bGAgRnVuY3Rpb24qKlxuXG5Pa2F5LCBsZXQncyBicmVhayBkb3duIHRoaXMgYGd1cF90ZXN0X2lvY3RsYCBmdW5jdGlvbmFsaXR5LiBGaXJzdCwgaXQgbG9va3MgbGlrZSBpdCdzIGhhbmRsaW5nIGEgc2V0IG9mIGNvbW1hbmRzOiBgR1VQX0ZBU1RfQkVOQ0hNQVJLYCwgYFBJTl9GQVNUX0JFTkNITUFSS2AsIGBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLYCwgYEdVUF9CQVNJQ19URVNUYCwgYFBJTl9CQVNJQ19URVNUYCwgYW5kIGBEVU1QX1VTRVJfUEFHRVNfVEVTVGAuIEludGVyZXN0aW5nLiBUaGUgbmV4dCBzdGVwIGlzIGEgYGNvcHlfZnJvbV91c2VyYCBjYWxsIHRvIGdldCBhIGBndXBgIHN0cnVjdCBmcm9tIHVzZXJzcGFjZS4gVGhlbiBpdCBoYW5kcyBvZmYgdGhlIHByb2Nlc3NpbmcgdG8gYF9fZ3VwX3Rlc3RfaW9jdGwoY21kLCBcdTAwMjZndXApYC5cblxuTm93LCBpcyBgX19ndXBfdGVzdF9pb2N0bGAgc3RhdGljPyBZZXAsIGl0IGlzLiBUaGUgY29tcGlsZXIgd2lsbCBsaWtlbHkgaW5saW5lIGl0LiBUaGF0J3MgZ29vZCB0byBrbm93IGZvciBwZXJmb3JtYW5jZSBhbmFseXNpcy4gSSB3b25kZXIgdGhvdWdoLCB3aGF0IG90aGVyIGVudHJ5IHBvaW50cyBleGlzdC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGFtIGNvdmVyaW5nIGFsbCBjYWxscyB0byB0aGlzIG1ldGhvZC4gXG5cbkxldCBtZSBjbGFyaWZ5IG15IG1lbW9yeS4gV2FpdCwgYGd1cF90ZXN0X2lvY3RsYCBpdHNlbGYgaXMgZGVjbGFyZWQgc3RhdGljISBMaW5lIDM0NyBkZWNsYXJlcyBpdDogYHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpYFxuXG5BbHNvLCBsZXQncyB0YWtlIGEgcXVpY2sgbG9vayBhdCBgZ3VwX3Rlc3RfaW5pdGAgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQuXG5cblRvIGJlIHRob3JvdWdoLCBJIHNob3VsZCBzZWFyY2ggdGhyb3VnaCBgbW0vZ3VwX3Rlc3QuY2AgZm9yIGFueSBvdGhlciBub24tc3RhdGljIG9yIGV4cG9ydGVkIGZ1bmN0aW9ucy4gTGV0J3MgYGdyZXBgIGZvciB0aG9zZS4gVGhhdCB3aWxsIHNvbGlkaWZ5IG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIG1vZHVsZSdzIGludGVyZmFjZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDA3LCJPdXRwdXRUb2tlbnMiOjQ3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjM6MDcuMjk4NDI0MjM0WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTUwODM4NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeW2EtekEtWl9dW2EtekEtWjAtOV9dKiBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vZ3VwX3Rlc3QuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9ndXBfdGVzdC5jLTEwLVxcbm1tL2d1cF90ZXN0LmM6MTE6c3RydWN0IGd1cF90ZXN0X2RhdGEge1xcbm1tL2d1cF90ZXN0LmMtMTItXFx0c3RydWN0IG11dGV4IGxvbmd0ZXJtX211dGV4O1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy0xNi1cXG5tbS9ndXBfdGVzdC5jOjE3OnN0YXRpYyB2b2lkIHB1dF9iYWNrX3BhZ2VzKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxubW0vZ3VwX3Rlc3QuYy0xOC1cXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCB1bnNpZ25lZCBpbnQgZ3VwX3Rlc3RfZmxhZ3MpXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTQ1LVxcbm1tL2d1cF90ZXN0LmM6NDY6c3RhdGljIHZvaWQgdmVyaWZ5X2RtYV9waW5uZWQodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG5tbS9ndXBfdGVzdC5jLTQ3LVxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTc1LVxcbm1tL2d1cF90ZXN0LmM6NzY6c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbm1tL2d1cF90ZXN0LmMtNzctXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTEwNi1cXG5tbS9ndXBfdGVzdC5jOjEwNzpzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG5tbS9ndXBfdGVzdC5jLTEwOC1cXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMjE1LVxcbm1tL2d1cF90ZXN0LmM6MjE2OnN0YXRpYyBpbmxpbmUgdm9pZCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdG9wKHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhKVxcbm1tL2d1cF90ZXN0LmMtMjE3LXtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMjI3LVxcbm1tL2d1cF90ZXN0LmM6MjI4OnN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhLFxcbm1tL2d1cF90ZXN0LmMtMjI5LVxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxubW0vZ3VwX3Rlc3QuYy0yOTQtXFxubW0vZ3VwX3Rlc3QuYzoyOTU6c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcXG5tbS9ndXBfdGVzdC5jLTI5Ni1cXHRcXHR1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMzIwLVxcbm1tL2d1cF90ZXN0LmM6MzIxOnN0YXRpYyBsb25nIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG5tbS9ndXBfdGVzdC5jLTMyMi1cXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhcmcpXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTM0Ni1cXG5tbS9ndXBfdGVzdC5jOjM0NzpzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXFxubW0vZ3VwX3Rlc3QuYy0zNDgtXFx0XFx0dW5zaWduZWQgbG9uZyBhcmcpXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTM4MS1cXG5tbS9ndXBfdGVzdC5jOjM4MjpzdGF0aWMgaW50IGd1cF90ZXN0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXFxubW0vZ3VwX3Rlc3QuYy0zODMte1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy00MDEtXFxubW0vZ3VwX3Rlc3QuYzo0MDI6c3RhdGljIGludCBndXBfdGVzdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbm1tL2d1cF90ZXN0LmMtNDAzLXtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtNDEzLVxcbm1tL2d1cF90ZXN0LmM6NDE0OnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGd1cF90ZXN0X2ZvcHMgPSB7XFxubW0vZ3VwX3Rlc3QuYy00MTUtXFx0Lm9wZW4gPSBndXBfdGVzdF9vcGVuLFxcbi0tXFxubW0vZ3VwX3Rlc3QuYy00MjAtXFxubW0vZ3VwX3Rlc3QuYzo0MjE6c3RhdGljIGludCBfX2luaXQgZ3VwX3Rlc3RfaW5pdCh2b2lkKVxcbm1tL2d1cF90ZXN0LmMtNDIyLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjM6MDcuMzQzOTM2Nzc4WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjUzODkwOTg4Nzc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IEFzc2Vzc21lbnQ6IG1tL2d1cF90ZXN0LmMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5vdGljZWQgdGhhdCBhbGwgdGhlIGZ1bmN0aW9ucyBpbiBgbW0vZ3VwX3Rlc3QuY2AgYXJlIGRlY2xhcmVkIGBzdGF0aWNgLiBIb3dldmVyLCB0aGF0IGRvZXNuJ3QgYXV0b21hdGljYWxseSBleGNsdWRlIHRoZW0gZnJvbSBzeW1ib2wgY292ZXJhZ2UgaW4gYHZtbGludXhgLCB1bmxlc3MgdGhleSdyZSBpbmxpbmVkLiBOb3csIGBfX2d1cF90ZXN0X2lvY3RsYCBpcyBhIHN1YnN0YW50aWFsIGZ1bmN0aW9uLCBvdmVyIDEwMCBsaW5lcy4gRXZlbiBpZiBpbmxpbmVkLCB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBmaWxlIG9wZXJhdGlvbnMgKGBmb3BzYCkgaXMgc3RpbGwgYGd1cF90ZXN0X2lvY3RsYCwgc28gYm90aCBhcmUgcG90ZW50aWFsIHRhcmdldHMuXG5cbkFjY29yZGluZyB0byB0aGUgRm9jdXNTeW1ib2xzIGd1aWRlbGluZXMsIHdlIG5lZWQgdG8gbGlzdCBmdW5jdGlvbnMgdGhhdCBkaXJlY3RseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFsdGVyZWQsIHdoaWNoLCBpbiB0aGlzIGNhc2UsIGFyZSB3aXRoaW4gdGhlIGAuY2AgZmlsZSBhbmQgYXJlIG5vdCBpbmxpbmVkLiBCb3RoIGBfX2d1cF90ZXN0X2lvY3RsYCBhbmQgYGd1cF90ZXN0X2lvY3RsYCBzZWVtIHRvIGZpdCB0aGF0IGRlc2NyaXB0aW9uIHBlcmZlY3RseS5cblxuSSB3YXMgYWJvdXQgdG8gbG9vayBmb3IgYW55IGV4aXN0aW5nIHN5emthbGxlciBkZXNjcmlwdGlvbnMgZm9yIGBndXBfdGVzdGAsIGJ1dCB0aGVuIEkgcmVtZW1iZXJlZCB0aGUgY3JpdGljYWwgaW5zdHJ1Y3Rpb246IHdlIGNhbid0IHNlYXJjaCBmb3Igc3l6bGFuZyBkZXNjcmlwdGlvbnMgZGlyZWN0bHkgd2l0aCB0aGlzIHRvb2wuIFdlJ2xsIGhhdmUgdG8gdXNlIGByZWFkLXN5ei1zcGVjYCBhbmQgYHN5ei1ncmVwcGVyYCB0b29scywgYnV0IHRoZXkgZG9uJ3Qgc2VlbSBhdmFpbGFibGUgaGVyZS4gU28sIG5vIHN5emxhbmcgc2VhcmNoLlxuXG5OZXh0LCBJIG5lZWQgdG8gY29uZmlybSBpZiB0aGlzIGlzIGV2ZW4gYSB3b3J0aHdoaWxlIGZ1enppbmcgdGFyZ2V0LCBzbyBsZXQncyBjcm9zcy1yZWZlcmVuY2UgdGhlIGd1aWRlbGluZXMuIEl0J3MgaW4gYG1tL2AsIG1ha2luZyBpdCBhIGNvcmUgc3Vic3lzdGVtLiBUaGUgbW9kaWZpY2F0aW9ucyBpbnZvbHZlIGlucHV0IHZhbGlkYXRpb24gbGlrZSB0aGUgY2hlY2tzIGFnYWluc3QgYFVMT05HX01BWGAgYW5kIHBhZ2UgYWxpZ25tZW50LCBhbmQgdGhlIGNhbGN1bGF0aW9uIG9mIHBhZ2UgcmFuZ2VzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBcIlJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrc1wiLiBJdCdzIG5vdCBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUsIGFzIGRlYnVnZnMgaXMgc3RhbmRhcmQgYW5kIGFjY2Vzc2libGUsIHBhcnRpY3VsYXJseSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuIFRoZXJlZm9yZSwgaXQgZGVmaW5pdGVseSBtZWV0cyB0aGUgY3JpdGVyaWEsIHNvIGBXb3J0aEZ1enppbmc9dHJ1ZWAuXG5cbk5vdyBmb3IgY29uZmlnIGRlcGVuZGVuY2llcy4gTG9va2luZyBhdCBgbW0vS2NvbmZpZ2AsIGl0J3MgY2xlYXIgd2UgbmVlZCBgR1VQX1RFU1RgIGFuZCBgREVCVUdfRlNgIGVuYWJsZWQuXG5cblRvIHN1bW1hcml6ZSwgbXkgZm9jdXMgc3ltYm9scyB3aWxsIGJlIGBfX2d1cF90ZXN0X2lvY3RsYCBhbmQgYGd1cF90ZXN0X2lvY3RsYC5cblxuTXkgcmVhc29uaW5nPyBUaGlzIHBhdGNoIHNwZWNpZmljYWxseSBhbHRlcnMgaW5wdXQgdmFsaWRhdGlvbiBhbmQgcGFnZSBjYWxjdWxhdGlvbiBpbiBgX19ndXBfdGVzdF9pb2N0bGAgd2l0aGluIGBtbS9ndXBfdGVzdC5jYCwgYW4gaW50ZXJmYWNlIGV4cG9zZWQgdGhyb3VnaCBkZWJ1Z2ZzIHRvIHVzZXJzcGFjZSAoYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCkuIFRoZSBjaGFuZ2VzIGRpcmVjdGx5IGltcGFjdCBob3cgcGFnZSByYW5nZXMgYW5kIGxvb3AgaXRlcmF0aW9ucyBhcmUgY2FsY3VsYXRlZCBmb3IgYGdldF91c2VyX3BhZ2VzYCB0ZXN0cy4gSXQncyBhIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgdGVzdCBpbnRlcmZhY2UgcmVhY2hhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgc28gZnV6emluZyBjYW4gaGVscCB2ZXJpZnkgYm91bmRhcnkgY29uZGl0aW9ucyBhbmQgcG90ZW50aWFsbHkgcmV2ZWFsIG1lbW9yeS1yZWxhdGVkIGlzc3Vlcy5cblxuRmluYWxseSwganVzdCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUsIGxldCdzIHZlcmlmeSBldmVyeXRoaW5nIGlzIGluIG9yZGVyOlxuXG4qICAgYEVuYWJsZUNvbmZpZ3NgOiBgW1wiR1VQX1RFU1RcIiwgXCJERUJVR19GU1wiXWBcbiogICBgRm9jdXNTeW1ib2xzYDogYFtcIl9fZ3VwX3Rlc3RfaW9jdGxcIiwgXCJndXBfdGVzdF9pb2N0bFwiXWBcbiogICBgV29ydGhGdXp6aW5nYDogYHRydWVgXG4qICAgYFJlYXNvbmluZ2A6IENvbmNpc2UgZXhwbGFuYXRpb24gcHJvdmlkZWQgYWJvdmUuXG5cblllcCwgbG9va3MgZ29vZC4gV2UgYXJlIHJlYWR5IHRvIGludm9rZSBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTA3MSwiT3V0cHV0VG9rZW5zIjoxNDUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDQzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjAxLjIzNDkyODQ3NVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3MjE2MzA0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJHVVBfVEVTVFwiLFxuICAgIFwiREVCVUdfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJfX2d1cF90ZXN0X2lvY3RsXCIsXG4gICAgXCJndXBfdGVzdF9pb2N0bFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGlucHV0IHZhbGlkYXRpb24gY2hlY2tzIGFuZCBpdGVyYXRpb24gbG9naWMgZm9yIHBhZ2UgcGlubmluZyBhbmQgZ2V0X3VzZXJfcGFnZXMgbG9vcHMgaW4gX19ndXBfdGVzdF9pb2N0bCgpIChtbS9ndXBfdGVzdC5jKS4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgaW9jdGxzIG9uIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIGJvdW5kYXJ5IGNvbmRpdGlvbiBoYW5kbGluZyBhbmQgcG90ZW50aWFsIHJlZ3Jlc3Npb25zIGluIHBhZ2UgcmFuZ2UgaGFuZGxpbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiR1VQX1RFU1RcIixcbiAgICBcIkRFQlVHX0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19ndXBfdGVzdF9pb2N0bFwiLFxuICAgIFwiZ3VwX3Rlc3RfaW9jdGxcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBpbnB1dCB2YWxpZGF0aW9uIGNoZWNrcyBhbmQgaXRlcmF0aW9uIGxvZ2ljIGZvciBwYWdlIHBpbm5pbmcgYW5kIGdldF91c2VyX3BhZ2VzIGxvb3BzIGluIF9fZ3VwX3Rlc3RfaW9jdGwoKSAobW0vZ3VwX3Rlc3QuYykuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIGlvY3RscyBvbiAvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nIGZvciBib3VuZGFyeSBjb25kaXRpb24gaGFuZGxpbmcgYW5kIHBvdGVudGlhbCByZWdyZXNzaW9ucyBpbiBwYWdlIHJhbmdlIGhhbmRsaW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyNDowMS4zMTIxNTIxNTlaIiwiU2VxIjoyMywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwOTMyMDU4MjQwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjAxLjMxMjcxMTk4WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTA5MzIwMDE4NjM5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBtbS9ndXBfdGVzdC5jIHRvIGFkZCBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAoY2hlY2tpbmcgdGhhdCBndXAtXFx1MDAzZXNpemUgaXMgbm9uLXplcm8gYW5kIFBBR0VfQUxJR05FRCwgYW5kIHRoYXQgZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcXG5cXG5UaGUgaXNzdWVzIGFkZHJlc3NlZCBieSB0aGlzIHBhdGNoIGFyZSBpbmZpbml0ZSBsb29wcyAod2hlbiBucl9wYWdlc19wZXJfY2FsbCBpcyAwKSBhbmQgb3V0LW9mLWJvdW5kcyBidWZmZXIgaW5kZXhpbmcgb24gdGhlIGBwYWdlc2AgYXJyYXkgKHdoZW4gZ3VwLVxcdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXFxuXFxuQWxsIGJ1ZmZlcnMgaW52b2x2ZWQgKHRoZSBzdGFjay1hbGxvY2F0ZWQgc3RydWN0IGd1cF90ZXN0IGFuZCB0aGUgaGVhcC1hbGxvY2F0ZWQgcGFnZXMgYXJyYXkpIGFyZSBmdWxseSBpbml0aWFsaXplZCB2aWEgY29weV9mcm9tX3VzZXIoKSBhbmQga3ZjYWxsb2MoKS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBzdHJ1Y3QgcGFkZGluZyBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoaXMgY2hhbmdlLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDRiYjVmZDI0M2NjZDZlZDUwNmIzZDNmYzY5MzkyZTk3YWY3MTFlM2JcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIFNlcCAxNSAxMjoyMTozOSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2d1cF90ZXN0LmMgYi9tbS9ndXBfdGVzdC5jXG5pbmRleCAxODViYTNiYjhlZDEwLi5iYTc0YmYzZjQxMDQ4IDEwMDY0NFxuLS0tIGEvbW0vZ3VwX3Rlc3QuY1xuKysrIGIvbW0vZ3VwX3Rlc3QuY1xuQEAgLTExNiw3ICsxMTYsOCBAQCBzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbiBcdGJvb2wgbmVlZHNfbW1hcF9sb2NrID1cbiBcdFx0Y21kICE9IEdVUF9GQVNUX0JFTkNITUFSSyBcdTAwMjZcdTAwMjYgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSztcbiBcbi1cdGlmIChndXAtXHUwMDNlYWRkciBcdTAwM2UgVUxPTkdfTUFYIHx8IGd1cC1cdTAwM2VzaXplIFx1MDAzZSBVTE9OR19NQVgpXG4rXHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYIHx8ICFndXAtXHUwMDNlc2l6ZSB8fFxuK1x0ICAgICFndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgfHwgIVBBR0VfQUxJR05FRChndXAtXHUwMDNlc2l6ZSkpXG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0aWYgKGNoZWNrX2FkZF9vdmVyZmxvdygodW5zaWduZWQgbG9uZylndXAtXHUwMDNlYWRkcixcbiBcdFx0XHQgICAgICAgKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZXNpemUsIFx1MDAyNmVuZCkpXG5AQCAtMTM5LDExICsxNDAsOSBAQCBzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbiBcdFx0aWYgKG5yICE9IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbClcbiBcdFx0XHRicmVhaztcbiBcbitcdFx0bnIgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBuciwgKGVuZCAtIGFkZHIpIC8gUEFHRV9TSVpFKTtcbitcbiBcdFx0bmV4dCA9IGFkZHIgKyBuciAqIFBBR0VfU0laRTtcbi1cdFx0aWYgKG5leHQgXHUwMDNlIGVuZCkge1xuLVx0XHRcdG5leHQgPSBlbmQ7XG4tXHRcdFx0bnIgPSAobmV4dCAtIGFkZHIpIC8gUEFHRV9TSVpFO1xuLVx0XHR9XG4gXG4gXHRcdHN3aXRjaCAoY21kKSB7XG4gXHRcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjQ6MDEuMzEyNzEzMDQ5WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjk1NjU1NzYzODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgc2l0dWF0aW9uOlxuXG4qKktNU0FOIEZ1enppbmcgU2Vzc2lvbiBBc3Nlc3NtZW50KipcblxuT2theSwgc28gdGhlIHRhc2sgYXQgaGFuZCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBuZWNlc3NpdGF0ZXMgaXRzIG93biwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gTXkgZmlyc3QgaW5zdGluY3QsIGFzIGFsd2F5cywgaXMgdG8gZGl2ZSBpbnRvIHRoZSBjb2RlLiBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgcGF0Y2gncyBpbXBhY3QuIFNwZWNpZmljYWxseSwgSSdsbCBzdGFydCBieSBpbnNwZWN0aW5nIHRoZSBwYXRjaCBpdHNlbGYsIGFuZCB0aGVuIEknbGwgdHVybiBteSBhdHRlbnRpb24gdG8gYG1tL2d1cF90ZXN0LmNgIOKAkyB0aGF0IHNlZW1zIGxpa2UgYSBsaWtlbHkgYXJlYSB0byBmaW5kIHJlbGF0ZWQgY29kZSBvciBjb250ZXh0LCBlc3BlY2lhbGx5IGdpdmVuIHRoZSBcImd1cFwiIGluIHRoZSBmaWxlIG5hbWUsIHN1Z2dlc3RpbmcgaW50ZXJhY3Rpb25zIHdpdGggR2V0IFVzZXIgUGFnZXMuXG5cblRvIGV4cGVkaXRlIHRoaXMsIEknbGwgdXNlIGEgYHJlYWQtZmlsZWAgY29tbWFuZCwgemVyb2luZyBpbiBvbiB0aGUgcmVsZXZhbnQgc2VjdGlvbiBvZiBgbW0vZ3VwX3Rlc3QuY2Ag4oCTIEknbGwgc3RhcnQgYXJvdW5kIGxpbmUgMTE2LiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgZ29vZCBpbml0aWFsIHZpZXcgb2YgdGhlIGNvZGUgc3Vycm91bmRpbmcgdGhlIHBhdGNoJ3Mgc2NvcGUuIEknbSBsb29raW5nIGZvciBhbnl0aGluZyB0aGF0IHNjcmVhbXMgXCJtZW1vcnkgc2FmZXR5LFwiIHBvdGVudGlhbGx5IG5ldyBhbGxvY2F0aW9uIHNjaGVtZXMsIGNoYW5nZWQgcG9pbnRlciBhcml0aG1ldGljLCBvciBhbnkgY2hhbmdlcyB0byBob3cgdGhlIGtlcm5lbCBpbnRlcmFjdHMgd2l0aCB1c2VyLXNwYWNlIG1lbW9yeSDigJMgYWxsIHJlZCBmbGFncyB0aGF0IHdvdWxkIHB1c2ggbWUgdG93YXJkIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24uIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhhdCBhIGNhcmVmdWwgYXNzZXNzbWVudCBvZiB0aGlzIGNvZGUgaXMgdGhlIGtleSB0byBhbiBpbmZvcm1lZCBkZWNpc2lvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI5NiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY3LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjQ6MTAuODc4MjkyOTQxWiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNDMxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9ndXBfdGVzdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDkwLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA5MDpcXHRcXHRcXHRcXHRndXAtXFx1MDAzZXdoaWNoX3BhZ2VzW2ldID0gMDtcXG4gIDkxOlxcdFxcdFxcdH1cXG4gIDkyOlxcdFxcdH1cXG4gIDkzOlxcdFxcbiAgOTQ6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpKyspIHtcXG4gIDk1OlxcdFxcdFxcdGluZGV4X3RvX2R1bXAgPSBndXAtXFx1MDAzZXdoaWNoX3BhZ2VzW2ldO1xcbiAgOTY6XFx0XFxuICA5NzpcXHRcXHRcXHRpZiAoaW5kZXhfdG9fZHVtcCkge1xcbiAgOTg6XFx0XFx0XFx0XFx0aW5kZXhfdG9fZHVtcC0tOyAvLyBEZWNvZGUgZnJvbSAxLWJhc2VkLCB0byAwLWJhc2VkXFxuICA5OTpcXHRcXHRcXHRcXHRwcl9pbmZvKFxcXCItLS0tIHBhZ2UgIyV1LCBzdGFydGluZyBmcm9tIHVzZXIgdmlydCBhZGRyOiAweCVsbHhcXFxcblxcXCIsXFxuIDEwMDpcXHRcXHRcXHRcXHRcXHRpbmRleF90b19kdW1wLCBndXAtXFx1MDAzZWFkZHIpO1xcbiAxMDE6XFx0XFx0XFx0XFx0ZHVtcF9wYWdlKHBhZ2VzW2luZGV4X3RvX2R1bXBdLFxcbiAxMDI6XFx0XFx0XFx0XFx0XFx0ICBcXFwiZ3VwX3Rlc3Q6IGR1bXBfcGFnZXMoKSB0ZXN0XFxcIik7XFxuIDEwMzpcXHRcXHRcXHR9XFxuIDEwNDpcXHRcXHR9XFxuIDEwNTpcXHR9XFxuIDEwNjpcXHRcXG4gMTA3OlxcdHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxcbiAxMDg6XFx0XFx0XFx0c3RydWN0IGd1cF90ZXN0ICpndXApXFxuIDEwOTpcXHR7XFxuIDExMDpcXHRcXHRrdGltZV90IHN0YXJ0X3RpbWUsIGVuZF90aW1lO1xcbiAxMTE6XFx0XFx0dW5zaWduZWQgbG9uZyBpLCBucl9wYWdlcywgYWRkciwgbmV4dDtcXG4gMTEyOlxcdFxcdGxvbmcgbnI7XFxuIDExMzpcXHRcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzO1xcbiAxMTQ6XFx0XFx0dW5zaWduZWQgbG9uZyBlbmQ7XFxuIDExNTpcXHRcXHRpbnQgcmV0ID0gMDtcXG4gMTE2OlxcdFxcdGJvb2wgbmVlZHNfbW1hcF9sb2NrID1cXG4gMTE3OlxcdFxcdFxcdGNtZCAhPSBHVVBfRkFTVF9CRU5DSE1BUksgXFx1MDAyNlxcdTAwMjYgY21kICE9IFBJTl9GQVNUX0JFTkNITUFSSztcXG4gMTE4OlxcdFxcbiAxMTk6XFx0XFx0aWYgKGd1cC1cXHUwMDNlYWRkciBcXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXFx1MDAzZXNpemUgXFx1MDAzZSBVTE9OR19NQVggfHwgIWd1cC1cXHUwMDNlc2l6ZSB8fFxcbiAxMjA6XFx0XFx0ICAgICFndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsIHx8ICFQQUdFX0FMSUdORUQoZ3VwLVxcdTAwM2VzaXplKSlcXG4gMTIxOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAxMjI6XFx0XFx0aWYgKGNoZWNrX2FkZF9vdmVyZmxvdygodW5zaWduZWQgbG9uZylndXAtXFx1MDAzZWFkZHIsXFxuIDEyMzpcXHRcXHRcXHRcXHQgICAgICAgKHVuc2lnbmVkIGxvbmcpZ3VwLVxcdTAwM2VzaXplLCBcXHUwMDI2ZW5kKSlcXG4gMTI0OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAxMjU6XFx0XFxuIDEyNjpcXHRcXHRucl9wYWdlcyA9IGd1cC1cXHUwMDNlc2l6ZSAvIFBBR0VfU0laRTtcXG4gMTI3OlxcdFxcdHBhZ2VzID0ga3ZjYWxsb2MobnJfcGFnZXMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcXG4gMTI4OlxcdFxcdGlmICghcGFnZXMpXFxuIDEyOTpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gMTMwOlxcdFxcbiAxMzE6XFx0XFx0aWYgKG5lZWRzX21tYXBfbG9jayBcXHUwMDI2XFx1MDAyNiBtbWFwX3JlYWRfbG9ja19raWxsYWJsZShjdXJyZW50LVxcdTAwM2VtbSkpIHtcXG4gMTMyOlxcdFxcdFxcdHJldCA9IC1FSU5UUjtcXG4gMTMzOlxcdFxcdFxcdGdvdG8gZnJlZV9wYWdlcztcXG4gMTM0OlxcdFxcdH1cXG4gMTM1OlxcdFxcbiAxMzY6XFx0XFx0aSA9IDA7XFxuIDEzNzpcXHRcXHRuciA9IGd1cC1cXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGw7XFxuIDEzODpcXHRcXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDEzOTpcXHRcXHRmb3IgKGFkZHIgPSBndXAtXFx1MDAzZWFkZHI7IGFkZHIgXFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XFxuIDE0MDpcXHRcXHRcXHRpZiAobnIgIT0gZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbClcXG4gMTQxOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNDI6XFx0XFxuIDE0MzpcXHRcXHRcXHRuciA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG5yLCAoZW5kIC0gYWRkcikgLyBQQUdFX1NJWkUpO1xcbiAxNDQ6XFx0XFxuIDE0NTpcXHRcXHRcXHRuZXh0ID0gYWRkciArIG5yICogUEFHRV9TSVpFO1xcbiAxNDY6XFx0XFxuIDE0NzpcXHRcXHRcXHRzd2l0Y2ggKGNtZCkge1xcbiAxNDg6XFx0XFx0XFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XFxuIDE0OTpcXHRcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNTA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0IHBhZ2VzICsgaSk7XFxuIDE1MTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTUyOlxcdFxcdFxcdGNhc2UgR1VQX0JBU0lDX1RFU1Q6XFxuIDE1MzpcXHRcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncywgcGFnZXMgKyBpKTtcXG4gMTU0OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNTU6XFx0XFx0XFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XFxuIDE1NjpcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNTc6XFx0XFx0XFx0XFx0XFx0XFx0XFx0IHBhZ2VzICsgaSk7XFxuIDE1ODpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTU5OlxcdFxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuIDE2MDpcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncywgcGFnZXMgKyBpKTtcXG4gMTYxOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNjI6XFx0XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAxNjM6XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBucixcXG4gMTY0OlxcdFxcdFxcdFxcdFxcdFxcdCAgICBndXAtXFx1MDAzZWd1cF9mbGFncyB8IEZPTExfTE9OR1RFUk0sXFxuIDE2NTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4gMTY2OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNjc6XFx0XFx0XFx0Y2FzZSBEVU1QX1VTRVJfUEFHRVNfVEVTVDpcXG4gMTY4OlxcdFxcdFxcdFxcdGlmIChndXAtXFx1MDAzZXRlc3RfZmxhZ3MgXFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTilcXG4gMTY5OlxcdFxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNzA6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE3MTpcXHRcXHRcXHRcXHRlbHNlXFxuIDE3MjpcXHRcXHRcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTczOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNzQ6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE3NTpcXHRcXHRcXHRkZWZhdWx0OlxcbiAxNzY6XFx0XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4gMTc3OlxcdFxcdFxcdFxcdGdvdG8gdW5sb2NrO1xcbiAxNzg6XFx0XFx0XFx0fVxcbiAxNzk6XFx0XFxuIDE4MDpcXHRcXHRcXHRpZiAobnIgXFx1MDAzYz0gMClcXG4gMTgxOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxODI6XFx0XFx0XFx0aSArPSBucjtcXG4gMTgzOlxcdFxcdH1cXG4gMTg0OlxcdFxcdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDE4NTpcXHRcXG4gMTg2OlxcdFxcdC8qIFNoaWZ0aW5nIHRoZSBtZWFuaW5nIG9mIG5yX3BhZ2VzOiBub3cgaXQgaXMgYWN0dWFsIG51bWJlciBwaW5uZWQ6ICovXFxuIDE4NzpcXHRcXHRucl9wYWdlcyA9IGk7XFxuIDE4ODpcXHRcXG4gMTg5OlxcdFxcdGd1cC1cXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjEwLjg3ODQzNzExMVoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxNDU0OTY1NDg3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBpZiB0aGV5J3JlIG15IG93bjpcblxuKipEaXZpbmcgaW50byBndXBfdGVzdC5jIGZvciBEZWVwZXIgVW5kZXJzdGFuZGluZyoqXG5cblJpZ2h0LCBsZXQncyBzZWUuLi4gSSBuZWVkIHRvIGdldCBhIGJldHRlciBoYW5kbGUgb24gaG93IHRoaXMgYGd1cF90ZXN0YCBpb2N0bCBhY3R1YWxseSBmdW5jdGlvbnMuIEknbSBnb2luZyB0byBkaWcgZGVlcGVyIGludG8gdGhlIGNvZGUgd2l0aGluIGBtbS9ndXBfdGVzdC5jYC4gVGhlIGNvcmUgcXVlc3Rpb24gSSdtIHRyeWluZyB0byBhbnN3ZXIgaXMgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIGBndXBgIGZ1bmN0aW9uYWxpdHksIGFuZCBzcGVjaWZpY2FsbHksIHdoYXTigJlzIGdvaW5nIG9uIHdpdGggdGhlc2UgYHBhZ2VzYCB0aGV5J3JlIG1lbnRpb25pbmcuIEknbSBob3BpbmcgYnkgZm9sbG93aW5nIHRoZSBleGVjdXRpb24gcGF0aCwgSSBjYW4gdW5jb3ZlciB0aGUgZGV0YWlscyBvZiBtZW1vcnkgbWFuYWdlbWVudCBhbmQgdGhlIG1lY2hhbmljcyBiZWhpbmQgYGd1cF90ZXN0YC4gSSBleHBlY3QgdG8gZmluZCBzb21lIGludGVyZXN0aW5nIGNhc2VzIHdoZXJlIGBndXBgIGlzIGJlaW5nIHRlc3RlZCB3aXRoIHNvbWUgY29tcGxleCBwYWdlIG1hcHBpbmdzIGFuZCBzY2VuYXJpb3MuIEl0J3MgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQyNDQsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjI1LjQyODA5NTIxNloiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NDMzMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9ndXBfdGVzdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5MCxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE5MDpcXHRcXHRndXAtXFx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcXG4gMTkxOlxcdFxcbiAxOTI6XFx0XFx0LypcXG4gMTkzOlxcdFxcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxcbiAxOTQ6XFx0XFx0ICogc3RhdGU6IHByaW50IGEgd2FybmluZyBpZiBhbnkgbm9uLWRtYS1waW5uZWQgcGFnZXMgYXJlIGZvdW5kOlxcbiAxOTU6XFx0XFx0ICovXFxuIDE5NjpcXHRcXHR2ZXJpZnlfZG1hX3Bpbm5lZChjbWQsIHBhZ2VzLCBucl9wYWdlcyk7XFxuIDE5NzpcXHRcXG4gMTk4OlxcdFxcdGlmIChjbWQgPT0gRFVNUF9VU0VSX1BBR0VTX1RFU1QpXFxuIDE5OTpcXHRcXHRcXHRkdW1wX3BhZ2VzX3Rlc3QoZ3VwLCBwYWdlcywgbnJfcGFnZXMpO1xcbiAyMDA6XFx0XFxuIDIwMTpcXHRcXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDIwMjpcXHRcXG4gMjAzOlxcdFxcdHB1dF9iYWNrX3BhZ2VzKGNtZCwgcGFnZXMsIG5yX3BhZ2VzLCBndXAtXFx1MDAzZXRlc3RfZmxhZ3MpO1xcbiAyMDQ6XFx0XFxuIDIwNTpcXHRcXHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xcbiAyMDY6XFx0XFx0Z3VwLVxcdTAwM2VwdXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcXG4gMjA3OlxcdFxcbiAyMDg6XFx0dW5sb2NrOlxcbiAyMDk6XFx0XFx0aWYgKG5lZWRzX21tYXBfbG9jaylcXG4gMjEwOlxcdFxcdFxcdG1tYXBfcmVhZF91bmxvY2soY3VycmVudC1cXHUwMDNlbW0pO1xcbiAyMTE6XFx0ZnJlZV9wYWdlczpcXG4gMjEyOlxcdFxcdGt2ZnJlZShwYWdlcyk7XFxuIDIxMzpcXHRcXHRyZXR1cm4gcmV0O1xcbiAyMTQ6XFx0fVxcbiAyMTU6XFx0XFxuIDIxNjpcXHRzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcXG4gMjE3OlxcdHtcXG4gMjE4OlxcdFxcdGlmIChkYXRhLVxcdTAwM2Vsb25ndGVybV9wYWdlcykge1xcbiAyMTk6XFx0XFx0XFx0aWYgKGRhdGEtXFx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzKVxcbiAyMjA6XFx0XFx0XFx0XFx0dW5waW5fdXNlcl9wYWdlcyhkYXRhLVxcdTAwM2Vsb25ndGVybV9wYWdlcyxcXG4gMjIxOlxcdFxcdFxcdFxcdFxcdFxcdCBkYXRhLVxcdTAwM2Vsb25ndGVybV9ucl9wYWdlcyk7XFxuIDIyMjpcXHRcXHRcXHRrdmZyZWUoZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMpO1xcbiAyMjM6XFx0XFx0XFx0ZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMgPSBOVUxMO1xcbiAyMjQ6XFx0XFx0XFx0ZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgPSAwO1xcbiAyMjU6XFx0XFx0fVxcbiAyMjY6XFx0fVxcbiAyMjc6XFx0XFxuIDIyODpcXHRzdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdGFydChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcXG4gMjI5OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAyMzA6XFx0e1xcbiAyMzE6XFx0XFx0bG9uZyBucl9wYWdlcywgY3VyX3BhZ2VzLCBhZGRyLCByZW1haW5pbmdfcGFnZXM7XFxuIDIzMjpcXHRcXHRpbnQgZ3VwX2ZsYWdzID0gRk9MTF9MT05HVEVSTTtcXG4gMjMzOlxcdFxcdHN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdCBhcmdzO1xcbiAyMzQ6XFx0XFx0c3RydWN0IHBhZ2UgKipwYWdlcztcXG4gMjM1OlxcdFxcdGludCByZXQgPSAwO1xcbiAyMzY6XFx0XFx0Ym9vbCBmYXN0O1xcbiAyMzc6XFx0XFxuIDIzODpcXHRcXHRpZiAoZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMpXFxuIDIzOTpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMjQwOlxcdFxcbiAyNDE6XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZhcmdzLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihhcmdzKSkpXFxuIDI0MjpcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gMjQzOlxcdFxcbiAyNDQ6XFx0XFx0aWYgKGFyZ3MuZmxhZ3MgXFx1MDAyNlxcbiAyNDU6XFx0XFx0ICAgIH4oUElOX0xPTkdURVJNX1RFU1RfRkxBR19VU0VfV1JJVEV8UElOX0xPTkdURVJNX1RFU1RfRkxBR19VU0VfRkFTVCkpXFxuIDI0NjpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMjQ3OlxcdFxcdGlmICghSVNfQUxJR05FRChhcmdzLmFkZHIgfCBhcmdzLnNpemUsIFBBR0VfU0laRSkpXFxuIDI0ODpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMjQ5OlxcdFxcdGlmIChhcmdzLnNpemUgXFx1MDAzZSBMT05HX01BWClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjQ6MjUuNDI4MTkyMTM2WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMyODMyODk3MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgaXQ6XG5cbioqSW52ZXN0aWdhdGluZyBgX19ndXBfdGVzdF9pb2N0bGAqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB0aGUgY2FsbGVyIG9mIGBfX2d1cF90ZXN0X2lvY3RsYC4gSSBrbm93IHRoYXQgbmFtZSBpcyBmYW1pbGlhciwgYnV0IEkgbmVlZCB0byBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5IG9mIHdoZXJlIGl0J3MgdXNlZC4gU2luY2UgSSdtIHdvcmtpbmcgaW4gdGhlIGtlcm5lbCwgYSBgZ3JlcGAgc2hvdWxkIGJlIHRoZSBxdWlja2VzdCB3YXkgdG8gZmluZCBpdC4gQWx0ZXJuYXRpdmVseSwgSSBzaG91bGQgYmUgYWJsZSB0byBqdXN0IGxvb2sgYXJvdW5kIGxpbmUgMjcwLCBpZiBJIGtub3cgd2hlcmUgdGhhdCBpcyBpbiB0aGUgY29kZS4gSSdtIHByb2JhYmx5IGFmdGVyIHdoZXJlIHRoaXMgY2FsbCBpcyBtYWRlLCBhbmQgd2hhdCBjb2RlIHBhdGggbGVhZHMgdG8gdGhhdCBwb2ludC4gVGhpcyB3aWxsIGdpdmUgbWUgYW4gdW5kZXJzdGFuZGluZyBvZiBpdHMgcHVycG9zZSBhbmQgdXNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDIzLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyNDoyOC43MTE0ODUwNThaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIzNjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjcwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjcwOlxcdFxcbiAyNzE6XFx0XFx0d2hpbGUgKG5yX3BhZ2VzIC0gZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMpIHtcXG4gMjcyOlxcdFxcdFxcdHJlbWFpbmluZ19wYWdlcyA9IG5yX3BhZ2VzIC0gZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXM7XFxuIDI3MzpcXHRcXHRcXHRhZGRyID0gYXJncy5hZGRyICsgZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgKiBQQUdFX1NJWkU7XFxuIDI3NDpcXHRcXG4gMjc1OlxcdFxcdFxcdGlmIChmYXN0KVxcbiAyNzY6XFx0XFx0XFx0XFx0Y3VyX3BhZ2VzID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCByZW1haW5pbmdfcGFnZXMsXFxuIDI3NzpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRndXBfZmxhZ3MsIHBhZ2VzKTtcXG4gMjc4OlxcdFxcdFxcdGVsc2VcXG4gMjc5OlxcdFxcdFxcdFxcdGN1cl9wYWdlcyA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIHJlbWFpbmluZ19wYWdlcyxcXG4gMjgwOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGd1cF9mbGFncywgcGFnZXMpO1xcbiAyODE6XFx0XFx0XFx0aWYgKGN1cl9wYWdlcyBcXHUwMDNjIDApIHtcXG4gMjgyOlxcdFxcdFxcdFxcdHBpbl9sb25ndGVybV90ZXN0X3N0b3AoZGF0YSk7XFxuIDI4MzpcXHRcXHRcXHRcXHRyZXQgPSBjdXJfcGFnZXM7XFxuIDI4NDpcXHRcXHRcXHRcXHRicmVhaztcXG4gMjg1OlxcdFxcdFxcdH1cXG4gMjg2OlxcdFxcdFxcdGRhdGEtXFx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzICs9IGN1cl9wYWdlcztcXG4gMjg3OlxcdFxcdFxcdHBhZ2VzICs9IGN1cl9wYWdlcztcXG4gMjg4OlxcdFxcdH1cXG4gMjg5OlxcdFxcbiAyOTA6XFx0XFx0aWYgKCFmYXN0KVxcbiAyOTE6XFx0XFx0XFx0bW1hcF9yZWFkX3VubG9jayhjdXJyZW50LVxcdTAwM2VtbSk7XFxuIDI5MjpcXHRcXHRyZXR1cm4gcmV0O1xcbiAyOTM6XFx0fVxcbiAyOTQ6XFx0XFxuIDI5NTpcXHRzdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9yZWFkKHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhLFxcbiAyOTY6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhcmcpXFxuIDI5NzpcXHR7XFxuIDI5ODpcXHRcXHRfX3U2NCB1c2VyX2FkZHI7XFxuIDI5OTpcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuIDMwMDpcXHRcXG4gMzAxOlxcdFxcdGlmICghZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMpXFxuIDMwMjpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzAzOlxcdFxcbiAzMDQ6XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZ1c2VyX2FkZHIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHVzZXJfYWRkcikpKVxcbiAzMDU6XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIDMwNjpcXHRcXG4gMzA3OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBkYXRhLVxcdTAwM2Vsb25ndGVybV9ucl9wYWdlczsgaSsrKSB7XFxuIDMwODpcXHRcXHRcXHR2b2lkICphZGRyID0ga21hcF9sb2NhbF9wYWdlKGRhdGEtXFx1MDAzZWxvbmd0ZXJtX3BhZ2VzW2ldKTtcXG4gMzA5OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgcmV0O1xcbiAzMTA6XFx0XFxuIDMxMTpcXHRcXHRcXHRyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpdXNlcl9hZGRyLCBhZGRyLFxcbiAzMTI6XFx0XFx0XFx0XFx0XFx0ICAgUEFHRV9TSVpFKTtcXG4gMzEzOlxcdFxcdFxcdGt1bm1hcF9sb2NhbChhZGRyKTtcXG4gMzE0OlxcdFxcdFxcdGlmIChyZXQpXFxuIDMxNTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gMzE2OlxcdFxcdFxcdHVzZXJfYWRkciArPSBQQUdFX1NJWkU7XFxuIDMxNzpcXHRcXHR9XFxuIDMxODpcXHRcXHRyZXR1cm4gMDtcXG4gMzE5OlxcdH1cXG4gMzIwOlxcdFxcbiAzMjE6XFx0c3RhdGljIGxvbmcgcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxcbiAzMjI6XFx0XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzMjM6XFx0e1xcbiAzMjQ6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlcC1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbiAzMjU6XFx0XFx0aW50IHJldCA9IC1FSU5WQUw7XFxuIDMyNjpcXHRcXG4gMzI3OlxcdFxcdGlmIChtdXRleF9sb2NrX2tpbGxhYmxlKFxcdTAwMjZkYXRhLVxcdTAwM2Vsb25ndGVybV9tdXRleCkpXFxuIDMyODpcXHRcXHRcXHRyZXR1cm4gLUVJTlRSO1xcbiAzMjk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjI4LjcxMTYxMDk3OFoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjozOTUzMzIyNzQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgYSBzZWFzb25lZCBwcm9mZXNzaW9uYWwgaW4gdGhlIGZpZWxkLCBzcGVha2luZyBkaXJlY3RseSB0byB5b3U6XG5cbioqRGl2aW5nIERlZXBlciBpbnRvIGBndXBfdGVzdF9pb2N0bGAqKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIHRoaXMgYGd1cF90ZXN0X2lvY3RsYCBjb2RlLiBUaGUgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHVzdWFsbHkganVzdCB0aGUgdGlwIG9mIHRoZSBpY2ViZXJnLCBpc24ndCBpdD8gTXkgbWluZCBpbW1lZGlhdGVseSBzdGFydHMgcnVubmluZyB0aHJvdWdoIHRoZSBpbXBsaWNhdGlvbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24ncyBwdXJwb3NlIHdpdGhpbiB0aGUgbGFyZ2VyIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRleHQuIFdoYXQncyBpdCBkb2luZz8gV2hhdCdzIGl0ICppbnRlbmRlZCogdG8gZG8/IEknbSBhbHJlYWR5IGFudGljaXBhdGluZyB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdW5kZXJseWluZyBwYWdlIHRhYmxlcywgdGhlIHBvdGVudGlhbCBmb3IgbG9ja2luZyBpc3N1ZXMsIGFuZCB0aGUgd2F5cyB0aGlzIHRlc3QgbWlnaHQgdHJpZ2dlciBzcGVjaWZpYyBlZGdlIGNhc2VzIHdpdGhpbiB0aGUgR1VQIChHZXQgVXNlciBQYWdlKSBtZWNoYW5pc20uIFxuXG5JJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGFyZ3VtZW50cyBpdCB0YWtlcyBhbmQgaG93IHRoZXkgbWFwIHRvIHNwZWNpZmljIG1lbW9yeSByZWdpb25zLCBwcm90ZWN0aW9uIGZsYWdzLCBvciBlcnJvciBjb25kaXRpb25zLiBXaGF0IGFyZSB0aGUgY29tbW9uIGZhaWx1cmUgcGF0aHMsIGFuZCBtb3JlIGltcG9ydGFudGx5LCBob3cgYXJlIHRoZXkgYmVpbmcgaGFuZGxlZD8gRXJyb3IgaGFuZGxpbmcgaXMgY3JpdGljYWwsIHNvIEknbGwgYmUgbG9va2luZyBjbG9zZWx5IGF0IGhvdyBpdCBkZWFscyB3aXRoIGludmFsaWQgbWVtb3J5IGFkZHJlc3NlcywgcGVybWlzc2lvbnMgaXNzdWVzLCBhbmQgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGlzIHVzZWQgd2l0aGluIHRoZSBzeXN0ZW0gYW5kIHdoYXQgaXQgaGVscHMgdmFsaWRhdGUuIEkgd2lsbCBhbHNvIG1ha2Ugc29tZSBub3RlcyBvZiB3aGF0IHRvIGxvb2sgZm9yIGF0IG90aGVyIGxvY2F0aW9ucyBpbiB0aGUgc291cmNlLCB3aGVyZSBpdCBtaWdodCBiZSBjYWxsZWQgZnJvbSBhbmQgdGhlIGNvbnRleHRzIHRoZSBkYXRhIGZsb3dzLlxuXG5NeSBmb2N1cyBuYXJyb3dzLiBPa2F5LCBub3cgbGV0J3MgcHVsbCB1cCB0aGUgYWN0dWFsIHNvdXJjZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NjUwNCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjQ6MzIuNjY0OTM1ODUzWiIsIlNlcSI6MzIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgxOTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzMwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzMwOlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDMzMTpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzMzI6XFx0XFx0XFx0cmV0ID0gcGluX2xvbmd0ZXJtX3Rlc3Rfc3RhcnQoZGF0YSwgYXJnKTtcXG4gMzMzOlxcdFxcdFxcdGJyZWFrO1xcbiAzMzQ6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzMzU6XFx0XFx0XFx0cGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChkYXRhKTtcXG4gMzM2OlxcdFxcdFxcdHJldCA9IDA7XFxuIDMzNzpcXHRcXHRcXHRicmVhaztcXG4gMzM4OlxcdFxcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcXG4gMzM5OlxcdFxcdFxcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoZGF0YSwgYXJnKTtcXG4gMzQwOlxcdFxcdFxcdGJyZWFrO1xcbiAzNDE6XFx0XFx0fVxcbiAzNDI6XFx0XFxuIDM0MzpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmRhdGEtXFx1MDAzZWxvbmd0ZXJtX211dGV4KTtcXG4gMzQ0OlxcdFxcdHJldHVybiByZXQ7XFxuIDM0NTpcXHR9XFxuIDM0NjpcXHRcXG4gMzQ3OlxcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG4gMzQ4OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzNDk6XFx0e1xcbiAzNTA6XFx0XFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcXG4gMzUxOlxcdFxcdGludCByZXQ7XFxuIDM1MjpcXHRcXG4gMzUzOlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDM1NDpcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMzU1OlxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAzNTY6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAzNTc6XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMzU4OlxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuIDM1OTpcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAzNjA6XFx0XFx0XFx0YnJlYWs7XFxuIDM2MTpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzNjI6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzNjM6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEOlxcbiAzNjQ6XFx0XFx0XFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XFxuIDM2NTpcXHRcXHRkZWZhdWx0OlxcbiAzNjY6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDM2NzpcXHRcXHR9XFxuIDM2ODpcXHRcXG4gMzY5OlxcdFxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcXG4gMzcwOlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzE6XFx0XFxuIDM3MjpcXHRcXHRyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgXFx1MDAyNmd1cCk7XFxuIDM3MzpcXHRcXHRpZiAocmV0KVxcbiAzNzQ6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMzc1OlxcdFxcbiAzNzY6XFx0XFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFxcdTAwMjZndXAsIHNpemVvZihndXApKSlcXG4gMzc3OlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzg6XFx0XFxuIDM3OTpcXHRcXHRyZXR1cm4gMDtcXG4gMzgwOlxcdH1cXG4gMzgxOlxcdFxcbiAzODI6XFx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbiAzODM6XFx0e1xcbiAzODQ6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XFxuIDM4NTpcXHRcXHRpbnQgcmV0O1xcbiAzODY6XFx0XFxuIDM4NzpcXHRcXHRkYXRhID0ga3phbGxvY19vYmooKmRhdGEpO1xcbiAzODg6XFx0XFx0aWYgKCFkYXRhKVxcbiAzODk6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI0OjMyLjY2NTAyNDQ0M1oiLCJTZXEiOjMzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjozMzgwMTk5NzkxNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEdVUCBUZXN0IElPQ1RMIFBhdGNoKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgZG93biB0aGlzIGBndXBfdGVzdC5jYCBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBleGVjdXRpb24gZmxvdyBhbmQgcGlucG9pbnQgdGhlIHBvdGVudGlhbCBpc3N1ZXMgdGhhdCB0aGlzIGZpeCBhZGRyZXNzZXMuIEZpcnN0LCBJJ20gY2hlY2tpbmcgdGhlIGNvbmRpdGlvbnMgdGhhdCBhcmUgbm93IGFkZGVkOiBgZ3VwLVx1MDAzZXNpemVgIG11c3QgYmUgbm9uLXplcm8sIGAhZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsYCBtdXN0IGJlIG5vbi16ZXJvLCBhbmQgYGd1cC1cdTAwM2VzaXplYCBtdXN0IGJlIHBhZ2UgYWxpZ25lZC4gUHJldmlvdXNseSwgb25seSBgZ3VwLVx1MDAzZWFkZHJgIGFuZCBgZ3VwLVx1MDAzZXNpemVgIHdlcmUgY2hlY2tlZCB0byBiZSB3aXRoaW4gdGhlIGBVTE9OR19NQVhgIGxpbWl0LlxuXG5Ob3cgSSdtIGZvY3VzaW5nIG9uIHRoZSBjb3JlIGxvb3AgbG9naWMuIFRoZSBvcmlnaW5hbCBjb2RlIGhhcyB0aGUgbG9vcCBgZm9yIChhZGRyID0gZ3VwLVx1MDAzZWFkZHI7IGFkZHIgXHUwMDNjIGVuZDsgYWRkciA9IG5leHQpYC4gSW5zaWRlIHRoZSBsb29wLCBgbnJgIHN0YXJ0cyB3aXRoIHRoZSBgZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsYC4gVGhlIGNyaXRpY2FsIHBhcnQgc2VlbXMgdG8gYmUgaG93IGBuZXh0YCBhbmQgYG5yYCBhcmUgdXBkYXRlZCwgZXNwZWNpYWxseSBjb25zaWRlcmluZyB0aGUgaW50ZXJhY3Rpb24gd2l0aCBgZ2V0X3VzZXJfcGFnZXMoKWAuXG5cbkkgY2FuIHNlZSBhIHBvdGVudGlhbCBwcm9ibGVtIGlmIGBndXAtXHUwMDNlc2l6ZWAgaXNuJ3QgcGFnZS1hbGlnbmVkLiBGb3IgaW5zdGFuY2UsIGlmIGBndXAtXHUwMDNlc2l6ZWAgaXMgMSwgYG5yX3BhZ2VzYCBiZWNvbWVzIDAuIFRoZSBga3ZjYWxsb2NgIGFsbG9jYXRlcyB6ZXJvIHBhZ2VzLCBhbmQgYGVuZGAgYmVjb21lcyBgYWRkciArIDFgLiBJZiBgZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsIFx1MDAzZT0gMWAgdGhlbiBgbmV4dCA9IGFkZHIgKyBuciAqIFBBR0VfU0laRWAsIGlmIGBuZXh0IFx1MDAzZSBlbmRgIHdlIHNldCBgbmV4dGAgdG8gYGVuZGAsIGFuZCBjYWxjdWxhdGUgYG5yID0gMGAuIFNvLCBpZiBgbnJgIHN0YXJ0cyBhdCAxLCBgZ2V0X3VzZXJfcGFnZXMoKWAgbWlnaHQgZ2V0IGNhbGxlZCB3aXRoIGBuciA9IDBgLiAgVGhpcyBzZWVtcyBiZW5pZ24sIGJ1dCBpdCBsb29rcyBsaWtlIHdlJ3JlIHBhc3NpbmcgaW4gYW4gaW52YWxpZCBgcGFnZXNgIGFycmF5LCBhbmQgcG90ZW50aWFsbHkgaW4gbGF0ZXIgaXRlcmF0aW9ucyB0aGlzIG1pZ2h0IHJlc3VsdCBpbiBtZW1vcnkgY29ycnVwdGlvbiBieSBwYXNzaW5nIHRoZSB3cm9uZyBwYWdlIHBvaW50ZXIuXG5cblRoZW4gSSBhbSB0aGlua2luZywgd2hhdCBpZiBgZ3VwLVx1MDAzZXNpemUgPT0gMGA/IFRoZSBsb29wIHdvbid0IHJ1bi4gVGhhdCBzZWVtcyBmaW5lLiBIb3dldmVyLCB3aGF0IGlmIGBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgPT0gMGA/IEluc2lkZSB0aGUgbG9vcCwgaWYgYG5yID09IDBgLCB0aGUgY29tcGFyaXNvbiBgbnIgIT0gZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsYCBiZWNvbWVzIGBmYWxzZWAuIEkgY2FuIHNlZSB0aGF0IGBuZXh0YCBzdGF5cyBgYWRkcmAsIGFuZCBgZ2V0X3VzZXJfcGFnZXNgIGNhbGxlZCB3aXRoIGBuciA9IDBgLiBBbmQgYnJlYWtzIHRoZSBsb29wLCB0aGF0IHNlZW1zIGZpbmUuXG5cbk9rYXksIGxldCdzIHRyYWNlIHdpdGggYSBzbGlnaHRseSBtb3JlIGNvbXBsZXggZXhhbXBsZSBub3cuIElmIGBndXAtXHUwMDNlc2l6ZWAgaXMgNDA5NyAoYSBwYWdlIHBsdXMgMSBieXRlKSBhbmQgYGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbGAgaXMgMSwgdGhlIGNvZGUgY2FsY3VsYXRlcyBgbnJfcGFnZXMgPSAxYC4gIGBwYWdlc2AgYWxsb2NhdGVkIGNvcnJlY3RseSB3aXRoIHNpemUgMS4gSW4gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgd2l0aCB0aGUgb3JpZ2luYWwgY29kZSwgYG5leHRgIGJlY29tZXMgYGFkZHIgKyA0MDk2YC4gU2luY2UgYG5leHRgIGlzIG5vdCBncmVhdGVyIHRoYW4gYGVuZGAsIGBnZXRfdXNlcl9wYWdlc2AgZ2V0cyBjYWxsZWQgd2l0aCBgbnIgPSAxYC4gSW4gdGhlIHNlY29uZCBpdGVyYXRpb24sIGBhZGRyYCBiZWNvbWVzIGBhZGRyICsgNDA5NmAuIE5vdywgYGFkZHIgXHUwMDNjIGVuZGAsIHRoZSBsb29wIGNvbnRpbnVlcy4gYG5leHQgPSBhZGRyICsgNDA5NmAuIEhvd2V2ZXIsIHNpbmNlIGBuZXh0IFx1MDAzZSBlbmRgLCBgbmV4dCA9IGVuZGAsIGFuZCBgbnJgIGdldHMgc2V0IHRvIDAuIFNvLCBvbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgd2UgZW5kIHVwIGNhbGxpbmcgYGdldF91c2VyX3BhZ2VzKClgIHdpdGggYG5yID0gMGAgYnV0IGFjY2Vzc2luZyB0aGUgYHBhZ2VzYCBhcnJheSBhdCBpbmRleCBgMWAsIHNvIG91dCBvZiBib3VuZHMuXG5cbk5vdyB0aGUgbmV3IGNvZGUgd2l0aCBgbnIgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBuciwgKGVuZCAtIGFkZHIpIC8gUEFHRV9TSVpFKTtgLiBMZXQncyBzZWUgaG93IHRoYXQgY2hhbmdlIGhlbHBzIHRoZSBwcm9ibGVtLiBOb3csIGlmIHRoZSBgZ3VwLVx1MDAzZXNpemVgIGlzIG5vdCBwYWdlIGFsaWduZWQgYW5kIHdlIG9ubHkgaGF2ZSBvbmUgcGFnZSAoZS5nLiA0MDk3KSwgdGhlIG5ldyBjb2RlIG1ha2VzIHN1cmUgdGhhdCBvbiB0aGUgbGFzdCBpdGVyYXRpb24sIGl0IHVzZXMgYSBwYXJ0aWFsIHBhZ2UuIFRoZSBtb3N0IGltcG9ydGFudCBkaWZmZXJlbmNlIG5vdyBpcyB0aGF0IHdlIGFyZSBsaW1pdGluZyBgbnJgIHRvIHRoZSBzaXplIG9mIHRoZSByZW1haW5pbmcgcGFnZXMuXG5cblRoZSBvcmlnaW5hbCBjb2RlJ3MgbG9naWMgb2YgdXBkYXRpbmcgYG5yYCBsb29rcyB3cm9uZy4gSWYgdGhlIHJlbWFpbmluZyBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBwYWdlIHNpemUsIGl0IGNvdWxkIHJlc3VsdCBpbiBvdXQtb2YtYm91bmRzIGFjY2VzcyB0byB0aGUgYHBhZ2VzYCBhcnJheSwgYW5kIHBvdGVudGlhbGx5IGNhdXNpbmcgYSB3cml0ZSB0byBpbmNvcnJlY3QgbWVtb3J5IGFkZHJlc3Nlcy4gVGhlIG5ldyBsaW5lIGBuciA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG5yLCAoZW5kIC0gYWRkcikgLyBQQUdFX1NJWkUpO2AgZWxlZ2FudGx5IHNvbHZlcyB0aGlzIGJ5IGVuc3VyaW5nIGBucmAgaXMgdGhlIG1pbmltdW0gYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHBhZ2VzIHBlciBjYWxsIGFuZCBob3cgbWFueSB3aG9sZSBwYWdlcyBhcmUgbGVmdC5cblxuSSBuZWVkIHRvIGNvbmZpcm0gYnkgc2VhcmNoaW5nIHRoZSBnaXQgbG9nIGZvciBhIHNpbWlsYXIgZml4LiBUaGlzIHBhdGNoIGNvcnJlY3RseSBoYW5kbGVzIGNhc2VzIHdoZXJlIGBndXAtXHUwMDNlc2l6ZWAgaXMgbm90IHBhZ2UtYWxpZ25lZCwgYGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbGAgaXMgemVybywgYW5kIHBvdGVudGlhbCBmb3IgbWVtb3J5IGVycm9ycyByZWxhdGVkIHRvIHVuZGVyLWFsbG9jYXRpb25cblxuIiwiSW5wdXRUb2tlbnMiOjc2ODgsIk91dHB1dFRva2VucyI6NDcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODQyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTVUMTI6MjU6MDYuNDY3MDI2NDg3WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NzY2ODg2NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtaW5fdFxcXFwodW5zaWduZWQgbG9uZywgbnIsIFxcXFwoZW5kIC0gYWRkclxcXFwpIC8gUEFHRV9TSVpFXFxcXClcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vZ3VwX3Rlc3QuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTQyLVxcbm1tL2d1cF90ZXN0LmM6MTQzOlxcdFxcdG5yID0gbWluX3QodW5zaWduZWQgbG9uZywgbnIsIChlbmQgLSBhZGRyKSAvIFBBR0VfU0laRSk7XFxubW0vZ3VwX3Rlc3QuYy0xNDQtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI1OjA2LjUxNDcwNDgwM1oiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxNzI1OTg0MDcxNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEdVUCBUZXN0IFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCB0aG91Z2h0LCBJJ2QgdXN1YWxseSBjaGVjayB0aGUgY29tbWl0IGhpc3Rvcnkgd2l0aCBgZ2l0IGxvZ2AsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoYXQgdG9vbCBoYW5keS4gTm8gcHJvYmxlbS4gV2UnbGwgZ28gcmlnaHQgaW50byB0aGUgcGF0Y2ggaXRzZWxmIGFuZCBzZWUgd2hhdCdzIGNoYW5nZWQuIFRoZSBwcmltYXJ5IGZvY3VzIGhlcmUgaXMgb24gdW5kZXJzdGFuZGluZyB0aGUgaW50ZXJhY3Rpb24gb2YgdGhpcyBjb2RlIHdpdGggS0FTQU4gYW5kIEtNU0FOLCBzbyB3ZSBuZWVkIHRvIGJlIG1ldGljdWxvdXMuXG5cbkxvb2tpbmcgYXQgdGhlIGRpZmYsIGl0J3MgY2xlYXIgdGhlIHBhdGNoIHByaW1hcmlseSBmb2N1c2VzIG9uIGBtbS9ndXBfdGVzdC5jYCBhbmQgc3BlY2lmaWNhbGx5IHRoZSBgX19ndXBfdGVzdF9pb2N0bGAgZnVuY3Rpb24uIFRoZSBmaXJzdCBwYXJ0IGludHJvZHVjZXMgc29tZSBjcnVjaWFsIHZhbGlkYXRpb24gY2hlY2tzLiBXZSdyZSBub3cgdmFsaWRhdGluZyBgZ3VwLVx1MDAzZXNpemVgLCBtYWtpbmcgc3VyZSBpdCdzIG5vbi16ZXJvLCB0aGF0IGBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGxgIGlzIGFsc28gbm9uLXplcm8gYW5kIHRoYXQgYGd1cC1cdTAwM2VzaXplYCBpcyBwYWdlLWFsaWduZWQuIFRoYXQncyBnb29kLCBpdCB0aWdodGVucyB1cCB0aGUgaW5wdXQgYXNzdW1wdGlvbnMuXG5cblRoZSBzZWNvbmQgcGFydCBvZiB0aGUgcGF0Y2ggY2xlYW5zIHVwIGEgY2FsY3VsYXRpb24gaW52b2x2aW5nIGBucmAgYW5kIGBuZXh0YCwgc3BlY2lmaWNhbGx5OiBJdCBhZGp1c3RzIHRoZSBjYWxjdWxhdGlvbiB0byBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjYWxjdWxhdGVkIGBuZXh0YCB3b3VsZCBoYXZlIGV4Y2VlZGVkIHRoZSBgZW5kYCB2YWx1ZSwgaXQgY29ycmVjdHMgdGhlIGNhbGN1bGF0aW9uIGxvZ2ljLCBhbmQgaXQgd2lsbCBub3cgZW5zdXJlIHRoYXQgdGhlc2UgdmFsdWVzIGFyZSBtb3JlIHByZWNpc2UuIFRoZSBpbXByb3ZlZCBmb3JtdWxhIGxvb2tzIG1vcmUgcm9idXN0LiBXaXRoIHRoZSBzaXplIG5vdyBndWFyYW50ZWVkIHRvIGJlIHBhZ2UtYWxpZ25lZCBhbmQgbm9uLXplcm8sIHRoaXMgc2ltcGxpZmllZCBjYWxjdWxhdGlvbiBpcyBub3cgYWxzbyBleGFjdCwgbWFraW5nIHRoZSBjb2RlIG1vcmUgcmVsaWFibGUuXG5cbk5vdywgdGhlIGltcG9ydGFudCBwYXJ0OiBEb2VzIHRoaXMgdG91Y2ggdW5pbml0aWFsaXplZCBtZW1vcnk/IE5vLCBhbmQgZG9lcyBpdCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5IGFueSBzdHJ1Y3QgY29waWVkIHRvIHVzZXJzcGFjZSB0aGF0IGNvdWxkIGhhdmUgdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIGZpZWxkcz8gTGV0J3MgY2hlY2suICBJIG5lZWQgdG8gY2hlY2sgaG93IHRoZSBgZ3VwYCBzdHJ1Y3QgaXMgaGFuZGxlZC4gIEFoYSEgIEkgc2VlIHRoZSBgY29weV9mcm9tX3VzZXJgIGFuZCBgY29weV90b191c2VyYCBjYWxscyB3aXRoaW4gYGd1cF90ZXN0X2lvY3RsYC4gVGhlIGNvZGUgKmNvcGllcyogYGd1cGAgZnJvbSB1c2Vyc3BhY2UsIHdoaWNoIG1lYW5zIGFsbCBieXRlcyAoaW5jbHVkaW5nIGFueSBwYWRkaW5nKSBhcmUgaW5pdGlhbGl6ZWQgZnJvbSB1c2Vyc3BhY2UgKmJlZm9yZSogdGhlIGZ1bmN0aW9uIGlzIGV2ZW4gZW50ZXJlZC4gIFRoaXMgaXMgYSBjcml0aWNhbCBwb2ludCBmcm9tIGEgc2VjdXJpdHkgYW5kIG1lbW9yeSBzYWZldHkgcGVyc3BlY3RpdmUuIEZ1cnRoZXJtb3JlLCBpbiB0aGUgaGFwcHkgcGF0aCAod2hlbiB0aGUgZnVuY3Rpb24gZXhlY3V0ZXMgd2l0aCB0aGUgZ29vZCByZXR1cm4pLCB0aGUgcmVzdWx0cyBhcmUgY29waWVkIGJhY2suIFRoZSBrZXkgaXMsIHRoYXQgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvciwgdGhlbiB0aGVyZSBpcyBubyBgY29weV90b191c2VyYCBjYWxsLCB3aGljaCBpcyBhbHNvIGltcG9ydGFudC4gVGhlIGFkZGVkIGlucHV0IHZhbGlkYXRpb25zIGVhcmxpZXIgc2hvdWxkIHByZXZlbnQgdGhlIHNpdHVhdGlvbi4gVGhpcyBoZWxwcyBlbnN1cmUgdGhhdCB0aGUgYGd1cGAgc3RydWN0IGlzIGNvcnJlY3RseSBpbml0aWFsaXplZCBhbmQgYW55IGNoYW5nZXMgbWFkZSBkdXJpbmcgdGhlIGBfX2d1cF90ZXN0X2lvY3RsYCBleGVjdXRpb24gYXJlIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgdXNlci1zcGFjZS5cblxuTGV0J3MgZG8gYSBxdWljayBzY2FuIG9mIGFsbCBhY2Nlc3NlcyB0byBgZ3VwYCBpbiB0aGUgZmlsZSBqdXN0IHRvIGJlIGV4dHJhIHN1cmUsIGJ1dCBJJ20gZmVlbGluZyBjb25maWRlbnQgYWJvdXQgdGhpcyBwYXRjaC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA3MDgsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDc0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI1OjIzLjc3NDU0OTE1WiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTYxODE1MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJndXAtXFx1MDAzZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9ndXBfdGVzdC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cF90ZXN0LmM9NzY9c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbi0tXFxubW0vZ3VwX3Rlc3QuYy04Ni1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVA7IGkrKykge1xcbm1tL2d1cF90ZXN0LmM6ODc6XFx0XFx0aWYgKGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0gXFx1MDAzZSBucl9wYWdlcykge1xcbm1tL2d1cF90ZXN0LmMtODgtXFx0XFx0XFx0cHJfd2FybihcXFwiWkVST0lORyBkdWUgdG8gb3V0IG9mIHJhbmdlOiAud2hpY2hfcGFnZXNbJXVdOiAldVxcXFxuXFxcIixcXG5tbS9ndXBfdGVzdC5jOjg5OlxcdFxcdFxcdFxcdGksIGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0pO1xcbm1tL2d1cF90ZXN0LmM6OTA6XFx0XFx0XFx0Z3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXSA9IDA7XFxubW0vZ3VwX3Rlc3QuYy05MS1cXHRcXHR9XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTk0LVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSsrKSB7XFxubW0vZ3VwX3Rlc3QuYzo5NTpcXHRcXHRpbmRleF90b19kdW1wID0gZ3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXTtcXG5tbS9ndXBfdGVzdC5jLTk2LVxcbi0tXFxubW0vZ3VwX3Rlc3QuYy05OS1cXHRcXHRcXHRwcl9pbmZvKFxcXCItLS0tIHBhZ2UgIyV1LCBzdGFydGluZyBmcm9tIHVzZXIgdmlydCBhZGRyOiAweCVsbHhcXFxcblxcXCIsXFxubW0vZ3VwX3Rlc3QuYzoxMDA6XFx0XFx0XFx0XFx0aW5kZXhfdG9fZHVtcCwgZ3VwLVxcdTAwM2VhZGRyKTtcXG5tbS9ndXBfdGVzdC5jLTEwMS1cXHRcXHRcXHRkdW1wX3BhZ2UocGFnZXNbaW5kZXhfdG9fZHVtcF0sXFxuLS1cXG5tbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTE4LVxcbm1tL2d1cF90ZXN0LmM6MTE5OlxcdGlmIChndXAtXFx1MDAzZWFkZHIgXFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVxcdTAwM2VzaXplIFxcdTAwM2UgVUxPTkdfTUFYIHx8ICFndXAtXFx1MDAzZXNpemUgfHxcXG5tbS9ndXBfdGVzdC5jOjEyMDpcXHQgICAgIWd1cC1cXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgfHwgIVBBR0VfQUxJR05FRChndXAtXFx1MDAzZXNpemUpKVxcbm1tL2d1cF90ZXN0LmMtMTIxLVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbm1tL2d1cF90ZXN0LmM6MTIyOlxcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVxcdTAwM2VhZGRyLFxcbm1tL2d1cF90ZXN0LmM6MTIzOlxcdFxcdFxcdCAgICAgICAodW5zaWduZWQgbG9uZylndXAtXFx1MDAzZXNpemUsIFxcdTAwMjZlbmQpKVxcbm1tL2d1cF90ZXN0LmMtMTI0LVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbm1tL2d1cF90ZXN0LmMtMTI1LVxcbm1tL2d1cF90ZXN0LmM6MTI2OlxcdG5yX3BhZ2VzID0gZ3VwLVxcdTAwM2VzaXplIC8gUEFHRV9TSVpFO1xcbm1tL2d1cF90ZXN0LmMtMTI3LVxcdHBhZ2VzID0ga3ZjYWxsb2MobnJfcGFnZXMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTM2LVxcdGkgPSAwO1xcbm1tL2d1cF90ZXN0LmM6MTM3OlxcdG5yID0gZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcXG5tbS9ndXBfdGVzdC5jLTEzOC1cXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XFxubW0vZ3VwX3Rlc3QuYzoxMzk6XFx0Zm9yIChhZGRyID0gZ3VwLVxcdTAwM2VhZGRyOyBhZGRyIFxcdTAwM2MgZW5kOyBhZGRyID0gbmV4dCkge1xcbm1tL2d1cF90ZXN0LmM6MTQwOlxcdFxcdGlmIChuciAhPSBndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxcbm1tL2d1cF90ZXN0LmMtMTQxLVxcdFxcdFxcdGJyZWFrO1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy0xNDgtXFx0XFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XFxubW0vZ3VwX3Rlc3QuYzoxNDk6XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG5tbS9ndXBfdGVzdC5jLTE1MC1cXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTUyLVxcdFxcdGNhc2UgR1VQX0JBU0lDX1RFU1Q6XFxubW0vZ3VwX3Rlc3QuYzoxNTM6XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxubW0vZ3VwX3Rlc3QuYy0xNTQtXFx0XFx0XFx0YnJlYWs7XFxubW0vZ3VwX3Rlc3QuYy0xNTUtXFx0XFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XFxubW0vZ3VwX3Rlc3QuYzoxNTY6XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG5tbS9ndXBfdGVzdC5jLTE1Ny1cXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTU5LVxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxubW0vZ3VwX3Rlc3QuYzoxNjA6XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxubW0vZ3VwX3Rlc3QuYy0xNjEtXFx0XFx0XFx0YnJlYWs7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTE2My1cXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLFxcbm1tL2d1cF90ZXN0LmM6MTY0OlxcdFxcdFxcdFxcdFxcdCAgICBndXAtXFx1MDAzZWd1cF9mbGFncyB8IEZPTExfTE9OR1RFUk0sXFxubW0vZ3VwX3Rlc3QuYy0xNjUtXFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTE2Ny1cXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbm1tL2d1cF90ZXN0LmM6MTY4OlxcdFxcdFxcdGlmIChndXAtXFx1MDAzZXRlc3RfZmxhZ3MgXFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTilcXG5tbS9ndXBfdGVzdC5jOjE2OTpcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG5tbS9ndXBfdGVzdC5jLTE3MC1cXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG5tbS9ndXBfdGVzdC5jLTE3MS1cXHRcXHRcXHRlbHNlXFxubW0vZ3VwX3Rlc3QuYzoxNzI6XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxubW0vZ3VwX3Rlc3QuYy0xNzMtXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTE4OC1cXG5tbS9ndXBfdGVzdC5jOjE4OTpcXHRndXAtXFx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xcbm1tL2d1cF90ZXN0LmM6MTkwOlxcdGd1cC1cXHUwMDNlc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xcbm1tL2d1cF90ZXN0LmMtMTkxLVxcbi0tXFxubW0vZ3VwX3Rlc3QuYy0yMDItXFxubW0vZ3VwX3Rlc3QuYzoyMDM6XFx0cHV0X2JhY2tfcGFnZXMoY21kLCBwYWdlcywgbnJfcGFnZXMsIGd1cC1cXHUwMDNldGVzdF9mbGFncyk7XFxubW0vZ3VwX3Rlc3QuYy0yMDQtXFxubW0vZ3VwX3Rlc3QuYy0yMDUtXFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcXG5tbS9ndXBfdGVzdC5jOjIwNjpcXHRndXAtXFx1MDAzZXB1dF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xcbm1tL2d1cF90ZXN0LmMtMjA3LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xNVQxMjoyNToyMy44MjAxNzA0ODNaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjY4MTI1MzYwODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gUmVhc29uaW5nOiBOZWVkc0tNU0FOID0gZmFsc2UqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoZSBwYXRjaCBpbiBxdWVzdGlvbiBzaWduaWZpY2FudGx5IHN0cmVuZ3RoZW5zIHRoZSBgZ3VwX3Rlc3RgIGlvY3RsIGhhbmRsZXIuIE15IGFzc2Vzc21lbnQgaXMgdGhhdCBgTmVlZHNLTVNBTmAgc2hvdWxkIGJlIHNldCB0byBgZmFsc2VgIGhlcmUuXG5cblRoZSBwYXRjaCBpdHNlbGYgZm9jdXNlcyBvbiBpbnB1dCB2YWxpZGF0aW9uIGFuZCBsb29wIGNhbGN1bGF0aW9uIGNvcnJlY3Rpb25zLiBTcGVjaWZpY2FsbHk6IGl0IGFkZHMgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSBpbnB1dCBgZ3VwLVx1MDAzZXNpemVgIGFuZCBgZ3VwLVx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsYCBhcmUgdmFsaWQgdmFsdWVzIChwb3NpdGl2ZSwgbm90IGV4Y2VlZGluZyBgVUxPTkdfTUFYYCwgYW5kIGBndXAtXHUwMDNlc2l6ZWAgaXMgcGFnZS1hbGlnbmVkKS4gSXQgYWxzbyBtb2RpZmllcyB0aGUgbG9vcCBjYWxjdWxhdGlvbiB0byB1c2UgYG1pbl90YCB3aGljaCBzaW1wbGlmaWVzIHRoZSBjYWxjdWxhdGlvbnMsIHByZXZlbnRpbmcgb3V0LW9mLWJvdW5kcyBhY2Nlc3MuXG5cbkJlZm9yZSB0aGUgcGF0Y2gsIGEgemVybyBvciB1bmFsaWduZWQgYGd1cC1cdTAwM2VzaXplYCBvciBhIHplcm8gYGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbGAgd291bGQgbGVhZCB0byBlaXRoZXIgaW5maW5pdGUgbG9vcHMgKGJlY2F1c2UgdGhlIGxvb3AgdGVybWluYXRpb24gY29uZGl0aW9uIHdvdWxkIG5ldmVyIGJlIG1ldCkgb3Igb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzZXMgaW4gdGhlIGBwYWdlc2AgYXJyYXkgZHVlIHRvIGluY29ycmVjdCBsb29wIGl0ZXJhdGlvbi5cblxuTm93LCBsZXQncyBleGFtaW5lIHRoZSBLTVNBTiBjcml0ZXJpYTpcblxuMS4gICoqS2VybmVsIHN0cnVjdHVyZXMgdG8gdXNlcnNwYWNlOioqIE5vcGUuIFRoZSBpb2N0bCBjb3BpZXMgKmZyb20qIHVzZXJzcGFjZSAqdG8qIHRoZSBrZXJuZWwsIGluaXRpYWxpemluZyB0aGUgYGd1cGAgc3RydWN0LiBUaGVyZSdzIG5vIGRhdGEgYmVpbmcgc2VudCAqdG8qIHVzZXJzcGFjZSB0aGF0IGNvdWxkIGhhdmUgdW5pbml0aWFsaXplZCBtZW1vcnkuXG4yLiAgKipDb25kaXRpb25hbCBsb2dpYyBvbiB1bmluaXRpYWxpemVkIGRhdGE6KiogTm8uIEFsbCB2YXJpYWJsZXMsIGluY2x1ZGluZyB0aGUgYGd1cGAgc3RydWN0LCBhbmQgbG9jYWwgdmFyaWFibGVzIHdpdGhpbiB0aGUgZnVuY3Rpb24gYXJlIGluaXRpYWxpemVkLiBga3ZjYWxsb2NgIHplcm8taW5pdGlhbGl6ZXMgdGhlIGBwYWdlc2AgYXJyYXksIGFuZCBgY29weV9mcm9tX3VzZXJgIHBvcHVsYXRlcyB0aGUgdXNlci1zdXBwbGllZCB2YWx1ZXMuIFRoZSBsb2dpYyBub3cgKnByZXZlbnRzKiBpc3N1ZXMsIHJhdGhlciB0aGFuIGludHJvZHVjaW5nIHRoZW0uXG4zLiAgKipDb21wbGV4IGRhdGEgc3RydWN0dXJlIGFsbG9jYXRpb24vaW5pdGlhbGl6YXRpb246KiogIGBrdmNhbGxvY2AgaXMgdXNlZCB0byBhbGxvY2F0ZSB0aGUgYHBhZ2VzYCBhcnJheSB3aGljaCBpcyB6ZXJvLWluaXRpYWxpemVkIGFuZCB0aGVuIHBvcHVsYXRlZCwgYXMgd2VsbCBhcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYGd1cGAgZnJvbSB0aGUgdXNlcnNwYWNlIGJ1ZmZlci4gTm8gdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIHJlYWQgaW4gcmVhY2hhYmxlIGNvZGUuXG40LiAgKipCb3VuZHMgY2hlY2tzIGFmZmVjdGluZyB1bmluaXRpYWxpemVkIGJ5dGVzOioqIFRoZSBwYXRjaCBmaXhlcyBib3VuZHMgY2hlY2tzIGluIHRoZSBsb29wIGNhbGN1bGF0aW9uIHRvIHByZXZlbnQgYWNjZXNzaW5nIG1lbW9yeSBvdXRzaWRlIG9mIHRoZSBhbGxvY2F0ZWQgYHBhZ2VzYCBhcnJheSwgc28gaXQgcmVkdWNlcywgcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcsIHJpc2sgb2YgdW5pbml0aWFsaXplZCBhY2Nlc3MuXG5cblRoZSBtYWluIHJpc2tzIGFkZHJlc3NlZCBieSB0aGUgcGF0Y2ggYXJlIGFjdHVhbGx5IG91dC1vZi1ib3VuZHMgYXJyYXkgYWNjZXNzIChLQVNBTikgYW5kIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wcyBvciBzb2Z0bG9ja3VwcyAoZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIG1lY2hhbmlzbXMpLiBUaGVzZSBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5IGV4aXN0aW5nIGtlcm5lbCBkZWJ1Z2dlcnMuIFRoZXJlJ3Mgbm8gZXZpZGVuY2Ugb2YgbmV3IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaC4gVGh1cywgYE5lZWRzS01TQU4gPSBmYWxzZWAuIEknbSBjb25maWRlbnQgaW4gdGhpcyBhc3Nlc3NtZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDA5MywiT3V0cHV0VG9rZW5zIjoyNDMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTEwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTE1VDEyOjI1OjUwLjYzMjcwODk4OVoiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5NTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgbW0vZ3VwX3Rlc3QuYyB0byBhZGQgaW5wdXQgcGFyYW1ldGVyIHZhbGlkYXRpb24gKGNoZWNraW5nIHRoYXQgZ3VwLVxcdTAwM2VzaXplIGlzIG5vbi16ZXJvIGFuZCBQQUdFX0FMSUdORUQsIGFuZCB0aGF0IGd1cC1cXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwgaXMgbm9uLXplcm8pIGFuZCBzaW1wbGlmaWVzIHRoZSBwZXItaXRlcmF0aW9uIHBhZ2UgY291bnQgY2FsY3VsYXRpb24gdXNpbmcgbWluX3QoKS4gXFxuXFxuVGhlIGlzc3VlcyBhZGRyZXNzZWQgYnkgdGhpcyBwYXRjaCBhcmUgaW5maW5pdGUgbG9vcHMgKHdoZW4gbnJfcGFnZXNfcGVyX2NhbGwgaXMgMCkgYW5kIG91dC1vZi1ib3VuZHMgYnVmZmVyIGluZGV4aW5nIG9uIHRoZSBgcGFnZXNgIGFycmF5ICh3aGVuIGd1cC1cXHUwMDNlc2l6ZSB3YXMgbm90IHBhZ2UtYWxpZ25lZCkuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGRldGVjdGVkIGJ5IGxvY2t1cC93YXRjaGRvZyBkZXRlY3RvcnMgYW5kIEtBU0FOIChLZXJuZWxBZGRyZXNzU2FuaXRpemVyKSwgcmVzcGVjdGl2ZWx5LlxcblxcbkFsbCBidWZmZXJzIGludm9sdmVkICh0aGUgc3RhY2stYWxsb2NhdGVkIHN0cnVjdCBndXBfdGVzdCBhbmQgdGhlIGhlYXAtYWxsb2NhdGVkIHBhZ2VzIGFycmF5KSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGNvcHlfZnJvbV91c2VyKCkgYW5kIGt2Y2FsbG9jKCkuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgc3RydWN0IHBhZGRpbmcgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaW50cm9kdWNlZCBvciBtb2RpZmllZCBieSB0aGlzIGNoYW5nZS4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IGp1c3RpZmllZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBtbS9ndXBfdGVzdC5jIHRvIGFkZCBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAoY2hlY2tpbmcgdGhhdCBndXAtXFx1MDAzZXNpemUgaXMgbm9uLXplcm8gYW5kIFBBR0VfQUxJR05FRCwgYW5kIHRoYXQgZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbCBpcyBub24temVybykgYW5kIHNpbXBsaWZpZXMgdGhlIHBlci1pdGVyYXRpb24gcGFnZSBjb3VudCBjYWxjdWxhdGlvbiB1c2luZyBtaW5fdCgpLiBcXG5cXG5UaGUgaXNzdWVzIGFkZHJlc3NlZCBieSB0aGlzIHBhdGNoIGFyZSBpbmZpbml0ZSBsb29wcyAod2hlbiBucl9wYWdlc19wZXJfY2FsbCBpcyAwKSBhbmQgb3V0LW9mLWJvdW5kcyBidWZmZXIgaW5kZXhpbmcgb24gdGhlIGBwYWdlc2AgYXJyYXkgKHdoZW4gZ3VwLVxcdTAwM2VzaXplIHdhcyBub3QgcGFnZS1hbGlnbmVkKS4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZGV0ZWN0ZWQgYnkgbG9ja3VwL3dhdGNoZG9nIGRldGVjdG9ycyBhbmQgS0FTQU4gKEtlcm5lbEFkZHJlc3NTYW5pdGl6ZXIpLCByZXNwZWN0aXZlbHkuXFxuXFxuQWxsIGJ1ZmZlcnMgaW52b2x2ZWQgKHRoZSBzdGFjay1hbGxvY2F0ZWQgc3RydWN0IGd1cF90ZXN0IGFuZCB0aGUgaGVhcC1hbGxvY2F0ZWQgcGFnZXMgYXJyYXkpIGFyZSBmdWxseSBpbml0aWFsaXplZCB2aWEgY29weV9mcm9tX3VzZXIoKSBhbmQga3ZjYWxsb2MoKS4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBzdHJ1Y3QgcGFkZGluZyBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkIGJ5IHRoaXMgY2hhbmdlLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QganVzdGlmaWVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowgb424[1] Phase: Succeeded StartedAt: 2026-09-15 12:26:02 +0000 UTC FinishedAt: 2026-09-15 12:26:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-15 12:26:02 +0000 UTC FinishedAt: 2026-09-15 12:26:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2] Phase: Succeeded StartedAt: 2026-09-15 12:26:02 +0000 UTC FinishedAt: 2026-09-15 16:06:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-15 12:26:02 +0000 UTC FinishedAt: 2026-09-15 16:06:09 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-15 12:26:02 +0000 UTC FinishedAt: 2026-09-15 12:26:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-15 12:26:02 +0000 UTC FinishedAt: 2026-09-15 12:26:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgb424/series-workflowgb424-convert-artifact-3095111647/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-15 12:26:14 +0000 UTC FinishedAt: 2026-09-15 12:42:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-15 12:26:14 +0000 UTC FinishedAt: 2026-09-15 12:42:50 +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:*2385cf90-5fdc-4073-bc5a-78a10242d37e,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-workflowgb424/series-workflowgb424-convert-artifact-3095111647/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": "395d6573-026d-4227-9fda-9f3aa35e3b0a", "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-workflowgb424/series-workflowgb424-build-action-1166970085/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-15 12:26:14 +0000 UTC FinishedAt: 2026-09-15 12:42:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*2385cf90-5fdc-4073-bc5a-78a10242d37e,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-workflowgb424/series-workflowgb424-convert-artifact-3095111647/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": "395d6573-026d-4227-9fda-9f3aa35e3b0a", "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-workflowgb424/series-workflowgb424-build-action-1166970085/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-15 12:42:50 +0000 UTC FinishedAt: 2026-09-15 12:42:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-15 12:42:50 +0000 UTC FinishedAt: 2026-09-15 12:42:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-15 12:42:50 +0000 UTC FinishedAt: 2026-09-15 12:43:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-15 12:42:50 +0000 UTC FinishedAt: 2026-09-15 12:42:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgb424/series-workflowgb424-convert-artifact-423086958/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-15 12:43:04 +0000 UTC FinishedAt: 2026-09-15 12:45:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-15 12:43:04 +0000 UTC FinishedAt: 2026-09-15 12:44:53 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*395d6573-026d-4227-9fda-9f3aa35e3b0a,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-workflowgb424/series-workflowgb424-build-action-1166970085/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-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-15 12:45:03 +0000 UTC FinishedAt: 2026-09-15 12:45:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-15 12:45:03 +0000 UTC FinishedAt: 2026-09-15 12:45:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-15 12:45:03 +0000 UTC FinishedAt: 2026-09-15 13:01:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-15 12:45:03 +0000 UTC FinishedAt: 2026-09-15 13:01:22 +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:*2385cf90-5fdc-4073-bc5a-78a10242d37e,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-workflowgb424/series-workflowgb424-convert-artifact-423086958/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": "846b5499-157e-44f9-96a3-ddf116476489", "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-workflowgb424/series-workflowgb424-build-action-258055298/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-15 12:45:03 +0000 UTC FinishedAt: 2026-09-15 13:01:12 +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:*2385cf90-5fdc-4073-bc5a-78a10242d37e,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-workflowgb424/series-workflowgb424-convert-artifact-423086958/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": "846b5499-157e-44f9-96a3-ddf116476489", "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-workflowgb424/series-workflowgb424-build-action-258055298/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-15 13:01:22 +0000 UTC FinishedAt: 2026-09-15 13:01:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-15 13:01:22 +0000 UTC FinishedAt: 2026-09-15 13:01:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-15 13:01:22 +0000 UTC FinishedAt: 2026-09-15 13:03:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-15 13:01:22 +0000 UTC FinishedAt: 2026-09-15 13:03:13 +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:*846b5499-157e-44f9-96a3-ddf116476489,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-workflowgb424/series-workflowgb424-build-action-258055298/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-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-15 13:03:23 +0000 UTC FinishedAt: 2026-09-15 16:06:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-15 13:03:23 +0000 UTC FinishedAt: 2026-09-15 16:06:09 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*395d6573-026d-4227-9fda-9f3aa35e3b0a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*846b5499-157e-44f9-96a3-ddf116476489,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-workflowgb424/series-workflowgb424-build-action-1166970085/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-workflowgb424/series-workflowgb424-build-action-258055298/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-15 13:03:23 +0000 UTC FinishedAt: 2026-09-15 13:03:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-15 13:03:23 +0000 UTC FinishedAt: 2026-09-15 13:03:28 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowgb424/series-workflowgb424-convert-artifact-210311443/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-15 13:03:23 +0000 UTC FinishedAt: 2026-09-15 13:03:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-15 13:03:23 +0000 UTC FinishedAt: 2026-09-15 13:03:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-15 13:03:23 +0000 UTC FinishedAt: 2026-09-15 13:03:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-15 13:03:33 +0000 UTC FinishedAt: 2026-09-15 16:06:09 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgb424[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"base_commit":"b08a65b93426d86e3f354d655d6225397b591877","base_tree":"mm-new","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["__gup_test_ioctl","gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"b08a65b93426d86e3f354d655d6225397b591877","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b4eaa69a-d238-4cbe-97b0-d0ff2f1795f6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-15 13:03:33 +0000 UTC FinishedAt: 2026-09-15 16:05:58 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*395d6573-026d-4227-9fda-9f3aa35e3b0a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*846b5499-157e-44f9-96a3-ddf116476489,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-workflowgb424/series-workflowgb424-build-action-1166970085/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-workflowgb424/series-workflowgb424-build-action-258055298/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-workflowgb424/series-workflowgb424-convert-artifact-210311443/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,}