Name: series-workflowdxx9w Phase: Succeeded StartedAt: 2026-09-11 18:29:30 +0000 UTC FinishedAt: 2026-09-11 22:18:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[0] Phase: Succeeded StartedAt: 2026-09-11 18:29:30 +0000 UTC FinishedAt: 2026-09-11 18:35:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[0].run-triage Phase: Succeeded StartedAt: 2026-09-11 18:29:30 +0000 UTC FinishedAt: 2026-09-11 18:35:14 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "7f24d0f60b1087dbc28d68398957c18774e5a7d8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KERNFS", "SYSFS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "7f24d0f60b1087dbc28d68398957c18774e5a7d8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KERNFS", "SYSFS" ], "series_id": "6d0f4da5-c389-41c6-b862-7b08f467ebd1" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "kernfs_fop_readdir", "kernfs_dir_pos", "kernfs_dir_next_pos" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "7f24d0f60b1087dbc28d68398957c18774e5a7d8", "base_tree": "vfs" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFUk5GUyYjMzQ7LAogICAgJiMzNDtTWVNGUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2tlcm5mc19mb3BfcmVhZGRpciYjMzQ7LAogICAgJiMzNDtrZXJuZnNfZGlyX3BvcyYjMzQ7LAogICAgJiMzNDtrZXJuZnNfZGlyX25leHRfcG9zJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyBrZXJuZnMgZGlyZWN0b3J5IGl0ZXJhdGlvbiAoYGtlcm5mc19mb3BfcmVhZGRpcmApIHRvIHByb3Blcmx5IGhhbmRsZSByZWFkZGlyIHJlc3VtcHRpb24gd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIG9yIHJlbmFtZWQgY29uY3VycmVudGx5LCBieSBrZXlpbmcgcG9zaXRpb24gb24gdGhlIG5vZGUgbmFtZSBpbiBhZGRpdGlvbiB0byBpdHMgaGFzaCBhbmQgZHJvcHBpbmcgYGtlcm5mc19yd3NlbWAgYXJvdW5kIGBkaXJfZW1pdCgpYC5cblxuLSBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb246IEEgdGVtcG9yYXJ5IGJ1ZmZlciBgbmFtZWAgaXMgYWxsb2NhdGVkIHZpYSBga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTClgLiBCZWZvcmUgYW55IHJlYWQsIGl0IGlzIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpYC4gVGhlIHN0cmluZyBjb21wYXJpc29uIGZ1bmN0aW9ucyAoYHN0cmNtcGApIGFuZCBgZGlyX2VtaXQoKWAgb25seSBhY2Nlc3MgdGhlIHBvcHVsYXRlZCwgTlVMLXRlcm1pbmF0ZWQgcHJlZml4IG9mIGxlbmd0aCBgbGVuYC4gTm8gdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZmZlciBhcmUgcmVhZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLlxuLSBMb2NhbCB2YXJpYWJsZXM6IFRoZSBzdGFjayB2YXJpYWJsZSBgYm9vbCByZXN1bWVkYCBwYXNzZWQgdG8gYGtlcm5mc19kaXJfcG9zKClgIGlzIHVuY29uZGl0aW9uYWxseSBpbml0aWFsaXplZCB0byBgZmFsc2VgIHVwb24gZW50cnkgdG8gYGtlcm5mc19kaXJfcG9zKClgLlxuLSBQcmltYXJ5IHJpc2tzOiBUaGUgcGF0Y2ggbW9kaWZpZXMgbG9ja2luZyBiZWhhdmlvciAoZHJvcHBpbmcgYW5kIHJlLWFjcXVpcmluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0YCkgYW5kIG5vZGUgcmVmY291bnRpbmcvdmFsaWRhdGlvbi4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb3RlbnRpYWwgY29uY3VycmVuY3kgcmFjZXMsIGxvY2sgaW52ZXJzaW9uLCBhbmQgbGlmZXRpbWUvdXNlLWFmdGVyLWZyZWUgYnVncywgd2hpY2ggYXJlIGZ1bGx5IGNvdmVyZWQgYnkgTE9DS0RFUCBhbmQgS0FTQU4uXG5cbkJlY2F1c2UgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWsgcmlza3MgdGhhdCB3b3VsZCBiZSB1bmlxdWVseSBkZXRlY3RlZCBieSBLTVNBTiwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMga2VybmZzIGRpcmVjdG9yeSBsaXN0aW5nIChyZWFkZGlyIC8gZ2V0ZGVudHMpIGFuZCByZXN1bWUgdHJhdmVyc2FsIGxvZ2ljIGluIGZzL2tlcm5mcy9kaXIuYy4gU3BlY2lmaWNhbGx5LCBpdCB1cGRhdGVzIGtlcm5mc19kaXJfcG9zIGFuZCBrZXJuZnNfZGlyX25leHRfcG9zIHRvIHJlc3VtZSByZWFkZGlyIGJhc2VkIG9uIGVudHJ5IG5hbWUgY29tcGFyaXNvbiB3aXRoaW4gdGhlIHJiLXRyZWUsIGFkZHMgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIHJlc3VtZSBrZXkgbmFtZSwgaW50cm9kdWNlcyBhIFdBUk5fT05fT05DRSBjaGVjayBvbiBuYW1lIHRydW5jYXRpb24sIGFuZCByZWxlYXNlcy9yZWFjcXVpcmVzIHJvb3QtXHUwMDNla2VybmZzX3J3c2VtIGFyb3VuZCBkaXJfZW1pdCgpLiBUaGVzZSBjaGFuZ2VzIHRvdWNoIHJlYWNoYWJsZSBjb3JlIHZpcnR1YWwgZmlsZXN5c3RlbSBjb2RlIGV4ZXJjaXNlZCBieSB1c2VyIHNwYWNlIHZpYSBnZXRkZW50cy9nZXRkZW50czY0IG9uIHN5c2ZzIGFuZCBjZ3JvdXBzLCBpbnRyb2R1Y2luZyBjb25jdXJyZW5jeSB3aW5kb3dzIGFuZCBtb2RpZmllZCBsb2NraW5nIHNlbWFudGljcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGU1NTgwMjBlYWJhNjA1ZjYwODE3ZDU0ZDQ5NzFlY2RmMWNiNDUxZjBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAxODozMTo0MSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZGlyLmMgYi9mcy9rZXJuZnMvZGlyLmNcbmluZGV4IDA3YWJmNTlmMDI2NGEuLmNjNjI4OGQ1YjRjYzQgMTAwNjQ0XG4tLS0gYS9mcy9rZXJuZnMvZGlyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2tlcm5mcy9kaXIuY1xuQEAgLTE5MDMsMzMgJiM0MzsxOTAzLDQ5IEBAIHN0YXRpYyBpbnQga2VybmZzX2Rpcl9mb3BfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogRmluZCB3aGVyZSBhIGxpc3RpbmcgbGVmdCBvZmYuICBAcmVzdW1lZCBzYXlzIHdoZXRoZXIgQHBvcyBpcyBzdGlsbCB0aGF0XG4mIzQzOyAqIGVudHJ5OyBpZiBub3QsIHRoZSBzZWFyY2ggZmFsbHMgYmFjayB0byBAaGFzaCwga2V5ZWQgYnkgQG5hbWUgaWYgZ2l2ZW4uXG4mIzQzOyAqL1xuIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcylcbiYjNDM7XHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxuJiM0MztcdGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgKnJlc3VtZWQpXG4ge1xuJiM0MztcdGlmIChyZXN1bWVkKVxuJiM0MztcdFx0KnJlc3VtZWQgPSBmYWxzZTtcbiBcdGlmIChwb3MpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBBIHJlbmFtZSBrZWVwcyB0aGUgaGFzaCBpZiB0aGUgbmV3IG5hbWUgaGFzaGVzIHRoZSBzYW1lLCBzb1xuJiM0MztcdFx0ICogY2hlY2sgQG5hbWUgdG9vLiAgT3RoZXJ3aXNlIHRoZSBjYWxsZXIgd291bGQgc3RlcCBvdmVyIHRoZVxuJiM0MztcdFx0ICogZW50cnkgbm93IHNpdHRpbmcgd2hlcmUgQHBvcyB1c2VkIHRvIGJlLlxuJiM0MztcdFx0ICovXG4gXHRcdGludCB2YWxpZCA9IGtlcm5mc19hY3RpdmUocG9zKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHRyY3VfYWNjZXNzX3BvaW50ZXIocG9zLVx1MDAzZV9fcGFyZW50KSA9PSBwYXJlbnQgXHUwMDI2XHUwMDI2XG4tXHRcdFx0aGFzaCA9PSBwb3MtXHUwMDNlaGFzaDtcbiYjNDM7XHRcdFx0aGFzaCA9PSBwb3MtXHUwMDNlaGFzaCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0KCFuYW1lIHx8ICFzdHJjbXAobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcykpKTtcbiBcdFx0a2VybmZzX3B1dChwb3MpO1xuIFx0XHRpZiAoIXZhbGlkKVxuIFx0XHRcdHBvcyA9IE5VTEw7XG4mIzQzO1x0XHRlbHNlIGlmIChyZXN1bWVkKVxuJiM0MztcdFx0XHQqcmVzdW1lZCA9IHRydWU7XG4gXHR9XG4gXHRpZiAoIXBvcyBcdTAwMjZcdTAwMjYgKGhhc2ggXHUwMDNlIDEpIFx1MDAyNlx1MDAyNiAoaGFzaCBcdTAwM2MgSU5UX01BWCkpIHtcbiBcdFx0c3RydWN0IHJiX25vZGUgKm5vZGUgPSBwYXJlbnQtXHUwMDNlZGlyLmNoaWxkcmVuLnJiX25vZGU7XG4tXHRcdHU2NCBuc19pZCA9IGtlcm5mc19uc19pZChucyk7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIEtlZXAgYSBub2RlIG9ubHkgb24gdGhlIHdheSBsZWZ0LCBzbyB0aGUgc2VhcmNoIGVuZHMgb24gdGhlXG4mIzQzO1x0XHQgKiBmaXJzdCBlbnRyeSBhZnRlciB0aGUga2V5LiAgQW4gZW1wdHkgQG5hbWUgc29ydHMgYmVmb3JlIGFsbFxuJiM0MztcdFx0ICogZW50cmllcyBzaGFyaW5nIHRoZSBoYXNoLCBzbyBpdCBsYW5kcyBvbiB0aGUgZmlyc3Qgb2YgdGhlbS5cbiYjNDM7XHRcdCAqL1xuIFx0XHR3aGlsZSAobm9kZSkge1xuLVx0XHRcdHBvcyA9IHJiX3RvX2tuKG5vZGUpO1xuJiM0MztcdFx0XHRzdHJ1Y3Qga2VybmZzX25vZGUgKmtuID0gcmJfdG9fa24obm9kZSk7XG4gXG4tXHRcdFx0aWYgKGhhc2ggXHUwMDNjIHBvcy1cdTAwM2VoYXNoKVxuLVx0XHRcdFx0bm9kZSA9IG5vZGUtXHUwMDNlcmJfbGVmdDtcbi1cdFx0XHRlbHNlIGlmIChoYXNoIFx1MDAzZSBwb3MtXHUwMDNlaGFzaClcbi1cdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX3JpZ2h0O1xuLVx0XHRcdGVsc2UgaWYgKG5zX2lkIFx1MDAzYyBrZXJuZnNfbnNfaWQocG9zLVx1MDAzZW5zKSlcbiYjNDM7XHRcdFx0aWYgKGtlcm5mc19uYW1lX2NvbXBhcmUoaGFzaCwgbmFtZSA/OiBcJiMzNDtcJiMzNDssIG5zLCBrbikgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0XHRwb3MgPSBrbjtcbiBcdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4tXHRcdFx0ZWxzZSBpZiAobnNfaWQgXHUwMDNlIGtlcm5mc19uc19pZChwb3MtXHUwMDNlbnMpKVxuJiM0MztcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0bm9kZSA9IG5vZGUtXHUwMDNlcmJfcmlnaHQ7XG4tXHRcdFx0ZWxzZVxuLVx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdH1cbiBcdFx0fVxuIFx0fVxuIFx0LyogU2tpcCBvdmVyIGVudHJpZXMgd2hpY2ggYXJlIGR5aW5nL2RlYWQgb3IgaW4gdGhlIHdyb25nIG5hbWVzcGFjZSAqL1xuQEAgLTE5NDUsMTAgJiM0MzsxOTYxLDE0IEBAIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGlub190IGlubywgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpXG4mIzQzO1x0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyxcbiYjNDM7XHRjb25zdCBjaGFyICpuYW1lKVxuIHtcbi1cdHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGlubywgcG9zKTtcbi1cdGlmIChwb3MpIHtcbiYjNDM7XHRib29sIHJlc3VtZWQ7XG4mIzQzO1xuJiM0MztcdHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGhhc2gsIHBvcywgbmFtZSwgXHUwMDI2cmVzdW1lZCk7XG4mIzQzO1x0LyogU3RlcCBvdmVyIEBwb3Mgb25seSBpZiBpdCBzdXJ2aXZlZDsgQG5hbWUgZmluZHMgdGhlIHNwb3QgaWYgbm90LiAqL1xuJiM0MztcdGlmIChwb3MgXHUwMDI2XHUwMDI2IHJlc3VtZWQpIHtcbiBcdFx0ZG8ge1xuIFx0XHRcdHN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dChcdTAwMjZwb3MtXHUwMDNlcmIpO1xuIFx0XHRcdGlmICghbm9kZSlcbkBAIC0xOTY2LDM0ICYjNDM7MTk4Niw1NSBAQCBzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4gXHRzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLVx1MDAzZWZfcGF0aC5kZW50cnk7XG4gXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCA9IGtlcm5mc19kZW50cnlfbm9kZShkZW50cnkpO1xuIFx0c3RydWN0IGtlcm5mc19ub2RlICpwb3MgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbiYjNDM7XHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuIFx0c3RydWN0IGtlcm5mc19yb290ICpyb290O1xuIFx0Y29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMO1xuIFxuIFx0aWYgKCFkaXJfZW1pdF9kb3RzKGZpbGUsIGN0eCkpXG4gXHRcdHJldHVybiAwO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogT25lIGJ1ZmZlciBmb3IgdGhlIGNhbGwsIGhvbGRpbmcgdGhlIG5hbWUgb2YgdGhlIGVudHJ5IHRoZSBsaXN0aW5nXG4mIzQzO1x0ICogaXMgb24uICBQQVRIX01BWDoga2VybmZzIGJvdW5kcyBubyBzaW5nbGUgbmFtZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRuYW1lID0ga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFuYW1lKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuIFx0cm9vdCA9IGtlcm5mc19yb290KHBhcmVudCk7XG4gXHRkb3duX3JlYWQoXHUwMDI2cm9vdC1cdTAwM2VrZXJuZnNfcndzZW0pO1xuIFxuIFx0aWYgKGtlcm5mc19uc19lbmFibGVkKHBhcmVudCkpXG4gXHRcdG5zID0ga2VybmZzX2luZm8oZGVudHJ5LVx1MDAzZWRfc2IpLVx1MDAzZW5zO1xuIFxuLVx0Zm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtXHUwMDNlcG9zLCBwb3MpO1xuJiM0MztcdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBOVUxMLCBOVUxMKTtcbiBcdCAgICAgcG9zO1xuLVx0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcykpIHtcbi1cdFx0Y29uc3QgY2hhciAqbmFtZSA9IGtlcm5mc19yY3VfbmFtZShwb3MpO1xuJiM0MztcdCAgICAgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtXHUwMDNlcG9zLCBwb3MsIG5hbWUpKSB7XG4gXHRcdHVuc2lnbmVkIGludCB0eXBlID0gZnNfdW1vZGVfdG9fZHR5cGUocG9zLVx1MDAzZW1vZGUpO1xuLVx0XHRpbnQgbGVuID0gc3RybGVuKG5hbWUpO1xuIFx0XHRpbm9fdCBpbm8gPSBrZXJuZnNfaW5vKHBvcyk7XG4mIzQzO1x0XHRpbnQgbGVuO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaGUgY29weSBpcyBhbHNvIHRoZSByZXN1bWUga2V5LCBzbyBhIHRydW5jYXRlZCBuYW1lIHdvdWxkXG4mIzQzO1x0XHQgKiByZXN1bWUgaGVyZSBhZ2Fpbi4gIGdldG5hbWUoKSBjYXBzIGEgcGF0aCwgc28gb25seSBhblxuJiM0MztcdFx0ICogaW4ta2VybmVsIGNhbGxlciBjYW4gZ2V0IGhlcmU7IGVuZCB0aGUgbGlzdGluZyBpbnN0ZWFkLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XG4mIzQzO1x0XHRpZiAoV0FSTl9PTl9PTkNFKGxlbiBcdTAwM2MgMCkpXG4mIzQzO1x0XHRcdGJyZWFrO1xuIFxuIFx0XHRjdHgtXHUwMDNlcG9zID0gcG9zLVx1MDAzZWhhc2g7XG4gXHRcdGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhID0gcG9zO1xuIFx0XHRrZXJuZnNfZ2V0KHBvcyk7XG4gXG4tXHRcdGlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpIHtcbi1cdFx0XHR1cF9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBkaXJfZW1pdCgpIGNhbiBmYXVsdCwgc28gcnVuIGl0IHVubG9ja2VkLiAgQHBvcyBpcyBwaW5uZWRcbiYjNDM7XHRcdCAqIGFib3ZlIGFuZCBrZXJuZnNfZGlyX3BvcygpIHJlY2hlY2tzIGl0IG9uIHRoZSB3YXkgYmFjay5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4mIzQzO1x0XHRpZiAoIWRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpKVxuIFx0XHRcdHJldHVybiAwO1xuLVx0XHR9XG4mIzQzO1x0XHRkb3duX3JlYWQoXHUwMDI2cm9vdC1cdTAwM2VrZXJuZnNfcndzZW0pO1xuIFx0fVxuIFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4gXHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IE5VTEw7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmNcbmluZGV4IDZlNzRkYTkxZWJjYTUuLjAxY2Q1OGU1ZTQxZTcgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG5AQCAtOCw2ICYjNDM7OCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NuZXQvaWYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3NjaGVkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc2lnbmFsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuQEAgLTE3LDYgJiM0MzsxOCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3lzL21vdW50LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zeXNjYWxsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMveGF0dHIuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFwmIzM0O2tzZWxmdGVzdF9oYXJuZXNzLmhcJiMzNDtcbkBAIC00NzIsNiAmIzQzOzQ3NCwyMDQgQEAgVEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfbm9fZHVwbGljYXRlcylcbiBcdFx0XHRFWFBFQ1RfU1RSTkUobmFtZXNbaV0sIG5hbWVzW2pdKTtcbiB9XG4gXG4mIzQzOyNkZWZpbmUgUkVTVU1FX0RJUlNcdDI0XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXN1bWluZyBhdCBhbiBlbnRyeSB0aGF0IGhhcyBnb25lIG11c3QgY2Fycnkgb24gYWZ0ZXIgaXQsIG5ldmVyIGJlZm9yZS5cbiYjNDM7ICogVGFrZSBhIGNvb2tpZSBmb3IgZXZlcnkgZW50cnksIHRoZW4gcmVtb3ZlIGVhY2ggb25lLCBzZWVrIHRvIGl0cyBjb29raWVcbiYjNDM7ICogYW5kIHJlYWQgdGhlIHJlc3Q7IG5vdGhpbmcgYWxyZWFkeSByZXBvcnRlZCBtYXkgY29tZSBiYWNrLlxuJiM0MzsgKi9cbiYjNDM7VEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX2F0X3JlbW92ZWRfZW50cnkpXG4mIzQzO3tcbiYjNDM7XHQvKiBUaGUgY2dyb3VwJiMzOTtzIG93biBjb250cm9sIGZpbGVzIGFyZSBsaXN0ZWQgYWxvbmdzaWRlIG91cnMuICovXG4mIzQzO1x0Y2hhciBuYW1lc1sxMjhdW05BTUVfTUFYICYjNDM7IDFdO1xuJiM0MztcdGxvbmcgcG9zWzEyOF07XG4mIzQzO1x0Y2hhciBwYXRoW1BBVEhfTUFYXTtcbiYjNDM7XHRzdHJ1Y3QgZGlyZW50ICpkZTtcbiYjNDM7XHRpbnQgbiA9IDAsIGksIGo7XG4mIzQzO1x0RElSICpkO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRVNVTUVfRElSUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCYjMzQ7JXMvZSUwMmRcJiMzNDssIHNlbGYtXHUwMDNlc2NyYXRjaCwgaSk7XG4mIzQzO1x0XHRBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogUmVjb3JkIHRoZSBjb29raWUgYmVmb3JlIHJlYWRpbmcgZWFjaCBlbnRyeSwgd2l0aCBpdHMgbmFtZS4gKi9cbiYjNDM7XHRkID0gb3BlbmRpcihzZWxmLVx1MDAzZXNjcmF0Y2gpO1xuJiM0MztcdEFTU0VSVF9ORShkLCBOVUxMKTtcbiYjNDM7XHR3aGlsZSAoMSkge1xuJiM0MztcdFx0bG9uZyBoZXJlID0gdGVsbGRpcihkKTtcbiYjNDM7XG4mIzQzO1x0XHRkZSA9IHJlYWRkaXIoZCk7XG4mIzQzO1x0XHRpZiAoIWRlKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCYjMzQ7LlwmIzM0OykgfHwgIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIFwmIzM0Oy4uXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRBU1NFUlRfTFQobiwgKGludClBUlJBWV9TSVpFKHBvcykpO1xuJiM0MztcdFx0cG9zW25dID0gaGVyZTtcbiYjNDM7XHRcdHN0cm5jcHkobmFtZXNbbl0sIGRlLVx1MDAzZWRfbmFtZSwgTkFNRV9NQVgpO1xuJiM0MztcdFx0bmFtZXNbbl1bTkFNRV9NQVhdID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRcdG4mIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZWRpcihkKTtcbiYjNDM7XHRBU1NFUlRfR1QobiwgMSk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHQvKiBPbmx5IHRoZSBkaXJlY3RvcmllcyB3ZSBtYWRlIGNhbiBiZSByZW1vdmVkIGFuZCBwdXQgYmFjay4gKi9cbiYjNDM7XHRcdGlmIChzdHJuY21wKG5hbWVzW2ldLCBcJiMzNDtlXCYjMzQ7LCAxKSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcJiMzNDslcy8lc1wmIzM0Oywgc2VsZi1cdTAwM2VzY3JhdGNoLCBuYW1lc1tpXSk7XG4mIzQzO1x0XHRBU1NFUlRfRVEocm1kaXIocGF0aCksIDApO1xuJiM0MztcbiYjNDM7XHRcdC8qIFJlb3BlbiBzbyB0aGUgc2VlayBoYXMgdG8gcmVhY2ggdGhlIGtlcm5lbC4gKi9cbiYjNDM7XHRcdGQgPSBvcGVuZGlyKHNlbGYtXHUwMDNlc2NyYXRjaCk7XG4mIzQzO1x0XHRBU1NFUlRfTkUoZCwgTlVMTCk7XG4mIzQzO1x0XHRzZWVrZGlyKGQsIHBvc1tpXSk7XG4mIzQzO1x0XHR3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkpIHtcbiYjNDM7XHRcdFx0aWYgKCFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcJiMzNDsuXCYjMzQ7KSB8fCAhc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCYjMzQ7Li5cJiMzNDspKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBpOyBqJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0XHRBU1NFUlRfU1RSTkUoZGUtXHUwMDNlZF9uYW1lLCBuYW1lc1tqXSlcbiYjNDM7XHRcdFx0XHRcdFRIX0xPRyhcJiMzNDtyZXN1bWluZyBhdCAlcyAoZ29uZSkgd2VudCBiYWNrIHRvICVzXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIG5hbWVzW2ldLCBuYW1lc1tqXSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjbG9zZWRpcihkKTtcbiYjNDM7XG4mIzQzO1x0XHRBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgUkVTVU1FX0RJUlM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwmIzM0OyVzL2UlMDJkXCYjMzQ7LCBzZWxmLVx1MDAzZXNjcmF0Y2gsIGkpO1xuJiM0MztcdFx0RVhQRUNUX0VRKHJtZGlyKHBhdGgpLCAwKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0hVUk5fUk9VTkRTXHQ0MDBcbiYjNDM7I2RlZmluZSBDSFVSTl9CVUZTWlx0NTEyXHQvKiBzbWFsbCwgc28gYSBsaXN0aW5nIHRha2VzIHNldmVyYWwgY2FsbHMgKi9cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBmaWxlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZW5hYmxpbmcgd3JpdGUgYW5kIGdvIGF0IHRoZSBzdGFydCBvZlxuJiM0MzsgKiB0aGUgZGlzYWJsaW5nIG9uZSwgc28gdGhlIHdpbmRvdyB3aGVyZSB0aGV5IGV4aXN0IGlzIHRoZSBzaG9ydCBvbmUuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIENIVVJOX0RXRUxMX09OXHQyMDAwXG4mIzQzOyNkZWZpbmUgQ0hVUk5fRFdFTExfT0ZGXHQyMDBcbiYjNDM7XG4mIzQzO3N0cnVjdCBrZXJuZnNfZGlyZW50NjQge1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbG9uZ1x0ZF9pbm87XG4mIzQzO1x0bG9uZyBsb25nXHRcdGRfb2ZmO1xuJiM0MztcdHVuc2lnbmVkIHNob3J0XHRcdGRfcmVjbGVuO1xuJiM0MztcdHVuc2lnbmVkIGNoYXJcdFx0ZF90eXBlO1xuJiM0MztcdGNoYXJcdFx0XHRkX25hbWVbXTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBzYW1lIHJlc3VtZSwgYnV0IGluc2lkZSBvbmUgZ2V0ZGVudHMoMikgY2FsbC4gIHJtZGlyKDIpIGNhbm5vdCByZWFjaFxuJiM0MzsgKiB0aGF0IHdpbmRvdyBiZWNhdXNlIGl0ZXJhdGVfZGlyKCkgaG9sZHMgdGhlIGxpc3RlZCBkaXJlY3RvcnkmIzM5O3MgaV9yd3NlbVxuJiM0MzsgKiBmb3IgdGhlIHdob2xlIGxpc3Rpbmc7IGNncm91cC5zdWJ0cmVlX2NvbnRyb2wgY2FuLCBoYXZpbmcgbm8gVkZTXG4mIzQzOyAqIG9wZXJhdGlvbiBvbiB0aGUgbmFtZXMgaXQgYWRkcyBhbmQgcmVtb3Zlcy4gIFRoZSBmaWxlcyB0aGF0IGFyZSBub3QgdGhlXG4mIzQzOyAqIGNvbnRyb2xsZXImIzM5O3Mgc3RheSB0aHJvdWdob3V0LCBzbyBlYWNoIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS5cbiYjNDM7ICpcbiYjNDM7ICogQSBzdHJlc3MgdGVzdDogaXQgaGFzIG5vdCBiZWVuIHNlZW4gdG8gY2F0Y2ggdGhlIG9yZGVyaW5nIGJ1ZywgYW5kIGlzXG4mIzQzOyAqIGhlcmUgdG8ga2VlcCB0aGUgdW5sb2NrZWQgd2luZG93IHVuZGVyIGxvYWQgZm9yIGxvY2tkZXAgYW5kIEtBU0FOLlxuJiM0MzsgKi9cbiYjNDM7VEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX3ZzX2ludGVybmFsX3JlbW92ZSlcbiYjNDM7e1xuJiM0MztcdGNoYXIgYnVmW0NIVVJOX0JVRlNaXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4mIzQzO1x0Y2hhciBzdGFibGVbMTI4XVtOQU1FX01BWCAmIzQzOyAxXTtcbiYjNDM7XHRpbnQgbnN0YWJsZSA9IDAsIGksIHI7XG4mIzQzO1x0aW50IHdpdGhjdGwgPSAwLCB3aXRob3V0ID0gMDtcbiYjNDM7XHRpbnQgc2VlblsxMjhdLCBzdGF0dXM7XG4mIzQzO1x0cGlkX3QgY2h1cm5lcjtcbiYjNDM7XHRESVIgKmQ7XG4mIzQzO1xuJiM0MztcdC8qIFdpdGggdGhlIGNvbnRyb2xsZXIgb2ZmLCB3aGF0ZXZlciBpcyBsZWZ0IGlzIHdoYXQgbXVzdCBwZXJzaXN0LiAqL1xuJiM0MztcdEFTU0VSVF9FUSh3cml0ZV9maWxlKHNlbGYtXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cdTAwM2VkaXNhYmxlKSwgMCk7XG4mIzQzO1x0ZCA9IG9wZW5kaXIoc2VsZi1cdTAwM2VjaGlsZCk7XG4mIzQzO1x0QVNTRVJUX05FKGQsIE5VTEwpO1xuJiM0MztcdGZvciAoOzspIHtcbiYjNDM7XHRcdHN0cnVjdCBkaXJlbnQgKmRlID0gcmVhZGRpcihkKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIWRlKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCYjMzQ7LlwmIzM0OykgfHwgIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIFwmIzM0Oy4uXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRBU1NFUlRfTFQobnN0YWJsZSwgKGludClBUlJBWV9TSVpFKHN0YWJsZSkpO1xuJiM0MztcdFx0c3RybmNweShzdGFibGVbbnN0YWJsZV0sIGRlLVx1MDAzZWRfbmFtZSwgTkFNRV9NQVgpO1xuJiM0MztcdFx0c3RhYmxlW25zdGFibGVdW05BTUVfTUFYXSA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0XHRuc3RhYmxlJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0Y2xvc2VkaXIoZCk7XG4mIzQzO1x0QVNTRVJUX0dUKG5zdGFibGUsIDApO1xuJiM0MztcbiYjNDM7XHRjaHVybmVyID0gZm9yaygpO1xuJiM0MztcdEFTU0VSVF9HRShjaHVybmVyLCAwKTtcbiYjNDM7XHRpZiAoY2h1cm5lciA9PSAwKSB7XG4mIzQzO1x0XHRmb3IgKDs7KSB7XG4mIzQzO1x0XHRcdGlmICh3cml0ZV9maWxlKHNlbGYtXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cdTAwM2VlbmFibGUpKVxuJiM0MztcdFx0XHRcdF9leGl0KDEwKTtcbiYjNDM7XHRcdFx0dXNsZWVwKENIVVJOX0RXRUxMX09OKTtcbiYjNDM7XHRcdFx0aWYgKHdyaXRlX2ZpbGUoc2VsZi1cdTAwM2VzY3JhdGNoX3NjLCBzZWxmLVx1MDAzZWRpc2FibGUpKVxuJiM0MztcdFx0XHRcdF9leGl0KDExKTtcbiYjNDM7XHRcdFx0dXNsZWVwKENIVVJOX0RXRUxMX09GRik7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKHIgPSAwOyByIFx1MDAzYyBDSFVSTl9ST1VORFM7IHImIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpbnQgZmQgPSBvcGVuKHNlbGYtXHUwMDNlY2hpbGQsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkpO1xuJiM0MztcdFx0aW50IGV4dHJhID0gMDtcbiYjNDM7XHRcdGludCBuO1xuJiM0MztcbiYjNDM7XHRcdEFTU0VSVF9HRShmZCwgMCk7XG4mIzQzO1x0XHRtZW1zZXQoc2VlbiwgMCwgc2l6ZW9mKHNlZW4pKTtcbiYjNDM7XG4mIzQzO1x0XHR3aGlsZSAoKG4gPSBzeXNjYWxsKFNZU19nZXRkZW50czY0LCBmZCwgYnVmLCBzaXplb2YoYnVmKSkpIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRcdGludCBvZmYgPSAwO1xuJiM0MztcbiYjNDM7XHRcdFx0d2hpbGUgKG9mZiBcdTAwM2Mgbikge1xuJiM0MztcdFx0XHRcdHN0cnVjdCBrZXJuZnNfZGlyZW50NjQgKmRlID0gKHZvaWQgKikoYnVmICYjNDM7IG9mZik7XG4mIzQzO1x0XHRcdFx0Ym9vbCBrbm93biA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRcdFx0XHRvZmYgJiM0Mzs9IGRlLVx1MDAzZWRfcmVjbGVuO1xuJiM0MztcdFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5zdGFibGU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdFx0aWYgKCFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBzdGFibGVbaV0pKSB7XG4mIzQzO1x0XHRcdFx0XHRcdHNlZW5baV0mIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRcdFx0XHRrbm93biA9IHRydWU7XG4mIzQzO1x0XHRcdFx0XHR9XG4mIzQzO1x0XHRcdFx0aWYgKCFrbm93biBcdTAwMjZcdTAwMjYgc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCYjMzQ7LlwmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRcdFx0ICAgIHN0cmNtcChkZS1cdTAwM2VkX25hbWUsIFwmIzM0Oy4uXCYjMzQ7KSlcbiYjNDM7XHRcdFx0XHRcdGV4dHJhJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdFx0QVNTRVJUX0dFKG4sIDApO1xuJiM0MztcdFx0RVhQRUNUX0VRKGNsb3NlKGZkKSwgMCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGV4dHJhKVxuJiM0MztcdFx0XHR3aXRoY3RsJiM0MzsmIzQzOztcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0d2l0aG91dCYjNDM7JiM0Mzs7XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnN0YWJsZTsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdEFTU0VSVF9FUShzZWVuW2ldLCAxKVxuJiM0MztcdFx0XHRcdFRIX0xPRyhcJiMzNDtyb3VuZCAlZDogJXMgc2VlbiAlZCB0aW1lc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICAgciwgc3RhYmxlW2ldLCBzZWVuW2ldKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBjaHVybiBtdXN0IGhhdmUgYmVlbiBydW5uaW5nLCBvciB0aGUgbGlzdGluZ3MgcHJvdmUgbm90aGluZy4gKi9cbiYjNDM7XHRFWFBFQ1RfRVEoa2lsbChjaHVybmVyLCBTSUdLSUxMKSwgMCk7XG4mIzQzO1x0QVNTRVJUX0VRKHdhaXRwaWQoY2h1cm5lciwgXHUwMDI2c3RhdHVzLCAwKSwgY2h1cm5lcik7XG4mIzQzO1x0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSBcdTAwMjZcdTAwMjYgV1RFUk1TSUcoc3RhdHVzKSA9PSBTSUdLSUxMKVxuJiM0MztcdFx0VEhfTE9HKFwmIzM0O2NodXJuZXIgZXhpdGVkIG9uIGl0cyBvd246IHN0YXR1cyAlZFwmIzM0Oywgc3RhdHVzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGV5IGFsc28gaGF2ZSB0byBoYXZlIG92ZXJsYXBwZWQgaXQuICBIb3cgbXVjaCBkZXBlbmRzIG9uIHRoZVxuJiM0MztcdCAqIG1hY2hpbmUsIHNvIHNheSB0aGUgcmFjZSBjb3VsZCBub3QgYmUgYXJyYW5nZWQgcmF0aGVyIHRoYW4gZmFpbC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIXdpdGhjdGwgfHwgIXdpdGhvdXQpXG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7bGlzdGluZ3MgZGlkIG5vdCBzcGFuIHRoZSBjaHVybjogJWQgd2l0aCwgJWQgd2l0aG91dFwmIzM0OyxcbiYjNDM7XHRcdCAgICAgd2l0aGN0bCwgd2l0aG91dCk7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBBIHRlbGxkaXIoKSBjb29raWUgbXVzdCByZXNvbHZlIGJhY2sgdG8gdGhlIHNhbWUgZW50cnkgYWZ0ZXIgc2Vla2RpcigpLlxuICAqIGtlcm5mcyBlbmNvZGVzIHRoZSBjb29raWUgYXMgdGhlIG5vZGUmIzM5O3MgbmFtZSBoYXNoLCBzbyB0aGlzIGNvdmVyc1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMxPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFUk5GUyYjMzQ7LAogICAgJiMzNDtTWVNGUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2tlcm5mc19mb3BfcmVhZGRpciYjMzQ7LAogICAgJiMzNDtrZXJuZnNfZGlyX3BvcyYjMzQ7LAogICAgJiMzNDtrZXJuZnNfZGlyX25leHRfcG9zJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGtlcm5mcyBkaXJlY3RvcnkgbGlzdGluZyAocmVhZGRpciAvIGdldGRlbnRzKSBhbmQgcmVzdW1lIHRyYXZlcnNhbCBsb2dpYyBpbiBmcy9rZXJuZnMvZGlyLmMuIFNwZWNpZmljYWxseSwgaXQgdXBkYXRlcyBrZXJuZnNfZGlyX3BvcyBhbmQga2VybmZzX2Rpcl9uZXh0X3BvcyB0byByZXN1bWUgcmVhZGRpciBiYXNlZCBvbiBlbnRyeSBuYW1lIGNvbXBhcmlzb24gd2l0aGluIHRoZSByYi10cmVlLCBhZGRzIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSByZXN1bWUga2V5IG5hbWUsIGludHJvZHVjZXMgYSBXQVJOX09OX09OQ0UgY2hlY2sgb24gbmFtZSB0cnVuY2F0aW9uLCBhbmQgcmVsZWFzZXMvcmVhY3F1aXJlcyByb290LVx1MDAzZWtlcm5mc19yd3NlbSBhcm91bmQgZGlyX2VtaXQoKS4gVGhlc2UgY2hhbmdlcyB0b3VjaCByZWFjaGFibGUgY29yZSB2aXJ0dWFsIGZpbGVzeXN0ZW0gY29kZSBleGVyY2lzZWQgYnkgdXNlciBzcGFjZSB2aWEgZ2V0ZGVudHMvZ2V0ZGVudHM2NCBvbiBzeXNmcyBhbmQgY2dyb3VwcywgaW50cm9kdWNpbmcgY29uY3VycmVuY3kgd2luZG93cyBhbmQgbW9kaWZpZWQgbG9ja2luZyBzZW1hbnRpY3MuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBlNTU4MDIwZWFiYTYwNWY2MDgxN2Q1NGQ0OTcxZWNkZjFjYjQ1MWYwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBTZXAgMTEgMTg6MzE6NDEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZGlyLmMgYi9mcy9rZXJuZnMvZGlyLmMKaW5kZXggMDdhYmY1OWYwMjY0YS4uY2M2Mjg4ZDViNGNjNCAxMDA2NDQKLS0tIGEvZnMva2VybmZzL2Rpci5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2tlcm5mcy9kaXIuYwpAQCAtMTkwMywzMyAmIzQzOzE5MDMsNDkgQEAgc3RhdGljIGludCBrZXJuZnNfZGlyX2ZvcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogCXJldHVybiAwOwogfQogCiYjNDM7LyoKJiM0MzsgKiBGaW5kIHdoZXJlIGEgbGlzdGluZyBsZWZ0IG9mZi4gIEByZXN1bWVkIHNheXMgd2hldGhlciBAcG9zIGlzIHN0aWxsIHRoYXQKJiM0MzsgKiBlbnRyeTsgaWYgbm90LCB0aGUgc2VhcmNoIGZhbGxzIGJhY2sgdG8gQGhhc2gsIGtleWVkIGJ5IEBuYW1lIGlmIGdpdmVuLgomIzQzOyAqLwogc3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsCi0Jc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcykKJiM0MzsJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcywKJiM0MzsJY29uc3QgY2hhciAqbmFtZSwgYm9vbCAqcmVzdW1lZCkKIHsKJiM0MzsJaWYgKHJlc3VtZWQpCiYjNDM7CQkqcmVzdW1lZCA9IGZhbHNlOwogCWlmIChwb3MpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBBIHJlbmFtZSBrZWVwcyB0aGUgaGFzaCBpZiB0aGUgbmV3IG5hbWUgaGFzaGVzIHRoZSBzYW1lLCBzbwomIzQzOwkJICogY2hlY2sgQG5hbWUgdG9vLiAgT3RoZXJ3aXNlIHRoZSBjYWxsZXIgd291bGQgc3RlcCBvdmVyIHRoZQomIzQzOwkJICogZW50cnkgbm93IHNpdHRpbmcgd2hlcmUgQHBvcyB1c2VkIHRvIGJlLgomIzQzOwkJICovCiAJCWludCB2YWxpZCA9IGtlcm5mc19hY3RpdmUocG9zKSAmYW1wOyZhbXA7CiAJCQlyY3VfYWNjZXNzX3BvaW50ZXIocG9zLSZndDtfX3BhcmVudCkgPT0gcGFyZW50ICZhbXA7JmFtcDsKLQkJCWhhc2ggPT0gcG9zLSZndDtoYXNoOwomIzQzOwkJCWhhc2ggPT0gcG9zLSZndDtoYXNoICZhbXA7JmFtcDsKJiM0MzsJCQkoIW5hbWUgfHwgIXN0cmNtcChuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSkpOwogCQlrZXJuZnNfcHV0KHBvcyk7CiAJCWlmICghdmFsaWQpCiAJCQlwb3MgPSBOVUxMOwomIzQzOwkJZWxzZSBpZiAocmVzdW1lZCkKJiM0MzsJCQkqcmVzdW1lZCA9IHRydWU7CiAJfQogCWlmICghcG9zICZhbXA7JmFtcDsgKGhhc2ggJmd0OyAxKSAmYW1wOyZhbXA7IChoYXNoICZsdDsgSU5UX01BWCkpIHsKIAkJc3RydWN0IHJiX25vZGUgKm5vZGUgPSBwYXJlbnQtJmd0O2Rpci5jaGlsZHJlbi5yYl9ub2RlOwotCQl1NjQgbnNfaWQgPSBrZXJuZnNfbnNfaWQobnMpOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIEtlZXAgYSBub2RlIG9ubHkgb24gdGhlIHdheSBsZWZ0LCBzbyB0aGUgc2VhcmNoIGVuZHMgb24gdGhlCiYjNDM7CQkgKiBmaXJzdCBlbnRyeSBhZnRlciB0aGUga2V5LiAgQW4gZW1wdHkgQG5hbWUgc29ydHMgYmVmb3JlIGFsbAomIzQzOwkJICogZW50cmllcyBzaGFyaW5nIHRoZSBoYXNoLCBzbyBpdCBsYW5kcyBvbiB0aGUgZmlyc3Qgb2YgdGhlbS4KJiM0MzsJCSAqLwogCQl3aGlsZSAobm9kZSkgewotCQkJcG9zID0gcmJfdG9fa24obm9kZSk7CiYjNDM7CQkJc3RydWN0IGtlcm5mc19ub2RlICprbiA9IHJiX3RvX2tuKG5vZGUpOwogCi0JCQlpZiAoaGFzaCAmbHQ7IHBvcy0mZ3Q7aGFzaCkKLQkJCQlub2RlID0gbm9kZS0mZ3Q7cmJfbGVmdDsKLQkJCWVsc2UgaWYgKGhhc2ggJmd0OyBwb3MtJmd0O2hhc2gpCi0JCQkJbm9kZSA9IG5vZGUtJmd0O3JiX3JpZ2h0OwotCQkJZWxzZSBpZiAobnNfaWQgJmx0OyBrZXJuZnNfbnNfaWQocG9zLSZndDtucykpCiYjNDM7CQkJaWYgKGtlcm5mc19uYW1lX2NvbXBhcmUoaGFzaCwgbmFtZSA/OiAmIzM0OyYjMzQ7LCBucywga24pICZsdDsgMCkgewomIzQzOwkJCQlwb3MgPSBrbjsKIAkJCQlub2RlID0gbm9kZS0mZ3Q7cmJfbGVmdDsKLQkJCWVsc2UgaWYgKG5zX2lkICZndDsga2VybmZzX25zX2lkKHBvcy0mZ3Q7bnMpKQomIzQzOwkJCX0gZWxzZSB7CiAJCQkJbm9kZSA9IG5vZGUtJmd0O3JiX3JpZ2h0OwotCQkJZWxzZQotCQkJCWJyZWFrOwomIzQzOwkJCX0KIAkJfQogCX0KIAkvKiBTa2lwIG92ZXIgZW50cmllcyB3aGljaCBhcmUgZHlpbmcvZGVhZCBvciBpbiB0aGUgd3JvbmcgbmFtZXNwYWNlICovCkBAIC0xOTQ1LDEwICYjNDM7MTk2MSwxNCBAQCBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucywKIH0KIAogc3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9uZXh0X3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucywKLQlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgaW5vX3QgaW5vLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcykKJiM0MzsJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcywKJiM0MzsJY29uc3QgY2hhciAqbmFtZSkKIHsKLQlwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBpbm8sIHBvcyk7Ci0JaWYgKHBvcykgewomIzQzOwlib29sIHJlc3VtZWQ7CiYjNDM7CiYjNDM7CXBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGhhc2gsIHBvcywgbmFtZSwgJmFtcDtyZXN1bWVkKTsKJiM0MzsJLyogU3RlcCBvdmVyIEBwb3Mgb25seSBpZiBpdCBzdXJ2aXZlZDsgQG5hbWUgZmluZHMgdGhlIHNwb3QgaWYgbm90LiAqLwomIzQzOwlpZiAocG9zICZhbXA7JmFtcDsgcmVzdW1lZCkgewogCQlkbyB7CiAJCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJiX25leHQoJmFtcDtwb3MtJmd0O3JiKTsKIAkJCWlmICghbm9kZSkKQEAgLTE5NjYsMzQgJiM0MzsxOTg2LDU1IEBAIHN0YXRpYyBpbnQga2VybmZzX2ZvcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCkKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLSZndDtmX3BhdGguZGVudHJ5OwogCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50ID0ga2VybmZzX2RlbnRyeV9ub2RlKGRlbnRyeSk7CiAJc3RydWN0IGtlcm5mc19ub2RlICpwb3MgPSBmaWxlLSZndDtwcml2YXRlX2RhdGE7CiYjNDM7CWNoYXIgKm5hbWUgX19mcmVlKGtmcmVlKSA9IE5VTEw7CiAJc3RydWN0IGtlcm5mc19yb290ICpyb290OwogCWNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zID0gTlVMTDsKIAogCWlmICghZGlyX2VtaXRfZG90cyhmaWxlLCBjdHgpKQogCQlyZXR1cm4gMDsKIAomIzQzOwkvKgomIzQzOwkgKiBPbmUgYnVmZmVyIGZvciB0aGUgY2FsbCwgaG9sZGluZyB0aGUgbmFtZSBvZiB0aGUgZW50cnkgdGhlIGxpc3RpbmcKJiM0MzsJICogaXMgb24uICBQQVRIX01BWDoga2VybmZzIGJvdW5kcyBubyBzaW5nbGUgbmFtZS4KJiM0MzsJICovCiYjNDM7CW5hbWUgPSBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFuYW1lKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiAJcm9vdCA9IGtlcm5mc19yb290KHBhcmVudCk7CiAJZG93bl9yZWFkKCZhbXA7cm9vdC0mZ3Q7a2VybmZzX3J3c2VtKTsKIAogCWlmIChrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpKQogCQlucyA9IGtlcm5mc19pbmZvKGRlbnRyeS0mZ3Q7ZF9zYiktJmd0O25zOwogCi0JZm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtJmd0O3BvcywgcG9zKTsKJiM0MzsJZm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtJmd0O3BvcywgcG9zLCBOVUxMLCBOVUxMKTsKIAkgICAgIHBvczsKLQkgICAgIHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LSZndDtwb3MsIHBvcykpIHsKLQkJY29uc3QgY2hhciAqbmFtZSA9IGtlcm5mc19yY3VfbmFtZShwb3MpOwomIzQzOwkgICAgIHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LSZndDtwb3MsIHBvcywgbmFtZSkpIHsKIAkJdW5zaWduZWQgaW50IHR5cGUgPSBmc191bW9kZV90b19kdHlwZShwb3MtJmd0O21vZGUpOwotCQlpbnQgbGVuID0gc3RybGVuKG5hbWUpOwogCQlpbm9fdCBpbm8gPSBrZXJuZnNfaW5vKHBvcyk7CiYjNDM7CQlpbnQgbGVuOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRoZSBjb3B5IGlzIGFsc28gdGhlIHJlc3VtZSBrZXksIHNvIGEgdHJ1bmNhdGVkIG5hbWUgd291bGQKJiM0MzsJCSAqIHJlc3VtZSBoZXJlIGFnYWluLiAgZ2V0bmFtZSgpIGNhcHMgYSBwYXRoLCBzbyBvbmx5IGFuCiYjNDM7CQkgKiBpbi1rZXJuZWwgY2FsbGVyIGNhbiBnZXQgaGVyZTsgZW5kIHRoZSBsaXN0aW5nIGluc3RlYWQuCiYjNDM7CQkgKi8KJiM0MzsJCWxlbiA9IHN0cnNjcHkobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcyksIFBBVEhfTUFYKTsKJiM0MzsJCWlmIChXQVJOX09OX09OQ0UobGVuICZsdDsgMCkpCiYjNDM7CQkJYnJlYWs7CiAKIAkJY3R4LSZndDtwb3MgPSBwb3MtJmd0O2hhc2g7CiAJCWZpbGUtJmd0O3ByaXZhdGVfZGF0YSA9IHBvczsKIAkJa2VybmZzX2dldChwb3MpOwogCi0JCWlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpIHsKLQkJCXVwX3JlYWQoJmFtcDtyb290LSZndDtrZXJuZnNfcndzZW0pOwomIzQzOwkJLyoKJiM0MzsJCSAqIGRpcl9lbWl0KCkgY2FuIGZhdWx0LCBzbyBydW4gaXQgdW5sb2NrZWQuICBAcG9zIGlzIHBpbm5lZAomIzQzOwkJICogYWJvdmUgYW5kIGtlcm5mc19kaXJfcG9zKCkgcmVjaGVja3MgaXQgb24gdGhlIHdheSBiYWNrLgomIzQzOwkJICovCiYjNDM7CQl1cF9yZWFkKCZhbXA7cm9vdC0mZ3Q7a2VybmZzX3J3c2VtKTsKJiM0MzsJCWlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpCiAJCQlyZXR1cm4gMDsKLQkJfQomIzQzOwkJZG93bl9yZWFkKCZhbXA7cm9vdC0mZ3Q7a2VybmZzX3J3c2VtKTsKIAl9CiAJdXBfcmVhZCgmYW1wO3Jvb3QtJmd0O2tlcm5mc19yd3NlbSk7CiAJZmlsZS0mZ3Q7cHJpdmF0ZV9kYXRhID0gTlVMTDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jCmluZGV4IDZlNzRkYTkxZWJjYTUuLjAxY2Q1OGU1ZTQxZTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYwpAQCAtOCw2ICYjNDM7OCw3IEBACiAjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L2lmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c2NoZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKICNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKICNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKQEAgLTE3LDYgJiM0MzsxOCw3IEBACiAjaW5jbHVkZSAmbHQ7c3lzL21vdW50LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3NvY2tldC5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zeXNjYWxsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3hhdHRyLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7a3NlbGZ0ZXN0X2hhcm5lc3MuaCYjMzQ7CkBAIC00NzIsNiAmIzQzOzQ3NCwyMDQgQEAgVEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfbm9fZHVwbGljYXRlcykKIAkJCUVYUEVDVF9TVFJORShuYW1lc1tpXSwgbmFtZXNbal0pOwogfQogCiYjNDM7I2RlZmluZSBSRVNVTUVfRElSUwkyNAomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVzdW1pbmcgYXQgYW4gZW50cnkgdGhhdCBoYXMgZ29uZSBtdXN0IGNhcnJ5IG9uIGFmdGVyIGl0LCBuZXZlciBiZWZvcmUuCiYjNDM7ICogVGFrZSBhIGNvb2tpZSBmb3IgZXZlcnkgZW50cnksIHRoZW4gcmVtb3ZlIGVhY2ggb25lLCBzZWVrIHRvIGl0cyBjb29raWUKJiM0MzsgKiBhbmQgcmVhZCB0aGUgcmVzdDsgbm90aGluZyBhbHJlYWR5IHJlcG9ydGVkIG1heSBjb21lIGJhY2suCiYjNDM7ICovCiYjNDM7VEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX2F0X3JlbW92ZWRfZW50cnkpCiYjNDM7ewomIzQzOwkvKiBUaGUgY2dyb3VwJiMzOTtzIG93biBjb250cm9sIGZpbGVzIGFyZSBsaXN0ZWQgYWxvbmdzaWRlIG91cnMuICovCiYjNDM7CWNoYXIgbmFtZXNbMTI4XVtOQU1FX01BWCAmIzQzOyAxXTsKJiM0MzsJbG9uZyBwb3NbMTI4XTsKJiM0MzsJY2hhciBwYXRoW1BBVEhfTUFYXTsKJiM0MzsJc3RydWN0IGRpcmVudCAqZGU7CiYjNDM7CWludCBuID0gMCwgaSwgajsKJiM0MzsJRElSICpkOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgUkVTVU1FX0RJUlM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICYjMzQ7JXMvZSUwMmQmIzM0Oywgc2VsZi0mZ3Q7c2NyYXRjaCwgaSk7CiYjNDM7CQlBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFJlY29yZCB0aGUgY29va2llIGJlZm9yZSByZWFkaW5nIGVhY2ggZW50cnksIHdpdGggaXRzIG5hbWUuICovCiYjNDM7CWQgPSBvcGVuZGlyKHNlbGYtJmd0O3NjcmF0Y2gpOwomIzQzOwlBU1NFUlRfTkUoZCwgTlVMTCk7CiYjNDM7CXdoaWxlICgxKSB7CiYjNDM7CQlsb25nIGhlcmUgPSB0ZWxsZGlyKGQpOwomIzQzOwomIzQzOwkJZGUgPSByZWFkZGlyKGQpOwomIzQzOwkJaWYgKCFkZSkKJiM0MzsJCQlicmVhazsKJiM0MzsJCWlmICghc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7LiYjMzQ7KSB8fCAhc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7Li4mIzM0OykpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlBU1NFUlRfTFQobiwgKGludClBUlJBWV9TSVpFKHBvcykpOwomIzQzOwkJcG9zW25dID0gaGVyZTsKJiM0MzsJCXN0cm5jcHkobmFtZXNbbl0sIGRlLSZndDtkX25hbWUsIE5BTUVfTUFYKTsKJiM0MzsJCW5hbWVzW25dW05BTUVfTUFYXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJCW4mIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWNsb3NlZGlyKGQpOwomIzQzOwlBU1NFUlRfR1QobiwgMSk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBuOyBpJiM0MzsmIzQzOykgewomIzQzOwkJLyogT25seSB0aGUgZGlyZWN0b3JpZXMgd2UgbWFkZSBjYW4gYmUgcmVtb3ZlZCBhbmQgcHV0IGJhY2suICovCiYjNDM7CQlpZiAoc3RybmNtcChuYW1lc1tpXSwgJiMzNDtlJiMzNDssIDEpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAmIzM0OyVzLyVzJiMzNDssIHNlbGYtJmd0O3NjcmF0Y2gsIG5hbWVzW2ldKTsKJiM0MzsJCUFTU0VSVF9FUShybWRpcihwYXRoKSwgMCk7CiYjNDM7CiYjNDM7CQkvKiBSZW9wZW4gc28gdGhlIHNlZWsgaGFzIHRvIHJlYWNoIHRoZSBrZXJuZWwuICovCiYjNDM7CQlkID0gb3BlbmRpcihzZWxmLSZndDtzY3JhdGNoKTsKJiM0MzsJCUFTU0VSVF9ORShkLCBOVUxMKTsKJiM0MzsJCXNlZWtkaXIoZCwgcG9zW2ldKTsKJiM0MzsJCXdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkgewomIzQzOwkJCWlmICghc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7LiYjMzQ7KSB8fCAhc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7Li4mIzM0OykpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCWZvciAoaiA9IDA7IGogJmx0OyBpOyBqJiM0MzsmIzQzOykKJiM0MzsJCQkJQVNTRVJUX1NUUk5FKGRlLSZndDtkX25hbWUsIG5hbWVzW2pdKQomIzQzOwkJCQkJVEhfTE9HKCYjMzQ7cmVzdW1pbmcgYXQgJXMgKGdvbmUpIHdlbnQgYmFjayB0byAlcyYjMzQ7LAomIzQzOwkJCQkJICAgICAgIG5hbWVzW2ldLCBuYW1lc1tqXSk7CiYjNDM7CQl9CiYjNDM7CQljbG9zZWRpcihkKTsKJiM0MzsKJiM0MzsJCUFTU0VSVF9FUShta2RpcihwYXRoLCAwNzU1KSwgMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFU1VNRV9ESVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAmIzM0OyVzL2UlMDJkJiMzNDssIHNlbGYtJmd0O3NjcmF0Y2gsIGkpOwomIzQzOwkJRVhQRUNUX0VRKHJtZGlyKHBhdGgpLCAwKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIENIVVJOX1JPVU5EUwk0MDAKJiM0MzsjZGVmaW5lIENIVVJOX0JVRlNaCTUxMgkvKiBzbWFsbCwgc28gYSBsaXN0aW5nIHRha2VzIHNldmVyYWwgY2FsbHMgKi8KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSBmaWxlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZW5hYmxpbmcgd3JpdGUgYW5kIGdvIGF0IHRoZSBzdGFydCBvZgomIzQzOyAqIHRoZSBkaXNhYmxpbmcgb25lLCBzbyB0aGUgd2luZG93IHdoZXJlIHRoZXkgZXhpc3QgaXMgdGhlIHNob3J0IG9uZS4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIENIVVJOX0RXRUxMX09OCTIwMDAKJiM0MzsjZGVmaW5lIENIVVJOX0RXRUxMX09GRgkyMDAKJiM0MzsKJiM0MztzdHJ1Y3Qga2VybmZzX2RpcmVudDY0IHsKJiM0MzsJdW5zaWduZWQgbG9uZyBsb25nCWRfaW5vOwomIzQzOwlsb25nIGxvbmcJCWRfb2ZmOwomIzQzOwl1bnNpZ25lZCBzaG9ydAkJZF9yZWNsZW47CiYjNDM7CXVuc2lnbmVkIGNoYXIJCWRfdHlwZTsKJiM0MzsJY2hhcgkJCWRfbmFtZVtdOwomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgc2FtZSByZXN1bWUsIGJ1dCBpbnNpZGUgb25lIGdldGRlbnRzKDIpIGNhbGwuICBybWRpcigyKSBjYW5ub3QgcmVhY2gKJiM0MzsgKiB0aGF0IHdpbmRvdyBiZWNhdXNlIGl0ZXJhdGVfZGlyKCkgaG9sZHMgdGhlIGxpc3RlZCBkaXJlY3RvcnkmIzM5O3MgaV9yd3NlbQomIzQzOyAqIGZvciB0aGUgd2hvbGUgbGlzdGluZzsgY2dyb3VwLnN1YnRyZWVfY29udHJvbCBjYW4sIGhhdmluZyBubyBWRlMKJiM0MzsgKiBvcGVyYXRpb24gb24gdGhlIG5hbWVzIGl0IGFkZHMgYW5kIHJlbW92ZXMuICBUaGUgZmlsZXMgdGhhdCBhcmUgbm90IHRoZQomIzQzOyAqIGNvbnRyb2xsZXImIzM5O3Mgc3RheSB0aHJvdWdob3V0LCBzbyBlYWNoIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS4KJiM0MzsgKgomIzQzOyAqIEEgc3RyZXNzIHRlc3Q6IGl0IGhhcyBub3QgYmVlbiBzZWVuIHRvIGNhdGNoIHRoZSBvcmRlcmluZyBidWcsIGFuZCBpcwomIzQzOyAqIGhlcmUgdG8ga2VlcCB0aGUgdW5sb2NrZWQgd2luZG93IHVuZGVyIGxvYWQgZm9yIGxvY2tkZXAgYW5kIEtBU0FOLgomIzQzOyAqLwomIzQzO1RFU1RfRihrZXJuZnNfY2dyb3VwLCByZWFkZGlyX3Jlc3VtZV92c19pbnRlcm5hbF9yZW1vdmUpCiYjNDM7ewomIzQzOwljaGFyIGJ1ZltDSFVSTl9CVUZTWl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwomIzQzOwljaGFyIHN0YWJsZVsxMjhdW05BTUVfTUFYICYjNDM7IDFdOwomIzQzOwlpbnQgbnN0YWJsZSA9IDAsIGksIHI7CiYjNDM7CWludCB3aXRoY3RsID0gMCwgd2l0aG91dCA9IDA7CiYjNDM7CWludCBzZWVuWzEyOF0sIHN0YXR1czsKJiM0MzsJcGlkX3QgY2h1cm5lcjsKJiM0MzsJRElSICpkOwomIzQzOwomIzQzOwkvKiBXaXRoIHRoZSBjb250cm9sbGVyIG9mZiwgd2hhdGV2ZXIgaXMgbGVmdCBpcyB3aGF0IG11c3QgcGVyc2lzdC4gKi8KJiM0MzsJQVNTRVJUX0VRKHdyaXRlX2ZpbGUoc2VsZi0mZ3Q7c2NyYXRjaF9zYywgc2VsZi0mZ3Q7ZGlzYWJsZSksIDApOwomIzQzOwlkID0gb3BlbmRpcihzZWxmLSZndDtjaGlsZCk7CiYjNDM7CUFTU0VSVF9ORShkLCBOVUxMKTsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJc3RydWN0IGRpcmVudCAqZGUgPSByZWFkZGlyKGQpOwomIzQzOwomIzQzOwkJaWYgKCFkZSkKJiM0MzsJCQlicmVhazsKJiM0MzsJCWlmICghc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7LiYjMzQ7KSB8fCAhc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7Li4mIzM0OykpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlBU1NFUlRfTFQobnN0YWJsZSwgKGludClBUlJBWV9TSVpFKHN0YWJsZSkpOwomIzQzOwkJc3RybmNweShzdGFibGVbbnN0YWJsZV0sIGRlLSZndDtkX25hbWUsIE5BTUVfTUFYKTsKJiM0MzsJCXN0YWJsZVtuc3RhYmxlXVtOQU1FX01BWF0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CQluc3RhYmxlJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwljbG9zZWRpcihkKTsKJiM0MzsJQVNTRVJUX0dUKG5zdGFibGUsIDApOwomIzQzOwomIzQzOwljaHVybmVyID0gZm9yaygpOwomIzQzOwlBU1NFUlRfR0UoY2h1cm5lciwgMCk7CiYjNDM7CWlmIChjaHVybmVyID09IDApIHsKJiM0MzsJCWZvciAoOzspIHsKJiM0MzsJCQlpZiAod3JpdGVfZmlsZShzZWxmLSZndDtzY3JhdGNoX3NjLCBzZWxmLSZndDtlbmFibGUpKQomIzQzOwkJCQlfZXhpdCgxMCk7CiYjNDM7CQkJdXNsZWVwKENIVVJOX0RXRUxMX09OKTsKJiM0MzsJCQlpZiAod3JpdGVfZmlsZShzZWxmLSZndDtzY3JhdGNoX3NjLCBzZWxmLSZndDtkaXNhYmxlKSkKJiM0MzsJCQkJX2V4aXQoMTEpOwomIzQzOwkJCXVzbGVlcChDSFVSTl9EV0VMTF9PRkYpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWZvciAociA9IDA7IHIgJmx0OyBDSFVSTl9ST1VORFM7IHImIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgZmQgPSBvcGVuKHNlbGYtJmd0O2NoaWxkLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKTsKJiM0MzsJCWludCBleHRyYSA9IDA7CiYjNDM7CQlpbnQgbjsKJiM0MzsKJiM0MzsJCUFTU0VSVF9HRShmZCwgMCk7CiYjNDM7CQltZW1zZXQoc2VlbiwgMCwgc2l6ZW9mKHNlZW4pKTsKJiM0MzsKJiM0MzsJCXdoaWxlICgobiA9IHN5c2NhbGwoU1lTX2dldGRlbnRzNjQsIGZkLCBidWYsIHNpemVvZihidWYpKSkgJmd0OyAwKSB7CiYjNDM7CQkJaW50IG9mZiA9IDA7CiYjNDM7CiYjNDM7CQkJd2hpbGUgKG9mZiAmbHQ7IG4pIHsKJiM0MzsJCQkJc3RydWN0IGtlcm5mc19kaXJlbnQ2NCAqZGUgPSAodm9pZCAqKShidWYgJiM0Mzsgb2ZmKTsKJiM0MzsJCQkJYm9vbCBrbm93biA9IGZhbHNlOwomIzQzOwomIzQzOwkJCQlvZmYgJiM0Mzs9IGRlLSZndDtkX3JlY2xlbjsKJiM0MzsJCQkJZm9yIChpID0gMDsgaSAmbHQ7IG5zdGFibGU7IGkmIzQzOyYjNDM7KQomIzQzOwkJCQkJaWYgKCFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgc3RhYmxlW2ldKSkgewomIzQzOwkJCQkJCXNlZW5baV0mIzQzOyYjNDM7OwomIzQzOwkJCQkJCWtub3duID0gdHJ1ZTsKJiM0MzsJCQkJCX0KJiM0MzsJCQkJaWYgKCFrbm93biAmYW1wOyZhbXA7IHN0cmNtcChkZS0mZ3Q7ZF9uYW1lLCAmIzM0Oy4mIzM0OykgJmFtcDsmYW1wOwomIzQzOwkJCQkgICAgc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7Li4mIzM0OykpCiYjNDM7CQkJCQlleHRyYSYjNDM7JiM0Mzs7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJQVNTRVJUX0dFKG4sIDApOwomIzQzOwkJRVhQRUNUX0VRKGNsb3NlKGZkKSwgMCk7CiYjNDM7CiYjNDM7CQlpZiAoZXh0cmEpCiYjNDM7CQkJd2l0aGN0bCYjNDM7JiM0Mzs7CiYjNDM7CQllbHNlCiYjNDM7CQkJd2l0aG91dCYjNDM7JiM0Mzs7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbnN0YWJsZTsgaSYjNDM7JiM0MzspCiYjNDM7CQkJQVNTRVJUX0VRKHNlZW5baV0sIDEpCiYjNDM7CQkJCVRIX0xPRygmIzM0O3JvdW5kICVkOiAlcyBzZWVuICVkIHRpbWVzJiMzNDssCiYjNDM7CQkJCSAgICAgICByLCBzdGFibGVbaV0sIHNlZW5baV0pOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFRoZSBjaHVybiBtdXN0IGhhdmUgYmVlbiBydW5uaW5nLCBvciB0aGUgbGlzdGluZ3MgcHJvdmUgbm90aGluZy4gKi8KJiM0MzsJRVhQRUNUX0VRKGtpbGwoY2h1cm5lciwgU0lHS0lMTCksIDApOwomIzQzOwlBU1NFUlRfRVEod2FpdHBpZChjaHVybmVyLCAmYW1wO3N0YXR1cywgMCksIGNodXJuZXIpOwomIzQzOwlBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpICZhbXA7JmFtcDsgV1RFUk1TSUcoc3RhdHVzKSA9PSBTSUdLSUxMKQomIzQzOwkJVEhfTE9HKCYjMzQ7Y2h1cm5lciBleGl0ZWQgb24gaXRzIG93bjogc3RhdHVzICVkJiMzNDssIHN0YXR1cyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZXkgYWxzbyBoYXZlIHRvIGhhdmUgb3ZlcmxhcHBlZCBpdC4gIEhvdyBtdWNoIGRlcGVuZHMgb24gdGhlCiYjNDM7CSAqIG1hY2hpbmUsIHNvIHNheSB0aGUgcmFjZSBjb3VsZCBub3QgYmUgYXJyYW5nZWQgcmF0aGVyIHRoYW4gZmFpbC4KJiM0MzsJICovCiYjNDM7CWlmICghd2l0aGN0bCB8fCAhd2l0aG91dCkKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O2xpc3RpbmdzIGRpZCBub3Qgc3BhbiB0aGUgY2h1cm46ICVkIHdpdGgsICVkIHdpdGhvdXQmIzM0OywKJiM0MzsJCSAgICAgd2l0aGN0bCwgd2l0aG91dCk7CiYjNDM7fQomIzQzOwogLyoKICAqIEEgdGVsbGRpcigpIGNvb2tpZSBtdXN0IHJlc29sdmUgYmFjayB0byB0aGUgc2FtZSBlbnRyeSBhZnRlciBzZWVrZGlyKCkuCiAgKiBrZXJuZnMgZW5jb2RlcyB0aGUgY29va2llIGFzIHRoZSBub2RlJiMzOTtzIG5hbWUgaGFzaCwgc28gdGhpcyBjb3ZlcnMKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzE0NAoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDg5NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipXb3J0aCBGdXp6aW5nOiBBYnNvbHV0ZWx5ISoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIHBhdGNoIHNlcmllcyBpcyAqZGVmaW5pdGVseSogd29ydGggZnV6emluZyB3aXRoIHN5emthbGxlci4gSGVyZSYjMzk7cyB3aHkgSSYjMzk7bSBjb25maWRlbnQgaW4gdGhhdCBjb25jbHVzaW9uOgoKRmlyc3QsIGxldCYjMzk7cyBsb29rIGF0IHdoYXQmIzM5O3MgYmVlbiBjaGFuZ2VkLiBUaGUgcGF0Y2ggbW9kaWZpZXMgYGZzL2tlcm5mcy9kaXIuY2AsIHNwZWNpZmljYWxseSBga2VybmZzX2Rpcl9wb3NgLCBga2VybmZzX2Rpcl9uZXh0X3Bvc2AsIGFuZCBga2VybmZzX2ZvcF9yZWFkZGlyYC4gVGhlIGNoYW5nZXMgdG8gYGtlcm5mc19mb3BfcmVhZGRpcmAgYXJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZy4gVGhlIHJlYWRkaXIgaW1wbGVtZW50YXRpb24gZm9yIGtlcm5mcyBpcyBiZWluZyBtb2RpZmllZCwgYW5kIHRoaXMgaXMgY3J1Y2lhbCBiZWNhdXNlIGtlcm5mcyBpcyBhIGNvcmUgZmlsZXN5c3RlbSBjb21wb25lbnQsIHVzZWQgYnkgc3lzZnMsIGNncm91cGZzLCBhbmQgb3RoZXJzLiBBbnkgcmVhZGRpciBjaGFuZ2UgbmVlZHMgdG8gYmUgbG9va2VkIGF0LiBUaGlzIGlzIHNvbWV0aGluZyB0aGF0IGlzIHVzZWQgcXVpdGUgZnJlcXVlbnRseSwgYW5kIGlzIHRodXMgdmVyeSByZWFjaGFibGUuCgpLZXkgaW5kaWNhdG9ycyBvZiBmdXp6emluZyB3b3J0aCBhcmUgYmVpbmcgbWV0OiB0aGUgcGhpbG9zb3BoeSBtZW50aW9ucyBsb2dpYyBtb2RpZmljYXRpb25zLCByZWZhY3RvcmluZ3MgYW5kIGNvZGUgY2xlYW51cHMsIHJ1bnRpbWUgYXNzZXJ0aW9ucywgYW5kIHJlYWNoYWJsZSBkcml2ZXJzIGFuZCBwcm90b2NvbHMuCgpOb3csIHRoZSBjaGFuZ2VzIHRoZW1zZWx2ZXMgYXJlIHJhaXNpbmcgc29tZSByZWQgZmxhZ3MgKGluIGEgZ29vZCB3YXkgZm9yIGZ1enppbmchKToKCiogICAqKkNvbmN1cnJlbmN5IElzc3VlczoqKiBUaGUgY29kZSBub3cgZXhwbGljaXRseSBkcm9wcyBhbmQgcmVhY3F1aXJlcyBga2VybmZzX3J3c2VtYCB3aXRoaW4gdGhlIGByZWFkZGlyYCBsb29wLCBhcm91bmQgdGhlIGBkaXJfZW1pdCgpYCBjYWxsLiBUaGlzIGlzIGh1Z2UhIFRoaXMgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBjb25jdXJyZW5jeSB3aW5kb3cgd2hlcmUgY29uY3VycmVudCBmaWxlIG9wZXJhdGlvbnMgKHJlbW92YWwsIGNyZWF0aW9uLCByZW5hbWluZykgKndoaWxlKiBhIHJlYWRkaXIgaXMgaXRlcmF0aW5nLiBUaGUgY29tbWl0IGV2ZW4gYWNrbm93bGVkZ2VzIHRoaXMgd2l0aCBzdHJlc3Mgc2VsZnRlc3RzLgoKKiAgICoqQXNzZXJ0aW9uOioqIFRoZXJlJiMzOTtzIGEgbmV3IGBXQVJOX09OX09OQ0UobGVuICZsdDsgMClgIGFzc2VydGlvbi4gTmV3IGFzc2VydGlvbnMgYXJlIHByaW1lIGZ1enppbmcgdGFyZ2V0cywgZXNwZWNpYWxseSB3aGVuIHRoZXkmIzM5O3JlIGluIGNvZGUgcGF0aHMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIGhpdCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbnMuCgoqICAgKipMb2NraW5nIENoYW5nZXM6KiogVGhlIGB1cF9yZWFkYCBhbmQgYGRvd25fcmVhZGAgY2FsbHMgd2l0aGluIHRoZSBsb29wIHN1Z2dlc3QgYSBzaWduaWZpY2FudCBjaGFuZ2UgaW4gbG9ja2luZyBiZWhhdmlvciBhbmQgdGhlIHBvdGVudGlhbCBmb3IgcmFjZXMuIFRoaXMgaXMgc29tZXRoaW5nIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgaW4gYW55IG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50LgoKKiAgICoqUmVhY2hhYmlsaXR5OioqIEtlcm5mcyBpcyBmdW5kYW1lbnRhbC4gU3lzZnMgYW5kIGNncm91cHMgYXJlIG1vdW50ZWQgYW5kIGFjY2Vzc2libGUgaW4gcHJldHR5IG11Y2ggYW55IHN0YW5kYXJkIGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIHN5emthbGxlciBRRU1VL0dDRSBzZXR1cHMuIFRoYXQgZ3VhcmFudGVlcyBoaWdoIHJlYWNoYWJpbGl0eSBmb3IgdGhlIG1vZGlmaWVkIGNvZGUuCgoqICAgKipDb3JlIFN1YnN5c3RlbToqKiBLZXJuZnMgZmFsbHMgc3F1YXJlbHkgaW50byB0aGUgJiMzNDtjb3JlIGZpbGVzeXN0ZW0mIzM0OyBjYXRlZ29yeS4gVGhhdCBhbG9uZSB0cmlnZ2VycyB0aGUgbmVlZCBmb3IgZnV6enppbmcuCgpTbywgZ2l2ZW4gdGhlIGNvcmUgbmF0dXJlIG9mIGtlcm5mcywgdGhlIGNvbmN1cnJlbmN5LXJlbGF0ZWQgbW9kaWZpY2F0aW9ucywgdGhlIGludHJvZHVjZWQgYXNzZXJ0aW9uLCBhbmQgdGhlIGhpZ2ggcmVhY2hhYmlsaXR5LCB0aGUgYW5zd2VyIGlzIGEgcmVzb3VuZGluZyAmIzM0O3llcyYjMzQ7LiBOZXh0LCBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGV4YWN0IGZ1bmN0aW9ucywgS2NvbmZpZyBkZXBlbmRlbmNpZXMsIGFuZCBmaWxlcywgcHJvYmFibHkgdXNpbmcgdG9vbHMgbGlrZSBgZ3JlcHBlcmAgb3IgYHJlYWQtZmlsZWAgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB0aGUgaW1wbGljYXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tlcm5mc19mb3BfcmVhZGRpciYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2tlcm5mcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9rZXJuZnMvZGlyLmM9MTk2Mz1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLS1cbmZzL2tlcm5mcy9kaXIuYy0xOTgzLVxuZnMva2VybmZzL2Rpci5jOjE5ODQ6c3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuZnMva2VybmZzL2Rpci5jLTE5ODUte1xuLS1cbmZzL2tlcm5mcy9kaXIuYz0yMDQ1PWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga2VybmZzX2Rpcl9mb3BzID0ge1xuZnMva2VybmZzL2Rpci5jLTIwNDYtXHQucmVhZFx0XHQ9IGdlbmVyaWNfcmVhZF9kaXIsXG5mcy9rZXJuZnMvZGlyLmM6MjA0NzpcdC5pdGVyYXRlX3NoYXJlZFx0PSBrZXJuZnNfZm9wX3JlYWRkaXIsXG5mcy9rZXJuZnMvZGlyLmMtMjA0OC1cdC5yZWxlYXNlXHQ9IGtlcm5mc19kaXJfZm9wX3JlbGVhc2UsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODg5MAoJCQkJCQkJb3V0cHV0OiAxOAoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKktlcm5lbCBGaWxlc3lzdGVtIENvbmZpZ3VyYXRpb24gUmV2aWV3KioKCkFscmlnaHQsIGJlZm9yZSBJIGRpdmUgdG9vIGRlZXAsIEkgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gZm9yIGBLRVJORlNgLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBwaW5wb2ludCBleGFjdGx5IGhvdyBpdCYjMzk7cyBiZWluZyBtYW5hZ2VkIGR1cmluZyB0aGUgYnVpbGQuIE15IGZpcnN0IHRob3VnaHQgaXMgdG8ganVtcCBpbnRvIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZpbGVzLiBJJiMzOTtsbCBzdGFydCB3aXRoIGBmcy9rZXJuZnMvS2NvbmZpZ2Ag4oCTIG1ha2VzIHNlbnNlIHRvIGxvb2sgdGhlcmUgZmlyc3QsIGFzIGl0JiMzOTtzIHRoZSBtb3N0IHNwZWNpZmljIGFuZCB0YXJnZXRlZCB0byBga2VybmZzYC4gSWYgaXQmIzM5O3Mgbm90IGRlZmluZWQgdGhlcmUsIG9yIGlmIEkgd2FudCB0byBjb25maXJtIGl0cyBvdmVyYWxsIHJlbGF0aW9uc2hpcCB0byB0aGUgZ2VuZXJhbCBmaWxlc3lzdGVtIG9wdGlvbnMsIEkmIzM5O2xsIHRoZW4gbW92ZSB1cCBhIGxldmVsIGFuZCBjaGVjayBgZnMvS2NvbmZpZ2AuIEl0JiMzOTtzIGNydWNpYWwgdG8gdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jeSB0cmVlLCBhbnkgZGVmYXVsdCBzZXR0aW5ncywgYW5kIHBvdGVudGlhbCBidWlsZC10aW1lIG9wdGlvbnMgYWZmZWN0aW5nIGBLRVJORlNgIGJlZm9yZSBJIHByb2NlZWQuIFRoaXMgaXMgd2hlcmUgSSBjYW4gY29uZmlybSBvciBkZW55IGl0cyBpbmNsdXNpb24gYmFzZWQgb24gZGVwZW5kZW5jaWVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBLRVJORlMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMva2VybmZzL0tjb25maWctNS1cbmZzL2tlcm5mcy9LY29uZmlnOjY6Y29uZmlnIEtFUk5GU1xuZnMva2VybmZzL0tjb25maWctNy1cdGJvb2xcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5MTg0CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gYGZzL2tlcm5mcy9LY29uZmlnYC4gSSYjMzk7bSBnb2luZyB0byBhcHByb2FjaCB0aGlzIHdpdGggbXkgdXN1YWwgbWV0aG9kaWNhbCBleWUsIGxvb2tpbmcgZm9yIHRoZSBjb3JlIGRlc2lnbiBkZWNpc2lvbnMgYW5kIHBvdGVudGlhbCBpbXBsaWNhdGlvbnMgZm9yIG15IGFyZWEgb2YgZXhwZXJ0aXNlLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUgc2hhcGVzIHRoZSBiZWhhdmlvciBhbmQgZmVhdHVyZXMgb2Yga2VybmZzLgoKRmlyc3QsIEkmIzM5O2xsIG5lZWQgdG8gcGFyc2UgdGhlIGZpbGUsIHNvIEkmIzM5O2xsIHByb2JhYmx5IGxvb2sgZm9yIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGZpbGU6IHdoYXQgYGJvb2xgLCBgdHJpc3RhdGVgLCBvciBgc3RyaW5nYCBvcHRpb25zIGFyZSBkZWZpbmVkPyBBcmUgdGhlcmUgZGVwZW5kZW5jaWVzPyBBcmUgdGhlcmUgZGVmYXVsdCB2YWx1ZXM/IFdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2Ygc2V0dGluZyB0aG9zZSBvcHRpb25zPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHVzZXIgY29uZmlndXJhdGlvbiB0cmFuc2xhdGVzIGludG8ga2VybmVsIGJlaGF2aW9yLiBJJiMzOTtsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkZXBlbmRlbmNpZXMg4oCTIHRob3NlIGFyZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgaW50ZXJwbGF5IGJldHdlZW4gZGlmZmVyZW50IGtlcm5lbCBzdWJzeXN0ZW1zLgoKTmV4dCwgSSYjMzk7bGwgaWRlbnRpZnkgdGhlIGZlYXR1cmVzIGVuYWJsZWQgb3IgZGlzYWJsZWQgYnkgZWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBhbmQgdGhlaXIgaW1wbGljYXRpb25zLCBzbyBJJiMzOTttIHBheWluZyBhdHRlbnRpb24gdG8gYW55IGNvZGUgb3IgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgb3IgY29uZmlndXJlZCBiYXNlZCBvbiB0aGVzZSBvcHRpb25zLiBJJiMzOTtsbCBuZWVkIHRvIHRoaW5rIGFib3V0IHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4gQXJlIHRoZXJlIGFueSBmZWF0dXJlcyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgcGVyZm9ybWFuY2Ugb2YgcmVsYXRlZCBzdWJzeXN0ZW1zIHRoYXQgSSBrbm93IHdlbGw/CgpGaW5hbGx5LCBJJiMzOTtsbCBsb29rIGZvciBhbnkgaGludHMgYWJvdXQgZnV0dXJlIGRpcmVjdGlvbnMuIEFyZSB0aGVyZSBhbnkgZXhwZXJpbWVudGFsIGZlYXR1cmVzIG9yIGRlcHJlY2F0ZWQgb25lcz8gQXJlIHRoZXJlIGFueSBpbmRpY2F0aW9ucyB0aGF0IHRoZSBkZXNpZ24gaXMgZXZvbHZpbmc/IElmIHNvLCB0aGlzIGhlbHBzIG1lIHN0YXkgYXdhcmUgb2YgdGhlIGNoYW5nZXMgdGhhdCBtaWdodCBpbXBhY3QgbXkgd29yayBpbiB0aGUgZnV0dXJlLiBJIHdhbnQgdG8ga2VlcCBvbiB0b3Agb2YgdGhpbmdzLCBzbyBJJiMzOTttIGxvb2tpbmcgZm9yIHRoZSBzaWduYWxzLCB0aGUgc3VidGxlIGNsdWVzIGFib3V0IHRoZSBkaXJlY3Rpb24gb2YgZGV2ZWxvcG1lbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9rZXJuZnMvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuICAgMjpcdCNcbiAgIDM6XHQjIEtFUk5GUyBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgaXRzIHVzZXJzXG4gICA0Olx0I1xuICAgNTpcdFxuICAgNjpcdGNvbmZpZyBLRVJORlNcbiAgIDc6XHRcdGJvb2xcbiAgIDg6XHRcdGRlZmF1bHQgblxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk2MjMKCQkJCQkJCW91dHB1dDogMTgKCQkJCQkJCXRob3VnaHRzOiAxMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duLCBwcmVzZW50ZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIHRoZSBLRVJORlMgU2VsZWN0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBzZWUgd2hvJiMzOTtzIHNob3dpbmcgaW50ZXJlc3QgaW4gS0VSTkZTLiBNeSBpbml0aWFsIHJlYWN0aW9uIGlzIHRvIGltbWVkaWF0ZWx5IGNvbnNpZGVyIHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zLiBBcmUgd2UgdGFsa2luZyBhYm91dCBhIHB1cmUgcmVzZWFyY2ggaW50ZXJlc3QsIG9yIGlzIHRoZXJlIGEgc3BlY2lmaWMgcHJhY3RpY2FsIGFwcGxpY2F0aW9uIGRyaXZpbmcgdGhpcyBjaG9pY2U/IElmIGl0JiMzOTtzIHB1cmUgcmVzZWFyY2gsIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgbWVudGFsbHkgY2F0ZWdvcml6aW5nIHRoZW06IHdoYXQgYXJlIHRoZWlyIGFmZmlsaWF0aW9ucz8gQXJlIHRoZXkgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgdW5pdmVyc2l0eSB3aXRoIGEgcGFydGljdWxhcmx5IHN0cm9uZyBmb2N1cyBvbiBvcGVyYXRpbmcgc3lzdGVtcywgZmlsZSBzeXN0ZW1zLCBvciBwZXJoYXBzIGEgbmljaGUgYXJlYSBsaWtlIHNlY3VyaXR5IGtlcm5lbCBkZXNpZ24gd2hlcmUgS0VSTkZTIG1pZ2h0IGJlIHJlbGV2YW50PwoKSWYgdGhpcyBpcyBjb21pbmcgZnJvbSBhbiBpbmR1c3RyeSBwZXJzcGVjdGl2ZSwgbXkgdGhvdWdodCBwcm9jZXNzIHNoaWZ0cy4gSSYjMzk7bSB0cnlpbmcgdG8gZ2F1Z2U6IGlzIGl0IGEgc3RhcnR1cCBleHBsb3JpbmcgaW5ub3ZhdGl2ZSBzdG9yYWdlIHNvbHV0aW9ucz8gT3IgcGVyaGFwcyBhIGxhcmdlciBjb21wYW55IGludmVzdGlnYXRpbmcgaG93IEtFUk5GUyBjb3VsZCBmaXQgaW50byBhIG1vcmUgY29tcGxleCBhcmNoaXRlY3R1cmU/IFRoZSBzZWxlY3Rpb24gY291bGQgaW5kaWNhdGUgYW4gaW50ZXJlc3QgaW4gZW1iZWRkZWQgc3lzdGVtcyB3aGVyZSByZXNvdXJjZSBjb25zdHJhaW50cyBhbmQgc2VjdXJpdHkgYmVjb21lIHBhcmFtb3VudC4gSSYjMzk7bSBtZW50YWxseSBidWlsZGluZyBwcm9maWxlcyBiYXNlZCBvbiBjb21wYW55IHNpemUsIHByb2R1Y3QgZm9jdXMsIGFuZCBwdWJsaXNoZWQgcmVzZWFyY2guCgpOZXh0LCBJJiMzOTttIGxvb2tpbmcgYmV5b25kIHRoZSBzaW1wbGUgc2VsZWN0aW9uLiBXaGF0JiMzOTtzIHRoZSBjb250ZXh0PyBXaGF0IG90aGVyIHRvb2xzIG9yIHRlY2hub2xvZ2llcyBhcmUgdGhleSBjb25zaWRlcmluZyBvciB1c2luZyBhbG9uZ3NpZGUgS0VSTkZTPyBXaGF0IHByb2JsZW1zIGFyZSB0aGV5IHRyeWluZyB0byBzb2x2ZSB0aGF0IG1ha2UgS0VSTkZTIGFuIGF0dHJhY3RpdmUgb3B0aW9uPyBBcmUgdGhleSBsb29raW5nIGZvciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMsIGVuaGFuY2VkIHNlY3VyaXR5LCBvciBwZXJoYXBzIGEgbW9yZSBmbGV4aWJsZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgdGhhbiB3aGF0JiMzOTtzIGN1cnJlbnRseSBhdmFpbGFibGU/IEkmIzM5O2xsIHByb2JhYmx5IHNjYW4gZm9yIGFueSByZWxhdGVkIHByb2plY3RzIG9yIG9wZW4tc291cmNlIGNvbnRyaWJ1dGlvbnMgdGhleSBoYXZlLgoKVWx0aW1hdGVseSwgSSYjMzk7bSB0cnlpbmcgdG8gcmFwaWRseSBhc3Nlc3MgdGhlaXIgbGV2ZWwgb2YgZXhwZXJ0aXNlIGFuZCB0aGVpciBnb2Fscy4gSXMgdGhpcyBhIGNhc3VhbCAmIzM0O2xldCYjMzk7cyB0cnkgaXQmIzM0OyBhcHByb2FjaCwgb3IgaXMgdGhpcyBhIGRlZXAgZGl2ZSB3aXRoIHdlbGwtZGVmaW5lZCByZXF1aXJlbWVudHM/IFRoZSBhbnN3ZXJzIHRvIHRoZXNlIHF1ZXN0aW9ucyB3aWxsIHNpZ25pZmljYW50bHkgaW5mbHVlbmNlIG15IGV4cGVjdGF0aW9ucyBhbmQgaG93IEkgbWlnaHQgcmVzcG9uZCBvciBhZHZpc2UgdGhlbS4gSSYjMzk7bSBhbHJlYWR5IGZvcm11bGF0aW5nIHF1ZXN0aW9ucyBpbiBteSBtaW5kLCBzdWNoIGFzICYjMzQ7V2hhdCBwcm9ibGVtIGFyZSB5b3UgaG9waW5nIHRvIGFkZHJlc3Mgd2l0aCBLRVJORlM/JiMzNDssICYjMzQ7V2hhdCBhcmUgeW91ciBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnM/JiMzNDssIGFuZCAmIzM0O1doYXQmIzM5O3MgdGhlIGN1cnJlbnQgZmlsZSBzeXN0ZW0gc29sdXRpb24geW91IGFyZSB3b3JraW5nIHdpdGg/JiMzNDsuIFRoZSBhbnN3ZXJzIHRvIHRob3NlIHF1ZXN0aW9ucyB3aWxsIGdyZWF0bHkgaW5mb3JtIG15IG93biBhbmFseXNpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c2VsZWN0IEtFUk5GUyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9yZXNjdHJsL0tjb25maWc9MT1jb25maWcgUkVTQ1RSTF9GU1xuLS1cbmZzL3Jlc2N0cmwvS2NvbmZpZy0zLVx0ZGVwZW5kcyBvbiBBUkNIX0hBU19DUFVfUkVTQ1RSTFxuZnMvcmVzY3RybC9LY29uZmlnOjQ6XHRzZWxlY3QgS0VSTkZTXG5mcy9yZXNjdHJsL0tjb25maWctNS1cdHNlbGVjdCBQUk9DX0NQVV9SRVNDVFJMIGlmIFBST0NfRlNcbi0tXG5mcy9zeXNmcy9LY29uZmlnPTI9Y29uZmlnIFNZU0ZTXG4tLVxuZnMvc3lzZnMvS2NvbmZpZy00LVx0ZGVmYXVsdCB5XG5mcy9zeXNmcy9LY29uZmlnOjU6XHRzZWxlY3QgS0VSTkZTXG5mcy9zeXNmcy9LY29uZmlnLTYtXHRoZWxwXG4tLVxuaW5pdC9LY29uZmlnPTcyND1jb25maWcgUFNJXG5pbml0L0tjb25maWctNzI1LVx0Ym9vbCBcJiMzNDtQcmVzc3VyZSBzdGFsbCBpbmZvcm1hdGlvbiB0cmFja2luZ1wmIzM0O1xuaW5pdC9LY29uZmlnOjcyNjpcdHNlbGVjdCBLRVJORlNcbmluaXQvS2NvbmZpZy03MjctXHRoZWxwXG4tLVxuaW5pdC9LY29uZmlnPTEwNTY9bWVudWNvbmZpZyBDR1JPVVBTXG5pbml0L0tjb25maWctMTA1Ny1cdGJvb2wgXCYjMzQ7Q29udHJvbCBHcm91cCBzdXBwb3J0XCYjMzQ7XG5pbml0L0tjb25maWc6MTA1ODpcdHNlbGVjdCBLRVJORlNcbmluaXQvS2NvbmZpZy0xMDU5LVx0aGVscFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDM2NgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBwcmVzZW50ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqS2VybmVsIEZpbGVzeXN0ZW0gRGVwZW5kZW5jaWVzOiBBIERlZXAgRGl2ZSoqCgpSaWdodCwgc28sIGBzeXNmc2AgaGFzIGJlZW4gc2V0IHVwIHRvIHNlbGVjdCBga2VybmZzYC4gQW5kLCBoYW5nIG9uLCBpdCBhcHBlYXJzIGBjZ3JvdXBzYCBhcmUgZG9pbmcgdGhlIHNhbWUgLSBzZWxlY3RpbmcgYGtlcm5mc2AuIEludHJpZ3VpbmchIFRoYXQgd2FycmFudHMgZnVydGhlciBpbnNwZWN0aW9uLiBUaGUgZGVzaWduIGxvZ2ljIGhlcmUgaXMgaW50ZXJlc3RpbmcsIGFuZCBJIG5lZWQgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGRlcGVuZGVuY3kuIExldCYjMzk7cyBkZWx2ZSBpbnRvIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uIFRvIHNlZSB0aGUgc3BlY2lmaWNzLCBJIHNob3VsZCBjaGVjayB0aGUgcmVsZXZhbnQgYEtjb25maWdgIGZpbGUsIHNwZWNpZmljYWxseSBgZnMvc3lzZnMvS2NvbmZpZ2AsIHRvIHNlZSBwcmVjaXNlbHkgKndoeSogYHN5c2ZzYCBpcyBzZWxlY3RpbmcgYGtlcm5mc2AuIFRoaXMgd2lsbCBjbGFyaWZ5IHRoZSBjb3JlIGRlcGVuZGVuY3kgc2VsZWN0aW9uLCBhbmQgc2hvdWxkIGV4cGxhaW4gdGhlIHVuZGVybHlpbmcgc3RydWN0dXJhbCBkZXNpZ24uIFVuZGVyc3RhbmRpbmcgdGhlICYjMzk7d2h5JiMzOTsgaGVyZSBpcyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIGtlcm5lbCBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmUsIGFuZCBob3cgdGhlc2UgY29tcG9uZW50cyBpbnRlcnJlbGF0ZS4gSSB3b25kZXIgd2hhdCB0aGUgcmFtaWZpY2F0aW9ucyBvZiB0aGlzIGFyZT8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9zeXNmcy9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0Y29uZmlnIFNZU0ZTXG4gICAzOlx0XHRib29sIFwmIzM0O3N5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnRcJiMzNDsgaWYgRVhQRVJUXG4gICA0Olx0XHRkZWZhdWx0IHlcbiAgIDU6XHRcdHNlbGVjdCBLRVJORlNcbiAgIDY6XHRcdGhlbHBcbiAgIDc6XHRcdFRoZSBzeXNmcyBmaWxlc3lzdGVtIGlzIGEgdmlydHVhbCBmaWxlc3lzdGVtIHRoYXQgdGhlIGtlcm5lbCB1c2VzIHRvXG4gICA4Olx0XHRleHBvcnQgaW50ZXJuYWwga2VybmVsIG9iamVjdHMsIHRoZWlyIGF0dHJpYnV0ZXMsIGFuZCB0aGVpclxuICAgOTpcdFx0cmVsYXRpb25zaGlwcyB0byBvbmUgYW5vdGhlci5cbiAgMTA6XHRcbiAgMTE6XHRcdFVzZXJzIGNhbiB1c2Ugc3lzZnMgdG8gYXNjZXJ0YWluIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcnVubmluZ1xuICAxMjpcdFx0a2VybmVsLCBzdWNoIGFzIHRoZSBkZXZpY2VzIHRoZSBrZXJuZWwgaGFzIGRpc2NvdmVyZWQgb24gZWFjaCBidXMgYW5kXG4gIDEzOlx0XHR3aGljaCBkcml2ZXIgZWFjaCBpcyBib3VuZCB0by4gc3lzZnMgY2FuIGFsc28gYmUgdXNlZCB0byB0dW5lIGRldmljZXNcbiAgMTQ6XHRcdGFuZCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcy5cbiAgMTU6XHRcbiAgMTY6XHRcdFNvbWUgc3lzdGVtIGFnZW50cyByZWx5IG9uIHRoZSBpbmZvcm1hdGlvbiBpbiBzeXNmcyB0byBvcGVyYXRlLlxuICAxNzpcdFx0L3NiaW4vaG90cGx1ZyB1c2VzIGRldmljZSBhbmQgb2JqZWN0IGF0dHJpYnV0ZXMgaW4gc3lzZnMgdG8gYXNzaXN0IGluXG4gIDE4Olx0XHRkZWxlZ2F0aW5nIHBvbGljeSBkZWNpc2lvbnMsIGxpa2UgcGVyc2lzdGVudGx5IG5hbWluZyBkZXZpY2VzLlxuICAxOTpcdFxuICAyMDpcdFx0c3lzZnMgaXMgY3VycmVudGx5IHVzZWQgYnkgdGhlIGJsb2NrIHN1YnN5c3RlbSB0byBtb3VudCB0aGUgcm9vdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDkyMgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDY4MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLZXJuZnMgRGlyZWN0b3J5IFJlYWRkaXIgTG9naWM6IEZvY3VzIFN5bWJvbCBBbmFseXNpcyoqCgpPa2F5LCBzbyBgU1lTRlNgIGFuZCBgQ0dST1VQU2AgYm90aCBkZWZhdWx0IHRvIGFuZCBzZWxlY3QgYEtFUk5GU2AsIGFuZCBgQ09ORklHX1NZU0ZTYCBpcyBzdGFuZGFyZC4gTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgaG93IHRoZSByZWFkZGlyIGZ1bmN0aW9uYWxpdHkgd2l0aGluIGBrZXJuZnNgIGlzIGltcGxlbWVudGVkIGFuZCBpZiBteSBmdXp6aW5nIGVmZm9ydHMgd291bGQgYmUgYmVzdCBzZXJ2ZWQgZm9jdXNpbmcgb24gdGhhdCBhcmVhLgoKTGV0JiMzOTtzIHNlZSwgSSBuZWVkIHRvIGNoZWNrIHdoYXQgZnVuY3Rpb25zIGFyZSBtb2RpZmllZCBpbiBgZnMva2VybmZzL2Rpci5jYC4gSSBzZWUgYGtlcm5mc19kaXJfcG9zYCwgYGtlcm5mc19kaXJfbmV4dF9wb3NgLCBhbmQgYGtlcm5mc19mb3BfcmVhZGRpcmAuIE5vdywgYXJlIHRoZXNlIHN0YXRpYyBmdW5jdGlvbnMgaW5saW5lZCBvciBhcmUgdGhleSBkaXN0aW5jdCBzeW1ib2xzIHdpdGhpbiBgdm1saW51eGA/IFRoYXQmIzM5O3MgdGhlIGNydWNpYWwgcXVlc3Rpb24uIFN0YXRpYyBmdW5jdGlvbnMgaW4gQyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gYmUgaW5saW5lZCwgb3Igbm90IQoKT2theSwgdGltZSB0byBjb25zdWx0IHRoZSBGb2N1c1N5bWJvbHMgZ3VpZGVsaW5lcyBpbiBTZWN0aW9uIDQuIFRoZXkgZW1waGFzaXplIGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIGZ1bmN0aW9ucyBhbmQgdGFyZ2V0aW5nIHNwZWNpZmljIGZlYXR1cmUgbG9naWMgYW5kIGVudHJ5cG9pbnRzLiBDcnVjaWFsbHksIGl0IGhpZ2hsaWdodHMgdGhlIGNoYWxsZW5nZSB3aXRoIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb25zLCBhbmQgaG93IHRoZXkgbGFjayBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGFuZCB0aGVyZWZvcmUsIGFyZW4mIzM5O3QgdGFyZ2V0YWJsZSB2aWEgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuIElmIGNoYW5nZXMgYXJlICpwcmltYXJpbHkqIGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgSSBzaG91bGQgaWRlbnRpZnkgbm9uLXN0YXRpYyBjYWxsZXIgZnVuY3Rpb25zIHRoYXQgZXhlcmNpc2UgdGhvc2Ugc3RhdGljIGlubGluZSBoZWxwZXJzIQoKQWghIGBrZXJuZnNfZm9wX3JlYWRkaXJgIGlzIHRoZSBmaWxlXF9vcGVyYXRpb25zIGAuaXRlcmF0ZV9zaGFyZWRgIGNhbGxiYWNrISBUaGlzIGlzIHByb21pc2luZyBiZWNhdXNlIGFueSBmdW5jdGlvbiB3aG9zZSBhZGRyZXNzIGlzIHRha2VuLCBhcyBpbiB0aGUgY2FzZSB3aXRoIGZ1bmN0aW9uIHBvaW50ZXJzLCBjYW4gTk9UIGJlIGlubGluZWQgYXdheSBieSB0aGUgY29tcGlsZXIhCgpCdXQgd2hhdCBhYm91dCBga2VybmZzX2Rpcl9wb3NgIGFuZCBga2VybmZzX2Rpcl9uZXh0X3Bvc2A/IFRoZXkgKm1pZ2h0KiBiZSBpbmxpbmVkIGludG8gYGtlcm5mc19mb3BfcmVhZGRpcmAsIG9yIHRoZXkgKm1pZ2h0KiBleGlzdCBhcyBkaXN0aW5jdCBzeW1ib2xzIGFzIHdlbGwuCgpTaW5jZSBJJiMzOTttIHJlYWxseSBmb2N1c2luZyBvbiB0aGlzIGtlcm5mcyBkaXJlY3RvcnkgcmVhZGRpciBsb2dpYywgSSYjMzk7bSB0aGlua2luZyB0aGF0IGxpc3RpbmcgYGtlcm5mc19mb3BfcmVhZGRpcmAsIGFsb25nIHdpdGggYGtlcm5mc19kaXJfcG9zYCBhbmQgYGtlcm5mc19kaXJfbmV4dF9wb3NgIHNlZW1zIHZlcnkgc3BlY2lmaWMgYW5kIGZvY3VzZWQuIEkgbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggYW55IHBvc3NpYmxlIGRpbHV0aW9uIG9mIHRoZSBmdXp6aW5nIGVmZm9ydC4KCk5vdywgYSB2ZXJ5IGNydWNpYWwgcXVlc3Rpb246IGNhbiBga2VybmZzX2Rpcl9wb3NgIG9yIGBrZXJuZnNfZGlyX25leHRfcG9zYCBiZSBjYWxsZWQgZnJvbSAqYW55d2hlcmUqIGVsc2U/IFRoaXMgaXMgY3JpdGljYWwhIEkgbmVlZCB0byBlbnN1cmUgdGhleSBhcmUgdHJ1bHkgc3BlY2lmaWMgdG8gdGhpcyByZWFkZGlyIHBhdGguIEkmIzM5O20gZ29pbmcgdG8gY2hlY2sgdGhpcyBxdWlja2x5IHdpdGggYGdyZXBwZXJgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtrZXJuZnNfZGlyX3BvcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2tlcm5mcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9rZXJuZnMvZGlyLmM9MTkwMD1zdGF0aWMgaW50IGtlcm5mc19kaXJfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXG4tLVxuZnMva2VybmZzL2Rpci5jLTE5MDktICovXG5mcy9rZXJuZnMvZGlyLmM6MTkxMDpzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcbmZzL2tlcm5mcy9kaXIuYy0xOTExLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyxcbi0tXG5mcy9rZXJuZnMvZGlyLmM9MTk2Mz1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLS1cbmZzL2tlcm5mcy9kaXIuYy0xOTY4LVxuZnMva2VybmZzL2Rpci5jOjE5Njk6XHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIG5hbWUsIFx1MDAyNnJlc3VtZWQpO1xuZnMva2VybmZzL2Rpci5jLTE5NzAtXHQvKiBTdGVwIG92ZXIgQHBvcyBvbmx5IGlmIGl0IHN1cnZpdmVkOyBAbmFtZSBmaW5kcyB0aGUgc3BvdCBpZiBub3QuICovXG4tLVxuZnMva2VybmZzL2Rpci5jPTE5ODQ9c3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuLS1cbmZzL2tlcm5mcy9kaXIuYy0yMDA5LVxuZnMva2VybmZzL2Rpci5jOjIwMTA6XHRmb3IgKHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcywgTlVMTCwgTlVMTCk7XG5mcy9rZXJuZnMvZGlyLmMtMjAxMS1cdCAgICAgcG9zO1xuLS1cbmZzL2tlcm5mcy9kaXIuYy0yMDMxLVx0XHQgKiBkaXJfZW1pdCgpIGNhbiBmYXVsdCwgc28gcnVuIGl0IHVubG9ja2VkLiAgQHBvcyBpcyBwaW5uZWRcbmZzL2tlcm5mcy9kaXIuYzoyMDMyOlx0XHQgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suXG5mcy9rZXJuZnMvZGlyLmMtMjAzMy1cdFx0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNjIxCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkludmVzdGlnYXRpbmcgYSBQb3RlbnRpYWwgSXNzdWUqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBjb2RlIGFuZCBJIG5lZWQgdG8gYmUgdGhvcm91Z2guIEkmIzM5O3ZlIGFscmVhZHkgbG9va2VkIGF0IFggYW5kIFksIGFuZCBiYXNlZCBvbiB0aGF0IGFuYWx5c2lzLCBJJiMzOTttIHN0YXJ0aW5nIHRvIHN1c3BlY3Qgc29tZXRoaW5nIG1pZ2h0IGJlIGhhcHBlbmluZyB3aXRoIHRoZSBkaXJlY3RvcnkgaXRlcmF0aW9uLiBTbywgdG8gZW5zdXJlIEkmIzM5O20gY292ZXJpbmcgYWxsIGJhc2VzLCBJIHdhbnQgdG8gbWFrZSBzdXJlIEkgc2NydXRpbml6ZSBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgdG9vLiBJdCYjMzk7cyBhIGtleSBmdW5jdGlvbiBpbiB0aGlzIGRpcmVjdG9yeSBuYXZpZ2F0aW9uIGxvZ2ljLCBhbmQgSSBuZWVkIHRvIHJ1bGUgb3V0IGFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggaXRzIGltcGxlbWVudGF0aW9uIG9yIGl0cyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBvdGhlciBjb21wb25lbnRzLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgZ29pbmcgb24gdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tlcm5mc19kaXJfbmV4dF9wb3MmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9rZXJuZnMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMva2VybmZzL2Rpci5jPTE5MTA9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXG4tLVxuZnMva2VybmZzL2Rpci5jLTE5NjItXG5mcy9rZXJuZnMvZGlyLmM6MTk2MzpzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuZnMva2VybmZzL2Rpci5jLTE5NjQtXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxuLS1cbmZzL2tlcm5mcy9kaXIuYz0xOTg0PXN0YXRpYyBpbnQga2VybmZzX2ZvcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMjAxMS1cdCAgICAgcG9zO1xuZnMva2VybmZzL2Rpci5jOjIwMTI6XHQgICAgIHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBuYW1lKSkge1xuZnMva2VybmZzL2Rpci5jLTIwMTMtXHRcdHVuc2lnbmVkIGludCB0eXBlID0gZnNfdW1vZGVfdG9fZHR5cGUocG9zLVx1MDAzZW1vZGUpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzEwMgoJCQkJCQkJb3V0cHV0OiAyMTAKCQkJCQkJCXRob3VnaHRzOiA3MTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgS2VybmZzIERpcmVjdG9yeSBJdGVyYXRpb24gZm9yIEZ1enppbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gV2UmIzM5O3JlIGxvb2tpbmcgYXQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gcmVhZGluZyBkaXJlY3RvcmllcyB3aXRoaW4gYGtlcm5mc2AsIHNwZWNpZmljYWxseSBga2VybmZzX2Rpcl9wb3NgLCBga2VybmZzX2Rpcl9uZXh0X3Bvc2AsIGFuZCBga2VybmZzX2ZvcF9yZWFkZGlyYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGFjdCBvZiB0aGVzZSBjaGFuZ2VzIGFuZCBob3cgdGhleSByZWxhdGUgdG8gcG90ZW50aWFsIGZ1enppbmcgdGFyZ2V0cy4KCkZpcnN0LCBJJiMzOTttIGV4YW1pbmluZyB0aGUgY29kZSBjaGFuZ2VzLiBga2VybmZzX2Rpcl9wb3NgIGFwcGVhcnMgdG8gYmUgYSBrZXkgZnVuY3Rpb24gZm9yIHBvc2l0aW9uaW5nIHdpdGhpbiBhIGRpcmVjdG9yeSwgdmFsaWRhdGluZyB0aGUgY3VycmVudCBwb3NpdGlvbiwgcGFyZW50IG5vZGUsIGFuZCBuYW1lLiBJdCBsb29rcyBsaWtlIHRoZSByYnRyZWUgd2FsayBsb2dpYyBpcyB1cGRhdGVkIGhlcmUgdXNpbmcgYGtlcm5mc19uYW1lX2NvbXBhcmVgLiBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgdGhlbiBidWlsZHMgb24gdGhpcywgYWR2YW5jaW5nIHRoZSBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiBga2VybmZzX2Rpcl9wb3NgLiBDcnVjaWFsbHksIGBrZXJuZnNfZm9wX3JlYWRkaXJgIHNlZW1zIHRvIGJlIHRoZSBtYWluIHJlYWRkaXIgZW50cnkgcG9pbnQgZm9yIGtlcm5mcyBtb3VudHMuIFRoZXJlJiMzOTtzIG1lbW9yeSBhbGxvY2F0aW9uIHVzaW5nIGBrbWFsbG9jYCBoZXJlLCBjb3VwbGVkIHdpdGggc3RyaW5nIGNvcHlpbmcgdXNpbmcgYHN0cnNjcHlgLCB3aGljaCBhbHdheXMgbWFrZXMgbWUgY2F1dGlvdXMuIFRoZSBtb3N0IGludGVyZXN0aW5nIGFzcGVjdCBpcyB0aGUgbG9ja2luZyBtZWNoYW5pc20sIHdoZXJlIGBrZXJuZnNfcndzZW1gIGlzIHVubG9ja2VkICphcm91bmQqIGBkaXJfZW1pdGAgYW5kIHRoZW4gcmUtYWNxdWlyZWQuIFRoYXQmIzM5O3MgYSBjbGFzc2ljIGFyZWEgdG8gbG9vayBmb3IgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBvdGhlciBpc3N1ZXMuIFBsdXMsIHRoZXJlJiMzOTtzIGEgbmV3IGBXQVJOX09OX09OQ0VgIGNoZWNrLgoKVGhpcyBkaXJlY3RseSBhZmZlY3RzIGhvdyBgZ2V0ZGVudHNgIC8gYHJlYWRkaXJgIHdvcmtzIG9uIGBrZXJuZnNgIG1vdW50cyBsaWtlIGBzeXNmc2AsIGBjZ3JvdXBmc2AsIGFuZCBgcmVzY3RybGAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBhcmUgdGhlcmUgYW55IHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucz8gTGV0JiMzOTtzIGNoZWNrOiBgS0VSTkZTYCBhbmQgYFNZU0ZTYC4gWWVwLCBgQ09ORklHX0tFUk5GU2AgaXMgc2VsZWN0ZWQgYnkgYENPTkZJR19TWVNGU2AsIHdoaWNoIGlzIHN0YW5kYXJkIG9uIGFtZDY0LCBtZWFuaW5nIHRoYXQgdGhpcyB3aWxsIGxpa2VseSBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0LgoKTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBga2VybmZzX2ZvcF9yZWFkZGlyYCBpcyBhIGdvb2QgRm9jdXNTeW1ib2wuIFllcywgaXQmIzM5O3MgdGhlIGNvcmUgZW50cnkgcG9pbnQgZm9yIHJlYWRkaXIgb24ga2VybmZzLiBUaGUgb3RoZXIgZnVuY3Rpb25zIGFyZSBoZWxwZXJzIHRoYXQgaW1wbGVtZW50IHRoZSByZXN1bWUgbG9naWMuIFRoZXkmIzM5O3JlIGFsbCBpbiBgZnMva2VybmZzL2Rpci5jYCwgd2hpY2ggbWFrZXMgaXQgZWFzeSB0byB1bmRlcnN0YW5kIHRoZSBzY29wZS4KCkFyZSB0aGVyZSBvdGhlciBzeW1ib2xzIHRoYXQgYXJlIGxpa2VseSB0byBiZSBhZmZlY3RlZD8gTm8uCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZG91YmxlLWNoZWNrIHRoZSBmdXp6aW5nIGluc3RydWN0aW9uczogaXQgbG9va3MgbGlrZSB0aGlzIHdhcnJhbnRzIGZ1enppbmcgYmVjYXVzZSBpdCBtb2RpZmllcyBrZXJuZnMgZGlyZWN0b3J5IGl0ZXJhdGlvbiBhbmQgcmVzdW1lIGxvZ2ljLCBpbnZvbHZlcyB1bmxvY2tpbmcgYGtlcm5mc19yd3NlbWAgYWNyb3NzIGBkaXJfZW1pdGAsIG1lbW9yeSBhbGxvY2F0aW9uLCBhbmQgY29udGFpbnMgYSBuZXcgYFdBUk5fT05fT05DRWAgYXNzZXJ0aW9uLiBFbmFibGVDb25maWdzIGFyZSBbJiMzNDtLRVJORlMmIzM0OywgJiMzNDtTWVNGUyYjMzQ7XS4gVGhlIEZvY3VzU3ltYm9scyBhcmUgWyYjMzQ7a2VybmZzX2ZvcF9yZWFkZGlyJiMzNDssICYjMzQ7a2VybmZzX2Rpcl9wb3MmIzM0OywgJiMzNDtrZXJuZnNfZGlyX25leHRfcG9zJiMzNDtdLgoKRXZlcnl0aGluZyBzZWVtcyBjbGVhciwgd2VsbC1yZWFzb25lZCwgYW5kIGZvY3VzZWQuIEkmIzM5O20gY29uZmlkZW50IGluIHRoaXMgYXNzZXNzbWVudC4gSXQmIzM5O3MgdGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLRVJORlMmIzM0OywKICAgICYjMzQ7U1lTRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrZXJuZnNfZm9wX3JlYWRkaXImIzM0OywKICAgICYjMzQ7a2VybmZzX2Rpcl9wb3MmIzM0OywKICAgICYjMzQ7a2VybmZzX2Rpcl9uZXh0X3BvcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBrZXJuZnMgZGlyZWN0b3J5IGxpc3RpbmcgKHJlYWRkaXIgLyBnZXRkZW50cykgYW5kIHJlc3VtZSB0cmF2ZXJzYWwgbG9naWMgaW4gZnMva2VybmZzL2Rpci5jLiBTcGVjaWZpY2FsbHksIGl0IHVwZGF0ZXMga2VybmZzX2Rpcl9wb3MgYW5kIGtlcm5mc19kaXJfbmV4dF9wb3MgdG8gcmVzdW1lIHJlYWRkaXIgYmFzZWQgb24gZW50cnkgbmFtZSBjb21wYXJpc29uIHdpdGhpbiB0aGUgcmItdHJlZSwgYWRkcyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgcmVzdW1lIGtleSBuYW1lLCBpbnRyb2R1Y2VzIGEgV0FSTl9PTl9PTkNFIGNoZWNrIG9uIG5hbWUgdHJ1bmNhdGlvbiwgYW5kIHJlbGVhc2VzL3JlYWNxdWlyZXMgcm9vdC1cdTAwM2VrZXJuZnNfcndzZW0gYXJvdW5kIGRpcl9lbWl0KCkuIFRoZXNlIGNoYW5nZXMgdG91Y2ggcmVhY2hhYmxlIGNvcmUgdmlydHVhbCBmaWxlc3lzdGVtIGNvZGUgZXhlcmNpc2VkIGJ5IHVzZXIgc3BhY2UgdmlhIGdldGRlbnRzL2dldGRlbnRzNjQgb24gc3lzZnMgYW5kIGNncm91cHMsIGludHJvZHVjaW5nIGNvbmN1cnJlbmN5IHdpbmRvd3MgYW5kIG1vZGlmaWVkIGxvY2tpbmcgc2VtYW50aWNzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLRVJORlMmIzM0OywKICAgICYjMzQ7U1lTRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrZXJuZnNfZm9wX3JlYWRkaXImIzM0OywKICAgICYjMzQ7a2VybmZzX2Rpcl9wb3MmIzM0OywKICAgICYjMzQ7a2VybmZzX2Rpcl9uZXh0X3BvcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBrZXJuZnMgZGlyZWN0b3J5IGxpc3RpbmcgKHJlYWRkaXIgLyBnZXRkZW50cykgYW5kIHJlc3VtZSB0cmF2ZXJzYWwgbG9naWMgaW4gZnMva2VybmZzL2Rpci5jLiBTcGVjaWZpY2FsbHksIGl0IHVwZGF0ZXMga2VybmZzX2Rpcl9wb3MgYW5kIGtlcm5mc19kaXJfbmV4dF9wb3MgdG8gcmVzdW1lIHJlYWRkaXIgYmFzZWQgb24gZW50cnkgbmFtZSBjb21wYXJpc29uIHdpdGhpbiB0aGUgcmItdHJlZSwgYWRkcyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgcmVzdW1lIGtleSBuYW1lLCBpbnRyb2R1Y2VzIGEgV0FSTl9PTl9PTkNFIGNoZWNrIG9uIG5hbWUgdHJ1bmNhdGlvbiwgYW5kIHJlbGVhc2VzL3JlYWNxdWlyZXMgcm9vdC1cdTAwM2VrZXJuZnNfcndzZW0gYXJvdW5kIGRpcl9lbWl0KCkuIFRoZXNlIGNoYW5nZXMgdG91Y2ggcmVhY2hhYmxlIGNvcmUgdmlydHVhbCBmaWxlc3lzdGVtIGNvZGUgZXhlcmNpc2VkIGJ5IHVzZXIgc3BhY2UgdmlhIGdldGRlbnRzL2dldGRlbnRzNjQgb24gc3lzZnMgYW5kIGNncm91cHMsIGludHJvZHVjaW5nIGNvbmN1cnJlbmN5IHdpbmRvd3MgYW5kIG1vZGlmaWVkIGxvY2tpbmcgc2VtYW50aWNzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyBrZXJuZnMgZGlyZWN0b3J5IGl0ZXJhdGlvbiAoYGtlcm5mc19mb3BfcmVhZGRpcmApIHRvIHByb3Blcmx5IGhhbmRsZSByZWFkZGlyIHJlc3VtcHRpb24gd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIG9yIHJlbmFtZWQgY29uY3VycmVudGx5LCBieSBrZXlpbmcgcG9zaXRpb24gb24gdGhlIG5vZGUgbmFtZSBpbiBhZGRpdGlvbiB0byBpdHMgaGFzaCBhbmQgZHJvcHBpbmcgYGtlcm5mc19yd3NlbWAgYXJvdW5kIGBkaXJfZW1pdCgpYC5cblxuLSBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb246IEEgdGVtcG9yYXJ5IGJ1ZmZlciBgbmFtZWAgaXMgYWxsb2NhdGVkIHZpYSBga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTClgLiBCZWZvcmUgYW55IHJlYWQsIGl0IGlzIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpYC4gVGhlIHN0cmluZyBjb21wYXJpc29uIGZ1bmN0aW9ucyAoYHN0cmNtcGApIGFuZCBgZGlyX2VtaXQoKWAgb25seSBhY2Nlc3MgdGhlIHBvcHVsYXRlZCwgTlVMLXRlcm1pbmF0ZWQgcHJlZml4IG9mIGxlbmd0aCBgbGVuYC4gTm8gdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZmZlciBhcmUgcmVhZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLlxuLSBMb2NhbCB2YXJpYWJsZXM6IFRoZSBzdGFjayB2YXJpYWJsZSBgYm9vbCByZXN1bWVkYCBwYXNzZWQgdG8gYGtlcm5mc19kaXJfcG9zKClgIGlzIHVuY29uZGl0aW9uYWxseSBpbml0aWFsaXplZCB0byBgZmFsc2VgIHVwb24gZW50cnkgdG8gYGtlcm5mc19kaXJfcG9zKClgLlxuLSBQcmltYXJ5IHJpc2tzOiBUaGUgcGF0Y2ggbW9kaWZpZXMgbG9ja2luZyBiZWhhdmlvciAoZHJvcHBpbmcgYW5kIHJlLWFjcXVpcmluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0YCkgYW5kIG5vZGUgcmVmY291bnRpbmcvdmFsaWRhdGlvbi4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb3RlbnRpYWwgY29uY3VycmVuY3kgcmFjZXMsIGxvY2sgaW52ZXJzaW9uLCBhbmQgbGlmZXRpbWUvdXNlLWFmdGVyLWZyZWUgYnVncywgd2hpY2ggYXJlIGZ1bGx5IGNvdmVyZWQgYnkgTE9DS0RFUCBhbmQgS0FTQU4uXG5cbkJlY2F1c2UgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWsgcmlza3MgdGhhdCB3b3VsZCBiZSB1bmlxdWVseSBkZXRlY3RlZCBieSBLTVNBTiwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGU1NTgwMjBlYWJhNjA1ZjYwODE3ZDU0ZDQ5NzFlY2RmMWNiNDUxZjAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIFNlcCAxMSAxODozMTo0MSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9kaXIuYyBiL2ZzL2tlcm5mcy9kaXIuYwppbmRleCAwN2FiZjU5ZjAyNjRhLi5jYzYyODhkNWI0Y2M0IDEwMDY0NAotLS0gYS9mcy9rZXJuZnMvZGlyLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMva2VybmZzL2Rpci5jCkBAIC0xOTAzLDMzICYjNDM7MTkwMyw0OSBAQCBzdGF0aWMgaW50IGtlcm5mc19kaXJfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiAJcmV0dXJuIDA7CiB9CiAKJiM0MzsvKgomIzQzOyAqIEZpbmQgd2hlcmUgYSBsaXN0aW5nIGxlZnQgb2ZmLiAgQHJlc3VtZWQgc2F5cyB3aGV0aGVyIEBwb3MgaXMgc3RpbGwgdGhhdAomIzQzOyAqIGVudHJ5OyBpZiBub3QsIHRoZSBzZWFyY2ggZmFsbHMgYmFjayB0byBAaGFzaCwga2V5ZWQgYnkgQG5hbWUgaWYgZ2l2ZW4uCiYjNDM7ICovCiBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucywKLQlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zKQomIzQzOwlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLAomIzQzOwljb25zdCBjaGFyICpuYW1lLCBib29sICpyZXN1bWVkKQogewomIzQzOwlpZiAocmVzdW1lZCkKJiM0MzsJCSpyZXN1bWVkID0gZmFsc2U7CiAJaWYgKHBvcykgewomIzQzOwkJLyoKJiM0MzsJCSAqIEEgcmVuYW1lIGtlZXBzIHRoZSBoYXNoIGlmIHRoZSBuZXcgbmFtZSBoYXNoZXMgdGhlIHNhbWUsIHNvCiYjNDM7CQkgKiBjaGVjayBAbmFtZSB0b28uICBPdGhlcndpc2UgdGhlIGNhbGxlciB3b3VsZCBzdGVwIG92ZXIgdGhlCiYjNDM7CQkgKiBlbnRyeSBub3cgc2l0dGluZyB3aGVyZSBAcG9zIHVzZWQgdG8gYmUuCiYjNDM7CQkgKi8KIAkJaW50IHZhbGlkID0ga2VybmZzX2FjdGl2ZShwb3MpICZhbXA7JmFtcDsKIAkJCXJjdV9hY2Nlc3NfcG9pbnRlcihwb3MtJmd0O19fcGFyZW50KSA9PSBwYXJlbnQgJmFtcDsmYW1wOwotCQkJaGFzaCA9PSBwb3MtJmd0O2hhc2g7CiYjNDM7CQkJaGFzaCA9PSBwb3MtJmd0O2hhc2ggJmFtcDsmYW1wOwomIzQzOwkJCSghbmFtZSB8fCAhc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpKSk7CiAJCWtlcm5mc19wdXQocG9zKTsKIAkJaWYgKCF2YWxpZCkKIAkJCXBvcyA9IE5VTEw7CiYjNDM7CQllbHNlIGlmIChyZXN1bWVkKQomIzQzOwkJCSpyZXN1bWVkID0gdHJ1ZTsKIAl9CiAJaWYgKCFwb3MgJmFtcDsmYW1wOyAoaGFzaCAmZ3Q7IDEpICZhbXA7JmFtcDsgKGhhc2ggJmx0OyBJTlRfTUFYKSkgewogCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHBhcmVudC0mZ3Q7ZGlyLmNoaWxkcmVuLnJiX25vZGU7Ci0JCXU2NCBuc19pZCA9IGtlcm5mc19uc19pZChucyk7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogS2VlcCBhIG5vZGUgb25seSBvbiB0aGUgd2F5IGxlZnQsIHNvIHRoZSBzZWFyY2ggZW5kcyBvbiB0aGUKJiM0MzsJCSAqIGZpcnN0IGVudHJ5IGFmdGVyIHRoZSBrZXkuICBBbiBlbXB0eSBAbmFtZSBzb3J0cyBiZWZvcmUgYWxsCiYjNDM7CQkgKiBlbnRyaWVzIHNoYXJpbmcgdGhlIGhhc2gsIHNvIGl0IGxhbmRzIG9uIHRoZSBmaXJzdCBvZiB0aGVtLgomIzQzOwkJICovCiAJCXdoaWxlIChub2RlKSB7Ci0JCQlwb3MgPSByYl90b19rbihub2RlKTsKJiM0MzsJCQlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuID0gcmJfdG9fa24obm9kZSk7CiAKLQkJCWlmIChoYXNoICZsdDsgcG9zLSZndDtoYXNoKQotCQkJCW5vZGUgPSBub2RlLSZndDtyYl9sZWZ0OwotCQkJZWxzZSBpZiAoaGFzaCAmZ3Q7IHBvcy0mZ3Q7aGFzaCkKLQkJCQlub2RlID0gbm9kZS0mZ3Q7cmJfcmlnaHQ7Ci0JCQllbHNlIGlmIChuc19pZCAmbHQ7IGtlcm5mc19uc19pZChwb3MtJmd0O25zKSkKJiM0MzsJCQlpZiAoa2VybmZzX25hbWVfY29tcGFyZShoYXNoLCBuYW1lID86ICYjMzQ7JiMzNDssIG5zLCBrbikgJmx0OyAwKSB7CiYjNDM7CQkJCXBvcyA9IGtuOwogCQkJCW5vZGUgPSBub2RlLSZndDtyYl9sZWZ0OwotCQkJZWxzZSBpZiAobnNfaWQgJmd0OyBrZXJuZnNfbnNfaWQocG9zLSZndDtucykpCiYjNDM7CQkJfSBlbHNlIHsKIAkJCQlub2RlID0gbm9kZS0mZ3Q7cmJfcmlnaHQ7Ci0JCQllbHNlCi0JCQkJYnJlYWs7CiYjNDM7CQkJfQogCQl9CiAJfQogCS8qIFNraXAgb3ZlciBlbnRyaWVzIHdoaWNoIGFyZSBkeWluZy9kZWFkIG9yIGluIHRoZSB3cm9uZyBuYW1lc3BhY2UgKi8KQEAgLTE5NDUsMTAgJiM0MzsxOTYxLDE0IEBAIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLAogfQogCiBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLAotCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBpbm9fdCBpbm8sIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zKQomIzQzOwlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLAomIzQzOwljb25zdCBjaGFyICpuYW1lKQogewotCXBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGlubywgcG9zKTsKLQlpZiAocG9zKSB7CiYjNDM7CWJvb2wgcmVzdW1lZDsKJiM0MzsKJiM0MzsJcG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgaGFzaCwgcG9zLCBuYW1lLCAmYW1wO3Jlc3VtZWQpOwomIzQzOwkvKiBTdGVwIG92ZXIgQHBvcyBvbmx5IGlmIGl0IHN1cnZpdmVkOyBAbmFtZSBmaW5kcyB0aGUgc3BvdCBpZiBub3QuICovCiYjNDM7CWlmIChwb3MgJmFtcDsmYW1wOyByZXN1bWVkKSB7CiAJCWRvIHsKIAkJCXN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dCgmYW1wO3Bvcy0mZ3Q7cmIpOwogCQkJaWYgKCFub2RlKQpAQCAtMTk2NiwzNCAmIzQzOzE5ODYsNTUgQEAgc3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KQogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtJmd0O2ZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyA9IGZpbGUtJmd0O3ByaXZhdGVfZGF0YTsKJiM0MzsJY2hhciAqbmFtZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDsKIAlzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3Q7CiAJY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMOwogCiAJaWYgKCFkaXJfZW1pdF9kb3RzKGZpbGUsIGN0eCkpCiAJCXJldHVybiAwOwogCiYjNDM7CS8qCiYjNDM7CSAqIE9uZSBidWZmZXIgZm9yIHRoZSBjYWxsLCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGUgbGlzdGluZwomIzQzOwkgKiBpcyBvbi4gIFBBVEhfTUFYOiBrZXJuZnMgYm91bmRzIG5vIHNpbmdsZSBuYW1lLgomIzQzOwkgKi8KJiM0MzsJbmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIW5hbWUpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKIAlyb290ID0ga2VybmZzX3Jvb3QocGFyZW50KTsKIAlkb3duX3JlYWQoJmFtcDtyb290LSZndDtrZXJuZnNfcndzZW0pOwogCiAJaWYgKGtlcm5mc19uc19lbmFibGVkKHBhcmVudCkpCiAJCW5zID0ga2VybmZzX2luZm8oZGVudHJ5LSZndDtkX3NiKS0mZ3Q7bnM7CiAKLQlmb3IgKHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGN0eC0mZ3Q7cG9zLCBwb3MpOwomIzQzOwlmb3IgKHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGN0eC0mZ3Q7cG9zLCBwb3MsIE5VTEwsIE5VTEwpOwogCSAgICAgcG9zOwotCSAgICAgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtJmd0O3BvcywgcG9zKSkgewotCQljb25zdCBjaGFyICpuYW1lID0ga2VybmZzX3JjdV9uYW1lKHBvcyk7CiYjNDM7CSAgICAgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtJmd0O3BvcywgcG9zLCBuYW1lKSkgewogCQl1bnNpZ25lZCBpbnQgdHlwZSA9IGZzX3Vtb2RlX3RvX2R0eXBlKHBvcy0mZ3Q7bW9kZSk7Ci0JCWludCBsZW4gPSBzdHJsZW4obmFtZSk7CiAJCWlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTsKJiM0MzsJCWludCBsZW47CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIGNvcHkgaXMgYWxzbyB0aGUgcmVzdW1lIGtleSwgc28gYSB0cnVuY2F0ZWQgbmFtZSB3b3VsZAomIzQzOwkJICogcmVzdW1lIGhlcmUgYWdhaW4uICBnZXRuYW1lKCkgY2FwcyBhIHBhdGgsIHNvIG9ubHkgYW4KJiM0MzsJCSAqIGluLWtlcm5lbCBjYWxsZXIgY2FuIGdldCBoZXJlOyBlbmQgdGhlIGxpc3RpbmcgaW5zdGVhZC4KJiM0MzsJCSAqLwomIzQzOwkJbGVuID0gc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpOwomIzQzOwkJaWYgKFdBUk5fT05fT05DRShsZW4gJmx0OyAwKSkKJiM0MzsJCQlicmVhazsKIAogCQljdHgtJmd0O3BvcyA9IHBvcy0mZ3Q7aGFzaDsKIAkJZmlsZS0mZ3Q7cHJpdmF0ZV9kYXRhID0gcG9zOwogCQlrZXJuZnNfZ2V0KHBvcyk7CiAKLQkJaWYgKCFkaXJfZW1pdChjdHgsIG5hbWUsIGxlbiwgaW5vLCB0eXBlKSkgewotCQkJdXBfcmVhZCgmYW1wO3Jvb3QtJmd0O2tlcm5mc19yd3NlbSk7CiYjNDM7CQkvKgomIzQzOwkJICogZGlyX2VtaXQoKSBjYW4gZmF1bHQsIHNvIHJ1biBpdCB1bmxvY2tlZC4gIEBwb3MgaXMgcGlubmVkCiYjNDM7CQkgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suCiYjNDM7CQkgKi8KJiM0MzsJCXVwX3JlYWQoJmFtcDtyb290LSZndDtrZXJuZnNfcndzZW0pOwomIzQzOwkJaWYgKCFkaXJfZW1pdChjdHgsIG5hbWUsIGxlbiwgaW5vLCB0eXBlKSkKIAkJCXJldHVybiAwOwotCQl9CiYjNDM7CQlkb3duX3JlYWQoJmFtcDtyb290LSZndDtrZXJuZnNfcndzZW0pOwogCX0KIAl1cF9yZWFkKCZhbXA7cm9vdC0mZ3Q7a2VybmZzX3J3c2VtKTsKIAlmaWxlLSZndDtwcml2YXRlX2RhdGEgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmMKaW5kZXggNmU3NGRhOTFlYmNhNS4uMDFjZDU4ZTVlNDFlNyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jCkBAIC04LDYgJiM0Mzs4LDcgQEAKICNpbmNsdWRlICZsdDtsaW1pdHMuaCZndDsKICNpbmNsdWRlICZsdDtuZXQvaWYuaCZndDsKICNpbmNsdWRlICZsdDtzY2hlZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzaWduYWwuaCZndDsKICNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwogI2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwogI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwpAQCAtMTcsNiAmIzQzOzE4LDcgQEAKICNpbmNsdWRlICZsdDtzeXMvbW91bnQuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvc29ja2V0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c2NhbGwuaCZndDsKICNpbmNsdWRlICZsdDtzeXMveGF0dHIuaCZndDsKIAogI2luY2x1ZGUgJiMzNDtrc2VsZnRlc3RfaGFybmVzcy5oJiMzNDsKQEAgLTQ3Miw2ICYjNDM7NDc0LDIwNCBAQCBURVNUX0Yoa2VybmZzX2Nncm91cCwgcmVhZGRpcl9ub19kdXBsaWNhdGVzKQogCQkJRVhQRUNUX1NUUk5FKG5hbWVzW2ldLCBuYW1lc1tqXSk7CiB9CiAKJiM0MzsjZGVmaW5lIFJFU1VNRV9ESVJTCTI0CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZXN1bWluZyBhdCBhbiBlbnRyeSB0aGF0IGhhcyBnb25lIG11c3QgY2Fycnkgb24gYWZ0ZXIgaXQsIG5ldmVyIGJlZm9yZS4KJiM0MzsgKiBUYWtlIGEgY29va2llIGZvciBldmVyeSBlbnRyeSwgdGhlbiByZW1vdmUgZWFjaCBvbmUsIHNlZWsgdG8gaXRzIGNvb2tpZQomIzQzOyAqIGFuZCByZWFkIHRoZSByZXN0OyBub3RoaW5nIGFscmVhZHkgcmVwb3J0ZWQgbWF5IGNvbWUgYmFjay4KJiM0MzsgKi8KJiM0MztURVNUX0Yoa2VybmZzX2Nncm91cCwgcmVhZGRpcl9yZXN1bWVfYXRfcmVtb3ZlZF9lbnRyeSkKJiM0Mzt7CiYjNDM7CS8qIFRoZSBjZ3JvdXAmIzM5O3Mgb3duIGNvbnRyb2wgZmlsZXMgYXJlIGxpc3RlZCBhbG9uZ3NpZGUgb3Vycy4gKi8KJiM0MzsJY2hhciBuYW1lc1sxMjhdW05BTUVfTUFYICYjNDM7IDFdOwomIzQzOwlsb25nIHBvc1sxMjhdOwomIzQzOwljaGFyIHBhdGhbUEFUSF9NQVhdOwomIzQzOwlzdHJ1Y3QgZGlyZW50ICpkZTsKJiM0MzsJaW50IG4gPSAwLCBpLCBqOwomIzQzOwlESVIgKmQ7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBSRVNVTUVfRElSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgJiMzNDslcy9lJTAyZCYjMzQ7LCBzZWxmLSZndDtzY3JhdGNoLCBpKTsKJiM0MzsJCUFTU0VSVF9FUShta2RpcihwYXRoLCAwNzU1KSwgMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmVjb3JkIHRoZSBjb29raWUgYmVmb3JlIHJlYWRpbmcgZWFjaCBlbnRyeSwgd2l0aCBpdHMgbmFtZS4gKi8KJiM0MzsJZCA9IG9wZW5kaXIoc2VsZi0mZ3Q7c2NyYXRjaCk7CiYjNDM7CUFTU0VSVF9ORShkLCBOVUxMKTsKJiM0MzsJd2hpbGUgKDEpIHsKJiM0MzsJCWxvbmcgaGVyZSA9IHRlbGxkaXIoZCk7CiYjNDM7CiYjNDM7CQlkZSA9IHJlYWRkaXIoZCk7CiYjNDM7CQlpZiAoIWRlKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJaWYgKCFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuJiMzNDspIHx8ICFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuLiYjMzQ7KSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCUFTU0VSVF9MVChuLCAoaW50KUFSUkFZX1NJWkUocG9zKSk7CiYjNDM7CQlwb3Nbbl0gPSBoZXJlOwomIzQzOwkJc3RybmNweShuYW1lc1tuXSwgZGUtJmd0O2RfbmFtZSwgTkFNRV9NQVgpOwomIzQzOwkJbmFtZXNbbl1bTkFNRV9NQVhdID0gJiMzOTtcMCYjMzk7OwomIzQzOwkJbiYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsJY2xvc2VkaXIoZCk7CiYjNDM7CUFTU0VSVF9HVChuLCAxKTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkvKiBPbmx5IHRoZSBkaXJlY3RvcmllcyB3ZSBtYWRlIGNhbiBiZSByZW1vdmVkIGFuZCBwdXQgYmFjay4gKi8KJiM0MzsJCWlmIChzdHJuY21wKG5hbWVzW2ldLCAmIzM0O2UmIzM0OywgMSkpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICYjMzQ7JXMvJXMmIzM0Oywgc2VsZi0mZ3Q7c2NyYXRjaCwgbmFtZXNbaV0pOwomIzQzOwkJQVNTRVJUX0VRKHJtZGlyKHBhdGgpLCAwKTsKJiM0MzsKJiM0MzsJCS8qIFJlb3BlbiBzbyB0aGUgc2VlayBoYXMgdG8gcmVhY2ggdGhlIGtlcm5lbC4gKi8KJiM0MzsJCWQgPSBvcGVuZGlyKHNlbGYtJmd0O3NjcmF0Y2gpOwomIzQzOwkJQVNTRVJUX05FKGQsIE5VTEwpOwomIzQzOwkJc2Vla2RpcihkLCBwb3NbaV0pOwomIzQzOwkJd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpKSB7CiYjNDM7CQkJaWYgKCFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuJiMzNDspIHx8ICFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuLiYjMzQ7KSkKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJZm9yIChqID0gMDsgaiAmbHQ7IGk7IGomIzQzOyYjNDM7KQomIzQzOwkJCQlBU1NFUlRfU1RSTkUoZGUtJmd0O2RfbmFtZSwgbmFtZXNbal0pCiYjNDM7CQkJCQlUSF9MT0coJiMzNDtyZXN1bWluZyBhdCAlcyAoZ29uZSkgd2VudCBiYWNrIHRvICVzJiMzNDssCiYjNDM7CQkJCQkgICAgICAgbmFtZXNbaV0sIG5hbWVzW2pdKTsKJiM0MzsJCX0KJiM0MzsJCWNsb3NlZGlyKGQpOwomIzQzOwomIzQzOwkJQVNTRVJUX0VRKG1rZGlyKHBhdGgsIDA3NTUpLCAwKTsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgUkVTVU1FX0RJUlM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICYjMzQ7JXMvZSUwMmQmIzM0Oywgc2VsZi0mZ3Q7c2NyYXRjaCwgaSk7CiYjNDM7CQlFWFBFQ1RfRVEocm1kaXIocGF0aCksIDApOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgQ0hVUk5fUk9VTkRTCTQwMAomIzQzOyNkZWZpbmUgQ0hVUk5fQlVGU1oJNTEyCS8qIHNtYWxsLCBzbyBhIGxpc3RpbmcgdGFrZXMgc2V2ZXJhbCBjYWxscyAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIGZpbGVzIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBlbmFibGluZyB3cml0ZSBhbmQgZ28gYXQgdGhlIHN0YXJ0IG9mCiYjNDM7ICogdGhlIGRpc2FibGluZyBvbmUsIHNvIHRoZSB3aW5kb3cgd2hlcmUgdGhleSBleGlzdCBpcyB0aGUgc2hvcnQgb25lLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgQ0hVUk5fRFdFTExfT04JMjAwMAomIzQzOyNkZWZpbmUgQ0hVUk5fRFdFTExfT0ZGCTIwMAomIzQzOwomIzQzO3N0cnVjdCBrZXJuZnNfZGlyZW50NjQgewomIzQzOwl1bnNpZ25lZCBsb25nIGxvbmcJZF9pbm87CiYjNDM7CWxvbmcgbG9uZwkJZF9vZmY7CiYjNDM7CXVuc2lnbmVkIHNob3J0CQlkX3JlY2xlbjsKJiM0MzsJdW5zaWduZWQgY2hhcgkJZF90eXBlOwomIzQzOwljaGFyCQkJZF9uYW1lW107CiYjNDM7fTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSBzYW1lIHJlc3VtZSwgYnV0IGluc2lkZSBvbmUgZ2V0ZGVudHMoMikgY2FsbC4gIHJtZGlyKDIpIGNhbm5vdCByZWFjaAomIzQzOyAqIHRoYXQgd2luZG93IGJlY2F1c2UgaXRlcmF0ZV9kaXIoKSBob2xkcyB0aGUgbGlzdGVkIGRpcmVjdG9yeSYjMzk7cyBpX3J3c2VtCiYjNDM7ICogZm9yIHRoZSB3aG9sZSBsaXN0aW5nOyBjZ3JvdXAuc3VidHJlZV9jb250cm9sIGNhbiwgaGF2aW5nIG5vIFZGUwomIzQzOyAqIG9wZXJhdGlvbiBvbiB0aGUgbmFtZXMgaXQgYWRkcyBhbmQgcmVtb3Zlcy4gIFRoZSBmaWxlcyB0aGF0IGFyZSBub3QgdGhlCiYjNDM7ICogY29udHJvbGxlciYjMzk7cyBzdGF5IHRocm91Z2hvdXQsIHNvIGVhY2ggbXVzdCBhcHBlYXIgZXhhY3RseSBvbmNlLgomIzQzOyAqCiYjNDM7ICogQSBzdHJlc3MgdGVzdDogaXQgaGFzIG5vdCBiZWVuIHNlZW4gdG8gY2F0Y2ggdGhlIG9yZGVyaW5nIGJ1ZywgYW5kIGlzCiYjNDM7ICogaGVyZSB0byBrZWVwIHRoZSB1bmxvY2tlZCB3aW5kb3cgdW5kZXIgbG9hZCBmb3IgbG9ja2RlcCBhbmQgS0FTQU4uCiYjNDM7ICovCiYjNDM7VEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX3ZzX2ludGVybmFsX3JlbW92ZSkKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmW0NIVVJOX0JVRlNaXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiYjNDM7CWNoYXIgc3RhYmxlWzEyOF1bTkFNRV9NQVggJiM0MzsgMV07CiYjNDM7CWludCBuc3RhYmxlID0gMCwgaSwgcjsKJiM0MzsJaW50IHdpdGhjdGwgPSAwLCB3aXRob3V0ID0gMDsKJiM0MzsJaW50IHNlZW5bMTI4XSwgc3RhdHVzOwomIzQzOwlwaWRfdCBjaHVybmVyOwomIzQzOwlESVIgKmQ7CiYjNDM7CiYjNDM7CS8qIFdpdGggdGhlIGNvbnRyb2xsZXIgb2ZmLCB3aGF0ZXZlciBpcyBsZWZ0IGlzIHdoYXQgbXVzdCBwZXJzaXN0LiAqLwomIzQzOwlBU1NFUlRfRVEod3JpdGVfZmlsZShzZWxmLSZndDtzY3JhdGNoX3NjLCBzZWxmLSZndDtkaXNhYmxlKSwgMCk7CiYjNDM7CWQgPSBvcGVuZGlyKHNlbGYtJmd0O2NoaWxkKTsKJiM0MzsJQVNTRVJUX05FKGQsIE5VTEwpOwomIzQzOwlmb3IgKDs7KSB7CiYjNDM7CQlzdHJ1Y3QgZGlyZW50ICpkZSA9IHJlYWRkaXIoZCk7CiYjNDM7CiYjNDM7CQlpZiAoIWRlKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJaWYgKCFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuJiMzNDspIHx8ICFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuLiYjMzQ7KSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCUFTU0VSVF9MVChuc3RhYmxlLCAoaW50KUFSUkFZX1NJWkUoc3RhYmxlKSk7CiYjNDM7CQlzdHJuY3B5KHN0YWJsZVtuc3RhYmxlXSwgZGUtJmd0O2RfbmFtZSwgTkFNRV9NQVgpOwomIzQzOwkJc3RhYmxlW25zdGFibGVdW05BTUVfTUFYXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJCW5zdGFibGUmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWNsb3NlZGlyKGQpOwomIzQzOwlBU1NFUlRfR1QobnN0YWJsZSwgMCk7CiYjNDM7CiYjNDM7CWNodXJuZXIgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShjaHVybmVyLCAwKTsKJiM0MzsJaWYgKGNodXJuZXIgPT0gMCkgewomIzQzOwkJZm9yICg7OykgewomIzQzOwkJCWlmICh3cml0ZV9maWxlKHNlbGYtJmd0O3NjcmF0Y2hfc2MsIHNlbGYtJmd0O2VuYWJsZSkpCiYjNDM7CQkJCV9leGl0KDEwKTsKJiM0MzsJCQl1c2xlZXAoQ0hVUk5fRFdFTExfT04pOwomIzQzOwkJCWlmICh3cml0ZV9maWxlKHNlbGYtJmd0O3NjcmF0Y2hfc2MsIHNlbGYtJmd0O2Rpc2FibGUpKQomIzQzOwkJCQlfZXhpdCgxMSk7CiYjNDM7CQkJdXNsZWVwKENIVVJOX0RXRUxMX09GRik7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChyID0gMDsgciAmbHQ7IENIVVJOX1JPVU5EUzsgciYjNDM7JiM0MzspIHsKJiM0MzsJCWludCBmZCA9IG9wZW4oc2VsZi0mZ3Q7Y2hpbGQsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkpOwomIzQzOwkJaW50IGV4dHJhID0gMDsKJiM0MzsJCWludCBuOwomIzQzOwomIzQzOwkJQVNTRVJUX0dFKGZkLCAwKTsKJiM0MzsJCW1lbXNldChzZWVuLCAwLCBzaXplb2Yoc2VlbikpOwomIzQzOwomIzQzOwkJd2hpbGUgKChuID0gc3lzY2FsbChTWVNfZ2V0ZGVudHM2NCwgZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSAmZ3Q7IDApIHsKJiM0MzsJCQlpbnQgb2ZmID0gMDsKJiM0MzsKJiM0MzsJCQl3aGlsZSAob2ZmICZsdDsgbikgewomIzQzOwkJCQlzdHJ1Y3Qga2VybmZzX2RpcmVudDY0ICpkZSA9ICh2b2lkICopKGJ1ZiAmIzQzOyBvZmYpOwomIzQzOwkJCQlib29sIGtub3duID0gZmFsc2U7CiYjNDM7CiYjNDM7CQkJCW9mZiAmIzQzOz0gZGUtJmd0O2RfcmVjbGVuOwomIzQzOwkJCQlmb3IgKGkgPSAwOyBpICZsdDsgbnN0YWJsZTsgaSYjNDM7JiM0MzspCiYjNDM7CQkJCQlpZiAoIXN0cmNtcChkZS0mZ3Q7ZF9uYW1lLCBzdGFibGVbaV0pKSB7CiYjNDM7CQkJCQkJc2VlbltpXSYjNDM7JiM0Mzs7CiYjNDM7CQkJCQkJa25vd24gPSB0cnVlOwomIzQzOwkJCQkJfQomIzQzOwkJCQlpZiAoIWtub3duICZhbXA7JmFtcDsgc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7LiYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CQkJCSAgICBzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuLiYjMzQ7KSkKJiM0MzsJCQkJCWV4dHJhJiM0MzsmIzQzOzsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQlBU1NFUlRfR0UobiwgMCk7CiYjNDM7CQlFWFBFQ1RfRVEoY2xvc2UoZmQpLCAwKTsKJiM0MzsKJiM0MzsJCWlmIChleHRyYSkKJiM0MzsJCQl3aXRoY3RsJiM0MzsmIzQzOzsKJiM0MzsJCWVsc2UKJiM0MzsJCQl3aXRob3V0JiM0MzsmIzQzOzsKJiM0MzsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBuc3RhYmxlOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlBU1NFUlRfRVEoc2VlbltpXSwgMSkKJiM0MzsJCQkJVEhfTE9HKCYjMzQ7cm91bmQgJWQ6ICVzIHNlZW4gJWQgdGltZXMmIzM0OywKJiM0MzsJCQkJICAgICAgIHIsIHN0YWJsZVtpXSwgc2VlbltpXSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogVGhlIGNodXJuIG11c3QgaGF2ZSBiZWVuIHJ1bm5pbmcsIG9yIHRoZSBsaXN0aW5ncyBwcm92ZSBub3RoaW5nLiAqLwomIzQzOwlFWFBFQ1RfRVEoa2lsbChjaHVybmVyLCBTSUdLSUxMKSwgMCk7CiYjNDM7CUFTU0VSVF9FUSh3YWl0cGlkKGNodXJuZXIsICZhbXA7c3RhdHVzLCAwKSwgY2h1cm5lcik7CiYjNDM7CUFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykgJmFtcDsmYW1wOyBXVEVSTVNJRyhzdGF0dXMpID09IFNJR0tJTEwpCiYjNDM7CQlUSF9MT0coJiMzNDtjaHVybmVyIGV4aXRlZCBvbiBpdHMgb3duOiBzdGF0dXMgJWQmIzM0Oywgc3RhdHVzKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhleSBhbHNvIGhhdmUgdG8gaGF2ZSBvdmVybGFwcGVkIGl0LiAgSG93IG11Y2ggZGVwZW5kcyBvbiB0aGUKJiM0MzsJICogbWFjaGluZSwgc28gc2F5IHRoZSByYWNlIGNvdWxkIG5vdCBiZSBhcnJhbmdlZCByYXRoZXIgdGhhbiBmYWlsLgomIzQzOwkgKi8KJiM0MzsJaWYgKCF3aXRoY3RsIHx8ICF3aXRob3V0KQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bGlzdGluZ3MgZGlkIG5vdCBzcGFuIHRoZSBjaHVybjogJWQgd2l0aCwgJWQgd2l0aG91dCYjMzQ7LAomIzQzOwkJICAgICB3aXRoY3RsLCB3aXRob3V0KTsKJiM0Mzt9CiYjNDM7CiAvKgogICogQSB0ZWxsZGlyKCkgY29va2llIG11c3QgcmVzb2x2ZSBiYWNrIHRvIHRoZSBzYW1lIGVudHJ5IGFmdGVyIHNlZWtkaXIoKS4KICAqIGtlcm5mcyBlbmNvZGVzIHRoZSBjb29raWUgYXMgdGhlIG5vZGUmIzM5O3MgbmFtZSBoYXNoLCBzbyB0aGlzIGNvdmVycwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjM1NgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDIzOTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gRnV6emluZyBTZXNzaW9uIEFzc2Vzc21lbnQqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgb2JqZWN0aXZlIGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgcGF0Y2ggc2VyaWVzIHdhcnJhbnRzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gVGhlIHJ1bGUgaXMgY2xlYXI6IEtNU0FOIGlzIGV4cGVuc2l2ZSwgYW5kIHNob3VsZCAqb25seSogYmUgY29uc2lkZXJlZCBpZiB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBhcmUgKmV4Y2x1c2l2ZWx5KiBkZXRlY3RhYmxlIGJ5IEtNU0FOLiBJZiBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGNhbiBjYXRjaCBhbiBpc3N1ZSwgd2UgZG9uJiMzOTt0IG5lZWQgS01TQU4uCgpGaXJzdCwgSSBleGFtaW5lZCB0aGUgcGF0Y2ggaW4gYGZzL2tlcm5mcy9kaXIuY2AuIEkgbm90aWNlZCB0aGlzIGxpbmU6IGBuYW1lID0ga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7YC4gIEFoYSEgYGttYWxsb2NgIHdpdGhvdXQgYGt6YWxsb2NgLi4udGhhdCYjMzk7cyBhIHBvdGVudGlhbCByZWQgZmxhZy4gTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0aGF0IGBuYW1lYCBjb3VsZCBiZSB1bmluaXRpYWxpemVkLgoKTm93LCBJIGZvbGxvd2VkIHRoZSBjb2RlIGZsb3cuICBgbmFtZWAgaXMgYWxsb2NhdGVkLCBhbmQgdGhlIGBrZXJuZnNfZGlyX3Bvc2AgaXMgY2FsbGVkLiBDcml0aWNhbGx5LCBkdXJpbmcgdGhlICpmaXJzdCogaXRlcmF0aW9uIG9mIHRoZSBsb29wIHRoYXQgcHJvY2Vzc2VzIHRoZSBkaXJlY3RvcnkgZW50cmllcywgYG5hbWVgIGlzLCBhdCB0aGF0IHBvaW50LCBzdGlsbCB1bmluaXRpYWxpemVkLgoKVGhlbiwgaW5zaWRlIHRoZSBsb29wLCB0aGUgY3JpdGljYWwgbGluZSBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpO2AgY29tZXMgaW50byBwbGF5LiAqVGhpcyogaXMgd2hhdCBwb3B1bGF0ZXMgYG5hbWVgIHdpdGggYSBzdHJpbmcgZnJvbSBga2VybmZzX3JjdV9uYW1lKHBvcylgLiBDcnVjaWFsbHksIHRoaXMgY29waWVzIGFuZCBOVUwtdGVybWluYXRlcyB0aGUgc3RyaW5nLgoKVGhlIG5leHQgY29uY2VybiB0aGF0IGNhbWUgdG8gbWluZCB3YXMgd2hldGhlciB0aGUgY29kZSBtYWtlcyB1c2Ugb2YgdGhlIHdob2xlIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIGBuYW1lYCwgbmFtZWx5IHdoZXRoZXIgYG5hbWVgIGlzIHJlYWQgYmV5b25kIGBsZW5gLiAgU28sIEkgY2hlY2tlZCB3aGVyZSBgbmFtZWAgaXMgdXNlZCwgYW5kIGluIHRoaXMgY2FzZSwgYGRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpO2AuIAoKQXQgdGhpcyBwb2ludCwgSSB3b3VsZCBuZWVkIHRvIGFuYWx5emUgYGRpcl9lbWl0YCBhbmQgc2VlIHdoYXQgaXQgZG9lcyB3aXRoIGBuYW1lYCBhbmQgYGxlbmAuCkhvd2V2ZXIsIEkgY2FuIGNvbmNsdWRlIHNvIGZhciB0aGF0IGdpdmVuIGBuYW1lYCBpcyB1bmluaXRpYWxpemVkIGJlZm9yZSBgc3Ryc2NweWAgaXMgY2FsbGVkIGluc2lkZSB0aGUgbG9vcCwgYnV0IGlzICppbml0aWFsaXplZCogYmVmb3JlIGFueSB1c2UgYmV5b25kIHRoYXQgcG9pbnQsIGl0IGRvZXMgbm90IGp1c3RpZnkgYSBLTVNBTiBzZXNzaW9uLiBLQVNBTi9vdGhlciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50IGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2Rpcl9lbWl0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9mcy5oJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvZnMuaD0zNTk2PXN0YXRpYyBpbmxpbmUgYm9vbCBpc19yb290X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MDAtXG5pbmNsdWRlL2xpbnV4L2ZzLmg6MzYwMTpzdGF0aWMgaW5saW5lIGJvb2wgZGlyX2VtaXQoc3RydWN0IGRpcl9jb250ZXh0ICpjdHgsXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYwMi1cdFx0XHQgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sXG4tLVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MDgtfVxuaW5jbHVkZS9saW51eC9mcy5oOjM2MDk6c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYxMC17XG4tLVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MTMtfVxuaW5jbHVkZS9saW51eC9mcy5oOjM2MTQ6c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdGRvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYxNS17XG4tLVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MTgtfVxuaW5jbHVkZS9saW51eC9mcy5oOjM2MTk6c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdHMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MjAte1xuaW5jbHVkZS9saW51eC9mcy5oLTM2MjEtXHRpZiAoY3R4LVx1MDAzZXBvcyA9PSAwKSB7XG5pbmNsdWRlL2xpbnV4L2ZzLmg6MzYyMjpcdFx0aWYgKCFkaXJfZW1pdF9kb3QoZmlsZSwgY3R4KSlcbmluY2x1ZGUvbGludXgvZnMuaC0zNjIzLVx0XHRcdHJldHVybiBmYWxzZTtcbi0tXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYyNi1cdGlmIChjdHgtXHUwMDNlcG9zID09IDEpIHtcbmluY2x1ZGUvbGludXgvZnMuaDozNjI3Olx0XHRpZiAoIWRpcl9lbWl0X2RvdGRvdChmaWxlLCBjdHgpKVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MjgtXHRcdFx0cmV0dXJuIGZhbHNlO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NjgyCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBEaXJlY3RvcnkgRW1pdHRpbmcgTG9naWMqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBrZXJuZWwgaGFuZGxlcyBkaXJlY3RvcnkgZW50cmllcy4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggYGluY2x1ZGUvbGludXgvZnMuaGAuIFNwZWNpZmljYWxseSwgSSB0aGluayBgZGlyX2VtaXRgIGlzIGdvaW5nIHRvIGJlIGtleSB0byBob3cgdGhlc2UgZW50cmllcyBhcmUgY3JlYXRlZCBhbmQgcG9wdWxhdGVkLiBJJiMzOTttIGdvaW5nIHRvIGxvb2sgYXJvdW5kIGxpbmUgMzYwMSBpbiB0aGF0IGZpbGUgYW5kIHplcm8gaW4gb24gdGhlIGBkaXJfZW1pdGAgZnVuY3Rpb24uIEl0JiMzOTtzIGxpa2VseSB0aGF0IGl0IGhvbGRzIHRoZSBjb3JlIGxvZ2ljIGZvciB0aGUgcHJvY2VzcyBvZiAmIzM0O2VtaXR0aW5nJiMzNDsgb3Igb3V0cHV0dGluZyBkaXJlY3RvcnkgZW50cmllcyBkdXJpbmcgZGlyZWN0b3J5IHRyYXZlcnNhbCBvciBsaXN0aW5nIG9wZXJhdGlvbnMuIEkgZXhwZWN0IHRvIGZpbmQgdGhlIGRldGFpbHMgb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgaG93IG5hbWVzIGFyZSBoYW5kbGVkLCBhbmQgaG93IHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gaW50ZXJhY3RzIHdpdGggdGhlIGRpcmVjdG9yeSBjYWNoZSBvciBvdGhlciBzdHJ1Y3R1cmVzLiBIb3BlZnVsbHksIEkmIzM5O2xsIHF1aWNrbHkgZ2V0IGEgZmVlbCBmb3IgaG93IHRoaXMgY3JpdGljYWwgY29tcG9uZW50IGZpdHMgaW50byB0aGUgYnJvYWRlciBmaWxlc3lzdGVtIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2ZzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNjAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzM2MDA6XHRcbjM2MDE6XHRzdGF0aWMgaW5saW5lIGJvb2wgZGlyX2VtaXQoc3RydWN0IGRpcl9jb250ZXh0ICpjdHgsXG4zNjAyOlx0XHRcdFx0ICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLFxuMzYwMzpcdFx0XHRcdCAgICB1NjQgaW5vLCB1bnNpZ25lZCB0eXBlKVxuMzYwNDpcdHtcbjM2MDU6XHRcdHVuc2lnbmVkIGludCBkdF9tYXNrID0gU19EVF9NQVNLIHwgY3R4LVx1MDAzZWR0X2ZsYWdzX21hc2s7XG4zNjA2Olx0XG4zNjA3Olx0XHRyZXR1cm4gY3R4LVx1MDAzZWFjdG9yKGN0eCwgbmFtZSwgbmFtZWxlbiwgY3R4LVx1MDAzZXBvcywgaW5vLCB0eXBlIFx1MDAyNiBkdF9tYXNrKTtcbjM2MDg6XHR9XG4zNjA5Olx0c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4zNjEwOlx0e1xuMzYxMTpcdFx0cmV0dXJuIGN0eC1cdTAwM2VhY3RvcihjdHgsIFwmIzM0Oy5cJiMzNDssIDEsIGN0eC1cdTAwM2Vwb3MsXG4zNjEyOlx0XHRcdFx0ICBmaWxlLVx1MDAzZWZfcGF0aC5kZW50cnktXHUwMDNlZF9pbm9kZS1cdTAwM2VpX2lubywgRFRfRElSKTtcbjM2MTM6XHR9XG4zNjE0Olx0c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdGRvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4zNjE1Olx0e1xuMzYxNjpcdFx0cmV0dXJuIGN0eC1cdTAwM2VhY3RvcihjdHgsIFwmIzM0Oy4uXCYjMzQ7LCAyLCBjdHgtXHUwMDNlcG9zLFxuMzYxNzpcdFx0XHRcdCAgZF9wYXJlbnRfaW5vKGZpbGUtXHUwMDNlZl9wYXRoLmRlbnRyeSksIERUX0RJUik7XG4zNjE4Olx0fVxuMzYxOTpcdHN0YXRpYyBpbmxpbmUgYm9vbCBkaXJfZW1pdF9kb3RzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAzMDcKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiA5NTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBEaXJlY3RvcnkgSXRlcmF0aW9uIExvZ2ljKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24gc3lzdGVtYXRpY2FsbHkuIGBkaXJfZW1pdGAgaXMgY2FsbGVkIHdpdGggYG5hbWVgIGFuZCBgbmFtZWxlbmAsIGFuZCBJIGluaXRpYWxseSBhc3N1bWVkIHRoYXQgYG5hbWVgIGhlbGQgYGxlbmAgaW5pdGlhbGl6ZWQgYnl0ZXMgcGx1cyBhIG51bGwgdGVybWluYXRvci4gQnV0IHNvbWV0aGluZyBmZWVscyBvZmYgd2l0aCB0aGUgbG9vcC4gVGhlIGNydWNpYWwgcG9pbnQgc2VlbXMgdG8gYmUgaG93IHRoZSBgbmFtZWAgYXJndW1lbnQgaXMgaGFuZGxlZCBhY3Jvc3MgaXRlcmF0aW9ucy4KCkxvb2tpbmcgYXQgdGhlIGxvb3AmIzM5O3Mgc3RydWN0dXJlLCBpbiB0aGUgbmV4dCBpdGVyYXRpb24gYGtlcm5mc19kaXJfbmV4dF9wb3NgIGlzIGNhbGxlZC4gSXQgbG9va3MgYXQgdGhlIGBrZXJuZnNfZGlyX3Bvc2AgZnVuY3Rpb24uIFRoYXQgZnVuY3Rpb24gdGFrZXMgdGhlIGBuYW1lYCBhcmd1bWVudC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGJlaGF2aW9yLgoKTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNlIHdpdGggdGhlIGBuYW1lYCBhcmd1bWVudC4gRGlnZ2luZyBpbnRvIGBrZXJuZnNfZGlyX3Bvc2AsIHRoZSBjb2RlIGluaXRpYWxseSBjaGVja3MgaWYgYSBgcG9zYCBpcyB2YWxpZCBhbmQgaWYgYHN0cmNtcGAgd2lsbCBiZSBjYWxsZWQgd2l0aCBgbmFtZWAsIHdoaWNoIGluaXRpYWxseSBjb3VsZCBiZSB1bmluaXRpYWxpemVkLiBIb3dldmVyLCB0aGUgZmlyc3QgY2FsbCBwYXNzZXMgYSBOVUxMIGBuYW1lYCBhcmd1bWVudCB0byBga2VybmZzX2Rpcl9wb3NgLCBzbyB0aGF0JiMzOTtzIHRoZSBzdGFydGluZyBwb2ludC4KCkluc2lkZSB0aGUgbG9vcCwgaXQmIzM5O3MgY2xlYXIgbm93OiBga2VybmZzX2Rpcl9wb3NgIGlzIGNhbGxlZCB3aXRoIGEgTlVMTCBgbmFtZWAuIFRoZW4sIGlmIGBwb3NgIGlzIG5vbi1udWxsLCBgc3Ryc2NweWAgaXMgdXNlZCB0byBwb3B1bGF0ZSBgbmFtZWAgd2l0aCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZnJvbSBga2VybmZzX3JjdV9uYW1lKHBvcylgLiAqVGhhdCYjMzk7cyogd2hlcmUgdGhlIHN0cmluZyBpcyBwb3B1bGF0ZWQhIENydWNpYWxseSwgdGhpcyBtZWFucyBgbmFtZWAgaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQgKmJlZm9yZSogaXQgaXMgdXNlZCBpbiB0aGUgc3Vic2VxdWVudCBjYWxsIHRvIGBrZXJuZnNfZGlyX25leHRfcG9zYC4gU28gYWZ0ZXIgdGhlIGZpcnN0IGxvb3AgaXRlcmF0aW9uLCBgbmFtZWAgaXMgbm93IGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIEFuZCB0aGVuIGluIHRoZSBjaGVjayBhZ2FpbnN0IGBrZXJuZnNfcmN1X25hbWUocG9zKWAgaXQgaXMgc2FmZSB0byB1c2UuCgpMZXQmIzM5O3MgbG9vayBhdCBga2VybmZzX25hbWVfY29tcGFyZWAsIHRob3VnaCwgc2luY2UgdGhhdCBpcyB1c2VkIGFzIHdlbGwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tlcm5mc19uYW1lX2NvbXBhcmUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9rZXJuZnMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2tlcm5mcy9kaXIuYz0zMjk9c3RhdGljIHVuc2lnbmVkIGludCBrZXJuZnNfbmFtZV9oYXNoKGNvbnN0IGNoYXIgKm5hbWUsXG4tLVxuZnMva2VybmZzL2Rpci5jLTM0NS1cbmZzL2tlcm5mcy9kaXIuYzozNDY6c3RhdGljIGludCBrZXJuZnNfbmFtZV9jb21wYXJlKHVuc2lnbmVkIGludCBoYXNoLCBjb25zdCBjaGFyICpuYW1lLFxuZnMva2VybmZzL2Rpci5jLTM0Ny1cdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsIGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXG4tLVxuZnMva2VybmZzL2Rpci5jPTM2Mz1zdGF0aWMgaW50IGtlcm5mc19zZF9jb21wYXJlKGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqbGVmdCxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMzY1LXtcbmZzL2tlcm5mcy9kaXIuYzozNjY6XHRyZXR1cm4ga2VybmZzX25hbWVfY29tcGFyZShsZWZ0LVx1MDAzZWhhc2gsIGtlcm5mc19yY3VfbmFtZShsZWZ0KSwgbGVmdC1cdTAwM2VucywgcmlnaHQpO1xuZnMva2VybmZzL2Rpci5jLTM2Ny19XG4tLVxuZnMva2VybmZzL2Rpci5jPTg5Mj1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZmluZF9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtOTEzLVx0XHRrbiA9IHJiX3RvX2tuKG5vZGUpO1xuZnMva2VybmZzL2Rpci5jOjkxNDpcdFx0cmVzdWx0ID0ga2VybmZzX25hbWVfY29tcGFyZShoYXNoLCBuYW1lLCBucywga24pO1xuZnMva2VybmZzL2Rpci5jLTkxNS1cdFx0aWYgKHJlc3VsdCBcdTAwM2MgMClcbi0tXG5mcy9rZXJuZnMvZGlyLmM9MTkxMD1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMTk0Mi1cbmZzL2tlcm5mcy9kaXIuYzoxOTQzOlx0XHRcdGlmIChrZXJuZnNfbmFtZV9jb21wYXJlKGhhc2gsIG5hbWUgPzogXCYjMzQ7XCYjMzQ7LCBucywga24pIFx1MDAzYyAwKSB7XG5mcy9rZXJuZnMvZGlyLmMtMTk0NC1cdFx0XHRcdHBvcyA9IGtuO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjE1NQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBrZXJuZnNfbmFtZV9jb21wYXJlKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBrZXJuZnMgbmFtZXMgYXJlIGJlaW5nIGNvbXBhcmVkLiBUaW1lIHRvIGRpZyBpbnRvIHRoZSBjb2RlLiBUaGUgbG9naWNhbCBwbGFjZSB0byBzdGFydCBpcyB0aGUgYGZzL2tlcm5mcy9kaXIuY2AgZmlsZSwgc2luY2Ugd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBkaXJlY3Rvcnkgb3BlcmF0aW9ucywgYW5kIHRoZSBmdW5jdGlvbiBuYW1lIGlzIGBrZXJuZnNfbmFtZV9jb21wYXJlYC4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBsb29rcyBsaWtlLiBJJiMzOTttIGV4cGVjdGluZyBzb21ldGhpbmcgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQsIGxpa2VseSBpbnZvbHZpbmcgYSBgc3RyY21wYC1saWtlIGNvbXBhcmlzb24sIGJ1dCBJIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZW4mIzM5O3QgYW55IHN1YnRsZSBkaWZmZXJlbmNlcyBvciBvcHRpbWl6YXRpb25zIGluIHBsYXkgZm9yIHRoZXNlIGtlcm5mcyBlbnRyaWVzLiBJIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGZ1bmN0aW9ucyBiZWluZyBjYWxsZWQgd2hpY2ggY291bGQgZXhwbGFpbiBiZWhhdmlvdXIsIGl0IHdvdWxkIGJlIHNlbnNpYmxlIHRvIGxvb2sgYXQgYWxsIGFzcGVjdHMgb2YgdGhlIGltcGxlbWVudGF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2tlcm5mcy9kaXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM0NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzQ1Olx0XG4gMzQ2Olx0c3RhdGljIGludCBrZXJuZnNfbmFtZV9jb21wYXJlKHVuc2lnbmVkIGludCBoYXNoLCBjb25zdCBjaGFyICpuYW1lLFxuIDM0NzpcdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucywgY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICprbilcbiAzNDg6XHR7XG4gMzQ5Olx0XHR1NjQgbnNfaWQgPSBrZXJuZnNfbnNfaWQobnMpO1xuIDM1MDpcdFx0dTY0IGtuX25zX2lkID0ga2VybmZzX25zX2lkKGtuLVx1MDAzZW5zKTtcbiAzNTE6XHRcbiAzNTI6XHRcdGlmIChoYXNoIFx1MDAzYyBrbi1cdTAwM2VoYXNoKVxuIDM1MzpcdFx0XHRyZXR1cm4gLTE7XG4gMzU0Olx0XHRpZiAoaGFzaCBcdTAwM2Uga24tXHUwMDNlaGFzaClcbiAzNTU6XHRcdFx0cmV0dXJuIDE7XG4gMzU2Olx0XHRpZiAobnNfaWQgXHUwMDNjIGtuX25zX2lkKVxuIDM1NzpcdFx0XHRyZXR1cm4gLTE7XG4gMzU4Olx0XHRpZiAobnNfaWQgXHUwMDNlIGtuX25zX2lkKVxuIDM1OTpcdFx0XHRyZXR1cm4gMTtcbiAzNjA6XHRcdHJldHVybiBzdHJjbXAobmFtZSwga2VybmZzX3JjdV9uYW1lKGtuKSk7XG4gMzYxOlx0fVxuIDM2MjpcdFxuIDM2MzpcdHN0YXRpYyBpbnQga2VybmZzX3NkX2NvbXBhcmUoY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICpsZWZ0LFxuIDM2NDpcdFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICpyaWdodClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI3MTYKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA0NzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIFZ1bG5lcmFiaWxpdHkgaW4gYGtlcm5mc19uYW1lX2NvbXBhcmVgKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBga2VybmZzX25hbWVfY29tcGFyZWAsIGFuZCBpdCYjMzk7cyB1c2luZyBgc3RyY21wYCB0byBjb21wYXJlIGBuYW1lYCB3aXRoIGBrZXJuZnNfcmN1X25hbWUoa24pYC4gVGhhdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLCBhbmQgYG5hbWVgIGlzIGJlaW5nIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweWAsIHNvIGl0ICpzaG91bGQqIGJlIGEgdmFsaWQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIExldCYjMzk7cyBzZWUuLi4gSSYjMzk7bSBnb2luZyB0byBkb3VibGUgY2hlY2suIGBuYW1lYCBpcyBzZXQgdG8gYE5VTExgIGJ1dCBpdCBzZWVtcyBpdCBjYW4gYmUgYWxsb2NhdGVkIHdpdGggYGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpO2AuLi4gaWYgdGhhdCBmYWlscywgd2UgZ2V0IGAtRU5PTUVNYC4KClJpZ2h0LCBga21hbGxvY2AgaXMgdXNlZC4gTm93LCB3aGVuIGBzdHJzY3B5YCBjb3BpZXMgaW50byBgbmFtZWAsIHRoZSBtYXhpbXVtIGl0IHdyaXRlcyBpcyBgbGVuICYjNDM7IDFgIGJ5dGVzIChjaGFyYWN0ZXJzIHBsdXMgdGhlIG51bGwgdGVybWluYXRvcikuIFRoZSBpbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCB0aGUgKnJlc3QqIG9mIGBuYW1lYCwgZnJvbSBgbmFtZSAmIzQzOyBsZW4gJiM0MzsgMWAgdXAgdG8gYG5hbWUgJiM0MzsgUEFUSF9NQVggLSAxYCwgcmVtYWlucyBjb21wbGV0ZWx5IHVuaW5pdGlhbGl6ZWQuIFRoYXQgbWFrZXMgbWUgd29uZGVyLCBjb3VsZCBzb21ldGhpbmcgaW5hZHZlcnRlbnRseSByZWFkIHBhc3QgdGhlIGBcMGAgYW5kIGludG8gdGhhdCB1bmluaXRpYWxpemVkIG1lbW9yeT8KCldhaXQsIGhvbGQgb24uIExldCYjMzk7cyB0aGluayB0aGlzIHRocm91Z2guIEluIHRoZSBmaXJzdCBpdGVyYXRpb24sIGxldCYjMzk7cyBzYXkgYHBvcy0mZ3Q7bmFtZWAgaXMgJiMzNDtmb28mIzM0Oy4gU28gYG5hbWVgIGNvbnRhaW5zICYjMzQ7ZiYjMzQ7LCAmIzM0O28mIzM0OywgJiMzNDtvJiMzNDssICYjMzQ7XDAmIzM0OywgdGhlbiBnYXJiYWdlLiBUaGVuLCBpbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgYHN0cnNjcHlgIGlzIGNhbGxlZCBhZ2Fpbi4gSWYgYHBvcy0mZ3Q7bmFtZWAgaXMsIHNheSwgJiMzNDthYiYjMzQ7LCB0aGVuIGBuYW1lYCB3aWxsIGhhdmUgJiMzNDthJiMzNDssICYjMzQ7YiYjMzQ7LCAmIzM0O1wwJiMzNDssICYjMzQ7XDAmIzM0OywgYW5kIG1vcmUgZ2FyYmFnZS4gQnV0LCBoZXJlJiMzOTtzIHRoZSB0aGluZzogYHN0cmNtcGAgKm9ubHkqIHJlYWRzIHVudGlsIGl0IGZpbmRzIGEgYFwwYCwgc28gdGhhdCYjMzk7cyBzYWZlLiBBbHNvLCBgZGlyX2VtaXRgIG9ubHkgcmVhZHMgdXAgdG8gYG5hbWVsZW5gLgoKVGhlIHJlYWwgcXVlc3Rpb24gaXMsIGRvZXMgYGRpcl9lbWl0YCBjb3B5IGBuYW1lYCB0byB1c2VyIHNwYWNlPyBUaGF0IHdvdWxkIGJlIGEgYmlnZ2VyIGlzc3VlLiBMZXQmIzM5O3Mgc2VlLi4uIGBkaXJfZW1pdGAgY2FsbHMgYGN0eC0mZ3Q7YWN0b3IoY3R4LCBuYW1lLCBuYW1lbGVuLCBjdHgtJmd0O3BvcywgaW5vLCB0eXBlICZhbXA7IGR0X21hc2spO2AuIFRoZSBhY3Rvci4uLiB0aGF0JiMzOTtzIHVzdWFsbHkgZWl0aGVyIGBmaWxsZGlyYCwgYGZpbGxkaXI2NGAsIG9yIGBjb21wYXRfZmlsbGRpcmAsIGFuZCB0aGF0JiMzOTtzIGluIGBmcy9yZWFkZGlyLmNgLiBJIG5lZWQgdG8gY2hlY2sgYGZpbGxkaXI2NGAuIEkgdGhpbmsgdGhhdCYjMzk7cyB3aGVyZSBJIG5lZWQgdG8gbG9vay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmlsbGRpcjY0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvcmVhZGRpci5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL3JlYWRkaXIuYz0zMzQ9c3RydWN0IGdldGRlbnRzX2NhbGxiYWNrNjQge1xuLS1cbmZzL3JlYWRkaXIuYy0zNDAtXG5mcy9yZWFkZGlyLmM6MzQxOnN0YXRpYyBib29sIGZpbGxkaXI2NChzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWxlbixcbmZzL3JlYWRkaXIuYy0zNDItXHRcdCAgICAgbG9mZl90IG9mZnNldCwgdTY0IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSlcbi0tXG5mcy9yZWFkZGlyLmM9Mzg0PVNZU0NBTExfREVGSU5FMyhnZXRkZW50czY0LCB1bnNpZ25lZCBpbnQsIGZkLFxuLS1cbmZzL3JlYWRkaXIuYy0zODgtXHRzdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2s2NCBidWYgPSB7XG5mcy9yZWFkZGlyLmM6Mzg5Olx0XHQuY3R4LmFjdG9yID0gZmlsbGRpcjY0LFxuZnMvcmVhZGRpci5jLTM5MC1cdFx0LmN0eC5jb3VudCA9IGNvdW50LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzk0MAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byB0aGUgRGlyZWN0b3J5IFJlYWRpbmcgQ29kZSoqCgpBbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBuaXR0eS1ncml0dHkgb2YgZGlyZWN0b3J5IHJlYWRpbmcgd2l0aGluIHRoZSBrZXJuZWwuIE15IHRhcmdldCBpcyB0aGUgYGZpbGxkaXI2NGAgZnVuY3Rpb24sIHdoaWNoIEkga25vdyByZXNpZGVzIGluIGBmcy9yZWFkZGlyLmNgLiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIG9mIHBvcHVsYXRpbmcgdGhvc2UgZGlyZWN0b3J5IGVudHJpZXMgcmVzaWRlcywgc28gdW5kZXJzdGFuZGluZyBob3cgdGhpcyBmdW5jdGlvbiB3b3JrcyBpcyBjcml0aWNhbCBmb3IgZGVidWdnaW5nIG9yIG9wdGltaXppbmcgYW55IGZpbGUgc3lzdGVtIGJlaGF2aW9yIHJlbGF0ZWQgdG8gZGlyZWN0b3J5IGxpc3RpbmdzLiBMZXQmIzM5O3Mgc2VlIGhvdyBpdCBoYW5kbGVzIHRob3NlIDY0LWJpdCBpbm9kZSBudW1iZXJzLiBJJiMzOTttIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB3aGF0IGtpbmQgb2YgZXJyb3IgY2hlY2tpbmcgaXMgaW4gcGxhY2UuIFRpbWUgdG8gc3RhcnQgdHJhY2luZyB0aGUgZXhlY3V0aW9uIGFuZCBzZWUgaWYgYW55dGhpbmcganVtcHMgb3V0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL3JlYWRkaXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM0MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzQxOlx0c3RhdGljIGJvb2wgZmlsbGRpcjY0KHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxuIDM0MjpcdFx0XHQgICAgIGxvZmZfdCBvZmZzZXQsIHU2NCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpXG4gMzQzOlx0e1xuIDM0NDpcdFx0c3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqZGlyZW50LCAqcHJldjtcbiAzNDU6XHRcdHN0cnVjdCBnZXRkZW50c19jYWxsYmFjazY0ICpidWYgPVxuIDM0NjpcdFx0XHRjb250YWluZXJfb2YoY3R4LCBzdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2s2NCwgY3R4KTtcbiAzNDc6XHRcdGludCByZWNsZW4gPSBBTElHTihkaXJlbnRfc2l6ZShkaXJlbnQsIG5hbWxlbiAmIzQzOyAxKSwgc2l6ZW9mKHU2NCkpO1xuIDM0ODpcdFx0aW50IHByZXZfcmVjbGVuO1xuIDM0OTpcdFx0dW5zaWduZWQgaW50IGZsYWdzID0gZF90eXBlO1xuIDM1MDpcdFxuIDM1MTpcdFx0QlVJTERfQlVHX09OKEZJTExESVJfRkxBR19OT0lOVFIgXHUwMDI2IFNfRFRfTUFTSyk7XG4gMzUyOlx0XHRkX3R5cGUgXHUwMDI2PSBTX0RUX01BU0s7XG4gMzUzOlx0XG4gMzU0Olx0XHRidWYtXHUwMDNlZXJyb3IgPSB2ZXJpZnlfZGlyZW50X25hbWUobmFtZSwgbmFtbGVuKTtcbiAzNTU6XHRcdGlmICh1bmxpa2VseShidWYtXHUwMDNlZXJyb3IpKVxuIDM1NjpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMzU3Olx0XHRidWYtXHUwMDNlZXJyb3IgPSAtRUlOVkFMO1x0Lyogb25seSB1c2VkIGlmIHdlIGZhaWwuLiAqL1xuIDM1ODpcdFx0aWYgKHJlY2xlbiBcdTAwM2UgY3R4LVx1MDAzZWNvdW50KVxuIDM1OTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMzYwOlx0XHRwcmV2X3JlY2xlbiA9IGJ1Zi1cdTAwM2VwcmV2X3JlY2xlbjtcbiAzNjE6XHRcdGlmICghKGZsYWdzIFx1MDAyNiBGSUxMRElSX0ZMQUdfTk9JTlRSKSBcdTAwMjZcdTAwMjYgcHJldl9yZWNsZW4gXHUwMDI2XHUwMDI2IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKVxuIDM2MjpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMzYzOlx0XHRkaXJlbnQgPSBidWYtXHUwMDNlY3VycmVudF9kaXI7XG4gMzY0Olx0XHRwcmV2ID0gKHZvaWQgX191c2VyICopZGlyZW50IC0gcHJldl9yZWNsZW47XG4gMzY1Olx0XHRzY29wZWRfdXNlcl93cml0ZV9hY2Nlc3Nfc2l6ZShwcmV2LCByZWNsZW4gJiM0MzsgcHJldl9yZWNsZW4sIGVmYXVsdCkge1xuIDM2NjpcdFx0XHQvKiBUaGlzIG1pZ2h0IGJlICYjMzk7ZGlyZW50LVx1MDAzZWRfb2ZmJiMzOTssIGJ1dCBpZiBzbyBpdCB3aWxsIGdldCBvdmVyd3JpdHRlbiAqL1xuIDM2NzpcdFx0XHR1bnNhZmVfcHV0X3VzZXIob2Zmc2V0LCBcdTAwMjZwcmV2LVx1MDAzZWRfb2ZmLCBlZmF1bHQpO1xuIDM2ODpcdFx0XHR1bnNhZmVfcHV0X3VzZXIoaW5vLCBcdTAwMjZkaXJlbnQtXHUwMDNlZF9pbm8sIGVmYXVsdCk7XG4gMzY5Olx0XHRcdHVuc2FmZV9wdXRfdXNlcihyZWNsZW4sIFx1MDAyNmRpcmVudC1cdTAwM2VkX3JlY2xlbiwgZWZhdWx0KTtcbiAzNzA6XHRcdFx0dW5zYWZlX3B1dF91c2VyKGRfdHlwZSwgXHUwMDI2ZGlyZW50LVx1MDAzZWRfdHlwZSwgZWZhdWx0KTtcbiAzNzE6XHRcdFx0dW5zYWZlX2NvcHlfZGlyZW50X25hbWUoZGlyZW50LVx1MDAzZWRfbmFtZSwgbmFtZSwgbmFtbGVuLCBlZmF1bHQpO1xuIDM3MjpcdFx0fVxuIDM3MzpcdFxuIDM3NDpcdFx0YnVmLVx1MDAzZXByZXZfcmVjbGVuID0gcmVjbGVuO1xuIDM3NTpcdFx0YnVmLVx1MDAzZWN1cnJlbnRfZGlyID0gKHZvaWQgX191c2VyICopZGlyZW50ICYjNDM7IHJlY2xlbjtcbiAzNzY6XHRcdGN0eC1cdTAwM2Vjb3VudCAtPSByZWNsZW47XG4gMzc3Olx0XHRyZXR1cm4gdHJ1ZTtcbiAzNzg6XHRcbiAzNzk6XHRlZmF1bHQ6XG4gMzgwOlx0XHRidWYtXHUwMDNlZXJyb3IgPSAtRUZBVUxUO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDkyNwoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdDoKCioqRGlnZ2luZyBpbnRvIHRoZSBgdW5zYWZlX2NvcHlfZGlyZW50X25hbWVgIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGxpbmUgb2YgY29kZTogYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC0mZ3Q7ZF9uYW1lLCBuYW1lLCBuYW1sZW4sIGVmYXVsdCk7YCBNeSBpbml0aWFsIHRob3VnaHQgaXMsIHRoaXMgZnVuY3Rpb24gbmFtZSwgJiMzNDt1bnNhZmUsJiMzNDsgYWxyZWFkeSByYWlzZXMgYSByZWQgZmxhZy4gSSYjMzk7bSBhc3N1bWluZyBpdCYjMzk7cyBoYW5kbGluZyBhIHBvdGVudGlhbGx5IHRyaWNreSBtZW1vcnkgY29weSBvcGVyYXRpb24gcmVsYXRlZCB0byBkaXJlY3RvcnkgZW50cmllcy4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGdvaW5nIG9uIHVuZGVyIHRoZSBob29kIG9mIGB1bnNhZmVfY29weV9kaXJlbnRfbmFtZWAuIE15IGd1dCBmZWVsaW5nIGlzIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggc3RyaW5nIG1hbmlwdWxhdGlvbiwgcG9zc2libHkgd2l0aCBhIGZpeGVkLXNpemUgYnVmZmVyIChgbmFtZWApIGFuZCBhIHNvdXJjZSAoYGRpcmVudC0mZ3Q7ZF9uYW1lYCkgdGhhdCBtYXkgb3IgbWF5IG5vdCBmaXQgbmVhdGx5LiBUaGUgYG5hbWxlbmAgYXJndW1lbnQgaXMgcHJvYmFibHkgdGhlIGludGVuZGVkIG1heGltdW0gY29weSBsZW5ndGgsIHdoaWNoIGlzIGEgZ29vZCBzaWduIGlmIHVzZWQgY29ycmVjdGx5IGZvciBhIGJ1ZmZlciBvdmVyZmxvdyBwcmV2ZW50aW9uIHN0cmF0ZWd5LiBGaW5hbGx5LCBgZWZhdWx0YCwgbG9va3MgbGlrZSBpdCBjb3VsZCBiZSBhIHBvaW50ZXIgdG8gYSBmbGFnIG9yIGVycm9yIGNvZGUgdG8gYmUgc2V0IGluIGNhc2UgdGhlIGNvcHkgZmFpbHMgZm9yIHNvbWUgcmVhc29uLiBUaGUgbmFtZSAmIzM0O2VmYXVsdCYjMzQ7IHN1Z2dlc3RzIHRoYXQgaXQgbWlnaHQgYmUgcmVsYXRlZCB0byB0aGUgYEVGQVVMVGAgZXJyb3IgY29kZSwgd2hpY2ggaW5kaWNhdGVzIGEgYmFkIGFkZHJlc3MgcGFzc2VkIHRvIGEgc3lzdGVtIGNhbGwuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uLCBsZW5ndGgsIGFuZCBlcnJvciBoYW5kbGluZyBtZWNoYW5pY3Mgd2l0aGluIHRoaXMgZnVuY3Rpb24gdG8gcHJvcGVybHkgYXNzZXNzIHRoaXMgY29kZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dW5zYWZlX2NvcHlfZGlyZW50X25hbWUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9yZWFkZGlyLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvcmVhZGRpci5jPTcyPUVYUE9SVF9TWU1CT0wod3JhcF9kaXJlY3RvcnlfaXRlcmF0b3IpO1xuLS1cbmZzL3JlYWRkaXIuYy03Ny0gKi9cbmZzL3JlYWRkaXIuYzo3ODojZGVmaW5lIHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKF9kc3QsIF9zcmMsIF9sZW4sIGxhYmVsKSBkbyB7XHRcXFxuZnMvcmVhZGRpci5jLTc5LVx0Y2hhciBfX3VzZXIgKmRzdCA9IChfZHN0KTtcdFx0XHRcdFxcXG4tLVxuZnMvcmVhZGRpci5jPTE4Mz1zdGF0aWMgYm9vbCBmaWxsb25lZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxuLS1cbmZzL3JlYWRkaXIuYy0yMDYtXHRcdHVuc2FmZV9wdXRfdXNlcihuYW1sZW4sIFx1MDAyNmRpcmVudC1cdTAwM2VkX25hbWxlbiwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYzoyMDc6XHRcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cdTAwM2VkX25hbWUsIG5hbWUsIG5hbWxlbiwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYy0yMDgtXHR9XG4tLVxuZnMvcmVhZGRpci5jPTI1Nj1zdGF0aWMgYm9vbCBmaWxsZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxuLS1cbmZzL3JlYWRkaXIuYy0yOTEtXHRcdHVuc2FmZV9wdXRfdXNlcihkX3R5cGUsIChjaGFyIF9fdXNlciAqKWRpcmVudCAmIzQzOyByZWNsZW4gLSAxLCBlZmF1bHQpO1xuZnMvcmVhZGRpci5jOjI5MjpcdFx0dW5zYWZlX2NvcHlfZGlyZW50X25hbWUoZGlyZW50LVx1MDAzZWRfbmFtZSwgbmFtZSwgbmFtbGVuLCBlZmF1bHQpO1xuZnMvcmVhZGRpci5jLTI5My1cdH1cbi0tXG5mcy9yZWFkZGlyLmM9MzQxPXN0YXRpYyBib29sIGZpbGxkaXI2NChzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWxlbixcbi0tXG5mcy9yZWFkZGlyLmMtMzcwLVx0XHR1bnNhZmVfcHV0X3VzZXIoZF90eXBlLCBcdTAwMjZkaXJlbnQtXHUwMDNlZF90eXBlLCBlZmF1bHQpO1xuZnMvcmVhZGRpci5jOjM3MTpcdFx0dW5zYWZlX2NvcHlfZGlyZW50X25hbWUoZGlyZW50LVx1MDAzZWRfbmFtZSwgbmFtZSwgbmFtbGVuLCBlZmF1bHQpO1xuZnMvcmVhZGRpci5jLTM3Mi1cdH1cbi0tXG5mcy9yZWFkZGlyLmM9NDI5PXN0YXRpYyBib29sIGNvbXBhdF9maWxsb25lZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLFxuLS1cbmZzL3JlYWRkaXIuYy00NTMtXHRcdHVuc2FmZV9wdXRfdXNlcihuYW1sZW4sIFx1MDAyNmRpcmVudC1cdTAwM2VkX25hbWxlbiwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYzo0NTQ6XHRcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cdTAwM2VkX25hbWUsIG5hbWUsIG5hbWxlbiwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYy00NTUtXHR9XG4tLVxuZnMvcmVhZGRpci5jPTQ5Nz1zdGF0aWMgYm9vbCBjb21wYXRfZmlsbGRpcihzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWxlbixcbi0tXG5mcy9yZWFkZGlyLmMtNTMxLVx0XHR1bnNhZmVfcHV0X3VzZXIoZF90eXBlLCAoY2hhciBfX3VzZXIgKilkaXJlbnQgJiM0MzsgcmVjbGVuIC0gMSwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYzo1MzI6XHRcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cdTAwM2VkX25hbWUsIG5hbWUsIG5hbWxlbiwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYy01MzMtXHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2MDAxCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYGZzL3JlYWRkaXIuY2AqKgoKT2theSwgdGltZSB0byBkaWcgaW50byB0aGlzLiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGB1bnNhZmVfY29weV9kaXJlbnRfbmFtZWAgZnVuY3Rpb24sIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGBmcy9yZWFkZGlyLmNgIGZpbGUuIEkga25vdyB0aGlzIGFyZWEgY2FuIGJlIHRyaWNreSwgc28gSSYjMzk7bSBob25pbmcgaW4gb24gbGluZXMgNzgtMTAwLiBUaGF0JiMzOTtzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgdGhlIG1lYXQgb2YgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gYW5kIGltcGxlbWVudGF0aW9uLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IHdoYXQmIzM5O3MgZ29pbmcgb24gd2l0aCBob3cgZGlyZWN0b3J5IGVudHJ5IG5hbWVzIGFyZSBiZWluZyBoYW5kbGVkLiBTYWZldHkgYW5kIHBlcmZvcm1hbmNlIGFyZSBjcnVjaWFsIGhlcmUsIHNvIEkgbmVlZCB0byBhc3Nlc3MgdGhpcyB0aG9yb3VnaGx5LiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UmIzM5O3ZlIGdvdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9yZWFkZGlyLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA3NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDc1Olx0ICogTm90ZSB0aGUgXCYjMzQ7dW5zYWZlX3B1dF91c2VyKClcJiMzNDsgc2VtYW50aWNzOiB3ZSBnb3RvIGFcbiAgNzY6XHQgKiBsYWJlbCBmb3IgZXJyb3JzLlxuICA3NzpcdCAqL1xuICA3ODpcdCNkZWZpbmUgdW5zYWZlX2NvcHlfZGlyZW50X25hbWUoX2RzdCwgX3NyYywgX2xlbiwgbGFiZWwpIGRvIHtcdFxcXG4gIDc5Olx0XHRjaGFyIF9fdXNlciAqZHN0ID0gKF9kc3QpO1x0XHRcdFx0XFxcbiAgODA6XHRcdGNvbnN0IGNoYXIgKnNyYyA9IChfc3JjKTtcdFx0XHRcdFxcXG4gIDgxOlx0XHRzaXplX3QgbGVuID0gKF9sZW4pO1x0XHRcdFx0XHRcXFxuICA4MjpcdFx0dW5zYWZlX3B1dF91c2VyKDAsIGRzdCYjNDM7bGVuLCBsYWJlbCk7XHRcdFx0XFxcbiAgODM6XHRcdHVuc2FmZV9jb3B5X3RvX3VzZXIoZHN0LCBzcmMsIGxlbiwgbGFiZWwpO1x0XHRcXFxuICA4NDpcdH0gd2hpbGUgKDApXG4gIDg1Olx0XG4gIDg2Olx0XG4gIDg3Olx0aW50IGl0ZXJhdGVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcbiAgODg6XHR7XG4gIDg5Olx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcbiAgOTA6XHRcdGludCByZXMgPSAtRU5PVERJUjtcbiAgOTE6XHRcbiAgOTI6XHRcdGlmICghZmlsZS1cdTAwM2VmX29wLVx1MDAzZWl0ZXJhdGVfc2hhcmVkKVxuICA5MzpcdFx0XHRnb3RvIG91dDtcbiAgOTQ6XHRcbiAgOTU6XHRcdHJlcyA9IHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbihmaWxlLCBNQVlfUkVBRCk7XG4gIDk2Olx0XHRpZiAocmVzKVxuICA5NzpcdFx0XHRnb3RvIG91dDtcbiAgOTg6XHRcbiAgOTk6XHRcdHJlcyA9IGZzbm90aWZ5X2ZpbGVfcGVybShmaWxlLCBNQVlfUkVBRCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NTgxCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMTAzNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lYCBhbmQgUmVsYXRlZCBGdW5jdGlvbnMgaW4gYGZzL2tlcm5mcy9kaXIuY2AqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgdW5zYWZlX2NvcHlfZGlyZW50X25hbWVgIGZ1bmN0aW9uLCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgaXQgbG9va3Mgc2FmZS4gYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lYCBjb3BpZXMgYGxlbmAgYnl0ZXMgZnJvbSBgc3JjYCB0byBgZHN0YCwgdGhlbiBudWxsLXRlcm1pbmF0ZXMgdGhlIHJlc3VsdC4gYGxlbmAgY29tZXMgZnJvbSBgc3Ryc2NweWAsIHdoaWNoIGhhbmRsZXMgc3RyaW5nIGNvcHlpbmcgYW5kIG51bGwgdGVybWluYXRpb24uIFNpbmNlIGBzdHJzY3B5YCBjb3BpZXMgZXhhY3RseSBgbGVuYCBjaGFyYWN0ZXJzIGFuZCB0aGUgTlVMIGJ5dGUsIGl0IGFwcGVhcnMgdGhhdCBgbGVuYCBieXRlcyBhcmUgY29waWVkIGZyb20gYG5hbWVgIHRvIHVzZXIgc3BhY2UsIGFuZCBpbXBvcnRhbnRseSwgdGhlc2UgYGxlbmAgYnl0ZXMgc2hvdWxkIGJlIGZ1bGx5IGluaXRpYWxpemVkLgoKVGhlbiBJIHBhdXNlZC4gQ291bGQgYHN0cnNjcHlgIHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlPyBUaGUgY29kZSBkb2VzIGNoZWNrIGZvciB0aGlzLCBicmVha2luZyB0aGUgbG9vcCBpZiBgbGVuICZsdDsgMGAuIElmIGBsZW5gIGlzIG5vdCBuZWdhdGl2ZSwgaXQgcmVwcmVzZW50cyB0aGUgc3RyaW5nIGxlbmd0aC4gR29vZCwgdGhhdCB0YWtlcyBjYXJlIG9mIHRoZSBuZWdhdGl2ZSByZXR1cm4gcG9zc2liaWxpdHkuCgpOb3csIGxldCYjMzk7cyBsb29rIGZ1cnRoZXIgaW50byB0aGlzIHBhdGNoLCBzcGVjaWZpY2FsbHkgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zIHdpdGhpbiBgZnMva2VybmZzL2Rpci5jYC4gVGhlIGZpcnN0IGZ1bmN0aW9uIG9mIGludGVyZXN0IGlzIGBrZXJuZnNfZGlyX3Bvc2AsIGFuZCBpdHMgY2FsbGVycy4gVGhlIGNhbGxlciBpcyBga2VybmZzX2Rpcl9uZXh0X3Bvc2AuIFdpdGhpbiBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgSSBzZWUgYSB2YXJpYWJsZSBgYm9vbCByZXN1bWVkO2AgcGFzc2VkIHRvIGBrZXJuZnNfZGlyX3Bvc2AuIEl0JiMzOTtzIHVzZWQgaW4gdGhpcyBtYW5uZXI6IGBwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIG5hbWUsICZhbXA7cmVzdW1lZCk7YC4gSW5zaWRlIGBrZXJuZnNfZGlyX3Bvc2AsIGByZXN1bWVkYCBpcyBzZXQgdG8gZmFsc2UgaW5pdGlhbGx5LiBGdXJ0aGVyIGRvd24sIGlmIGBwb3NgIGlzIHZhbGlkLCBpdCBnZXRzIHNldCB0byB0cnVlLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRoYXQgYHJlc3VtZWRgIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYW5kIHdyaXR0ZW4gdG8sIHNvIHRoZSBjb21waWxlciBzaG91bGQgaGFuZGxlIHRoaXMuCgpTbyBsZXQmIzM5O3MgY29uc2lkZXIgdGhlIGBuYW1lYCBhcmd1bWVudC4gSSBzZWUgaXQgYmVpbmcgdXNlZCBhcyBgbmFtZSA/OiAmIzM0OyYjMzQ7YC4gVGhpcyBtZWFucyB0aGF0IGlmIGBuYW1lYCBpcyBOVUxMLCBhbiBlbXB0eSBzdHJpbmcgaXMgdXNlZC4gVGhpcyBpcyBpbXBvcnRhbnQsIGxldCYjMzk7cyB0cmFjayB0aGUgYG5hbWVgIHZhcmlhYmxlIGFuZCBzZWUgaG93IGl0IGlzIHVzZWQuIEl0IGxvb2tzIGxpa2UgYG5hbWVgIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgYGtlcm5mc19kaXJfbmV4dF9wb3NgLiBJZiB3ZSBsb29rIGF0IGBrZXJuZnNfZm9wX3JlYWRkaXJgOgoKYGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LSZndDtwb3MsIHBvcywgTlVMTCwgTlVMTCk7IHBvczsgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtJmd0O3BvcywgcG9zLCBuYW1lKSlgCgpPa2F5LCBoZXJlJiMzOTtzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIEluc2lkZSB0aGUgZmlyc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wLCBgcG9zYCBpcyBpbml0aWFsaXplZCBieSBga2VybmZzX2Rpcl9wb3NgLCB3aXRoIE5VTEwgZm9yIHRoZSBuYW1lIGFyZ3VtZW50cy4gSWYgYHBvc2AgaXMgTlVMTCwgdGhlIGxvb3AgZG9lc24mIzM5O3QgcnVuLiBJZiBgcG9zYCBpcyB2YWxpZCwgdGhlIGxvb3AgYm9keSBleGVjdXRlcy4gSW1wb3J0YW50bHksIGluc2lkZSB0aGUgbG9vcCBib2R5IGlzIHRoZSBgc3Ryc2NweWAgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyBgbmFtZWA6CgpgbGVuID0gc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpO2AKCmBuYW1lYCBpcyBpbml0aWFsaXplZC4KClRoZW4sIHdlIGhhdmUgdGhlIGxvb3AgaW5jcmVtZW50OgoKYHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LSZndDtwb3MsIHBvcywgbmFtZSlgCgpBdCB0aGlzIHBvaW50LCBgbmFtZWAgKmhhcyogYmVlbiB3cml0dGVuIHRvIGJ5IGBzdHJzY3B5YC4gVGhpcyB0ZWxscyBtZSB0aGF0IGBuYW1lYCB3aWxsIGJlIGluaXRpYWxpemVkIHdoZW4gaXQmIzM5O3MgcGFzc2VkIGhlcmUuIFNvIGl0IHNob3VsZCBhbHdheXMgYmUgaW5pdGlhbGl6ZWQuCgpJJiMzOTtsbCBkbyBhIHF1aWNrIGNvZGUtd2lkZSBncmVwIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBvdGhlciBjYWxsZXJzIHRvIGBrZXJuZnNfZGlyX3Bvc2AgYW5kIGBrZXJuZnNfZGlyX25leHRfcG9zYCBhbmQgaWYgSSYjMzk7bSBtaXNzaW5nIHNvbWV0aGluZyBlbHNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtrZXJuZnNfZGlyX3BvcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2tlcm5mcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMva2VybmZzL2Rpci5jPTE5MDA9c3RhdGljIGludCBrZXJuZnNfZGlyX2ZvcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKVxuLS1cbmZzL2tlcm5mcy9kaXIuYy0xOTA5LSAqL1xuZnMva2VybmZzL2Rpci5jOjE5MTA6c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXG5mcy9rZXJuZnMvZGlyLmMtMTkxMS1cdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXG4tLVxuZnMva2VybmZzL2Rpci5jPTE5NjM9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9uZXh0X3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMTk2OC1cbmZzL2tlcm5mcy9kaXIuYzoxOTY5Olx0cG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgaGFzaCwgcG9zLCBuYW1lLCBcdTAwMjZyZXN1bWVkKTtcbmZzL2tlcm5mcy9kaXIuYy0xOTcwLVx0LyogU3RlcCBvdmVyIEBwb3Mgb25seSBpZiBpdCBzdXJ2aXZlZDsgQG5hbWUgZmluZHMgdGhlIHNwb3QgaWYgbm90LiAqL1xuLS1cbmZzL2tlcm5mcy9kaXIuYz0xOTg0PXN0YXRpYyBpbnQga2VybmZzX2ZvcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMjAwOS1cbmZzL2tlcm5mcy9kaXIuYzoyMDEwOlx0Zm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtXHUwMDNlcG9zLCBwb3MsIE5VTEwsIE5VTEwpO1xuZnMva2VybmZzL2Rpci5jLTIwMTEtXHQgICAgIHBvcztcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMjAzMS1cdFx0ICogZGlyX2VtaXQoKSBjYW4gZmF1bHQsIHNvIHJ1biBpdCB1bmxvY2tlZC4gIEBwb3MgaXMgcGlubmVkXG5mcy9rZXJuZnMvZGlyLmM6MjAzMjpcdFx0ICogYWJvdmUgYW5kIGtlcm5mc19kaXJfcG9zKCkgcmVjaGVja3MgaXQgb24gdGhlIHdheSBiYWNrLlxuZnMva2VybmZzL2Rpci5jLTIwMzMtXHRcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODkwNgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE2NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipEaXZpbmcgRGVlcCBpbnRvIGBrZXJuZnNfZGlyX25leHRfcG9zYCBpbiBgZnMva2VybmZzL2Rpci5jYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGhhcHBlbmluZyB3aXRoIHRoYXQgYGtlcm5mc19kaXJfbmV4dF9wb3NgIGZ1bmN0aW9uLiBMZXQmIzM5O3Mgc3RhcnQgYnkgbG9va2luZyBhdCBsaW5lIDE5NzYsIG9yIHRoZXJlYWJvdXRzLCBpbiBgZnMva2VybmZzL2Rpci5jYC4gQWgsIHllcywgaW4gdGhlIGhlYXJ0IG9mIHRoaXMgZnVuY3Rpb24sIHRoZXJlJiMzOTtzIHRoYXQgbG9vcDoKCmBgYGMKCQlkbyB7CgkJCXN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dCgmYW1wO3Bvcy0mZ3Q7cmIpOwoJCQlpZiAoIW5vZGUpCgkJCQlyZXR1cm4gTlVMTDsKCQkJcG9zID0gcmJfdG9fa24obm9kZSk7CgkJCWtlcm5mc19nZXQocG9zKTsKCQl9IHdoaWxlIChrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIE5VTEwsIE5VTEwpICE9IHBvcyk7CmBgYAoKSG1tLi4ud2FpdCBhIG1pbnV0ZS4gVGhhdCBgd2hpbGVgIGNvbmRpdGlvbiBpcyBhIGJpdOKApnRyaWNreS4gSXQmIzM5O3MgY2hlY2tpbmcgaWYgc29tZXRoaW5nIGlzbiYjMzk7dCBxdWl0ZSByaWdodC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBiZXR0ZXIuIFNvbWV0aGluZyBhYm91dCB0aGF0IGxvb3AgaXMgbWFraW5nIG1lIHRoaW5rLCB3aGF0IHdhcyB0aGF0IGxpbmUgbG9va2luZyBsaWtlIGJlZm9yZT8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyB0byBzZWUgaWYgSSBhbSBtaXNzaW5nIHNvbWV0aGluZyBvYnZpb3VzIG9yIHdoYXQgY2hhbmdlcyBsZWQgdXAgdG8gdGhpcyBzdHJ1Y3R1cmUuCgpUbyB0cnVseSBncmFzcCB0aGUgY29udGV4dCwgSSBuZWVkIHRvIHJlYWQgdGhlIGNvZGUgc3Vycm91bmRpbmcgdGhpcyBmdW5jdGlvbi4gTGV0JiMzOTtzIGV4cGFuZCBteSB2aWV3IHRvIGxpbmVzIDE5NDAtMTk4MCwgbG9va2luZyBhdCB0aGUgY29kZSBiZWZvcmUgYW5kIGFmdGVyIHRoaXMgY3J1Y2lhbCBsb29wLiBJIG5lZWQgdGhlIGJpZ2dlciBwaWN0dXJlIHRvIHVuZGVyc3RhbmQgdGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBhbmQgd2hldGhlciBpdCYjMzk7cyBvcHRpbWl6ZWQgb3Igc2ltcGx5IGNvcnJlY3QuIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IGFuZCBkaXNzZWN0IHRoaXMgZnVuY3Rpb24hCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMva2VybmZzL2Rpci5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTk1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxOTUwOlx0XHR9XG4xOTUxOlx0XHQvKiBTa2lwIG92ZXIgZW50cmllcyB3aGljaCBhcmUgZHlpbmcvZGVhZCBvciBpbiB0aGUgd3JvbmcgbmFtZXNwYWNlICovXG4xOTUyOlx0XHR3aGlsZSAocG9zIFx1MDAyNlx1MDAyNiAoIWtlcm5mc19hY3RpdmUocG9zKSB8fFxuMTk1MzpcdFx0XHQgICAgICAga2VybmZzX25zX2lkKHBvcy1cdTAwM2VucykgIT0ga2VybmZzX25zX2lkKG5zKSkpIHtcbjE5NTQ6XHRcdFx0c3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KFx1MDAyNnBvcy1cdTAwM2VyYik7XG4xOTU1Olx0XHRcdGlmICghbm9kZSlcbjE5NTY6XHRcdFx0XHRwb3MgPSBOVUxMO1xuMTk1NzpcdFx0XHRlbHNlXG4xOTU4Olx0XHRcdFx0cG9zID0gcmJfdG9fa24obm9kZSk7XG4xOTU5Olx0XHR9XG4xOTYwOlx0XHRyZXR1cm4gcG9zO1xuMTk2MTpcdH1cbjE5NjI6XHRcbjE5NjM6XHRzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuMTk2NDpcdFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyxcbjE5NjU6XHRcdGNvbnN0IGNoYXIgKm5hbWUpXG4xOTY2Olx0e1xuMTk2NzpcdFx0Ym9vbCByZXN1bWVkO1xuMTk2ODpcdFxuMTk2OTpcdFx0cG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgaGFzaCwgcG9zLCBuYW1lLCBcdTAwMjZyZXN1bWVkKTtcbjE5NzA6XHRcdC8qIFN0ZXAgb3ZlciBAcG9zIG9ubHkgaWYgaXQgc3Vydml2ZWQ7IEBuYW1lIGZpbmRzIHRoZSBzcG90IGlmIG5vdC4gKi9cbjE5NzE6XHRcdGlmIChwb3MgXHUwMDI2XHUwMDI2IHJlc3VtZWQpIHtcbjE5NzI6XHRcdFx0ZG8ge1xuMTk3MzpcdFx0XHRcdHN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dChcdTAwMjZwb3MtXHUwMDNlcmIpO1xuMTk3NDpcdFx0XHRcdGlmICghbm9kZSlcbjE5NzU6XHRcdFx0XHRcdHBvcyA9IE5VTEw7XG4xOTc2Olx0XHRcdFx0ZWxzZVxuMTk3NzpcdFx0XHRcdFx0cG9zID0gcmJfdG9fa24obm9kZSk7XG4xOTc4Olx0XHRcdH0gd2hpbGUgKHBvcyBcdTAwMjZcdTAwMjYgKCFrZXJuZnNfYWN0aXZlKHBvcykgfHxcbjE5Nzk6XHRcdFx0XHRrZXJuZnNfbnNfaWQocG9zLVx1MDAzZW5zKSAhPSBrZXJuZnNfbnNfaWQobnMpKSk7XG4xOTgwOlx0XHR9XG4xOTgxOlx0XHRyZXR1cm4gcG9zO1xuMTk4MjpcdH1cbjE5ODM6XHRcbjE5ODQ6XHRzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4xOTg1Olx0e1xuMTk4NjpcdFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS1cdTAwM2VmX3BhdGguZGVudHJ5O1xuMTk4NzpcdFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTtcbjE5ODg6XHRcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4xOTg5Olx0XHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDA5NwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipEaXZpbmcgaW50byBrZXJuZnNfZm9wX3JlYWRkaXIqKgoKUmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gV2UmIzM5O3JlIGluIGBrZXJuZnNfZm9wX3JlYWRkaXJgLCB3aGljaCBtZWFucyB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIHRoZSBjb3JlIGxvZ2ljIGZvciBkaXJlY3RvcnkgcmVhZGluZyB3aXRoaW4gdGhlIGtlcm5mcyBmaWxlc3lzdGVtLiBUaGUgaW1tZWRpYXRlIGltcGxpY2F0aW9uIGlzIHRoYXQgd2UmIzM5O3JlIGxpa2VseSBwcm9jZXNzaW5nIGEgZGlyZWN0b3J5IGVudHJ5IGxvb2t1cCwgcHJvYmFibHkgdHJpZ2dlcmVkIGJ5IGEgYHJlYWRkaXIoKWAgc3lzdGVtIGNhbGwuIEdpdmVuIG15IGZhbWlsaWFyaXR5IHdpdGggVkZTIHN0cnVjdHVyZXMsIEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gaW50ZXJmYWNlIGhlYXZpbHkgd2l0aCBrZXJuZnMmIzM5O3MgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIHByb3ZpZGUgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzLiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gaG93IGl0IGhhbmRsZXMgYHN0cnVjdCBrZXJuZnNfbm9kZWAgZW50cmllcyBhbmQgcG90ZW50aWFsbHkgdGhlIGFzc29jaWF0ZWQgYHN0cnVjdCBrZXJuZnNfZGlyX29wc2AgKG9yIHNpbWlsYXIpIGNhbGxiYWNrcyB0byBzZWUgaG93IGl0IG1hbmFnZXMgaXRlcmF0aW9uIGFuZCBmaWx0ZXJpbmcgb2YgdGhvc2UgZGlyZWN0b3J5IGVudHJpZXMuIEkgd2FudCB0byBzZWUgaG93IGl0IHJlc3BlY3RzIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIgZm9yIHNlZWtpbmcgd2l0aGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZyBhbmQgZW5zdXJlcyB0aGF0IGl0IGhhbmRsZXMgdGhlIGBmaWxsZGlyYCBmdW5jdGlvbiBjb3JyZWN0bHkgdG8gY29uc3RydWN0IHRoZSBkaXJlY3RvcnkgZW50cmllcyBmb3IgdXNlciBzcGFjZS4gVWx0aW1hdGVseSwgSSYjMzk7bSB0cnlpbmcgdG8gdW5kZXJzdGFuZCBob3cga2VybmZzIHByZXNlbnRzIGl0cyBoaWVyYXJjaGljYWwgb3JnYW5pemF0aW9uIHRocm91Z2ggdGhpcyBmdW5jdGlvbiwgYW5kIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3Igc3VidGxlIHJhY2UgY29uZGl0aW9ucy4gVGhlIHdob2xlIGZ1bmN0aW9uIHdpbGwgaGF2ZSB0byBiZSBleGFtaW5lZCBmb3IgdGhlc2UgZGV0YWlscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9rZXJuZnMvZGlyLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxOTg0LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDcwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE5ODQ6XHRzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4xOTg1Olx0e1xuMTk4NjpcdFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS1cdTAwM2VmX3BhdGguZGVudHJ5O1xuMTk4NzpcdFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTtcbjE5ODg6XHRcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4xOTg5Olx0XHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuMTk5MDpcdFx0c3RydWN0IGtlcm5mc19yb290ICpyb290O1xuMTk5MTpcdFx0Y29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMO1xuMTk5MjpcdFxuMTk5MzpcdFx0aWYgKCFkaXJfZW1pdF9kb3RzKGZpbGUsIGN0eCkpXG4xOTk0Olx0XHRcdHJldHVybiAwO1xuMTk5NTpcdFxuMTk5NjpcdFx0LypcbjE5OTc6XHRcdCAqIE9uZSBidWZmZXIgZm9yIHRoZSBjYWxsLCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGUgbGlzdGluZ1xuMTk5ODpcdFx0ICogaXMgb24uICBQQVRIX01BWDoga2VybmZzIGJvdW5kcyBubyBzaW5nbGUgbmFtZS5cbjE5OTk6XHRcdCAqL1xuMjAwMDpcdFx0bmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpO1xuMjAwMTpcdFx0aWYgKCFuYW1lKVxuMjAwMjpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbjIwMDM6XHRcbjIwMDQ6XHRcdHJvb3QgPSBrZXJuZnNfcm9vdChwYXJlbnQpO1xuMjAwNTpcdFx0ZG93bl9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbjIwMDY6XHRcbjIwMDc6XHRcdGlmIChrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpKVxuMjAwODpcdFx0XHRucyA9IGtlcm5mc19pbmZvKGRlbnRyeS1cdTAwM2VkX3NiKS1cdTAwM2VucztcbjIwMDk6XHRcbjIwMTA6XHRcdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBOVUxMLCBOVUxMKTtcbjIwMTE6XHRcdCAgICAgcG9zO1xuMjAxMjpcdFx0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcywgbmFtZSkpIHtcbjIwMTM6XHRcdFx0dW5zaWduZWQgaW50IHR5cGUgPSBmc191bW9kZV90b19kdHlwZShwb3MtXHUwMDNlbW9kZSk7XG4yMDE0Olx0XHRcdGlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTtcbjIwMTU6XHRcdFx0aW50IGxlbjtcbjIwMTY6XHRcbjIwMTc6XHRcdFx0LypcbjIwMTg6XHRcdFx0ICogVGhlIGNvcHkgaXMgYWxzbyB0aGUgcmVzdW1lIGtleSwgc28gYSB0cnVuY2F0ZWQgbmFtZSB3b3VsZFxuMjAxOTpcdFx0XHQgKiByZXN1bWUgaGVyZSBhZ2Fpbi4gIGdldG5hbWUoKSBjYXBzIGEgcGF0aCwgc28gb25seSBhblxuMjAyMDpcdFx0XHQgKiBpbi1rZXJuZWwgY2FsbGVyIGNhbiBnZXQgaGVyZTsgZW5kIHRoZSBsaXN0aW5nIGluc3RlYWQuXG4yMDIxOlx0XHRcdCAqL1xuMjAyMjpcdFx0XHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XG4yMDIzOlx0XHRcdGlmIChXQVJOX09OX09OQ0UobGVuIFx1MDAzYyAwKSlcbjIwMjQ6XHRcdFx0XHRicmVhaztcbjIwMjU6XHRcbjIwMjY6XHRcdFx0Y3R4LVx1MDAzZXBvcyA9IHBvcy1cdTAwM2VoYXNoO1xuMjAyNzpcdFx0XHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IHBvcztcbjIwMjg6XHRcdFx0a2VybmZzX2dldChwb3MpO1xuMjAyOTpcdFxuMjAzMDpcdFx0XHQvKlxuMjAzMTpcdFx0XHQgKiBkaXJfZW1pdCgpIGNhbiBmYXVsdCwgc28gcnVuIGl0IHVubG9ja2VkLiAgQHBvcyBpcyBwaW5uZWRcbjIwMzI6XHRcdFx0ICogYWJvdmUgYW5kIGtlcm5mc19kaXJfcG9zKCkgcmVjaGVja3MgaXQgb24gdGhlIHdheSBiYWNrLlxuMjAzMzpcdFx0XHQgKi9cbjIwMzQ6XHRcdFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4yMDM1Olx0XHRcdGlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpXG4yMDM2Olx0XHRcdFx0cmV0dXJuIDA7XG4yMDM3Olx0XHRcdGRvd25fcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4yMDM4Olx0XHR9XG4yMDM5Olx0XHR1cF9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbjIwNDA6XHRcdGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhID0gTlVMTDtcbjIwNDE6XHRcdGN0eC1cdTAwM2Vwb3MgPSBJTlRfTUFYO1xuMjA0MjpcdFx0cmV0dXJuIDA7XG4yMDQzOlx0fVxuMjA0NDpcdFxuMjA0NTpcdGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga2VybmZzX2Rpcl9mb3BzID0ge1xuMjA0NjpcdFx0LnJlYWRcdFx0PSBnZW5lcmljX3JlYWRfZGlyLFxuMjA0NzpcdFx0Lml0ZXJhdGVfc2hhcmVkXHQ9IGtlcm5mc19mb3BfcmVhZGRpcixcbjIwNDg6XHRcdC5yZWxlYXNlXHQ9IGtlcm5mc19kaXJfZm9wX3JlbGVhc2UsXG4yMDQ5Olx0XHQubGxzZWVrXHRcdD0gZ2VuZXJpY19maWxlX2xsc2VlayxcbjIwNTA6XHR9O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTUwOAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDE5MzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqUGF0Y2ggQW5hbHlzaXMgYW5kIE1lbW9yeSBTYWZldHkgRGVlcCBEaXZlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2ggZm9yIGBrZXJuZnNfZm9wX3JlYWRkaXJgLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCBpdCYjMzk7cyBkZXNpZ25lZCB0byBjb3JyZWN0IGhvdyBkaXJlY3RvcnkgaXRlcmF0aW9uIHJlc3VtZXMgYWZ0ZXIgYW4gZW50cnkgaXMgcmVtb3ZlZCBvciByZW5hbWVkLCB3aGljaCBpcyBhIGNvbW1vbiBzb3VyY2Ugb2Ygc3VidGxlIGJ1Z3MuIEkmIzM5O3ZlIGdvdCB0byBlbnN1cmUgdGhlIGZpeCBpcyBjb3JyZWN0LCBhbmQgYWJzb2x1dGVseSB3YXRlcnRpZ2h0IHJlZ2FyZGluZyBtZW1vcnkgc2FmZXR5LgoKVGhlIGNvcmUgb2YgdGhlIHBhdGNoIHJldm9sdmVzIGFyb3VuZCBpbXByb3ZpbmcgYGtlcm5mc19kaXJfcG9zYC4gUHJldmlvdXNseSwgcmVseWluZyBzb2xlbHkgb24gdGhlIGhhc2ggdG8gcmVzdW1lIGEgZGlyZWN0b3J5IGxpc3Rpbmcgd2FzIGZsYXdlZCwgYmVjYXVzZSBhIHJlbmFtZSBjb3VsZCBwcm9kdWNlIGEgY29sbGlzaW9uLiBJIGxpa2UgdGhhdCB0aGUgcGF0Y2ggbm93IHVzZXMgdGhlIGVudHJ5IG5hbWUgaW4gYWRkaXRpb24gdG8gdGhlIGhhc2guIElmIHRoZSBwb3NpdGlvbiBnaXZlbiBpcyBub3QgdmFsaWQsIHRoZSBjb2RlIHNlYXJjaGVzIHRoZSByYi10cmVlLiBTbWFydCBtb3ZlLgoKSSBzZWUgdGhhdCBhIGJ1ZmZlciwgYG5hbWVgLCBvZiBzaXplIGBQQVRIX01BWGAgaXMgYmVpbmcgYWxsb2NhdGVkIGFuZCBwb3B1bGF0ZWQgd2l0aCB0aGUgZW50cnkmIzM5O3MgbmFtZSB1c2luZyBgc3Ryc2NweWAuIERyb3BwaW5nIHRoZSByZWFkIGxvY2sgYmVmb3JlIHRoZSBgZGlyX2VtaXRgIGNhbGwgaXMgYW4gaW50ZXJlc3RpbmcgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBsZXR0aW5nIGBkaXJfZW1pdGAgZmFpbCBhbmQgcmV0dXJuIHdpdGhvdXQgaG9sZGluZyB0aGUgbG9jay4gQW5kIHRoZW4gdGhlIGxvY2sgaXMgcmUtYWNxdWlyZWQuCgpOb3csIG1lbW9yeSBzYWZldHkgbmVlZHMgYSBtZXRpY3Vsb3VzIHJldmlldy4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggYG5hbWVgLiBJdCBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AgYW5kIGlzICpjcml0aWNhbCogZm9yIHRoZSByZXN0IG9mIHRoZSBvcGVyYXRpb24uCgpGaXJzdCwgSSB0cmFjZSBpdHMgdXNhZ2UuIEl0IHNlZW1zIHRoYXQgYG5hbWVgIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQmIzM5O3MgYWxsb2NhdGVkLiBJZiB0aGUgaW5pdGlhbCBjYWxsIHRvIGBrZXJuZnNfZGlyX3Bvc2AgcmV0dXJucyBgTlVMTGAsIHRoZW4gYG5hbWVgIGlzIGZyZWVkIGFuZCBuZXZlciByZWFkLiBJZiBub3QsIGBzdHJzY3B5YCBpcyBjYWxsZWQsIGFuZCBgbmFtZWAgd2lsbCBiZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgYW55IHJlYWQuIFRoZSBjb2RlIHRoZW4gcGFzc2VzIGBuYW1lYCB0byB0aGUgYGRpcl9lbWl0YCBmdW5jdGlvbiwgd2hpY2ggaW4gdHVybiBjYWxscyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuIFRoaXMgY2FsbGJhY2ssIHN1Y2ggYXMgYGZpbGxkaXI2NGAsIGNvcGllcyB0aGUgY29udGVudHMgb2YgYG5hbWVgIHRvIHVzZXIgc3BhY2UsIGFuZCB0aGUgbGVuZ3RoIGlzIHBhc3NlZCB0byBtYWtlIHN1cmUgaXQgY29waWVzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KClRoZSBsb29wIHRoZW4gY29udGludWVzLCBjYWxsaW5nIGBrZXJuZnNfZGlyX25leHRfcG9zYC4gVGhpcyBjYWxscyBga2VybmZzX2Rpcl9wb3NgLCB3aGljaCBjYWxscyBgc3RyY21wYCBvbiBgbmFtZWAuIGBzdHJjbXBgIGNoZWNrcyB1bnRpbCB0aGUgbnVsbCB0ZXJtaW5hdG9yLCBzbyB0aGVyZSYjMzk7cyBubyB3YXkgdG8gcmVhZCB1bmluaXRpYWxpemVkIG1lbW9yeS4gSW4gdGhlIG5leHQgbG9vcCBpdGVyYXRpb24sIGBuYW1lYCBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXcgZW50cnkgbmFtZS4gYHN0cnNjcHlgIGhhbmRsZXMgYWxsIHRoZSBpbXBvcnRhbnQgcGFydHMgdG8gcHJldmVudCByZWFkaW5nIGJleW9uZCB0aGUgaW5pdGlhbGl6ZWQgcHJlZml4IG9mIGBuYW1lYC4KCkJ1dCwgd2hhdCBpZiBgZGlyX2VtaXRgIHJldHVybnMgYGZhbHNlYD8gVGhlIGZ1bmN0aW9uIGV4aXRzLCBhbmQgYG5hbWVgIGlzIGZyZWVkLiBBbmQgd2hhdCBpZiBgZG93bl9yZWFkYCB3YXNuJiMzOTt0IHVubG9ja2VkLCBhbmQgYGRpcl9lbWl0YCBmYWlsZWQ/IE5vdGhpbmcsIGJlY2F1c2UgdGhlIHJlYWQgbG9jayB3YXMgZHJvcHBlZCBiZWZvcmUgYGRpcl9lbWl0YCB3YXMgY2FsbGVkLCBhbmQgaXQgZG9lcyB0aGUgcmlnaHQgdGhpbmcuCgpBbmQgd2hhdCBpZiB0aGUgYHN0cnNjcHlgIGZhaWxzPyBUaGVyZSYjMzk7cyBhIGNoZWNrLCBhbmQgaWYgaXQgZmFpbHMsIHRoZW4gdGhlIGNvZGUgd2lsbCBleGl0LCBzbyB0aGVyZSBpcyBubyBwcm9ibGVtIGhlcmUuCgpPa2F5LCBsZXQmIzM5O3MgdGhpbmsgYWJvdXQgdGhlIGBmaWxlLSZndDtwcml2YXRlX2RhdGFgIGZpZWxkLiBJdCBsb29rcyBsaWtlIGl0IHNhdmVzIHRoZSBsYXN0IHBvc2l0aW9uIGFuZCBpbmNyZW1lbnRzIHRoZSByZWZjb3VudC4gSWYgdGhlIGBkaXJfZW1pdGAgY2FsbCBmYWlscywgdGhhdCYjMzk7cyBmaW5lOyB0aGUgcmVmY291bnQgb24gYHBvc2AgaXMgc3RpbGwgaW5jcmVtZW50ZWQuIElmIHRoZSBuZXh0IGByZWFkZGlyYCBpcyBjYWxsZWQsIHRoZSBzYXZlZCBwb3NpdGlvbiBpcyByZXRyaWV2ZWQgYW5kIHRoZSByZWZjb3VudCByZWxlYXNlZC4KClRoZXJlJiMzOTtzIG5vIHByb2JsZW0gaGVyZS4gQnV0IGFyZSB0aGVyZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIGx1cmtpbmcgZWxzZXdoZXJlPyBMZXQmIzM5O3MgY2hlY2s6CgpJIG5lZWQgdG8gbG9vayBjYXJlZnVsbHkgYXQgdGhlIGBib29sICpyZXN1bWVkYCB2YXJpYWJsZSB0aGF0IGlzIHBhc3NlZCBhcm91bmQuIEJhc2VkIG9uIG15IGFzc2Vzc21lbnQsIHRoZSBgcmVzdW1lZGAgdmFyaWFibGUgaXMgYWx3YXlzIGluaXRpYWxpemVkLgoKQW5kIGZpbmFsbHksIGBrZXJuZnNfcmN1X25hbWVgIGlzbiYjMzk7dCByZXR1cm5pbmcgdW5pbml0aWFsaXplZCBtZW1vcnksIHNpbmNlIGl0IGlzIHJlZmVyZW5jaW5nIGBrbi0mZ3Q7bmFtZWAuCgpJJiMzOTttIGNvbmZpZGVudC4gVGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuIEkmIzM5O20gZ29pbmcgdG8gc2V0IGBOZWVkc0tNU0FOPWZhbHNlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2VybmZzX3JjdV9uYW1lJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMva2VybmZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9rZXJuZnMvZGlyLmM9MzQ2PXN0YXRpYyBpbnQga2VybmZzX25hbWVfY29tcGFyZSh1bnNpZ25lZCBpbnQgaGFzaCwgY29uc3QgY2hhciAqbmFtZSxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMzU5LVx0XHRyZXR1cm4gMTtcbmZzL2tlcm5mcy9kaXIuYzozNjA6XHRyZXR1cm4gc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShrbikpO1xuZnMva2VybmZzL2Rpci5jLTM2MS19XG4tLVxuZnMva2VybmZzL2Rpci5jPTM2Mz1zdGF0aWMgaW50IGtlcm5mc19zZF9jb21wYXJlKGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqbGVmdCxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMzY1LXtcbmZzL2tlcm5mcy9kaXIuYzozNjY6XHRyZXR1cm4ga2VybmZzX25hbWVfY29tcGFyZShsZWZ0LVx1MDAzZWhhc2gsIGtlcm5mc19yY3VfbmFtZShsZWZ0KSwgbGVmdC1cdTAwM2VucywgcmlnaHQpO1xuZnMva2VybmZzL2Rpci5jLTM2Ny19XG4tLVxuZnMva2VybmZzL2Rpci5jPTgyMz1pbnQga2VybmZzX2FkZF9vbmUoc3RydWN0IGtlcm5mc19ub2RlICprbilcbi0tXG5mcy9rZXJuZnMvZGlyLmMtODM3LVx0XHQgaGFzX25zID8gXCYjMzQ7cmVxdWlyZWRcJiMzNDsgOiBcJiMzNDtpbnZhbGlkXCYjMzQ7LFxuZnMva2VybmZzL2Rpci5jOjgzODpcdFx0IGtlcm5mc19yY3VfbmFtZShwYXJlbnQpLCBrZXJuZnNfcmN1X25hbWUoa24pKSlcbmZzL2tlcm5mcy9kaXIuYy04MzktXHRcdGdvdG8gb3V0X3VubG9jaztcbi0tXG5mcy9rZXJuZnMvZGlyLmMtODQ3LVxuZnMva2VybmZzL2Rpci5jOjg0ODpcdGtuLVx1MDAzZWhhc2ggPSBrZXJuZnNfbmFtZV9oYXNoKGtlcm5mc19yY3VfbmFtZShrbiksIGtuLVx1MDAzZW5zKTtcbmZzL2tlcm5mcy9kaXIuYy04NDktXG4tLVxuZnMva2VybmZzL2Rpci5jPTg5Mj1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZmluZF9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtOTAzLVx0XHRXQVJOKDEsIEtFUk5fV0FSTklORyBcJiMzNDtrZXJuZnM6IG5zICVzIGluICYjMzk7JXMmIzM5OyBmb3IgJiMzOTslcyYjMzk7XFxuXCYjMzQ7LFxuZnMva2VybmZzL2Rpci5jOjkwNDpcdFx0ICAgICBoYXNfbnMgPyBcJiMzNDtyZXF1aXJlZFwmIzM0OyA6IFwmIzM0O2ludmFsaWRcJiMzNDssIGtlcm5mc19yY3VfbmFtZShwYXJlbnQpLCBuYW1lKTtcbmZzL2tlcm5mcy9kaXIuYy05MDUtXHRcdHJldHVybiBOVUxMO1xuLS1cbmZzL2tlcm5mcy9kaXIuYz0xMTc3PXN0YXRpYyBpbnQga2VybmZzX2RvcF9yZXZhbGlkYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMTIxNC1cdC8qIFRoZSBrZXJuZnMgbm9kZSBoYXMgYmVlbiByZW5hbWVkICovXG5mcy9rZXJuZnMvZGlyLmM6MTIxNTpcdGtuX25hbWUgPSBrZXJuZnNfcmN1X25hbWUoa24pO1xuZnMva2VybmZzL2Rpci5jLTEyMTYtXHRpZiAobmFtZS1cdTAwM2VsZW4gIT0gc3RybGVuKGtuX25hbWUpIHx8XG4tLVxuZnMva2VybmZzL2Rpci5jPTE1Mjk9c3RhdGljIHZvaWQgX19rZXJuZnNfcmVtb3ZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXG4tLVxuZnMva2VybmZzL2Rpci5jLTE1NDYtXG5mcy9rZXJuZnMvZGlyLmM6MTU0NzpcdHByX2RlYnVnKFwmIzM0O2tlcm5mcyAlczogcmVtb3ZpbmdcXG5cJiMzNDssIGtlcm5mc19yY3VfbmFtZShrbikpO1xuZnMva2VybmZzL2Rpci5jLTE1NDgtXG4tLVxuZnMva2VybmZzL2Rpci5jPTE4MTE9aW50IGtlcm5mc19yZW5hbWVfbnMoc3RydWN0IGtlcm5mc19ub2RlICprbiwgc3RydWN0IGtlcm5mc19ub2RlICpuZXdfcGFyZW50LFxuLS1cbmZzL2tlcm5mcy9kaXIuYy0xODM5LVx0ZXJyb3IgPSAwO1xuZnMva2VybmZzL2Rpci5jOjE4NDA6XHRvbGRfbmFtZSA9IGtlcm5mc19yY3VfbmFtZShrbik7XG5mcy9rZXJuZnMvZGlyLmMtMTg0MS1cdGlmICghbmV3X25hbWUpXG4tLVxuZnMva2VybmZzL2Rpci5jPTE5MTA9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXG4tLVxuZnMva2VybmZzL2Rpci5jLTE5MjQtXHRcdFx0aGFzaCA9PSBwb3MtXHUwMDNlaGFzaCBcdTAwMjZcdTAwMjZcbmZzL2tlcm5mcy9kaXIuYzoxOTI1Olx0XHRcdCghbmFtZSB8fCAhc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpKSk7XG5mcy9rZXJuZnMvZGlyLmMtMTkyNi1cdFx0a2VybmZzX3B1dChwb3MpO1xuLS1cbmZzL2tlcm5mcy9kaXIuYz0xOTg0PXN0YXRpYyBpbnQga2VybmZzX2ZvcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMjAyMS1cdFx0ICovXG5mcy9rZXJuZnMvZGlyLmM6MjAyMjpcdFx0bGVuID0gc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpO1xuZnMva2VybmZzL2Rpci5jLTIwMjMtXHRcdGlmIChXQVJOX09OX09OQ0UobGVuIFx1MDAzYyAwKSlcbi0tXG5mcy9rZXJuZnMvZmlsZS5jPTkwNT1zdGF0aWMgdm9pZCBrZXJuZnNfbm90aWZ5X3dvcmtmbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4tLVxuZnMva2VybmZzL2ZpbGUuYy05NDMtXG5mcy9rZXJuZnMvZmlsZS5jOjk0NDpcdFx0a25fbmFtZSA9IGtlcm5mc19yY3VfbmFtZShrbik7XG5mcy9rZXJuZnMvZmlsZS5jLTk0NS1cdFx0bmFtZSA9IFFTVFIoa25fbmFtZSk7XG4tLVxuZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oPTExMz1zdGF0aWMgaW5saW5lIGJvb2wga2VybmZzX3JlbmFtZV9pc19sb2NrZWQoY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICprbilcbi0tXG5mcy9rZXJuZnMva2VybmZzLWludGVybmFsLmgtMTE3LVxuZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oOjExODpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmtlcm5mc19yY3VfbmFtZShjb25zdCBzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKVxuZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oLTExOS17XG4tLVxuZnMva2VybmZzL21vdW50LmM9MjMyPXN0cnVjdCBkZW50cnkgKmtlcm5mc19ub2RlX2RlbnRyeShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLFxuLS1cbmZzL2tlcm5mcy9tb3VudC5jLTI3Ni1cdFx0XHR9XG5mcy9rZXJuZnMvbW91bnQuYzoyNzc6XHRcdFx0bmFtZSA9IGtzdHJkdXAoa2VybmZzX3JjdV9uYW1lKGtudG1wKSwgR0ZQX0tFUk5FTCk7XG5mcy9rZXJuZnMvbW91bnQuYy0yNzgtXHRcdH1cbi0tXG5mcy9rZXJuZnMvc3ltbGluay5jPTY3PXN0YXRpYyBpbnQga2VybmZzX2dldF90YXJnZXRfcGF0aChzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCxcbi0tXG5mcy9rZXJuZnMvc3ltbGluay5jLTk0LVx0d2hpbGUgKGtlcm5mc19wYXJlbnQoa24pIFx1MDAyNlx1MDAyNiBrbiAhPSBiYXNlKSB7XG5mcy9rZXJuZnMvc3ltbGluay5jOjk1Olx0XHRsZW4gJiM0Mzs9IHN0cmxlbihrZXJuZnNfcmN1X25hbWUoa24pKSAmIzQzOyAxO1xuZnMva2VybmZzL3N5bWxpbmsuYy05Ni1cdFx0a24gPSBrZXJuZnNfcGFyZW50KGtuKTtcbi0tXG5mcy9rZXJuZnMvc3ltbGluay5jLTEwOC1cdHdoaWxlIChrZXJuZnNfcGFyZW50KGtuKSBcdTAwMjZcdTAwMjYga24gIT0gYmFzZSkge1xuZnMva2VybmZzL3N5bWxpbmsuYzoxMDk6XHRcdGNvbnN0IGNoYXIgKm5hbWUgPSBrZXJuZnNfcmN1X25hbWUoa24pO1xuZnMva2VybmZzL3N5bWxpbmsuYy0xMTAtXHRcdGludCBzbGVuID0gc3RybGVuKG5hbWUpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTk1NgoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBLZXJuZnMgSW50ZXJuYWxzKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYGtlcm5mc2AgYmVoYXZpb3IgYSBiaXQgYmV0dGVyLiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bSBnb2luZyB0byBzdGFydCB3aXRoIHRoZSBpbnRlcm5hbCBoZWFkZXIgZmlsZXMsIHNwZWNpZmljYWxseSBgZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oYC4gTGV0JiMzOTtzIG5hdmlnYXRlIHRvIGFyb3VuZCBsaW5lIDExOCDigJMgdGhhdCYjMzk7cyBvZnRlbiBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgY29yZSBkYXRhIHN0cnVjdHVyZXMgb3IgaW5pdGlhbGl6YXRpb24gcm91dGluZXMsIGRlcGVuZGluZyBvbiBob3cgdGhpcyBwYXJ0aWN1bGFyIGNvZGViYXNlIGlzIHN0cnVjdHVyZWQuIEkmIzM5O20gaG9waW5nIHRvIGZpbmQgc29tZXRoaW5nIHJlbGV2YW50IHRoZXJlIHRoYXQmIzM5O2xsIHNoZWQgc29tZSBsaWdodCBvbiB0aGUgaXNzdWUgSSYjMzk7bSB3b3JraW5nIG9uLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuIEkgc3VzcGVjdCB0aGlzIHdpbGwgYmUgdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDE1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMTU6XHRcdHJldHVybiBsb2NrZGVwX2lzX2hlbGQoXHUwMDI2a2VybmZzX3Jvb3Qoa24pLVx1MDAzZWtlcm5mc19yZW5hbWVfbG9jayk7XG4gMTE2Olx0fVxuIDExNzpcdFxuIDExODpcdHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqa2VybmZzX3JjdV9uYW1lKGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXG4gMTE5Olx0e1xuIDEyMDpcdFx0LypcbiAxMjE6XHRcdCAqIExpa2Uga2VybmZzX25vZGU6Ol9fcGFyZW50IGJlbG93LCB0aGUgbmFtZSBpcyBvbmx5IHJlcGxhY2VkIHVuZGVyXG4gMTIyOlx0XHQgKiBib3RoIGtlcm5mc19yb290OjprZXJuZnNfcndzZW0gYW5kIGtlcm5mc19yb290OjprZXJuZnNfcmVuYW1lX2xvY2ssXG4gMTIzOlx0XHQgKiBzbyBlaXRoZXIgb25lIGtlZXBzIGl0LCBhbmQgdGhlIHN0cmluZyBpdCBwb2ludHMgYXQsIHN0YWJsZS5cbiAxMjQ6XHRcdCAqL1xuIDEyNTpcdFx0cmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9jaGVjayhrbi1cdTAwM2VuYW1lLFxuIDEyNjpcdFx0XHRcdFx0ICAgICBrZXJuZnNfcm9vdF9pc19sb2NrZWQoa24pIHx8XG4gMTI3Olx0XHRcdFx0XHQgICAgIGtlcm5mc19yZW5hbWVfaXNfbG9ja2VkKGtuKSk7XG4gMTI4Olx0fVxuIDEyOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjQzOAoJCQkJCQkJb3V0cHV0OiAzMzMKCQkJCQkJCXRob3VnaHRzOiA4NTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIEtlcm5mcyBEaXJlY3RvcnkgUmVzdW1wdGlvbiBQYXRjaCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGcm9tIHdoYXQgSSBzZWUsIHRoaXMgcGF0Y2ggaXMgYWRkcmVzc2luZyBhIHRyaWNreSBwcm9ibGVtIGluIGtlcm5mcyYjMzk7IGByZWFkZGlyYCBhbmQgYGdldGRlbnRzYCBpbXBsZW1lbnRhdGlvbiwgc3BlY2lmaWNhbGx5IHdoZW4gZW50cmllcyBhcmUgcmVtb3ZlZCBvciByZW5hbWVkIHdoaWxlIGRpcmVjdG9yeSBpdGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIFRoZSBjb3JlIG9mIHRoZSBmaXggcmV2b2x2ZXMgYXJvdW5kIGhvdyB0aGUgY29kZSBoYW5kbGVzIHRoZSBkaXJlY3RvcnkgZW50cnkgbmFtZSwgaGFzaCwgYW5kIHRoZSBhc3NvY2lhdGVkIGxvY2tpbmcgbWVjaGFuaXNtcy4KClRoZSB0ZXN0IGNvbW1lbnRzIGFyZSBrZXkgaGVyZS4gVGhleSBleHBsaWNpdGx5IGNhbGwgb3V0IExPQ0tERVAgYW5kIEtBU0FOLiBNeSBleHBlcnQgaW50dWl0aW9uIGltbWVkaWF0ZWx5IGZsYWdzIHRoaXMgYXMgYSBzaWduIHRoYXQgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBhIGNoYW5nZSB0aGF0IGltcGFjdHMgbG9ja2luZyBhbmQgY29uY3VycmVuY3kuIFRoZSBwYXRjaCAqY2hhbmdlcyogbG9ja2luZy4gV2UmIzM5O3JlIGRyb3BwaW5nIGByb290LSZndDtrZXJuZnNfcndzZW1gIGJlZm9yZSBgZGlyX2VtaXQoKWAgYW5kIHRoZW4gcmVhY3F1aXJpbmcgaXQuIFBsdXMsIHdlJiMzOTtyZSBwaW5uaW5nIHRoZSBgcG9zYCB3aXRoIGBrZXJuZnNfZ2V0KHBvcylgIGFuZCByZS12ZXJpZnlpbmcgaXQgb24gcmVzdW1lLiBUaGUgY29tbWVudHMgY29uZmlybSBteSBzdXNwaWNpb246IGl0JiMzOTtzIGFsbCBhYm91dCBlbnN1cmluZyB0aGUgaXRlcmF0b3ImIzM5O3MgdmFsaWRpdHkgYW5kIGF2b2lkaW5nIHJhY2VzIG9yIGNvbmN1cnJlbmN5IGlzc3VlcyBkdXJpbmcgZGlyZWN0b3J5IHRyYXZlcnNhbCwgZXNwZWNpYWxseSB3aGVuIGVudHJpZXMgYXJlIGJlaW5nIG1vZGlmaWVkIGNvbmN1cnJlbnRseS4gVGhlIGdvYWwgaXMgdG8gbWFrZSBzdXJlIHdlIGRvbiYjMzk7dCBlbmQgdXAgcmUtdmlzaXRpbmcgb3Igc2tpcHBpbmcgZGlyZWN0b3J5IGVudHJpZXMuCgpOb3csIGxldCYjMzk7cyBnZXQgaW50byB0aGUgS01TQU4gcXVlc3Rpb24uCgpGaXJzdGx5LCBJIGNoZWNrZWQgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBJcyB0aGlzIHBhdGNoIHBhc3NpbmcgdW5pbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcyB0byB1c2VyIHNwYWNlPyBOby4gVGhlIGNvZGUmIzM5O3MgdXNpbmcgYHN0cnNjcHlgLCBzbyB0aGUgYG5hbWVgIGJ1ZmZlciBpcyBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgYmVpbmcgY29waWVkLiBJcyB0aGVyZSBicmFuY2hpbmcgYmFzZWQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vcGUsIHRoZSBgcmVzdW1lZGAgYm9vbGVhbiBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4gSXMgdGhlcmUgY29tcGxleCBkYXRhIHN0cnVjdHVyZSBhbGxvY2F0aW9uIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQ/IE5vLiBUaGUgb25seSBhbGxvY2F0aW9uIGlzIGEgc2ltcGxlIGBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKWAgZm9yIGBuYW1lYC4gRG9lcyBpdCBhbHRlciBib3VuZHMgY2hlY2tzIG9yIGxlbmd0aHMgaW4gYSB3YXkgdGhhdCBjb3VsZCBsZWFkIHRvIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgYmVpbmcgYWNjZXNzZWQ/IE5vLiBUaGUgbGVuZ3RoIGBsZW5gIGlzIGRlcml2ZWQgZnJvbSBgc3Ryc2NweWAsIGVuc3VyaW5nIHNhZmUgYm91bmRzLgoKTXkgc2Vjb25kIGxpbmUgb2YgdGhpbmtpbmcgZm9jdXNlZCBvbiBwb3RlbnRpYWwgYnVncyBpdCBjb3VsZCBpbnRyb2R1Y2UuIEkmIzM5O20gZm9jdXNpbmcgb24gcmFjZSBjb25kaXRpb25zLCB1c2UtYWZ0ZXItZnJlZSwgYW5kIGxvY2tkZXAgcHJvYmxlbXMgYXJvdW5kIGRyb3BwaW5nIGFuZCByZWFjcXVpcmluZyBgcm9vdC0mZ3Q7a2VybmZzX3J3c2VtYC4gSSYjMzk7bSBhbHNvIHRoaW5raW5nIGFib3V0IGl0ZXJhdG9yIGNvcnJlY3RuZXNzIOKAkyBtYWtpbmcgc3VyZSB3ZSBkb24mIzM5O3Qgc2VlIGR1cGxpY2F0ZSBlbnRyaWVzIG9yIG1pc3MgZW50cmllcyDigJMgYW5kIGxpZmV0aW1lIGlzc3VlcyByZWxhdGVkIHRvIGBwb3NgLgoKVGhlIGdvb2QgbmV3cyBpcyB0aGF0IHRoZXNlIGtpbmRzIG9mIGNvbmN1cnJlbmN5LCBsaWZldGltZSwgbG9ja2luZywgYW5kIG91dC1vZi1ib3VuZHMgcHJvYmxlbXMgYXJlIGV4YWN0bHkgd2hhdCBLQVNBTiBhbmQgTE9DS0RFUCBhcmUgZGVzaWduZWQgdG8gY2F0Y2gsIGFsb25nIHdpdGggc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlIHBhdGNoICppcyogcGxheWluZyB3aXRoIGxvY2tzIGFuZCBkaXJlY3RvcnkgZW50cmllcywgYnV0IGl0IGlzbiYjMzk7dCBwbGF5aW5nIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuCgpTbywgYWZ0ZXIgYSB0aG9yb3VnaCByZXZpZXcsIGl04oCZcyBjbGVhciB0byBtZTogdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXJzcGFjZSB0aGF0IHdvdWxkIG5lY2Vzc2l0YXRlIEtNU0FOIGZ1enppbmcuIFRoZXJlZm9yZSwgdGhlIGBOZWVkc0tNU0FOYCB0YWcgc2hvdWxkIGJlIGBmYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMga2VybmZzIGRpcmVjdG9yeSBpdGVyYXRpb24gKGBrZXJuZnNfZm9wX3JlYWRkaXJgKSB0byBwcm9wZXJseSBoYW5kbGUgcmVhZGRpciByZXN1bXB0aW9uIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBvciByZW5hbWVkIGNvbmN1cnJlbnRseSwgYnkga2V5aW5nIHBvc2l0aW9uIG9uIHRoZSBub2RlIG5hbWUgaW4gYWRkaXRpb24gdG8gaXRzIGhhc2ggYW5kIGRyb3BwaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXQoKWAuXG5cbi0gTWVtb3J5IGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uOiBBIHRlbXBvcmFyeSBidWZmZXIgYG5hbWVgIGlzIGFsbG9jYXRlZCB2aWEgYGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpYC4gQmVmb3JlIGFueSByZWFkLCBpdCBpcyBwb3B1bGF0ZWQgdXNpbmcgYHN0cnNjcHkobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcyksIFBBVEhfTUFYKWAuIFRoZSBzdHJpbmcgY29tcGFyaXNvbiBmdW5jdGlvbnMgKGBzdHJjbXBgKSBhbmQgYGRpcl9lbWl0KClgIG9ubHkgYWNjZXNzIHRoZSBwb3B1bGF0ZWQsIE5VTC10ZXJtaW5hdGVkIHByZWZpeCBvZiBsZW5ndGggYGxlbmAuIE5vIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBidWZmZXIgYXJlIHJlYWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS5cbi0gTG9jYWwgdmFyaWFibGVzOiBUaGUgc3RhY2sgdmFyaWFibGUgYGJvb2wgcmVzdW1lZGAgcGFzc2VkIHRvIGBrZXJuZnNfZGlyX3BvcygpYCBpcyB1bmNvbmRpdGlvbmFsbHkgaW5pdGlhbGl6ZWQgdG8gYGZhbHNlYCB1cG9uIGVudHJ5IHRvIGBrZXJuZnNfZGlyX3BvcygpYC5cbi0gUHJpbWFyeSByaXNrczogVGhlIHBhdGNoIG1vZGlmaWVzIGxvY2tpbmcgYmVoYXZpb3IgKGRyb3BwaW5nIGFuZCByZS1hY3F1aXJpbmcgYGtlcm5mc19yd3NlbWAgYXJvdW5kIGBkaXJfZW1pdGApIGFuZCBub2RlIHJlZmNvdW50aW5nL3ZhbGlkYXRpb24uIFRoZXNlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG90ZW50aWFsIGNvbmN1cnJlbmN5IHJhY2VzLCBsb2NrIGludmVyc2lvbiwgYW5kIGxpZmV0aW1lL3VzZS1hZnRlci1mcmVlIGJ1Z3MsIHdoaWNoIGFyZSBmdWxseSBjb3ZlcmVkIGJ5IExPQ0tERVAgYW5kIEtBU0FOLlxuXG5CZWNhdXNlIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrIHJpc2tzIHRoYXQgd291bGQgYmUgdW5pcXVlbHkgZGV0ZWN0ZWQgYnkgS01TQU4sIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIGtlcm5mcyBkaXJlY3RvcnkgaXRlcmF0aW9uIChga2VybmZzX2ZvcF9yZWFkZGlyYCkgdG8gcHJvcGVybHkgaGFuZGxlIHJlYWRkaXIgcmVzdW1wdGlvbiB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgb3IgcmVuYW1lZCBjb25jdXJyZW50bHksIGJ5IGtleWluZyBwb3NpdGlvbiBvbiB0aGUgbm9kZSBuYW1lIGluIGFkZGl0aW9uIHRvIGl0cyBoYXNoIGFuZCBkcm9wcGluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0KClgLlxuXG4tIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbjogQSB0ZW1wb3JhcnkgYnVmZmVyIGBuYW1lYCBpcyBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKWAuIEJlZm9yZSBhbnkgcmVhZCwgaXQgaXMgcG9wdWxhdGVkIHVzaW5nIGBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWClgLiBUaGUgc3RyaW5nIGNvbXBhcmlzb24gZnVuY3Rpb25zIChgc3RyY21wYCkgYW5kIGBkaXJfZW1pdCgpYCBvbmx5IGFjY2VzcyB0aGUgcG9wdWxhdGVkLCBOVUwtdGVybWluYXRlZCBwcmVmaXggb2YgbGVuZ3RoIGBsZW5gLiBObyB1bmluaXRpYWxpemVkIGJ5dGVzIGZyb20gdGhlIHJlbWFpbmRlciBvZiB0aGUgYnVmZmVyIGFyZSByZWFkIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UuXG4tIExvY2FsIHZhcmlhYmxlczogVGhlIHN0YWNrIHZhcmlhYmxlIGBib29sIHJlc3VtZWRgIHBhc3NlZCB0byBga2VybmZzX2Rpcl9wb3MoKWAgaXMgdW5jb25kaXRpb25hbGx5IGluaXRpYWxpemVkIHRvIGBmYWxzZWAgdXBvbiBlbnRyeSB0byBga2VybmZzX2Rpcl9wb3MoKWAuXG4tIFByaW1hcnkgcmlza3M6IFRoZSBwYXRjaCBtb2RpZmllcyBsb2NraW5nIGJlaGF2aW9yIChkcm9wcGluZyBhbmQgcmUtYWNxdWlyaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXRgKSBhbmQgbm9kZSByZWZjb3VudGluZy92YWxpZGF0aW9uLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIHBvdGVudGlhbCBjb25jdXJyZW5jeSByYWNlcywgbG9jayBpbnZlcnNpb24sIGFuZCBsaWZldGltZS91c2UtYWZ0ZXItZnJlZSBidWdzLCB3aGljaCBhcmUgZnVsbHkgY292ZXJlZCBieSBMT0NLREVQIGFuZCBLQVNBTi5cblxuQmVjYXVzZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIGJlIHVuaXF1ZWx5IGRldGVjdGVkIGJ5IEtNU0FOLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMTo0Mi43Njg3NzE4NTNaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTk4MDUzNTMzNTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiS0VSTkZTXCIsXG4gICAgXCJTWVNGU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImtlcm5mc19mb3BfcmVhZGRpclwiLFxuICAgIFwia2VybmZzX2Rpcl9wb3NcIixcbiAgICBcImtlcm5mc19kaXJfbmV4dF9wb3NcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMga2VybmZzIGRpcmVjdG9yeSBpdGVyYXRpb24gKGBrZXJuZnNfZm9wX3JlYWRkaXJgKSB0byBwcm9wZXJseSBoYW5kbGUgcmVhZGRpciByZXN1bXB0aW9uIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBvciByZW5hbWVkIGNvbmN1cnJlbnRseSwgYnkga2V5aW5nIHBvc2l0aW9uIG9uIHRoZSBub2RlIG5hbWUgaW4gYWRkaXRpb24gdG8gaXRzIGhhc2ggYW5kIGRyb3BwaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXQoKWAuXFxuXFxuLSBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb246IEEgdGVtcG9yYXJ5IGJ1ZmZlciBgbmFtZWAgaXMgYWxsb2NhdGVkIHZpYSBga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTClgLiBCZWZvcmUgYW55IHJlYWQsIGl0IGlzIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpYC4gVGhlIHN0cmluZyBjb21wYXJpc29uIGZ1bmN0aW9ucyAoYHN0cmNtcGApIGFuZCBgZGlyX2VtaXQoKWAgb25seSBhY2Nlc3MgdGhlIHBvcHVsYXRlZCwgTlVMLXRlcm1pbmF0ZWQgcHJlZml4IG9mIGxlbmd0aCBgbGVuYC4gTm8gdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZmZlciBhcmUgcmVhZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLlxcbi0gTG9jYWwgdmFyaWFibGVzOiBUaGUgc3RhY2sgdmFyaWFibGUgYGJvb2wgcmVzdW1lZGAgcGFzc2VkIHRvIGBrZXJuZnNfZGlyX3BvcygpYCBpcyB1bmNvbmRpdGlvbmFsbHkgaW5pdGlhbGl6ZWQgdG8gYGZhbHNlYCB1cG9uIGVudHJ5IHRvIGBrZXJuZnNfZGlyX3BvcygpYC5cXG4tIFByaW1hcnkgcmlza3M6IFRoZSBwYXRjaCBtb2RpZmllcyBsb2NraW5nIGJlaGF2aW9yIChkcm9wcGluZyBhbmQgcmUtYWNxdWlyaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXRgKSBhbmQgbm9kZSByZWZjb3VudGluZy92YWxpZGF0aW9uLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIHBvdGVudGlhbCBjb25jdXJyZW5jeSByYWNlcywgbG9jayBpbnZlcnNpb24sIGFuZCBsaWZldGltZS91c2UtYWZ0ZXItZnJlZSBidWdzLCB3aGljaCBhcmUgZnVsbHkgY292ZXJlZCBieSBMT0NLREVQIGFuZCBLQVNBTi5cXG5cXG5CZWNhdXNlIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrIHJpc2tzIHRoYXQgd291bGQgYmUgdW5pcXVlbHkgZGV0ZWN0ZWQgYnkgS01TQU4sIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMga2VybmZzIGRpcmVjdG9yeSBsaXN0aW5nIChyZWFkZGlyIC8gZ2V0ZGVudHMpIGFuZCByZXN1bWUgdHJhdmVyc2FsIGxvZ2ljIGluIGZzL2tlcm5mcy9kaXIuYy4gU3BlY2lmaWNhbGx5LCBpdCB1cGRhdGVzIGtlcm5mc19kaXJfcG9zIGFuZCBrZXJuZnNfZGlyX25leHRfcG9zIHRvIHJlc3VtZSByZWFkZGlyIGJhc2VkIG9uIGVudHJ5IG5hbWUgY29tcGFyaXNvbiB3aXRoaW4gdGhlIHJiLXRyZWUsIGFkZHMgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIHJlc3VtZSBrZXkgbmFtZSwgaW50cm9kdWNlcyBhIFdBUk5fT05fT05DRSBjaGVjayBvbiBuYW1lIHRydW5jYXRpb24sIGFuZCByZWxlYXNlcy9yZWFjcXVpcmVzIHJvb3QtXFx1MDAzZWtlcm5mc19yd3NlbSBhcm91bmQgZGlyX2VtaXQoKS4gVGhlc2UgY2hhbmdlcyB0b3VjaCByZWFjaGFibGUgY29yZSB2aXJ0dWFsIGZpbGVzeXN0ZW0gY29kZSBleGVyY2lzZWQgYnkgdXNlciBzcGFjZSB2aWEgZ2V0ZGVudHMvZ2V0ZGVudHM2NCBvbiBzeXNmcyBhbmQgY2dyb3VwcywgaW50cm9kdWNpbmcgY29uY3VycmVuY3kgd2luZG93cyBhbmQgbW9kaWZpZWQgbG9ja2luZyBzZW1hbnRpY3MuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMxOjQyLjc2ODc3NzM5M1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDkwOTE1OTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZTU1ODAyMGVhYmE2MDVmNjA4MTdkNTRkNDk3MWVjZGYxY2I0NTFmMFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIFNlcCAxMSAxODozMTo0MSAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZGlyLmMgYi9mcy9rZXJuZnMvZGlyLmNcXG5pbmRleCAwN2FiZjU5ZjAyNjRhLi5jYzYyODhkNWI0Y2M0IDEwMDY0NFxcbi0tLSBhL2ZzL2tlcm5mcy9kaXIuY1xcbisrKyBiL2ZzL2tlcm5mcy9kaXIuY1xcbkBAIC0xOTAzLDMzICsxOTAzLDQ5IEBAIHN0YXRpYyBpbnQga2VybmZzX2Rpcl9mb3BfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIEZpbmQgd2hlcmUgYSBsaXN0aW5nIGxlZnQgb2ZmLiAgQHJlc3VtZWQgc2F5cyB3aGV0aGVyIEBwb3MgaXMgc3RpbGwgdGhhdFxcbisgKiBlbnRyeTsgaWYgbm90LCB0aGUgc2VhcmNoIGZhbGxzIGJhY2sgdG8gQGhhc2gsIGtleWVkIGJ5IEBuYW1lIGlmIGdpdmVuLlxcbisgKi9cXG4gc3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuLVxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpXFxuK1xcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXFxuK1xcdGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgKnJlc3VtZWQpXFxuIHtcXG4rXFx0aWYgKHJlc3VtZWQpXFxuK1xcdFxcdCpyZXN1bWVkID0gZmFsc2U7XFxuIFxcdGlmIChwb3MpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogQSByZW5hbWUga2VlcHMgdGhlIGhhc2ggaWYgdGhlIG5ldyBuYW1lIGhhc2hlcyB0aGUgc2FtZSwgc29cXG4rXFx0XFx0ICogY2hlY2sgQG5hbWUgdG9vLiAgT3RoZXJ3aXNlIHRoZSBjYWxsZXIgd291bGQgc3RlcCBvdmVyIHRoZVxcbitcXHRcXHQgKiBlbnRyeSBub3cgc2l0dGluZyB3aGVyZSBAcG9zIHVzZWQgdG8gYmUuXFxuK1xcdFxcdCAqL1xcbiBcXHRcXHRpbnQgdmFsaWQgPSBrZXJuZnNfYWN0aXZlKHBvcykgXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0XFx0cmN1X2FjY2Vzc19wb2ludGVyKHBvcy1cXHUwMDNlX19wYXJlbnQpID09IHBhcmVudCBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHRoYXNoID09IHBvcy1cXHUwMDNlaGFzaDtcXG4rXFx0XFx0XFx0aGFzaCA9PSBwb3MtXFx1MDAzZWhhc2ggXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0KCFuYW1lIHx8ICFzdHJjbXAobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcykpKTtcXG4gXFx0XFx0a2VybmZzX3B1dChwb3MpO1xcbiBcXHRcXHRpZiAoIXZhbGlkKVxcbiBcXHRcXHRcXHRwb3MgPSBOVUxMO1xcbitcXHRcXHRlbHNlIGlmIChyZXN1bWVkKVxcbitcXHRcXHRcXHQqcmVzdW1lZCA9IHRydWU7XFxuIFxcdH1cXG4gXFx0aWYgKCFwb3MgXFx1MDAyNlxcdTAwMjYgKGhhc2ggXFx1MDAzZSAxKSBcXHUwMDI2XFx1MDAyNiAoaGFzaCBcXHUwMDNjIElOVF9NQVgpKSB7XFxuIFxcdFxcdHN0cnVjdCByYl9ub2RlICpub2RlID0gcGFyZW50LVxcdTAwM2VkaXIuY2hpbGRyZW4ucmJfbm9kZTtcXG4tXFx0XFx0dTY0IG5zX2lkID0ga2VybmZzX25zX2lkKG5zKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIEtlZXAgYSBub2RlIG9ubHkgb24gdGhlIHdheSBsZWZ0LCBzbyB0aGUgc2VhcmNoIGVuZHMgb24gdGhlXFxuK1xcdFxcdCAqIGZpcnN0IGVudHJ5IGFmdGVyIHRoZSBrZXkuICBBbiBlbXB0eSBAbmFtZSBzb3J0cyBiZWZvcmUgYWxsXFxuK1xcdFxcdCAqIGVudHJpZXMgc2hhcmluZyB0aGUgaGFzaCwgc28gaXQgbGFuZHMgb24gdGhlIGZpcnN0IG9mIHRoZW0uXFxuK1xcdFxcdCAqL1xcbiBcXHRcXHR3aGlsZSAobm9kZSkge1xcbi1cXHRcXHRcXHRwb3MgPSByYl90b19rbihub2RlKTtcXG4rXFx0XFx0XFx0c3RydWN0IGtlcm5mc19ub2RlICprbiA9IHJiX3RvX2tuKG5vZGUpO1xcbiBcXG4tXFx0XFx0XFx0aWYgKGhhc2ggXFx1MDAzYyBwb3MtXFx1MDAzZWhhc2gpXFxuLVxcdFxcdFxcdFxcdG5vZGUgPSBub2RlLVxcdTAwM2VyYl9sZWZ0O1xcbi1cXHRcXHRcXHRlbHNlIGlmIChoYXNoIFxcdTAwM2UgcG9zLVxcdTAwM2VoYXNoKVxcbi1cXHRcXHRcXHRcXHRub2RlID0gbm9kZS1cXHUwMDNlcmJfcmlnaHQ7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKG5zX2lkIFxcdTAwM2Mga2VybmZzX25zX2lkKHBvcy1cXHUwMDNlbnMpKVxcbitcXHRcXHRcXHRpZiAoa2VybmZzX25hbWVfY29tcGFyZShoYXNoLCBuYW1lID86IFxcXCJcXFwiLCBucywga24pIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRcXHRwb3MgPSBrbjtcXG4gXFx0XFx0XFx0XFx0bm9kZSA9IG5vZGUtXFx1MDAzZXJiX2xlZnQ7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKG5zX2lkIFxcdTAwM2Uga2VybmZzX25zX2lkKHBvcy1cXHUwMDNlbnMpKVxcbitcXHRcXHRcXHR9IGVsc2Uge1xcbiBcXHRcXHRcXHRcXHRub2RlID0gbm9kZS1cXHUwMDNlcmJfcmlnaHQ7XFxuLVxcdFxcdFxcdGVsc2VcXG4tXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcdC8qIFNraXAgb3ZlciBlbnRyaWVzIHdoaWNoIGFyZSBkeWluZy9kZWFkIG9yIGluIHRoZSB3cm9uZyBuYW1lc3BhY2UgKi9cXG5AQCAtMTk0NSwxMCArMTk2MSwxNCBAQCBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9uZXh0X3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4tXFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGlub190IGlubywgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpXFxuK1xcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXFxuK1xcdGNvbnN0IGNoYXIgKm5hbWUpXFxuIHtcXG4tXFx0cG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgaW5vLCBwb3MpO1xcbi1cXHRpZiAocG9zKSB7XFxuK1xcdGJvb2wgcmVzdW1lZDtcXG4rXFxuK1xcdHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGhhc2gsIHBvcywgbmFtZSwgXFx1MDAyNnJlc3VtZWQpO1xcbitcXHQvKiBTdGVwIG92ZXIgQHBvcyBvbmx5IGlmIGl0IHN1cnZpdmVkOyBAbmFtZSBmaW5kcyB0aGUgc3BvdCBpZiBub3QuICovXFxuK1xcdGlmIChwb3MgXFx1MDAyNlxcdTAwMjYgcmVzdW1lZCkge1xcbiBcXHRcXHRkbyB7XFxuIFxcdFxcdFxcdHN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dChcXHUwMDI2cG9zLVxcdTAwM2VyYik7XFxuIFxcdFxcdFxcdGlmICghbm9kZSlcXG5AQCAtMTk2NiwzNCArMTk4Niw1NSBAQCBzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuIFxcdHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtXFx1MDAzZWZfcGF0aC5kZW50cnk7XFxuIFxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50ID0ga2VybmZzX2RlbnRyeV9ub2RlKGRlbnRyeSk7XFxuIFxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbitcXHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xcbiBcXHRzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3Q7XFxuIFxcdGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zID0gTlVMTDtcXG4gXFxuIFxcdGlmICghZGlyX2VtaXRfZG90cyhmaWxlLCBjdHgpKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIE9uZSBidWZmZXIgZm9yIHRoZSBjYWxsLCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGUgbGlzdGluZ1xcbitcXHQgKiBpcyBvbi4gIFBBVEhfTUFYOiBrZXJuZnMgYm91bmRzIG5vIHNpbmdsZSBuYW1lLlxcbitcXHQgKi9cXG4rXFx0bmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpO1xcbitcXHRpZiAoIW5hbWUpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4gXFx0cm9vdCA9IGtlcm5mc19yb290KHBhcmVudCk7XFxuIFxcdGRvd25fcmVhZChcXHUwMDI2cm9vdC1cXHUwMDNla2VybmZzX3J3c2VtKTtcXG4gXFxuIFxcdGlmIChrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpKVxcbiBcXHRcXHRucyA9IGtlcm5mc19pbmZvKGRlbnRyeS1cXHUwMDNlZF9zYiktXFx1MDAzZW5zO1xcbiBcXG4tXFx0Zm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtXFx1MDAzZXBvcywgcG9zKTtcXG4rXFx0Zm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtXFx1MDAzZXBvcywgcG9zLCBOVUxMLCBOVUxMKTtcXG4gXFx0ICAgICBwb3M7XFxuLVxcdCAgICAgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtXFx1MDAzZXBvcywgcG9zKSkge1xcbi1cXHRcXHRjb25zdCBjaGFyICpuYW1lID0ga2VybmZzX3JjdV9uYW1lKHBvcyk7XFxuK1xcdCAgICAgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtXFx1MDAzZXBvcywgcG9zLCBuYW1lKSkge1xcbiBcXHRcXHR1bnNpZ25lZCBpbnQgdHlwZSA9IGZzX3Vtb2RlX3RvX2R0eXBlKHBvcy1cXHUwMDNlbW9kZSk7XFxuLVxcdFxcdGludCBsZW4gPSBzdHJsZW4obmFtZSk7XFxuIFxcdFxcdGlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTtcXG4rXFx0XFx0aW50IGxlbjtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSBjb3B5IGlzIGFsc28gdGhlIHJlc3VtZSBrZXksIHNvIGEgdHJ1bmNhdGVkIG5hbWUgd291bGRcXG4rXFx0XFx0ICogcmVzdW1lIGhlcmUgYWdhaW4uICBnZXRuYW1lKCkgY2FwcyBhIHBhdGgsIHNvIG9ubHkgYW5cXG4rXFx0XFx0ICogaW4ta2VybmVsIGNhbGxlciBjYW4gZ2V0IGhlcmU7IGVuZCB0aGUgbGlzdGluZyBpbnN0ZWFkLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0bGVuID0gc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpO1xcbitcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGxlbiBcXHUwMDNjIDApKVxcbitcXHRcXHRcXHRicmVhaztcXG4gXFxuIFxcdFxcdGN0eC1cXHUwMDNlcG9zID0gcG9zLVxcdTAwM2VoYXNoO1xcbiBcXHRcXHRmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBwb3M7XFxuIFxcdFxcdGtlcm5mc19nZXQocG9zKTtcXG4gXFxuLVxcdFxcdGlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpIHtcXG4tXFx0XFx0XFx0dXBfcmVhZChcXHUwMDI2cm9vdC1cXHUwMDNla2VybmZzX3J3c2VtKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogZGlyX2VtaXQoKSBjYW4gZmF1bHQsIHNvIHJ1biBpdCB1bmxvY2tlZC4gIEBwb3MgaXMgcGlubmVkXFxuK1xcdFxcdCAqIGFib3ZlIGFuZCBrZXJuZnNfZGlyX3BvcygpIHJlY2hlY2tzIGl0IG9uIHRoZSB3YXkgYmFjay5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHVwX3JlYWQoXFx1MDAyNnJvb3QtXFx1MDAzZWtlcm5mc19yd3NlbSk7XFxuK1xcdFxcdGlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpXFxuIFxcdFxcdFxcdHJldHVybiAwO1xcbi1cXHRcXHR9XFxuK1xcdFxcdGRvd25fcmVhZChcXHUwMDI2cm9vdC1cXHUwMDNla2VybmZzX3J3c2VtKTtcXG4gXFx0fVxcbiBcXHR1cF9yZWFkKFxcdTAwMjZyb290LVxcdTAwM2VrZXJuZnNfcndzZW0pO1xcbiBcXHRmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBOVUxMO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuY1xcbmluZGV4IDZlNzRkYTkxZWJjYTUuLjAxY2Q1OGU1ZTQxZTcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmNcXG5AQCAtOCw2ICs4LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbWl0cy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbmV0L2lmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzY2hlZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc2lnbmFsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG5AQCAtMTcsNiArMTgsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL21vdW50LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvc29ja2V0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvc3RhdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N5c2NhbGwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3N5cy94YXR0ci5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImtzZWxmdGVzdF9oYXJuZXNzLmhcXFwiXFxuQEAgLTQ3Miw2ICs0NzQsMjA0IEBAIFRFU1RfRihrZXJuZnNfY2dyb3VwLCByZWFkZGlyX25vX2R1cGxpY2F0ZXMpXFxuIFxcdFxcdFxcdEVYUEVDVF9TVFJORShuYW1lc1tpXSwgbmFtZXNbal0pO1xcbiB9XFxuIFxcbisjZGVmaW5lIFJFU1VNRV9ESVJTXFx0MjRcXG4rXFxuKy8qXFxuKyAqIFJlc3VtaW5nIGF0IGFuIGVudHJ5IHRoYXQgaGFzIGdvbmUgbXVzdCBjYXJyeSBvbiBhZnRlciBpdCwgbmV2ZXIgYmVmb3JlLlxcbisgKiBUYWtlIGEgY29va2llIGZvciBldmVyeSBlbnRyeSwgdGhlbiByZW1vdmUgZWFjaCBvbmUsIHNlZWsgdG8gaXRzIGNvb2tpZVxcbisgKiBhbmQgcmVhZCB0aGUgcmVzdDsgbm90aGluZyBhbHJlYWR5IHJlcG9ydGVkIG1heSBjb21lIGJhY2suXFxuKyAqL1xcbitURVNUX0Yoa2VybmZzX2Nncm91cCwgcmVhZGRpcl9yZXN1bWVfYXRfcmVtb3ZlZF9lbnRyeSlcXG4re1xcbitcXHQvKiBUaGUgY2dyb3VwJ3Mgb3duIGNvbnRyb2wgZmlsZXMgYXJlIGxpc3RlZCBhbG9uZ3NpZGUgb3Vycy4gKi9cXG4rXFx0Y2hhciBuYW1lc1sxMjhdW05BTUVfTUFYICsgMV07XFxuK1xcdGxvbmcgcG9zWzEyOF07XFxuK1xcdGNoYXIgcGF0aFtQQVRIX01BWF07XFxuK1xcdHN0cnVjdCBkaXJlbnQgKmRlO1xcbitcXHRpbnQgbiA9IDAsIGksIGo7XFxuK1xcdERJUiAqZDtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBSRVNVTUVfRElSUzsgaSsrKSB7XFxuK1xcdFxcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXFxcIiVzL2UlMDJkXFxcIiwgc2VsZi1cXHUwMDNlc2NyYXRjaCwgaSk7XFxuK1xcdFxcdEFTU0VSVF9FUShta2RpcihwYXRoLCAwNzU1KSwgMCk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFJlY29yZCB0aGUgY29va2llIGJlZm9yZSByZWFkaW5nIGVhY2ggZW50cnksIHdpdGggaXRzIG5hbWUuICovXFxuK1xcdGQgPSBvcGVuZGlyKHNlbGYtXFx1MDAzZXNjcmF0Y2gpO1xcbitcXHRBU1NFUlRfTkUoZCwgTlVMTCk7XFxuK1xcdHdoaWxlICgxKSB7XFxuK1xcdFxcdGxvbmcgaGVyZSA9IHRlbGxkaXIoZCk7XFxuK1xcbitcXHRcXHRkZSA9IHJlYWRkaXIoZCk7XFxuK1xcdFxcdGlmICghZGUpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRpZiAoIXN0cmNtcChkZS1cXHUwMDNlZF9uYW1lLCBcXFwiLlxcXCIpIHx8ICFzdHJjbXAoZGUtXFx1MDAzZWRfbmFtZSwgXFxcIi4uXFxcIikpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRBU1NFUlRfTFQobiwgKGludClBUlJBWV9TSVpFKHBvcykpO1xcbitcXHRcXHRwb3Nbbl0gPSBoZXJlO1xcbitcXHRcXHRzdHJuY3B5KG5hbWVzW25dLCBkZS1cXHUwMDNlZF9uYW1lLCBOQU1FX01BWCk7XFxuK1xcdFxcdG5hbWVzW25dW05BTUVfTUFYXSA9ICdcXFxcMCc7XFxuK1xcdFxcdG4rKztcXG4rXFx0fVxcbitcXHRjbG9zZWRpcihkKTtcXG4rXFx0QVNTRVJUX0dUKG4sIDEpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKykge1xcbitcXHRcXHQvKiBPbmx5IHRoZSBkaXJlY3RvcmllcyB3ZSBtYWRlIGNhbiBiZSByZW1vdmVkIGFuZCBwdXQgYmFjay4gKi9cXG4rXFx0XFx0aWYgKHN0cm5jbXAobmFtZXNbaV0sIFxcXCJlXFxcIiwgMSkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcXFwiJXMvJXNcXFwiLCBzZWxmLVxcdTAwM2VzY3JhdGNoLCBuYW1lc1tpXSk7XFxuK1xcdFxcdEFTU0VSVF9FUShybWRpcihwYXRoKSwgMCk7XFxuK1xcbitcXHRcXHQvKiBSZW9wZW4gc28gdGhlIHNlZWsgaGFzIHRvIHJlYWNoIHRoZSBrZXJuZWwuICovXFxuK1xcdFxcdGQgPSBvcGVuZGlyKHNlbGYtXFx1MDAzZXNjcmF0Y2gpO1xcbitcXHRcXHRBU1NFUlRfTkUoZCwgTlVMTCk7XFxuK1xcdFxcdHNlZWtkaXIoZCwgcG9zW2ldKTtcXG4rXFx0XFx0d2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpKSB7XFxuK1xcdFxcdFxcdGlmICghc3RyY21wKGRlLVxcdTAwM2VkX25hbWUsIFxcXCIuXFxcIikgfHwgIXN0cmNtcChkZS1cXHUwMDNlZF9uYW1lLCBcXFwiLi5cXFwiKSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGZvciAoaiA9IDA7IGogXFx1MDAzYyBpOyBqKyspXFxuK1xcdFxcdFxcdFxcdEFTU0VSVF9TVFJORShkZS1cXHUwMDNlZF9uYW1lLCBuYW1lc1tqXSlcXG4rXFx0XFx0XFx0XFx0XFx0VEhfTE9HKFxcXCJyZXN1bWluZyBhdCAlcyAoZ29uZSkgd2VudCBiYWNrIHRvICVzXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIG5hbWVzW2ldLCBuYW1lc1tqXSk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y2xvc2VkaXIoZCk7XFxuK1xcbitcXHRcXHRBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUkVTVU1FX0RJUlM7IGkrKykge1xcbitcXHRcXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFxcXCIlcy9lJTAyZFxcXCIsIHNlbGYtXFx1MDAzZXNjcmF0Y2gsIGkpO1xcbitcXHRcXHRFWFBFQ1RfRVEocm1kaXIocGF0aCksIDApO1xcbitcXHR9XFxuK31cXG4rXFxuKyNkZWZpbmUgQ0hVUk5fUk9VTkRTXFx0NDAwXFxuKyNkZWZpbmUgQ0hVUk5fQlVGU1pcXHQ1MTJcXHQvKiBzbWFsbCwgc28gYSBsaXN0aW5nIHRha2VzIHNldmVyYWwgY2FsbHMgKi9cXG4rXFxuKy8qXFxuKyAqIFRoZSBmaWxlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZW5hYmxpbmcgd3JpdGUgYW5kIGdvIGF0IHRoZSBzdGFydCBvZlxcbisgKiB0aGUgZGlzYWJsaW5nIG9uZSwgc28gdGhlIHdpbmRvdyB3aGVyZSB0aGV5IGV4aXN0IGlzIHRoZSBzaG9ydCBvbmUuXFxuKyAqL1xcbisjZGVmaW5lIENIVVJOX0RXRUxMX09OXFx0MjAwMFxcbisjZGVmaW5lIENIVVJOX0RXRUxMX09GRlxcdDIwMFxcbitcXG4rc3RydWN0IGtlcm5mc19kaXJlbnQ2NCB7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbG9uZ1xcdGRfaW5vO1xcbitcXHRsb25nIGxvbmdcXHRcXHRkX29mZjtcXG4rXFx0dW5zaWduZWQgc2hvcnRcXHRcXHRkX3JlY2xlbjtcXG4rXFx0dW5zaWduZWQgY2hhclxcdFxcdGRfdHlwZTtcXG4rXFx0Y2hhclxcdFxcdFxcdGRfbmFtZVtdO1xcbit9O1xcbitcXG4rLypcXG4rICogVGhlIHNhbWUgcmVzdW1lLCBidXQgaW5zaWRlIG9uZSBnZXRkZW50cygyKSBjYWxsLiAgcm1kaXIoMikgY2Fubm90IHJlYWNoXFxuKyAqIHRoYXQgd2luZG93IGJlY2F1c2UgaXRlcmF0ZV9kaXIoKSBob2xkcyB0aGUgbGlzdGVkIGRpcmVjdG9yeSdzIGlfcndzZW1cXG4rICogZm9yIHRoZSB3aG9sZSBsaXN0aW5nOyBjZ3JvdXAuc3VidHJlZV9jb250cm9sIGNhbiwgaGF2aW5nIG5vIFZGU1xcbisgKiBvcGVyYXRpb24gb24gdGhlIG5hbWVzIGl0IGFkZHMgYW5kIHJlbW92ZXMuICBUaGUgZmlsZXMgdGhhdCBhcmUgbm90IHRoZVxcbisgKiBjb250cm9sbGVyJ3Mgc3RheSB0aHJvdWdob3V0LCBzbyBlYWNoIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS5cXG4rICpcXG4rICogQSBzdHJlc3MgdGVzdDogaXQgaGFzIG5vdCBiZWVuIHNlZW4gdG8gY2F0Y2ggdGhlIG9yZGVyaW5nIGJ1ZywgYW5kIGlzXFxuKyAqIGhlcmUgdG8ga2VlcCB0aGUgdW5sb2NrZWQgd2luZG93IHVuZGVyIGxvYWQgZm9yIGxvY2tkZXAgYW5kIEtBU0FOLlxcbisgKi9cXG4rVEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX3ZzX2ludGVybmFsX3JlbW92ZSlcXG4re1xcbitcXHRjaGFyIGJ1ZltDSFVSTl9CVUZTWl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xcbitcXHRjaGFyIHN0YWJsZVsxMjhdW05BTUVfTUFYICsgMV07XFxuK1xcdGludCBuc3RhYmxlID0gMCwgaSwgcjtcXG4rXFx0aW50IHdpdGhjdGwgPSAwLCB3aXRob3V0ID0gMDtcXG4rXFx0aW50IHNlZW5bMTI4XSwgc3RhdHVzO1xcbitcXHRwaWRfdCBjaHVybmVyO1xcbitcXHRESVIgKmQ7XFxuK1xcbitcXHQvKiBXaXRoIHRoZSBjb250cm9sbGVyIG9mZiwgd2hhdGV2ZXIgaXMgbGVmdCBpcyB3aGF0IG11c3QgcGVyc2lzdC4gKi9cXG4rXFx0QVNTRVJUX0VRKHdyaXRlX2ZpbGUoc2VsZi1cXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cXHUwMDNlZGlzYWJsZSksIDApO1xcbitcXHRkID0gb3BlbmRpcihzZWxmLVxcdTAwM2VjaGlsZCk7XFxuK1xcdEFTU0VSVF9ORShkLCBOVUxMKTtcXG4rXFx0Zm9yICg7Oykge1xcbitcXHRcXHRzdHJ1Y3QgZGlyZW50ICpkZSA9IHJlYWRkaXIoZCk7XFxuK1xcbitcXHRcXHRpZiAoIWRlKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0aWYgKCFzdHJjbXAoZGUtXFx1MDAzZWRfbmFtZSwgXFxcIi5cXFwiKSB8fCAhc3RyY21wKGRlLVxcdTAwM2VkX25hbWUsIFxcXCIuLlxcXCIpKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0QVNTRVJUX0xUKG5zdGFibGUsIChpbnQpQVJSQVlfU0laRShzdGFibGUpKTtcXG4rXFx0XFx0c3RybmNweShzdGFibGVbbnN0YWJsZV0sIGRlLVxcdTAwM2VkX25hbWUsIE5BTUVfTUFYKTtcXG4rXFx0XFx0c3RhYmxlW25zdGFibGVdW05BTUVfTUFYXSA9ICdcXFxcMCc7XFxuK1xcdFxcdG5zdGFibGUrKztcXG4rXFx0fVxcbitcXHRjbG9zZWRpcihkKTtcXG4rXFx0QVNTRVJUX0dUKG5zdGFibGUsIDApO1xcbitcXG4rXFx0Y2h1cm5lciA9IGZvcmsoKTtcXG4rXFx0QVNTRVJUX0dFKGNodXJuZXIsIDApO1xcbitcXHRpZiAoY2h1cm5lciA9PSAwKSB7XFxuK1xcdFxcdGZvciAoOzspIHtcXG4rXFx0XFx0XFx0aWYgKHdyaXRlX2ZpbGUoc2VsZi1cXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cXHUwMDNlZW5hYmxlKSlcXG4rXFx0XFx0XFx0XFx0X2V4aXQoMTApO1xcbitcXHRcXHRcXHR1c2xlZXAoQ0hVUk5fRFdFTExfT04pO1xcbitcXHRcXHRcXHRpZiAod3JpdGVfZmlsZShzZWxmLVxcdTAwM2VzY3JhdGNoX3NjLCBzZWxmLVxcdTAwM2VkaXNhYmxlKSlcXG4rXFx0XFx0XFx0XFx0X2V4aXQoMTEpO1xcbitcXHRcXHRcXHR1c2xlZXAoQ0hVUk5fRFdFTExfT0ZGKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRmb3IgKHIgPSAwOyByIFxcdTAwM2MgQ0hVUk5fUk9VTkRTOyByKyspIHtcXG4rXFx0XFx0aW50IGZkID0gb3BlbihzZWxmLVxcdTAwM2VjaGlsZCwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSk7XFxuK1xcdFxcdGludCBleHRyYSA9IDA7XFxuK1xcdFxcdGludCBuO1xcbitcXG4rXFx0XFx0QVNTRVJUX0dFKGZkLCAwKTtcXG4rXFx0XFx0bWVtc2V0KHNlZW4sIDAsIHNpemVvZihzZWVuKSk7XFxuK1xcbitcXHRcXHR3aGlsZSAoKG4gPSBzeXNjYWxsKFNZU19nZXRkZW50czY0LCBmZCwgYnVmLCBzaXplb2YoYnVmKSkpIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRpbnQgb2ZmID0gMDtcXG4rXFxuK1xcdFxcdFxcdHdoaWxlIChvZmYgXFx1MDAzYyBuKSB7XFxuK1xcdFxcdFxcdFxcdHN0cnVjdCBrZXJuZnNfZGlyZW50NjQgKmRlID0gKHZvaWQgKikoYnVmICsgb2ZmKTtcXG4rXFx0XFx0XFx0XFx0Ym9vbCBrbm93biA9IGZhbHNlO1xcbitcXG4rXFx0XFx0XFx0XFx0b2ZmICs9IGRlLVxcdTAwM2VkX3JlY2xlbjtcXG4rXFx0XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5zdGFibGU7IGkrKylcXG4rXFx0XFx0XFx0XFx0XFx0aWYgKCFzdHJjbXAoZGUtXFx1MDAzZWRfbmFtZSwgc3RhYmxlW2ldKSkge1xcbitcXHRcXHRcXHRcXHRcXHRcXHRzZWVuW2ldKys7XFxuK1xcdFxcdFxcdFxcdFxcdFxcdGtub3duID0gdHJ1ZTtcXG4rXFx0XFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHRcXHRpZiAoIWtub3duIFxcdTAwMjZcXHUwMDI2IHN0cmNtcChkZS1cXHUwMDNlZF9uYW1lLCBcXFwiLlxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdFxcdCAgICBzdHJjbXAoZGUtXFx1MDAzZWRfbmFtZSwgXFxcIi4uXFxcIikpXFxuK1xcdFxcdFxcdFxcdFxcdGV4dHJhKys7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHRcXHRBU1NFUlRfR0UobiwgMCk7XFxuK1xcdFxcdEVYUEVDVF9FUShjbG9zZShmZCksIDApO1xcbitcXG4rXFx0XFx0aWYgKGV4dHJhKVxcbitcXHRcXHRcXHR3aXRoY3RsKys7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0d2l0aG91dCsrO1xcbitcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5zdGFibGU7IGkrKylcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKHNlZW5baV0sIDEpXFxuK1xcdFxcdFxcdFxcdFRIX0xPRyhcXFwicm91bmQgJWQ6ICVzIHNlZW4gJWQgdGltZXNcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICAgciwgc3RhYmxlW2ldLCBzZWVuW2ldKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogVGhlIGNodXJuIG11c3QgaGF2ZSBiZWVuIHJ1bm5pbmcsIG9yIHRoZSBsaXN0aW5ncyBwcm92ZSBub3RoaW5nLiAqL1xcbitcXHRFWFBFQ1RfRVEoa2lsbChjaHVybmVyLCBTSUdLSUxMKSwgMCk7XFxuK1xcdEFTU0VSVF9FUSh3YWl0cGlkKGNodXJuZXIsIFxcdTAwMjZzdGF0dXMsIDApLCBjaHVybmVyKTtcXG4rXFx0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSBcXHUwMDI2XFx1MDAyNiBXVEVSTVNJRyhzdGF0dXMpID09IFNJR0tJTEwpXFxuK1xcdFxcdFRIX0xPRyhcXFwiY2h1cm5lciBleGl0ZWQgb24gaXRzIG93bjogc3RhdHVzICVkXFxcIiwgc3RhdHVzKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZXkgYWxzbyBoYXZlIHRvIGhhdmUgb3ZlcmxhcHBlZCBpdC4gIEhvdyBtdWNoIGRlcGVuZHMgb24gdGhlXFxuK1xcdCAqIG1hY2hpbmUsIHNvIHNheSB0aGUgcmFjZSBjb3VsZCBub3QgYmUgYXJyYW5nZWQgcmF0aGVyIHRoYW4gZmFpbC5cXG4rXFx0ICovXFxuK1xcdGlmICghd2l0aGN0bCB8fCAhd2l0aG91dClcXG4rXFx0XFx0U0tJUChyZXR1cm4sIFxcXCJsaXN0aW5ncyBkaWQgbm90IHNwYW4gdGhlIGNodXJuOiAlZCB3aXRoLCAlZCB3aXRob3V0XFxcIixcXG4rXFx0XFx0ICAgICB3aXRoY3RsLCB3aXRob3V0KTtcXG4rfVxcbitcXG4gLypcXG4gICogQSB0ZWxsZGlyKCkgY29va2llIG11c3QgcmVzb2x2ZSBiYWNrIHRvIHRoZSBzYW1lIGVudHJ5IGFmdGVyIHNlZWtkaXIoKS5cXG4gICoga2VybmZzIGVuY29kZXMgdGhlIGNvb2tpZSBhcyB0aGUgbm9kZSdzIG5hbWUgaGFzaCwgc28gdGhpcyBjb3ZlcnNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzE6NDMuMjYwNTgwNjAyWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo0NzkwNjg3MTg5OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLRVJORlNcIixcbiAgICBcIlNZU0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwia2VybmZzX2ZvcF9yZWFkZGlyXCIsXG4gICAgXCJrZXJuZnNfZGlyX3Bvc1wiLFxuICAgIFwia2VybmZzX2Rpcl9uZXh0X3Bvc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGtlcm5mcyBkaXJlY3RvcnkgbGlzdGluZyAocmVhZGRpciAvIGdldGRlbnRzKSBhbmQgcmVzdW1lIHRyYXZlcnNhbCBsb2dpYyBpbiBmcy9rZXJuZnMvZGlyLmMuIFNwZWNpZmljYWxseSwgaXQgdXBkYXRlcyBrZXJuZnNfZGlyX3BvcyBhbmQga2VybmZzX2Rpcl9uZXh0X3BvcyB0byByZXN1bWUgcmVhZGRpciBiYXNlZCBvbiBlbnRyeSBuYW1lIGNvbXBhcmlzb24gd2l0aGluIHRoZSByYi10cmVlLCBhZGRzIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSByZXN1bWUga2V5IG5hbWUsIGludHJvZHVjZXMgYSBXQVJOX09OX09OQ0UgY2hlY2sgb24gbmFtZSB0cnVuY2F0aW9uLCBhbmQgcmVsZWFzZXMvcmVhY3F1aXJlcyByb290LVxcdTAwM2VrZXJuZnNfcndzZW0gYXJvdW5kIGRpcl9lbWl0KCkuIFRoZXNlIGNoYW5nZXMgdG91Y2ggcmVhY2hhYmxlIGNvcmUgdmlydHVhbCBmaWxlc3lzdGVtIGNvZGUgZXhlcmNpc2VkIGJ5IHVzZXIgc3BhY2UgdmlhIGdldGRlbnRzL2dldGRlbnRzNjQgb24gc3lzZnMgYW5kIGNncm91cHMsIGludHJvZHVjaW5nIGNvbmN1cnJlbmN5IHdpbmRvd3MgYW5kIG1vZGlmaWVkIGxvY2tpbmcgc2VtYW50aWNzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGU1NTgwMjBlYWJhNjA1ZjYwODE3ZDU0ZDQ5NzFlY2RmMWNiNDUxZjBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAxODozMTo0MSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9kaXIuYyBiL2ZzL2tlcm5mcy9kaXIuY1xuaW5kZXggMDdhYmY1OWYwMjY0YS4uY2M2Mjg4ZDViNGNjNCAxMDA2NDRcbi0tLSBhL2ZzL2tlcm5mcy9kaXIuY1xuKysrIGIvZnMva2VybmZzL2Rpci5jXG5AQCAtMTkwMywzMyArMTkwMyw0OSBAQCBzdGF0aWMgaW50IGtlcm5mc19kaXJfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rLypcbisgKiBGaW5kIHdoZXJlIGEgbGlzdGluZyBsZWZ0IG9mZi4gIEByZXN1bWVkIHNheXMgd2hldGhlciBAcG9zIGlzIHN0aWxsIHRoYXRcbisgKiBlbnRyeTsgaWYgbm90LCB0aGUgc2VhcmNoIGZhbGxzIGJhY2sgdG8gQGhhc2gsIGtleWVkIGJ5IEBuYW1lIGlmIGdpdmVuLlxuKyAqL1xuIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcylcbitcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXG4rXHRjb25zdCBjaGFyICpuYW1lLCBib29sICpyZXN1bWVkKVxuIHtcbitcdGlmIChyZXN1bWVkKVxuK1x0XHQqcmVzdW1lZCA9IGZhbHNlO1xuIFx0aWYgKHBvcykge1xuK1x0XHQvKlxuK1x0XHQgKiBBIHJlbmFtZSBrZWVwcyB0aGUgaGFzaCBpZiB0aGUgbmV3IG5hbWUgaGFzaGVzIHRoZSBzYW1lLCBzb1xuK1x0XHQgKiBjaGVjayBAbmFtZSB0b28uICBPdGhlcndpc2UgdGhlIGNhbGxlciB3b3VsZCBzdGVwIG92ZXIgdGhlXG4rXHRcdCAqIGVudHJ5IG5vdyBzaXR0aW5nIHdoZXJlIEBwb3MgdXNlZCB0byBiZS5cbitcdFx0ICovXG4gXHRcdGludCB2YWxpZCA9IGtlcm5mc19hY3RpdmUocG9zKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHRyY3VfYWNjZXNzX3BvaW50ZXIocG9zLVx1MDAzZV9fcGFyZW50KSA9PSBwYXJlbnQgXHUwMDI2XHUwMDI2XG4tXHRcdFx0aGFzaCA9PSBwb3MtXHUwMDNlaGFzaDtcbitcdFx0XHRoYXNoID09IHBvcy1cdTAwM2VoYXNoIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCghbmFtZSB8fCAhc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpKSk7XG4gXHRcdGtlcm5mc19wdXQocG9zKTtcbiBcdFx0aWYgKCF2YWxpZClcbiBcdFx0XHRwb3MgPSBOVUxMO1xuK1x0XHRlbHNlIGlmIChyZXN1bWVkKVxuK1x0XHRcdCpyZXN1bWVkID0gdHJ1ZTtcbiBcdH1cbiBcdGlmICghcG9zIFx1MDAyNlx1MDAyNiAoaGFzaCBcdTAwM2UgMSkgXHUwMDI2XHUwMDI2IChoYXNoIFx1MDAzYyBJTlRfTUFYKSkge1xuIFx0XHRzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHBhcmVudC1cdTAwM2VkaXIuY2hpbGRyZW4ucmJfbm9kZTtcbi1cdFx0dTY0IG5zX2lkID0ga2VybmZzX25zX2lkKG5zKTtcbitcbitcdFx0LypcbitcdFx0ICogS2VlcCBhIG5vZGUgb25seSBvbiB0aGUgd2F5IGxlZnQsIHNvIHRoZSBzZWFyY2ggZW5kcyBvbiB0aGVcbitcdFx0ICogZmlyc3QgZW50cnkgYWZ0ZXIgdGhlIGtleS4gIEFuIGVtcHR5IEBuYW1lIHNvcnRzIGJlZm9yZSBhbGxcbitcdFx0ICogZW50cmllcyBzaGFyaW5nIHRoZSBoYXNoLCBzbyBpdCBsYW5kcyBvbiB0aGUgZmlyc3Qgb2YgdGhlbS5cbitcdFx0ICovXG4gXHRcdHdoaWxlIChub2RlKSB7XG4tXHRcdFx0cG9zID0gcmJfdG9fa24obm9kZSk7XG4rXHRcdFx0c3RydWN0IGtlcm5mc19ub2RlICprbiA9IHJiX3RvX2tuKG5vZGUpO1xuIFxuLVx0XHRcdGlmIChoYXNoIFx1MDAzYyBwb3MtXHUwMDNlaGFzaClcbi1cdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4tXHRcdFx0ZWxzZSBpZiAoaGFzaCBcdTAwM2UgcG9zLVx1MDAzZWhhc2gpXG4tXHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9yaWdodDtcbi1cdFx0XHRlbHNlIGlmIChuc19pZCBcdTAwM2Mga2VybmZzX25zX2lkKHBvcy1cdTAwM2VucykpXG4rXHRcdFx0aWYgKGtlcm5mc19uYW1lX2NvbXBhcmUoaGFzaCwgbmFtZSA/OiBcIlwiLCBucywga24pIFx1MDAzYyAwKSB7XG4rXHRcdFx0XHRwb3MgPSBrbjtcbiBcdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4tXHRcdFx0ZWxzZSBpZiAobnNfaWQgXHUwMDNlIGtlcm5mc19uc19pZChwb3MtXHUwMDNlbnMpKVxuK1x0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9yaWdodDtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRicmVhaztcbitcdFx0XHR9XG4gXHRcdH1cbiBcdH1cbiBcdC8qIFNraXAgb3ZlciBlbnRyaWVzIHdoaWNoIGFyZSBkeWluZy9kZWFkIG9yIGluIHRoZSB3cm9uZyBuYW1lc3BhY2UgKi9cbkBAIC0xOTQ1LDEwICsxOTYxLDE0IEBAIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGlub190IGlubywgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpXG4rXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxuK1x0Y29uc3QgY2hhciAqbmFtZSlcbiB7XG4tXHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBpbm8sIHBvcyk7XG4tXHRpZiAocG9zKSB7XG4rXHRib29sIHJlc3VtZWQ7XG4rXG4rXHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIG5hbWUsIFx1MDAyNnJlc3VtZWQpO1xuK1x0LyogU3RlcCBvdmVyIEBwb3Mgb25seSBpZiBpdCBzdXJ2aXZlZDsgQG5hbWUgZmluZHMgdGhlIHNwb3QgaWYgbm90LiAqL1xuK1x0aWYgKHBvcyBcdTAwMjZcdTAwMjYgcmVzdW1lZCkge1xuIFx0XHRkbyB7XG4gXHRcdFx0c3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KFx1MDAyNnBvcy1cdTAwM2VyYik7XG4gXHRcdFx0aWYgKCFub2RlKVxuQEAgLTE5NjYsMzQgKzE5ODYsNTUgQEAgc3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuIFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS1cdTAwM2VmX3BhdGguZGVudHJ5O1xuIFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTtcbiBcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4rXHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuIFx0c3RydWN0IGtlcm5mc19yb290ICpyb290O1xuIFx0Y29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMO1xuIFxuIFx0aWYgKCFkaXJfZW1pdF9kb3RzKGZpbGUsIGN0eCkpXG4gXHRcdHJldHVybiAwO1xuIFxuK1x0LypcbitcdCAqIE9uZSBidWZmZXIgZm9yIHRoZSBjYWxsLCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGUgbGlzdGluZ1xuK1x0ICogaXMgb24uICBQQVRIX01BWDoga2VybmZzIGJvdW5kcyBubyBzaW5nbGUgbmFtZS5cbitcdCAqL1xuK1x0bmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpO1xuK1x0aWYgKCFuYW1lKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbiBcdHJvb3QgPSBrZXJuZnNfcm9vdChwYXJlbnQpO1xuIFx0ZG93bl9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbiBcbiBcdGlmIChrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpKVxuIFx0XHRucyA9IGtlcm5mc19pbmZvKGRlbnRyeS1cdTAwM2VkX3NiKS1cdTAwM2VucztcbiBcbi1cdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zKTtcbitcdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBOVUxMLCBOVUxMKTtcbiBcdCAgICAgcG9zO1xuLVx0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcykpIHtcbi1cdFx0Y29uc3QgY2hhciAqbmFtZSA9IGtlcm5mc19yY3VfbmFtZShwb3MpO1xuK1x0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcywgbmFtZSkpIHtcbiBcdFx0dW5zaWduZWQgaW50IHR5cGUgPSBmc191bW9kZV90b19kdHlwZShwb3MtXHUwMDNlbW9kZSk7XG4tXHRcdGludCBsZW4gPSBzdHJsZW4obmFtZSk7XG4gXHRcdGlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTtcbitcdFx0aW50IGxlbjtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIGNvcHkgaXMgYWxzbyB0aGUgcmVzdW1lIGtleSwgc28gYSB0cnVuY2F0ZWQgbmFtZSB3b3VsZFxuK1x0XHQgKiByZXN1bWUgaGVyZSBhZ2Fpbi4gIGdldG5hbWUoKSBjYXBzIGEgcGF0aCwgc28gb25seSBhblxuK1x0XHQgKiBpbi1rZXJuZWwgY2FsbGVyIGNhbiBnZXQgaGVyZTsgZW5kIHRoZSBsaXN0aW5nIGluc3RlYWQuXG4rXHRcdCAqL1xuK1x0XHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XG4rXHRcdGlmIChXQVJOX09OX09OQ0UobGVuIFx1MDAzYyAwKSlcbitcdFx0XHRicmVhaztcbiBcbiBcdFx0Y3R4LVx1MDAzZXBvcyA9IHBvcy1cdTAwM2VoYXNoO1xuIFx0XHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IHBvcztcbiBcdFx0a2VybmZzX2dldChwb3MpO1xuIFxuLVx0XHRpZiAoIWRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpKSB7XG4tXHRcdFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4rXHRcdC8qXG4rXHRcdCAqIGRpcl9lbWl0KCkgY2FuIGZhdWx0LCBzbyBydW4gaXQgdW5sb2NrZWQuICBAcG9zIGlzIHBpbm5lZFxuK1x0XHQgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suXG4rXHRcdCAqL1xuK1x0XHR1cF9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbitcdFx0aWYgKCFkaXJfZW1pdChjdHgsIG5hbWUsIGxlbiwgaW5vLCB0eXBlKSlcbiBcdFx0XHRyZXR1cm4gMDtcbi1cdFx0fVxuK1x0XHRkb3duX3JlYWQoXHUwMDI2cm9vdC1cdTAwM2VrZXJuZnNfcndzZW0pO1xuIFx0fVxuIFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4gXHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IE5VTEw7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmNcbmluZGV4IDZlNzRkYTkxZWJjYTUuLjAxY2Q1OGU1ZTQxZTcgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG5AQCAtOCw2ICs4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9pZi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc2NoZWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbkBAIC0xNyw2ICsxOCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3lzL21vdW50LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N5c2NhbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy94YXR0ci5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCJrc2VsZnRlc3RfaGFybmVzcy5oXCJcbkBAIC00NzIsNiArNDc0LDIwNCBAQCBURVNUX0Yoa2VybmZzX2Nncm91cCwgcmVhZGRpcl9ub19kdXBsaWNhdGVzKVxuIFx0XHRcdEVYUEVDVF9TVFJORShuYW1lc1tpXSwgbmFtZXNbal0pO1xuIH1cbiBcbisjZGVmaW5lIFJFU1VNRV9ESVJTXHQyNFxuK1xuKy8qXG4rICogUmVzdW1pbmcgYXQgYW4gZW50cnkgdGhhdCBoYXMgZ29uZSBtdXN0IGNhcnJ5IG9uIGFmdGVyIGl0LCBuZXZlciBiZWZvcmUuXG4rICogVGFrZSBhIGNvb2tpZSBmb3IgZXZlcnkgZW50cnksIHRoZW4gcmVtb3ZlIGVhY2ggb25lLCBzZWVrIHRvIGl0cyBjb29raWVcbisgKiBhbmQgcmVhZCB0aGUgcmVzdDsgbm90aGluZyBhbHJlYWR5IHJlcG9ydGVkIG1heSBjb21lIGJhY2suXG4rICovXG4rVEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX2F0X3JlbW92ZWRfZW50cnkpXG4re1xuK1x0LyogVGhlIGNncm91cCdzIG93biBjb250cm9sIGZpbGVzIGFyZSBsaXN0ZWQgYWxvbmdzaWRlIG91cnMuICovXG4rXHRjaGFyIG5hbWVzWzEyOF1bTkFNRV9NQVggKyAxXTtcbitcdGxvbmcgcG9zWzEyOF07XG4rXHRjaGFyIHBhdGhbUEFUSF9NQVhdO1xuK1x0c3RydWN0IGRpcmVudCAqZGU7XG4rXHRpbnQgbiA9IDAsIGksIGo7XG4rXHRESVIgKmQ7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRVNVTUVfRElSUzsgaSsrKSB7XG4rXHRcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCIlcy9lJTAyZFwiLCBzZWxmLVx1MDAzZXNjcmF0Y2gsIGkpO1xuK1x0XHRBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApO1xuK1x0fVxuK1xuK1x0LyogUmVjb3JkIHRoZSBjb29raWUgYmVmb3JlIHJlYWRpbmcgZWFjaCBlbnRyeSwgd2l0aCBpdHMgbmFtZS4gKi9cbitcdGQgPSBvcGVuZGlyKHNlbGYtXHUwMDNlc2NyYXRjaCk7XG4rXHRBU1NFUlRfTkUoZCwgTlVMTCk7XG4rXHR3aGlsZSAoMSkge1xuK1x0XHRsb25nIGhlcmUgPSB0ZWxsZGlyKGQpO1xuK1xuK1x0XHRkZSA9IHJlYWRkaXIoZCk7XG4rXHRcdGlmICghZGUpXG4rXHRcdFx0YnJlYWs7XG4rXHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuXCIpIHx8ICFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi4uXCIpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRBU1NFUlRfTFQobiwgKGludClBUlJBWV9TSVpFKHBvcykpO1xuK1x0XHRwb3Nbbl0gPSBoZXJlO1xuK1x0XHRzdHJuY3B5KG5hbWVzW25dLCBkZS1cdTAwM2VkX25hbWUsIE5BTUVfTUFYKTtcbitcdFx0bmFtZXNbbl1bTkFNRV9NQVhdID0gJ1xcMCc7XG4rXHRcdG4rKztcbitcdH1cbitcdGNsb3NlZGlyKGQpO1xuK1x0QVNTRVJUX0dUKG4sIDEpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKSB7XG4rXHRcdC8qIE9ubHkgdGhlIGRpcmVjdG9yaWVzIHdlIG1hZGUgY2FuIGJlIHJlbW92ZWQgYW5kIHB1dCBiYWNrLiAqL1xuK1x0XHRpZiAoc3RybmNtcChuYW1lc1tpXSwgXCJlXCIsIDEpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwiJXMvJXNcIiwgc2VsZi1cdTAwM2VzY3JhdGNoLCBuYW1lc1tpXSk7XG4rXHRcdEFTU0VSVF9FUShybWRpcihwYXRoKSwgMCk7XG4rXG4rXHRcdC8qIFJlb3BlbiBzbyB0aGUgc2VlayBoYXMgdG8gcmVhY2ggdGhlIGtlcm5lbC4gKi9cbitcdFx0ZCA9IG9wZW5kaXIoc2VsZi1cdTAwM2VzY3JhdGNoKTtcbitcdFx0QVNTRVJUX05FKGQsIE5VTEwpO1xuK1x0XHRzZWVrZGlyKGQsIHBvc1tpXSk7XG4rXHRcdHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkge1xuK1x0XHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuXCIpIHx8ICFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi4uXCIpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgaTsgaisrKVxuK1x0XHRcdFx0QVNTRVJUX1NUUk5FKGRlLVx1MDAzZWRfbmFtZSwgbmFtZXNbal0pXG4rXHRcdFx0XHRcdFRIX0xPRyhcInJlc3VtaW5nIGF0ICVzIChnb25lKSB3ZW50IGJhY2sgdG8gJXNcIixcbitcdFx0XHRcdFx0ICAgICAgIG5hbWVzW2ldLCBuYW1lc1tqXSk7XG4rXHRcdH1cbitcdFx0Y2xvc2VkaXIoZCk7XG4rXG4rXHRcdEFTU0VSVF9FUShta2RpcihwYXRoLCAwNzU1KSwgMCk7XG4rXHR9XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRVNVTUVfRElSUzsgaSsrKSB7XG4rXHRcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCIlcy9lJTAyZFwiLCBzZWxmLVx1MDAzZXNjcmF0Y2gsIGkpO1xuK1x0XHRFWFBFQ1RfRVEocm1kaXIocGF0aCksIDApO1xuK1x0fVxuK31cbitcbisjZGVmaW5lIENIVVJOX1JPVU5EU1x0NDAwXG4rI2RlZmluZSBDSFVSTl9CVUZTWlx0NTEyXHQvKiBzbWFsbCwgc28gYSBsaXN0aW5nIHRha2VzIHNldmVyYWwgY2FsbHMgKi9cbitcbisvKlxuKyAqIFRoZSBmaWxlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZW5hYmxpbmcgd3JpdGUgYW5kIGdvIGF0IHRoZSBzdGFydCBvZlxuKyAqIHRoZSBkaXNhYmxpbmcgb25lLCBzbyB0aGUgd2luZG93IHdoZXJlIHRoZXkgZXhpc3QgaXMgdGhlIHNob3J0IG9uZS5cbisgKi9cbisjZGVmaW5lIENIVVJOX0RXRUxMX09OXHQyMDAwXG4rI2RlZmluZSBDSFVSTl9EV0VMTF9PRkZcdDIwMFxuK1xuK3N0cnVjdCBrZXJuZnNfZGlyZW50NjQge1xuK1x0dW5zaWduZWQgbG9uZyBsb25nXHRkX2lubztcbitcdGxvbmcgbG9uZ1x0XHRkX29mZjtcbitcdHVuc2lnbmVkIHNob3J0XHRcdGRfcmVjbGVuO1xuK1x0dW5zaWduZWQgY2hhclx0XHRkX3R5cGU7XG4rXHRjaGFyXHRcdFx0ZF9uYW1lW107XG4rfTtcbitcbisvKlxuKyAqIFRoZSBzYW1lIHJlc3VtZSwgYnV0IGluc2lkZSBvbmUgZ2V0ZGVudHMoMikgY2FsbC4gIHJtZGlyKDIpIGNhbm5vdCByZWFjaFxuKyAqIHRoYXQgd2luZG93IGJlY2F1c2UgaXRlcmF0ZV9kaXIoKSBob2xkcyB0aGUgbGlzdGVkIGRpcmVjdG9yeSdzIGlfcndzZW1cbisgKiBmb3IgdGhlIHdob2xlIGxpc3Rpbmc7IGNncm91cC5zdWJ0cmVlX2NvbnRyb2wgY2FuLCBoYXZpbmcgbm8gVkZTXG4rICogb3BlcmF0aW9uIG9uIHRoZSBuYW1lcyBpdCBhZGRzIGFuZCByZW1vdmVzLiAgVGhlIGZpbGVzIHRoYXQgYXJlIG5vdCB0aGVcbisgKiBjb250cm9sbGVyJ3Mgc3RheSB0aHJvdWdob3V0LCBzbyBlYWNoIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS5cbisgKlxuKyAqIEEgc3RyZXNzIHRlc3Q6IGl0IGhhcyBub3QgYmVlbiBzZWVuIHRvIGNhdGNoIHRoZSBvcmRlcmluZyBidWcsIGFuZCBpc1xuKyAqIGhlcmUgdG8ga2VlcCB0aGUgdW5sb2NrZWQgd2luZG93IHVuZGVyIGxvYWQgZm9yIGxvY2tkZXAgYW5kIEtBU0FOLlxuKyAqL1xuK1RFU1RfRihrZXJuZnNfY2dyb3VwLCByZWFkZGlyX3Jlc3VtZV92c19pbnRlcm5hbF9yZW1vdmUpXG4re1xuK1x0Y2hhciBidWZbQ0hVUk5fQlVGU1pdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcbitcdGNoYXIgc3RhYmxlWzEyOF1bTkFNRV9NQVggKyAxXTtcbitcdGludCBuc3RhYmxlID0gMCwgaSwgcjtcbitcdGludCB3aXRoY3RsID0gMCwgd2l0aG91dCA9IDA7XG4rXHRpbnQgc2VlblsxMjhdLCBzdGF0dXM7XG4rXHRwaWRfdCBjaHVybmVyO1xuK1x0RElSICpkO1xuK1xuK1x0LyogV2l0aCB0aGUgY29udHJvbGxlciBvZmYsIHdoYXRldmVyIGlzIGxlZnQgaXMgd2hhdCBtdXN0IHBlcnNpc3QuICovXG4rXHRBU1NFUlRfRVEod3JpdGVfZmlsZShzZWxmLVx1MDAzZXNjcmF0Y2hfc2MsIHNlbGYtXHUwMDNlZGlzYWJsZSksIDApO1xuK1x0ZCA9IG9wZW5kaXIoc2VsZi1cdTAwM2VjaGlsZCk7XG4rXHRBU1NFUlRfTkUoZCwgTlVMTCk7XG4rXHRmb3IgKDs7KSB7XG4rXHRcdHN0cnVjdCBkaXJlbnQgKmRlID0gcmVhZGRpcihkKTtcbitcbitcdFx0aWYgKCFkZSlcbitcdFx0XHRicmVhaztcbitcdFx0aWYgKCFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi5cIikgfHwgIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIFwiLi5cIikpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdEFTU0VSVF9MVChuc3RhYmxlLCAoaW50KUFSUkFZX1NJWkUoc3RhYmxlKSk7XG4rXHRcdHN0cm5jcHkoc3RhYmxlW25zdGFibGVdLCBkZS1cdTAwM2VkX25hbWUsIE5BTUVfTUFYKTtcbitcdFx0c3RhYmxlW25zdGFibGVdW05BTUVfTUFYXSA9ICdcXDAnO1xuK1x0XHRuc3RhYmxlKys7XG4rXHR9XG4rXHRjbG9zZWRpcihkKTtcbitcdEFTU0VSVF9HVChuc3RhYmxlLCAwKTtcbitcbitcdGNodXJuZXIgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UoY2h1cm5lciwgMCk7XG4rXHRpZiAoY2h1cm5lciA9PSAwKSB7XG4rXHRcdGZvciAoOzspIHtcbitcdFx0XHRpZiAod3JpdGVfZmlsZShzZWxmLVx1MDAzZXNjcmF0Y2hfc2MsIHNlbGYtXHUwMDNlZW5hYmxlKSlcbitcdFx0XHRcdF9leGl0KDEwKTtcbitcdFx0XHR1c2xlZXAoQ0hVUk5fRFdFTExfT04pO1xuK1x0XHRcdGlmICh3cml0ZV9maWxlKHNlbGYtXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cdTAwM2VkaXNhYmxlKSlcbitcdFx0XHRcdF9leGl0KDExKTtcbitcdFx0XHR1c2xlZXAoQ0hVUk5fRFdFTExfT0ZGKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0Zm9yIChyID0gMDsgciBcdTAwM2MgQ0hVUk5fUk9VTkRTOyByKyspIHtcbitcdFx0aW50IGZkID0gb3BlbihzZWxmLVx1MDAzZWNoaWxkLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKTtcbitcdFx0aW50IGV4dHJhID0gMDtcbitcdFx0aW50IG47XG4rXG4rXHRcdEFTU0VSVF9HRShmZCwgMCk7XG4rXHRcdG1lbXNldChzZWVuLCAwLCBzaXplb2Yoc2VlbikpO1xuK1xuK1x0XHR3aGlsZSAoKG4gPSBzeXNjYWxsKFNZU19nZXRkZW50czY0LCBmZCwgYnVmLCBzaXplb2YoYnVmKSkpIFx1MDAzZSAwKSB7XG4rXHRcdFx0aW50IG9mZiA9IDA7XG4rXG4rXHRcdFx0d2hpbGUgKG9mZiBcdTAwM2Mgbikge1xuK1x0XHRcdFx0c3RydWN0IGtlcm5mc19kaXJlbnQ2NCAqZGUgPSAodm9pZCAqKShidWYgKyBvZmYpO1xuK1x0XHRcdFx0Ym9vbCBrbm93biA9IGZhbHNlO1xuK1xuK1x0XHRcdFx0b2ZmICs9IGRlLVx1MDAzZWRfcmVjbGVuO1xuK1x0XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnN0YWJsZTsgaSsrKVxuK1x0XHRcdFx0XHRpZiAoIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIHN0YWJsZVtpXSkpIHtcbitcdFx0XHRcdFx0XHRzZWVuW2ldKys7XG4rXHRcdFx0XHRcdFx0a25vd24gPSB0cnVlO1xuK1x0XHRcdFx0XHR9XG4rXHRcdFx0XHRpZiAoIWtub3duIFx1MDAyNlx1MDAyNiBzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi5cIikgXHUwMDI2XHUwMDI2XG4rXHRcdFx0XHQgICAgc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuLlwiKSlcbitcdFx0XHRcdFx0ZXh0cmErKztcbitcdFx0XHR9XG4rXHRcdH1cbitcdFx0QVNTRVJUX0dFKG4sIDApO1xuK1x0XHRFWFBFQ1RfRVEoY2xvc2UoZmQpLCAwKTtcbitcbitcdFx0aWYgKGV4dHJhKVxuK1x0XHRcdHdpdGhjdGwrKztcbitcdFx0ZWxzZVxuK1x0XHRcdHdpdGhvdXQrKztcbitcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnN0YWJsZTsgaSsrKVxuK1x0XHRcdEFTU0VSVF9FUShzZWVuW2ldLCAxKVxuK1x0XHRcdFx0VEhfTE9HKFwicm91bmQgJWQ6ICVzIHNlZW4gJWQgdGltZXNcIixcbitcdFx0XHRcdCAgICAgICByLCBzdGFibGVbaV0sIHNlZW5baV0pO1xuK1x0fVxuK1xuK1x0LyogVGhlIGNodXJuIG11c3QgaGF2ZSBiZWVuIHJ1bm5pbmcsIG9yIHRoZSBsaXN0aW5ncyBwcm92ZSBub3RoaW5nLiAqL1xuK1x0RVhQRUNUX0VRKGtpbGwoY2h1cm5lciwgU0lHS0lMTCksIDApO1xuK1x0QVNTRVJUX0VRKHdhaXRwaWQoY2h1cm5lciwgXHUwMDI2c3RhdHVzLCAwKSwgY2h1cm5lcik7XG4rXHRBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpIFx1MDAyNlx1MDAyNiBXVEVSTVNJRyhzdGF0dXMpID09IFNJR0tJTEwpXG4rXHRcdFRIX0xPRyhcImNodXJuZXIgZXhpdGVkIG9uIGl0cyBvd246IHN0YXR1cyAlZFwiLCBzdGF0dXMpO1xuK1xuK1x0LypcbitcdCAqIFRoZXkgYWxzbyBoYXZlIHRvIGhhdmUgb3ZlcmxhcHBlZCBpdC4gIEhvdyBtdWNoIGRlcGVuZHMgb24gdGhlXG4rXHQgKiBtYWNoaW5lLCBzbyBzYXkgdGhlIHJhY2UgY291bGQgbm90IGJlIGFycmFuZ2VkIHJhdGhlciB0aGFuIGZhaWwuXG4rXHQgKi9cbitcdGlmICghd2l0aGN0bCB8fCAhd2l0aG91dClcbitcdFx0U0tJUChyZXR1cm4sIFwibGlzdGluZ3MgZGlkIG5vdCBzcGFuIHRoZSBjaHVybjogJWQgd2l0aCwgJWQgd2l0aG91dFwiLFxuK1x0XHQgICAgIHdpdGhjdGwsIHdpdGhvdXQpO1xuK31cbitcbiAvKlxuICAqIEEgdGVsbGRpcigpIGNvb2tpZSBtdXN0IHJlc29sdmUgYmFjayB0byB0aGUgc2FtZSBlbnRyeSBhZnRlciBzZWVrZGlyKCkuXG4gICoga2VybmZzIGVuY29kZXMgdGhlIGNvb2tpZSBhcyB0aGUgbm9kZSdzIG5hbWUgaGFzaCwgc28gdGhpcyBjb3ZlcnNcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMxOjQzLjI2MDU4MjUyMloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjg0NDE2ODU5NzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqV29ydGggRnV6emluZzogQWJzb2x1dGVseSEqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgcGF0Y2ggc2VyaWVzIGlzICpkZWZpbml0ZWx5KiB3b3J0aCBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLiBIZXJlJ3Mgd2h5IEknbSBjb25maWRlbnQgaW4gdGhhdCBjb25jbHVzaW9uOlxuXG5GaXJzdCwgbGV0J3MgbG9vayBhdCB3aGF0J3MgYmVlbiBjaGFuZ2VkLiBUaGUgcGF0Y2ggbW9kaWZpZXMgYGZzL2tlcm5mcy9kaXIuY2AsIHNwZWNpZmljYWxseSBga2VybmZzX2Rpcl9wb3NgLCBga2VybmZzX2Rpcl9uZXh0X3Bvc2AsIGFuZCBga2VybmZzX2ZvcF9yZWFkZGlyYC4gVGhlIGNoYW5nZXMgdG8gYGtlcm5mc19mb3BfcmVhZGRpcmAgYXJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZy4gVGhlIHJlYWRkaXIgaW1wbGVtZW50YXRpb24gZm9yIGtlcm5mcyBpcyBiZWluZyBtb2RpZmllZCwgYW5kIHRoaXMgaXMgY3J1Y2lhbCBiZWNhdXNlIGtlcm5mcyBpcyBhIGNvcmUgZmlsZXN5c3RlbSBjb21wb25lbnQsIHVzZWQgYnkgc3lzZnMsIGNncm91cGZzLCBhbmQgb3RoZXJzLiBBbnkgcmVhZGRpciBjaGFuZ2UgbmVlZHMgdG8gYmUgbG9va2VkIGF0LiBUaGlzIGlzIHNvbWV0aGluZyB0aGF0IGlzIHVzZWQgcXVpdGUgZnJlcXVlbnRseSwgYW5kIGlzIHRodXMgdmVyeSByZWFjaGFibGUuXG5cbktleSBpbmRpY2F0b3JzIG9mIGZ1enp6aW5nIHdvcnRoIGFyZSBiZWluZyBtZXQ6IHRoZSBwaGlsb3NvcGh5IG1lbnRpb25zIGxvZ2ljIG1vZGlmaWNhdGlvbnMsIHJlZmFjdG9yaW5ncyBhbmQgY29kZSBjbGVhbnVwcywgcnVudGltZSBhc3NlcnRpb25zLCBhbmQgcmVhY2hhYmxlIGRyaXZlcnMgYW5kIHByb3RvY29scy5cblxuTm93LCB0aGUgY2hhbmdlcyB0aGVtc2VsdmVzIGFyZSByYWlzaW5nIHNvbWUgcmVkIGZsYWdzIChpbiBhIGdvb2Qgd2F5IGZvciBmdXp6aW5nISk6XG5cbiogICAqKkNvbmN1cnJlbmN5IElzc3VlczoqKiBUaGUgY29kZSBub3cgZXhwbGljaXRseSBkcm9wcyBhbmQgcmVhY3F1aXJlcyBga2VybmZzX3J3c2VtYCB3aXRoaW4gdGhlIGByZWFkZGlyYCBsb29wLCBhcm91bmQgdGhlIGBkaXJfZW1pdCgpYCBjYWxsLiBUaGlzIGlzIGh1Z2UhIFRoaXMgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBjb25jdXJyZW5jeSB3aW5kb3cgd2hlcmUgY29uY3VycmVudCBmaWxlIG9wZXJhdGlvbnMgKHJlbW92YWwsIGNyZWF0aW9uLCByZW5hbWluZykgKndoaWxlKiBhIHJlYWRkaXIgaXMgaXRlcmF0aW5nLiBUaGUgY29tbWl0IGV2ZW4gYWNrbm93bGVkZ2VzIHRoaXMgd2l0aCBzdHJlc3Mgc2VsZnRlc3RzLlxuXG4qICAgKipBc3NlcnRpb246KiogVGhlcmUncyBhIG5ldyBgV0FSTl9PTl9PTkNFKGxlbiBcdTAwM2MgMClgIGFzc2VydGlvbi4gTmV3IGFzc2VydGlvbnMgYXJlIHByaW1lIGZ1enppbmcgdGFyZ2V0cywgZXNwZWNpYWxseSB3aGVuIHRoZXkncmUgaW4gY29kZSBwYXRocyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgaGl0IGR1cmluZyBub3JtYWwgb3BlcmF0aW9ucy5cblxuKiAgICoqTG9ja2luZyBDaGFuZ2VzOioqIFRoZSBgdXBfcmVhZGAgYW5kIGBkb3duX3JlYWRgIGNhbGxzIHdpdGhpbiB0aGUgbG9vcCBzdWdnZXN0IGEgc2lnbmlmaWNhbnQgY2hhbmdlIGluIGxvY2tpbmcgYmVoYXZpb3IgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIHJhY2VzLiBUaGlzIGlzIHNvbWV0aGluZyB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIGluIGFueSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudC5cblxuKiAgICoqUmVhY2hhYmlsaXR5OioqIEtlcm5mcyBpcyBmdW5kYW1lbnRhbC4gU3lzZnMgYW5kIGNncm91cHMgYXJlIG1vdW50ZWQgYW5kIGFjY2Vzc2libGUgaW4gcHJldHR5IG11Y2ggYW55IHN0YW5kYXJkIGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIHN5emthbGxlciBRRU1VL0dDRSBzZXR1cHMuIFRoYXQgZ3VhcmFudGVlcyBoaWdoIHJlYWNoYWJpbGl0eSBmb3IgdGhlIG1vZGlmaWVkIGNvZGUuXG5cbiogICAqKkNvcmUgU3Vic3lzdGVtOioqIEtlcm5mcyBmYWxscyBzcXVhcmVseSBpbnRvIHRoZSBcImNvcmUgZmlsZXN5c3RlbVwiIGNhdGVnb3J5LiBUaGF0IGFsb25lIHRyaWdnZXJzIHRoZSBuZWVkIGZvciBmdXp6emluZy5cblxuU28sIGdpdmVuIHRoZSBjb3JlIG5hdHVyZSBvZiBrZXJuZnMsIHRoZSBjb25jdXJyZW5jeS1yZWxhdGVkIG1vZGlmaWNhdGlvbnMsIHRoZSBpbnRyb2R1Y2VkIGFzc2VydGlvbiwgYW5kIHRoZSBoaWdoIHJlYWNoYWJpbGl0eSwgdGhlIGFuc3dlciBpcyBhIHJlc291bmRpbmcgXCJ5ZXNcIi4gTmV4dCwgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBleGFjdCBmdW5jdGlvbnMsIEtjb25maWcgZGVwZW5kZW5jaWVzLCBhbmQgZmlsZXMsIHByb2JhYmx5IHVzaW5nIHRvb2xzIGxpa2UgYGdyZXBwZXJgIG9yIGByZWFkLWZpbGVgIHRvIGdldCBhIGJldHRlciBoYW5kbGUgb24gdGhlIGltcGxpY2F0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6NzE0NCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg5NCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMxOjUxLjcwMjI3MTcyNFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTY2NzU4NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrZXJuZnNfZm9wX3JlYWRkaXJcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMva2VybmZzXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2tlcm5mcy9kaXIuYz0xOTYzPXN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfbmV4dF9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTk4My1cXG5mcy9rZXJuZnMvZGlyLmM6MTk4NDpzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuZnMva2VybmZzL2Rpci5jLTE5ODUte1xcbi0tXFxuZnMva2VybmZzL2Rpci5jPTIwNDU9Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrZXJuZnNfZGlyX2ZvcHMgPSB7XFxuZnMva2VybmZzL2Rpci5jLTIwNDYtXFx0LnJlYWRcXHRcXHQ9IGdlbmVyaWNfcmVhZF9kaXIsXFxuZnMva2VybmZzL2Rpci5jOjIwNDc6XFx0Lml0ZXJhdGVfc2hhcmVkXFx0PSBrZXJuZnNfZm9wX3JlYWRkaXIsXFxuZnMva2VybmZzL2Rpci5jLTIwNDgtXFx0LnJlbGVhc2VcXHQ9IGtlcm5mc19kaXJfZm9wX3JlbGVhc2UsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMxOjUxLjc1MTk0NDQ2MloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIzMjE0ODE4ODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKktlcm5lbCBGaWxlc3lzdGVtIENvbmZpZ3VyYXRpb24gUmV2aWV3KipcblxuQWxyaWdodCwgYmVmb3JlIEkgZGl2ZSB0b28gZGVlcCwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBmb3IgYEtFUk5GU2AuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIHBpbnBvaW50IGV4YWN0bHkgaG93IGl0J3MgYmVpbmcgbWFuYWdlZCBkdXJpbmcgdGhlIGJ1aWxkLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRvIGp1bXAgaW50byB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlcy4gSSdsbCBzdGFydCB3aXRoIGBmcy9rZXJuZnMvS2NvbmZpZ2Ag4oCTIG1ha2VzIHNlbnNlIHRvIGxvb2sgdGhlcmUgZmlyc3QsIGFzIGl0J3MgdGhlIG1vc3Qgc3BlY2lmaWMgYW5kIHRhcmdldGVkIHRvIGBrZXJuZnNgLiBJZiBpdCdzIG5vdCBkZWZpbmVkIHRoZXJlLCBvciBpZiBJIHdhbnQgdG8gY29uZmlybSBpdHMgb3ZlcmFsbCByZWxhdGlvbnNoaXAgdG8gdGhlIGdlbmVyYWwgZmlsZXN5c3RlbSBvcHRpb25zLCBJJ2xsIHRoZW4gbW92ZSB1cCBhIGxldmVsIGFuZCBjaGVjayBgZnMvS2NvbmZpZ2AuIEl0J3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIHRoZSBkZXBlbmRlbmN5IHRyZWUsIGFueSBkZWZhdWx0IHNldHRpbmdzLCBhbmQgcG90ZW50aWFsIGJ1aWxkLXRpbWUgb3B0aW9ucyBhZmZlY3RpbmcgYEtFUk5GU2AgYmVmb3JlIEkgcHJvY2VlZC4gVGhpcyBpcyB3aGVyZSBJIGNhbiBjb25maXJtIG9yIGRlbnkgaXRzIGluY2x1c2lvbiBiYXNlZCBvbiBkZXBlbmRlbmNpZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg4OTAsIk91dHB1dFRva2VucyI6MTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMTo1NC4wNzM0MjkzNFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTEzNjc4MzgxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBLRVJORlNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMva2VybmZzL0tjb25maWctNS1cXG5mcy9rZXJuZnMvS2NvbmZpZzo2OmNvbmZpZyBLRVJORlNcXG5mcy9rZXJuZnMvS2NvbmZpZy03LVxcdGJvb2xcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzE6NTYuMTg3MTE1NzYxWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6Mjg0NDcyNDQ2NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIGBmcy9rZXJuZnMvS2NvbmZpZ2AuIEknbSBnb2luZyB0byBhcHByb2FjaCB0aGlzIHdpdGggbXkgdXN1YWwgbWV0aG9kaWNhbCBleWUsIGxvb2tpbmcgZm9yIHRoZSBjb3JlIGRlc2lnbiBkZWNpc2lvbnMgYW5kIHBvdGVudGlhbCBpbXBsaWNhdGlvbnMgZm9yIG15IGFyZWEgb2YgZXhwZXJ0aXNlLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUgc2hhcGVzIHRoZSBiZWhhdmlvciBhbmQgZmVhdHVyZXMgb2Yga2VybmZzLlxuXG5GaXJzdCwgSSdsbCBuZWVkIHRvIHBhcnNlIHRoZSBmaWxlLCBzbyBJJ2xsIHByb2JhYmx5IGxvb2sgZm9yIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGZpbGU6IHdoYXQgYGJvb2xgLCBgdHJpc3RhdGVgLCBvciBgc3RyaW5nYCBvcHRpb25zIGFyZSBkZWZpbmVkPyBBcmUgdGhlcmUgZGVwZW5kZW5jaWVzPyBBcmUgdGhlcmUgZGVmYXVsdCB2YWx1ZXM/IFdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2Ygc2V0dGluZyB0aG9zZSBvcHRpb25zPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHVzZXIgY29uZmlndXJhdGlvbiB0cmFuc2xhdGVzIGludG8ga2VybmVsIGJlaGF2aW9yLiBJJ2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRlcGVuZGVuY2llcyDigJMgdGhvc2UgYXJlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiBkaWZmZXJlbnQga2VybmVsIHN1YnN5c3RlbXMuXG5cbk5leHQsIEknbGwgaWRlbnRpZnkgdGhlIGZlYXR1cmVzIGVuYWJsZWQgb3IgZGlzYWJsZWQgYnkgZWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBhbmQgdGhlaXIgaW1wbGljYXRpb25zLCBzbyBJJ20gcGF5aW5nIGF0dGVudGlvbiB0byBhbnkgY29kZSBvciBkYXRhIHN0cnVjdHVyZXMgdGhhdCBhcmUgY29uZGl0aW9uYWxseSBjb21waWxlZCBvciBjb25maWd1cmVkIGJhc2VkIG9uIHRoZXNlIG9wdGlvbnMuIEknbGwgbmVlZCB0byB0aGluayBhYm91dCBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMuIEFyZSB0aGVyZSBhbnkgZmVhdHVyZXMgdGhhdCBtaWdodCBhZmZlY3QgdGhlIHBlcmZvcm1hbmNlIG9mIHJlbGF0ZWQgc3Vic3lzdGVtcyB0aGF0IEkga25vdyB3ZWxsP1xuXG5GaW5hbGx5LCBJJ2xsIGxvb2sgZm9yIGFueSBoaW50cyBhYm91dCBmdXR1cmUgZGlyZWN0aW9ucy4gQXJlIHRoZXJlIGFueSBleHBlcmltZW50YWwgZmVhdHVyZXMgb3IgZGVwcmVjYXRlZCBvbmVzPyBBcmUgdGhlcmUgYW55IGluZGljYXRpb25zIHRoYXQgdGhlIGRlc2lnbiBpcyBldm9sdmluZz8gSWYgc28sIHRoaXMgaGVscHMgbWUgc3RheSBhd2FyZSBvZiB0aGUgY2hhbmdlcyB0aGF0IG1pZ2h0IGltcGFjdCBteSB3b3JrIGluIHRoZSBmdXR1cmUuIEkgd2FudCB0byBrZWVwIG9uIHRvcCBvZiB0aGluZ3MsIHNvIEknbSBsb29raW5nIGZvciB0aGUgc2lnbmFscywgdGhlIHN1YnRsZSBjbHVlcyBhYm91dCB0aGUgZGlyZWN0aW9uIG9mIGRldmVsb3BtZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MTg0LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzE6NTkuMDMxODQzNzM3WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTM4OTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMva2VybmZzL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgS0VSTkZTIHNob3VsZCBiZSBzZWxlY3RlZCBieSBpdHMgdXNlcnNcXG4gICA0OlxcdCNcXG4gICA1OlxcdFxcbiAgIDY6XFx0Y29uZmlnIEtFUk5GU1xcbiAgIDc6XFx0XFx0Ym9vbFxcbiAgIDg6XFx0XFx0ZGVmYXVsdCBuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMxOjU5LjAzMTg5OTUyOFoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM0NDg1NjQxODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duLCBwcmVzZW50ZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgdGhlIEtFUk5GUyBTZWxlY3Rpb24qKlxuXG5BbHJpZ2h0LCBsZXQncyBzZWUgd2hvJ3Mgc2hvd2luZyBpbnRlcmVzdCBpbiBLRVJORlMuIE15IGluaXRpYWwgcmVhY3Rpb24gaXMgdG8gaW1tZWRpYXRlbHkgY29uc2lkZXIgdGhlIHBvdGVudGlhbCBpbXBsaWNhdGlvbnMuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGEgcHVyZSByZXNlYXJjaCBpbnRlcmVzdCwgb3IgaXMgdGhlcmUgYSBzcGVjaWZpYyBwcmFjdGljYWwgYXBwbGljYXRpb24gZHJpdmluZyB0aGlzIGNob2ljZT8gSWYgaXQncyBwdXJlIHJlc2VhcmNoLCBJJ20gZ29pbmcgdG8gc3RhcnQgbWVudGFsbHkgY2F0ZWdvcml6aW5nIHRoZW06IHdoYXQgYXJlIHRoZWlyIGFmZmlsaWF0aW9ucz8gQXJlIHRoZXkgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgdW5pdmVyc2l0eSB3aXRoIGEgcGFydGljdWxhcmx5IHN0cm9uZyBmb2N1cyBvbiBvcGVyYXRpbmcgc3lzdGVtcywgZmlsZSBzeXN0ZW1zLCBvciBwZXJoYXBzIGEgbmljaGUgYXJlYSBsaWtlIHNlY3VyaXR5IGtlcm5lbCBkZXNpZ24gd2hlcmUgS0VSTkZTIG1pZ2h0IGJlIHJlbGV2YW50P1xuXG5JZiB0aGlzIGlzIGNvbWluZyBmcm9tIGFuIGluZHVzdHJ5IHBlcnNwZWN0aXZlLCBteSB0aG91Z2h0IHByb2Nlc3Mgc2hpZnRzLiBJJ20gdHJ5aW5nIHRvIGdhdWdlOiBpcyBpdCBhIHN0YXJ0dXAgZXhwbG9yaW5nIGlubm92YXRpdmUgc3RvcmFnZSBzb2x1dGlvbnM/IE9yIHBlcmhhcHMgYSBsYXJnZXIgY29tcGFueSBpbnZlc3RpZ2F0aW5nIGhvdyBLRVJORlMgY291bGQgZml0IGludG8gYSBtb3JlIGNvbXBsZXggYXJjaGl0ZWN0dXJlPyBUaGUgc2VsZWN0aW9uIGNvdWxkIGluZGljYXRlIGFuIGludGVyZXN0IGluIGVtYmVkZGVkIHN5c3RlbXMgd2hlcmUgcmVzb3VyY2UgY29uc3RyYWludHMgYW5kIHNlY3VyaXR5IGJlY29tZSBwYXJhbW91bnQuIEknbSBtZW50YWxseSBidWlsZGluZyBwcm9maWxlcyBiYXNlZCBvbiBjb21wYW55IHNpemUsIHByb2R1Y3QgZm9jdXMsIGFuZCBwdWJsaXNoZWQgcmVzZWFyY2guXG5cbk5leHQsIEknbSBsb29raW5nIGJleW9uZCB0aGUgc2ltcGxlIHNlbGVjdGlvbi4gV2hhdCdzIHRoZSBjb250ZXh0PyBXaGF0IG90aGVyIHRvb2xzIG9yIHRlY2hub2xvZ2llcyBhcmUgdGhleSBjb25zaWRlcmluZyBvciB1c2luZyBhbG9uZ3NpZGUgS0VSTkZTPyBXaGF0IHByb2JsZW1zIGFyZSB0aGV5IHRyeWluZyB0byBzb2x2ZSB0aGF0IG1ha2UgS0VSTkZTIGFuIGF0dHJhY3RpdmUgb3B0aW9uPyBBcmUgdGhleSBsb29raW5nIGZvciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMsIGVuaGFuY2VkIHNlY3VyaXR5LCBvciBwZXJoYXBzIGEgbW9yZSBmbGV4aWJsZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgdGhhbiB3aGF0J3MgY3VycmVudGx5IGF2YWlsYWJsZT8gSSdsbCBwcm9iYWJseSBzY2FuIGZvciBhbnkgcmVsYXRlZCBwcm9qZWN0cyBvciBvcGVuLXNvdXJjZSBjb250cmlidXRpb25zIHRoZXkgaGF2ZS5cblxuVWx0aW1hdGVseSwgSSdtIHRyeWluZyB0byByYXBpZGx5IGFzc2VzcyB0aGVpciBsZXZlbCBvZiBleHBlcnRpc2UgYW5kIHRoZWlyIGdvYWxzLiBJcyB0aGlzIGEgY2FzdWFsIFwibGV0J3MgdHJ5IGl0XCIgYXBwcm9hY2gsIG9yIGlzIHRoaXMgYSBkZWVwIGRpdmUgd2l0aCB3ZWxsLWRlZmluZWQgcmVxdWlyZW1lbnRzPyBUaGUgYW5zd2VycyB0byB0aGVzZSBxdWVzdGlvbnMgd2lsbCBzaWduaWZpY2FudGx5IGluZmx1ZW5jZSBteSBleHBlY3RhdGlvbnMgYW5kIGhvdyBJIG1pZ2h0IHJlc3BvbmQgb3IgYWR2aXNlIHRoZW0uIEknbSBhbHJlYWR5IGZvcm11bGF0aW5nIHF1ZXN0aW9ucyBpbiBteSBtaW5kLCBzdWNoIGFzIFwiV2hhdCBwcm9ibGVtIGFyZSB5b3UgaG9waW5nIHRvIGFkZHJlc3Mgd2l0aCBLRVJORlM/XCIsIFwiV2hhdCBhcmUgeW91ciBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnM/XCIsIGFuZCBcIldoYXQncyB0aGUgY3VycmVudCBmaWxlIHN5c3RlbSBzb2x1dGlvbiB5b3UgYXJlIHdvcmtpbmcgd2l0aD9cIi4gVGhlIGFuc3dlcnMgdG8gdGhvc2UgcXVlc3Rpb25zIHdpbGwgZ3JlYXRseSBpbmZvcm0gbXkgb3duIGFuYWx5c2lzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NjIzLCJPdXRwdXRUb2tlbnMiOjE4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMjowMi40ODA0NjczN1oiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg1MjEwMTg0MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzZWxlY3QgS0VSTkZTXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL3Jlc2N0cmwvS2NvbmZpZz0xPWNvbmZpZyBSRVNDVFJMX0ZTXFxuLS1cXG5mcy9yZXNjdHJsL0tjb25maWctMy1cXHRkZXBlbmRzIG9uIEFSQ0hfSEFTX0NQVV9SRVNDVFJMXFxuZnMvcmVzY3RybC9LY29uZmlnOjQ6XFx0c2VsZWN0IEtFUk5GU1xcbmZzL3Jlc2N0cmwvS2NvbmZpZy01LVxcdHNlbGVjdCBQUk9DX0NQVV9SRVNDVFJMIGlmIFBST0NfRlNcXG4tLVxcbmZzL3N5c2ZzL0tjb25maWc9Mj1jb25maWcgU1lTRlNcXG4tLVxcbmZzL3N5c2ZzL0tjb25maWctNC1cXHRkZWZhdWx0IHlcXG5mcy9zeXNmcy9LY29uZmlnOjU6XFx0c2VsZWN0IEtFUk5GU1xcbmZzL3N5c2ZzL0tjb25maWctNi1cXHRoZWxwXFxuLS1cXG5pbml0L0tjb25maWc9NzI0PWNvbmZpZyBQU0lcXG5pbml0L0tjb25maWctNzI1LVxcdGJvb2wgXFxcIlByZXNzdXJlIHN0YWxsIGluZm9ybWF0aW9uIHRyYWNraW5nXFxcIlxcbmluaXQvS2NvbmZpZzo3MjY6XFx0c2VsZWN0IEtFUk5GU1xcbmluaXQvS2NvbmZpZy03MjctXFx0aGVscFxcbi0tXFxuaW5pdC9LY29uZmlnPTEwNTY9bWVudWNvbmZpZyBDR1JPVVBTXFxuaW5pdC9LY29uZmlnLTEwNTctXFx0Ym9vbCBcXFwiQ29udHJvbCBHcm91cCBzdXBwb3J0XFxcIlxcbmluaXQvS2NvbmZpZzoxMDU4OlxcdHNlbGVjdCBLRVJORlNcXG5pbml0L0tjb25maWctMTA1OS1cXHRoZWxwXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjA0LjMzMjU3NzMzM1oiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo0NDk4ODIxMDI4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKktlcm5lbCBGaWxlc3lzdGVtIERlcGVuZGVuY2llczogQSBEZWVwIERpdmUqKlxuXG5SaWdodCwgc28sIGBzeXNmc2AgaGFzIGJlZW4gc2V0IHVwIHRvIHNlbGVjdCBga2VybmZzYC4gQW5kLCBoYW5nIG9uLCBpdCBhcHBlYXJzIGBjZ3JvdXBzYCBhcmUgZG9pbmcgdGhlIHNhbWUgLSBzZWxlY3RpbmcgYGtlcm5mc2AuIEludHJpZ3VpbmchIFRoYXQgd2FycmFudHMgZnVydGhlciBpbnNwZWN0aW9uLiBUaGUgZGVzaWduIGxvZ2ljIGhlcmUgaXMgaW50ZXJlc3RpbmcsIGFuZCBJIG5lZWQgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGRlcGVuZGVuY3kuIExldCdzIGRlbHZlIGludG8gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4gVG8gc2VlIHRoZSBzcGVjaWZpY3MsIEkgc2hvdWxkIGNoZWNrIHRoZSByZWxldmFudCBgS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGBmcy9zeXNmcy9LY29uZmlnYCwgdG8gc2VlIHByZWNpc2VseSAqd2h5KiBgc3lzZnNgIGlzIHNlbGVjdGluZyBga2VybmZzYC4gVGhpcyB3aWxsIGNsYXJpZnkgdGhlIGNvcmUgZGVwZW5kZW5jeSBzZWxlY3Rpb24sIGFuZCBzaG91bGQgZXhwbGFpbiB0aGUgdW5kZXJseWluZyBzdHJ1Y3R1cmFsIGRlc2lnbi4gVW5kZXJzdGFuZGluZyB0aGUgJ3doeScgaGVyZSBpcyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIGtlcm5lbCBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmUsIGFuZCBob3cgdGhlc2UgY29tcG9uZW50cyBpbnRlcnJlbGF0ZS4gSSB3b25kZXIgd2hhdCB0aGUgcmFtaWZpY2F0aW9ucyBvZiB0aGlzIGFyZT9cblxuXG4iLCJJbnB1dFRva2VucyI6MTAzNjYsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMjowOC44MzE0MDEzNTFaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTg3NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvc3lzZnMvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0Y29uZmlnIFNZU0ZTXFxuICAgMzpcXHRcXHRib29sIFxcXCJzeXNmcyBmaWxlIHN5c3RlbSBzdXBwb3J0XFxcIiBpZiBFWFBFUlRcXG4gICA0OlxcdFxcdGRlZmF1bHQgeVxcbiAgIDU6XFx0XFx0c2VsZWN0IEtFUk5GU1xcbiAgIDY6XFx0XFx0aGVscFxcbiAgIDc6XFx0XFx0VGhlIHN5c2ZzIGZpbGVzeXN0ZW0gaXMgYSB2aXJ0dWFsIGZpbGVzeXN0ZW0gdGhhdCB0aGUga2VybmVsIHVzZXMgdG9cXG4gICA4OlxcdFxcdGV4cG9ydCBpbnRlcm5hbCBrZXJuZWwgb2JqZWN0cywgdGhlaXIgYXR0cmlidXRlcywgYW5kIHRoZWlyXFxuICAgOTpcXHRcXHRyZWxhdGlvbnNoaXBzIHRvIG9uZSBhbm90aGVyLlxcbiAgMTA6XFx0XFxuICAxMTpcXHRcXHRVc2VycyBjYW4gdXNlIHN5c2ZzIHRvIGFzY2VydGFpbiB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJ1bm5pbmdcXG4gIDEyOlxcdFxcdGtlcm5lbCwgc3VjaCBhcyB0aGUgZGV2aWNlcyB0aGUga2VybmVsIGhhcyBkaXNjb3ZlcmVkIG9uIGVhY2ggYnVzIGFuZFxcbiAgMTM6XFx0XFx0d2hpY2ggZHJpdmVyIGVhY2ggaXMgYm91bmQgdG8uIHN5c2ZzIGNhbiBhbHNvIGJlIHVzZWQgdG8gdHVuZSBkZXZpY2VzXFxuICAxNDpcXHRcXHRhbmQgb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuXFxuICAxNTpcXHRcXG4gIDE2OlxcdFxcdFNvbWUgc3lzdGVtIGFnZW50cyByZWx5IG9uIHRoZSBpbmZvcm1hdGlvbiBpbiBzeXNmcyB0byBvcGVyYXRlLlxcbiAgMTc6XFx0XFx0L3NiaW4vaG90cGx1ZyB1c2VzIGRldmljZSBhbmQgb2JqZWN0IGF0dHJpYnV0ZXMgaW4gc3lzZnMgdG8gYXNzaXN0IGluXFxuICAxODpcXHRcXHRkZWxlZ2F0aW5nIHBvbGljeSBkZWNpc2lvbnMsIGxpa2UgcGVyc2lzdGVudGx5IG5hbWluZyBkZXZpY2VzLlxcbiAgMTk6XFx0XFxuICAyMDpcXHRcXHRzeXNmcyBpcyBjdXJyZW50bHkgdXNlZCBieSB0aGUgYmxvY2sgc3Vic3lzdGVtIHRvIG1vdW50IHRoZSByb290XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjA4LjgzMTQ2MjAwMVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo1MzMzNTA0MDUzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktlcm5mcyBEaXJlY3RvcnkgUmVhZGRpciBMb2dpYzogRm9jdXMgU3ltYm9sIEFuYWx5c2lzKipcblxuT2theSwgc28gYFNZU0ZTYCBhbmQgYENHUk9VUFNgIGJvdGggZGVmYXVsdCB0byBhbmQgc2VsZWN0IGBLRVJORlNgLCBhbmQgYENPTkZJR19TWVNGU2AgaXMgc3RhbmRhcmQuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzIGhvdyB0aGUgcmVhZGRpciBmdW5jdGlvbmFsaXR5IHdpdGhpbiBga2VybmZzYCBpcyBpbXBsZW1lbnRlZCBhbmQgaWYgbXkgZnV6emluZyBlZmZvcnRzIHdvdWxkIGJlIGJlc3Qgc2VydmVkIGZvY3VzaW5nIG9uIHRoYXQgYXJlYS5cblxuTGV0J3Mgc2VlLCBJIG5lZWQgdG8gY2hlY2sgd2hhdCBmdW5jdGlvbnMgYXJlIG1vZGlmaWVkIGluIGBmcy9rZXJuZnMvZGlyLmNgLiBJIHNlZSBga2VybmZzX2Rpcl9wb3NgLCBga2VybmZzX2Rpcl9uZXh0X3Bvc2AsIGFuZCBga2VybmZzX2ZvcF9yZWFkZGlyYC4gTm93LCBhcmUgdGhlc2Ugc3RhdGljIGZ1bmN0aW9ucyBpbmxpbmVkIG9yIGFyZSB0aGV5IGRpc3RpbmN0IHN5bWJvbHMgd2l0aGluIGB2bWxpbnV4YD8gVGhhdCdzIHRoZSBjcnVjaWFsIHF1ZXN0aW9uLiBTdGF0aWMgZnVuY3Rpb25zIGluIEMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIGJlIGlubGluZWQsIG9yIG5vdCFcblxuT2theSwgdGltZSB0byBjb25zdWx0IHRoZSBGb2N1c1N5bWJvbHMgZ3VpZGVsaW5lcyBpbiBTZWN0aW9uIDQuIFRoZXkgZW1waGFzaXplIGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIGZ1bmN0aW9ucyBhbmQgdGFyZ2V0aW5nIHNwZWNpZmljIGZlYXR1cmUgbG9naWMgYW5kIGVudHJ5cG9pbnRzLiBDcnVjaWFsbHksIGl0IGhpZ2hsaWdodHMgdGhlIGNoYWxsZW5nZSB3aXRoIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb25zLCBhbmQgaG93IHRoZXkgbGFjayBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGFuZCB0aGVyZWZvcmUsIGFyZW4ndCB0YXJnZXRhYmxlIHZpYSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4gSWYgY2hhbmdlcyBhcmUgKnByaW1hcmlseSogaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBJIHNob3VsZCBpZGVudGlmeSBub24tc3RhdGljIGNhbGxlciBmdW5jdGlvbnMgdGhhdCBleGVyY2lzZSB0aG9zZSBzdGF0aWMgaW5saW5lIGhlbHBlcnMhXG5cbkFoISBga2VybmZzX2ZvcF9yZWFkZGlyYCBpcyB0aGUgZmlsZVxcX29wZXJhdGlvbnMgYC5pdGVyYXRlX3NoYXJlZGAgY2FsbGJhY2shIFRoaXMgaXMgcHJvbWlzaW5nIGJlY2F1c2UgYW55IGZ1bmN0aW9uIHdob3NlIGFkZHJlc3MgaXMgdGFrZW4sIGFzIGluIHRoZSBjYXNlIHdpdGggZnVuY3Rpb24gcG9pbnRlcnMsIGNhbiBOT1QgYmUgaW5saW5lZCBhd2F5IGJ5IHRoZSBjb21waWxlciFcblxuQnV0IHdoYXQgYWJvdXQgYGtlcm5mc19kaXJfcG9zYCBhbmQgYGtlcm5mc19kaXJfbmV4dF9wb3NgPyBUaGV5ICptaWdodCogYmUgaW5saW5lZCBpbnRvIGBrZXJuZnNfZm9wX3JlYWRkaXJgLCBvciB0aGV5ICptaWdodCogZXhpc3QgYXMgZGlzdGluY3Qgc3ltYm9scyBhcyB3ZWxsLlxuXG5TaW5jZSBJJ20gcmVhbGx5IGZvY3VzaW5nIG9uIHRoaXMga2VybmZzIGRpcmVjdG9yeSByZWFkZGlyIGxvZ2ljLCBJJ20gdGhpbmtpbmcgdGhhdCBsaXN0aW5nIGBrZXJuZnNfZm9wX3JlYWRkaXJgLCBhbG9uZyB3aXRoIGBrZXJuZnNfZGlyX3Bvc2AgYW5kIGBrZXJuZnNfZGlyX25leHRfcG9zYCBzZWVtcyB2ZXJ5IHNwZWNpZmljIGFuZCBmb2N1c2VkLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIGFueSBwb3NzaWJsZSBkaWx1dGlvbiBvZiB0aGUgZnV6emluZyBlZmZvcnQuXG5cbk5vdywgYSB2ZXJ5IGNydWNpYWwgcXVlc3Rpb246IGNhbiBga2VybmZzX2Rpcl9wb3NgIG9yIGBrZXJuZnNfZGlyX25leHRfcG9zYCBiZSBjYWxsZWQgZnJvbSAqYW55d2hlcmUqIGVsc2U/IFRoaXMgaXMgY3JpdGljYWwhIEkgbmVlZCB0byBlbnN1cmUgdGhleSBhcmUgdHJ1bHkgc3BlY2lmaWMgdG8gdGhpcyByZWFkZGlyIHBhdGguIEknbSBnb2luZyB0byBjaGVjayB0aGlzIHF1aWNrbHkgd2l0aCBgZ3JlcHBlcmAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwOTIyLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjgyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzI6MTQuMTY0OTY5Mjc0WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5MzU0MTMxOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrZXJuZnNfZGlyX3Bvc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9rZXJuZnNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMva2VybmZzL2Rpci5jPTE5MDA9c3RhdGljIGludCBrZXJuZnNfZGlyX2ZvcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKVxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTE5MDktICovXFxuZnMva2VybmZzL2Rpci5jOjE5MTA6c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuZnMva2VybmZzL2Rpci5jLTE5MTEtXFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYz0xOTYzPXN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfbmV4dF9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTk2OC1cXG5mcy9rZXJuZnMvZGlyLmM6MTk2OTpcXHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIG5hbWUsIFxcdTAwMjZyZXN1bWVkKTtcXG5mcy9rZXJuZnMvZGlyLmMtMTk3MC1cXHQvKiBTdGVwIG92ZXIgQHBvcyBvbmx5IGlmIGl0IHN1cnZpdmVkOyBAbmFtZSBmaW5kcyB0aGUgc3BvdCBpZiBub3QuICovXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTk4ND1zdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMjAwOS1cXG5mcy9rZXJuZnMvZGlyLmM6MjAxMDpcXHRmb3IgKHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGN0eC1cXHUwMDNlcG9zLCBwb3MsIE5VTEwsIE5VTEwpO1xcbmZzL2tlcm5mcy9kaXIuYy0yMDExLVxcdCAgICAgcG9zO1xcbi0tXFxuZnMva2VybmZzL2Rpci5jLTIwMzEtXFx0XFx0ICogZGlyX2VtaXQoKSBjYW4gZmF1bHQsIHNvIHJ1biBpdCB1bmxvY2tlZC4gIEBwb3MgaXMgcGlubmVkXFxuZnMva2VybmZzL2Rpci5jOjIwMzI6XFx0XFx0ICogYWJvdmUgYW5kIGtlcm5mc19kaXJfcG9zKCkgcmVjaGVja3MgaXQgb24gdGhlIHdheSBiYWNrLlxcbmZzL2tlcm5mcy9kaXIuYy0yMDMzLVxcdFxcdCAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMjoxNC4yNTg1MjM0MzNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NDQ5MzIwMzgzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkludmVzdGlnYXRpbmcgYSBQb3RlbnRpYWwgSXNzdWUqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSBhbmQgSSBuZWVkIHRvIGJlIHRob3JvdWdoLiBJJ3ZlIGFscmVhZHkgbG9va2VkIGF0IFggYW5kIFksIGFuZCBiYXNlZCBvbiB0aGF0IGFuYWx5c2lzLCBJJ20gc3RhcnRpbmcgdG8gc3VzcGVjdCBzb21ldGhpbmcgbWlnaHQgYmUgaGFwcGVuaW5nIHdpdGggdGhlIGRpcmVjdG9yeSBpdGVyYXRpb24uIFNvLCB0byBlbnN1cmUgSSdtIGNvdmVyaW5nIGFsbCBiYXNlcywgSSB3YW50IHRvIG1ha2Ugc3VyZSBJIHNjcnV0aW5pemUgYGtlcm5mc19kaXJfbmV4dF9wb3NgIHRvby4gSXQncyBhIGtleSBmdW5jdGlvbiBpbiB0aGlzIGRpcmVjdG9yeSBuYXZpZ2F0aW9uIGxvZ2ljLCBhbmQgSSBuZWVkIHRvIHJ1bGUgb3V0IGFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggaXRzIGltcGxlbWVudGF0aW9uIG9yIGl0cyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBvdGhlciBjb21wb25lbnRzLiBMZXQncyBzZWUgd2hhdCdzIGdvaW5nIG9uIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjYyMSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjE4Ljc1MTczMDkzOVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDg3MzA2NjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2VybmZzX2Rpcl9uZXh0X3Bvc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9rZXJuZnNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMva2VybmZzL2Rpci5jPTE5MTA9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTk2Mi1cXG5mcy9rZXJuZnMvZGlyLmM6MTk2MzpzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxcbmZzL2tlcm5mcy9kaXIuYy0xOTY0LVxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTk4ND1zdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMjAxMS1cXHQgICAgIHBvcztcXG5mcy9rZXJuZnMvZGlyLmM6MjAxMjpcXHQgICAgIHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LVxcdTAwM2Vwb3MsIHBvcywgbmFtZSkpIHtcXG5mcy9rZXJuZnMvZGlyLmMtMjAxMy1cXHRcXHR1bnNpZ25lZCBpbnQgdHlwZSA9IGZzX3Vtb2RlX3RvX2R0eXBlKHBvcy1cXHUwMDNlbW9kZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjE4LjgwMDQ2NzcyNloiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMjI4NTc1OTMxNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBLZXJuZnMgRGlyZWN0b3J5IEl0ZXJhdGlvbiBmb3IgRnV6emluZyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gV2UncmUgbG9va2luZyBhdCBmdW5jdGlvbnMgcmVsYXRlZCB0byByZWFkaW5nIGRpcmVjdG9yaWVzIHdpdGhpbiBga2VybmZzYCwgc3BlY2lmaWNhbGx5IGBrZXJuZnNfZGlyX3Bvc2AsIGBrZXJuZnNfZGlyX25leHRfcG9zYCwgYW5kIGBrZXJuZnNfZm9wX3JlYWRkaXJgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHRoZXNlIGNoYW5nZXMgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byBwb3RlbnRpYWwgZnV6emluZyB0YXJnZXRzLlxuXG5GaXJzdCwgSSdtIGV4YW1pbmluZyB0aGUgY29kZSBjaGFuZ2VzLiBga2VybmZzX2Rpcl9wb3NgIGFwcGVhcnMgdG8gYmUgYSBrZXkgZnVuY3Rpb24gZm9yIHBvc2l0aW9uaW5nIHdpdGhpbiBhIGRpcmVjdG9yeSwgdmFsaWRhdGluZyB0aGUgY3VycmVudCBwb3NpdGlvbiwgcGFyZW50IG5vZGUsIGFuZCBuYW1lLiBJdCBsb29rcyBsaWtlIHRoZSByYnRyZWUgd2FsayBsb2dpYyBpcyB1cGRhdGVkIGhlcmUgdXNpbmcgYGtlcm5mc19uYW1lX2NvbXBhcmVgLiBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgdGhlbiBidWlsZHMgb24gdGhpcywgYWR2YW5jaW5nIHRoZSBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiBga2VybmZzX2Rpcl9wb3NgLiBDcnVjaWFsbHksIGBrZXJuZnNfZm9wX3JlYWRkaXJgIHNlZW1zIHRvIGJlIHRoZSBtYWluIHJlYWRkaXIgZW50cnkgcG9pbnQgZm9yIGtlcm5mcyBtb3VudHMuIFRoZXJlJ3MgbWVtb3J5IGFsbG9jYXRpb24gdXNpbmcgYGttYWxsb2NgIGhlcmUsIGNvdXBsZWQgd2l0aCBzdHJpbmcgY29weWluZyB1c2luZyBgc3Ryc2NweWAsIHdoaWNoIGFsd2F5cyBtYWtlcyBtZSBjYXV0aW91cy4gVGhlIG1vc3QgaW50ZXJlc3RpbmcgYXNwZWN0IGlzIHRoZSBsb2NraW5nIG1lY2hhbmlzbSwgd2hlcmUgYGtlcm5mc19yd3NlbWAgaXMgdW5sb2NrZWQgKmFyb3VuZCogYGRpcl9lbWl0YCBhbmQgdGhlbiByZS1hY3F1aXJlZC4gVGhhdCdzIGEgY2xhc3NpYyBhcmVhIHRvIGxvb2sgZm9yIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3Igb3RoZXIgaXNzdWVzLiBQbHVzLCB0aGVyZSdzIGEgbmV3IGBXQVJOX09OX09OQ0VgIGNoZWNrLlxuXG5UaGlzIGRpcmVjdGx5IGFmZmVjdHMgaG93IGBnZXRkZW50c2AgLyBgcmVhZGRpcmAgd29ya3Mgb24gYGtlcm5mc2AgbW91bnRzIGxpa2UgYHN5c2ZzYCwgYGNncm91cGZzYCwgYW5kIGByZXNjdHJsYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIGFyZSB0aGVyZSBhbnkgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBvcHRpb25zPyBMZXQncyBjaGVjazogYEtFUk5GU2AgYW5kIGBTWVNGU2AuIFllcCwgYENPTkZJR19LRVJORlNgIGlzIHNlbGVjdGVkIGJ5IGBDT05GSUdfU1lTRlNgLCB3aGljaCBpcyBzdGFuZGFyZCBvbiBhbWQ2NCwgbWVhbmluZyB0aGF0IHRoaXMgd2lsbCBsaWtlbHkgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdC5cblxuTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBga2VybmZzX2ZvcF9yZWFkZGlyYCBpcyBhIGdvb2QgRm9jdXNTeW1ib2wuIFllcywgaXQncyB0aGUgY29yZSBlbnRyeSBwb2ludCBmb3IgcmVhZGRpciBvbiBrZXJuZnMuIFRoZSBvdGhlciBmdW5jdGlvbnMgYXJlIGhlbHBlcnMgdGhhdCBpbXBsZW1lbnQgdGhlIHJlc3VtZSBsb2dpYy4gVGhleSdyZSBhbGwgaW4gYGZzL2tlcm5mcy9kaXIuY2AsIHdoaWNoIG1ha2VzIGl0IGVhc3kgdG8gdW5kZXJzdGFuZCB0aGUgc2NvcGUuXG5cbkFyZSB0aGVyZSBvdGhlciBzeW1ib2xzIHRoYXQgYXJlIGxpa2VseSB0byBiZSBhZmZlY3RlZD8gTm8uXG5cbkFscmlnaHQsIGxldCdzIGRvdWJsZS1jaGVjayB0aGUgZnV6emluZyBpbnN0cnVjdGlvbnM6IGl0IGxvb2tzIGxpa2UgdGhpcyB3YXJyYW50cyBmdXp6aW5nIGJlY2F1c2UgaXQgbW9kaWZpZXMga2VybmZzIGRpcmVjdG9yeSBpdGVyYXRpb24gYW5kIHJlc3VtZSBsb2dpYywgaW52b2x2ZXMgdW5sb2NraW5nIGBrZXJuZnNfcndzZW1gIGFjcm9zcyBgZGlyX2VtaXRgLCBtZW1vcnkgYWxsb2NhdGlvbiwgYW5kIGNvbnRhaW5zIGEgbmV3IGBXQVJOX09OX09OQ0VgIGFzc2VydGlvbi4gRW5hYmxlQ29uZmlncyBhcmUgW1wiS0VSTkZTXCIsIFwiU1lTRlNcIl0uIFRoZSBGb2N1c1N5bWJvbHMgYXJlIFtcImtlcm5mc19mb3BfcmVhZGRpclwiLCBcImtlcm5mc19kaXJfcG9zXCIsIFwia2VybmZzX2Rpcl9uZXh0X3Bvc1wiXS5cblxuRXZlcnl0aGluZyBzZWVtcyBjbGVhciwgd2VsbC1yZWFzb25lZCwgYW5kIGZvY3VzZWQuIEknbSBjb25maWRlbnQgaW4gdGhpcyBhc3Nlc3NtZW50LiBJdCdzIHRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzEwMiwiT3V0cHV0VG9rZW5zIjoyMTAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzI6MzEuMDg2MjMwMDkyWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODEyMTcyNzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktFUk5GU1wiLFxuICAgIFwiU1lTRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrZXJuZnNfZm9wX3JlYWRkaXJcIixcbiAgICBcImtlcm5mc19kaXJfcG9zXCIsXG4gICAgXCJrZXJuZnNfZGlyX25leHRfcG9zXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMga2VybmZzIGRpcmVjdG9yeSBsaXN0aW5nIChyZWFkZGlyIC8gZ2V0ZGVudHMpIGFuZCByZXN1bWUgdHJhdmVyc2FsIGxvZ2ljIGluIGZzL2tlcm5mcy9kaXIuYy4gU3BlY2lmaWNhbGx5LCBpdCB1cGRhdGVzIGtlcm5mc19kaXJfcG9zIGFuZCBrZXJuZnNfZGlyX25leHRfcG9zIHRvIHJlc3VtZSByZWFkZGlyIGJhc2VkIG9uIGVudHJ5IG5hbWUgY29tcGFyaXNvbiB3aXRoaW4gdGhlIHJiLXRyZWUsIGFkZHMgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIHJlc3VtZSBrZXkgbmFtZSwgaW50cm9kdWNlcyBhIFdBUk5fT05fT05DRSBjaGVjayBvbiBuYW1lIHRydW5jYXRpb24sIGFuZCByZWxlYXNlcy9yZWFjcXVpcmVzIHJvb3QtXFx1MDAzZWtlcm5mc19yd3NlbSBhcm91bmQgZGlyX2VtaXQoKS4gVGhlc2UgY2hhbmdlcyB0b3VjaCByZWFjaGFibGUgY29yZSB2aXJ0dWFsIGZpbGVzeXN0ZW0gY29kZSBleGVyY2lzZWQgYnkgdXNlciBzcGFjZSB2aWEgZ2V0ZGVudHMvZ2V0ZGVudHM2NCBvbiBzeXNmcyBhbmQgY2dyb3VwcywgaW50cm9kdWNpbmcgY29uY3VycmVuY3kgd2luZG93cyBhbmQgbW9kaWZpZWQgbG9ja2luZyBzZW1hbnRpY3MuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiS0VSTkZTXCIsXG4gICAgXCJTWVNGU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImtlcm5mc19mb3BfcmVhZGRpclwiLFxuICAgIFwia2VybmZzX2Rpcl9wb3NcIixcbiAgICBcImtlcm5mc19kaXJfbmV4dF9wb3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBrZXJuZnMgZGlyZWN0b3J5IGxpc3RpbmcgKHJlYWRkaXIgLyBnZXRkZW50cykgYW5kIHJlc3VtZSB0cmF2ZXJzYWwgbG9naWMgaW4gZnMva2VybmZzL2Rpci5jLiBTcGVjaWZpY2FsbHksIGl0IHVwZGF0ZXMga2VybmZzX2Rpcl9wb3MgYW5kIGtlcm5mc19kaXJfbmV4dF9wb3MgdG8gcmVzdW1lIHJlYWRkaXIgYmFzZWQgb24gZW50cnkgbmFtZSBjb21wYXJpc29uIHdpdGhpbiB0aGUgcmItdHJlZSwgYWRkcyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgcmVzdW1lIGtleSBuYW1lLCBpbnRyb2R1Y2VzIGEgV0FSTl9PTl9PTkNFIGNoZWNrIG9uIG5hbWUgdHJ1bmNhdGlvbiwgYW5kIHJlbGVhc2VzL3JlYWNxdWlyZXMgcm9vdC1cXHUwMDNla2VybmZzX3J3c2VtIGFyb3VuZCBkaXJfZW1pdCgpLiBUaGVzZSBjaGFuZ2VzIHRvdWNoIHJlYWNoYWJsZSBjb3JlIHZpcnR1YWwgZmlsZXN5c3RlbSBjb2RlIGV4ZXJjaXNlZCBieSB1c2VyIHNwYWNlIHZpYSBnZXRkZW50cy9nZXRkZW50czY0IG9uIHN5c2ZzIGFuZCBjZ3JvdXBzLCBpbnRyb2R1Y2luZyBjb25jdXJyZW5jeSB3aW5kb3dzIGFuZCBtb2RpZmllZCBsb2NraW5nIHNlbWFudGljcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzI6MzEuMTY3NDU3MjFaIiwiU2VxIjoxOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MTQwNjY1NzUwNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjMxLjE2ODExOTY3WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTUxNDA1OTkxMzI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIGtlcm5mcyBkaXJlY3RvcnkgaXRlcmF0aW9uIChga2VybmZzX2ZvcF9yZWFkZGlyYCkgdG8gcHJvcGVybHkgaGFuZGxlIHJlYWRkaXIgcmVzdW1wdGlvbiB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgb3IgcmVuYW1lZCBjb25jdXJyZW50bHksIGJ5IGtleWluZyBwb3NpdGlvbiBvbiB0aGUgbm9kZSBuYW1lIGluIGFkZGl0aW9uIHRvIGl0cyBoYXNoIGFuZCBkcm9wcGluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0KClgLlxcblxcbi0gTWVtb3J5IGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uOiBBIHRlbXBvcmFyeSBidWZmZXIgYG5hbWVgIGlzIGFsbG9jYXRlZCB2aWEgYGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpYC4gQmVmb3JlIGFueSByZWFkLCBpdCBpcyBwb3B1bGF0ZWQgdXNpbmcgYHN0cnNjcHkobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcyksIFBBVEhfTUFYKWAuIFRoZSBzdHJpbmcgY29tcGFyaXNvbiBmdW5jdGlvbnMgKGBzdHJjbXBgKSBhbmQgYGRpcl9lbWl0KClgIG9ubHkgYWNjZXNzIHRoZSBwb3B1bGF0ZWQsIE5VTC10ZXJtaW5hdGVkIHByZWZpeCBvZiBsZW5ndGggYGxlbmAuIE5vIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBidWZmZXIgYXJlIHJlYWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS5cXG4tIExvY2FsIHZhcmlhYmxlczogVGhlIHN0YWNrIHZhcmlhYmxlIGBib29sIHJlc3VtZWRgIHBhc3NlZCB0byBga2VybmZzX2Rpcl9wb3MoKWAgaXMgdW5jb25kaXRpb25hbGx5IGluaXRpYWxpemVkIHRvIGBmYWxzZWAgdXBvbiBlbnRyeSB0byBga2VybmZzX2Rpcl9wb3MoKWAuXFxuLSBQcmltYXJ5IHJpc2tzOiBUaGUgcGF0Y2ggbW9kaWZpZXMgbG9ja2luZyBiZWhhdmlvciAoZHJvcHBpbmcgYW5kIHJlLWFjcXVpcmluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0YCkgYW5kIG5vZGUgcmVmY291bnRpbmcvdmFsaWRhdGlvbi4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb3RlbnRpYWwgY29uY3VycmVuY3kgcmFjZXMsIGxvY2sgaW52ZXJzaW9uLCBhbmQgbGlmZXRpbWUvdXNlLWFmdGVyLWZyZWUgYnVncywgd2hpY2ggYXJlIGZ1bGx5IGNvdmVyZWQgYnkgTE9DS0RFUCBhbmQgS0FTQU4uXFxuXFxuQmVjYXVzZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIGJlIHVuaXF1ZWx5IGRldGVjdGVkIGJ5IEtNU0FOLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGU1NTgwMjBlYWJhNjA1ZjYwODE3ZDU0ZDQ5NzFlY2RmMWNiNDUxZjBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAxODozMTo0MSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9kaXIuYyBiL2ZzL2tlcm5mcy9kaXIuY1xuaW5kZXggMDdhYmY1OWYwMjY0YS4uY2M2Mjg4ZDViNGNjNCAxMDA2NDRcbi0tLSBhL2ZzL2tlcm5mcy9kaXIuY1xuKysrIGIvZnMva2VybmZzL2Rpci5jXG5AQCAtMTkwMywzMyArMTkwMyw0OSBAQCBzdGF0aWMgaW50IGtlcm5mc19kaXJfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rLypcbisgKiBGaW5kIHdoZXJlIGEgbGlzdGluZyBsZWZ0IG9mZi4gIEByZXN1bWVkIHNheXMgd2hldGhlciBAcG9zIGlzIHN0aWxsIHRoYXRcbisgKiBlbnRyeTsgaWYgbm90LCB0aGUgc2VhcmNoIGZhbGxzIGJhY2sgdG8gQGhhc2gsIGtleWVkIGJ5IEBuYW1lIGlmIGdpdmVuLlxuKyAqL1xuIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcylcbitcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXG4rXHRjb25zdCBjaGFyICpuYW1lLCBib29sICpyZXN1bWVkKVxuIHtcbitcdGlmIChyZXN1bWVkKVxuK1x0XHQqcmVzdW1lZCA9IGZhbHNlO1xuIFx0aWYgKHBvcykge1xuK1x0XHQvKlxuK1x0XHQgKiBBIHJlbmFtZSBrZWVwcyB0aGUgaGFzaCBpZiB0aGUgbmV3IG5hbWUgaGFzaGVzIHRoZSBzYW1lLCBzb1xuK1x0XHQgKiBjaGVjayBAbmFtZSB0b28uICBPdGhlcndpc2UgdGhlIGNhbGxlciB3b3VsZCBzdGVwIG92ZXIgdGhlXG4rXHRcdCAqIGVudHJ5IG5vdyBzaXR0aW5nIHdoZXJlIEBwb3MgdXNlZCB0byBiZS5cbitcdFx0ICovXG4gXHRcdGludCB2YWxpZCA9IGtlcm5mc19hY3RpdmUocG9zKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHRyY3VfYWNjZXNzX3BvaW50ZXIocG9zLVx1MDAzZV9fcGFyZW50KSA9PSBwYXJlbnQgXHUwMDI2XHUwMDI2XG4tXHRcdFx0aGFzaCA9PSBwb3MtXHUwMDNlaGFzaDtcbitcdFx0XHRoYXNoID09IHBvcy1cdTAwM2VoYXNoIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCghbmFtZSB8fCAhc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpKSk7XG4gXHRcdGtlcm5mc19wdXQocG9zKTtcbiBcdFx0aWYgKCF2YWxpZClcbiBcdFx0XHRwb3MgPSBOVUxMO1xuK1x0XHRlbHNlIGlmIChyZXN1bWVkKVxuK1x0XHRcdCpyZXN1bWVkID0gdHJ1ZTtcbiBcdH1cbiBcdGlmICghcG9zIFx1MDAyNlx1MDAyNiAoaGFzaCBcdTAwM2UgMSkgXHUwMDI2XHUwMDI2IChoYXNoIFx1MDAzYyBJTlRfTUFYKSkge1xuIFx0XHRzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHBhcmVudC1cdTAwM2VkaXIuY2hpbGRyZW4ucmJfbm9kZTtcbi1cdFx0dTY0IG5zX2lkID0ga2VybmZzX25zX2lkKG5zKTtcbitcbitcdFx0LypcbitcdFx0ICogS2VlcCBhIG5vZGUgb25seSBvbiB0aGUgd2F5IGxlZnQsIHNvIHRoZSBzZWFyY2ggZW5kcyBvbiB0aGVcbitcdFx0ICogZmlyc3QgZW50cnkgYWZ0ZXIgdGhlIGtleS4gIEFuIGVtcHR5IEBuYW1lIHNvcnRzIGJlZm9yZSBhbGxcbitcdFx0ICogZW50cmllcyBzaGFyaW5nIHRoZSBoYXNoLCBzbyBpdCBsYW5kcyBvbiB0aGUgZmlyc3Qgb2YgdGhlbS5cbitcdFx0ICovXG4gXHRcdHdoaWxlIChub2RlKSB7XG4tXHRcdFx0cG9zID0gcmJfdG9fa24obm9kZSk7XG4rXHRcdFx0c3RydWN0IGtlcm5mc19ub2RlICprbiA9IHJiX3RvX2tuKG5vZGUpO1xuIFxuLVx0XHRcdGlmIChoYXNoIFx1MDAzYyBwb3MtXHUwMDNlaGFzaClcbi1cdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4tXHRcdFx0ZWxzZSBpZiAoaGFzaCBcdTAwM2UgcG9zLVx1MDAzZWhhc2gpXG4tXHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9yaWdodDtcbi1cdFx0XHRlbHNlIGlmIChuc19pZCBcdTAwM2Mga2VybmZzX25zX2lkKHBvcy1cdTAwM2VucykpXG4rXHRcdFx0aWYgKGtlcm5mc19uYW1lX2NvbXBhcmUoaGFzaCwgbmFtZSA/OiBcIlwiLCBucywga24pIFx1MDAzYyAwKSB7XG4rXHRcdFx0XHRwb3MgPSBrbjtcbiBcdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4tXHRcdFx0ZWxzZSBpZiAobnNfaWQgXHUwMDNlIGtlcm5mc19uc19pZChwb3MtXHUwMDNlbnMpKVxuK1x0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9yaWdodDtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRicmVhaztcbitcdFx0XHR9XG4gXHRcdH1cbiBcdH1cbiBcdC8qIFNraXAgb3ZlciBlbnRyaWVzIHdoaWNoIGFyZSBkeWluZy9kZWFkIG9yIGluIHRoZSB3cm9uZyBuYW1lc3BhY2UgKi9cbkBAIC0xOTQ1LDEwICsxOTYxLDE0IEBAIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGlub190IGlubywgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpXG4rXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxuK1x0Y29uc3QgY2hhciAqbmFtZSlcbiB7XG4tXHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBpbm8sIHBvcyk7XG4tXHRpZiAocG9zKSB7XG4rXHRib29sIHJlc3VtZWQ7XG4rXG4rXHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIG5hbWUsIFx1MDAyNnJlc3VtZWQpO1xuK1x0LyogU3RlcCBvdmVyIEBwb3Mgb25seSBpZiBpdCBzdXJ2aXZlZDsgQG5hbWUgZmluZHMgdGhlIHNwb3QgaWYgbm90LiAqL1xuK1x0aWYgKHBvcyBcdTAwMjZcdTAwMjYgcmVzdW1lZCkge1xuIFx0XHRkbyB7XG4gXHRcdFx0c3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KFx1MDAyNnBvcy1cdTAwM2VyYik7XG4gXHRcdFx0aWYgKCFub2RlKVxuQEAgLTE5NjYsMzQgKzE5ODYsNTUgQEAgc3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuIFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS1cdTAwM2VmX3BhdGguZGVudHJ5O1xuIFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTtcbiBcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4rXHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuIFx0c3RydWN0IGtlcm5mc19yb290ICpyb290O1xuIFx0Y29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMO1xuIFxuIFx0aWYgKCFkaXJfZW1pdF9kb3RzKGZpbGUsIGN0eCkpXG4gXHRcdHJldHVybiAwO1xuIFxuK1x0LypcbitcdCAqIE9uZSBidWZmZXIgZm9yIHRoZSBjYWxsLCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGUgbGlzdGluZ1xuK1x0ICogaXMgb24uICBQQVRIX01BWDoga2VybmZzIGJvdW5kcyBubyBzaW5nbGUgbmFtZS5cbitcdCAqL1xuK1x0bmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpO1xuK1x0aWYgKCFuYW1lKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbiBcdHJvb3QgPSBrZXJuZnNfcm9vdChwYXJlbnQpO1xuIFx0ZG93bl9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbiBcbiBcdGlmIChrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpKVxuIFx0XHRucyA9IGtlcm5mc19pbmZvKGRlbnRyeS1cdTAwM2VkX3NiKS1cdTAwM2VucztcbiBcbi1cdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zKTtcbitcdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBOVUxMLCBOVUxMKTtcbiBcdCAgICAgcG9zO1xuLVx0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcykpIHtcbi1cdFx0Y29uc3QgY2hhciAqbmFtZSA9IGtlcm5mc19yY3VfbmFtZShwb3MpO1xuK1x0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcywgbmFtZSkpIHtcbiBcdFx0dW5zaWduZWQgaW50IHR5cGUgPSBmc191bW9kZV90b19kdHlwZShwb3MtXHUwMDNlbW9kZSk7XG4tXHRcdGludCBsZW4gPSBzdHJsZW4obmFtZSk7XG4gXHRcdGlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTtcbitcdFx0aW50IGxlbjtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIGNvcHkgaXMgYWxzbyB0aGUgcmVzdW1lIGtleSwgc28gYSB0cnVuY2F0ZWQgbmFtZSB3b3VsZFxuK1x0XHQgKiByZXN1bWUgaGVyZSBhZ2Fpbi4gIGdldG5hbWUoKSBjYXBzIGEgcGF0aCwgc28gb25seSBhblxuK1x0XHQgKiBpbi1rZXJuZWwgY2FsbGVyIGNhbiBnZXQgaGVyZTsgZW5kIHRoZSBsaXN0aW5nIGluc3RlYWQuXG4rXHRcdCAqL1xuK1x0XHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XG4rXHRcdGlmIChXQVJOX09OX09OQ0UobGVuIFx1MDAzYyAwKSlcbitcdFx0XHRicmVhaztcbiBcbiBcdFx0Y3R4LVx1MDAzZXBvcyA9IHBvcy1cdTAwM2VoYXNoO1xuIFx0XHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IHBvcztcbiBcdFx0a2VybmZzX2dldChwb3MpO1xuIFxuLVx0XHRpZiAoIWRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpKSB7XG4tXHRcdFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4rXHRcdC8qXG4rXHRcdCAqIGRpcl9lbWl0KCkgY2FuIGZhdWx0LCBzbyBydW4gaXQgdW5sb2NrZWQuICBAcG9zIGlzIHBpbm5lZFxuK1x0XHQgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suXG4rXHRcdCAqL1xuK1x0XHR1cF9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbitcdFx0aWYgKCFkaXJfZW1pdChjdHgsIG5hbWUsIGxlbiwgaW5vLCB0eXBlKSlcbiBcdFx0XHRyZXR1cm4gMDtcbi1cdFx0fVxuK1x0XHRkb3duX3JlYWQoXHUwMDI2cm9vdC1cdTAwM2VrZXJuZnNfcndzZW0pO1xuIFx0fVxuIFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4gXHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IE5VTEw7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmNcbmluZGV4IDZlNzRkYTkxZWJjYTUuLjAxY2Q1OGU1ZTQxZTcgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG5AQCAtOCw2ICs4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9pZi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc2NoZWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbkBAIC0xNyw2ICsxOCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3lzL21vdW50LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N5c2NhbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy94YXR0ci5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCJrc2VsZnRlc3RfaGFybmVzcy5oXCJcbkBAIC00NzIsNiArNDc0LDIwNCBAQCBURVNUX0Yoa2VybmZzX2Nncm91cCwgcmVhZGRpcl9ub19kdXBsaWNhdGVzKVxuIFx0XHRcdEVYUEVDVF9TVFJORShuYW1lc1tpXSwgbmFtZXNbal0pO1xuIH1cbiBcbisjZGVmaW5lIFJFU1VNRV9ESVJTXHQyNFxuK1xuKy8qXG4rICogUmVzdW1pbmcgYXQgYW4gZW50cnkgdGhhdCBoYXMgZ29uZSBtdXN0IGNhcnJ5IG9uIGFmdGVyIGl0LCBuZXZlciBiZWZvcmUuXG4rICogVGFrZSBhIGNvb2tpZSBmb3IgZXZlcnkgZW50cnksIHRoZW4gcmVtb3ZlIGVhY2ggb25lLCBzZWVrIHRvIGl0cyBjb29raWVcbisgKiBhbmQgcmVhZCB0aGUgcmVzdDsgbm90aGluZyBhbHJlYWR5IHJlcG9ydGVkIG1heSBjb21lIGJhY2suXG4rICovXG4rVEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX2F0X3JlbW92ZWRfZW50cnkpXG4re1xuK1x0LyogVGhlIGNncm91cCdzIG93biBjb250cm9sIGZpbGVzIGFyZSBsaXN0ZWQgYWxvbmdzaWRlIG91cnMuICovXG4rXHRjaGFyIG5hbWVzWzEyOF1bTkFNRV9NQVggKyAxXTtcbitcdGxvbmcgcG9zWzEyOF07XG4rXHRjaGFyIHBhdGhbUEFUSF9NQVhdO1xuK1x0c3RydWN0IGRpcmVudCAqZGU7XG4rXHRpbnQgbiA9IDAsIGksIGo7XG4rXHRESVIgKmQ7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRVNVTUVfRElSUzsgaSsrKSB7XG4rXHRcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCIlcy9lJTAyZFwiLCBzZWxmLVx1MDAzZXNjcmF0Y2gsIGkpO1xuK1x0XHRBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApO1xuK1x0fVxuK1xuK1x0LyogUmVjb3JkIHRoZSBjb29raWUgYmVmb3JlIHJlYWRpbmcgZWFjaCBlbnRyeSwgd2l0aCBpdHMgbmFtZS4gKi9cbitcdGQgPSBvcGVuZGlyKHNlbGYtXHUwMDNlc2NyYXRjaCk7XG4rXHRBU1NFUlRfTkUoZCwgTlVMTCk7XG4rXHR3aGlsZSAoMSkge1xuK1x0XHRsb25nIGhlcmUgPSB0ZWxsZGlyKGQpO1xuK1xuK1x0XHRkZSA9IHJlYWRkaXIoZCk7XG4rXHRcdGlmICghZGUpXG4rXHRcdFx0YnJlYWs7XG4rXHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuXCIpIHx8ICFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi4uXCIpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRBU1NFUlRfTFQobiwgKGludClBUlJBWV9TSVpFKHBvcykpO1xuK1x0XHRwb3Nbbl0gPSBoZXJlO1xuK1x0XHRzdHJuY3B5KG5hbWVzW25dLCBkZS1cdTAwM2VkX25hbWUsIE5BTUVfTUFYKTtcbitcdFx0bmFtZXNbbl1bTkFNRV9NQVhdID0gJ1xcMCc7XG4rXHRcdG4rKztcbitcdH1cbitcdGNsb3NlZGlyKGQpO1xuK1x0QVNTRVJUX0dUKG4sIDEpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKSB7XG4rXHRcdC8qIE9ubHkgdGhlIGRpcmVjdG9yaWVzIHdlIG1hZGUgY2FuIGJlIHJlbW92ZWQgYW5kIHB1dCBiYWNrLiAqL1xuK1x0XHRpZiAoc3RybmNtcChuYW1lc1tpXSwgXCJlXCIsIDEpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwiJXMvJXNcIiwgc2VsZi1cdTAwM2VzY3JhdGNoLCBuYW1lc1tpXSk7XG4rXHRcdEFTU0VSVF9FUShybWRpcihwYXRoKSwgMCk7XG4rXG4rXHRcdC8qIFJlb3BlbiBzbyB0aGUgc2VlayBoYXMgdG8gcmVhY2ggdGhlIGtlcm5lbC4gKi9cbitcdFx0ZCA9IG9wZW5kaXIoc2VsZi1cdTAwM2VzY3JhdGNoKTtcbitcdFx0QVNTRVJUX05FKGQsIE5VTEwpO1xuK1x0XHRzZWVrZGlyKGQsIHBvc1tpXSk7XG4rXHRcdHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkge1xuK1x0XHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuXCIpIHx8ICFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi4uXCIpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgaTsgaisrKVxuK1x0XHRcdFx0QVNTRVJUX1NUUk5FKGRlLVx1MDAzZWRfbmFtZSwgbmFtZXNbal0pXG4rXHRcdFx0XHRcdFRIX0xPRyhcInJlc3VtaW5nIGF0ICVzIChnb25lKSB3ZW50IGJhY2sgdG8gJXNcIixcbitcdFx0XHRcdFx0ICAgICAgIG5hbWVzW2ldLCBuYW1lc1tqXSk7XG4rXHRcdH1cbitcdFx0Y2xvc2VkaXIoZCk7XG4rXG4rXHRcdEFTU0VSVF9FUShta2RpcihwYXRoLCAwNzU1KSwgMCk7XG4rXHR9XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRVNVTUVfRElSUzsgaSsrKSB7XG4rXHRcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCIlcy9lJTAyZFwiLCBzZWxmLVx1MDAzZXNjcmF0Y2gsIGkpO1xuK1x0XHRFWFBFQ1RfRVEocm1kaXIocGF0aCksIDApO1xuK1x0fVxuK31cbitcbisjZGVmaW5lIENIVVJOX1JPVU5EU1x0NDAwXG4rI2RlZmluZSBDSFVSTl9CVUZTWlx0NTEyXHQvKiBzbWFsbCwgc28gYSBsaXN0aW5nIHRha2VzIHNldmVyYWwgY2FsbHMgKi9cbitcbisvKlxuKyAqIFRoZSBmaWxlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZW5hYmxpbmcgd3JpdGUgYW5kIGdvIGF0IHRoZSBzdGFydCBvZlxuKyAqIHRoZSBkaXNhYmxpbmcgb25lLCBzbyB0aGUgd2luZG93IHdoZXJlIHRoZXkgZXhpc3QgaXMgdGhlIHNob3J0IG9uZS5cbisgKi9cbisjZGVmaW5lIENIVVJOX0RXRUxMX09OXHQyMDAwXG4rI2RlZmluZSBDSFVSTl9EV0VMTF9PRkZcdDIwMFxuK1xuK3N0cnVjdCBrZXJuZnNfZGlyZW50NjQge1xuK1x0dW5zaWduZWQgbG9uZyBsb25nXHRkX2lubztcbitcdGxvbmcgbG9uZ1x0XHRkX29mZjtcbitcdHVuc2lnbmVkIHNob3J0XHRcdGRfcmVjbGVuO1xuK1x0dW5zaWduZWQgY2hhclx0XHRkX3R5cGU7XG4rXHRjaGFyXHRcdFx0ZF9uYW1lW107XG4rfTtcbitcbisvKlxuKyAqIFRoZSBzYW1lIHJlc3VtZSwgYnV0IGluc2lkZSBvbmUgZ2V0ZGVudHMoMikgY2FsbC4gIHJtZGlyKDIpIGNhbm5vdCByZWFjaFxuKyAqIHRoYXQgd2luZG93IGJlY2F1c2UgaXRlcmF0ZV9kaXIoKSBob2xkcyB0aGUgbGlzdGVkIGRpcmVjdG9yeSdzIGlfcndzZW1cbisgKiBmb3IgdGhlIHdob2xlIGxpc3Rpbmc7IGNncm91cC5zdWJ0cmVlX2NvbnRyb2wgY2FuLCBoYXZpbmcgbm8gVkZTXG4rICogb3BlcmF0aW9uIG9uIHRoZSBuYW1lcyBpdCBhZGRzIGFuZCByZW1vdmVzLiAgVGhlIGZpbGVzIHRoYXQgYXJlIG5vdCB0aGVcbisgKiBjb250cm9sbGVyJ3Mgc3RheSB0aHJvdWdob3V0LCBzbyBlYWNoIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS5cbisgKlxuKyAqIEEgc3RyZXNzIHRlc3Q6IGl0IGhhcyBub3QgYmVlbiBzZWVuIHRvIGNhdGNoIHRoZSBvcmRlcmluZyBidWcsIGFuZCBpc1xuKyAqIGhlcmUgdG8ga2VlcCB0aGUgdW5sb2NrZWQgd2luZG93IHVuZGVyIGxvYWQgZm9yIGxvY2tkZXAgYW5kIEtBU0FOLlxuKyAqL1xuK1RFU1RfRihrZXJuZnNfY2dyb3VwLCByZWFkZGlyX3Jlc3VtZV92c19pbnRlcm5hbF9yZW1vdmUpXG4re1xuK1x0Y2hhciBidWZbQ0hVUk5fQlVGU1pdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcbitcdGNoYXIgc3RhYmxlWzEyOF1bTkFNRV9NQVggKyAxXTtcbitcdGludCBuc3RhYmxlID0gMCwgaSwgcjtcbitcdGludCB3aXRoY3RsID0gMCwgd2l0aG91dCA9IDA7XG4rXHRpbnQgc2VlblsxMjhdLCBzdGF0dXM7XG4rXHRwaWRfdCBjaHVybmVyO1xuK1x0RElSICpkO1xuK1xuK1x0LyogV2l0aCB0aGUgY29udHJvbGxlciBvZmYsIHdoYXRldmVyIGlzIGxlZnQgaXMgd2hhdCBtdXN0IHBlcnNpc3QuICovXG4rXHRBU1NFUlRfRVEod3JpdGVfZmlsZShzZWxmLVx1MDAzZXNjcmF0Y2hfc2MsIHNlbGYtXHUwMDNlZGlzYWJsZSksIDApO1xuK1x0ZCA9IG9wZW5kaXIoc2VsZi1cdTAwM2VjaGlsZCk7XG4rXHRBU1NFUlRfTkUoZCwgTlVMTCk7XG4rXHRmb3IgKDs7KSB7XG4rXHRcdHN0cnVjdCBkaXJlbnQgKmRlID0gcmVhZGRpcihkKTtcbitcbitcdFx0aWYgKCFkZSlcbitcdFx0XHRicmVhaztcbitcdFx0aWYgKCFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi5cIikgfHwgIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIFwiLi5cIikpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdEFTU0VSVF9MVChuc3RhYmxlLCAoaW50KUFSUkFZX1NJWkUoc3RhYmxlKSk7XG4rXHRcdHN0cm5jcHkoc3RhYmxlW25zdGFibGVdLCBkZS1cdTAwM2VkX25hbWUsIE5BTUVfTUFYKTtcbitcdFx0c3RhYmxlW25zdGFibGVdW05BTUVfTUFYXSA9ICdcXDAnO1xuK1x0XHRuc3RhYmxlKys7XG4rXHR9XG4rXHRjbG9zZWRpcihkKTtcbitcdEFTU0VSVF9HVChuc3RhYmxlLCAwKTtcbitcbitcdGNodXJuZXIgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UoY2h1cm5lciwgMCk7XG4rXHRpZiAoY2h1cm5lciA9PSAwKSB7XG4rXHRcdGZvciAoOzspIHtcbitcdFx0XHRpZiAod3JpdGVfZmlsZShzZWxmLVx1MDAzZXNjcmF0Y2hfc2MsIHNlbGYtXHUwMDNlZW5hYmxlKSlcbitcdFx0XHRcdF9leGl0KDEwKTtcbitcdFx0XHR1c2xlZXAoQ0hVUk5fRFdFTExfT04pO1xuK1x0XHRcdGlmICh3cml0ZV9maWxlKHNlbGYtXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cdTAwM2VkaXNhYmxlKSlcbitcdFx0XHRcdF9leGl0KDExKTtcbitcdFx0XHR1c2xlZXAoQ0hVUk5fRFdFTExfT0ZGKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0Zm9yIChyID0gMDsgciBcdTAwM2MgQ0hVUk5fUk9VTkRTOyByKyspIHtcbitcdFx0aW50IGZkID0gb3BlbihzZWxmLVx1MDAzZWNoaWxkLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKTtcbitcdFx0aW50IGV4dHJhID0gMDtcbitcdFx0aW50IG47XG4rXG4rXHRcdEFTU0VSVF9HRShmZCwgMCk7XG4rXHRcdG1lbXNldChzZWVuLCAwLCBzaXplb2Yoc2VlbikpO1xuK1xuK1x0XHR3aGlsZSAoKG4gPSBzeXNjYWxsKFNZU19nZXRkZW50czY0LCBmZCwgYnVmLCBzaXplb2YoYnVmKSkpIFx1MDAzZSAwKSB7XG4rXHRcdFx0aW50IG9mZiA9IDA7XG4rXG4rXHRcdFx0d2hpbGUgKG9mZiBcdTAwM2Mgbikge1xuK1x0XHRcdFx0c3RydWN0IGtlcm5mc19kaXJlbnQ2NCAqZGUgPSAodm9pZCAqKShidWYgKyBvZmYpO1xuK1x0XHRcdFx0Ym9vbCBrbm93biA9IGZhbHNlO1xuK1xuK1x0XHRcdFx0b2ZmICs9IGRlLVx1MDAzZWRfcmVjbGVuO1xuK1x0XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnN0YWJsZTsgaSsrKVxuK1x0XHRcdFx0XHRpZiAoIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIHN0YWJsZVtpXSkpIHtcbitcdFx0XHRcdFx0XHRzZWVuW2ldKys7XG4rXHRcdFx0XHRcdFx0a25vd24gPSB0cnVlO1xuK1x0XHRcdFx0XHR9XG4rXHRcdFx0XHRpZiAoIWtub3duIFx1MDAyNlx1MDAyNiBzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi5cIikgXHUwMDI2XHUwMDI2XG4rXHRcdFx0XHQgICAgc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuLlwiKSlcbitcdFx0XHRcdFx0ZXh0cmErKztcbitcdFx0XHR9XG4rXHRcdH1cbitcdFx0QVNTRVJUX0dFKG4sIDApO1xuK1x0XHRFWFBFQ1RfRVEoY2xvc2UoZmQpLCAwKTtcbitcbitcdFx0aWYgKGV4dHJhKVxuK1x0XHRcdHdpdGhjdGwrKztcbitcdFx0ZWxzZVxuK1x0XHRcdHdpdGhvdXQrKztcbitcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnN0YWJsZTsgaSsrKVxuK1x0XHRcdEFTU0VSVF9FUShzZWVuW2ldLCAxKVxuK1x0XHRcdFx0VEhfTE9HKFwicm91bmQgJWQ6ICVzIHNlZW4gJWQgdGltZXNcIixcbitcdFx0XHRcdCAgICAgICByLCBzdGFibGVbaV0sIHNlZW5baV0pO1xuK1x0fVxuK1xuK1x0LyogVGhlIGNodXJuIG11c3QgaGF2ZSBiZWVuIHJ1bm5pbmcsIG9yIHRoZSBsaXN0aW5ncyBwcm92ZSBub3RoaW5nLiAqL1xuK1x0RVhQRUNUX0VRKGtpbGwoY2h1cm5lciwgU0lHS0lMTCksIDApO1xuK1x0QVNTRVJUX0VRKHdhaXRwaWQoY2h1cm5lciwgXHUwMDI2c3RhdHVzLCAwKSwgY2h1cm5lcik7XG4rXHRBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpIFx1MDAyNlx1MDAyNiBXVEVSTVNJRyhzdGF0dXMpID09IFNJR0tJTEwpXG4rXHRcdFRIX0xPRyhcImNodXJuZXIgZXhpdGVkIG9uIGl0cyBvd246IHN0YXR1cyAlZFwiLCBzdGF0dXMpO1xuK1xuK1x0LypcbitcdCAqIFRoZXkgYWxzbyBoYXZlIHRvIGhhdmUgb3ZlcmxhcHBlZCBpdC4gIEhvdyBtdWNoIGRlcGVuZHMgb24gdGhlXG4rXHQgKiBtYWNoaW5lLCBzbyBzYXkgdGhlIHJhY2UgY291bGQgbm90IGJlIGFycmFuZ2VkIHJhdGhlciB0aGFuIGZhaWwuXG4rXHQgKi9cbitcdGlmICghd2l0aGN0bCB8fCAhd2l0aG91dClcbitcdFx0U0tJUChyZXR1cm4sIFwibGlzdGluZ3MgZGlkIG5vdCBzcGFuIHRoZSBjaHVybjogJWQgd2l0aCwgJWQgd2l0aG91dFwiLFxuK1x0XHQgICAgIHdpdGhjdGwsIHdpdGhvdXQpO1xuK31cbitcbiAvKlxuICAqIEEgdGVsbGRpcigpIGNvb2tpZSBtdXN0IHJlc29sdmUgYmFjayB0byB0aGUgc2FtZSBlbnRyeSBhZnRlciBzZWVrZGlyKCkuXG4gICoga2VybmZzIGVuY29kZXMgdGhlIGNvb2tpZSBhcyB0aGUgbm9kZSdzIG5hbWUgaGFzaCwgc28gdGhpcyBjb3ZlcnNcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjMxLjE2ODEyMDg1WiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMxNzI5ODIyOTE3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEZ1enppbmcgU2Vzc2lvbiBBc3Nlc3NtZW50KipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBvYmplY3RpdmUgaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBwYXRjaCBzZXJpZXMgd2FycmFudHMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiBUaGUgcnVsZSBpcyBjbGVhcjogS01TQU4gaXMgZXhwZW5zaXZlLCBhbmQgc2hvdWxkICpvbmx5KiBiZSBjb25zaWRlcmVkIGlmIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGFyZSAqZXhjbHVzaXZlbHkqIGRldGVjdGFibGUgYnkgS01TQU4uIElmIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgY2FuIGNhdGNoIGFuIGlzc3VlLCB3ZSBkb24ndCBuZWVkIEtNU0FOLlxuXG5GaXJzdCwgSSBleGFtaW5lZCB0aGUgcGF0Y2ggaW4gYGZzL2tlcm5mcy9kaXIuY2AuIEkgbm90aWNlZCB0aGlzIGxpbmU6IGBuYW1lID0ga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7YC4gIEFoYSEgYGttYWxsb2NgIHdpdGhvdXQgYGt6YWxsb2NgLi4udGhhdCdzIGEgcG90ZW50aWFsIHJlZCBmbGFnLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgYG5hbWVgIGNvdWxkIGJlIHVuaW5pdGlhbGl6ZWQuXG5cbk5vdywgSSBmb2xsb3dlZCB0aGUgY29kZSBmbG93LiAgYG5hbWVgIGlzIGFsbG9jYXRlZCwgYW5kIHRoZSBga2VybmZzX2Rpcl9wb3NgIGlzIGNhbGxlZC4gQ3JpdGljYWxseSwgZHVyaW5nIHRoZSAqZmlyc3QqIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB0aGF0IHByb2Nlc3NlcyB0aGUgZGlyZWN0b3J5IGVudHJpZXMsIGBuYW1lYCBpcywgYXQgdGhhdCBwb2ludCwgc3RpbGwgdW5pbml0aWFsaXplZC5cblxuVGhlbiwgaW5zaWRlIHRoZSBsb29wLCB0aGUgY3JpdGljYWwgbGluZSBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpO2AgY29tZXMgaW50byBwbGF5LiAqVGhpcyogaXMgd2hhdCBwb3B1bGF0ZXMgYG5hbWVgIHdpdGggYSBzdHJpbmcgZnJvbSBga2VybmZzX3JjdV9uYW1lKHBvcylgLiBDcnVjaWFsbHksIHRoaXMgY29waWVzIGFuZCBOVUwtdGVybWluYXRlcyB0aGUgc3RyaW5nLlxuXG5UaGUgbmV4dCBjb25jZXJuIHRoYXQgY2FtZSB0byBtaW5kIHdhcyB3aGV0aGVyIHRoZSBjb2RlIG1ha2VzIHVzZSBvZiB0aGUgd2hvbGUgYnVmZmVyIGFsbG9jYXRlZCBmb3IgYG5hbWVgLCBuYW1lbHkgd2hldGhlciBgbmFtZWAgaXMgcmVhZCBiZXlvbmQgYGxlbmAuICBTbywgSSBjaGVja2VkIHdoZXJlIGBuYW1lYCBpcyB1c2VkLCBhbmQgaW4gdGhpcyBjYXNlLCBgZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSk7YC4gXG5cbkF0IHRoaXMgcG9pbnQsIEkgd291bGQgbmVlZCB0byBhbmFseXplIGBkaXJfZW1pdGAgYW5kIHNlZSB3aGF0IGl0IGRvZXMgd2l0aCBgbmFtZWAgYW5kIGBsZW5gLlxuSG93ZXZlciwgSSBjYW4gY29uY2x1ZGUgc28gZmFyIHRoYXQgZ2l2ZW4gYG5hbWVgIGlzIHVuaW5pdGlhbGl6ZWQgYmVmb3JlIGBzdHJzY3B5YCBpcyBjYWxsZWQgaW5zaWRlIHRoZSBsb29wLCBidXQgaXMgKmluaXRpYWxpemVkKiBiZWZvcmUgYW55IHVzZSBiZXlvbmQgdGhhdCBwb2ludCwgaXQgZG9lcyBub3QganVzdGlmeSBhIEtNU0FOIHNlc3Npb24uIEtBU0FOL290aGVyIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgaGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NjM1NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzOTQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzowMi44OTc5NDc0NzhaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ5MDgzMjE1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJkaXJfZW1pdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL2xpbnV4L2ZzLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9mcy5oPTM1OTY9c3RhdGljIGlubGluZSBib29sIGlzX3Jvb3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmluY2x1ZGUvbGludXgvZnMuaC0zNjAwLVxcbmluY2x1ZGUvbGludXgvZnMuaDozNjAxOnN0YXRpYyBpbmxpbmUgYm9vbCBkaXJfZW1pdChzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCxcXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYwMi1cXHRcXHRcXHQgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYwOC19XFxuaW5jbHVkZS9saW51eC9mcy5oOjM2MDk6c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuaW5jbHVkZS9saW51eC9mcy5oLTM2MTAte1xcbi0tXFxuaW5jbHVkZS9saW51eC9mcy5oLTM2MTMtfVxcbmluY2x1ZGUvbGludXgvZnMuaDozNjE0OnN0YXRpYyBpbmxpbmUgYm9vbCBkaXJfZW1pdF9kb3Rkb3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbmluY2x1ZGUvbGludXgvZnMuaC0zNjE1LXtcXG4tLVxcbmluY2x1ZGUvbGludXgvZnMuaC0zNjE4LX1cXG5pbmNsdWRlL2xpbnV4L2ZzLmg6MzYxOTpzdGF0aWMgaW5saW5lIGJvb2wgZGlyX2VtaXRfZG90cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuaW5jbHVkZS9saW51eC9mcy5oLTM2MjAte1xcbmluY2x1ZGUvbGludXgvZnMuaC0zNjIxLVxcdGlmIChjdHgtXFx1MDAzZXBvcyA9PSAwKSB7XFxuaW5jbHVkZS9saW51eC9mcy5oOjM2MjI6XFx0XFx0aWYgKCFkaXJfZW1pdF9kb3QoZmlsZSwgY3R4KSlcXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYyMy1cXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYyNi1cXHRpZiAoY3R4LVxcdTAwM2Vwb3MgPT0gMSkge1xcbmluY2x1ZGUvbGludXgvZnMuaDozNjI3OlxcdFxcdGlmICghZGlyX2VtaXRfZG90ZG90KGZpbGUsIGN0eCkpXFxuaW5jbHVkZS9saW51eC9mcy5oLTM2MjgtXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzowMy4zODg4MDIxNTVaIiwiU2VxIjoyMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjM0NTU0Mjc3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIERpcmVjdG9yeSBFbWl0dGluZyBMb2dpYyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgZGlyZWN0b3J5IGVudHJpZXMuIExldCdzIHN0YXJ0IHdpdGggYGluY2x1ZGUvbGludXgvZnMuaGAuIFNwZWNpZmljYWxseSwgSSB0aGluayBgZGlyX2VtaXRgIGlzIGdvaW5nIHRvIGJlIGtleSB0byBob3cgdGhlc2UgZW50cmllcyBhcmUgY3JlYXRlZCBhbmQgcG9wdWxhdGVkLiBJJ20gZ29pbmcgdG8gbG9vayBhcm91bmQgbGluZSAzNjAxIGluIHRoYXQgZmlsZSBhbmQgemVybyBpbiBvbiB0aGUgYGRpcl9lbWl0YCBmdW5jdGlvbi4gSXQncyBsaWtlbHkgdGhhdCBpdCBob2xkcyB0aGUgY29yZSBsb2dpYyBmb3IgdGhlIHByb2Nlc3Mgb2YgXCJlbWl0dGluZ1wiIG9yIG91dHB1dHRpbmcgZGlyZWN0b3J5IGVudHJpZXMgZHVyaW5nIGRpcmVjdG9yeSB0cmF2ZXJzYWwgb3IgbGlzdGluZyBvcGVyYXRpb25zLiBJIGV4cGVjdCB0byBmaW5kIHRoZSBkZXRhaWxzIG9mIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIGhvdyBuYW1lcyBhcmUgaGFuZGxlZCwgYW5kIGhvdyB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIGludGVyYWN0cyB3aXRoIHRoZSBkaXJlY3RvcnkgY2FjaGUgb3Igb3RoZXIgc3RydWN0dXJlcy4gSG9wZWZ1bGx5LCBJJ2xsIHF1aWNrbHkgZ2V0IGEgZmVlbCBmb3IgaG93IHRoaXMgY3JpdGljYWwgY29tcG9uZW50IGZpdHMgaW50byB0aGUgYnJvYWRlciBmaWxlc3lzdGVtIGFyY2hpdGVjdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6OTY4MiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjA1LjczNDM0NzU0N1oiLCJTZXEiOjI0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjk2MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS9saW51eC9mcy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM2MDAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjM2MDA6XFx0XFxuMzYwMTpcXHRzdGF0aWMgaW5saW5lIGJvb2wgZGlyX2VtaXQoc3RydWN0IGRpcl9jb250ZXh0ICpjdHgsXFxuMzYwMjpcXHRcXHRcXHRcXHQgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sXFxuMzYwMzpcXHRcXHRcXHRcXHQgICAgdTY0IGlubywgdW5zaWduZWQgdHlwZSlcXG4zNjA0OlxcdHtcXG4zNjA1OlxcdFxcdHVuc2lnbmVkIGludCBkdF9tYXNrID0gU19EVF9NQVNLIHwgY3R4LVxcdTAwM2VkdF9mbGFnc19tYXNrO1xcbjM2MDY6XFx0XFxuMzYwNzpcXHRcXHRyZXR1cm4gY3R4LVxcdTAwM2VhY3RvcihjdHgsIG5hbWUsIG5hbWVsZW4sIGN0eC1cXHUwMDNlcG9zLCBpbm8sIHR5cGUgXFx1MDAyNiBkdF9tYXNrKTtcXG4zNjA4OlxcdH1cXG4zNjA5OlxcdHN0YXRpYyBpbmxpbmUgYm9vbCBkaXJfZW1pdF9kb3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbjM2MTA6XFx0e1xcbjM2MTE6XFx0XFx0cmV0dXJuIGN0eC1cXHUwMDNlYWN0b3IoY3R4LCBcXFwiLlxcXCIsIDEsIGN0eC1cXHUwMDNlcG9zLFxcbjM2MTI6XFx0XFx0XFx0XFx0ICBmaWxlLVxcdTAwM2VmX3BhdGguZGVudHJ5LVxcdTAwM2VkX2lub2RlLVxcdTAwM2VpX2lubywgRFRfRElSKTtcXG4zNjEzOlxcdH1cXG4zNjE0OlxcdHN0YXRpYyBpbmxpbmUgYm9vbCBkaXJfZW1pdF9kb3Rkb3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbjM2MTU6XFx0e1xcbjM2MTY6XFx0XFx0cmV0dXJuIGN0eC1cXHUwMDNlYWN0b3IoY3R4LCBcXFwiLi5cXFwiLCAyLCBjdHgtXFx1MDAzZXBvcyxcXG4zNjE3OlxcdFxcdFxcdFxcdCAgZF9wYXJlbnRfaW5vKGZpbGUtXFx1MDAzZWZfcGF0aC5kZW50cnkpLCBEVF9ESVIpO1xcbjM2MTg6XFx0fVxcbjM2MTk6XFx0c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdHMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzowNS43MzQ2MTkxMDdaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTEyMjc3MzU5NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBEaXJlY3RvcnkgSXRlcmF0aW9uIExvZ2ljKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBgZGlyX2VtaXRgIGlzIGNhbGxlZCB3aXRoIGBuYW1lYCBhbmQgYG5hbWVsZW5gLCBhbmQgSSBpbml0aWFsbHkgYXNzdW1lZCB0aGF0IGBuYW1lYCBoZWxkIGBsZW5gIGluaXRpYWxpemVkIGJ5dGVzIHBsdXMgYSBudWxsIHRlcm1pbmF0b3IuIEJ1dCBzb21ldGhpbmcgZmVlbHMgb2ZmIHdpdGggdGhlIGxvb3AuIFRoZSBjcnVjaWFsIHBvaW50IHNlZW1zIHRvIGJlIGhvdyB0aGUgYG5hbWVgIGFyZ3VtZW50IGlzIGhhbmRsZWQgYWNyb3NzIGl0ZXJhdGlvbnMuXG5cbkxvb2tpbmcgYXQgdGhlIGxvb3AncyBzdHJ1Y3R1cmUsIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgaXMgY2FsbGVkLiBJdCBsb29rcyBhdCB0aGUgYGtlcm5mc19kaXJfcG9zYCBmdW5jdGlvbi4gVGhhdCBmdW5jdGlvbiB0YWtlcyB0aGUgYG5hbWVgIGFyZ3VtZW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgYmVoYXZpb3IuXG5cbk15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHRoZSBwb3RlbnRpYWwgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzZSB3aXRoIHRoZSBgbmFtZWAgYXJndW1lbnQuIERpZ2dpbmcgaW50byBga2VybmZzX2Rpcl9wb3NgLCB0aGUgY29kZSBpbml0aWFsbHkgY2hlY2tzIGlmIGEgYHBvc2AgaXMgdmFsaWQgYW5kIGlmIGBzdHJjbXBgIHdpbGwgYmUgY2FsbGVkIHdpdGggYG5hbWVgLCB3aGljaCBpbml0aWFsbHkgY291bGQgYmUgdW5pbml0aWFsaXplZC4gSG93ZXZlciwgdGhlIGZpcnN0IGNhbGwgcGFzc2VzIGEgTlVMTCBgbmFtZWAgYXJndW1lbnQgdG8gYGtlcm5mc19kaXJfcG9zYCwgc28gdGhhdCdzIHRoZSBzdGFydGluZyBwb2ludC5cblxuSW5zaWRlIHRoZSBsb29wLCBpdCdzIGNsZWFyIG5vdzogYGtlcm5mc19kaXJfcG9zYCBpcyBjYWxsZWQgd2l0aCBhIE5VTEwgYG5hbWVgLiBUaGVuLCBpZiBgcG9zYCBpcyBub24tbnVsbCwgYHN0cnNjcHlgIGlzIHVzZWQgdG8gcG9wdWxhdGUgYG5hbWVgIHdpdGggYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gYGtlcm5mc19yY3VfbmFtZShwb3MpYC4gKlRoYXQncyogd2hlcmUgdGhlIHN0cmluZyBpcyBwb3B1bGF0ZWQhIENydWNpYWxseSwgdGhpcyBtZWFucyBgbmFtZWAgaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQgKmJlZm9yZSogaXQgaXMgdXNlZCBpbiB0aGUgc3Vic2VxdWVudCBjYWxsIHRvIGBrZXJuZnNfZGlyX25leHRfcG9zYC4gU28gYWZ0ZXIgdGhlIGZpcnN0IGxvb3AgaXRlcmF0aW9uLCBgbmFtZWAgaXMgbm93IGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIEFuZCB0aGVuIGluIHRoZSBjaGVjayBhZ2FpbnN0IGBrZXJuZnNfcmN1X25hbWUocG9zKWAgaXQgaXMgc2FmZSB0byB1c2UuXG5cbkxldCdzIGxvb2sgYXQgYGtlcm5mc19uYW1lX2NvbXBhcmVgLCB0aG91Z2gsIHNpbmNlIHRoYXQgaXMgdXNlZCBhcyB3ZWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDMwNywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk1MCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjE2Ljk2MjM1NzQyWiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MTE2MTQ4OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrZXJuZnNfbmFtZV9jb21wYXJlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2tlcm5mcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMva2VybmZzL2Rpci5jPTMyOT1zdGF0aWMgdW5zaWduZWQgaW50IGtlcm5mc19uYW1lX2hhc2goY29uc3QgY2hhciAqbmFtZSxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0zNDUtXFxuZnMva2VybmZzL2Rpci5jOjM0NjpzdGF0aWMgaW50IGtlcm5mc19uYW1lX2NvbXBhcmUodW5zaWduZWQgaW50IGhhc2gsIGNvbnN0IGNoYXIgKm5hbWUsXFxuZnMva2VybmZzL2Rpci5jLTM0Ny1cXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsIGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MzYzPXN0YXRpYyBpbnQga2VybmZzX3NkX2NvbXBhcmUoY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICpsZWZ0LFxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTM2NS17XFxuZnMva2VybmZzL2Rpci5jOjM2NjpcXHRyZXR1cm4ga2VybmZzX25hbWVfY29tcGFyZShsZWZ0LVxcdTAwM2VoYXNoLCBrZXJuZnNfcmN1X25hbWUobGVmdCksIGxlZnQtXFx1MDAzZW5zLCByaWdodCk7XFxuZnMva2VybmZzL2Rpci5jLTM2Ny19XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9ODkyPXN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19maW5kX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LFxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTkxMy1cXHRcXHRrbiA9IHJiX3RvX2tuKG5vZGUpO1xcbmZzL2tlcm5mcy9kaXIuYzo5MTQ6XFx0XFx0cmVzdWx0ID0ga2VybmZzX25hbWVfY29tcGFyZShoYXNoLCBuYW1lLCBucywga24pO1xcbmZzL2tlcm5mcy9kaXIuYy05MTUtXFx0XFx0aWYgKHJlc3VsdCBcXHUwMDNjIDApXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTkxMD1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0xOTQyLVxcbmZzL2tlcm5mcy9kaXIuYzoxOTQzOlxcdFxcdFxcdGlmIChrZXJuZnNfbmFtZV9jb21wYXJlKGhhc2gsIG5hbWUgPzogXFxcIlxcXCIsIG5zLCBrbikgXFx1MDAzYyAwKSB7XFxuZnMva2VybmZzL2Rpci5jLTE5NDQtXFx0XFx0XFx0XFx0cG9zID0ga247XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjE3LjAxMzUyNjYzOFoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDg5Mzk0NjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBrZXJuZnNfbmFtZV9jb21wYXJlKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIGtlcm5mcyBuYW1lcyBhcmUgYmVpbmcgY29tcGFyZWQuIFRpbWUgdG8gZGlnIGludG8gdGhlIGNvZGUuIFRoZSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IGlzIHRoZSBgZnMva2VybmZzL2Rpci5jYCBmaWxlLCBzaW5jZSB3ZSdyZSBkZWFsaW5nIHdpdGggZGlyZWN0b3J5IG9wZXJhdGlvbnMsIGFuZCB0aGUgZnVuY3Rpb24gbmFtZSBpcyBga2VybmZzX25hbWVfY29tcGFyZWAuIExldCdzIHNlZSB3aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBsb29rcyBsaWtlLiBJJ20gZXhwZWN0aW5nIHNvbWV0aGluZyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCwgbGlrZWx5IGludm9sdmluZyBhIGBzdHJjbXBgLWxpa2UgY29tcGFyaXNvbiwgYnV0IEkgd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBzdWJ0bGUgZGlmZmVyZW5jZXMgb3Igb3B0aW1pemF0aW9ucyBpbiBwbGF5IGZvciB0aGVzZSBrZXJuZnMgZW50cmllcy4gSSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvdGhlciBmdW5jdGlvbnMgYmVpbmcgY2FsbGVkIHdoaWNoIGNvdWxkIGV4cGxhaW4gYmVoYXZpb3VyLCBpdCB3b3VsZCBiZSBzZW5zaWJsZSB0byBsb29rIGF0IGFsbCBhc3BlY3RzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIxNTUsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzoxOS4xMDI5MjQwOTdaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUxMDcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2tlcm5mcy9kaXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzNDUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNDU6XFx0XFxuIDM0NjpcXHRzdGF0aWMgaW50IGtlcm5mc19uYW1lX2NvbXBhcmUodW5zaWduZWQgaW50IGhhc2gsIGNvbnN0IGNoYXIgKm5hbWUsXFxuIDM0NzpcXHRcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsIGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXFxuIDM0ODpcXHR7XFxuIDM0OTpcXHRcXHR1NjQgbnNfaWQgPSBrZXJuZnNfbnNfaWQobnMpO1xcbiAzNTA6XFx0XFx0dTY0IGtuX25zX2lkID0ga2VybmZzX25zX2lkKGtuLVxcdTAwM2Vucyk7XFxuIDM1MTpcXHRcXG4gMzUyOlxcdFxcdGlmIChoYXNoIFxcdTAwM2Mga24tXFx1MDAzZWhhc2gpXFxuIDM1MzpcXHRcXHRcXHRyZXR1cm4gLTE7XFxuIDM1NDpcXHRcXHRpZiAoaGFzaCBcXHUwMDNlIGtuLVxcdTAwM2VoYXNoKVxcbiAzNTU6XFx0XFx0XFx0cmV0dXJuIDE7XFxuIDM1NjpcXHRcXHRpZiAobnNfaWQgXFx1MDAzYyBrbl9uc19pZClcXG4gMzU3OlxcdFxcdFxcdHJldHVybiAtMTtcXG4gMzU4OlxcdFxcdGlmIChuc19pZCBcXHUwMDNlIGtuX25zX2lkKVxcbiAzNTk6XFx0XFx0XFx0cmV0dXJuIDE7XFxuIDM2MDpcXHRcXHRyZXR1cm4gc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShrbikpO1xcbiAzNjE6XFx0fVxcbiAzNjI6XFx0XFxuIDM2MzpcXHRzdGF0aWMgaW50IGtlcm5mc19zZF9jb21wYXJlKGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqbGVmdCxcXG4gMzY0OlxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICpyaWdodClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzM6MTkuMTAzMDc3NDA4WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjUzMTMzNjUxOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIFZ1bG5lcmFiaWxpdHkgaW4gYGtlcm5mc19uYW1lX2NvbXBhcmVgKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYGtlcm5mc19uYW1lX2NvbXBhcmVgLCBhbmQgaXQncyB1c2luZyBgc3RyY21wYCB0byBjb21wYXJlIGBuYW1lYCB3aXRoIGBrZXJuZnNfcmN1X25hbWUoa24pYC4gVGhhdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLCBhbmQgYG5hbWVgIGlzIGJlaW5nIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweWAsIHNvIGl0ICpzaG91bGQqIGJlIGEgdmFsaWQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIExldCdzIHNlZS4uLiBJJ20gZ29pbmcgdG8gZG91YmxlIGNoZWNrLiBgbmFtZWAgaXMgc2V0IHRvIGBOVUxMYCBidXQgaXQgc2VlbXMgaXQgY2FuIGJlIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKTtgLi4uIGlmIHRoYXQgZmFpbHMsIHdlIGdldCBgLUVOT01FTWAuXG5cblJpZ2h0LCBga21hbGxvY2AgaXMgdXNlZC4gTm93LCB3aGVuIGBzdHJzY3B5YCBjb3BpZXMgaW50byBgbmFtZWAsIHRoZSBtYXhpbXVtIGl0IHdyaXRlcyBpcyBgbGVuICsgMWAgYnl0ZXMgKGNoYXJhY3RlcnMgcGx1cyB0aGUgbnVsbCB0ZXJtaW5hdG9yKS4gVGhlIGltcG9ydGFudCB0aGluZyBpcyB0aGF0IHRoZSAqcmVzdCogb2YgYG5hbWVgLCBmcm9tIGBuYW1lICsgbGVuICsgMWAgdXAgdG8gYG5hbWUgKyBQQVRIX01BWCAtIDFgLCByZW1haW5zIGNvbXBsZXRlbHkgdW5pbml0aWFsaXplZC4gVGhhdCBtYWtlcyBtZSB3b25kZXIsIGNvdWxkIHNvbWV0aGluZyBpbmFkdmVydGVudGx5IHJlYWQgcGFzdCB0aGUgYFxcMGAgYW5kIGludG8gdGhhdCB1bmluaXRpYWxpemVkIG1lbW9yeT9cblxuV2FpdCwgaG9sZCBvbi4gTGV0J3MgdGhpbmsgdGhpcyB0aHJvdWdoLiBJbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBsZXQncyBzYXkgYHBvcy1cdTAwM2VuYW1lYCBpcyBcImZvb1wiLiBTbyBgbmFtZWAgY29udGFpbnMgXCJmXCIsIFwib1wiLCBcIm9cIiwgXCJcXDBcIiwgdGhlbiBnYXJiYWdlLiBUaGVuLCBpbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgYHN0cnNjcHlgIGlzIGNhbGxlZCBhZ2Fpbi4gSWYgYHBvcy1cdTAwM2VuYW1lYCBpcywgc2F5LCBcImFiXCIsIHRoZW4gYG5hbWVgIHdpbGwgaGF2ZSBcImFcIiwgXCJiXCIsIFwiXFwwXCIsIFwiXFwwXCIsIGFuZCBtb3JlIGdhcmJhZ2UuIEJ1dCwgaGVyZSdzIHRoZSB0aGluZzogYHN0cmNtcGAgKm9ubHkqIHJlYWRzIHVudGlsIGl0IGZpbmRzIGEgYFxcMGAsIHNvIHRoYXQncyBzYWZlLiBBbHNvLCBgZGlyX2VtaXRgIG9ubHkgcmVhZHMgdXAgdG8gYG5hbWVsZW5gLlxuXG5UaGUgcmVhbCBxdWVzdGlvbiBpcywgZG9lcyBgZGlyX2VtaXRgIGNvcHkgYG5hbWVgIHRvIHVzZXIgc3BhY2U/IFRoYXQgd291bGQgYmUgYSBiaWdnZXIgaXNzdWUuIExldCdzIHNlZS4uLiBgZGlyX2VtaXRgIGNhbGxzIGBjdHgtXHUwMDNlYWN0b3IoY3R4LCBuYW1lLCBuYW1lbGVuLCBjdHgtXHUwMDNlcG9zLCBpbm8sIHR5cGUgXHUwMDI2IGR0X21hc2spO2AuIFRoZSBhY3Rvci4uLiB0aGF0J3MgdXN1YWxseSBlaXRoZXIgYGZpbGxkaXJgLCBgZmlsbGRpcjY0YCwgb3IgYGNvbXBhdF9maWxsZGlyYCwgYW5kIHRoYXQncyBpbiBgZnMvcmVhZGRpci5jYC4gSSBuZWVkIHRvIGNoZWNrIGBmaWxsZGlyNjRgLiBJIHRoaW5rIHRoYXQncyB3aGVyZSBJIG5lZWQgdG8gbG9vay5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI3MTYsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NzMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzoyNC40MTY0NDQ2ODNaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ5MjUyNDE3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZpbGxkaXI2NFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9yZWFkZGlyLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvcmVhZGRpci5jPTMzND1zdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2s2NCB7XFxuLS1cXG5mcy9yZWFkZGlyLmMtMzQwLVxcbmZzL3JlYWRkaXIuYzozNDE6c3RhdGljIGJvb2wgZmlsbGRpcjY0KHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxcbmZzL3JlYWRkaXIuYy0zNDItXFx0XFx0ICAgICBsb2ZmX3Qgb2Zmc2V0LCB1NjQgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKVxcbi0tXFxuZnMvcmVhZGRpci5jPTM4ND1TWVNDQUxMX0RFRklORTMoZ2V0ZGVudHM2NCwgdW5zaWduZWQgaW50LCBmZCxcXG4tLVxcbmZzL3JlYWRkaXIuYy0zODgtXFx0c3RydWN0IGdldGRlbnRzX2NhbGxiYWNrNjQgYnVmID0ge1xcbmZzL3JlYWRkaXIuYzozODk6XFx0XFx0LmN0eC5hY3RvciA9IGZpbGxkaXI2NCxcXG5mcy9yZWFkZGlyLmMtMzkwLVxcdFxcdC5jdHguY291bnQgPSBjb3VudCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzM6MjQuNDY1NzA0MDlaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjI2NTA1NjUwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OlxuXG4qKkRpdmluZyBpbnRvIHRoZSBEaXJlY3RvcnkgUmVhZGluZyBDb2RlKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIExldCdzIGRpZyBpbnRvIHRoZSBuaXR0eS1ncml0dHkgb2YgZGlyZWN0b3J5IHJlYWRpbmcgd2l0aGluIHRoZSBrZXJuZWwuIE15IHRhcmdldCBpcyB0aGUgYGZpbGxkaXI2NGAgZnVuY3Rpb24sIHdoaWNoIEkga25vdyByZXNpZGVzIGluIGBmcy9yZWFkZGlyLmNgLiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIG9mIHBvcHVsYXRpbmcgdGhvc2UgZGlyZWN0b3J5IGVudHJpZXMgcmVzaWRlcywgc28gdW5kZXJzdGFuZGluZyBob3cgdGhpcyBmdW5jdGlvbiB3b3JrcyBpcyBjcml0aWNhbCBmb3IgZGVidWdnaW5nIG9yIG9wdGltaXppbmcgYW55IGZpbGUgc3lzdGVtIGJlaGF2aW9yIHJlbGF0ZWQgdG8gZGlyZWN0b3J5IGxpc3RpbmdzLiBMZXQncyBzZWUgaG93IGl0IGhhbmRsZXMgdGhvc2UgNjQtYml0IGlub2RlIG51bWJlcnMuIEknbSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlcyBhbmQgd2hhdCBraW5kIG9mIGVycm9yIGNoZWNraW5nIGlzIGluIHBsYWNlLiBUaW1lIHRvIHN0YXJ0IHRyYWNpbmcgdGhlIGV4ZWN1dGlvbiBhbmQgc2VlIGlmIGFueXRoaW5nIGp1bXBzIG91dC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM5NDAsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzoyNi43MzA3NjM2ODRaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE1NDMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL3JlYWRkaXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzNDEsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNDE6XFx0c3RhdGljIGJvb2wgZmlsbGRpcjY0KHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxcbiAzNDI6XFx0XFx0XFx0ICAgICBsb2ZmX3Qgb2Zmc2V0LCB1NjQgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKVxcbiAzNDM6XFx0e1xcbiAzNDQ6XFx0XFx0c3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqZGlyZW50LCAqcHJldjtcXG4gMzQ1OlxcdFxcdHN0cnVjdCBnZXRkZW50c19jYWxsYmFjazY0ICpidWYgPVxcbiAzNDY6XFx0XFx0XFx0Y29udGFpbmVyX29mKGN0eCwgc3RydWN0IGdldGRlbnRzX2NhbGxiYWNrNjQsIGN0eCk7XFxuIDM0NzpcXHRcXHRpbnQgcmVjbGVuID0gQUxJR04oZGlyZW50X3NpemUoZGlyZW50LCBuYW1sZW4gKyAxKSwgc2l6ZW9mKHU2NCkpO1xcbiAzNDg6XFx0XFx0aW50IHByZXZfcmVjbGVuO1xcbiAzNDk6XFx0XFx0dW5zaWduZWQgaW50IGZsYWdzID0gZF90eXBlO1xcbiAzNTA6XFx0XFxuIDM1MTpcXHRcXHRCVUlMRF9CVUdfT04oRklMTERJUl9GTEFHX05PSU5UUiBcXHUwMDI2IFNfRFRfTUFTSyk7XFxuIDM1MjpcXHRcXHRkX3R5cGUgXFx1MDAyNj0gU19EVF9NQVNLO1xcbiAzNTM6XFx0XFxuIDM1NDpcXHRcXHRidWYtXFx1MDAzZWVycm9yID0gdmVyaWZ5X2RpcmVudF9uYW1lKG5hbWUsIG5hbWxlbik7XFxuIDM1NTpcXHRcXHRpZiAodW5saWtlbHkoYnVmLVxcdTAwM2VlcnJvcikpXFxuIDM1NjpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDM1NzpcXHRcXHRidWYtXFx1MDAzZWVycm9yID0gLUVJTlZBTDtcXHQvKiBvbmx5IHVzZWQgaWYgd2UgZmFpbC4uICovXFxuIDM1ODpcXHRcXHRpZiAocmVjbGVuIFxcdTAwM2UgY3R4LVxcdTAwM2Vjb3VudClcXG4gMzU5OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gMzYwOlxcdFxcdHByZXZfcmVjbGVuID0gYnVmLVxcdTAwM2VwcmV2X3JlY2xlbjtcXG4gMzYxOlxcdFxcdGlmICghKGZsYWdzIFxcdTAwMjYgRklMTERJUl9GTEFHX05PSU5UUikgXFx1MDAyNlxcdTAwMjYgcHJldl9yZWNsZW4gXFx1MDAyNlxcdTAwMjYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpXFxuIDM2MjpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDM2MzpcXHRcXHRkaXJlbnQgPSBidWYtXFx1MDAzZWN1cnJlbnRfZGlyO1xcbiAzNjQ6XFx0XFx0cHJldiA9ICh2b2lkIF9fdXNlciAqKWRpcmVudCAtIHByZXZfcmVjbGVuO1xcbiAzNjU6XFx0XFx0c2NvcGVkX3VzZXJfd3JpdGVfYWNjZXNzX3NpemUocHJldiwgcmVjbGVuICsgcHJldl9yZWNsZW4sIGVmYXVsdCkge1xcbiAzNjY6XFx0XFx0XFx0LyogVGhpcyBtaWdodCBiZSAnZGlyZW50LVxcdTAwM2VkX29mZicsIGJ1dCBpZiBzbyBpdCB3aWxsIGdldCBvdmVyd3JpdHRlbiAqL1xcbiAzNjc6XFx0XFx0XFx0dW5zYWZlX3B1dF91c2VyKG9mZnNldCwgXFx1MDAyNnByZXYtXFx1MDAzZWRfb2ZmLCBlZmF1bHQpO1xcbiAzNjg6XFx0XFx0XFx0dW5zYWZlX3B1dF91c2VyKGlubywgXFx1MDAyNmRpcmVudC1cXHUwMDNlZF9pbm8sIGVmYXVsdCk7XFxuIDM2OTpcXHRcXHRcXHR1bnNhZmVfcHV0X3VzZXIocmVjbGVuLCBcXHUwMDI2ZGlyZW50LVxcdTAwM2VkX3JlY2xlbiwgZWZhdWx0KTtcXG4gMzcwOlxcdFxcdFxcdHVuc2FmZV9wdXRfdXNlcihkX3R5cGUsIFxcdTAwMjZkaXJlbnQtXFx1MDAzZWRfdHlwZSwgZWZhdWx0KTtcXG4gMzcxOlxcdFxcdFxcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cXHUwMDNlZF9uYW1lLCBuYW1lLCBuYW1sZW4sIGVmYXVsdCk7XFxuIDM3MjpcXHRcXHR9XFxuIDM3MzpcXHRcXG4gMzc0OlxcdFxcdGJ1Zi1cXHUwMDNlcHJldl9yZWNsZW4gPSByZWNsZW47XFxuIDM3NTpcXHRcXHRidWYtXFx1MDAzZWN1cnJlbnRfZGlyID0gKHZvaWQgX191c2VyICopZGlyZW50ICsgcmVjbGVuO1xcbiAzNzY6XFx0XFx0Y3R4LVxcdTAwM2Vjb3VudCAtPSByZWNsZW47XFxuIDM3NzpcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gMzc4OlxcdFxcbiAzNzk6XFx0ZWZhdWx0OlxcbiAzODA6XFx0XFx0YnVmLVxcdTAwM2VlcnJvciA9IC1FRkFVTFQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjI2LjczMDg4MTExNFoiLCJTZXEiOjMzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyOTA0MDAyMzAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OlxuXG4qKkRpZ2dpbmcgaW50byB0aGUgYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lYCBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgbGluZSBvZiBjb2RlOiBgdW5zYWZlX2NvcHlfZGlyZW50X25hbWUoZGlyZW50LVx1MDAzZWRfbmFtZSwgbmFtZSwgbmFtbGVuLCBlZmF1bHQpO2AgTXkgaW5pdGlhbCB0aG91Z2h0IGlzLCB0aGlzIGZ1bmN0aW9uIG5hbWUsIFwidW5zYWZlLFwiIGFscmVhZHkgcmFpc2VzIGEgcmVkIGZsYWcuIEknbSBhc3N1bWluZyBpdCdzIGhhbmRsaW5nIGEgcG90ZW50aWFsbHkgdHJpY2t5IG1lbW9yeSBjb3B5IG9wZXJhdGlvbiByZWxhdGVkIHRvIGRpcmVjdG9yeSBlbnRyaWVzLiBMZXQncyBzZWUgd2hhdCdzIGdvaW5nIG9uIHVuZGVyIHRoZSBob29kIG9mIGB1bnNhZmVfY29weV9kaXJlbnRfbmFtZWAuIE15IGd1dCBmZWVsaW5nIGlzIHdlJ3JlIGRlYWxpbmcgd2l0aCBzdHJpbmcgbWFuaXB1bGF0aW9uLCBwb3NzaWJseSB3aXRoIGEgZml4ZWQtc2l6ZSBidWZmZXIgKGBuYW1lYCkgYW5kIGEgc291cmNlIChgZGlyZW50LVx1MDAzZWRfbmFtZWApIHRoYXQgbWF5IG9yIG1heSBub3QgZml0IG5lYXRseS4gVGhlIGBuYW1sZW5gIGFyZ3VtZW50IGlzIHByb2JhYmx5IHRoZSBpbnRlbmRlZCBtYXhpbXVtIGNvcHkgbGVuZ3RoLCB3aGljaCBpcyBhIGdvb2Qgc2lnbiBpZiB1c2VkIGNvcnJlY3RseSBmb3IgYSBidWZmZXIgb3ZlcmZsb3cgcHJldmVudGlvbiBzdHJhdGVneS4gRmluYWxseSwgYGVmYXVsdGAsIGxvb2tzIGxpa2UgaXQgY291bGQgYmUgYSBwb2ludGVyIHRvIGEgZmxhZyBvciBlcnJvciBjb2RlIHRvIGJlIHNldCBpbiBjYXNlIHRoZSBjb3B5IGZhaWxzIGZvciBzb21lIHJlYXNvbi4gVGhlIG5hbWUgXCJlZmF1bHRcIiBzdWdnZXN0cyB0aGF0IGl0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gdGhlIGBFRkFVTFRgIGVycm9yIGNvZGUsIHdoaWNoIGluZGljYXRlcyBhIGJhZCBhZGRyZXNzIHBhc3NlZCB0byBhIHN5c3RlbSBjYWxsLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiwgbGVuZ3RoLCBhbmQgZXJyb3IgaGFuZGxpbmcgbWVjaGFuaWNzIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHRvIHByb3Blcmx5IGFzc2VzcyB0aGlzIGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0OTI3LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzoyOS42MzQ4ODYxMzdaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2NTI5Mjk1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInVuc2FmZV9jb3B5X2RpcmVudF9uYW1lXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL3JlYWRkaXIuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9yZWFkZGlyLmM9NzI9RVhQT1JUX1NZTUJPTCh3cmFwX2RpcmVjdG9yeV9pdGVyYXRvcik7XFxuLS1cXG5mcy9yZWFkZGlyLmMtNzctICovXFxuZnMvcmVhZGRpci5jOjc4OiNkZWZpbmUgdW5zYWZlX2NvcHlfZGlyZW50X25hbWUoX2RzdCwgX3NyYywgX2xlbiwgbGFiZWwpIGRvIHtcXHRcXFxcXFxuZnMvcmVhZGRpci5jLTc5LVxcdGNoYXIgX191c2VyICpkc3QgPSAoX2RzdCk7XFx0XFx0XFx0XFx0XFxcXFxcbi0tXFxuZnMvcmVhZGRpci5jPTE4Mz1zdGF0aWMgYm9vbCBmaWxsb25lZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxcbi0tXFxuZnMvcmVhZGRpci5jLTIwNi1cXHRcXHR1bnNhZmVfcHV0X3VzZXIobmFtbGVuLCBcXHUwMDI2ZGlyZW50LVxcdTAwM2VkX25hbWxlbiwgZWZhdWx0KTtcXG5mcy9yZWFkZGlyLmM6MjA3OlxcdFxcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cXHUwMDNlZF9uYW1lLCBuYW1lLCBuYW1sZW4sIGVmYXVsdCk7XFxuZnMvcmVhZGRpci5jLTIwOC1cXHR9XFxuLS1cXG5mcy9yZWFkZGlyLmM9MjU2PXN0YXRpYyBib29sIGZpbGxkaXIoc3RydWN0IGRpcl9jb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1sZW4sXFxuLS1cXG5mcy9yZWFkZGlyLmMtMjkxLVxcdFxcdHVuc2FmZV9wdXRfdXNlcihkX3R5cGUsIChjaGFyIF9fdXNlciAqKWRpcmVudCArIHJlY2xlbiAtIDEsIGVmYXVsdCk7XFxuZnMvcmVhZGRpci5jOjI5MjpcXHRcXHR1bnNhZmVfY29weV9kaXJlbnRfbmFtZShkaXJlbnQtXFx1MDAzZWRfbmFtZSwgbmFtZSwgbmFtbGVuLCBlZmF1bHQpO1xcbmZzL3JlYWRkaXIuYy0yOTMtXFx0fVxcbi0tXFxuZnMvcmVhZGRpci5jPTM0MT1zdGF0aWMgYm9vbCBmaWxsZGlyNjQoc3RydWN0IGRpcl9jb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1sZW4sXFxuLS1cXG5mcy9yZWFkZGlyLmMtMzcwLVxcdFxcdHVuc2FmZV9wdXRfdXNlcihkX3R5cGUsIFxcdTAwMjZkaXJlbnQtXFx1MDAzZWRfdHlwZSwgZWZhdWx0KTtcXG5mcy9yZWFkZGlyLmM6MzcxOlxcdFxcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cXHUwMDNlZF9uYW1lLCBuYW1lLCBuYW1sZW4sIGVmYXVsdCk7XFxuZnMvcmVhZGRpci5jLTM3Mi1cXHR9XFxuLS1cXG5mcy9yZWFkZGlyLmM9NDI5PXN0YXRpYyBib29sIGNvbXBhdF9maWxsb25lZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxuZnMvcmVhZGRpci5jLTQ1My1cXHRcXHR1bnNhZmVfcHV0X3VzZXIobmFtbGVuLCBcXHUwMDI2ZGlyZW50LVxcdTAwM2VkX25hbWxlbiwgZWZhdWx0KTtcXG5mcy9yZWFkZGlyLmM6NDU0OlxcdFxcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cXHUwMDNlZF9uYW1lLCBuYW1lLCBuYW1sZW4sIGVmYXVsdCk7XFxuZnMvcmVhZGRpci5jLTQ1NS1cXHR9XFxuLS1cXG5mcy9yZWFkZGlyLmM9NDk3PXN0YXRpYyBib29sIGNvbXBhdF9maWxsZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxcbi0tXFxuZnMvcmVhZGRpci5jLTUzMS1cXHRcXHR1bnNhZmVfcHV0X3VzZXIoZF90eXBlLCAoY2hhciBfX3VzZXIgKilkaXJlbnQgKyByZWNsZW4gLSAxLCBlZmF1bHQpO1xcbmZzL3JlYWRkaXIuYzo1MzI6XFx0XFx0dW5zYWZlX2NvcHlfZGlyZW50X25hbWUoZGlyZW50LVxcdTAwM2VkX25hbWUsIG5hbWUsIG5hbWxlbiwgZWZhdWx0KTtcXG5mcy9yZWFkZGlyLmMtNTMzLVxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzM6MjkuNjgxNDIxMjIxWiIsIlNlcSI6MzUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI3NTc2MjI2MTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGBmcy9yZWFkZGlyLmNgKipcblxuT2theSwgdGltZSB0byBkaWcgaW50byB0aGlzLiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGB1bnNhZmVfY29weV9kaXJlbnRfbmFtZWAgZnVuY3Rpb24sIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGBmcy9yZWFkZGlyLmNgIGZpbGUuIEkga25vdyB0aGlzIGFyZWEgY2FuIGJlIHRyaWNreSwgc28gSSdtIGhvbmluZyBpbiBvbiBsaW5lcyA3OC0xMDAuIFRoYXQncyB3aGVyZSBJIGV4cGVjdCB0byBmaW5kIHRoZSBtZWF0IG9mIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGFuZCBpbXBsZW1lbnRhdGlvbi4gSSB3YW50IHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF0J3MgZ29pbmcgb24gd2l0aCBob3cgZGlyZWN0b3J5IGVudHJ5IG5hbWVzIGFyZSBiZWluZyBoYW5kbGVkLiBTYWZldHkgYW5kIHBlcmZvcm1hbmNlIGFyZSBjcnVjaWFsIGhlcmUsIHNvIEkgbmVlZCB0byBhc3Nlc3MgdGhpcyB0aG9yb3VnaGx5LiBMZXQncyBzZWUgd2hhdCB3ZSd2ZSBnb3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MDAxLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzM6MzIuNDM5MDQ3ODc1WiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg1OTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL3JlYWRkaXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA3NSxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA3NTpcXHQgKiBOb3RlIHRoZSBcXFwidW5zYWZlX3B1dF91c2VyKClcXFwiIHNlbWFudGljczogd2UgZ290byBhXFxuICA3NjpcXHQgKiBsYWJlbCBmb3IgZXJyb3JzLlxcbiAgNzc6XFx0ICovXFxuICA3ODpcXHQjZGVmaW5lIHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKF9kc3QsIF9zcmMsIF9sZW4sIGxhYmVsKSBkbyB7XFx0XFxcXFxcbiAgNzk6XFx0XFx0Y2hhciBfX3VzZXIgKmRzdCA9IChfZHN0KTtcXHRcXHRcXHRcXHRcXFxcXFxuICA4MDpcXHRcXHRjb25zdCBjaGFyICpzcmMgPSAoX3NyYyk7XFx0XFx0XFx0XFx0XFxcXFxcbiAgODE6XFx0XFx0c2l6ZV90IGxlbiA9IChfbGVuKTtcXHRcXHRcXHRcXHRcXHRcXFxcXFxuICA4MjpcXHRcXHR1bnNhZmVfcHV0X3VzZXIoMCwgZHN0K2xlbiwgbGFiZWwpO1xcdFxcdFxcdFxcXFxcXG4gIDgzOlxcdFxcdHVuc2FmZV9jb3B5X3RvX3VzZXIoZHN0LCBzcmMsIGxlbiwgbGFiZWwpO1xcdFxcdFxcXFxcXG4gIDg0OlxcdH0gd2hpbGUgKDApXFxuICA4NTpcXHRcXG4gIDg2OlxcdFxcbiAgODc6XFx0aW50IGl0ZXJhdGVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcXG4gIDg4OlxcdHtcXG4gIDg5OlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpO1xcbiAgOTA6XFx0XFx0aW50IHJlcyA9IC1FTk9URElSO1xcbiAgOTE6XFx0XFxuICA5MjpcXHRcXHRpZiAoIWZpbGUtXFx1MDAzZWZfb3AtXFx1MDAzZWl0ZXJhdGVfc2hhcmVkKVxcbiAgOTM6XFx0XFx0XFx0Z290byBvdXQ7XFxuICA5NDpcXHRcXG4gIDk1OlxcdFxcdHJlcyA9IHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbihmaWxlLCBNQVlfUkVBRCk7XFxuICA5NjpcXHRcXHRpZiAocmVzKVxcbiAgOTc6XFx0XFx0XFx0Z290byBvdXQ7XFxuICA5ODpcXHRcXG4gIDk5OlxcdFxcdHJlcyA9IGZzbm90aWZ5X2ZpbGVfcGVybShmaWxlLCBNQVlfUkVBRCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjMyLjQzOTEzNjI3NVoiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMDA2ODM2MzcyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lYCBhbmQgUmVsYXRlZCBGdW5jdGlvbnMgaW4gYGZzL2tlcm5mcy9kaXIuY2AqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lYCBmdW5jdGlvbiwgYW5kIG15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGl0IGxvb2tzIHNhZmUuIGB1bnNhZmVfY29weV9kaXJlbnRfbmFtZWAgY29waWVzIGBsZW5gIGJ5dGVzIGZyb20gYHNyY2AgdG8gYGRzdGAsIHRoZW4gbnVsbC10ZXJtaW5hdGVzIHRoZSByZXN1bHQuIGBsZW5gIGNvbWVzIGZyb20gYHN0cnNjcHlgLCB3aGljaCBoYW5kbGVzIHN0cmluZyBjb3B5aW5nIGFuZCBudWxsIHRlcm1pbmF0aW9uLiBTaW5jZSBgc3Ryc2NweWAgY29waWVzIGV4YWN0bHkgYGxlbmAgY2hhcmFjdGVycyBhbmQgdGhlIE5VTCBieXRlLCBpdCBhcHBlYXJzIHRoYXQgYGxlbmAgYnl0ZXMgYXJlIGNvcGllZCBmcm9tIGBuYW1lYCB0byB1c2VyIHNwYWNlLCBhbmQgaW1wb3J0YW50bHksIHRoZXNlIGBsZW5gIGJ5dGVzIHNob3VsZCBiZSBmdWxseSBpbml0aWFsaXplZC5cblxuVGhlbiBJIHBhdXNlZC4gQ291bGQgYHN0cnNjcHlgIHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlPyBUaGUgY29kZSBkb2VzIGNoZWNrIGZvciB0aGlzLCBicmVha2luZyB0aGUgbG9vcCBpZiBgbGVuIFx1MDAzYyAwYC4gSWYgYGxlbmAgaXMgbm90IG5lZ2F0aXZlLCBpdCByZXByZXNlbnRzIHRoZSBzdHJpbmcgbGVuZ3RoLiBHb29kLCB0aGF0IHRha2VzIGNhcmUgb2YgdGhlIG5lZ2F0aXZlIHJldHVybiBwb3NzaWJpbGl0eS5cblxuTm93LCBsZXQncyBsb29rIGZ1cnRoZXIgaW50byB0aGlzIHBhdGNoLCBzcGVjaWZpY2FsbHkgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zIHdpdGhpbiBgZnMva2VybmZzL2Rpci5jYC4gVGhlIGZpcnN0IGZ1bmN0aW9uIG9mIGludGVyZXN0IGlzIGBrZXJuZnNfZGlyX3Bvc2AsIGFuZCBpdHMgY2FsbGVycy4gVGhlIGNhbGxlciBpcyBga2VybmZzX2Rpcl9uZXh0X3Bvc2AuIFdpdGhpbiBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgSSBzZWUgYSB2YXJpYWJsZSBgYm9vbCByZXN1bWVkO2AgcGFzc2VkIHRvIGBrZXJuZnNfZGlyX3Bvc2AuIEl0J3MgdXNlZCBpbiB0aGlzIG1hbm5lcjogYHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGhhc2gsIHBvcywgbmFtZSwgXHUwMDI2cmVzdW1lZCk7YC4gSW5zaWRlIGBrZXJuZnNfZGlyX3Bvc2AsIGByZXN1bWVkYCBpcyBzZXQgdG8gZmFsc2UgaW5pdGlhbGx5LiBGdXJ0aGVyIGRvd24sIGlmIGBwb3NgIGlzIHZhbGlkLCBpdCBnZXRzIHNldCB0byB0cnVlLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRoYXQgYHJlc3VtZWRgIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYW5kIHdyaXR0ZW4gdG8sIHNvIHRoZSBjb21waWxlciBzaG91bGQgaGFuZGxlIHRoaXMuXG5cblNvIGxldCdzIGNvbnNpZGVyIHRoZSBgbmFtZWAgYXJndW1lbnQuIEkgc2VlIGl0IGJlaW5nIHVzZWQgYXMgYG5hbWUgPzogXCJcImAuIFRoaXMgbWVhbnMgdGhhdCBpZiBgbmFtZWAgaXMgTlVMTCwgYW4gZW1wdHkgc3RyaW5nIGlzIHVzZWQuIFRoaXMgaXMgaW1wb3J0YW50LCBsZXQncyB0cmFjayB0aGUgYG5hbWVgIHZhcmlhYmxlIGFuZCBzZWUgaG93IGl0IGlzIHVzZWQuIEl0IGxvb2tzIGxpa2UgYG5hbWVgIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgYGtlcm5mc19kaXJfbmV4dF9wb3NgLiBJZiB3ZSBsb29rIGF0IGBrZXJuZnNfZm9wX3JlYWRkaXJgOlxuXG5gZm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtXHUwMDNlcG9zLCBwb3MsIE5VTEwsIE5VTEwpOyBwb3M7IHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBuYW1lKSlgXG5cbk9rYXksIGhlcmUncyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBJbnNpZGUgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCwgYHBvc2AgaXMgaW5pdGlhbGl6ZWQgYnkgYGtlcm5mc19kaXJfcG9zYCwgd2l0aCBOVUxMIGZvciB0aGUgbmFtZSBhcmd1bWVudHMuIElmIGBwb3NgIGlzIE5VTEwsIHRoZSBsb29wIGRvZXNuJ3QgcnVuLiBJZiBgcG9zYCBpcyB2YWxpZCwgdGhlIGxvb3AgYm9keSBleGVjdXRlcy4gSW1wb3J0YW50bHksIGluc2lkZSB0aGUgbG9vcCBib2R5IGlzIHRoZSBgc3Ryc2NweWAgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyBgbmFtZWA6XG5cbmBsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7YFxuXG5gbmFtZWAgaXMgaW5pdGlhbGl6ZWQuXG5cblRoZW4sIHdlIGhhdmUgdGhlIGxvb3AgaW5jcmVtZW50OlxuXG5gcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtXHUwMDNlcG9zLCBwb3MsIG5hbWUpYFxuXG5BdCB0aGlzIHBvaW50LCBgbmFtZWAgKmhhcyogYmVlbiB3cml0dGVuIHRvIGJ5IGBzdHJzY3B5YC4gVGhpcyB0ZWxscyBtZSB0aGF0IGBuYW1lYCB3aWxsIGJlIGluaXRpYWxpemVkIHdoZW4gaXQncyBwYXNzZWQgaGVyZS4gU28gaXQgc2hvdWxkIGFsd2F5cyBiZSBpbml0aWFsaXplZC5cblxuSSdsbCBkbyBhIHF1aWNrIGNvZGUtd2lkZSBncmVwIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBvdGhlciBjYWxsZXJzIHRvIGBrZXJuZnNfZGlyX3Bvc2AgYW5kIGBrZXJuZnNfZGlyX25leHRfcG9zYCBhbmQgaWYgSSdtIG1pc3Npbmcgc29tZXRoaW5nIGVsc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NTgxLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAzNCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjQyLjUwNzUwNDE5M1oiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDkwMDg4ODcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2VybmZzX2Rpcl9wb3NcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMva2VybmZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9rZXJuZnMvZGlyLmM9MTkwMD1zdGF0aWMgaW50IGtlcm5mc19kaXJfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTkwOS0gKi9cXG5mcy9rZXJuZnMvZGlyLmM6MTkxMDpzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG5mcy9rZXJuZnMvZGlyLmMtMTkxMS1cXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxcbi0tXFxuZnMva2VybmZzL2Rpci5jPTE5NjM9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9uZXh0X3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0xOTY4LVxcbmZzL2tlcm5mcy9kaXIuYzoxOTY5OlxcdHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGhhc2gsIHBvcywgbmFtZSwgXFx1MDAyNnJlc3VtZWQpO1xcbmZzL2tlcm5mcy9kaXIuYy0xOTcwLVxcdC8qIFN0ZXAgb3ZlciBAcG9zIG9ubHkgaWYgaXQgc3Vydml2ZWQ7IEBuYW1lIGZpbmRzIHRoZSBzcG90IGlmIG5vdC4gKi9cXG4tLVxcbmZzL2tlcm5mcy9kaXIuYz0xOTg0PXN0YXRpYyBpbnQga2VybmZzX2ZvcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0yMDA5LVxcbmZzL2tlcm5mcy9kaXIuYzoyMDEwOlxcdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVxcdTAwM2Vwb3MsIHBvcywgTlVMTCwgTlVMTCk7XFxuZnMva2VybmZzL2Rpci5jLTIwMTEtXFx0ICAgICBwb3M7XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMjAzMS1cXHRcXHQgKiBkaXJfZW1pdCgpIGNhbiBmYXVsdCwgc28gcnVuIGl0IHVubG9ja2VkLiAgQHBvcyBpcyBwaW5uZWRcXG5mcy9rZXJuZnMvZGlyLmM6MjAzMjpcXHRcXHQgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suXFxuZnMva2VybmZzL2Rpci5jLTIwMzMtXFx0XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjQyLjU1NjUxODcxOVoiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo0MTQzNzQ5MTkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkRpdmluZyBEZWVwIGludG8gYGtlcm5mc19kaXJfbmV4dF9wb3NgIGluIGBmcy9rZXJuZnMvZGlyLmNgKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyB3aXRoIHRoYXQgYGtlcm5mc19kaXJfbmV4dF9wb3NgIGZ1bmN0aW9uLiBMZXQncyBzdGFydCBieSBsb29raW5nIGF0IGxpbmUgMTk3Niwgb3IgdGhlcmVhYm91dHMsIGluIGBmcy9rZXJuZnMvZGlyLmNgLiBBaCwgeWVzLCBpbiB0aGUgaGVhcnQgb2YgdGhpcyBmdW5jdGlvbiwgdGhlcmUncyB0aGF0IGxvb3A6XG5cbmBgYGNcblx0XHRkbyB7XG5cdFx0XHRzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJiX25leHQoXHUwMDI2cG9zLVx1MDAzZXJiKTtcblx0XHRcdGlmICghbm9kZSlcblx0XHRcdFx0cmV0dXJuIE5VTEw7XG5cdFx0XHRwb3MgPSByYl90b19rbihub2RlKTtcblx0XHRcdGtlcm5mc19nZXQocG9zKTtcblx0XHR9IHdoaWxlIChrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIE5VTEwsIE5VTEwpICE9IHBvcyk7XG5gYGBcblxuSG1tLi4ud2FpdCBhIG1pbnV0ZS4gVGhhdCBgd2hpbGVgIGNvbmRpdGlvbiBpcyBhIGJpdOKApnRyaWNreS4gSXQncyBjaGVja2luZyBpZiBzb21ldGhpbmcgaXNuJ3QgcXVpdGUgcmlnaHQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBTb21ldGhpbmcgYWJvdXQgdGhhdCBsb29wIGlzIG1ha2luZyBtZSB0aGluaywgd2hhdCB3YXMgdGhhdCBsaW5lIGxvb2tpbmcgbGlrZSBiZWZvcmU/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgdG8gc2VlIGlmIEkgYW0gbWlzc2luZyBzb21ldGhpbmcgb2J2aW91cyBvciB3aGF0IGNoYW5nZXMgbGVkIHVwIHRvIHRoaXMgc3RydWN0dXJlLlxuXG5UbyB0cnVseSBncmFzcCB0aGUgY29udGV4dCwgSSBuZWVkIHRvIHJlYWQgdGhlIGNvZGUgc3Vycm91bmRpbmcgdGhpcyBmdW5jdGlvbi4gTGV0J3MgZXhwYW5kIG15IHZpZXcgdG8gbGluZXMgMTk0MC0xOTgwLCBsb29raW5nIGF0IHRoZSBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhpcyBjcnVjaWFsIGxvb3AuIEkgbmVlZCB0aGUgYmlnZ2VyIHBpY3R1cmUgdG8gdW5kZXJzdGFuZCB0aGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGFuZCB3aGV0aGVyIGl0J3Mgb3B0aW1pemVkIG9yIHNpbXBseSBjb3JyZWN0LiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgZGlzc2VjdCB0aGlzIGZ1bmN0aW9uIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxODkwNiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzo0Ni43MDAyNzEzN1oiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTg3ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMva2VybmZzL2Rpci5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5NTAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE5NTA6XFx0XFx0fVxcbjE5NTE6XFx0XFx0LyogU2tpcCBvdmVyIGVudHJpZXMgd2hpY2ggYXJlIGR5aW5nL2RlYWQgb3IgaW4gdGhlIHdyb25nIG5hbWVzcGFjZSAqL1xcbjE5NTI6XFx0XFx0d2hpbGUgKHBvcyBcXHUwMDI2XFx1MDAyNiAoIWtlcm5mc19hY3RpdmUocG9zKSB8fFxcbjE5NTM6XFx0XFx0XFx0ICAgICAgIGtlcm5mc19uc19pZChwb3MtXFx1MDAzZW5zKSAhPSBrZXJuZnNfbnNfaWQobnMpKSkge1xcbjE5NTQ6XFx0XFx0XFx0c3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KFxcdTAwMjZwb3MtXFx1MDAzZXJiKTtcXG4xOTU1OlxcdFxcdFxcdGlmICghbm9kZSlcXG4xOTU2OlxcdFxcdFxcdFxcdHBvcyA9IE5VTEw7XFxuMTk1NzpcXHRcXHRcXHRlbHNlXFxuMTk1ODpcXHRcXHRcXHRcXHRwb3MgPSByYl90b19rbihub2RlKTtcXG4xOTU5OlxcdFxcdH1cXG4xOTYwOlxcdFxcdHJldHVybiBwb3M7XFxuMTk2MTpcXHR9XFxuMTk2MjpcXHRcXG4xOTYzOlxcdHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfbmV4dF9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuMTk2NDpcXHRcXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxcbjE5NjU6XFx0XFx0Y29uc3QgY2hhciAqbmFtZSlcXG4xOTY2OlxcdHtcXG4xOTY3OlxcdFxcdGJvb2wgcmVzdW1lZDtcXG4xOTY4OlxcdFxcbjE5Njk6XFx0XFx0cG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgaGFzaCwgcG9zLCBuYW1lLCBcXHUwMDI2cmVzdW1lZCk7XFxuMTk3MDpcXHRcXHQvKiBTdGVwIG92ZXIgQHBvcyBvbmx5IGlmIGl0IHN1cnZpdmVkOyBAbmFtZSBmaW5kcyB0aGUgc3BvdCBpZiBub3QuICovXFxuMTk3MTpcXHRcXHRpZiAocG9zIFxcdTAwMjZcXHUwMDI2IHJlc3VtZWQpIHtcXG4xOTcyOlxcdFxcdFxcdGRvIHtcXG4xOTczOlxcdFxcdFxcdFxcdHN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dChcXHUwMDI2cG9zLVxcdTAwM2VyYik7XFxuMTk3NDpcXHRcXHRcXHRcXHRpZiAoIW5vZGUpXFxuMTk3NTpcXHRcXHRcXHRcXHRcXHRwb3MgPSBOVUxMO1xcbjE5NzY6XFx0XFx0XFx0XFx0ZWxzZVxcbjE5Nzc6XFx0XFx0XFx0XFx0XFx0cG9zID0gcmJfdG9fa24obm9kZSk7XFxuMTk3ODpcXHRcXHRcXHR9IHdoaWxlIChwb3MgXFx1MDAyNlxcdTAwMjYgKCFrZXJuZnNfYWN0aXZlKHBvcykgfHxcXG4xOTc5OlxcdFxcdFxcdFxcdGtlcm5mc19uc19pZChwb3MtXFx1MDAzZW5zKSAhPSBrZXJuZnNfbnNfaWQobnMpKSk7XFxuMTk4MDpcXHRcXHR9XFxuMTk4MTpcXHRcXHRyZXR1cm4gcG9zO1xcbjE5ODI6XFx0fVxcbjE5ODM6XFx0XFxuMTk4NDpcXHRzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuMTk4NTpcXHR7XFxuMTk4NjpcXHRcXHRzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLVxcdTAwM2VmX3BhdGguZGVudHJ5O1xcbjE5ODc6XFx0XFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTtcXG4xOTg4OlxcdFxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbjE5ODk6XFx0XFx0Y2hhciAqbmFtZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzM6NDYuNzAwMzkyMVoiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyOTg1NDg1NjgxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqRGl2aW5nIGludG8ga2VybmZzX2ZvcF9yZWFkZGlyKipcblxuUmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBXZSdyZSBpbiBga2VybmZzX2ZvcF9yZWFkZGlyYCwgd2hpY2ggbWVhbnMgd2UncmUgZGVhbGluZyB3aXRoIHRoZSBjb3JlIGxvZ2ljIGZvciBkaXJlY3RvcnkgcmVhZGluZyB3aXRoaW4gdGhlIGtlcm5mcyBmaWxlc3lzdGVtLiBUaGUgaW1tZWRpYXRlIGltcGxpY2F0aW9uIGlzIHRoYXQgd2UncmUgbGlrZWx5IHByb2Nlc3NpbmcgYSBkaXJlY3RvcnkgZW50cnkgbG9va3VwLCBwcm9iYWJseSB0cmlnZ2VyZWQgYnkgYSBgcmVhZGRpcigpYCBzeXN0ZW0gY2FsbC4gR2l2ZW4gbXkgZmFtaWxpYXJpdHkgd2l0aCBWRlMgc3RydWN0dXJlcywgSSdtIGV4cGVjdGluZyB0aGlzIGZ1bmN0aW9uIHRvIGludGVyZmFjZSBoZWF2aWx5IHdpdGgga2VybmZzJ3MgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIHByb3ZpZGUgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzLiBJJ2xsIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byBob3cgaXQgaGFuZGxlcyBgc3RydWN0IGtlcm5mc19ub2RlYCBlbnRyaWVzIGFuZCBwb3RlbnRpYWxseSB0aGUgYXNzb2NpYXRlZCBgc3RydWN0IGtlcm5mc19kaXJfb3BzYCAob3Igc2ltaWxhcikgY2FsbGJhY2tzIHRvIHNlZSBob3cgaXQgbWFuYWdlcyBpdGVyYXRpb24gYW5kIGZpbHRlcmluZyBvZiB0aG9zZSBkaXJlY3RvcnkgZW50cmllcy4gSSB3YW50IHRvIHNlZSBob3cgaXQgcmVzcGVjdHMgdGhlIGBvZmZzZXRgIHBhcmFtZXRlciBmb3Igc2Vla2luZyB3aXRoaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nIGFuZCBlbnN1cmVzIHRoYXQgaXQgaGFuZGxlcyB0aGUgYGZpbGxkaXJgIGZ1bmN0aW9uIGNvcnJlY3RseSB0byBjb25zdHJ1Y3QgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGZvciB1c2VyIHNwYWNlLiBVbHRpbWF0ZWx5LCBJJ20gdHJ5aW5nIHRvIHVuZGVyc3RhbmQgaG93IGtlcm5mcyBwcmVzZW50cyBpdHMgaGllcmFyY2hpY2FsIG9yZ2FuaXphdGlvbiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sIGFuZCBJJ2xsIGJlIGxvb2tpbmcgZm9yIGFueSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3Igc3VidGxlIHJhY2UgY29uZGl0aW9ucy4gVGhlIHdob2xlIGZ1bmN0aW9uIHdpbGwgaGF2ZSB0byBiZSBleGFtaW5lZCBmb3IgdGhlc2UgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAwOTcsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjQ5LjY4NTg4MTg5MVoiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjgyMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMva2VybmZzL2Rpci5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5ODQsXG4gIFwiTGluZUNvdW50XCI6IDcwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE5ODQ6XFx0c3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbjE5ODU6XFx0e1xcbjE5ODY6XFx0XFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS1cXHUwMDNlZl9wYXRoLmRlbnRyeTtcXG4xOTg3OlxcdFxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50ID0ga2VybmZzX2RlbnRyeV9ub2RlKGRlbnRyeSk7XFxuMTk4ODpcXHRcXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4xOTg5OlxcdFxcdGNoYXIgKm5hbWUgX19mcmVlKGtmcmVlKSA9IE5VTEw7XFxuMTk5MDpcXHRcXHRzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3Q7XFxuMTk5MTpcXHRcXHRjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyA9IE5VTEw7XFxuMTk5MjpcXHRcXG4xOTkzOlxcdFxcdGlmICghZGlyX2VtaXRfZG90cyhmaWxlLCBjdHgpKVxcbjE5OTQ6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMTk5NTpcXHRcXG4xOTk2OlxcdFxcdC8qXFxuMTk5NzpcXHRcXHQgKiBPbmUgYnVmZmVyIGZvciB0aGUgY2FsbCwgaG9sZGluZyB0aGUgbmFtZSBvZiB0aGUgZW50cnkgdGhlIGxpc3RpbmdcXG4xOTk4OlxcdFxcdCAqIGlzIG9uLiAgUEFUSF9NQVg6IGtlcm5mcyBib3VuZHMgbm8gc2luZ2xlIG5hbWUuXFxuMTk5OTpcXHRcXHQgKi9cXG4yMDAwOlxcdFxcdG5hbWUgPSBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKTtcXG4yMDAxOlxcdFxcdGlmICghbmFtZSlcXG4yMDAyOlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjIwMDM6XFx0XFxuMjAwNDpcXHRcXHRyb290ID0ga2VybmZzX3Jvb3QocGFyZW50KTtcXG4yMDA1OlxcdFxcdGRvd25fcmVhZChcXHUwMDI2cm9vdC1cXHUwMDNla2VybmZzX3J3c2VtKTtcXG4yMDA2OlxcdFxcbjIwMDc6XFx0XFx0aWYgKGtlcm5mc19uc19lbmFibGVkKHBhcmVudCkpXFxuMjAwODpcXHRcXHRcXHRucyA9IGtlcm5mc19pbmZvKGRlbnRyeS1cXHUwMDNlZF9zYiktXFx1MDAzZW5zO1xcbjIwMDk6XFx0XFxuMjAxMDpcXHRcXHRmb3IgKHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGN0eC1cXHUwMDNlcG9zLCBwb3MsIE5VTEwsIE5VTEwpO1xcbjIwMTE6XFx0XFx0ICAgICBwb3M7XFxuMjAxMjpcXHRcXHQgICAgIHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LVxcdTAwM2Vwb3MsIHBvcywgbmFtZSkpIHtcXG4yMDEzOlxcdFxcdFxcdHVuc2lnbmVkIGludCB0eXBlID0gZnNfdW1vZGVfdG9fZHR5cGUocG9zLVxcdTAwM2Vtb2RlKTtcXG4yMDE0OlxcdFxcdFxcdGlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTtcXG4yMDE1OlxcdFxcdFxcdGludCBsZW47XFxuMjAxNjpcXHRcXG4yMDE3OlxcdFxcdFxcdC8qXFxuMjAxODpcXHRcXHRcXHQgKiBUaGUgY29weSBpcyBhbHNvIHRoZSByZXN1bWUga2V5LCBzbyBhIHRydW5jYXRlZCBuYW1lIHdvdWxkXFxuMjAxOTpcXHRcXHRcXHQgKiByZXN1bWUgaGVyZSBhZ2Fpbi4gIGdldG5hbWUoKSBjYXBzIGEgcGF0aCwgc28gb25seSBhblxcbjIwMjA6XFx0XFx0XFx0ICogaW4ta2VybmVsIGNhbGxlciBjYW4gZ2V0IGhlcmU7IGVuZCB0aGUgbGlzdGluZyBpbnN0ZWFkLlxcbjIwMjE6XFx0XFx0XFx0ICovXFxuMjAyMjpcXHRcXHRcXHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XFxuMjAyMzpcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGxlbiBcXHUwMDNjIDApKVxcbjIwMjQ6XFx0XFx0XFx0XFx0YnJlYWs7XFxuMjAyNTpcXHRcXG4yMDI2OlxcdFxcdFxcdGN0eC1cXHUwMDNlcG9zID0gcG9zLVxcdTAwM2VoYXNoO1xcbjIwMjc6XFx0XFx0XFx0ZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhID0gcG9zO1xcbjIwMjg6XFx0XFx0XFx0a2VybmZzX2dldChwb3MpO1xcbjIwMjk6XFx0XFxuMjAzMDpcXHRcXHRcXHQvKlxcbjIwMzE6XFx0XFx0XFx0ICogZGlyX2VtaXQoKSBjYW4gZmF1bHQsIHNvIHJ1biBpdCB1bmxvY2tlZC4gIEBwb3MgaXMgcGlubmVkXFxuMjAzMjpcXHRcXHRcXHQgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suXFxuMjAzMzpcXHRcXHRcXHQgKi9cXG4yMDM0OlxcdFxcdFxcdHVwX3JlYWQoXFx1MDAyNnJvb3QtXFx1MDAzZWtlcm5mc19yd3NlbSk7XFxuMjAzNTpcXHRcXHRcXHRpZiAoIWRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpKVxcbjIwMzY6XFx0XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjAzNzpcXHRcXHRcXHRkb3duX3JlYWQoXFx1MDAyNnJvb3QtXFx1MDAzZWtlcm5mc19yd3NlbSk7XFxuMjAzODpcXHRcXHR9XFxuMjAzOTpcXHRcXHR1cF9yZWFkKFxcdTAwMjZyb290LVxcdTAwM2VrZXJuZnNfcndzZW0pO1xcbjIwNDA6XFx0XFx0ZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhID0gTlVMTDtcXG4yMDQxOlxcdFxcdGN0eC1cXHUwMDNlcG9zID0gSU5UX01BWDtcXG4yMDQyOlxcdFxcdHJldHVybiAwO1xcbjIwNDM6XFx0fVxcbjIwNDQ6XFx0XFxuMjA0NTpcXHRjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGtlcm5mc19kaXJfZm9wcyA9IHtcXG4yMDQ2OlxcdFxcdC5yZWFkXFx0XFx0PSBnZW5lcmljX3JlYWRfZGlyLFxcbjIwNDc6XFx0XFx0Lml0ZXJhdGVfc2hhcmVkXFx0PSBrZXJuZnNfZm9wX3JlYWRkaXIsXFxuMjA0ODpcXHRcXHQucmVsZWFzZVxcdD0ga2VybmZzX2Rpcl9mb3BfcmVsZWFzZSxcXG4yMDQ5OlxcdFxcdC5sbHNlZWtcXHRcXHQ9IGdlbmVyaWNfZmlsZV9sbHNlZWssXFxuMjA1MDpcXHR9O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzo0OS42ODYwMTIxNjFaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjY3NTA5NTY4ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqUGF0Y2ggQW5hbHlzaXMgYW5kIE1lbW9yeSBTYWZldHkgRGVlcCBEaXZlKipcblxuT2theSwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoIGZvciBga2VybmZzX2ZvcF9yZWFkZGlyYC4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgaXQncyBkZXNpZ25lZCB0byBjb3JyZWN0IGhvdyBkaXJlY3RvcnkgaXRlcmF0aW9uIHJlc3VtZXMgYWZ0ZXIgYW4gZW50cnkgaXMgcmVtb3ZlZCBvciByZW5hbWVkLCB3aGljaCBpcyBhIGNvbW1vbiBzb3VyY2Ugb2Ygc3VidGxlIGJ1Z3MuIEkndmUgZ290IHRvIGVuc3VyZSB0aGUgZml4IGlzIGNvcnJlY3QsIGFuZCBhYnNvbHV0ZWx5IHdhdGVydGlnaHQgcmVnYXJkaW5nIG1lbW9yeSBzYWZldHkuXG5cblRoZSBjb3JlIG9mIHRoZSBwYXRjaCByZXZvbHZlcyBhcm91bmQgaW1wcm92aW5nIGBrZXJuZnNfZGlyX3Bvc2AuIFByZXZpb3VzbHksIHJlbHlpbmcgc29sZWx5IG9uIHRoZSBoYXNoIHRvIHJlc3VtZSBhIGRpcmVjdG9yeSBsaXN0aW5nIHdhcyBmbGF3ZWQsIGJlY2F1c2UgYSByZW5hbWUgY291bGQgcHJvZHVjZSBhIGNvbGxpc2lvbi4gSSBsaWtlIHRoYXQgdGhlIHBhdGNoIG5vdyB1c2VzIHRoZSBlbnRyeSBuYW1lIGluIGFkZGl0aW9uIHRvIHRoZSBoYXNoLiBJZiB0aGUgcG9zaXRpb24gZ2l2ZW4gaXMgbm90IHZhbGlkLCB0aGUgY29kZSBzZWFyY2hlcyB0aGUgcmItdHJlZS4gU21hcnQgbW92ZS5cblxuSSBzZWUgdGhhdCBhIGJ1ZmZlciwgYG5hbWVgLCBvZiBzaXplIGBQQVRIX01BWGAgaXMgYmVpbmcgYWxsb2NhdGVkIGFuZCBwb3B1bGF0ZWQgd2l0aCB0aGUgZW50cnkncyBuYW1lIHVzaW5nIGBzdHJzY3B5YC4gRHJvcHBpbmcgdGhlIHJlYWQgbG9jayBiZWZvcmUgdGhlIGBkaXJfZW1pdGAgY2FsbCBpcyBhbiBpbnRlcmVzdGluZyBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIGxldHRpbmcgYGRpcl9lbWl0YCBmYWlsIGFuZCByZXR1cm4gd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrLiBBbmQgdGhlbiB0aGUgbG9jayBpcyByZS1hY3F1aXJlZC5cblxuTm93LCBtZW1vcnkgc2FmZXR5IG5lZWRzIGEgbWV0aWN1bG91cyByZXZpZXcuIExldCdzIHN0YXJ0IHdpdGggYG5hbWVgLiBJdCBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AgYW5kIGlzICpjcml0aWNhbCogZm9yIHRoZSByZXN0IG9mIHRoZSBvcGVyYXRpb24uXG5cbkZpcnN0LCBJIHRyYWNlIGl0cyB1c2FnZS4gSXQgc2VlbXMgdGhhdCBgbmFtZWAgd2lsbCBiZSBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBhZnRlciBpdCdzIGFsbG9jYXRlZC4gSWYgdGhlIGluaXRpYWwgY2FsbCB0byBga2VybmZzX2Rpcl9wb3NgIHJldHVybnMgYE5VTExgLCB0aGVuIGBuYW1lYCBpcyBmcmVlZCBhbmQgbmV2ZXIgcmVhZC4gSWYgbm90LCBgc3Ryc2NweWAgaXMgY2FsbGVkLCBhbmQgYG5hbWVgIHdpbGwgYmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIGFueSByZWFkLiBUaGUgY29kZSB0aGVuIHBhc3NlcyBgbmFtZWAgdG8gdGhlIGBkaXJfZW1pdGAgZnVuY3Rpb24sIHdoaWNoIGluIHR1cm4gY2FsbHMgYSBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRlZCBieSB0aGUgY2FsbGVyLiBUaGlzIGNhbGxiYWNrLCBzdWNoIGFzIGBmaWxsZGlyNjRgLCBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGBuYW1lYCB0byB1c2VyIHNwYWNlLCBhbmQgdGhlIGxlbmd0aCBpcyBwYXNzZWQgdG8gbWFrZSBzdXJlIGl0IGNvcGllcyBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcuXG5cblRoZSBsb29wIHRoZW4gY29udGludWVzLCBjYWxsaW5nIGBrZXJuZnNfZGlyX25leHRfcG9zYC4gVGhpcyBjYWxscyBga2VybmZzX2Rpcl9wb3NgLCB3aGljaCBjYWxscyBgc3RyY21wYCBvbiBgbmFtZWAuIGBzdHJjbXBgIGNoZWNrcyB1bnRpbCB0aGUgbnVsbCB0ZXJtaW5hdG9yLCBzbyB0aGVyZSdzIG5vIHdheSB0byByZWFkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJbiB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbiwgYG5hbWVgIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyBlbnRyeSBuYW1lLiBgc3Ryc2NweWAgaGFuZGxlcyBhbGwgdGhlIGltcG9ydGFudCBwYXJ0cyB0byBwcmV2ZW50IHJlYWRpbmcgYmV5b25kIHRoZSBpbml0aWFsaXplZCBwcmVmaXggb2YgYG5hbWVgLlxuXG5CdXQsIHdoYXQgaWYgYGRpcl9lbWl0YCByZXR1cm5zIGBmYWxzZWA/IFRoZSBmdW5jdGlvbiBleGl0cywgYW5kIGBuYW1lYCBpcyBmcmVlZC4gQW5kIHdoYXQgaWYgYGRvd25fcmVhZGAgd2Fzbid0IHVubG9ja2VkLCBhbmQgYGRpcl9lbWl0YCBmYWlsZWQ/IE5vdGhpbmcsIGJlY2F1c2UgdGhlIHJlYWQgbG9jayB3YXMgZHJvcHBlZCBiZWZvcmUgYGRpcl9lbWl0YCB3YXMgY2FsbGVkLCBhbmQgaXQgZG9lcyB0aGUgcmlnaHQgdGhpbmcuXG5cbkFuZCB3aGF0IGlmIHRoZSBgc3Ryc2NweWAgZmFpbHM/IFRoZXJlJ3MgYSBjaGVjaywgYW5kIGlmIGl0IGZhaWxzLCB0aGVuIHRoZSBjb2RlIHdpbGwgZXhpdCwgc28gdGhlcmUgaXMgbm8gcHJvYmxlbSBoZXJlLlxuXG5Pa2F5LCBsZXQncyB0aGluayBhYm91dCB0aGUgYGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhYCBmaWVsZC4gSXQgbG9va3MgbGlrZSBpdCBzYXZlcyB0aGUgbGFzdCBwb3NpdGlvbiBhbmQgaW5jcmVtZW50cyB0aGUgcmVmY291bnQuIElmIHRoZSBgZGlyX2VtaXRgIGNhbGwgZmFpbHMsIHRoYXQncyBmaW5lOyB0aGUgcmVmY291bnQgb24gYHBvc2AgaXMgc3RpbGwgaW5jcmVtZW50ZWQuIElmIHRoZSBuZXh0IGByZWFkZGlyYCBpcyBjYWxsZWQsIHRoZSBzYXZlZCBwb3NpdGlvbiBpcyByZXRyaWV2ZWQgYW5kIHRoZSByZWZjb3VudCByZWxlYXNlZC5cblxuVGhlcmUncyBubyBwcm9ibGVtIGhlcmUuIEJ1dCBhcmUgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlcyBsdXJraW5nIGVsc2V3aGVyZT8gTGV0J3MgY2hlY2s6XG5cbkkgbmVlZCB0byBsb29rIGNhcmVmdWxseSBhdCB0aGUgYGJvb2wgKnJlc3VtZWRgIHZhcmlhYmxlIHRoYXQgaXMgcGFzc2VkIGFyb3VuZC4gQmFzZWQgb24gbXkgYXNzZXNzbWVudCwgdGhlIGByZXN1bWVkYCB2YXJpYWJsZSBpcyBhbHdheXMgaW5pdGlhbGl6ZWQuXG5cbkFuZCBmaW5hbGx5LCBga2VybmZzX3JjdV9uYW1lYCBpc24ndCByZXR1cm5pbmcgdW5pbml0aWFsaXplZCBtZW1vcnksIHNpbmNlIGl0IGlzIHJlZmVyZW5jaW5nIGBrbi1cdTAwM2VuYW1lYC5cblxuSSdtIGNvbmZpZGVudC4gVGhpcyBwYXRjaCBkb2Vzbid0IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZS4gSSdtIGdvaW5nIHRvIHNldCBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNTA4LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTkzNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjM0OjE2LjQzNjk3MTc5NloiLCJTZXEiOjQ0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDgxNDI2NDE4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtlcm5mc19yY3VfbmFtZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9rZXJuZnMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2tlcm5mcy9kaXIuYz0zNDY9c3RhdGljIGludCBrZXJuZnNfbmFtZV9jb21wYXJlKHVuc2lnbmVkIGludCBoYXNoLCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTM1OS1cXHRcXHRyZXR1cm4gMTtcXG5mcy9rZXJuZnMvZGlyLmM6MzYwOlxcdHJldHVybiBzdHJjbXAobmFtZSwga2VybmZzX3JjdV9uYW1lKGtuKSk7XFxuZnMva2VybmZzL2Rpci5jLTM2MS19XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MzYzPXN0YXRpYyBpbnQga2VybmZzX3NkX2NvbXBhcmUoY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICpsZWZ0LFxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTM2NS17XFxuZnMva2VybmZzL2Rpci5jOjM2NjpcXHRyZXR1cm4ga2VybmZzX25hbWVfY29tcGFyZShsZWZ0LVxcdTAwM2VoYXNoLCBrZXJuZnNfcmN1X25hbWUobGVmdCksIGxlZnQtXFx1MDAzZW5zLCByaWdodCk7XFxuZnMva2VybmZzL2Rpci5jLTM2Ny19XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9ODIzPWludCBrZXJuZnNfYWRkX29uZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKVxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTgzNy1cXHRcXHQgaGFzX25zID8gXFxcInJlcXVpcmVkXFxcIiA6IFxcXCJpbnZhbGlkXFxcIixcXG5mcy9rZXJuZnMvZGlyLmM6ODM4OlxcdFxcdCBrZXJuZnNfcmN1X25hbWUocGFyZW50KSwga2VybmZzX3JjdV9uYW1lKGtuKSkpXFxuZnMva2VybmZzL2Rpci5jLTgzOS1cXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtODQ3LVxcbmZzL2tlcm5mcy9kaXIuYzo4NDg6XFx0a24tXFx1MDAzZWhhc2ggPSBrZXJuZnNfbmFtZV9oYXNoKGtlcm5mc19yY3VfbmFtZShrbiksIGtuLVxcdTAwM2Vucyk7XFxuZnMva2VybmZzL2Rpci5jLTg0OS1cXG4tLVxcbmZzL2tlcm5mcy9kaXIuYz04OTI9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2ZpbmRfbnMoc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtOTAzLVxcdFxcdFdBUk4oMSwgS0VSTl9XQVJOSU5HIFxcXCJrZXJuZnM6IG5zICVzIGluICclcycgZm9yICclcydcXFxcblxcXCIsXFxuZnMva2VybmZzL2Rpci5jOjkwNDpcXHRcXHQgICAgIGhhc19ucyA/IFxcXCJyZXF1aXJlZFxcXCIgOiBcXFwiaW52YWxpZFxcXCIsIGtlcm5mc19yY3VfbmFtZShwYXJlbnQpLCBuYW1lKTtcXG5mcy9rZXJuZnMvZGlyLmMtOTA1LVxcdFxcdHJldHVybiBOVUxMO1xcbi0tXFxuZnMva2VybmZzL2Rpci5jPTExNzc9c3RhdGljIGludCBrZXJuZnNfZG9wX3JldmFsaWRhdGUoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLFxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTEyMTQtXFx0LyogVGhlIGtlcm5mcyBub2RlIGhhcyBiZWVuIHJlbmFtZWQgKi9cXG5mcy9rZXJuZnMvZGlyLmM6MTIxNTpcXHRrbl9uYW1lID0ga2VybmZzX3JjdV9uYW1lKGtuKTtcXG5mcy9rZXJuZnMvZGlyLmMtMTIxNi1cXHRpZiAobmFtZS1cXHUwMDNlbGVuICE9IHN0cmxlbihrbl9uYW1lKSB8fFxcbi0tXFxuZnMva2VybmZzL2Rpci5jPTE1Mjk9c3RhdGljIHZvaWQgX19rZXJuZnNfcmVtb3ZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTU0Ni1cXG5mcy9rZXJuZnMvZGlyLmM6MTU0NzpcXHRwcl9kZWJ1ZyhcXFwia2VybmZzICVzOiByZW1vdmluZ1xcXFxuXFxcIiwga2VybmZzX3JjdV9uYW1lKGtuKSk7XFxuZnMva2VybmZzL2Rpci5jLTE1NDgtXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTgxMT1pbnQga2VybmZzX3JlbmFtZV9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLCBzdHJ1Y3Qga2VybmZzX25vZGUgKm5ld19wYXJlbnQsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTgzOS1cXHRlcnJvciA9IDA7XFxuZnMva2VybmZzL2Rpci5jOjE4NDA6XFx0b2xkX25hbWUgPSBrZXJuZnNfcmN1X25hbWUoa24pO1xcbmZzL2tlcm5mcy9kaXIuYy0xODQxLVxcdGlmICghbmV3X25hbWUpXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTkxMD1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0xOTI0LVxcdFxcdFxcdGhhc2ggPT0gcG9zLVxcdTAwM2VoYXNoIFxcdTAwMjZcXHUwMDI2XFxuZnMva2VybmZzL2Rpci5jOjE5MjU6XFx0XFx0XFx0KCFuYW1lIHx8ICFzdHJjbXAobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcykpKTtcXG5mcy9rZXJuZnMvZGlyLmMtMTkyNi1cXHRcXHRrZXJuZnNfcHV0KHBvcyk7XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTk4ND1zdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMjAyMS1cXHRcXHQgKi9cXG5mcy9rZXJuZnMvZGlyLmM6MjAyMjpcXHRcXHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XFxuZnMva2VybmZzL2Rpci5jLTIwMjMtXFx0XFx0aWYgKFdBUk5fT05fT05DRShsZW4gXFx1MDAzYyAwKSlcXG4tLVxcbmZzL2tlcm5mcy9maWxlLmM9OTA1PXN0YXRpYyB2b2lkIGtlcm5mc19ub3RpZnlfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4tLVxcbmZzL2tlcm5mcy9maWxlLmMtOTQzLVxcbmZzL2tlcm5mcy9maWxlLmM6OTQ0OlxcdFxcdGtuX25hbWUgPSBrZXJuZnNfcmN1X25hbWUoa24pO1xcbmZzL2tlcm5mcy9maWxlLmMtOTQ1LVxcdFxcdG5hbWUgPSBRU1RSKGtuX25hbWUpO1xcbi0tXFxuZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oPTExMz1zdGF0aWMgaW5saW5lIGJvb2wga2VybmZzX3JlbmFtZV9pc19sb2NrZWQoY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICprbilcXG4tLVxcbmZzL2tlcm5mcy9rZXJuZnMtaW50ZXJuYWwuaC0xMTctXFxuZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oOjExODpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmtlcm5mc19yY3VfbmFtZShjb25zdCBzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKVxcbmZzL2tlcm5mcy9rZXJuZnMtaW50ZXJuYWwuaC0xMTkte1xcbi0tXFxuZnMva2VybmZzL21vdW50LmM9MjMyPXN0cnVjdCBkZW50cnkgKmtlcm5mc19ub2RlX2RlbnRyeShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLFxcbi0tXFxuZnMva2VybmZzL21vdW50LmMtMjc2LVxcdFxcdFxcdH1cXG5mcy9rZXJuZnMvbW91bnQuYzoyNzc6XFx0XFx0XFx0bmFtZSA9IGtzdHJkdXAoa2VybmZzX3JjdV9uYW1lKGtudG1wKSwgR0ZQX0tFUk5FTCk7XFxuZnMva2VybmZzL21vdW50LmMtMjc4LVxcdFxcdH1cXG4tLVxcbmZzL2tlcm5mcy9zeW1saW5rLmM9Njc9c3RhdGljIGludCBrZXJuZnNfZ2V0X3RhcmdldF9wYXRoKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LFxcbi0tXFxuZnMva2VybmZzL3N5bWxpbmsuYy05NC1cXHR3aGlsZSAoa2VybmZzX3BhcmVudChrbikgXFx1MDAyNlxcdTAwMjYga24gIT0gYmFzZSkge1xcbmZzL2tlcm5mcy9zeW1saW5rLmM6OTU6XFx0XFx0bGVuICs9IHN0cmxlbihrZXJuZnNfcmN1X25hbWUoa24pKSArIDE7XFxuZnMva2VybmZzL3N5bWxpbmsuYy05Ni1cXHRcXHRrbiA9IGtlcm5mc19wYXJlbnQoa24pO1xcbi0tXFxuZnMva2VybmZzL3N5bWxpbmsuYy0xMDgtXFx0d2hpbGUgKGtlcm5mc19wYXJlbnQoa24pIFxcdTAwMjZcXHUwMDI2IGtuICE9IGJhc2UpIHtcXG5mcy9rZXJuZnMvc3ltbGluay5jOjEwOTpcXHRcXHRjb25zdCBjaGFyICpuYW1lID0ga2VybmZzX3JjdV9uYW1lKGtuKTtcXG5mcy9rZXJuZnMvc3ltbGluay5jLTExMC1cXHRcXHRpbnQgc2xlbiA9IHN0cmxlbihuYW1lKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzQ6MTYuOTE4NDA0NDI1WiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE0MTAwNTQ4OTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gS2VybmZzIEludGVybmFscyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYGtlcm5mc2AgYmVoYXZpb3IgYSBiaXQgYmV0dGVyLiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSdtIGdvaW5nIHRvIHN0YXJ0IHdpdGggdGhlIGludGVybmFsIGhlYWRlciBmaWxlcywgc3BlY2lmaWNhbGx5IGBmcy9rZXJuZnMva2VybmZzLWludGVybmFsLmhgLiBMZXQncyBuYXZpZ2F0ZSB0byBhcm91bmQgbGluZSAxMTgg4oCTIHRoYXQncyBvZnRlbiBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgY29yZSBkYXRhIHN0cnVjdHVyZXMgb3IgaW5pdGlhbGl6YXRpb24gcm91dGluZXMsIGRlcGVuZGluZyBvbiBob3cgdGhpcyBwYXJ0aWN1bGFyIGNvZGViYXNlIGlzIHN0cnVjdHVyZWQuIEknbSBob3BpbmcgdG8gZmluZCBzb21ldGhpbmcgcmVsZXZhbnQgdGhlcmUgdGhhdCdsbCBzaGVkIHNvbWUgbGlnaHQgb24gdGhlIGlzc3VlIEknbSB3b3JraW5nIG9uLiBMZXQncyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSSBzdXNwZWN0IHRoaXMgd2lsbCBiZSB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU5NTYsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozNDozMS4wMTg5NTY3NzVaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzE3ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNSxcbiAgXCJMaW5lQ291bnRcIjogMTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDExNTpcXHRcXHRyZXR1cm4gbG9ja2RlcF9pc19oZWxkKFxcdTAwMjZrZXJuZnNfcm9vdChrbiktXFx1MDAzZWtlcm5mc19yZW5hbWVfbG9jayk7XFxuIDExNjpcXHR9XFxuIDExNzpcXHRcXG4gMTE4OlxcdHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqa2VybmZzX3JjdV9uYW1lKGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXFxuIDExOTpcXHR7XFxuIDEyMDpcXHRcXHQvKlxcbiAxMjE6XFx0XFx0ICogTGlrZSBrZXJuZnNfbm9kZTo6X19wYXJlbnQgYmVsb3csIHRoZSBuYW1lIGlzIG9ubHkgcmVwbGFjZWQgdW5kZXJcXG4gMTIyOlxcdFxcdCAqIGJvdGgga2VybmZzX3Jvb3Q6Omtlcm5mc19yd3NlbSBhbmQga2VybmZzX3Jvb3Q6Omtlcm5mc19yZW5hbWVfbG9jayxcXG4gMTIzOlxcdFxcdCAqIHNvIGVpdGhlciBvbmUga2VlcHMgaXQsIGFuZCB0aGUgc3RyaW5nIGl0IHBvaW50cyBhdCwgc3RhYmxlLlxcbiAxMjQ6XFx0XFx0ICovXFxuIDEyNTpcXHRcXHRyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGtuLVxcdTAwM2VuYW1lLFxcbiAxMjY6XFx0XFx0XFx0XFx0XFx0ICAgICBrZXJuZnNfcm9vdF9pc19sb2NrZWQoa24pIHx8XFxuIDEyNzpcXHRcXHRcXHRcXHRcXHQgICAgIGtlcm5mc19yZW5hbWVfaXNfbG9ja2VkKGtuKSk7XFxuIDEyODpcXHR9XFxuIDEyOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzQ6MzEuMDE5MDMwNTQ1WiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMxNTU1MDU1MjgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBLZXJuZnMgRGlyZWN0b3J5IFJlc3VtcHRpb24gUGF0Y2gqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJIHNlZSwgdGhpcyBwYXRjaCBpcyBhZGRyZXNzaW5nIGEgdHJpY2t5IHByb2JsZW0gaW4ga2VybmZzJyBgcmVhZGRpcmAgYW5kIGBnZXRkZW50c2AgaW1wbGVtZW50YXRpb24sIHNwZWNpZmljYWxseSB3aGVuIGVudHJpZXMgYXJlIHJlbW92ZWQgb3IgcmVuYW1lZCB3aGlsZSBkaXJlY3RvcnkgaXRlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY29yZSBvZiB0aGUgZml4IHJldm9sdmVzIGFyb3VuZCBob3cgdGhlIGNvZGUgaGFuZGxlcyB0aGUgZGlyZWN0b3J5IGVudHJ5IG5hbWUsIGhhc2gsIGFuZCB0aGUgYXNzb2NpYXRlZCBsb2NraW5nIG1lY2hhbmlzbXMuXG5cblRoZSB0ZXN0IGNvbW1lbnRzIGFyZSBrZXkgaGVyZS4gVGhleSBleHBsaWNpdGx5IGNhbGwgb3V0IExPQ0tERVAgYW5kIEtBU0FOLiBNeSBleHBlcnQgaW50dWl0aW9uIGltbWVkaWF0ZWx5IGZsYWdzIHRoaXMgYXMgYSBzaWduIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoIGEgY2hhbmdlIHRoYXQgaW1wYWN0cyBsb2NraW5nIGFuZCBjb25jdXJyZW5jeS4gVGhlIHBhdGNoICpjaGFuZ2VzKiBsb2NraW5nLiBXZSdyZSBkcm9wcGluZyBgcm9vdC1cdTAwM2VrZXJuZnNfcndzZW1gIGJlZm9yZSBgZGlyX2VtaXQoKWAgYW5kIHRoZW4gcmVhY3F1aXJpbmcgaXQuIFBsdXMsIHdlJ3JlIHBpbm5pbmcgdGhlIGBwb3NgIHdpdGggYGtlcm5mc19nZXQocG9zKWAgYW5kIHJlLXZlcmlmeWluZyBpdCBvbiByZXN1bWUuIFRoZSBjb21tZW50cyBjb25maXJtIG15IHN1c3BpY2lvbjogaXQncyBhbGwgYWJvdXQgZW5zdXJpbmcgdGhlIGl0ZXJhdG9yJ3MgdmFsaWRpdHkgYW5kIGF2b2lkaW5nIHJhY2VzIG9yIGNvbmN1cnJlbmN5IGlzc3VlcyBkdXJpbmcgZGlyZWN0b3J5IHRyYXZlcnNhbCwgZXNwZWNpYWxseSB3aGVuIGVudHJpZXMgYXJlIGJlaW5nIG1vZGlmaWVkIGNvbmN1cnJlbnRseS4gVGhlIGdvYWwgaXMgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGVuZCB1cCByZS12aXNpdGluZyBvciBza2lwcGluZyBkaXJlY3RvcnkgZW50cmllcy5cblxuTm93LCBsZXQncyBnZXQgaW50byB0aGUgS01TQU4gcXVlc3Rpb24uXG5cbkZpcnN0bHksIEkgY2hlY2tlZCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuIElzIHRoaXMgcGF0Y2ggcGFzc2luZyB1bmluaXRpYWxpemVkIGtlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2U/IE5vLiBUaGUgY29kZSdzIHVzaW5nIGBzdHJzY3B5YCwgc28gdGhlIGBuYW1lYCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIGJlaW5nIGNvcGllZC4gSXMgdGhlcmUgYnJhbmNoaW5nIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzPyBOb3BlLCB0aGUgYHJlc3VtZWRgIGJvb2xlYW4gaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIElzIHRoZXJlIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmUgYWxsb2NhdGlvbiB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkPyBOby4gVGhlIG9ubHkgYWxsb2NhdGlvbiBpcyBhIHNpbXBsZSBga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTClgIGZvciBgbmFtZWAuIERvZXMgaXQgYWx0ZXIgYm91bmRzIGNoZWNrcyBvciBsZW5ndGhzIGluIGEgd2F5IHRoYXQgY291bGQgbGVhZCB0byB1bmluaXRpYWxpemVkIGJ5dGVzIGJlaW5nIGFjY2Vzc2VkPyBOby4gVGhlIGxlbmd0aCBgbGVuYCBpcyBkZXJpdmVkIGZyb20gYHN0cnNjcHlgLCBlbnN1cmluZyBzYWZlIGJvdW5kcy5cblxuTXkgc2Vjb25kIGxpbmUgb2YgdGhpbmtpbmcgZm9jdXNlZCBvbiBwb3RlbnRpYWwgYnVncyBpdCBjb3VsZCBpbnRyb2R1Y2UuIEknbSBmb2N1c2luZyBvbiByYWNlIGNvbmRpdGlvbnMsIHVzZS1hZnRlci1mcmVlLCBhbmQgbG9ja2RlcCBwcm9ibGVtcyBhcm91bmQgZHJvcHBpbmcgYW5kIHJlYWNxdWlyaW5nIGByb290LVx1MDAzZWtlcm5mc19yd3NlbWAuIEknbSBhbHNvIHRoaW5raW5nIGFib3V0IGl0ZXJhdG9yIGNvcnJlY3RuZXNzIOKAkyBtYWtpbmcgc3VyZSB3ZSBkb24ndCBzZWUgZHVwbGljYXRlIGVudHJpZXMgb3IgbWlzcyBlbnRyaWVzIOKAkyBhbmQgbGlmZXRpbWUgaXNzdWVzIHJlbGF0ZWQgdG8gYHBvc2AuXG5cblRoZSBnb29kIG5ld3MgaXMgdGhhdCB0aGVzZSBraW5kcyBvZiBjb25jdXJyZW5jeSwgbGlmZXRpbWUsIGxvY2tpbmcsIGFuZCBvdXQtb2YtYm91bmRzIHByb2JsZW1zIGFyZSBleGFjdGx5IHdoYXQgS0FTQU4gYW5kIExPQ0tERVAgYXJlIGRlc2lnbmVkIHRvIGNhdGNoLCBhbG9uZyB3aXRoIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgdG9vbHMuIFRoZSBwYXRjaCAqaXMqIHBsYXlpbmcgd2l0aCBsb2NrcyBhbmQgZGlyZWN0b3J5IGVudHJpZXMsIGJ1dCBpdCBpc24ndCBwbGF5aW5nIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuXG5cblNvLCBhZnRlciBhIHRob3JvdWdoIHJldmlldywgaXTigJlzIGNsZWFyIHRvIG1lOiB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlcnNwYWNlIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgS01TQU4gZnV6emluZy4gVGhlcmVmb3JlLCB0aGUgYE5lZWRzS01TQU5gIHRhZyBzaG91bGQgYmUgYGZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY0MzgsIk91dHB1dFRva2VucyI6MzMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODU2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzU6MDIuNTc0MDg5NTc3WiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk1NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIGtlcm5mcyBkaXJlY3RvcnkgaXRlcmF0aW9uIChga2VybmZzX2ZvcF9yZWFkZGlyYCkgdG8gcHJvcGVybHkgaGFuZGxlIHJlYWRkaXIgcmVzdW1wdGlvbiB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgb3IgcmVuYW1lZCBjb25jdXJyZW50bHksIGJ5IGtleWluZyBwb3NpdGlvbiBvbiB0aGUgbm9kZSBuYW1lIGluIGFkZGl0aW9uIHRvIGl0cyBoYXNoIGFuZCBkcm9wcGluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0KClgLlxcblxcbi0gTWVtb3J5IGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uOiBBIHRlbXBvcmFyeSBidWZmZXIgYG5hbWVgIGlzIGFsbG9jYXRlZCB2aWEgYGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpYC4gQmVmb3JlIGFueSByZWFkLCBpdCBpcyBwb3B1bGF0ZWQgdXNpbmcgYHN0cnNjcHkobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcyksIFBBVEhfTUFYKWAuIFRoZSBzdHJpbmcgY29tcGFyaXNvbiBmdW5jdGlvbnMgKGBzdHJjbXBgKSBhbmQgYGRpcl9lbWl0KClgIG9ubHkgYWNjZXNzIHRoZSBwb3B1bGF0ZWQsIE5VTC10ZXJtaW5hdGVkIHByZWZpeCBvZiBsZW5ndGggYGxlbmAuIE5vIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBidWZmZXIgYXJlIHJlYWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS5cXG4tIExvY2FsIHZhcmlhYmxlczogVGhlIHN0YWNrIHZhcmlhYmxlIGBib29sIHJlc3VtZWRgIHBhc3NlZCB0byBga2VybmZzX2Rpcl9wb3MoKWAgaXMgdW5jb25kaXRpb25hbGx5IGluaXRpYWxpemVkIHRvIGBmYWxzZWAgdXBvbiBlbnRyeSB0byBga2VybmZzX2Rpcl9wb3MoKWAuXFxuLSBQcmltYXJ5IHJpc2tzOiBUaGUgcGF0Y2ggbW9kaWZpZXMgbG9ja2luZyBiZWhhdmlvciAoZHJvcHBpbmcgYW5kIHJlLWFjcXVpcmluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0YCkgYW5kIG5vZGUgcmVmY291bnRpbmcvdmFsaWRhdGlvbi4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb3RlbnRpYWwgY29uY3VycmVuY3kgcmFjZXMsIGxvY2sgaW52ZXJzaW9uLCBhbmQgbGlmZXRpbWUvdXNlLWFmdGVyLWZyZWUgYnVncywgd2hpY2ggYXJlIGZ1bGx5IGNvdmVyZWQgYnkgTE9DS0RFUCBhbmQgS0FTQU4uXFxuXFxuQmVjYXVzZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIGJlIHVuaXF1ZWx5IGRldGVjdGVkIGJ5IEtNU0FOLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMga2VybmZzIGRpcmVjdG9yeSBpdGVyYXRpb24gKGBrZXJuZnNfZm9wX3JlYWRkaXJgKSB0byBwcm9wZXJseSBoYW5kbGUgcmVhZGRpciByZXN1bXB0aW9uIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBvciByZW5hbWVkIGNvbmN1cnJlbnRseSwgYnkga2V5aW5nIHBvc2l0aW9uIG9uIHRoZSBub2RlIG5hbWUgaW4gYWRkaXRpb24gdG8gaXRzIGhhc2ggYW5kIGRyb3BwaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXQoKWAuXFxuXFxuLSBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb246IEEgdGVtcG9yYXJ5IGJ1ZmZlciBgbmFtZWAgaXMgYWxsb2NhdGVkIHZpYSBga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTClgLiBCZWZvcmUgYW55IHJlYWQsIGl0IGlzIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpYC4gVGhlIHN0cmluZyBjb21wYXJpc29uIGZ1bmN0aW9ucyAoYHN0cmNtcGApIGFuZCBgZGlyX2VtaXQoKWAgb25seSBhY2Nlc3MgdGhlIHBvcHVsYXRlZCwgTlVMLXRlcm1pbmF0ZWQgcHJlZml4IG9mIGxlbmd0aCBgbGVuYC4gTm8gdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZmZlciBhcmUgcmVhZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLlxcbi0gTG9jYWwgdmFyaWFibGVzOiBUaGUgc3RhY2sgdmFyaWFibGUgYGJvb2wgcmVzdW1lZGAgcGFzc2VkIHRvIGBrZXJuZnNfZGlyX3BvcygpYCBpcyB1bmNvbmRpdGlvbmFsbHkgaW5pdGlhbGl6ZWQgdG8gYGZhbHNlYCB1cG9uIGVudHJ5IHRvIGBrZXJuZnNfZGlyX3BvcygpYC5cXG4tIFByaW1hcnkgcmlza3M6IFRoZSBwYXRjaCBtb2RpZmllcyBsb2NraW5nIGJlaGF2aW9yIChkcm9wcGluZyBhbmQgcmUtYWNxdWlyaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXRgKSBhbmQgbm9kZSByZWZjb3VudGluZy92YWxpZGF0aW9uLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIHBvdGVudGlhbCBjb25jdXJyZW5jeSByYWNlcywgbG9jayBpbnZlcnNpb24sIGFuZCBsaWZldGltZS91c2UtYWZ0ZXItZnJlZSBidWdzLCB3aGljaCBhcmUgZnVsbHkgY292ZXJlZCBieSBMT0NLREVQIGFuZCBLQVNBTi5cXG5cXG5CZWNhdXNlIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrIHJpc2tzIHRoYXQgd291bGQgYmUgdW5pcXVlbHkgZGV0ZWN0ZWQgYnkgS01TQU4sIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdxx9w[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-11 18:29:30 +0000 UTC FinishedAt: 2026-09-11 18:35:04 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "7f24d0f60b1087dbc28d68398957c18774e5a7d8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KERNFS", "SYSFS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "7f24d0f60b1087dbc28d68398957c18774e5a7d8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KERNFS", "SYSFS" ], "series_id": "6d0f4da5-c389-41c6-b862-7b08f467ebd1" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "kernfs_fop_readdir", "kernfs_dir_pos", "kernfs_dir_next_pos" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "7f24d0f60b1087dbc28d68398957c18774e5a7d8", "base_tree": "vfs" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFUk5GUyYjMzQ7LAogICAgJiMzNDtTWVNGUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2tlcm5mc19mb3BfcmVhZGRpciYjMzQ7LAogICAgJiMzNDtrZXJuZnNfZGlyX3BvcyYjMzQ7LAogICAgJiMzNDtrZXJuZnNfZGlyX25leHRfcG9zJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyBrZXJuZnMgZGlyZWN0b3J5IGl0ZXJhdGlvbiAoYGtlcm5mc19mb3BfcmVhZGRpcmApIHRvIHByb3Blcmx5IGhhbmRsZSByZWFkZGlyIHJlc3VtcHRpb24gd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIG9yIHJlbmFtZWQgY29uY3VycmVudGx5LCBieSBrZXlpbmcgcG9zaXRpb24gb24gdGhlIG5vZGUgbmFtZSBpbiBhZGRpdGlvbiB0byBpdHMgaGFzaCBhbmQgZHJvcHBpbmcgYGtlcm5mc19yd3NlbWAgYXJvdW5kIGBkaXJfZW1pdCgpYC5cblxuLSBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb246IEEgdGVtcG9yYXJ5IGJ1ZmZlciBgbmFtZWAgaXMgYWxsb2NhdGVkIHZpYSBga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTClgLiBCZWZvcmUgYW55IHJlYWQsIGl0IGlzIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpYC4gVGhlIHN0cmluZyBjb21wYXJpc29uIGZ1bmN0aW9ucyAoYHN0cmNtcGApIGFuZCBgZGlyX2VtaXQoKWAgb25seSBhY2Nlc3MgdGhlIHBvcHVsYXRlZCwgTlVMLXRlcm1pbmF0ZWQgcHJlZml4IG9mIGxlbmd0aCBgbGVuYC4gTm8gdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZmZlciBhcmUgcmVhZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLlxuLSBMb2NhbCB2YXJpYWJsZXM6IFRoZSBzdGFjayB2YXJpYWJsZSBgYm9vbCByZXN1bWVkYCBwYXNzZWQgdG8gYGtlcm5mc19kaXJfcG9zKClgIGlzIHVuY29uZGl0aW9uYWxseSBpbml0aWFsaXplZCB0byBgZmFsc2VgIHVwb24gZW50cnkgdG8gYGtlcm5mc19kaXJfcG9zKClgLlxuLSBQcmltYXJ5IHJpc2tzOiBUaGUgcGF0Y2ggbW9kaWZpZXMgbG9ja2luZyBiZWhhdmlvciAoZHJvcHBpbmcgYW5kIHJlLWFjcXVpcmluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0YCkgYW5kIG5vZGUgcmVmY291bnRpbmcvdmFsaWRhdGlvbi4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb3RlbnRpYWwgY29uY3VycmVuY3kgcmFjZXMsIGxvY2sgaW52ZXJzaW9uLCBhbmQgbGlmZXRpbWUvdXNlLWFmdGVyLWZyZWUgYnVncywgd2hpY2ggYXJlIGZ1bGx5IGNvdmVyZWQgYnkgTE9DS0RFUCBhbmQgS0FTQU4uXG5cbkJlY2F1c2UgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWsgcmlza3MgdGhhdCB3b3VsZCBiZSB1bmlxdWVseSBkZXRlY3RlZCBieSBLTVNBTiwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMga2VybmZzIGRpcmVjdG9yeSBsaXN0aW5nIChyZWFkZGlyIC8gZ2V0ZGVudHMpIGFuZCByZXN1bWUgdHJhdmVyc2FsIGxvZ2ljIGluIGZzL2tlcm5mcy9kaXIuYy4gU3BlY2lmaWNhbGx5LCBpdCB1cGRhdGVzIGtlcm5mc19kaXJfcG9zIGFuZCBrZXJuZnNfZGlyX25leHRfcG9zIHRvIHJlc3VtZSByZWFkZGlyIGJhc2VkIG9uIGVudHJ5IG5hbWUgY29tcGFyaXNvbiB3aXRoaW4gdGhlIHJiLXRyZWUsIGFkZHMgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIHJlc3VtZSBrZXkgbmFtZSwgaW50cm9kdWNlcyBhIFdBUk5fT05fT05DRSBjaGVjayBvbiBuYW1lIHRydW5jYXRpb24sIGFuZCByZWxlYXNlcy9yZWFjcXVpcmVzIHJvb3QtXHUwMDNla2VybmZzX3J3c2VtIGFyb3VuZCBkaXJfZW1pdCgpLiBUaGVzZSBjaGFuZ2VzIHRvdWNoIHJlYWNoYWJsZSBjb3JlIHZpcnR1YWwgZmlsZXN5c3RlbSBjb2RlIGV4ZXJjaXNlZCBieSB1c2VyIHNwYWNlIHZpYSBnZXRkZW50cy9nZXRkZW50czY0IG9uIHN5c2ZzIGFuZCBjZ3JvdXBzLCBpbnRyb2R1Y2luZyBjb25jdXJyZW5jeSB3aW5kb3dzIGFuZCBtb2RpZmllZCBsb2NraW5nIHNlbWFudGljcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGU1NTgwMjBlYWJhNjA1ZjYwODE3ZDU0ZDQ5NzFlY2RmMWNiNDUxZjBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAxODozMTo0MSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZGlyLmMgYi9mcy9rZXJuZnMvZGlyLmNcbmluZGV4IDA3YWJmNTlmMDI2NGEuLmNjNjI4OGQ1YjRjYzQgMTAwNjQ0XG4tLS0gYS9mcy9rZXJuZnMvZGlyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2tlcm5mcy9kaXIuY1xuQEAgLTE5MDMsMzMgJiM0MzsxOTAzLDQ5IEBAIHN0YXRpYyBpbnQga2VybmZzX2Rpcl9mb3BfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogRmluZCB3aGVyZSBhIGxpc3RpbmcgbGVmdCBvZmYuICBAcmVzdW1lZCBzYXlzIHdoZXRoZXIgQHBvcyBpcyBzdGlsbCB0aGF0XG4mIzQzOyAqIGVudHJ5OyBpZiBub3QsIHRoZSBzZWFyY2ggZmFsbHMgYmFjayB0byBAaGFzaCwga2V5ZWQgYnkgQG5hbWUgaWYgZ2l2ZW4uXG4mIzQzOyAqL1xuIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcylcbiYjNDM7XHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxuJiM0MztcdGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgKnJlc3VtZWQpXG4ge1xuJiM0MztcdGlmIChyZXN1bWVkKVxuJiM0MztcdFx0KnJlc3VtZWQgPSBmYWxzZTtcbiBcdGlmIChwb3MpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBBIHJlbmFtZSBrZWVwcyB0aGUgaGFzaCBpZiB0aGUgbmV3IG5hbWUgaGFzaGVzIHRoZSBzYW1lLCBzb1xuJiM0MztcdFx0ICogY2hlY2sgQG5hbWUgdG9vLiAgT3RoZXJ3aXNlIHRoZSBjYWxsZXIgd291bGQgc3RlcCBvdmVyIHRoZVxuJiM0MztcdFx0ICogZW50cnkgbm93IHNpdHRpbmcgd2hlcmUgQHBvcyB1c2VkIHRvIGJlLlxuJiM0MztcdFx0ICovXG4gXHRcdGludCB2YWxpZCA9IGtlcm5mc19hY3RpdmUocG9zKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHRyY3VfYWNjZXNzX3BvaW50ZXIocG9zLVx1MDAzZV9fcGFyZW50KSA9PSBwYXJlbnQgXHUwMDI2XHUwMDI2XG4tXHRcdFx0aGFzaCA9PSBwb3MtXHUwMDNlaGFzaDtcbiYjNDM7XHRcdFx0aGFzaCA9PSBwb3MtXHUwMDNlaGFzaCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0KCFuYW1lIHx8ICFzdHJjbXAobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcykpKTtcbiBcdFx0a2VybmZzX3B1dChwb3MpO1xuIFx0XHRpZiAoIXZhbGlkKVxuIFx0XHRcdHBvcyA9IE5VTEw7XG4mIzQzO1x0XHRlbHNlIGlmIChyZXN1bWVkKVxuJiM0MztcdFx0XHQqcmVzdW1lZCA9IHRydWU7XG4gXHR9XG4gXHRpZiAoIXBvcyBcdTAwMjZcdTAwMjYgKGhhc2ggXHUwMDNlIDEpIFx1MDAyNlx1MDAyNiAoaGFzaCBcdTAwM2MgSU5UX01BWCkpIHtcbiBcdFx0c3RydWN0IHJiX25vZGUgKm5vZGUgPSBwYXJlbnQtXHUwMDNlZGlyLmNoaWxkcmVuLnJiX25vZGU7XG4tXHRcdHU2NCBuc19pZCA9IGtlcm5mc19uc19pZChucyk7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIEtlZXAgYSBub2RlIG9ubHkgb24gdGhlIHdheSBsZWZ0LCBzbyB0aGUgc2VhcmNoIGVuZHMgb24gdGhlXG4mIzQzO1x0XHQgKiBmaXJzdCBlbnRyeSBhZnRlciB0aGUga2V5LiAgQW4gZW1wdHkgQG5hbWUgc29ydHMgYmVmb3JlIGFsbFxuJiM0MztcdFx0ICogZW50cmllcyBzaGFyaW5nIHRoZSBoYXNoLCBzbyBpdCBsYW5kcyBvbiB0aGUgZmlyc3Qgb2YgdGhlbS5cbiYjNDM7XHRcdCAqL1xuIFx0XHR3aGlsZSAobm9kZSkge1xuLVx0XHRcdHBvcyA9IHJiX3RvX2tuKG5vZGUpO1xuJiM0MztcdFx0XHRzdHJ1Y3Qga2VybmZzX25vZGUgKmtuID0gcmJfdG9fa24obm9kZSk7XG4gXG4tXHRcdFx0aWYgKGhhc2ggXHUwMDNjIHBvcy1cdTAwM2VoYXNoKVxuLVx0XHRcdFx0bm9kZSA9IG5vZGUtXHUwMDNlcmJfbGVmdDtcbi1cdFx0XHRlbHNlIGlmIChoYXNoIFx1MDAzZSBwb3MtXHUwMDNlaGFzaClcbi1cdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX3JpZ2h0O1xuLVx0XHRcdGVsc2UgaWYgKG5zX2lkIFx1MDAzYyBrZXJuZnNfbnNfaWQocG9zLVx1MDAzZW5zKSlcbiYjNDM7XHRcdFx0aWYgKGtlcm5mc19uYW1lX2NvbXBhcmUoaGFzaCwgbmFtZSA/OiBcJiMzNDtcJiMzNDssIG5zLCBrbikgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0XHRwb3MgPSBrbjtcbiBcdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4tXHRcdFx0ZWxzZSBpZiAobnNfaWQgXHUwMDNlIGtlcm5mc19uc19pZChwb3MtXHUwMDNlbnMpKVxuJiM0MztcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0bm9kZSA9IG5vZGUtXHUwMDNlcmJfcmlnaHQ7XG4tXHRcdFx0ZWxzZVxuLVx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdH1cbiBcdFx0fVxuIFx0fVxuIFx0LyogU2tpcCBvdmVyIGVudHJpZXMgd2hpY2ggYXJlIGR5aW5nL2RlYWQgb3IgaW4gdGhlIHdyb25nIG5hbWVzcGFjZSAqL1xuQEAgLTE5NDUsMTAgJiM0MzsxOTYxLDE0IEBAIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGlub190IGlubywgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpXG4mIzQzO1x0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyxcbiYjNDM7XHRjb25zdCBjaGFyICpuYW1lKVxuIHtcbi1cdHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGlubywgcG9zKTtcbi1cdGlmIChwb3MpIHtcbiYjNDM7XHRib29sIHJlc3VtZWQ7XG4mIzQzO1xuJiM0MztcdHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGhhc2gsIHBvcywgbmFtZSwgXHUwMDI2cmVzdW1lZCk7XG4mIzQzO1x0LyogU3RlcCBvdmVyIEBwb3Mgb25seSBpZiBpdCBzdXJ2aXZlZDsgQG5hbWUgZmluZHMgdGhlIHNwb3QgaWYgbm90LiAqL1xuJiM0MztcdGlmIChwb3MgXHUwMDI2XHUwMDI2IHJlc3VtZWQpIHtcbiBcdFx0ZG8ge1xuIFx0XHRcdHN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dChcdTAwMjZwb3MtXHUwMDNlcmIpO1xuIFx0XHRcdGlmICghbm9kZSlcbkBAIC0xOTY2LDM0ICYjNDM7MTk4Niw1NSBAQCBzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4gXHRzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLVx1MDAzZWZfcGF0aC5kZW50cnk7XG4gXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCA9IGtlcm5mc19kZW50cnlfbm9kZShkZW50cnkpO1xuIFx0c3RydWN0IGtlcm5mc19ub2RlICpwb3MgPSBmaWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbiYjNDM7XHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuIFx0c3RydWN0IGtlcm5mc19yb290ICpyb290O1xuIFx0Y29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMO1xuIFxuIFx0aWYgKCFkaXJfZW1pdF9kb3RzKGZpbGUsIGN0eCkpXG4gXHRcdHJldHVybiAwO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogT25lIGJ1ZmZlciBmb3IgdGhlIGNhbGwsIGhvbGRpbmcgdGhlIG5hbWUgb2YgdGhlIGVudHJ5IHRoZSBsaXN0aW5nXG4mIzQzO1x0ICogaXMgb24uICBQQVRIX01BWDoga2VybmZzIGJvdW5kcyBubyBzaW5nbGUgbmFtZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRuYW1lID0ga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFuYW1lKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuIFx0cm9vdCA9IGtlcm5mc19yb290KHBhcmVudCk7XG4gXHRkb3duX3JlYWQoXHUwMDI2cm9vdC1cdTAwM2VrZXJuZnNfcndzZW0pO1xuIFxuIFx0aWYgKGtlcm5mc19uc19lbmFibGVkKHBhcmVudCkpXG4gXHRcdG5zID0ga2VybmZzX2luZm8oZGVudHJ5LVx1MDAzZWRfc2IpLVx1MDAzZW5zO1xuIFxuLVx0Zm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtXHUwMDNlcG9zLCBwb3MpO1xuJiM0MztcdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBOVUxMLCBOVUxMKTtcbiBcdCAgICAgcG9zO1xuLVx0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcykpIHtcbi1cdFx0Y29uc3QgY2hhciAqbmFtZSA9IGtlcm5mc19yY3VfbmFtZShwb3MpO1xuJiM0MztcdCAgICAgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtXHUwMDNlcG9zLCBwb3MsIG5hbWUpKSB7XG4gXHRcdHVuc2lnbmVkIGludCB0eXBlID0gZnNfdW1vZGVfdG9fZHR5cGUocG9zLVx1MDAzZW1vZGUpO1xuLVx0XHRpbnQgbGVuID0gc3RybGVuKG5hbWUpO1xuIFx0XHRpbm9fdCBpbm8gPSBrZXJuZnNfaW5vKHBvcyk7XG4mIzQzO1x0XHRpbnQgbGVuO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaGUgY29weSBpcyBhbHNvIHRoZSByZXN1bWUga2V5LCBzbyBhIHRydW5jYXRlZCBuYW1lIHdvdWxkXG4mIzQzO1x0XHQgKiByZXN1bWUgaGVyZSBhZ2Fpbi4gIGdldG5hbWUoKSBjYXBzIGEgcGF0aCwgc28gb25seSBhblxuJiM0MztcdFx0ICogaW4ta2VybmVsIGNhbGxlciBjYW4gZ2V0IGhlcmU7IGVuZCB0aGUgbGlzdGluZyBpbnN0ZWFkLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XG4mIzQzO1x0XHRpZiAoV0FSTl9PTl9PTkNFKGxlbiBcdTAwM2MgMCkpXG4mIzQzO1x0XHRcdGJyZWFrO1xuIFxuIFx0XHRjdHgtXHUwMDNlcG9zID0gcG9zLVx1MDAzZWhhc2g7XG4gXHRcdGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhID0gcG9zO1xuIFx0XHRrZXJuZnNfZ2V0KHBvcyk7XG4gXG4tXHRcdGlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpIHtcbi1cdFx0XHR1cF9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBkaXJfZW1pdCgpIGNhbiBmYXVsdCwgc28gcnVuIGl0IHVubG9ja2VkLiAgQHBvcyBpcyBwaW5uZWRcbiYjNDM7XHRcdCAqIGFib3ZlIGFuZCBrZXJuZnNfZGlyX3BvcygpIHJlY2hlY2tzIGl0IG9uIHRoZSB3YXkgYmFjay5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4mIzQzO1x0XHRpZiAoIWRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpKVxuIFx0XHRcdHJldHVybiAwO1xuLVx0XHR9XG4mIzQzO1x0XHRkb3duX3JlYWQoXHUwMDI2cm9vdC1cdTAwM2VrZXJuZnNfcndzZW0pO1xuIFx0fVxuIFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4gXHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IE5VTEw7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmNcbmluZGV4IDZlNzRkYTkxZWJjYTUuLjAxY2Q1OGU1ZTQxZTcgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG5AQCAtOCw2ICYjNDM7OCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NuZXQvaWYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3NjaGVkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc2lnbmFsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuQEAgLTE3LDYgJiM0MzsxOCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3lzL21vdW50LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zeXNjYWxsLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMveGF0dHIuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFwmIzM0O2tzZWxmdGVzdF9oYXJuZXNzLmhcJiMzNDtcbkBAIC00NzIsNiAmIzQzOzQ3NCwyMDQgQEAgVEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfbm9fZHVwbGljYXRlcylcbiBcdFx0XHRFWFBFQ1RfU1RSTkUobmFtZXNbaV0sIG5hbWVzW2pdKTtcbiB9XG4gXG4mIzQzOyNkZWZpbmUgUkVTVU1FX0RJUlNcdDI0XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXN1bWluZyBhdCBhbiBlbnRyeSB0aGF0IGhhcyBnb25lIG11c3QgY2Fycnkgb24gYWZ0ZXIgaXQsIG5ldmVyIGJlZm9yZS5cbiYjNDM7ICogVGFrZSBhIGNvb2tpZSBmb3IgZXZlcnkgZW50cnksIHRoZW4gcmVtb3ZlIGVhY2ggb25lLCBzZWVrIHRvIGl0cyBjb29raWVcbiYjNDM7ICogYW5kIHJlYWQgdGhlIHJlc3Q7IG5vdGhpbmcgYWxyZWFkeSByZXBvcnRlZCBtYXkgY29tZSBiYWNrLlxuJiM0MzsgKi9cbiYjNDM7VEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX2F0X3JlbW92ZWRfZW50cnkpXG4mIzQzO3tcbiYjNDM7XHQvKiBUaGUgY2dyb3VwJiMzOTtzIG93biBjb250cm9sIGZpbGVzIGFyZSBsaXN0ZWQgYWxvbmdzaWRlIG91cnMuICovXG4mIzQzO1x0Y2hhciBuYW1lc1sxMjhdW05BTUVfTUFYICYjNDM7IDFdO1xuJiM0MztcdGxvbmcgcG9zWzEyOF07XG4mIzQzO1x0Y2hhciBwYXRoW1BBVEhfTUFYXTtcbiYjNDM7XHRzdHJ1Y3QgZGlyZW50ICpkZTtcbiYjNDM7XHRpbnQgbiA9IDAsIGksIGo7XG4mIzQzO1x0RElSICpkO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRVNVTUVfRElSUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCYjMzQ7JXMvZSUwMmRcJiMzNDssIHNlbGYtXHUwMDNlc2NyYXRjaCwgaSk7XG4mIzQzO1x0XHRBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogUmVjb3JkIHRoZSBjb29raWUgYmVmb3JlIHJlYWRpbmcgZWFjaCBlbnRyeSwgd2l0aCBpdHMgbmFtZS4gKi9cbiYjNDM7XHRkID0gb3BlbmRpcihzZWxmLVx1MDAzZXNjcmF0Y2gpO1xuJiM0MztcdEFTU0VSVF9ORShkLCBOVUxMKTtcbiYjNDM7XHR3aGlsZSAoMSkge1xuJiM0MztcdFx0bG9uZyBoZXJlID0gdGVsbGRpcihkKTtcbiYjNDM7XG4mIzQzO1x0XHRkZSA9IHJlYWRkaXIoZCk7XG4mIzQzO1x0XHRpZiAoIWRlKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCYjMzQ7LlwmIzM0OykgfHwgIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIFwmIzM0Oy4uXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRBU1NFUlRfTFQobiwgKGludClBUlJBWV9TSVpFKHBvcykpO1xuJiM0MztcdFx0cG9zW25dID0gaGVyZTtcbiYjNDM7XHRcdHN0cm5jcHkobmFtZXNbbl0sIGRlLVx1MDAzZWRfbmFtZSwgTkFNRV9NQVgpO1xuJiM0MztcdFx0bmFtZXNbbl1bTkFNRV9NQVhdID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRcdG4mIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZWRpcihkKTtcbiYjNDM7XHRBU1NFUlRfR1QobiwgMSk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHQvKiBPbmx5IHRoZSBkaXJlY3RvcmllcyB3ZSBtYWRlIGNhbiBiZSByZW1vdmVkIGFuZCBwdXQgYmFjay4gKi9cbiYjNDM7XHRcdGlmIChzdHJuY21wKG5hbWVzW2ldLCBcJiMzNDtlXCYjMzQ7LCAxKSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcJiMzNDslcy8lc1wmIzM0Oywgc2VsZi1cdTAwM2VzY3JhdGNoLCBuYW1lc1tpXSk7XG4mIzQzO1x0XHRBU1NFUlRfRVEocm1kaXIocGF0aCksIDApO1xuJiM0MztcbiYjNDM7XHRcdC8qIFJlb3BlbiBzbyB0aGUgc2VlayBoYXMgdG8gcmVhY2ggdGhlIGtlcm5lbC4gKi9cbiYjNDM7XHRcdGQgPSBvcGVuZGlyKHNlbGYtXHUwMDNlc2NyYXRjaCk7XG4mIzQzO1x0XHRBU1NFUlRfTkUoZCwgTlVMTCk7XG4mIzQzO1x0XHRzZWVrZGlyKGQsIHBvc1tpXSk7XG4mIzQzO1x0XHR3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkpIHtcbiYjNDM7XHRcdFx0aWYgKCFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcJiMzNDsuXCYjMzQ7KSB8fCAhc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCYjMzQ7Li5cJiMzNDspKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBpOyBqJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0XHRBU1NFUlRfU1RSTkUoZGUtXHUwMDNlZF9uYW1lLCBuYW1lc1tqXSlcbiYjNDM7XHRcdFx0XHRcdFRIX0xPRyhcJiMzNDtyZXN1bWluZyBhdCAlcyAoZ29uZSkgd2VudCBiYWNrIHRvICVzXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIG5hbWVzW2ldLCBuYW1lc1tqXSk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjbG9zZWRpcihkKTtcbiYjNDM7XG4mIzQzO1x0XHRBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgUkVTVU1FX0RJUlM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwmIzM0OyVzL2UlMDJkXCYjMzQ7LCBzZWxmLVx1MDAzZXNjcmF0Y2gsIGkpO1xuJiM0MztcdFx0RVhQRUNUX0VRKHJtZGlyKHBhdGgpLCAwKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0hVUk5fUk9VTkRTXHQ0MDBcbiYjNDM7I2RlZmluZSBDSFVSTl9CVUZTWlx0NTEyXHQvKiBzbWFsbCwgc28gYSBsaXN0aW5nIHRha2VzIHNldmVyYWwgY2FsbHMgKi9cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBmaWxlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZW5hYmxpbmcgd3JpdGUgYW5kIGdvIGF0IHRoZSBzdGFydCBvZlxuJiM0MzsgKiB0aGUgZGlzYWJsaW5nIG9uZSwgc28gdGhlIHdpbmRvdyB3aGVyZSB0aGV5IGV4aXN0IGlzIHRoZSBzaG9ydCBvbmUuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIENIVVJOX0RXRUxMX09OXHQyMDAwXG4mIzQzOyNkZWZpbmUgQ0hVUk5fRFdFTExfT0ZGXHQyMDBcbiYjNDM7XG4mIzQzO3N0cnVjdCBrZXJuZnNfZGlyZW50NjQge1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbG9uZ1x0ZF9pbm87XG4mIzQzO1x0bG9uZyBsb25nXHRcdGRfb2ZmO1xuJiM0MztcdHVuc2lnbmVkIHNob3J0XHRcdGRfcmVjbGVuO1xuJiM0MztcdHVuc2lnbmVkIGNoYXJcdFx0ZF90eXBlO1xuJiM0MztcdGNoYXJcdFx0XHRkX25hbWVbXTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBzYW1lIHJlc3VtZSwgYnV0IGluc2lkZSBvbmUgZ2V0ZGVudHMoMikgY2FsbC4gIHJtZGlyKDIpIGNhbm5vdCByZWFjaFxuJiM0MzsgKiB0aGF0IHdpbmRvdyBiZWNhdXNlIGl0ZXJhdGVfZGlyKCkgaG9sZHMgdGhlIGxpc3RlZCBkaXJlY3RvcnkmIzM5O3MgaV9yd3NlbVxuJiM0MzsgKiBmb3IgdGhlIHdob2xlIGxpc3Rpbmc7IGNncm91cC5zdWJ0cmVlX2NvbnRyb2wgY2FuLCBoYXZpbmcgbm8gVkZTXG4mIzQzOyAqIG9wZXJhdGlvbiBvbiB0aGUgbmFtZXMgaXQgYWRkcyBhbmQgcmVtb3Zlcy4gIFRoZSBmaWxlcyB0aGF0IGFyZSBub3QgdGhlXG4mIzQzOyAqIGNvbnRyb2xsZXImIzM5O3Mgc3RheSB0aHJvdWdob3V0LCBzbyBlYWNoIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS5cbiYjNDM7ICpcbiYjNDM7ICogQSBzdHJlc3MgdGVzdDogaXQgaGFzIG5vdCBiZWVuIHNlZW4gdG8gY2F0Y2ggdGhlIG9yZGVyaW5nIGJ1ZywgYW5kIGlzXG4mIzQzOyAqIGhlcmUgdG8ga2VlcCB0aGUgdW5sb2NrZWQgd2luZG93IHVuZGVyIGxvYWQgZm9yIGxvY2tkZXAgYW5kIEtBU0FOLlxuJiM0MzsgKi9cbiYjNDM7VEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX3ZzX2ludGVybmFsX3JlbW92ZSlcbiYjNDM7e1xuJiM0MztcdGNoYXIgYnVmW0NIVVJOX0JVRlNaXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7XG4mIzQzO1x0Y2hhciBzdGFibGVbMTI4XVtOQU1FX01BWCAmIzQzOyAxXTtcbiYjNDM7XHRpbnQgbnN0YWJsZSA9IDAsIGksIHI7XG4mIzQzO1x0aW50IHdpdGhjdGwgPSAwLCB3aXRob3V0ID0gMDtcbiYjNDM7XHRpbnQgc2VlblsxMjhdLCBzdGF0dXM7XG4mIzQzO1x0cGlkX3QgY2h1cm5lcjtcbiYjNDM7XHRESVIgKmQ7XG4mIzQzO1xuJiM0MztcdC8qIFdpdGggdGhlIGNvbnRyb2xsZXIgb2ZmLCB3aGF0ZXZlciBpcyBsZWZ0IGlzIHdoYXQgbXVzdCBwZXJzaXN0LiAqL1xuJiM0MztcdEFTU0VSVF9FUSh3cml0ZV9maWxlKHNlbGYtXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cdTAwM2VkaXNhYmxlKSwgMCk7XG4mIzQzO1x0ZCA9IG9wZW5kaXIoc2VsZi1cdTAwM2VjaGlsZCk7XG4mIzQzO1x0QVNTRVJUX05FKGQsIE5VTEwpO1xuJiM0MztcdGZvciAoOzspIHtcbiYjNDM7XHRcdHN0cnVjdCBkaXJlbnQgKmRlID0gcmVhZGRpcihkKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIWRlKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCYjMzQ7LlwmIzM0OykgfHwgIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIFwmIzM0Oy4uXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRBU1NFUlRfTFQobnN0YWJsZSwgKGludClBUlJBWV9TSVpFKHN0YWJsZSkpO1xuJiM0MztcdFx0c3RybmNweShzdGFibGVbbnN0YWJsZV0sIGRlLVx1MDAzZWRfbmFtZSwgTkFNRV9NQVgpO1xuJiM0MztcdFx0c3RhYmxlW25zdGFibGVdW05BTUVfTUFYXSA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0XHRuc3RhYmxlJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0Y2xvc2VkaXIoZCk7XG4mIzQzO1x0QVNTRVJUX0dUKG5zdGFibGUsIDApO1xuJiM0MztcbiYjNDM7XHRjaHVybmVyID0gZm9yaygpO1xuJiM0MztcdEFTU0VSVF9HRShjaHVybmVyLCAwKTtcbiYjNDM7XHRpZiAoY2h1cm5lciA9PSAwKSB7XG4mIzQzO1x0XHRmb3IgKDs7KSB7XG4mIzQzO1x0XHRcdGlmICh3cml0ZV9maWxlKHNlbGYtXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cdTAwM2VlbmFibGUpKVxuJiM0MztcdFx0XHRcdF9leGl0KDEwKTtcbiYjNDM7XHRcdFx0dXNsZWVwKENIVVJOX0RXRUxMX09OKTtcbiYjNDM7XHRcdFx0aWYgKHdyaXRlX2ZpbGUoc2VsZi1cdTAwM2VzY3JhdGNoX3NjLCBzZWxmLVx1MDAzZWRpc2FibGUpKVxuJiM0MztcdFx0XHRcdF9leGl0KDExKTtcbiYjNDM7XHRcdFx0dXNsZWVwKENIVVJOX0RXRUxMX09GRik7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKHIgPSAwOyByIFx1MDAzYyBDSFVSTl9ST1VORFM7IHImIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpbnQgZmQgPSBvcGVuKHNlbGYtXHUwMDNlY2hpbGQsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkpO1xuJiM0MztcdFx0aW50IGV4dHJhID0gMDtcbiYjNDM7XHRcdGludCBuO1xuJiM0MztcbiYjNDM7XHRcdEFTU0VSVF9HRShmZCwgMCk7XG4mIzQzO1x0XHRtZW1zZXQoc2VlbiwgMCwgc2l6ZW9mKHNlZW4pKTtcbiYjNDM7XG4mIzQzO1x0XHR3aGlsZSAoKG4gPSBzeXNjYWxsKFNZU19nZXRkZW50czY0LCBmZCwgYnVmLCBzaXplb2YoYnVmKSkpIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRcdGludCBvZmYgPSAwO1xuJiM0MztcbiYjNDM7XHRcdFx0d2hpbGUgKG9mZiBcdTAwM2Mgbikge1xuJiM0MztcdFx0XHRcdHN0cnVjdCBrZXJuZnNfZGlyZW50NjQgKmRlID0gKHZvaWQgKikoYnVmICYjNDM7IG9mZik7XG4mIzQzO1x0XHRcdFx0Ym9vbCBrbm93biA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRcdFx0XHRvZmYgJiM0Mzs9IGRlLVx1MDAzZWRfcmVjbGVuO1xuJiM0MztcdFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5zdGFibGU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdFx0aWYgKCFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBzdGFibGVbaV0pKSB7XG4mIzQzO1x0XHRcdFx0XHRcdHNlZW5baV0mIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRcdFx0XHRrbm93biA9IHRydWU7XG4mIzQzO1x0XHRcdFx0XHR9XG4mIzQzO1x0XHRcdFx0aWYgKCFrbm93biBcdTAwMjZcdTAwMjYgc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCYjMzQ7LlwmIzM0OykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRcdFx0ICAgIHN0cmNtcChkZS1cdTAwM2VkX25hbWUsIFwmIzM0Oy4uXCYjMzQ7KSlcbiYjNDM7XHRcdFx0XHRcdGV4dHJhJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdFx0QVNTRVJUX0dFKG4sIDApO1xuJiM0MztcdFx0RVhQRUNUX0VRKGNsb3NlKGZkKSwgMCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGV4dHJhKVxuJiM0MztcdFx0XHR3aXRoY3RsJiM0MzsmIzQzOztcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0d2l0aG91dCYjNDM7JiM0Mzs7XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnN0YWJsZTsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdEFTU0VSVF9FUShzZWVuW2ldLCAxKVxuJiM0MztcdFx0XHRcdFRIX0xPRyhcJiMzNDtyb3VuZCAlZDogJXMgc2VlbiAlZCB0aW1lc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICAgciwgc3RhYmxlW2ldLCBzZWVuW2ldKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBjaHVybiBtdXN0IGhhdmUgYmVlbiBydW5uaW5nLCBvciB0aGUgbGlzdGluZ3MgcHJvdmUgbm90aGluZy4gKi9cbiYjNDM7XHRFWFBFQ1RfRVEoa2lsbChjaHVybmVyLCBTSUdLSUxMKSwgMCk7XG4mIzQzO1x0QVNTRVJUX0VRKHdhaXRwaWQoY2h1cm5lciwgXHUwMDI2c3RhdHVzLCAwKSwgY2h1cm5lcik7XG4mIzQzO1x0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSBcdTAwMjZcdTAwMjYgV1RFUk1TSUcoc3RhdHVzKSA9PSBTSUdLSUxMKVxuJiM0MztcdFx0VEhfTE9HKFwmIzM0O2NodXJuZXIgZXhpdGVkIG9uIGl0cyBvd246IHN0YXR1cyAlZFwmIzM0Oywgc3RhdHVzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGV5IGFsc28gaGF2ZSB0byBoYXZlIG92ZXJsYXBwZWQgaXQuICBIb3cgbXVjaCBkZXBlbmRzIG9uIHRoZVxuJiM0MztcdCAqIG1hY2hpbmUsIHNvIHNheSB0aGUgcmFjZSBjb3VsZCBub3QgYmUgYXJyYW5nZWQgcmF0aGVyIHRoYW4gZmFpbC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIXdpdGhjdGwgfHwgIXdpdGhvdXQpXG4mIzQzO1x0XHRTS0lQKHJldHVybiwgXCYjMzQ7bGlzdGluZ3MgZGlkIG5vdCBzcGFuIHRoZSBjaHVybjogJWQgd2l0aCwgJWQgd2l0aG91dFwmIzM0OyxcbiYjNDM7XHRcdCAgICAgd2l0aGN0bCwgd2l0aG91dCk7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBBIHRlbGxkaXIoKSBjb29raWUgbXVzdCByZXNvbHZlIGJhY2sgdG8gdGhlIHNhbWUgZW50cnkgYWZ0ZXIgc2Vla2RpcigpLlxuICAqIGtlcm5mcyBlbmNvZGVzIHRoZSBjb29raWUgYXMgdGhlIG5vZGUmIzM5O3MgbmFtZSBoYXNoLCBzbyB0aGlzIGNvdmVyc1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMxPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFUk5GUyYjMzQ7LAogICAgJiMzNDtTWVNGUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2tlcm5mc19mb3BfcmVhZGRpciYjMzQ7LAogICAgJiMzNDtrZXJuZnNfZGlyX3BvcyYjMzQ7LAogICAgJiMzNDtrZXJuZnNfZGlyX25leHRfcG9zJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGtlcm5mcyBkaXJlY3RvcnkgbGlzdGluZyAocmVhZGRpciAvIGdldGRlbnRzKSBhbmQgcmVzdW1lIHRyYXZlcnNhbCBsb2dpYyBpbiBmcy9rZXJuZnMvZGlyLmMuIFNwZWNpZmljYWxseSwgaXQgdXBkYXRlcyBrZXJuZnNfZGlyX3BvcyBhbmQga2VybmZzX2Rpcl9uZXh0X3BvcyB0byByZXN1bWUgcmVhZGRpciBiYXNlZCBvbiBlbnRyeSBuYW1lIGNvbXBhcmlzb24gd2l0aGluIHRoZSByYi10cmVlLCBhZGRzIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSByZXN1bWUga2V5IG5hbWUsIGludHJvZHVjZXMgYSBXQVJOX09OX09OQ0UgY2hlY2sgb24gbmFtZSB0cnVuY2F0aW9uLCBhbmQgcmVsZWFzZXMvcmVhY3F1aXJlcyByb290LVx1MDAzZWtlcm5mc19yd3NlbSBhcm91bmQgZGlyX2VtaXQoKS4gVGhlc2UgY2hhbmdlcyB0b3VjaCByZWFjaGFibGUgY29yZSB2aXJ0dWFsIGZpbGVzeXN0ZW0gY29kZSBleGVyY2lzZWQgYnkgdXNlciBzcGFjZSB2aWEgZ2V0ZGVudHMvZ2V0ZGVudHM2NCBvbiBzeXNmcyBhbmQgY2dyb3VwcywgaW50cm9kdWNpbmcgY29uY3VycmVuY3kgd2luZG93cyBhbmQgbW9kaWZpZWQgbG9ja2luZyBzZW1hbnRpY3MuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBlNTU4MDIwZWFiYTYwNWY2MDgxN2Q1NGQ0OTcxZWNkZjFjYjQ1MWYwCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBTZXAgMTEgMTg6MzE6NDEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZGlyLmMgYi9mcy9rZXJuZnMvZGlyLmMKaW5kZXggMDdhYmY1OWYwMjY0YS4uY2M2Mjg4ZDViNGNjNCAxMDA2NDQKLS0tIGEvZnMva2VybmZzL2Rpci5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2tlcm5mcy9kaXIuYwpAQCAtMTkwMywzMyAmIzQzOzE5MDMsNDkgQEAgc3RhdGljIGludCBrZXJuZnNfZGlyX2ZvcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogCXJldHVybiAwOwogfQogCiYjNDM7LyoKJiM0MzsgKiBGaW5kIHdoZXJlIGEgbGlzdGluZyBsZWZ0IG9mZi4gIEByZXN1bWVkIHNheXMgd2hldGhlciBAcG9zIGlzIHN0aWxsIHRoYXQKJiM0MzsgKiBlbnRyeTsgaWYgbm90LCB0aGUgc2VhcmNoIGZhbGxzIGJhY2sgdG8gQGhhc2gsIGtleWVkIGJ5IEBuYW1lIGlmIGdpdmVuLgomIzQzOyAqLwogc3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsCi0Jc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcykKJiM0MzsJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcywKJiM0MzsJY29uc3QgY2hhciAqbmFtZSwgYm9vbCAqcmVzdW1lZCkKIHsKJiM0MzsJaWYgKHJlc3VtZWQpCiYjNDM7CQkqcmVzdW1lZCA9IGZhbHNlOwogCWlmIChwb3MpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBBIHJlbmFtZSBrZWVwcyB0aGUgaGFzaCBpZiB0aGUgbmV3IG5hbWUgaGFzaGVzIHRoZSBzYW1lLCBzbwomIzQzOwkJICogY2hlY2sgQG5hbWUgdG9vLiAgT3RoZXJ3aXNlIHRoZSBjYWxsZXIgd291bGQgc3RlcCBvdmVyIHRoZQomIzQzOwkJICogZW50cnkgbm93IHNpdHRpbmcgd2hlcmUgQHBvcyB1c2VkIHRvIGJlLgomIzQzOwkJICovCiAJCWludCB2YWxpZCA9IGtlcm5mc19hY3RpdmUocG9zKSAmYW1wOyZhbXA7CiAJCQlyY3VfYWNjZXNzX3BvaW50ZXIocG9zLSZndDtfX3BhcmVudCkgPT0gcGFyZW50ICZhbXA7JmFtcDsKLQkJCWhhc2ggPT0gcG9zLSZndDtoYXNoOwomIzQzOwkJCWhhc2ggPT0gcG9zLSZndDtoYXNoICZhbXA7JmFtcDsKJiM0MzsJCQkoIW5hbWUgfHwgIXN0cmNtcChuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSkpOwogCQlrZXJuZnNfcHV0KHBvcyk7CiAJCWlmICghdmFsaWQpCiAJCQlwb3MgPSBOVUxMOwomIzQzOwkJZWxzZSBpZiAocmVzdW1lZCkKJiM0MzsJCQkqcmVzdW1lZCA9IHRydWU7CiAJfQogCWlmICghcG9zICZhbXA7JmFtcDsgKGhhc2ggJmd0OyAxKSAmYW1wOyZhbXA7IChoYXNoICZsdDsgSU5UX01BWCkpIHsKIAkJc3RydWN0IHJiX25vZGUgKm5vZGUgPSBwYXJlbnQtJmd0O2Rpci5jaGlsZHJlbi5yYl9ub2RlOwotCQl1NjQgbnNfaWQgPSBrZXJuZnNfbnNfaWQobnMpOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIEtlZXAgYSBub2RlIG9ubHkgb24gdGhlIHdheSBsZWZ0LCBzbyB0aGUgc2VhcmNoIGVuZHMgb24gdGhlCiYjNDM7CQkgKiBmaXJzdCBlbnRyeSBhZnRlciB0aGUga2V5LiAgQW4gZW1wdHkgQG5hbWUgc29ydHMgYmVmb3JlIGFsbAomIzQzOwkJICogZW50cmllcyBzaGFyaW5nIHRoZSBoYXNoLCBzbyBpdCBsYW5kcyBvbiB0aGUgZmlyc3Qgb2YgdGhlbS4KJiM0MzsJCSAqLwogCQl3aGlsZSAobm9kZSkgewotCQkJcG9zID0gcmJfdG9fa24obm9kZSk7CiYjNDM7CQkJc3RydWN0IGtlcm5mc19ub2RlICprbiA9IHJiX3RvX2tuKG5vZGUpOwogCi0JCQlpZiAoaGFzaCAmbHQ7IHBvcy0mZ3Q7aGFzaCkKLQkJCQlub2RlID0gbm9kZS0mZ3Q7cmJfbGVmdDsKLQkJCWVsc2UgaWYgKGhhc2ggJmd0OyBwb3MtJmd0O2hhc2gpCi0JCQkJbm9kZSA9IG5vZGUtJmd0O3JiX3JpZ2h0OwotCQkJZWxzZSBpZiAobnNfaWQgJmx0OyBrZXJuZnNfbnNfaWQocG9zLSZndDtucykpCiYjNDM7CQkJaWYgKGtlcm5mc19uYW1lX2NvbXBhcmUoaGFzaCwgbmFtZSA/OiAmIzM0OyYjMzQ7LCBucywga24pICZsdDsgMCkgewomIzQzOwkJCQlwb3MgPSBrbjsKIAkJCQlub2RlID0gbm9kZS0mZ3Q7cmJfbGVmdDsKLQkJCWVsc2UgaWYgKG5zX2lkICZndDsga2VybmZzX25zX2lkKHBvcy0mZ3Q7bnMpKQomIzQzOwkJCX0gZWxzZSB7CiAJCQkJbm9kZSA9IG5vZGUtJmd0O3JiX3JpZ2h0OwotCQkJZWxzZQotCQkJCWJyZWFrOwomIzQzOwkJCX0KIAkJfQogCX0KIAkvKiBTa2lwIG92ZXIgZW50cmllcyB3aGljaCBhcmUgZHlpbmcvZGVhZCBvciBpbiB0aGUgd3JvbmcgbmFtZXNwYWNlICovCkBAIC0xOTQ1LDEwICYjNDM7MTk2MSwxNCBAQCBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucywKIH0KIAogc3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9uZXh0X3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucywKLQlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgaW5vX3QgaW5vLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcykKJiM0MzsJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcywKJiM0MzsJY29uc3QgY2hhciAqbmFtZSkKIHsKLQlwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBpbm8sIHBvcyk7Ci0JaWYgKHBvcykgewomIzQzOwlib29sIHJlc3VtZWQ7CiYjNDM7CiYjNDM7CXBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGhhc2gsIHBvcywgbmFtZSwgJmFtcDtyZXN1bWVkKTsKJiM0MzsJLyogU3RlcCBvdmVyIEBwb3Mgb25seSBpZiBpdCBzdXJ2aXZlZDsgQG5hbWUgZmluZHMgdGhlIHNwb3QgaWYgbm90LiAqLwomIzQzOwlpZiAocG9zICZhbXA7JmFtcDsgcmVzdW1lZCkgewogCQlkbyB7CiAJCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJiX25leHQoJmFtcDtwb3MtJmd0O3JiKTsKIAkJCWlmICghbm9kZSkKQEAgLTE5NjYsMzQgJiM0MzsxOTg2LDU1IEBAIHN0YXRpYyBpbnQga2VybmZzX2ZvcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCkKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLSZndDtmX3BhdGguZGVudHJ5OwogCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50ID0ga2VybmZzX2RlbnRyeV9ub2RlKGRlbnRyeSk7CiAJc3RydWN0IGtlcm5mc19ub2RlICpwb3MgPSBmaWxlLSZndDtwcml2YXRlX2RhdGE7CiYjNDM7CWNoYXIgKm5hbWUgX19mcmVlKGtmcmVlKSA9IE5VTEw7CiAJc3RydWN0IGtlcm5mc19yb290ICpyb290OwogCWNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zID0gTlVMTDsKIAogCWlmICghZGlyX2VtaXRfZG90cyhmaWxlLCBjdHgpKQogCQlyZXR1cm4gMDsKIAomIzQzOwkvKgomIzQzOwkgKiBPbmUgYnVmZmVyIGZvciB0aGUgY2FsbCwgaG9sZGluZyB0aGUgbmFtZSBvZiB0aGUgZW50cnkgdGhlIGxpc3RpbmcKJiM0MzsJICogaXMgb24uICBQQVRIX01BWDoga2VybmZzIGJvdW5kcyBubyBzaW5nbGUgbmFtZS4KJiM0MzsJICovCiYjNDM7CW5hbWUgPSBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFuYW1lKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiAJcm9vdCA9IGtlcm5mc19yb290KHBhcmVudCk7CiAJZG93bl9yZWFkKCZhbXA7cm9vdC0mZ3Q7a2VybmZzX3J3c2VtKTsKIAogCWlmIChrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpKQogCQlucyA9IGtlcm5mc19pbmZvKGRlbnRyeS0mZ3Q7ZF9zYiktJmd0O25zOwogCi0JZm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtJmd0O3BvcywgcG9zKTsKJiM0MzsJZm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtJmd0O3BvcywgcG9zLCBOVUxMLCBOVUxMKTsKIAkgICAgIHBvczsKLQkgICAgIHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LSZndDtwb3MsIHBvcykpIHsKLQkJY29uc3QgY2hhciAqbmFtZSA9IGtlcm5mc19yY3VfbmFtZShwb3MpOwomIzQzOwkgICAgIHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LSZndDtwb3MsIHBvcywgbmFtZSkpIHsKIAkJdW5zaWduZWQgaW50IHR5cGUgPSBmc191bW9kZV90b19kdHlwZShwb3MtJmd0O21vZGUpOwotCQlpbnQgbGVuID0gc3RybGVuKG5hbWUpOwogCQlpbm9fdCBpbm8gPSBrZXJuZnNfaW5vKHBvcyk7CiYjNDM7CQlpbnQgbGVuOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIFRoZSBjb3B5IGlzIGFsc28gdGhlIHJlc3VtZSBrZXksIHNvIGEgdHJ1bmNhdGVkIG5hbWUgd291bGQKJiM0MzsJCSAqIHJlc3VtZSBoZXJlIGFnYWluLiAgZ2V0bmFtZSgpIGNhcHMgYSBwYXRoLCBzbyBvbmx5IGFuCiYjNDM7CQkgKiBpbi1rZXJuZWwgY2FsbGVyIGNhbiBnZXQgaGVyZTsgZW5kIHRoZSBsaXN0aW5nIGluc3RlYWQuCiYjNDM7CQkgKi8KJiM0MzsJCWxlbiA9IHN0cnNjcHkobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcyksIFBBVEhfTUFYKTsKJiM0MzsJCWlmIChXQVJOX09OX09OQ0UobGVuICZsdDsgMCkpCiYjNDM7CQkJYnJlYWs7CiAKIAkJY3R4LSZndDtwb3MgPSBwb3MtJmd0O2hhc2g7CiAJCWZpbGUtJmd0O3ByaXZhdGVfZGF0YSA9IHBvczsKIAkJa2VybmZzX2dldChwb3MpOwogCi0JCWlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpIHsKLQkJCXVwX3JlYWQoJmFtcDtyb290LSZndDtrZXJuZnNfcndzZW0pOwomIzQzOwkJLyoKJiM0MzsJCSAqIGRpcl9lbWl0KCkgY2FuIGZhdWx0LCBzbyBydW4gaXQgdW5sb2NrZWQuICBAcG9zIGlzIHBpbm5lZAomIzQzOwkJICogYWJvdmUgYW5kIGtlcm5mc19kaXJfcG9zKCkgcmVjaGVja3MgaXQgb24gdGhlIHdheSBiYWNrLgomIzQzOwkJICovCiYjNDM7CQl1cF9yZWFkKCZhbXA7cm9vdC0mZ3Q7a2VybmZzX3J3c2VtKTsKJiM0MzsJCWlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpCiAJCQlyZXR1cm4gMDsKLQkJfQomIzQzOwkJZG93bl9yZWFkKCZhbXA7cm9vdC0mZ3Q7a2VybmZzX3J3c2VtKTsKIAl9CiAJdXBfcmVhZCgmYW1wO3Jvb3QtJmd0O2tlcm5mc19yd3NlbSk7CiAJZmlsZS0mZ3Q7cHJpdmF0ZV9kYXRhID0gTlVMTDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jCmluZGV4IDZlNzRkYTkxZWJjYTUuLjAxY2Q1OGU1ZTQxZTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYwpAQCAtOCw2ICYjNDM7OCw3IEBACiAjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bmV0L2lmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c2NoZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKICNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKICNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKQEAgLTE3LDYgJiM0MzsxOCw3IEBACiAjaW5jbHVkZSAmbHQ7c3lzL21vdW50LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3NvY2tldC5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zeXNjYWxsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3hhdHRyLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7a3NlbGZ0ZXN0X2hhcm5lc3MuaCYjMzQ7CkBAIC00NzIsNiAmIzQzOzQ3NCwyMDQgQEAgVEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfbm9fZHVwbGljYXRlcykKIAkJCUVYUEVDVF9TVFJORShuYW1lc1tpXSwgbmFtZXNbal0pOwogfQogCiYjNDM7I2RlZmluZSBSRVNVTUVfRElSUwkyNAomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVzdW1pbmcgYXQgYW4gZW50cnkgdGhhdCBoYXMgZ29uZSBtdXN0IGNhcnJ5IG9uIGFmdGVyIGl0LCBuZXZlciBiZWZvcmUuCiYjNDM7ICogVGFrZSBhIGNvb2tpZSBmb3IgZXZlcnkgZW50cnksIHRoZW4gcmVtb3ZlIGVhY2ggb25lLCBzZWVrIHRvIGl0cyBjb29raWUKJiM0MzsgKiBhbmQgcmVhZCB0aGUgcmVzdDsgbm90aGluZyBhbHJlYWR5IHJlcG9ydGVkIG1heSBjb21lIGJhY2suCiYjNDM7ICovCiYjNDM7VEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX2F0X3JlbW92ZWRfZW50cnkpCiYjNDM7ewomIzQzOwkvKiBUaGUgY2dyb3VwJiMzOTtzIG93biBjb250cm9sIGZpbGVzIGFyZSBsaXN0ZWQgYWxvbmdzaWRlIG91cnMuICovCiYjNDM7CWNoYXIgbmFtZXNbMTI4XVtOQU1FX01BWCAmIzQzOyAxXTsKJiM0MzsJbG9uZyBwb3NbMTI4XTsKJiM0MzsJY2hhciBwYXRoW1BBVEhfTUFYXTsKJiM0MzsJc3RydWN0IGRpcmVudCAqZGU7CiYjNDM7CWludCBuID0gMCwgaSwgajsKJiM0MzsJRElSICpkOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgUkVTVU1FX0RJUlM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICYjMzQ7JXMvZSUwMmQmIzM0Oywgc2VsZi0mZ3Q7c2NyYXRjaCwgaSk7CiYjNDM7CQlBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFJlY29yZCB0aGUgY29va2llIGJlZm9yZSByZWFkaW5nIGVhY2ggZW50cnksIHdpdGggaXRzIG5hbWUuICovCiYjNDM7CWQgPSBvcGVuZGlyKHNlbGYtJmd0O3NjcmF0Y2gpOwomIzQzOwlBU1NFUlRfTkUoZCwgTlVMTCk7CiYjNDM7CXdoaWxlICgxKSB7CiYjNDM7CQlsb25nIGhlcmUgPSB0ZWxsZGlyKGQpOwomIzQzOwomIzQzOwkJZGUgPSByZWFkZGlyKGQpOwomIzQzOwkJaWYgKCFkZSkKJiM0MzsJCQlicmVhazsKJiM0MzsJCWlmICghc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7LiYjMzQ7KSB8fCAhc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7Li4mIzM0OykpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlBU1NFUlRfTFQobiwgKGludClBUlJBWV9TSVpFKHBvcykpOwomIzQzOwkJcG9zW25dID0gaGVyZTsKJiM0MzsJCXN0cm5jcHkobmFtZXNbbl0sIGRlLSZndDtkX25hbWUsIE5BTUVfTUFYKTsKJiM0MzsJCW5hbWVzW25dW05BTUVfTUFYXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJCW4mIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWNsb3NlZGlyKGQpOwomIzQzOwlBU1NFUlRfR1QobiwgMSk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBuOyBpJiM0MzsmIzQzOykgewomIzQzOwkJLyogT25seSB0aGUgZGlyZWN0b3JpZXMgd2UgbWFkZSBjYW4gYmUgcmVtb3ZlZCBhbmQgcHV0IGJhY2suICovCiYjNDM7CQlpZiAoc3RybmNtcChuYW1lc1tpXSwgJiMzNDtlJiMzNDssIDEpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwomIzQzOwkJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAmIzM0OyVzLyVzJiMzNDssIHNlbGYtJmd0O3NjcmF0Y2gsIG5hbWVzW2ldKTsKJiM0MzsJCUFTU0VSVF9FUShybWRpcihwYXRoKSwgMCk7CiYjNDM7CiYjNDM7CQkvKiBSZW9wZW4gc28gdGhlIHNlZWsgaGFzIHRvIHJlYWNoIHRoZSBrZXJuZWwuICovCiYjNDM7CQlkID0gb3BlbmRpcihzZWxmLSZndDtzY3JhdGNoKTsKJiM0MzsJCUFTU0VSVF9ORShkLCBOVUxMKTsKJiM0MzsJCXNlZWtkaXIoZCwgcG9zW2ldKTsKJiM0MzsJCXdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkgewomIzQzOwkJCWlmICghc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7LiYjMzQ7KSB8fCAhc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7Li4mIzM0OykpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCWZvciAoaiA9IDA7IGogJmx0OyBpOyBqJiM0MzsmIzQzOykKJiM0MzsJCQkJQVNTRVJUX1NUUk5FKGRlLSZndDtkX25hbWUsIG5hbWVzW2pdKQomIzQzOwkJCQkJVEhfTE9HKCYjMzQ7cmVzdW1pbmcgYXQgJXMgKGdvbmUpIHdlbnQgYmFjayB0byAlcyYjMzQ7LAomIzQzOwkJCQkJICAgICAgIG5hbWVzW2ldLCBuYW1lc1tqXSk7CiYjNDM7CQl9CiYjNDM7CQljbG9zZWRpcihkKTsKJiM0MzsKJiM0MzsJCUFTU0VSVF9FUShta2RpcihwYXRoLCAwNzU1KSwgMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IFJFU1VNRV9ESVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAmIzM0OyVzL2UlMDJkJiMzNDssIHNlbGYtJmd0O3NjcmF0Y2gsIGkpOwomIzQzOwkJRVhQRUNUX0VRKHJtZGlyKHBhdGgpLCAwKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIENIVVJOX1JPVU5EUwk0MDAKJiM0MzsjZGVmaW5lIENIVVJOX0JVRlNaCTUxMgkvKiBzbWFsbCwgc28gYSBsaXN0aW5nIHRha2VzIHNldmVyYWwgY2FsbHMgKi8KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSBmaWxlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZW5hYmxpbmcgd3JpdGUgYW5kIGdvIGF0IHRoZSBzdGFydCBvZgomIzQzOyAqIHRoZSBkaXNhYmxpbmcgb25lLCBzbyB0aGUgd2luZG93IHdoZXJlIHRoZXkgZXhpc3QgaXMgdGhlIHNob3J0IG9uZS4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIENIVVJOX0RXRUxMX09OCTIwMDAKJiM0MzsjZGVmaW5lIENIVVJOX0RXRUxMX09GRgkyMDAKJiM0MzsKJiM0MztzdHJ1Y3Qga2VybmZzX2RpcmVudDY0IHsKJiM0MzsJdW5zaWduZWQgbG9uZyBsb25nCWRfaW5vOwomIzQzOwlsb25nIGxvbmcJCWRfb2ZmOwomIzQzOwl1bnNpZ25lZCBzaG9ydAkJZF9yZWNsZW47CiYjNDM7CXVuc2lnbmVkIGNoYXIJCWRfdHlwZTsKJiM0MzsJY2hhcgkJCWRfbmFtZVtdOwomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgc2FtZSByZXN1bWUsIGJ1dCBpbnNpZGUgb25lIGdldGRlbnRzKDIpIGNhbGwuICBybWRpcigyKSBjYW5ub3QgcmVhY2gKJiM0MzsgKiB0aGF0IHdpbmRvdyBiZWNhdXNlIGl0ZXJhdGVfZGlyKCkgaG9sZHMgdGhlIGxpc3RlZCBkaXJlY3RvcnkmIzM5O3MgaV9yd3NlbQomIzQzOyAqIGZvciB0aGUgd2hvbGUgbGlzdGluZzsgY2dyb3VwLnN1YnRyZWVfY29udHJvbCBjYW4sIGhhdmluZyBubyBWRlMKJiM0MzsgKiBvcGVyYXRpb24gb24gdGhlIG5hbWVzIGl0IGFkZHMgYW5kIHJlbW92ZXMuICBUaGUgZmlsZXMgdGhhdCBhcmUgbm90IHRoZQomIzQzOyAqIGNvbnRyb2xsZXImIzM5O3Mgc3RheSB0aHJvdWdob3V0LCBzbyBlYWNoIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS4KJiM0MzsgKgomIzQzOyAqIEEgc3RyZXNzIHRlc3Q6IGl0IGhhcyBub3QgYmVlbiBzZWVuIHRvIGNhdGNoIHRoZSBvcmRlcmluZyBidWcsIGFuZCBpcwomIzQzOyAqIGhlcmUgdG8ga2VlcCB0aGUgdW5sb2NrZWQgd2luZG93IHVuZGVyIGxvYWQgZm9yIGxvY2tkZXAgYW5kIEtBU0FOLgomIzQzOyAqLwomIzQzO1RFU1RfRihrZXJuZnNfY2dyb3VwLCByZWFkZGlyX3Jlc3VtZV92c19pbnRlcm5hbF9yZW1vdmUpCiYjNDM7ewomIzQzOwljaGFyIGJ1ZltDSFVSTl9CVUZTWl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwomIzQzOwljaGFyIHN0YWJsZVsxMjhdW05BTUVfTUFYICYjNDM7IDFdOwomIzQzOwlpbnQgbnN0YWJsZSA9IDAsIGksIHI7CiYjNDM7CWludCB3aXRoY3RsID0gMCwgd2l0aG91dCA9IDA7CiYjNDM7CWludCBzZWVuWzEyOF0sIHN0YXR1czsKJiM0MzsJcGlkX3QgY2h1cm5lcjsKJiM0MzsJRElSICpkOwomIzQzOwomIzQzOwkvKiBXaXRoIHRoZSBjb250cm9sbGVyIG9mZiwgd2hhdGV2ZXIgaXMgbGVmdCBpcyB3aGF0IG11c3QgcGVyc2lzdC4gKi8KJiM0MzsJQVNTRVJUX0VRKHdyaXRlX2ZpbGUoc2VsZi0mZ3Q7c2NyYXRjaF9zYywgc2VsZi0mZ3Q7ZGlzYWJsZSksIDApOwomIzQzOwlkID0gb3BlbmRpcihzZWxmLSZndDtjaGlsZCk7CiYjNDM7CUFTU0VSVF9ORShkLCBOVUxMKTsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJc3RydWN0IGRpcmVudCAqZGUgPSByZWFkZGlyKGQpOwomIzQzOwomIzQzOwkJaWYgKCFkZSkKJiM0MzsJCQlicmVhazsKJiM0MzsJCWlmICghc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7LiYjMzQ7KSB8fCAhc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7Li4mIzM0OykpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlBU1NFUlRfTFQobnN0YWJsZSwgKGludClBUlJBWV9TSVpFKHN0YWJsZSkpOwomIzQzOwkJc3RybmNweShzdGFibGVbbnN0YWJsZV0sIGRlLSZndDtkX25hbWUsIE5BTUVfTUFYKTsKJiM0MzsJCXN0YWJsZVtuc3RhYmxlXVtOQU1FX01BWF0gPSAmIzM5O1wwJiMzOTs7CiYjNDM7CQluc3RhYmxlJiM0MzsmIzQzOzsKJiM0MzsJfQomIzQzOwljbG9zZWRpcihkKTsKJiM0MzsJQVNTRVJUX0dUKG5zdGFibGUsIDApOwomIzQzOwomIzQzOwljaHVybmVyID0gZm9yaygpOwomIzQzOwlBU1NFUlRfR0UoY2h1cm5lciwgMCk7CiYjNDM7CWlmIChjaHVybmVyID09IDApIHsKJiM0MzsJCWZvciAoOzspIHsKJiM0MzsJCQlpZiAod3JpdGVfZmlsZShzZWxmLSZndDtzY3JhdGNoX3NjLCBzZWxmLSZndDtlbmFibGUpKQomIzQzOwkJCQlfZXhpdCgxMCk7CiYjNDM7CQkJdXNsZWVwKENIVVJOX0RXRUxMX09OKTsKJiM0MzsJCQlpZiAod3JpdGVfZmlsZShzZWxmLSZndDtzY3JhdGNoX3NjLCBzZWxmLSZndDtkaXNhYmxlKSkKJiM0MzsJCQkJX2V4aXQoMTEpOwomIzQzOwkJCXVzbGVlcChDSFVSTl9EV0VMTF9PRkYpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWZvciAociA9IDA7IHIgJmx0OyBDSFVSTl9ST1VORFM7IHImIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgZmQgPSBvcGVuKHNlbGYtJmd0O2NoaWxkLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKTsKJiM0MzsJCWludCBleHRyYSA9IDA7CiYjNDM7CQlpbnQgbjsKJiM0MzsKJiM0MzsJCUFTU0VSVF9HRShmZCwgMCk7CiYjNDM7CQltZW1zZXQoc2VlbiwgMCwgc2l6ZW9mKHNlZW4pKTsKJiM0MzsKJiM0MzsJCXdoaWxlICgobiA9IHN5c2NhbGwoU1lTX2dldGRlbnRzNjQsIGZkLCBidWYsIHNpemVvZihidWYpKSkgJmd0OyAwKSB7CiYjNDM7CQkJaW50IG9mZiA9IDA7CiYjNDM7CiYjNDM7CQkJd2hpbGUgKG9mZiAmbHQ7IG4pIHsKJiM0MzsJCQkJc3RydWN0IGtlcm5mc19kaXJlbnQ2NCAqZGUgPSAodm9pZCAqKShidWYgJiM0Mzsgb2ZmKTsKJiM0MzsJCQkJYm9vbCBrbm93biA9IGZhbHNlOwomIzQzOwomIzQzOwkJCQlvZmYgJiM0Mzs9IGRlLSZndDtkX3JlY2xlbjsKJiM0MzsJCQkJZm9yIChpID0gMDsgaSAmbHQ7IG5zdGFibGU7IGkmIzQzOyYjNDM7KQomIzQzOwkJCQkJaWYgKCFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgc3RhYmxlW2ldKSkgewomIzQzOwkJCQkJCXNlZW5baV0mIzQzOyYjNDM7OwomIzQzOwkJCQkJCWtub3duID0gdHJ1ZTsKJiM0MzsJCQkJCX0KJiM0MzsJCQkJaWYgKCFrbm93biAmYW1wOyZhbXA7IHN0cmNtcChkZS0mZ3Q7ZF9uYW1lLCAmIzM0Oy4mIzM0OykgJmFtcDsmYW1wOwomIzQzOwkJCQkgICAgc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7Li4mIzM0OykpCiYjNDM7CQkJCQlleHRyYSYjNDM7JiM0Mzs7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJQVNTRVJUX0dFKG4sIDApOwomIzQzOwkJRVhQRUNUX0VRKGNsb3NlKGZkKSwgMCk7CiYjNDM7CiYjNDM7CQlpZiAoZXh0cmEpCiYjNDM7CQkJd2l0aGN0bCYjNDM7JiM0Mzs7CiYjNDM7CQllbHNlCiYjNDM7CQkJd2l0aG91dCYjNDM7JiM0Mzs7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbnN0YWJsZTsgaSYjNDM7JiM0MzspCiYjNDM7CQkJQVNTRVJUX0VRKHNlZW5baV0sIDEpCiYjNDM7CQkJCVRIX0xPRygmIzM0O3JvdW5kICVkOiAlcyBzZWVuICVkIHRpbWVzJiMzNDssCiYjNDM7CQkJCSAgICAgICByLCBzdGFibGVbaV0sIHNlZW5baV0pOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFRoZSBjaHVybiBtdXN0IGhhdmUgYmVlbiBydW5uaW5nLCBvciB0aGUgbGlzdGluZ3MgcHJvdmUgbm90aGluZy4gKi8KJiM0MzsJRVhQRUNUX0VRKGtpbGwoY2h1cm5lciwgU0lHS0lMTCksIDApOwomIzQzOwlBU1NFUlRfRVEod2FpdHBpZChjaHVybmVyLCAmYW1wO3N0YXR1cywgMCksIGNodXJuZXIpOwomIzQzOwlBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpICZhbXA7JmFtcDsgV1RFUk1TSUcoc3RhdHVzKSA9PSBTSUdLSUxMKQomIzQzOwkJVEhfTE9HKCYjMzQ7Y2h1cm5lciBleGl0ZWQgb24gaXRzIG93bjogc3RhdHVzICVkJiMzNDssIHN0YXR1cyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZXkgYWxzbyBoYXZlIHRvIGhhdmUgb3ZlcmxhcHBlZCBpdC4gIEhvdyBtdWNoIGRlcGVuZHMgb24gdGhlCiYjNDM7CSAqIG1hY2hpbmUsIHNvIHNheSB0aGUgcmFjZSBjb3VsZCBub3QgYmUgYXJyYW5nZWQgcmF0aGVyIHRoYW4gZmFpbC4KJiM0MzsJICovCiYjNDM7CWlmICghd2l0aGN0bCB8fCAhd2l0aG91dCkKJiM0MzsJCVNLSVAocmV0dXJuLCAmIzM0O2xpc3RpbmdzIGRpZCBub3Qgc3BhbiB0aGUgY2h1cm46ICVkIHdpdGgsICVkIHdpdGhvdXQmIzM0OywKJiM0MzsJCSAgICAgd2l0aGN0bCwgd2l0aG91dCk7CiYjNDM7fQomIzQzOwogLyoKICAqIEEgdGVsbGRpcigpIGNvb2tpZSBtdXN0IHJlc29sdmUgYmFjayB0byB0aGUgc2FtZSBlbnRyeSBhZnRlciBzZWVrZGlyKCkuCiAgKiBrZXJuZnMgZW5jb2RlcyB0aGUgY29va2llIGFzIHRoZSBub2RlJiMzOTtzIG5hbWUgaGFzaCwgc28gdGhpcyBjb3ZlcnMKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzE0NAoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDg5NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipXb3J0aCBGdXp6aW5nOiBBYnNvbHV0ZWx5ISoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIHBhdGNoIHNlcmllcyBpcyAqZGVmaW5pdGVseSogd29ydGggZnV6emluZyB3aXRoIHN5emthbGxlci4gSGVyZSYjMzk7cyB3aHkgSSYjMzk7bSBjb25maWRlbnQgaW4gdGhhdCBjb25jbHVzaW9uOgoKRmlyc3QsIGxldCYjMzk7cyBsb29rIGF0IHdoYXQmIzM5O3MgYmVlbiBjaGFuZ2VkLiBUaGUgcGF0Y2ggbW9kaWZpZXMgYGZzL2tlcm5mcy9kaXIuY2AsIHNwZWNpZmljYWxseSBga2VybmZzX2Rpcl9wb3NgLCBga2VybmZzX2Rpcl9uZXh0X3Bvc2AsIGFuZCBga2VybmZzX2ZvcF9yZWFkZGlyYC4gVGhlIGNoYW5nZXMgdG8gYGtlcm5mc19mb3BfcmVhZGRpcmAgYXJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZy4gVGhlIHJlYWRkaXIgaW1wbGVtZW50YXRpb24gZm9yIGtlcm5mcyBpcyBiZWluZyBtb2RpZmllZCwgYW5kIHRoaXMgaXMgY3J1Y2lhbCBiZWNhdXNlIGtlcm5mcyBpcyBhIGNvcmUgZmlsZXN5c3RlbSBjb21wb25lbnQsIHVzZWQgYnkgc3lzZnMsIGNncm91cGZzLCBhbmQgb3RoZXJzLiBBbnkgcmVhZGRpciBjaGFuZ2UgbmVlZHMgdG8gYmUgbG9va2VkIGF0LiBUaGlzIGlzIHNvbWV0aGluZyB0aGF0IGlzIHVzZWQgcXVpdGUgZnJlcXVlbnRseSwgYW5kIGlzIHRodXMgdmVyeSByZWFjaGFibGUuCgpLZXkgaW5kaWNhdG9ycyBvZiBmdXp6emluZyB3b3J0aCBhcmUgYmVpbmcgbWV0OiB0aGUgcGhpbG9zb3BoeSBtZW50aW9ucyBsb2dpYyBtb2RpZmljYXRpb25zLCByZWZhY3RvcmluZ3MgYW5kIGNvZGUgY2xlYW51cHMsIHJ1bnRpbWUgYXNzZXJ0aW9ucywgYW5kIHJlYWNoYWJsZSBkcml2ZXJzIGFuZCBwcm90b2NvbHMuCgpOb3csIHRoZSBjaGFuZ2VzIHRoZW1zZWx2ZXMgYXJlIHJhaXNpbmcgc29tZSByZWQgZmxhZ3MgKGluIGEgZ29vZCB3YXkgZm9yIGZ1enppbmchKToKCiogICAqKkNvbmN1cnJlbmN5IElzc3VlczoqKiBUaGUgY29kZSBub3cgZXhwbGljaXRseSBkcm9wcyBhbmQgcmVhY3F1aXJlcyBga2VybmZzX3J3c2VtYCB3aXRoaW4gdGhlIGByZWFkZGlyYCBsb29wLCBhcm91bmQgdGhlIGBkaXJfZW1pdCgpYCBjYWxsLiBUaGlzIGlzIGh1Z2UhIFRoaXMgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBjb25jdXJyZW5jeSB3aW5kb3cgd2hlcmUgY29uY3VycmVudCBmaWxlIG9wZXJhdGlvbnMgKHJlbW92YWwsIGNyZWF0aW9uLCByZW5hbWluZykgKndoaWxlKiBhIHJlYWRkaXIgaXMgaXRlcmF0aW5nLiBUaGUgY29tbWl0IGV2ZW4gYWNrbm93bGVkZ2VzIHRoaXMgd2l0aCBzdHJlc3Mgc2VsZnRlc3RzLgoKKiAgICoqQXNzZXJ0aW9uOioqIFRoZXJlJiMzOTtzIGEgbmV3IGBXQVJOX09OX09OQ0UobGVuICZsdDsgMClgIGFzc2VydGlvbi4gTmV3IGFzc2VydGlvbnMgYXJlIHByaW1lIGZ1enppbmcgdGFyZ2V0cywgZXNwZWNpYWxseSB3aGVuIHRoZXkmIzM5O3JlIGluIGNvZGUgcGF0aHMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIGhpdCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbnMuCgoqICAgKipMb2NraW5nIENoYW5nZXM6KiogVGhlIGB1cF9yZWFkYCBhbmQgYGRvd25fcmVhZGAgY2FsbHMgd2l0aGluIHRoZSBsb29wIHN1Z2dlc3QgYSBzaWduaWZpY2FudCBjaGFuZ2UgaW4gbG9ja2luZyBiZWhhdmlvciBhbmQgdGhlIHBvdGVudGlhbCBmb3IgcmFjZXMuIFRoaXMgaXMgc29tZXRoaW5nIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgaW4gYW55IG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50LgoKKiAgICoqUmVhY2hhYmlsaXR5OioqIEtlcm5mcyBpcyBmdW5kYW1lbnRhbC4gU3lzZnMgYW5kIGNncm91cHMgYXJlIG1vdW50ZWQgYW5kIGFjY2Vzc2libGUgaW4gcHJldHR5IG11Y2ggYW55IHN0YW5kYXJkIGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIHN5emthbGxlciBRRU1VL0dDRSBzZXR1cHMuIFRoYXQgZ3VhcmFudGVlcyBoaWdoIHJlYWNoYWJpbGl0eSBmb3IgdGhlIG1vZGlmaWVkIGNvZGUuCgoqICAgKipDb3JlIFN1YnN5c3RlbToqKiBLZXJuZnMgZmFsbHMgc3F1YXJlbHkgaW50byB0aGUgJiMzNDtjb3JlIGZpbGVzeXN0ZW0mIzM0OyBjYXRlZ29yeS4gVGhhdCBhbG9uZSB0cmlnZ2VycyB0aGUgbmVlZCBmb3IgZnV6enppbmcuCgpTbywgZ2l2ZW4gdGhlIGNvcmUgbmF0dXJlIG9mIGtlcm5mcywgdGhlIGNvbmN1cnJlbmN5LXJlbGF0ZWQgbW9kaWZpY2F0aW9ucywgdGhlIGludHJvZHVjZWQgYXNzZXJ0aW9uLCBhbmQgdGhlIGhpZ2ggcmVhY2hhYmlsaXR5LCB0aGUgYW5zd2VyIGlzIGEgcmVzb3VuZGluZyAmIzM0O3llcyYjMzQ7LiBOZXh0LCBJIG5lZWQgdG8gZGlnIGludG8gdGhlIGV4YWN0IGZ1bmN0aW9ucywgS2NvbmZpZyBkZXBlbmRlbmNpZXMsIGFuZCBmaWxlcywgcHJvYmFibHkgdXNpbmcgdG9vbHMgbGlrZSBgZ3JlcHBlcmAgb3IgYHJlYWQtZmlsZWAgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB0aGUgaW1wbGljYXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tlcm5mc19mb3BfcmVhZGRpciYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2tlcm5mcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9rZXJuZnMvZGlyLmM9MTk2Mz1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLS1cbmZzL2tlcm5mcy9kaXIuYy0xOTgzLVxuZnMva2VybmZzL2Rpci5jOjE5ODQ6c3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuZnMva2VybmZzL2Rpci5jLTE5ODUte1xuLS1cbmZzL2tlcm5mcy9kaXIuYz0yMDQ1PWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga2VybmZzX2Rpcl9mb3BzID0ge1xuZnMva2VybmZzL2Rpci5jLTIwNDYtXHQucmVhZFx0XHQ9IGdlbmVyaWNfcmVhZF9kaXIsXG5mcy9rZXJuZnMvZGlyLmM6MjA0NzpcdC5pdGVyYXRlX3NoYXJlZFx0PSBrZXJuZnNfZm9wX3JlYWRkaXIsXG5mcy9rZXJuZnMvZGlyLmMtMjA0OC1cdC5yZWxlYXNlXHQ9IGtlcm5mc19kaXJfZm9wX3JlbGVhc2UsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODg5MAoJCQkJCQkJb3V0cHV0OiAxOAoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKktlcm5lbCBGaWxlc3lzdGVtIENvbmZpZ3VyYXRpb24gUmV2aWV3KioKCkFscmlnaHQsIGJlZm9yZSBJIGRpdmUgdG9vIGRlZXAsIEkgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gZm9yIGBLRVJORlNgLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBwaW5wb2ludCBleGFjdGx5IGhvdyBpdCYjMzk7cyBiZWluZyBtYW5hZ2VkIGR1cmluZyB0aGUgYnVpbGQuIE15IGZpcnN0IHRob3VnaHQgaXMgdG8ganVtcCBpbnRvIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZpbGVzLiBJJiMzOTtsbCBzdGFydCB3aXRoIGBmcy9rZXJuZnMvS2NvbmZpZ2Ag4oCTIG1ha2VzIHNlbnNlIHRvIGxvb2sgdGhlcmUgZmlyc3QsIGFzIGl0JiMzOTtzIHRoZSBtb3N0IHNwZWNpZmljIGFuZCB0YXJnZXRlZCB0byBga2VybmZzYC4gSWYgaXQmIzM5O3Mgbm90IGRlZmluZWQgdGhlcmUsIG9yIGlmIEkgd2FudCB0byBjb25maXJtIGl0cyBvdmVyYWxsIHJlbGF0aW9uc2hpcCB0byB0aGUgZ2VuZXJhbCBmaWxlc3lzdGVtIG9wdGlvbnMsIEkmIzM5O2xsIHRoZW4gbW92ZSB1cCBhIGxldmVsIGFuZCBjaGVjayBgZnMvS2NvbmZpZ2AuIEl0JiMzOTtzIGNydWNpYWwgdG8gdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jeSB0cmVlLCBhbnkgZGVmYXVsdCBzZXR0aW5ncywgYW5kIHBvdGVudGlhbCBidWlsZC10aW1lIG9wdGlvbnMgYWZmZWN0aW5nIGBLRVJORlNgIGJlZm9yZSBJIHByb2NlZWQuIFRoaXMgaXMgd2hlcmUgSSBjYW4gY29uZmlybSBvciBkZW55IGl0cyBpbmNsdXNpb24gYmFzZWQgb24gZGVwZW5kZW5jaWVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBLRVJORlMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMva2VybmZzL0tjb25maWctNS1cbmZzL2tlcm5mcy9LY29uZmlnOjY6Y29uZmlnIEtFUk5GU1xuZnMva2VybmZzL0tjb25maWctNy1cdGJvb2xcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5MTg0CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gYGZzL2tlcm5mcy9LY29uZmlnYC4gSSYjMzk7bSBnb2luZyB0byBhcHByb2FjaCB0aGlzIHdpdGggbXkgdXN1YWwgbWV0aG9kaWNhbCBleWUsIGxvb2tpbmcgZm9yIHRoZSBjb3JlIGRlc2lnbiBkZWNpc2lvbnMgYW5kIHBvdGVudGlhbCBpbXBsaWNhdGlvbnMgZm9yIG15IGFyZWEgb2YgZXhwZXJ0aXNlLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUgc2hhcGVzIHRoZSBiZWhhdmlvciBhbmQgZmVhdHVyZXMgb2Yga2VybmZzLgoKRmlyc3QsIEkmIzM5O2xsIG5lZWQgdG8gcGFyc2UgdGhlIGZpbGUsIHNvIEkmIzM5O2xsIHByb2JhYmx5IGxvb2sgZm9yIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGZpbGU6IHdoYXQgYGJvb2xgLCBgdHJpc3RhdGVgLCBvciBgc3RyaW5nYCBvcHRpb25zIGFyZSBkZWZpbmVkPyBBcmUgdGhlcmUgZGVwZW5kZW5jaWVzPyBBcmUgdGhlcmUgZGVmYXVsdCB2YWx1ZXM/IFdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2Ygc2V0dGluZyB0aG9zZSBvcHRpb25zPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHVzZXIgY29uZmlndXJhdGlvbiB0cmFuc2xhdGVzIGludG8ga2VybmVsIGJlaGF2aW9yLiBJJiMzOTtsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkZXBlbmRlbmNpZXMg4oCTIHRob3NlIGFyZSBrZXkgdG8gdW5kZXJzdGFuZGluZyB0aGUgaW50ZXJwbGF5IGJldHdlZW4gZGlmZmVyZW50IGtlcm5lbCBzdWJzeXN0ZW1zLgoKTmV4dCwgSSYjMzk7bGwgaWRlbnRpZnkgdGhlIGZlYXR1cmVzIGVuYWJsZWQgb3IgZGlzYWJsZWQgYnkgZWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBhbmQgdGhlaXIgaW1wbGljYXRpb25zLCBzbyBJJiMzOTttIHBheWluZyBhdHRlbnRpb24gdG8gYW55IGNvZGUgb3IgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgb3IgY29uZmlndXJlZCBiYXNlZCBvbiB0aGVzZSBvcHRpb25zLiBJJiMzOTtsbCBuZWVkIHRvIHRoaW5rIGFib3V0IHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucy4gQXJlIHRoZXJlIGFueSBmZWF0dXJlcyB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgcGVyZm9ybWFuY2Ugb2YgcmVsYXRlZCBzdWJzeXN0ZW1zIHRoYXQgSSBrbm93IHdlbGw/CgpGaW5hbGx5LCBJJiMzOTtsbCBsb29rIGZvciBhbnkgaGludHMgYWJvdXQgZnV0dXJlIGRpcmVjdGlvbnMuIEFyZSB0aGVyZSBhbnkgZXhwZXJpbWVudGFsIGZlYXR1cmVzIG9yIGRlcHJlY2F0ZWQgb25lcz8gQXJlIHRoZXJlIGFueSBpbmRpY2F0aW9ucyB0aGF0IHRoZSBkZXNpZ24gaXMgZXZvbHZpbmc/IElmIHNvLCB0aGlzIGhlbHBzIG1lIHN0YXkgYXdhcmUgb2YgdGhlIGNoYW5nZXMgdGhhdCBtaWdodCBpbXBhY3QgbXkgd29yayBpbiB0aGUgZnV0dXJlLiBJIHdhbnQgdG8ga2VlcCBvbiB0b3Agb2YgdGhpbmdzLCBzbyBJJiMzOTttIGxvb2tpbmcgZm9yIHRoZSBzaWduYWxzLCB0aGUgc3VidGxlIGNsdWVzIGFib3V0IHRoZSBkaXJlY3Rpb24gb2YgZGV2ZWxvcG1lbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9rZXJuZnMvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuICAgMjpcdCNcbiAgIDM6XHQjIEtFUk5GUyBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgaXRzIHVzZXJzXG4gICA0Olx0I1xuICAgNTpcdFxuICAgNjpcdGNvbmZpZyBLRVJORlNcbiAgIDc6XHRcdGJvb2xcbiAgIDg6XHRcdGRlZmF1bHQgblxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk2MjMKCQkJCQkJCW91dHB1dDogMTgKCQkJCQkJCXRob3VnaHRzOiAxMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duLCBwcmVzZW50ZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIHRoZSBLRVJORlMgU2VsZWN0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBzZWUgd2hvJiMzOTtzIHNob3dpbmcgaW50ZXJlc3QgaW4gS0VSTkZTLiBNeSBpbml0aWFsIHJlYWN0aW9uIGlzIHRvIGltbWVkaWF0ZWx5IGNvbnNpZGVyIHRoZSBwb3RlbnRpYWwgaW1wbGljYXRpb25zLiBBcmUgd2UgdGFsa2luZyBhYm91dCBhIHB1cmUgcmVzZWFyY2ggaW50ZXJlc3QsIG9yIGlzIHRoZXJlIGEgc3BlY2lmaWMgcHJhY3RpY2FsIGFwcGxpY2F0aW9uIGRyaXZpbmcgdGhpcyBjaG9pY2U/IElmIGl0JiMzOTtzIHB1cmUgcmVzZWFyY2gsIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgbWVudGFsbHkgY2F0ZWdvcml6aW5nIHRoZW06IHdoYXQgYXJlIHRoZWlyIGFmZmlsaWF0aW9ucz8gQXJlIHRoZXkgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgdW5pdmVyc2l0eSB3aXRoIGEgcGFydGljdWxhcmx5IHN0cm9uZyBmb2N1cyBvbiBvcGVyYXRpbmcgc3lzdGVtcywgZmlsZSBzeXN0ZW1zLCBvciBwZXJoYXBzIGEgbmljaGUgYXJlYSBsaWtlIHNlY3VyaXR5IGtlcm5lbCBkZXNpZ24gd2hlcmUgS0VSTkZTIG1pZ2h0IGJlIHJlbGV2YW50PwoKSWYgdGhpcyBpcyBjb21pbmcgZnJvbSBhbiBpbmR1c3RyeSBwZXJzcGVjdGl2ZSwgbXkgdGhvdWdodCBwcm9jZXNzIHNoaWZ0cy4gSSYjMzk7bSB0cnlpbmcgdG8gZ2F1Z2U6IGlzIGl0IGEgc3RhcnR1cCBleHBsb3JpbmcgaW5ub3ZhdGl2ZSBzdG9yYWdlIHNvbHV0aW9ucz8gT3IgcGVyaGFwcyBhIGxhcmdlciBjb21wYW55IGludmVzdGlnYXRpbmcgaG93IEtFUk5GUyBjb3VsZCBmaXQgaW50byBhIG1vcmUgY29tcGxleCBhcmNoaXRlY3R1cmU/IFRoZSBzZWxlY3Rpb24gY291bGQgaW5kaWNhdGUgYW4gaW50ZXJlc3QgaW4gZW1iZWRkZWQgc3lzdGVtcyB3aGVyZSByZXNvdXJjZSBjb25zdHJhaW50cyBhbmQgc2VjdXJpdHkgYmVjb21lIHBhcmFtb3VudC4gSSYjMzk7bSBtZW50YWxseSBidWlsZGluZyBwcm9maWxlcyBiYXNlZCBvbiBjb21wYW55IHNpemUsIHByb2R1Y3QgZm9jdXMsIGFuZCBwdWJsaXNoZWQgcmVzZWFyY2guCgpOZXh0LCBJJiMzOTttIGxvb2tpbmcgYmV5b25kIHRoZSBzaW1wbGUgc2VsZWN0aW9uLiBXaGF0JiMzOTtzIHRoZSBjb250ZXh0PyBXaGF0IG90aGVyIHRvb2xzIG9yIHRlY2hub2xvZ2llcyBhcmUgdGhleSBjb25zaWRlcmluZyBvciB1c2luZyBhbG9uZ3NpZGUgS0VSTkZTPyBXaGF0IHByb2JsZW1zIGFyZSB0aGV5IHRyeWluZyB0byBzb2x2ZSB0aGF0IG1ha2UgS0VSTkZTIGFuIGF0dHJhY3RpdmUgb3B0aW9uPyBBcmUgdGhleSBsb29raW5nIGZvciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMsIGVuaGFuY2VkIHNlY3VyaXR5LCBvciBwZXJoYXBzIGEgbW9yZSBmbGV4aWJsZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgdGhhbiB3aGF0JiMzOTtzIGN1cnJlbnRseSBhdmFpbGFibGU/IEkmIzM5O2xsIHByb2JhYmx5IHNjYW4gZm9yIGFueSByZWxhdGVkIHByb2plY3RzIG9yIG9wZW4tc291cmNlIGNvbnRyaWJ1dGlvbnMgdGhleSBoYXZlLgoKVWx0aW1hdGVseSwgSSYjMzk7bSB0cnlpbmcgdG8gcmFwaWRseSBhc3Nlc3MgdGhlaXIgbGV2ZWwgb2YgZXhwZXJ0aXNlIGFuZCB0aGVpciBnb2Fscy4gSXMgdGhpcyBhIGNhc3VhbCAmIzM0O2xldCYjMzk7cyB0cnkgaXQmIzM0OyBhcHByb2FjaCwgb3IgaXMgdGhpcyBhIGRlZXAgZGl2ZSB3aXRoIHdlbGwtZGVmaW5lZCByZXF1aXJlbWVudHM/IFRoZSBhbnN3ZXJzIHRvIHRoZXNlIHF1ZXN0aW9ucyB3aWxsIHNpZ25pZmljYW50bHkgaW5mbHVlbmNlIG15IGV4cGVjdGF0aW9ucyBhbmQgaG93IEkgbWlnaHQgcmVzcG9uZCBvciBhZHZpc2UgdGhlbS4gSSYjMzk7bSBhbHJlYWR5IGZvcm11bGF0aW5nIHF1ZXN0aW9ucyBpbiBteSBtaW5kLCBzdWNoIGFzICYjMzQ7V2hhdCBwcm9ibGVtIGFyZSB5b3UgaG9waW5nIHRvIGFkZHJlc3Mgd2l0aCBLRVJORlM/JiMzNDssICYjMzQ7V2hhdCBhcmUgeW91ciBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnM/JiMzNDssIGFuZCAmIzM0O1doYXQmIzM5O3MgdGhlIGN1cnJlbnQgZmlsZSBzeXN0ZW0gc29sdXRpb24geW91IGFyZSB3b3JraW5nIHdpdGg/JiMzNDsuIFRoZSBhbnN3ZXJzIHRvIHRob3NlIHF1ZXN0aW9ucyB3aWxsIGdyZWF0bHkgaW5mb3JtIG15IG93biBhbmFseXNpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c2VsZWN0IEtFUk5GUyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9yZXNjdHJsL0tjb25maWc9MT1jb25maWcgUkVTQ1RSTF9GU1xuLS1cbmZzL3Jlc2N0cmwvS2NvbmZpZy0zLVx0ZGVwZW5kcyBvbiBBUkNIX0hBU19DUFVfUkVTQ1RSTFxuZnMvcmVzY3RybC9LY29uZmlnOjQ6XHRzZWxlY3QgS0VSTkZTXG5mcy9yZXNjdHJsL0tjb25maWctNS1cdHNlbGVjdCBQUk9DX0NQVV9SRVNDVFJMIGlmIFBST0NfRlNcbi0tXG5mcy9zeXNmcy9LY29uZmlnPTI9Y29uZmlnIFNZU0ZTXG4tLVxuZnMvc3lzZnMvS2NvbmZpZy00LVx0ZGVmYXVsdCB5XG5mcy9zeXNmcy9LY29uZmlnOjU6XHRzZWxlY3QgS0VSTkZTXG5mcy9zeXNmcy9LY29uZmlnLTYtXHRoZWxwXG4tLVxuaW5pdC9LY29uZmlnPTcyND1jb25maWcgUFNJXG5pbml0L0tjb25maWctNzI1LVx0Ym9vbCBcJiMzNDtQcmVzc3VyZSBzdGFsbCBpbmZvcm1hdGlvbiB0cmFja2luZ1wmIzM0O1xuaW5pdC9LY29uZmlnOjcyNjpcdHNlbGVjdCBLRVJORlNcbmluaXQvS2NvbmZpZy03MjctXHRoZWxwXG4tLVxuaW5pdC9LY29uZmlnPTEwNTY9bWVudWNvbmZpZyBDR1JPVVBTXG5pbml0L0tjb25maWctMTA1Ny1cdGJvb2wgXCYjMzQ7Q29udHJvbCBHcm91cCBzdXBwb3J0XCYjMzQ7XG5pbml0L0tjb25maWc6MTA1ODpcdHNlbGVjdCBLRVJORlNcbmluaXQvS2NvbmZpZy0xMDU5LVx0aGVscFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDM2NgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBwcmVzZW50ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqS2VybmVsIEZpbGVzeXN0ZW0gRGVwZW5kZW5jaWVzOiBBIERlZXAgRGl2ZSoqCgpSaWdodCwgc28sIGBzeXNmc2AgaGFzIGJlZW4gc2V0IHVwIHRvIHNlbGVjdCBga2VybmZzYC4gQW5kLCBoYW5nIG9uLCBpdCBhcHBlYXJzIGBjZ3JvdXBzYCBhcmUgZG9pbmcgdGhlIHNhbWUgLSBzZWxlY3RpbmcgYGtlcm5mc2AuIEludHJpZ3VpbmchIFRoYXQgd2FycmFudHMgZnVydGhlciBpbnNwZWN0aW9uLiBUaGUgZGVzaWduIGxvZ2ljIGhlcmUgaXMgaW50ZXJlc3RpbmcsIGFuZCBJIG5lZWQgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGRlcGVuZGVuY3kuIExldCYjMzk7cyBkZWx2ZSBpbnRvIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uIFRvIHNlZSB0aGUgc3BlY2lmaWNzLCBJIHNob3VsZCBjaGVjayB0aGUgcmVsZXZhbnQgYEtjb25maWdgIGZpbGUsIHNwZWNpZmljYWxseSBgZnMvc3lzZnMvS2NvbmZpZ2AsIHRvIHNlZSBwcmVjaXNlbHkgKndoeSogYHN5c2ZzYCBpcyBzZWxlY3RpbmcgYGtlcm5mc2AuIFRoaXMgd2lsbCBjbGFyaWZ5IHRoZSBjb3JlIGRlcGVuZGVuY3kgc2VsZWN0aW9uLCBhbmQgc2hvdWxkIGV4cGxhaW4gdGhlIHVuZGVybHlpbmcgc3RydWN0dXJhbCBkZXNpZ24uIFVuZGVyc3RhbmRpbmcgdGhlICYjMzk7d2h5JiMzOTsgaGVyZSBpcyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIGtlcm5lbCBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmUsIGFuZCBob3cgdGhlc2UgY29tcG9uZW50cyBpbnRlcnJlbGF0ZS4gSSB3b25kZXIgd2hhdCB0aGUgcmFtaWZpY2F0aW9ucyBvZiB0aGlzIGFyZT8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9zeXNmcy9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0Y29uZmlnIFNZU0ZTXG4gICAzOlx0XHRib29sIFwmIzM0O3N5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnRcJiMzNDsgaWYgRVhQRVJUXG4gICA0Olx0XHRkZWZhdWx0IHlcbiAgIDU6XHRcdHNlbGVjdCBLRVJORlNcbiAgIDY6XHRcdGhlbHBcbiAgIDc6XHRcdFRoZSBzeXNmcyBmaWxlc3lzdGVtIGlzIGEgdmlydHVhbCBmaWxlc3lzdGVtIHRoYXQgdGhlIGtlcm5lbCB1c2VzIHRvXG4gICA4Olx0XHRleHBvcnQgaW50ZXJuYWwga2VybmVsIG9iamVjdHMsIHRoZWlyIGF0dHJpYnV0ZXMsIGFuZCB0aGVpclxuICAgOTpcdFx0cmVsYXRpb25zaGlwcyB0byBvbmUgYW5vdGhlci5cbiAgMTA6XHRcbiAgMTE6XHRcdFVzZXJzIGNhbiB1c2Ugc3lzZnMgdG8gYXNjZXJ0YWluIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcnVubmluZ1xuICAxMjpcdFx0a2VybmVsLCBzdWNoIGFzIHRoZSBkZXZpY2VzIHRoZSBrZXJuZWwgaGFzIGRpc2NvdmVyZWQgb24gZWFjaCBidXMgYW5kXG4gIDEzOlx0XHR3aGljaCBkcml2ZXIgZWFjaCBpcyBib3VuZCB0by4gc3lzZnMgY2FuIGFsc28gYmUgdXNlZCB0byB0dW5lIGRldmljZXNcbiAgMTQ6XHRcdGFuZCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcy5cbiAgMTU6XHRcbiAgMTY6XHRcdFNvbWUgc3lzdGVtIGFnZW50cyByZWx5IG9uIHRoZSBpbmZvcm1hdGlvbiBpbiBzeXNmcyB0byBvcGVyYXRlLlxuICAxNzpcdFx0L3NiaW4vaG90cGx1ZyB1c2VzIGRldmljZSBhbmQgb2JqZWN0IGF0dHJpYnV0ZXMgaW4gc3lzZnMgdG8gYXNzaXN0IGluXG4gIDE4Olx0XHRkZWxlZ2F0aW5nIHBvbGljeSBkZWNpc2lvbnMsIGxpa2UgcGVyc2lzdGVudGx5IG5hbWluZyBkZXZpY2VzLlxuICAxOTpcdFxuICAyMDpcdFx0c3lzZnMgaXMgY3VycmVudGx5IHVzZWQgYnkgdGhlIGJsb2NrIHN1YnN5c3RlbSB0byBtb3VudCB0aGUgcm9vdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDkyMgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDY4MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLZXJuZnMgRGlyZWN0b3J5IFJlYWRkaXIgTG9naWM6IEZvY3VzIFN5bWJvbCBBbmFseXNpcyoqCgpPa2F5LCBzbyBgU1lTRlNgIGFuZCBgQ0dST1VQU2AgYm90aCBkZWZhdWx0IHRvIGFuZCBzZWxlY3QgYEtFUk5GU2AsIGFuZCBgQ09ORklHX1NZU0ZTYCBpcyBzdGFuZGFyZC4gTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgaG93IHRoZSByZWFkZGlyIGZ1bmN0aW9uYWxpdHkgd2l0aGluIGBrZXJuZnNgIGlzIGltcGxlbWVudGVkIGFuZCBpZiBteSBmdXp6aW5nIGVmZm9ydHMgd291bGQgYmUgYmVzdCBzZXJ2ZWQgZm9jdXNpbmcgb24gdGhhdCBhcmVhLgoKTGV0JiMzOTtzIHNlZSwgSSBuZWVkIHRvIGNoZWNrIHdoYXQgZnVuY3Rpb25zIGFyZSBtb2RpZmllZCBpbiBgZnMva2VybmZzL2Rpci5jYC4gSSBzZWUgYGtlcm5mc19kaXJfcG9zYCwgYGtlcm5mc19kaXJfbmV4dF9wb3NgLCBhbmQgYGtlcm5mc19mb3BfcmVhZGRpcmAuIE5vdywgYXJlIHRoZXNlIHN0YXRpYyBmdW5jdGlvbnMgaW5saW5lZCBvciBhcmUgdGhleSBkaXN0aW5jdCBzeW1ib2xzIHdpdGhpbiBgdm1saW51eGA/IFRoYXQmIzM5O3MgdGhlIGNydWNpYWwgcXVlc3Rpb24uIFN0YXRpYyBmdW5jdGlvbnMgaW4gQyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gYmUgaW5saW5lZCwgb3Igbm90IQoKT2theSwgdGltZSB0byBjb25zdWx0IHRoZSBGb2N1c1N5bWJvbHMgZ3VpZGVsaW5lcyBpbiBTZWN0aW9uIDQuIFRoZXkgZW1waGFzaXplIGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIGZ1bmN0aW9ucyBhbmQgdGFyZ2V0aW5nIHNwZWNpZmljIGZlYXR1cmUgbG9naWMgYW5kIGVudHJ5cG9pbnRzLiBDcnVjaWFsbHksIGl0IGhpZ2hsaWdodHMgdGhlIGNoYWxsZW5nZSB3aXRoIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb25zLCBhbmQgaG93IHRoZXkgbGFjayBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGFuZCB0aGVyZWZvcmUsIGFyZW4mIzM5O3QgdGFyZ2V0YWJsZSB2aWEgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuIElmIGNoYW5nZXMgYXJlICpwcmltYXJpbHkqIGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgSSBzaG91bGQgaWRlbnRpZnkgbm9uLXN0YXRpYyBjYWxsZXIgZnVuY3Rpb25zIHRoYXQgZXhlcmNpc2UgdGhvc2Ugc3RhdGljIGlubGluZSBoZWxwZXJzIQoKQWghIGBrZXJuZnNfZm9wX3JlYWRkaXJgIGlzIHRoZSBmaWxlXF9vcGVyYXRpb25zIGAuaXRlcmF0ZV9zaGFyZWRgIGNhbGxiYWNrISBUaGlzIGlzIHByb21pc2luZyBiZWNhdXNlIGFueSBmdW5jdGlvbiB3aG9zZSBhZGRyZXNzIGlzIHRha2VuLCBhcyBpbiB0aGUgY2FzZSB3aXRoIGZ1bmN0aW9uIHBvaW50ZXJzLCBjYW4gTk9UIGJlIGlubGluZWQgYXdheSBieSB0aGUgY29tcGlsZXIhCgpCdXQgd2hhdCBhYm91dCBga2VybmZzX2Rpcl9wb3NgIGFuZCBga2VybmZzX2Rpcl9uZXh0X3Bvc2A/IFRoZXkgKm1pZ2h0KiBiZSBpbmxpbmVkIGludG8gYGtlcm5mc19mb3BfcmVhZGRpcmAsIG9yIHRoZXkgKm1pZ2h0KiBleGlzdCBhcyBkaXN0aW5jdCBzeW1ib2xzIGFzIHdlbGwuCgpTaW5jZSBJJiMzOTttIHJlYWxseSBmb2N1c2luZyBvbiB0aGlzIGtlcm5mcyBkaXJlY3RvcnkgcmVhZGRpciBsb2dpYywgSSYjMzk7bSB0aGlua2luZyB0aGF0IGxpc3RpbmcgYGtlcm5mc19mb3BfcmVhZGRpcmAsIGFsb25nIHdpdGggYGtlcm5mc19kaXJfcG9zYCBhbmQgYGtlcm5mc19kaXJfbmV4dF9wb3NgIHNlZW1zIHZlcnkgc3BlY2lmaWMgYW5kIGZvY3VzZWQuIEkgbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggYW55IHBvc3NpYmxlIGRpbHV0aW9uIG9mIHRoZSBmdXp6aW5nIGVmZm9ydC4KCk5vdywgYSB2ZXJ5IGNydWNpYWwgcXVlc3Rpb246IGNhbiBga2VybmZzX2Rpcl9wb3NgIG9yIGBrZXJuZnNfZGlyX25leHRfcG9zYCBiZSBjYWxsZWQgZnJvbSAqYW55d2hlcmUqIGVsc2U/IFRoaXMgaXMgY3JpdGljYWwhIEkgbmVlZCB0byBlbnN1cmUgdGhleSBhcmUgdHJ1bHkgc3BlY2lmaWMgdG8gdGhpcyByZWFkZGlyIHBhdGguIEkmIzM5O20gZ29pbmcgdG8gY2hlY2sgdGhpcyBxdWlja2x5IHdpdGggYGdyZXBwZXJgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtrZXJuZnNfZGlyX3BvcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2tlcm5mcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9rZXJuZnMvZGlyLmM9MTkwMD1zdGF0aWMgaW50IGtlcm5mc19kaXJfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXG4tLVxuZnMva2VybmZzL2Rpci5jLTE5MDktICovXG5mcy9rZXJuZnMvZGlyLmM6MTkxMDpzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcbmZzL2tlcm5mcy9kaXIuYy0xOTExLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyxcbi0tXG5mcy9rZXJuZnMvZGlyLmM9MTk2Mz1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLS1cbmZzL2tlcm5mcy9kaXIuYy0xOTY4LVxuZnMva2VybmZzL2Rpci5jOjE5Njk6XHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIG5hbWUsIFx1MDAyNnJlc3VtZWQpO1xuZnMva2VybmZzL2Rpci5jLTE5NzAtXHQvKiBTdGVwIG92ZXIgQHBvcyBvbmx5IGlmIGl0IHN1cnZpdmVkOyBAbmFtZSBmaW5kcyB0aGUgc3BvdCBpZiBub3QuICovXG4tLVxuZnMva2VybmZzL2Rpci5jPTE5ODQ9c3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuLS1cbmZzL2tlcm5mcy9kaXIuYy0yMDA5LVxuZnMva2VybmZzL2Rpci5jOjIwMTA6XHRmb3IgKHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcywgTlVMTCwgTlVMTCk7XG5mcy9rZXJuZnMvZGlyLmMtMjAxMS1cdCAgICAgcG9zO1xuLS1cbmZzL2tlcm5mcy9kaXIuYy0yMDMxLVx0XHQgKiBkaXJfZW1pdCgpIGNhbiBmYXVsdCwgc28gcnVuIGl0IHVubG9ja2VkLiAgQHBvcyBpcyBwaW5uZWRcbmZzL2tlcm5mcy9kaXIuYzoyMDMyOlx0XHQgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suXG5mcy9rZXJuZnMvZGlyLmMtMjAzMy1cdFx0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNjIxCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkludmVzdGlnYXRpbmcgYSBQb3RlbnRpYWwgSXNzdWUqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBjb2RlIGFuZCBJIG5lZWQgdG8gYmUgdGhvcm91Z2guIEkmIzM5O3ZlIGFscmVhZHkgbG9va2VkIGF0IFggYW5kIFksIGFuZCBiYXNlZCBvbiB0aGF0IGFuYWx5c2lzLCBJJiMzOTttIHN0YXJ0aW5nIHRvIHN1c3BlY3Qgc29tZXRoaW5nIG1pZ2h0IGJlIGhhcHBlbmluZyB3aXRoIHRoZSBkaXJlY3RvcnkgaXRlcmF0aW9uLiBTbywgdG8gZW5zdXJlIEkmIzM5O20gY292ZXJpbmcgYWxsIGJhc2VzLCBJIHdhbnQgdG8gbWFrZSBzdXJlIEkgc2NydXRpbml6ZSBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgdG9vLiBJdCYjMzk7cyBhIGtleSBmdW5jdGlvbiBpbiB0aGlzIGRpcmVjdG9yeSBuYXZpZ2F0aW9uIGxvZ2ljLCBhbmQgSSBuZWVkIHRvIHJ1bGUgb3V0IGFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggaXRzIGltcGxlbWVudGF0aW9uIG9yIGl0cyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBvdGhlciBjb21wb25lbnRzLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgZ29pbmcgb24gdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tlcm5mc19kaXJfbmV4dF9wb3MmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9rZXJuZnMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMva2VybmZzL2Rpci5jPTE5MTA9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXG4tLVxuZnMva2VybmZzL2Rpci5jLTE5NjItXG5mcy9rZXJuZnMvZGlyLmM6MTk2MzpzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuZnMva2VybmZzL2Rpci5jLTE5NjQtXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxuLS1cbmZzL2tlcm5mcy9kaXIuYz0xOTg0PXN0YXRpYyBpbnQga2VybmZzX2ZvcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMjAxMS1cdCAgICAgcG9zO1xuZnMva2VybmZzL2Rpci5jOjIwMTI6XHQgICAgIHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBuYW1lKSkge1xuZnMva2VybmZzL2Rpci5jLTIwMTMtXHRcdHVuc2lnbmVkIGludCB0eXBlID0gZnNfdW1vZGVfdG9fZHR5cGUocG9zLVx1MDAzZW1vZGUpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzEwMgoJCQkJCQkJb3V0cHV0OiAyMTAKCQkJCQkJCXRob3VnaHRzOiA3MTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgS2VybmZzIERpcmVjdG9yeSBJdGVyYXRpb24gZm9yIEZ1enppbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gV2UmIzM5O3JlIGxvb2tpbmcgYXQgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gcmVhZGluZyBkaXJlY3RvcmllcyB3aXRoaW4gYGtlcm5mc2AsIHNwZWNpZmljYWxseSBga2VybmZzX2Rpcl9wb3NgLCBga2VybmZzX2Rpcl9uZXh0X3Bvc2AsIGFuZCBga2VybmZzX2ZvcF9yZWFkZGlyYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGFjdCBvZiB0aGVzZSBjaGFuZ2VzIGFuZCBob3cgdGhleSByZWxhdGUgdG8gcG90ZW50aWFsIGZ1enppbmcgdGFyZ2V0cy4KCkZpcnN0LCBJJiMzOTttIGV4YW1pbmluZyB0aGUgY29kZSBjaGFuZ2VzLiBga2VybmZzX2Rpcl9wb3NgIGFwcGVhcnMgdG8gYmUgYSBrZXkgZnVuY3Rpb24gZm9yIHBvc2l0aW9uaW5nIHdpdGhpbiBhIGRpcmVjdG9yeSwgdmFsaWRhdGluZyB0aGUgY3VycmVudCBwb3NpdGlvbiwgcGFyZW50IG5vZGUsIGFuZCBuYW1lLiBJdCBsb29rcyBsaWtlIHRoZSByYnRyZWUgd2FsayBsb2dpYyBpcyB1cGRhdGVkIGhlcmUgdXNpbmcgYGtlcm5mc19uYW1lX2NvbXBhcmVgLiBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgdGhlbiBidWlsZHMgb24gdGhpcywgYWR2YW5jaW5nIHRoZSBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiBga2VybmZzX2Rpcl9wb3NgLiBDcnVjaWFsbHksIGBrZXJuZnNfZm9wX3JlYWRkaXJgIHNlZW1zIHRvIGJlIHRoZSBtYWluIHJlYWRkaXIgZW50cnkgcG9pbnQgZm9yIGtlcm5mcyBtb3VudHMuIFRoZXJlJiMzOTtzIG1lbW9yeSBhbGxvY2F0aW9uIHVzaW5nIGBrbWFsbG9jYCBoZXJlLCBjb3VwbGVkIHdpdGggc3RyaW5nIGNvcHlpbmcgdXNpbmcgYHN0cnNjcHlgLCB3aGljaCBhbHdheXMgbWFrZXMgbWUgY2F1dGlvdXMuIFRoZSBtb3N0IGludGVyZXN0aW5nIGFzcGVjdCBpcyB0aGUgbG9ja2luZyBtZWNoYW5pc20sIHdoZXJlIGBrZXJuZnNfcndzZW1gIGlzIHVubG9ja2VkICphcm91bmQqIGBkaXJfZW1pdGAgYW5kIHRoZW4gcmUtYWNxdWlyZWQuIFRoYXQmIzM5O3MgYSBjbGFzc2ljIGFyZWEgdG8gbG9vayBmb3IgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBvdGhlciBpc3N1ZXMuIFBsdXMsIHRoZXJlJiMzOTtzIGEgbmV3IGBXQVJOX09OX09OQ0VgIGNoZWNrLgoKVGhpcyBkaXJlY3RseSBhZmZlY3RzIGhvdyBgZ2V0ZGVudHNgIC8gYHJlYWRkaXJgIHdvcmtzIG9uIGBrZXJuZnNgIG1vdW50cyBsaWtlIGBzeXNmc2AsIGBjZ3JvdXBmc2AsIGFuZCBgcmVzY3RybGAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBhcmUgdGhlcmUgYW55IHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucz8gTGV0JiMzOTtzIGNoZWNrOiBgS0VSTkZTYCBhbmQgYFNZU0ZTYC4gWWVwLCBgQ09ORklHX0tFUk5GU2AgaXMgc2VsZWN0ZWQgYnkgYENPTkZJR19TWVNGU2AsIHdoaWNoIGlzIHN0YW5kYXJkIG9uIGFtZDY0LCBtZWFuaW5nIHRoYXQgdGhpcyB3aWxsIGxpa2VseSBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0LgoKTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBga2VybmZzX2ZvcF9yZWFkZGlyYCBpcyBhIGdvb2QgRm9jdXNTeW1ib2wuIFllcywgaXQmIzM5O3MgdGhlIGNvcmUgZW50cnkgcG9pbnQgZm9yIHJlYWRkaXIgb24ga2VybmZzLiBUaGUgb3RoZXIgZnVuY3Rpb25zIGFyZSBoZWxwZXJzIHRoYXQgaW1wbGVtZW50IHRoZSByZXN1bWUgbG9naWMuIFRoZXkmIzM5O3JlIGFsbCBpbiBgZnMva2VybmZzL2Rpci5jYCwgd2hpY2ggbWFrZXMgaXQgZWFzeSB0byB1bmRlcnN0YW5kIHRoZSBzY29wZS4KCkFyZSB0aGVyZSBvdGhlciBzeW1ib2xzIHRoYXQgYXJlIGxpa2VseSB0byBiZSBhZmZlY3RlZD8gTm8uCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZG91YmxlLWNoZWNrIHRoZSBmdXp6aW5nIGluc3RydWN0aW9uczogaXQgbG9va3MgbGlrZSB0aGlzIHdhcnJhbnRzIGZ1enppbmcgYmVjYXVzZSBpdCBtb2RpZmllcyBrZXJuZnMgZGlyZWN0b3J5IGl0ZXJhdGlvbiBhbmQgcmVzdW1lIGxvZ2ljLCBpbnZvbHZlcyB1bmxvY2tpbmcgYGtlcm5mc19yd3NlbWAgYWNyb3NzIGBkaXJfZW1pdGAsIG1lbW9yeSBhbGxvY2F0aW9uLCBhbmQgY29udGFpbnMgYSBuZXcgYFdBUk5fT05fT05DRWAgYXNzZXJ0aW9uLiBFbmFibGVDb25maWdzIGFyZSBbJiMzNDtLRVJORlMmIzM0OywgJiMzNDtTWVNGUyYjMzQ7XS4gVGhlIEZvY3VzU3ltYm9scyBhcmUgWyYjMzQ7a2VybmZzX2ZvcF9yZWFkZGlyJiMzNDssICYjMzQ7a2VybmZzX2Rpcl9wb3MmIzM0OywgJiMzNDtrZXJuZnNfZGlyX25leHRfcG9zJiMzNDtdLgoKRXZlcnl0aGluZyBzZWVtcyBjbGVhciwgd2VsbC1yZWFzb25lZCwgYW5kIGZvY3VzZWQuIEkmIzM5O20gY29uZmlkZW50IGluIHRoaXMgYXNzZXNzbWVudC4gSXQmIzM5O3MgdGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLRVJORlMmIzM0OywKICAgICYjMzQ7U1lTRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrZXJuZnNfZm9wX3JlYWRkaXImIzM0OywKICAgICYjMzQ7a2VybmZzX2Rpcl9wb3MmIzM0OywKICAgICYjMzQ7a2VybmZzX2Rpcl9uZXh0X3BvcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBrZXJuZnMgZGlyZWN0b3J5IGxpc3RpbmcgKHJlYWRkaXIgLyBnZXRkZW50cykgYW5kIHJlc3VtZSB0cmF2ZXJzYWwgbG9naWMgaW4gZnMva2VybmZzL2Rpci5jLiBTcGVjaWZpY2FsbHksIGl0IHVwZGF0ZXMga2VybmZzX2Rpcl9wb3MgYW5kIGtlcm5mc19kaXJfbmV4dF9wb3MgdG8gcmVzdW1lIHJlYWRkaXIgYmFzZWQgb24gZW50cnkgbmFtZSBjb21wYXJpc29uIHdpdGhpbiB0aGUgcmItdHJlZSwgYWRkcyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgcmVzdW1lIGtleSBuYW1lLCBpbnRyb2R1Y2VzIGEgV0FSTl9PTl9PTkNFIGNoZWNrIG9uIG5hbWUgdHJ1bmNhdGlvbiwgYW5kIHJlbGVhc2VzL3JlYWNxdWlyZXMgcm9vdC1cdTAwM2VrZXJuZnNfcndzZW0gYXJvdW5kIGRpcl9lbWl0KCkuIFRoZXNlIGNoYW5nZXMgdG91Y2ggcmVhY2hhYmxlIGNvcmUgdmlydHVhbCBmaWxlc3lzdGVtIGNvZGUgZXhlcmNpc2VkIGJ5IHVzZXIgc3BhY2UgdmlhIGdldGRlbnRzL2dldGRlbnRzNjQgb24gc3lzZnMgYW5kIGNncm91cHMsIGludHJvZHVjaW5nIGNvbmN1cnJlbmN5IHdpbmRvd3MgYW5kIG1vZGlmaWVkIGxvY2tpbmcgc2VtYW50aWNzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLRVJORlMmIzM0OywKICAgICYjMzQ7U1lTRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrZXJuZnNfZm9wX3JlYWRkaXImIzM0OywKICAgICYjMzQ7a2VybmZzX2Rpcl9wb3MmIzM0OywKICAgICYjMzQ7a2VybmZzX2Rpcl9uZXh0X3BvcyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBrZXJuZnMgZGlyZWN0b3J5IGxpc3RpbmcgKHJlYWRkaXIgLyBnZXRkZW50cykgYW5kIHJlc3VtZSB0cmF2ZXJzYWwgbG9naWMgaW4gZnMva2VybmZzL2Rpci5jLiBTcGVjaWZpY2FsbHksIGl0IHVwZGF0ZXMga2VybmZzX2Rpcl9wb3MgYW5kIGtlcm5mc19kaXJfbmV4dF9wb3MgdG8gcmVzdW1lIHJlYWRkaXIgYmFzZWQgb24gZW50cnkgbmFtZSBjb21wYXJpc29uIHdpdGhpbiB0aGUgcmItdHJlZSwgYWRkcyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgcmVzdW1lIGtleSBuYW1lLCBpbnRyb2R1Y2VzIGEgV0FSTl9PTl9PTkNFIGNoZWNrIG9uIG5hbWUgdHJ1bmNhdGlvbiwgYW5kIHJlbGVhc2VzL3JlYWNxdWlyZXMgcm9vdC1cdTAwM2VrZXJuZnNfcndzZW0gYXJvdW5kIGRpcl9lbWl0KCkuIFRoZXNlIGNoYW5nZXMgdG91Y2ggcmVhY2hhYmxlIGNvcmUgdmlydHVhbCBmaWxlc3lzdGVtIGNvZGUgZXhlcmNpc2VkIGJ5IHVzZXIgc3BhY2UgdmlhIGdldGRlbnRzL2dldGRlbnRzNjQgb24gc3lzZnMgYW5kIGNncm91cHMsIGludHJvZHVjaW5nIGNvbmN1cnJlbmN5IHdpbmRvd3MgYW5kIG1vZGlmaWVkIGxvY2tpbmcgc2VtYW50aWNzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyBrZXJuZnMgZGlyZWN0b3J5IGl0ZXJhdGlvbiAoYGtlcm5mc19mb3BfcmVhZGRpcmApIHRvIHByb3Blcmx5IGhhbmRsZSByZWFkZGlyIHJlc3VtcHRpb24gd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIG9yIHJlbmFtZWQgY29uY3VycmVudGx5LCBieSBrZXlpbmcgcG9zaXRpb24gb24gdGhlIG5vZGUgbmFtZSBpbiBhZGRpdGlvbiB0byBpdHMgaGFzaCBhbmQgZHJvcHBpbmcgYGtlcm5mc19yd3NlbWAgYXJvdW5kIGBkaXJfZW1pdCgpYC5cblxuLSBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb246IEEgdGVtcG9yYXJ5IGJ1ZmZlciBgbmFtZWAgaXMgYWxsb2NhdGVkIHZpYSBga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTClgLiBCZWZvcmUgYW55IHJlYWQsIGl0IGlzIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpYC4gVGhlIHN0cmluZyBjb21wYXJpc29uIGZ1bmN0aW9ucyAoYHN0cmNtcGApIGFuZCBgZGlyX2VtaXQoKWAgb25seSBhY2Nlc3MgdGhlIHBvcHVsYXRlZCwgTlVMLXRlcm1pbmF0ZWQgcHJlZml4IG9mIGxlbmd0aCBgbGVuYC4gTm8gdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZmZlciBhcmUgcmVhZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLlxuLSBMb2NhbCB2YXJpYWJsZXM6IFRoZSBzdGFjayB2YXJpYWJsZSBgYm9vbCByZXN1bWVkYCBwYXNzZWQgdG8gYGtlcm5mc19kaXJfcG9zKClgIGlzIHVuY29uZGl0aW9uYWxseSBpbml0aWFsaXplZCB0byBgZmFsc2VgIHVwb24gZW50cnkgdG8gYGtlcm5mc19kaXJfcG9zKClgLlxuLSBQcmltYXJ5IHJpc2tzOiBUaGUgcGF0Y2ggbW9kaWZpZXMgbG9ja2luZyBiZWhhdmlvciAoZHJvcHBpbmcgYW5kIHJlLWFjcXVpcmluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0YCkgYW5kIG5vZGUgcmVmY291bnRpbmcvdmFsaWRhdGlvbi4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb3RlbnRpYWwgY29uY3VycmVuY3kgcmFjZXMsIGxvY2sgaW52ZXJzaW9uLCBhbmQgbGlmZXRpbWUvdXNlLWFmdGVyLWZyZWUgYnVncywgd2hpY2ggYXJlIGZ1bGx5IGNvdmVyZWQgYnkgTE9DS0RFUCBhbmQgS0FTQU4uXG5cbkJlY2F1c2UgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWsgcmlza3MgdGhhdCB3b3VsZCBiZSB1bmlxdWVseSBkZXRlY3RlZCBieSBLTVNBTiwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGU1NTgwMjBlYWJhNjA1ZjYwODE3ZDU0ZDQ5NzFlY2RmMWNiNDUxZjAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIFNlcCAxMSAxODozMTo0MSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9kaXIuYyBiL2ZzL2tlcm5mcy9kaXIuYwppbmRleCAwN2FiZjU5ZjAyNjRhLi5jYzYyODhkNWI0Y2M0IDEwMDY0NAotLS0gYS9mcy9rZXJuZnMvZGlyLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMva2VybmZzL2Rpci5jCkBAIC0xOTAzLDMzICYjNDM7MTkwMyw0OSBAQCBzdGF0aWMgaW50IGtlcm5mc19kaXJfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiAJcmV0dXJuIDA7CiB9CiAKJiM0MzsvKgomIzQzOyAqIEZpbmQgd2hlcmUgYSBsaXN0aW5nIGxlZnQgb2ZmLiAgQHJlc3VtZWQgc2F5cyB3aGV0aGVyIEBwb3MgaXMgc3RpbGwgdGhhdAomIzQzOyAqIGVudHJ5OyBpZiBub3QsIHRoZSBzZWFyY2ggZmFsbHMgYmFjayB0byBAaGFzaCwga2V5ZWQgYnkgQG5hbWUgaWYgZ2l2ZW4uCiYjNDM7ICovCiBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucywKLQlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zKQomIzQzOwlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLAomIzQzOwljb25zdCBjaGFyICpuYW1lLCBib29sICpyZXN1bWVkKQogewomIzQzOwlpZiAocmVzdW1lZCkKJiM0MzsJCSpyZXN1bWVkID0gZmFsc2U7CiAJaWYgKHBvcykgewomIzQzOwkJLyoKJiM0MzsJCSAqIEEgcmVuYW1lIGtlZXBzIHRoZSBoYXNoIGlmIHRoZSBuZXcgbmFtZSBoYXNoZXMgdGhlIHNhbWUsIHNvCiYjNDM7CQkgKiBjaGVjayBAbmFtZSB0b28uICBPdGhlcndpc2UgdGhlIGNhbGxlciB3b3VsZCBzdGVwIG92ZXIgdGhlCiYjNDM7CQkgKiBlbnRyeSBub3cgc2l0dGluZyB3aGVyZSBAcG9zIHVzZWQgdG8gYmUuCiYjNDM7CQkgKi8KIAkJaW50IHZhbGlkID0ga2VybmZzX2FjdGl2ZShwb3MpICZhbXA7JmFtcDsKIAkJCXJjdV9hY2Nlc3NfcG9pbnRlcihwb3MtJmd0O19fcGFyZW50KSA9PSBwYXJlbnQgJmFtcDsmYW1wOwotCQkJaGFzaCA9PSBwb3MtJmd0O2hhc2g7CiYjNDM7CQkJaGFzaCA9PSBwb3MtJmd0O2hhc2ggJmFtcDsmYW1wOwomIzQzOwkJCSghbmFtZSB8fCAhc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpKSk7CiAJCWtlcm5mc19wdXQocG9zKTsKIAkJaWYgKCF2YWxpZCkKIAkJCXBvcyA9IE5VTEw7CiYjNDM7CQllbHNlIGlmIChyZXN1bWVkKQomIzQzOwkJCSpyZXN1bWVkID0gdHJ1ZTsKIAl9CiAJaWYgKCFwb3MgJmFtcDsmYW1wOyAoaGFzaCAmZ3Q7IDEpICZhbXA7JmFtcDsgKGhhc2ggJmx0OyBJTlRfTUFYKSkgewogCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHBhcmVudC0mZ3Q7ZGlyLmNoaWxkcmVuLnJiX25vZGU7Ci0JCXU2NCBuc19pZCA9IGtlcm5mc19uc19pZChucyk7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogS2VlcCBhIG5vZGUgb25seSBvbiB0aGUgd2F5IGxlZnQsIHNvIHRoZSBzZWFyY2ggZW5kcyBvbiB0aGUKJiM0MzsJCSAqIGZpcnN0IGVudHJ5IGFmdGVyIHRoZSBrZXkuICBBbiBlbXB0eSBAbmFtZSBzb3J0cyBiZWZvcmUgYWxsCiYjNDM7CQkgKiBlbnRyaWVzIHNoYXJpbmcgdGhlIGhhc2gsIHNvIGl0IGxhbmRzIG9uIHRoZSBmaXJzdCBvZiB0aGVtLgomIzQzOwkJICovCiAJCXdoaWxlIChub2RlKSB7Ci0JCQlwb3MgPSByYl90b19rbihub2RlKTsKJiM0MzsJCQlzdHJ1Y3Qga2VybmZzX25vZGUgKmtuID0gcmJfdG9fa24obm9kZSk7CiAKLQkJCWlmIChoYXNoICZsdDsgcG9zLSZndDtoYXNoKQotCQkJCW5vZGUgPSBub2RlLSZndDtyYl9sZWZ0OwotCQkJZWxzZSBpZiAoaGFzaCAmZ3Q7IHBvcy0mZ3Q7aGFzaCkKLQkJCQlub2RlID0gbm9kZS0mZ3Q7cmJfcmlnaHQ7Ci0JCQllbHNlIGlmIChuc19pZCAmbHQ7IGtlcm5mc19uc19pZChwb3MtJmd0O25zKSkKJiM0MzsJCQlpZiAoa2VybmZzX25hbWVfY29tcGFyZShoYXNoLCBuYW1lID86ICYjMzQ7JiMzNDssIG5zLCBrbikgJmx0OyAwKSB7CiYjNDM7CQkJCXBvcyA9IGtuOwogCQkJCW5vZGUgPSBub2RlLSZndDtyYl9sZWZ0OwotCQkJZWxzZSBpZiAobnNfaWQgJmd0OyBrZXJuZnNfbnNfaWQocG9zLSZndDtucykpCiYjNDM7CQkJfSBlbHNlIHsKIAkJCQlub2RlID0gbm9kZS0mZ3Q7cmJfcmlnaHQ7Ci0JCQllbHNlCi0JCQkJYnJlYWs7CiYjNDM7CQkJfQogCQl9CiAJfQogCS8qIFNraXAgb3ZlciBlbnRyaWVzIHdoaWNoIGFyZSBkeWluZy9kZWFkIG9yIGluIHRoZSB3cm9uZyBuYW1lc3BhY2UgKi8KQEAgLTE5NDUsMTAgJiM0MzsxOTYxLDE0IEBAIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLAogfQogCiBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLAotCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBpbm9fdCBpbm8sIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zKQomIzQzOwlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLAomIzQzOwljb25zdCBjaGFyICpuYW1lKQogewotCXBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGlubywgcG9zKTsKLQlpZiAocG9zKSB7CiYjNDM7CWJvb2wgcmVzdW1lZDsKJiM0MzsKJiM0MzsJcG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgaGFzaCwgcG9zLCBuYW1lLCAmYW1wO3Jlc3VtZWQpOwomIzQzOwkvKiBTdGVwIG92ZXIgQHBvcyBvbmx5IGlmIGl0IHN1cnZpdmVkOyBAbmFtZSBmaW5kcyB0aGUgc3BvdCBpZiBub3QuICovCiYjNDM7CWlmIChwb3MgJmFtcDsmYW1wOyByZXN1bWVkKSB7CiAJCWRvIHsKIAkJCXN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dCgmYW1wO3Bvcy0mZ3Q7cmIpOwogCQkJaWYgKCFub2RlKQpAQCAtMTk2NiwzNCAmIzQzOzE5ODYsNTUgQEAgc3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KQogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtJmd0O2ZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTsKIAlzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyA9IGZpbGUtJmd0O3ByaXZhdGVfZGF0YTsKJiM0MzsJY2hhciAqbmFtZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDsKIAlzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3Q7CiAJY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMOwogCiAJaWYgKCFkaXJfZW1pdF9kb3RzKGZpbGUsIGN0eCkpCiAJCXJldHVybiAwOwogCiYjNDM7CS8qCiYjNDM7CSAqIE9uZSBidWZmZXIgZm9yIHRoZSBjYWxsLCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGUgbGlzdGluZwomIzQzOwkgKiBpcyBvbi4gIFBBVEhfTUFYOiBrZXJuZnMgYm91bmRzIG5vIHNpbmdsZSBuYW1lLgomIzQzOwkgKi8KJiM0MzsJbmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIW5hbWUpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKIAlyb290ID0ga2VybmZzX3Jvb3QocGFyZW50KTsKIAlkb3duX3JlYWQoJmFtcDtyb290LSZndDtrZXJuZnNfcndzZW0pOwogCiAJaWYgKGtlcm5mc19uc19lbmFibGVkKHBhcmVudCkpCiAJCW5zID0ga2VybmZzX2luZm8oZGVudHJ5LSZndDtkX3NiKS0mZ3Q7bnM7CiAKLQlmb3IgKHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGN0eC0mZ3Q7cG9zLCBwb3MpOwomIzQzOwlmb3IgKHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGN0eC0mZ3Q7cG9zLCBwb3MsIE5VTEwsIE5VTEwpOwogCSAgICAgcG9zOwotCSAgICAgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtJmd0O3BvcywgcG9zKSkgewotCQljb25zdCBjaGFyICpuYW1lID0ga2VybmZzX3JjdV9uYW1lKHBvcyk7CiYjNDM7CSAgICAgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtJmd0O3BvcywgcG9zLCBuYW1lKSkgewogCQl1bnNpZ25lZCBpbnQgdHlwZSA9IGZzX3Vtb2RlX3RvX2R0eXBlKHBvcy0mZ3Q7bW9kZSk7Ci0JCWludCBsZW4gPSBzdHJsZW4obmFtZSk7CiAJCWlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTsKJiM0MzsJCWludCBsZW47CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhlIGNvcHkgaXMgYWxzbyB0aGUgcmVzdW1lIGtleSwgc28gYSB0cnVuY2F0ZWQgbmFtZSB3b3VsZAomIzQzOwkJICogcmVzdW1lIGhlcmUgYWdhaW4uICBnZXRuYW1lKCkgY2FwcyBhIHBhdGgsIHNvIG9ubHkgYW4KJiM0MzsJCSAqIGluLWtlcm5lbCBjYWxsZXIgY2FuIGdldCBoZXJlOyBlbmQgdGhlIGxpc3RpbmcgaW5zdGVhZC4KJiM0MzsJCSAqLwomIzQzOwkJbGVuID0gc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpOwomIzQzOwkJaWYgKFdBUk5fT05fT05DRShsZW4gJmx0OyAwKSkKJiM0MzsJCQlicmVhazsKIAogCQljdHgtJmd0O3BvcyA9IHBvcy0mZ3Q7aGFzaDsKIAkJZmlsZS0mZ3Q7cHJpdmF0ZV9kYXRhID0gcG9zOwogCQlrZXJuZnNfZ2V0KHBvcyk7CiAKLQkJaWYgKCFkaXJfZW1pdChjdHgsIG5hbWUsIGxlbiwgaW5vLCB0eXBlKSkgewotCQkJdXBfcmVhZCgmYW1wO3Jvb3QtJmd0O2tlcm5mc19yd3NlbSk7CiYjNDM7CQkvKgomIzQzOwkJICogZGlyX2VtaXQoKSBjYW4gZmF1bHQsIHNvIHJ1biBpdCB1bmxvY2tlZC4gIEBwb3MgaXMgcGlubmVkCiYjNDM7CQkgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suCiYjNDM7CQkgKi8KJiM0MzsJCXVwX3JlYWQoJmFtcDtyb290LSZndDtrZXJuZnNfcndzZW0pOwomIzQzOwkJaWYgKCFkaXJfZW1pdChjdHgsIG5hbWUsIGxlbiwgaW5vLCB0eXBlKSkKIAkJCXJldHVybiAwOwotCQl9CiYjNDM7CQlkb3duX3JlYWQoJmFtcDtyb290LSZndDtrZXJuZnNfcndzZW0pOwogCX0KIAl1cF9yZWFkKCZhbXA7cm9vdC0mZ3Q7a2VybmZzX3J3c2VtKTsKIAlmaWxlLSZndDtwcml2YXRlX2RhdGEgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmMKaW5kZXggNmU3NGRhOTFlYmNhNS4uMDFjZDU4ZTVlNDFlNyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jCkBAIC04LDYgJiM0Mzs4LDcgQEAKICNpbmNsdWRlICZsdDtsaW1pdHMuaCZndDsKICNpbmNsdWRlICZsdDtuZXQvaWYuaCZndDsKICNpbmNsdWRlICZsdDtzY2hlZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzaWduYWwuaCZndDsKICNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwogI2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwogI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwpAQCAtMTcsNiAmIzQzOzE4LDcgQEAKICNpbmNsdWRlICZsdDtzeXMvbW91bnQuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvc29ja2V0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3N0YXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3N5c2NhbGwuaCZndDsKICNpbmNsdWRlICZsdDtzeXMveGF0dHIuaCZndDsKIAogI2luY2x1ZGUgJiMzNDtrc2VsZnRlc3RfaGFybmVzcy5oJiMzNDsKQEAgLTQ3Miw2ICYjNDM7NDc0LDIwNCBAQCBURVNUX0Yoa2VybmZzX2Nncm91cCwgcmVhZGRpcl9ub19kdXBsaWNhdGVzKQogCQkJRVhQRUNUX1NUUk5FKG5hbWVzW2ldLCBuYW1lc1tqXSk7CiB9CiAKJiM0MzsjZGVmaW5lIFJFU1VNRV9ESVJTCTI0CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZXN1bWluZyBhdCBhbiBlbnRyeSB0aGF0IGhhcyBnb25lIG11c3QgY2Fycnkgb24gYWZ0ZXIgaXQsIG5ldmVyIGJlZm9yZS4KJiM0MzsgKiBUYWtlIGEgY29va2llIGZvciBldmVyeSBlbnRyeSwgdGhlbiByZW1vdmUgZWFjaCBvbmUsIHNlZWsgdG8gaXRzIGNvb2tpZQomIzQzOyAqIGFuZCByZWFkIHRoZSByZXN0OyBub3RoaW5nIGFscmVhZHkgcmVwb3J0ZWQgbWF5IGNvbWUgYmFjay4KJiM0MzsgKi8KJiM0MztURVNUX0Yoa2VybmZzX2Nncm91cCwgcmVhZGRpcl9yZXN1bWVfYXRfcmVtb3ZlZF9lbnRyeSkKJiM0Mzt7CiYjNDM7CS8qIFRoZSBjZ3JvdXAmIzM5O3Mgb3duIGNvbnRyb2wgZmlsZXMgYXJlIGxpc3RlZCBhbG9uZ3NpZGUgb3Vycy4gKi8KJiM0MzsJY2hhciBuYW1lc1sxMjhdW05BTUVfTUFYICYjNDM7IDFdOwomIzQzOwlsb25nIHBvc1sxMjhdOwomIzQzOwljaGFyIHBhdGhbUEFUSF9NQVhdOwomIzQzOwlzdHJ1Y3QgZGlyZW50ICpkZTsKJiM0MzsJaW50IG4gPSAwLCBpLCBqOwomIzQzOwlESVIgKmQ7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBSRVNVTUVfRElSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgJiMzNDslcy9lJTAyZCYjMzQ7LCBzZWxmLSZndDtzY3JhdGNoLCBpKTsKJiM0MzsJCUFTU0VSVF9FUShta2RpcihwYXRoLCAwNzU1KSwgMCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmVjb3JkIHRoZSBjb29raWUgYmVmb3JlIHJlYWRpbmcgZWFjaCBlbnRyeSwgd2l0aCBpdHMgbmFtZS4gKi8KJiM0MzsJZCA9IG9wZW5kaXIoc2VsZi0mZ3Q7c2NyYXRjaCk7CiYjNDM7CUFTU0VSVF9ORShkLCBOVUxMKTsKJiM0MzsJd2hpbGUgKDEpIHsKJiM0MzsJCWxvbmcgaGVyZSA9IHRlbGxkaXIoZCk7CiYjNDM7CiYjNDM7CQlkZSA9IHJlYWRkaXIoZCk7CiYjNDM7CQlpZiAoIWRlKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJaWYgKCFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuJiMzNDspIHx8ICFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuLiYjMzQ7KSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCUFTU0VSVF9MVChuLCAoaW50KUFSUkFZX1NJWkUocG9zKSk7CiYjNDM7CQlwb3Nbbl0gPSBoZXJlOwomIzQzOwkJc3RybmNweShuYW1lc1tuXSwgZGUtJmd0O2RfbmFtZSwgTkFNRV9NQVgpOwomIzQzOwkJbmFtZXNbbl1bTkFNRV9NQVhdID0gJiMzOTtcMCYjMzk7OwomIzQzOwkJbiYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsJY2xvc2VkaXIoZCk7CiYjNDM7CUFTU0VSVF9HVChuLCAxKTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkvKiBPbmx5IHRoZSBkaXJlY3RvcmllcyB3ZSBtYWRlIGNhbiBiZSByZW1vdmVkIGFuZCBwdXQgYmFjay4gKi8KJiM0MzsJCWlmIChzdHJuY21wKG5hbWVzW2ldLCAmIzM0O2UmIzM0OywgMSkpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICYjMzQ7JXMvJXMmIzM0Oywgc2VsZi0mZ3Q7c2NyYXRjaCwgbmFtZXNbaV0pOwomIzQzOwkJQVNTRVJUX0VRKHJtZGlyKHBhdGgpLCAwKTsKJiM0MzsKJiM0MzsJCS8qIFJlb3BlbiBzbyB0aGUgc2VlayBoYXMgdG8gcmVhY2ggdGhlIGtlcm5lbC4gKi8KJiM0MzsJCWQgPSBvcGVuZGlyKHNlbGYtJmd0O3NjcmF0Y2gpOwomIzQzOwkJQVNTRVJUX05FKGQsIE5VTEwpOwomIzQzOwkJc2Vla2RpcihkLCBwb3NbaV0pOwomIzQzOwkJd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpKSB7CiYjNDM7CQkJaWYgKCFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuJiMzNDspIHx8ICFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuLiYjMzQ7KSkKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJZm9yIChqID0gMDsgaiAmbHQ7IGk7IGomIzQzOyYjNDM7KQomIzQzOwkJCQlBU1NFUlRfU1RSTkUoZGUtJmd0O2RfbmFtZSwgbmFtZXNbal0pCiYjNDM7CQkJCQlUSF9MT0coJiMzNDtyZXN1bWluZyBhdCAlcyAoZ29uZSkgd2VudCBiYWNrIHRvICVzJiMzNDssCiYjNDM7CQkJCQkgICAgICAgbmFtZXNbaV0sIG5hbWVzW2pdKTsKJiM0MzsJCX0KJiM0MzsJCWNsb3NlZGlyKGQpOwomIzQzOwomIzQzOwkJQVNTRVJUX0VRKG1rZGlyKHBhdGgsIDA3NTUpLCAwKTsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgUkVTVU1FX0RJUlM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICYjMzQ7JXMvZSUwMmQmIzM0Oywgc2VsZi0mZ3Q7c2NyYXRjaCwgaSk7CiYjNDM7CQlFWFBFQ1RfRVEocm1kaXIocGF0aCksIDApOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgQ0hVUk5fUk9VTkRTCTQwMAomIzQzOyNkZWZpbmUgQ0hVUk5fQlVGU1oJNTEyCS8qIHNtYWxsLCBzbyBhIGxpc3RpbmcgdGFrZXMgc2V2ZXJhbCBjYWxscyAqLwomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIGZpbGVzIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBlbmFibGluZyB3cml0ZSBhbmQgZ28gYXQgdGhlIHN0YXJ0IG9mCiYjNDM7ICogdGhlIGRpc2FibGluZyBvbmUsIHNvIHRoZSB3aW5kb3cgd2hlcmUgdGhleSBleGlzdCBpcyB0aGUgc2hvcnQgb25lLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgQ0hVUk5fRFdFTExfT04JMjAwMAomIzQzOyNkZWZpbmUgQ0hVUk5fRFdFTExfT0ZGCTIwMAomIzQzOwomIzQzO3N0cnVjdCBrZXJuZnNfZGlyZW50NjQgewomIzQzOwl1bnNpZ25lZCBsb25nIGxvbmcJZF9pbm87CiYjNDM7CWxvbmcgbG9uZwkJZF9vZmY7CiYjNDM7CXVuc2lnbmVkIHNob3J0CQlkX3JlY2xlbjsKJiM0MzsJdW5zaWduZWQgY2hhcgkJZF90eXBlOwomIzQzOwljaGFyCQkJZF9uYW1lW107CiYjNDM7fTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSBzYW1lIHJlc3VtZSwgYnV0IGluc2lkZSBvbmUgZ2V0ZGVudHMoMikgY2FsbC4gIHJtZGlyKDIpIGNhbm5vdCByZWFjaAomIzQzOyAqIHRoYXQgd2luZG93IGJlY2F1c2UgaXRlcmF0ZV9kaXIoKSBob2xkcyB0aGUgbGlzdGVkIGRpcmVjdG9yeSYjMzk7cyBpX3J3c2VtCiYjNDM7ICogZm9yIHRoZSB3aG9sZSBsaXN0aW5nOyBjZ3JvdXAuc3VidHJlZV9jb250cm9sIGNhbiwgaGF2aW5nIG5vIFZGUwomIzQzOyAqIG9wZXJhdGlvbiBvbiB0aGUgbmFtZXMgaXQgYWRkcyBhbmQgcmVtb3Zlcy4gIFRoZSBmaWxlcyB0aGF0IGFyZSBub3QgdGhlCiYjNDM7ICogY29udHJvbGxlciYjMzk7cyBzdGF5IHRocm91Z2hvdXQsIHNvIGVhY2ggbXVzdCBhcHBlYXIgZXhhY3RseSBvbmNlLgomIzQzOyAqCiYjNDM7ICogQSBzdHJlc3MgdGVzdDogaXQgaGFzIG5vdCBiZWVuIHNlZW4gdG8gY2F0Y2ggdGhlIG9yZGVyaW5nIGJ1ZywgYW5kIGlzCiYjNDM7ICogaGVyZSB0byBrZWVwIHRoZSB1bmxvY2tlZCB3aW5kb3cgdW5kZXIgbG9hZCBmb3IgbG9ja2RlcCBhbmQgS0FTQU4uCiYjNDM7ICovCiYjNDM7VEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX3ZzX2ludGVybmFsX3JlbW92ZSkKJiM0Mzt7CiYjNDM7CWNoYXIgYnVmW0NIVVJOX0JVRlNaXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiYjNDM7CWNoYXIgc3RhYmxlWzEyOF1bTkFNRV9NQVggJiM0MzsgMV07CiYjNDM7CWludCBuc3RhYmxlID0gMCwgaSwgcjsKJiM0MzsJaW50IHdpdGhjdGwgPSAwLCB3aXRob3V0ID0gMDsKJiM0MzsJaW50IHNlZW5bMTI4XSwgc3RhdHVzOwomIzQzOwlwaWRfdCBjaHVybmVyOwomIzQzOwlESVIgKmQ7CiYjNDM7CiYjNDM7CS8qIFdpdGggdGhlIGNvbnRyb2xsZXIgb2ZmLCB3aGF0ZXZlciBpcyBsZWZ0IGlzIHdoYXQgbXVzdCBwZXJzaXN0LiAqLwomIzQzOwlBU1NFUlRfRVEod3JpdGVfZmlsZShzZWxmLSZndDtzY3JhdGNoX3NjLCBzZWxmLSZndDtkaXNhYmxlKSwgMCk7CiYjNDM7CWQgPSBvcGVuZGlyKHNlbGYtJmd0O2NoaWxkKTsKJiM0MzsJQVNTRVJUX05FKGQsIE5VTEwpOwomIzQzOwlmb3IgKDs7KSB7CiYjNDM7CQlzdHJ1Y3QgZGlyZW50ICpkZSA9IHJlYWRkaXIoZCk7CiYjNDM7CiYjNDM7CQlpZiAoIWRlKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJaWYgKCFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuJiMzNDspIHx8ICFzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuLiYjMzQ7KSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCUFTU0VSVF9MVChuc3RhYmxlLCAoaW50KUFSUkFZX1NJWkUoc3RhYmxlKSk7CiYjNDM7CQlzdHJuY3B5KHN0YWJsZVtuc3RhYmxlXSwgZGUtJmd0O2RfbmFtZSwgTkFNRV9NQVgpOwomIzQzOwkJc3RhYmxlW25zdGFibGVdW05BTUVfTUFYXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJCW5zdGFibGUmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWNsb3NlZGlyKGQpOwomIzQzOwlBU1NFUlRfR1QobnN0YWJsZSwgMCk7CiYjNDM7CiYjNDM7CWNodXJuZXIgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShjaHVybmVyLCAwKTsKJiM0MzsJaWYgKGNodXJuZXIgPT0gMCkgewomIzQzOwkJZm9yICg7OykgewomIzQzOwkJCWlmICh3cml0ZV9maWxlKHNlbGYtJmd0O3NjcmF0Y2hfc2MsIHNlbGYtJmd0O2VuYWJsZSkpCiYjNDM7CQkJCV9leGl0KDEwKTsKJiM0MzsJCQl1c2xlZXAoQ0hVUk5fRFdFTExfT04pOwomIzQzOwkJCWlmICh3cml0ZV9maWxlKHNlbGYtJmd0O3NjcmF0Y2hfc2MsIHNlbGYtJmd0O2Rpc2FibGUpKQomIzQzOwkJCQlfZXhpdCgxMSk7CiYjNDM7CQkJdXNsZWVwKENIVVJOX0RXRUxMX09GRik7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChyID0gMDsgciAmbHQ7IENIVVJOX1JPVU5EUzsgciYjNDM7JiM0MzspIHsKJiM0MzsJCWludCBmZCA9IG9wZW4oc2VsZi0mZ3Q7Y2hpbGQsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkpOwomIzQzOwkJaW50IGV4dHJhID0gMDsKJiM0MzsJCWludCBuOwomIzQzOwomIzQzOwkJQVNTRVJUX0dFKGZkLCAwKTsKJiM0MzsJCW1lbXNldChzZWVuLCAwLCBzaXplb2Yoc2VlbikpOwomIzQzOwomIzQzOwkJd2hpbGUgKChuID0gc3lzY2FsbChTWVNfZ2V0ZGVudHM2NCwgZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSAmZ3Q7IDApIHsKJiM0MzsJCQlpbnQgb2ZmID0gMDsKJiM0MzsKJiM0MzsJCQl3aGlsZSAob2ZmICZsdDsgbikgewomIzQzOwkJCQlzdHJ1Y3Qga2VybmZzX2RpcmVudDY0ICpkZSA9ICh2b2lkICopKGJ1ZiAmIzQzOyBvZmYpOwomIzQzOwkJCQlib29sIGtub3duID0gZmFsc2U7CiYjNDM7CiYjNDM7CQkJCW9mZiAmIzQzOz0gZGUtJmd0O2RfcmVjbGVuOwomIzQzOwkJCQlmb3IgKGkgPSAwOyBpICZsdDsgbnN0YWJsZTsgaSYjNDM7JiM0MzspCiYjNDM7CQkJCQlpZiAoIXN0cmNtcChkZS0mZ3Q7ZF9uYW1lLCBzdGFibGVbaV0pKSB7CiYjNDM7CQkJCQkJc2VlbltpXSYjNDM7JiM0Mzs7CiYjNDM7CQkJCQkJa25vd24gPSB0cnVlOwomIzQzOwkJCQkJfQomIzQzOwkJCQlpZiAoIWtub3duICZhbXA7JmFtcDsgc3RyY21wKGRlLSZndDtkX25hbWUsICYjMzQ7LiYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CQkJCSAgICBzdHJjbXAoZGUtJmd0O2RfbmFtZSwgJiMzNDsuLiYjMzQ7KSkKJiM0MzsJCQkJCWV4dHJhJiM0MzsmIzQzOzsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQlBU1NFUlRfR0UobiwgMCk7CiYjNDM7CQlFWFBFQ1RfRVEoY2xvc2UoZmQpLCAwKTsKJiM0MzsKJiM0MzsJCWlmIChleHRyYSkKJiM0MzsJCQl3aXRoY3RsJiM0MzsmIzQzOzsKJiM0MzsJCWVsc2UKJiM0MzsJCQl3aXRob3V0JiM0MzsmIzQzOzsKJiM0MzsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBuc3RhYmxlOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlBU1NFUlRfRVEoc2VlbltpXSwgMSkKJiM0MzsJCQkJVEhfTE9HKCYjMzQ7cm91bmQgJWQ6ICVzIHNlZW4gJWQgdGltZXMmIzM0OywKJiM0MzsJCQkJICAgICAgIHIsIHN0YWJsZVtpXSwgc2VlbltpXSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogVGhlIGNodXJuIG11c3QgaGF2ZSBiZWVuIHJ1bm5pbmcsIG9yIHRoZSBsaXN0aW5ncyBwcm92ZSBub3RoaW5nLiAqLwomIzQzOwlFWFBFQ1RfRVEoa2lsbChjaHVybmVyLCBTSUdLSUxMKSwgMCk7CiYjNDM7CUFTU0VSVF9FUSh3YWl0cGlkKGNodXJuZXIsICZhbXA7c3RhdHVzLCAwKSwgY2h1cm5lcik7CiYjNDM7CUFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykgJmFtcDsmYW1wOyBXVEVSTVNJRyhzdGF0dXMpID09IFNJR0tJTEwpCiYjNDM7CQlUSF9MT0coJiMzNDtjaHVybmVyIGV4aXRlZCBvbiBpdHMgb3duOiBzdGF0dXMgJWQmIzM0Oywgc3RhdHVzKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhleSBhbHNvIGhhdmUgdG8gaGF2ZSBvdmVybGFwcGVkIGl0LiAgSG93IG11Y2ggZGVwZW5kcyBvbiB0aGUKJiM0MzsJICogbWFjaGluZSwgc28gc2F5IHRoZSByYWNlIGNvdWxkIG5vdCBiZSBhcnJhbmdlZCByYXRoZXIgdGhhbiBmYWlsLgomIzQzOwkgKi8KJiM0MzsJaWYgKCF3aXRoY3RsIHx8ICF3aXRob3V0KQomIzQzOwkJU0tJUChyZXR1cm4sICYjMzQ7bGlzdGluZ3MgZGlkIG5vdCBzcGFuIHRoZSBjaHVybjogJWQgd2l0aCwgJWQgd2l0aG91dCYjMzQ7LAomIzQzOwkJICAgICB3aXRoY3RsLCB3aXRob3V0KTsKJiM0Mzt9CiYjNDM7CiAvKgogICogQSB0ZWxsZGlyKCkgY29va2llIG11c3QgcmVzb2x2ZSBiYWNrIHRvIHRoZSBzYW1lIGVudHJ5IGFmdGVyIHNlZWtkaXIoKS4KICAqIGtlcm5mcyBlbmNvZGVzIHRoZSBjb29raWUgYXMgdGhlIG5vZGUmIzM5O3MgbmFtZSBoYXNoLCBzbyB0aGlzIGNvdmVycwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjM1NgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDIzOTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gRnV6emluZyBTZXNzaW9uIEFzc2Vzc21lbnQqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgb2JqZWN0aXZlIGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgcGF0Y2ggc2VyaWVzIHdhcnJhbnRzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4gVGhlIHJ1bGUgaXMgY2xlYXI6IEtNU0FOIGlzIGV4cGVuc2l2ZSwgYW5kIHNob3VsZCAqb25seSogYmUgY29uc2lkZXJlZCBpZiB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBhcmUgKmV4Y2x1c2l2ZWx5KiBkZXRlY3RhYmxlIGJ5IEtNU0FOLiBJZiBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGNhbiBjYXRjaCBhbiBpc3N1ZSwgd2UgZG9uJiMzOTt0IG5lZWQgS01TQU4uCgpGaXJzdCwgSSBleGFtaW5lZCB0aGUgcGF0Y2ggaW4gYGZzL2tlcm5mcy9kaXIuY2AuIEkgbm90aWNlZCB0aGlzIGxpbmU6IGBuYW1lID0ga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7YC4gIEFoYSEgYGttYWxsb2NgIHdpdGhvdXQgYGt6YWxsb2NgLi4udGhhdCYjMzk7cyBhIHBvdGVudGlhbCByZWQgZmxhZy4gTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0aGF0IGBuYW1lYCBjb3VsZCBiZSB1bmluaXRpYWxpemVkLgoKTm93LCBJIGZvbGxvd2VkIHRoZSBjb2RlIGZsb3cuICBgbmFtZWAgaXMgYWxsb2NhdGVkLCBhbmQgdGhlIGBrZXJuZnNfZGlyX3Bvc2AgaXMgY2FsbGVkLiBDcml0aWNhbGx5LCBkdXJpbmcgdGhlICpmaXJzdCogaXRlcmF0aW9uIG9mIHRoZSBsb29wIHRoYXQgcHJvY2Vzc2VzIHRoZSBkaXJlY3RvcnkgZW50cmllcywgYG5hbWVgIGlzLCBhdCB0aGF0IHBvaW50LCBzdGlsbCB1bmluaXRpYWxpemVkLgoKVGhlbiwgaW5zaWRlIHRoZSBsb29wLCB0aGUgY3JpdGljYWwgbGluZSBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpO2AgY29tZXMgaW50byBwbGF5LiAqVGhpcyogaXMgd2hhdCBwb3B1bGF0ZXMgYG5hbWVgIHdpdGggYSBzdHJpbmcgZnJvbSBga2VybmZzX3JjdV9uYW1lKHBvcylgLiBDcnVjaWFsbHksIHRoaXMgY29waWVzIGFuZCBOVUwtdGVybWluYXRlcyB0aGUgc3RyaW5nLgoKVGhlIG5leHQgY29uY2VybiB0aGF0IGNhbWUgdG8gbWluZCB3YXMgd2hldGhlciB0aGUgY29kZSBtYWtlcyB1c2Ugb2YgdGhlIHdob2xlIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIGBuYW1lYCwgbmFtZWx5IHdoZXRoZXIgYG5hbWVgIGlzIHJlYWQgYmV5b25kIGBsZW5gLiAgU28sIEkgY2hlY2tlZCB3aGVyZSBgbmFtZWAgaXMgdXNlZCwgYW5kIGluIHRoaXMgY2FzZSwgYGRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpO2AuIAoKQXQgdGhpcyBwb2ludCwgSSB3b3VsZCBuZWVkIHRvIGFuYWx5emUgYGRpcl9lbWl0YCBhbmQgc2VlIHdoYXQgaXQgZG9lcyB3aXRoIGBuYW1lYCBhbmQgYGxlbmAuCkhvd2V2ZXIsIEkgY2FuIGNvbmNsdWRlIHNvIGZhciB0aGF0IGdpdmVuIGBuYW1lYCBpcyB1bmluaXRpYWxpemVkIGJlZm9yZSBgc3Ryc2NweWAgaXMgY2FsbGVkIGluc2lkZSB0aGUgbG9vcCwgYnV0IGlzICppbml0aWFsaXplZCogYmVmb3JlIGFueSB1c2UgYmV5b25kIHRoYXQgcG9pbnQsIGl0IGRvZXMgbm90IGp1c3RpZnkgYSBLTVNBTiBzZXNzaW9uLiBLQVNBTi9vdGhlciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGFyZSBzdWZmaWNpZW50IGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2Rpcl9lbWl0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9mcy5oJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvZnMuaD0zNTk2PXN0YXRpYyBpbmxpbmUgYm9vbCBpc19yb290X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MDAtXG5pbmNsdWRlL2xpbnV4L2ZzLmg6MzYwMTpzdGF0aWMgaW5saW5lIGJvb2wgZGlyX2VtaXQoc3RydWN0IGRpcl9jb250ZXh0ICpjdHgsXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYwMi1cdFx0XHQgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sXG4tLVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MDgtfVxuaW5jbHVkZS9saW51eC9mcy5oOjM2MDk6c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYxMC17XG4tLVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MTMtfVxuaW5jbHVkZS9saW51eC9mcy5oOjM2MTQ6c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdGRvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYxNS17XG4tLVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MTgtfVxuaW5jbHVkZS9saW51eC9mcy5oOjM2MTk6c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdHMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MjAte1xuaW5jbHVkZS9saW51eC9mcy5oLTM2MjEtXHRpZiAoY3R4LVx1MDAzZXBvcyA9PSAwKSB7XG5pbmNsdWRlL2xpbnV4L2ZzLmg6MzYyMjpcdFx0aWYgKCFkaXJfZW1pdF9kb3QoZmlsZSwgY3R4KSlcbmluY2x1ZGUvbGludXgvZnMuaC0zNjIzLVx0XHRcdHJldHVybiBmYWxzZTtcbi0tXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYyNi1cdGlmIChjdHgtXHUwMDNlcG9zID09IDEpIHtcbmluY2x1ZGUvbGludXgvZnMuaDozNjI3Olx0XHRpZiAoIWRpcl9lbWl0X2RvdGRvdChmaWxlLCBjdHgpKVxuaW5jbHVkZS9saW51eC9mcy5oLTM2MjgtXHRcdFx0cmV0dXJuIGZhbHNlO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NjgyCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBEaXJlY3RvcnkgRW1pdHRpbmcgTG9naWMqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBrZXJuZWwgaGFuZGxlcyBkaXJlY3RvcnkgZW50cmllcy4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggYGluY2x1ZGUvbGludXgvZnMuaGAuIFNwZWNpZmljYWxseSwgSSB0aGluayBgZGlyX2VtaXRgIGlzIGdvaW5nIHRvIGJlIGtleSB0byBob3cgdGhlc2UgZW50cmllcyBhcmUgY3JlYXRlZCBhbmQgcG9wdWxhdGVkLiBJJiMzOTttIGdvaW5nIHRvIGxvb2sgYXJvdW5kIGxpbmUgMzYwMSBpbiB0aGF0IGZpbGUgYW5kIHplcm8gaW4gb24gdGhlIGBkaXJfZW1pdGAgZnVuY3Rpb24uIEl0JiMzOTtzIGxpa2VseSB0aGF0IGl0IGhvbGRzIHRoZSBjb3JlIGxvZ2ljIGZvciB0aGUgcHJvY2VzcyBvZiAmIzM0O2VtaXR0aW5nJiMzNDsgb3Igb3V0cHV0dGluZyBkaXJlY3RvcnkgZW50cmllcyBkdXJpbmcgZGlyZWN0b3J5IHRyYXZlcnNhbCBvciBsaXN0aW5nIG9wZXJhdGlvbnMuIEkgZXhwZWN0IHRvIGZpbmQgdGhlIGRldGFpbHMgb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBpbnZvbHZlZCwgaG93IG5hbWVzIGFyZSBoYW5kbGVkLCBhbmQgaG93IHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gaW50ZXJhY3RzIHdpdGggdGhlIGRpcmVjdG9yeSBjYWNoZSBvciBvdGhlciBzdHJ1Y3R1cmVzLiBIb3BlZnVsbHksIEkmIzM5O2xsIHF1aWNrbHkgZ2V0IGEgZmVlbCBmb3IgaG93IHRoaXMgY3JpdGljYWwgY29tcG9uZW50IGZpdHMgaW50byB0aGUgYnJvYWRlciBmaWxlc3lzdGVtIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2ZzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNjAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzM2MDA6XHRcbjM2MDE6XHRzdGF0aWMgaW5saW5lIGJvb2wgZGlyX2VtaXQoc3RydWN0IGRpcl9jb250ZXh0ICpjdHgsXG4zNjAyOlx0XHRcdFx0ICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLFxuMzYwMzpcdFx0XHRcdCAgICB1NjQgaW5vLCB1bnNpZ25lZCB0eXBlKVxuMzYwNDpcdHtcbjM2MDU6XHRcdHVuc2lnbmVkIGludCBkdF9tYXNrID0gU19EVF9NQVNLIHwgY3R4LVx1MDAzZWR0X2ZsYWdzX21hc2s7XG4zNjA2Olx0XG4zNjA3Olx0XHRyZXR1cm4gY3R4LVx1MDAzZWFjdG9yKGN0eCwgbmFtZSwgbmFtZWxlbiwgY3R4LVx1MDAzZXBvcywgaW5vLCB0eXBlIFx1MDAyNiBkdF9tYXNrKTtcbjM2MDg6XHR9XG4zNjA5Olx0c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4zNjEwOlx0e1xuMzYxMTpcdFx0cmV0dXJuIGN0eC1cdTAwM2VhY3RvcihjdHgsIFwmIzM0Oy5cJiMzNDssIDEsIGN0eC1cdTAwM2Vwb3MsXG4zNjEyOlx0XHRcdFx0ICBmaWxlLVx1MDAzZWZfcGF0aC5kZW50cnktXHUwMDNlZF9pbm9kZS1cdTAwM2VpX2lubywgRFRfRElSKTtcbjM2MTM6XHR9XG4zNjE0Olx0c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdGRvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4zNjE1Olx0e1xuMzYxNjpcdFx0cmV0dXJuIGN0eC1cdTAwM2VhY3RvcihjdHgsIFwmIzM0Oy4uXCYjMzQ7LCAyLCBjdHgtXHUwMDNlcG9zLFxuMzYxNzpcdFx0XHRcdCAgZF9wYXJlbnRfaW5vKGZpbGUtXHUwMDNlZl9wYXRoLmRlbnRyeSksIERUX0RJUik7XG4zNjE4Olx0fVxuMzYxOTpcdHN0YXRpYyBpbmxpbmUgYm9vbCBkaXJfZW1pdF9kb3RzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAzMDcKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiA5NTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBEaXJlY3RvcnkgSXRlcmF0aW9uIExvZ2ljKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24gc3lzdGVtYXRpY2FsbHkuIGBkaXJfZW1pdGAgaXMgY2FsbGVkIHdpdGggYG5hbWVgIGFuZCBgbmFtZWxlbmAsIGFuZCBJIGluaXRpYWxseSBhc3N1bWVkIHRoYXQgYG5hbWVgIGhlbGQgYGxlbmAgaW5pdGlhbGl6ZWQgYnl0ZXMgcGx1cyBhIG51bGwgdGVybWluYXRvci4gQnV0IHNvbWV0aGluZyBmZWVscyBvZmYgd2l0aCB0aGUgbG9vcC4gVGhlIGNydWNpYWwgcG9pbnQgc2VlbXMgdG8gYmUgaG93IHRoZSBgbmFtZWAgYXJndW1lbnQgaXMgaGFuZGxlZCBhY3Jvc3MgaXRlcmF0aW9ucy4KCkxvb2tpbmcgYXQgdGhlIGxvb3AmIzM5O3Mgc3RydWN0dXJlLCBpbiB0aGUgbmV4dCBpdGVyYXRpb24gYGtlcm5mc19kaXJfbmV4dF9wb3NgIGlzIGNhbGxlZC4gSXQgbG9va3MgYXQgdGhlIGBrZXJuZnNfZGlyX3Bvc2AgZnVuY3Rpb24uIFRoYXQgZnVuY3Rpb24gdGFrZXMgdGhlIGBuYW1lYCBhcmd1bWVudC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGJlaGF2aW9yLgoKTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNlIHdpdGggdGhlIGBuYW1lYCBhcmd1bWVudC4gRGlnZ2luZyBpbnRvIGBrZXJuZnNfZGlyX3Bvc2AsIHRoZSBjb2RlIGluaXRpYWxseSBjaGVja3MgaWYgYSBgcG9zYCBpcyB2YWxpZCBhbmQgaWYgYHN0cmNtcGAgd2lsbCBiZSBjYWxsZWQgd2l0aCBgbmFtZWAsIHdoaWNoIGluaXRpYWxseSBjb3VsZCBiZSB1bmluaXRpYWxpemVkLiBIb3dldmVyLCB0aGUgZmlyc3QgY2FsbCBwYXNzZXMgYSBOVUxMIGBuYW1lYCBhcmd1bWVudCB0byBga2VybmZzX2Rpcl9wb3NgLCBzbyB0aGF0JiMzOTtzIHRoZSBzdGFydGluZyBwb2ludC4KCkluc2lkZSB0aGUgbG9vcCwgaXQmIzM5O3MgY2xlYXIgbm93OiBga2VybmZzX2Rpcl9wb3NgIGlzIGNhbGxlZCB3aXRoIGEgTlVMTCBgbmFtZWAuIFRoZW4sIGlmIGBwb3NgIGlzIG5vbi1udWxsLCBgc3Ryc2NweWAgaXMgdXNlZCB0byBwb3B1bGF0ZSBgbmFtZWAgd2l0aCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZnJvbSBga2VybmZzX3JjdV9uYW1lKHBvcylgLiAqVGhhdCYjMzk7cyogd2hlcmUgdGhlIHN0cmluZyBpcyBwb3B1bGF0ZWQhIENydWNpYWxseSwgdGhpcyBtZWFucyBgbmFtZWAgaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQgKmJlZm9yZSogaXQgaXMgdXNlZCBpbiB0aGUgc3Vic2VxdWVudCBjYWxsIHRvIGBrZXJuZnNfZGlyX25leHRfcG9zYC4gU28gYWZ0ZXIgdGhlIGZpcnN0IGxvb3AgaXRlcmF0aW9uLCBgbmFtZWAgaXMgbm93IGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIEFuZCB0aGVuIGluIHRoZSBjaGVjayBhZ2FpbnN0IGBrZXJuZnNfcmN1X25hbWUocG9zKWAgaXQgaXMgc2FmZSB0byB1c2UuCgpMZXQmIzM5O3MgbG9vayBhdCBga2VybmZzX25hbWVfY29tcGFyZWAsIHRob3VnaCwgc2luY2UgdGhhdCBpcyB1c2VkIGFzIHdlbGwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tlcm5mc19uYW1lX2NvbXBhcmUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9rZXJuZnMvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2tlcm5mcy9kaXIuYz0zMjk9c3RhdGljIHVuc2lnbmVkIGludCBrZXJuZnNfbmFtZV9oYXNoKGNvbnN0IGNoYXIgKm5hbWUsXG4tLVxuZnMva2VybmZzL2Rpci5jLTM0NS1cbmZzL2tlcm5mcy9kaXIuYzozNDY6c3RhdGljIGludCBrZXJuZnNfbmFtZV9jb21wYXJlKHVuc2lnbmVkIGludCBoYXNoLCBjb25zdCBjaGFyICpuYW1lLFxuZnMva2VybmZzL2Rpci5jLTM0Ny1cdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsIGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXG4tLVxuZnMva2VybmZzL2Rpci5jPTM2Mz1zdGF0aWMgaW50IGtlcm5mc19zZF9jb21wYXJlKGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqbGVmdCxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMzY1LXtcbmZzL2tlcm5mcy9kaXIuYzozNjY6XHRyZXR1cm4ga2VybmZzX25hbWVfY29tcGFyZShsZWZ0LVx1MDAzZWhhc2gsIGtlcm5mc19yY3VfbmFtZShsZWZ0KSwgbGVmdC1cdTAwM2VucywgcmlnaHQpO1xuZnMva2VybmZzL2Rpci5jLTM2Ny19XG4tLVxuZnMva2VybmZzL2Rpci5jPTg5Mj1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZmluZF9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtOTEzLVx0XHRrbiA9IHJiX3RvX2tuKG5vZGUpO1xuZnMva2VybmZzL2Rpci5jOjkxNDpcdFx0cmVzdWx0ID0ga2VybmZzX25hbWVfY29tcGFyZShoYXNoLCBuYW1lLCBucywga24pO1xuZnMva2VybmZzL2Rpci5jLTkxNS1cdFx0aWYgKHJlc3VsdCBcdTAwM2MgMClcbi0tXG5mcy9rZXJuZnMvZGlyLmM9MTkxMD1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMTk0Mi1cbmZzL2tlcm5mcy9kaXIuYzoxOTQzOlx0XHRcdGlmIChrZXJuZnNfbmFtZV9jb21wYXJlKGhhc2gsIG5hbWUgPzogXCYjMzQ7XCYjMzQ7LCBucywga24pIFx1MDAzYyAwKSB7XG5mcy9rZXJuZnMvZGlyLmMtMTk0NC1cdFx0XHRcdHBvcyA9IGtuO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjE1NQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBrZXJuZnNfbmFtZV9jb21wYXJlKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBrZXJuZnMgbmFtZXMgYXJlIGJlaW5nIGNvbXBhcmVkLiBUaW1lIHRvIGRpZyBpbnRvIHRoZSBjb2RlLiBUaGUgbG9naWNhbCBwbGFjZSB0byBzdGFydCBpcyB0aGUgYGZzL2tlcm5mcy9kaXIuY2AgZmlsZSwgc2luY2Ugd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBkaXJlY3Rvcnkgb3BlcmF0aW9ucywgYW5kIHRoZSBmdW5jdGlvbiBuYW1lIGlzIGBrZXJuZnNfbmFtZV9jb21wYXJlYC4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBsb29rcyBsaWtlLiBJJiMzOTttIGV4cGVjdGluZyBzb21ldGhpbmcgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQsIGxpa2VseSBpbnZvbHZpbmcgYSBgc3RyY21wYC1saWtlIGNvbXBhcmlzb24sIGJ1dCBJIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZW4mIzM5O3QgYW55IHN1YnRsZSBkaWZmZXJlbmNlcyBvciBvcHRpbWl6YXRpb25zIGluIHBsYXkgZm9yIHRoZXNlIGtlcm5mcyBlbnRyaWVzLiBJIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGZ1bmN0aW9ucyBiZWluZyBjYWxsZWQgd2hpY2ggY291bGQgZXhwbGFpbiBiZWhhdmlvdXIsIGl0IHdvdWxkIGJlIHNlbnNpYmxlIHRvIGxvb2sgYXQgYWxsIGFzcGVjdHMgb2YgdGhlIGltcGxlbWVudGF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2tlcm5mcy9kaXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM0NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzQ1Olx0XG4gMzQ2Olx0c3RhdGljIGludCBrZXJuZnNfbmFtZV9jb21wYXJlKHVuc2lnbmVkIGludCBoYXNoLCBjb25zdCBjaGFyICpuYW1lLFxuIDM0NzpcdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucywgY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICprbilcbiAzNDg6XHR7XG4gMzQ5Olx0XHR1NjQgbnNfaWQgPSBrZXJuZnNfbnNfaWQobnMpO1xuIDM1MDpcdFx0dTY0IGtuX25zX2lkID0ga2VybmZzX25zX2lkKGtuLVx1MDAzZW5zKTtcbiAzNTE6XHRcbiAzNTI6XHRcdGlmIChoYXNoIFx1MDAzYyBrbi1cdTAwM2VoYXNoKVxuIDM1MzpcdFx0XHRyZXR1cm4gLTE7XG4gMzU0Olx0XHRpZiAoaGFzaCBcdTAwM2Uga24tXHUwMDNlaGFzaClcbiAzNTU6XHRcdFx0cmV0dXJuIDE7XG4gMzU2Olx0XHRpZiAobnNfaWQgXHUwMDNjIGtuX25zX2lkKVxuIDM1NzpcdFx0XHRyZXR1cm4gLTE7XG4gMzU4Olx0XHRpZiAobnNfaWQgXHUwMDNlIGtuX25zX2lkKVxuIDM1OTpcdFx0XHRyZXR1cm4gMTtcbiAzNjA6XHRcdHJldHVybiBzdHJjbXAobmFtZSwga2VybmZzX3JjdV9uYW1lKGtuKSk7XG4gMzYxOlx0fVxuIDM2MjpcdFxuIDM2MzpcdHN0YXRpYyBpbnQga2VybmZzX3NkX2NvbXBhcmUoY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICpsZWZ0LFxuIDM2NDpcdFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICpyaWdodClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI3MTYKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA0NzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIFZ1bG5lcmFiaWxpdHkgaW4gYGtlcm5mc19uYW1lX2NvbXBhcmVgKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBga2VybmZzX25hbWVfY29tcGFyZWAsIGFuZCBpdCYjMzk7cyB1c2luZyBgc3RyY21wYCB0byBjb21wYXJlIGBuYW1lYCB3aXRoIGBrZXJuZnNfcmN1X25hbWUoa24pYC4gVGhhdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLCBhbmQgYG5hbWVgIGlzIGJlaW5nIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweWAsIHNvIGl0ICpzaG91bGQqIGJlIGEgdmFsaWQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIExldCYjMzk7cyBzZWUuLi4gSSYjMzk7bSBnb2luZyB0byBkb3VibGUgY2hlY2suIGBuYW1lYCBpcyBzZXQgdG8gYE5VTExgIGJ1dCBpdCBzZWVtcyBpdCBjYW4gYmUgYWxsb2NhdGVkIHdpdGggYGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpO2AuLi4gaWYgdGhhdCBmYWlscywgd2UgZ2V0IGAtRU5PTUVNYC4KClJpZ2h0LCBga21hbGxvY2AgaXMgdXNlZC4gTm93LCB3aGVuIGBzdHJzY3B5YCBjb3BpZXMgaW50byBgbmFtZWAsIHRoZSBtYXhpbXVtIGl0IHdyaXRlcyBpcyBgbGVuICYjNDM7IDFgIGJ5dGVzIChjaGFyYWN0ZXJzIHBsdXMgdGhlIG51bGwgdGVybWluYXRvcikuIFRoZSBpbXBvcnRhbnQgdGhpbmcgaXMgdGhhdCB0aGUgKnJlc3QqIG9mIGBuYW1lYCwgZnJvbSBgbmFtZSAmIzQzOyBsZW4gJiM0MzsgMWAgdXAgdG8gYG5hbWUgJiM0MzsgUEFUSF9NQVggLSAxYCwgcmVtYWlucyBjb21wbGV0ZWx5IHVuaW5pdGlhbGl6ZWQuIFRoYXQgbWFrZXMgbWUgd29uZGVyLCBjb3VsZCBzb21ldGhpbmcgaW5hZHZlcnRlbnRseSByZWFkIHBhc3QgdGhlIGBcMGAgYW5kIGludG8gdGhhdCB1bmluaXRpYWxpemVkIG1lbW9yeT8KCldhaXQsIGhvbGQgb24uIExldCYjMzk7cyB0aGluayB0aGlzIHRocm91Z2guIEluIHRoZSBmaXJzdCBpdGVyYXRpb24sIGxldCYjMzk7cyBzYXkgYHBvcy0mZ3Q7bmFtZWAgaXMgJiMzNDtmb28mIzM0Oy4gU28gYG5hbWVgIGNvbnRhaW5zICYjMzQ7ZiYjMzQ7LCAmIzM0O28mIzM0OywgJiMzNDtvJiMzNDssICYjMzQ7XDAmIzM0OywgdGhlbiBnYXJiYWdlLiBUaGVuLCBpbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgYHN0cnNjcHlgIGlzIGNhbGxlZCBhZ2Fpbi4gSWYgYHBvcy0mZ3Q7bmFtZWAgaXMsIHNheSwgJiMzNDthYiYjMzQ7LCB0aGVuIGBuYW1lYCB3aWxsIGhhdmUgJiMzNDthJiMzNDssICYjMzQ7YiYjMzQ7LCAmIzM0O1wwJiMzNDssICYjMzQ7XDAmIzM0OywgYW5kIG1vcmUgZ2FyYmFnZS4gQnV0LCBoZXJlJiMzOTtzIHRoZSB0aGluZzogYHN0cmNtcGAgKm9ubHkqIHJlYWRzIHVudGlsIGl0IGZpbmRzIGEgYFwwYCwgc28gdGhhdCYjMzk7cyBzYWZlLiBBbHNvLCBgZGlyX2VtaXRgIG9ubHkgcmVhZHMgdXAgdG8gYG5hbWVsZW5gLgoKVGhlIHJlYWwgcXVlc3Rpb24gaXMsIGRvZXMgYGRpcl9lbWl0YCBjb3B5IGBuYW1lYCB0byB1c2VyIHNwYWNlPyBUaGF0IHdvdWxkIGJlIGEgYmlnZ2VyIGlzc3VlLiBMZXQmIzM5O3Mgc2VlLi4uIGBkaXJfZW1pdGAgY2FsbHMgYGN0eC0mZ3Q7YWN0b3IoY3R4LCBuYW1lLCBuYW1lbGVuLCBjdHgtJmd0O3BvcywgaW5vLCB0eXBlICZhbXA7IGR0X21hc2spO2AuIFRoZSBhY3Rvci4uLiB0aGF0JiMzOTtzIHVzdWFsbHkgZWl0aGVyIGBmaWxsZGlyYCwgYGZpbGxkaXI2NGAsIG9yIGBjb21wYXRfZmlsbGRpcmAsIGFuZCB0aGF0JiMzOTtzIGluIGBmcy9yZWFkZGlyLmNgLiBJIG5lZWQgdG8gY2hlY2sgYGZpbGxkaXI2NGAuIEkgdGhpbmsgdGhhdCYjMzk7cyB3aGVyZSBJIG5lZWQgdG8gbG9vay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmlsbGRpcjY0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvcmVhZGRpci5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL3JlYWRkaXIuYz0zMzQ9c3RydWN0IGdldGRlbnRzX2NhbGxiYWNrNjQge1xuLS1cbmZzL3JlYWRkaXIuYy0zNDAtXG5mcy9yZWFkZGlyLmM6MzQxOnN0YXRpYyBib29sIGZpbGxkaXI2NChzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWxlbixcbmZzL3JlYWRkaXIuYy0zNDItXHRcdCAgICAgbG9mZl90IG9mZnNldCwgdTY0IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSlcbi0tXG5mcy9yZWFkZGlyLmM9Mzg0PVNZU0NBTExfREVGSU5FMyhnZXRkZW50czY0LCB1bnNpZ25lZCBpbnQsIGZkLFxuLS1cbmZzL3JlYWRkaXIuYy0zODgtXHRzdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2s2NCBidWYgPSB7XG5mcy9yZWFkZGlyLmM6Mzg5Olx0XHQuY3R4LmFjdG9yID0gZmlsbGRpcjY0LFxuZnMvcmVhZGRpci5jLTM5MC1cdFx0LmN0eC5jb3VudCA9IGNvdW50LFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzk0MAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byB0aGUgRGlyZWN0b3J5IFJlYWRpbmcgQ29kZSoqCgpBbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBuaXR0eS1ncml0dHkgb2YgZGlyZWN0b3J5IHJlYWRpbmcgd2l0aGluIHRoZSBrZXJuZWwuIE15IHRhcmdldCBpcyB0aGUgYGZpbGxkaXI2NGAgZnVuY3Rpb24sIHdoaWNoIEkga25vdyByZXNpZGVzIGluIGBmcy9yZWFkZGlyLmNgLiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIG9mIHBvcHVsYXRpbmcgdGhvc2UgZGlyZWN0b3J5IGVudHJpZXMgcmVzaWRlcywgc28gdW5kZXJzdGFuZGluZyBob3cgdGhpcyBmdW5jdGlvbiB3b3JrcyBpcyBjcml0aWNhbCBmb3IgZGVidWdnaW5nIG9yIG9wdGltaXppbmcgYW55IGZpbGUgc3lzdGVtIGJlaGF2aW9yIHJlbGF0ZWQgdG8gZGlyZWN0b3J5IGxpc3RpbmdzLiBMZXQmIzM5O3Mgc2VlIGhvdyBpdCBoYW5kbGVzIHRob3NlIDY0LWJpdCBpbm9kZSBudW1iZXJzLiBJJiMzOTttIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB3aGF0IGtpbmQgb2YgZXJyb3IgY2hlY2tpbmcgaXMgaW4gcGxhY2UuIFRpbWUgdG8gc3RhcnQgdHJhY2luZyB0aGUgZXhlY3V0aW9uIGFuZCBzZWUgaWYgYW55dGhpbmcganVtcHMgb3V0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL3JlYWRkaXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDM0MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzQxOlx0c3RhdGljIGJvb2wgZmlsbGRpcjY0KHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxuIDM0MjpcdFx0XHQgICAgIGxvZmZfdCBvZmZzZXQsIHU2NCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpXG4gMzQzOlx0e1xuIDM0NDpcdFx0c3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqZGlyZW50LCAqcHJldjtcbiAzNDU6XHRcdHN0cnVjdCBnZXRkZW50c19jYWxsYmFjazY0ICpidWYgPVxuIDM0NjpcdFx0XHRjb250YWluZXJfb2YoY3R4LCBzdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2s2NCwgY3R4KTtcbiAzNDc6XHRcdGludCByZWNsZW4gPSBBTElHTihkaXJlbnRfc2l6ZShkaXJlbnQsIG5hbWxlbiAmIzQzOyAxKSwgc2l6ZW9mKHU2NCkpO1xuIDM0ODpcdFx0aW50IHByZXZfcmVjbGVuO1xuIDM0OTpcdFx0dW5zaWduZWQgaW50IGZsYWdzID0gZF90eXBlO1xuIDM1MDpcdFxuIDM1MTpcdFx0QlVJTERfQlVHX09OKEZJTExESVJfRkxBR19OT0lOVFIgXHUwMDI2IFNfRFRfTUFTSyk7XG4gMzUyOlx0XHRkX3R5cGUgXHUwMDI2PSBTX0RUX01BU0s7XG4gMzUzOlx0XG4gMzU0Olx0XHRidWYtXHUwMDNlZXJyb3IgPSB2ZXJpZnlfZGlyZW50X25hbWUobmFtZSwgbmFtbGVuKTtcbiAzNTU6XHRcdGlmICh1bmxpa2VseShidWYtXHUwMDNlZXJyb3IpKVxuIDM1NjpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMzU3Olx0XHRidWYtXHUwMDNlZXJyb3IgPSAtRUlOVkFMO1x0Lyogb25seSB1c2VkIGlmIHdlIGZhaWwuLiAqL1xuIDM1ODpcdFx0aWYgKHJlY2xlbiBcdTAwM2UgY3R4LVx1MDAzZWNvdW50KVxuIDM1OTpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMzYwOlx0XHRwcmV2X3JlY2xlbiA9IGJ1Zi1cdTAwM2VwcmV2X3JlY2xlbjtcbiAzNjE6XHRcdGlmICghKGZsYWdzIFx1MDAyNiBGSUxMRElSX0ZMQUdfTk9JTlRSKSBcdTAwMjZcdTAwMjYgcHJldl9yZWNsZW4gXHUwMDI2XHUwMDI2IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKVxuIDM2MjpcdFx0XHRyZXR1cm4gZmFsc2U7XG4gMzYzOlx0XHRkaXJlbnQgPSBidWYtXHUwMDNlY3VycmVudF9kaXI7XG4gMzY0Olx0XHRwcmV2ID0gKHZvaWQgX191c2VyICopZGlyZW50IC0gcHJldl9yZWNsZW47XG4gMzY1Olx0XHRzY29wZWRfdXNlcl93cml0ZV9hY2Nlc3Nfc2l6ZShwcmV2LCByZWNsZW4gJiM0MzsgcHJldl9yZWNsZW4sIGVmYXVsdCkge1xuIDM2NjpcdFx0XHQvKiBUaGlzIG1pZ2h0IGJlICYjMzk7ZGlyZW50LVx1MDAzZWRfb2ZmJiMzOTssIGJ1dCBpZiBzbyBpdCB3aWxsIGdldCBvdmVyd3JpdHRlbiAqL1xuIDM2NzpcdFx0XHR1bnNhZmVfcHV0X3VzZXIob2Zmc2V0LCBcdTAwMjZwcmV2LVx1MDAzZWRfb2ZmLCBlZmF1bHQpO1xuIDM2ODpcdFx0XHR1bnNhZmVfcHV0X3VzZXIoaW5vLCBcdTAwMjZkaXJlbnQtXHUwMDNlZF9pbm8sIGVmYXVsdCk7XG4gMzY5Olx0XHRcdHVuc2FmZV9wdXRfdXNlcihyZWNsZW4sIFx1MDAyNmRpcmVudC1cdTAwM2VkX3JlY2xlbiwgZWZhdWx0KTtcbiAzNzA6XHRcdFx0dW5zYWZlX3B1dF91c2VyKGRfdHlwZSwgXHUwMDI2ZGlyZW50LVx1MDAzZWRfdHlwZSwgZWZhdWx0KTtcbiAzNzE6XHRcdFx0dW5zYWZlX2NvcHlfZGlyZW50X25hbWUoZGlyZW50LVx1MDAzZWRfbmFtZSwgbmFtZSwgbmFtbGVuLCBlZmF1bHQpO1xuIDM3MjpcdFx0fVxuIDM3MzpcdFxuIDM3NDpcdFx0YnVmLVx1MDAzZXByZXZfcmVjbGVuID0gcmVjbGVuO1xuIDM3NTpcdFx0YnVmLVx1MDAzZWN1cnJlbnRfZGlyID0gKHZvaWQgX191c2VyICopZGlyZW50ICYjNDM7IHJlY2xlbjtcbiAzNzY6XHRcdGN0eC1cdTAwM2Vjb3VudCAtPSByZWNsZW47XG4gMzc3Olx0XHRyZXR1cm4gdHJ1ZTtcbiAzNzg6XHRcbiAzNzk6XHRlZmF1bHQ6XG4gMzgwOlx0XHRidWYtXHUwMDNlZXJyb3IgPSAtRUZBVUxUO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDkyNwoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyBpdDoKCioqRGlnZ2luZyBpbnRvIHRoZSBgdW5zYWZlX2NvcHlfZGlyZW50X25hbWVgIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGxpbmUgb2YgY29kZTogYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC0mZ3Q7ZF9uYW1lLCBuYW1lLCBuYW1sZW4sIGVmYXVsdCk7YCBNeSBpbml0aWFsIHRob3VnaHQgaXMsIHRoaXMgZnVuY3Rpb24gbmFtZSwgJiMzNDt1bnNhZmUsJiMzNDsgYWxyZWFkeSByYWlzZXMgYSByZWQgZmxhZy4gSSYjMzk7bSBhc3N1bWluZyBpdCYjMzk7cyBoYW5kbGluZyBhIHBvdGVudGlhbGx5IHRyaWNreSBtZW1vcnkgY29weSBvcGVyYXRpb24gcmVsYXRlZCB0byBkaXJlY3RvcnkgZW50cmllcy4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGdvaW5nIG9uIHVuZGVyIHRoZSBob29kIG9mIGB1bnNhZmVfY29weV9kaXJlbnRfbmFtZWAuIE15IGd1dCBmZWVsaW5nIGlzIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggc3RyaW5nIG1hbmlwdWxhdGlvbiwgcG9zc2libHkgd2l0aCBhIGZpeGVkLXNpemUgYnVmZmVyIChgbmFtZWApIGFuZCBhIHNvdXJjZSAoYGRpcmVudC0mZ3Q7ZF9uYW1lYCkgdGhhdCBtYXkgb3IgbWF5IG5vdCBmaXQgbmVhdGx5LiBUaGUgYG5hbWxlbmAgYXJndW1lbnQgaXMgcHJvYmFibHkgdGhlIGludGVuZGVkIG1heGltdW0gY29weSBsZW5ndGgsIHdoaWNoIGlzIGEgZ29vZCBzaWduIGlmIHVzZWQgY29ycmVjdGx5IGZvciBhIGJ1ZmZlciBvdmVyZmxvdyBwcmV2ZW50aW9uIHN0cmF0ZWd5LiBGaW5hbGx5LCBgZWZhdWx0YCwgbG9va3MgbGlrZSBpdCBjb3VsZCBiZSBhIHBvaW50ZXIgdG8gYSBmbGFnIG9yIGVycm9yIGNvZGUgdG8gYmUgc2V0IGluIGNhc2UgdGhlIGNvcHkgZmFpbHMgZm9yIHNvbWUgcmVhc29uLiBUaGUgbmFtZSAmIzM0O2VmYXVsdCYjMzQ7IHN1Z2dlc3RzIHRoYXQgaXQgbWlnaHQgYmUgcmVsYXRlZCB0byB0aGUgYEVGQVVMVGAgZXJyb3IgY29kZSwgd2hpY2ggaW5kaWNhdGVzIGEgYmFkIGFkZHJlc3MgcGFzc2VkIHRvIGEgc3lzdGVtIGNhbGwuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uLCBsZW5ndGgsIGFuZCBlcnJvciBoYW5kbGluZyBtZWNoYW5pY3Mgd2l0aGluIHRoaXMgZnVuY3Rpb24gdG8gcHJvcGVybHkgYXNzZXNzIHRoaXMgY29kZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dW5zYWZlX2NvcHlfZGlyZW50X25hbWUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9yZWFkZGlyLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvcmVhZGRpci5jPTcyPUVYUE9SVF9TWU1CT0wod3JhcF9kaXJlY3RvcnlfaXRlcmF0b3IpO1xuLS1cbmZzL3JlYWRkaXIuYy03Ny0gKi9cbmZzL3JlYWRkaXIuYzo3ODojZGVmaW5lIHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKF9kc3QsIF9zcmMsIF9sZW4sIGxhYmVsKSBkbyB7XHRcXFxuZnMvcmVhZGRpci5jLTc5LVx0Y2hhciBfX3VzZXIgKmRzdCA9IChfZHN0KTtcdFx0XHRcdFxcXG4tLVxuZnMvcmVhZGRpci5jPTE4Mz1zdGF0aWMgYm9vbCBmaWxsb25lZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxuLS1cbmZzL3JlYWRkaXIuYy0yMDYtXHRcdHVuc2FmZV9wdXRfdXNlcihuYW1sZW4sIFx1MDAyNmRpcmVudC1cdTAwM2VkX25hbWxlbiwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYzoyMDc6XHRcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cdTAwM2VkX25hbWUsIG5hbWUsIG5hbWxlbiwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYy0yMDgtXHR9XG4tLVxuZnMvcmVhZGRpci5jPTI1Nj1zdGF0aWMgYm9vbCBmaWxsZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxuLS1cbmZzL3JlYWRkaXIuYy0yOTEtXHRcdHVuc2FmZV9wdXRfdXNlcihkX3R5cGUsIChjaGFyIF9fdXNlciAqKWRpcmVudCAmIzQzOyByZWNsZW4gLSAxLCBlZmF1bHQpO1xuZnMvcmVhZGRpci5jOjI5MjpcdFx0dW5zYWZlX2NvcHlfZGlyZW50X25hbWUoZGlyZW50LVx1MDAzZWRfbmFtZSwgbmFtZSwgbmFtbGVuLCBlZmF1bHQpO1xuZnMvcmVhZGRpci5jLTI5My1cdH1cbi0tXG5mcy9yZWFkZGlyLmM9MzQxPXN0YXRpYyBib29sIGZpbGxkaXI2NChzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWxlbixcbi0tXG5mcy9yZWFkZGlyLmMtMzcwLVx0XHR1bnNhZmVfcHV0X3VzZXIoZF90eXBlLCBcdTAwMjZkaXJlbnQtXHUwMDNlZF90eXBlLCBlZmF1bHQpO1xuZnMvcmVhZGRpci5jOjM3MTpcdFx0dW5zYWZlX2NvcHlfZGlyZW50X25hbWUoZGlyZW50LVx1MDAzZWRfbmFtZSwgbmFtZSwgbmFtbGVuLCBlZmF1bHQpO1xuZnMvcmVhZGRpci5jLTM3Mi1cdH1cbi0tXG5mcy9yZWFkZGlyLmM9NDI5PXN0YXRpYyBib29sIGNvbXBhdF9maWxsb25lZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLFxuLS1cbmZzL3JlYWRkaXIuYy00NTMtXHRcdHVuc2FmZV9wdXRfdXNlcihuYW1sZW4sIFx1MDAyNmRpcmVudC1cdTAwM2VkX25hbWxlbiwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYzo0NTQ6XHRcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cdTAwM2VkX25hbWUsIG5hbWUsIG5hbWxlbiwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYy00NTUtXHR9XG4tLVxuZnMvcmVhZGRpci5jPTQ5Nz1zdGF0aWMgYm9vbCBjb21wYXRfZmlsbGRpcihzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWxlbixcbi0tXG5mcy9yZWFkZGlyLmMtNTMxLVx0XHR1bnNhZmVfcHV0X3VzZXIoZF90eXBlLCAoY2hhciBfX3VzZXIgKilkaXJlbnQgJiM0MzsgcmVjbGVuIC0gMSwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYzo1MzI6XHRcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cdTAwM2VkX25hbWUsIG5hbWUsIG5hbWxlbiwgZWZhdWx0KTtcbmZzL3JlYWRkaXIuYy01MzMtXHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2MDAxCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gYGZzL3JlYWRkaXIuY2AqKgoKT2theSwgdGltZSB0byBkaWcgaW50byB0aGlzLiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGB1bnNhZmVfY29weV9kaXJlbnRfbmFtZWAgZnVuY3Rpb24sIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGBmcy9yZWFkZGlyLmNgIGZpbGUuIEkga25vdyB0aGlzIGFyZWEgY2FuIGJlIHRyaWNreSwgc28gSSYjMzk7bSBob25pbmcgaW4gb24gbGluZXMgNzgtMTAwLiBUaGF0JiMzOTtzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgdGhlIG1lYXQgb2YgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gYW5kIGltcGxlbWVudGF0aW9uLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IHdoYXQmIzM5O3MgZ29pbmcgb24gd2l0aCBob3cgZGlyZWN0b3J5IGVudHJ5IG5hbWVzIGFyZSBiZWluZyBoYW5kbGVkLiBTYWZldHkgYW5kIHBlcmZvcm1hbmNlIGFyZSBjcnVjaWFsIGhlcmUsIHNvIEkgbmVlZCB0byBhc3Nlc3MgdGhpcyB0aG9yb3VnaGx5LiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UmIzM5O3ZlIGdvdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9yZWFkZGlyLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA3NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDc1Olx0ICogTm90ZSB0aGUgXCYjMzQ7dW5zYWZlX3B1dF91c2VyKClcJiMzNDsgc2VtYW50aWNzOiB3ZSBnb3RvIGFcbiAgNzY6XHQgKiBsYWJlbCBmb3IgZXJyb3JzLlxuICA3NzpcdCAqL1xuICA3ODpcdCNkZWZpbmUgdW5zYWZlX2NvcHlfZGlyZW50X25hbWUoX2RzdCwgX3NyYywgX2xlbiwgbGFiZWwpIGRvIHtcdFxcXG4gIDc5Olx0XHRjaGFyIF9fdXNlciAqZHN0ID0gKF9kc3QpO1x0XHRcdFx0XFxcbiAgODA6XHRcdGNvbnN0IGNoYXIgKnNyYyA9IChfc3JjKTtcdFx0XHRcdFxcXG4gIDgxOlx0XHRzaXplX3QgbGVuID0gKF9sZW4pO1x0XHRcdFx0XHRcXFxuICA4MjpcdFx0dW5zYWZlX3B1dF91c2VyKDAsIGRzdCYjNDM7bGVuLCBsYWJlbCk7XHRcdFx0XFxcbiAgODM6XHRcdHVuc2FmZV9jb3B5X3RvX3VzZXIoZHN0LCBzcmMsIGxlbiwgbGFiZWwpO1x0XHRcXFxuICA4NDpcdH0gd2hpbGUgKDApXG4gIDg1Olx0XG4gIDg2Olx0XG4gIDg3Olx0aW50IGl0ZXJhdGVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcbiAgODg6XHR7XG4gIDg5Olx0XHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcbiAgOTA6XHRcdGludCByZXMgPSAtRU5PVERJUjtcbiAgOTE6XHRcbiAgOTI6XHRcdGlmICghZmlsZS1cdTAwM2VmX29wLVx1MDAzZWl0ZXJhdGVfc2hhcmVkKVxuICA5MzpcdFx0XHRnb3RvIG91dDtcbiAgOTQ6XHRcbiAgOTU6XHRcdHJlcyA9IHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbihmaWxlLCBNQVlfUkVBRCk7XG4gIDk2Olx0XHRpZiAocmVzKVxuICA5NzpcdFx0XHRnb3RvIG91dDtcbiAgOTg6XHRcbiAgOTk6XHRcdHJlcyA9IGZzbm90aWZ5X2ZpbGVfcGVybShmaWxlLCBNQVlfUkVBRCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NTgxCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMTAzNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lYCBhbmQgUmVsYXRlZCBGdW5jdGlvbnMgaW4gYGZzL2tlcm5mcy9kaXIuY2AqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgdW5zYWZlX2NvcHlfZGlyZW50X25hbWVgIGZ1bmN0aW9uLCBhbmQgbXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgaXQgbG9va3Mgc2FmZS4gYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lYCBjb3BpZXMgYGxlbmAgYnl0ZXMgZnJvbSBgc3JjYCB0byBgZHN0YCwgdGhlbiBudWxsLXRlcm1pbmF0ZXMgdGhlIHJlc3VsdC4gYGxlbmAgY29tZXMgZnJvbSBgc3Ryc2NweWAsIHdoaWNoIGhhbmRsZXMgc3RyaW5nIGNvcHlpbmcgYW5kIG51bGwgdGVybWluYXRpb24uIFNpbmNlIGBzdHJzY3B5YCBjb3BpZXMgZXhhY3RseSBgbGVuYCBjaGFyYWN0ZXJzIGFuZCB0aGUgTlVMIGJ5dGUsIGl0IGFwcGVhcnMgdGhhdCBgbGVuYCBieXRlcyBhcmUgY29waWVkIGZyb20gYG5hbWVgIHRvIHVzZXIgc3BhY2UsIGFuZCBpbXBvcnRhbnRseSwgdGhlc2UgYGxlbmAgYnl0ZXMgc2hvdWxkIGJlIGZ1bGx5IGluaXRpYWxpemVkLgoKVGhlbiBJIHBhdXNlZC4gQ291bGQgYHN0cnNjcHlgIHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlPyBUaGUgY29kZSBkb2VzIGNoZWNrIGZvciB0aGlzLCBicmVha2luZyB0aGUgbG9vcCBpZiBgbGVuICZsdDsgMGAuIElmIGBsZW5gIGlzIG5vdCBuZWdhdGl2ZSwgaXQgcmVwcmVzZW50cyB0aGUgc3RyaW5nIGxlbmd0aC4gR29vZCwgdGhhdCB0YWtlcyBjYXJlIG9mIHRoZSBuZWdhdGl2ZSByZXR1cm4gcG9zc2liaWxpdHkuCgpOb3csIGxldCYjMzk7cyBsb29rIGZ1cnRoZXIgaW50byB0aGlzIHBhdGNoLCBzcGVjaWZpY2FsbHkgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zIHdpdGhpbiBgZnMva2VybmZzL2Rpci5jYC4gVGhlIGZpcnN0IGZ1bmN0aW9uIG9mIGludGVyZXN0IGlzIGBrZXJuZnNfZGlyX3Bvc2AsIGFuZCBpdHMgY2FsbGVycy4gVGhlIGNhbGxlciBpcyBga2VybmZzX2Rpcl9uZXh0X3Bvc2AuIFdpdGhpbiBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgSSBzZWUgYSB2YXJpYWJsZSBgYm9vbCByZXN1bWVkO2AgcGFzc2VkIHRvIGBrZXJuZnNfZGlyX3Bvc2AuIEl0JiMzOTtzIHVzZWQgaW4gdGhpcyBtYW5uZXI6IGBwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIG5hbWUsICZhbXA7cmVzdW1lZCk7YC4gSW5zaWRlIGBrZXJuZnNfZGlyX3Bvc2AsIGByZXN1bWVkYCBpcyBzZXQgdG8gZmFsc2UgaW5pdGlhbGx5LiBGdXJ0aGVyIGRvd24sIGlmIGBwb3NgIGlzIHZhbGlkLCBpdCBnZXRzIHNldCB0byB0cnVlLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRoYXQgYHJlc3VtZWRgIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYW5kIHdyaXR0ZW4gdG8sIHNvIHRoZSBjb21waWxlciBzaG91bGQgaGFuZGxlIHRoaXMuCgpTbyBsZXQmIzM5O3MgY29uc2lkZXIgdGhlIGBuYW1lYCBhcmd1bWVudC4gSSBzZWUgaXQgYmVpbmcgdXNlZCBhcyBgbmFtZSA/OiAmIzM0OyYjMzQ7YC4gVGhpcyBtZWFucyB0aGF0IGlmIGBuYW1lYCBpcyBOVUxMLCBhbiBlbXB0eSBzdHJpbmcgaXMgdXNlZC4gVGhpcyBpcyBpbXBvcnRhbnQsIGxldCYjMzk7cyB0cmFjayB0aGUgYG5hbWVgIHZhcmlhYmxlIGFuZCBzZWUgaG93IGl0IGlzIHVzZWQuIEl0IGxvb2tzIGxpa2UgYG5hbWVgIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgYGtlcm5mc19kaXJfbmV4dF9wb3NgLiBJZiB3ZSBsb29rIGF0IGBrZXJuZnNfZm9wX3JlYWRkaXJgOgoKYGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LSZndDtwb3MsIHBvcywgTlVMTCwgTlVMTCk7IHBvczsgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtJmd0O3BvcywgcG9zLCBuYW1lKSlgCgpPa2F5LCBoZXJlJiMzOTtzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIEluc2lkZSB0aGUgZmlyc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wLCBgcG9zYCBpcyBpbml0aWFsaXplZCBieSBga2VybmZzX2Rpcl9wb3NgLCB3aXRoIE5VTEwgZm9yIHRoZSBuYW1lIGFyZ3VtZW50cy4gSWYgYHBvc2AgaXMgTlVMTCwgdGhlIGxvb3AgZG9lc24mIzM5O3QgcnVuLiBJZiBgcG9zYCBpcyB2YWxpZCwgdGhlIGxvb3AgYm9keSBleGVjdXRlcy4gSW1wb3J0YW50bHksIGluc2lkZSB0aGUgbG9vcCBib2R5IGlzIHRoZSBgc3Ryc2NweWAgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyBgbmFtZWA6CgpgbGVuID0gc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpO2AKCmBuYW1lYCBpcyBpbml0aWFsaXplZC4KClRoZW4sIHdlIGhhdmUgdGhlIGxvb3AgaW5jcmVtZW50OgoKYHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LSZndDtwb3MsIHBvcywgbmFtZSlgCgpBdCB0aGlzIHBvaW50LCBgbmFtZWAgKmhhcyogYmVlbiB3cml0dGVuIHRvIGJ5IGBzdHJzY3B5YC4gVGhpcyB0ZWxscyBtZSB0aGF0IGBuYW1lYCB3aWxsIGJlIGluaXRpYWxpemVkIHdoZW4gaXQmIzM5O3MgcGFzc2VkIGhlcmUuIFNvIGl0IHNob3VsZCBhbHdheXMgYmUgaW5pdGlhbGl6ZWQuCgpJJiMzOTtsbCBkbyBhIHF1aWNrIGNvZGUtd2lkZSBncmVwIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBvdGhlciBjYWxsZXJzIHRvIGBrZXJuZnNfZGlyX3Bvc2AgYW5kIGBrZXJuZnNfZGlyX25leHRfcG9zYCBhbmQgaWYgSSYjMzk7bSBtaXNzaW5nIHNvbWV0aGluZyBlbHNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtrZXJuZnNfZGlyX3BvcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2tlcm5mcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMva2VybmZzL2Rpci5jPTE5MDA9c3RhdGljIGludCBrZXJuZnNfZGlyX2ZvcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKVxuLS1cbmZzL2tlcm5mcy9kaXIuYy0xOTA5LSAqL1xuZnMva2VybmZzL2Rpci5jOjE5MTA6c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXG5mcy9rZXJuZnMvZGlyLmMtMTkxMS1cdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXG4tLVxuZnMva2VybmZzL2Rpci5jPTE5NjM9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9uZXh0X3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMTk2OC1cbmZzL2tlcm5mcy9kaXIuYzoxOTY5Olx0cG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgaGFzaCwgcG9zLCBuYW1lLCBcdTAwMjZyZXN1bWVkKTtcbmZzL2tlcm5mcy9kaXIuYy0xOTcwLVx0LyogU3RlcCBvdmVyIEBwb3Mgb25seSBpZiBpdCBzdXJ2aXZlZDsgQG5hbWUgZmluZHMgdGhlIHNwb3QgaWYgbm90LiAqL1xuLS1cbmZzL2tlcm5mcy9kaXIuYz0xOTg0PXN0YXRpYyBpbnQga2VybmZzX2ZvcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMjAwOS1cbmZzL2tlcm5mcy9kaXIuYzoyMDEwOlx0Zm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtXHUwMDNlcG9zLCBwb3MsIE5VTEwsIE5VTEwpO1xuZnMva2VybmZzL2Rpci5jLTIwMTEtXHQgICAgIHBvcztcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMjAzMS1cdFx0ICogZGlyX2VtaXQoKSBjYW4gZmF1bHQsIHNvIHJ1biBpdCB1bmxvY2tlZC4gIEBwb3MgaXMgcGlubmVkXG5mcy9rZXJuZnMvZGlyLmM6MjAzMjpcdFx0ICogYWJvdmUgYW5kIGtlcm5mc19kaXJfcG9zKCkgcmVjaGVja3MgaXQgb24gdGhlIHdheSBiYWNrLlxuZnMva2VybmZzL2Rpci5jLTIwMzMtXHRcdCAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODkwNgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE2NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipEaXZpbmcgRGVlcCBpbnRvIGBrZXJuZnNfZGlyX25leHRfcG9zYCBpbiBgZnMva2VybmZzL2Rpci5jYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGhhcHBlbmluZyB3aXRoIHRoYXQgYGtlcm5mc19kaXJfbmV4dF9wb3NgIGZ1bmN0aW9uLiBMZXQmIzM5O3Mgc3RhcnQgYnkgbG9va2luZyBhdCBsaW5lIDE5NzYsIG9yIHRoZXJlYWJvdXRzLCBpbiBgZnMva2VybmZzL2Rpci5jYC4gQWgsIHllcywgaW4gdGhlIGhlYXJ0IG9mIHRoaXMgZnVuY3Rpb24sIHRoZXJlJiMzOTtzIHRoYXQgbG9vcDoKCmBgYGMKCQlkbyB7CgkJCXN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dCgmYW1wO3Bvcy0mZ3Q7cmIpOwoJCQlpZiAoIW5vZGUpCgkJCQlyZXR1cm4gTlVMTDsKCQkJcG9zID0gcmJfdG9fa24obm9kZSk7CgkJCWtlcm5mc19nZXQocG9zKTsKCQl9IHdoaWxlIChrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIE5VTEwsIE5VTEwpICE9IHBvcyk7CmBgYAoKSG1tLi4ud2FpdCBhIG1pbnV0ZS4gVGhhdCBgd2hpbGVgIGNvbmRpdGlvbiBpcyBhIGJpdOKApnRyaWNreS4gSXQmIzM5O3MgY2hlY2tpbmcgaWYgc29tZXRoaW5nIGlzbiYjMzk7dCBxdWl0ZSByaWdodC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyBiZXR0ZXIuIFNvbWV0aGluZyBhYm91dCB0aGF0IGxvb3AgaXMgbWFraW5nIG1lIHRoaW5rLCB3aGF0IHdhcyB0aGF0IGxpbmUgbG9va2luZyBsaWtlIGJlZm9yZT8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhpcyB0byBzZWUgaWYgSSBhbSBtaXNzaW5nIHNvbWV0aGluZyBvYnZpb3VzIG9yIHdoYXQgY2hhbmdlcyBsZWQgdXAgdG8gdGhpcyBzdHJ1Y3R1cmUuCgpUbyB0cnVseSBncmFzcCB0aGUgY29udGV4dCwgSSBuZWVkIHRvIHJlYWQgdGhlIGNvZGUgc3Vycm91bmRpbmcgdGhpcyBmdW5jdGlvbi4gTGV0JiMzOTtzIGV4cGFuZCBteSB2aWV3IHRvIGxpbmVzIDE5NDAtMTk4MCwgbG9va2luZyBhdCB0aGUgY29kZSBiZWZvcmUgYW5kIGFmdGVyIHRoaXMgY3J1Y2lhbCBsb29wLiBJIG5lZWQgdGhlIGJpZ2dlciBwaWN0dXJlIHRvIHVuZGVyc3RhbmQgdGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBhbmQgd2hldGhlciBpdCYjMzk7cyBvcHRpbWl6ZWQgb3Igc2ltcGx5IGNvcnJlY3QuIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5IGFuZCBkaXNzZWN0IHRoaXMgZnVuY3Rpb24hCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMva2VybmZzL2Rpci5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTk1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxOTUwOlx0XHR9XG4xOTUxOlx0XHQvKiBTa2lwIG92ZXIgZW50cmllcyB3aGljaCBhcmUgZHlpbmcvZGVhZCBvciBpbiB0aGUgd3JvbmcgbmFtZXNwYWNlICovXG4xOTUyOlx0XHR3aGlsZSAocG9zIFx1MDAyNlx1MDAyNiAoIWtlcm5mc19hY3RpdmUocG9zKSB8fFxuMTk1MzpcdFx0XHQgICAgICAga2VybmZzX25zX2lkKHBvcy1cdTAwM2VucykgIT0ga2VybmZzX25zX2lkKG5zKSkpIHtcbjE5NTQ6XHRcdFx0c3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KFx1MDAyNnBvcy1cdTAwM2VyYik7XG4xOTU1Olx0XHRcdGlmICghbm9kZSlcbjE5NTY6XHRcdFx0XHRwb3MgPSBOVUxMO1xuMTk1NzpcdFx0XHRlbHNlXG4xOTU4Olx0XHRcdFx0cG9zID0gcmJfdG9fa24obm9kZSk7XG4xOTU5Olx0XHR9XG4xOTYwOlx0XHRyZXR1cm4gcG9zO1xuMTk2MTpcdH1cbjE5NjI6XHRcbjE5NjM6XHRzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuMTk2NDpcdFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyxcbjE5NjU6XHRcdGNvbnN0IGNoYXIgKm5hbWUpXG4xOTY2Olx0e1xuMTk2NzpcdFx0Ym9vbCByZXN1bWVkO1xuMTk2ODpcdFxuMTk2OTpcdFx0cG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgaGFzaCwgcG9zLCBuYW1lLCBcdTAwMjZyZXN1bWVkKTtcbjE5NzA6XHRcdC8qIFN0ZXAgb3ZlciBAcG9zIG9ubHkgaWYgaXQgc3Vydml2ZWQ7IEBuYW1lIGZpbmRzIHRoZSBzcG90IGlmIG5vdC4gKi9cbjE5NzE6XHRcdGlmIChwb3MgXHUwMDI2XHUwMDI2IHJlc3VtZWQpIHtcbjE5NzI6XHRcdFx0ZG8ge1xuMTk3MzpcdFx0XHRcdHN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dChcdTAwMjZwb3MtXHUwMDNlcmIpO1xuMTk3NDpcdFx0XHRcdGlmICghbm9kZSlcbjE5NzU6XHRcdFx0XHRcdHBvcyA9IE5VTEw7XG4xOTc2Olx0XHRcdFx0ZWxzZVxuMTk3NzpcdFx0XHRcdFx0cG9zID0gcmJfdG9fa24obm9kZSk7XG4xOTc4Olx0XHRcdH0gd2hpbGUgKHBvcyBcdTAwMjZcdTAwMjYgKCFrZXJuZnNfYWN0aXZlKHBvcykgfHxcbjE5Nzk6XHRcdFx0XHRrZXJuZnNfbnNfaWQocG9zLVx1MDAzZW5zKSAhPSBrZXJuZnNfbnNfaWQobnMpKSk7XG4xOTgwOlx0XHR9XG4xOTgxOlx0XHRyZXR1cm4gcG9zO1xuMTk4MjpcdH1cbjE5ODM6XHRcbjE5ODQ6XHRzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4xOTg1Olx0e1xuMTk4NjpcdFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS1cdTAwM2VmX3BhdGguZGVudHJ5O1xuMTk4NzpcdFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTtcbjE5ODg6XHRcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4xOTg5Olx0XHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDA5NwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipEaXZpbmcgaW50byBrZXJuZnNfZm9wX3JlYWRkaXIqKgoKUmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gV2UmIzM5O3JlIGluIGBrZXJuZnNfZm9wX3JlYWRkaXJgLCB3aGljaCBtZWFucyB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIHRoZSBjb3JlIGxvZ2ljIGZvciBkaXJlY3RvcnkgcmVhZGluZyB3aXRoaW4gdGhlIGtlcm5mcyBmaWxlc3lzdGVtLiBUaGUgaW1tZWRpYXRlIGltcGxpY2F0aW9uIGlzIHRoYXQgd2UmIzM5O3JlIGxpa2VseSBwcm9jZXNzaW5nIGEgZGlyZWN0b3J5IGVudHJ5IGxvb2t1cCwgcHJvYmFibHkgdHJpZ2dlcmVkIGJ5IGEgYHJlYWRkaXIoKWAgc3lzdGVtIGNhbGwuIEdpdmVuIG15IGZhbWlsaWFyaXR5IHdpdGggVkZTIHN0cnVjdHVyZXMsIEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gaW50ZXJmYWNlIGhlYXZpbHkgd2l0aCBrZXJuZnMmIzM5O3MgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIHByb3ZpZGUgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzLiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gaG93IGl0IGhhbmRsZXMgYHN0cnVjdCBrZXJuZnNfbm9kZWAgZW50cmllcyBhbmQgcG90ZW50aWFsbHkgdGhlIGFzc29jaWF0ZWQgYHN0cnVjdCBrZXJuZnNfZGlyX29wc2AgKG9yIHNpbWlsYXIpIGNhbGxiYWNrcyB0byBzZWUgaG93IGl0IG1hbmFnZXMgaXRlcmF0aW9uIGFuZCBmaWx0ZXJpbmcgb2YgdGhvc2UgZGlyZWN0b3J5IGVudHJpZXMuIEkgd2FudCB0byBzZWUgaG93IGl0IHJlc3BlY3RzIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIgZm9yIHNlZWtpbmcgd2l0aGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZyBhbmQgZW5zdXJlcyB0aGF0IGl0IGhhbmRsZXMgdGhlIGBmaWxsZGlyYCBmdW5jdGlvbiBjb3JyZWN0bHkgdG8gY29uc3RydWN0IHRoZSBkaXJlY3RvcnkgZW50cmllcyBmb3IgdXNlciBzcGFjZS4gVWx0aW1hdGVseSwgSSYjMzk7bSB0cnlpbmcgdG8gdW5kZXJzdGFuZCBob3cga2VybmZzIHByZXNlbnRzIGl0cyBoaWVyYXJjaGljYWwgb3JnYW5pemF0aW9uIHRocm91Z2ggdGhpcyBmdW5jdGlvbiwgYW5kIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3Igc3VidGxlIHJhY2UgY29uZGl0aW9ucy4gVGhlIHdob2xlIGZ1bmN0aW9uIHdpbGwgaGF2ZSB0byBiZSBleGFtaW5lZCBmb3IgdGhlc2UgZGV0YWlscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9rZXJuZnMvZGlyLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxOTg0LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDcwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE5ODQ6XHRzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXG4xOTg1Olx0e1xuMTk4NjpcdFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS1cdTAwM2VmX3BhdGguZGVudHJ5O1xuMTk4NzpcdFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTtcbjE5ODg6XHRcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4xOTg5Olx0XHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuMTk5MDpcdFx0c3RydWN0IGtlcm5mc19yb290ICpyb290O1xuMTk5MTpcdFx0Y29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMO1xuMTk5MjpcdFxuMTk5MzpcdFx0aWYgKCFkaXJfZW1pdF9kb3RzKGZpbGUsIGN0eCkpXG4xOTk0Olx0XHRcdHJldHVybiAwO1xuMTk5NTpcdFxuMTk5NjpcdFx0LypcbjE5OTc6XHRcdCAqIE9uZSBidWZmZXIgZm9yIHRoZSBjYWxsLCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGUgbGlzdGluZ1xuMTk5ODpcdFx0ICogaXMgb24uICBQQVRIX01BWDoga2VybmZzIGJvdW5kcyBubyBzaW5nbGUgbmFtZS5cbjE5OTk6XHRcdCAqL1xuMjAwMDpcdFx0bmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpO1xuMjAwMTpcdFx0aWYgKCFuYW1lKVxuMjAwMjpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbjIwMDM6XHRcbjIwMDQ6XHRcdHJvb3QgPSBrZXJuZnNfcm9vdChwYXJlbnQpO1xuMjAwNTpcdFx0ZG93bl9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbjIwMDY6XHRcbjIwMDc6XHRcdGlmIChrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpKVxuMjAwODpcdFx0XHRucyA9IGtlcm5mc19pbmZvKGRlbnRyeS1cdTAwM2VkX3NiKS1cdTAwM2VucztcbjIwMDk6XHRcbjIwMTA6XHRcdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBOVUxMLCBOVUxMKTtcbjIwMTE6XHRcdCAgICAgcG9zO1xuMjAxMjpcdFx0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcywgbmFtZSkpIHtcbjIwMTM6XHRcdFx0dW5zaWduZWQgaW50IHR5cGUgPSBmc191bW9kZV90b19kdHlwZShwb3MtXHUwMDNlbW9kZSk7XG4yMDE0Olx0XHRcdGlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTtcbjIwMTU6XHRcdFx0aW50IGxlbjtcbjIwMTY6XHRcbjIwMTc6XHRcdFx0LypcbjIwMTg6XHRcdFx0ICogVGhlIGNvcHkgaXMgYWxzbyB0aGUgcmVzdW1lIGtleSwgc28gYSB0cnVuY2F0ZWQgbmFtZSB3b3VsZFxuMjAxOTpcdFx0XHQgKiByZXN1bWUgaGVyZSBhZ2Fpbi4gIGdldG5hbWUoKSBjYXBzIGEgcGF0aCwgc28gb25seSBhblxuMjAyMDpcdFx0XHQgKiBpbi1rZXJuZWwgY2FsbGVyIGNhbiBnZXQgaGVyZTsgZW5kIHRoZSBsaXN0aW5nIGluc3RlYWQuXG4yMDIxOlx0XHRcdCAqL1xuMjAyMjpcdFx0XHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XG4yMDIzOlx0XHRcdGlmIChXQVJOX09OX09OQ0UobGVuIFx1MDAzYyAwKSlcbjIwMjQ6XHRcdFx0XHRicmVhaztcbjIwMjU6XHRcbjIwMjY6XHRcdFx0Y3R4LVx1MDAzZXBvcyA9IHBvcy1cdTAwM2VoYXNoO1xuMjAyNzpcdFx0XHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IHBvcztcbjIwMjg6XHRcdFx0a2VybmZzX2dldChwb3MpO1xuMjAyOTpcdFxuMjAzMDpcdFx0XHQvKlxuMjAzMTpcdFx0XHQgKiBkaXJfZW1pdCgpIGNhbiBmYXVsdCwgc28gcnVuIGl0IHVubG9ja2VkLiAgQHBvcyBpcyBwaW5uZWRcbjIwMzI6XHRcdFx0ICogYWJvdmUgYW5kIGtlcm5mc19kaXJfcG9zKCkgcmVjaGVja3MgaXQgb24gdGhlIHdheSBiYWNrLlxuMjAzMzpcdFx0XHQgKi9cbjIwMzQ6XHRcdFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4yMDM1Olx0XHRcdGlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpXG4yMDM2Olx0XHRcdFx0cmV0dXJuIDA7XG4yMDM3Olx0XHRcdGRvd25fcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4yMDM4Olx0XHR9XG4yMDM5Olx0XHR1cF9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbjIwNDA6XHRcdGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhID0gTlVMTDtcbjIwNDE6XHRcdGN0eC1cdTAwM2Vwb3MgPSBJTlRfTUFYO1xuMjA0MjpcdFx0cmV0dXJuIDA7XG4yMDQzOlx0fVxuMjA0NDpcdFxuMjA0NTpcdGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga2VybmZzX2Rpcl9mb3BzID0ge1xuMjA0NjpcdFx0LnJlYWRcdFx0PSBnZW5lcmljX3JlYWRfZGlyLFxuMjA0NzpcdFx0Lml0ZXJhdGVfc2hhcmVkXHQ9IGtlcm5mc19mb3BfcmVhZGRpcixcbjIwNDg6XHRcdC5yZWxlYXNlXHQ9IGtlcm5mc19kaXJfZm9wX3JlbGVhc2UsXG4yMDQ5Olx0XHQubGxzZWVrXHRcdD0gZ2VuZXJpY19maWxlX2xsc2VlayxcbjIwNTA6XHR9O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTUwOAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDE5MzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqUGF0Y2ggQW5hbHlzaXMgYW5kIE1lbW9yeSBTYWZldHkgRGVlcCBEaXZlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2ggZm9yIGBrZXJuZnNfZm9wX3JlYWRkaXJgLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCBpdCYjMzk7cyBkZXNpZ25lZCB0byBjb3JyZWN0IGhvdyBkaXJlY3RvcnkgaXRlcmF0aW9uIHJlc3VtZXMgYWZ0ZXIgYW4gZW50cnkgaXMgcmVtb3ZlZCBvciByZW5hbWVkLCB3aGljaCBpcyBhIGNvbW1vbiBzb3VyY2Ugb2Ygc3VidGxlIGJ1Z3MuIEkmIzM5O3ZlIGdvdCB0byBlbnN1cmUgdGhlIGZpeCBpcyBjb3JyZWN0LCBhbmQgYWJzb2x1dGVseSB3YXRlcnRpZ2h0IHJlZ2FyZGluZyBtZW1vcnkgc2FmZXR5LgoKVGhlIGNvcmUgb2YgdGhlIHBhdGNoIHJldm9sdmVzIGFyb3VuZCBpbXByb3ZpbmcgYGtlcm5mc19kaXJfcG9zYC4gUHJldmlvdXNseSwgcmVseWluZyBzb2xlbHkgb24gdGhlIGhhc2ggdG8gcmVzdW1lIGEgZGlyZWN0b3J5IGxpc3Rpbmcgd2FzIGZsYXdlZCwgYmVjYXVzZSBhIHJlbmFtZSBjb3VsZCBwcm9kdWNlIGEgY29sbGlzaW9uLiBJIGxpa2UgdGhhdCB0aGUgcGF0Y2ggbm93IHVzZXMgdGhlIGVudHJ5IG5hbWUgaW4gYWRkaXRpb24gdG8gdGhlIGhhc2guIElmIHRoZSBwb3NpdGlvbiBnaXZlbiBpcyBub3QgdmFsaWQsIHRoZSBjb2RlIHNlYXJjaGVzIHRoZSByYi10cmVlLiBTbWFydCBtb3ZlLgoKSSBzZWUgdGhhdCBhIGJ1ZmZlciwgYG5hbWVgLCBvZiBzaXplIGBQQVRIX01BWGAgaXMgYmVpbmcgYWxsb2NhdGVkIGFuZCBwb3B1bGF0ZWQgd2l0aCB0aGUgZW50cnkmIzM5O3MgbmFtZSB1c2luZyBgc3Ryc2NweWAuIERyb3BwaW5nIHRoZSByZWFkIGxvY2sgYmVmb3JlIHRoZSBgZGlyX2VtaXRgIGNhbGwgaXMgYW4gaW50ZXJlc3RpbmcgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBsZXR0aW5nIGBkaXJfZW1pdGAgZmFpbCBhbmQgcmV0dXJuIHdpdGhvdXQgaG9sZGluZyB0aGUgbG9jay4gQW5kIHRoZW4gdGhlIGxvY2sgaXMgcmUtYWNxdWlyZWQuCgpOb3csIG1lbW9yeSBzYWZldHkgbmVlZHMgYSBtZXRpY3Vsb3VzIHJldmlldy4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggYG5hbWVgLiBJdCBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AgYW5kIGlzICpjcml0aWNhbCogZm9yIHRoZSByZXN0IG9mIHRoZSBvcGVyYXRpb24uCgpGaXJzdCwgSSB0cmFjZSBpdHMgdXNhZ2UuIEl0IHNlZW1zIHRoYXQgYG5hbWVgIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQmIzM5O3MgYWxsb2NhdGVkLiBJZiB0aGUgaW5pdGlhbCBjYWxsIHRvIGBrZXJuZnNfZGlyX3Bvc2AgcmV0dXJucyBgTlVMTGAsIHRoZW4gYG5hbWVgIGlzIGZyZWVkIGFuZCBuZXZlciByZWFkLiBJZiBub3QsIGBzdHJzY3B5YCBpcyBjYWxsZWQsIGFuZCBgbmFtZWAgd2lsbCBiZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgYW55IHJlYWQuIFRoZSBjb2RlIHRoZW4gcGFzc2VzIGBuYW1lYCB0byB0aGUgYGRpcl9lbWl0YCBmdW5jdGlvbiwgd2hpY2ggaW4gdHVybiBjYWxscyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuIFRoaXMgY2FsbGJhY2ssIHN1Y2ggYXMgYGZpbGxkaXI2NGAsIGNvcGllcyB0aGUgY29udGVudHMgb2YgYG5hbWVgIHRvIHVzZXIgc3BhY2UsIGFuZCB0aGUgbGVuZ3RoIGlzIHBhc3NlZCB0byBtYWtlIHN1cmUgaXQgY29waWVzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KClRoZSBsb29wIHRoZW4gY29udGludWVzLCBjYWxsaW5nIGBrZXJuZnNfZGlyX25leHRfcG9zYC4gVGhpcyBjYWxscyBga2VybmZzX2Rpcl9wb3NgLCB3aGljaCBjYWxscyBgc3RyY21wYCBvbiBgbmFtZWAuIGBzdHJjbXBgIGNoZWNrcyB1bnRpbCB0aGUgbnVsbCB0ZXJtaW5hdG9yLCBzbyB0aGVyZSYjMzk7cyBubyB3YXkgdG8gcmVhZCB1bmluaXRpYWxpemVkIG1lbW9yeS4gSW4gdGhlIG5leHQgbG9vcCBpdGVyYXRpb24sIGBuYW1lYCBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXcgZW50cnkgbmFtZS4gYHN0cnNjcHlgIGhhbmRsZXMgYWxsIHRoZSBpbXBvcnRhbnQgcGFydHMgdG8gcHJldmVudCByZWFkaW5nIGJleW9uZCB0aGUgaW5pdGlhbGl6ZWQgcHJlZml4IG9mIGBuYW1lYC4KCkJ1dCwgd2hhdCBpZiBgZGlyX2VtaXRgIHJldHVybnMgYGZhbHNlYD8gVGhlIGZ1bmN0aW9uIGV4aXRzLCBhbmQgYG5hbWVgIGlzIGZyZWVkLiBBbmQgd2hhdCBpZiBgZG93bl9yZWFkYCB3YXNuJiMzOTt0IHVubG9ja2VkLCBhbmQgYGRpcl9lbWl0YCBmYWlsZWQ/IE5vdGhpbmcsIGJlY2F1c2UgdGhlIHJlYWQgbG9jayB3YXMgZHJvcHBlZCBiZWZvcmUgYGRpcl9lbWl0YCB3YXMgY2FsbGVkLCBhbmQgaXQgZG9lcyB0aGUgcmlnaHQgdGhpbmcuCgpBbmQgd2hhdCBpZiB0aGUgYHN0cnNjcHlgIGZhaWxzPyBUaGVyZSYjMzk7cyBhIGNoZWNrLCBhbmQgaWYgaXQgZmFpbHMsIHRoZW4gdGhlIGNvZGUgd2lsbCBleGl0LCBzbyB0aGVyZSBpcyBubyBwcm9ibGVtIGhlcmUuCgpPa2F5LCBsZXQmIzM5O3MgdGhpbmsgYWJvdXQgdGhlIGBmaWxlLSZndDtwcml2YXRlX2RhdGFgIGZpZWxkLiBJdCBsb29rcyBsaWtlIGl0IHNhdmVzIHRoZSBsYXN0IHBvc2l0aW9uIGFuZCBpbmNyZW1lbnRzIHRoZSByZWZjb3VudC4gSWYgdGhlIGBkaXJfZW1pdGAgY2FsbCBmYWlscywgdGhhdCYjMzk7cyBmaW5lOyB0aGUgcmVmY291bnQgb24gYHBvc2AgaXMgc3RpbGwgaW5jcmVtZW50ZWQuIElmIHRoZSBuZXh0IGByZWFkZGlyYCBpcyBjYWxsZWQsIHRoZSBzYXZlZCBwb3NpdGlvbiBpcyByZXRyaWV2ZWQgYW5kIHRoZSByZWZjb3VudCByZWxlYXNlZC4KClRoZXJlJiMzOTtzIG5vIHByb2JsZW0gaGVyZS4gQnV0IGFyZSB0aGVyZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzIGx1cmtpbmcgZWxzZXdoZXJlPyBMZXQmIzM5O3MgY2hlY2s6CgpJIG5lZWQgdG8gbG9vayBjYXJlZnVsbHkgYXQgdGhlIGBib29sICpyZXN1bWVkYCB2YXJpYWJsZSB0aGF0IGlzIHBhc3NlZCBhcm91bmQuIEJhc2VkIG9uIG15IGFzc2Vzc21lbnQsIHRoZSBgcmVzdW1lZGAgdmFyaWFibGUgaXMgYWx3YXlzIGluaXRpYWxpemVkLgoKQW5kIGZpbmFsbHksIGBrZXJuZnNfcmN1X25hbWVgIGlzbiYjMzk7dCByZXR1cm5pbmcgdW5pbml0aWFsaXplZCBtZW1vcnksIHNpbmNlIGl0IGlzIHJlZmVyZW5jaW5nIGBrbi0mZ3Q7bmFtZWAuCgpJJiMzOTttIGNvbmZpZGVudC4gVGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuIEkmIzM5O20gZ29pbmcgdG8gc2V0IGBOZWVkc0tNU0FOPWZhbHNlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTg6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a2VybmZzX3JjdV9uYW1lJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMva2VybmZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9rZXJuZnMvZGlyLmM9MzQ2PXN0YXRpYyBpbnQga2VybmZzX25hbWVfY29tcGFyZSh1bnNpZ25lZCBpbnQgaGFzaCwgY29uc3QgY2hhciAqbmFtZSxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMzU5LVx0XHRyZXR1cm4gMTtcbmZzL2tlcm5mcy9kaXIuYzozNjA6XHRyZXR1cm4gc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShrbikpO1xuZnMva2VybmZzL2Rpci5jLTM2MS19XG4tLVxuZnMva2VybmZzL2Rpci5jPTM2Mz1zdGF0aWMgaW50IGtlcm5mc19zZF9jb21wYXJlKGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqbGVmdCxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMzY1LXtcbmZzL2tlcm5mcy9kaXIuYzozNjY6XHRyZXR1cm4ga2VybmZzX25hbWVfY29tcGFyZShsZWZ0LVx1MDAzZWhhc2gsIGtlcm5mc19yY3VfbmFtZShsZWZ0KSwgbGVmdC1cdTAwM2VucywgcmlnaHQpO1xuZnMva2VybmZzL2Rpci5jLTM2Ny19XG4tLVxuZnMva2VybmZzL2Rpci5jPTgyMz1pbnQga2VybmZzX2FkZF9vbmUoc3RydWN0IGtlcm5mc19ub2RlICprbilcbi0tXG5mcy9rZXJuZnMvZGlyLmMtODM3LVx0XHQgaGFzX25zID8gXCYjMzQ7cmVxdWlyZWRcJiMzNDsgOiBcJiMzNDtpbnZhbGlkXCYjMzQ7LFxuZnMva2VybmZzL2Rpci5jOjgzODpcdFx0IGtlcm5mc19yY3VfbmFtZShwYXJlbnQpLCBrZXJuZnNfcmN1X25hbWUoa24pKSlcbmZzL2tlcm5mcy9kaXIuYy04MzktXHRcdGdvdG8gb3V0X3VubG9jaztcbi0tXG5mcy9rZXJuZnMvZGlyLmMtODQ3LVxuZnMva2VybmZzL2Rpci5jOjg0ODpcdGtuLVx1MDAzZWhhc2ggPSBrZXJuZnNfbmFtZV9oYXNoKGtlcm5mc19yY3VfbmFtZShrbiksIGtuLVx1MDAzZW5zKTtcbmZzL2tlcm5mcy9kaXIuYy04NDktXG4tLVxuZnMva2VybmZzL2Rpci5jPTg5Mj1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZmluZF9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtOTAzLVx0XHRXQVJOKDEsIEtFUk5fV0FSTklORyBcJiMzNDtrZXJuZnM6IG5zICVzIGluICYjMzk7JXMmIzM5OyBmb3IgJiMzOTslcyYjMzk7XFxuXCYjMzQ7LFxuZnMva2VybmZzL2Rpci5jOjkwNDpcdFx0ICAgICBoYXNfbnMgPyBcJiMzNDtyZXF1aXJlZFwmIzM0OyA6IFwmIzM0O2ludmFsaWRcJiMzNDssIGtlcm5mc19yY3VfbmFtZShwYXJlbnQpLCBuYW1lKTtcbmZzL2tlcm5mcy9kaXIuYy05MDUtXHRcdHJldHVybiBOVUxMO1xuLS1cbmZzL2tlcm5mcy9kaXIuYz0xMTc3PXN0YXRpYyBpbnQga2VybmZzX2RvcF9yZXZhbGlkYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMTIxNC1cdC8qIFRoZSBrZXJuZnMgbm9kZSBoYXMgYmVlbiByZW5hbWVkICovXG5mcy9rZXJuZnMvZGlyLmM6MTIxNTpcdGtuX25hbWUgPSBrZXJuZnNfcmN1X25hbWUoa24pO1xuZnMva2VybmZzL2Rpci5jLTEyMTYtXHRpZiAobmFtZS1cdTAwM2VsZW4gIT0gc3RybGVuKGtuX25hbWUpIHx8XG4tLVxuZnMva2VybmZzL2Rpci5jPTE1Mjk9c3RhdGljIHZvaWQgX19rZXJuZnNfcmVtb3ZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXG4tLVxuZnMva2VybmZzL2Rpci5jLTE1NDYtXG5mcy9rZXJuZnMvZGlyLmM6MTU0NzpcdHByX2RlYnVnKFwmIzM0O2tlcm5mcyAlczogcmVtb3ZpbmdcXG5cJiMzNDssIGtlcm5mc19yY3VfbmFtZShrbikpO1xuZnMva2VybmZzL2Rpci5jLTE1NDgtXG4tLVxuZnMva2VybmZzL2Rpci5jPTE4MTE9aW50IGtlcm5mc19yZW5hbWVfbnMoc3RydWN0IGtlcm5mc19ub2RlICprbiwgc3RydWN0IGtlcm5mc19ub2RlICpuZXdfcGFyZW50LFxuLS1cbmZzL2tlcm5mcy9kaXIuYy0xODM5LVx0ZXJyb3IgPSAwO1xuZnMva2VybmZzL2Rpci5jOjE4NDA6XHRvbGRfbmFtZSA9IGtlcm5mc19yY3VfbmFtZShrbik7XG5mcy9rZXJuZnMvZGlyLmMtMTg0MS1cdGlmICghbmV3X25hbWUpXG4tLVxuZnMva2VybmZzL2Rpci5jPTE5MTA9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXG4tLVxuZnMva2VybmZzL2Rpci5jLTE5MjQtXHRcdFx0aGFzaCA9PSBwb3MtXHUwMDNlaGFzaCBcdTAwMjZcdTAwMjZcbmZzL2tlcm5mcy9kaXIuYzoxOTI1Olx0XHRcdCghbmFtZSB8fCAhc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpKSk7XG5mcy9rZXJuZnMvZGlyLmMtMTkyNi1cdFx0a2VybmZzX3B1dChwb3MpO1xuLS1cbmZzL2tlcm5mcy9kaXIuYz0xOTg0PXN0YXRpYyBpbnQga2VybmZzX2ZvcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMjAyMS1cdFx0ICovXG5mcy9rZXJuZnMvZGlyLmM6MjAyMjpcdFx0bGVuID0gc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpO1xuZnMva2VybmZzL2Rpci5jLTIwMjMtXHRcdGlmIChXQVJOX09OX09OQ0UobGVuIFx1MDAzYyAwKSlcbi0tXG5mcy9rZXJuZnMvZmlsZS5jPTkwNT1zdGF0aWMgdm9pZCBrZXJuZnNfbm90aWZ5X3dvcmtmbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4tLVxuZnMva2VybmZzL2ZpbGUuYy05NDMtXG5mcy9rZXJuZnMvZmlsZS5jOjk0NDpcdFx0a25fbmFtZSA9IGtlcm5mc19yY3VfbmFtZShrbik7XG5mcy9rZXJuZnMvZmlsZS5jLTk0NS1cdFx0bmFtZSA9IFFTVFIoa25fbmFtZSk7XG4tLVxuZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oPTExMz1zdGF0aWMgaW5saW5lIGJvb2wga2VybmZzX3JlbmFtZV9pc19sb2NrZWQoY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICprbilcbi0tXG5mcy9rZXJuZnMva2VybmZzLWludGVybmFsLmgtMTE3LVxuZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oOjExODpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmtlcm5mc19yY3VfbmFtZShjb25zdCBzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKVxuZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oLTExOS17XG4tLVxuZnMva2VybmZzL21vdW50LmM9MjMyPXN0cnVjdCBkZW50cnkgKmtlcm5mc19ub2RlX2RlbnRyeShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLFxuLS1cbmZzL2tlcm5mcy9tb3VudC5jLTI3Ni1cdFx0XHR9XG5mcy9rZXJuZnMvbW91bnQuYzoyNzc6XHRcdFx0bmFtZSA9IGtzdHJkdXAoa2VybmZzX3JjdV9uYW1lKGtudG1wKSwgR0ZQX0tFUk5FTCk7XG5mcy9rZXJuZnMvbW91bnQuYy0yNzgtXHRcdH1cbi0tXG5mcy9rZXJuZnMvc3ltbGluay5jPTY3PXN0YXRpYyBpbnQga2VybmZzX2dldF90YXJnZXRfcGF0aChzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCxcbi0tXG5mcy9rZXJuZnMvc3ltbGluay5jLTk0LVx0d2hpbGUgKGtlcm5mc19wYXJlbnQoa24pIFx1MDAyNlx1MDAyNiBrbiAhPSBiYXNlKSB7XG5mcy9rZXJuZnMvc3ltbGluay5jOjk1Olx0XHRsZW4gJiM0Mzs9IHN0cmxlbihrZXJuZnNfcmN1X25hbWUoa24pKSAmIzQzOyAxO1xuZnMva2VybmZzL3N5bWxpbmsuYy05Ni1cdFx0a24gPSBrZXJuZnNfcGFyZW50KGtuKTtcbi0tXG5mcy9rZXJuZnMvc3ltbGluay5jLTEwOC1cdHdoaWxlIChrZXJuZnNfcGFyZW50KGtuKSBcdTAwMjZcdTAwMjYga24gIT0gYmFzZSkge1xuZnMva2VybmZzL3N5bWxpbmsuYzoxMDk6XHRcdGNvbnN0IGNoYXIgKm5hbWUgPSBrZXJuZnNfcmN1X25hbWUoa24pO1xuZnMva2VybmZzL3N5bWxpbmsuYy0xMTAtXHRcdGludCBzbGVuID0gc3RybGVuKG5hbWUpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNTk1NgoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBLZXJuZnMgSW50ZXJuYWxzKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYGtlcm5mc2AgYmVoYXZpb3IgYSBiaXQgYmV0dGVyLiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bSBnb2luZyB0byBzdGFydCB3aXRoIHRoZSBpbnRlcm5hbCBoZWFkZXIgZmlsZXMsIHNwZWNpZmljYWxseSBgZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oYC4gTGV0JiMzOTtzIG5hdmlnYXRlIHRvIGFyb3VuZCBsaW5lIDExOCDigJMgdGhhdCYjMzk7cyBvZnRlbiBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgY29yZSBkYXRhIHN0cnVjdHVyZXMgb3IgaW5pdGlhbGl6YXRpb24gcm91dGluZXMsIGRlcGVuZGluZyBvbiBob3cgdGhpcyBwYXJ0aWN1bGFyIGNvZGViYXNlIGlzIHN0cnVjdHVyZWQuIEkmIzM5O20gaG9waW5nIHRvIGZpbmQgc29tZXRoaW5nIHJlbGV2YW50IHRoZXJlIHRoYXQmIzM5O2xsIHNoZWQgc29tZSBsaWdodCBvbiB0aGUgaXNzdWUgSSYjMzk7bSB3b3JraW5nIG9uLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuIEkgc3VzcGVjdCB0aGlzIHdpbGwgYmUgdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDE1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMTU6XHRcdHJldHVybiBsb2NrZGVwX2lzX2hlbGQoXHUwMDI2a2VybmZzX3Jvb3Qoa24pLVx1MDAzZWtlcm5mc19yZW5hbWVfbG9jayk7XG4gMTE2Olx0fVxuIDExNzpcdFxuIDExODpcdHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqa2VybmZzX3JjdV9uYW1lKGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXG4gMTE5Olx0e1xuIDEyMDpcdFx0LypcbiAxMjE6XHRcdCAqIExpa2Uga2VybmZzX25vZGU6Ol9fcGFyZW50IGJlbG93LCB0aGUgbmFtZSBpcyBvbmx5IHJlcGxhY2VkIHVuZGVyXG4gMTIyOlx0XHQgKiBib3RoIGtlcm5mc19yb290OjprZXJuZnNfcndzZW0gYW5kIGtlcm5mc19yb290OjprZXJuZnNfcmVuYW1lX2xvY2ssXG4gMTIzOlx0XHQgKiBzbyBlaXRoZXIgb25lIGtlZXBzIGl0LCBhbmQgdGhlIHN0cmluZyBpdCBwb2ludHMgYXQsIHN0YWJsZS5cbiAxMjQ6XHRcdCAqL1xuIDEyNTpcdFx0cmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9jaGVjayhrbi1cdTAwM2VuYW1lLFxuIDEyNjpcdFx0XHRcdFx0ICAgICBrZXJuZnNfcm9vdF9pc19sb2NrZWQoa24pIHx8XG4gMTI3Olx0XHRcdFx0XHQgICAgIGtlcm5mc19yZW5hbWVfaXNfbG9ja2VkKGtuKSk7XG4gMTI4Olx0fVxuIDEyOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxODozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjQzOAoJCQkJCQkJb3V0cHV0OiAzMzMKCQkJCQkJCXRob3VnaHRzOiA4NTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIEtlcm5mcyBEaXJlY3RvcnkgUmVzdW1wdGlvbiBQYXRjaCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGcm9tIHdoYXQgSSBzZWUsIHRoaXMgcGF0Y2ggaXMgYWRkcmVzc2luZyBhIHRyaWNreSBwcm9ibGVtIGluIGtlcm5mcyYjMzk7IGByZWFkZGlyYCBhbmQgYGdldGRlbnRzYCBpbXBsZW1lbnRhdGlvbiwgc3BlY2lmaWNhbGx5IHdoZW4gZW50cmllcyBhcmUgcmVtb3ZlZCBvciByZW5hbWVkIHdoaWxlIGRpcmVjdG9yeSBpdGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuIFRoZSBjb3JlIG9mIHRoZSBmaXggcmV2b2x2ZXMgYXJvdW5kIGhvdyB0aGUgY29kZSBoYW5kbGVzIHRoZSBkaXJlY3RvcnkgZW50cnkgbmFtZSwgaGFzaCwgYW5kIHRoZSBhc3NvY2lhdGVkIGxvY2tpbmcgbWVjaGFuaXNtcy4KClRoZSB0ZXN0IGNvbW1lbnRzIGFyZSBrZXkgaGVyZS4gVGhleSBleHBsaWNpdGx5IGNhbGwgb3V0IExPQ0tERVAgYW5kIEtBU0FOLiBNeSBleHBlcnQgaW50dWl0aW9uIGltbWVkaWF0ZWx5IGZsYWdzIHRoaXMgYXMgYSBzaWduIHRoYXQgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBhIGNoYW5nZSB0aGF0IGltcGFjdHMgbG9ja2luZyBhbmQgY29uY3VycmVuY3kuIFRoZSBwYXRjaCAqY2hhbmdlcyogbG9ja2luZy4gV2UmIzM5O3JlIGRyb3BwaW5nIGByb290LSZndDtrZXJuZnNfcndzZW1gIGJlZm9yZSBgZGlyX2VtaXQoKWAgYW5kIHRoZW4gcmVhY3F1aXJpbmcgaXQuIFBsdXMsIHdlJiMzOTtyZSBwaW5uaW5nIHRoZSBgcG9zYCB3aXRoIGBrZXJuZnNfZ2V0KHBvcylgIGFuZCByZS12ZXJpZnlpbmcgaXQgb24gcmVzdW1lLiBUaGUgY29tbWVudHMgY29uZmlybSBteSBzdXNwaWNpb246IGl0JiMzOTtzIGFsbCBhYm91dCBlbnN1cmluZyB0aGUgaXRlcmF0b3ImIzM5O3MgdmFsaWRpdHkgYW5kIGF2b2lkaW5nIHJhY2VzIG9yIGNvbmN1cnJlbmN5IGlzc3VlcyBkdXJpbmcgZGlyZWN0b3J5IHRyYXZlcnNhbCwgZXNwZWNpYWxseSB3aGVuIGVudHJpZXMgYXJlIGJlaW5nIG1vZGlmaWVkIGNvbmN1cnJlbnRseS4gVGhlIGdvYWwgaXMgdG8gbWFrZSBzdXJlIHdlIGRvbiYjMzk7dCBlbmQgdXAgcmUtdmlzaXRpbmcgb3Igc2tpcHBpbmcgZGlyZWN0b3J5IGVudHJpZXMuCgpOb3csIGxldCYjMzk7cyBnZXQgaW50byB0aGUgS01TQU4gcXVlc3Rpb24uCgpGaXJzdGx5LCBJIGNoZWNrZWQgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBJcyB0aGlzIHBhdGNoIHBhc3NpbmcgdW5pbml0aWFsaXplZCBrZXJuZWwgc3RydWN0dXJlcyB0byB1c2VyIHNwYWNlPyBOby4gVGhlIGNvZGUmIzM5O3MgdXNpbmcgYHN0cnNjcHlgLCBzbyB0aGUgYG5hbWVgIGJ1ZmZlciBpcyBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgYmVpbmcgY29waWVkLiBJcyB0aGVyZSBicmFuY2hpbmcgYmFzZWQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vcGUsIHRoZSBgcmVzdW1lZGAgYm9vbGVhbiBpcyBwcm9wZXJseSBpbml0aWFsaXplZC4gSXMgdGhlcmUgY29tcGxleCBkYXRhIHN0cnVjdHVyZSBhbGxvY2F0aW9uIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQ/IE5vLiBUaGUgb25seSBhbGxvY2F0aW9uIGlzIGEgc2ltcGxlIGBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKWAgZm9yIGBuYW1lYC4gRG9lcyBpdCBhbHRlciBib3VuZHMgY2hlY2tzIG9yIGxlbmd0aHMgaW4gYSB3YXkgdGhhdCBjb3VsZCBsZWFkIHRvIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgYmVpbmcgYWNjZXNzZWQ/IE5vLiBUaGUgbGVuZ3RoIGBsZW5gIGlzIGRlcml2ZWQgZnJvbSBgc3Ryc2NweWAsIGVuc3VyaW5nIHNhZmUgYm91bmRzLgoKTXkgc2Vjb25kIGxpbmUgb2YgdGhpbmtpbmcgZm9jdXNlZCBvbiBwb3RlbnRpYWwgYnVncyBpdCBjb3VsZCBpbnRyb2R1Y2UuIEkmIzM5O20gZm9jdXNpbmcgb24gcmFjZSBjb25kaXRpb25zLCB1c2UtYWZ0ZXItZnJlZSwgYW5kIGxvY2tkZXAgcHJvYmxlbXMgYXJvdW5kIGRyb3BwaW5nIGFuZCByZWFjcXVpcmluZyBgcm9vdC0mZ3Q7a2VybmZzX3J3c2VtYC4gSSYjMzk7bSBhbHNvIHRoaW5raW5nIGFib3V0IGl0ZXJhdG9yIGNvcnJlY3RuZXNzIOKAkyBtYWtpbmcgc3VyZSB3ZSBkb24mIzM5O3Qgc2VlIGR1cGxpY2F0ZSBlbnRyaWVzIG9yIG1pc3MgZW50cmllcyDigJMgYW5kIGxpZmV0aW1lIGlzc3VlcyByZWxhdGVkIHRvIGBwb3NgLgoKVGhlIGdvb2QgbmV3cyBpcyB0aGF0IHRoZXNlIGtpbmRzIG9mIGNvbmN1cnJlbmN5LCBsaWZldGltZSwgbG9ja2luZywgYW5kIG91dC1vZi1ib3VuZHMgcHJvYmxlbXMgYXJlIGV4YWN0bHkgd2hhdCBLQVNBTiBhbmQgTE9DS0RFUCBhcmUgZGVzaWduZWQgdG8gY2F0Y2gsIGFsb25nIHdpdGggc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scy4gVGhlIHBhdGNoICppcyogcGxheWluZyB3aXRoIGxvY2tzIGFuZCBkaXJlY3RvcnkgZW50cmllcywgYnV0IGl0IGlzbiYjMzk7dCBwbGF5aW5nIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuCgpTbywgYWZ0ZXIgYSB0aG9yb3VnaCByZXZpZXcsIGl04oCZcyBjbGVhciB0byBtZTogdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXJzcGFjZSB0aGF0IHdvdWxkIG5lY2Vzc2l0YXRlIEtNU0FOIGZ1enppbmcuIFRoZXJlZm9yZSwgdGhlIGBOZWVkc0tNU0FOYCB0YWcgc2hvdWxkIGJlIGBmYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE4OjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMga2VybmZzIGRpcmVjdG9yeSBpdGVyYXRpb24gKGBrZXJuZnNfZm9wX3JlYWRkaXJgKSB0byBwcm9wZXJseSBoYW5kbGUgcmVhZGRpciByZXN1bXB0aW9uIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBvciByZW5hbWVkIGNvbmN1cnJlbnRseSwgYnkga2V5aW5nIHBvc2l0aW9uIG9uIHRoZSBub2RlIG5hbWUgaW4gYWRkaXRpb24gdG8gaXRzIGhhc2ggYW5kIGRyb3BwaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXQoKWAuXG5cbi0gTWVtb3J5IGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uOiBBIHRlbXBvcmFyeSBidWZmZXIgYG5hbWVgIGlzIGFsbG9jYXRlZCB2aWEgYGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpYC4gQmVmb3JlIGFueSByZWFkLCBpdCBpcyBwb3B1bGF0ZWQgdXNpbmcgYHN0cnNjcHkobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcyksIFBBVEhfTUFYKWAuIFRoZSBzdHJpbmcgY29tcGFyaXNvbiBmdW5jdGlvbnMgKGBzdHJjbXBgKSBhbmQgYGRpcl9lbWl0KClgIG9ubHkgYWNjZXNzIHRoZSBwb3B1bGF0ZWQsIE5VTC10ZXJtaW5hdGVkIHByZWZpeCBvZiBsZW5ndGggYGxlbmAuIE5vIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBidWZmZXIgYXJlIHJlYWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS5cbi0gTG9jYWwgdmFyaWFibGVzOiBUaGUgc3RhY2sgdmFyaWFibGUgYGJvb2wgcmVzdW1lZGAgcGFzc2VkIHRvIGBrZXJuZnNfZGlyX3BvcygpYCBpcyB1bmNvbmRpdGlvbmFsbHkgaW5pdGlhbGl6ZWQgdG8gYGZhbHNlYCB1cG9uIGVudHJ5IHRvIGBrZXJuZnNfZGlyX3BvcygpYC5cbi0gUHJpbWFyeSByaXNrczogVGhlIHBhdGNoIG1vZGlmaWVzIGxvY2tpbmcgYmVoYXZpb3IgKGRyb3BwaW5nIGFuZCByZS1hY3F1aXJpbmcgYGtlcm5mc19yd3NlbWAgYXJvdW5kIGBkaXJfZW1pdGApIGFuZCBub2RlIHJlZmNvdW50aW5nL3ZhbGlkYXRpb24uIFRoZXNlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG90ZW50aWFsIGNvbmN1cnJlbmN5IHJhY2VzLCBsb2NrIGludmVyc2lvbiwgYW5kIGxpZmV0aW1lL3VzZS1hZnRlci1mcmVlIGJ1Z3MsIHdoaWNoIGFyZSBmdWxseSBjb3ZlcmVkIGJ5IExPQ0tERVAgYW5kIEtBU0FOLlxuXG5CZWNhdXNlIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrIHJpc2tzIHRoYXQgd291bGQgYmUgdW5pcXVlbHkgZGV0ZWN0ZWQgYnkgS01TQU4sIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCB1cGRhdGVzIGtlcm5mcyBkaXJlY3RvcnkgaXRlcmF0aW9uIChga2VybmZzX2ZvcF9yZWFkZGlyYCkgdG8gcHJvcGVybHkgaGFuZGxlIHJlYWRkaXIgcmVzdW1wdGlvbiB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgb3IgcmVuYW1lZCBjb25jdXJyZW50bHksIGJ5IGtleWluZyBwb3NpdGlvbiBvbiB0aGUgbm9kZSBuYW1lIGluIGFkZGl0aW9uIHRvIGl0cyBoYXNoIGFuZCBkcm9wcGluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0KClgLlxuXG4tIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbjogQSB0ZW1wb3JhcnkgYnVmZmVyIGBuYW1lYCBpcyBhbGxvY2F0ZWQgdmlhIGBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKWAuIEJlZm9yZSBhbnkgcmVhZCwgaXQgaXMgcG9wdWxhdGVkIHVzaW5nIGBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWClgLiBUaGUgc3RyaW5nIGNvbXBhcmlzb24gZnVuY3Rpb25zIChgc3RyY21wYCkgYW5kIGBkaXJfZW1pdCgpYCBvbmx5IGFjY2VzcyB0aGUgcG9wdWxhdGVkLCBOVUwtdGVybWluYXRlZCBwcmVmaXggb2YgbGVuZ3RoIGBsZW5gLiBObyB1bmluaXRpYWxpemVkIGJ5dGVzIGZyb20gdGhlIHJlbWFpbmRlciBvZiB0aGUgYnVmZmVyIGFyZSByZWFkIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UuXG4tIExvY2FsIHZhcmlhYmxlczogVGhlIHN0YWNrIHZhcmlhYmxlIGBib29sIHJlc3VtZWRgIHBhc3NlZCB0byBga2VybmZzX2Rpcl9wb3MoKWAgaXMgdW5jb25kaXRpb25hbGx5IGluaXRpYWxpemVkIHRvIGBmYWxzZWAgdXBvbiBlbnRyeSB0byBga2VybmZzX2Rpcl9wb3MoKWAuXG4tIFByaW1hcnkgcmlza3M6IFRoZSBwYXRjaCBtb2RpZmllcyBsb2NraW5nIGJlaGF2aW9yIChkcm9wcGluZyBhbmQgcmUtYWNxdWlyaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXRgKSBhbmQgbm9kZSByZWZjb3VudGluZy92YWxpZGF0aW9uLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIHBvdGVudGlhbCBjb25jdXJyZW5jeSByYWNlcywgbG9jayBpbnZlcnNpb24sIGFuZCBsaWZldGltZS91c2UtYWZ0ZXItZnJlZSBidWdzLCB3aGljaCBhcmUgZnVsbHkgY292ZXJlZCBieSBMT0NLREVQIGFuZCBLQVNBTi5cblxuQmVjYXVzZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIGJlIHVuaXF1ZWx5IGRldGVjdGVkIGJ5IEtNU0FOLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMTo0Mi43Njg3NzE4NTNaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTk4MDUzNTMzNTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiS0VSTkZTXCIsXG4gICAgXCJTWVNGU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImtlcm5mc19mb3BfcmVhZGRpclwiLFxuICAgIFwia2VybmZzX2Rpcl9wb3NcIixcbiAgICBcImtlcm5mc19kaXJfbmV4dF9wb3NcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMga2VybmZzIGRpcmVjdG9yeSBpdGVyYXRpb24gKGBrZXJuZnNfZm9wX3JlYWRkaXJgKSB0byBwcm9wZXJseSBoYW5kbGUgcmVhZGRpciByZXN1bXB0aW9uIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBvciByZW5hbWVkIGNvbmN1cnJlbnRseSwgYnkga2V5aW5nIHBvc2l0aW9uIG9uIHRoZSBub2RlIG5hbWUgaW4gYWRkaXRpb24gdG8gaXRzIGhhc2ggYW5kIGRyb3BwaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXQoKWAuXFxuXFxuLSBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb246IEEgdGVtcG9yYXJ5IGJ1ZmZlciBgbmFtZWAgaXMgYWxsb2NhdGVkIHZpYSBga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTClgLiBCZWZvcmUgYW55IHJlYWQsIGl0IGlzIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpYC4gVGhlIHN0cmluZyBjb21wYXJpc29uIGZ1bmN0aW9ucyAoYHN0cmNtcGApIGFuZCBgZGlyX2VtaXQoKWAgb25seSBhY2Nlc3MgdGhlIHBvcHVsYXRlZCwgTlVMLXRlcm1pbmF0ZWQgcHJlZml4IG9mIGxlbmd0aCBgbGVuYC4gTm8gdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZmZlciBhcmUgcmVhZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLlxcbi0gTG9jYWwgdmFyaWFibGVzOiBUaGUgc3RhY2sgdmFyaWFibGUgYGJvb2wgcmVzdW1lZGAgcGFzc2VkIHRvIGBrZXJuZnNfZGlyX3BvcygpYCBpcyB1bmNvbmRpdGlvbmFsbHkgaW5pdGlhbGl6ZWQgdG8gYGZhbHNlYCB1cG9uIGVudHJ5IHRvIGBrZXJuZnNfZGlyX3BvcygpYC5cXG4tIFByaW1hcnkgcmlza3M6IFRoZSBwYXRjaCBtb2RpZmllcyBsb2NraW5nIGJlaGF2aW9yIChkcm9wcGluZyBhbmQgcmUtYWNxdWlyaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXRgKSBhbmQgbm9kZSByZWZjb3VudGluZy92YWxpZGF0aW9uLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIHBvdGVudGlhbCBjb25jdXJyZW5jeSByYWNlcywgbG9jayBpbnZlcnNpb24sIGFuZCBsaWZldGltZS91c2UtYWZ0ZXItZnJlZSBidWdzLCB3aGljaCBhcmUgZnVsbHkgY292ZXJlZCBieSBMT0NLREVQIGFuZCBLQVNBTi5cXG5cXG5CZWNhdXNlIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrIHJpc2tzIHRoYXQgd291bGQgYmUgdW5pcXVlbHkgZGV0ZWN0ZWQgYnkgS01TQU4sIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMga2VybmZzIGRpcmVjdG9yeSBsaXN0aW5nIChyZWFkZGlyIC8gZ2V0ZGVudHMpIGFuZCByZXN1bWUgdHJhdmVyc2FsIGxvZ2ljIGluIGZzL2tlcm5mcy9kaXIuYy4gU3BlY2lmaWNhbGx5LCBpdCB1cGRhdGVzIGtlcm5mc19kaXJfcG9zIGFuZCBrZXJuZnNfZGlyX25leHRfcG9zIHRvIHJlc3VtZSByZWFkZGlyIGJhc2VkIG9uIGVudHJ5IG5hbWUgY29tcGFyaXNvbiB3aXRoaW4gdGhlIHJiLXRyZWUsIGFkZHMgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIHJlc3VtZSBrZXkgbmFtZSwgaW50cm9kdWNlcyBhIFdBUk5fT05fT05DRSBjaGVjayBvbiBuYW1lIHRydW5jYXRpb24sIGFuZCByZWxlYXNlcy9yZWFjcXVpcmVzIHJvb3QtXFx1MDAzZWtlcm5mc19yd3NlbSBhcm91bmQgZGlyX2VtaXQoKS4gVGhlc2UgY2hhbmdlcyB0b3VjaCByZWFjaGFibGUgY29yZSB2aXJ0dWFsIGZpbGVzeXN0ZW0gY29kZSBleGVyY2lzZWQgYnkgdXNlciBzcGFjZSB2aWEgZ2V0ZGVudHMvZ2V0ZGVudHM2NCBvbiBzeXNmcyBhbmQgY2dyb3VwcywgaW50cm9kdWNpbmcgY29uY3VycmVuY3kgd2luZG93cyBhbmQgbW9kaWZpZWQgbG9ja2luZyBzZW1hbnRpY3MuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMxOjQyLjc2ODc3NzM5M1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDkwOTE1OTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZTU1ODAyMGVhYmE2MDVmNjA4MTdkNTRkNDk3MWVjZGYxY2I0NTFmMFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIFNlcCAxMSAxODozMTo0MSAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZGlyLmMgYi9mcy9rZXJuZnMvZGlyLmNcXG5pbmRleCAwN2FiZjU5ZjAyNjRhLi5jYzYyODhkNWI0Y2M0IDEwMDY0NFxcbi0tLSBhL2ZzL2tlcm5mcy9kaXIuY1xcbisrKyBiL2ZzL2tlcm5mcy9kaXIuY1xcbkBAIC0xOTAzLDMzICsxOTAzLDQ5IEBAIHN0YXRpYyBpbnQga2VybmZzX2Rpcl9mb3BfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIEZpbmQgd2hlcmUgYSBsaXN0aW5nIGxlZnQgb2ZmLiAgQHJlc3VtZWQgc2F5cyB3aGV0aGVyIEBwb3MgaXMgc3RpbGwgdGhhdFxcbisgKiBlbnRyeTsgaWYgbm90LCB0aGUgc2VhcmNoIGZhbGxzIGJhY2sgdG8gQGhhc2gsIGtleWVkIGJ5IEBuYW1lIGlmIGdpdmVuLlxcbisgKi9cXG4gc3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuLVxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpXFxuK1xcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXFxuK1xcdGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgKnJlc3VtZWQpXFxuIHtcXG4rXFx0aWYgKHJlc3VtZWQpXFxuK1xcdFxcdCpyZXN1bWVkID0gZmFsc2U7XFxuIFxcdGlmIChwb3MpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogQSByZW5hbWUga2VlcHMgdGhlIGhhc2ggaWYgdGhlIG5ldyBuYW1lIGhhc2hlcyB0aGUgc2FtZSwgc29cXG4rXFx0XFx0ICogY2hlY2sgQG5hbWUgdG9vLiAgT3RoZXJ3aXNlIHRoZSBjYWxsZXIgd291bGQgc3RlcCBvdmVyIHRoZVxcbitcXHRcXHQgKiBlbnRyeSBub3cgc2l0dGluZyB3aGVyZSBAcG9zIHVzZWQgdG8gYmUuXFxuK1xcdFxcdCAqL1xcbiBcXHRcXHRpbnQgdmFsaWQgPSBrZXJuZnNfYWN0aXZlKHBvcykgXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0XFx0cmN1X2FjY2Vzc19wb2ludGVyKHBvcy1cXHUwMDNlX19wYXJlbnQpID09IHBhcmVudCBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRcXHRoYXNoID09IHBvcy1cXHUwMDNlaGFzaDtcXG4rXFx0XFx0XFx0aGFzaCA9PSBwb3MtXFx1MDAzZWhhc2ggXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0KCFuYW1lIHx8ICFzdHJjbXAobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcykpKTtcXG4gXFx0XFx0a2VybmZzX3B1dChwb3MpO1xcbiBcXHRcXHRpZiAoIXZhbGlkKVxcbiBcXHRcXHRcXHRwb3MgPSBOVUxMO1xcbitcXHRcXHRlbHNlIGlmIChyZXN1bWVkKVxcbitcXHRcXHRcXHQqcmVzdW1lZCA9IHRydWU7XFxuIFxcdH1cXG4gXFx0aWYgKCFwb3MgXFx1MDAyNlxcdTAwMjYgKGhhc2ggXFx1MDAzZSAxKSBcXHUwMDI2XFx1MDAyNiAoaGFzaCBcXHUwMDNjIElOVF9NQVgpKSB7XFxuIFxcdFxcdHN0cnVjdCByYl9ub2RlICpub2RlID0gcGFyZW50LVxcdTAwM2VkaXIuY2hpbGRyZW4ucmJfbm9kZTtcXG4tXFx0XFx0dTY0IG5zX2lkID0ga2VybmZzX25zX2lkKG5zKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIEtlZXAgYSBub2RlIG9ubHkgb24gdGhlIHdheSBsZWZ0LCBzbyB0aGUgc2VhcmNoIGVuZHMgb24gdGhlXFxuK1xcdFxcdCAqIGZpcnN0IGVudHJ5IGFmdGVyIHRoZSBrZXkuICBBbiBlbXB0eSBAbmFtZSBzb3J0cyBiZWZvcmUgYWxsXFxuK1xcdFxcdCAqIGVudHJpZXMgc2hhcmluZyB0aGUgaGFzaCwgc28gaXQgbGFuZHMgb24gdGhlIGZpcnN0IG9mIHRoZW0uXFxuK1xcdFxcdCAqL1xcbiBcXHRcXHR3aGlsZSAobm9kZSkge1xcbi1cXHRcXHRcXHRwb3MgPSByYl90b19rbihub2RlKTtcXG4rXFx0XFx0XFx0c3RydWN0IGtlcm5mc19ub2RlICprbiA9IHJiX3RvX2tuKG5vZGUpO1xcbiBcXG4tXFx0XFx0XFx0aWYgKGhhc2ggXFx1MDAzYyBwb3MtXFx1MDAzZWhhc2gpXFxuLVxcdFxcdFxcdFxcdG5vZGUgPSBub2RlLVxcdTAwM2VyYl9sZWZ0O1xcbi1cXHRcXHRcXHRlbHNlIGlmIChoYXNoIFxcdTAwM2UgcG9zLVxcdTAwM2VoYXNoKVxcbi1cXHRcXHRcXHRcXHRub2RlID0gbm9kZS1cXHUwMDNlcmJfcmlnaHQ7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKG5zX2lkIFxcdTAwM2Mga2VybmZzX25zX2lkKHBvcy1cXHUwMDNlbnMpKVxcbitcXHRcXHRcXHRpZiAoa2VybmZzX25hbWVfY29tcGFyZShoYXNoLCBuYW1lID86IFxcXCJcXFwiLCBucywga24pIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRcXHRwb3MgPSBrbjtcXG4gXFx0XFx0XFx0XFx0bm9kZSA9IG5vZGUtXFx1MDAzZXJiX2xlZnQ7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKG5zX2lkIFxcdTAwM2Uga2VybmZzX25zX2lkKHBvcy1cXHUwMDNlbnMpKVxcbitcXHRcXHRcXHR9IGVsc2Uge1xcbiBcXHRcXHRcXHRcXHRub2RlID0gbm9kZS1cXHUwMDNlcmJfcmlnaHQ7XFxuLVxcdFxcdFxcdGVsc2VcXG4tXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcdC8qIFNraXAgb3ZlciBlbnRyaWVzIHdoaWNoIGFyZSBkeWluZy9kZWFkIG9yIGluIHRoZSB3cm9uZyBuYW1lc3BhY2UgKi9cXG5AQCAtMTk0NSwxMCArMTk2MSwxNCBAQCBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4gfVxcbiBcXG4gc3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9uZXh0X3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4tXFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGlub190IGlubywgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpXFxuK1xcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXFxuK1xcdGNvbnN0IGNoYXIgKm5hbWUpXFxuIHtcXG4tXFx0cG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgaW5vLCBwb3MpO1xcbi1cXHRpZiAocG9zKSB7XFxuK1xcdGJvb2wgcmVzdW1lZDtcXG4rXFxuK1xcdHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGhhc2gsIHBvcywgbmFtZSwgXFx1MDAyNnJlc3VtZWQpO1xcbitcXHQvKiBTdGVwIG92ZXIgQHBvcyBvbmx5IGlmIGl0IHN1cnZpdmVkOyBAbmFtZSBmaW5kcyB0aGUgc3BvdCBpZiBub3QuICovXFxuK1xcdGlmIChwb3MgXFx1MDAyNlxcdTAwMjYgcmVzdW1lZCkge1xcbiBcXHRcXHRkbyB7XFxuIFxcdFxcdFxcdHN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dChcXHUwMDI2cG9zLVxcdTAwM2VyYik7XFxuIFxcdFxcdFxcdGlmICghbm9kZSlcXG5AQCAtMTk2NiwzNCArMTk4Niw1NSBAQCBzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuIFxcdHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtXFx1MDAzZWZfcGF0aC5kZW50cnk7XFxuIFxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50ID0ga2VybmZzX2RlbnRyeV9ub2RlKGRlbnRyeSk7XFxuIFxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbitcXHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xcbiBcXHRzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3Q7XFxuIFxcdGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zID0gTlVMTDtcXG4gXFxuIFxcdGlmICghZGlyX2VtaXRfZG90cyhmaWxlLCBjdHgpKVxcbiBcXHRcXHRyZXR1cm4gMDtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIE9uZSBidWZmZXIgZm9yIHRoZSBjYWxsLCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGUgbGlzdGluZ1xcbitcXHQgKiBpcyBvbi4gIFBBVEhfTUFYOiBrZXJuZnMgYm91bmRzIG5vIHNpbmdsZSBuYW1lLlxcbitcXHQgKi9cXG4rXFx0bmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpO1xcbitcXHRpZiAoIW5hbWUpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4gXFx0cm9vdCA9IGtlcm5mc19yb290KHBhcmVudCk7XFxuIFxcdGRvd25fcmVhZChcXHUwMDI2cm9vdC1cXHUwMDNla2VybmZzX3J3c2VtKTtcXG4gXFxuIFxcdGlmIChrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpKVxcbiBcXHRcXHRucyA9IGtlcm5mc19pbmZvKGRlbnRyeS1cXHUwMDNlZF9zYiktXFx1MDAzZW5zO1xcbiBcXG4tXFx0Zm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtXFx1MDAzZXBvcywgcG9zKTtcXG4rXFx0Zm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtXFx1MDAzZXBvcywgcG9zLCBOVUxMLCBOVUxMKTtcXG4gXFx0ICAgICBwb3M7XFxuLVxcdCAgICAgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtXFx1MDAzZXBvcywgcG9zKSkge1xcbi1cXHRcXHRjb25zdCBjaGFyICpuYW1lID0ga2VybmZzX3JjdV9uYW1lKHBvcyk7XFxuK1xcdCAgICAgcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtXFx1MDAzZXBvcywgcG9zLCBuYW1lKSkge1xcbiBcXHRcXHR1bnNpZ25lZCBpbnQgdHlwZSA9IGZzX3Vtb2RlX3RvX2R0eXBlKHBvcy1cXHUwMDNlbW9kZSk7XFxuLVxcdFxcdGludCBsZW4gPSBzdHJsZW4obmFtZSk7XFxuIFxcdFxcdGlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTtcXG4rXFx0XFx0aW50IGxlbjtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFRoZSBjb3B5IGlzIGFsc28gdGhlIHJlc3VtZSBrZXksIHNvIGEgdHJ1bmNhdGVkIG5hbWUgd291bGRcXG4rXFx0XFx0ICogcmVzdW1lIGhlcmUgYWdhaW4uICBnZXRuYW1lKCkgY2FwcyBhIHBhdGgsIHNvIG9ubHkgYW5cXG4rXFx0XFx0ICogaW4ta2VybmVsIGNhbGxlciBjYW4gZ2V0IGhlcmU7IGVuZCB0aGUgbGlzdGluZyBpbnN0ZWFkLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0bGVuID0gc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpO1xcbitcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGxlbiBcXHUwMDNjIDApKVxcbitcXHRcXHRcXHRicmVhaztcXG4gXFxuIFxcdFxcdGN0eC1cXHUwMDNlcG9zID0gcG9zLVxcdTAwM2VoYXNoO1xcbiBcXHRcXHRmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBwb3M7XFxuIFxcdFxcdGtlcm5mc19nZXQocG9zKTtcXG4gXFxuLVxcdFxcdGlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpIHtcXG4tXFx0XFx0XFx0dXBfcmVhZChcXHUwMDI2cm9vdC1cXHUwMDNla2VybmZzX3J3c2VtKTtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogZGlyX2VtaXQoKSBjYW4gZmF1bHQsIHNvIHJ1biBpdCB1bmxvY2tlZC4gIEBwb3MgaXMgcGlubmVkXFxuK1xcdFxcdCAqIGFib3ZlIGFuZCBrZXJuZnNfZGlyX3BvcygpIHJlY2hlY2tzIGl0IG9uIHRoZSB3YXkgYmFjay5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHVwX3JlYWQoXFx1MDAyNnJvb3QtXFx1MDAzZWtlcm5mc19yd3NlbSk7XFxuK1xcdFxcdGlmICghZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSkpXFxuIFxcdFxcdFxcdHJldHVybiAwO1xcbi1cXHRcXHR9XFxuK1xcdFxcdGRvd25fcmVhZChcXHUwMDI2cm9vdC1cXHUwMDNla2VybmZzX3J3c2VtKTtcXG4gXFx0fVxcbiBcXHR1cF9yZWFkKFxcdTAwMjZyb290LVxcdTAwM2VrZXJuZnNfcndzZW0pO1xcbiBcXHRmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBOVUxMO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuY1xcbmluZGV4IDZlNzRkYTkxZWJjYTUuLjAxY2Q1OGU1ZTQxZTcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmNcXG5AQCAtOCw2ICs4LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbWl0cy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbmV0L2lmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzY2hlZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc2lnbmFsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG5AQCAtMTcsNiArMTgsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL21vdW50LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvc29ja2V0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvc3RhdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N5c2NhbGwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3N5cy94YXR0ci5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImtzZWxmdGVzdF9oYXJuZXNzLmhcXFwiXFxuQEAgLTQ3Miw2ICs0NzQsMjA0IEBAIFRFU1RfRihrZXJuZnNfY2dyb3VwLCByZWFkZGlyX25vX2R1cGxpY2F0ZXMpXFxuIFxcdFxcdFxcdEVYUEVDVF9TVFJORShuYW1lc1tpXSwgbmFtZXNbal0pO1xcbiB9XFxuIFxcbisjZGVmaW5lIFJFU1VNRV9ESVJTXFx0MjRcXG4rXFxuKy8qXFxuKyAqIFJlc3VtaW5nIGF0IGFuIGVudHJ5IHRoYXQgaGFzIGdvbmUgbXVzdCBjYXJyeSBvbiBhZnRlciBpdCwgbmV2ZXIgYmVmb3JlLlxcbisgKiBUYWtlIGEgY29va2llIGZvciBldmVyeSBlbnRyeSwgdGhlbiByZW1vdmUgZWFjaCBvbmUsIHNlZWsgdG8gaXRzIGNvb2tpZVxcbisgKiBhbmQgcmVhZCB0aGUgcmVzdDsgbm90aGluZyBhbHJlYWR5IHJlcG9ydGVkIG1heSBjb21lIGJhY2suXFxuKyAqL1xcbitURVNUX0Yoa2VybmZzX2Nncm91cCwgcmVhZGRpcl9yZXN1bWVfYXRfcmVtb3ZlZF9lbnRyeSlcXG4re1xcbitcXHQvKiBUaGUgY2dyb3VwJ3Mgb3duIGNvbnRyb2wgZmlsZXMgYXJlIGxpc3RlZCBhbG9uZ3NpZGUgb3Vycy4gKi9cXG4rXFx0Y2hhciBuYW1lc1sxMjhdW05BTUVfTUFYICsgMV07XFxuK1xcdGxvbmcgcG9zWzEyOF07XFxuK1xcdGNoYXIgcGF0aFtQQVRIX01BWF07XFxuK1xcdHN0cnVjdCBkaXJlbnQgKmRlO1xcbitcXHRpbnQgbiA9IDAsIGksIGo7XFxuK1xcdERJUiAqZDtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBSRVNVTUVfRElSUzsgaSsrKSB7XFxuK1xcdFxcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXFxcIiVzL2UlMDJkXFxcIiwgc2VsZi1cXHUwMDNlc2NyYXRjaCwgaSk7XFxuK1xcdFxcdEFTU0VSVF9FUShta2RpcihwYXRoLCAwNzU1KSwgMCk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFJlY29yZCB0aGUgY29va2llIGJlZm9yZSByZWFkaW5nIGVhY2ggZW50cnksIHdpdGggaXRzIG5hbWUuICovXFxuK1xcdGQgPSBvcGVuZGlyKHNlbGYtXFx1MDAzZXNjcmF0Y2gpO1xcbitcXHRBU1NFUlRfTkUoZCwgTlVMTCk7XFxuK1xcdHdoaWxlICgxKSB7XFxuK1xcdFxcdGxvbmcgaGVyZSA9IHRlbGxkaXIoZCk7XFxuK1xcbitcXHRcXHRkZSA9IHJlYWRkaXIoZCk7XFxuK1xcdFxcdGlmICghZGUpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRpZiAoIXN0cmNtcChkZS1cXHUwMDNlZF9uYW1lLCBcXFwiLlxcXCIpIHx8ICFzdHJjbXAoZGUtXFx1MDAzZWRfbmFtZSwgXFxcIi4uXFxcIikpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRBU1NFUlRfTFQobiwgKGludClBUlJBWV9TSVpFKHBvcykpO1xcbitcXHRcXHRwb3Nbbl0gPSBoZXJlO1xcbitcXHRcXHRzdHJuY3B5KG5hbWVzW25dLCBkZS1cXHUwMDNlZF9uYW1lLCBOQU1FX01BWCk7XFxuK1xcdFxcdG5hbWVzW25dW05BTUVfTUFYXSA9ICdcXFxcMCc7XFxuK1xcdFxcdG4rKztcXG4rXFx0fVxcbitcXHRjbG9zZWRpcihkKTtcXG4rXFx0QVNTRVJUX0dUKG4sIDEpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKykge1xcbitcXHRcXHQvKiBPbmx5IHRoZSBkaXJlY3RvcmllcyB3ZSBtYWRlIGNhbiBiZSByZW1vdmVkIGFuZCBwdXQgYmFjay4gKi9cXG4rXFx0XFx0aWYgKHN0cm5jbXAobmFtZXNbaV0sIFxcXCJlXFxcIiwgMSkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXG4rXFx0XFx0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcXFwiJXMvJXNcXFwiLCBzZWxmLVxcdTAwM2VzY3JhdGNoLCBuYW1lc1tpXSk7XFxuK1xcdFxcdEFTU0VSVF9FUShybWRpcihwYXRoKSwgMCk7XFxuK1xcbitcXHRcXHQvKiBSZW9wZW4gc28gdGhlIHNlZWsgaGFzIHRvIHJlYWNoIHRoZSBrZXJuZWwuICovXFxuK1xcdFxcdGQgPSBvcGVuZGlyKHNlbGYtXFx1MDAzZXNjcmF0Y2gpO1xcbitcXHRcXHRBU1NFUlRfTkUoZCwgTlVMTCk7XFxuK1xcdFxcdHNlZWtkaXIoZCwgcG9zW2ldKTtcXG4rXFx0XFx0d2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpKSB7XFxuK1xcdFxcdFxcdGlmICghc3RyY21wKGRlLVxcdTAwM2VkX25hbWUsIFxcXCIuXFxcIikgfHwgIXN0cmNtcChkZS1cXHUwMDNlZF9uYW1lLCBcXFwiLi5cXFwiKSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGZvciAoaiA9IDA7IGogXFx1MDAzYyBpOyBqKyspXFxuK1xcdFxcdFxcdFxcdEFTU0VSVF9TVFJORShkZS1cXHUwMDNlZF9uYW1lLCBuYW1lc1tqXSlcXG4rXFx0XFx0XFx0XFx0XFx0VEhfTE9HKFxcXCJyZXN1bWluZyBhdCAlcyAoZ29uZSkgd2VudCBiYWNrIHRvICVzXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIG5hbWVzW2ldLCBuYW1lc1tqXSk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y2xvc2VkaXIoZCk7XFxuK1xcbitcXHRcXHRBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgUkVTVU1FX0RJUlM7IGkrKykge1xcbitcXHRcXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFxcXCIlcy9lJTAyZFxcXCIsIHNlbGYtXFx1MDAzZXNjcmF0Y2gsIGkpO1xcbitcXHRcXHRFWFBFQ1RfRVEocm1kaXIocGF0aCksIDApO1xcbitcXHR9XFxuK31cXG4rXFxuKyNkZWZpbmUgQ0hVUk5fUk9VTkRTXFx0NDAwXFxuKyNkZWZpbmUgQ0hVUk5fQlVGU1pcXHQ1MTJcXHQvKiBzbWFsbCwgc28gYSBsaXN0aW5nIHRha2VzIHNldmVyYWwgY2FsbHMgKi9cXG4rXFxuKy8qXFxuKyAqIFRoZSBmaWxlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZW5hYmxpbmcgd3JpdGUgYW5kIGdvIGF0IHRoZSBzdGFydCBvZlxcbisgKiB0aGUgZGlzYWJsaW5nIG9uZSwgc28gdGhlIHdpbmRvdyB3aGVyZSB0aGV5IGV4aXN0IGlzIHRoZSBzaG9ydCBvbmUuXFxuKyAqL1xcbisjZGVmaW5lIENIVVJOX0RXRUxMX09OXFx0MjAwMFxcbisjZGVmaW5lIENIVVJOX0RXRUxMX09GRlxcdDIwMFxcbitcXG4rc3RydWN0IGtlcm5mc19kaXJlbnQ2NCB7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbG9uZ1xcdGRfaW5vO1xcbitcXHRsb25nIGxvbmdcXHRcXHRkX29mZjtcXG4rXFx0dW5zaWduZWQgc2hvcnRcXHRcXHRkX3JlY2xlbjtcXG4rXFx0dW5zaWduZWQgY2hhclxcdFxcdGRfdHlwZTtcXG4rXFx0Y2hhclxcdFxcdFxcdGRfbmFtZVtdO1xcbit9O1xcbitcXG4rLypcXG4rICogVGhlIHNhbWUgcmVzdW1lLCBidXQgaW5zaWRlIG9uZSBnZXRkZW50cygyKSBjYWxsLiAgcm1kaXIoMikgY2Fubm90IHJlYWNoXFxuKyAqIHRoYXQgd2luZG93IGJlY2F1c2UgaXRlcmF0ZV9kaXIoKSBob2xkcyB0aGUgbGlzdGVkIGRpcmVjdG9yeSdzIGlfcndzZW1cXG4rICogZm9yIHRoZSB3aG9sZSBsaXN0aW5nOyBjZ3JvdXAuc3VidHJlZV9jb250cm9sIGNhbiwgaGF2aW5nIG5vIFZGU1xcbisgKiBvcGVyYXRpb24gb24gdGhlIG5hbWVzIGl0IGFkZHMgYW5kIHJlbW92ZXMuICBUaGUgZmlsZXMgdGhhdCBhcmUgbm90IHRoZVxcbisgKiBjb250cm9sbGVyJ3Mgc3RheSB0aHJvdWdob3V0LCBzbyBlYWNoIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS5cXG4rICpcXG4rICogQSBzdHJlc3MgdGVzdDogaXQgaGFzIG5vdCBiZWVuIHNlZW4gdG8gY2F0Y2ggdGhlIG9yZGVyaW5nIGJ1ZywgYW5kIGlzXFxuKyAqIGhlcmUgdG8ga2VlcCB0aGUgdW5sb2NrZWQgd2luZG93IHVuZGVyIGxvYWQgZm9yIGxvY2tkZXAgYW5kIEtBU0FOLlxcbisgKi9cXG4rVEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX3ZzX2ludGVybmFsX3JlbW92ZSlcXG4re1xcbitcXHRjaGFyIGJ1ZltDSFVSTl9CVUZTWl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpO1xcbitcXHRjaGFyIHN0YWJsZVsxMjhdW05BTUVfTUFYICsgMV07XFxuK1xcdGludCBuc3RhYmxlID0gMCwgaSwgcjtcXG4rXFx0aW50IHdpdGhjdGwgPSAwLCB3aXRob3V0ID0gMDtcXG4rXFx0aW50IHNlZW5bMTI4XSwgc3RhdHVzO1xcbitcXHRwaWRfdCBjaHVybmVyO1xcbitcXHRESVIgKmQ7XFxuK1xcbitcXHQvKiBXaXRoIHRoZSBjb250cm9sbGVyIG9mZiwgd2hhdGV2ZXIgaXMgbGVmdCBpcyB3aGF0IG11c3QgcGVyc2lzdC4gKi9cXG4rXFx0QVNTRVJUX0VRKHdyaXRlX2ZpbGUoc2VsZi1cXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cXHUwMDNlZGlzYWJsZSksIDApO1xcbitcXHRkID0gb3BlbmRpcihzZWxmLVxcdTAwM2VjaGlsZCk7XFxuK1xcdEFTU0VSVF9ORShkLCBOVUxMKTtcXG4rXFx0Zm9yICg7Oykge1xcbitcXHRcXHRzdHJ1Y3QgZGlyZW50ICpkZSA9IHJlYWRkaXIoZCk7XFxuK1xcbitcXHRcXHRpZiAoIWRlKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0aWYgKCFzdHJjbXAoZGUtXFx1MDAzZWRfbmFtZSwgXFxcIi5cXFwiKSB8fCAhc3RyY21wKGRlLVxcdTAwM2VkX25hbWUsIFxcXCIuLlxcXCIpKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0QVNTRVJUX0xUKG5zdGFibGUsIChpbnQpQVJSQVlfU0laRShzdGFibGUpKTtcXG4rXFx0XFx0c3RybmNweShzdGFibGVbbnN0YWJsZV0sIGRlLVxcdTAwM2VkX25hbWUsIE5BTUVfTUFYKTtcXG4rXFx0XFx0c3RhYmxlW25zdGFibGVdW05BTUVfTUFYXSA9ICdcXFxcMCc7XFxuK1xcdFxcdG5zdGFibGUrKztcXG4rXFx0fVxcbitcXHRjbG9zZWRpcihkKTtcXG4rXFx0QVNTRVJUX0dUKG5zdGFibGUsIDApO1xcbitcXG4rXFx0Y2h1cm5lciA9IGZvcmsoKTtcXG4rXFx0QVNTRVJUX0dFKGNodXJuZXIsIDApO1xcbitcXHRpZiAoY2h1cm5lciA9PSAwKSB7XFxuK1xcdFxcdGZvciAoOzspIHtcXG4rXFx0XFx0XFx0aWYgKHdyaXRlX2ZpbGUoc2VsZi1cXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cXHUwMDNlZW5hYmxlKSlcXG4rXFx0XFx0XFx0XFx0X2V4aXQoMTApO1xcbitcXHRcXHRcXHR1c2xlZXAoQ0hVUk5fRFdFTExfT04pO1xcbitcXHRcXHRcXHRpZiAod3JpdGVfZmlsZShzZWxmLVxcdTAwM2VzY3JhdGNoX3NjLCBzZWxmLVxcdTAwM2VkaXNhYmxlKSlcXG4rXFx0XFx0XFx0XFx0X2V4aXQoMTEpO1xcbitcXHRcXHRcXHR1c2xlZXAoQ0hVUk5fRFdFTExfT0ZGKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRmb3IgKHIgPSAwOyByIFxcdTAwM2MgQ0hVUk5fUk9VTkRTOyByKyspIHtcXG4rXFx0XFx0aW50IGZkID0gb3BlbihzZWxmLVxcdTAwM2VjaGlsZCwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSk7XFxuK1xcdFxcdGludCBleHRyYSA9IDA7XFxuK1xcdFxcdGludCBuO1xcbitcXG4rXFx0XFx0QVNTRVJUX0dFKGZkLCAwKTtcXG4rXFx0XFx0bWVtc2V0KHNlZW4sIDAsIHNpemVvZihzZWVuKSk7XFxuK1xcbitcXHRcXHR3aGlsZSAoKG4gPSBzeXNjYWxsKFNZU19nZXRkZW50czY0LCBmZCwgYnVmLCBzaXplb2YoYnVmKSkpIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRpbnQgb2ZmID0gMDtcXG4rXFxuK1xcdFxcdFxcdHdoaWxlIChvZmYgXFx1MDAzYyBuKSB7XFxuK1xcdFxcdFxcdFxcdHN0cnVjdCBrZXJuZnNfZGlyZW50NjQgKmRlID0gKHZvaWQgKikoYnVmICsgb2ZmKTtcXG4rXFx0XFx0XFx0XFx0Ym9vbCBrbm93biA9IGZhbHNlO1xcbitcXG4rXFx0XFx0XFx0XFx0b2ZmICs9IGRlLVxcdTAwM2VkX3JlY2xlbjtcXG4rXFx0XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5zdGFibGU7IGkrKylcXG4rXFx0XFx0XFx0XFx0XFx0aWYgKCFzdHJjbXAoZGUtXFx1MDAzZWRfbmFtZSwgc3RhYmxlW2ldKSkge1xcbitcXHRcXHRcXHRcXHRcXHRcXHRzZWVuW2ldKys7XFxuK1xcdFxcdFxcdFxcdFxcdFxcdGtub3duID0gdHJ1ZTtcXG4rXFx0XFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHRcXHRpZiAoIWtub3duIFxcdTAwMjZcXHUwMDI2IHN0cmNtcChkZS1cXHUwMDNlZF9uYW1lLCBcXFwiLlxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdFxcdCAgICBzdHJjbXAoZGUtXFx1MDAzZWRfbmFtZSwgXFxcIi4uXFxcIikpXFxuK1xcdFxcdFxcdFxcdFxcdGV4dHJhKys7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHRcXHRBU1NFUlRfR0UobiwgMCk7XFxuK1xcdFxcdEVYUEVDVF9FUShjbG9zZShmZCksIDApO1xcbitcXG4rXFx0XFx0aWYgKGV4dHJhKVxcbitcXHRcXHRcXHR3aXRoY3RsKys7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0d2l0aG91dCsrO1xcbitcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5zdGFibGU7IGkrKylcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKHNlZW5baV0sIDEpXFxuK1xcdFxcdFxcdFxcdFRIX0xPRyhcXFwicm91bmQgJWQ6ICVzIHNlZW4gJWQgdGltZXNcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICAgciwgc3RhYmxlW2ldLCBzZWVuW2ldKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogVGhlIGNodXJuIG11c3QgaGF2ZSBiZWVuIHJ1bm5pbmcsIG9yIHRoZSBsaXN0aW5ncyBwcm92ZSBub3RoaW5nLiAqL1xcbitcXHRFWFBFQ1RfRVEoa2lsbChjaHVybmVyLCBTSUdLSUxMKSwgMCk7XFxuK1xcdEFTU0VSVF9FUSh3YWl0cGlkKGNodXJuZXIsIFxcdTAwMjZzdGF0dXMsIDApLCBjaHVybmVyKTtcXG4rXFx0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSBcXHUwMDI2XFx1MDAyNiBXVEVSTVNJRyhzdGF0dXMpID09IFNJR0tJTEwpXFxuK1xcdFxcdFRIX0xPRyhcXFwiY2h1cm5lciBleGl0ZWQgb24gaXRzIG93bjogc3RhdHVzICVkXFxcIiwgc3RhdHVzKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZXkgYWxzbyBoYXZlIHRvIGhhdmUgb3ZlcmxhcHBlZCBpdC4gIEhvdyBtdWNoIGRlcGVuZHMgb24gdGhlXFxuK1xcdCAqIG1hY2hpbmUsIHNvIHNheSB0aGUgcmFjZSBjb3VsZCBub3QgYmUgYXJyYW5nZWQgcmF0aGVyIHRoYW4gZmFpbC5cXG4rXFx0ICovXFxuK1xcdGlmICghd2l0aGN0bCB8fCAhd2l0aG91dClcXG4rXFx0XFx0U0tJUChyZXR1cm4sIFxcXCJsaXN0aW5ncyBkaWQgbm90IHNwYW4gdGhlIGNodXJuOiAlZCB3aXRoLCAlZCB3aXRob3V0XFxcIixcXG4rXFx0XFx0ICAgICB3aXRoY3RsLCB3aXRob3V0KTtcXG4rfVxcbitcXG4gLypcXG4gICogQSB0ZWxsZGlyKCkgY29va2llIG11c3QgcmVzb2x2ZSBiYWNrIHRvIHRoZSBzYW1lIGVudHJ5IGFmdGVyIHNlZWtkaXIoKS5cXG4gICoga2VybmZzIGVuY29kZXMgdGhlIGNvb2tpZSBhcyB0aGUgbm9kZSdzIG5hbWUgaGFzaCwgc28gdGhpcyBjb3ZlcnNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzE6NDMuMjYwNTgwNjAyWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo0NzkwNjg3MTg5OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLRVJORlNcIixcbiAgICBcIlNZU0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwia2VybmZzX2ZvcF9yZWFkZGlyXCIsXG4gICAgXCJrZXJuZnNfZGlyX3Bvc1wiLFxuICAgIFwia2VybmZzX2Rpcl9uZXh0X3Bvc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGtlcm5mcyBkaXJlY3RvcnkgbGlzdGluZyAocmVhZGRpciAvIGdldGRlbnRzKSBhbmQgcmVzdW1lIHRyYXZlcnNhbCBsb2dpYyBpbiBmcy9rZXJuZnMvZGlyLmMuIFNwZWNpZmljYWxseSwgaXQgdXBkYXRlcyBrZXJuZnNfZGlyX3BvcyBhbmQga2VybmZzX2Rpcl9uZXh0X3BvcyB0byByZXN1bWUgcmVhZGRpciBiYXNlZCBvbiBlbnRyeSBuYW1lIGNvbXBhcmlzb24gd2l0aGluIHRoZSByYi10cmVlLCBhZGRzIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSByZXN1bWUga2V5IG5hbWUsIGludHJvZHVjZXMgYSBXQVJOX09OX09OQ0UgY2hlY2sgb24gbmFtZSB0cnVuY2F0aW9uLCBhbmQgcmVsZWFzZXMvcmVhY3F1aXJlcyByb290LVxcdTAwM2VrZXJuZnNfcndzZW0gYXJvdW5kIGRpcl9lbWl0KCkuIFRoZXNlIGNoYW5nZXMgdG91Y2ggcmVhY2hhYmxlIGNvcmUgdmlydHVhbCBmaWxlc3lzdGVtIGNvZGUgZXhlcmNpc2VkIGJ5IHVzZXIgc3BhY2UgdmlhIGdldGRlbnRzL2dldGRlbnRzNjQgb24gc3lzZnMgYW5kIGNncm91cHMsIGludHJvZHVjaW5nIGNvbmN1cnJlbmN5IHdpbmRvd3MgYW5kIG1vZGlmaWVkIGxvY2tpbmcgc2VtYW50aWNzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGU1NTgwMjBlYWJhNjA1ZjYwODE3ZDU0ZDQ5NzFlY2RmMWNiNDUxZjBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAxODozMTo0MSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9kaXIuYyBiL2ZzL2tlcm5mcy9kaXIuY1xuaW5kZXggMDdhYmY1OWYwMjY0YS4uY2M2Mjg4ZDViNGNjNCAxMDA2NDRcbi0tLSBhL2ZzL2tlcm5mcy9kaXIuY1xuKysrIGIvZnMva2VybmZzL2Rpci5jXG5AQCAtMTkwMywzMyArMTkwMyw0OSBAQCBzdGF0aWMgaW50IGtlcm5mc19kaXJfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rLypcbisgKiBGaW5kIHdoZXJlIGEgbGlzdGluZyBsZWZ0IG9mZi4gIEByZXN1bWVkIHNheXMgd2hldGhlciBAcG9zIGlzIHN0aWxsIHRoYXRcbisgKiBlbnRyeTsgaWYgbm90LCB0aGUgc2VhcmNoIGZhbGxzIGJhY2sgdG8gQGhhc2gsIGtleWVkIGJ5IEBuYW1lIGlmIGdpdmVuLlxuKyAqL1xuIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcylcbitcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXG4rXHRjb25zdCBjaGFyICpuYW1lLCBib29sICpyZXN1bWVkKVxuIHtcbitcdGlmIChyZXN1bWVkKVxuK1x0XHQqcmVzdW1lZCA9IGZhbHNlO1xuIFx0aWYgKHBvcykge1xuK1x0XHQvKlxuK1x0XHQgKiBBIHJlbmFtZSBrZWVwcyB0aGUgaGFzaCBpZiB0aGUgbmV3IG5hbWUgaGFzaGVzIHRoZSBzYW1lLCBzb1xuK1x0XHQgKiBjaGVjayBAbmFtZSB0b28uICBPdGhlcndpc2UgdGhlIGNhbGxlciB3b3VsZCBzdGVwIG92ZXIgdGhlXG4rXHRcdCAqIGVudHJ5IG5vdyBzaXR0aW5nIHdoZXJlIEBwb3MgdXNlZCB0byBiZS5cbitcdFx0ICovXG4gXHRcdGludCB2YWxpZCA9IGtlcm5mc19hY3RpdmUocG9zKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHRyY3VfYWNjZXNzX3BvaW50ZXIocG9zLVx1MDAzZV9fcGFyZW50KSA9PSBwYXJlbnQgXHUwMDI2XHUwMDI2XG4tXHRcdFx0aGFzaCA9PSBwb3MtXHUwMDNlaGFzaDtcbitcdFx0XHRoYXNoID09IHBvcy1cdTAwM2VoYXNoIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCghbmFtZSB8fCAhc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpKSk7XG4gXHRcdGtlcm5mc19wdXQocG9zKTtcbiBcdFx0aWYgKCF2YWxpZClcbiBcdFx0XHRwb3MgPSBOVUxMO1xuK1x0XHRlbHNlIGlmIChyZXN1bWVkKVxuK1x0XHRcdCpyZXN1bWVkID0gdHJ1ZTtcbiBcdH1cbiBcdGlmICghcG9zIFx1MDAyNlx1MDAyNiAoaGFzaCBcdTAwM2UgMSkgXHUwMDI2XHUwMDI2IChoYXNoIFx1MDAzYyBJTlRfTUFYKSkge1xuIFx0XHRzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHBhcmVudC1cdTAwM2VkaXIuY2hpbGRyZW4ucmJfbm9kZTtcbi1cdFx0dTY0IG5zX2lkID0ga2VybmZzX25zX2lkKG5zKTtcbitcbitcdFx0LypcbitcdFx0ICogS2VlcCBhIG5vZGUgb25seSBvbiB0aGUgd2F5IGxlZnQsIHNvIHRoZSBzZWFyY2ggZW5kcyBvbiB0aGVcbitcdFx0ICogZmlyc3QgZW50cnkgYWZ0ZXIgdGhlIGtleS4gIEFuIGVtcHR5IEBuYW1lIHNvcnRzIGJlZm9yZSBhbGxcbitcdFx0ICogZW50cmllcyBzaGFyaW5nIHRoZSBoYXNoLCBzbyBpdCBsYW5kcyBvbiB0aGUgZmlyc3Qgb2YgdGhlbS5cbitcdFx0ICovXG4gXHRcdHdoaWxlIChub2RlKSB7XG4tXHRcdFx0cG9zID0gcmJfdG9fa24obm9kZSk7XG4rXHRcdFx0c3RydWN0IGtlcm5mc19ub2RlICprbiA9IHJiX3RvX2tuKG5vZGUpO1xuIFxuLVx0XHRcdGlmIChoYXNoIFx1MDAzYyBwb3MtXHUwMDNlaGFzaClcbi1cdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4tXHRcdFx0ZWxzZSBpZiAoaGFzaCBcdTAwM2UgcG9zLVx1MDAzZWhhc2gpXG4tXHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9yaWdodDtcbi1cdFx0XHRlbHNlIGlmIChuc19pZCBcdTAwM2Mga2VybmZzX25zX2lkKHBvcy1cdTAwM2VucykpXG4rXHRcdFx0aWYgKGtlcm5mc19uYW1lX2NvbXBhcmUoaGFzaCwgbmFtZSA/OiBcIlwiLCBucywga24pIFx1MDAzYyAwKSB7XG4rXHRcdFx0XHRwb3MgPSBrbjtcbiBcdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4tXHRcdFx0ZWxzZSBpZiAobnNfaWQgXHUwMDNlIGtlcm5mc19uc19pZChwb3MtXHUwMDNlbnMpKVxuK1x0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9yaWdodDtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRicmVhaztcbitcdFx0XHR9XG4gXHRcdH1cbiBcdH1cbiBcdC8qIFNraXAgb3ZlciBlbnRyaWVzIHdoaWNoIGFyZSBkeWluZy9kZWFkIG9yIGluIHRoZSB3cm9uZyBuYW1lc3BhY2UgKi9cbkBAIC0xOTQ1LDEwICsxOTYxLDE0IEBAIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGlub190IGlubywgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpXG4rXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxuK1x0Y29uc3QgY2hhciAqbmFtZSlcbiB7XG4tXHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBpbm8sIHBvcyk7XG4tXHRpZiAocG9zKSB7XG4rXHRib29sIHJlc3VtZWQ7XG4rXG4rXHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIG5hbWUsIFx1MDAyNnJlc3VtZWQpO1xuK1x0LyogU3RlcCBvdmVyIEBwb3Mgb25seSBpZiBpdCBzdXJ2aXZlZDsgQG5hbWUgZmluZHMgdGhlIHNwb3QgaWYgbm90LiAqL1xuK1x0aWYgKHBvcyBcdTAwMjZcdTAwMjYgcmVzdW1lZCkge1xuIFx0XHRkbyB7XG4gXHRcdFx0c3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KFx1MDAyNnBvcy1cdTAwM2VyYik7XG4gXHRcdFx0aWYgKCFub2RlKVxuQEAgLTE5NjYsMzQgKzE5ODYsNTUgQEAgc3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuIFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS1cdTAwM2VmX3BhdGguZGVudHJ5O1xuIFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTtcbiBcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4rXHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuIFx0c3RydWN0IGtlcm5mc19yb290ICpyb290O1xuIFx0Y29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMO1xuIFxuIFx0aWYgKCFkaXJfZW1pdF9kb3RzKGZpbGUsIGN0eCkpXG4gXHRcdHJldHVybiAwO1xuIFxuK1x0LypcbitcdCAqIE9uZSBidWZmZXIgZm9yIHRoZSBjYWxsLCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGUgbGlzdGluZ1xuK1x0ICogaXMgb24uICBQQVRIX01BWDoga2VybmZzIGJvdW5kcyBubyBzaW5nbGUgbmFtZS5cbitcdCAqL1xuK1x0bmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpO1xuK1x0aWYgKCFuYW1lKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbiBcdHJvb3QgPSBrZXJuZnNfcm9vdChwYXJlbnQpO1xuIFx0ZG93bl9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbiBcbiBcdGlmIChrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpKVxuIFx0XHRucyA9IGtlcm5mc19pbmZvKGRlbnRyeS1cdTAwM2VkX3NiKS1cdTAwM2VucztcbiBcbi1cdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zKTtcbitcdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBOVUxMLCBOVUxMKTtcbiBcdCAgICAgcG9zO1xuLVx0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcykpIHtcbi1cdFx0Y29uc3QgY2hhciAqbmFtZSA9IGtlcm5mc19yY3VfbmFtZShwb3MpO1xuK1x0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcywgbmFtZSkpIHtcbiBcdFx0dW5zaWduZWQgaW50IHR5cGUgPSBmc191bW9kZV90b19kdHlwZShwb3MtXHUwMDNlbW9kZSk7XG4tXHRcdGludCBsZW4gPSBzdHJsZW4obmFtZSk7XG4gXHRcdGlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTtcbitcdFx0aW50IGxlbjtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIGNvcHkgaXMgYWxzbyB0aGUgcmVzdW1lIGtleSwgc28gYSB0cnVuY2F0ZWQgbmFtZSB3b3VsZFxuK1x0XHQgKiByZXN1bWUgaGVyZSBhZ2Fpbi4gIGdldG5hbWUoKSBjYXBzIGEgcGF0aCwgc28gb25seSBhblxuK1x0XHQgKiBpbi1rZXJuZWwgY2FsbGVyIGNhbiBnZXQgaGVyZTsgZW5kIHRoZSBsaXN0aW5nIGluc3RlYWQuXG4rXHRcdCAqL1xuK1x0XHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XG4rXHRcdGlmIChXQVJOX09OX09OQ0UobGVuIFx1MDAzYyAwKSlcbitcdFx0XHRicmVhaztcbiBcbiBcdFx0Y3R4LVx1MDAzZXBvcyA9IHBvcy1cdTAwM2VoYXNoO1xuIFx0XHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IHBvcztcbiBcdFx0a2VybmZzX2dldChwb3MpO1xuIFxuLVx0XHRpZiAoIWRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpKSB7XG4tXHRcdFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4rXHRcdC8qXG4rXHRcdCAqIGRpcl9lbWl0KCkgY2FuIGZhdWx0LCBzbyBydW4gaXQgdW5sb2NrZWQuICBAcG9zIGlzIHBpbm5lZFxuK1x0XHQgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suXG4rXHRcdCAqL1xuK1x0XHR1cF9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbitcdFx0aWYgKCFkaXJfZW1pdChjdHgsIG5hbWUsIGxlbiwgaW5vLCB0eXBlKSlcbiBcdFx0XHRyZXR1cm4gMDtcbi1cdFx0fVxuK1x0XHRkb3duX3JlYWQoXHUwMDI2cm9vdC1cdTAwM2VrZXJuZnNfcndzZW0pO1xuIFx0fVxuIFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4gXHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IE5VTEw7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmNcbmluZGV4IDZlNzRkYTkxZWJjYTUuLjAxY2Q1OGU1ZTQxZTcgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG5AQCAtOCw2ICs4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9pZi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc2NoZWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbkBAIC0xNyw2ICsxOCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3lzL21vdW50LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N5c2NhbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy94YXR0ci5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCJrc2VsZnRlc3RfaGFybmVzcy5oXCJcbkBAIC00NzIsNiArNDc0LDIwNCBAQCBURVNUX0Yoa2VybmZzX2Nncm91cCwgcmVhZGRpcl9ub19kdXBsaWNhdGVzKVxuIFx0XHRcdEVYUEVDVF9TVFJORShuYW1lc1tpXSwgbmFtZXNbal0pO1xuIH1cbiBcbisjZGVmaW5lIFJFU1VNRV9ESVJTXHQyNFxuK1xuKy8qXG4rICogUmVzdW1pbmcgYXQgYW4gZW50cnkgdGhhdCBoYXMgZ29uZSBtdXN0IGNhcnJ5IG9uIGFmdGVyIGl0LCBuZXZlciBiZWZvcmUuXG4rICogVGFrZSBhIGNvb2tpZSBmb3IgZXZlcnkgZW50cnksIHRoZW4gcmVtb3ZlIGVhY2ggb25lLCBzZWVrIHRvIGl0cyBjb29raWVcbisgKiBhbmQgcmVhZCB0aGUgcmVzdDsgbm90aGluZyBhbHJlYWR5IHJlcG9ydGVkIG1heSBjb21lIGJhY2suXG4rICovXG4rVEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX2F0X3JlbW92ZWRfZW50cnkpXG4re1xuK1x0LyogVGhlIGNncm91cCdzIG93biBjb250cm9sIGZpbGVzIGFyZSBsaXN0ZWQgYWxvbmdzaWRlIG91cnMuICovXG4rXHRjaGFyIG5hbWVzWzEyOF1bTkFNRV9NQVggKyAxXTtcbitcdGxvbmcgcG9zWzEyOF07XG4rXHRjaGFyIHBhdGhbUEFUSF9NQVhdO1xuK1x0c3RydWN0IGRpcmVudCAqZGU7XG4rXHRpbnQgbiA9IDAsIGksIGo7XG4rXHRESVIgKmQ7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRVNVTUVfRElSUzsgaSsrKSB7XG4rXHRcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCIlcy9lJTAyZFwiLCBzZWxmLVx1MDAzZXNjcmF0Y2gsIGkpO1xuK1x0XHRBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApO1xuK1x0fVxuK1xuK1x0LyogUmVjb3JkIHRoZSBjb29raWUgYmVmb3JlIHJlYWRpbmcgZWFjaCBlbnRyeSwgd2l0aCBpdHMgbmFtZS4gKi9cbitcdGQgPSBvcGVuZGlyKHNlbGYtXHUwMDNlc2NyYXRjaCk7XG4rXHRBU1NFUlRfTkUoZCwgTlVMTCk7XG4rXHR3aGlsZSAoMSkge1xuK1x0XHRsb25nIGhlcmUgPSB0ZWxsZGlyKGQpO1xuK1xuK1x0XHRkZSA9IHJlYWRkaXIoZCk7XG4rXHRcdGlmICghZGUpXG4rXHRcdFx0YnJlYWs7XG4rXHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuXCIpIHx8ICFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi4uXCIpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRBU1NFUlRfTFQobiwgKGludClBUlJBWV9TSVpFKHBvcykpO1xuK1x0XHRwb3Nbbl0gPSBoZXJlO1xuK1x0XHRzdHJuY3B5KG5hbWVzW25dLCBkZS1cdTAwM2VkX25hbWUsIE5BTUVfTUFYKTtcbitcdFx0bmFtZXNbbl1bTkFNRV9NQVhdID0gJ1xcMCc7XG4rXHRcdG4rKztcbitcdH1cbitcdGNsb3NlZGlyKGQpO1xuK1x0QVNTRVJUX0dUKG4sIDEpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKSB7XG4rXHRcdC8qIE9ubHkgdGhlIGRpcmVjdG9yaWVzIHdlIG1hZGUgY2FuIGJlIHJlbW92ZWQgYW5kIHB1dCBiYWNrLiAqL1xuK1x0XHRpZiAoc3RybmNtcChuYW1lc1tpXSwgXCJlXCIsIDEpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwiJXMvJXNcIiwgc2VsZi1cdTAwM2VzY3JhdGNoLCBuYW1lc1tpXSk7XG4rXHRcdEFTU0VSVF9FUShybWRpcihwYXRoKSwgMCk7XG4rXG4rXHRcdC8qIFJlb3BlbiBzbyB0aGUgc2VlayBoYXMgdG8gcmVhY2ggdGhlIGtlcm5lbC4gKi9cbitcdFx0ZCA9IG9wZW5kaXIoc2VsZi1cdTAwM2VzY3JhdGNoKTtcbitcdFx0QVNTRVJUX05FKGQsIE5VTEwpO1xuK1x0XHRzZWVrZGlyKGQsIHBvc1tpXSk7XG4rXHRcdHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkge1xuK1x0XHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuXCIpIHx8ICFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi4uXCIpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgaTsgaisrKVxuK1x0XHRcdFx0QVNTRVJUX1NUUk5FKGRlLVx1MDAzZWRfbmFtZSwgbmFtZXNbal0pXG4rXHRcdFx0XHRcdFRIX0xPRyhcInJlc3VtaW5nIGF0ICVzIChnb25lKSB3ZW50IGJhY2sgdG8gJXNcIixcbitcdFx0XHRcdFx0ICAgICAgIG5hbWVzW2ldLCBuYW1lc1tqXSk7XG4rXHRcdH1cbitcdFx0Y2xvc2VkaXIoZCk7XG4rXG4rXHRcdEFTU0VSVF9FUShta2RpcihwYXRoLCAwNzU1KSwgMCk7XG4rXHR9XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRVNVTUVfRElSUzsgaSsrKSB7XG4rXHRcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCIlcy9lJTAyZFwiLCBzZWxmLVx1MDAzZXNjcmF0Y2gsIGkpO1xuK1x0XHRFWFBFQ1RfRVEocm1kaXIocGF0aCksIDApO1xuK1x0fVxuK31cbitcbisjZGVmaW5lIENIVVJOX1JPVU5EU1x0NDAwXG4rI2RlZmluZSBDSFVSTl9CVUZTWlx0NTEyXHQvKiBzbWFsbCwgc28gYSBsaXN0aW5nIHRha2VzIHNldmVyYWwgY2FsbHMgKi9cbitcbisvKlxuKyAqIFRoZSBmaWxlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZW5hYmxpbmcgd3JpdGUgYW5kIGdvIGF0IHRoZSBzdGFydCBvZlxuKyAqIHRoZSBkaXNhYmxpbmcgb25lLCBzbyB0aGUgd2luZG93IHdoZXJlIHRoZXkgZXhpc3QgaXMgdGhlIHNob3J0IG9uZS5cbisgKi9cbisjZGVmaW5lIENIVVJOX0RXRUxMX09OXHQyMDAwXG4rI2RlZmluZSBDSFVSTl9EV0VMTF9PRkZcdDIwMFxuK1xuK3N0cnVjdCBrZXJuZnNfZGlyZW50NjQge1xuK1x0dW5zaWduZWQgbG9uZyBsb25nXHRkX2lubztcbitcdGxvbmcgbG9uZ1x0XHRkX29mZjtcbitcdHVuc2lnbmVkIHNob3J0XHRcdGRfcmVjbGVuO1xuK1x0dW5zaWduZWQgY2hhclx0XHRkX3R5cGU7XG4rXHRjaGFyXHRcdFx0ZF9uYW1lW107XG4rfTtcbitcbisvKlxuKyAqIFRoZSBzYW1lIHJlc3VtZSwgYnV0IGluc2lkZSBvbmUgZ2V0ZGVudHMoMikgY2FsbC4gIHJtZGlyKDIpIGNhbm5vdCByZWFjaFxuKyAqIHRoYXQgd2luZG93IGJlY2F1c2UgaXRlcmF0ZV9kaXIoKSBob2xkcyB0aGUgbGlzdGVkIGRpcmVjdG9yeSdzIGlfcndzZW1cbisgKiBmb3IgdGhlIHdob2xlIGxpc3Rpbmc7IGNncm91cC5zdWJ0cmVlX2NvbnRyb2wgY2FuLCBoYXZpbmcgbm8gVkZTXG4rICogb3BlcmF0aW9uIG9uIHRoZSBuYW1lcyBpdCBhZGRzIGFuZCByZW1vdmVzLiAgVGhlIGZpbGVzIHRoYXQgYXJlIG5vdCB0aGVcbisgKiBjb250cm9sbGVyJ3Mgc3RheSB0aHJvdWdob3V0LCBzbyBlYWNoIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS5cbisgKlxuKyAqIEEgc3RyZXNzIHRlc3Q6IGl0IGhhcyBub3QgYmVlbiBzZWVuIHRvIGNhdGNoIHRoZSBvcmRlcmluZyBidWcsIGFuZCBpc1xuKyAqIGhlcmUgdG8ga2VlcCB0aGUgdW5sb2NrZWQgd2luZG93IHVuZGVyIGxvYWQgZm9yIGxvY2tkZXAgYW5kIEtBU0FOLlxuKyAqL1xuK1RFU1RfRihrZXJuZnNfY2dyb3VwLCByZWFkZGlyX3Jlc3VtZV92c19pbnRlcm5hbF9yZW1vdmUpXG4re1xuK1x0Y2hhciBidWZbQ0hVUk5fQlVGU1pdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcbitcdGNoYXIgc3RhYmxlWzEyOF1bTkFNRV9NQVggKyAxXTtcbitcdGludCBuc3RhYmxlID0gMCwgaSwgcjtcbitcdGludCB3aXRoY3RsID0gMCwgd2l0aG91dCA9IDA7XG4rXHRpbnQgc2VlblsxMjhdLCBzdGF0dXM7XG4rXHRwaWRfdCBjaHVybmVyO1xuK1x0RElSICpkO1xuK1xuK1x0LyogV2l0aCB0aGUgY29udHJvbGxlciBvZmYsIHdoYXRldmVyIGlzIGxlZnQgaXMgd2hhdCBtdXN0IHBlcnNpc3QuICovXG4rXHRBU1NFUlRfRVEod3JpdGVfZmlsZShzZWxmLVx1MDAzZXNjcmF0Y2hfc2MsIHNlbGYtXHUwMDNlZGlzYWJsZSksIDApO1xuK1x0ZCA9IG9wZW5kaXIoc2VsZi1cdTAwM2VjaGlsZCk7XG4rXHRBU1NFUlRfTkUoZCwgTlVMTCk7XG4rXHRmb3IgKDs7KSB7XG4rXHRcdHN0cnVjdCBkaXJlbnQgKmRlID0gcmVhZGRpcihkKTtcbitcbitcdFx0aWYgKCFkZSlcbitcdFx0XHRicmVhaztcbitcdFx0aWYgKCFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi5cIikgfHwgIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIFwiLi5cIikpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdEFTU0VSVF9MVChuc3RhYmxlLCAoaW50KUFSUkFZX1NJWkUoc3RhYmxlKSk7XG4rXHRcdHN0cm5jcHkoc3RhYmxlW25zdGFibGVdLCBkZS1cdTAwM2VkX25hbWUsIE5BTUVfTUFYKTtcbitcdFx0c3RhYmxlW25zdGFibGVdW05BTUVfTUFYXSA9ICdcXDAnO1xuK1x0XHRuc3RhYmxlKys7XG4rXHR9XG4rXHRjbG9zZWRpcihkKTtcbitcdEFTU0VSVF9HVChuc3RhYmxlLCAwKTtcbitcbitcdGNodXJuZXIgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UoY2h1cm5lciwgMCk7XG4rXHRpZiAoY2h1cm5lciA9PSAwKSB7XG4rXHRcdGZvciAoOzspIHtcbitcdFx0XHRpZiAod3JpdGVfZmlsZShzZWxmLVx1MDAzZXNjcmF0Y2hfc2MsIHNlbGYtXHUwMDNlZW5hYmxlKSlcbitcdFx0XHRcdF9leGl0KDEwKTtcbitcdFx0XHR1c2xlZXAoQ0hVUk5fRFdFTExfT04pO1xuK1x0XHRcdGlmICh3cml0ZV9maWxlKHNlbGYtXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cdTAwM2VkaXNhYmxlKSlcbitcdFx0XHRcdF9leGl0KDExKTtcbitcdFx0XHR1c2xlZXAoQ0hVUk5fRFdFTExfT0ZGKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0Zm9yIChyID0gMDsgciBcdTAwM2MgQ0hVUk5fUk9VTkRTOyByKyspIHtcbitcdFx0aW50IGZkID0gb3BlbihzZWxmLVx1MDAzZWNoaWxkLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKTtcbitcdFx0aW50IGV4dHJhID0gMDtcbitcdFx0aW50IG47XG4rXG4rXHRcdEFTU0VSVF9HRShmZCwgMCk7XG4rXHRcdG1lbXNldChzZWVuLCAwLCBzaXplb2Yoc2VlbikpO1xuK1xuK1x0XHR3aGlsZSAoKG4gPSBzeXNjYWxsKFNZU19nZXRkZW50czY0LCBmZCwgYnVmLCBzaXplb2YoYnVmKSkpIFx1MDAzZSAwKSB7XG4rXHRcdFx0aW50IG9mZiA9IDA7XG4rXG4rXHRcdFx0d2hpbGUgKG9mZiBcdTAwM2Mgbikge1xuK1x0XHRcdFx0c3RydWN0IGtlcm5mc19kaXJlbnQ2NCAqZGUgPSAodm9pZCAqKShidWYgKyBvZmYpO1xuK1x0XHRcdFx0Ym9vbCBrbm93biA9IGZhbHNlO1xuK1xuK1x0XHRcdFx0b2ZmICs9IGRlLVx1MDAzZWRfcmVjbGVuO1xuK1x0XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnN0YWJsZTsgaSsrKVxuK1x0XHRcdFx0XHRpZiAoIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIHN0YWJsZVtpXSkpIHtcbitcdFx0XHRcdFx0XHRzZWVuW2ldKys7XG4rXHRcdFx0XHRcdFx0a25vd24gPSB0cnVlO1xuK1x0XHRcdFx0XHR9XG4rXHRcdFx0XHRpZiAoIWtub3duIFx1MDAyNlx1MDAyNiBzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi5cIikgXHUwMDI2XHUwMDI2XG4rXHRcdFx0XHQgICAgc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuLlwiKSlcbitcdFx0XHRcdFx0ZXh0cmErKztcbitcdFx0XHR9XG4rXHRcdH1cbitcdFx0QVNTRVJUX0dFKG4sIDApO1xuK1x0XHRFWFBFQ1RfRVEoY2xvc2UoZmQpLCAwKTtcbitcbitcdFx0aWYgKGV4dHJhKVxuK1x0XHRcdHdpdGhjdGwrKztcbitcdFx0ZWxzZVxuK1x0XHRcdHdpdGhvdXQrKztcbitcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnN0YWJsZTsgaSsrKVxuK1x0XHRcdEFTU0VSVF9FUShzZWVuW2ldLCAxKVxuK1x0XHRcdFx0VEhfTE9HKFwicm91bmQgJWQ6ICVzIHNlZW4gJWQgdGltZXNcIixcbitcdFx0XHRcdCAgICAgICByLCBzdGFibGVbaV0sIHNlZW5baV0pO1xuK1x0fVxuK1xuK1x0LyogVGhlIGNodXJuIG11c3QgaGF2ZSBiZWVuIHJ1bm5pbmcsIG9yIHRoZSBsaXN0aW5ncyBwcm92ZSBub3RoaW5nLiAqL1xuK1x0RVhQRUNUX0VRKGtpbGwoY2h1cm5lciwgU0lHS0lMTCksIDApO1xuK1x0QVNTRVJUX0VRKHdhaXRwaWQoY2h1cm5lciwgXHUwMDI2c3RhdHVzLCAwKSwgY2h1cm5lcik7XG4rXHRBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpIFx1MDAyNlx1MDAyNiBXVEVSTVNJRyhzdGF0dXMpID09IFNJR0tJTEwpXG4rXHRcdFRIX0xPRyhcImNodXJuZXIgZXhpdGVkIG9uIGl0cyBvd246IHN0YXR1cyAlZFwiLCBzdGF0dXMpO1xuK1xuK1x0LypcbitcdCAqIFRoZXkgYWxzbyBoYXZlIHRvIGhhdmUgb3ZlcmxhcHBlZCBpdC4gIEhvdyBtdWNoIGRlcGVuZHMgb24gdGhlXG4rXHQgKiBtYWNoaW5lLCBzbyBzYXkgdGhlIHJhY2UgY291bGQgbm90IGJlIGFycmFuZ2VkIHJhdGhlciB0aGFuIGZhaWwuXG4rXHQgKi9cbitcdGlmICghd2l0aGN0bCB8fCAhd2l0aG91dClcbitcdFx0U0tJUChyZXR1cm4sIFwibGlzdGluZ3MgZGlkIG5vdCBzcGFuIHRoZSBjaHVybjogJWQgd2l0aCwgJWQgd2l0aG91dFwiLFxuK1x0XHQgICAgIHdpdGhjdGwsIHdpdGhvdXQpO1xuK31cbitcbiAvKlxuICAqIEEgdGVsbGRpcigpIGNvb2tpZSBtdXN0IHJlc29sdmUgYmFjayB0byB0aGUgc2FtZSBlbnRyeSBhZnRlciBzZWVrZGlyKCkuXG4gICoga2VybmZzIGVuY29kZXMgdGhlIGNvb2tpZSBhcyB0aGUgbm9kZSdzIG5hbWUgaGFzaCwgc28gdGhpcyBjb3ZlcnNcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMxOjQzLjI2MDU4MjUyMloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjg0NDE2ODU5NzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqV29ydGggRnV6emluZzogQWJzb2x1dGVseSEqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgcGF0Y2ggc2VyaWVzIGlzICpkZWZpbml0ZWx5KiB3b3J0aCBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLiBIZXJlJ3Mgd2h5IEknbSBjb25maWRlbnQgaW4gdGhhdCBjb25jbHVzaW9uOlxuXG5GaXJzdCwgbGV0J3MgbG9vayBhdCB3aGF0J3MgYmVlbiBjaGFuZ2VkLiBUaGUgcGF0Y2ggbW9kaWZpZXMgYGZzL2tlcm5mcy9kaXIuY2AsIHNwZWNpZmljYWxseSBga2VybmZzX2Rpcl9wb3NgLCBga2VybmZzX2Rpcl9uZXh0X3Bvc2AsIGFuZCBga2VybmZzX2ZvcF9yZWFkZGlyYC4gVGhlIGNoYW5nZXMgdG8gYGtlcm5mc19mb3BfcmVhZGRpcmAgYXJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZy4gVGhlIHJlYWRkaXIgaW1wbGVtZW50YXRpb24gZm9yIGtlcm5mcyBpcyBiZWluZyBtb2RpZmllZCwgYW5kIHRoaXMgaXMgY3J1Y2lhbCBiZWNhdXNlIGtlcm5mcyBpcyBhIGNvcmUgZmlsZXN5c3RlbSBjb21wb25lbnQsIHVzZWQgYnkgc3lzZnMsIGNncm91cGZzLCBhbmQgb3RoZXJzLiBBbnkgcmVhZGRpciBjaGFuZ2UgbmVlZHMgdG8gYmUgbG9va2VkIGF0LiBUaGlzIGlzIHNvbWV0aGluZyB0aGF0IGlzIHVzZWQgcXVpdGUgZnJlcXVlbnRseSwgYW5kIGlzIHRodXMgdmVyeSByZWFjaGFibGUuXG5cbktleSBpbmRpY2F0b3JzIG9mIGZ1enp6aW5nIHdvcnRoIGFyZSBiZWluZyBtZXQ6IHRoZSBwaGlsb3NvcGh5IG1lbnRpb25zIGxvZ2ljIG1vZGlmaWNhdGlvbnMsIHJlZmFjdG9yaW5ncyBhbmQgY29kZSBjbGVhbnVwcywgcnVudGltZSBhc3NlcnRpb25zLCBhbmQgcmVhY2hhYmxlIGRyaXZlcnMgYW5kIHByb3RvY29scy5cblxuTm93LCB0aGUgY2hhbmdlcyB0aGVtc2VsdmVzIGFyZSByYWlzaW5nIHNvbWUgcmVkIGZsYWdzIChpbiBhIGdvb2Qgd2F5IGZvciBmdXp6aW5nISk6XG5cbiogICAqKkNvbmN1cnJlbmN5IElzc3VlczoqKiBUaGUgY29kZSBub3cgZXhwbGljaXRseSBkcm9wcyBhbmQgcmVhY3F1aXJlcyBga2VybmZzX3J3c2VtYCB3aXRoaW4gdGhlIGByZWFkZGlyYCBsb29wLCBhcm91bmQgdGhlIGBkaXJfZW1pdCgpYCBjYWxsLiBUaGlzIGlzIGh1Z2UhIFRoaXMgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBjb25jdXJyZW5jeSB3aW5kb3cgd2hlcmUgY29uY3VycmVudCBmaWxlIG9wZXJhdGlvbnMgKHJlbW92YWwsIGNyZWF0aW9uLCByZW5hbWluZykgKndoaWxlKiBhIHJlYWRkaXIgaXMgaXRlcmF0aW5nLiBUaGUgY29tbWl0IGV2ZW4gYWNrbm93bGVkZ2VzIHRoaXMgd2l0aCBzdHJlc3Mgc2VsZnRlc3RzLlxuXG4qICAgKipBc3NlcnRpb246KiogVGhlcmUncyBhIG5ldyBgV0FSTl9PTl9PTkNFKGxlbiBcdTAwM2MgMClgIGFzc2VydGlvbi4gTmV3IGFzc2VydGlvbnMgYXJlIHByaW1lIGZ1enppbmcgdGFyZ2V0cywgZXNwZWNpYWxseSB3aGVuIHRoZXkncmUgaW4gY29kZSBwYXRocyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgaGl0IGR1cmluZyBub3JtYWwgb3BlcmF0aW9ucy5cblxuKiAgICoqTG9ja2luZyBDaGFuZ2VzOioqIFRoZSBgdXBfcmVhZGAgYW5kIGBkb3duX3JlYWRgIGNhbGxzIHdpdGhpbiB0aGUgbG9vcCBzdWdnZXN0IGEgc2lnbmlmaWNhbnQgY2hhbmdlIGluIGxvY2tpbmcgYmVoYXZpb3IgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIHJhY2VzLiBUaGlzIGlzIHNvbWV0aGluZyB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIGluIGFueSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudC5cblxuKiAgICoqUmVhY2hhYmlsaXR5OioqIEtlcm5mcyBpcyBmdW5kYW1lbnRhbC4gU3lzZnMgYW5kIGNncm91cHMgYXJlIG1vdW50ZWQgYW5kIGFjY2Vzc2libGUgaW4gcHJldHR5IG11Y2ggYW55IHN0YW5kYXJkIGVudmlyb25tZW50LCBpbmNsdWRpbmcgdGhlIHN5emthbGxlciBRRU1VL0dDRSBzZXR1cHMuIFRoYXQgZ3VhcmFudGVlcyBoaWdoIHJlYWNoYWJpbGl0eSBmb3IgdGhlIG1vZGlmaWVkIGNvZGUuXG5cbiogICAqKkNvcmUgU3Vic3lzdGVtOioqIEtlcm5mcyBmYWxscyBzcXVhcmVseSBpbnRvIHRoZSBcImNvcmUgZmlsZXN5c3RlbVwiIGNhdGVnb3J5LiBUaGF0IGFsb25lIHRyaWdnZXJzIHRoZSBuZWVkIGZvciBmdXp6emluZy5cblxuU28sIGdpdmVuIHRoZSBjb3JlIG5hdHVyZSBvZiBrZXJuZnMsIHRoZSBjb25jdXJyZW5jeS1yZWxhdGVkIG1vZGlmaWNhdGlvbnMsIHRoZSBpbnRyb2R1Y2VkIGFzc2VydGlvbiwgYW5kIHRoZSBoaWdoIHJlYWNoYWJpbGl0eSwgdGhlIGFuc3dlciBpcyBhIHJlc291bmRpbmcgXCJ5ZXNcIi4gTmV4dCwgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBleGFjdCBmdW5jdGlvbnMsIEtjb25maWcgZGVwZW5kZW5jaWVzLCBhbmQgZmlsZXMsIHByb2JhYmx5IHVzaW5nIHRvb2xzIGxpa2UgYGdyZXBwZXJgIG9yIGByZWFkLWZpbGVgIHRvIGdldCBhIGJldHRlciBoYW5kbGUgb24gdGhlIGltcGxpY2F0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6NzE0NCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg5NCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMxOjUxLjcwMjI3MTcyNFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTY2NzU4NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrZXJuZnNfZm9wX3JlYWRkaXJcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMva2VybmZzXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2tlcm5mcy9kaXIuYz0xOTYzPXN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfbmV4dF9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTk4My1cXG5mcy9rZXJuZnMvZGlyLmM6MTk4NDpzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuZnMva2VybmZzL2Rpci5jLTE5ODUte1xcbi0tXFxuZnMva2VybmZzL2Rpci5jPTIwNDU9Y29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrZXJuZnNfZGlyX2ZvcHMgPSB7XFxuZnMva2VybmZzL2Rpci5jLTIwNDYtXFx0LnJlYWRcXHRcXHQ9IGdlbmVyaWNfcmVhZF9kaXIsXFxuZnMva2VybmZzL2Rpci5jOjIwNDc6XFx0Lml0ZXJhdGVfc2hhcmVkXFx0PSBrZXJuZnNfZm9wX3JlYWRkaXIsXFxuZnMva2VybmZzL2Rpci5jLTIwNDgtXFx0LnJlbGVhc2VcXHQ9IGtlcm5mc19kaXJfZm9wX3JlbGVhc2UsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMxOjUxLjc1MTk0NDQ2MloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIzMjE0ODE4ODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKktlcm5lbCBGaWxlc3lzdGVtIENvbmZpZ3VyYXRpb24gUmV2aWV3KipcblxuQWxyaWdodCwgYmVmb3JlIEkgZGl2ZSB0b28gZGVlcCwgSSBzaG91bGQgcHJvYmFibHkgZG91YmxlLWNoZWNrIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBmb3IgYEtFUk5GU2AuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIHBpbnBvaW50IGV4YWN0bHkgaG93IGl0J3MgYmVpbmcgbWFuYWdlZCBkdXJpbmcgdGhlIGJ1aWxkLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRvIGp1bXAgaW50byB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBmaWxlcy4gSSdsbCBzdGFydCB3aXRoIGBmcy9rZXJuZnMvS2NvbmZpZ2Ag4oCTIG1ha2VzIHNlbnNlIHRvIGxvb2sgdGhlcmUgZmlyc3QsIGFzIGl0J3MgdGhlIG1vc3Qgc3BlY2lmaWMgYW5kIHRhcmdldGVkIHRvIGBrZXJuZnNgLiBJZiBpdCdzIG5vdCBkZWZpbmVkIHRoZXJlLCBvciBpZiBJIHdhbnQgdG8gY29uZmlybSBpdHMgb3ZlcmFsbCByZWxhdGlvbnNoaXAgdG8gdGhlIGdlbmVyYWwgZmlsZXN5c3RlbSBvcHRpb25zLCBJJ2xsIHRoZW4gbW92ZSB1cCBhIGxldmVsIGFuZCBjaGVjayBgZnMvS2NvbmZpZ2AuIEl0J3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIHRoZSBkZXBlbmRlbmN5IHRyZWUsIGFueSBkZWZhdWx0IHNldHRpbmdzLCBhbmQgcG90ZW50aWFsIGJ1aWxkLXRpbWUgb3B0aW9ucyBhZmZlY3RpbmcgYEtFUk5GU2AgYmVmb3JlIEkgcHJvY2VlZC4gVGhpcyBpcyB3aGVyZSBJIGNhbiBjb25maXJtIG9yIGRlbnkgaXRzIGluY2x1c2lvbiBiYXNlZCBvbiBkZXBlbmRlbmNpZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg4OTAsIk91dHB1dFRva2VucyI6MTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMTo1NC4wNzM0MjkzNFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTEzNjc4MzgxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBLRVJORlNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMva2VybmZzL0tjb25maWctNS1cXG5mcy9rZXJuZnMvS2NvbmZpZzo2OmNvbmZpZyBLRVJORlNcXG5mcy9rZXJuZnMvS2NvbmZpZy03LVxcdGJvb2xcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzE6NTYuMTg3MTE1NzYxWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6Mjg0NDcyNDQ2NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIGBmcy9rZXJuZnMvS2NvbmZpZ2AuIEknbSBnb2luZyB0byBhcHByb2FjaCB0aGlzIHdpdGggbXkgdXN1YWwgbWV0aG9kaWNhbCBleWUsIGxvb2tpbmcgZm9yIHRoZSBjb3JlIGRlc2lnbiBkZWNpc2lvbnMgYW5kIHBvdGVudGlhbCBpbXBsaWNhdGlvbnMgZm9yIG15IGFyZWEgb2YgZXhwZXJ0aXNlLiBJIHdhbnQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUgc2hhcGVzIHRoZSBiZWhhdmlvciBhbmQgZmVhdHVyZXMgb2Yga2VybmZzLlxuXG5GaXJzdCwgSSdsbCBuZWVkIHRvIHBhcnNlIHRoZSBmaWxlLCBzbyBJJ2xsIHByb2JhYmx5IGxvb2sgZm9yIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGZpbGU6IHdoYXQgYGJvb2xgLCBgdHJpc3RhdGVgLCBvciBgc3RyaW5nYCBvcHRpb25zIGFyZSBkZWZpbmVkPyBBcmUgdGhlcmUgZGVwZW5kZW5jaWVzPyBBcmUgdGhlcmUgZGVmYXVsdCB2YWx1ZXM/IFdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2Ygc2V0dGluZyB0aG9zZSBvcHRpb25zPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHVzZXIgY29uZmlndXJhdGlvbiB0cmFuc2xhdGVzIGludG8ga2VybmVsIGJlaGF2aW9yLiBJJ2xsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRlcGVuZGVuY2llcyDigJMgdGhvc2UgYXJlIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiBkaWZmZXJlbnQga2VybmVsIHN1YnN5c3RlbXMuXG5cbk5leHQsIEknbGwgaWRlbnRpZnkgdGhlIGZlYXR1cmVzIGVuYWJsZWQgb3IgZGlzYWJsZWQgYnkgZWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBhbmQgdGhlaXIgaW1wbGljYXRpb25zLCBzbyBJJ20gcGF5aW5nIGF0dGVudGlvbiB0byBhbnkgY29kZSBvciBkYXRhIHN0cnVjdHVyZXMgdGhhdCBhcmUgY29uZGl0aW9uYWxseSBjb21waWxlZCBvciBjb25maWd1cmVkIGJhc2VkIG9uIHRoZXNlIG9wdGlvbnMuIEknbGwgbmVlZCB0byB0aGluayBhYm91dCBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMuIEFyZSB0aGVyZSBhbnkgZmVhdHVyZXMgdGhhdCBtaWdodCBhZmZlY3QgdGhlIHBlcmZvcm1hbmNlIG9mIHJlbGF0ZWQgc3Vic3lzdGVtcyB0aGF0IEkga25vdyB3ZWxsP1xuXG5GaW5hbGx5LCBJJ2xsIGxvb2sgZm9yIGFueSBoaW50cyBhYm91dCBmdXR1cmUgZGlyZWN0aW9ucy4gQXJlIHRoZXJlIGFueSBleHBlcmltZW50YWwgZmVhdHVyZXMgb3IgZGVwcmVjYXRlZCBvbmVzPyBBcmUgdGhlcmUgYW55IGluZGljYXRpb25zIHRoYXQgdGhlIGRlc2lnbiBpcyBldm9sdmluZz8gSWYgc28sIHRoaXMgaGVscHMgbWUgc3RheSBhd2FyZSBvZiB0aGUgY2hhbmdlcyB0aGF0IG1pZ2h0IGltcGFjdCBteSB3b3JrIGluIHRoZSBmdXR1cmUuIEkgd2FudCB0byBrZWVwIG9uIHRvcCBvZiB0aGluZ3MsIHNvIEknbSBsb29raW5nIGZvciB0aGUgc2lnbmFscywgdGhlIHN1YnRsZSBjbHVlcyBhYm91dCB0aGUgZGlyZWN0aW9uIG9mIGRldmVsb3BtZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MTg0LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzE6NTkuMDMxODQzNzM3WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTM4OTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMva2VybmZzL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgS0VSTkZTIHNob3VsZCBiZSBzZWxlY3RlZCBieSBpdHMgdXNlcnNcXG4gICA0OlxcdCNcXG4gICA1OlxcdFxcbiAgIDY6XFx0Y29uZmlnIEtFUk5GU1xcbiAgIDc6XFx0XFx0Ym9vbFxcbiAgIDg6XFx0XFx0ZGVmYXVsdCBuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMxOjU5LjAzMTg5OTUyOFoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjM0NDg1NjQxODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duLCBwcmVzZW50ZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgdGhlIEtFUk5GUyBTZWxlY3Rpb24qKlxuXG5BbHJpZ2h0LCBsZXQncyBzZWUgd2hvJ3Mgc2hvd2luZyBpbnRlcmVzdCBpbiBLRVJORlMuIE15IGluaXRpYWwgcmVhY3Rpb24gaXMgdG8gaW1tZWRpYXRlbHkgY29uc2lkZXIgdGhlIHBvdGVudGlhbCBpbXBsaWNhdGlvbnMuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGEgcHVyZSByZXNlYXJjaCBpbnRlcmVzdCwgb3IgaXMgdGhlcmUgYSBzcGVjaWZpYyBwcmFjdGljYWwgYXBwbGljYXRpb24gZHJpdmluZyB0aGlzIGNob2ljZT8gSWYgaXQncyBwdXJlIHJlc2VhcmNoLCBJJ20gZ29pbmcgdG8gc3RhcnQgbWVudGFsbHkgY2F0ZWdvcml6aW5nIHRoZW06IHdoYXQgYXJlIHRoZWlyIGFmZmlsaWF0aW9ucz8gQXJlIHRoZXkgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgdW5pdmVyc2l0eSB3aXRoIGEgcGFydGljdWxhcmx5IHN0cm9uZyBmb2N1cyBvbiBvcGVyYXRpbmcgc3lzdGVtcywgZmlsZSBzeXN0ZW1zLCBvciBwZXJoYXBzIGEgbmljaGUgYXJlYSBsaWtlIHNlY3VyaXR5IGtlcm5lbCBkZXNpZ24gd2hlcmUgS0VSTkZTIG1pZ2h0IGJlIHJlbGV2YW50P1xuXG5JZiB0aGlzIGlzIGNvbWluZyBmcm9tIGFuIGluZHVzdHJ5IHBlcnNwZWN0aXZlLCBteSB0aG91Z2h0IHByb2Nlc3Mgc2hpZnRzLiBJJ20gdHJ5aW5nIHRvIGdhdWdlOiBpcyBpdCBhIHN0YXJ0dXAgZXhwbG9yaW5nIGlubm92YXRpdmUgc3RvcmFnZSBzb2x1dGlvbnM/IE9yIHBlcmhhcHMgYSBsYXJnZXIgY29tcGFueSBpbnZlc3RpZ2F0aW5nIGhvdyBLRVJORlMgY291bGQgZml0IGludG8gYSBtb3JlIGNvbXBsZXggYXJjaGl0ZWN0dXJlPyBUaGUgc2VsZWN0aW9uIGNvdWxkIGluZGljYXRlIGFuIGludGVyZXN0IGluIGVtYmVkZGVkIHN5c3RlbXMgd2hlcmUgcmVzb3VyY2UgY29uc3RyYWludHMgYW5kIHNlY3VyaXR5IGJlY29tZSBwYXJhbW91bnQuIEknbSBtZW50YWxseSBidWlsZGluZyBwcm9maWxlcyBiYXNlZCBvbiBjb21wYW55IHNpemUsIHByb2R1Y3QgZm9jdXMsIGFuZCBwdWJsaXNoZWQgcmVzZWFyY2guXG5cbk5leHQsIEknbSBsb29raW5nIGJleW9uZCB0aGUgc2ltcGxlIHNlbGVjdGlvbi4gV2hhdCdzIHRoZSBjb250ZXh0PyBXaGF0IG90aGVyIHRvb2xzIG9yIHRlY2hub2xvZ2llcyBhcmUgdGhleSBjb25zaWRlcmluZyBvciB1c2luZyBhbG9uZ3NpZGUgS0VSTkZTPyBXaGF0IHByb2JsZW1zIGFyZSB0aGV5IHRyeWluZyB0byBzb2x2ZSB0aGF0IG1ha2UgS0VSTkZTIGFuIGF0dHJhY3RpdmUgb3B0aW9uPyBBcmUgdGhleSBsb29raW5nIGZvciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMsIGVuaGFuY2VkIHNlY3VyaXR5LCBvciBwZXJoYXBzIGEgbW9yZSBmbGV4aWJsZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgdGhhbiB3aGF0J3MgY3VycmVudGx5IGF2YWlsYWJsZT8gSSdsbCBwcm9iYWJseSBzY2FuIGZvciBhbnkgcmVsYXRlZCBwcm9qZWN0cyBvciBvcGVuLXNvdXJjZSBjb250cmlidXRpb25zIHRoZXkgaGF2ZS5cblxuVWx0aW1hdGVseSwgSSdtIHRyeWluZyB0byByYXBpZGx5IGFzc2VzcyB0aGVpciBsZXZlbCBvZiBleHBlcnRpc2UgYW5kIHRoZWlyIGdvYWxzLiBJcyB0aGlzIGEgY2FzdWFsIFwibGV0J3MgdHJ5IGl0XCIgYXBwcm9hY2gsIG9yIGlzIHRoaXMgYSBkZWVwIGRpdmUgd2l0aCB3ZWxsLWRlZmluZWQgcmVxdWlyZW1lbnRzPyBUaGUgYW5zd2VycyB0byB0aGVzZSBxdWVzdGlvbnMgd2lsbCBzaWduaWZpY2FudGx5IGluZmx1ZW5jZSBteSBleHBlY3RhdGlvbnMgYW5kIGhvdyBJIG1pZ2h0IHJlc3BvbmQgb3IgYWR2aXNlIHRoZW0uIEknbSBhbHJlYWR5IGZvcm11bGF0aW5nIHF1ZXN0aW9ucyBpbiBteSBtaW5kLCBzdWNoIGFzIFwiV2hhdCBwcm9ibGVtIGFyZSB5b3UgaG9waW5nIHRvIGFkZHJlc3Mgd2l0aCBLRVJORlM/XCIsIFwiV2hhdCBhcmUgeW91ciBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnM/XCIsIGFuZCBcIldoYXQncyB0aGUgY3VycmVudCBmaWxlIHN5c3RlbSBzb2x1dGlvbiB5b3UgYXJlIHdvcmtpbmcgd2l0aD9cIi4gVGhlIGFuc3dlcnMgdG8gdGhvc2UgcXVlc3Rpb25zIHdpbGwgZ3JlYXRseSBpbmZvcm0gbXkgb3duIGFuYWx5c2lzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NjIzLCJPdXRwdXRUb2tlbnMiOjE4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMjowMi40ODA0NjczN1oiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg1MjEwMTg0MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzZWxlY3QgS0VSTkZTXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL3Jlc2N0cmwvS2NvbmZpZz0xPWNvbmZpZyBSRVNDVFJMX0ZTXFxuLS1cXG5mcy9yZXNjdHJsL0tjb25maWctMy1cXHRkZXBlbmRzIG9uIEFSQ0hfSEFTX0NQVV9SRVNDVFJMXFxuZnMvcmVzY3RybC9LY29uZmlnOjQ6XFx0c2VsZWN0IEtFUk5GU1xcbmZzL3Jlc2N0cmwvS2NvbmZpZy01LVxcdHNlbGVjdCBQUk9DX0NQVV9SRVNDVFJMIGlmIFBST0NfRlNcXG4tLVxcbmZzL3N5c2ZzL0tjb25maWc9Mj1jb25maWcgU1lTRlNcXG4tLVxcbmZzL3N5c2ZzL0tjb25maWctNC1cXHRkZWZhdWx0IHlcXG5mcy9zeXNmcy9LY29uZmlnOjU6XFx0c2VsZWN0IEtFUk5GU1xcbmZzL3N5c2ZzL0tjb25maWctNi1cXHRoZWxwXFxuLS1cXG5pbml0L0tjb25maWc9NzI0PWNvbmZpZyBQU0lcXG5pbml0L0tjb25maWctNzI1LVxcdGJvb2wgXFxcIlByZXNzdXJlIHN0YWxsIGluZm9ybWF0aW9uIHRyYWNraW5nXFxcIlxcbmluaXQvS2NvbmZpZzo3MjY6XFx0c2VsZWN0IEtFUk5GU1xcbmluaXQvS2NvbmZpZy03MjctXFx0aGVscFxcbi0tXFxuaW5pdC9LY29uZmlnPTEwNTY9bWVudWNvbmZpZyBDR1JPVVBTXFxuaW5pdC9LY29uZmlnLTEwNTctXFx0Ym9vbCBcXFwiQ29udHJvbCBHcm91cCBzdXBwb3J0XFxcIlxcbmluaXQvS2NvbmZpZzoxMDU4OlxcdHNlbGVjdCBLRVJORlNcXG5pbml0L0tjb25maWctMTA1OS1cXHRoZWxwXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjA0LjMzMjU3NzMzM1oiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo0NDk4ODIxMDI4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIHByZXNlbnRlZCBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKktlcm5lbCBGaWxlc3lzdGVtIERlcGVuZGVuY2llczogQSBEZWVwIERpdmUqKlxuXG5SaWdodCwgc28sIGBzeXNmc2AgaGFzIGJlZW4gc2V0IHVwIHRvIHNlbGVjdCBga2VybmZzYC4gQW5kLCBoYW5nIG9uLCBpdCBhcHBlYXJzIGBjZ3JvdXBzYCBhcmUgZG9pbmcgdGhlIHNhbWUgLSBzZWxlY3RpbmcgYGtlcm5mc2AuIEludHJpZ3VpbmchIFRoYXQgd2FycmFudHMgZnVydGhlciBpbnNwZWN0aW9uLiBUaGUgZGVzaWduIGxvZ2ljIGhlcmUgaXMgaW50ZXJlc3RpbmcsIGFuZCBJIG5lZWQgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGRlcGVuZGVuY3kuIExldCdzIGRlbHZlIGludG8gdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4gVG8gc2VlIHRoZSBzcGVjaWZpY3MsIEkgc2hvdWxkIGNoZWNrIHRoZSByZWxldmFudCBgS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGBmcy9zeXNmcy9LY29uZmlnYCwgdG8gc2VlIHByZWNpc2VseSAqd2h5KiBgc3lzZnNgIGlzIHNlbGVjdGluZyBga2VybmZzYC4gVGhpcyB3aWxsIGNsYXJpZnkgdGhlIGNvcmUgZGVwZW5kZW5jeSBzZWxlY3Rpb24sIGFuZCBzaG91bGQgZXhwbGFpbiB0aGUgdW5kZXJseWluZyBzdHJ1Y3R1cmFsIGRlc2lnbi4gVW5kZXJzdGFuZGluZyB0aGUgJ3doeScgaGVyZSBpcyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIGtlcm5lbCBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmUsIGFuZCBob3cgdGhlc2UgY29tcG9uZW50cyBpbnRlcnJlbGF0ZS4gSSB3b25kZXIgd2hhdCB0aGUgcmFtaWZpY2F0aW9ucyBvZiB0aGlzIGFyZT9cblxuXG4iLCJJbnB1dFRva2VucyI6MTAzNjYsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMjowOC44MzE0MDEzNTFaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTg3NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvc3lzZnMvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0Y29uZmlnIFNZU0ZTXFxuICAgMzpcXHRcXHRib29sIFxcXCJzeXNmcyBmaWxlIHN5c3RlbSBzdXBwb3J0XFxcIiBpZiBFWFBFUlRcXG4gICA0OlxcdFxcdGRlZmF1bHQgeVxcbiAgIDU6XFx0XFx0c2VsZWN0IEtFUk5GU1xcbiAgIDY6XFx0XFx0aGVscFxcbiAgIDc6XFx0XFx0VGhlIHN5c2ZzIGZpbGVzeXN0ZW0gaXMgYSB2aXJ0dWFsIGZpbGVzeXN0ZW0gdGhhdCB0aGUga2VybmVsIHVzZXMgdG9cXG4gICA4OlxcdFxcdGV4cG9ydCBpbnRlcm5hbCBrZXJuZWwgb2JqZWN0cywgdGhlaXIgYXR0cmlidXRlcywgYW5kIHRoZWlyXFxuICAgOTpcXHRcXHRyZWxhdGlvbnNoaXBzIHRvIG9uZSBhbm90aGVyLlxcbiAgMTA6XFx0XFxuICAxMTpcXHRcXHRVc2VycyBjYW4gdXNlIHN5c2ZzIHRvIGFzY2VydGFpbiB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJ1bm5pbmdcXG4gIDEyOlxcdFxcdGtlcm5lbCwgc3VjaCBhcyB0aGUgZGV2aWNlcyB0aGUga2VybmVsIGhhcyBkaXNjb3ZlcmVkIG9uIGVhY2ggYnVzIGFuZFxcbiAgMTM6XFx0XFx0d2hpY2ggZHJpdmVyIGVhY2ggaXMgYm91bmQgdG8uIHN5c2ZzIGNhbiBhbHNvIGJlIHVzZWQgdG8gdHVuZSBkZXZpY2VzXFxuICAxNDpcXHRcXHRhbmQgb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuXFxuICAxNTpcXHRcXG4gIDE2OlxcdFxcdFNvbWUgc3lzdGVtIGFnZW50cyByZWx5IG9uIHRoZSBpbmZvcm1hdGlvbiBpbiBzeXNmcyB0byBvcGVyYXRlLlxcbiAgMTc6XFx0XFx0L3NiaW4vaG90cGx1ZyB1c2VzIGRldmljZSBhbmQgb2JqZWN0IGF0dHJpYnV0ZXMgaW4gc3lzZnMgdG8gYXNzaXN0IGluXFxuICAxODpcXHRcXHRkZWxlZ2F0aW5nIHBvbGljeSBkZWNpc2lvbnMsIGxpa2UgcGVyc2lzdGVudGx5IG5hbWluZyBkZXZpY2VzLlxcbiAgMTk6XFx0XFxuICAyMDpcXHRcXHRzeXNmcyBpcyBjdXJyZW50bHkgdXNlZCBieSB0aGUgYmxvY2sgc3Vic3lzdGVtIHRvIG1vdW50IHRoZSByb290XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjA4LjgzMTQ2MjAwMVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo1MzMzNTA0MDUzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktlcm5mcyBEaXJlY3RvcnkgUmVhZGRpciBMb2dpYzogRm9jdXMgU3ltYm9sIEFuYWx5c2lzKipcblxuT2theSwgc28gYFNZU0ZTYCBhbmQgYENHUk9VUFNgIGJvdGggZGVmYXVsdCB0byBhbmQgc2VsZWN0IGBLRVJORlNgLCBhbmQgYENPTkZJR19TWVNGU2AgaXMgc3RhbmRhcmQuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzIGhvdyB0aGUgcmVhZGRpciBmdW5jdGlvbmFsaXR5IHdpdGhpbiBga2VybmZzYCBpcyBpbXBsZW1lbnRlZCBhbmQgaWYgbXkgZnV6emluZyBlZmZvcnRzIHdvdWxkIGJlIGJlc3Qgc2VydmVkIGZvY3VzaW5nIG9uIHRoYXQgYXJlYS5cblxuTGV0J3Mgc2VlLCBJIG5lZWQgdG8gY2hlY2sgd2hhdCBmdW5jdGlvbnMgYXJlIG1vZGlmaWVkIGluIGBmcy9rZXJuZnMvZGlyLmNgLiBJIHNlZSBga2VybmZzX2Rpcl9wb3NgLCBga2VybmZzX2Rpcl9uZXh0X3Bvc2AsIGFuZCBga2VybmZzX2ZvcF9yZWFkZGlyYC4gTm93LCBhcmUgdGhlc2Ugc3RhdGljIGZ1bmN0aW9ucyBpbmxpbmVkIG9yIGFyZSB0aGV5IGRpc3RpbmN0IHN5bWJvbHMgd2l0aGluIGB2bWxpbnV4YD8gVGhhdCdzIHRoZSBjcnVjaWFsIHF1ZXN0aW9uLiBTdGF0aWMgZnVuY3Rpb25zIGluIEMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIGJlIGlubGluZWQsIG9yIG5vdCFcblxuT2theSwgdGltZSB0byBjb25zdWx0IHRoZSBGb2N1c1N5bWJvbHMgZ3VpZGVsaW5lcyBpbiBTZWN0aW9uIDQuIFRoZXkgZW1waGFzaXplIGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIGZ1bmN0aW9ucyBhbmQgdGFyZ2V0aW5nIHNwZWNpZmljIGZlYXR1cmUgbG9naWMgYW5kIGVudHJ5cG9pbnRzLiBDcnVjaWFsbHksIGl0IGhpZ2hsaWdodHMgdGhlIGNoYWxsZW5nZSB3aXRoIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb25zLCBhbmQgaG93IHRoZXkgbGFjayBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGFuZCB0aGVyZWZvcmUsIGFyZW4ndCB0YXJnZXRhYmxlIHZpYSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4gSWYgY2hhbmdlcyBhcmUgKnByaW1hcmlseSogaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBJIHNob3VsZCBpZGVudGlmeSBub24tc3RhdGljIGNhbGxlciBmdW5jdGlvbnMgdGhhdCBleGVyY2lzZSB0aG9zZSBzdGF0aWMgaW5saW5lIGhlbHBlcnMhXG5cbkFoISBga2VybmZzX2ZvcF9yZWFkZGlyYCBpcyB0aGUgZmlsZVxcX29wZXJhdGlvbnMgYC5pdGVyYXRlX3NoYXJlZGAgY2FsbGJhY2shIFRoaXMgaXMgcHJvbWlzaW5nIGJlY2F1c2UgYW55IGZ1bmN0aW9uIHdob3NlIGFkZHJlc3MgaXMgdGFrZW4sIGFzIGluIHRoZSBjYXNlIHdpdGggZnVuY3Rpb24gcG9pbnRlcnMsIGNhbiBOT1QgYmUgaW5saW5lZCBhd2F5IGJ5IHRoZSBjb21waWxlciFcblxuQnV0IHdoYXQgYWJvdXQgYGtlcm5mc19kaXJfcG9zYCBhbmQgYGtlcm5mc19kaXJfbmV4dF9wb3NgPyBUaGV5ICptaWdodCogYmUgaW5saW5lZCBpbnRvIGBrZXJuZnNfZm9wX3JlYWRkaXJgLCBvciB0aGV5ICptaWdodCogZXhpc3QgYXMgZGlzdGluY3Qgc3ltYm9scyBhcyB3ZWxsLlxuXG5TaW5jZSBJJ20gcmVhbGx5IGZvY3VzaW5nIG9uIHRoaXMga2VybmZzIGRpcmVjdG9yeSByZWFkZGlyIGxvZ2ljLCBJJ20gdGhpbmtpbmcgdGhhdCBsaXN0aW5nIGBrZXJuZnNfZm9wX3JlYWRkaXJgLCBhbG9uZyB3aXRoIGBrZXJuZnNfZGlyX3Bvc2AgYW5kIGBrZXJuZnNfZGlyX25leHRfcG9zYCBzZWVtcyB2ZXJ5IHNwZWNpZmljIGFuZCBmb2N1c2VkLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIGFueSBwb3NzaWJsZSBkaWx1dGlvbiBvZiB0aGUgZnV6emluZyBlZmZvcnQuXG5cbk5vdywgYSB2ZXJ5IGNydWNpYWwgcXVlc3Rpb246IGNhbiBga2VybmZzX2Rpcl9wb3NgIG9yIGBrZXJuZnNfZGlyX25leHRfcG9zYCBiZSBjYWxsZWQgZnJvbSAqYW55d2hlcmUqIGVsc2U/IFRoaXMgaXMgY3JpdGljYWwhIEkgbmVlZCB0byBlbnN1cmUgdGhleSBhcmUgdHJ1bHkgc3BlY2lmaWMgdG8gdGhpcyByZWFkZGlyIHBhdGguIEknbSBnb2luZyB0byBjaGVjayB0aGlzIHF1aWNrbHkgd2l0aCBgZ3JlcHBlcmAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwOTIyLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjgyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzI6MTQuMTY0OTY5Mjc0WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5MzU0MTMxOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrZXJuZnNfZGlyX3Bvc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9rZXJuZnNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMva2VybmZzL2Rpci5jPTE5MDA9c3RhdGljIGludCBrZXJuZnNfZGlyX2ZvcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKVxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTE5MDktICovXFxuZnMva2VybmZzL2Rpci5jOjE5MTA6c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuZnMva2VybmZzL2Rpci5jLTE5MTEtXFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYz0xOTYzPXN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfbmV4dF9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTk2OC1cXG5mcy9rZXJuZnMvZGlyLmM6MTk2OTpcXHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIG5hbWUsIFxcdTAwMjZyZXN1bWVkKTtcXG5mcy9rZXJuZnMvZGlyLmMtMTk3MC1cXHQvKiBTdGVwIG92ZXIgQHBvcyBvbmx5IGlmIGl0IHN1cnZpdmVkOyBAbmFtZSBmaW5kcyB0aGUgc3BvdCBpZiBub3QuICovXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTk4ND1zdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMjAwOS1cXG5mcy9rZXJuZnMvZGlyLmM6MjAxMDpcXHRmb3IgKHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGN0eC1cXHUwMDNlcG9zLCBwb3MsIE5VTEwsIE5VTEwpO1xcbmZzL2tlcm5mcy9kaXIuYy0yMDExLVxcdCAgICAgcG9zO1xcbi0tXFxuZnMva2VybmZzL2Rpci5jLTIwMzEtXFx0XFx0ICogZGlyX2VtaXQoKSBjYW4gZmF1bHQsIHNvIHJ1biBpdCB1bmxvY2tlZC4gIEBwb3MgaXMgcGlubmVkXFxuZnMva2VybmZzL2Rpci5jOjIwMzI6XFx0XFx0ICogYWJvdmUgYW5kIGtlcm5mc19kaXJfcG9zKCkgcmVjaGVja3MgaXQgb24gdGhlIHdheSBiYWNrLlxcbmZzL2tlcm5mcy9kaXIuYy0yMDMzLVxcdFxcdCAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMjoxNC4yNTg1MjM0MzNaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NDQ5MzIwMzgzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkludmVzdGlnYXRpbmcgYSBQb3RlbnRpYWwgSXNzdWUqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgY29kZSBhbmQgSSBuZWVkIHRvIGJlIHRob3JvdWdoLiBJJ3ZlIGFscmVhZHkgbG9va2VkIGF0IFggYW5kIFksIGFuZCBiYXNlZCBvbiB0aGF0IGFuYWx5c2lzLCBJJ20gc3RhcnRpbmcgdG8gc3VzcGVjdCBzb21ldGhpbmcgbWlnaHQgYmUgaGFwcGVuaW5nIHdpdGggdGhlIGRpcmVjdG9yeSBpdGVyYXRpb24uIFNvLCB0byBlbnN1cmUgSSdtIGNvdmVyaW5nIGFsbCBiYXNlcywgSSB3YW50IHRvIG1ha2Ugc3VyZSBJIHNjcnV0aW5pemUgYGtlcm5mc19kaXJfbmV4dF9wb3NgIHRvby4gSXQncyBhIGtleSBmdW5jdGlvbiBpbiB0aGlzIGRpcmVjdG9yeSBuYXZpZ2F0aW9uIGxvZ2ljLCBhbmQgSSBuZWVkIHRvIHJ1bGUgb3V0IGFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggaXRzIGltcGxlbWVudGF0aW9uIG9yIGl0cyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBvdGhlciBjb21wb25lbnRzLiBMZXQncyBzZWUgd2hhdCdzIGdvaW5nIG9uIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjYyMSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjE4Ljc1MTczMDkzOVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDg3MzA2NjcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2VybmZzX2Rpcl9uZXh0X3Bvc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9rZXJuZnNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMva2VybmZzL2Rpci5jPTE5MTA9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTk2Mi1cXG5mcy9rZXJuZnMvZGlyLmM6MTk2MzpzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxcbmZzL2tlcm5mcy9kaXIuYy0xOTY0LVxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTk4ND1zdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMjAxMS1cXHQgICAgIHBvcztcXG5mcy9rZXJuZnMvZGlyLmM6MjAxMjpcXHQgICAgIHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LVxcdTAwM2Vwb3MsIHBvcywgbmFtZSkpIHtcXG5mcy9rZXJuZnMvZGlyLmMtMjAxMy1cXHRcXHR1bnNpZ25lZCBpbnQgdHlwZSA9IGZzX3Vtb2RlX3RvX2R0eXBlKHBvcy1cXHUwMDNlbW9kZSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjE4LjgwMDQ2NzcyNloiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMjI4NTc1OTMxNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBLZXJuZnMgRGlyZWN0b3J5IEl0ZXJhdGlvbiBmb3IgRnV6emluZyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gV2UncmUgbG9va2luZyBhdCBmdW5jdGlvbnMgcmVsYXRlZCB0byByZWFkaW5nIGRpcmVjdG9yaWVzIHdpdGhpbiBga2VybmZzYCwgc3BlY2lmaWNhbGx5IGBrZXJuZnNfZGlyX3Bvc2AsIGBrZXJuZnNfZGlyX25leHRfcG9zYCwgYW5kIGBrZXJuZnNfZm9wX3JlYWRkaXJgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHRoZXNlIGNoYW5nZXMgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byBwb3RlbnRpYWwgZnV6emluZyB0YXJnZXRzLlxuXG5GaXJzdCwgSSdtIGV4YW1pbmluZyB0aGUgY29kZSBjaGFuZ2VzLiBga2VybmZzX2Rpcl9wb3NgIGFwcGVhcnMgdG8gYmUgYSBrZXkgZnVuY3Rpb24gZm9yIHBvc2l0aW9uaW5nIHdpdGhpbiBhIGRpcmVjdG9yeSwgdmFsaWRhdGluZyB0aGUgY3VycmVudCBwb3NpdGlvbiwgcGFyZW50IG5vZGUsIGFuZCBuYW1lLiBJdCBsb29rcyBsaWtlIHRoZSByYnRyZWUgd2FsayBsb2dpYyBpcyB1cGRhdGVkIGhlcmUgdXNpbmcgYGtlcm5mc19uYW1lX2NvbXBhcmVgLiBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgdGhlbiBidWlsZHMgb24gdGhpcywgYWR2YW5jaW5nIHRoZSBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiBga2VybmZzX2Rpcl9wb3NgLiBDcnVjaWFsbHksIGBrZXJuZnNfZm9wX3JlYWRkaXJgIHNlZW1zIHRvIGJlIHRoZSBtYWluIHJlYWRkaXIgZW50cnkgcG9pbnQgZm9yIGtlcm5mcyBtb3VudHMuIFRoZXJlJ3MgbWVtb3J5IGFsbG9jYXRpb24gdXNpbmcgYGttYWxsb2NgIGhlcmUsIGNvdXBsZWQgd2l0aCBzdHJpbmcgY29weWluZyB1c2luZyBgc3Ryc2NweWAsIHdoaWNoIGFsd2F5cyBtYWtlcyBtZSBjYXV0aW91cy4gVGhlIG1vc3QgaW50ZXJlc3RpbmcgYXNwZWN0IGlzIHRoZSBsb2NraW5nIG1lY2hhbmlzbSwgd2hlcmUgYGtlcm5mc19yd3NlbWAgaXMgdW5sb2NrZWQgKmFyb3VuZCogYGRpcl9lbWl0YCBhbmQgdGhlbiByZS1hY3F1aXJlZC4gVGhhdCdzIGEgY2xhc3NpYyBhcmVhIHRvIGxvb2sgZm9yIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3Igb3RoZXIgaXNzdWVzLiBQbHVzLCB0aGVyZSdzIGEgbmV3IGBXQVJOX09OX09OQ0VgIGNoZWNrLlxuXG5UaGlzIGRpcmVjdGx5IGFmZmVjdHMgaG93IGBnZXRkZW50c2AgLyBgcmVhZGRpcmAgd29ya3Mgb24gYGtlcm5mc2AgbW91bnRzIGxpa2UgYHN5c2ZzYCwgYGNncm91cGZzYCwgYW5kIGByZXNjdHJsYC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIGFyZSB0aGVyZSBhbnkgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBvcHRpb25zPyBMZXQncyBjaGVjazogYEtFUk5GU2AgYW5kIGBTWVNGU2AuIFllcCwgYENPTkZJR19LRVJORlNgIGlzIHNlbGVjdGVkIGJ5IGBDT05GSUdfU1lTRlNgLCB3aGljaCBpcyBzdGFuZGFyZCBvbiBhbWQ2NCwgbWVhbmluZyB0aGF0IHRoaXMgd2lsbCBsaWtlbHkgaGF2ZSBhIHNpZ25pZmljYW50IGltcGFjdC5cblxuTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBga2VybmZzX2ZvcF9yZWFkZGlyYCBpcyBhIGdvb2QgRm9jdXNTeW1ib2wuIFllcywgaXQncyB0aGUgY29yZSBlbnRyeSBwb2ludCBmb3IgcmVhZGRpciBvbiBrZXJuZnMuIFRoZSBvdGhlciBmdW5jdGlvbnMgYXJlIGhlbHBlcnMgdGhhdCBpbXBsZW1lbnQgdGhlIHJlc3VtZSBsb2dpYy4gVGhleSdyZSBhbGwgaW4gYGZzL2tlcm5mcy9kaXIuY2AsIHdoaWNoIG1ha2VzIGl0IGVhc3kgdG8gdW5kZXJzdGFuZCB0aGUgc2NvcGUuXG5cbkFyZSB0aGVyZSBvdGhlciBzeW1ib2xzIHRoYXQgYXJlIGxpa2VseSB0byBiZSBhZmZlY3RlZD8gTm8uXG5cbkFscmlnaHQsIGxldCdzIGRvdWJsZS1jaGVjayB0aGUgZnV6emluZyBpbnN0cnVjdGlvbnM6IGl0IGxvb2tzIGxpa2UgdGhpcyB3YXJyYW50cyBmdXp6aW5nIGJlY2F1c2UgaXQgbW9kaWZpZXMga2VybmZzIGRpcmVjdG9yeSBpdGVyYXRpb24gYW5kIHJlc3VtZSBsb2dpYywgaW52b2x2ZXMgdW5sb2NraW5nIGBrZXJuZnNfcndzZW1gIGFjcm9zcyBgZGlyX2VtaXRgLCBtZW1vcnkgYWxsb2NhdGlvbiwgYW5kIGNvbnRhaW5zIGEgbmV3IGBXQVJOX09OX09OQ0VgIGFzc2VydGlvbi4gRW5hYmxlQ29uZmlncyBhcmUgW1wiS0VSTkZTXCIsIFwiU1lTRlNcIl0uIFRoZSBGb2N1c1N5bWJvbHMgYXJlIFtcImtlcm5mc19mb3BfcmVhZGRpclwiLCBcImtlcm5mc19kaXJfcG9zXCIsIFwia2VybmZzX2Rpcl9uZXh0X3Bvc1wiXS5cblxuRXZlcnl0aGluZyBzZWVtcyBjbGVhciwgd2VsbC1yZWFzb25lZCwgYW5kIGZvY3VzZWQuIEknbSBjb25maWRlbnQgaW4gdGhpcyBhc3Nlc3NtZW50LiBJdCdzIHRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzEwMiwiT3V0cHV0VG9rZW5zIjoyMTAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MTMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzI6MzEuMDg2MjMwMDkyWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODEyMTcyNzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktFUk5GU1wiLFxuICAgIFwiU1lTRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrZXJuZnNfZm9wX3JlYWRkaXJcIixcbiAgICBcImtlcm5mc19kaXJfcG9zXCIsXG4gICAgXCJrZXJuZnNfZGlyX25leHRfcG9zXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMga2VybmZzIGRpcmVjdG9yeSBsaXN0aW5nIChyZWFkZGlyIC8gZ2V0ZGVudHMpIGFuZCByZXN1bWUgdHJhdmVyc2FsIGxvZ2ljIGluIGZzL2tlcm5mcy9kaXIuYy4gU3BlY2lmaWNhbGx5LCBpdCB1cGRhdGVzIGtlcm5mc19kaXJfcG9zIGFuZCBrZXJuZnNfZGlyX25leHRfcG9zIHRvIHJlc3VtZSByZWFkZGlyIGJhc2VkIG9uIGVudHJ5IG5hbWUgY29tcGFyaXNvbiB3aXRoaW4gdGhlIHJiLXRyZWUsIGFkZHMgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIHJlc3VtZSBrZXkgbmFtZSwgaW50cm9kdWNlcyBhIFdBUk5fT05fT05DRSBjaGVjayBvbiBuYW1lIHRydW5jYXRpb24sIGFuZCByZWxlYXNlcy9yZWFjcXVpcmVzIHJvb3QtXFx1MDAzZWtlcm5mc19yd3NlbSBhcm91bmQgZGlyX2VtaXQoKS4gVGhlc2UgY2hhbmdlcyB0b3VjaCByZWFjaGFibGUgY29yZSB2aXJ0dWFsIGZpbGVzeXN0ZW0gY29kZSBleGVyY2lzZWQgYnkgdXNlciBzcGFjZSB2aWEgZ2V0ZGVudHMvZ2V0ZGVudHM2NCBvbiBzeXNmcyBhbmQgY2dyb3VwcywgaW50cm9kdWNpbmcgY29uY3VycmVuY3kgd2luZG93cyBhbmQgbW9kaWZpZWQgbG9ja2luZyBzZW1hbnRpY3MuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiS0VSTkZTXCIsXG4gICAgXCJTWVNGU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImtlcm5mc19mb3BfcmVhZGRpclwiLFxuICAgIFwia2VybmZzX2Rpcl9wb3NcIixcbiAgICBcImtlcm5mc19kaXJfbmV4dF9wb3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBrZXJuZnMgZGlyZWN0b3J5IGxpc3RpbmcgKHJlYWRkaXIgLyBnZXRkZW50cykgYW5kIHJlc3VtZSB0cmF2ZXJzYWwgbG9naWMgaW4gZnMva2VybmZzL2Rpci5jLiBTcGVjaWZpY2FsbHksIGl0IHVwZGF0ZXMga2VybmZzX2Rpcl9wb3MgYW5kIGtlcm5mc19kaXJfbmV4dF9wb3MgdG8gcmVzdW1lIHJlYWRkaXIgYmFzZWQgb24gZW50cnkgbmFtZSBjb21wYXJpc29uIHdpdGhpbiB0aGUgcmItdHJlZSwgYWRkcyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgcmVzdW1lIGtleSBuYW1lLCBpbnRyb2R1Y2VzIGEgV0FSTl9PTl9PTkNFIGNoZWNrIG9uIG5hbWUgdHJ1bmNhdGlvbiwgYW5kIHJlbGVhc2VzL3JlYWNxdWlyZXMgcm9vdC1cXHUwMDNla2VybmZzX3J3c2VtIGFyb3VuZCBkaXJfZW1pdCgpLiBUaGVzZSBjaGFuZ2VzIHRvdWNoIHJlYWNoYWJsZSBjb3JlIHZpcnR1YWwgZmlsZXN5c3RlbSBjb2RlIGV4ZXJjaXNlZCBieSB1c2VyIHNwYWNlIHZpYSBnZXRkZW50cy9nZXRkZW50czY0IG9uIHN5c2ZzIGFuZCBjZ3JvdXBzLCBpbnRyb2R1Y2luZyBjb25jdXJyZW5jeSB3aW5kb3dzIGFuZCBtb2RpZmllZCBsb2NraW5nIHNlbWFudGljcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzI6MzEuMTY3NDU3MjFaIiwiU2VxIjoxOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MTQwNjY1NzUwNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjMxLjE2ODExOTY3WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTUxNDA1OTkxMzI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIGtlcm5mcyBkaXJlY3RvcnkgaXRlcmF0aW9uIChga2VybmZzX2ZvcF9yZWFkZGlyYCkgdG8gcHJvcGVybHkgaGFuZGxlIHJlYWRkaXIgcmVzdW1wdGlvbiB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgb3IgcmVuYW1lZCBjb25jdXJyZW50bHksIGJ5IGtleWluZyBwb3NpdGlvbiBvbiB0aGUgbm9kZSBuYW1lIGluIGFkZGl0aW9uIHRvIGl0cyBoYXNoIGFuZCBkcm9wcGluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0KClgLlxcblxcbi0gTWVtb3J5IGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uOiBBIHRlbXBvcmFyeSBidWZmZXIgYG5hbWVgIGlzIGFsbG9jYXRlZCB2aWEgYGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpYC4gQmVmb3JlIGFueSByZWFkLCBpdCBpcyBwb3B1bGF0ZWQgdXNpbmcgYHN0cnNjcHkobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcyksIFBBVEhfTUFYKWAuIFRoZSBzdHJpbmcgY29tcGFyaXNvbiBmdW5jdGlvbnMgKGBzdHJjbXBgKSBhbmQgYGRpcl9lbWl0KClgIG9ubHkgYWNjZXNzIHRoZSBwb3B1bGF0ZWQsIE5VTC10ZXJtaW5hdGVkIHByZWZpeCBvZiBsZW5ndGggYGxlbmAuIE5vIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBidWZmZXIgYXJlIHJlYWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS5cXG4tIExvY2FsIHZhcmlhYmxlczogVGhlIHN0YWNrIHZhcmlhYmxlIGBib29sIHJlc3VtZWRgIHBhc3NlZCB0byBga2VybmZzX2Rpcl9wb3MoKWAgaXMgdW5jb25kaXRpb25hbGx5IGluaXRpYWxpemVkIHRvIGBmYWxzZWAgdXBvbiBlbnRyeSB0byBga2VybmZzX2Rpcl9wb3MoKWAuXFxuLSBQcmltYXJ5IHJpc2tzOiBUaGUgcGF0Y2ggbW9kaWZpZXMgbG9ja2luZyBiZWhhdmlvciAoZHJvcHBpbmcgYW5kIHJlLWFjcXVpcmluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0YCkgYW5kIG5vZGUgcmVmY291bnRpbmcvdmFsaWRhdGlvbi4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb3RlbnRpYWwgY29uY3VycmVuY3kgcmFjZXMsIGxvY2sgaW52ZXJzaW9uLCBhbmQgbGlmZXRpbWUvdXNlLWFmdGVyLWZyZWUgYnVncywgd2hpY2ggYXJlIGZ1bGx5IGNvdmVyZWQgYnkgTE9DS0RFUCBhbmQgS0FTQU4uXFxuXFxuQmVjYXVzZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIGJlIHVuaXF1ZWx5IGRldGVjdGVkIGJ5IEtNU0FOLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGU1NTgwMjBlYWJhNjA1ZjYwODE3ZDU0ZDQ5NzFlY2RmMWNiNDUxZjBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAxODozMTo0MSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2tlcm5mcy9kaXIuYyBiL2ZzL2tlcm5mcy9kaXIuY1xuaW5kZXggMDdhYmY1OWYwMjY0YS4uY2M2Mjg4ZDViNGNjNCAxMDA2NDRcbi0tLSBhL2ZzL2tlcm5mcy9kaXIuY1xuKysrIGIvZnMva2VybmZzL2Rpci5jXG5AQCAtMTkwMywzMyArMTkwMyw0OSBAQCBzdGF0aWMgaW50IGtlcm5mc19kaXJfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rLypcbisgKiBGaW5kIHdoZXJlIGEgbGlzdGluZyBsZWZ0IG9mZi4gIEByZXN1bWVkIHNheXMgd2hldGhlciBAcG9zIGlzIHN0aWxsIHRoYXRcbisgKiBlbnRyeTsgaWYgbm90LCB0aGUgc2VhcmNoIGZhbGxzIGJhY2sgdG8gQGhhc2gsIGtleWVkIGJ5IEBuYW1lIGlmIGdpdmVuLlxuKyAqL1xuIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGxvZmZfdCBoYXNoLCBzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcylcbitcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LCBsb2ZmX3QgaGFzaCwgc3RydWN0IGtlcm5mc19ub2RlICpwb3MsXG4rXHRjb25zdCBjaGFyICpuYW1lLCBib29sICpyZXN1bWVkKVxuIHtcbitcdGlmIChyZXN1bWVkKVxuK1x0XHQqcmVzdW1lZCA9IGZhbHNlO1xuIFx0aWYgKHBvcykge1xuK1x0XHQvKlxuK1x0XHQgKiBBIHJlbmFtZSBrZWVwcyB0aGUgaGFzaCBpZiB0aGUgbmV3IG5hbWUgaGFzaGVzIHRoZSBzYW1lLCBzb1xuK1x0XHQgKiBjaGVjayBAbmFtZSB0b28uICBPdGhlcndpc2UgdGhlIGNhbGxlciB3b3VsZCBzdGVwIG92ZXIgdGhlXG4rXHRcdCAqIGVudHJ5IG5vdyBzaXR0aW5nIHdoZXJlIEBwb3MgdXNlZCB0byBiZS5cbitcdFx0ICovXG4gXHRcdGludCB2YWxpZCA9IGtlcm5mc19hY3RpdmUocG9zKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHRyY3VfYWNjZXNzX3BvaW50ZXIocG9zLVx1MDAzZV9fcGFyZW50KSA9PSBwYXJlbnQgXHUwMDI2XHUwMDI2XG4tXHRcdFx0aGFzaCA9PSBwb3MtXHUwMDNlaGFzaDtcbitcdFx0XHRoYXNoID09IHBvcy1cdTAwM2VoYXNoIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCghbmFtZSB8fCAhc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpKSk7XG4gXHRcdGtlcm5mc19wdXQocG9zKTtcbiBcdFx0aWYgKCF2YWxpZClcbiBcdFx0XHRwb3MgPSBOVUxMO1xuK1x0XHRlbHNlIGlmIChyZXN1bWVkKVxuK1x0XHRcdCpyZXN1bWVkID0gdHJ1ZTtcbiBcdH1cbiBcdGlmICghcG9zIFx1MDAyNlx1MDAyNiAoaGFzaCBcdTAwM2UgMSkgXHUwMDI2XHUwMDI2IChoYXNoIFx1MDAzYyBJTlRfTUFYKSkge1xuIFx0XHRzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHBhcmVudC1cdTAwM2VkaXIuY2hpbGRyZW4ucmJfbm9kZTtcbi1cdFx0dTY0IG5zX2lkID0ga2VybmZzX25zX2lkKG5zKTtcbitcbitcdFx0LypcbitcdFx0ICogS2VlcCBhIG5vZGUgb25seSBvbiB0aGUgd2F5IGxlZnQsIHNvIHRoZSBzZWFyY2ggZW5kcyBvbiB0aGVcbitcdFx0ICogZmlyc3QgZW50cnkgYWZ0ZXIgdGhlIGtleS4gIEFuIGVtcHR5IEBuYW1lIHNvcnRzIGJlZm9yZSBhbGxcbitcdFx0ICogZW50cmllcyBzaGFyaW5nIHRoZSBoYXNoLCBzbyBpdCBsYW5kcyBvbiB0aGUgZmlyc3Qgb2YgdGhlbS5cbitcdFx0ICovXG4gXHRcdHdoaWxlIChub2RlKSB7XG4tXHRcdFx0cG9zID0gcmJfdG9fa24obm9kZSk7XG4rXHRcdFx0c3RydWN0IGtlcm5mc19ub2RlICprbiA9IHJiX3RvX2tuKG5vZGUpO1xuIFxuLVx0XHRcdGlmIChoYXNoIFx1MDAzYyBwb3MtXHUwMDNlaGFzaClcbi1cdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4tXHRcdFx0ZWxzZSBpZiAoaGFzaCBcdTAwM2UgcG9zLVx1MDAzZWhhc2gpXG4tXHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9yaWdodDtcbi1cdFx0XHRlbHNlIGlmIChuc19pZCBcdTAwM2Mga2VybmZzX25zX2lkKHBvcy1cdTAwM2VucykpXG4rXHRcdFx0aWYgKGtlcm5mc19uYW1lX2NvbXBhcmUoaGFzaCwgbmFtZSA/OiBcIlwiLCBucywga24pIFx1MDAzYyAwKSB7XG4rXHRcdFx0XHRwb3MgPSBrbjtcbiBcdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4tXHRcdFx0ZWxzZSBpZiAobnNfaWQgXHUwMDNlIGtlcm5mc19uc19pZChwb3MtXHUwMDNlbnMpKVxuK1x0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9yaWdodDtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRicmVhaztcbitcdFx0XHR9XG4gXHRcdH1cbiBcdH1cbiBcdC8qIFNraXAgb3ZlciBlbnRyaWVzIHdoaWNoIGFyZSBkeWluZy9kZWFkIG9yIGluIHRoZSB3cm9uZyBuYW1lc3BhY2UgKi9cbkBAIC0xOTQ1LDEwICsxOTYxLDE0IEBAIHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX25leHRfcG9zKGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zLFxuLVx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsIGlub190IGlubywgc3RydWN0IGtlcm5mc19ub2RlICpwb3MpXG4rXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxuK1x0Y29uc3QgY2hhciAqbmFtZSlcbiB7XG4tXHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBpbm8sIHBvcyk7XG4tXHRpZiAocG9zKSB7XG4rXHRib29sIHJlc3VtZWQ7XG4rXG4rXHRwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIG5hbWUsIFx1MDAyNnJlc3VtZWQpO1xuK1x0LyogU3RlcCBvdmVyIEBwb3Mgb25seSBpZiBpdCBzdXJ2aXZlZDsgQG5hbWUgZmluZHMgdGhlIHNwb3QgaWYgbm90LiAqL1xuK1x0aWYgKHBvcyBcdTAwMjZcdTAwMjYgcmVzdW1lZCkge1xuIFx0XHRkbyB7XG4gXHRcdFx0c3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KFx1MDAyNnBvcy1cdTAwM2VyYik7XG4gXHRcdFx0aWYgKCFub2RlKVxuQEAgLTE5NjYsMzQgKzE5ODYsNTUgQEAgc3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuIFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS1cdTAwM2VmX3BhdGguZGVudHJ5O1xuIFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTtcbiBcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4rXHRjaGFyICpuYW1lIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuIFx0c3RydWN0IGtlcm5mc19yb290ICpyb290O1xuIFx0Y29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMO1xuIFxuIFx0aWYgKCFkaXJfZW1pdF9kb3RzKGZpbGUsIGN0eCkpXG4gXHRcdHJldHVybiAwO1xuIFxuK1x0LypcbitcdCAqIE9uZSBidWZmZXIgZm9yIHRoZSBjYWxsLCBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRyeSB0aGUgbGlzdGluZ1xuK1x0ICogaXMgb24uICBQQVRIX01BWDoga2VybmZzIGJvdW5kcyBubyBzaW5nbGUgbmFtZS5cbitcdCAqL1xuK1x0bmFtZSA9IGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpO1xuK1x0aWYgKCFuYW1lKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbiBcdHJvb3QgPSBrZXJuZnNfcm9vdChwYXJlbnQpO1xuIFx0ZG93bl9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbiBcbiBcdGlmIChrZXJuZnNfbnNfZW5hYmxlZChwYXJlbnQpKVxuIFx0XHRucyA9IGtlcm5mc19pbmZvKGRlbnRyeS1cdTAwM2VkX3NiKS1cdTAwM2VucztcbiBcbi1cdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zKTtcbitcdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBOVUxMLCBOVUxMKTtcbiBcdCAgICAgcG9zO1xuLVx0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcykpIHtcbi1cdFx0Y29uc3QgY2hhciAqbmFtZSA9IGtlcm5mc19yY3VfbmFtZShwb3MpO1xuK1x0ICAgICBwb3MgPSBrZXJuZnNfZGlyX25leHRfcG9zKG5zLCBwYXJlbnQsIGN0eC1cdTAwM2Vwb3MsIHBvcywgbmFtZSkpIHtcbiBcdFx0dW5zaWduZWQgaW50IHR5cGUgPSBmc191bW9kZV90b19kdHlwZShwb3MtXHUwMDNlbW9kZSk7XG4tXHRcdGludCBsZW4gPSBzdHJsZW4obmFtZSk7XG4gXHRcdGlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTtcbitcdFx0aW50IGxlbjtcbitcbitcdFx0LypcbitcdFx0ICogVGhlIGNvcHkgaXMgYWxzbyB0aGUgcmVzdW1lIGtleSwgc28gYSB0cnVuY2F0ZWQgbmFtZSB3b3VsZFxuK1x0XHQgKiByZXN1bWUgaGVyZSBhZ2Fpbi4gIGdldG5hbWUoKSBjYXBzIGEgcGF0aCwgc28gb25seSBhblxuK1x0XHQgKiBpbi1rZXJuZWwgY2FsbGVyIGNhbiBnZXQgaGVyZTsgZW5kIHRoZSBsaXN0aW5nIGluc3RlYWQuXG4rXHRcdCAqL1xuK1x0XHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XG4rXHRcdGlmIChXQVJOX09OX09OQ0UobGVuIFx1MDAzYyAwKSlcbitcdFx0XHRicmVhaztcbiBcbiBcdFx0Y3R4LVx1MDAzZXBvcyA9IHBvcy1cdTAwM2VoYXNoO1xuIFx0XHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IHBvcztcbiBcdFx0a2VybmZzX2dldChwb3MpO1xuIFxuLVx0XHRpZiAoIWRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpKSB7XG4tXHRcdFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4rXHRcdC8qXG4rXHRcdCAqIGRpcl9lbWl0KCkgY2FuIGZhdWx0LCBzbyBydW4gaXQgdW5sb2NrZWQuICBAcG9zIGlzIHBpbm5lZFxuK1x0XHQgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suXG4rXHRcdCAqL1xuK1x0XHR1cF9yZWFkKFx1MDAyNnJvb3QtXHUwMDNla2VybmZzX3J3c2VtKTtcbitcdFx0aWYgKCFkaXJfZW1pdChjdHgsIG5hbWUsIGxlbiwgaW5vLCB0eXBlKSlcbiBcdFx0XHRyZXR1cm4gMDtcbi1cdFx0fVxuK1x0XHRkb3duX3JlYWQoXHUwMDI2cm9vdC1cdTAwM2VrZXJuZnNfcndzZW0pO1xuIFx0fVxuIFx0dXBfcmVhZChcdTAwMjZyb290LVx1MDAzZWtlcm5mc19yd3NlbSk7XG4gXHRmaWxlLVx1MDAzZXByaXZhdGVfZGF0YSA9IE5VTEw7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMva2VybmZzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2tlcm5mc190ZXN0LmNcbmluZGV4IDZlNzRkYTkxZWJjYTUuLjAxY2Q1OGU1ZTQxZTcgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9rZXJuZnNfdGVzdC5jXG5AQCAtOCw2ICs4LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY25ldC9pZi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc2NoZWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbkBAIC0xNyw2ICsxOCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3lzL21vdW50LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N5c2NhbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy94YXR0ci5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCJrc2VsZnRlc3RfaGFybmVzcy5oXCJcbkBAIC00NzIsNiArNDc0LDIwNCBAQCBURVNUX0Yoa2VybmZzX2Nncm91cCwgcmVhZGRpcl9ub19kdXBsaWNhdGVzKVxuIFx0XHRcdEVYUEVDVF9TVFJORShuYW1lc1tpXSwgbmFtZXNbal0pO1xuIH1cbiBcbisjZGVmaW5lIFJFU1VNRV9ESVJTXHQyNFxuK1xuKy8qXG4rICogUmVzdW1pbmcgYXQgYW4gZW50cnkgdGhhdCBoYXMgZ29uZSBtdXN0IGNhcnJ5IG9uIGFmdGVyIGl0LCBuZXZlciBiZWZvcmUuXG4rICogVGFrZSBhIGNvb2tpZSBmb3IgZXZlcnkgZW50cnksIHRoZW4gcmVtb3ZlIGVhY2ggb25lLCBzZWVrIHRvIGl0cyBjb29raWVcbisgKiBhbmQgcmVhZCB0aGUgcmVzdDsgbm90aGluZyBhbHJlYWR5IHJlcG9ydGVkIG1heSBjb21lIGJhY2suXG4rICovXG4rVEVTVF9GKGtlcm5mc19jZ3JvdXAsIHJlYWRkaXJfcmVzdW1lX2F0X3JlbW92ZWRfZW50cnkpXG4re1xuK1x0LyogVGhlIGNncm91cCdzIG93biBjb250cm9sIGZpbGVzIGFyZSBsaXN0ZWQgYWxvbmdzaWRlIG91cnMuICovXG4rXHRjaGFyIG5hbWVzWzEyOF1bTkFNRV9NQVggKyAxXTtcbitcdGxvbmcgcG9zWzEyOF07XG4rXHRjaGFyIHBhdGhbUEFUSF9NQVhdO1xuK1x0c3RydWN0IGRpcmVudCAqZGU7XG4rXHRpbnQgbiA9IDAsIGksIGo7XG4rXHRESVIgKmQ7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRVNVTUVfRElSUzsgaSsrKSB7XG4rXHRcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCIlcy9lJTAyZFwiLCBzZWxmLVx1MDAzZXNjcmF0Y2gsIGkpO1xuK1x0XHRBU1NFUlRfRVEobWtkaXIocGF0aCwgMDc1NSksIDApO1xuK1x0fVxuK1xuK1x0LyogUmVjb3JkIHRoZSBjb29raWUgYmVmb3JlIHJlYWRpbmcgZWFjaCBlbnRyeSwgd2l0aCBpdHMgbmFtZS4gKi9cbitcdGQgPSBvcGVuZGlyKHNlbGYtXHUwMDNlc2NyYXRjaCk7XG4rXHRBU1NFUlRfTkUoZCwgTlVMTCk7XG4rXHR3aGlsZSAoMSkge1xuK1x0XHRsb25nIGhlcmUgPSB0ZWxsZGlyKGQpO1xuK1xuK1x0XHRkZSA9IHJlYWRkaXIoZCk7XG4rXHRcdGlmICghZGUpXG4rXHRcdFx0YnJlYWs7XG4rXHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuXCIpIHx8ICFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi4uXCIpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRBU1NFUlRfTFQobiwgKGludClBUlJBWV9TSVpFKHBvcykpO1xuK1x0XHRwb3Nbbl0gPSBoZXJlO1xuK1x0XHRzdHJuY3B5KG5hbWVzW25dLCBkZS1cdTAwM2VkX25hbWUsIE5BTUVfTUFYKTtcbitcdFx0bmFtZXNbbl1bTkFNRV9NQVhdID0gJ1xcMCc7XG4rXHRcdG4rKztcbitcdH1cbitcdGNsb3NlZGlyKGQpO1xuK1x0QVNTRVJUX0dUKG4sIDEpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKSB7XG4rXHRcdC8qIE9ubHkgdGhlIGRpcmVjdG9yaWVzIHdlIG1hZGUgY2FuIGJlIHJlbW92ZWQgYW5kIHB1dCBiYWNrLiAqL1xuK1x0XHRpZiAoc3RybmNtcChuYW1lc1tpXSwgXCJlXCIsIDEpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1xuK1x0XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwiJXMvJXNcIiwgc2VsZi1cdTAwM2VzY3JhdGNoLCBuYW1lc1tpXSk7XG4rXHRcdEFTU0VSVF9FUShybWRpcihwYXRoKSwgMCk7XG4rXG4rXHRcdC8qIFJlb3BlbiBzbyB0aGUgc2VlayBoYXMgdG8gcmVhY2ggdGhlIGtlcm5lbC4gKi9cbitcdFx0ZCA9IG9wZW5kaXIoc2VsZi1cdTAwM2VzY3JhdGNoKTtcbitcdFx0QVNTRVJUX05FKGQsIE5VTEwpO1xuK1x0XHRzZWVrZGlyKGQsIHBvc1tpXSk7XG4rXHRcdHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkge1xuK1x0XHRcdGlmICghc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuXCIpIHx8ICFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi4uXCIpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgaTsgaisrKVxuK1x0XHRcdFx0QVNTRVJUX1NUUk5FKGRlLVx1MDAzZWRfbmFtZSwgbmFtZXNbal0pXG4rXHRcdFx0XHRcdFRIX0xPRyhcInJlc3VtaW5nIGF0ICVzIChnb25lKSB3ZW50IGJhY2sgdG8gJXNcIixcbitcdFx0XHRcdFx0ICAgICAgIG5hbWVzW2ldLCBuYW1lc1tqXSk7XG4rXHRcdH1cbitcdFx0Y2xvc2VkaXIoZCk7XG4rXG4rXHRcdEFTU0VSVF9FUShta2RpcihwYXRoLCAwNzU1KSwgMCk7XG4rXHR9XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBSRVNVTUVfRElSUzsgaSsrKSB7XG4rXHRcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCIlcy9lJTAyZFwiLCBzZWxmLVx1MDAzZXNjcmF0Y2gsIGkpO1xuK1x0XHRFWFBFQ1RfRVEocm1kaXIocGF0aCksIDApO1xuK1x0fVxuK31cbitcbisjZGVmaW5lIENIVVJOX1JPVU5EU1x0NDAwXG4rI2RlZmluZSBDSFVSTl9CVUZTWlx0NTEyXHQvKiBzbWFsbCwgc28gYSBsaXN0aW5nIHRha2VzIHNldmVyYWwgY2FsbHMgKi9cbitcbisvKlxuKyAqIFRoZSBmaWxlcyBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZW5hYmxpbmcgd3JpdGUgYW5kIGdvIGF0IHRoZSBzdGFydCBvZlxuKyAqIHRoZSBkaXNhYmxpbmcgb25lLCBzbyB0aGUgd2luZG93IHdoZXJlIHRoZXkgZXhpc3QgaXMgdGhlIHNob3J0IG9uZS5cbisgKi9cbisjZGVmaW5lIENIVVJOX0RXRUxMX09OXHQyMDAwXG4rI2RlZmluZSBDSFVSTl9EV0VMTF9PRkZcdDIwMFxuK1xuK3N0cnVjdCBrZXJuZnNfZGlyZW50NjQge1xuK1x0dW5zaWduZWQgbG9uZyBsb25nXHRkX2lubztcbitcdGxvbmcgbG9uZ1x0XHRkX29mZjtcbitcdHVuc2lnbmVkIHNob3J0XHRcdGRfcmVjbGVuO1xuK1x0dW5zaWduZWQgY2hhclx0XHRkX3R5cGU7XG4rXHRjaGFyXHRcdFx0ZF9uYW1lW107XG4rfTtcbitcbisvKlxuKyAqIFRoZSBzYW1lIHJlc3VtZSwgYnV0IGluc2lkZSBvbmUgZ2V0ZGVudHMoMikgY2FsbC4gIHJtZGlyKDIpIGNhbm5vdCByZWFjaFxuKyAqIHRoYXQgd2luZG93IGJlY2F1c2UgaXRlcmF0ZV9kaXIoKSBob2xkcyB0aGUgbGlzdGVkIGRpcmVjdG9yeSdzIGlfcndzZW1cbisgKiBmb3IgdGhlIHdob2xlIGxpc3Rpbmc7IGNncm91cC5zdWJ0cmVlX2NvbnRyb2wgY2FuLCBoYXZpbmcgbm8gVkZTXG4rICogb3BlcmF0aW9uIG9uIHRoZSBuYW1lcyBpdCBhZGRzIGFuZCByZW1vdmVzLiAgVGhlIGZpbGVzIHRoYXQgYXJlIG5vdCB0aGVcbisgKiBjb250cm9sbGVyJ3Mgc3RheSB0aHJvdWdob3V0LCBzbyBlYWNoIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS5cbisgKlxuKyAqIEEgc3RyZXNzIHRlc3Q6IGl0IGhhcyBub3QgYmVlbiBzZWVuIHRvIGNhdGNoIHRoZSBvcmRlcmluZyBidWcsIGFuZCBpc1xuKyAqIGhlcmUgdG8ga2VlcCB0aGUgdW5sb2NrZWQgd2luZG93IHVuZGVyIGxvYWQgZm9yIGxvY2tkZXAgYW5kIEtBU0FOLlxuKyAqL1xuK1RFU1RfRihrZXJuZnNfY2dyb3VwLCByZWFkZGlyX3Jlc3VtZV92c19pbnRlcm5hbF9yZW1vdmUpXG4re1xuK1x0Y2hhciBidWZbQ0hVUk5fQlVGU1pdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTtcbitcdGNoYXIgc3RhYmxlWzEyOF1bTkFNRV9NQVggKyAxXTtcbitcdGludCBuc3RhYmxlID0gMCwgaSwgcjtcbitcdGludCB3aXRoY3RsID0gMCwgd2l0aG91dCA9IDA7XG4rXHRpbnQgc2VlblsxMjhdLCBzdGF0dXM7XG4rXHRwaWRfdCBjaHVybmVyO1xuK1x0RElSICpkO1xuK1xuK1x0LyogV2l0aCB0aGUgY29udHJvbGxlciBvZmYsIHdoYXRldmVyIGlzIGxlZnQgaXMgd2hhdCBtdXN0IHBlcnNpc3QuICovXG4rXHRBU1NFUlRfRVEod3JpdGVfZmlsZShzZWxmLVx1MDAzZXNjcmF0Y2hfc2MsIHNlbGYtXHUwMDNlZGlzYWJsZSksIDApO1xuK1x0ZCA9IG9wZW5kaXIoc2VsZi1cdTAwM2VjaGlsZCk7XG4rXHRBU1NFUlRfTkUoZCwgTlVMTCk7XG4rXHRmb3IgKDs7KSB7XG4rXHRcdHN0cnVjdCBkaXJlbnQgKmRlID0gcmVhZGRpcihkKTtcbitcbitcdFx0aWYgKCFkZSlcbitcdFx0XHRicmVhaztcbitcdFx0aWYgKCFzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi5cIikgfHwgIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIFwiLi5cIikpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdEFTU0VSVF9MVChuc3RhYmxlLCAoaW50KUFSUkFZX1NJWkUoc3RhYmxlKSk7XG4rXHRcdHN0cm5jcHkoc3RhYmxlW25zdGFibGVdLCBkZS1cdTAwM2VkX25hbWUsIE5BTUVfTUFYKTtcbitcdFx0c3RhYmxlW25zdGFibGVdW05BTUVfTUFYXSA9ICdcXDAnO1xuK1x0XHRuc3RhYmxlKys7XG4rXHR9XG4rXHRjbG9zZWRpcihkKTtcbitcdEFTU0VSVF9HVChuc3RhYmxlLCAwKTtcbitcbitcdGNodXJuZXIgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UoY2h1cm5lciwgMCk7XG4rXHRpZiAoY2h1cm5lciA9PSAwKSB7XG4rXHRcdGZvciAoOzspIHtcbitcdFx0XHRpZiAod3JpdGVfZmlsZShzZWxmLVx1MDAzZXNjcmF0Y2hfc2MsIHNlbGYtXHUwMDNlZW5hYmxlKSlcbitcdFx0XHRcdF9leGl0KDEwKTtcbitcdFx0XHR1c2xlZXAoQ0hVUk5fRFdFTExfT04pO1xuK1x0XHRcdGlmICh3cml0ZV9maWxlKHNlbGYtXHUwMDNlc2NyYXRjaF9zYywgc2VsZi1cdTAwM2VkaXNhYmxlKSlcbitcdFx0XHRcdF9leGl0KDExKTtcbitcdFx0XHR1c2xlZXAoQ0hVUk5fRFdFTExfT0ZGKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0Zm9yIChyID0gMDsgciBcdTAwM2MgQ0hVUk5fUk9VTkRTOyByKyspIHtcbitcdFx0aW50IGZkID0gb3BlbihzZWxmLVx1MDAzZWNoaWxkLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKTtcbitcdFx0aW50IGV4dHJhID0gMDtcbitcdFx0aW50IG47XG4rXG4rXHRcdEFTU0VSVF9HRShmZCwgMCk7XG4rXHRcdG1lbXNldChzZWVuLCAwLCBzaXplb2Yoc2VlbikpO1xuK1xuK1x0XHR3aGlsZSAoKG4gPSBzeXNjYWxsKFNZU19nZXRkZW50czY0LCBmZCwgYnVmLCBzaXplb2YoYnVmKSkpIFx1MDAzZSAwKSB7XG4rXHRcdFx0aW50IG9mZiA9IDA7XG4rXG4rXHRcdFx0d2hpbGUgKG9mZiBcdTAwM2Mgbikge1xuK1x0XHRcdFx0c3RydWN0IGtlcm5mc19kaXJlbnQ2NCAqZGUgPSAodm9pZCAqKShidWYgKyBvZmYpO1xuK1x0XHRcdFx0Ym9vbCBrbm93biA9IGZhbHNlO1xuK1xuK1x0XHRcdFx0b2ZmICs9IGRlLVx1MDAzZWRfcmVjbGVuO1xuK1x0XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnN0YWJsZTsgaSsrKVxuK1x0XHRcdFx0XHRpZiAoIXN0cmNtcChkZS1cdTAwM2VkX25hbWUsIHN0YWJsZVtpXSkpIHtcbitcdFx0XHRcdFx0XHRzZWVuW2ldKys7XG4rXHRcdFx0XHRcdFx0a25vd24gPSB0cnVlO1xuK1x0XHRcdFx0XHR9XG4rXHRcdFx0XHRpZiAoIWtub3duIFx1MDAyNlx1MDAyNiBzdHJjbXAoZGUtXHUwMDNlZF9uYW1lLCBcIi5cIikgXHUwMDI2XHUwMDI2XG4rXHRcdFx0XHQgICAgc3RyY21wKGRlLVx1MDAzZWRfbmFtZSwgXCIuLlwiKSlcbitcdFx0XHRcdFx0ZXh0cmErKztcbitcdFx0XHR9XG4rXHRcdH1cbitcdFx0QVNTRVJUX0dFKG4sIDApO1xuK1x0XHRFWFBFQ1RfRVEoY2xvc2UoZmQpLCAwKTtcbitcbitcdFx0aWYgKGV4dHJhKVxuK1x0XHRcdHdpdGhjdGwrKztcbitcdFx0ZWxzZVxuK1x0XHRcdHdpdGhvdXQrKztcbitcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnN0YWJsZTsgaSsrKVxuK1x0XHRcdEFTU0VSVF9FUShzZWVuW2ldLCAxKVxuK1x0XHRcdFx0VEhfTE9HKFwicm91bmQgJWQ6ICVzIHNlZW4gJWQgdGltZXNcIixcbitcdFx0XHRcdCAgICAgICByLCBzdGFibGVbaV0sIHNlZW5baV0pO1xuK1x0fVxuK1xuK1x0LyogVGhlIGNodXJuIG11c3QgaGF2ZSBiZWVuIHJ1bm5pbmcsIG9yIHRoZSBsaXN0aW5ncyBwcm92ZSBub3RoaW5nLiAqL1xuK1x0RVhQRUNUX0VRKGtpbGwoY2h1cm5lciwgU0lHS0lMTCksIDApO1xuK1x0QVNTRVJUX0VRKHdhaXRwaWQoY2h1cm5lciwgXHUwMDI2c3RhdHVzLCAwKSwgY2h1cm5lcik7XG4rXHRBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpIFx1MDAyNlx1MDAyNiBXVEVSTVNJRyhzdGF0dXMpID09IFNJR0tJTEwpXG4rXHRcdFRIX0xPRyhcImNodXJuZXIgZXhpdGVkIG9uIGl0cyBvd246IHN0YXR1cyAlZFwiLCBzdGF0dXMpO1xuK1xuK1x0LypcbitcdCAqIFRoZXkgYWxzbyBoYXZlIHRvIGhhdmUgb3ZlcmxhcHBlZCBpdC4gIEhvdyBtdWNoIGRlcGVuZHMgb24gdGhlXG4rXHQgKiBtYWNoaW5lLCBzbyBzYXkgdGhlIHJhY2UgY291bGQgbm90IGJlIGFycmFuZ2VkIHJhdGhlciB0aGFuIGZhaWwuXG4rXHQgKi9cbitcdGlmICghd2l0aGN0bCB8fCAhd2l0aG91dClcbitcdFx0U0tJUChyZXR1cm4sIFwibGlzdGluZ3MgZGlkIG5vdCBzcGFuIHRoZSBjaHVybjogJWQgd2l0aCwgJWQgd2l0aG91dFwiLFxuK1x0XHQgICAgIHdpdGhjdGwsIHdpdGhvdXQpO1xuK31cbitcbiAvKlxuICAqIEEgdGVsbGRpcigpIGNvb2tpZSBtdXN0IHJlc29sdmUgYmFjayB0byB0aGUgc2FtZSBlbnRyeSBhZnRlciBzZWVrZGlyKCkuXG4gICoga2VybmZzIGVuY29kZXMgdGhlIGNvb2tpZSBhcyB0aGUgbm9kZSdzIG5hbWUgaGFzaCwgc28gdGhpcyBjb3ZlcnNcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMyOjMxLjE2ODEyMDg1WiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMxNzI5ODIyOTE3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEZ1enppbmcgU2Vzc2lvbiBBc3Nlc3NtZW50KipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBvYmplY3RpdmUgaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBwYXRjaCBzZXJpZXMgd2FycmFudHMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiBUaGUgcnVsZSBpcyBjbGVhcjogS01TQU4gaXMgZXhwZW5zaXZlLCBhbmQgc2hvdWxkICpvbmx5KiBiZSBjb25zaWRlcmVkIGlmIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGFyZSAqZXhjbHVzaXZlbHkqIGRldGVjdGFibGUgYnkgS01TQU4uIElmIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgY2FuIGNhdGNoIGFuIGlzc3VlLCB3ZSBkb24ndCBuZWVkIEtNU0FOLlxuXG5GaXJzdCwgSSBleGFtaW5lZCB0aGUgcGF0Y2ggaW4gYGZzL2tlcm5mcy9kaXIuY2AuIEkgbm90aWNlZCB0aGlzIGxpbmU6IGBuYW1lID0ga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7YC4gIEFoYSEgYGttYWxsb2NgIHdpdGhvdXQgYGt6YWxsb2NgLi4udGhhdCdzIGEgcG90ZW50aWFsIHJlZCBmbGFnLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgYG5hbWVgIGNvdWxkIGJlIHVuaW5pdGlhbGl6ZWQuXG5cbk5vdywgSSBmb2xsb3dlZCB0aGUgY29kZSBmbG93LiAgYG5hbWVgIGlzIGFsbG9jYXRlZCwgYW5kIHRoZSBga2VybmZzX2Rpcl9wb3NgIGlzIGNhbGxlZC4gQ3JpdGljYWxseSwgZHVyaW5nIHRoZSAqZmlyc3QqIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB0aGF0IHByb2Nlc3NlcyB0aGUgZGlyZWN0b3J5IGVudHJpZXMsIGBuYW1lYCBpcywgYXQgdGhhdCBwb2ludCwgc3RpbGwgdW5pbml0aWFsaXplZC5cblxuVGhlbiwgaW5zaWRlIHRoZSBsb29wLCB0aGUgY3JpdGljYWwgbGluZSBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpO2AgY29tZXMgaW50byBwbGF5LiAqVGhpcyogaXMgd2hhdCBwb3B1bGF0ZXMgYG5hbWVgIHdpdGggYSBzdHJpbmcgZnJvbSBga2VybmZzX3JjdV9uYW1lKHBvcylgLiBDcnVjaWFsbHksIHRoaXMgY29waWVzIGFuZCBOVUwtdGVybWluYXRlcyB0aGUgc3RyaW5nLlxuXG5UaGUgbmV4dCBjb25jZXJuIHRoYXQgY2FtZSB0byBtaW5kIHdhcyB3aGV0aGVyIHRoZSBjb2RlIG1ha2VzIHVzZSBvZiB0aGUgd2hvbGUgYnVmZmVyIGFsbG9jYXRlZCBmb3IgYG5hbWVgLCBuYW1lbHkgd2hldGhlciBgbmFtZWAgaXMgcmVhZCBiZXlvbmQgYGxlbmAuICBTbywgSSBjaGVja2VkIHdoZXJlIGBuYW1lYCBpcyB1c2VkLCBhbmQgaW4gdGhpcyBjYXNlLCBgZGlyX2VtaXQoY3R4LCBuYW1lLCBsZW4sIGlubywgdHlwZSk7YC4gXG5cbkF0IHRoaXMgcG9pbnQsIEkgd291bGQgbmVlZCB0byBhbmFseXplIGBkaXJfZW1pdGAgYW5kIHNlZSB3aGF0IGl0IGRvZXMgd2l0aCBgbmFtZWAgYW5kIGBsZW5gLlxuSG93ZXZlciwgSSBjYW4gY29uY2x1ZGUgc28gZmFyIHRoYXQgZ2l2ZW4gYG5hbWVgIGlzIHVuaW5pdGlhbGl6ZWQgYmVmb3JlIGBzdHJzY3B5YCBpcyBjYWxsZWQgaW5zaWRlIHRoZSBsb29wLCBidXQgaXMgKmluaXRpYWxpemVkKiBiZWZvcmUgYW55IHVzZSBiZXlvbmQgdGhhdCBwb2ludCwgaXQgZG9lcyBub3QganVzdGlmeSBhIEtNU0FOIHNlc3Npb24uIEtBU0FOL290aGVyIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgYXJlIHN1ZmZpY2llbnQgaGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NjM1NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzOTQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzowMi44OTc5NDc0NzhaIiwiU2VxIjoyMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ5MDgzMjE1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJkaXJfZW1pdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL2xpbnV4L2ZzLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9mcy5oPTM1OTY9c3RhdGljIGlubGluZSBib29sIGlzX3Jvb3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmluY2x1ZGUvbGludXgvZnMuaC0zNjAwLVxcbmluY2x1ZGUvbGludXgvZnMuaDozNjAxOnN0YXRpYyBpbmxpbmUgYm9vbCBkaXJfZW1pdChzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCxcXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYwMi1cXHRcXHRcXHQgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYwOC19XFxuaW5jbHVkZS9saW51eC9mcy5oOjM2MDk6c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuaW5jbHVkZS9saW51eC9mcy5oLTM2MTAte1xcbi0tXFxuaW5jbHVkZS9saW51eC9mcy5oLTM2MTMtfVxcbmluY2x1ZGUvbGludXgvZnMuaDozNjE0OnN0YXRpYyBpbmxpbmUgYm9vbCBkaXJfZW1pdF9kb3Rkb3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbmluY2x1ZGUvbGludXgvZnMuaC0zNjE1LXtcXG4tLVxcbmluY2x1ZGUvbGludXgvZnMuaC0zNjE4LX1cXG5pbmNsdWRlL2xpbnV4L2ZzLmg6MzYxOTpzdGF0aWMgaW5saW5lIGJvb2wgZGlyX2VtaXRfZG90cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuaW5jbHVkZS9saW51eC9mcy5oLTM2MjAte1xcbmluY2x1ZGUvbGludXgvZnMuaC0zNjIxLVxcdGlmIChjdHgtXFx1MDAzZXBvcyA9PSAwKSB7XFxuaW5jbHVkZS9saW51eC9mcy5oOjM2MjI6XFx0XFx0aWYgKCFkaXJfZW1pdF9kb3QoZmlsZSwgY3R4KSlcXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYyMy1cXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2ZzLmgtMzYyNi1cXHRpZiAoY3R4LVxcdTAwM2Vwb3MgPT0gMSkge1xcbmluY2x1ZGUvbGludXgvZnMuaDozNjI3OlxcdFxcdGlmICghZGlyX2VtaXRfZG90ZG90KGZpbGUsIGN0eCkpXFxuaW5jbHVkZS9saW51eC9mcy5oLTM2MjgtXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzowMy4zODg4MDIxNTVaIiwiU2VxIjoyMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjM0NTU0Mjc3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIERpcmVjdG9yeSBFbWl0dGluZyBMb2dpYyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgZGlyZWN0b3J5IGVudHJpZXMuIExldCdzIHN0YXJ0IHdpdGggYGluY2x1ZGUvbGludXgvZnMuaGAuIFNwZWNpZmljYWxseSwgSSB0aGluayBgZGlyX2VtaXRgIGlzIGdvaW5nIHRvIGJlIGtleSB0byBob3cgdGhlc2UgZW50cmllcyBhcmUgY3JlYXRlZCBhbmQgcG9wdWxhdGVkLiBJJ20gZ29pbmcgdG8gbG9vayBhcm91bmQgbGluZSAzNjAxIGluIHRoYXQgZmlsZSBhbmQgemVybyBpbiBvbiB0aGUgYGRpcl9lbWl0YCBmdW5jdGlvbi4gSXQncyBsaWtlbHkgdGhhdCBpdCBob2xkcyB0aGUgY29yZSBsb2dpYyBmb3IgdGhlIHByb2Nlc3Mgb2YgXCJlbWl0dGluZ1wiIG9yIG91dHB1dHRpbmcgZGlyZWN0b3J5IGVudHJpZXMgZHVyaW5nIGRpcmVjdG9yeSB0cmF2ZXJzYWwgb3IgbGlzdGluZyBvcGVyYXRpb25zLiBJIGV4cGVjdCB0byBmaW5kIHRoZSBkZXRhaWxzIG9mIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIGhvdyBuYW1lcyBhcmUgaGFuZGxlZCwgYW5kIGhvdyB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIGludGVyYWN0cyB3aXRoIHRoZSBkaXJlY3RvcnkgY2FjaGUgb3Igb3RoZXIgc3RydWN0dXJlcy4gSG9wZWZ1bGx5LCBJJ2xsIHF1aWNrbHkgZ2V0IGEgZmVlbCBmb3IgaG93IHRoaXMgY3JpdGljYWwgY29tcG9uZW50IGZpdHMgaW50byB0aGUgYnJvYWRlciBmaWxlc3lzdGVtIGFyY2hpdGVjdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6OTY4MiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjA1LjczNDM0NzU0N1oiLCJTZXEiOjI0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjk2MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS9saW51eC9mcy5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM2MDAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjM2MDA6XFx0XFxuMzYwMTpcXHRzdGF0aWMgaW5saW5lIGJvb2wgZGlyX2VtaXQoc3RydWN0IGRpcl9jb250ZXh0ICpjdHgsXFxuMzYwMjpcXHRcXHRcXHRcXHQgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sXFxuMzYwMzpcXHRcXHRcXHRcXHQgICAgdTY0IGlubywgdW5zaWduZWQgdHlwZSlcXG4zNjA0OlxcdHtcXG4zNjA1OlxcdFxcdHVuc2lnbmVkIGludCBkdF9tYXNrID0gU19EVF9NQVNLIHwgY3R4LVxcdTAwM2VkdF9mbGFnc19tYXNrO1xcbjM2MDY6XFx0XFxuMzYwNzpcXHRcXHRyZXR1cm4gY3R4LVxcdTAwM2VhY3RvcihjdHgsIG5hbWUsIG5hbWVsZW4sIGN0eC1cXHUwMDNlcG9zLCBpbm8sIHR5cGUgXFx1MDAyNiBkdF9tYXNrKTtcXG4zNjA4OlxcdH1cXG4zNjA5OlxcdHN0YXRpYyBpbmxpbmUgYm9vbCBkaXJfZW1pdF9kb3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbjM2MTA6XFx0e1xcbjM2MTE6XFx0XFx0cmV0dXJuIGN0eC1cXHUwMDNlYWN0b3IoY3R4LCBcXFwiLlxcXCIsIDEsIGN0eC1cXHUwMDNlcG9zLFxcbjM2MTI6XFx0XFx0XFx0XFx0ICBmaWxlLVxcdTAwM2VmX3BhdGguZGVudHJ5LVxcdTAwM2VkX2lub2RlLVxcdTAwM2VpX2lubywgRFRfRElSKTtcXG4zNjEzOlxcdH1cXG4zNjE0OlxcdHN0YXRpYyBpbmxpbmUgYm9vbCBkaXJfZW1pdF9kb3Rkb3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbjM2MTU6XFx0e1xcbjM2MTY6XFx0XFx0cmV0dXJuIGN0eC1cXHUwMDNlYWN0b3IoY3R4LCBcXFwiLi5cXFwiLCAyLCBjdHgtXFx1MDAzZXBvcyxcXG4zNjE3OlxcdFxcdFxcdFxcdCAgZF9wYXJlbnRfaW5vKGZpbGUtXFx1MDAzZWZfcGF0aC5kZW50cnkpLCBEVF9ESVIpO1xcbjM2MTg6XFx0fVxcbjM2MTk6XFx0c3RhdGljIGlubGluZSBib29sIGRpcl9lbWl0X2RvdHMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzowNS43MzQ2MTkxMDdaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTEyMjc3MzU5NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBEaXJlY3RvcnkgSXRlcmF0aW9uIExvZ2ljKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBgZGlyX2VtaXRgIGlzIGNhbGxlZCB3aXRoIGBuYW1lYCBhbmQgYG5hbWVsZW5gLCBhbmQgSSBpbml0aWFsbHkgYXNzdW1lZCB0aGF0IGBuYW1lYCBoZWxkIGBsZW5gIGluaXRpYWxpemVkIGJ5dGVzIHBsdXMgYSBudWxsIHRlcm1pbmF0b3IuIEJ1dCBzb21ldGhpbmcgZmVlbHMgb2ZmIHdpdGggdGhlIGxvb3AuIFRoZSBjcnVjaWFsIHBvaW50IHNlZW1zIHRvIGJlIGhvdyB0aGUgYG5hbWVgIGFyZ3VtZW50IGlzIGhhbmRsZWQgYWNyb3NzIGl0ZXJhdGlvbnMuXG5cbkxvb2tpbmcgYXQgdGhlIGxvb3AncyBzdHJ1Y3R1cmUsIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgaXMgY2FsbGVkLiBJdCBsb29rcyBhdCB0aGUgYGtlcm5mc19kaXJfcG9zYCBmdW5jdGlvbi4gVGhhdCBmdW5jdGlvbiB0YWtlcyB0aGUgYG5hbWVgIGFyZ3VtZW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgYmVoYXZpb3IuXG5cbk15IGltbWVkaWF0ZSBjb25jZXJuIGlzIHRoZSBwb3RlbnRpYWwgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzZSB3aXRoIHRoZSBgbmFtZWAgYXJndW1lbnQuIERpZ2dpbmcgaW50byBga2VybmZzX2Rpcl9wb3NgLCB0aGUgY29kZSBpbml0aWFsbHkgY2hlY2tzIGlmIGEgYHBvc2AgaXMgdmFsaWQgYW5kIGlmIGBzdHJjbXBgIHdpbGwgYmUgY2FsbGVkIHdpdGggYG5hbWVgLCB3aGljaCBpbml0aWFsbHkgY291bGQgYmUgdW5pbml0aWFsaXplZC4gSG93ZXZlciwgdGhlIGZpcnN0IGNhbGwgcGFzc2VzIGEgTlVMTCBgbmFtZWAgYXJndW1lbnQgdG8gYGtlcm5mc19kaXJfcG9zYCwgc28gdGhhdCdzIHRoZSBzdGFydGluZyBwb2ludC5cblxuSW5zaWRlIHRoZSBsb29wLCBpdCdzIGNsZWFyIG5vdzogYGtlcm5mc19kaXJfcG9zYCBpcyBjYWxsZWQgd2l0aCBhIE5VTEwgYG5hbWVgLiBUaGVuLCBpZiBgcG9zYCBpcyBub24tbnVsbCwgYHN0cnNjcHlgIGlzIHVzZWQgdG8gcG9wdWxhdGUgYG5hbWVgIHdpdGggYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gYGtlcm5mc19yY3VfbmFtZShwb3MpYC4gKlRoYXQncyogd2hlcmUgdGhlIHN0cmluZyBpcyBwb3B1bGF0ZWQhIENydWNpYWxseSwgdGhpcyBtZWFucyBgbmFtZWAgaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQgKmJlZm9yZSogaXQgaXMgdXNlZCBpbiB0aGUgc3Vic2VxdWVudCBjYWxsIHRvIGBrZXJuZnNfZGlyX25leHRfcG9zYC4gU28gYWZ0ZXIgdGhlIGZpcnN0IGxvb3AgaXRlcmF0aW9uLCBgbmFtZWAgaXMgbm93IGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIEFuZCB0aGVuIGluIHRoZSBjaGVjayBhZ2FpbnN0IGBrZXJuZnNfcmN1X25hbWUocG9zKWAgaXQgaXMgc2FmZSB0byB1c2UuXG5cbkxldCdzIGxvb2sgYXQgYGtlcm5mc19uYW1lX2NvbXBhcmVgLCB0aG91Z2gsIHNpbmNlIHRoYXQgaXMgdXNlZCBhcyB3ZWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDMwNywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk1MCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjE2Ljk2MjM1NzQyWiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MTE2MTQ4OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrZXJuZnNfbmFtZV9jb21wYXJlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2tlcm5mcy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMva2VybmZzL2Rpci5jPTMyOT1zdGF0aWMgdW5zaWduZWQgaW50IGtlcm5mc19uYW1lX2hhc2goY29uc3QgY2hhciAqbmFtZSxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0zNDUtXFxuZnMva2VybmZzL2Rpci5jOjM0NjpzdGF0aWMgaW50IGtlcm5mc19uYW1lX2NvbXBhcmUodW5zaWduZWQgaW50IGhhc2gsIGNvbnN0IGNoYXIgKm5hbWUsXFxuZnMva2VybmZzL2Rpci5jLTM0Ny1cXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsIGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MzYzPXN0YXRpYyBpbnQga2VybmZzX3NkX2NvbXBhcmUoY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICpsZWZ0LFxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTM2NS17XFxuZnMva2VybmZzL2Rpci5jOjM2NjpcXHRyZXR1cm4ga2VybmZzX25hbWVfY29tcGFyZShsZWZ0LVxcdTAwM2VoYXNoLCBrZXJuZnNfcmN1X25hbWUobGVmdCksIGxlZnQtXFx1MDAzZW5zLCByaWdodCk7XFxuZnMva2VybmZzL2Rpci5jLTM2Ny19XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9ODkyPXN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19maW5kX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LFxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTkxMy1cXHRcXHRrbiA9IHJiX3RvX2tuKG5vZGUpO1xcbmZzL2tlcm5mcy9kaXIuYzo5MTQ6XFx0XFx0cmVzdWx0ID0ga2VybmZzX25hbWVfY29tcGFyZShoYXNoLCBuYW1lLCBucywga24pO1xcbmZzL2tlcm5mcy9kaXIuYy05MTUtXFx0XFx0aWYgKHJlc3VsdCBcXHUwMDNjIDApXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTkxMD1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0xOTQyLVxcbmZzL2tlcm5mcy9kaXIuYzoxOTQzOlxcdFxcdFxcdGlmIChrZXJuZnNfbmFtZV9jb21wYXJlKGhhc2gsIG5hbWUgPzogXFxcIlxcXCIsIG5zLCBrbikgXFx1MDAzYyAwKSB7XFxuZnMva2VybmZzL2Rpci5jLTE5NDQtXFx0XFx0XFx0XFx0cG9zID0ga247XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjE3LjAxMzUyNjYzOFoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDg5Mzk0NjI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSB0aGlua2luZyB0aHJvdWdoIHRoaXMgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBrZXJuZnNfbmFtZV9jb21wYXJlKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIGtlcm5mcyBuYW1lcyBhcmUgYmVpbmcgY29tcGFyZWQuIFRpbWUgdG8gZGlnIGludG8gdGhlIGNvZGUuIFRoZSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IGlzIHRoZSBgZnMva2VybmZzL2Rpci5jYCBmaWxlLCBzaW5jZSB3ZSdyZSBkZWFsaW5nIHdpdGggZGlyZWN0b3J5IG9wZXJhdGlvbnMsIGFuZCB0aGUgZnVuY3Rpb24gbmFtZSBpcyBga2VybmZzX25hbWVfY29tcGFyZWAuIExldCdzIHNlZSB3aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBsb29rcyBsaWtlLiBJJ20gZXhwZWN0aW5nIHNvbWV0aGluZyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCwgbGlrZWx5IGludm9sdmluZyBhIGBzdHJjbXBgLWxpa2UgY29tcGFyaXNvbiwgYnV0IEkgd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBzdWJ0bGUgZGlmZmVyZW5jZXMgb3Igb3B0aW1pemF0aW9ucyBpbiBwbGF5IGZvciB0aGVzZSBrZXJuZnMgZW50cmllcy4gSSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvdGhlciBmdW5jdGlvbnMgYmVpbmcgY2FsbGVkIHdoaWNoIGNvdWxkIGV4cGxhaW4gYmVoYXZpb3VyLCBpdCB3b3VsZCBiZSBzZW5zaWJsZSB0byBsb29rIGF0IGFsbCBhc3BlY3RzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIxNTUsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzoxOS4xMDI5MjQwOTdaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUxMDcxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2tlcm5mcy9kaXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzNDUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNDU6XFx0XFxuIDM0NjpcXHRzdGF0aWMgaW50IGtlcm5mc19uYW1lX2NvbXBhcmUodW5zaWduZWQgaW50IGhhc2gsIGNvbnN0IGNoYXIgKm5hbWUsXFxuIDM0NzpcXHRcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsIGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXFxuIDM0ODpcXHR7XFxuIDM0OTpcXHRcXHR1NjQgbnNfaWQgPSBrZXJuZnNfbnNfaWQobnMpO1xcbiAzNTA6XFx0XFx0dTY0IGtuX25zX2lkID0ga2VybmZzX25zX2lkKGtuLVxcdTAwM2Vucyk7XFxuIDM1MTpcXHRcXG4gMzUyOlxcdFxcdGlmIChoYXNoIFxcdTAwM2Mga24tXFx1MDAzZWhhc2gpXFxuIDM1MzpcXHRcXHRcXHRyZXR1cm4gLTE7XFxuIDM1NDpcXHRcXHRpZiAoaGFzaCBcXHUwMDNlIGtuLVxcdTAwM2VoYXNoKVxcbiAzNTU6XFx0XFx0XFx0cmV0dXJuIDE7XFxuIDM1NjpcXHRcXHRpZiAobnNfaWQgXFx1MDAzYyBrbl9uc19pZClcXG4gMzU3OlxcdFxcdFxcdHJldHVybiAtMTtcXG4gMzU4OlxcdFxcdGlmIChuc19pZCBcXHUwMDNlIGtuX25zX2lkKVxcbiAzNTk6XFx0XFx0XFx0cmV0dXJuIDE7XFxuIDM2MDpcXHRcXHRyZXR1cm4gc3RyY21wKG5hbWUsIGtlcm5mc19yY3VfbmFtZShrbikpO1xcbiAzNjE6XFx0fVxcbiAzNjI6XFx0XFxuIDM2MzpcXHRzdGF0aWMgaW50IGtlcm5mc19zZF9jb21wYXJlKGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqbGVmdCxcXG4gMzY0OlxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICpyaWdodClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzM6MTkuMTAzMDc3NDA4WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjUzMTMzNjUxOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgUG90ZW50aWFsIFZ1bG5lcmFiaWxpdHkgaW4gYGtlcm5mc19uYW1lX2NvbXBhcmVgKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYGtlcm5mc19uYW1lX2NvbXBhcmVgLCBhbmQgaXQncyB1c2luZyBgc3RyY21wYCB0byBjb21wYXJlIGBuYW1lYCB3aXRoIGBrZXJuZnNfcmN1X25hbWUoa24pYC4gVGhhdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLCBhbmQgYG5hbWVgIGlzIGJlaW5nIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweWAsIHNvIGl0ICpzaG91bGQqIGJlIGEgdmFsaWQsIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIExldCdzIHNlZS4uLiBJJ20gZ29pbmcgdG8gZG91YmxlIGNoZWNrLiBgbmFtZWAgaXMgc2V0IHRvIGBOVUxMYCBidXQgaXQgc2VlbXMgaXQgY2FuIGJlIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKTtgLi4uIGlmIHRoYXQgZmFpbHMsIHdlIGdldCBgLUVOT01FTWAuXG5cblJpZ2h0LCBga21hbGxvY2AgaXMgdXNlZC4gTm93LCB3aGVuIGBzdHJzY3B5YCBjb3BpZXMgaW50byBgbmFtZWAsIHRoZSBtYXhpbXVtIGl0IHdyaXRlcyBpcyBgbGVuICsgMWAgYnl0ZXMgKGNoYXJhY3RlcnMgcGx1cyB0aGUgbnVsbCB0ZXJtaW5hdG9yKS4gVGhlIGltcG9ydGFudCB0aGluZyBpcyB0aGF0IHRoZSAqcmVzdCogb2YgYG5hbWVgLCBmcm9tIGBuYW1lICsgbGVuICsgMWAgdXAgdG8gYG5hbWUgKyBQQVRIX01BWCAtIDFgLCByZW1haW5zIGNvbXBsZXRlbHkgdW5pbml0aWFsaXplZC4gVGhhdCBtYWtlcyBtZSB3b25kZXIsIGNvdWxkIHNvbWV0aGluZyBpbmFkdmVydGVudGx5IHJlYWQgcGFzdCB0aGUgYFxcMGAgYW5kIGludG8gdGhhdCB1bmluaXRpYWxpemVkIG1lbW9yeT9cblxuV2FpdCwgaG9sZCBvbi4gTGV0J3MgdGhpbmsgdGhpcyB0aHJvdWdoLiBJbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCBsZXQncyBzYXkgYHBvcy1cdTAwM2VuYW1lYCBpcyBcImZvb1wiLiBTbyBgbmFtZWAgY29udGFpbnMgXCJmXCIsIFwib1wiLCBcIm9cIiwgXCJcXDBcIiwgdGhlbiBnYXJiYWdlLiBUaGVuLCBpbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiwgYHN0cnNjcHlgIGlzIGNhbGxlZCBhZ2Fpbi4gSWYgYHBvcy1cdTAwM2VuYW1lYCBpcywgc2F5LCBcImFiXCIsIHRoZW4gYG5hbWVgIHdpbGwgaGF2ZSBcImFcIiwgXCJiXCIsIFwiXFwwXCIsIFwiXFwwXCIsIGFuZCBtb3JlIGdhcmJhZ2UuIEJ1dCwgaGVyZSdzIHRoZSB0aGluZzogYHN0cmNtcGAgKm9ubHkqIHJlYWRzIHVudGlsIGl0IGZpbmRzIGEgYFxcMGAsIHNvIHRoYXQncyBzYWZlLiBBbHNvLCBgZGlyX2VtaXRgIG9ubHkgcmVhZHMgdXAgdG8gYG5hbWVsZW5gLlxuXG5UaGUgcmVhbCBxdWVzdGlvbiBpcywgZG9lcyBgZGlyX2VtaXRgIGNvcHkgYG5hbWVgIHRvIHVzZXIgc3BhY2U/IFRoYXQgd291bGQgYmUgYSBiaWdnZXIgaXNzdWUuIExldCdzIHNlZS4uLiBgZGlyX2VtaXRgIGNhbGxzIGBjdHgtXHUwMDNlYWN0b3IoY3R4LCBuYW1lLCBuYW1lbGVuLCBjdHgtXHUwMDNlcG9zLCBpbm8sIHR5cGUgXHUwMDI2IGR0X21hc2spO2AuIFRoZSBhY3Rvci4uLiB0aGF0J3MgdXN1YWxseSBlaXRoZXIgYGZpbGxkaXJgLCBgZmlsbGRpcjY0YCwgb3IgYGNvbXBhdF9maWxsZGlyYCwgYW5kIHRoYXQncyBpbiBgZnMvcmVhZGRpci5jYC4gSSBuZWVkIHRvIGNoZWNrIGBmaWxsZGlyNjRgLiBJIHRoaW5rIHRoYXQncyB3aGVyZSBJIG5lZWQgdG8gbG9vay5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI3MTYsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NzMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzoyNC40MTY0NDQ2ODNaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ5MjUyNDE3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZpbGxkaXI2NFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9yZWFkZGlyLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvcmVhZGRpci5jPTMzND1zdHJ1Y3QgZ2V0ZGVudHNfY2FsbGJhY2s2NCB7XFxuLS1cXG5mcy9yZWFkZGlyLmMtMzQwLVxcbmZzL3JlYWRkaXIuYzozNDE6c3RhdGljIGJvb2wgZmlsbGRpcjY0KHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxcbmZzL3JlYWRkaXIuYy0zNDItXFx0XFx0ICAgICBsb2ZmX3Qgb2Zmc2V0LCB1NjQgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKVxcbi0tXFxuZnMvcmVhZGRpci5jPTM4ND1TWVNDQUxMX0RFRklORTMoZ2V0ZGVudHM2NCwgdW5zaWduZWQgaW50LCBmZCxcXG4tLVxcbmZzL3JlYWRkaXIuYy0zODgtXFx0c3RydWN0IGdldGRlbnRzX2NhbGxiYWNrNjQgYnVmID0ge1xcbmZzL3JlYWRkaXIuYzozODk6XFx0XFx0LmN0eC5hY3RvciA9IGZpbGxkaXI2NCxcXG5mcy9yZWFkZGlyLmMtMzkwLVxcdFxcdC5jdHguY291bnQgPSBjb3VudCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzM6MjQuNDY1NzA0MDlaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjI2NTA1NjUwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OlxuXG4qKkRpdmluZyBpbnRvIHRoZSBEaXJlY3RvcnkgUmVhZGluZyBDb2RlKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIExldCdzIGRpZyBpbnRvIHRoZSBuaXR0eS1ncml0dHkgb2YgZGlyZWN0b3J5IHJlYWRpbmcgd2l0aGluIHRoZSBrZXJuZWwuIE15IHRhcmdldCBpcyB0aGUgYGZpbGxkaXI2NGAgZnVuY3Rpb24sIHdoaWNoIEkga25vdyByZXNpZGVzIGluIGBmcy9yZWFkZGlyLmNgLiBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIG9mIHBvcHVsYXRpbmcgdGhvc2UgZGlyZWN0b3J5IGVudHJpZXMgcmVzaWRlcywgc28gdW5kZXJzdGFuZGluZyBob3cgdGhpcyBmdW5jdGlvbiB3b3JrcyBpcyBjcml0aWNhbCBmb3IgZGVidWdnaW5nIG9yIG9wdGltaXppbmcgYW55IGZpbGUgc3lzdGVtIGJlaGF2aW9yIHJlbGF0ZWQgdG8gZGlyZWN0b3J5IGxpc3RpbmdzLiBMZXQncyBzZWUgaG93IGl0IGhhbmRsZXMgdGhvc2UgNjQtYml0IGlub2RlIG51bWJlcnMuIEknbSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlcyBhbmQgd2hhdCBraW5kIG9mIGVycm9yIGNoZWNraW5nIGlzIGluIHBsYWNlLiBUaW1lIHRvIHN0YXJ0IHRyYWNpbmcgdGhlIGV4ZWN1dGlvbiBhbmQgc2VlIGlmIGFueXRoaW5nIGp1bXBzIG91dC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM5NDAsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzoyNi43MzA3NjM2ODRaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE1NDMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL3JlYWRkaXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzNDEsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNDE6XFx0c3RhdGljIGJvb2wgZmlsbGRpcjY0KHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxcbiAzNDI6XFx0XFx0XFx0ICAgICBsb2ZmX3Qgb2Zmc2V0LCB1NjQgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKVxcbiAzNDM6XFx0e1xcbiAzNDQ6XFx0XFx0c3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqZGlyZW50LCAqcHJldjtcXG4gMzQ1OlxcdFxcdHN0cnVjdCBnZXRkZW50c19jYWxsYmFjazY0ICpidWYgPVxcbiAzNDY6XFx0XFx0XFx0Y29udGFpbmVyX29mKGN0eCwgc3RydWN0IGdldGRlbnRzX2NhbGxiYWNrNjQsIGN0eCk7XFxuIDM0NzpcXHRcXHRpbnQgcmVjbGVuID0gQUxJR04oZGlyZW50X3NpemUoZGlyZW50LCBuYW1sZW4gKyAxKSwgc2l6ZW9mKHU2NCkpO1xcbiAzNDg6XFx0XFx0aW50IHByZXZfcmVjbGVuO1xcbiAzNDk6XFx0XFx0dW5zaWduZWQgaW50IGZsYWdzID0gZF90eXBlO1xcbiAzNTA6XFx0XFxuIDM1MTpcXHRcXHRCVUlMRF9CVUdfT04oRklMTERJUl9GTEFHX05PSU5UUiBcXHUwMDI2IFNfRFRfTUFTSyk7XFxuIDM1MjpcXHRcXHRkX3R5cGUgXFx1MDAyNj0gU19EVF9NQVNLO1xcbiAzNTM6XFx0XFxuIDM1NDpcXHRcXHRidWYtXFx1MDAzZWVycm9yID0gdmVyaWZ5X2RpcmVudF9uYW1lKG5hbWUsIG5hbWxlbik7XFxuIDM1NTpcXHRcXHRpZiAodW5saWtlbHkoYnVmLVxcdTAwM2VlcnJvcikpXFxuIDM1NjpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDM1NzpcXHRcXHRidWYtXFx1MDAzZWVycm9yID0gLUVJTlZBTDtcXHQvKiBvbmx5IHVzZWQgaWYgd2UgZmFpbC4uICovXFxuIDM1ODpcXHRcXHRpZiAocmVjbGVuIFxcdTAwM2UgY3R4LVxcdTAwM2Vjb3VudClcXG4gMzU5OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4gMzYwOlxcdFxcdHByZXZfcmVjbGVuID0gYnVmLVxcdTAwM2VwcmV2X3JlY2xlbjtcXG4gMzYxOlxcdFxcdGlmICghKGZsYWdzIFxcdTAwMjYgRklMTERJUl9GTEFHX05PSU5UUikgXFx1MDAyNlxcdTAwMjYgcHJldl9yZWNsZW4gXFx1MDAyNlxcdTAwMjYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpXFxuIDM2MjpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDM2MzpcXHRcXHRkaXJlbnQgPSBidWYtXFx1MDAzZWN1cnJlbnRfZGlyO1xcbiAzNjQ6XFx0XFx0cHJldiA9ICh2b2lkIF9fdXNlciAqKWRpcmVudCAtIHByZXZfcmVjbGVuO1xcbiAzNjU6XFx0XFx0c2NvcGVkX3VzZXJfd3JpdGVfYWNjZXNzX3NpemUocHJldiwgcmVjbGVuICsgcHJldl9yZWNsZW4sIGVmYXVsdCkge1xcbiAzNjY6XFx0XFx0XFx0LyogVGhpcyBtaWdodCBiZSAnZGlyZW50LVxcdTAwM2VkX29mZicsIGJ1dCBpZiBzbyBpdCB3aWxsIGdldCBvdmVyd3JpdHRlbiAqL1xcbiAzNjc6XFx0XFx0XFx0dW5zYWZlX3B1dF91c2VyKG9mZnNldCwgXFx1MDAyNnByZXYtXFx1MDAzZWRfb2ZmLCBlZmF1bHQpO1xcbiAzNjg6XFx0XFx0XFx0dW5zYWZlX3B1dF91c2VyKGlubywgXFx1MDAyNmRpcmVudC1cXHUwMDNlZF9pbm8sIGVmYXVsdCk7XFxuIDM2OTpcXHRcXHRcXHR1bnNhZmVfcHV0X3VzZXIocmVjbGVuLCBcXHUwMDI2ZGlyZW50LVxcdTAwM2VkX3JlY2xlbiwgZWZhdWx0KTtcXG4gMzcwOlxcdFxcdFxcdHVuc2FmZV9wdXRfdXNlcihkX3R5cGUsIFxcdTAwMjZkaXJlbnQtXFx1MDAzZWRfdHlwZSwgZWZhdWx0KTtcXG4gMzcxOlxcdFxcdFxcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cXHUwMDNlZF9uYW1lLCBuYW1lLCBuYW1sZW4sIGVmYXVsdCk7XFxuIDM3MjpcXHRcXHR9XFxuIDM3MzpcXHRcXG4gMzc0OlxcdFxcdGJ1Zi1cXHUwMDNlcHJldl9yZWNsZW4gPSByZWNsZW47XFxuIDM3NTpcXHRcXHRidWYtXFx1MDAzZWN1cnJlbnRfZGlyID0gKHZvaWQgX191c2VyICopZGlyZW50ICsgcmVjbGVuO1xcbiAzNzY6XFx0XFx0Y3R4LVxcdTAwM2Vjb3VudCAtPSByZWNsZW47XFxuIDM3NzpcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gMzc4OlxcdFxcbiAzNzk6XFx0ZWZhdWx0OlxcbiAzODA6XFx0XFx0YnVmLVxcdTAwM2VlcnJvciA9IC1FRkFVTFQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjI2LjczMDg4MTExNFoiLCJTZXEiOjMzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyOTA0MDAyMzAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIGl0OlxuXG4qKkRpZ2dpbmcgaW50byB0aGUgYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lYCBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgbGluZSBvZiBjb2RlOiBgdW5zYWZlX2NvcHlfZGlyZW50X25hbWUoZGlyZW50LVx1MDAzZWRfbmFtZSwgbmFtZSwgbmFtbGVuLCBlZmF1bHQpO2AgTXkgaW5pdGlhbCB0aG91Z2h0IGlzLCB0aGlzIGZ1bmN0aW9uIG5hbWUsIFwidW5zYWZlLFwiIGFscmVhZHkgcmFpc2VzIGEgcmVkIGZsYWcuIEknbSBhc3N1bWluZyBpdCdzIGhhbmRsaW5nIGEgcG90ZW50aWFsbHkgdHJpY2t5IG1lbW9yeSBjb3B5IG9wZXJhdGlvbiByZWxhdGVkIHRvIGRpcmVjdG9yeSBlbnRyaWVzLiBMZXQncyBzZWUgd2hhdCdzIGdvaW5nIG9uIHVuZGVyIHRoZSBob29kIG9mIGB1bnNhZmVfY29weV9kaXJlbnRfbmFtZWAuIE15IGd1dCBmZWVsaW5nIGlzIHdlJ3JlIGRlYWxpbmcgd2l0aCBzdHJpbmcgbWFuaXB1bGF0aW9uLCBwb3NzaWJseSB3aXRoIGEgZml4ZWQtc2l6ZSBidWZmZXIgKGBuYW1lYCkgYW5kIGEgc291cmNlIChgZGlyZW50LVx1MDAzZWRfbmFtZWApIHRoYXQgbWF5IG9yIG1heSBub3QgZml0IG5lYXRseS4gVGhlIGBuYW1sZW5gIGFyZ3VtZW50IGlzIHByb2JhYmx5IHRoZSBpbnRlbmRlZCBtYXhpbXVtIGNvcHkgbGVuZ3RoLCB3aGljaCBpcyBhIGdvb2Qgc2lnbiBpZiB1c2VkIGNvcnJlY3RseSBmb3IgYSBidWZmZXIgb3ZlcmZsb3cgcHJldmVudGlvbiBzdHJhdGVneS4gRmluYWxseSwgYGVmYXVsdGAsIGxvb2tzIGxpa2UgaXQgY291bGQgYmUgYSBwb2ludGVyIHRvIGEgZmxhZyBvciBlcnJvciBjb2RlIHRvIGJlIHNldCBpbiBjYXNlIHRoZSBjb3B5IGZhaWxzIGZvciBzb21lIHJlYXNvbi4gVGhlIG5hbWUgXCJlZmF1bHRcIiBzdWdnZXN0cyB0aGF0IGl0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gdGhlIGBFRkFVTFRgIGVycm9yIGNvZGUsIHdoaWNoIGluZGljYXRlcyBhIGJhZCBhZGRyZXNzIHBhc3NlZCB0byBhIHN5c3RlbSBjYWxsLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiwgbGVuZ3RoLCBhbmQgZXJyb3IgaGFuZGxpbmcgbWVjaGFuaWNzIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHRvIHByb3Blcmx5IGFzc2VzcyB0aGlzIGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0OTI3LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzoyOS42MzQ4ODYxMzdaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2NTI5Mjk1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInVuc2FmZV9jb3B5X2RpcmVudF9uYW1lXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL3JlYWRkaXIuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9yZWFkZGlyLmM9NzI9RVhQT1JUX1NZTUJPTCh3cmFwX2RpcmVjdG9yeV9pdGVyYXRvcik7XFxuLS1cXG5mcy9yZWFkZGlyLmMtNzctICovXFxuZnMvcmVhZGRpci5jOjc4OiNkZWZpbmUgdW5zYWZlX2NvcHlfZGlyZW50X25hbWUoX2RzdCwgX3NyYywgX2xlbiwgbGFiZWwpIGRvIHtcXHRcXFxcXFxuZnMvcmVhZGRpci5jLTc5LVxcdGNoYXIgX191c2VyICpkc3QgPSAoX2RzdCk7XFx0XFx0XFx0XFx0XFxcXFxcbi0tXFxuZnMvcmVhZGRpci5jPTE4Mz1zdGF0aWMgYm9vbCBmaWxsb25lZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxcbi0tXFxuZnMvcmVhZGRpci5jLTIwNi1cXHRcXHR1bnNhZmVfcHV0X3VzZXIobmFtbGVuLCBcXHUwMDI2ZGlyZW50LVxcdTAwM2VkX25hbWxlbiwgZWZhdWx0KTtcXG5mcy9yZWFkZGlyLmM6MjA3OlxcdFxcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cXHUwMDNlZF9uYW1lLCBuYW1lLCBuYW1sZW4sIGVmYXVsdCk7XFxuZnMvcmVhZGRpci5jLTIwOC1cXHR9XFxuLS1cXG5mcy9yZWFkZGlyLmM9MjU2PXN0YXRpYyBib29sIGZpbGxkaXIoc3RydWN0IGRpcl9jb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1sZW4sXFxuLS1cXG5mcy9yZWFkZGlyLmMtMjkxLVxcdFxcdHVuc2FmZV9wdXRfdXNlcihkX3R5cGUsIChjaGFyIF9fdXNlciAqKWRpcmVudCArIHJlY2xlbiAtIDEsIGVmYXVsdCk7XFxuZnMvcmVhZGRpci5jOjI5MjpcXHRcXHR1bnNhZmVfY29weV9kaXJlbnRfbmFtZShkaXJlbnQtXFx1MDAzZWRfbmFtZSwgbmFtZSwgbmFtbGVuLCBlZmF1bHQpO1xcbmZzL3JlYWRkaXIuYy0yOTMtXFx0fVxcbi0tXFxuZnMvcmVhZGRpci5jPTM0MT1zdGF0aWMgYm9vbCBmaWxsZGlyNjQoc3RydWN0IGRpcl9jb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1sZW4sXFxuLS1cXG5mcy9yZWFkZGlyLmMtMzcwLVxcdFxcdHVuc2FmZV9wdXRfdXNlcihkX3R5cGUsIFxcdTAwMjZkaXJlbnQtXFx1MDAzZWRfdHlwZSwgZWZhdWx0KTtcXG5mcy9yZWFkZGlyLmM6MzcxOlxcdFxcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cXHUwMDNlZF9uYW1lLCBuYW1lLCBuYW1sZW4sIGVmYXVsdCk7XFxuZnMvcmVhZGRpci5jLTM3Mi1cXHR9XFxuLS1cXG5mcy9yZWFkZGlyLmM9NDI5PXN0YXRpYyBib29sIGNvbXBhdF9maWxsb25lZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxuZnMvcmVhZGRpci5jLTQ1My1cXHRcXHR1bnNhZmVfcHV0X3VzZXIobmFtbGVuLCBcXHUwMDI2ZGlyZW50LVxcdTAwM2VkX25hbWxlbiwgZWZhdWx0KTtcXG5mcy9yZWFkZGlyLmM6NDU0OlxcdFxcdHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKGRpcmVudC1cXHUwMDNlZF9uYW1lLCBuYW1lLCBuYW1sZW4sIGVmYXVsdCk7XFxuZnMvcmVhZGRpci5jLTQ1NS1cXHR9XFxuLS1cXG5mcy9yZWFkZGlyLmM9NDk3PXN0YXRpYyBib29sIGNvbXBhdF9maWxsZGlyKHN0cnVjdCBkaXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLFxcbi0tXFxuZnMvcmVhZGRpci5jLTUzMS1cXHRcXHR1bnNhZmVfcHV0X3VzZXIoZF90eXBlLCAoY2hhciBfX3VzZXIgKilkaXJlbnQgKyByZWNsZW4gLSAxLCBlZmF1bHQpO1xcbmZzL3JlYWRkaXIuYzo1MzI6XFx0XFx0dW5zYWZlX2NvcHlfZGlyZW50X25hbWUoZGlyZW50LVxcdTAwM2VkX25hbWUsIG5hbWUsIG5hbWxlbiwgZWZhdWx0KTtcXG5mcy9yZWFkZGlyLmMtNTMzLVxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzM6MjkuNjgxNDIxMjIxWiIsIlNlcSI6MzUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjI3NTc2MjI2MTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGBmcy9yZWFkZGlyLmNgKipcblxuT2theSwgdGltZSB0byBkaWcgaW50byB0aGlzLiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGB1bnNhZmVfY29weV9kaXJlbnRfbmFtZWAgZnVuY3Rpb24sIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGBmcy9yZWFkZGlyLmNgIGZpbGUuIEkga25vdyB0aGlzIGFyZWEgY2FuIGJlIHRyaWNreSwgc28gSSdtIGhvbmluZyBpbiBvbiBsaW5lcyA3OC0xMDAuIFRoYXQncyB3aGVyZSBJIGV4cGVjdCB0byBmaW5kIHRoZSBtZWF0IG9mIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGFuZCBpbXBsZW1lbnRhdGlvbi4gSSB3YW50IHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF0J3MgZ29pbmcgb24gd2l0aCBob3cgZGlyZWN0b3J5IGVudHJ5IG5hbWVzIGFyZSBiZWluZyBoYW5kbGVkLiBTYWZldHkgYW5kIHBlcmZvcm1hbmNlIGFyZSBjcnVjaWFsIGhlcmUsIHNvIEkgbmVlZCB0byBhc3Nlc3MgdGhpcyB0aG9yb3VnaGx5LiBMZXQncyBzZWUgd2hhdCB3ZSd2ZSBnb3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2MDAxLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzM6MzIuNDM5MDQ3ODc1WiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg1OTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL3JlYWRkaXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA3NSxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA3NTpcXHQgKiBOb3RlIHRoZSBcXFwidW5zYWZlX3B1dF91c2VyKClcXFwiIHNlbWFudGljczogd2UgZ290byBhXFxuICA3NjpcXHQgKiBsYWJlbCBmb3IgZXJyb3JzLlxcbiAgNzc6XFx0ICovXFxuICA3ODpcXHQjZGVmaW5lIHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lKF9kc3QsIF9zcmMsIF9sZW4sIGxhYmVsKSBkbyB7XFx0XFxcXFxcbiAgNzk6XFx0XFx0Y2hhciBfX3VzZXIgKmRzdCA9IChfZHN0KTtcXHRcXHRcXHRcXHRcXFxcXFxuICA4MDpcXHRcXHRjb25zdCBjaGFyICpzcmMgPSAoX3NyYyk7XFx0XFx0XFx0XFx0XFxcXFxcbiAgODE6XFx0XFx0c2l6ZV90IGxlbiA9IChfbGVuKTtcXHRcXHRcXHRcXHRcXHRcXFxcXFxuICA4MjpcXHRcXHR1bnNhZmVfcHV0X3VzZXIoMCwgZHN0K2xlbiwgbGFiZWwpO1xcdFxcdFxcdFxcXFxcXG4gIDgzOlxcdFxcdHVuc2FmZV9jb3B5X3RvX3VzZXIoZHN0LCBzcmMsIGxlbiwgbGFiZWwpO1xcdFxcdFxcXFxcXG4gIDg0OlxcdH0gd2hpbGUgKDApXFxuICA4NTpcXHRcXG4gIDg2OlxcdFxcbiAgODc6XFx0aW50IGl0ZXJhdGVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcXG4gIDg4OlxcdHtcXG4gIDg5OlxcdFxcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpO1xcbiAgOTA6XFx0XFx0aW50IHJlcyA9IC1FTk9URElSO1xcbiAgOTE6XFx0XFxuICA5MjpcXHRcXHRpZiAoIWZpbGUtXFx1MDAzZWZfb3AtXFx1MDAzZWl0ZXJhdGVfc2hhcmVkKVxcbiAgOTM6XFx0XFx0XFx0Z290byBvdXQ7XFxuICA5NDpcXHRcXG4gIDk1OlxcdFxcdHJlcyA9IHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbihmaWxlLCBNQVlfUkVBRCk7XFxuICA5NjpcXHRcXHRpZiAocmVzKVxcbiAgOTc6XFx0XFx0XFx0Z290byBvdXQ7XFxuICA5ODpcXHRcXG4gIDk5OlxcdFxcdHJlcyA9IGZzbm90aWZ5X2ZpbGVfcGVybShmaWxlLCBNQVlfUkVBRCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjMyLjQzOTEzNjI3NVoiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMDA2ODM2MzcyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lYCBhbmQgUmVsYXRlZCBGdW5jdGlvbnMgaW4gYGZzL2tlcm5mcy9kaXIuY2AqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgYHVuc2FmZV9jb3B5X2RpcmVudF9uYW1lYCBmdW5jdGlvbiwgYW5kIG15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGl0IGxvb2tzIHNhZmUuIGB1bnNhZmVfY29weV9kaXJlbnRfbmFtZWAgY29waWVzIGBsZW5gIGJ5dGVzIGZyb20gYHNyY2AgdG8gYGRzdGAsIHRoZW4gbnVsbC10ZXJtaW5hdGVzIHRoZSByZXN1bHQuIGBsZW5gIGNvbWVzIGZyb20gYHN0cnNjcHlgLCB3aGljaCBoYW5kbGVzIHN0cmluZyBjb3B5aW5nIGFuZCBudWxsIHRlcm1pbmF0aW9uLiBTaW5jZSBgc3Ryc2NweWAgY29waWVzIGV4YWN0bHkgYGxlbmAgY2hhcmFjdGVycyBhbmQgdGhlIE5VTCBieXRlLCBpdCBhcHBlYXJzIHRoYXQgYGxlbmAgYnl0ZXMgYXJlIGNvcGllZCBmcm9tIGBuYW1lYCB0byB1c2VyIHNwYWNlLCBhbmQgaW1wb3J0YW50bHksIHRoZXNlIGBsZW5gIGJ5dGVzIHNob3VsZCBiZSBmdWxseSBpbml0aWFsaXplZC5cblxuVGhlbiBJIHBhdXNlZC4gQ291bGQgYHN0cnNjcHlgIHJldHVybiBhIG5lZ2F0aXZlIHZhbHVlPyBUaGUgY29kZSBkb2VzIGNoZWNrIGZvciB0aGlzLCBicmVha2luZyB0aGUgbG9vcCBpZiBgbGVuIFx1MDAzYyAwYC4gSWYgYGxlbmAgaXMgbm90IG5lZ2F0aXZlLCBpdCByZXByZXNlbnRzIHRoZSBzdHJpbmcgbGVuZ3RoLiBHb29kLCB0aGF0IHRha2VzIGNhcmUgb2YgdGhlIG5lZ2F0aXZlIHJldHVybiBwb3NzaWJpbGl0eS5cblxuTm93LCBsZXQncyBsb29rIGZ1cnRoZXIgaW50byB0aGlzIHBhdGNoLCBzcGVjaWZpY2FsbHkgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zIHdpdGhpbiBgZnMva2VybmZzL2Rpci5jYC4gVGhlIGZpcnN0IGZ1bmN0aW9uIG9mIGludGVyZXN0IGlzIGBrZXJuZnNfZGlyX3Bvc2AsIGFuZCBpdHMgY2FsbGVycy4gVGhlIGNhbGxlciBpcyBga2VybmZzX2Rpcl9uZXh0X3Bvc2AuIFdpdGhpbiBga2VybmZzX2Rpcl9uZXh0X3Bvc2AgSSBzZWUgYSB2YXJpYWJsZSBgYm9vbCByZXN1bWVkO2AgcGFzc2VkIHRvIGBrZXJuZnNfZGlyX3Bvc2AuIEl0J3MgdXNlZCBpbiB0aGlzIG1hbm5lcjogYHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGhhc2gsIHBvcywgbmFtZSwgXHUwMDI2cmVzdW1lZCk7YC4gSW5zaWRlIGBrZXJuZnNfZGlyX3Bvc2AsIGByZXN1bWVkYCBpcyBzZXQgdG8gZmFsc2UgaW5pdGlhbGx5LiBGdXJ0aGVyIGRvd24sIGlmIGBwb3NgIGlzIHZhbGlkLCBpdCBnZXRzIHNldCB0byB0cnVlLiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRoYXQgYHJlc3VtZWRgIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYW5kIHdyaXR0ZW4gdG8sIHNvIHRoZSBjb21waWxlciBzaG91bGQgaGFuZGxlIHRoaXMuXG5cblNvIGxldCdzIGNvbnNpZGVyIHRoZSBgbmFtZWAgYXJndW1lbnQuIEkgc2VlIGl0IGJlaW5nIHVzZWQgYXMgYG5hbWUgPzogXCJcImAuIFRoaXMgbWVhbnMgdGhhdCBpZiBgbmFtZWAgaXMgTlVMTCwgYW4gZW1wdHkgc3RyaW5nIGlzIHVzZWQuIFRoaXMgaXMgaW1wb3J0YW50LCBsZXQncyB0cmFjayB0aGUgYG5hbWVgIHZhcmlhYmxlIGFuZCBzZWUgaG93IGl0IGlzIHVzZWQuIEl0IGxvb2tzIGxpa2UgYG5hbWVgIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgYGtlcm5mc19kaXJfbmV4dF9wb3NgLiBJZiB3ZSBsb29rIGF0IGBrZXJuZnNfZm9wX3JlYWRkaXJgOlxuXG5gZm9yIChwb3MgPSBrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBjdHgtXHUwMDNlcG9zLCBwb3MsIE5VTEwsIE5VTEwpOyBwb3M7IHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LVx1MDAzZXBvcywgcG9zLCBuYW1lKSlgXG5cbk9rYXksIGhlcmUncyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBJbnNpZGUgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCwgYHBvc2AgaXMgaW5pdGlhbGl6ZWQgYnkgYGtlcm5mc19kaXJfcG9zYCwgd2l0aCBOVUxMIGZvciB0aGUgbmFtZSBhcmd1bWVudHMuIElmIGBwb3NgIGlzIE5VTEwsIHRoZSBsb29wIGRvZXNuJ3QgcnVuLiBJZiBgcG9zYCBpcyB2YWxpZCwgdGhlIGxvb3AgYm9keSBleGVjdXRlcy4gSW1wb3J0YW50bHksIGluc2lkZSB0aGUgbG9vcCBib2R5IGlzIHRoZSBgc3Ryc2NweWAgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyBgbmFtZWA6XG5cbmBsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7YFxuXG5gbmFtZWAgaXMgaW5pdGlhbGl6ZWQuXG5cblRoZW4sIHdlIGhhdmUgdGhlIGxvb3AgaW5jcmVtZW50OlxuXG5gcG9zID0ga2VybmZzX2Rpcl9uZXh0X3BvcyhucywgcGFyZW50LCBjdHgtXHUwMDNlcG9zLCBwb3MsIG5hbWUpYFxuXG5BdCB0aGlzIHBvaW50LCBgbmFtZWAgKmhhcyogYmVlbiB3cml0dGVuIHRvIGJ5IGBzdHJzY3B5YC4gVGhpcyB0ZWxscyBtZSB0aGF0IGBuYW1lYCB3aWxsIGJlIGluaXRpYWxpemVkIHdoZW4gaXQncyBwYXNzZWQgaGVyZS4gU28gaXQgc2hvdWxkIGFsd2F5cyBiZSBpbml0aWFsaXplZC5cblxuSSdsbCBkbyBhIHF1aWNrIGNvZGUtd2lkZSBncmVwIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBvdGhlciBjYWxsZXJzIHRvIGBrZXJuZnNfZGlyX3Bvc2AgYW5kIGBrZXJuZnNfZGlyX25leHRfcG9zYCBhbmQgaWYgSSdtIG1pc3Npbmcgc29tZXRoaW5nIGVsc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NTgxLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAzNCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjQyLjUwNzUwNDE5M1oiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDkwMDg4ODcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia2VybmZzX2Rpcl9wb3NcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMva2VybmZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9rZXJuZnMvZGlyLmM9MTkwMD1zdGF0aWMgaW50IGtlcm5mc19kaXJfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTkwOS0gKi9cXG5mcy9rZXJuZnMvZGlyLmM6MTkxMDpzdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG5mcy9rZXJuZnMvZGlyLmMtMTkxMS1cXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxcbi0tXFxuZnMva2VybmZzL2Rpci5jPTE5NjM9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2Rpcl9uZXh0X3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0xOTY4LVxcbmZzL2tlcm5mcy9kaXIuYzoxOTY5OlxcdHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGhhc2gsIHBvcywgbmFtZSwgXFx1MDAyNnJlc3VtZWQpO1xcbmZzL2tlcm5mcy9kaXIuYy0xOTcwLVxcdC8qIFN0ZXAgb3ZlciBAcG9zIG9ubHkgaWYgaXQgc3Vydml2ZWQ7IEBuYW1lIGZpbmRzIHRoZSBzcG90IGlmIG5vdC4gKi9cXG4tLVxcbmZzL2tlcm5mcy9kaXIuYz0xOTg0PXN0YXRpYyBpbnQga2VybmZzX2ZvcF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eClcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0yMDA5LVxcbmZzL2tlcm5mcy9kaXIuYzoyMDEwOlxcdGZvciAocG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgY3R4LVxcdTAwM2Vwb3MsIHBvcywgTlVMTCwgTlVMTCk7XFxuZnMva2VybmZzL2Rpci5jLTIwMTEtXFx0ICAgICBwb3M7XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMjAzMS1cXHRcXHQgKiBkaXJfZW1pdCgpIGNhbiBmYXVsdCwgc28gcnVuIGl0IHVubG9ja2VkLiAgQHBvcyBpcyBwaW5uZWRcXG5mcy9rZXJuZnMvZGlyLmM6MjAzMjpcXHRcXHQgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suXFxuZnMva2VybmZzL2Rpci5jLTIwMzMtXFx0XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjQyLjU1NjUxODcxOVoiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo0MTQzNzQ5MTkxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkRpdmluZyBEZWVwIGludG8gYGtlcm5mc19kaXJfbmV4dF9wb3NgIGluIGBmcy9rZXJuZnMvZGlyLmNgKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyB3aXRoIHRoYXQgYGtlcm5mc19kaXJfbmV4dF9wb3NgIGZ1bmN0aW9uLiBMZXQncyBzdGFydCBieSBsb29raW5nIGF0IGxpbmUgMTk3Niwgb3IgdGhlcmVhYm91dHMsIGluIGBmcy9rZXJuZnMvZGlyLmNgLiBBaCwgeWVzLCBpbiB0aGUgaGVhcnQgb2YgdGhpcyBmdW5jdGlvbiwgdGhlcmUncyB0aGF0IGxvb3A6XG5cbmBgYGNcblx0XHRkbyB7XG5cdFx0XHRzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJiX25leHQoXHUwMDI2cG9zLVx1MDAzZXJiKTtcblx0XHRcdGlmICghbm9kZSlcblx0XHRcdFx0cmV0dXJuIE5VTEw7XG5cdFx0XHRwb3MgPSByYl90b19rbihub2RlKTtcblx0XHRcdGtlcm5mc19nZXQocG9zKTtcblx0XHR9IHdoaWxlIChrZXJuZnNfZGlyX3BvcyhucywgcGFyZW50LCBoYXNoLCBwb3MsIE5VTEwsIE5VTEwpICE9IHBvcyk7XG5gYGBcblxuSG1tLi4ud2FpdCBhIG1pbnV0ZS4gVGhhdCBgd2hpbGVgIGNvbmRpdGlvbiBpcyBhIGJpdOKApnRyaWNreS4gSXQncyBjaGVja2luZyBpZiBzb21ldGhpbmcgaXNuJ3QgcXVpdGUgcmlnaHQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBTb21ldGhpbmcgYWJvdXQgdGhhdCBsb29wIGlzIG1ha2luZyBtZSB0aGluaywgd2hhdCB3YXMgdGhhdCBsaW5lIGxvb2tpbmcgbGlrZSBiZWZvcmU/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgdG8gc2VlIGlmIEkgYW0gbWlzc2luZyBzb21ldGhpbmcgb2J2aW91cyBvciB3aGF0IGNoYW5nZXMgbGVkIHVwIHRvIHRoaXMgc3RydWN0dXJlLlxuXG5UbyB0cnVseSBncmFzcCB0aGUgY29udGV4dCwgSSBuZWVkIHRvIHJlYWQgdGhlIGNvZGUgc3Vycm91bmRpbmcgdGhpcyBmdW5jdGlvbi4gTGV0J3MgZXhwYW5kIG15IHZpZXcgdG8gbGluZXMgMTk0MC0xOTgwLCBsb29raW5nIGF0IHRoZSBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhpcyBjcnVjaWFsIGxvb3AuIEkgbmVlZCB0aGUgYmlnZ2VyIHBpY3R1cmUgdG8gdW5kZXJzdGFuZCB0aGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGFuZCB3aGV0aGVyIGl0J3Mgb3B0aW1pemVkIG9yIHNpbXBseSBjb3JyZWN0LiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSBhbmQgZGlzc2VjdCB0aGlzIGZ1bmN0aW9uIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxODkwNiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzo0Ni43MDAyNzEzN1oiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTg3ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMva2VybmZzL2Rpci5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5NTAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE5NTA6XFx0XFx0fVxcbjE5NTE6XFx0XFx0LyogU2tpcCBvdmVyIGVudHJpZXMgd2hpY2ggYXJlIGR5aW5nL2RlYWQgb3IgaW4gdGhlIHdyb25nIG5hbWVzcGFjZSAqL1xcbjE5NTI6XFx0XFx0d2hpbGUgKHBvcyBcXHUwMDI2XFx1MDAyNiAoIWtlcm5mc19hY3RpdmUocG9zKSB8fFxcbjE5NTM6XFx0XFx0XFx0ICAgICAgIGtlcm5mc19uc19pZChwb3MtXFx1MDAzZW5zKSAhPSBrZXJuZnNfbnNfaWQobnMpKSkge1xcbjE5NTQ6XFx0XFx0XFx0c3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KFxcdTAwMjZwb3MtXFx1MDAzZXJiKTtcXG4xOTU1OlxcdFxcdFxcdGlmICghbm9kZSlcXG4xOTU2OlxcdFxcdFxcdFxcdHBvcyA9IE5VTEw7XFxuMTk1NzpcXHRcXHRcXHRlbHNlXFxuMTk1ODpcXHRcXHRcXHRcXHRwb3MgPSByYl90b19rbihub2RlKTtcXG4xOTU5OlxcdFxcdH1cXG4xOTYwOlxcdFxcdHJldHVybiBwb3M7XFxuMTk2MTpcXHR9XFxuMTk2MjpcXHRcXG4xOTYzOlxcdHN0YXRpYyBzdHJ1Y3Qga2VybmZzX25vZGUgKmtlcm5mc19kaXJfbmV4dF9wb3MoY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuMTk2NDpcXHRcXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudCwgbG9mZl90IGhhc2gsIHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zLFxcbjE5NjU6XFx0XFx0Y29uc3QgY2hhciAqbmFtZSlcXG4xOTY2OlxcdHtcXG4xOTY3OlxcdFxcdGJvb2wgcmVzdW1lZDtcXG4xOTY4OlxcdFxcbjE5Njk6XFx0XFx0cG9zID0ga2VybmZzX2Rpcl9wb3MobnMsIHBhcmVudCwgaGFzaCwgcG9zLCBuYW1lLCBcXHUwMDI2cmVzdW1lZCk7XFxuMTk3MDpcXHRcXHQvKiBTdGVwIG92ZXIgQHBvcyBvbmx5IGlmIGl0IHN1cnZpdmVkOyBAbmFtZSBmaW5kcyB0aGUgc3BvdCBpZiBub3QuICovXFxuMTk3MTpcXHRcXHRpZiAocG9zIFxcdTAwMjZcXHUwMDI2IHJlc3VtZWQpIHtcXG4xOTcyOlxcdFxcdFxcdGRvIHtcXG4xOTczOlxcdFxcdFxcdFxcdHN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfbmV4dChcXHUwMDI2cG9zLVxcdTAwM2VyYik7XFxuMTk3NDpcXHRcXHRcXHRcXHRpZiAoIW5vZGUpXFxuMTk3NTpcXHRcXHRcXHRcXHRcXHRwb3MgPSBOVUxMO1xcbjE5NzY6XFx0XFx0XFx0XFx0ZWxzZVxcbjE5Nzc6XFx0XFx0XFx0XFx0XFx0cG9zID0gcmJfdG9fa24obm9kZSk7XFxuMTk3ODpcXHRcXHRcXHR9IHdoaWxlIChwb3MgXFx1MDAyNlxcdTAwMjYgKCFrZXJuZnNfYWN0aXZlKHBvcykgfHxcXG4xOTc5OlxcdFxcdFxcdFxcdGtlcm5mc19uc19pZChwb3MtXFx1MDAzZW5zKSAhPSBrZXJuZnNfbnNfaWQobnMpKSk7XFxuMTk4MDpcXHRcXHR9XFxuMTk4MTpcXHRcXHRyZXR1cm4gcG9zO1xcbjE5ODI6XFx0fVxcbjE5ODM6XFx0XFxuMTk4NDpcXHRzdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuMTk4NTpcXHR7XFxuMTk4NjpcXHRcXHRzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLVxcdTAwM2VmX3BhdGguZGVudHJ5O1xcbjE5ODc6XFx0XFx0c3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQgPSBrZXJuZnNfZGVudHJ5X25vZGUoZGVudHJ5KTtcXG4xOTg4OlxcdFxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcG9zID0gZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbjE5ODk6XFx0XFx0Y2hhciAqbmFtZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzM6NDYuNzAwMzkyMVoiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyOTg1NDg1NjgxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqRGl2aW5nIGludG8ga2VybmZzX2ZvcF9yZWFkZGlyKipcblxuUmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBXZSdyZSBpbiBga2VybmZzX2ZvcF9yZWFkZGlyYCwgd2hpY2ggbWVhbnMgd2UncmUgZGVhbGluZyB3aXRoIHRoZSBjb3JlIGxvZ2ljIGZvciBkaXJlY3RvcnkgcmVhZGluZyB3aXRoaW4gdGhlIGtlcm5mcyBmaWxlc3lzdGVtLiBUaGUgaW1tZWRpYXRlIGltcGxpY2F0aW9uIGlzIHRoYXQgd2UncmUgbGlrZWx5IHByb2Nlc3NpbmcgYSBkaXJlY3RvcnkgZW50cnkgbG9va3VwLCBwcm9iYWJseSB0cmlnZ2VyZWQgYnkgYSBgcmVhZGRpcigpYCBzeXN0ZW0gY2FsbC4gR2l2ZW4gbXkgZmFtaWxpYXJpdHkgd2l0aCBWRlMgc3RydWN0dXJlcywgSSdtIGV4cGVjdGluZyB0aGlzIGZ1bmN0aW9uIHRvIGludGVyZmFjZSBoZWF2aWx5IHdpdGgga2VybmZzJ3MgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIHByb3ZpZGUgdGhlIGxpc3Qgb2YgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzLiBJJ2xsIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byBob3cgaXQgaGFuZGxlcyBgc3RydWN0IGtlcm5mc19ub2RlYCBlbnRyaWVzIGFuZCBwb3RlbnRpYWxseSB0aGUgYXNzb2NpYXRlZCBgc3RydWN0IGtlcm5mc19kaXJfb3BzYCAob3Igc2ltaWxhcikgY2FsbGJhY2tzIHRvIHNlZSBob3cgaXQgbWFuYWdlcyBpdGVyYXRpb24gYW5kIGZpbHRlcmluZyBvZiB0aG9zZSBkaXJlY3RvcnkgZW50cmllcy4gSSB3YW50IHRvIHNlZSBob3cgaXQgcmVzcGVjdHMgdGhlIGBvZmZzZXRgIHBhcmFtZXRlciBmb3Igc2Vla2luZyB3aXRoaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nIGFuZCBlbnN1cmVzIHRoYXQgaXQgaGFuZGxlcyB0aGUgYGZpbGxkaXJgIGZ1bmN0aW9uIGNvcnJlY3RseSB0byBjb25zdHJ1Y3QgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGZvciB1c2VyIHNwYWNlLiBVbHRpbWF0ZWx5LCBJJ20gdHJ5aW5nIHRvIHVuZGVyc3RhbmQgaG93IGtlcm5mcyBwcmVzZW50cyBpdHMgaGllcmFyY2hpY2FsIG9yZ2FuaXphdGlvbiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sIGFuZCBJJ2xsIGJlIGxvb2tpbmcgZm9yIGFueSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3Igc3VidGxlIHJhY2UgY29uZGl0aW9ucy4gVGhlIHdob2xlIGZ1bmN0aW9uIHdpbGwgaGF2ZSB0byBiZSBleGFtaW5lZCBmb3IgdGhlc2UgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAwOTcsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjMzOjQ5LjY4NTg4MTg5MVoiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjgyMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMva2VybmZzL2Rpci5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5ODQsXG4gIFwiTGluZUNvdW50XCI6IDcwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE5ODQ6XFx0c3RhdGljIGludCBrZXJuZnNfZm9wX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbjE5ODU6XFx0e1xcbjE5ODY6XFx0XFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS1cXHUwMDNlZl9wYXRoLmRlbnRyeTtcXG4xOTg3OlxcdFxcdHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50ID0ga2VybmZzX2RlbnRyeV9ub2RlKGRlbnRyeSk7XFxuMTk4ODpcXHRcXHRzdHJ1Y3Qga2VybmZzX25vZGUgKnBvcyA9IGZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4xOTg5OlxcdFxcdGNoYXIgKm5hbWUgX19mcmVlKGtmcmVlKSA9IE5VTEw7XFxuMTk5MDpcXHRcXHRzdHJ1Y3Qga2VybmZzX3Jvb3QgKnJvb3Q7XFxuMTk5MTpcXHRcXHRjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyA9IE5VTEw7XFxuMTk5MjpcXHRcXG4xOTkzOlxcdFxcdGlmICghZGlyX2VtaXRfZG90cyhmaWxlLCBjdHgpKVxcbjE5OTQ6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMTk5NTpcXHRcXG4xOTk2OlxcdFxcdC8qXFxuMTk5NzpcXHRcXHQgKiBPbmUgYnVmZmVyIGZvciB0aGUgY2FsbCwgaG9sZGluZyB0aGUgbmFtZSBvZiB0aGUgZW50cnkgdGhlIGxpc3RpbmdcXG4xOTk4OlxcdFxcdCAqIGlzIG9uLiAgUEFUSF9NQVg6IGtlcm5mcyBib3VuZHMgbm8gc2luZ2xlIG5hbWUuXFxuMTk5OTpcXHRcXHQgKi9cXG4yMDAwOlxcdFxcdG5hbWUgPSBrbWFsbG9jKFBBVEhfTUFYLCBHRlBfS0VSTkVMKTtcXG4yMDAxOlxcdFxcdGlmICghbmFtZSlcXG4yMDAyOlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjIwMDM6XFx0XFxuMjAwNDpcXHRcXHRyb290ID0ga2VybmZzX3Jvb3QocGFyZW50KTtcXG4yMDA1OlxcdFxcdGRvd25fcmVhZChcXHUwMDI2cm9vdC1cXHUwMDNla2VybmZzX3J3c2VtKTtcXG4yMDA2OlxcdFxcbjIwMDc6XFx0XFx0aWYgKGtlcm5mc19uc19lbmFibGVkKHBhcmVudCkpXFxuMjAwODpcXHRcXHRcXHRucyA9IGtlcm5mc19pbmZvKGRlbnRyeS1cXHUwMDNlZF9zYiktXFx1MDAzZW5zO1xcbjIwMDk6XFx0XFxuMjAxMDpcXHRcXHRmb3IgKHBvcyA9IGtlcm5mc19kaXJfcG9zKG5zLCBwYXJlbnQsIGN0eC1cXHUwMDNlcG9zLCBwb3MsIE5VTEwsIE5VTEwpO1xcbjIwMTE6XFx0XFx0ICAgICBwb3M7XFxuMjAxMjpcXHRcXHQgICAgIHBvcyA9IGtlcm5mc19kaXJfbmV4dF9wb3MobnMsIHBhcmVudCwgY3R4LVxcdTAwM2Vwb3MsIHBvcywgbmFtZSkpIHtcXG4yMDEzOlxcdFxcdFxcdHVuc2lnbmVkIGludCB0eXBlID0gZnNfdW1vZGVfdG9fZHR5cGUocG9zLVxcdTAwM2Vtb2RlKTtcXG4yMDE0OlxcdFxcdFxcdGlub190IGlubyA9IGtlcm5mc19pbm8ocG9zKTtcXG4yMDE1OlxcdFxcdFxcdGludCBsZW47XFxuMjAxNjpcXHRcXG4yMDE3OlxcdFxcdFxcdC8qXFxuMjAxODpcXHRcXHRcXHQgKiBUaGUgY29weSBpcyBhbHNvIHRoZSByZXN1bWUga2V5LCBzbyBhIHRydW5jYXRlZCBuYW1lIHdvdWxkXFxuMjAxOTpcXHRcXHRcXHQgKiByZXN1bWUgaGVyZSBhZ2Fpbi4gIGdldG5hbWUoKSBjYXBzIGEgcGF0aCwgc28gb25seSBhblxcbjIwMjA6XFx0XFx0XFx0ICogaW4ta2VybmVsIGNhbGxlciBjYW4gZ2V0IGhlcmU7IGVuZCB0aGUgbGlzdGluZyBpbnN0ZWFkLlxcbjIwMjE6XFx0XFx0XFx0ICovXFxuMjAyMjpcXHRcXHRcXHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XFxuMjAyMzpcXHRcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGxlbiBcXHUwMDNjIDApKVxcbjIwMjQ6XFx0XFx0XFx0XFx0YnJlYWs7XFxuMjAyNTpcXHRcXG4yMDI2OlxcdFxcdFxcdGN0eC1cXHUwMDNlcG9zID0gcG9zLVxcdTAwM2VoYXNoO1xcbjIwMjc6XFx0XFx0XFx0ZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhID0gcG9zO1xcbjIwMjg6XFx0XFx0XFx0a2VybmZzX2dldChwb3MpO1xcbjIwMjk6XFx0XFxuMjAzMDpcXHRcXHRcXHQvKlxcbjIwMzE6XFx0XFx0XFx0ICogZGlyX2VtaXQoKSBjYW4gZmF1bHQsIHNvIHJ1biBpdCB1bmxvY2tlZC4gIEBwb3MgaXMgcGlubmVkXFxuMjAzMjpcXHRcXHRcXHQgKiBhYm92ZSBhbmQga2VybmZzX2Rpcl9wb3MoKSByZWNoZWNrcyBpdCBvbiB0aGUgd2F5IGJhY2suXFxuMjAzMzpcXHRcXHRcXHQgKi9cXG4yMDM0OlxcdFxcdFxcdHVwX3JlYWQoXFx1MDAyNnJvb3QtXFx1MDAzZWtlcm5mc19yd3NlbSk7XFxuMjAzNTpcXHRcXHRcXHRpZiAoIWRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpKVxcbjIwMzY6XFx0XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjAzNzpcXHRcXHRcXHRkb3duX3JlYWQoXFx1MDAyNnJvb3QtXFx1MDAzZWtlcm5mc19yd3NlbSk7XFxuMjAzODpcXHRcXHR9XFxuMjAzOTpcXHRcXHR1cF9yZWFkKFxcdTAwMjZyb290LVxcdTAwM2VrZXJuZnNfcndzZW0pO1xcbjIwNDA6XFx0XFx0ZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhID0gTlVMTDtcXG4yMDQxOlxcdFxcdGN0eC1cXHUwMDNlcG9zID0gSU5UX01BWDtcXG4yMDQyOlxcdFxcdHJldHVybiAwO1xcbjIwNDM6XFx0fVxcbjIwNDQ6XFx0XFxuMjA0NTpcXHRjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGtlcm5mc19kaXJfZm9wcyA9IHtcXG4yMDQ2OlxcdFxcdC5yZWFkXFx0XFx0PSBnZW5lcmljX3JlYWRfZGlyLFxcbjIwNDc6XFx0XFx0Lml0ZXJhdGVfc2hhcmVkXFx0PSBrZXJuZnNfZm9wX3JlYWRkaXIsXFxuMjA0ODpcXHRcXHQucmVsZWFzZVxcdD0ga2VybmZzX2Rpcl9mb3BfcmVsZWFzZSxcXG4yMDQ5OlxcdFxcdC5sbHNlZWtcXHRcXHQ9IGdlbmVyaWNfZmlsZV9sbHNlZWssXFxuMjA1MDpcXHR9O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozMzo0OS42ODYwMTIxNjFaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjY3NTA5NTY4ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqUGF0Y2ggQW5hbHlzaXMgYW5kIE1lbW9yeSBTYWZldHkgRGVlcCBEaXZlKipcblxuT2theSwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoIGZvciBga2VybmZzX2ZvcF9yZWFkZGlyYC4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgaXQncyBkZXNpZ25lZCB0byBjb3JyZWN0IGhvdyBkaXJlY3RvcnkgaXRlcmF0aW9uIHJlc3VtZXMgYWZ0ZXIgYW4gZW50cnkgaXMgcmVtb3ZlZCBvciByZW5hbWVkLCB3aGljaCBpcyBhIGNvbW1vbiBzb3VyY2Ugb2Ygc3VidGxlIGJ1Z3MuIEkndmUgZ290IHRvIGVuc3VyZSB0aGUgZml4IGlzIGNvcnJlY3QsIGFuZCBhYnNvbHV0ZWx5IHdhdGVydGlnaHQgcmVnYXJkaW5nIG1lbW9yeSBzYWZldHkuXG5cblRoZSBjb3JlIG9mIHRoZSBwYXRjaCByZXZvbHZlcyBhcm91bmQgaW1wcm92aW5nIGBrZXJuZnNfZGlyX3Bvc2AuIFByZXZpb3VzbHksIHJlbHlpbmcgc29sZWx5IG9uIHRoZSBoYXNoIHRvIHJlc3VtZSBhIGRpcmVjdG9yeSBsaXN0aW5nIHdhcyBmbGF3ZWQsIGJlY2F1c2UgYSByZW5hbWUgY291bGQgcHJvZHVjZSBhIGNvbGxpc2lvbi4gSSBsaWtlIHRoYXQgdGhlIHBhdGNoIG5vdyB1c2VzIHRoZSBlbnRyeSBuYW1lIGluIGFkZGl0aW9uIHRvIHRoZSBoYXNoLiBJZiB0aGUgcG9zaXRpb24gZ2l2ZW4gaXMgbm90IHZhbGlkLCB0aGUgY29kZSBzZWFyY2hlcyB0aGUgcmItdHJlZS4gU21hcnQgbW92ZS5cblxuSSBzZWUgdGhhdCBhIGJ1ZmZlciwgYG5hbWVgLCBvZiBzaXplIGBQQVRIX01BWGAgaXMgYmVpbmcgYWxsb2NhdGVkIGFuZCBwb3B1bGF0ZWQgd2l0aCB0aGUgZW50cnkncyBuYW1lIHVzaW5nIGBzdHJzY3B5YC4gRHJvcHBpbmcgdGhlIHJlYWQgbG9jayBiZWZvcmUgdGhlIGBkaXJfZW1pdGAgY2FsbCBpcyBhbiBpbnRlcmVzdGluZyBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIGxldHRpbmcgYGRpcl9lbWl0YCBmYWlsIGFuZCByZXR1cm4gd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrLiBBbmQgdGhlbiB0aGUgbG9jayBpcyByZS1hY3F1aXJlZC5cblxuTm93LCBtZW1vcnkgc2FmZXR5IG5lZWRzIGEgbWV0aWN1bG91cyByZXZpZXcuIExldCdzIHN0YXJ0IHdpdGggYG5hbWVgLiBJdCBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AgYW5kIGlzICpjcml0aWNhbCogZm9yIHRoZSByZXN0IG9mIHRoZSBvcGVyYXRpb24uXG5cbkZpcnN0LCBJIHRyYWNlIGl0cyB1c2FnZS4gSXQgc2VlbXMgdGhhdCBgbmFtZWAgd2lsbCBiZSBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBhZnRlciBpdCdzIGFsbG9jYXRlZC4gSWYgdGhlIGluaXRpYWwgY2FsbCB0byBga2VybmZzX2Rpcl9wb3NgIHJldHVybnMgYE5VTExgLCB0aGVuIGBuYW1lYCBpcyBmcmVlZCBhbmQgbmV2ZXIgcmVhZC4gSWYgbm90LCBgc3Ryc2NweWAgaXMgY2FsbGVkLCBhbmQgYG5hbWVgIHdpbGwgYmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIGFueSByZWFkLiBUaGUgY29kZSB0aGVuIHBhc3NlcyBgbmFtZWAgdG8gdGhlIGBkaXJfZW1pdGAgZnVuY3Rpb24sIHdoaWNoIGluIHR1cm4gY2FsbHMgYSBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRlZCBieSB0aGUgY2FsbGVyLiBUaGlzIGNhbGxiYWNrLCBzdWNoIGFzIGBmaWxsZGlyNjRgLCBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGBuYW1lYCB0byB1c2VyIHNwYWNlLCBhbmQgdGhlIGxlbmd0aCBpcyBwYXNzZWQgdG8gbWFrZSBzdXJlIGl0IGNvcGllcyBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcuXG5cblRoZSBsb29wIHRoZW4gY29udGludWVzLCBjYWxsaW5nIGBrZXJuZnNfZGlyX25leHRfcG9zYC4gVGhpcyBjYWxscyBga2VybmZzX2Rpcl9wb3NgLCB3aGljaCBjYWxscyBgc3RyY21wYCBvbiBgbmFtZWAuIGBzdHJjbXBgIGNoZWNrcyB1bnRpbCB0aGUgbnVsbCB0ZXJtaW5hdG9yLCBzbyB0aGVyZSdzIG5vIHdheSB0byByZWFkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJbiB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbiwgYG5hbWVgIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyBlbnRyeSBuYW1lLiBgc3Ryc2NweWAgaGFuZGxlcyBhbGwgdGhlIGltcG9ydGFudCBwYXJ0cyB0byBwcmV2ZW50IHJlYWRpbmcgYmV5b25kIHRoZSBpbml0aWFsaXplZCBwcmVmaXggb2YgYG5hbWVgLlxuXG5CdXQsIHdoYXQgaWYgYGRpcl9lbWl0YCByZXR1cm5zIGBmYWxzZWA/IFRoZSBmdW5jdGlvbiBleGl0cywgYW5kIGBuYW1lYCBpcyBmcmVlZC4gQW5kIHdoYXQgaWYgYGRvd25fcmVhZGAgd2Fzbid0IHVubG9ja2VkLCBhbmQgYGRpcl9lbWl0YCBmYWlsZWQ/IE5vdGhpbmcsIGJlY2F1c2UgdGhlIHJlYWQgbG9jayB3YXMgZHJvcHBlZCBiZWZvcmUgYGRpcl9lbWl0YCB3YXMgY2FsbGVkLCBhbmQgaXQgZG9lcyB0aGUgcmlnaHQgdGhpbmcuXG5cbkFuZCB3aGF0IGlmIHRoZSBgc3Ryc2NweWAgZmFpbHM/IFRoZXJlJ3MgYSBjaGVjaywgYW5kIGlmIGl0IGZhaWxzLCB0aGVuIHRoZSBjb2RlIHdpbGwgZXhpdCwgc28gdGhlcmUgaXMgbm8gcHJvYmxlbSBoZXJlLlxuXG5Pa2F5LCBsZXQncyB0aGluayBhYm91dCB0aGUgYGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhYCBmaWVsZC4gSXQgbG9va3MgbGlrZSBpdCBzYXZlcyB0aGUgbGFzdCBwb3NpdGlvbiBhbmQgaW5jcmVtZW50cyB0aGUgcmVmY291bnQuIElmIHRoZSBgZGlyX2VtaXRgIGNhbGwgZmFpbHMsIHRoYXQncyBmaW5lOyB0aGUgcmVmY291bnQgb24gYHBvc2AgaXMgc3RpbGwgaW5jcmVtZW50ZWQuIElmIHRoZSBuZXh0IGByZWFkZGlyYCBpcyBjYWxsZWQsIHRoZSBzYXZlZCBwb3NpdGlvbiBpcyByZXRyaWV2ZWQgYW5kIHRoZSByZWZjb3VudCByZWxlYXNlZC5cblxuVGhlcmUncyBubyBwcm9ibGVtIGhlcmUuIEJ1dCBhcmUgdGhlcmUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlcyBsdXJraW5nIGVsc2V3aGVyZT8gTGV0J3MgY2hlY2s6XG5cbkkgbmVlZCB0byBsb29rIGNhcmVmdWxseSBhdCB0aGUgYGJvb2wgKnJlc3VtZWRgIHZhcmlhYmxlIHRoYXQgaXMgcGFzc2VkIGFyb3VuZC4gQmFzZWQgb24gbXkgYXNzZXNzbWVudCwgdGhlIGByZXN1bWVkYCB2YXJpYWJsZSBpcyBhbHdheXMgaW5pdGlhbGl6ZWQuXG5cbkFuZCBmaW5hbGx5LCBga2VybmZzX3JjdV9uYW1lYCBpc24ndCByZXR1cm5pbmcgdW5pbml0aWFsaXplZCBtZW1vcnksIHNpbmNlIGl0IGlzIHJlZmVyZW5jaW5nIGBrbi1cdTAwM2VuYW1lYC5cblxuSSdtIGNvbmZpZGVudC4gVGhpcyBwYXRjaCBkb2Vzbid0IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZS4gSSdtIGdvaW5nIHRvIHNldCBgTmVlZHNLTVNBTj1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNTA4LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTkzNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE4OjM0OjE2LjQzNjk3MTc5NloiLCJTZXEiOjQ0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDgxNDI2NDE4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtlcm5mc19yY3VfbmFtZVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9rZXJuZnMvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2tlcm5mcy9kaXIuYz0zNDY9c3RhdGljIGludCBrZXJuZnNfbmFtZV9jb21wYXJlKHVuc2lnbmVkIGludCBoYXNoLCBjb25zdCBjaGFyICpuYW1lLFxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTM1OS1cXHRcXHRyZXR1cm4gMTtcXG5mcy9rZXJuZnMvZGlyLmM6MzYwOlxcdHJldHVybiBzdHJjbXAobmFtZSwga2VybmZzX3JjdV9uYW1lKGtuKSk7XFxuZnMva2VybmZzL2Rpci5jLTM2MS19XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MzYzPXN0YXRpYyBpbnQga2VybmZzX3NkX2NvbXBhcmUoY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICpsZWZ0LFxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTM2NS17XFxuZnMva2VybmZzL2Rpci5jOjM2NjpcXHRyZXR1cm4ga2VybmZzX25hbWVfY29tcGFyZShsZWZ0LVxcdTAwM2VoYXNoLCBrZXJuZnNfcmN1X25hbWUobGVmdCksIGxlZnQtXFx1MDAzZW5zLCByaWdodCk7XFxuZnMva2VybmZzL2Rpci5jLTM2Ny19XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9ODIzPWludCBrZXJuZnNfYWRkX29uZShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKVxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTgzNy1cXHRcXHQgaGFzX25zID8gXFxcInJlcXVpcmVkXFxcIiA6IFxcXCJpbnZhbGlkXFxcIixcXG5mcy9rZXJuZnMvZGlyLmM6ODM4OlxcdFxcdCBrZXJuZnNfcmN1X25hbWUocGFyZW50KSwga2VybmZzX3JjdV9uYW1lKGtuKSkpXFxuZnMva2VybmZzL2Rpci5jLTgzOS1cXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtODQ3LVxcbmZzL2tlcm5mcy9kaXIuYzo4NDg6XFx0a24tXFx1MDAzZWhhc2ggPSBrZXJuZnNfbmFtZV9oYXNoKGtlcm5mc19yY3VfbmFtZShrbiksIGtuLVxcdTAwM2Vucyk7XFxuZnMva2VybmZzL2Rpci5jLTg0OS1cXG4tLVxcbmZzL2tlcm5mcy9kaXIuYz04OTI9c3RhdGljIHN0cnVjdCBrZXJuZnNfbm9kZSAqa2VybmZzX2ZpbmRfbnMoc3RydWN0IGtlcm5mc19ub2RlICpwYXJlbnQsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtOTAzLVxcdFxcdFdBUk4oMSwgS0VSTl9XQVJOSU5HIFxcXCJrZXJuZnM6IG5zICVzIGluICclcycgZm9yICclcydcXFxcblxcXCIsXFxuZnMva2VybmZzL2Rpci5jOjkwNDpcXHRcXHQgICAgIGhhc19ucyA/IFxcXCJyZXF1aXJlZFxcXCIgOiBcXFwiaW52YWxpZFxcXCIsIGtlcm5mc19yY3VfbmFtZShwYXJlbnQpLCBuYW1lKTtcXG5mcy9rZXJuZnMvZGlyLmMtOTA1LVxcdFxcdHJldHVybiBOVUxMO1xcbi0tXFxuZnMva2VybmZzL2Rpci5jPTExNzc9c3RhdGljIGludCBrZXJuZnNfZG9wX3JldmFsaWRhdGUoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLFxcbi0tXFxuZnMva2VybmZzL2Rpci5jLTEyMTQtXFx0LyogVGhlIGtlcm5mcyBub2RlIGhhcyBiZWVuIHJlbmFtZWQgKi9cXG5mcy9rZXJuZnMvZGlyLmM6MTIxNTpcXHRrbl9uYW1lID0ga2VybmZzX3JjdV9uYW1lKGtuKTtcXG5mcy9rZXJuZnMvZGlyLmMtMTIxNi1cXHRpZiAobmFtZS1cXHUwMDNlbGVuICE9IHN0cmxlbihrbl9uYW1lKSB8fFxcbi0tXFxuZnMva2VybmZzL2Rpci5jPTE1Mjk9c3RhdGljIHZvaWQgX19rZXJuZnNfcmVtb3ZlKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTU0Ni1cXG5mcy9rZXJuZnMvZGlyLmM6MTU0NzpcXHRwcl9kZWJ1ZyhcXFwia2VybmZzICVzOiByZW1vdmluZ1xcXFxuXFxcIiwga2VybmZzX3JjdV9uYW1lKGtuKSk7XFxuZnMva2VybmZzL2Rpci5jLTE1NDgtXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTgxMT1pbnQga2VybmZzX3JlbmFtZV9ucyhzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLCBzdHJ1Y3Qga2VybmZzX25vZGUgKm5ld19wYXJlbnQsXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMTgzOS1cXHRlcnJvciA9IDA7XFxuZnMva2VybmZzL2Rpci5jOjE4NDA6XFx0b2xkX25hbWUgPSBrZXJuZnNfcmN1X25hbWUoa24pO1xcbmZzL2tlcm5mcy9kaXIuYy0xODQxLVxcdGlmICghbmV3X25hbWUpXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTkxMD1zdGF0aWMgc3RydWN0IGtlcm5mc19ub2RlICprZXJuZnNfZGlyX3Bvcyhjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0xOTI0LVxcdFxcdFxcdGhhc2ggPT0gcG9zLVxcdTAwM2VoYXNoIFxcdTAwMjZcXHUwMDI2XFxuZnMva2VybmZzL2Rpci5jOjE5MjU6XFx0XFx0XFx0KCFuYW1lIHx8ICFzdHJjbXAobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcykpKTtcXG5mcy9rZXJuZnMvZGlyLmMtMTkyNi1cXHRcXHRrZXJuZnNfcHV0KHBvcyk7XFxuLS1cXG5mcy9rZXJuZnMvZGlyLmM9MTk4ND1zdGF0aWMgaW50IGtlcm5mc19mb3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpXFxuLS1cXG5mcy9rZXJuZnMvZGlyLmMtMjAyMS1cXHRcXHQgKi9cXG5mcy9rZXJuZnMvZGlyLmM6MjAyMjpcXHRcXHRsZW4gPSBzdHJzY3B5KG5hbWUsIGtlcm5mc19yY3VfbmFtZShwb3MpLCBQQVRIX01BWCk7XFxuZnMva2VybmZzL2Rpci5jLTIwMjMtXFx0XFx0aWYgKFdBUk5fT05fT05DRShsZW4gXFx1MDAzYyAwKSlcXG4tLVxcbmZzL2tlcm5mcy9maWxlLmM9OTA1PXN0YXRpYyB2b2lkIGtlcm5mc19ub3RpZnlfd29ya2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4tLVxcbmZzL2tlcm5mcy9maWxlLmMtOTQzLVxcbmZzL2tlcm5mcy9maWxlLmM6OTQ0OlxcdFxcdGtuX25hbWUgPSBrZXJuZnNfcmN1X25hbWUoa24pO1xcbmZzL2tlcm5mcy9maWxlLmMtOTQ1LVxcdFxcdG5hbWUgPSBRU1RSKGtuX25hbWUpO1xcbi0tXFxuZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oPTExMz1zdGF0aWMgaW5saW5lIGJvb2wga2VybmZzX3JlbmFtZV9pc19sb2NrZWQoY29uc3Qgc3RydWN0IGtlcm5mc19ub2RlICprbilcXG4tLVxcbmZzL2tlcm5mcy9rZXJuZnMtaW50ZXJuYWwuaC0xMTctXFxuZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oOjExODpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmtlcm5mc19yY3VfbmFtZShjb25zdCBzdHJ1Y3Qga2VybmZzX25vZGUgKmtuKVxcbmZzL2tlcm5mcy9rZXJuZnMtaW50ZXJuYWwuaC0xMTkte1xcbi0tXFxuZnMva2VybmZzL21vdW50LmM9MjMyPXN0cnVjdCBkZW50cnkgKmtlcm5mc19ub2RlX2RlbnRyeShzdHJ1Y3Qga2VybmZzX25vZGUgKmtuLFxcbi0tXFxuZnMva2VybmZzL21vdW50LmMtMjc2LVxcdFxcdFxcdH1cXG5mcy9rZXJuZnMvbW91bnQuYzoyNzc6XFx0XFx0XFx0bmFtZSA9IGtzdHJkdXAoa2VybmZzX3JjdV9uYW1lKGtudG1wKSwgR0ZQX0tFUk5FTCk7XFxuZnMva2VybmZzL21vdW50LmMtMjc4LVxcdFxcdH1cXG4tLVxcbmZzL2tlcm5mcy9zeW1saW5rLmM9Njc9c3RhdGljIGludCBrZXJuZnNfZ2V0X3RhcmdldF9wYXRoKHN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50LFxcbi0tXFxuZnMva2VybmZzL3N5bWxpbmsuYy05NC1cXHR3aGlsZSAoa2VybmZzX3BhcmVudChrbikgXFx1MDAyNlxcdTAwMjYga24gIT0gYmFzZSkge1xcbmZzL2tlcm5mcy9zeW1saW5rLmM6OTU6XFx0XFx0bGVuICs9IHN0cmxlbihrZXJuZnNfcmN1X25hbWUoa24pKSArIDE7XFxuZnMva2VybmZzL3N5bWxpbmsuYy05Ni1cXHRcXHRrbiA9IGtlcm5mc19wYXJlbnQoa24pO1xcbi0tXFxuZnMva2VybmZzL3N5bWxpbmsuYy0xMDgtXFx0d2hpbGUgKGtlcm5mc19wYXJlbnQoa24pIFxcdTAwMjZcXHUwMDI2IGtuICE9IGJhc2UpIHtcXG5mcy9rZXJuZnMvc3ltbGluay5jOjEwOTpcXHRcXHRjb25zdCBjaGFyICpuYW1lID0ga2VybmZzX3JjdV9uYW1lKGtuKTtcXG5mcy9rZXJuZnMvc3ltbGluay5jLTExMC1cXHRcXHRpbnQgc2xlbiA9IHN0cmxlbihuYW1lKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzQ6MTYuOTE4NDA0NDI1WiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE0MTAwNTQ4OTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gS2VybmZzIEludGVybmFscyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYGtlcm5mc2AgYmVoYXZpb3IgYSBiaXQgYmV0dGVyLiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSdtIGdvaW5nIHRvIHN0YXJ0IHdpdGggdGhlIGludGVybmFsIGhlYWRlciBmaWxlcywgc3BlY2lmaWNhbGx5IGBmcy9rZXJuZnMva2VybmZzLWludGVybmFsLmhgLiBMZXQncyBuYXZpZ2F0ZSB0byBhcm91bmQgbGluZSAxMTgg4oCTIHRoYXQncyBvZnRlbiBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgY29yZSBkYXRhIHN0cnVjdHVyZXMgb3IgaW5pdGlhbGl6YXRpb24gcm91dGluZXMsIGRlcGVuZGluZyBvbiBob3cgdGhpcyBwYXJ0aWN1bGFyIGNvZGViYXNlIGlzIHN0cnVjdHVyZWQuIEknbSBob3BpbmcgdG8gZmluZCBzb21ldGhpbmcgcmVsZXZhbnQgdGhlcmUgdGhhdCdsbCBzaGVkIHNvbWUgbGlnaHQgb24gdGhlIGlzc3VlIEknbSB3b3JraW5nIG9uLiBMZXQncyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSSBzdXNwZWN0IHRoaXMgd2lsbCBiZSB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MjU5NTYsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxODozNDozMS4wMTg5NTY3NzVaIiwiU2VxIjo0NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzE3ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMva2VybmZzL2tlcm5mcy1pbnRlcm5hbC5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDExNSxcbiAgXCJMaW5lQ291bnRcIjogMTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDExNTpcXHRcXHRyZXR1cm4gbG9ja2RlcF9pc19oZWxkKFxcdTAwMjZrZXJuZnNfcm9vdChrbiktXFx1MDAzZWtlcm5mc19yZW5hbWVfbG9jayk7XFxuIDExNjpcXHR9XFxuIDExNzpcXHRcXG4gMTE4OlxcdHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqa2VybmZzX3JjdV9uYW1lKGNvbnN0IHN0cnVjdCBrZXJuZnNfbm9kZSAqa24pXFxuIDExOTpcXHR7XFxuIDEyMDpcXHRcXHQvKlxcbiAxMjE6XFx0XFx0ICogTGlrZSBrZXJuZnNfbm9kZTo6X19wYXJlbnQgYmVsb3csIHRoZSBuYW1lIGlzIG9ubHkgcmVwbGFjZWQgdW5kZXJcXG4gMTIyOlxcdFxcdCAqIGJvdGgga2VybmZzX3Jvb3Q6Omtlcm5mc19yd3NlbSBhbmQga2VybmZzX3Jvb3Q6Omtlcm5mc19yZW5hbWVfbG9jayxcXG4gMTIzOlxcdFxcdCAqIHNvIGVpdGhlciBvbmUga2VlcHMgaXQsIGFuZCB0aGUgc3RyaW5nIGl0IHBvaW50cyBhdCwgc3RhYmxlLlxcbiAxMjQ6XFx0XFx0ICovXFxuIDEyNTpcXHRcXHRyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGtuLVxcdTAwM2VuYW1lLFxcbiAxMjY6XFx0XFx0XFx0XFx0XFx0ICAgICBrZXJuZnNfcm9vdF9pc19sb2NrZWQoa24pIHx8XFxuIDEyNzpcXHRcXHRcXHRcXHRcXHQgICAgIGtlcm5mc19yZW5hbWVfaXNfbG9ja2VkKGtuKSk7XFxuIDEyODpcXHR9XFxuIDEyOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzQ6MzEuMDE5MDMwNTQ1WiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMxNTU1MDU1MjgyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBLZXJuZnMgRGlyZWN0b3J5IFJlc3VtcHRpb24gUGF0Y2gqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJIHNlZSwgdGhpcyBwYXRjaCBpcyBhZGRyZXNzaW5nIGEgdHJpY2t5IHByb2JsZW0gaW4ga2VybmZzJyBgcmVhZGRpcmAgYW5kIGBnZXRkZW50c2AgaW1wbGVtZW50YXRpb24sIHNwZWNpZmljYWxseSB3aGVuIGVudHJpZXMgYXJlIHJlbW92ZWQgb3IgcmVuYW1lZCB3aGlsZSBkaXJlY3RvcnkgaXRlcmF0aW9uIGlzIGluIHByb2dyZXNzLiBUaGUgY29yZSBvZiB0aGUgZml4IHJldm9sdmVzIGFyb3VuZCBob3cgdGhlIGNvZGUgaGFuZGxlcyB0aGUgZGlyZWN0b3J5IGVudHJ5IG5hbWUsIGhhc2gsIGFuZCB0aGUgYXNzb2NpYXRlZCBsb2NraW5nIG1lY2hhbmlzbXMuXG5cblRoZSB0ZXN0IGNvbW1lbnRzIGFyZSBrZXkgaGVyZS4gVGhleSBleHBsaWNpdGx5IGNhbGwgb3V0IExPQ0tERVAgYW5kIEtBU0FOLiBNeSBleHBlcnQgaW50dWl0aW9uIGltbWVkaWF0ZWx5IGZsYWdzIHRoaXMgYXMgYSBzaWduIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoIGEgY2hhbmdlIHRoYXQgaW1wYWN0cyBsb2NraW5nIGFuZCBjb25jdXJyZW5jeS4gVGhlIHBhdGNoICpjaGFuZ2VzKiBsb2NraW5nLiBXZSdyZSBkcm9wcGluZyBgcm9vdC1cdTAwM2VrZXJuZnNfcndzZW1gIGJlZm9yZSBgZGlyX2VtaXQoKWAgYW5kIHRoZW4gcmVhY3F1aXJpbmcgaXQuIFBsdXMsIHdlJ3JlIHBpbm5pbmcgdGhlIGBwb3NgIHdpdGggYGtlcm5mc19nZXQocG9zKWAgYW5kIHJlLXZlcmlmeWluZyBpdCBvbiByZXN1bWUuIFRoZSBjb21tZW50cyBjb25maXJtIG15IHN1c3BpY2lvbjogaXQncyBhbGwgYWJvdXQgZW5zdXJpbmcgdGhlIGl0ZXJhdG9yJ3MgdmFsaWRpdHkgYW5kIGF2b2lkaW5nIHJhY2VzIG9yIGNvbmN1cnJlbmN5IGlzc3VlcyBkdXJpbmcgZGlyZWN0b3J5IHRyYXZlcnNhbCwgZXNwZWNpYWxseSB3aGVuIGVudHJpZXMgYXJlIGJlaW5nIG1vZGlmaWVkIGNvbmN1cnJlbnRseS4gVGhlIGdvYWwgaXMgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGVuZCB1cCByZS12aXNpdGluZyBvciBza2lwcGluZyBkaXJlY3RvcnkgZW50cmllcy5cblxuTm93LCBsZXQncyBnZXQgaW50byB0aGUgS01TQU4gcXVlc3Rpb24uXG5cbkZpcnN0bHksIEkgY2hlY2tlZCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuIElzIHRoaXMgcGF0Y2ggcGFzc2luZyB1bmluaXRpYWxpemVkIGtlcm5lbCBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2U/IE5vLiBUaGUgY29kZSdzIHVzaW5nIGBzdHJzY3B5YCwgc28gdGhlIGBuYW1lYCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIGJlaW5nIGNvcGllZC4gSXMgdGhlcmUgYnJhbmNoaW5nIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzPyBOb3BlLCB0aGUgYHJlc3VtZWRgIGJvb2xlYW4gaXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIElzIHRoZXJlIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmUgYWxsb2NhdGlvbiB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkPyBOby4gVGhlIG9ubHkgYWxsb2NhdGlvbiBpcyBhIHNpbXBsZSBga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTClgIGZvciBgbmFtZWAuIERvZXMgaXQgYWx0ZXIgYm91bmRzIGNoZWNrcyBvciBsZW5ndGhzIGluIGEgd2F5IHRoYXQgY291bGQgbGVhZCB0byB1bmluaXRpYWxpemVkIGJ5dGVzIGJlaW5nIGFjY2Vzc2VkPyBOby4gVGhlIGxlbmd0aCBgbGVuYCBpcyBkZXJpdmVkIGZyb20gYHN0cnNjcHlgLCBlbnN1cmluZyBzYWZlIGJvdW5kcy5cblxuTXkgc2Vjb25kIGxpbmUgb2YgdGhpbmtpbmcgZm9jdXNlZCBvbiBwb3RlbnRpYWwgYnVncyBpdCBjb3VsZCBpbnRyb2R1Y2UuIEknbSBmb2N1c2luZyBvbiByYWNlIGNvbmRpdGlvbnMsIHVzZS1hZnRlci1mcmVlLCBhbmQgbG9ja2RlcCBwcm9ibGVtcyBhcm91bmQgZHJvcHBpbmcgYW5kIHJlYWNxdWlyaW5nIGByb290LVx1MDAzZWtlcm5mc19yd3NlbWAuIEknbSBhbHNvIHRoaW5raW5nIGFib3V0IGl0ZXJhdG9yIGNvcnJlY3RuZXNzIOKAkyBtYWtpbmcgc3VyZSB3ZSBkb24ndCBzZWUgZHVwbGljYXRlIGVudHJpZXMgb3IgbWlzcyBlbnRyaWVzIOKAkyBhbmQgbGlmZXRpbWUgaXNzdWVzIHJlbGF0ZWQgdG8gYHBvc2AuXG5cblRoZSBnb29kIG5ld3MgaXMgdGhhdCB0aGVzZSBraW5kcyBvZiBjb25jdXJyZW5jeSwgbGlmZXRpbWUsIGxvY2tpbmcsIGFuZCBvdXQtb2YtYm91bmRzIHByb2JsZW1zIGFyZSBleGFjdGx5IHdoYXQgS0FTQU4gYW5kIExPQ0tERVAgYXJlIGRlc2lnbmVkIHRvIGNhdGNoLCBhbG9uZyB3aXRoIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgdG9vbHMuIFRoZSBwYXRjaCAqaXMqIHBsYXlpbmcgd2l0aCBsb2NrcyBhbmQgZGlyZWN0b3J5IGVudHJpZXMsIGJ1dCBpdCBpc24ndCBwbGF5aW5nIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MuXG5cblNvLCBhZnRlciBhIHRob3JvdWdoIHJldmlldywgaXTigJlzIGNsZWFyIHRvIG1lOiB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlcnNwYWNlIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgS01TQU4gZnV6emluZy4gVGhlcmVmb3JlLCB0aGUgYE5lZWRzS01TQU5gIHRhZyBzaG91bGQgYmUgYGZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY0MzgsIk91dHB1dFRva2VucyI6MzMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODU2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTg6MzU6MDIuNTc0MDg5NTc3WiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk1NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCB1cGRhdGVzIGtlcm5mcyBkaXJlY3RvcnkgaXRlcmF0aW9uIChga2VybmZzX2ZvcF9yZWFkZGlyYCkgdG8gcHJvcGVybHkgaGFuZGxlIHJlYWRkaXIgcmVzdW1wdGlvbiB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgb3IgcmVuYW1lZCBjb25jdXJyZW50bHksIGJ5IGtleWluZyBwb3NpdGlvbiBvbiB0aGUgbm9kZSBuYW1lIGluIGFkZGl0aW9uIHRvIGl0cyBoYXNoIGFuZCBkcm9wcGluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0KClgLlxcblxcbi0gTWVtb3J5IGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uOiBBIHRlbXBvcmFyeSBidWZmZXIgYG5hbWVgIGlzIGFsbG9jYXRlZCB2aWEgYGttYWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpYC4gQmVmb3JlIGFueSByZWFkLCBpdCBpcyBwb3B1bGF0ZWQgdXNpbmcgYHN0cnNjcHkobmFtZSwga2VybmZzX3JjdV9uYW1lKHBvcyksIFBBVEhfTUFYKWAuIFRoZSBzdHJpbmcgY29tcGFyaXNvbiBmdW5jdGlvbnMgKGBzdHJjbXBgKSBhbmQgYGRpcl9lbWl0KClgIG9ubHkgYWNjZXNzIHRoZSBwb3B1bGF0ZWQsIE5VTC10ZXJtaW5hdGVkIHByZWZpeCBvZiBsZW5ndGggYGxlbmAuIE5vIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBidWZmZXIgYXJlIHJlYWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS5cXG4tIExvY2FsIHZhcmlhYmxlczogVGhlIHN0YWNrIHZhcmlhYmxlIGBib29sIHJlc3VtZWRgIHBhc3NlZCB0byBga2VybmZzX2Rpcl9wb3MoKWAgaXMgdW5jb25kaXRpb25hbGx5IGluaXRpYWxpemVkIHRvIGBmYWxzZWAgdXBvbiBlbnRyeSB0byBga2VybmZzX2Rpcl9wb3MoKWAuXFxuLSBQcmltYXJ5IHJpc2tzOiBUaGUgcGF0Y2ggbW9kaWZpZXMgbG9ja2luZyBiZWhhdmlvciAoZHJvcHBpbmcgYW5kIHJlLWFjcXVpcmluZyBga2VybmZzX3J3c2VtYCBhcm91bmQgYGRpcl9lbWl0YCkgYW5kIG5vZGUgcmVmY291bnRpbmcvdmFsaWRhdGlvbi4gVGhlc2UgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb3RlbnRpYWwgY29uY3VycmVuY3kgcmFjZXMsIGxvY2sgaW52ZXJzaW9uLCBhbmQgbGlmZXRpbWUvdXNlLWFmdGVyLWZyZWUgYnVncywgd2hpY2ggYXJlIGZ1bGx5IGNvdmVyZWQgYnkgTE9DS0RFUCBhbmQgS0FTQU4uXFxuXFxuQmVjYXVzZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIGJlIHVuaXF1ZWx5IGRldGVjdGVkIGJ5IEtNU0FOLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMga2VybmZzIGRpcmVjdG9yeSBpdGVyYXRpb24gKGBrZXJuZnNfZm9wX3JlYWRkaXJgKSB0byBwcm9wZXJseSBoYW5kbGUgcmVhZGRpciByZXN1bXB0aW9uIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBvciByZW5hbWVkIGNvbmN1cnJlbnRseSwgYnkga2V5aW5nIHBvc2l0aW9uIG9uIHRoZSBub2RlIG5hbWUgaW4gYWRkaXRpb24gdG8gaXRzIGhhc2ggYW5kIGRyb3BwaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXQoKWAuXFxuXFxuLSBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb246IEEgdGVtcG9yYXJ5IGJ1ZmZlciBgbmFtZWAgaXMgYWxsb2NhdGVkIHZpYSBga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTClgLiBCZWZvcmUgYW55IHJlYWQsIGl0IGlzIHBvcHVsYXRlZCB1c2luZyBgc3Ryc2NweShuYW1lLCBrZXJuZnNfcmN1X25hbWUocG9zKSwgUEFUSF9NQVgpYC4gVGhlIHN0cmluZyBjb21wYXJpc29uIGZ1bmN0aW9ucyAoYHN0cmNtcGApIGFuZCBgZGlyX2VtaXQoKWAgb25seSBhY2Nlc3MgdGhlIHBvcHVsYXRlZCwgTlVMLXRlcm1pbmF0ZWQgcHJlZml4IG9mIGxlbmd0aCBgbGVuYC4gTm8gdW5pbml0aWFsaXplZCBieXRlcyBmcm9tIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZmZlciBhcmUgcmVhZCBvciBjb3BpZWQgdG8gdXNlcnNwYWNlLlxcbi0gTG9jYWwgdmFyaWFibGVzOiBUaGUgc3RhY2sgdmFyaWFibGUgYGJvb2wgcmVzdW1lZGAgcGFzc2VkIHRvIGBrZXJuZnNfZGlyX3BvcygpYCBpcyB1bmNvbmRpdGlvbmFsbHkgaW5pdGlhbGl6ZWQgdG8gYGZhbHNlYCB1cG9uIGVudHJ5IHRvIGBrZXJuZnNfZGlyX3BvcygpYC5cXG4tIFByaW1hcnkgcmlza3M6IFRoZSBwYXRjaCBtb2RpZmllcyBsb2NraW5nIGJlaGF2aW9yIChkcm9wcGluZyBhbmQgcmUtYWNxdWlyaW5nIGBrZXJuZnNfcndzZW1gIGFyb3VuZCBgZGlyX2VtaXRgKSBhbmQgbm9kZSByZWZjb3VudGluZy92YWxpZGF0aW9uLiBUaGVzZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIHBvdGVudGlhbCBjb25jdXJyZW5jeSByYWNlcywgbG9jayBpbnZlcnNpb24sIGFuZCBsaWZldGltZS91c2UtYWZ0ZXItZnJlZSBidWdzLCB3aGljaCBhcmUgZnVsbHkgY292ZXJlZCBieSBMT0NLREVQIGFuZCBLQVNBTi5cXG5cXG5CZWNhdXNlIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrIHJpc2tzIHRoYXQgd291bGQgYmUgdW5pcXVlbHkgZGV0ZWN0ZWQgYnkgS01TQU4sIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowdxx9w[1] Phase: Succeeded StartedAt: 2026-09-11 18:35:14 +0000 UTC FinishedAt: 2026-09-11 18:35:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-11 18:35:14 +0000 UTC FinishedAt: 2026-09-11 18:35:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2] Phase: Succeeded StartedAt: 2026-09-11 18:35:14 +0000 UTC FinishedAt: 2026-09-11 22:18:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-11 18:35:14 +0000 UTC FinishedAt: 2026-09-11 22:18:19 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},"fuzz":{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-11 18:35:14 +0000 UTC FinishedAt: 2026-09-11 18:35:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-11 18:35:14 +0000 UTC FinishedAt: 2026-09-11 18:35:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdxx9w/series-workflowdxx9w-convert-artifact-3990505987/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-11 18:35:24 +0000 UTC FinishedAt: 2026-09-11 18:52:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-11 18:35:24 +0000 UTC FinishedAt: 2026-09-11 18:52:14 +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:*aabbf0b0-a7ed-4c2b-93b5-7581e4dfacef,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-workflowdxx9w/series-workflowdxx9w-convert-artifact-3990505987/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": "43617b84-e26c-47ab-b0ff-69b96255cf8d", "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-workflowdxx9w/series-workflowdxx9w-build-action-2081225329/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-11 18:35:24 +0000 UTC FinishedAt: 2026-09-11 18:52:04 +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:*aabbf0b0-a7ed-4c2b-93b5-7581e4dfacef,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-workflowdxx9w/series-workflowdxx9w-convert-artifact-3990505987/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": "43617b84-e26c-47ab-b0ff-69b96255cf8d", "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-workflowdxx9w/series-workflowdxx9w-build-action-2081225329/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-11 18:52:14 +0000 UTC FinishedAt: 2026-09-11 18:52:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-11 18:52:14 +0000 UTC FinishedAt: 2026-09-11 18:52:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-11 18:52:14 +0000 UTC FinishedAt: 2026-09-11 18:52:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-11 18:52:14 +0000 UTC FinishedAt: 2026-09-11 18:52:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdxx9w/series-workflowdxx9w-convert-artifact-702380218/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-11 18:52:24 +0000 UTC FinishedAt: 2026-09-11 18:54:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-11 18:52:24 +0000 UTC FinishedAt: 2026-09-11 18:54:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*43617b84-e26c-47ab-b0ff-69b96255cf8d,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-workflowdxx9w/series-workflowdxx9w-build-action-2081225329/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-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-11 18:54:17 +0000 UTC FinishedAt: 2026-09-11 18:54:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-11 18:54:17 +0000 UTC FinishedAt: 2026-09-11 18:54:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-11 18:54:17 +0000 UTC FinishedAt: 2026-09-11 19:12:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-11 18:54:17 +0000 UTC FinishedAt: 2026-09-11 19:12:08 +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:*aabbf0b0-a7ed-4c2b-93b5-7581e4dfacef,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-workflowdxx9w/series-workflowdxx9w-convert-artifact-702380218/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": "618e0154-b88a-403b-a2ab-c54e80f84c51", "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-workflowdxx9w/series-workflowdxx9w-build-action-3171690270/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-11 18:54:17 +0000 UTC FinishedAt: 2026-09-11 19:11:58 +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:*aabbf0b0-a7ed-4c2b-93b5-7581e4dfacef,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-workflowdxx9w/series-workflowdxx9w-convert-artifact-702380218/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": "618e0154-b88a-403b-a2ab-c54e80f84c51", "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-workflowdxx9w/series-workflowdxx9w-build-action-3171690270/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-11 19:12:08 +0000 UTC FinishedAt: 2026-09-11 19:12:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-11 19:12:08 +0000 UTC FinishedAt: 2026-09-11 19:12:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-11 19:12:08 +0000 UTC FinishedAt: 2026-09-11 19:14:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-11 19:12:08 +0000 UTC FinishedAt: 2026-09-11 19:13:54 +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:*618e0154-b88a-403b-a2ab-c54e80f84c51,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-workflowdxx9w/series-workflowdxx9w-build-action-3171690270/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-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-11 19:14:04 +0000 UTC FinishedAt: 2026-09-11 22:18:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-11 19:14:04 +0000 UTC FinishedAt: 2026-09-11 22:18:19 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*43617b84-e26c-47ab-b0ff-69b96255cf8d,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*618e0154-b88a-403b-a2ab-c54e80f84c51,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-workflowdxx9w/series-workflowdxx9w-build-action-2081225329/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-workflowdxx9w/series-workflowdxx9w-build-action-3171690270/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-11 19:14:04 +0000 UTC FinishedAt: 2026-09-11 19:14:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-11 19:14:04 +0000 UTC FinishedAt: 2026-09-11 19:14:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowdxx9w/series-workflowdxx9w-convert-artifact-2342263535/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-11 19:14:04 +0000 UTC FinishedAt: 2026-09-11 19:14:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-11 19:14:04 +0000 UTC FinishedAt: 2026-09-11 19:14:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-11 19:14:04 +0000 UTC FinishedAt: 2026-09-11 19:14:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-11 19:14:14 +0000 UTC FinishedAt: 2026-09-11 22:18:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdxx9w[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"base_commit":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","base_tree":"vfs","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["kernfs_fop_readdir","kernfs_dir_pos","kernfs_dir_next_pos"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"7f24d0f60b1087dbc28d68398957c18774e5a7d8","config_name":"upstream-apparmor-kasan.config","enable_configs":["KERNFS","SYSFS"],"series_id":"6d0f4da5-c389-41c6-b862-7b08f467ebd1","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-11 19:14:14 +0000 UTC FinishedAt: 2026-09-11 22:18:09 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*43617b84-e26c-47ab-b0ff-69b96255cf8d,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*618e0154-b88a-403b-a2ab-c54e80f84c51,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-workflowdxx9w/series-workflowdxx9w-build-action-2081225329/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-workflowdxx9w/series-workflowdxx9w-build-action-3171690270/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-workflowdxx9w/series-workflowdxx9w-convert-artifact-2342263535/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,}