Name: series-workflows88xq Phase: Succeeded StartedAt: 2026-09-09 13:02:43 +0000 UTC FinishedAt: 2026-09-09 17:23:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[0] Phase: Succeeded StartedAt: 2026-09-09 13:02:43 +0000 UTC FinishedAt: 2026-09-09 13:36:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[0].run-triage Phase: Succeeded StartedAt: 2026-09-09 13:02:43 +0000 UTC FinishedAt: 2026-09-09 13:36:01 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "53a57667a3201fb756e6e9ffa0f6de4698dc917c", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ZSWAP", "SWAP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "53a57667a3201fb756e6e9ffa0f6de4698dc917c", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ZSWAP", "SWAP" ], "series_id": "2c753753-fa3e-43d5-a84f-1c1bebc01c34" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "zswap_store", "zswap_invalidate" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1pTV0FQJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6c3dhcF9zdG9yZSYjMzQ7LAogICAgJiMzNDt6c3dhcF9pbnZhbGlkYXRlJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhbiBlYXJseS1yZXR1cm4gY2hlY2sgdXNpbmcgYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgaW4gYHpzd2FwX3N0b3JlKClgIGFuZCByZWZhY3RvcnMgb3Blbi1jb2RlZCB6c3dhcCB0cmVlIGludmFsaWRhdGlvbiBsb2dpYyBvbiBzdG9yZSBmYWlsdXJlIHRvIHJldXNlIGB6c3dhcF9pbnZhbGlkYXRlKClgLiBObyBtZW1vcnkgYWxsb2NhdGlvbnMsIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMsIG9yIGNvcHktdG8tdXNlciBvcGVyYXRpb25zIGFyZSBpbnRyb2R1Y2VkIG9yIGFsdGVyZWQuIE5vIGNvbmRpdGlvbmFsIGxvZ2ljIHJlbGllcyBvbiB1bmluaXRpYWxpemVkIGRhdGEuIEFueSBtZW1vcnkgc2FmZXR5IGNvbmNlcm5zIGluIHRoaXMgc3dhcCBwYXRoIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgb3IgbG9ja2luZyBlcnJvcnMpIGFyZSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnZXJzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3Iga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL3pzd2FwLmMgYnkgYWRkaW5nIGFuIGVhcmx5LWV4aXQgY2hlY2sgaW4genN3YXBfc3RvcmUoKSB3aGVuIHpzd2FwIGhhcyBuZXZlciBiZWVuIGVuYWJsZWQsIGFuZCByZWZhY3RvcmluZyB0aGUgZXJyb3IvZGlzYWJsZWQgZmFsbGJhY2sgbG9vcCB0byB1c2UgenN3YXBfaW52YWxpZGF0ZSgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHN3YXBvdXQvenN3YXAgbG9naWMgYW5kIGFyZSBkaXJlY3RseSByZWFjaGFibGUgYW5kIHRlc3RhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDY3Y2VhNjllYzY0Y2M5Y2U1Y2JmNDY5NDMwNzg2ZmIzNDRmYmQ1YmVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIFNlcCA5IDEzOjM0OjE3IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCA1ZDBkOGJkNzIxOTNhLi5mYzZjNWUwZGI1ZTQzIDEwMDY0NFxuLS0tIGEvbW0venN3YXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0venN3YXAuY1xuQEAgLTE0ODgsNiAmIzQzOzE0ODgsOSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XG4gXG4mIzQzO1x0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4gXHRpZiAoIXpzd2FwX2VuYWJsZWQpXG4gXHRcdGdvdG8gY2hlY2tfb2xkO1xuIFxuQEAgLTE1NDUsMTUgJiM0MzsxNTQ4LDEwIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdGlmICghcmV0KSB7XG4gXHRcdHVuc2lnbmVkIHR5cGUgPSBzd3BfdHlwZShzd3ApO1xuIFx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbi1cdFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTtcbi1cdFx0c3RydWN0IHhhcnJheSAqdHJlZTtcbi1cbi1cdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7XG4tXHRcdFx0dHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICYjNDM7IGluZGV4KSk7XG4tXHRcdFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQgJiM0MzsgaW5kZXgpO1xuLVx0XHRcdGlmIChlbnRyeSlcbi1cdFx0XHRcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuLVx0XHR9XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KVxuJiM0MztcdFx0XHR6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgJiM0MzsgaW5kZXgpKTtcbiYjNDM7XG4gXHR9XG4gXG4gXHRyZXR1cm4gcmV0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1pTV0FQJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6c3dhcF9zdG9yZSYjMzQ7LAogICAgJiMzNDt6c3dhcF9pbnZhbGlkYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgaW4gbW0venN3YXAuYyBieSBhZGRpbmcgYW4gZWFybHktZXhpdCBjaGVjayBpbiB6c3dhcF9zdG9yZSgpIHdoZW4genN3YXAgaGFzIG5ldmVyIGJlZW4gZW5hYmxlZCwgYW5kIHJlZmFjdG9yaW5nIHRoZSBlcnJvci9kaXNhYmxlZCBmYWxsYmFjayBsb29wIHRvIHVzZSB6c3dhcF9pbnZhbGlkYXRlKCkuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IGNvcmUgc3dhcG91dC96c3dhcCBsb2dpYyBhbmQgYXJlIGRpcmVjdGx5IHJlYWNoYWJsZSBhbmQgdGVzdGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNjdjZWE2OWVjNjRjYzljZTVjYmY0Njk0MzA3ODZmYjM0NGZiZDViZQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgU2VwIDkgMTM6MzQ6MTcgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuYwppbmRleCA1ZDBkOGJkNzIxOTNhLi5mYzZjNWUwZGI1ZTQzIDEwMDY0NAotLS0gYS9tbS96c3dhcC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3pzd2FwLmMKQEAgLTE0ODgsNiAmIzQzOzE0ODgsOSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiAJVk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpOwogCVZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKTsKIAomIzQzOwlpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwogCWlmICghenN3YXBfZW5hYmxlZCkKIAkJZ290byBjaGVja19vbGQ7CiAKQEAgLTE1NDUsMTUgJiM0MzsxNTQ4LDEwIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKIAlpZiAoIXJldCkgewogCQl1bnNpZ25lZCB0eXBlID0gc3dwX3R5cGUoc3dwKTsKIAkJcGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7Ci0JCXN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7Ci0JCXN0cnVjdCB4YXJyYXkgKnRyZWU7Ci0KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4ICZsdDsgbnJfcGFnZXM7ICYjNDM7JiM0MztpbmRleCkgewotCQkJdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICYjNDM7IGluZGV4KSk7Ci0JCQllbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCAmIzQzOyBpbmRleCk7Ci0JCQlpZiAoZW50cnkpCi0JCQkJenN3YXBfZW50cnlfZnJlZShlbnRyeSk7Ci0JCX0KJiM0MzsKJiM0MzsJCWZvciAoaW5kZXggPSAwOyBpbmRleCAmbHQ7IG5yX3BhZ2VzOyAmIzQzOyYjNDM7aW5kZXgpCiYjNDM7CQkJenN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICYjNDM7IGluZGV4KSk7CiYjNDM7CiAJfQogCiAJcmV0dXJuIHJldDsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzA2OAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDQ3NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFdmFsdWF0aW5nIHRoZSBQYXRjaCYjMzk7cyBTdWl0YWJpbGl0eSBmb3IgU3l6a2FsbGVyIEZ1enppbmcqKgoKT2theSwgc28gSSYjMzk7dmUgZ290IGEgcGF0Y2ggcmV2aWV3IHJlcXVlc3QsIHNwZWNpZmljYWxseSBmb3IgZnV6emluZyB0cmlhZ2UgaW4gdGhlIExpbnV4IGtlcm5lbC4gU2VlbXMgcHJldHR5IGJlbmlnbiwgZmFsbGluZyB1bmRlciBkZWZlbnNpdmUgc2VjdXJpdHkgZW5naW5lZXJpbmcgYW5kIGtlcm5lbCBRQSwgbm90aGluZyBzY3JlYW1pbmcgJiMzNDtjcml0aWNhbCB2dWxuZXJhYmlsaXR5JiMzNDsgaGVyZS4gR29vZC4KClRoZSBwYXRjaCBpdHNlbGYgdG91Y2hlcyBgbW0venN3YXAuY2AsIHNwZWNpZmljYWxseSBgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylgLiBMb29raW5nIGF0IHRoZSBkaWZmLCBpdCBpbnRyb2R1Y2VzIGEgY2hlY2s6IGBpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7YC4gVGhpcyBzZWVtcyB0byBiZSBhIHNhZmVndWFyZCBhZ2FpbnN0IHpzd2FwIGJlaW5nIHVzZWQgd2hlbiBpdCBpc24mIzM5O3QgZW5hYmxlZCwgd2hpY2ggbWFrZXMgc2Vuc2UuIFRoZXJlIGFyZSBzb21lIGNoYW5nZXMgYWZ0ZXIgdGhlIGAhcmV0YCBjaGVjay4gSXQgcmVwbGFjZXMgdGhlIHVzZSBvZiBgeGFfZXJhc2VgIHdpdGggYSBgenN3YXBfaW52YWxpZGF0ZWAgd2hpY2ggbG9va3MgbGlrZSBhIHJlZmFjdG9yaW5nLgoKTXkgbmV4dCBzdGVwIGlzIHRvIGRpdmUgZGVlcGVyLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dC4gSSYjMzk7bGwgYmUgZGlnZ2luZyBpbnRvIGBtbS96c3dhcC5jYCBhbmQgYWRqYWNlbnQgY29kZS4gSSYjMzk7bGwgYmUgdXNpbmcgdGhlIHVzdWFsIHRvb2xzLCBsaWtlIGdyZXAsIGNzY29wZSwgbWF5YmUgc29tZSBzdGF0aWMgYW5hbHlzaXMsIHRvIGdldCBhIGhhbmRsZSBvbiBjYWxsZXJzLCBjb25maWd1cmF0aW9ucyByZWxhdGVkIHRvIHpzd2FwLCBhbmQgZmlndXJlIG91dCB3aGF0IHRoZSBjcml0aWNhbCBzeW1ib2xzIGFyZS4gSSYjMzk7bGwgbmVlZCB0byBrbm93IHdoYXQgZnVuY3Rpb25zIGNhbGwgYHpzd2FwX3N0b3JlYCwgYW5kIHdoYXQgbW9kdWxlcyB1c2UgdGhpcy4gQWZ0ZXIgdGhhdCwgSSBjYW4gZm9ybSBhIGJldHRlciB2aWV3LiBUaGVuLCBJIGNhbiBwcm9wZXJseSBldmFsdWF0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGNoYW5nZSB3YXJyYW50cyBTeXprYWxsZXIgZnV6emluZy4gSXQmIzM5O3MgdG9vIGVhcmx5IHRvIHNheSBmb3Igc3VyZSB3aXRob3V0IG1vcmUgaW52ZXN0aWdhdGlvbiwgYnV0IGZyb20gYSBmaXJzdCBnbGFuY2UsIHRoZSBjaGFuZ2Ugc2VlbXMgcmVhc29uYWJsZSwgYW5kIHBvdGVudGlhbGx5IGZ1enppbmcgaXMgbm90IG5lY2Vzc2FyeS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3pzd2FwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNDgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE0ODA6XHRcdGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4xNDgxOlx0XHRzd3BfZW50cnlfdCBzd3AgPSBmb2xpby1cdTAwM2Vzd2FwO1xuMTQ4MjpcdFx0c3RydWN0IG9ial9jZ3JvdXAgKm9iamNnID0gTlVMTDtcbjE0ODM6XHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7XG4xNDg0Olx0XHRzdHJ1Y3QgenN3YXBfcG9vbCAqcG9vbDtcbjE0ODU6XHRcdGJvb2wgcmV0ID0gZmFsc2U7XG4xNDg2Olx0XHRsb25nIGluZGV4O1xuMTQ4NzpcdFxuMTQ4ODpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xuMTQ4OTpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpO1xuMTQ5MDpcdFxuMTQ5MTpcdFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbjE0OTI6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTQ5MzpcdFxuMTQ5NDpcdFx0aWYgKCF6c3dhcF9lbmFibGVkKVxuMTQ5NTpcdFx0XHRnb3RvIGNoZWNrX29sZDtcbjE0OTY6XHRcbjE0OTc6XHRcdG9iamNnID0gZ2V0X29ial9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4xNDk4Olx0XHRpZiAob2JqY2cgXHUwMDI2XHUwMDI2ICFvYmpfY2dyb3VwX21heV96c3dhcChvYmpjZykpIHtcbjE0OTk6XHRcdFx0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX29iamNnKG9iamNnKTtcbjE1MDA6XHRcdFx0aWYgKHNocmlua19tZW1jZyhtZW1jZykpIHtcbjE1MDE6XHRcdFx0XHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4xNTAyOlx0XHRcdFx0Z290byBwdXRfb2JqY2c7XG4xNTAzOlx0XHRcdH1cbjE1MDQ6XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUwNTpcdFx0fVxuMTUwNjpcdFxuMTUwNzpcdFx0aWYgKHpzd2FwX2NoZWNrX2xpbWl0cygpKVxuMTUwODpcdFx0XHRnb3RvIHB1dF9vYmpjZztcbjE1MDk6XHRcbjE1MTA6XHRcdHBvb2wgPSB6c3dhcF9wb29sX2N1cnJlbnRfZ2V0KCk7XG4xNTExOlx0XHRpZiAoIXBvb2wpXG4xNTEyOlx0XHRcdGdvdG8gcHV0X29iamNnO1xuMTUxMzpcdFxuMTUxNDpcdFx0aWYgKG9iamNnKSB7XG4xNTE1Olx0XHRcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9vYmpjZyhvYmpjZyk7XG4xNTE2Olx0XHRcdGlmIChtZW1jZ19saXN0X2xydV9hbGxvYyhtZW1jZywgXHUwMDI2enN3YXBfbGlzdF9scnUsIEdGUF9LRVJORUwpKSB7XG4xNTE3Olx0XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUxODpcdFx0XHRcdGdvdG8gcHV0X3Bvb2w7XG4xNTE5Olx0XHRcdH1cbjE1MjA6XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUyMTpcdFx0fVxuMTUyMjpcdFxuMTUyMzpcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7XG4xNTI0Olx0XHRcdGlmICghenN3YXBfc3RvcmVfcGFnZShmb2xpbywgaW5kZXgsIG9iamNnLCBwb29sKSlcbjE1MjU6XHRcdFx0XHRnb3RvIHB1dF9wb29sO1xuMTUyNjpcdFx0fVxuMTUyNzpcdFxuMTUyODpcdFx0aWYgKG9iamNnKVxuMTUyOTpcdFx0XHRjb3VudF9vYmpjZ19ldmVudHMob2JqY2csIFpTV1BPVVQsIG5yX3BhZ2VzKTtcbjE1MzA6XHRcbjE1MzE6XHRcdGNvdW50X3ZtX2V2ZW50cyhaU1dQT1VULCBucl9wYWdlcyk7XG4xNTMyOlx0XG4xNTMzOlx0XHRyZXQgPSB0cnVlO1xuMTUzNDpcdFxuMTUzNTpcdHB1dF9wb29sOlxuMTUzNjpcdFx0enN3YXBfcG9vbF9wdXQocG9vbCk7XG4xNTM3Olx0cHV0X29iamNnOlxuMTUzODpcdFx0b2JqX2Nncm91cF9wdXQob2JqY2cpO1xuMTUzOTpcdFx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsKVxuMTU0MDpcdFx0XHRxdWV1ZV93b3JrKHNocmlua193cSwgXHUwMDI2enN3YXBfc2hyaW5rX3dvcmspO1xuMTU0MTpcdGNoZWNrX29sZDpcbjE1NDI6XHRcdC8qXG4xNTQzOlx0XHQgKiBJZiB0aGUgenN3YXAgc3RvcmUgZmFpbHMgb3IgenN3YXAgaXMgZGlzYWJsZWQsIHdlIG11c3QgaW52YWxpZGF0ZVxuMTU0NDpcdFx0ICogdGhlIHBvc3NpYmx5IHN0YWxlIGVudHJpZXMgd2hpY2ggd2VyZSBwcmV2aW91c2x5IHN0b3JlZCBhdCB0aGVcbjE1NDU6XHRcdCAqIG9mZnNldHMgY29ycmVzcG9uZGluZyB0byBlYWNoIHBhZ2Ugb2YgdGhlIGZvbGlvLiBPdGhlcndpc2UsXG4xNTQ2Olx0XHQgKiB3cml0ZWJhY2sgY291bGQgb3ZlcndyaXRlIHRoZSBuZXcgZGF0YSBpbiB0aGUgc3dhcGZpbGUuXG4xNTQ3Olx0XHQgKi9cbjE1NDg6XHRcdGlmICghcmV0KSB7XG4xNTQ5Olx0XHRcdHVuc2lnbmVkIHR5cGUgPSBzd3BfdHlwZShzd3ApO1xuMTU1MDpcdFx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbjE1NTE6XHRcbjE1NTI6XHRcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KVxuMTU1MzpcdFx0XHRcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCAmIzQzOyBpbmRleCkpO1xuMTU1NDpcdFxuMTU1NTpcdFx0fVxuMTU1NjpcdFxuMTU1NzpcdFx0cmV0dXJuIHJldDtcbjE1NTg6XHR9XG4xNTU5Olx0XG4xNTYwOlx0LyoqXG4xNTYxOlx0ICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbjE1NjI6XHQgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbjE1NjM6XHQgKlxuMTU2NDpcdCAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZVxuMTU2NTpcdCAqIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6XG4xNTY2Olx0ICpcbjE1Njc6XHQgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgY291bGQgbm90IGJlIGxvYWRlZFxuMTU2ODpcdCAqICBpbnRvIHRoZSBwYWdlIGR1ZSB0byBhIGRlY29tcHJlc3Npb24gZmFpbHVyZS4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXRcbjE1Njk6XHQgKiAgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MjY4CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBmdW5jdGlvbnMsIGFzIGlmIEkmIzM5O20gdGhpbmtpbmcgaXQgdGhyb3VnaDoKCioqSW52ZXN0aWdhdGluZyBgenN3YXBfbmV2ZXJfZW5hYmxlZCgpYCBhbmQgYHpzd2FwX2ludmFsaWRhdGUoKWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGVzZSBgenN3YXBgIGZ1bmN0aW9ucy4gRmlyc3QsIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCBgenN3YXBfbmV2ZXJfZW5hYmxlZCgpYCBhbmQgYHpzd2FwX2ludmFsaWRhdGUoKWAgYXJlIGFjdHVhbGx5IGRvaW5nLiBUaW1lIHRvIGNoZWNrIHRoZSBzb3VyY2UgY29kZS4gSSYjMzk7bGwgbmVlZCB0byBsb2NhdGUgdGhlaXIgZGVmaW5pdGlvbnMsIHByb2JhYmx5IGluIGBtbS96c3dhcC5jYCwgb3IgbWF5YmUgSSBjYW4gZmluZCBpdCBpbiBhbiBpbmNsdWRlIGZpbGUuIEEgcXVpY2sgYGdyZXBgIHNob3VsZCBnZXQgbWUgdGhlIGFuc3dlcnMgZmFzdCwgc2hvd2luZyBtZSB3aGVyZSB0aGV5JiMzOTtyZSBkZWZpbmVkIGFuZCBjYWxsZWQuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgY29kZSByZXZlYWxzIGFib3V0IHRoZWlyIHJvbGVzIGluIHRoZSB6c3dhcCBtZWNoYW5pc20uIFRoYXQmIzM5O2xsIHByb3ZpZGUgdGhlIGNvbnRleHQgdG8gdW5kZXJzdGFuZCB0aGVpciBwYXJ0aWN1bGFyIGZ1bmN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3pzd2FwX25ldmVyX2VuYWJsZWQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5LmM9NDc1OD1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aHBfc3dhcGluX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy00Nzc5LVx0ICovXG5tbS9tZW1vcnkuYzo0NzgwOlx0aWYgKCF6c3dhcF9uZXZlcl9lbmFibGVkKCkpXG5tbS9tZW1vcnkuYy00NzgxLVx0XHRyZXR1cm4gMDtcbi0tXG5tbS9zaG1lbS5jPTIyNDU9c3RhdGljIHN0cnVjdCBmb2xpbyAqc2htZW1fc3dhcF9hbGxvY19mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbm1tL3NobWVtLmMtMjI1NC1cdGlmICgodm1mIFx1MDAyNlx1MDAyNiB1bmxpa2VseSh1c2VyZmF1bHRmZF9hcm1lZCh2bWYtXHUwMDNldm1hKSkpIHx8XG5tbS9zaG1lbS5jOjIyNTU6XHQgICAgICF6c3dhcF9uZXZlcl9lbmFibGVkKCkpXG5tbS9zaG1lbS5jLTIyNTYtXHRcdG9yZGVyID0gMDtcbi0tXG5tbS96c3dhcC5jPTEyNT1ib29sIHpzd2FwX2lzX2VuYWJsZWQodm9pZClcbi0tXG5tbS96c3dhcC5jLTEyOS1cbm1tL3pzd2FwLmM6MTMwOmJvb2wgenN3YXBfbmV2ZXJfZW5hYmxlZCh2b2lkKVxubW0venN3YXAuYy0xMzEte1xuLS1cbm1tL3pzd2FwLmM9MTQ3OD1ib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0venN3YXAuYy0xNDkwLVxubW0venN3YXAuYzoxNDkxOlx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbm1tL3pzd2FwLmMtMTQ5Mi1cdFx0cmV0dXJuIGZhbHNlO1xuLS1cbm1tL3pzd2FwLmM9MTU4MD1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3pzd2FwLmMtMTU4OS1cbm1tL3pzd2FwLmM6MTU5MDpcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXG5tbS96c3dhcC5jLTE1OTEtXHRcdHJldHVybiAtRU5PRU5UO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU5NTUKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIGtlcm5lbCB6c3dhcCBjb21wb25lbnRzLCBmcm9tIGEgdGVjaG5pY2FsIHBlcnNwZWN0aXZlOgoKKipEaXZpbmcgaW50byB6c3dhcCBDb25maWd1cmF0aW9uIGFuZCBPcGVyYXRpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIHRoZSBudXRzIGFuZCBib2x0cyBvZiBob3cgenN3YXAgaXMgY29uZmlndXJlZCBhbmQgYmVoYXZlcy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3Mgb2YgYHpzd2FwX25ldmVyX2VuYWJsZWRgLCBgenN3YXBfaW52YWxpZGF0ZWAsIGFuZCB0aGUgcmVsZXZhbnQgS2NvbmZpZyBvcHRpb25zLiBUaGVzZSBhcmUga2V5IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBkeW5hbWljIGJlaGF2aW9yIGFuZCBjb250cm9sIHBvaW50cyBvZiB0aGUgenN3YXAgc3Vic3lzdGVtLCBhbmQgaG93IGl04oCZcyBpbnRlZ3JhdGVkIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudC4gSSByZWNhbGwgdGhlIGltcGxpY2F0aW9ucyBvZiBlYWNoLCBidXQgSSBuZWVkIHRvIGVuc3VyZSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzIGlzIHNoYXJwLgoKRmlyc3RseSwgYHpzd2FwX25ldmVyX2VuYWJsZWRgLi4uIHRoaXMgbGlrZWx5IGZ1bmN0aW9ucyBhcyBhIGdsb2JhbCBnYXRlLCBhIGZsYWcgdGhhdCBlZmZlY3RpdmVseSBkaXNhYmxlcyB6c3dhcCBhdCBib290IGlmIHNldC4gSXQmIzM5O3MgcHJvYmFibHkgY2hlY2tlZCBlYXJseSBpbiBpbml0aWFsaXphdGlvbiwgcG90ZW50aWFsbHkgcHJldmVudGluZyBhbGxvY2F0aW9uIG9mIHRoZSBuZWNlc3NhcnkgZGF0YSBzdHJ1Y3R1cmVzIG9yIHByZXZlbnRpbmcgcmVnaXN0cmF0aW9uIG9mIHpzd2FwIGFzIGEgc3dhcCBzcGFjZSBwcm92aWRlci4gVGhlIGtleSBoZXJlIGlzIHRoZSBsZXZlbCBvZiBncmFudWxhcml0eTsgZG9lcyBpdCBmdWxseSB1bmxvYWQgdGhlIG1vZHVsZXMsIG9yIGRvZXMgaXQgc2ltcGx5IHByZXZlbnQgdXNlPyBJIHdhbnQgdG8gdmVyaWZ5IHRoZSBpbXBsaWNhdGlvbnMgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBjb21tYW5kLWxpbmUgcGFyYW1ldGVycy4KCk5leHQsIGB6c3dhcF9pbnZhbGlkYXRlYC4gTm93LCB0aGlzIHNvdW5kcyBpbnRyaWd1aW5nLiBJdCBpbXBsaWVzIGFuIGludmFsaWRhdGlvbiBzdHJhdGVneS4gSSBhc3N1bWUgdGhpcyByZWxhdGVzIHRvIHRoZSBjYWNoZSBtYW5hZ2VtZW50IG9yIHdyaXRlLWJhY2sgcG9saWNpZXMuIERvZXMgaXQgdHJpZ2dlciBhbiBleHBsaWNpdCBpbnZhbGlkYXRpb24gb2YgdGhlIHN3YXAgZW50cmllcywgZm9yY2luZyB0aGVtIHRvIGJlIHJlLWNvbXByZXNzZWQgYW5kIHdyaXR0ZW4gYmFjaz8gT3IgZG9lcyBpdCBoaW50IGF0IGEgd2F5IHRvIHB1cmdlIHBhZ2VzIHRvIHJlY2xhaW0gc3BhY2U/IEnigJlsbCBuZWVkIHRvIGNoZWNrIHRoZSBjb2RlLiBBcmUgdGhlcmUgYW55IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRvIGJlIG1pbmRmdWwgb2YgaGVyZT8gSG93IGRvZXMgaXQgaW50ZXJhY3Qgd2l0aCB0aGUgcGFnZSByZWNsYWltIG1lY2hhbmlzbXM/IFRoaXMgZnVuY3Rpb24gY291bGQgcGxheSBhIHZpdGFsIHJvbGUgaW4gcHJldmVudGluZyBtZW1vcnkgbGVha3Mgb3IgaW1wcm92aW5nIHN3YXBwaW5nIGVmZmljaWVuY3kuCgpGaW5hbGx5LCB0aGUgS2NvbmZpZyBvcHRpb25zLiBUaGlzIGlzIHRoZSBiZWRyb2NrIG9mIGNvbmZpZ3VyYXRpb24uIFdoYXQgZ3JhbnVsYXIgY29udHJvbCBkbyB3ZSBoYXZlPyBEb2VzIGl0IGFsbG93IGZvciBjb21waWxlLXRpbWUgY2hvaWNlcz8gQ2FuIHdlIGRpc2FibGUgcGFydHMgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gcmVkdWNlIHRoZSBrZXJuZWwgaW1hZ2Ugc2l6ZSBvciByZWR1Y2Ugc3VyZmFjZSBhcmVhPyBJJiMzOTtsbCBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSB0aGUgYWJpbGl0eSB0byBmaW5lLXR1bmUgYXNwZWN0cyBsaWtlIGNvbXByZXNzaW9uIGFsZ29yaXRobXMsIHdyaXRlYmFjayBwb2xpY2llcywgb3IgbWVtb3J5IGFsbG9jYXRpb24gc3RyYXRlZ2llcyB0aHJvdWdoIHRob3NlIG9wdGlvbnMuIEkgc2hvdWxkIGFsc28gaW52ZXN0aWdhdGUgd2hldGhlciBhbnkgZGVwZW5kZW5jaWVzIGV4aXN0IGJldHdlZW4gdGhlIEtjb25maWcgb3B0aW9ucy4gSSBuZWVkIHRvIGJlIHN1cmUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIGNoYW5naW5nIHRoZW0sIGFyZSBjbGVhciBhbmQgZG9jdW1lbnRlZC4KClVsdGltYXRlbHksIEkgd2FudCBhIGNvbXBsZXRlLCB1cC10by1kYXRlLCBwaWN0dXJlIG9mIGhvdyB0aGVzZSB0aHJlZSBlbGVtZW50cyBpbnRlcmFjdC4gSSYjMzk7bGwgZm9jdXMgb24gcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBhbmQgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIHRvIGJ1aWxkIGEgcmVsaWFibGUgbWVudGFsIG1vZGVsIG9mIHpzd2FwJiMzOTtzIGludGVybmFsIG9wZXJhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS96c3dhcC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTIwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMjA6XHQvKiBFbmFibGUvZGlzYWJsZSBtZW1vcnkgcHJlc3N1cmUtYmFzZWQgc2hyaW5rZXIuICovXG4gMTIxOlx0c3RhdGljIGJvb2wgenN3YXBfc2hyaW5rZXJfZW5hYmxlZCA9IElTX0VOQUJMRUQoXG4gMTIyOlx0XHRcdENPTkZJR19aU1dBUF9TSFJJTktFUl9ERUZBVUxUX09OKTtcbiAxMjM6XHRtb2R1bGVfcGFyYW1fbmFtZWQoc2hyaW5rZXJfZW5hYmxlZCwgenN3YXBfc2hyaW5rZXJfZW5hYmxlZCwgYm9vbCwgMDY0NCk7XG4gMTI0Olx0XG4gMTI1Olx0Ym9vbCB6c3dhcF9pc19lbmFibGVkKHZvaWQpXG4gMTI2Olx0e1xuIDEyNzpcdFx0cmV0dXJuIHpzd2FwX2VuYWJsZWQ7XG4gMTI4Olx0fVxuIDEyOTpcdFxuIDEzMDpcdGJvb2wgenN3YXBfbmV2ZXJfZW5hYmxlZCh2b2lkKVxuIDEzMTpcdHtcbiAxMzI6XHRcdHJldHVybiAhc3RhdGljX2JyYW5jaF9tYXliZShDT05GSUdfWlNXQVBfREVGQVVMVF9PTiwgXHUwMDI2enN3YXBfZXZlcl9lbmFibGVkKTtcbiAxMzM6XHR9XG4gMTM0Olx0XG4gMTM1Olx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIDEzNjpcdCogZGF0YSBzdHJ1Y3R1cmVzXG4gMTM3Olx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAxMzg6XHRcbiAxMzk6XHRzdHJ1Y3QgY3J5cHRvX2Fjb21wX2N0eCB7XG4gMTQwOlx0XHRzdHJ1Y3QgY3J5cHRvX2Fjb21wICphY29tcDtcbiAxNDE6XHRcdHN0cnVjdCBhY29tcF9yZXEgKnJlcTtcbiAxNDI6XHRcdHN0cnVjdCBjcnlwdG9fd2FpdCB3YWl0O1xuIDE0MzpcdFx0dTggKmJ1ZmZlcjtcbiAxNDQ6XHRcdHN0cnVjdCBtdXRleCBtdXRleDtcbiAxNDU6XHR9O1xuIDE0NjpcdFxuIDE0NzpcdC8qXG4gMTQ4Olx0ICogVGhlIGxvY2sgb3JkZXJpbmcgaXMgenN3YXBfdHJlZS5sb2NrIC1cdTAwM2UgenN3YXBfcG9vbC5scnVfbG9jay5cbiAxNDk6XHQgKiBUaGUgb25seSBjYXNlIHdoZXJlIGxydV9sb2NrIGlzIG5vdCBhY3F1aXJlZCB3aGlsZSBob2xkaW5nIHRyZWUubG9jayBpc1xuIDE1MDpcdCAqIHdoZW4gYSB6c3dhcF9lbnRyeSBpcyB0YWtlbiBvZmYgdGhlIGxydSBmb3Igd3JpdGViYWNrLCBpbiB0aGF0IGNhc2UgaXRcbiAxNTE6XHQgKiBuZWVkcyB0byBiZSB2ZXJpZmllZCB0aGF0IGl0JiMzOTtzIHN0aWxsIHZhbGlkIGluIHRoZSB0cmVlLlxuIDE1MjpcdCAqL1xuIDE1MzpcdHN0cnVjdCB6c3dhcF9wb29sIHtcbiAxNTQ6XHRcdHN0cnVjdCB6c19wb29sICp6c19wb29sO1xuIDE1NTpcdFx0c3RydWN0IGNyeXB0b19hY29tcF9jdHggX19wZXJjcHUgKmFjb21wX2N0eDtcbiAxNTY6XHRcdHN0cnVjdCBwZXJjcHVfcmVmIHJlZjtcbiAxNTc6XHRcdHN0cnVjdCBsaXN0X2hlYWQgbGlzdDtcbiAxNTg6XHRcdHN0cnVjdCB3b3JrX3N0cnVjdCByZWxlYXNlX3dvcms7XG4gMTU5Olx0XHRzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcxNDcKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGB6c3dhcF9pbnZhbGlkYXRlYCBmdW5jdGlvbiBhbmQgc2VlIHdoYXQgaXQmIzM5O3MgYWxsIGFib3V0LiBBcyBzb21lb25lIGRlZXBseSBmYW1pbGlhciB3aXRoIG1lbW9yeSBtYW5hZ2VtZW50IGluIHRoZSBrZXJuZWwsIEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gcGxheXMgYSBjcnVjaWFsIHJvbGUsIGxpa2VseSBpbnZvbHZpbmcgdGhlIG1hbmFnZW1lbnQgb2Ygc3dhcHBlZCBwYWdlcyB3aXRoaW4gdGhlIHpzd2FwIHN1YnN5c3RlbS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2UsIHdoZW4gaXQmIzM5O3MgY2FsbGVkLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgaG93IGl0IGVuc3VyZXMgZGF0YSBjb25zaXN0ZW5jeSBhbmQgZWZmaWNpZW50IHJlc291cmNlIHV0aWxpemF0aW9uLgoKSSYjMzk7bSBtZW50YWxseSBwcmVwYXJpbmcgdG8gc2NydXRpbml6ZSBpdHMgbG9naWMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGNsdWVzIGFib3V0IHRoZSBjb25kaXRpb25zIHRoYXQgdHJpZ2dlciBhbiBpbnZhbGlkYXRpb24uIElzIGl0IGJhc2VkIG9uIGEgdGltZXIsIG1lbW9yeSBwcmVzc3VyZSwgb3Igc29tZSBvdGhlciBldmVudD8gRG9lcyBpdCBpbnRlcmFjdCB3aXRoIHBhZ2UgdGFibGVzIGRpcmVjdGx5PyBEb2VzIGl0IGludm9sdmUgZnJlZWluZyB0aGUgYXNzb2NpYXRlZCBjb21wcmVzc2VkIGRhdGEgb3IgbWVyZWx5IG1hcmtpbmcgdGhlIHN3YXAgZW50cnkgYXMgaW52YWxpZD8gSSYjMzk7bGwgYWxzbyB0cnkgdG8gdW5kZXJzdGFuZCBpdHMgcmVsYXRpb25zaGlwIHRvIG90aGVyIGZ1bmN0aW9ucywgbGlrZSB0aG9zZSByZXNwb25zaWJsZSBmb3IgcGFnZSByZWNsYWltIGFuZCBzd2FwLW91dC4gSSBuZWVkIHRvIHBpZWNlIHRvZ2V0aGVyIGl0cyByb2xlIGluIHByZXZlbnRpbmcgdGhlIHpzd2FwIGNhY2hlIGZyb20gYmVjb21pbmcgc3RhbGUuIEkgZXhwZWN0IGl0JiMzOTtsbCB1c2Ugc29tZSBhdG9taWMgb3BlcmF0aW9ucyBvciBsb2NraW5nIHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LiBBbnkgY2xldmVyIG9wdGltaXphdGlvbnMgb3IgZWRnZS1jYXNlIGhhbmRsaW5nIHdpbGwgYWxzbyBjYXRjaCBteSBleWUuIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgZGVhbHMgd2l0aCBwb3RlbnRpYWwgSS9PIGVycm9ycyBhbmQgYW55IG1lY2hhbmlzbXMgaXQgdXNlcyB0byBhdm9pZCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy4gU28sIGJyaW5nIG9uIHRoZSBjb2RlISBMZXQmIzM5O3Mgc2VlIGhvdyBpdCYjMzk7cyBpbXBsZW1lbnRlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7enN3YXBfaW52YWxpZGF0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zd2FwZmlsZS5jPTEzMTY9c3RhdGljIHZvaWQgc3dhcF9yYW5nZV9mcmVlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsXG4tLVxubW0vc3dhcGZpbGUuYy0xMzIzLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfZW50cmllczsgaSYjNDM7JiM0MzspXG5tbS9zd2FwZmlsZS5jOjEzMjQ6XHRcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHNpLVx1MDAzZXR5cGUsIG9mZnNldCAmIzQzOyBpKSk7XG5tbS9zd2FwZmlsZS5jLTEzMjUtXG4tLVxubW0venN3YXAuYz0xNDc4PWJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS96c3dhcC5jLTE1NTItXHRcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcdTAwM2MgbnJfcGFnZXM7ICYjNDM7JiM0MztpbmRleClcbm1tL3pzd2FwLmM6MTU1MzpcdFx0XHR6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgJiM0MzsgaW5kZXgpKTtcbm1tL3pzd2FwLmMtMTU1NC1cbi0tXG5tbS96c3dhcC5jPTE1ODA9aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS96c3dhcC5jLTE2MzItXG5tbS96c3dhcC5jOjE2MzM6dm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cClcbm1tL3pzd2FwLmMtMTYzNC17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc3NTYKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIHpzd2FwX2ludmFsaWRhdGUqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gYHpzd2FwX2ludmFsaWRhdGVgIGluIGBtbS96c3dhcC5jYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgaW4gdGhlIGxhcmdlciBwaWN0dXJlIG9mIHpzd2FwJiMzOTtzIGZ1bmN0aW9uYWxpdHksIHNwZWNpZmljYWxseSBob3cgaXQgaGFuZGxlcyByZWNsYWltaW5nIG9yIGludmFsaWRhdGluZyBwYWdlcyB3aXRoaW4gdGhlIHpzd2FwIGNhY2hlLiBJIGtub3cgdGhlIGNvcmUgaWRlYSBpcyBhYm91dCBlbnN1cmluZyBtZW1vcnkgY29uc2lzdGVuY3kgYW5kIHByZXZlbnRpbmcgc3RhbGUgZGF0YSBmcm9tIHJlc2lkaW5nIHdpdGhpbiB0aGUgc3dhcCBjYWNoZS4KCkkmIzM5O20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGF0IHBvaW50cyB3aGVyZSB0aGUgYmFja2luZyBwYWdlIG1pZ2h0IGJlIG1vZGlmaWVkLCBvciB3aGVuIHRoZSBzeXN0ZW0gbmVlZHMgdG8gZnJlZSB1cCBzcGFjZSBpbiB0aGUgenN3YXAgcG9vbC4gSSYjMzk7bSBrZWVuIHRvIHNlZSB0aGUgc3BlY2lmaWMgY29uZGl0aW9ucyBmb3IgaW52YWxpZGF0aW9uIOKAkyBhcmUgd2UgdGFsa2luZyBhYm91dCBwYWdlIGZhdWx0cywgZGlyZWN0IHJlY2xhaW0sIG9yIHNvbWUgb3RoZXIgdHJpZ2dlcj8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBwYWdlIHRhYmxlcywgYW5kIGhvdyBpdCBoYW5kbGVzIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuIEkmIzM5O20gYWxzbyBjdXJpb3VzIGFib3V0IHRoZSBtZWNoYW5pc21zIGl0IGVtcGxveXMsIHN1Y2ggYXMgaW52YWxpZGF0aW5nIHRoZSBwYWdlIGNhY2hlIGVudHJpZXMgYW5kIHBvdGVudGlhbGx5IGluaXRpYXRpbmcgYSB3cml0ZWJhY2sgdG8gdGhlIHN3YXAgZGV2aWNlIGlmIHJlcXVpcmVkLiBGaW5hbGx5LCBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBob3cgaXQgaW50ZXJhY3RzIHdpdGggYW55IG90aGVyIHN1YnN5c3RlbXMgb3IgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgZGVwZW5kIG9uIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgenN3YXAgcGFnZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0venN3YXAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE2MzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTYzMDpcdFx0cmV0dXJuIDA7XG4xNjMxOlx0fVxuMTYzMjpcdFxuMTYzMzpcdHZvaWQgenN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnlfdCBzd3ApXG4xNjM0Olx0e1xuMTYzNTpcdFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XG4xNjM2Olx0XHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cCk7XG4xNjM3Olx0XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xuMTYzODpcdFxuMTYzOTpcdFx0aWYgKHhhX2VtcHR5KHRyZWUpKVxuMTY0MDpcdFx0XHRyZXR1cm47XG4xNjQxOlx0XG4xNjQyOlx0XHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XG4xNjQzOlx0XHRpZiAoZW50cnkpXG4xNjQ0Olx0XHRcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuMTY0NTpcdH1cbjE2NDY6XHRcbjE2NDc6XHRpbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuMTY0ODpcdHtcbjE2NDk6XHRcdHN0cnVjdCB4YXJyYXkgKnRyZWVzLCAqdHJlZTtcbjE2NTA6XHRcdHVuc2lnbmVkIGludCBuciwgaTtcbjE2NTE6XHRcbjE2NTI6XHRcdG5yID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTtcbjE2NTM6XHRcdHRyZWVzID0ga3Z6YWxsb2Nfb2JqcygqdHJlZSwgbnIpO1xuMTY1NDpcdFx0aWYgKCF0cmVlcykge1xuMTY1NTpcdFx0XHRwcl9lcnIoXCYjMzQ7YWxsb2MgZmFpbGVkLCB6c3dhcCBkaXNhYmxlZCBmb3Igc3dhcCB0eXBlICVkXFxuXCYjMzQ7LCB0eXBlKTtcbjE2NTY6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4xNjU3Olx0XHR9XG4xNjU4Olx0XG4xNjU5Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSYjNDM7JiM0MzspXG4xNjYwOlx0XHRcdHhhX2luaXQodHJlZXMgJiM0MzsgaSk7XG4xNjYxOlx0XG4xNjYyOlx0XHRucl96c3dhcF90cmVlc1t0eXBlXSA9IG5yO1xuMTY2MzpcdFx0enN3YXBfdHJlZXNbdHlwZV0gPSB0cmVlcztcbjE2NjQ6XHRcdHJldHVybiAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NTYyCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5JiMzOTtyZSBteSBvd246CgoqKkludmVzdGlnYXRpbmcgS2NvbmZpZyBmb3IgenN3YXAqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgdG8gaXQuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgS2NvbmZpZyBmaWxlcyByZWxhdGVkIHRvIHpzd2FwLiBObyBmbHVmZiwgbGV0JiMzOTtzIGdldCBkb3duIHRvIHRoZSBjb25maWd1cmF0aW9uIGRldGFpbHMuIEkgd2FudCB0byBzZWUgaG93IHRoaXMgZmVhdHVyZSBpcyBjb250cm9sbGVkIGFuZCB3aGF0IG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4gV2hhdCBhcmUgdGhlIGRlcGVuZGVuY2llcz8gQXJlIHRoZXJlIGFueSBoaWRkZW4gc2V0dGluZ3M/IEFyZSB0aGVyZSBhbnkgaW50ZXJlc3RpbmcgdGhpbmdzIEkgY2FuIGRvIHdpdGggaXQ/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB1bmRlcmx5aW5nIGZyYW1ld29yaywgaG93IHRvIGVuYWJsZS9kaXNhYmxlIGl0LCBhbmQgd2hhdCB2YXJpYWJsZXMgYXJlIGF0IHBsYXkgaGVyZS4gVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCBrbm93bGVkZ2UgaXMsIGF0IHRoZSBjb25maWd1cmF0aW9uIGxldmVsLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBaU1dBUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTEyPW1lbnVjb25maWcgU1dBUFxuLS1cbm1tL0tjb25maWctMjEtXG5tbS9LY29uZmlnOjIyOmNvbmZpZyBaU1dBUFxubW0vS2NvbmZpZy0yMy1cdGJvb2wgXCYjMzQ7Q29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1wmIzM0O1xuLS1cbm1tL0tjb25maWctMzQtXG5tbS9LY29uZmlnOjM1OmNvbmZpZyBaU1dBUF9ERUZBVUxUX09OXG5tbS9LY29uZmlnLTM2LVx0Ym9vbCBcJiMzNDtFbmFibGUgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgYnkgZGVmYXVsdFwmIzM0O1xuLS1cbm1tL0tjb25maWctNDQtXG5tbS9LY29uZmlnOjQ1OmNvbmZpZyBaU1dBUF9TSFJJTktFUl9ERUZBVUxUX09OXG5tbS9LY29uZmlnLTQ2LVx0Ym9vbCBcJiMzNDtTaHJpbmsgdGhlIHpzd2FwIHBvb2wgb24gbWVtb3J5IHByZXNzdXJlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz01OT1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTc2LVxubW0vS2NvbmZpZzo3Nzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0RFRkxBVEVcbm1tL0tjb25maWctNzgtXHRib29sIFwmIzM0O0RlZmxhdGVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTgyLVxubW0vS2NvbmZpZzo4Mzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaT1xubW0vS2NvbmZpZy04NC1cdGJvb2wgXCYjMzQ7TFpPXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04OC1cbm1tL0tjb25maWc6ODk6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF84NDJcbm1tL0tjb25maWctOTAtXHRib29sIFwmIzM0Ozg0MlwmIzM0O1xuLS1cbm1tL0tjb25maWctOTQtXG5tbS9LY29uZmlnOjk1OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0XG5tbS9LY29uZmlnLTk2LVx0Ym9vbCBcJiMzNDtMWjRcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTEwMC1cbm1tL0tjb25maWc6MTAxOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0SENcbm1tL0tjb25maWctMTAyLVx0Ym9vbCBcJiMzNDtMWjRIQ1wmIzM0O1xuLS1cbm1tL0tjb25maWctMTA2LVxubW0vS2NvbmZpZzoxMDc6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9aU1REXG5tbS9LY29uZmlnLTEwOC1cdGJvb2wgXCYjMzQ7enN0ZFwmIzM0O1xuLS1cbm1tL0tjb25maWc9MTEyPWVuZGNob2ljZVxubW0vS2NvbmZpZy0xMTMtXG5tbS9LY29uZmlnOjExNDpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXG5tbS9LY29uZmlnLTExNS0gICAgICAgc3RyaW5nXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDkyOTUKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGl2aW5nIGludG8gdGhlIFpTV0FQIENvbmZpZ3VyYXRpb24qKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkgd2l0aCB0aGlzIGBaU1dBUGAgY29uZmlndXJhdGlvbi4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBzdHJ1Y3R1cmUgd2l0aGluIHRoZSBrZXJuZWwmIzM5O3MgYnVpbGQgc3lzdGVtLiBMZXQmIzM5O3Mgc3RhcnQgYnkgbmF2aWdhdGluZyBkaXJlY3RseSB0byBgbW0vS2NvbmZpZ2AuIFRoYXQmIzM5O3Mgd2hlcmUgSSBleHBlY3QgdG8gZmluZCB0aGUgcmVsZXZhbnQgZGVmaW5pdGlvbnMgYW5kIGRlcGVuZGVuY2llcyBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucy4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgdGhlIHNlY3Rpb24gcmVsYXRlZCB0byBgY29uZmlnIFpTV0FQYC4gSSB3YW50IHRvIHNlZSBob3cgaXQmIzM5O3MgZGVmaW5lZCwgd2hpY2ggb3RoZXIgY29uZmlndXJhdGlvbnMgaXQgZGVwZW5kcyBvbiwgYW5kIHdoYXQgdGhlIGRlZmF1bHQgc2V0dGluZ3MgbWlnaHQgYmUuIFRoaXMgd2lsbCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyBpdCB3aXRoaW4gYSBrZXJuZWwgY29uZmlndXJhdGlvbi4gS25vd2luZyB0aGUgYEtjb25maWdgIHN0cnVjdHVyZSBoZWxwcyBtZSBhc3Nlc3MgcG90ZW50aWFsIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgMTU6XHRcdGRlZmF1bHQgeVxuICAxNjpcdFx0aGVscFxuICAxNzpcdFx0ICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGNob29zZSB3aGV0aGVyIHlvdSB3YW50IHRvIGhhdmUgc3VwcG9ydFxuICAxODpcdFx0ICBmb3Igc28gY2FsbGVkIHN3YXAgZGV2aWNlcyBvciBzd2FwIGZpbGVzIGluIHlvdXIga2VybmVsIHRoYXQgYXJlXG4gIDE5Olx0XHQgIHVzZWQgdG8gcHJvdmlkZSBtb3JlIHZpcnR1YWwgbWVtb3J5IHRoYW4gdGhlIGFjdHVhbCBSQU0gcHJlc2VudFxuICAyMDpcdFx0ICBpbiB5b3VyIGNvbXB1dGVyLiAgSWYgdW5zdXJlIHNheSBZLlxuICAyMTpcdFxuICAyMjpcdGNvbmZpZyBaU1dBUFxuICAyMzpcdFx0Ym9vbCBcJiMzNDtDb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzXCYjMzQ7XG4gIDI0Olx0XHRkZXBlbmRzIG9uIFNXQVBcbiAgMjU6XHRcdHNlbGVjdCBDUllQVE9cbiAgMjY6XHRcdHNlbGVjdCBaU01BTExPQ1xuICAyNzpcdFx0aGVscFxuICAyODpcdFx0ICBBIGxpZ2h0d2VpZ2h0IGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMuICBJdCB0YWtlc1xuICAyOTpcdFx0ICBwYWdlcyB0aGF0IGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBzd2FwcGVkIG91dCBhbmQgYXR0ZW1wdHMgdG9cbiAgMzA6XHRcdCAgY29tcHJlc3MgdGhlbSBpbnRvIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIFJBTS1iYXNlZCBtZW1vcnkgcG9vbC5cbiAgMzE6XHRcdCAgVGhpcyBjYW4gcmVzdWx0IGluIGEgc2lnbmlmaWNhbnQgSS9PIHJlZHVjdGlvbiBvbiBzd2FwIGRldmljZSBhbmQsXG4gIDMyOlx0XHQgIGluIHRoZSBjYXNlIHdoZXJlIGRlY29tcHJlc3NpbmcgZnJvbSBSQU0gaXMgZmFzdGVyIHRoYW4gc3dhcCBkZXZpY2VcbiAgMzM6XHRcdCAgcmVhZHMsIGNhbiBhbHNvIGltcHJvdmUgd29ya2xvYWQgcGVyZm9ybWFuY2UuXG4gIDM0Olx0XG4gIDM1Olx0Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cbiAgMzY6XHRcdGJvb2wgXCYjMzQ7RW5hYmxlIHRoZSBjb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzIGJ5IGRlZmF1bHRcJiMzNDtcbiAgMzc6XHRcdGRlcGVuZHMgb24gWlNXQVBcbiAgMzg6XHRcdGhlbHBcbiAgMzk6XHRcdCAgSWYgc2VsZWN0ZWQsIHRoZSBjb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzIHdpbGwgYmUgZW5hYmxlZFxuICA0MDpcdFx0ICBhdCBib290LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBkaXNhYmxlZC5cbiAgNDE6XHRcbiAgNDI6XHRcdCAgVGhlIHNlbGVjdGlvbiBtYWRlIGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdXNpbmcgdGhlIGtlcm5lbFxuICA0MzpcdFx0ICBjb21tYW5kIGxpbmUgJiMzOTt6c3dhcC5lbmFibGVkPSYjMzk7IG9wdGlvbi5cbiAgNDQ6XHRcbiAgNDU6XHRjb25maWcgWlNXQVBfU0hSSU5LRVJfREVGQVVMVF9PTlxuICA0NjpcdFx0Ym9vbCBcJiMzNDtTaHJpbmsgdGhlIHpzd2FwIHBvb2wgb24gbWVtb3J5IHByZXNzdXJlXCYjMzQ7XG4gIDQ3Olx0XHRkZXBlbmRzIG9uIFpTV0FQXG4gIDQ4Olx0XHRkZWZhdWx0IG5cbiAgNDk6XHRcdGhlbHBcbiAgNTA6XHRcdCAgSWYgc2VsZWN0ZWQsIHRoZSB6c3dhcCBzaHJpbmtlciB3aWxsIGJlIGVuYWJsZWQsIGFuZCB0aGUgcGFnZXNcbiAgNTE6XHRcdCAgc3RvcmVkIGluIHRoZSB6c3dhcCBwb29sIHdpbGwgYmVjb21lIGF2YWlsYWJsZSBmb3IgcmVjbGFpbSAoaS5lXG4gIDUyOlx0XHQgIHdyaXR0ZW4gYmFjayB0byB0aGUgYmFja2luZyBzd2FwIGRldmljZSkgb24gbWVtb3J5IHByZXNzdXJlLlxuICA1MzpcdFxuICA1NDpcdFx0ICBUaGlzIG1lYW5zIHRoYXQgenN3YXAgd3JpdGViYWNrIGNvdWxkIGhhcHBlbiBldmVuIGlmIHRoZSBwb29sIGlzXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMDk0CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogNzYxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFpzd2FwIFBhdGNoOiBXb3J0aHkgb2YgRnV6emluZyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIGB6c3dhcF9zdG9yZSgpYCB3aXRoaW4gYG1tL3pzd2FwLmNgLCB3aGljaCBpbW1lZGlhdGVseSBmbGFncyB0aGlzIGFzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIG1ha2luZyBpdCBhbiBpbnRlcmVzdGluZyB0YXJnZXQuIExldCYjMzk7cyBsb29rIGF0IHRoZSBzcGVjaWZpY3MuCgpGaXJzdCwgdGhlcmUmIzM5O3MgYSBndWFyZCBjb25kaXRpb24gYWRkZWQ6IGBpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7YC4gVGhpcyBzZWVtcyB0byBiZSBhIHF1aWNrIGV4aXQgaWYgenN3YXAgd2FzbiYjMzk7dCBlbmFibGVkIGluIHRoZSBmaXJzdCBwbGFjZSwgbGlrZWx5IGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiBJdCBhcHBlYXJzIHRoaXMgY2hlY2sgYXZvaWRzIGRvaW5nIGV4dHJhIHdvcmsgaWYgenN3YXAgd2FzbiYjMzk7dCBjb25maWd1cmVkLCB0aHVzIGF2b2lkaW5nIHBvdGVudGlhbCBsb2NrIGNvbnRlbnRpb24gYW5kIGNoZWNraW5nIHByZXZpb3VzbHkgc3RvcmVkIGludmFsaWRhdGlvbnMuCgpTZWNvbmQsIHRoZSBwYXRjaCByZXBsYWNlcyBhbiBleHBsaWNpdCBsb29wIGl0ZXJhdGluZyBhbmQgZXJhc2luZyBlbnRyaWVzIGZyb20gdGhlIHhhcnJheSB3aXRoIGEgY2FsbCB0byBgenN3YXBfaW52YWxpZGF0ZSgpYC4gVGhpcyBsb29rcyBsaWtlIGEgcmVmYWN0b3JpbmcuIERpZ2dpbmcgaW50byBgenN3YXBfaW52YWxpZGF0ZSgpYCwgaXQgZmlyc3QgY2hlY2tzIGlmIHRoZSB4YXJyYXkgaXMgZW1wdHkgYmVmb3JlIGF0dGVtcHRpbmcgYW4gZXJhc2UuIFRoaXMgaXMgbGlrZWx5IGludGVuZGVkIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYHpzd2FwYCBpcyBkaXNhYmxlZCwgYW5kIHRoaXMgYnJhbmNoIGlzIHNraXBwZWQuCgpHaXZlbiB0aGF0IHRoaXMgYWZmZWN0cyBjb250cm9sIGZsb3cgYW5kIHRoZSByZWZhY3RvcmluZyBvZiBzd2FwIHBhZ2UgaW52YWxpZGF0aW9uIHdpdGhpbiBgenN3YXBfc3RvcmVgLCBpdCYjMzk7cyBkZWZpbml0ZWx5IHNvbWV0aGluZyB0aGF0IHdhcnJhbnRzIGZ1enppbmcuIGB6c3dhcGAgYW5kIGBzd2FwYCBhcmUgY29yZSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IG1lY2hhbmlzbXMgd2l0aGluIHRoZSBrZXJuZWwsIGFuZCB0aGUgYG1tL2Agc3Vic3lzdGVtIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGV2ZW4gaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLgoKTm93LCBvbiB0byB0aGUgY29uZmlndXJhdGlvbi4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZnV6eiB0YXJnZXQgaW5jbHVkZXMgdGhlIHJlbGV2YW50IGNvbmZpZyBvcHRpb25zLiBUaGUga2V5IG9uZSBpcyBgWlNXQVBgLCB3aGljaCBsaXZlcyBpbiBgbW0vS2NvbmZpZ2AsIGFuZCB3aGljaCBkZXBlbmRzIG9uIGBTV0FQYC4gU28sIEkmIzM5O2xsIG5lZWQgdG8gaW5jbHVkZSBib3RoIG9mIHRoZW0uCgpOb3cgZm9yIHN5bWJvbCBhbmFseXNpcy4gYHpzd2FwX3N0b3JlYCBpcyB0aGUgcHJpbWFyeSBmdW5jdGlvbiBiZWluZyBtb2RpZmllZC4gYHpzd2FwX2ludmFsaWRhdGVgIGlzIGNhbGxlZCwgYW5kIGB6c3dhcF9uZXZlcl9lbmFibGVkYCBpcyBhbHNvIGNhbGxlZC4gYHpzd2FwX3N0b3JlYCBpcyB0aGUga2V5IGVudHJ5cG9pbnQgZm9yIGEgenN3YXAgc3RvcmFnZSBvcGVyYXRpb24uIEl0JiMzOTtzIG5vdCBhIGZ1bmN0aW9uIHRoYXQmIzM5O3MgdWJpcXVpdG91cyBhY3Jvc3MgdGhlIGtlcm5lbCwgd2hpY2ggbWFrZXMgaXQgbW9yZSBmb2N1c2VkIGFzIGEgdGFyZ2V0LiBMaWtld2lzZSwgYHpzd2FwX2ludmFsaWRhdGVgIGFuZCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAgc2VlbSBzcGVjaWZpYyB0byB0aGUgYHpzd2FwYCBwYXRoLiBTbyB0aGVzZSBhcmUgZ29vZCBmb2N1cyBzeW1ib2xzLiBJJiMzOTtsbCBtYWtlIHN1cmUgdGhleSBhcmUgYWNjZXNzaWJsZSB3aGVuIHRoZSBmdXp6ZXIgcnVucy4KCkkgc2hvdWxkIGFsc28gZG91YmxlLWNoZWNrIHdoZXRoZXIgYHpzd2FwX3N0b3JlYCBpcyBleHBvcnRlZCwgc3RhdGljLCBvciBpZiBpdHMgZGVmaW5pdGlvbiBpcyBpbiBhIGhlYWRlciwgYnV0IGdpdmVuIGl0JiMzOTtzIGEgYG1tL2AgZnVuY3Rpb24sIGl0JiMzOTtzIGxpa2VseSB2aXNpYmxlIHdpdGhpbiB0aGUga2VybmVsLCBzbyBpdCBwcm9iYWJseSBkb2VzbiYjMzk7dCBuZWVkIHRvIGJlIGV4dGVybmFsbHkgZXhwb3J0ZWQuIEhvd2V2ZXIsIGNoZWNraW5nIGBpbmNsdWRlL2xpbnV4L3pzd2FwLmhgIGlzIGEgZ29vZCBwcmFjdGljZSB0byBlbnN1cmUgZXZlcnl0aGluZyBpcyB2aXNpYmxlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt6c3dhcF9zdG9yZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9wYWdlX2lvLmM9MjA0PWludCBzd2FwX3dyaXRlb3V0KHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3BhZ2VfaW8uYy0yMzctXG5tbS9wYWdlX2lvLmM6MjM4Olx0aWYgKHpzd2FwX3N0b3JlKGZvbGlvKSkge1xubW0vcGFnZV9pby5jLTIzOS1cdFx0Y291bnRfbXRocF9zdGF0KGZvbGlvX29yZGVyKGZvbGlvKSwgTVRIUF9TVEFUX1pTV1BPVVQpO1xuLS1cbm1tL3pzd2FwLmMtNDYtLyogVGhlIG51bWJlciBvZiBwYWdlcyBjdXJyZW50bHkgc3RvcmVkIGluIHpzd2FwICovXG5tbS96c3dhcC5jOjQ3OmF0b21pY19sb25nX3QgenN3YXBfc3RvcmVkX3BhZ2VzID0gQVRPTUlDX0xPTkdfSU5JVCgwKTtcbm1tL3pzd2FwLmMtNDgtLyogVGhlIG51bWJlciBvZiBpbmNvbXByZXNzaWJsZSBwYWdlcyBjdXJyZW50bHkgc3RvcmVkIGluIHpzd2FwICovXG5tbS96c3dhcC5jOjQ5OnN0YXRpYyBhdG9taWNfbG9uZ190IHpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyA9IEFUT01JQ19MT05HX0lOSVQoMCk7XG5tbS96c3dhcC5jLTUwLVxuLS1cbm1tL3pzd2FwLmM9NzU1PXN0YXRpYyB2b2lkIHpzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSlcbi0tXG5tbS96c3dhcC5jLTc2NC1cdGlmIChlbnRyeS1cdTAwM2VsZW5ndGggPT0gUEFHRV9TSVpFKVxubW0venN3YXAuYzo3NjU6XHRcdGF0b21pY19sb25nX2RlYyhcdTAwMjZ6c3dhcF9zdG9yZWRfaW5jb21wcmVzc2libGVfcGFnZXMpO1xubW0venN3YXAuYy03NjYtXHR6c3dhcF9lbnRyeV9jYWNoZV9mcmVlKGVudHJ5KTtcbm1tL3pzd2FwLmM6NzY3Olx0YXRvbWljX2xvbmdfZGVjKFx1MDAyNnpzd2FwX3N0b3JlZF9wYWdlcyk7XG5tbS96c3dhcC5jLTc2OC19XG4tLVxubW0venN3YXAuYz05MTM9c3RhdGljIGJvb2wgenN3YXBfZGVjb21wcmVzcyhzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3pzd2FwLmMtOTcwLSAqIHRvIHRoZSBzd2FwIGRldmljZS4gIFdlIGFyZSBiYXNpY2FsbHkgcmVzdW1pbmcgdGhlIHNhbWUgc3dhcFxubW0venN3YXAuYzo5NzE6ICogd3JpdGViYWNrIHBhdGggdGhhdCB3YXMgaW50ZXJjZXB0ZWQgd2l0aCB0aGUgenN3YXBfc3RvcmUoKVxubW0venN3YXAuYy05NzItICogaW4gdGhlIGZpcnN0IHBsYWNlLiAgQWZ0ZXIgdGhlIGZvbGlvIGhhcyBiZWVuIGRlY29tcHJlc3NlZCBpbnRvXG4tLVxubW0venN3YXAuYz0xMTgxPXN0YXRpYyB1bnNpZ25lZCBsb25nIHpzd2FwX3Nocmlua2VyX2NvdW50KHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsXG4tLVxubW0venN3YXAuYy0xMjE1LVx0XHRucl9iYWNraW5nID0genN3YXBfdG90YWxfcGFnZXMoKTtcbm1tL3pzd2FwLmM6MTIxNjpcdFx0bnJfc3RvcmVkID0gYXRvbWljX2xvbmdfcmVhZChcdTAwMjZ6c3dhcF9zdG9yZWRfcGFnZXMpO1xubW0venN3YXAuYy0xMjE3LVx0fVxuLS1cbm1tL3pzd2FwLmM9MTMwNj1zdGF0aWMgdm9pZCBzaHJpbmtfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqdylcbi0tXG5tbS96c3dhcC5jLTEzOTYtXG5tbS96c3dhcC5jOjEzOTc6c3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb25nIGluZGV4LFxubW0venN3YXAuYy0xMzk4LVx0XHRcdCAgICAgc3RydWN0IG9ial9jZ3JvdXAgKm9iamNnLFxuLS1cbm1tL3pzd2FwLmMtMTQzNi1cdCAqIG5vIGZ1cnRoZXIgcG9zc2liaWxpdHkgb2YgZmFpbHVyZS4gR3JhYiByZWZzIHRvIHRoZSBwb29sIGFuZCBvYmpjZyxcbm1tL3pzd2FwLmM6MTQzNzpcdCAqIGNoYXJnZSB6c3dhcCBtZW1vcnksIGFuZCBpbmNyZW1lbnQgenN3YXBfc3RvcmVkX3BhZ2VzLlxubW0venN3YXAuYy0xNDM4LVx0ICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpXG4tLVxubW0venN3YXAuYy0xNDQ1LVx0fVxubW0venN3YXAuYzoxNDQ2Olx0YXRvbWljX2xvbmdfaW5jKFx1MDAyNnpzd2FwX3N0b3JlZF9wYWdlcyk7XG5tbS96c3dhcC5jLTE0NDctXHRpZiAoZW50cnktXHUwMDNlbGVuZ3RoID09IFBBR0VfU0laRSlcbm1tL3pzd2FwLmM6MTQ0ODpcdFx0YXRvbWljX2xvbmdfaW5jKFx1MDAyNnpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyk7XG5tbS96c3dhcC5jLTE0NDktXG4tLVxubW0venN3YXAuYy0xNDc3LVxubW0venN3YXAuYzoxNDc4OmJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3pzd2FwLmMtMTQ3OS17XG4tLVxubW0venN3YXAuYy0xNTIzLVx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7XG5tbS96c3dhcC5jOjE1MjQ6XHRcdGlmICghenN3YXBfc3RvcmVfcGFnZShmb2xpbywgaW5kZXgsIG9iamNnLCBwb29sKSlcbm1tL3pzd2FwLmMtMTUyNS1cdFx0XHRnb3RvIHB1dF9wb29sO1xuLS1cbm1tL3pzd2FwLmM9MTY5OT1zdGF0aWMgaW50IGRlYnVnZnNfZ2V0X3N0b3JlZF9wYWdlcyh2b2lkICpkYXRhLCB1NjQgKnZhbClcbm1tL3pzd2FwLmMtMTcwMC17XG5tbS96c3dhcC5jOjE3MDE6XHQqdmFsID0gYXRvbWljX2xvbmdfcmVhZChcdTAwMjZ6c3dhcF9zdG9yZWRfcGFnZXMpO1xubW0venN3YXAuYy0xNzAyLVx0cmV0dXJuIDA7XG4tLVxubW0venN3YXAuYz0xNzA2PXN0YXRpYyBpbnQgZGVidWdmc19nZXRfc3RvcmVkX2luY29tcHJlc3NpYmxlX3BhZ2VzKHZvaWQgKmRhdGEsIHU2NCAqdmFsKVxubW0venN3YXAuYy0xNzA3LXtcbm1tL3pzd2FwLmM6MTcwODpcdCp2YWwgPSBhdG9taWNfbG9uZ19yZWFkKFx1MDAyNnpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyk7XG5tbS96c3dhcC5jLTE3MDktXHRyZXR1cm4gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI3MDEKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcyBvbiB0aGlzOgoKKipFeGFtaW5pbmcgWnN3YXAgRGVjbGFyYXRpb25zKioKCkFscmlnaHQsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgenN3YXAuIFRoYXQgbWVhbnMgSSBzaG91bGQgaW1tZWRpYXRlbHkgdHVybiB0byB0aGUgc291cmNlIGNvZGUsIHNwZWNpZmljYWxseSBgaW5jbHVkZS9saW51eC96c3dhcC5oYC4gVGhhdCBoZWFkZXIgZmlsZSBpcyAqdGhlKiBwbGFjZSB0byBmaW5kIHRoZSBlc3NlbnRpYWwgZGF0YSBzdHJ1Y3R1cmVzLCBmdW5jdGlvbiBwcm90b3R5cGVzLCBhbmQgYW55IGtleSBtYWNybyBkZWZpbml0aW9ucyByZWxhdGVkIHRvIHpzd2FwJiMzOTtzIGludGVybmFsIHdvcmtpbmdzLiBCeSBleGFtaW5pbmcgdGhlIGRlY2xhcmF0aW9ucyB0aGVyZSwgSSBjYW4gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhpcyBjb21wcmVzc2lvbiBhbmQgc3dhcHBpbmcgbWVjaGFuaXNtIGlzIGFyY2hpdGVjdGVkLiBJJiMzOTttIGxvb2tpbmcgZm9yIHRoZSBjb3JlIGRhdGEgc3RydWN0dXJlcyB0aGF0IG1hbmFnZSB0aGUgY29tcHJlc3NlZCBwYWdlcywgaG93IHRoZXkmIzM5O3JlIHN0b3JlZCwgd2hhdCBsb2NrcyBhcmUgdXNlZCwgYW5kIHRoZSBpbnRlcmZhY2VzIGludm9sdmVkIGluIHRoZSBjb21wcmVzc2lvbiwgZGVjb21wcmVzc2lvbiwgYW5kIHN3YXBwaW5nIG9wZXJhdGlvbnMuIEl0JiMzOTtzIHRpbWUgdG8gZGlnIGluIGFuZCBnZXQgYSBmaXJtIGdyYXNwIG9mIHRoZSBmb3VuZGF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt6c3dhcF9zdG9yZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvenN3YXAuaD04PXN0cnVjdCBscnV2ZWM7XG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtOS1cbmluY2x1ZGUvbGludXgvenN3YXAuaDoxMDpleHRlcm4gYXRvbWljX2xvbmdfdCB6c3dhcF9zdG9yZWRfcGFnZXM7XG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtMTEtXG4tLVxuaW5jbHVkZS9saW51eC96c3dhcC5oPTI3PXVuc2lnbmVkIGxvbmcgenN3YXBfdG90YWxfcGFnZXModm9pZCk7XG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg6Mjg6Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbmluY2x1ZGUvbGludXgvenN3YXAuaC0yOS1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbi0tXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg9NDA9c3RydWN0IHpzd2FwX2xydXZlY19zdGF0ZSB7fTtcbmluY2x1ZGUvbGludXgvenN3YXAuaC00MS1cbmluY2x1ZGUvbGludXgvenN3YXAuaDo0MjpzdGF0aWMgaW5saW5lIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbmluY2x1ZGUvbGludXgvenN3YXAuaC00My17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMTUyCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyBgc3dhcF93cml0ZW91dGAqKgoKT2theSwgdGltZSB0byBkaXZlIGluLiBJIG5lZWQgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0IGBzd2FwX3dyaXRlb3V0YCwgYW5kIGJhc2VkIG9uIG15IG1lbW9yeSwgdGhhdCYjMzk7cyBwcm9iYWJseSByZXNpZGluZyBpbiBgbW0vcGFnZV9pby5jYC4gTGV0JiMzOTtzIGdldCBjcmFja2luZyBhbmQgY29uZmlybSB0aGF0IG15IGFzc3VtcHRpb25zIGFib3V0IHRoZSBsb2NhdGlvbiBhcmUgYWNjdXJhdGUuIFRoaXMgaXMgd2hlcmUgSSYjMzk7bGwgZmluZCB0aGUgY29yZSBsb2dpYyBmb3Igd3JpdGluZyBvdXQgcGFnZXMgdG8gc3dhcCBzcGFjZSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgaXQgZnVuY3Rpb25zLCBlc3BlY2lhbGx5IGluIHJlbGF0aW9uIHRvIHRoZSBvdmVyYWxsIHBhZ2UgcmVjbGFpbSBwcm9jZXNzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3BhZ2VfaW8uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjMwOlx0XG4gMjMxOlx0XHQvKlxuIDIzMjpcdFx0ICogQ2xlYXIgYml0cyB0aGlzIGZvbGlvIG9jY3VwaWVzIGluIHRoZSB6ZXJvbWFwIHRvIHByZXZlbnQgemVybyBkYXRhXG4gMjMzOlx0XHQgKiBiZWluZyByZWFkIGluIGZyb20gYW55IHByZXZpb3VzIHplcm8gd3JpdGVzIHRoYXQgb2NjdXBpZWQgdGhlIHNhbWVcbiAyMzQ6XHRcdCAqIHN3YXAgZW50cmllcy5cbiAyMzU6XHRcdCAqL1xuIDIzNjpcdFx0c3dhcF96ZXJvbWFwX2ZvbGlvX2NsZWFyKGZvbGlvKTtcbiAyMzc6XHRcbiAyMzg6XHRcdGlmICh6c3dhcF9zdG9yZShmb2xpbykpIHtcbiAyMzk6XHRcdFx0Y291bnRfbXRocF9zdGF0KGZvbGlvX29yZGVyKGZvbGlvKSwgTVRIUF9TVEFUX1pTV1BPVVQpO1xuIDI0MDpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4gMjQxOlx0XHR9XG4gMjQyOlx0XG4gMjQzOlx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gMjQ0Olx0XHRpZiAoIW1lbV9jZ3JvdXBfenN3YXBfd3JpdGViYWNrX2VuYWJsZWQoZm9saW9fbWVtY2coZm9saW8pKSkge1xuIDI0NTpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiAyNDY6XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4gMjQ3Olx0XHRcdHJldHVybiBBT1BfV1JJVEVQQUdFX0FDVElWQVRFO1xuIDI0ODpcdFx0fVxuIDI0OTpcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNjM4CgkJCQkJCQlvdXRwdXQ6IDEyNgoJCQkJCQkJdGhvdWdodHM6IDMxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGZvY3VzLiBJdCBsb29rcyBsaWtlIHRoZSBjb3JlIG1vZGlmaWNhdGlvbiBjZW50ZXJzIGFyb3VuZCBgenN3YXBfc3RvcmVgLCB0aGUgZnVuY3Rpb24gYmVpbmcgZGlyZWN0bHkgYWx0ZXJlZC4gYHpzd2FwX2ludmFsaWRhdGVgIGlzIHRoZSBoZWxwZXIgdGhleSYjMzk7cmUgdXNpbmcgdG8gcmVwbGFjZSB0aGUgb3Blbi1jb2RlZCB0cmVlIGVyYXN1cmUgbG9naWMsIHdoaWNoIGlzIGdvb2QgZm9yIG1haW50YWluYWJpbGl0eS4gQW5kIGp1c3QgdG8gYmUgc3VyZSwgYHN3YXBfd3JpdGVvdXRgIGlzIHRoZSBjYWxsZXIgb2YgYHpzd2FwX3N0b3JlYC4gU29saWQuCgpOZXh0LCBJIGhhdmUgdG8gZW5zdXJlIHRoZSBwcm9wZXIgY29uZmlndXJhdGlvbnMgYXJlIGluIHBsYWNlIGZvciB0aGUgZnV6emVyIHRvIGVuZ2FnZSB3aXRoIHRoaXMgY2hhbmdlLiBJdCBsb29rcyBsaWtlIGBaU1dBUGAgaXMgdGhlIG1haW4gY29uZmlndXJhdGlvbiBpdGVtLCB3aXRoIGBTV0FQYCBhcyBpdHMgZGVwZW5kZW5jeS4gVGhhdCBhbGlnbnMgd2l0aCBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzeXN0ZW0uCgpOb3csIGxldCYjMzk7cyByZXZpZXcgdGhlIHBhcmFtZXRlcnMgZm9yIGBzZXQtcmVzdWx0c2AuIFRoZSBgV29ydGhGdXp6aW5nYCBmbGFnIG5lZWRzIHRvIGJlIHNldCB0byBgdHJ1ZWAsIGFuZCBvZiBjb3Vyc2UgaXQgaXMuIFRoZSBgUmVhc29uaW5nYCBzaG91bGQgc3VjY2luY3RseSBvdXRsaW5lIHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBUaGUgcGF0Y2ggc2VlbXMgdG8gbW9kaWZ5IGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBgenN3YXBfc3RvcmVgLCBhZGRpbmcgYSBzaG9ydC1jaXJjdWl0IGNoZWNrIHRocm91Z2ggYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgYW5kIHRoZW4gcmVmYWN0b3JpbmcgdGhlIHN3YXAgcGFnZSBpbnZhbGlkYXRpb24gdG8gdXNlIGB6c3dhcF9pbnZhbGlkYXRlKClgLiBUaGUgY2hhbmdlcyBhcmUgYWxzbyByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHdpdGggc3dhcC96c3dhcCBjb25maWd1cmVkIHdoaWNoIGlzIGEgY3J1Y2lhbCBwb2ludCBmb3IgZnV6emluZy4gVGhlIGBGb2N1c1N5bWJvbHNgIGFyZSBjbGVhcmx5IGRlZmluZWQgYXMgYHpzd2FwX3N0b3JlYCBhbmQgYHpzd2FwX2ludmFsaWRhdGVgLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBhbmQgc3BlY2lmaWMuIExhc3RseSwgYEVuYWJsZUNvbmZpZ3NgIG5lZWRzIHRvIGxpc3QgYFpTV0FQYCBhbmQgYFNXQVBgICh3aXRob3V0IHRoZSBgQ09ORklHX2AgcHJlZml4LCBvZiBjb3Vyc2UpLgoKT2theSwgbGV0JiMzOTtzIHBlcmZvcm0gYSBxdWljayBzYW5pdHkgY2hlY2suIGBXb3J0aEZ1enppbmc6IHRydWVgLCBjaGVjay4gYEZvY3VzU3ltYm9sczogenN3YXBfc3RvcmUsIHpzd2FwX2ludmFsaWRhdGVgIC0tIG5vbi11YmlxdWl0b3VzLCBkaXJlY3RseSByZWxldmFudCBzeW1ib2xzLCBjaGVjay4gYEVuYWJsZUNvbmZpZ3M6IFpTV0FQLCBTV0FQYCwgeWVwLCB0aGF04oCZcyByaWdodCwgY2hlY2suIFRoZSBgUmVhc29uaW5nYCBpcyBjb25jaXNlIGFuZCBlYXN5IHRvIHVuZGVyc3RhbmQsIGNoZWNrLgoKRXZlcnl0aGluZyBjaGVja3Mgb3V0LiBJJiMzOTttIHNhdGlzZmllZCB0aGF0IHRoaXMgcGF0Y2ggd2FycmFudHMgZnV6emluZy4gVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtaU1dBUCYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7enN3YXBfc3RvcmUmIzM0OywKICAgICYjMzQ7enN3YXBfaW52YWxpZGF0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL3pzd2FwLmMgYnkgYWRkaW5nIGFuIGVhcmx5LWV4aXQgY2hlY2sgaW4genN3YXBfc3RvcmUoKSB3aGVuIHpzd2FwIGhhcyBuZXZlciBiZWVuIGVuYWJsZWQsIGFuZCByZWZhY3RvcmluZyB0aGUgZXJyb3IvZGlzYWJsZWQgZmFsbGJhY2sgbG9vcCB0byB1c2UgenN3YXBfaW52YWxpZGF0ZSgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHN3YXBvdXQvenN3YXAgbG9naWMgYW5kIGFyZSBkaXJlY3RseSByZWFjaGFibGUgYW5kIHRlc3RhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7WlNXQVAmIzM0OywKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3pzd2FwX3N0b3JlJiMzNDssCiAgICAmIzM0O3pzd2FwX2ludmFsaWRhdGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS96c3dhcC5jIGJ5IGFkZGluZyBhbiBlYXJseS1leGl0IGNoZWNrIGluIHpzd2FwX3N0b3JlKCkgd2hlbiB6c3dhcCBoYXMgbmV2ZXIgYmVlbiBlbmFibGVkLCBhbmQgcmVmYWN0b3JpbmcgdGhlIGVycm9yL2Rpc2FibGVkIGZhbGxiYWNrIGxvb3AgdG8gdXNlIHpzd2FwX2ludmFsaWRhdGUoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBzd2Fwb3V0L3pzd2FwIGxvZ2ljIGFuZCBhcmUgZGlyZWN0bHkgcmVhY2hhYmxlIGFuZCB0ZXN0YWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGFuIGVhcmx5LXJldHVybiBjaGVjayB1c2luZyBgenN3YXBfbmV2ZXJfZW5hYmxlZCgpYCBpbiBgenN3YXBfc3RvcmUoKWAgYW5kIHJlZmFjdG9ycyBvcGVuLWNvZGVkIHpzd2FwIHRyZWUgaW52YWxpZGF0aW9uIGxvZ2ljIG9uIHN0b3JlIGZhaWx1cmUgdG8gcmV1c2UgYHpzd2FwX2ludmFsaWRhdGUoKWAuIE5vIG1lbW9yeSBhbGxvY2F0aW9ucywgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIG9wZXJhdGlvbnMgYXJlIGludHJvZHVjZWQgb3IgYWx0ZXJlZC4gTm8gY29uZGl0aW9uYWwgbG9naWMgcmVsaWVzIG9uIHVuaW5pdGlhbGl6ZWQgZGF0YS4gQW55IG1lbW9yeSBzYWZldHkgY29uY2VybnMgaW4gdGhpcyBzd2FwIHBhdGggKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBvciBsb2NraW5nIGVycm9ycykgYXJlIGNvdmVyZWQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dlcnMuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBrZXJuZWwtdG8tdXNlciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2N2NlYTY5ZWM2NGNjOWNlNWNiZjQ2OTQzMDc4NmZiMzQ0ZmJkNWJlCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBTZXAgOSAxMzozNDoxNyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jCmluZGV4IDVkMGQ4YmQ3MjE5M2EuLmZjNmM1ZTBkYjVlNDMgMTAwNjQ0Ci0tLSBhL21tL3pzd2FwLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0venN3YXAuYwpAQCAtMTQ4OCw2ICYjNDM7MTQ4OCw5IEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKIAlWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7CiAJVk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpOwogCiYjNDM7CWlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiAJaWYgKCF6c3dhcF9lbmFibGVkKQogCQlnb3RvIGNoZWNrX29sZDsKIApAQCAtMTU0NSwxNSAmIzQzOzE1NDgsMTAgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCWlmICghcmV0KSB7CiAJCXVuc2lnbmVkIHR5cGUgPSBzd3BfdHlwZShzd3ApOwogCQlwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTsKLQkJc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTsKLQkJc3RydWN0IHhhcnJheSAqdHJlZTsKLQotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggJmx0OyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7Ci0JCQl0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgJiM0MzsgaW5kZXgpKTsKLQkJCWVudHJ5ID0geGFfZXJhc2UodHJlZSwgb2Zmc2V0ICYjNDM7IGluZGV4KTsKLQkJCWlmIChlbnRyeSkKLQkJCQl6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTsKLQkJfQomIzQzOwomIzQzOwkJZm9yIChpbmRleCA9IDA7IGluZGV4ICZsdDsgbnJfcGFnZXM7ICYjNDM7JiM0MztpbmRleCkKJiM0MzsJCQl6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgJiM0MzsgaW5kZXgpKTsKJiM0MzsKIAl9CiAKIAlyZXR1cm4gcmV0Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjI4MAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDYyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuCgoqKkFuYWx5emluZyBgbW0venN3YXAuY2AgLSBUaW1lIHRvIERpdmUgSW4qKgoKQWxyaWdodCwgdGltZSB0byByb2xsIHVwIG15IHNsZWV2ZXMgYW5kIGRpc3NlY3QgdGhpcyBwYXRjaC4gTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIHN0YXJ0IGJ5IHplcm9pbmcgaW4gb24gYG1tL3pzd2FwLmNgLCBwYXJ0aWN1bGFybHkgYXJvdW5kIGxpbmUgMTQ4OC4gSSYjMzk7bSBnb2luZyB0byBsZXZlcmFnZSB0aGUgdG9vbHMgYXQgbXkgZGlzcG9zYWwg4oCTIGByZWFkLWZpbGVgIGlzIGFsd2F5cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQsIGJ1dCBJIG1pZ2h0IGp1c3QgZ28gc3RyYWlnaHQgZm9yIGBncmVwcGVyYCBpZiBJIHN1c3BlY3QgYSBzcGVjaWZpYyBmdW5jdGlvbiBvciB2YXJpYWJsZSBpcyB0aGUga2V5LiBOZWVkIHRvIGdldCBhIGZlZWwgZm9yIHRoZSBjb250ZXh0IHN1cnJvdW5kaW5nIHRoYXQgbGluZSDigJMgc2VlIHRoZSBmdW5jdGlvbiBjYWxscywgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCB0aGUgd2hvbGUgc2hlYmFuZy4gR290dGEgdW5kZXJzdGFuZCBob3cgdGhpcyBwYXRjaCBpbnRlcmFjdHMgd2l0aCB0aGUgZXhpc3RpbmcgenN3YXAgaW1wbGVtZW50YXRpb24uIExldCYjMzk7cyBzZWUgd2hhdCB3ZSYjMzk7cmUgd29ya2luZyB3aXRoIGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0venN3YXAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE0NzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE0NzU6XHRcdHJldHVybiBmYWxzZTtcbjE0NzY6XHR9XG4xNDc3Olx0XG4xNDc4Olx0Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuMTQ3OTpcdHtcbjE0ODA6XHRcdGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4xNDgxOlx0XHRzd3BfZW50cnlfdCBzd3AgPSBmb2xpby1cdTAwM2Vzd2FwO1xuMTQ4MjpcdFx0c3RydWN0IG9ial9jZ3JvdXAgKm9iamNnID0gTlVMTDtcbjE0ODM6XHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7XG4xNDg0Olx0XHRzdHJ1Y3QgenN3YXBfcG9vbCAqcG9vbDtcbjE0ODU6XHRcdGJvb2wgcmV0ID0gZmFsc2U7XG4xNDg2Olx0XHRsb25nIGluZGV4O1xuMTQ4NzpcdFxuMTQ4ODpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xuMTQ4OTpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpO1xuMTQ5MDpcdFxuMTQ5MTpcdFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbjE0OTI6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTQ5MzpcdFxuMTQ5NDpcdFx0aWYgKCF6c3dhcF9lbmFibGVkKVxuMTQ5NTpcdFx0XHRnb3RvIGNoZWNrX29sZDtcbjE0OTY6XHRcbjE0OTc6XHRcdG9iamNnID0gZ2V0X29ial9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4xNDk4Olx0XHRpZiAob2JqY2cgXHUwMDI2XHUwMDI2ICFvYmpfY2dyb3VwX21heV96c3dhcChvYmpjZykpIHtcbjE0OTk6XHRcdFx0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX29iamNnKG9iamNnKTtcbjE1MDA6XHRcdFx0aWYgKHNocmlua19tZW1jZyhtZW1jZykpIHtcbjE1MDE6XHRcdFx0XHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4xNTAyOlx0XHRcdFx0Z290byBwdXRfb2JqY2c7XG4xNTAzOlx0XHRcdH1cbjE1MDQ6XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUwNTpcdFx0fVxuMTUwNjpcdFxuMTUwNzpcdFx0aWYgKHpzd2FwX2NoZWNrX2xpbWl0cygpKVxuMTUwODpcdFx0XHRnb3RvIHB1dF9vYmpjZztcbjE1MDk6XHRcbjE1MTA6XHRcdHBvb2wgPSB6c3dhcF9wb29sX2N1cnJlbnRfZ2V0KCk7XG4xNTExOlx0XHRpZiAoIXBvb2wpXG4xNTEyOlx0XHRcdGdvdG8gcHV0X29iamNnO1xuMTUxMzpcdFxuMTUxNDpcdFx0aWYgKG9iamNnKSB7XG4xNTE1Olx0XHRcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9vYmpjZyhvYmpjZyk7XG4xNTE2Olx0XHRcdGlmIChtZW1jZ19saXN0X2xydV9hbGxvYyhtZW1jZywgXHUwMDI2enN3YXBfbGlzdF9scnUsIEdGUF9LRVJORUwpKSB7XG4xNTE3Olx0XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUxODpcdFx0XHRcdGdvdG8gcHV0X3Bvb2w7XG4xNTE5Olx0XHRcdH1cbjE1MjA6XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUyMTpcdFx0fVxuMTUyMjpcdFxuMTUyMzpcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7XG4xNTI0Olx0XHRcdGlmICghenN3YXBfc3RvcmVfcGFnZShmb2xpbywgaW5kZXgsIG9iamNnLCBwb29sKSlcbjE1MjU6XHRcdFx0XHRnb3RvIHB1dF9wb29sO1xuMTUyNjpcdFx0fVxuMTUyNzpcdFxuMTUyODpcdFx0aWYgKG9iamNnKVxuMTUyOTpcdFx0XHRjb3VudF9vYmpjZ19ldmVudHMob2JqY2csIFpTV1BPVVQsIG5yX3BhZ2VzKTtcbjE1MzA6XHRcbjE1MzE6XHRcdGNvdW50X3ZtX2V2ZW50cyhaU1dQT1VULCBucl9wYWdlcyk7XG4xNTMyOlx0XG4xNTMzOlx0XHRyZXQgPSB0cnVlO1xuMTUzNDpcdFxuMTUzNTpcdHB1dF9wb29sOlxuMTUzNjpcdFx0enN3YXBfcG9vbF9wdXQocG9vbCk7XG4xNTM3Olx0cHV0X29iamNnOlxuMTUzODpcdFx0b2JqX2Nncm91cF9wdXQob2JqY2cpO1xuMTUzOTpcdFx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsKVxuMTU0MDpcdFx0XHRxdWV1ZV93b3JrKHNocmlua193cSwgXHUwMDI2enN3YXBfc2hyaW5rX3dvcmspO1xuMTU0MTpcdGNoZWNrX29sZDpcbjE1NDI6XHRcdC8qXG4xNTQzOlx0XHQgKiBJZiB0aGUgenN3YXAgc3RvcmUgZmFpbHMgb3IgenN3YXAgaXMgZGlzYWJsZWQsIHdlIG11c3QgaW52YWxpZGF0ZVxuMTU0NDpcdFx0ICogdGhlIHBvc3NpYmx5IHN0YWxlIGVudHJpZXMgd2hpY2ggd2VyZSBwcmV2aW91c2x5IHN0b3JlZCBhdCB0aGVcbjE1NDU6XHRcdCAqIG9mZnNldHMgY29ycmVzcG9uZGluZyB0byBlYWNoIHBhZ2Ugb2YgdGhlIGZvbGlvLiBPdGhlcndpc2UsXG4xNTQ2Olx0XHQgKiB3cml0ZWJhY2sgY291bGQgb3ZlcndyaXRlIHRoZSBuZXcgZGF0YSBpbiB0aGUgc3dhcGZpbGUuXG4xNTQ3Olx0XHQgKi9cbjE1NDg6XHRcdGlmICghcmV0KSB7XG4xNTQ5Olx0XHRcdHVuc2lnbmVkIHR5cGUgPSBzd3BfdHlwZShzd3ApO1xuMTU1MDpcdFx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbjE1NTE6XHRcbjE1NTI6XHRcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KVxuMTU1MzpcdFx0XHRcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCAmIzQzOyBpbmRleCkpO1xuMTU1NDpcdFxuMTU1NTpcdFx0fVxuMTU1NjpcdFxuMTU1NzpcdFx0cmV0dXJuIHJldDtcbjE1NTg6XHR9XG4xNTU5Olx0XG4xNTYwOlx0LyoqXG4xNTYxOlx0ICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbjE1NjI6XHQgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbjE1NjM6XHQgKlxuMTU2NDpcdCAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZVxuMTU2NTpcdCAqIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6XG4xNTY2Olx0ICpcbjE1Njc6XHQgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgY291bGQgbm90IGJlIGxvYWRlZFxuMTU2ODpcdCAqICBpbnRvIHRoZSBwYWdlIGR1ZSB0byBhIGRlY29tcHJlc3Npb24gZmFpbHVyZS4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXRcbjE1Njk6XHQgKiAgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKClcbjE1NzA6XHQgKiAgd2lsbCBTSUdCVVMpLlxuMTU3MTpcdCAqXG4xNTcyOlx0ICogIC1FSU5WQUw6IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCwgYnV0IHRoZSBwYWdlIGJlbG9uZ3NcbjE1NzM6XHQgKiAgdG8gYSBsYXJnZSBmb2xpbywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB6c3dhcC4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLFxuMTU3NDpcdCAqICBidXQgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA2NAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBwcmVzZW50ZWQgYXMgbXkgb3duIG1lbnRhbCBwcm9jZXNzLCBnaXZlbiBteSBleHBlcnRpc2U6CgoqKkRpdmluZyBEZWVwZXIgaW50byB6c3dhcCBDb25maWd1cmF0aW9uKioKCkFscmlnaHQsIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IGBtbS96c3dhcC5jYCBhZ2Fpbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZmluZXIgcG9pbnRzLCBhbmQgSSYjMzk7bSBzcGVjaWZpY2FsbHkgZHJhd24gdG8gdGhvc2UgdHdvIHNldHRpbmdzLCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAgYW5kIGB6c3dhcF9pbnZhbGlkYXRlYC4gVGhlc2UgYXJlIGNydWNpYWwgdG8gaG93IHpzd2FwIGJlaGF2ZXMsIGFuZCB1bmRlcnN0YW5kaW5nIHRoZWlyIGludGVycGxheSBpcyBrZXkgdG8gb3B0aW1pemluZyB6c3dhcCBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHkuIEkgYWxyZWFkeSB1bmRlcnN0YW5kIHRoZSBmdW5kYW1lbnRhbCByb2xlIG9mIHpzd2FwLCB0aGUgYmFzaWNzIG9mIGNvbXByZXNzZWQgc3dhcCwgYW5kIGhvdyBpdCByZWR1Y2VzIEkvTyBsYXRlbmN5LiBCdXQgZ2V0dGluZyBpbnRvIHRoZSB3ZWVkcyBvZiB0aGVzZSBmbGFncyBoZWxwcyB0dW5lIHRoZSBzeXN0ZW0gd2hlbiBpdHMgYmVoYXZpb3IgZG9lc24mIzM5O3QgYWxpZ24gd2l0aCBteSBleHBlY3RhdGlvbnMuIEkgY2FuIHNlZSBob3csIGZvciBleGFtcGxlLCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAgd291bGQgYmUgdXNlZCBpbiBlbnZpcm9ubWVudHMgd2hlcmUgc3dhcCBpcyB1bmRlc2lyYWJsZSwgcGVyaGFwcyBiZWNhdXNlIG9mIGNvbmNlcm5zIGFyb3VuZCBzZWN1cml0eSBpbXBsaWNhdGlvbnMgZm9yIGVuY3J5cHRlZCBtZW1vcnkuIEFuZCBgenN3YXBfaW52YWxpZGF0ZWAsIEkmIzM5O2xsIGJldCwgaXQmIzM5O3MgYWJvdXQgZm9yY2luZyBjYWNoZSByZWZyZXNoZXMsIHBlcmhhcHMgYWZ0ZXIgd3JpdGVzLiBUaW1lIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBkaXNzZWN0IHRoZSBleGFjdCBjb2RlIHRoYXQgdXNlcyB0aGVzZSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7enN3YXBfbmV2ZXJfZW5hYmxlZHx6c3dhcF9pbnZhbGlkYXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0venN3YXAuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS96c3dhcC5jPTEyNT1ib29sIHpzd2FwX2lzX2VuYWJsZWQodm9pZClcbi0tXG5tbS96c3dhcC5jLTEyOS1cbm1tL3pzd2FwLmM6MTMwOmJvb2wgenN3YXBfbmV2ZXJfZW5hYmxlZCh2b2lkKVxubW0venN3YXAuYy0xMzEte1xuLS1cbm1tL3pzd2FwLmM9MTQ3OD1ib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0venN3YXAuYy0xNDkwLVxubW0venN3YXAuYzoxNDkxOlx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbm1tL3pzd2FwLmMtMTQ5Mi1cdFx0cmV0dXJuIGZhbHNlO1xuLS1cbm1tL3pzd2FwLmMtMTU1Mi1cdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KVxubW0venN3YXAuYzoxNTUzOlx0XHRcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCAmIzQzOyBpbmRleCkpO1xubW0venN3YXAuYy0xNTU0LVxuLS1cbm1tL3pzd2FwLmM9MTU4MD1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3pzd2FwLmMtMTU4OS1cbm1tL3pzd2FwLmM6MTU5MDpcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXG5tbS96c3dhcC5jLTE1OTEtXHRcdHJldHVybiAtRU5PRU5UO1xuLS1cbm1tL3pzd2FwLmMtMTYzMi1cbm1tL3pzd2FwLmM6MTYzMzp2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKVxubW0venN3YXAuYy0xNjM0LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDc0NQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHpzd2FwIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHRpbWUgdG8gZGlnIGludG8gdGhlIGB6c3dhcGAgY29kZSBhIGJpdCBkZWVwZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBpdCYjMzk7cyBiZWluZyBtYW5hZ2VkIGFuZCBob3cgaXQmIzM5O3MgaW52YWxpZGF0ZWQuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIGRvdWJsZS1jaGVjayB0aGUgYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgZnVuY3Rpb24uIEkmIzM5O3ZlIGdvdCB0byBtYWtlIHN1cmUgaXQmIzM5O3MgZG9pbmcgd2hhdCBJIGV4cGVjdCBpdCB0byBkbywgYW5kIHRoYXQgdGhlcmUgYXJlbiYjMzk7dCBhbnkgcG90ZW50aWFsIGVkZ2UgY2FzZXMgdGhhdCBJIG1pZ2h0IGhhdmUgbWlzc2VkIGluIG15IHByZXZpb3VzIHJldmlldy4gVGhlbiwgSSBuZWVkIHRvIGxvb2sgY2FyZWZ1bGx5IGF0IHRoZSBgenN3YXBfaW52YWxpZGF0ZSgpYCBmdW5jdGlvbi4gSW52YWxpZGF0aW9uIGlzIGEgY3JpdGljYWwgcGFydCBvZiBhbnkgY2FjaGU7IG1ha2luZyBzdXJlIGl0IGlzIHdvcmtpbmcgdGhlIHdheSB0aGF0IEkgZXhwZWN0IGl0IHRvIGVuc3VyZXMgdGhhdCB0aGVyZSBhcmUgbm90IGFueSBkYXRhIGludGVncml0eSBpc3N1ZXMuIEkgd2FudCB0byB0cmFjZSB0aGUgbG9naWMgb2YgdGhvc2UgdHdvIGZ1bmN0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS96c3dhcC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTI1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMjU6XHRib29sIHpzd2FwX2lzX2VuYWJsZWQodm9pZClcbiAxMjY6XHR7XG4gMTI3Olx0XHRyZXR1cm4genN3YXBfZW5hYmxlZDtcbiAxMjg6XHR9XG4gMTI5Olx0XG4gMTMwOlx0Ym9vbCB6c3dhcF9uZXZlcl9lbmFibGVkKHZvaWQpXG4gMTMxOlx0e1xuIDEzMjpcdFx0cmV0dXJuICFzdGF0aWNfYnJhbmNoX21heWJlKENPTkZJR19aU1dBUF9ERUZBVUxUX09OLCBcdTAwMjZ6c3dhcF9ldmVyX2VuYWJsZWQpO1xuIDEzMzpcdH1cbiAxMzQ6XHRcbiAxMzU6XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gMTM2Olx0KiBkYXRhIHN0cnVjdHVyZXNcbiAxMzc6XHQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuIDEzODpcdFxuIDEzOTpcdHN0cnVjdCBjcnlwdG9fYWNvbXBfY3R4IHtcbiAxNDA6XHRcdHN0cnVjdCBjcnlwdG9fYWNvbXAgKmFjb21wO1xuIDE0MTpcdFx0c3RydWN0IGFjb21wX3JlcSAqcmVxO1xuIDE0MjpcdFx0c3RydWN0IGNyeXB0b193YWl0IHdhaXQ7XG4gMTQzOlx0XHR1OCAqYnVmZmVyO1xuIDE0NDpcdFx0c3RydWN0IG11dGV4IG11dGV4O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MjI5CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBgenN3YXBfaW52YWxpZGF0ZSgpYCoqCgpPa2F5LCB0aW1lIHRvIHplcm8gaW4gb24gYHpzd2FwX2ludmFsaWRhdGUoKWAuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24gYXJvdW5kIGxpbmUgMTYzMy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVudGFsIG1hcCBvZiBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgb3ZlcmFsbCBac3dhcCBhcmNoaXRlY3R1cmUuIE15IGd1dCBmZWVsaW5nIGlzIHRoYXQgc29tZXRoaW5nIG1pZ2h0IGJlIGFtaXNzIGFyb3VuZCB0aGVyZSwgZWl0aGVyIGluIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBwYWdlIHRhYmxlIG9yIHBlcmhhcHMgdGhlIGxvY2tpbmcgc2VtYW50aWNzIHdpdGhpbiB0aGUgc3dhcHBpbmcgcHJvY2Vzcy4gSXQmIzM5O3MgYSBjb21tb24gYXJlYSBmb3Igc3VidGxlIGJ1Z3MgdG8gY3JlZXAgaW4sIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdGhlIGNvbXBsZXhpdGllcyBvZiBtZW1vcnkgcmVjbGFpbSBhbmQgcGFnZSBpbnZhbGlkYXRpb24uIEkgd2FudCB0byBxdWlja2x5IHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBhbmQgdGhlIHNwZWNpZmljIGNvbmRpdGlvbmFsIGxvZ2ljIHN1cnJvdW5kaW5nIHRoaXMgbGluZS4gSSYjMzk7bSBnb2luZyB0byBsb29rIGZvciBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyB3aXRoIG1lbW9yeSBhY2Nlc3MgZHVyaW5nIGludmFsaWRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS96c3dhcC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTYzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjMwOlx0XHRyZXR1cm4gMDtcbjE2MzE6XHR9XG4xNjMyOlx0XG4xNjMzOlx0dm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cClcbjE2MzQ6XHR7XG4xNjM1Olx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbjE2MzY6XHRcdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcbjE2Mzc6XHRcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4xNjM4Olx0XG4xNjM5Olx0XHRpZiAoeGFfZW1wdHkodHJlZSkpXG4xNjQwOlx0XHRcdHJldHVybjtcbjE2NDE6XHRcbjE2NDI6XHRcdGVudHJ5ID0geGFfZXJhc2UodHJlZSwgb2Zmc2V0KTtcbjE2NDM6XHRcdGlmIChlbnRyeSlcbjE2NDQ6XHRcdFx0enN3YXBfZW50cnlfZnJlZShlbnRyeSk7XG4xNjQ1Olx0fVxuMTY0NjpcdFxuMTY0NzpcdGludCB6c3dhcF9zd2Fwb24oaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4xNjQ4Olx0e1xuMTY0OTpcdFx0c3RydWN0IHhhcnJheSAqdHJlZXMsICp0cmVlO1xuMTY1MDpcdFx0dW5zaWduZWQgaW50IG5yLCBpO1xuMTY1MTpcdFxuMTY1MjpcdFx0bnIgPSBESVZfUk9VTkRfVVAobnJfcGFnZXMsIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xuMTY1MzpcdFx0dHJlZXMgPSBrdnphbGxvY19vYmpzKCp0cmVlLCBucik7XG4xNjU0Olx0XHRpZiAoIXRyZWVzKSB7XG4xNjU1Olx0XHRcdHByX2VycihcJiMzNDthbGxvYyBmYWlsZWQsIHpzd2FwIGRpc2FibGVkIGZvciBzd2FwIHR5cGUgJWRcXG5cJiMzNDssIHR5cGUpO1xuMTY1NjpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbjE2NTc6XHRcdH1cbjE2NTg6XHRcbjE2NTk6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpJiM0MzsmIzQzOylcbjE2NjA6XHRcdFx0eGFfaW5pdCh0cmVlcyAmIzQzOyBpKTtcbjE2NjE6XHRcbjE2NjI6XHRcdG5yX3pzd2FwX3RyZWVzW3R5cGVdID0gbnI7XG4xNjYzOlx0XHR6c3dhcF90cmVlc1t0eXBlXSA9IHRyZWVzO1xuMTY2NDpcdFx0cmV0dXJuIDA7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU5NTgKCQkJCQkJCW91dHB1dDogMTY3CgkJCQkJCQl0aG91Z2h0czogODQ3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFuYWx5c2lzIG9mIFpzd2FwIFJlZmFjdG9yaW5nIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoZSBwYXRjaCBmb2N1c2VzIG9uIG9wdGltaXppbmcgdGhlIGB6c3dhcF9zdG9yZWAgZnVuY3Rpb24sIHNwZWNpZmljYWxseSByZWdhcmRpbmcgZWFybHkgZXhpdCBjb25kaXRpb25zIGFuZCBpbnZhbGlkYXRpb24gbG9naWMuIEZpcnN0LCB0aGUgY3J1Y2lhbCBhZGRpdGlvbiBvZiBgaWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSkgcmV0dXJuIGZhbHNlO2AgYXQgdGhlIGJlZ2lubmluZyBvZiBgenN3YXBfc3RvcmVgIGlzIGEgc2ltcGxlIG9wdGltaXphdGlvbjogaWYgenN3YXAgaGFzbiYjMzk7dCBldmVuIGJlZW4gZW5hYmxlZCAoaW5kaWNhdGVkIGJ5IHRoZSBzdGF0aWMgYnJhbmNoIGB6c3dhcF9ldmVyX2VuYWJsZWRgIGJlaW5nIGZhbHNlKSwgd2UgYmFpbCBvdXQgZWFybHksIHNraXBwaW5nIHVubmVjZXNzYXJ5IG9wZXJhdGlvbnMuIFNtYXJ0LgoKVGhlbiwgdGhlIG1vcmUgaW50ZXJlc3RpbmcgcGFydCBpcyBob3cgaXQgc2ltcGxpZmllcyB0aGUgaW52YWxpZGF0aW9uIGxvb3AgaW4gYHpzd2FwX3N0b3JlYCB3aGVuIGEgc3RvcmUgZmFpbHMgb3IgenN3YXAgaXMgZGlzYWJsZWQuIFRoZSBvcmlnaW5hbCBjb2RlIGRpZCBhbiBleHBsaWNpdCBsb29wIHRvIGVyYXNlIGVudHJpZXMgZnJvbSB0aGUgenN3YXAgdHJlZS4gVGhpcyBwYXRjaCByZWZhY3RvcnMgdGhhdCBsb29wIGJ5IHVzaW5nIHRoZSBleGlzdGluZyBgenN3YXBfaW52YWxpZGF0ZWAgZnVuY3Rpb24uIFRoaXMgaXMgY2xlYW5lciwgbW9yZSBtYWludGFpbmFibGUuCgpOb3csIHRoZSByZWFsIHF1ZXN0aW9uOiBkb2VzIHRoaXMgaW50cm9kdWNlIGFueSBLTVNBTiBjb25jZXJucz8gTm8uIExldCYjMzk7cyBydW4gaXQgZG93biB0aGUgY2hlY2tsaXN0OgoKMS4gICoqTm8gS2VybmVsIFN0cnVjdHVyZXMgdG8gVXNlcnNwYWNlOioqIE5vdGhpbmcgaXMgYmVpbmcgY29waWVkIHRvIHVzZXJzcGFjZSB0aGF0IG1pZ2h0IGhhdmUgdW5pbml0aWFsaXplZCBmaWVsZHMgb3IgcGFkZGluZy4gVGhhdCYjMzk7cyBhIGh1Z2Ugd2luLgoyLiAgKipObyBVbmluaXRpYWxpemVkIFZhcmlhYmxlIERlcGVuZGVuY3k6KiogVGhlIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGNoZWNrIHVzZXMgYSBzdGF0aWMga2V5LCBhbmQgdGhlIGxvb3AgaW5kaWNlcywgdHlwZSwgYW5kIG9mZnNldCBpbiBgc3dwX2VudHJ5YCBhcmUgYWxsIGluaXRpYWxpemVkIGFuZCBjYWxjdWxhdGVkLiBUaGUgY29uZGl0aW9ucyBhcmUgc2FmZS4KMy4gICoqTm8gTmV3IEFsbG9jYXRpb25zOioqIE5vIG5ldyBhbGxvY2F0aW9ucyBvciBpbml0aWFsaXphdGlvbnMgb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGludHJvZHVjZWQgdGhhdCBjb3VsZCBoYXJib3IgdW5pbml0aWFsaXplZCBmaWVsZHMuCjQuICAqKk5vIFVuc2FmZSBBY2Nlc3NlczoqKiBUaGVyZSBhcmUgbm8gYm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgdGhhdCBjb3VsZCBsZWFkIHRvIGFjY2Vzc2luZyB1bmluaXRpYWxpemVkIGJ5dGVzIGluIGV4aXN0aW5nIGJ1ZmZlcnMuCgpUaGlzIGlzIGEgY2xlYW4gcmVmYWN0b3JpbmcuIEl0JiMzOTtzIGFuIG9wdGltaXphdGlvbiwgYW5kIGl0IGRvZXNuJiMzOTt0IHRvdWNoIGFueXRoaW5nIEtNU0FOIHdvdWxkIHdvcnJ5IGFib3V0LiBBbnkgbWVtb3J5IG1hbmFnZW1lbnQgZXJyb3JzLCBsaWtlIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlcywgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOL2RlYnVnZ2Vycy4KClNvLCB0aGUgc3VtbWFyeTogVGhpcyBwYXRjaCBvcHRpbWl6ZXMgYHpzd2FwX3N0b3JlYCB3aXRoIGFuIGVhcmx5IGV4aXQgYW5kIHJlZmFjdG9yZWQgaW52YWxpZGF0aW9uIGxvZ2ljLiBJdCBkb2VzICpub3QqIGludHJvZHVjZSBhbnkgcmlza3MgcmVsYXRlZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSwgaW5mby1sZWFrcywgb3IgY29uZGl0aW9uYWwgbG9naWMgdGhhdCByZWxpZXMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoaXMgZmFsbHMgc3F1YXJlbHkgdW5kZXIgS0FTQU4mIzM5O3MgcHVydmlldy4gTm8gS01TQU4gbmVlZGVkLiBUaW1lIHRvIG1vdmUgb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYW4gZWFybHktcmV0dXJuIGNoZWNrIHVzaW5nIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGluIGB6c3dhcF9zdG9yZSgpYCBhbmQgcmVmYWN0b3JzIG9wZW4tY29kZWQgenN3YXAgdHJlZSBpbnZhbGlkYXRpb24gbG9naWMgb24gc3RvcmUgZmFpbHVyZSB0byByZXVzZSBgenN3YXBfaW52YWxpZGF0ZSgpYC4gTm8gbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgb3BlcmF0aW9ucyBhcmUgaW50cm9kdWNlZCBvciBhbHRlcmVkLiBObyBjb25kaXRpb25hbCBsb2dpYyByZWxpZXMgb24gdW5pbml0aWFsaXplZCBkYXRhLiBBbnkgbWVtb3J5IHNhZmV0eSBjb25jZXJucyBpbiB0aGlzIHN3YXAgcGF0aCAoc3VjaCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG9yIGxvY2tpbmcgZXJyb3JzKSBhcmUgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2Vycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGtlcm5lbC10by11c2VyIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYW4gZWFybHktcmV0dXJuIGNoZWNrIHVzaW5nIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGluIGB6c3dhcF9zdG9yZSgpYCBhbmQgcmVmYWN0b3JzIG9wZW4tY29kZWQgenN3YXAgdHJlZSBpbnZhbGlkYXRpb24gbG9naWMgb24gc3RvcmUgZmFpbHVyZSB0byByZXVzZSBgenN3YXBfaW52YWxpZGF0ZSgpYC4gTm8gbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgb3BlcmF0aW9ucyBhcmUgaW50cm9kdWNlZCBvciBhbHRlcmVkLiBObyBjb25kaXRpb25hbCBsb2dpYyByZWxpZXMgb24gdW5pbml0aWFsaXplZCBkYXRhLiBBbnkgbWVtb3J5IHNhZmV0eSBjb25jZXJucyBpbiB0aGlzIHN3YXAgcGF0aCAoc3VjaCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG9yIGxvY2tpbmcgZXJyb3JzKSBhcmUgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2Vycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGtlcm5lbC10by11c2VyIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6MTguNDkyNTc2MzM2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTE1NzE2OTA5MDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiWlNXQVBcIixcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6c3dhcF9zdG9yZVwiLFxuICAgIFwienN3YXBfaW52YWxpZGF0ZVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhbiBlYXJseS1yZXR1cm4gY2hlY2sgdXNpbmcgYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgaW4gYHpzd2FwX3N0b3JlKClgIGFuZCByZWZhY3RvcnMgb3Blbi1jb2RlZCB6c3dhcCB0cmVlIGludmFsaWRhdGlvbiBsb2dpYyBvbiBzdG9yZSBmYWlsdXJlIHRvIHJldXNlIGB6c3dhcF9pbnZhbGlkYXRlKClgLiBObyBtZW1vcnkgYWxsb2NhdGlvbnMsIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMsIG9yIGNvcHktdG8tdXNlciBvcGVyYXRpb25zIGFyZSBpbnRyb2R1Y2VkIG9yIGFsdGVyZWQuIE5vIGNvbmRpdGlvbmFsIGxvZ2ljIHJlbGllcyBvbiB1bmluaXRpYWxpemVkIGRhdGEuIEFueSBtZW1vcnkgc2FmZXR5IGNvbmNlcm5zIGluIHRoaXMgc3dhcCBwYXRoIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgb3IgbG9ja2luZyBlcnJvcnMpIGFyZSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnZXJzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3Iga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgaW4gbW0venN3YXAuYyBieSBhZGRpbmcgYW4gZWFybHktZXhpdCBjaGVjayBpbiB6c3dhcF9zdG9yZSgpIHdoZW4genN3YXAgaGFzIG5ldmVyIGJlZW4gZW5hYmxlZCwgYW5kIHJlZmFjdG9yaW5nIHRoZSBlcnJvci9kaXNhYmxlZCBmYWxsYmFjayBsb29wIHRvIHVzZSB6c3dhcF9pbnZhbGlkYXRlKCkuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IGNvcmUgc3dhcG91dC96c3dhcCBsb2dpYyBhbmQgYXJlIGRpcmVjdGx5IHJlYWNoYWJsZSBhbmQgdGVzdGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDoxOC40OTI1ODE5NTZaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYzNTAzMjc0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDY3Y2VhNjllYzY0Y2M5Y2U1Y2JmNDY5NDMwNzg2ZmIzNDRmYmQ1YmVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBTZXAgOSAxMzozNDoxNyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xcbmluZGV4IDVkMGQ4YmQ3MjE5M2EuLmZjNmM1ZTBkYjVlNDMgMTAwNjQ0XFxuLS0tIGEvbW0venN3YXAuY1xcbisrKyBiL21tL3pzd2FwLmNcXG5AQCAtMTQ4OCw2ICsxNDg4LDkgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XFxuIFxcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKTtcXG4gXFxuK1xcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuIFxcdGlmICghenN3YXBfZW5hYmxlZClcXG4gXFx0XFx0Z290byBjaGVja19vbGQ7XFxuIFxcbkBAIC0xNTQ1LDE1ICsxNTQ4LDEwIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gXFx0aWYgKCFyZXQpIHtcXG4gXFx0XFx0dW5zaWduZWQgdHlwZSA9IHN3cF90eXBlKHN3cCk7XFxuIFxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xcbi1cXHRcXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xcbi1cXHRcXHRzdHJ1Y3QgeGFycmF5ICp0cmVlO1xcbi1cXG4tXFx0XFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFxcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpIHtcXG4tXFx0XFx0XFx0dHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICsgaW5kZXgpKTtcXG4tXFx0XFx0XFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQgKyBpbmRleCk7XFxuLVxcdFxcdFxcdGlmIChlbnRyeSlcXG4tXFx0XFx0XFx0XFx0enN3YXBfZW50cnlfZnJlZShlbnRyeSk7XFxuLVxcdFxcdH1cXG4rXFxuK1xcdFxcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KVxcbitcXHRcXHRcXHR6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgKyBpbmRleCkpO1xcbitcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIHJldDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6MTkuMTI4NzIwODI2WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1OTU4NjMzMDU5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJaU1dBUFwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX3N0b3JlXCIsXG4gICAgXCJ6c3dhcF9pbnZhbGlkYXRlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS96c3dhcC5jIGJ5IGFkZGluZyBhbiBlYXJseS1leGl0IGNoZWNrIGluIHpzd2FwX3N0b3JlKCkgd2hlbiB6c3dhcCBoYXMgbmV2ZXIgYmVlbiBlbmFibGVkLCBhbmQgcmVmYWN0b3JpbmcgdGhlIGVycm9yL2Rpc2FibGVkIGZhbGxiYWNrIGxvb3AgdG8gdXNlIHpzd2FwX2ludmFsaWRhdGUoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBzd2Fwb3V0L3pzd2FwIGxvZ2ljIGFuZCBhcmUgZGlyZWN0bHkgcmVhY2hhYmxlIGFuZCB0ZXN0YWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjdjZWE2OWVjNjRjYzljZTVjYmY0Njk0MzA3ODZmYjM0NGZiZDViZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgU2VwIDkgMTM6MzQ6MTcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xuaW5kZXggNWQwZDhiZDcyMTkzYS4uZmM2YzVlMGRiNWU0MyAxMDA2NDRcbi0tLSBhL21tL3pzd2FwLmNcbisrKyBiL21tL3pzd2FwLmNcbkBAIC0xNDg4LDYgKzE0ODgsOSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XG4gXG4rXHRpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4gXHRpZiAoIXpzd2FwX2VuYWJsZWQpXG4gXHRcdGdvdG8gY2hlY2tfb2xkO1xuIFxuQEAgLTE1NDUsMTUgKzE1NDgsMTAgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0aWYgKCFyZXQpIHtcbiBcdFx0dW5zaWduZWQgdHlwZSA9IHN3cF90eXBlKHN3cCk7XG4gXHRcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xuLVx0XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xuLVx0XHRzdHJ1Y3QgeGFycmF5ICp0cmVlO1xuLVxuLVx0XHRmb3IgKGluZGV4ID0gMDsgaW5kZXggXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KSB7XG4tXHRcdFx0dHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICsgaW5kZXgpKTtcbi1cdFx0XHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCArIGluZGV4KTtcbi1cdFx0XHRpZiAoZW50cnkpXG4tXHRcdFx0XHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcbi1cdFx0fVxuK1xuK1x0XHRmb3IgKGluZGV4ID0gMDsgaW5kZXggXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KVxuK1x0XHRcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCArIGluZGV4KSk7XG4rXG4gXHR9XG4gXG4gXHRyZXR1cm4gcmV0O1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6MTkuMTI4NzMyMjA2WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTQwOTk4NTA0NzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXZhbHVhdGluZyB0aGUgUGF0Y2gncyBTdWl0YWJpbGl0eSBmb3IgU3l6a2FsbGVyIEZ1enppbmcqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCBhIHBhdGNoIHJldmlldyByZXF1ZXN0LCBzcGVjaWZpY2FsbHkgZm9yIGZ1enppbmcgdHJpYWdlIGluIHRoZSBMaW51eCBrZXJuZWwuIFNlZW1zIHByZXR0eSBiZW5pZ24sIGZhbGxpbmcgdW5kZXIgZGVmZW5zaXZlIHNlY3VyaXR5IGVuZ2luZWVyaW5nIGFuZCBrZXJuZWwgUUEsIG5vdGhpbmcgc2NyZWFtaW5nIFwiY3JpdGljYWwgdnVsbmVyYWJpbGl0eVwiIGhlcmUuIEdvb2QuXG5cblRoZSBwYXRjaCBpdHNlbGYgdG91Y2hlcyBgbW0venN3YXAuY2AsIHNwZWNpZmljYWxseSBgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylgLiBMb29raW5nIGF0IHRoZSBkaWZmLCBpdCBpbnRyb2R1Y2VzIGEgY2hlY2s6IGBpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7YC4gVGhpcyBzZWVtcyB0byBiZSBhIHNhZmVndWFyZCBhZ2FpbnN0IHpzd2FwIGJlaW5nIHVzZWQgd2hlbiBpdCBpc24ndCBlbmFibGVkLCB3aGljaCBtYWtlcyBzZW5zZS4gVGhlcmUgYXJlIHNvbWUgY2hhbmdlcyBhZnRlciB0aGUgYCFyZXRgIGNoZWNrLiBJdCByZXBsYWNlcyB0aGUgdXNlIG9mIGB4YV9lcmFzZWAgd2l0aCBhIGB6c3dhcF9pbnZhbGlkYXRlYCB3aGljaCBsb29rcyBsaWtlIGEgcmVmYWN0b3JpbmcuXG5cbk15IG5leHQgc3RlcCBpcyB0byBkaXZlIGRlZXBlci4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQuIEknbGwgYmUgZGlnZ2luZyBpbnRvIGBtbS96c3dhcC5jYCBhbmQgYWRqYWNlbnQgY29kZS4gSSdsbCBiZSB1c2luZyB0aGUgdXN1YWwgdG9vbHMsIGxpa2UgZ3JlcCwgY3Njb3BlLCBtYXliZSBzb21lIHN0YXRpYyBhbmFseXNpcywgdG8gZ2V0IGEgaGFuZGxlIG9uIGNhbGxlcnMsIGNvbmZpZ3VyYXRpb25zIHJlbGF0ZWQgdG8genN3YXAsIGFuZCBmaWd1cmUgb3V0IHdoYXQgdGhlIGNyaXRpY2FsIHN5bWJvbHMgYXJlLiBJJ2xsIG5lZWQgdG8ga25vdyB3aGF0IGZ1bmN0aW9ucyBjYWxsIGB6c3dhcF9zdG9yZWAsIGFuZCB3aGF0IG1vZHVsZXMgdXNlIHRoaXMuIEFmdGVyIHRoYXQsIEkgY2FuIGZvcm0gYSBiZXR0ZXIgdmlldy4gVGhlbiwgSSBjYW4gcHJvcGVybHkgZXZhbHVhdGUgd2hldGhlciBvciBub3QgdGhpcyBjaGFuZ2Ugd2FycmFudHMgU3l6a2FsbGVyIGZ1enppbmcuIEl0J3MgdG9vIGVhcmx5IHRvIHNheSBmb3Igc3VyZSB3aXRob3V0IG1vcmUgaW52ZXN0aWdhdGlvbiwgYnV0IGZyb20gYSBmaXJzdCBnbGFuY2UsIHRoZSBjaGFuZ2Ugc2VlbXMgcmVhc29uYWJsZSwgYW5kIHBvdGVudGlhbGx5IGZ1enppbmcgaXMgbm90IG5lY2Vzc2FyeS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzA2OCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ3NiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM0OjMzLjIyODU5Mzg4NFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM2NDgwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS96c3dhcC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE0ODAsXG4gIFwiTGluZUNvdW50XCI6IDkwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE0ODA6XFx0XFx0bG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcXG4xNDgxOlxcdFxcdHN3cF9lbnRyeV90IHN3cCA9IGZvbGlvLVxcdTAwM2Vzd2FwO1xcbjE0ODI6XFx0XFx0c3RydWN0IG9ial9jZ3JvdXAgKm9iamNnID0gTlVMTDtcXG4xNDgzOlxcdFxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7XFxuMTQ4NDpcXHRcXHRzdHJ1Y3QgenN3YXBfcG9vbCAqcG9vbDtcXG4xNDg1OlxcdFxcdGJvb2wgcmV0ID0gZmFsc2U7XFxuMTQ4NjpcXHRcXHRsb25nIGluZGV4O1xcbjE0ODc6XFx0XFxuMTQ4ODpcXHRcXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XFxuMTQ4OTpcXHRcXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XFxuMTQ5MDpcXHRcXG4xNDkxOlxcdFxcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXFxuMTQ5MjpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuMTQ5MzpcXHRcXG4xNDk0OlxcdFxcdGlmICghenN3YXBfZW5hYmxlZClcXG4xNDk1OlxcdFxcdFxcdGdvdG8gY2hlY2tfb2xkO1xcbjE0OTY6XFx0XFxuMTQ5NzpcXHRcXHRvYmpjZyA9IGdldF9vYmpfY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xcbjE0OTg6XFx0XFx0aWYgKG9iamNnIFxcdTAwMjZcXHUwMDI2ICFvYmpfY2dyb3VwX21heV96c3dhcChvYmpjZykpIHtcXG4xNDk5OlxcdFxcdFxcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9vYmpjZyhvYmpjZyk7XFxuMTUwMDpcXHRcXHRcXHRpZiAoc2hyaW5rX21lbWNnKG1lbWNnKSkge1xcbjE1MDE6XFx0XFx0XFx0XFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xcbjE1MDI6XFx0XFx0XFx0XFx0Z290byBwdXRfb2JqY2c7XFxuMTUwMzpcXHRcXHRcXHR9XFxuMTUwNDpcXHRcXHRcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuMTUwNTpcXHRcXHR9XFxuMTUwNjpcXHRcXG4xNTA3OlxcdFxcdGlmICh6c3dhcF9jaGVja19saW1pdHMoKSlcXG4xNTA4OlxcdFxcdFxcdGdvdG8gcHV0X29iamNnO1xcbjE1MDk6XFx0XFxuMTUxMDpcXHRcXHRwb29sID0genN3YXBfcG9vbF9jdXJyZW50X2dldCgpO1xcbjE1MTE6XFx0XFx0aWYgKCFwb29sKVxcbjE1MTI6XFx0XFx0XFx0Z290byBwdXRfb2JqY2c7XFxuMTUxMzpcXHRcXG4xNTE0OlxcdFxcdGlmIChvYmpjZykge1xcbjE1MTU6XFx0XFx0XFx0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX29iamNnKG9iamNnKTtcXG4xNTE2OlxcdFxcdFxcdGlmIChtZW1jZ19saXN0X2xydV9hbGxvYyhtZW1jZywgXFx1MDAyNnpzd2FwX2xpc3RfbHJ1LCBHRlBfS0VSTkVMKSkge1xcbjE1MTc6XFx0XFx0XFx0XFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xcbjE1MTg6XFx0XFx0XFx0XFx0Z290byBwdXRfcG9vbDtcXG4xNTE5OlxcdFxcdFxcdH1cXG4xNTIwOlxcdFxcdFxcdG1lbV9jZ3JvdXBfcHV0KG1lbWNnKTtcXG4xNTIxOlxcdFxcdH1cXG4xNTIyOlxcdFxcbjE1MjM6XFx0XFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFxcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpIHtcXG4xNTI0OlxcdFxcdFxcdGlmICghenN3YXBfc3RvcmVfcGFnZShmb2xpbywgaW5kZXgsIG9iamNnLCBwb29sKSlcXG4xNTI1OlxcdFxcdFxcdFxcdGdvdG8gcHV0X3Bvb2w7XFxuMTUyNjpcXHRcXHR9XFxuMTUyNzpcXHRcXG4xNTI4OlxcdFxcdGlmIChvYmpjZylcXG4xNTI5OlxcdFxcdFxcdGNvdW50X29iamNnX2V2ZW50cyhvYmpjZywgWlNXUE9VVCwgbnJfcGFnZXMpO1xcbjE1MzA6XFx0XFxuMTUzMTpcXHRcXHRjb3VudF92bV9ldmVudHMoWlNXUE9VVCwgbnJfcGFnZXMpO1xcbjE1MzI6XFx0XFxuMTUzMzpcXHRcXHRyZXQgPSB0cnVlO1xcbjE1MzQ6XFx0XFxuMTUzNTpcXHRwdXRfcG9vbDpcXG4xNTM2OlxcdFxcdHpzd2FwX3Bvb2xfcHV0KHBvb2wpO1xcbjE1Mzc6XFx0cHV0X29iamNnOlxcbjE1Mzg6XFx0XFx0b2JqX2Nncm91cF9wdXQob2JqY2cpO1xcbjE1Mzk6XFx0XFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgenN3YXBfcG9vbF9yZWFjaGVkX2Z1bGwpXFxuMTU0MDpcXHRcXHRcXHRxdWV1ZV93b3JrKHNocmlua193cSwgXFx1MDAyNnpzd2FwX3Nocmlua193b3JrKTtcXG4xNTQxOlxcdGNoZWNrX29sZDpcXG4xNTQyOlxcdFxcdC8qXFxuMTU0MzpcXHRcXHQgKiBJZiB0aGUgenN3YXAgc3RvcmUgZmFpbHMgb3IgenN3YXAgaXMgZGlzYWJsZWQsIHdlIG11c3QgaW52YWxpZGF0ZVxcbjE1NDQ6XFx0XFx0ICogdGhlIHBvc3NpYmx5IHN0YWxlIGVudHJpZXMgd2hpY2ggd2VyZSBwcmV2aW91c2x5IHN0b3JlZCBhdCB0aGVcXG4xNTQ1OlxcdFxcdCAqIG9mZnNldHMgY29ycmVzcG9uZGluZyB0byBlYWNoIHBhZ2Ugb2YgdGhlIGZvbGlvLiBPdGhlcndpc2UsXFxuMTU0NjpcXHRcXHQgKiB3cml0ZWJhY2sgY291bGQgb3ZlcndyaXRlIHRoZSBuZXcgZGF0YSBpbiB0aGUgc3dhcGZpbGUuXFxuMTU0NzpcXHRcXHQgKi9cXG4xNTQ4OlxcdFxcdGlmICghcmV0KSB7XFxuMTU0OTpcXHRcXHRcXHR1bnNpZ25lZCB0eXBlID0gc3dwX3R5cGUoc3dwKTtcXG4xNTUwOlxcdFxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xcbjE1NTE6XFx0XFxuMTU1MjpcXHRcXHRcXHRmb3IgKGluZGV4ID0gMDsgaW5kZXggXFx1MDAzYyBucl9wYWdlczsgKytpbmRleClcXG4xNTUzOlxcdFxcdFxcdFxcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCArIGluZGV4KSk7XFxuMTU1NDpcXHRcXG4xNTU1OlxcdFxcdH1cXG4xNTU2OlxcdFxcbjE1NTc6XFx0XFx0cmV0dXJuIHJldDtcXG4xNTU4OlxcdH1cXG4xNTU5OlxcdFxcbjE1NjA6XFx0LyoqXFxuMTU2MTpcXHQgKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxcbjE1NjI6XFx0ICogQGZvbGlvOiBmb2xpbyB0byBsb2FkXFxuMTU2MzpcXHQgKlxcbjE1NjQ6XFx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXFxuMTU2NTpcXHQgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOlxcbjE1NjY6XFx0ICpcXG4xNTY3OlxcdCAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAsIGJ1dCBjb3VsZCBub3QgYmUgbG9hZGVkXFxuMTU2ODpcXHQgKiAgaW50byB0aGUgcGFnZSBkdWUgdG8gYSBkZWNvbXByZXNzaW9uIGZhaWx1cmUuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwgYnV0XFxuMTU2OTpcXHQgKiAgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6MzMuMjI4OTYyMDk0WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTgyMzgyNTkzMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgZnVuY3Rpb25zLCBhcyBpZiBJJ20gdGhpbmtpbmcgaXQgdGhyb3VnaDpcblxuKipJbnZlc3RpZ2F0aW5nIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGFuZCBgenN3YXBfaW52YWxpZGF0ZSgpYCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGVzZSBgenN3YXBgIGZ1bmN0aW9ucy4gRmlyc3QsIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCBgenN3YXBfbmV2ZXJfZW5hYmxlZCgpYCBhbmQgYHpzd2FwX2ludmFsaWRhdGUoKWAgYXJlIGFjdHVhbGx5IGRvaW5nLiBUaW1lIHRvIGNoZWNrIHRoZSBzb3VyY2UgY29kZS4gSSdsbCBuZWVkIHRvIGxvY2F0ZSB0aGVpciBkZWZpbml0aW9ucywgcHJvYmFibHkgaW4gYG1tL3pzd2FwLmNgLCBvciBtYXliZSBJIGNhbiBmaW5kIGl0IGluIGFuIGluY2x1ZGUgZmlsZS4gQSBxdWljayBgZ3JlcGAgc2hvdWxkIGdldCBtZSB0aGUgYW5zd2VycyBmYXN0LCBzaG93aW5nIG1lIHdoZXJlIHRoZXkncmUgZGVmaW5lZCBhbmQgY2FsbGVkLiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSByZXZlYWxzIGFib3V0IHRoZWlyIHJvbGVzIGluIHRoZSB6c3dhcCBtZWNoYW5pc20uIFRoYXQnbGwgcHJvdmlkZSB0aGUgY29udGV4dCB0byB1bmRlcnN0YW5kIHRoZWlyIHBhcnRpY3VsYXIgZnVuY3Rpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUyNjgsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM0OjM1LjA1Mjc5MjI5NVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2OTU0NTEzNTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwienN3YXBfbmV2ZXJfZW5hYmxlZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtb3J5LmM9NDc1OD1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aHBfc3dhcGluX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTQ3NzktXFx0ICovXFxubW0vbWVtb3J5LmM6NDc4MDpcXHRpZiAoIXpzd2FwX25ldmVyX2VuYWJsZWQoKSlcXG5tbS9tZW1vcnkuYy00NzgxLVxcdFxcdHJldHVybiAwO1xcbi0tXFxubW0vc2htZW0uYz0yMjQ1PXN0YXRpYyBzdHJ1Y3QgZm9saW8gKnNobWVtX3N3YXBfYWxsb2NfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbm1tL3NobWVtLmMtMjI1NC1cXHRpZiAoKHZtZiBcXHUwMDI2XFx1MDAyNiB1bmxpa2VseSh1c2VyZmF1bHRmZF9hcm1lZCh2bWYtXFx1MDAzZXZtYSkpKSB8fFxcbm1tL3NobWVtLmM6MjI1NTpcXHQgICAgICF6c3dhcF9uZXZlcl9lbmFibGVkKCkpXFxubW0vc2htZW0uYy0yMjU2LVxcdFxcdG9yZGVyID0gMDtcXG4tLVxcbm1tL3pzd2FwLmM9MTI1PWJvb2wgenN3YXBfaXNfZW5hYmxlZCh2b2lkKVxcbi0tXFxubW0venN3YXAuYy0xMjktXFxubW0venN3YXAuYzoxMzA6Ym9vbCB6c3dhcF9uZXZlcl9lbmFibGVkKHZvaWQpXFxubW0venN3YXAuYy0xMzEte1xcbi0tXFxubW0venN3YXAuYz0xNDc4PWJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3pzd2FwLmMtMTQ5MC1cXG5tbS96c3dhcC5jOjE0OTE6XFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcXG5tbS96c3dhcC5jLTE0OTItXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi0tXFxubW0venN3YXAuYz0xNTgwPWludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5tbS96c3dhcC5jLTE1ODktXFxubW0venN3YXAuYzoxNTkwOlxcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXFxubW0venN3YXAuYy0xNTkxLVxcdFxcdHJldHVybiAtRU5PRU5UO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDozNS43NDgyNTAxNDRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozODY2MzI0OTY5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSBrZXJuZWwgenN3YXAgY29tcG9uZW50cywgZnJvbSBhIHRlY2huaWNhbCBwZXJzcGVjdGl2ZTpcblxuKipEaXZpbmcgaW50byB6c3dhcCBDb25maWd1cmF0aW9uIGFuZCBPcGVyYXRpb24qKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgZG93biB0byB0aGUgbnV0cyBhbmQgYm9sdHMgb2YgaG93IHpzd2FwIGlzIGNvbmZpZ3VyZWQgYW5kIGJlaGF2ZXMuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgc3BlY2lmaWNzIG9mIGB6c3dhcF9uZXZlcl9lbmFibGVkYCwgYHpzd2FwX2ludmFsaWRhdGVgLCBhbmQgdGhlIHJlbGV2YW50IEtjb25maWcgb3B0aW9ucy4gVGhlc2UgYXJlIGtleSBmb3IgdW5kZXJzdGFuZGluZyB0aGUgZHluYW1pYyBiZWhhdmlvciBhbmQgY29udHJvbCBwb2ludHMgb2YgdGhlIHpzd2FwIHN1YnN5c3RlbSwgYW5kIGhvdyBpdOKAmXMgaW50ZWdyYXRlZCB3aXRoIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwncyBtZW1vcnkgbWFuYWdlbWVudC4gSSByZWNhbGwgdGhlIGltcGxpY2F0aW9ucyBvZiBlYWNoLCBidXQgSSBuZWVkIHRvIGVuc3VyZSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzIGlzIHNoYXJwLlxuXG5GaXJzdGx5LCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAuLi4gdGhpcyBsaWtlbHkgZnVuY3Rpb25zIGFzIGEgZ2xvYmFsIGdhdGUsIGEgZmxhZyB0aGF0IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHpzd2FwIGF0IGJvb3QgaWYgc2V0LiBJdCdzIHByb2JhYmx5IGNoZWNrZWQgZWFybHkgaW4gaW5pdGlhbGl6YXRpb24sIHBvdGVudGlhbGx5IHByZXZlbnRpbmcgYWxsb2NhdGlvbiBvZiB0aGUgbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcyBvciBwcmV2ZW50aW5nIHJlZ2lzdHJhdGlvbiBvZiB6c3dhcCBhcyBhIHN3YXAgc3BhY2UgcHJvdmlkZXIuIFRoZSBrZXkgaGVyZSBpcyB0aGUgbGV2ZWwgb2YgZ3JhbnVsYXJpdHk7IGRvZXMgaXQgZnVsbHkgdW5sb2FkIHRoZSBtb2R1bGVzLCBvciBkb2VzIGl0IHNpbXBseSBwcmV2ZW50IHVzZT8gSSB3YW50IHRvIHZlcmlmeSB0aGUgaW1wbGljYXRpb25zIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggY29tbWFuZC1saW5lIHBhcmFtZXRlcnMuXG5cbk5leHQsIGB6c3dhcF9pbnZhbGlkYXRlYC4gTm93LCB0aGlzIHNvdW5kcyBpbnRyaWd1aW5nLiBJdCBpbXBsaWVzIGFuIGludmFsaWRhdGlvbiBzdHJhdGVneS4gSSBhc3N1bWUgdGhpcyByZWxhdGVzIHRvIHRoZSBjYWNoZSBtYW5hZ2VtZW50IG9yIHdyaXRlLWJhY2sgcG9saWNpZXMuIERvZXMgaXQgdHJpZ2dlciBhbiBleHBsaWNpdCBpbnZhbGlkYXRpb24gb2YgdGhlIHN3YXAgZW50cmllcywgZm9yY2luZyB0aGVtIHRvIGJlIHJlLWNvbXByZXNzZWQgYW5kIHdyaXR0ZW4gYmFjaz8gT3IgZG9lcyBpdCBoaW50IGF0IGEgd2F5IHRvIHB1cmdlIHBhZ2VzIHRvIHJlY2xhaW0gc3BhY2U/IEnigJlsbCBuZWVkIHRvIGNoZWNrIHRoZSBjb2RlLiBBcmUgdGhlcmUgYW55IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRvIGJlIG1pbmRmdWwgb2YgaGVyZT8gSG93IGRvZXMgaXQgaW50ZXJhY3Qgd2l0aCB0aGUgcGFnZSByZWNsYWltIG1lY2hhbmlzbXM/IFRoaXMgZnVuY3Rpb24gY291bGQgcGxheSBhIHZpdGFsIHJvbGUgaW4gcHJldmVudGluZyBtZW1vcnkgbGVha3Mgb3IgaW1wcm92aW5nIHN3YXBwaW5nIGVmZmljaWVuY3kuXG5cbkZpbmFsbHksIHRoZSBLY29uZmlnIG9wdGlvbnMuIFRoaXMgaXMgdGhlIGJlZHJvY2sgb2YgY29uZmlndXJhdGlvbi4gV2hhdCBncmFudWxhciBjb250cm9sIGRvIHdlIGhhdmU/IERvZXMgaXQgYWxsb3cgZm9yIGNvbXBpbGUtdGltZSBjaG9pY2VzPyBDYW4gd2UgZGlzYWJsZSBwYXJ0cyBvZiB0aGUgZnVuY3Rpb25hbGl0eSB0byByZWR1Y2UgdGhlIGtlcm5lbCBpbWFnZSBzaXplIG9yIHJlZHVjZSBzdXJmYWNlIGFyZWE/IEknbGwgY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgdGhlIGFiaWxpdHkgdG8gZmluZS10dW5lIGFzcGVjdHMgbGlrZSBjb21wcmVzc2lvbiBhbGdvcml0aG1zLCB3cml0ZWJhY2sgcG9saWNpZXMsIG9yIG1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWdpZXMgdGhyb3VnaCB0aG9zZSBvcHRpb25zLiBJIHNob3VsZCBhbHNvIGludmVzdGlnYXRlIHdoZXRoZXIgYW55IGRlcGVuZGVuY2llcyBleGlzdCBiZXR3ZWVuIHRoZSBLY29uZmlnIG9wdGlvbnMuIEkgbmVlZCB0byBiZSBzdXJlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWVzLCBhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGVtLCBhcmUgY2xlYXIgYW5kIGRvY3VtZW50ZWQuXG5cblVsdGltYXRlbHksIEkgd2FudCBhIGNvbXBsZXRlLCB1cC10by1kYXRlLCBwaWN0dXJlIG9mIGhvdyB0aGVzZSB0aHJlZSBlbGVtZW50cyBpbnRlcmFjdC4gSSdsbCBmb2N1cyBvbiBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIGFuZCBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgdG8gYnVpbGQgYSByZWxpYWJsZSBtZW50YWwgbW9kZWwgb2YgenN3YXAncyBpbnRlcm5hbCBvcGVyYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1OTU1LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6MzkuNjE0NTgwMTYzWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkzOTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3pzd2FwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTIwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTIwOlxcdC8qIEVuYWJsZS9kaXNhYmxlIG1lbW9yeSBwcmVzc3VyZS1iYXNlZCBzaHJpbmtlci4gKi9cXG4gMTIxOlxcdHN0YXRpYyBib29sIHpzd2FwX3Nocmlua2VyX2VuYWJsZWQgPSBJU19FTkFCTEVEKFxcbiAxMjI6XFx0XFx0XFx0Q09ORklHX1pTV0FQX1NIUklOS0VSX0RFRkFVTFRfT04pO1xcbiAxMjM6XFx0bW9kdWxlX3BhcmFtX25hbWVkKHNocmlua2VyX2VuYWJsZWQsIHpzd2FwX3Nocmlua2VyX2VuYWJsZWQsIGJvb2wsIDA2NDQpO1xcbiAxMjQ6XFx0XFxuIDEyNTpcXHRib29sIHpzd2FwX2lzX2VuYWJsZWQodm9pZClcXG4gMTI2OlxcdHtcXG4gMTI3OlxcdFxcdHJldHVybiB6c3dhcF9lbmFibGVkO1xcbiAxMjg6XFx0fVxcbiAxMjk6XFx0XFxuIDEzMDpcXHRib29sIHpzd2FwX25ldmVyX2VuYWJsZWQodm9pZClcXG4gMTMxOlxcdHtcXG4gMTMyOlxcdFxcdHJldHVybiAhc3RhdGljX2JyYW5jaF9tYXliZShDT05GSUdfWlNXQVBfREVGQVVMVF9PTiwgXFx1MDAyNnpzd2FwX2V2ZXJfZW5hYmxlZCk7XFxuIDEzMzpcXHR9XFxuIDEzNDpcXHRcXG4gMTM1OlxcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcXG4gMTM2OlxcdCogZGF0YSBzdHJ1Y3R1cmVzXFxuIDEzNzpcXHQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xcbiAxMzg6XFx0XFxuIDEzOTpcXHRzdHJ1Y3QgY3J5cHRvX2Fjb21wX2N0eCB7XFxuIDE0MDpcXHRcXHRzdHJ1Y3QgY3J5cHRvX2Fjb21wICphY29tcDtcXG4gMTQxOlxcdFxcdHN0cnVjdCBhY29tcF9yZXEgKnJlcTtcXG4gMTQyOlxcdFxcdHN0cnVjdCBjcnlwdG9fd2FpdCB3YWl0O1xcbiAxNDM6XFx0XFx0dTggKmJ1ZmZlcjtcXG4gMTQ0OlxcdFxcdHN0cnVjdCBtdXRleCBtdXRleDtcXG4gMTQ1OlxcdH07XFxuIDE0NjpcXHRcXG4gMTQ3OlxcdC8qXFxuIDE0ODpcXHQgKiBUaGUgbG9jayBvcmRlcmluZyBpcyB6c3dhcF90cmVlLmxvY2sgLVxcdTAwM2UgenN3YXBfcG9vbC5scnVfbG9jay5cXG4gMTQ5OlxcdCAqIFRoZSBvbmx5IGNhc2Ugd2hlcmUgbHJ1X2xvY2sgaXMgbm90IGFjcXVpcmVkIHdoaWxlIGhvbGRpbmcgdHJlZS5sb2NrIGlzXFxuIDE1MDpcXHQgKiB3aGVuIGEgenN3YXBfZW50cnkgaXMgdGFrZW4gb2ZmIHRoZSBscnUgZm9yIHdyaXRlYmFjaywgaW4gdGhhdCBjYXNlIGl0XFxuIDE1MTpcXHQgKiBuZWVkcyB0byBiZSB2ZXJpZmllZCB0aGF0IGl0J3Mgc3RpbGwgdmFsaWQgaW4gdGhlIHRyZWUuXFxuIDE1MjpcXHQgKi9cXG4gMTUzOlxcdHN0cnVjdCB6c3dhcF9wb29sIHtcXG4gMTU0OlxcdFxcdHN0cnVjdCB6c19wb29sICp6c19wb29sO1xcbiAxNTU6XFx0XFx0c3RydWN0IGNyeXB0b19hY29tcF9jdHggX19wZXJjcHUgKmFjb21wX2N0eDtcXG4gMTU2OlxcdFxcdHN0cnVjdCBwZXJjcHVfcmVmIHJlZjtcXG4gMTU3OlxcdFxcdHN0cnVjdCBsaXN0X2hlYWQgbGlzdDtcXG4gMTU4OlxcdFxcdHN0cnVjdCB3b3JrX3N0cnVjdCByZWxlYXNlX3dvcms7XFxuIDE1OTpcXHRcXHRzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDozOS42MTQ3OTUzNzNaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNjY1NjU2Njg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBgenN3YXBfaW52YWxpZGF0ZWAgZnVuY3Rpb24gYW5kIHNlZSB3aGF0IGl0J3MgYWxsIGFib3V0LiBBcyBzb21lb25lIGRlZXBseSBmYW1pbGlhciB3aXRoIG1lbW9yeSBtYW5hZ2VtZW50IGluIHRoZSBrZXJuZWwsIEknbSBleHBlY3RpbmcgdGhpcyBmdW5jdGlvbiBwbGF5cyBhIGNydWNpYWwgcm9sZSwgbGlrZWx5IGludm9sdmluZyB0aGUgbWFuYWdlbWVudCBvZiBzd2FwcGVkIHBhZ2VzIHdpdGhpbiB0aGUgenN3YXAgc3Vic3lzdGVtLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSwgd2hlbiBpdCdzIGNhbGxlZCwgYW5kIG1vc3QgaW1wb3J0YW50bHksIGhvdyBpdCBlbnN1cmVzIGRhdGEgY29uc2lzdGVuY3kgYW5kIGVmZmljaWVudCByZXNvdXJjZSB1dGlsaXphdGlvbi5cblxuSSdtIG1lbnRhbGx5IHByZXBhcmluZyB0byBzY3J1dGluaXplIGl0cyBsb2dpYy4gSSdsbCBiZSBsb29raW5nIGZvciBjbHVlcyBhYm91dCB0aGUgY29uZGl0aW9ucyB0aGF0IHRyaWdnZXIgYW4gaW52YWxpZGF0aW9uLiBJcyBpdCBiYXNlZCBvbiBhIHRpbWVyLCBtZW1vcnkgcHJlc3N1cmUsIG9yIHNvbWUgb3RoZXIgZXZlbnQ/IERvZXMgaXQgaW50ZXJhY3Qgd2l0aCBwYWdlIHRhYmxlcyBkaXJlY3RseT8gRG9lcyBpdCBpbnZvbHZlIGZyZWVpbmcgdGhlIGFzc29jaWF0ZWQgY29tcHJlc3NlZCBkYXRhIG9yIG1lcmVseSBtYXJraW5nIHRoZSBzd2FwIGVudHJ5IGFzIGludmFsaWQ/IEknbGwgYWxzbyB0cnkgdG8gdW5kZXJzdGFuZCBpdHMgcmVsYXRpb25zaGlwIHRvIG90aGVyIGZ1bmN0aW9ucywgbGlrZSB0aG9zZSByZXNwb25zaWJsZSBmb3IgcGFnZSByZWNsYWltIGFuZCBzd2FwLW91dC4gSSBuZWVkIHRvIHBpZWNlIHRvZ2V0aGVyIGl0cyByb2xlIGluIHByZXZlbnRpbmcgdGhlIHpzd2FwIGNhY2hlIGZyb20gYmVjb21pbmcgc3RhbGUuIEkgZXhwZWN0IGl0J2xsIHVzZSBzb21lIGF0b21pYyBvcGVyYXRpb25zIG9yIGxvY2tpbmcgdG8gZW5zdXJlIHRocmVhZCBzYWZldHkuIEFueSBjbGV2ZXIgb3B0aW1pemF0aW9ucyBvciBlZGdlLWNhc2UgaGFuZGxpbmcgd2lsbCBhbHNvIGNhdGNoIG15IGV5ZS4gSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0IGRlYWxzIHdpdGggcG90ZW50aWFsIEkvTyBlcnJvcnMgYW5kIGFueSBtZWNoYW5pc21zIGl0IHVzZXMgdG8gYXZvaWQgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuIFNvLCBicmluZyBvbiB0aGUgY29kZSEgTGV0J3Mgc2VlIGhvdyBpdCdzIGltcGxlbWVudGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTQ3LCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDo0Mi4yODA0NTQ4NjFaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNjAwNjgwOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ6c3dhcF9pbnZhbGlkYXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwZmlsZS5jPTEzMTY9c3RhdGljIHZvaWQgc3dhcF9yYW5nZV9mcmVlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTEzMjMtXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX2VudHJpZXM7IGkrKylcXG5tbS9zd2FwZmlsZS5jOjEzMjQ6XFx0XFx0enN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnkoc2ktXFx1MDAzZXR5cGUsIG9mZnNldCArIGkpKTtcXG5tbS9zd2FwZmlsZS5jLTEzMjUtXFxuLS1cXG5tbS96c3dhcC5jPTE0Nzg9Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0venN3YXAuYy0xNTUyLVxcdFxcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KVxcbm1tL3pzd2FwLmM6MTU1MzpcXHRcXHRcXHR6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgKyBpbmRleCkpO1xcbm1tL3pzd2FwLmMtMTU1NC1cXG4tLVxcbm1tL3pzd2FwLmM9MTU4MD1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0venN3YXAuYy0xNjMyLVxcbm1tL3pzd2FwLmM6MTYzMzp2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKVxcbm1tL3pzd2FwLmMtMTYzNC17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM0OjQyLjQxNjQ3MDk4OVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTI5NzU5NTU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIHpzd2FwX2ludmFsaWRhdGUqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGB6c3dhcF9pbnZhbGlkYXRlYCBpbiBgbW0venN3YXAuY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIGl0cyByb2xlIGluIHRoZSBsYXJnZXIgcGljdHVyZSBvZiB6c3dhcCdzIGZ1bmN0aW9uYWxpdHksIHNwZWNpZmljYWxseSBob3cgaXQgaGFuZGxlcyByZWNsYWltaW5nIG9yIGludmFsaWRhdGluZyBwYWdlcyB3aXRoaW4gdGhlIHpzd2FwIGNhY2hlLiBJIGtub3cgdGhlIGNvcmUgaWRlYSBpcyBhYm91dCBlbnN1cmluZyBtZW1vcnkgY29uc2lzdGVuY3kgYW5kIHByZXZlbnRpbmcgc3RhbGUgZGF0YSBmcm9tIHJlc2lkaW5nIHdpdGhpbiB0aGUgc3dhcCBjYWNoZS5cblxuSSdtIGV4cGVjdGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBhdCBwb2ludHMgd2hlcmUgdGhlIGJhY2tpbmcgcGFnZSBtaWdodCBiZSBtb2RpZmllZCwgb3Igd2hlbiB0aGUgc3lzdGVtIG5lZWRzIHRvIGZyZWUgdXAgc3BhY2UgaW4gdGhlIHpzd2FwIHBvb2wuIEknbSBrZWVuIHRvIHNlZSB0aGUgc3BlY2lmaWMgY29uZGl0aW9ucyBmb3IgaW52YWxpZGF0aW9uIOKAkyBhcmUgd2UgdGFsa2luZyBhYm91dCBwYWdlIGZhdWx0cywgZGlyZWN0IHJlY2xhaW0sIG9yIHNvbWUgb3RoZXIgdHJpZ2dlcj8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBwYWdlIHRhYmxlcywgYW5kIGhvdyBpdCBoYW5kbGVzIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuIEknbSBhbHNvIGN1cmlvdXMgYWJvdXQgdGhlIG1lY2hhbmlzbXMgaXQgZW1wbG95cywgc3VjaCBhcyBpbnZhbGlkYXRpbmcgdGhlIHBhZ2UgY2FjaGUgZW50cmllcyBhbmQgcG90ZW50aWFsbHkgaW5pdGlhdGluZyBhIHdyaXRlYmFjayB0byB0aGUgc3dhcCBkZXZpY2UgaWYgcmVxdWlyZWQuIEZpbmFsbHksIEknbGwgYmUgbG9va2luZyBmb3IgaG93IGl0IGludGVyYWN0cyB3aXRoIGFueSBvdGhlciBzdWJzeXN0ZW1zIG9yIGRhdGEgc3RydWN0dXJlcyB0aGF0IGRlcGVuZCBvbiB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIHpzd2FwIHBhZ2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NzU2LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6NDUuOTQ2MjM0MDQzWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMDg4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS96c3dhcC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE2MzAsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE2MzA6XFx0XFx0cmV0dXJuIDA7XFxuMTYzMTpcXHR9XFxuMTYzMjpcXHRcXG4xNjMzOlxcdHZvaWQgenN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnlfdCBzd3ApXFxuMTYzNDpcXHR7XFxuMTYzNTpcXHRcXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcXG4xNjM2OlxcdFxcdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcXG4xNjM3OlxcdFxcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XFxuMTYzODpcXHRcXG4xNjM5OlxcdFxcdGlmICh4YV9lbXB0eSh0cmVlKSlcXG4xNjQwOlxcdFxcdFxcdHJldHVybjtcXG4xNjQxOlxcdFxcbjE2NDI6XFx0XFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQpO1xcbjE2NDM6XFx0XFx0aWYgKGVudHJ5KVxcbjE2NDQ6XFx0XFx0XFx0enN3YXBfZW50cnlfZnJlZShlbnRyeSk7XFxuMTY0NTpcXHR9XFxuMTY0NjpcXHRcXG4xNjQ3OlxcdGludCB6c3dhcF9zd2Fwb24oaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuMTY0ODpcXHR7XFxuMTY0OTpcXHRcXHRzdHJ1Y3QgeGFycmF5ICp0cmVlcywgKnRyZWU7XFxuMTY1MDpcXHRcXHR1bnNpZ25lZCBpbnQgbnIsIGk7XFxuMTY1MTpcXHRcXG4xNjUyOlxcdFxcdG5yID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTtcXG4xNjUzOlxcdFxcdHRyZWVzID0ga3Z6YWxsb2Nfb2JqcygqdHJlZSwgbnIpO1xcbjE2NTQ6XFx0XFx0aWYgKCF0cmVlcykge1xcbjE2NTU6XFx0XFx0XFx0cHJfZXJyKFxcXCJhbGxvYyBmYWlsZWQsIHpzd2FwIGRpc2FibGVkIGZvciBzd2FwIHR5cGUgJWRcXFxcblxcXCIsIHR5cGUpO1xcbjE2NTY6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuMTY1NzpcXHRcXHR9XFxuMTY1ODpcXHRcXG4xNjU5OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucjsgaSsrKVxcbjE2NjA6XFx0XFx0XFx0eGFfaW5pdCh0cmVlcyArIGkpO1xcbjE2NjE6XFx0XFxuMTY2MjpcXHRcXHRucl96c3dhcF90cmVlc1t0eXBlXSA9IG5yO1xcbjE2NjM6XFx0XFx0enN3YXBfdHJlZXNbdHlwZV0gPSB0cmVlcztcXG4xNjY0OlxcdFxcdHJldHVybiAwO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDo0NS45NDY0NjczNDNaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjM4NzM2ODY1MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5J3JlIG15IG93bjpcblxuKipJbnZlc3RpZ2F0aW5nIEtjb25maWcgZm9yIHpzd2FwKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgdG8gaXQuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgS2NvbmZpZyBmaWxlcyByZWxhdGVkIHRvIHpzd2FwLiBObyBmbHVmZiwgbGV0J3MgZ2V0IGRvd24gdG8gdGhlIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4gSSB3YW50IHRvIHNlZSBob3cgdGhpcyBmZWF0dXJlIGlzIGNvbnRyb2xsZWQgYW5kIHdoYXQgb3B0aW9ucyBhcmUgYXZhaWxhYmxlLiBXaGF0IGFyZSB0aGUgZGVwZW5kZW5jaWVzPyBBcmUgdGhlcmUgYW55IGhpZGRlbiBzZXR0aW5ncz8gQXJlIHRoZXJlIGFueSBpbnRlcmVzdGluZyB0aGluZ3MgSSBjYW4gZG8gd2l0aCBpdD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHVuZGVybHlpbmcgZnJhbWV3b3JrLCBob3cgdG8gZW5hYmxlL2Rpc2FibGUgaXQsIGFuZCB3aGF0IHZhcmlhYmxlcyBhcmUgYXQgcGxheSBoZXJlLiBUaGlzIGlzIHdoZXJlIHRoZSByZWFsIGtub3dsZWRnZSBpcywgYXQgdGhlIGNvbmZpZ3VyYXRpb24gbGV2ZWwuIExldCdzIHNlZSB3aGF0IHdlIGNhbiBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NTYyLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDo0OC4zMzM4Mzg4MTZaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NDc3MDgyNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgWlNXQVBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9MTI9bWVudWNvbmZpZyBTV0FQXFxuLS1cXG5tbS9LY29uZmlnLTIxLVxcbm1tL0tjb25maWc6MjI6Y29uZmlnIFpTV0FQXFxubW0vS2NvbmZpZy0yMy1cXHRib29sIFxcXCJDb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy0zNC1cXG5tbS9LY29uZmlnOjM1OmNvbmZpZyBaU1dBUF9ERUZBVUxUX09OXFxubW0vS2NvbmZpZy0zNi1cXHRib29sIFxcXCJFbmFibGUgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgYnkgZGVmYXVsdFxcXCJcXG4tLVxcbm1tL0tjb25maWctNDQtXFxubW0vS2NvbmZpZzo0NTpjb25maWcgWlNXQVBfU0hSSU5LRVJfREVGQVVMVF9PTlxcbm1tL0tjb25maWctNDYtXFx0Ym9vbCBcXFwiU2hyaW5rIHRoZSB6c3dhcCBwb29sIG9uIG1lbW9yeSBwcmVzc3VyZVxcXCJcXG4tLVxcbm1tL0tjb25maWc9NTk9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTc2LVxcbm1tL0tjb25maWc6Nzc6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9ERUZMQVRFXFxubW0vS2NvbmZpZy03OC1cXHRib29sIFxcXCJEZWZsYXRlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04Mi1cXG5tbS9LY29uZmlnOjgzOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFpPXFxubW0vS2NvbmZpZy04NC1cXHRib29sIFxcXCJMWk9cXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg4LVxcbm1tL0tjb25maWc6ODk6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF84NDJcXG5tbS9LY29uZmlnLTkwLVxcdGJvb2wgXFxcIjg0MlxcXCJcXG4tLVxcbm1tL0tjb25maWctOTQtXFxubW0vS2NvbmZpZzo5NTpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaNFxcbm1tL0tjb25maWctOTYtXFx0Ym9vbCBcXFwiTFo0XFxcIlxcbi0tXFxubW0vS2NvbmZpZy0xMDAtXFxubW0vS2NvbmZpZzoxMDE6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRIQ1xcbm1tL0tjb25maWctMTAyLVxcdGJvb2wgXFxcIkxaNEhDXFxcIlxcbi0tXFxubW0vS2NvbmZpZy0xMDYtXFxubW0vS2NvbmZpZzoxMDc6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9aU1REXFxubW0vS2NvbmZpZy0xMDgtXFx0Ym9vbCBcXFwienN0ZFxcXCJcXG4tLVxcbm1tL0tjb25maWc9MTEyPWVuZGNob2ljZVxcbm1tL0tjb25maWctMTEzLVxcbm1tL0tjb25maWc6MTE0OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRcXG5tbS9LY29uZmlnLTExNS0gICAgICAgc3RyaW5nXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM0OjQ4LjQ3ODY3ODg1M1oiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxODYzNzcyNzYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGl2aW5nIGludG8gdGhlIFpTV0FQIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSB3aXRoIHRoaXMgYFpTV0FQYCBjb25maWd1cmF0aW9uLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHN0cnVjdHVyZSB3aXRoaW4gdGhlIGtlcm5lbCdzIGJ1aWxkIHN5c3RlbS4gTGV0J3Mgc3RhcnQgYnkgbmF2aWdhdGluZyBkaXJlY3RseSB0byBgbW0vS2NvbmZpZ2AuIFRoYXQncyB3aGVyZSBJIGV4cGVjdCB0byBmaW5kIHRoZSByZWxldmFudCBkZWZpbml0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGZvciBtZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zLiBJJ20gc3BlY2lmaWNhbGx5IGxvb2tpbmcgZm9yIHRoZSBzZWN0aW9uIHJlbGF0ZWQgdG8gYGNvbmZpZyBaU1dBUGAuIEkgd2FudCB0byBzZWUgaG93IGl0J3MgZGVmaW5lZCwgd2hpY2ggb3RoZXIgY29uZmlndXJhdGlvbnMgaXQgZGVwZW5kcyBvbiwgYW5kIHdoYXQgdGhlIGRlZmF1bHQgc2V0dGluZ3MgbWlnaHQgYmUuIFRoaXMgd2lsbCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyBpdCB3aXRoaW4gYSBrZXJuZWwgY29uZmlndXJhdGlvbi4gS25vd2luZyB0aGUgYEtjb25maWdgIHN0cnVjdHVyZSBoZWxwcyBtZSBhc3Nlc3MgcG90ZW50aWFsIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjkyOTUsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDo1MC4zNDI0NTQ3MDRaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMwNjcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMTUsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMTU6XFx0XFx0ZGVmYXVsdCB5XFxuICAxNjpcXHRcXHRoZWxwXFxuICAxNzpcXHRcXHQgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY2hvb3NlIHdoZXRoZXIgeW91IHdhbnQgdG8gaGF2ZSBzdXBwb3J0XFxuICAxODpcXHRcXHQgIGZvciBzbyBjYWxsZWQgc3dhcCBkZXZpY2VzIG9yIHN3YXAgZmlsZXMgaW4geW91ciBrZXJuZWwgdGhhdCBhcmVcXG4gIDE5OlxcdFxcdCAgdXNlZCB0byBwcm92aWRlIG1vcmUgdmlydHVhbCBtZW1vcnkgdGhhbiB0aGUgYWN0dWFsIFJBTSBwcmVzZW50XFxuICAyMDpcXHRcXHQgIGluIHlvdXIgY29tcHV0ZXIuICBJZiB1bnN1cmUgc2F5IFkuXFxuICAyMTpcXHRcXG4gIDIyOlxcdGNvbmZpZyBaU1dBUFxcbiAgMjM6XFx0XFx0Ym9vbCBcXFwiQ29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1xcXCJcXG4gIDI0OlxcdFxcdGRlcGVuZHMgb24gU1dBUFxcbiAgMjU6XFx0XFx0c2VsZWN0IENSWVBUT1xcbiAgMjY6XFx0XFx0c2VsZWN0IFpTTUFMTE9DXFxuICAyNzpcXHRcXHRoZWxwXFxuICAyODpcXHRcXHQgIEEgbGlnaHR3ZWlnaHQgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcy4gIEl0IHRha2VzXFxuICAyOTpcXHRcXHQgIHBhZ2VzIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHN3YXBwZWQgb3V0IGFuZCBhdHRlbXB0cyB0b1xcbiAgMzA6XFx0XFx0ICBjb21wcmVzcyB0aGVtIGludG8gYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgUkFNLWJhc2VkIG1lbW9yeSBwb29sLlxcbiAgMzE6XFx0XFx0ICBUaGlzIGNhbiByZXN1bHQgaW4gYSBzaWduaWZpY2FudCBJL08gcmVkdWN0aW9uIG9uIHN3YXAgZGV2aWNlIGFuZCxcXG4gIDMyOlxcdFxcdCAgaW4gdGhlIGNhc2Ugd2hlcmUgZGVjb21wcmVzc2luZyBmcm9tIFJBTSBpcyBmYXN0ZXIgdGhhbiBzd2FwIGRldmljZVxcbiAgMzM6XFx0XFx0ICByZWFkcywgY2FuIGFsc28gaW1wcm92ZSB3b3JrbG9hZCBwZXJmb3JtYW5jZS5cXG4gIDM0OlxcdFxcbiAgMzU6XFx0Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cXG4gIDM2OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSB0aGUgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcyBieSBkZWZhdWx0XFxcIlxcbiAgMzc6XFx0XFx0ZGVwZW5kcyBvbiBaU1dBUFxcbiAgMzg6XFx0XFx0aGVscFxcbiAgMzk6XFx0XFx0ICBJZiBzZWxlY3RlZCwgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgd2lsbCBiZSBlbmFibGVkXFxuICA0MDpcXHRcXHQgIGF0IGJvb3QsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRpc2FibGVkLlxcbiAgNDE6XFx0XFxuICA0MjpcXHRcXHQgIFRoZSBzZWxlY3Rpb24gbWFkZSBoZXJlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHVzaW5nIHRoZSBrZXJuZWxcXG4gIDQzOlxcdFxcdCAgY29tbWFuZCBsaW5lICd6c3dhcC5lbmFibGVkPScgb3B0aW9uLlxcbiAgNDQ6XFx0XFxuICA0NTpcXHRjb25maWcgWlNXQVBfU0hSSU5LRVJfREVGQVVMVF9PTlxcbiAgNDY6XFx0XFx0Ym9vbCBcXFwiU2hyaW5rIHRoZSB6c3dhcCBwb29sIG9uIG1lbW9yeSBwcmVzc3VyZVxcXCJcXG4gIDQ3OlxcdFxcdGRlcGVuZHMgb24gWlNXQVBcXG4gIDQ4OlxcdFxcdGRlZmF1bHQgblxcbiAgNDk6XFx0XFx0aGVscFxcbiAgNTA6XFx0XFx0ICBJZiBzZWxlY3RlZCwgdGhlIHpzd2FwIHNocmlua2VyIHdpbGwgYmUgZW5hYmxlZCwgYW5kIHRoZSBwYWdlc1xcbiAgNTE6XFx0XFx0ICBzdG9yZWQgaW4gdGhlIHpzd2FwIHBvb2wgd2lsbCBiZWNvbWUgYXZhaWxhYmxlIGZvciByZWNsYWltIChpLmVcXG4gIDUyOlxcdFxcdCAgd3JpdHRlbiBiYWNrIHRvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlKSBvbiBtZW1vcnkgcHJlc3N1cmUuXFxuICA1MzpcXHRcXG4gIDU0OlxcdFxcdCAgVGhpcyBtZWFucyB0aGF0IHpzd2FwIHdyaXRlYmFjayBjb3VsZCBoYXBwZW4gZXZlbiBpZiB0aGUgcG9vbCBpc1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDo1MC4zNDI2ODgxMTRaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTgxNzIxMDkxMzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgWnN3YXAgUGF0Y2g6IFdvcnRoeSBvZiBGdXp6aW5nKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIGB6c3dhcF9zdG9yZSgpYCB3aXRoaW4gYG1tL3pzd2FwLmNgLCB3aGljaCBpbW1lZGlhdGVseSBmbGFncyB0aGlzIGFzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIG1ha2luZyBpdCBhbiBpbnRlcmVzdGluZyB0YXJnZXQuIExldCdzIGxvb2sgYXQgdGhlIHNwZWNpZmljcy5cblxuRmlyc3QsIHRoZXJlJ3MgYSBndWFyZCBjb25kaXRpb24gYWRkZWQ6IGBpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7YC4gVGhpcyBzZWVtcyB0byBiZSBhIHF1aWNrIGV4aXQgaWYgenN3YXAgd2Fzbid0IGVuYWJsZWQgaW4gdGhlIGZpcnN0IHBsYWNlLCBsaWtlbHkgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uIEl0IGFwcGVhcnMgdGhpcyBjaGVjayBhdm9pZHMgZG9pbmcgZXh0cmEgd29yayBpZiB6c3dhcCB3YXNuJ3QgY29uZmlndXJlZCwgdGh1cyBhdm9pZGluZyBwb3RlbnRpYWwgbG9jayBjb250ZW50aW9uIGFuZCBjaGVja2luZyBwcmV2aW91c2x5IHN0b3JlZCBpbnZhbGlkYXRpb25zLlxuXG5TZWNvbmQsIHRoZSBwYXRjaCByZXBsYWNlcyBhbiBleHBsaWNpdCBsb29wIGl0ZXJhdGluZyBhbmQgZXJhc2luZyBlbnRyaWVzIGZyb20gdGhlIHhhcnJheSB3aXRoIGEgY2FsbCB0byBgenN3YXBfaW52YWxpZGF0ZSgpYC4gVGhpcyBsb29rcyBsaWtlIGEgcmVmYWN0b3JpbmcuIERpZ2dpbmcgaW50byBgenN3YXBfaW52YWxpZGF0ZSgpYCwgaXQgZmlyc3QgY2hlY2tzIGlmIHRoZSB4YXJyYXkgaXMgZW1wdHkgYmVmb3JlIGF0dGVtcHRpbmcgYW4gZXJhc2UuIFRoaXMgaXMgbGlrZWx5IGludGVuZGVkIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYHpzd2FwYCBpcyBkaXNhYmxlZCwgYW5kIHRoaXMgYnJhbmNoIGlzIHNraXBwZWQuXG5cbkdpdmVuIHRoYXQgdGhpcyBhZmZlY3RzIGNvbnRyb2wgZmxvdyBhbmQgdGhlIHJlZmFjdG9yaW5nIG9mIHN3YXAgcGFnZSBpbnZhbGlkYXRpb24gd2l0aGluIGB6c3dhcF9zdG9yZWAsIGl0J3MgZGVmaW5pdGVseSBzb21ldGhpbmcgdGhhdCB3YXJyYW50cyBmdXp6aW5nLiBgenN3YXBgIGFuZCBgc3dhcGAgYXJlIGNvcmUgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCBtZWNoYW5pc21zIHdpdGhpbiB0aGUga2VybmVsLCBhbmQgdGhlIGBtbS9gIHN1YnN5c3RlbSBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBldmVuIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy5cblxuTm93LCBvbiB0byB0aGUgY29uZmlndXJhdGlvbi4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZnV6eiB0YXJnZXQgaW5jbHVkZXMgdGhlIHJlbGV2YW50IGNvbmZpZyBvcHRpb25zLiBUaGUga2V5IG9uZSBpcyBgWlNXQVBgLCB3aGljaCBsaXZlcyBpbiBgbW0vS2NvbmZpZ2AsIGFuZCB3aGljaCBkZXBlbmRzIG9uIGBTV0FQYC4gU28sIEknbGwgbmVlZCB0byBpbmNsdWRlIGJvdGggb2YgdGhlbS5cblxuTm93IGZvciBzeW1ib2wgYW5hbHlzaXMuIGB6c3dhcF9zdG9yZWAgaXMgdGhlIHByaW1hcnkgZnVuY3Rpb24gYmVpbmcgbW9kaWZpZWQuIGB6c3dhcF9pbnZhbGlkYXRlYCBpcyBjYWxsZWQsIGFuZCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAgaXMgYWxzbyBjYWxsZWQuIGB6c3dhcF9zdG9yZWAgaXMgdGhlIGtleSBlbnRyeXBvaW50IGZvciBhIHpzd2FwIHN0b3JhZ2Ugb3BlcmF0aW9uLiBJdCdzIG5vdCBhIGZ1bmN0aW9uIHRoYXQncyB1YmlxdWl0b3VzIGFjcm9zcyB0aGUga2VybmVsLCB3aGljaCBtYWtlcyBpdCBtb3JlIGZvY3VzZWQgYXMgYSB0YXJnZXQuIExpa2V3aXNlLCBgenN3YXBfaW52YWxpZGF0ZWAgYW5kIGB6c3dhcF9uZXZlcl9lbmFibGVkYCBzZWVtIHNwZWNpZmljIHRvIHRoZSBgenN3YXBgIHBhdGguIFNvIHRoZXNlIGFyZSBnb29kIGZvY3VzIHN5bWJvbHMuIEknbGwgbWFrZSBzdXJlIHRoZXkgYXJlIGFjY2Vzc2libGUgd2hlbiB0aGUgZnV6emVyIHJ1bnMuXG5cbkkgc2hvdWxkIGFsc28gZG91YmxlLWNoZWNrIHdoZXRoZXIgYHpzd2FwX3N0b3JlYCBpcyBleHBvcnRlZCwgc3RhdGljLCBvciBpZiBpdHMgZGVmaW5pdGlvbiBpcyBpbiBhIGhlYWRlciwgYnV0IGdpdmVuIGl0J3MgYSBgbW0vYCBmdW5jdGlvbiwgaXQncyBsaWtlbHkgdmlzaWJsZSB3aXRoaW4gdGhlIGtlcm5lbCwgc28gaXQgcHJvYmFibHkgZG9lc24ndCBuZWVkIHRvIGJlIGV4dGVybmFsbHkgZXhwb3J0ZWQuIEhvd2V2ZXIsIGNoZWNraW5nIGBpbmNsdWRlL2xpbnV4L3pzd2FwLmhgIGlzIGEgZ29vZCBwcmFjdGljZSB0byBlbnN1cmUgZXZlcnl0aGluZyBpcyB2aXNpYmxlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDA5NCwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc2MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjA4LjUxNDgwMDA1N1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI4MzczMjE2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInpzd2FwX3N0b3JlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9wYWdlX2lvLmM9MjA0PWludCBzd2FwX3dyaXRlb3V0KHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vcGFnZV9pby5jLTIzNy1cXG5tbS9wYWdlX2lvLmM6MjM4OlxcdGlmICh6c3dhcF9zdG9yZShmb2xpbykpIHtcXG5tbS9wYWdlX2lvLmMtMjM5LVxcdFxcdGNvdW50X210aHBfc3RhdChmb2xpb19vcmRlcihmb2xpbyksIE1USFBfU1RBVF9aU1dQT1VUKTtcXG4tLVxcbm1tL3pzd2FwLmMtNDYtLyogVGhlIG51bWJlciBvZiBwYWdlcyBjdXJyZW50bHkgc3RvcmVkIGluIHpzd2FwICovXFxubW0venN3YXAuYzo0NzphdG9taWNfbG9uZ190IHpzd2FwX3N0b3JlZF9wYWdlcyA9IEFUT01JQ19MT05HX0lOSVQoMCk7XFxubW0venN3YXAuYy00OC0vKiBUaGUgbnVtYmVyIG9mIGluY29tcHJlc3NpYmxlIHBhZ2VzIGN1cnJlbnRseSBzdG9yZWQgaW4genN3YXAgKi9cXG5tbS96c3dhcC5jOjQ5OnN0YXRpYyBhdG9taWNfbG9uZ190IHpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyA9IEFUT01JQ19MT05HX0lOSVQoMCk7XFxubW0venN3YXAuYy01MC1cXG4tLVxcbm1tL3pzd2FwLmM9NzU1PXN0YXRpYyB2b2lkIHpzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSlcXG4tLVxcbm1tL3pzd2FwLmMtNzY0LVxcdGlmIChlbnRyeS1cXHUwMDNlbGVuZ3RoID09IFBBR0VfU0laRSlcXG5tbS96c3dhcC5jOjc2NTpcXHRcXHRhdG9taWNfbG9uZ19kZWMoXFx1MDAyNnpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyk7XFxubW0venN3YXAuYy03NjYtXFx0enN3YXBfZW50cnlfY2FjaGVfZnJlZShlbnRyeSk7XFxubW0venN3YXAuYzo3Njc6XFx0YXRvbWljX2xvbmdfZGVjKFxcdTAwMjZ6c3dhcF9zdG9yZWRfcGFnZXMpO1xcbm1tL3pzd2FwLmMtNzY4LX1cXG4tLVxcbm1tL3pzd2FwLmM9OTEzPXN0YXRpYyBib29sIHpzd2FwX2RlY29tcHJlc3Moc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3pzd2FwLmMtOTcwLSAqIHRvIHRoZSBzd2FwIGRldmljZS4gIFdlIGFyZSBiYXNpY2FsbHkgcmVzdW1pbmcgdGhlIHNhbWUgc3dhcFxcbm1tL3pzd2FwLmM6OTcxOiAqIHdyaXRlYmFjayBwYXRoIHRoYXQgd2FzIGludGVyY2VwdGVkIHdpdGggdGhlIHpzd2FwX3N0b3JlKClcXG5tbS96c3dhcC5jLTk3Mi0gKiBpbiB0aGUgZmlyc3QgcGxhY2UuICBBZnRlciB0aGUgZm9saW8gaGFzIGJlZW4gZGVjb21wcmVzc2VkIGludG9cXG4tLVxcbm1tL3pzd2FwLmM9MTE4MT1zdGF0aWMgdW5zaWduZWQgbG9uZyB6c3dhcF9zaHJpbmtlcl9jb3VudChzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyLFxcbi0tXFxubW0venN3YXAuYy0xMjE1LVxcdFxcdG5yX2JhY2tpbmcgPSB6c3dhcF90b3RhbF9wYWdlcygpO1xcbm1tL3pzd2FwLmM6MTIxNjpcXHRcXHRucl9zdG9yZWQgPSBhdG9taWNfbG9uZ19yZWFkKFxcdTAwMjZ6c3dhcF9zdG9yZWRfcGFnZXMpO1xcbm1tL3pzd2FwLmMtMTIxNy1cXHR9XFxuLS1cXG5tbS96c3dhcC5jPTEzMDY9c3RhdGljIHZvaWQgc2hyaW5rX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpXFxuLS1cXG5tbS96c3dhcC5jLTEzOTYtXFxubW0venN3YXAuYzoxMzk3OnN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgbG9uZyBpbmRleCxcXG5tbS96c3dhcC5jLTEzOTgtXFx0XFx0XFx0ICAgICBzdHJ1Y3Qgb2JqX2Nncm91cCAqb2JqY2csXFxuLS1cXG5tbS96c3dhcC5jLTE0MzYtXFx0ICogbm8gZnVydGhlciBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlLiBHcmFiIHJlZnMgdG8gdGhlIHBvb2wgYW5kIG9iamNnLFxcbm1tL3pzd2FwLmM6MTQzNzpcXHQgKiBjaGFyZ2UgenN3YXAgbWVtb3J5LCBhbmQgaW5jcmVtZW50IHpzd2FwX3N0b3JlZF9wYWdlcy5cXG5tbS96c3dhcC5jLTE0MzgtXFx0ICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpXFxuLS1cXG5tbS96c3dhcC5jLTE0NDUtXFx0fVxcbm1tL3pzd2FwLmM6MTQ0NjpcXHRhdG9taWNfbG9uZ19pbmMoXFx1MDAyNnpzd2FwX3N0b3JlZF9wYWdlcyk7XFxubW0venN3YXAuYy0xNDQ3LVxcdGlmIChlbnRyeS1cXHUwMDNlbGVuZ3RoID09IFBBR0VfU0laRSlcXG5tbS96c3dhcC5jOjE0NDg6XFx0XFx0YXRvbWljX2xvbmdfaW5jKFxcdTAwMjZ6c3dhcF9zdG9yZWRfaW5jb21wcmVzc2libGVfcGFnZXMpO1xcbm1tL3pzd2FwLmMtMTQ0OS1cXG4tLVxcbm1tL3pzd2FwLmMtMTQ3Ny1cXG5tbS96c3dhcC5jOjE0Nzg6Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbm1tL3pzd2FwLmMtMTQ3OS17XFxuLS1cXG5tbS96c3dhcC5jLTE1MjMtXFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFxcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpIHtcXG5tbS96c3dhcC5jOjE1MjQ6XFx0XFx0aWYgKCF6c3dhcF9zdG9yZV9wYWdlKGZvbGlvLCBpbmRleCwgb2JqY2csIHBvb2wpKVxcbm1tL3pzd2FwLmMtMTUyNS1cXHRcXHRcXHRnb3RvIHB1dF9wb29sO1xcbi0tXFxubW0venN3YXAuYz0xNjk5PXN0YXRpYyBpbnQgZGVidWdmc19nZXRfc3RvcmVkX3BhZ2VzKHZvaWQgKmRhdGEsIHU2NCAqdmFsKVxcbm1tL3pzd2FwLmMtMTcwMC17XFxubW0venN3YXAuYzoxNzAxOlxcdCp2YWwgPSBhdG9taWNfbG9uZ19yZWFkKFxcdTAwMjZ6c3dhcF9zdG9yZWRfcGFnZXMpO1xcbm1tL3pzd2FwLmMtMTcwMi1cXHRyZXR1cm4gMDtcXG4tLVxcbm1tL3pzd2FwLmM9MTcwNj1zdGF0aWMgaW50IGRlYnVnZnNfZ2V0X3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyh2b2lkICpkYXRhLCB1NjQgKnZhbClcXG5tbS96c3dhcC5jLTE3MDcte1xcbm1tL3pzd2FwLmM6MTcwODpcXHQqdmFsID0gYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2enN3YXBfc3RvcmVkX2luY29tcHJlc3NpYmxlX3BhZ2VzKTtcXG5tbS96c3dhcC5jLTE3MDktXFx0cmV0dXJuIDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjA4Ljc0MzE4MzYyM1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzkyNjI2MjAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcyBvbiB0aGlzOlxuXG4qKkV4YW1pbmluZyBac3dhcCBEZWNsYXJhdGlvbnMqKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIG9mIHpzd2FwLiBUaGF0IG1lYW5zIEkgc2hvdWxkIGltbWVkaWF0ZWx5IHR1cm4gdG8gdGhlIHNvdXJjZSBjb2RlLCBzcGVjaWZpY2FsbHkgYGluY2x1ZGUvbGludXgvenN3YXAuaGAuIFRoYXQgaGVhZGVyIGZpbGUgaXMgKnRoZSogcGxhY2UgdG8gZmluZCB0aGUgZXNzZW50aWFsIGRhdGEgc3RydWN0dXJlcywgZnVuY3Rpb24gcHJvdG90eXBlcywgYW5kIGFueSBrZXkgbWFjcm8gZGVmaW5pdGlvbnMgcmVsYXRlZCB0byB6c3dhcCdzIGludGVybmFsIHdvcmtpbmdzLiBCeSBleGFtaW5pbmcgdGhlIGRlY2xhcmF0aW9ucyB0aGVyZSwgSSBjYW4gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhpcyBjb21wcmVzc2lvbiBhbmQgc3dhcHBpbmcgbWVjaGFuaXNtIGlzIGFyY2hpdGVjdGVkLiBJJ20gbG9va2luZyBmb3IgdGhlIGNvcmUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgbWFuYWdlIHRoZSBjb21wcmVzc2VkIHBhZ2VzLCBob3cgdGhleSdyZSBzdG9yZWQsIHdoYXQgbG9ja3MgYXJlIHVzZWQsIGFuZCB0aGUgaW50ZXJmYWNlcyBpbnZvbHZlZCBpbiB0aGUgY29tcHJlc3Npb24sIGRlY29tcHJlc3Npb24sIGFuZCBzd2FwcGluZyBvcGVyYXRpb25zLiBJdCdzIHRpbWUgdG8gZGlnIGluIGFuZCBnZXQgYSBmaXJtIGdyYXNwIG9mIHRoZSBmb3VuZGF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjcwMSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjExLjEzNTgxNDM3NloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzQyMzIzNDE0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInpzd2FwX3N0b3JlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvenN3YXAuaD04PXN0cnVjdCBscnV2ZWM7XFxuaW5jbHVkZS9saW51eC96c3dhcC5oLTktXFxuaW5jbHVkZS9saW51eC96c3dhcC5oOjEwOmV4dGVybiBhdG9taWNfbG9uZ190IHpzd2FwX3N0b3JlZF9wYWdlcztcXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtMTEtXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg9Mjc9dW5zaWduZWQgbG9uZyB6c3dhcF90b3RhbF9wYWdlcyh2b2lkKTtcXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg6Mjg6Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtMjktaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg9NDA9c3RydWN0IHpzd2FwX2xydXZlY19zdGF0ZSB7fTtcXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtNDEtXFxuaW5jbHVkZS9saW51eC96c3dhcC5oOjQyOnN0YXRpYyBpbmxpbmUgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmluY2x1ZGUvbGludXgvenN3YXAuaC00My17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjExLjQ3ODE0MzM1WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNjczMzY3MjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOlxuXG4qKkludmVzdGlnYXRpbmcgYHN3YXBfd3JpdGVvdXRgKipcblxuT2theSwgdGltZSB0byBkaXZlIGluLiBJIG5lZWQgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0IGBzd2FwX3dyaXRlb3V0YCwgYW5kIGJhc2VkIG9uIG15IG1lbW9yeSwgdGhhdCdzIHByb2JhYmx5IHJlc2lkaW5nIGluIGBtbS9wYWdlX2lvLmNgLiBMZXQncyBnZXQgY3JhY2tpbmcgYW5kIGNvbmZpcm0gdGhhdCBteSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgbG9jYXRpb24gYXJlIGFjY3VyYXRlLiBUaGlzIGlzIHdoZXJlIEknbGwgZmluZCB0aGUgY29yZSBsb2dpYyBmb3Igd3JpdGluZyBvdXQgcGFnZXMgdG8gc3dhcCBzcGFjZSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgaXQgZnVuY3Rpb25zLCBlc3BlY2lhbGx5IGluIHJlbGF0aW9uIHRvIHRoZSBvdmVyYWxsIHBhZ2UgcmVjbGFpbSBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzE1MiwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjEzLjY0NTQ4NTE1NloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzc0NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vcGFnZV9pby5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIzMCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDIzMDpcXHRcXG4gMjMxOlxcdFxcdC8qXFxuIDIzMjpcXHRcXHQgKiBDbGVhciBiaXRzIHRoaXMgZm9saW8gb2NjdXBpZXMgaW4gdGhlIHplcm9tYXAgdG8gcHJldmVudCB6ZXJvIGRhdGFcXG4gMjMzOlxcdFxcdCAqIGJlaW5nIHJlYWQgaW4gZnJvbSBhbnkgcHJldmlvdXMgemVybyB3cml0ZXMgdGhhdCBvY2N1cGllZCB0aGUgc2FtZVxcbiAyMzQ6XFx0XFx0ICogc3dhcCBlbnRyaWVzLlxcbiAyMzU6XFx0XFx0ICovXFxuIDIzNjpcXHRcXHRzd2FwX3plcm9tYXBfZm9saW9fY2xlYXIoZm9saW8pO1xcbiAyMzc6XFx0XFxuIDIzODpcXHRcXHRpZiAoenN3YXBfc3RvcmUoZm9saW8pKSB7XFxuIDIzOTpcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoZm9saW9fb3JkZXIoZm9saW8pLCBNVEhQX1NUQVRfWlNXUE9VVCk7XFxuIDI0MDpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIDI0MTpcXHRcXHR9XFxuIDI0MjpcXHRcXG4gMjQzOlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gMjQ0OlxcdFxcdGlmICghbWVtX2Nncm91cF96c3dhcF93cml0ZWJhY2tfZW5hYmxlZChmb2xpb19tZW1jZyhmb2xpbykpKSB7XFxuIDI0NTpcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gMjQ2OlxcdFxcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbiAyNDc6XFx0XFx0XFx0cmV0dXJuIEFPUF9XUklURVBBR0VfQUNUSVZBVEU7XFxuIDI0ODpcXHRcXHR9XFxuIDI0OTpcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6MTMuNjQ1NjY3NjM2WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ4NjgxNDA5NzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgZm9jdXMuIEl0IGxvb2tzIGxpa2UgdGhlIGNvcmUgbW9kaWZpY2F0aW9uIGNlbnRlcnMgYXJvdW5kIGB6c3dhcF9zdG9yZWAsIHRoZSBmdW5jdGlvbiBiZWluZyBkaXJlY3RseSBhbHRlcmVkLiBgenN3YXBfaW52YWxpZGF0ZWAgaXMgdGhlIGhlbHBlciB0aGV5J3JlIHVzaW5nIHRvIHJlcGxhY2UgdGhlIG9wZW4tY29kZWQgdHJlZSBlcmFzdXJlIGxvZ2ljLCB3aGljaCBpcyBnb29kIGZvciBtYWludGFpbmFiaWxpdHkuIEFuZCBqdXN0IHRvIGJlIHN1cmUsIGBzd2FwX3dyaXRlb3V0YCBpcyB0aGUgY2FsbGVyIG9mIGB6c3dhcF9zdG9yZWAuIFNvbGlkLlxuXG5OZXh0LCBJIGhhdmUgdG8gZW5zdXJlIHRoZSBwcm9wZXIgY29uZmlndXJhdGlvbnMgYXJlIGluIHBsYWNlIGZvciB0aGUgZnV6emVyIHRvIGVuZ2FnZSB3aXRoIHRoaXMgY2hhbmdlLiBJdCBsb29rcyBsaWtlIGBaU1dBUGAgaXMgdGhlIG1haW4gY29uZmlndXJhdGlvbiBpdGVtLCB3aXRoIGBTV0FQYCBhcyBpdHMgZGVwZW5kZW5jeS4gVGhhdCBhbGlnbnMgd2l0aCBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzeXN0ZW0uXG5cbk5vdywgbGV0J3MgcmV2aWV3IHRoZSBwYXJhbWV0ZXJzIGZvciBgc2V0LXJlc3VsdHNgLiBUaGUgYFdvcnRoRnV6emluZ2AgZmxhZyBuZWVkcyB0byBiZSBzZXQgdG8gYHRydWVgLCBhbmQgb2YgY291cnNlIGl0IGlzLiBUaGUgYFJlYXNvbmluZ2Agc2hvdWxkIHN1Y2NpbmN0bHkgb3V0bGluZSB3aGF0J3MgaGFwcGVuaW5nLiBUaGUgcGF0Y2ggc2VlbXMgdG8gbW9kaWZ5IGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBgenN3YXBfc3RvcmVgLCBhZGRpbmcgYSBzaG9ydC1jaXJjdWl0IGNoZWNrIHRocm91Z2ggYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgYW5kIHRoZW4gcmVmYWN0b3JpbmcgdGhlIHN3YXAgcGFnZSBpbnZhbGlkYXRpb24gdG8gdXNlIGB6c3dhcF9pbnZhbGlkYXRlKClgLiBUaGUgY2hhbmdlcyBhcmUgYWxzbyByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHdpdGggc3dhcC96c3dhcCBjb25maWd1cmVkIHdoaWNoIGlzIGEgY3J1Y2lhbCBwb2ludCBmb3IgZnV6emluZy4gVGhlIGBGb2N1c1N5bWJvbHNgIGFyZSBjbGVhcmx5IGRlZmluZWQgYXMgYHpzd2FwX3N0b3JlYCBhbmQgYHpzd2FwX2ludmFsaWRhdGVgLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBhbmQgc3BlY2lmaWMuIExhc3RseSwgYEVuYWJsZUNvbmZpZ3NgIG5lZWRzIHRvIGxpc3QgYFpTV0FQYCBhbmQgYFNXQVBgICh3aXRob3V0IHRoZSBgQ09ORklHX2AgcHJlZml4LCBvZiBjb3Vyc2UpLlxuXG5Pa2F5LCBsZXQncyBwZXJmb3JtIGEgcXVpY2sgc2FuaXR5IGNoZWNrLiBgV29ydGhGdXp6aW5nOiB0cnVlYCwgY2hlY2suIGBGb2N1c1N5bWJvbHM6IHpzd2FwX3N0b3JlLCB6c3dhcF9pbnZhbGlkYXRlYCAtLSBub24tdWJpcXVpdG91cywgZGlyZWN0bHkgcmVsZXZhbnQgc3ltYm9scywgY2hlY2suIGBFbmFibGVDb25maWdzOiBaU1dBUCwgU1dBUGAsIHllcCwgdGhhdOKAmXMgcmlnaHQsIGNoZWNrLiBUaGUgYFJlYXNvbmluZ2AgaXMgY29uY2lzZSBhbmQgZWFzeSB0byB1bmRlcnN0YW5kLCBjaGVjay5cblxuRXZlcnl0aGluZyBjaGVja3Mgb3V0LiBJJ20gc2F0aXNmaWVkIHRoYXQgdGhpcyBwYXRjaCB3YXJyYW50cyBmdXp6aW5nLiBUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM2MzgsIk91dHB1dFRva2VucyI6MTI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzE4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6MTguNTEzODEyODE5WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjAxMjA3Njg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJaU1dBUFwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX3N0b3JlXCIsXG4gICAgXCJ6c3dhcF9pbnZhbGlkYXRlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS96c3dhcC5jIGJ5IGFkZGluZyBhbiBlYXJseS1leGl0IGNoZWNrIGluIHpzd2FwX3N0b3JlKCkgd2hlbiB6c3dhcCBoYXMgbmV2ZXIgYmVlbiBlbmFibGVkLCBhbmQgcmVmYWN0b3JpbmcgdGhlIGVycm9yL2Rpc2FibGVkIGZhbGxiYWNrIGxvb3AgdG8gdXNlIHpzd2FwX2ludmFsaWRhdGUoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBzd2Fwb3V0L3pzd2FwIGxvZ2ljIGFuZCBhcmUgZGlyZWN0bHkgcmVhY2hhYmxlIGFuZCB0ZXN0YWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiWlNXQVBcIixcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6c3dhcF9zdG9yZVwiLFxuICAgIFwienN3YXBfaW52YWxpZGF0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgaW4gbW0venN3YXAuYyBieSBhZGRpbmcgYW4gZWFybHktZXhpdCBjaGVjayBpbiB6c3dhcF9zdG9yZSgpIHdoZW4genN3YXAgaGFzIG5ldmVyIGJlZW4gZW5hYmxlZCwgYW5kIHJlZmFjdG9yaW5nIHRoZSBlcnJvci9kaXNhYmxlZCBmYWxsYmFjayBsb29wIHRvIHVzZSB6c3dhcF9pbnZhbGlkYXRlKCkuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IGNvcmUgc3dhcG91dC96c3dhcCBsb2dpYyBhbmQgYXJlIGRpcmVjdGx5IHJlYWNoYWJsZSBhbmQgdGVzdGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNToxOC43MTUwNTgwMDZaIiwiU2VxIjoyNSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMxMzQ5MTk2NDY1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6MTguNzE1ODM4Njc2WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzEzNDg0MTA4ODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYW4gZWFybHktcmV0dXJuIGNoZWNrIHVzaW5nIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGluIGB6c3dhcF9zdG9yZSgpYCBhbmQgcmVmYWN0b3JzIG9wZW4tY29kZWQgenN3YXAgdHJlZSBpbnZhbGlkYXRpb24gbG9naWMgb24gc3RvcmUgZmFpbHVyZSB0byByZXVzZSBgenN3YXBfaW52YWxpZGF0ZSgpYC4gTm8gbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgb3BlcmF0aW9ucyBhcmUgaW50cm9kdWNlZCBvciBhbHRlcmVkLiBObyBjb25kaXRpb25hbCBsb2dpYyByZWxpZXMgb24gdW5pbml0aWFsaXplZCBkYXRhLiBBbnkgbWVtb3J5IHNhZmV0eSBjb25jZXJucyBpbiB0aGlzIHN3YXAgcGF0aCAoc3VjaCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG9yIGxvY2tpbmcgZXJyb3JzKSBhcmUgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2Vycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGtlcm5lbC10by11c2VyIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2N2NlYTY5ZWM2NGNjOWNlNWNiZjQ2OTQzMDc4NmZiMzQ0ZmJkNWJlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBTZXAgOSAxMzozNDoxNyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCA1ZDBkOGJkNzIxOTNhLi5mYzZjNWUwZGI1ZTQzIDEwMDY0NFxuLS0tIGEvbW0venN3YXAuY1xuKysrIGIvbW0venN3YXAuY1xuQEAgLTE0ODgsNiArMTQ4OCw5IEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pKTtcbiBcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKTtcbiBcbitcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbiBcdGlmICghenN3YXBfZW5hYmxlZClcbiBcdFx0Z290byBjaGVja19vbGQ7XG4gXG5AQCAtMTU0NSwxNSArMTU0OCwxMCBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRpZiAoIXJldCkge1xuIFx0XHR1bnNpZ25lZCB0eXBlID0gc3dwX3R5cGUoc3dwKTtcbiBcdFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XG4tXHRcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4tXHRcdHN0cnVjdCB4YXJyYXkgKnRyZWU7XG4tXG4tXHRcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpIHtcbi1cdFx0XHR0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgKyBpbmRleCkpO1xuLVx0XHRcdGVudHJ5ID0geGFfZXJhc2UodHJlZSwgb2Zmc2V0ICsgaW5kZXgpO1xuLVx0XHRcdGlmIChlbnRyeSlcbi1cdFx0XHRcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuLVx0XHR9XG4rXG4rXHRcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpXG4rXHRcdFx0enN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICsgaW5kZXgpKTtcbitcbiBcdH1cbiBcbiBcdHJldHVybiByZXQ7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNToxOC43MTU4NDA0MjZaIiwiU2VxIjoyNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzcyNjg5MTczOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuXG5cbioqQW5hbHl6aW5nIGBtbS96c3dhcC5jYCAtIFRpbWUgdG8gRGl2ZSBJbioqXG5cbkFscmlnaHQsIHRpbWUgdG8gcm9sbCB1cCBteSBzbGVldmVzIGFuZCBkaXNzZWN0IHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBzdGFydCBieSB6ZXJvaW5nIGluIG9uIGBtbS96c3dhcC5jYCwgcGFydGljdWxhcmx5IGFyb3VuZCBsaW5lIDE0ODguIEknbSBnb2luZyB0byBsZXZlcmFnZSB0aGUgdG9vbHMgYXQgbXkgZGlzcG9zYWwg4oCTIGByZWFkLWZpbGVgIGlzIGFsd2F5cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQsIGJ1dCBJIG1pZ2h0IGp1c3QgZ28gc3RyYWlnaHQgZm9yIGBncmVwcGVyYCBpZiBJIHN1c3BlY3QgYSBzcGVjaWZpYyBmdW5jdGlvbiBvciB2YXJpYWJsZSBpcyB0aGUga2V5LiBOZWVkIHRvIGdldCBhIGZlZWwgZm9yIHRoZSBjb250ZXh0IHN1cnJvdW5kaW5nIHRoYXQgbGluZSDigJMgc2VlIHRoZSBmdW5jdGlvbiBjYWxscywgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCB0aGUgd2hvbGUgc2hlYmFuZy4gR290dGEgdW5kZXJzdGFuZCBob3cgdGhpcyBwYXRjaCBpbnRlcmFjdHMgd2l0aCB0aGUgZXhpc3RpbmcgenN3YXAgaW1wbGVtZW50YXRpb24uIExldCdzIHNlZSB3aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjgwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjIsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNToyNi40NDI3MzYyODRaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg2NjEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3pzd2FwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTQ3NSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE0NzU6XFx0XFx0cmV0dXJuIGZhbHNlO1xcbjE0NzY6XFx0fVxcbjE0Nzc6XFx0XFxuMTQ3ODpcXHRib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuMTQ3OTpcXHR7XFxuMTQ4MDpcXHRcXHRsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xcbjE0ODE6XFx0XFx0c3dwX2VudHJ5X3Qgc3dwID0gZm9saW8tXFx1MDAzZXN3YXA7XFxuMTQ4MjpcXHRcXHRzdHJ1Y3Qgb2JqX2Nncm91cCAqb2JqY2cgPSBOVUxMO1xcbjE0ODM6XFx0XFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDtcXG4xNDg0OlxcdFxcdHN0cnVjdCB6c3dhcF9wb29sICpwb29sO1xcbjE0ODU6XFx0XFx0Ym9vbCByZXQgPSBmYWxzZTtcXG4xNDg2OlxcdFxcdGxvbmcgaW5kZXg7XFxuMTQ4NzpcXHRcXG4xNDg4OlxcdFxcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pKTtcXG4xNDg5OlxcdFxcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKTtcXG4xNDkwOlxcdFxcbjE0OTE6XFx0XFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcXG4xNDkyOlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4xNDkzOlxcdFxcbjE0OTQ6XFx0XFx0aWYgKCF6c3dhcF9lbmFibGVkKVxcbjE0OTU6XFx0XFx0XFx0Z290byBjaGVja19vbGQ7XFxuMTQ5NjpcXHRcXG4xNDk3OlxcdFxcdG9iamNnID0gZ2V0X29ial9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XFxuMTQ5ODpcXHRcXHRpZiAob2JqY2cgXFx1MDAyNlxcdTAwMjYgIW9ial9jZ3JvdXBfbWF5X3pzd2FwKG9iamNnKSkge1xcbjE0OTk6XFx0XFx0XFx0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX29iamNnKG9iamNnKTtcXG4xNTAwOlxcdFxcdFxcdGlmIChzaHJpbmtfbWVtY2cobWVtY2cpKSB7XFxuMTUwMTpcXHRcXHRcXHRcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuMTUwMjpcXHRcXHRcXHRcXHRnb3RvIHB1dF9vYmpjZztcXG4xNTAzOlxcdFxcdFxcdH1cXG4xNTA0OlxcdFxcdFxcdG1lbV9jZ3JvdXBfcHV0KG1lbWNnKTtcXG4xNTA1OlxcdFxcdH1cXG4xNTA2OlxcdFxcbjE1MDc6XFx0XFx0aWYgKHpzd2FwX2NoZWNrX2xpbWl0cygpKVxcbjE1MDg6XFx0XFx0XFx0Z290byBwdXRfb2JqY2c7XFxuMTUwOTpcXHRcXG4xNTEwOlxcdFxcdHBvb2wgPSB6c3dhcF9wb29sX2N1cnJlbnRfZ2V0KCk7XFxuMTUxMTpcXHRcXHRpZiAoIXBvb2wpXFxuMTUxMjpcXHRcXHRcXHRnb3RvIHB1dF9vYmpjZztcXG4xNTEzOlxcdFxcbjE1MTQ6XFx0XFx0aWYgKG9iamNnKSB7XFxuMTUxNTpcXHRcXHRcXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fb2JqY2cob2JqY2cpO1xcbjE1MTY6XFx0XFx0XFx0aWYgKG1lbWNnX2xpc3RfbHJ1X2FsbG9jKG1lbWNnLCBcXHUwMDI2enN3YXBfbGlzdF9scnUsIEdGUF9LRVJORUwpKSB7XFxuMTUxNzpcXHRcXHRcXHRcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuMTUxODpcXHRcXHRcXHRcXHRnb3RvIHB1dF9wb29sO1xcbjE1MTk6XFx0XFx0XFx0fVxcbjE1MjA6XFx0XFx0XFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xcbjE1MjE6XFx0XFx0fVxcbjE1MjI6XFx0XFxuMTUyMzpcXHRcXHRmb3IgKGluZGV4ID0gMDsgaW5kZXggXFx1MDAzYyBucl9wYWdlczsgKytpbmRleCkge1xcbjE1MjQ6XFx0XFx0XFx0aWYgKCF6c3dhcF9zdG9yZV9wYWdlKGZvbGlvLCBpbmRleCwgb2JqY2csIHBvb2wpKVxcbjE1MjU6XFx0XFx0XFx0XFx0Z290byBwdXRfcG9vbDtcXG4xNTI2OlxcdFxcdH1cXG4xNTI3OlxcdFxcbjE1Mjg6XFx0XFx0aWYgKG9iamNnKVxcbjE1Mjk6XFx0XFx0XFx0Y291bnRfb2JqY2dfZXZlbnRzKG9iamNnLCBaU1dQT1VULCBucl9wYWdlcyk7XFxuMTUzMDpcXHRcXG4xNTMxOlxcdFxcdGNvdW50X3ZtX2V2ZW50cyhaU1dQT1VULCBucl9wYWdlcyk7XFxuMTUzMjpcXHRcXG4xNTMzOlxcdFxcdHJldCA9IHRydWU7XFxuMTUzNDpcXHRcXG4xNTM1OlxcdHB1dF9wb29sOlxcbjE1MzY6XFx0XFx0enN3YXBfcG9vbF9wdXQocG9vbCk7XFxuMTUzNzpcXHRwdXRfb2JqY2c6XFxuMTUzODpcXHRcXHRvYmpfY2dyb3VwX3B1dChvYmpjZyk7XFxuMTUzOTpcXHRcXHRpZiAoIXJldCBcXHUwMDI2XFx1MDAyNiB6c3dhcF9wb29sX3JlYWNoZWRfZnVsbClcXG4xNTQwOlxcdFxcdFxcdHF1ZXVlX3dvcmsoc2hyaW5rX3dxLCBcXHUwMDI2enN3YXBfc2hyaW5rX3dvcmspO1xcbjE1NDE6XFx0Y2hlY2tfb2xkOlxcbjE1NDI6XFx0XFx0LypcXG4xNTQzOlxcdFxcdCAqIElmIHRoZSB6c3dhcCBzdG9yZSBmYWlscyBvciB6c3dhcCBpcyBkaXNhYmxlZCwgd2UgbXVzdCBpbnZhbGlkYXRlXFxuMTU0NDpcXHRcXHQgKiB0aGUgcG9zc2libHkgc3RhbGUgZW50cmllcyB3aGljaCB3ZXJlIHByZXZpb3VzbHkgc3RvcmVkIGF0IHRoZVxcbjE1NDU6XFx0XFx0ICogb2Zmc2V0cyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggcGFnZSBvZiB0aGUgZm9saW8uIE90aGVyd2lzZSxcXG4xNTQ2OlxcdFxcdCAqIHdyaXRlYmFjayBjb3VsZCBvdmVyd3JpdGUgdGhlIG5ldyBkYXRhIGluIHRoZSBzd2FwZmlsZS5cXG4xNTQ3OlxcdFxcdCAqL1xcbjE1NDg6XFx0XFx0aWYgKCFyZXQpIHtcXG4xNTQ5OlxcdFxcdFxcdHVuc2lnbmVkIHR5cGUgPSBzd3BfdHlwZShzd3ApO1xcbjE1NTA6XFx0XFx0XFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XFxuMTU1MTpcXHRcXG4xNTUyOlxcdFxcdFxcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KVxcbjE1NTM6XFx0XFx0XFx0XFx0enN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICsgaW5kZXgpKTtcXG4xNTU0OlxcdFxcbjE1NTU6XFx0XFx0fVxcbjE1NTY6XFx0XFxuMTU1NzpcXHRcXHRyZXR1cm4gcmV0O1xcbjE1NTg6XFx0fVxcbjE1NTk6XFx0XFxuMTU2MDpcXHQvKipcXG4xNTYxOlxcdCAqIHpzd2FwX2xvYWQoKSAtIGxvYWQgYSBmb2xpbyBmcm9tIHpzd2FwXFxuMTU2MjpcXHQgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcXG4xNTYzOlxcdCAqXFxuMTU2NDpcXHQgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgd2l0aCB0aGUgZm9saW8gdW5sb2NrZWQgYW5kIG1hcmtlZCB1cC10by1kYXRlLCBvciBvbmVcXG4xNTY1OlxcdCAqIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6XFxuMTU2NjpcXHQgKlxcbjE1Njc6XFx0ICogIC1FSU86IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCwgYnV0IGNvdWxkIG5vdCBiZSBsb2FkZWRcXG4xNTY4OlxcdCAqICBpbnRvIHRoZSBwYWdlIGR1ZSB0byBhIGRlY29tcHJlc3Npb24gZmFpbHVyZS4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXRcXG4xNTY5OlxcdCAqICBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKVxcbjE1NzA6XFx0ICogIHdpbGwgU0lHQlVTKS5cXG4xNTcxOlxcdCAqXFxuMTU3MjpcXHQgKiAgLUVJTlZBTDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgdGhlIHBhZ2UgYmVsb25nc1xcbjE1NzM6XFx0ICogIHRvIGEgbGFyZ2UgZm9saW8sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgenN3YXAuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCxcXG4xNTc0OlxcdCAqICBidXQgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6MjYuNDQyOTI1NjI0WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM1OTk3NDcwMzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgcHJlc2VudGVkIGFzIG15IG93biBtZW50YWwgcHJvY2VzcywgZ2l2ZW4gbXkgZXhwZXJ0aXNlOlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byB6c3dhcCBDb25maWd1cmF0aW9uKipcblxuQWxyaWdodCwgc28gd2UncmUgbG9va2luZyBhdCBgbW0venN3YXAuY2AgYWdhaW4uIEkgbmVlZCB0byByZWZyZXNoIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGZpbmVyIHBvaW50cywgYW5kIEknbSBzcGVjaWZpY2FsbHkgZHJhd24gdG8gdGhvc2UgdHdvIHNldHRpbmdzLCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAgYW5kIGB6c3dhcF9pbnZhbGlkYXRlYC4gVGhlc2UgYXJlIGNydWNpYWwgdG8gaG93IHpzd2FwIGJlaGF2ZXMsIGFuZCB1bmRlcnN0YW5kaW5nIHRoZWlyIGludGVycGxheSBpcyBrZXkgdG8gb3B0aW1pemluZyB6c3dhcCBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHkuIEkgYWxyZWFkeSB1bmRlcnN0YW5kIHRoZSBmdW5kYW1lbnRhbCByb2xlIG9mIHpzd2FwLCB0aGUgYmFzaWNzIG9mIGNvbXByZXNzZWQgc3dhcCwgYW5kIGhvdyBpdCByZWR1Y2VzIEkvTyBsYXRlbmN5LiBCdXQgZ2V0dGluZyBpbnRvIHRoZSB3ZWVkcyBvZiB0aGVzZSBmbGFncyBoZWxwcyB0dW5lIHRoZSBzeXN0ZW0gd2hlbiBpdHMgYmVoYXZpb3IgZG9lc24ndCBhbGlnbiB3aXRoIG15IGV4cGVjdGF0aW9ucy4gSSBjYW4gc2VlIGhvdywgZm9yIGV4YW1wbGUsIGB6c3dhcF9uZXZlcl9lbmFibGVkYCB3b3VsZCBiZSB1c2VkIGluIGVudmlyb25tZW50cyB3aGVyZSBzd2FwIGlzIHVuZGVzaXJhYmxlLCBwZXJoYXBzIGJlY2F1c2Ugb2YgY29uY2VybnMgYXJvdW5kIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBmb3IgZW5jcnlwdGVkIG1lbW9yeS4gQW5kIGB6c3dhcF9pbnZhbGlkYXRlYCwgSSdsbCBiZXQsIGl0J3MgYWJvdXQgZm9yY2luZyBjYWNoZSByZWZyZXNoZXMsIHBlcmhhcHMgYWZ0ZXIgd3JpdGVzLiBUaW1lIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBkaXNzZWN0IHRoZSBleGFjdCBjb2RlIHRoYXQgdXNlcyB0aGVzZSFcblxuXG4iLCJJbnB1dFRva2VucyI6NDA2NCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6MzAuMDQyNjc2MDc3WiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODAyNTI4NzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwienN3YXBfbmV2ZXJfZW5hYmxlZHx6c3dhcF9pbnZhbGlkYXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL3pzd2FwLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0venN3YXAuYz0xMjU9Ym9vbCB6c3dhcF9pc19lbmFibGVkKHZvaWQpXFxuLS1cXG5tbS96c3dhcC5jLTEyOS1cXG5tbS96c3dhcC5jOjEzMDpib29sIHpzd2FwX25ldmVyX2VuYWJsZWQodm9pZClcXG5tbS96c3dhcC5jLTEzMS17XFxuLS1cXG5tbS96c3dhcC5jPTE0Nzg9Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0venN3YXAuYy0xNDkwLVxcbm1tL3pzd2FwLmM6MTQ5MTpcXHRpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKVxcbm1tL3pzd2FwLmMtMTQ5Mi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLS1cXG5tbS96c3dhcC5jLTE1NTItXFx0XFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFxcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpXFxubW0venN3YXAuYzoxNTUzOlxcdFxcdFxcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCArIGluZGV4KSk7XFxubW0venN3YXAuYy0xNTU0LVxcbi0tXFxubW0venN3YXAuYz0xNTgwPWludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5tbS96c3dhcC5jLTE1ODktXFxubW0venN3YXAuYzoxNTkwOlxcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXFxubW0venN3YXAuYy0xNTkxLVxcdFxcdHJldHVybiAtRU5PRU5UO1xcbi0tXFxubW0venN3YXAuYy0xNjMyLVxcbm1tL3pzd2FwLmM6MTYzMzp2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKVxcbm1tL3pzd2FwLmMtMTYzNC17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjMwLjIyMjkzNzQ0NFoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2NzMzODY1ODA0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byB6c3dhcCBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHRpbWUgdG8gZGlnIGludG8gdGhlIGB6c3dhcGAgY29kZSBhIGJpdCBkZWVwZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBpdCdzIGJlaW5nIG1hbmFnZWQgYW5kIGhvdyBpdCdzIGludmFsaWRhdGVkLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byBkb3VibGUtY2hlY2sgdGhlIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGZ1bmN0aW9uLiBJJ3ZlIGdvdCB0byBtYWtlIHN1cmUgaXQncyBkb2luZyB3aGF0IEkgZXhwZWN0IGl0IHRvIGRvLCBhbmQgdGhhdCB0aGVyZSBhcmVuJ3QgYW55IHBvdGVudGlhbCBlZGdlIGNhc2VzIHRoYXQgSSBtaWdodCBoYXZlIG1pc3NlZCBpbiBteSBwcmV2aW91cyByZXZpZXcuIFRoZW4sIEkgbmVlZCB0byBsb29rIGNhcmVmdWxseSBhdCB0aGUgYHpzd2FwX2ludmFsaWRhdGUoKWAgZnVuY3Rpb24uIEludmFsaWRhdGlvbiBpcyBhIGNyaXRpY2FsIHBhcnQgb2YgYW55IGNhY2hlOyBtYWtpbmcgc3VyZSBpdCBpcyB3b3JraW5nIHRoZSB3YXkgdGhhdCBJIGV4cGVjdCBpdCB0byBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vdCBhbnkgZGF0YSBpbnRlZ3JpdHkgaXNzdWVzLiBJIHdhbnQgdG8gdHJhY2UgdGhlIGxvZ2ljIG9mIHRob3NlIHR3byBmdW5jdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ3NDUsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNTozNi45NTY4MDYwNzhaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkzMDcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3pzd2FwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTI1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTI1OlxcdGJvb2wgenN3YXBfaXNfZW5hYmxlZCh2b2lkKVxcbiAxMjY6XFx0e1xcbiAxMjc6XFx0XFx0cmV0dXJuIHpzd2FwX2VuYWJsZWQ7XFxuIDEyODpcXHR9XFxuIDEyOTpcXHRcXG4gMTMwOlxcdGJvb2wgenN3YXBfbmV2ZXJfZW5hYmxlZCh2b2lkKVxcbiAxMzE6XFx0e1xcbiAxMzI6XFx0XFx0cmV0dXJuICFzdGF0aWNfYnJhbmNoX21heWJlKENPTkZJR19aU1dBUF9ERUZBVUxUX09OLCBcXHUwMDI2enN3YXBfZXZlcl9lbmFibGVkKTtcXG4gMTMzOlxcdH1cXG4gMTM0OlxcdFxcbiAxMzU6XFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxcbiAxMzY6XFx0KiBkYXRhIHN0cnVjdHVyZXNcXG4gMTM3OlxcdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXFxuIDEzODpcXHRcXG4gMTM5OlxcdHN0cnVjdCBjcnlwdG9fYWNvbXBfY3R4IHtcXG4gMTQwOlxcdFxcdHN0cnVjdCBjcnlwdG9fYWNvbXAgKmFjb21wO1xcbiAxNDE6XFx0XFx0c3RydWN0IGFjb21wX3JlcSAqcmVxO1xcbiAxNDI6XFx0XFx0c3RydWN0IGNyeXB0b193YWl0IHdhaXQ7XFxuIDE0MzpcXHRcXHR1OCAqYnVmZmVyO1xcbiAxNDQ6XFx0XFx0c3RydWN0IG11dGV4IG11dGV4O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNTozNi45NTcwMDE1MDhaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTcyOTU4NzA3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgenN3YXBfaW52YWxpZGF0ZSgpYCoqXG5cbk9rYXksIHRpbWUgdG8gemVybyBpbiBvbiBgenN3YXBfaW52YWxpZGF0ZSgpYC4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGltcGxlbWVudGF0aW9uIGFyb3VuZCBsaW5lIDE2MzMuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbnRhbCBtYXAgb2YgaG93IHRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIG92ZXJhbGwgWnN3YXAgYXJjaGl0ZWN0dXJlLiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IHNvbWV0aGluZyBtaWdodCBiZSBhbWlzcyBhcm91bmQgdGhlcmUsIGVpdGhlciBpbiB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgcGFnZSB0YWJsZSBvciBwZXJoYXBzIHRoZSBsb2NraW5nIHNlbWFudGljcyB3aXRoaW4gdGhlIHN3YXBwaW5nIHByb2Nlc3MuIEl0J3MgYSBjb21tb24gYXJlYSBmb3Igc3VidGxlIGJ1Z3MgdG8gY3JlZXAgaW4sIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdGhlIGNvbXBsZXhpdGllcyBvZiBtZW1vcnkgcmVjbGFpbSBhbmQgcGFnZSBpbnZhbGlkYXRpb24uIEkgd2FudCB0byBxdWlja2x5IHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBhbmQgdGhlIHNwZWNpZmljIGNvbmRpdGlvbmFsIGxvZ2ljIHN1cnJvdW5kaW5nIHRoaXMgbGluZS4gSSdtIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIHdpdGggbWVtb3J5IGFjY2VzcyBkdXJpbmcgaW52YWxpZGF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MjI5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNTozOC42ODY1OTIwNTFaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjA2NTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3pzd2FwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTYzMCxcbiAgXCJMaW5lQ291bnRcIjogMzVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTYzMDpcXHRcXHRyZXR1cm4gMDtcXG4xNjMxOlxcdH1cXG4xNjMyOlxcdFxcbjE2MzM6XFx0dm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cClcXG4xNjM0OlxcdHtcXG4xNjM1OlxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xcbjE2MzY6XFx0XFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApO1xcbjE2Mzc6XFx0XFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTtcXG4xNjM4OlxcdFxcbjE2Mzk6XFx0XFx0aWYgKHhhX2VtcHR5KHRyZWUpKVxcbjE2NDA6XFx0XFx0XFx0cmV0dXJuO1xcbjE2NDE6XFx0XFxuMTY0MjpcXHRcXHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XFxuMTY0MzpcXHRcXHRpZiAoZW50cnkpXFxuMTY0NDpcXHRcXHRcXHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcXG4xNjQ1OlxcdH1cXG4xNjQ2OlxcdFxcbjE2NDc6XFx0aW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4xNjQ4OlxcdHtcXG4xNjQ5OlxcdFxcdHN0cnVjdCB4YXJyYXkgKnRyZWVzLCAqdHJlZTtcXG4xNjUwOlxcdFxcdHVuc2lnbmVkIGludCBuciwgaTtcXG4xNjUxOlxcdFxcbjE2NTI6XFx0XFx0bnIgPSBESVZfUk9VTkRfVVAobnJfcGFnZXMsIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xcbjE2NTM6XFx0XFx0dHJlZXMgPSBrdnphbGxvY19vYmpzKCp0cmVlLCBucik7XFxuMTY1NDpcXHRcXHRpZiAoIXRyZWVzKSB7XFxuMTY1NTpcXHRcXHRcXHRwcl9lcnIoXFxcImFsbG9jIGZhaWxlZCwgenN3YXAgZGlzYWJsZWQgZm9yIHN3YXAgdHlwZSAlZFxcXFxuXFxcIiwgdHlwZSk7XFxuMTY1NjpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4xNjU3OlxcdFxcdH1cXG4xNjU4OlxcdFxcbjE2NTk6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yOyBpKyspXFxuMTY2MDpcXHRcXHRcXHR4YV9pbml0KHRyZWVzICsgaSk7XFxuMTY2MTpcXHRcXG4xNjYyOlxcdFxcdG5yX3pzd2FwX3RyZWVzW3R5cGVdID0gbnI7XFxuMTY2MzpcXHRcXHR6c3dhcF90cmVlc1t0eXBlXSA9IHRyZWVzO1xcbjE2NjQ6XFx0XFx0cmV0dXJuIDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjM4LjY4NjgwNDgwMVoiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMTM3NzQxODAzMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBBbmFseXNpcyBvZiBac3dhcCBSZWZhY3RvcmluZyBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIHBhdGNoIGZvY3VzZXMgb24gb3B0aW1pemluZyB0aGUgYHpzd2FwX3N0b3JlYCBmdW5jdGlvbiwgc3BlY2lmaWNhbGx5IHJlZ2FyZGluZyBlYXJseSBleGl0IGNvbmRpdGlvbnMgYW5kIGludmFsaWRhdGlvbiBsb2dpYy4gRmlyc3QsIHRoZSBjcnVjaWFsIGFkZGl0aW9uIG9mIGBpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7YCBhdCB0aGUgYmVnaW5uaW5nIG9mIGB6c3dhcF9zdG9yZWAgaXMgYSBzaW1wbGUgb3B0aW1pemF0aW9uOiBpZiB6c3dhcCBoYXNuJ3QgZXZlbiBiZWVuIGVuYWJsZWQgKGluZGljYXRlZCBieSB0aGUgc3RhdGljIGJyYW5jaCBgenN3YXBfZXZlcl9lbmFibGVkYCBiZWluZyBmYWxzZSksIHdlIGJhaWwgb3V0IGVhcmx5LCBza2lwcGluZyB1bm5lY2Vzc2FyeSBvcGVyYXRpb25zLiBTbWFydC5cblxuVGhlbiwgdGhlIG1vcmUgaW50ZXJlc3RpbmcgcGFydCBpcyBob3cgaXQgc2ltcGxpZmllcyB0aGUgaW52YWxpZGF0aW9uIGxvb3AgaW4gYHpzd2FwX3N0b3JlYCB3aGVuIGEgc3RvcmUgZmFpbHMgb3IgenN3YXAgaXMgZGlzYWJsZWQuIFRoZSBvcmlnaW5hbCBjb2RlIGRpZCBhbiBleHBsaWNpdCBsb29wIHRvIGVyYXNlIGVudHJpZXMgZnJvbSB0aGUgenN3YXAgdHJlZS4gVGhpcyBwYXRjaCByZWZhY3RvcnMgdGhhdCBsb29wIGJ5IHVzaW5nIHRoZSBleGlzdGluZyBgenN3YXBfaW52YWxpZGF0ZWAgZnVuY3Rpb24uIFRoaXMgaXMgY2xlYW5lciwgbW9yZSBtYWludGFpbmFibGUuXG5cbk5vdywgdGhlIHJlYWwgcXVlc3Rpb246IGRvZXMgdGhpcyBpbnRyb2R1Y2UgYW55IEtNU0FOIGNvbmNlcm5zPyBOby4gTGV0J3MgcnVuIGl0IGRvd24gdGhlIGNoZWNrbGlzdDpcblxuMS4gICoqTm8gS2VybmVsIFN0cnVjdHVyZXMgdG8gVXNlcnNwYWNlOioqIE5vdGhpbmcgaXMgYmVpbmcgY29waWVkIHRvIHVzZXJzcGFjZSB0aGF0IG1pZ2h0IGhhdmUgdW5pbml0aWFsaXplZCBmaWVsZHMgb3IgcGFkZGluZy4gVGhhdCdzIGEgaHVnZSB3aW4uXG4yLiAgKipObyBVbmluaXRpYWxpemVkIFZhcmlhYmxlIERlcGVuZGVuY3k6KiogVGhlIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGNoZWNrIHVzZXMgYSBzdGF0aWMga2V5LCBhbmQgdGhlIGxvb3AgaW5kaWNlcywgdHlwZSwgYW5kIG9mZnNldCBpbiBgc3dwX2VudHJ5YCBhcmUgYWxsIGluaXRpYWxpemVkIGFuZCBjYWxjdWxhdGVkLiBUaGUgY29uZGl0aW9ucyBhcmUgc2FmZS5cbjMuICAqKk5vIE5ldyBBbGxvY2F0aW9uczoqKiBObyBuZXcgYWxsb2NhdGlvbnMgb3IgaW5pdGlhbGl6YXRpb25zIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbnRyb2R1Y2VkIHRoYXQgY291bGQgaGFyYm9yIHVuaW5pdGlhbGl6ZWQgZmllbGRzLlxuNC4gICoqTm8gVW5zYWZlIEFjY2Vzc2VzOioqIFRoZXJlIGFyZSBubyBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyB0aGF0IGNvdWxkIGxlYWQgdG8gYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgaW4gZXhpc3RpbmcgYnVmZmVycy5cblxuVGhpcyBpcyBhIGNsZWFuIHJlZmFjdG9yaW5nLiBJdCdzIGFuIG9wdGltaXphdGlvbiwgYW5kIGl0IGRvZXNuJ3QgdG91Y2ggYW55dGhpbmcgS01TQU4gd291bGQgd29ycnkgYWJvdXQuIEFueSBtZW1vcnkgbWFuYWdlbWVudCBlcnJvcnMsIGxpa2UgdXNlLWFmdGVyLWZyZWUgb3IgZG91YmxlIGZyZWVzLCB3b3VsZCBiZSBjYXVnaHQgYnkgS0FTQU4vZGVidWdnZXJzLlxuXG5TbywgdGhlIHN1bW1hcnk6IFRoaXMgcGF0Y2ggb3B0aW1pemVzIGB6c3dhcF9zdG9yZWAgd2l0aCBhbiBlYXJseSBleGl0IGFuZCByZWZhY3RvcmVkIGludmFsaWRhdGlvbiBsb2dpYy4gSXQgZG9lcyAqbm90KiBpbnRyb2R1Y2UgYW55IHJpc2tzIHJlbGF0ZWQgdG8gdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgcmVsaWVzIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBUaGlzIGZhbGxzIHNxdWFyZWx5IHVuZGVyIEtBU0FOJ3MgcHVydmlldy4gTm8gS01TQU4gbmVlZGVkLiBUaW1lIHRvIG1vdmUgb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU5NTgsIk91dHB1dFRva2VucyI6MTY3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODQ3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6NTAuMDY0MjI1ODgxWiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE5MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGFuIGVhcmx5LXJldHVybiBjaGVjayB1c2luZyBgenN3YXBfbmV2ZXJfZW5hYmxlZCgpYCBpbiBgenN3YXBfc3RvcmUoKWAgYW5kIHJlZmFjdG9ycyBvcGVuLWNvZGVkIHpzd2FwIHRyZWUgaW52YWxpZGF0aW9uIGxvZ2ljIG9uIHN0b3JlIGZhaWx1cmUgdG8gcmV1c2UgYHpzd2FwX2ludmFsaWRhdGUoKWAuIE5vIG1lbW9yeSBhbGxvY2F0aW9ucywgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIG9wZXJhdGlvbnMgYXJlIGludHJvZHVjZWQgb3IgYWx0ZXJlZC4gTm8gY29uZGl0aW9uYWwgbG9naWMgcmVsaWVzIG9uIHVuaW5pdGlhbGl6ZWQgZGF0YS4gQW55IG1lbW9yeSBzYWZldHkgY29uY2VybnMgaW4gdGhpcyBzd2FwIHBhdGggKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBvciBsb2NraW5nIGVycm9ycykgYXJlIGNvdmVyZWQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dlcnMuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBrZXJuZWwtdG8tdXNlciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhbiBlYXJseS1yZXR1cm4gY2hlY2sgdXNpbmcgYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgaW4gYHpzd2FwX3N0b3JlKClgIGFuZCByZWZhY3RvcnMgb3Blbi1jb2RlZCB6c3dhcCB0cmVlIGludmFsaWRhdGlvbiBsb2dpYyBvbiBzdG9yZSBmYWlsdXJlIHRvIHJldXNlIGB6c3dhcF9pbnZhbGlkYXRlKClgLiBObyBtZW1vcnkgYWxsb2NhdGlvbnMsIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMsIG9yIGNvcHktdG8tdXNlciBvcGVyYXRpb25zIGFyZSBpbnRyb2R1Y2VkIG9yIGFsdGVyZWQuIE5vIGNvbmRpdGlvbmFsIGxvZ2ljIHJlbGllcyBvbiB1bmluaXRpYWxpemVkIGRhdGEuIEFueSBtZW1vcnkgc2FmZXR5IGNvbmNlcm5zIGluIHRoaXMgc3dhcCBwYXRoIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgb3IgbG9ja2luZyBlcnJvcnMpIGFyZSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnZXJzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3Iga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflows88xq[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-09 13:02:43 +0000 UTC FinishedAt: 2026-09-09 13:35:51 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "53a57667a3201fb756e6e9ffa0f6de4698dc917c", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ZSWAP", "SWAP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "53a57667a3201fb756e6e9ffa0f6de4698dc917c", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ZSWAP", "SWAP" ], "series_id": "2c753753-fa3e-43d5-a84f-1c1bebc01c34" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "zswap_store", "zswap_invalidate" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1pTV0FQJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6c3dhcF9zdG9yZSYjMzQ7LAogICAgJiMzNDt6c3dhcF9pbnZhbGlkYXRlJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhbiBlYXJseS1yZXR1cm4gY2hlY2sgdXNpbmcgYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgaW4gYHpzd2FwX3N0b3JlKClgIGFuZCByZWZhY3RvcnMgb3Blbi1jb2RlZCB6c3dhcCB0cmVlIGludmFsaWRhdGlvbiBsb2dpYyBvbiBzdG9yZSBmYWlsdXJlIHRvIHJldXNlIGB6c3dhcF9pbnZhbGlkYXRlKClgLiBObyBtZW1vcnkgYWxsb2NhdGlvbnMsIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMsIG9yIGNvcHktdG8tdXNlciBvcGVyYXRpb25zIGFyZSBpbnRyb2R1Y2VkIG9yIGFsdGVyZWQuIE5vIGNvbmRpdGlvbmFsIGxvZ2ljIHJlbGllcyBvbiB1bmluaXRpYWxpemVkIGRhdGEuIEFueSBtZW1vcnkgc2FmZXR5IGNvbmNlcm5zIGluIHRoaXMgc3dhcCBwYXRoIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgb3IgbG9ja2luZyBlcnJvcnMpIGFyZSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnZXJzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3Iga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL3pzd2FwLmMgYnkgYWRkaW5nIGFuIGVhcmx5LWV4aXQgY2hlY2sgaW4genN3YXBfc3RvcmUoKSB3aGVuIHpzd2FwIGhhcyBuZXZlciBiZWVuIGVuYWJsZWQsIGFuZCByZWZhY3RvcmluZyB0aGUgZXJyb3IvZGlzYWJsZWQgZmFsbGJhY2sgbG9vcCB0byB1c2UgenN3YXBfaW52YWxpZGF0ZSgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHN3YXBvdXQvenN3YXAgbG9naWMgYW5kIGFyZSBkaXJlY3RseSByZWFjaGFibGUgYW5kIHRlc3RhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDY3Y2VhNjllYzY0Y2M5Y2U1Y2JmNDY5NDMwNzg2ZmIzNDRmYmQ1YmVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIFNlcCA5IDEzOjM0OjE3IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCA1ZDBkOGJkNzIxOTNhLi5mYzZjNWUwZGI1ZTQzIDEwMDY0NFxuLS0tIGEvbW0venN3YXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0venN3YXAuY1xuQEAgLTE0ODgsNiAmIzQzOzE0ODgsOSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XG4gXG4mIzQzO1x0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4gXHRpZiAoIXpzd2FwX2VuYWJsZWQpXG4gXHRcdGdvdG8gY2hlY2tfb2xkO1xuIFxuQEAgLTE1NDUsMTUgJiM0MzsxNTQ4LDEwIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdGlmICghcmV0KSB7XG4gXHRcdHVuc2lnbmVkIHR5cGUgPSBzd3BfdHlwZShzd3ApO1xuIFx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbi1cdFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTtcbi1cdFx0c3RydWN0IHhhcnJheSAqdHJlZTtcbi1cbi1cdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7XG4tXHRcdFx0dHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICYjNDM7IGluZGV4KSk7XG4tXHRcdFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQgJiM0MzsgaW5kZXgpO1xuLVx0XHRcdGlmIChlbnRyeSlcbi1cdFx0XHRcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuLVx0XHR9XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KVxuJiM0MztcdFx0XHR6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgJiM0MzsgaW5kZXgpKTtcbiYjNDM7XG4gXHR9XG4gXG4gXHRyZXR1cm4gcmV0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1pTV0FQJiMzNDssCiAgICAmIzM0O1NXQVAmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt6c3dhcF9zdG9yZSYjMzQ7LAogICAgJiMzNDt6c3dhcF9pbnZhbGlkYXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgaW4gbW0venN3YXAuYyBieSBhZGRpbmcgYW4gZWFybHktZXhpdCBjaGVjayBpbiB6c3dhcF9zdG9yZSgpIHdoZW4genN3YXAgaGFzIG5ldmVyIGJlZW4gZW5hYmxlZCwgYW5kIHJlZmFjdG9yaW5nIHRoZSBlcnJvci9kaXNhYmxlZCBmYWxsYmFjayBsb29wIHRvIHVzZSB6c3dhcF9pbnZhbGlkYXRlKCkuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IGNvcmUgc3dhcG91dC96c3dhcCBsb2dpYyBhbmQgYXJlIGRpcmVjdGx5IHJlYWNoYWJsZSBhbmQgdGVzdGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNjdjZWE2OWVjNjRjYzljZTVjYmY0Njk0MzA3ODZmYjM0NGZiZDViZQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgU2VwIDkgMTM6MzQ6MTcgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuYwppbmRleCA1ZDBkOGJkNzIxOTNhLi5mYzZjNWUwZGI1ZTQzIDEwMDY0NAotLS0gYS9tbS96c3dhcC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3pzd2FwLmMKQEAgLTE0ODgsNiAmIzQzOzE0ODgsOSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pCiAJVk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpOwogCVZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKTsKIAomIzQzOwlpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwogCWlmICghenN3YXBfZW5hYmxlZCkKIAkJZ290byBjaGVja19vbGQ7CiAKQEAgLTE1NDUsMTUgJiM0MzsxNTQ4LDEwIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKIAlpZiAoIXJldCkgewogCQl1bnNpZ25lZCB0eXBlID0gc3dwX3R5cGUoc3dwKTsKIAkJcGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7Ci0JCXN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7Ci0JCXN0cnVjdCB4YXJyYXkgKnRyZWU7Ci0KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4ICZsdDsgbnJfcGFnZXM7ICYjNDM7JiM0MztpbmRleCkgewotCQkJdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICYjNDM7IGluZGV4KSk7Ci0JCQllbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCAmIzQzOyBpbmRleCk7Ci0JCQlpZiAoZW50cnkpCi0JCQkJenN3YXBfZW50cnlfZnJlZShlbnRyeSk7Ci0JCX0KJiM0MzsKJiM0MzsJCWZvciAoaW5kZXggPSAwOyBpbmRleCAmbHQ7IG5yX3BhZ2VzOyAmIzQzOyYjNDM7aW5kZXgpCiYjNDM7CQkJenN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICYjNDM7IGluZGV4KSk7CiYjNDM7CiAJfQogCiAJcmV0dXJuIHJldDsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzA2OAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDQ3NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFdmFsdWF0aW5nIHRoZSBQYXRjaCYjMzk7cyBTdWl0YWJpbGl0eSBmb3IgU3l6a2FsbGVyIEZ1enppbmcqKgoKT2theSwgc28gSSYjMzk7dmUgZ290IGEgcGF0Y2ggcmV2aWV3IHJlcXVlc3QsIHNwZWNpZmljYWxseSBmb3IgZnV6emluZyB0cmlhZ2UgaW4gdGhlIExpbnV4IGtlcm5lbC4gU2VlbXMgcHJldHR5IGJlbmlnbiwgZmFsbGluZyB1bmRlciBkZWZlbnNpdmUgc2VjdXJpdHkgZW5naW5lZXJpbmcgYW5kIGtlcm5lbCBRQSwgbm90aGluZyBzY3JlYW1pbmcgJiMzNDtjcml0aWNhbCB2dWxuZXJhYmlsaXR5JiMzNDsgaGVyZS4gR29vZC4KClRoZSBwYXRjaCBpdHNlbGYgdG91Y2hlcyBgbW0venN3YXAuY2AsIHNwZWNpZmljYWxseSBgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylgLiBMb29raW5nIGF0IHRoZSBkaWZmLCBpdCBpbnRyb2R1Y2VzIGEgY2hlY2s6IGBpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7YC4gVGhpcyBzZWVtcyB0byBiZSBhIHNhZmVndWFyZCBhZ2FpbnN0IHpzd2FwIGJlaW5nIHVzZWQgd2hlbiBpdCBpc24mIzM5O3QgZW5hYmxlZCwgd2hpY2ggbWFrZXMgc2Vuc2UuIFRoZXJlIGFyZSBzb21lIGNoYW5nZXMgYWZ0ZXIgdGhlIGAhcmV0YCBjaGVjay4gSXQgcmVwbGFjZXMgdGhlIHVzZSBvZiBgeGFfZXJhc2VgIHdpdGggYSBgenN3YXBfaW52YWxpZGF0ZWAgd2hpY2ggbG9va3MgbGlrZSBhIHJlZmFjdG9yaW5nLgoKTXkgbmV4dCBzdGVwIGlzIHRvIGRpdmUgZGVlcGVyLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dC4gSSYjMzk7bGwgYmUgZGlnZ2luZyBpbnRvIGBtbS96c3dhcC5jYCBhbmQgYWRqYWNlbnQgY29kZS4gSSYjMzk7bGwgYmUgdXNpbmcgdGhlIHVzdWFsIHRvb2xzLCBsaWtlIGdyZXAsIGNzY29wZSwgbWF5YmUgc29tZSBzdGF0aWMgYW5hbHlzaXMsIHRvIGdldCBhIGhhbmRsZSBvbiBjYWxsZXJzLCBjb25maWd1cmF0aW9ucyByZWxhdGVkIHRvIHpzd2FwLCBhbmQgZmlndXJlIG91dCB3aGF0IHRoZSBjcml0aWNhbCBzeW1ib2xzIGFyZS4gSSYjMzk7bGwgbmVlZCB0byBrbm93IHdoYXQgZnVuY3Rpb25zIGNhbGwgYHpzd2FwX3N0b3JlYCwgYW5kIHdoYXQgbW9kdWxlcyB1c2UgdGhpcy4gQWZ0ZXIgdGhhdCwgSSBjYW4gZm9ybSBhIGJldHRlciB2aWV3LiBUaGVuLCBJIGNhbiBwcm9wZXJseSBldmFsdWF0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGNoYW5nZSB3YXJyYW50cyBTeXprYWxsZXIgZnV6emluZy4gSXQmIzM5O3MgdG9vIGVhcmx5IHRvIHNheSBmb3Igc3VyZSB3aXRob3V0IG1vcmUgaW52ZXN0aWdhdGlvbiwgYnV0IGZyb20gYSBmaXJzdCBnbGFuY2UsIHRoZSBjaGFuZ2Ugc2VlbXMgcmVhc29uYWJsZSwgYW5kIHBvdGVudGlhbGx5IGZ1enppbmcgaXMgbm90IG5lY2Vzc2FyeS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3pzd2FwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNDgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE0ODA6XHRcdGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4xNDgxOlx0XHRzd3BfZW50cnlfdCBzd3AgPSBmb2xpby1cdTAwM2Vzd2FwO1xuMTQ4MjpcdFx0c3RydWN0IG9ial9jZ3JvdXAgKm9iamNnID0gTlVMTDtcbjE0ODM6XHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7XG4xNDg0Olx0XHRzdHJ1Y3QgenN3YXBfcG9vbCAqcG9vbDtcbjE0ODU6XHRcdGJvb2wgcmV0ID0gZmFsc2U7XG4xNDg2Olx0XHRsb25nIGluZGV4O1xuMTQ4NzpcdFxuMTQ4ODpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xuMTQ4OTpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpO1xuMTQ5MDpcdFxuMTQ5MTpcdFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbjE0OTI6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTQ5MzpcdFxuMTQ5NDpcdFx0aWYgKCF6c3dhcF9lbmFibGVkKVxuMTQ5NTpcdFx0XHRnb3RvIGNoZWNrX29sZDtcbjE0OTY6XHRcbjE0OTc6XHRcdG9iamNnID0gZ2V0X29ial9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4xNDk4Olx0XHRpZiAob2JqY2cgXHUwMDI2XHUwMDI2ICFvYmpfY2dyb3VwX21heV96c3dhcChvYmpjZykpIHtcbjE0OTk6XHRcdFx0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX29iamNnKG9iamNnKTtcbjE1MDA6XHRcdFx0aWYgKHNocmlua19tZW1jZyhtZW1jZykpIHtcbjE1MDE6XHRcdFx0XHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4xNTAyOlx0XHRcdFx0Z290byBwdXRfb2JqY2c7XG4xNTAzOlx0XHRcdH1cbjE1MDQ6XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUwNTpcdFx0fVxuMTUwNjpcdFxuMTUwNzpcdFx0aWYgKHpzd2FwX2NoZWNrX2xpbWl0cygpKVxuMTUwODpcdFx0XHRnb3RvIHB1dF9vYmpjZztcbjE1MDk6XHRcbjE1MTA6XHRcdHBvb2wgPSB6c3dhcF9wb29sX2N1cnJlbnRfZ2V0KCk7XG4xNTExOlx0XHRpZiAoIXBvb2wpXG4xNTEyOlx0XHRcdGdvdG8gcHV0X29iamNnO1xuMTUxMzpcdFxuMTUxNDpcdFx0aWYgKG9iamNnKSB7XG4xNTE1Olx0XHRcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9vYmpjZyhvYmpjZyk7XG4xNTE2Olx0XHRcdGlmIChtZW1jZ19saXN0X2xydV9hbGxvYyhtZW1jZywgXHUwMDI2enN3YXBfbGlzdF9scnUsIEdGUF9LRVJORUwpKSB7XG4xNTE3Olx0XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUxODpcdFx0XHRcdGdvdG8gcHV0X3Bvb2w7XG4xNTE5Olx0XHRcdH1cbjE1MjA6XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUyMTpcdFx0fVxuMTUyMjpcdFxuMTUyMzpcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7XG4xNTI0Olx0XHRcdGlmICghenN3YXBfc3RvcmVfcGFnZShmb2xpbywgaW5kZXgsIG9iamNnLCBwb29sKSlcbjE1MjU6XHRcdFx0XHRnb3RvIHB1dF9wb29sO1xuMTUyNjpcdFx0fVxuMTUyNzpcdFxuMTUyODpcdFx0aWYgKG9iamNnKVxuMTUyOTpcdFx0XHRjb3VudF9vYmpjZ19ldmVudHMob2JqY2csIFpTV1BPVVQsIG5yX3BhZ2VzKTtcbjE1MzA6XHRcbjE1MzE6XHRcdGNvdW50X3ZtX2V2ZW50cyhaU1dQT1VULCBucl9wYWdlcyk7XG4xNTMyOlx0XG4xNTMzOlx0XHRyZXQgPSB0cnVlO1xuMTUzNDpcdFxuMTUzNTpcdHB1dF9wb29sOlxuMTUzNjpcdFx0enN3YXBfcG9vbF9wdXQocG9vbCk7XG4xNTM3Olx0cHV0X29iamNnOlxuMTUzODpcdFx0b2JqX2Nncm91cF9wdXQob2JqY2cpO1xuMTUzOTpcdFx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsKVxuMTU0MDpcdFx0XHRxdWV1ZV93b3JrKHNocmlua193cSwgXHUwMDI2enN3YXBfc2hyaW5rX3dvcmspO1xuMTU0MTpcdGNoZWNrX29sZDpcbjE1NDI6XHRcdC8qXG4xNTQzOlx0XHQgKiBJZiB0aGUgenN3YXAgc3RvcmUgZmFpbHMgb3IgenN3YXAgaXMgZGlzYWJsZWQsIHdlIG11c3QgaW52YWxpZGF0ZVxuMTU0NDpcdFx0ICogdGhlIHBvc3NpYmx5IHN0YWxlIGVudHJpZXMgd2hpY2ggd2VyZSBwcmV2aW91c2x5IHN0b3JlZCBhdCB0aGVcbjE1NDU6XHRcdCAqIG9mZnNldHMgY29ycmVzcG9uZGluZyB0byBlYWNoIHBhZ2Ugb2YgdGhlIGZvbGlvLiBPdGhlcndpc2UsXG4xNTQ2Olx0XHQgKiB3cml0ZWJhY2sgY291bGQgb3ZlcndyaXRlIHRoZSBuZXcgZGF0YSBpbiB0aGUgc3dhcGZpbGUuXG4xNTQ3Olx0XHQgKi9cbjE1NDg6XHRcdGlmICghcmV0KSB7XG4xNTQ5Olx0XHRcdHVuc2lnbmVkIHR5cGUgPSBzd3BfdHlwZShzd3ApO1xuMTU1MDpcdFx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbjE1NTE6XHRcbjE1NTI6XHRcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KVxuMTU1MzpcdFx0XHRcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCAmIzQzOyBpbmRleCkpO1xuMTU1NDpcdFxuMTU1NTpcdFx0fVxuMTU1NjpcdFxuMTU1NzpcdFx0cmV0dXJuIHJldDtcbjE1NTg6XHR9XG4xNTU5Olx0XG4xNTYwOlx0LyoqXG4xNTYxOlx0ICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbjE1NjI6XHQgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbjE1NjM6XHQgKlxuMTU2NDpcdCAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZVxuMTU2NTpcdCAqIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6XG4xNTY2Olx0ICpcbjE1Njc6XHQgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgY291bGQgbm90IGJlIGxvYWRlZFxuMTU2ODpcdCAqICBpbnRvIHRoZSBwYWdlIGR1ZSB0byBhIGRlY29tcHJlc3Npb24gZmFpbHVyZS4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXRcbjE1Njk6XHQgKiAgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MjY4CgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogNDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBmdW5jdGlvbnMsIGFzIGlmIEkmIzM5O20gdGhpbmtpbmcgaXQgdGhyb3VnaDoKCioqSW52ZXN0aWdhdGluZyBgenN3YXBfbmV2ZXJfZW5hYmxlZCgpYCBhbmQgYHpzd2FwX2ludmFsaWRhdGUoKWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGVzZSBgenN3YXBgIGZ1bmN0aW9ucy4gRmlyc3QsIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCBgenN3YXBfbmV2ZXJfZW5hYmxlZCgpYCBhbmQgYHpzd2FwX2ludmFsaWRhdGUoKWAgYXJlIGFjdHVhbGx5IGRvaW5nLiBUaW1lIHRvIGNoZWNrIHRoZSBzb3VyY2UgY29kZS4gSSYjMzk7bGwgbmVlZCB0byBsb2NhdGUgdGhlaXIgZGVmaW5pdGlvbnMsIHByb2JhYmx5IGluIGBtbS96c3dhcC5jYCwgb3IgbWF5YmUgSSBjYW4gZmluZCBpdCBpbiBhbiBpbmNsdWRlIGZpbGUuIEEgcXVpY2sgYGdyZXBgIHNob3VsZCBnZXQgbWUgdGhlIGFuc3dlcnMgZmFzdCwgc2hvd2luZyBtZSB3aGVyZSB0aGV5JiMzOTtyZSBkZWZpbmVkIGFuZCBjYWxsZWQuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgY29kZSByZXZlYWxzIGFib3V0IHRoZWlyIHJvbGVzIGluIHRoZSB6c3dhcCBtZWNoYW5pc20uIFRoYXQmIzM5O2xsIHByb3ZpZGUgdGhlIGNvbnRleHQgdG8gdW5kZXJzdGFuZCB0aGVpciBwYXJ0aWN1bGFyIGZ1bmN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3pzd2FwX25ldmVyX2VuYWJsZWQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5LmM9NDc1OD1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aHBfc3dhcGluX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9tZW1vcnkuYy00Nzc5LVx0ICovXG5tbS9tZW1vcnkuYzo0NzgwOlx0aWYgKCF6c3dhcF9uZXZlcl9lbmFibGVkKCkpXG5tbS9tZW1vcnkuYy00NzgxLVx0XHRyZXR1cm4gMDtcbi0tXG5tbS9zaG1lbS5jPTIyNDU9c3RhdGljIHN0cnVjdCBmb2xpbyAqc2htZW1fc3dhcF9hbGxvY19mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbm1tL3NobWVtLmMtMjI1NC1cdGlmICgodm1mIFx1MDAyNlx1MDAyNiB1bmxpa2VseSh1c2VyZmF1bHRmZF9hcm1lZCh2bWYtXHUwMDNldm1hKSkpIHx8XG5tbS9zaG1lbS5jOjIyNTU6XHQgICAgICF6c3dhcF9uZXZlcl9lbmFibGVkKCkpXG5tbS9zaG1lbS5jLTIyNTYtXHRcdG9yZGVyID0gMDtcbi0tXG5tbS96c3dhcC5jPTEyNT1ib29sIHpzd2FwX2lzX2VuYWJsZWQodm9pZClcbi0tXG5tbS96c3dhcC5jLTEyOS1cbm1tL3pzd2FwLmM6MTMwOmJvb2wgenN3YXBfbmV2ZXJfZW5hYmxlZCh2b2lkKVxubW0venN3YXAuYy0xMzEte1xuLS1cbm1tL3pzd2FwLmM9MTQ3OD1ib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0venN3YXAuYy0xNDkwLVxubW0venN3YXAuYzoxNDkxOlx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbm1tL3pzd2FwLmMtMTQ5Mi1cdFx0cmV0dXJuIGZhbHNlO1xuLS1cbm1tL3pzd2FwLmM9MTU4MD1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3pzd2FwLmMtMTU4OS1cbm1tL3pzd2FwLmM6MTU5MDpcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXG5tbS96c3dhcC5jLTE1OTEtXHRcdHJldHVybiAtRU5PRU5UO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU5NTUKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIGtlcm5lbCB6c3dhcCBjb21wb25lbnRzLCBmcm9tIGEgdGVjaG5pY2FsIHBlcnNwZWN0aXZlOgoKKipEaXZpbmcgaW50byB6c3dhcCBDb25maWd1cmF0aW9uIGFuZCBPcGVyYXRpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIHRoZSBudXRzIGFuZCBib2x0cyBvZiBob3cgenN3YXAgaXMgY29uZmlndXJlZCBhbmQgYmVoYXZlcy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3Mgb2YgYHpzd2FwX25ldmVyX2VuYWJsZWRgLCBgenN3YXBfaW52YWxpZGF0ZWAsIGFuZCB0aGUgcmVsZXZhbnQgS2NvbmZpZyBvcHRpb25zLiBUaGVzZSBhcmUga2V5IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBkeW5hbWljIGJlaGF2aW9yIGFuZCBjb250cm9sIHBvaW50cyBvZiB0aGUgenN3YXAgc3Vic3lzdGVtLCBhbmQgaG93IGl04oCZcyBpbnRlZ3JhdGVkIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudC4gSSByZWNhbGwgdGhlIGltcGxpY2F0aW9ucyBvZiBlYWNoLCBidXQgSSBuZWVkIHRvIGVuc3VyZSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzIGlzIHNoYXJwLgoKRmlyc3RseSwgYHpzd2FwX25ldmVyX2VuYWJsZWRgLi4uIHRoaXMgbGlrZWx5IGZ1bmN0aW9ucyBhcyBhIGdsb2JhbCBnYXRlLCBhIGZsYWcgdGhhdCBlZmZlY3RpdmVseSBkaXNhYmxlcyB6c3dhcCBhdCBib290IGlmIHNldC4gSXQmIzM5O3MgcHJvYmFibHkgY2hlY2tlZCBlYXJseSBpbiBpbml0aWFsaXphdGlvbiwgcG90ZW50aWFsbHkgcHJldmVudGluZyBhbGxvY2F0aW9uIG9mIHRoZSBuZWNlc3NhcnkgZGF0YSBzdHJ1Y3R1cmVzIG9yIHByZXZlbnRpbmcgcmVnaXN0cmF0aW9uIG9mIHpzd2FwIGFzIGEgc3dhcCBzcGFjZSBwcm92aWRlci4gVGhlIGtleSBoZXJlIGlzIHRoZSBsZXZlbCBvZiBncmFudWxhcml0eTsgZG9lcyBpdCBmdWxseSB1bmxvYWQgdGhlIG1vZHVsZXMsIG9yIGRvZXMgaXQgc2ltcGx5IHByZXZlbnQgdXNlPyBJIHdhbnQgdG8gdmVyaWZ5IHRoZSBpbXBsaWNhdGlvbnMgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBjb21tYW5kLWxpbmUgcGFyYW1ldGVycy4KCk5leHQsIGB6c3dhcF9pbnZhbGlkYXRlYC4gTm93LCB0aGlzIHNvdW5kcyBpbnRyaWd1aW5nLiBJdCBpbXBsaWVzIGFuIGludmFsaWRhdGlvbiBzdHJhdGVneS4gSSBhc3N1bWUgdGhpcyByZWxhdGVzIHRvIHRoZSBjYWNoZSBtYW5hZ2VtZW50IG9yIHdyaXRlLWJhY2sgcG9saWNpZXMuIERvZXMgaXQgdHJpZ2dlciBhbiBleHBsaWNpdCBpbnZhbGlkYXRpb24gb2YgdGhlIHN3YXAgZW50cmllcywgZm9yY2luZyB0aGVtIHRvIGJlIHJlLWNvbXByZXNzZWQgYW5kIHdyaXR0ZW4gYmFjaz8gT3IgZG9lcyBpdCBoaW50IGF0IGEgd2F5IHRvIHB1cmdlIHBhZ2VzIHRvIHJlY2xhaW0gc3BhY2U/IEnigJlsbCBuZWVkIHRvIGNoZWNrIHRoZSBjb2RlLiBBcmUgdGhlcmUgYW55IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRvIGJlIG1pbmRmdWwgb2YgaGVyZT8gSG93IGRvZXMgaXQgaW50ZXJhY3Qgd2l0aCB0aGUgcGFnZSByZWNsYWltIG1lY2hhbmlzbXM/IFRoaXMgZnVuY3Rpb24gY291bGQgcGxheSBhIHZpdGFsIHJvbGUgaW4gcHJldmVudGluZyBtZW1vcnkgbGVha3Mgb3IgaW1wcm92aW5nIHN3YXBwaW5nIGVmZmljaWVuY3kuCgpGaW5hbGx5LCB0aGUgS2NvbmZpZyBvcHRpb25zLiBUaGlzIGlzIHRoZSBiZWRyb2NrIG9mIGNvbmZpZ3VyYXRpb24uIFdoYXQgZ3JhbnVsYXIgY29udHJvbCBkbyB3ZSBoYXZlPyBEb2VzIGl0IGFsbG93IGZvciBjb21waWxlLXRpbWUgY2hvaWNlcz8gQ2FuIHdlIGRpc2FibGUgcGFydHMgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gcmVkdWNlIHRoZSBrZXJuZWwgaW1hZ2Ugc2l6ZSBvciByZWR1Y2Ugc3VyZmFjZSBhcmVhPyBJJiMzOTtsbCBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSB0aGUgYWJpbGl0eSB0byBmaW5lLXR1bmUgYXNwZWN0cyBsaWtlIGNvbXByZXNzaW9uIGFsZ29yaXRobXMsIHdyaXRlYmFjayBwb2xpY2llcywgb3IgbWVtb3J5IGFsbG9jYXRpb24gc3RyYXRlZ2llcyB0aHJvdWdoIHRob3NlIG9wdGlvbnMuIEkgc2hvdWxkIGFsc28gaW52ZXN0aWdhdGUgd2hldGhlciBhbnkgZGVwZW5kZW5jaWVzIGV4aXN0IGJldHdlZW4gdGhlIEtjb25maWcgb3B0aW9ucy4gSSBuZWVkIHRvIGJlIHN1cmUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIGNoYW5naW5nIHRoZW0sIGFyZSBjbGVhciBhbmQgZG9jdW1lbnRlZC4KClVsdGltYXRlbHksIEkgd2FudCBhIGNvbXBsZXRlLCB1cC10by1kYXRlLCBwaWN0dXJlIG9mIGhvdyB0aGVzZSB0aHJlZSBlbGVtZW50cyBpbnRlcmFjdC4gSSYjMzk7bGwgZm9jdXMgb24gcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBhbmQgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIHRvIGJ1aWxkIGEgcmVsaWFibGUgbWVudGFsIG1vZGVsIG9mIHpzd2FwJiMzOTtzIGludGVybmFsIG9wZXJhdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS96c3dhcC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTIwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMjA6XHQvKiBFbmFibGUvZGlzYWJsZSBtZW1vcnkgcHJlc3N1cmUtYmFzZWQgc2hyaW5rZXIuICovXG4gMTIxOlx0c3RhdGljIGJvb2wgenN3YXBfc2hyaW5rZXJfZW5hYmxlZCA9IElTX0VOQUJMRUQoXG4gMTIyOlx0XHRcdENPTkZJR19aU1dBUF9TSFJJTktFUl9ERUZBVUxUX09OKTtcbiAxMjM6XHRtb2R1bGVfcGFyYW1fbmFtZWQoc2hyaW5rZXJfZW5hYmxlZCwgenN3YXBfc2hyaW5rZXJfZW5hYmxlZCwgYm9vbCwgMDY0NCk7XG4gMTI0Olx0XG4gMTI1Olx0Ym9vbCB6c3dhcF9pc19lbmFibGVkKHZvaWQpXG4gMTI2Olx0e1xuIDEyNzpcdFx0cmV0dXJuIHpzd2FwX2VuYWJsZWQ7XG4gMTI4Olx0fVxuIDEyOTpcdFxuIDEzMDpcdGJvb2wgenN3YXBfbmV2ZXJfZW5hYmxlZCh2b2lkKVxuIDEzMTpcdHtcbiAxMzI6XHRcdHJldHVybiAhc3RhdGljX2JyYW5jaF9tYXliZShDT05GSUdfWlNXQVBfREVGQVVMVF9PTiwgXHUwMDI2enN3YXBfZXZlcl9lbmFibGVkKTtcbiAxMzM6XHR9XG4gMTM0Olx0XG4gMTM1Olx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIDEzNjpcdCogZGF0YSBzdHJ1Y3R1cmVzXG4gMTM3Olx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAxMzg6XHRcbiAxMzk6XHRzdHJ1Y3QgY3J5cHRvX2Fjb21wX2N0eCB7XG4gMTQwOlx0XHRzdHJ1Y3QgY3J5cHRvX2Fjb21wICphY29tcDtcbiAxNDE6XHRcdHN0cnVjdCBhY29tcF9yZXEgKnJlcTtcbiAxNDI6XHRcdHN0cnVjdCBjcnlwdG9fd2FpdCB3YWl0O1xuIDE0MzpcdFx0dTggKmJ1ZmZlcjtcbiAxNDQ6XHRcdHN0cnVjdCBtdXRleCBtdXRleDtcbiAxNDU6XHR9O1xuIDE0NjpcdFxuIDE0NzpcdC8qXG4gMTQ4Olx0ICogVGhlIGxvY2sgb3JkZXJpbmcgaXMgenN3YXBfdHJlZS5sb2NrIC1cdTAwM2UgenN3YXBfcG9vbC5scnVfbG9jay5cbiAxNDk6XHQgKiBUaGUgb25seSBjYXNlIHdoZXJlIGxydV9sb2NrIGlzIG5vdCBhY3F1aXJlZCB3aGlsZSBob2xkaW5nIHRyZWUubG9jayBpc1xuIDE1MDpcdCAqIHdoZW4gYSB6c3dhcF9lbnRyeSBpcyB0YWtlbiBvZmYgdGhlIGxydSBmb3Igd3JpdGViYWNrLCBpbiB0aGF0IGNhc2UgaXRcbiAxNTE6XHQgKiBuZWVkcyB0byBiZSB2ZXJpZmllZCB0aGF0IGl0JiMzOTtzIHN0aWxsIHZhbGlkIGluIHRoZSB0cmVlLlxuIDE1MjpcdCAqL1xuIDE1MzpcdHN0cnVjdCB6c3dhcF9wb29sIHtcbiAxNTQ6XHRcdHN0cnVjdCB6c19wb29sICp6c19wb29sO1xuIDE1NTpcdFx0c3RydWN0IGNyeXB0b19hY29tcF9jdHggX19wZXJjcHUgKmFjb21wX2N0eDtcbiAxNTY6XHRcdHN0cnVjdCBwZXJjcHVfcmVmIHJlZjtcbiAxNTc6XHRcdHN0cnVjdCBsaXN0X2hlYWQgbGlzdDtcbiAxNTg6XHRcdHN0cnVjdCB3b3JrX3N0cnVjdCByZWxlYXNlX3dvcms7XG4gMTU5Olx0XHRzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcxNDcKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGB6c3dhcF9pbnZhbGlkYXRlYCBmdW5jdGlvbiBhbmQgc2VlIHdoYXQgaXQmIzM5O3MgYWxsIGFib3V0LiBBcyBzb21lb25lIGRlZXBseSBmYW1pbGlhciB3aXRoIG1lbW9yeSBtYW5hZ2VtZW50IGluIHRoZSBrZXJuZWwsIEkmIzM5O20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gcGxheXMgYSBjcnVjaWFsIHJvbGUsIGxpa2VseSBpbnZvbHZpbmcgdGhlIG1hbmFnZW1lbnQgb2Ygc3dhcHBlZCBwYWdlcyB3aXRoaW4gdGhlIHpzd2FwIHN1YnN5c3RlbS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2UsIHdoZW4gaXQmIzM5O3MgY2FsbGVkLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgaG93IGl0IGVuc3VyZXMgZGF0YSBjb25zaXN0ZW5jeSBhbmQgZWZmaWNpZW50IHJlc291cmNlIHV0aWxpemF0aW9uLgoKSSYjMzk7bSBtZW50YWxseSBwcmVwYXJpbmcgdG8gc2NydXRpbml6ZSBpdHMgbG9naWMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGNsdWVzIGFib3V0IHRoZSBjb25kaXRpb25zIHRoYXQgdHJpZ2dlciBhbiBpbnZhbGlkYXRpb24uIElzIGl0IGJhc2VkIG9uIGEgdGltZXIsIG1lbW9yeSBwcmVzc3VyZSwgb3Igc29tZSBvdGhlciBldmVudD8gRG9lcyBpdCBpbnRlcmFjdCB3aXRoIHBhZ2UgdGFibGVzIGRpcmVjdGx5PyBEb2VzIGl0IGludm9sdmUgZnJlZWluZyB0aGUgYXNzb2NpYXRlZCBjb21wcmVzc2VkIGRhdGEgb3IgbWVyZWx5IG1hcmtpbmcgdGhlIHN3YXAgZW50cnkgYXMgaW52YWxpZD8gSSYjMzk7bGwgYWxzbyB0cnkgdG8gdW5kZXJzdGFuZCBpdHMgcmVsYXRpb25zaGlwIHRvIG90aGVyIGZ1bmN0aW9ucywgbGlrZSB0aG9zZSByZXNwb25zaWJsZSBmb3IgcGFnZSByZWNsYWltIGFuZCBzd2FwLW91dC4gSSBuZWVkIHRvIHBpZWNlIHRvZ2V0aGVyIGl0cyByb2xlIGluIHByZXZlbnRpbmcgdGhlIHpzd2FwIGNhY2hlIGZyb20gYmVjb21pbmcgc3RhbGUuIEkgZXhwZWN0IGl0JiMzOTtsbCB1c2Ugc29tZSBhdG9taWMgb3BlcmF0aW9ucyBvciBsb2NraW5nIHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LiBBbnkgY2xldmVyIG9wdGltaXphdGlvbnMgb3IgZWRnZS1jYXNlIGhhbmRsaW5nIHdpbGwgYWxzbyBjYXRjaCBteSBleWUuIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgZGVhbHMgd2l0aCBwb3RlbnRpYWwgSS9PIGVycm9ycyBhbmQgYW55IG1lY2hhbmlzbXMgaXQgdXNlcyB0byBhdm9pZCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy4gU28sIGJyaW5nIG9uIHRoZSBjb2RlISBMZXQmIzM5O3Mgc2VlIGhvdyBpdCYjMzk7cyBpbXBsZW1lbnRlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7enN3YXBfaW52YWxpZGF0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9zd2FwZmlsZS5jPTEzMTY9c3RhdGljIHZvaWQgc3dhcF9yYW5nZV9mcmVlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsXG4tLVxubW0vc3dhcGZpbGUuYy0xMzIzLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfZW50cmllczsgaSYjNDM7JiM0MzspXG5tbS9zd2FwZmlsZS5jOjEzMjQ6XHRcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHNpLVx1MDAzZXR5cGUsIG9mZnNldCAmIzQzOyBpKSk7XG5tbS9zd2FwZmlsZS5jLTEzMjUtXG4tLVxubW0venN3YXAuYz0xNDc4PWJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS96c3dhcC5jLTE1NTItXHRcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcdTAwM2MgbnJfcGFnZXM7ICYjNDM7JiM0MztpbmRleClcbm1tL3pzd2FwLmM6MTU1MzpcdFx0XHR6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgJiM0MzsgaW5kZXgpKTtcbm1tL3pzd2FwLmMtMTU1NC1cbi0tXG5tbS96c3dhcC5jPTE1ODA9aW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS96c3dhcC5jLTE2MzItXG5tbS96c3dhcC5jOjE2MzM6dm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cClcbm1tL3pzd2FwLmMtMTYzNC17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc3NTYKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIHpzd2FwX2ludmFsaWRhdGUqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gYHpzd2FwX2ludmFsaWRhdGVgIGluIGBtbS96c3dhcC5jYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgaW4gdGhlIGxhcmdlciBwaWN0dXJlIG9mIHpzd2FwJiMzOTtzIGZ1bmN0aW9uYWxpdHksIHNwZWNpZmljYWxseSBob3cgaXQgaGFuZGxlcyByZWNsYWltaW5nIG9yIGludmFsaWRhdGluZyBwYWdlcyB3aXRoaW4gdGhlIHpzd2FwIGNhY2hlLiBJIGtub3cgdGhlIGNvcmUgaWRlYSBpcyBhYm91dCBlbnN1cmluZyBtZW1vcnkgY29uc2lzdGVuY3kgYW5kIHByZXZlbnRpbmcgc3RhbGUgZGF0YSBmcm9tIHJlc2lkaW5nIHdpdGhpbiB0aGUgc3dhcCBjYWNoZS4KCkkmIzM5O20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGF0IHBvaW50cyB3aGVyZSB0aGUgYmFja2luZyBwYWdlIG1pZ2h0IGJlIG1vZGlmaWVkLCBvciB3aGVuIHRoZSBzeXN0ZW0gbmVlZHMgdG8gZnJlZSB1cCBzcGFjZSBpbiB0aGUgenN3YXAgcG9vbC4gSSYjMzk7bSBrZWVuIHRvIHNlZSB0aGUgc3BlY2lmaWMgY29uZGl0aW9ucyBmb3IgaW52YWxpZGF0aW9uIOKAkyBhcmUgd2UgdGFsa2luZyBhYm91dCBwYWdlIGZhdWx0cywgZGlyZWN0IHJlY2xhaW0sIG9yIHNvbWUgb3RoZXIgdHJpZ2dlcj8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBwYWdlIHRhYmxlcywgYW5kIGhvdyBpdCBoYW5kbGVzIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuIEkmIzM5O20gYWxzbyBjdXJpb3VzIGFib3V0IHRoZSBtZWNoYW5pc21zIGl0IGVtcGxveXMsIHN1Y2ggYXMgaW52YWxpZGF0aW5nIHRoZSBwYWdlIGNhY2hlIGVudHJpZXMgYW5kIHBvdGVudGlhbGx5IGluaXRpYXRpbmcgYSB3cml0ZWJhY2sgdG8gdGhlIHN3YXAgZGV2aWNlIGlmIHJlcXVpcmVkLiBGaW5hbGx5LCBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBob3cgaXQgaW50ZXJhY3RzIHdpdGggYW55IG90aGVyIHN1YnN5c3RlbXMgb3IgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgZGVwZW5kIG9uIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgenN3YXAgcGFnZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0venN3YXAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE2MzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTYzMDpcdFx0cmV0dXJuIDA7XG4xNjMxOlx0fVxuMTYzMjpcdFxuMTYzMzpcdHZvaWQgenN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnlfdCBzd3ApXG4xNjM0Olx0e1xuMTYzNTpcdFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XG4xNjM2Olx0XHRzdHJ1Y3QgeGFycmF5ICp0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cCk7XG4xNjM3Olx0XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xuMTYzODpcdFxuMTYzOTpcdFx0aWYgKHhhX2VtcHR5KHRyZWUpKVxuMTY0MDpcdFx0XHRyZXR1cm47XG4xNjQxOlx0XG4xNjQyOlx0XHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XG4xNjQzOlx0XHRpZiAoZW50cnkpXG4xNjQ0Olx0XHRcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuMTY0NTpcdH1cbjE2NDY6XHRcbjE2NDc6XHRpbnQgenN3YXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuMTY0ODpcdHtcbjE2NDk6XHRcdHN0cnVjdCB4YXJyYXkgKnRyZWVzLCAqdHJlZTtcbjE2NTA6XHRcdHVuc2lnbmVkIGludCBuciwgaTtcbjE2NTE6XHRcbjE2NTI6XHRcdG5yID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTtcbjE2NTM6XHRcdHRyZWVzID0ga3Z6YWxsb2Nfb2JqcygqdHJlZSwgbnIpO1xuMTY1NDpcdFx0aWYgKCF0cmVlcykge1xuMTY1NTpcdFx0XHRwcl9lcnIoXCYjMzQ7YWxsb2MgZmFpbGVkLCB6c3dhcCBkaXNhYmxlZCBmb3Igc3dhcCB0eXBlICVkXFxuXCYjMzQ7LCB0eXBlKTtcbjE2NTY6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4xNjU3Olx0XHR9XG4xNjU4Olx0XG4xNjU5Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSYjNDM7JiM0MzspXG4xNjYwOlx0XHRcdHhhX2luaXQodHJlZXMgJiM0MzsgaSk7XG4xNjYxOlx0XG4xNjYyOlx0XHRucl96c3dhcF90cmVlc1t0eXBlXSA9IG5yO1xuMTY2MzpcdFx0enN3YXBfdHJlZXNbdHlwZV0gPSB0cmVlcztcbjE2NjQ6XHRcdHJldHVybiAwO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NTYyCgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5JiMzOTtyZSBteSBvd246CgoqKkludmVzdGlnYXRpbmcgS2NvbmZpZyBmb3IgenN3YXAqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgdG8gaXQuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgS2NvbmZpZyBmaWxlcyByZWxhdGVkIHRvIHpzd2FwLiBObyBmbHVmZiwgbGV0JiMzOTtzIGdldCBkb3duIHRvIHRoZSBjb25maWd1cmF0aW9uIGRldGFpbHMuIEkgd2FudCB0byBzZWUgaG93IHRoaXMgZmVhdHVyZSBpcyBjb250cm9sbGVkIGFuZCB3aGF0IG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4gV2hhdCBhcmUgdGhlIGRlcGVuZGVuY2llcz8gQXJlIHRoZXJlIGFueSBoaWRkZW4gc2V0dGluZ3M/IEFyZSB0aGVyZSBhbnkgaW50ZXJlc3RpbmcgdGhpbmdzIEkgY2FuIGRvIHdpdGggaXQ/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB1bmRlcmx5aW5nIGZyYW1ld29yaywgaG93IHRvIGVuYWJsZS9kaXNhYmxlIGl0LCBhbmQgd2hhdCB2YXJpYWJsZXMgYXJlIGF0IHBsYXkgaGVyZS4gVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCBrbm93bGVkZ2UgaXMsIGF0IHRoZSBjb25maWd1cmF0aW9uIGxldmVsLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBaU1dBUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTEyPW1lbnVjb25maWcgU1dBUFxuLS1cbm1tL0tjb25maWctMjEtXG5tbS9LY29uZmlnOjIyOmNvbmZpZyBaU1dBUFxubW0vS2NvbmZpZy0yMy1cdGJvb2wgXCYjMzQ7Q29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1wmIzM0O1xuLS1cbm1tL0tjb25maWctMzQtXG5tbS9LY29uZmlnOjM1OmNvbmZpZyBaU1dBUF9ERUZBVUxUX09OXG5tbS9LY29uZmlnLTM2LVx0Ym9vbCBcJiMzNDtFbmFibGUgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgYnkgZGVmYXVsdFwmIzM0O1xuLS1cbm1tL0tjb25maWctNDQtXG5tbS9LY29uZmlnOjQ1OmNvbmZpZyBaU1dBUF9TSFJJTktFUl9ERUZBVUxUX09OXG5tbS9LY29uZmlnLTQ2LVx0Ym9vbCBcJiMzNDtTaHJpbmsgdGhlIHpzd2FwIHBvb2wgb24gbWVtb3J5IHByZXNzdXJlXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz01OT1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTc2LVxubW0vS2NvbmZpZzo3Nzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0RFRkxBVEVcbm1tL0tjb25maWctNzgtXHRib29sIFwmIzM0O0RlZmxhdGVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTgyLVxubW0vS2NvbmZpZzo4Mzpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaT1xubW0vS2NvbmZpZy04NC1cdGJvb2wgXCYjMzQ7TFpPXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy04OC1cbm1tL0tjb25maWc6ODk6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF84NDJcbm1tL0tjb25maWctOTAtXHRib29sIFwmIzM0Ozg0MlwmIzM0O1xuLS1cbm1tL0tjb25maWctOTQtXG5tbS9LY29uZmlnOjk1OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0XG5tbS9LY29uZmlnLTk2LVx0Ym9vbCBcJiMzNDtMWjRcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTEwMC1cbm1tL0tjb25maWc6MTAxOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFo0SENcbm1tL0tjb25maWctMTAyLVx0Ym9vbCBcJiMzNDtMWjRIQ1wmIzM0O1xuLS1cbm1tL0tjb25maWctMTA2LVxubW0vS2NvbmZpZzoxMDc6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9aU1REXG5tbS9LY29uZmlnLTEwOC1cdGJvb2wgXCYjMzQ7enN0ZFwmIzM0O1xuLS1cbm1tL0tjb25maWc9MTEyPWVuZGNob2ljZVxubW0vS2NvbmZpZy0xMTMtXG5tbS9LY29uZmlnOjExNDpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUXG5tbS9LY29uZmlnLTExNS0gICAgICAgc3RyaW5nXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDkyOTUKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGl2aW5nIGludG8gdGhlIFpTV0FQIENvbmZpZ3VyYXRpb24qKgoKT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkgd2l0aCB0aGlzIGBaU1dBUGAgY29uZmlndXJhdGlvbi4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBzdHJ1Y3R1cmUgd2l0aGluIHRoZSBrZXJuZWwmIzM5O3MgYnVpbGQgc3lzdGVtLiBMZXQmIzM5O3Mgc3RhcnQgYnkgbmF2aWdhdGluZyBkaXJlY3RseSB0byBgbW0vS2NvbmZpZ2AuIFRoYXQmIzM5O3Mgd2hlcmUgSSBleHBlY3QgdG8gZmluZCB0aGUgcmVsZXZhbnQgZGVmaW5pdGlvbnMgYW5kIGRlcGVuZGVuY2llcyBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucy4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgdGhlIHNlY3Rpb24gcmVsYXRlZCB0byBgY29uZmlnIFpTV0FQYC4gSSB3YW50IHRvIHNlZSBob3cgaXQmIzM5O3MgZGVmaW5lZCwgd2hpY2ggb3RoZXIgY29uZmlndXJhdGlvbnMgaXQgZGVwZW5kcyBvbiwgYW5kIHdoYXQgdGhlIGRlZmF1bHQgc2V0dGluZ3MgbWlnaHQgYmUuIFRoaXMgd2lsbCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyBpdCB3aXRoaW4gYSBrZXJuZWwgY29uZmlndXJhdGlvbi4gS25vd2luZyB0aGUgYEtjb25maWdgIHN0cnVjdHVyZSBoZWxwcyBtZSBhc3Nlc3MgcG90ZW50aWFsIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgMTU6XHRcdGRlZmF1bHQgeVxuICAxNjpcdFx0aGVscFxuICAxNzpcdFx0ICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGNob29zZSB3aGV0aGVyIHlvdSB3YW50IHRvIGhhdmUgc3VwcG9ydFxuICAxODpcdFx0ICBmb3Igc28gY2FsbGVkIHN3YXAgZGV2aWNlcyBvciBzd2FwIGZpbGVzIGluIHlvdXIga2VybmVsIHRoYXQgYXJlXG4gIDE5Olx0XHQgIHVzZWQgdG8gcHJvdmlkZSBtb3JlIHZpcnR1YWwgbWVtb3J5IHRoYW4gdGhlIGFjdHVhbCBSQU0gcHJlc2VudFxuICAyMDpcdFx0ICBpbiB5b3VyIGNvbXB1dGVyLiAgSWYgdW5zdXJlIHNheSBZLlxuICAyMTpcdFxuICAyMjpcdGNvbmZpZyBaU1dBUFxuICAyMzpcdFx0Ym9vbCBcJiMzNDtDb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzXCYjMzQ7XG4gIDI0Olx0XHRkZXBlbmRzIG9uIFNXQVBcbiAgMjU6XHRcdHNlbGVjdCBDUllQVE9cbiAgMjY6XHRcdHNlbGVjdCBaU01BTExPQ1xuICAyNzpcdFx0aGVscFxuICAyODpcdFx0ICBBIGxpZ2h0d2VpZ2h0IGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMuICBJdCB0YWtlc1xuICAyOTpcdFx0ICBwYWdlcyB0aGF0IGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBzd2FwcGVkIG91dCBhbmQgYXR0ZW1wdHMgdG9cbiAgMzA6XHRcdCAgY29tcHJlc3MgdGhlbSBpbnRvIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIFJBTS1iYXNlZCBtZW1vcnkgcG9vbC5cbiAgMzE6XHRcdCAgVGhpcyBjYW4gcmVzdWx0IGluIGEgc2lnbmlmaWNhbnQgSS9PIHJlZHVjdGlvbiBvbiBzd2FwIGRldmljZSBhbmQsXG4gIDMyOlx0XHQgIGluIHRoZSBjYXNlIHdoZXJlIGRlY29tcHJlc3NpbmcgZnJvbSBSQU0gaXMgZmFzdGVyIHRoYW4gc3dhcCBkZXZpY2VcbiAgMzM6XHRcdCAgcmVhZHMsIGNhbiBhbHNvIGltcHJvdmUgd29ya2xvYWQgcGVyZm9ybWFuY2UuXG4gIDM0Olx0XG4gIDM1Olx0Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cbiAgMzY6XHRcdGJvb2wgXCYjMzQ7RW5hYmxlIHRoZSBjb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzIGJ5IGRlZmF1bHRcJiMzNDtcbiAgMzc6XHRcdGRlcGVuZHMgb24gWlNXQVBcbiAgMzg6XHRcdGhlbHBcbiAgMzk6XHRcdCAgSWYgc2VsZWN0ZWQsIHRoZSBjb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzIHdpbGwgYmUgZW5hYmxlZFxuICA0MDpcdFx0ICBhdCBib290LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBkaXNhYmxlZC5cbiAgNDE6XHRcbiAgNDI6XHRcdCAgVGhlIHNlbGVjdGlvbiBtYWRlIGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdXNpbmcgdGhlIGtlcm5lbFxuICA0MzpcdFx0ICBjb21tYW5kIGxpbmUgJiMzOTt6c3dhcC5lbmFibGVkPSYjMzk7IG9wdGlvbi5cbiAgNDQ6XHRcbiAgNDU6XHRjb25maWcgWlNXQVBfU0hSSU5LRVJfREVGQVVMVF9PTlxuICA0NjpcdFx0Ym9vbCBcJiMzNDtTaHJpbmsgdGhlIHpzd2FwIHBvb2wgb24gbWVtb3J5IHByZXNzdXJlXCYjMzQ7XG4gIDQ3Olx0XHRkZXBlbmRzIG9uIFpTV0FQXG4gIDQ4Olx0XHRkZWZhdWx0IG5cbiAgNDk6XHRcdGhlbHBcbiAgNTA6XHRcdCAgSWYgc2VsZWN0ZWQsIHRoZSB6c3dhcCBzaHJpbmtlciB3aWxsIGJlIGVuYWJsZWQsIGFuZCB0aGUgcGFnZXNcbiAgNTE6XHRcdCAgc3RvcmVkIGluIHRoZSB6c3dhcCBwb29sIHdpbGwgYmVjb21lIGF2YWlsYWJsZSBmb3IgcmVjbGFpbSAoaS5lXG4gIDUyOlx0XHQgIHdyaXR0ZW4gYmFjayB0byB0aGUgYmFja2luZyBzd2FwIGRldmljZSkgb24gbWVtb3J5IHByZXNzdXJlLlxuICA1MzpcdFxuICA1NDpcdFx0ICBUaGlzIG1lYW5zIHRoYXQgenN3YXAgd3JpdGViYWNrIGNvdWxkIGhhcHBlbiBldmVuIGlmIHRoZSBwb29sIGlzXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMDk0CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogNzYxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFpzd2FwIFBhdGNoOiBXb3J0aHkgb2YgRnV6emluZyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIGB6c3dhcF9zdG9yZSgpYCB3aXRoaW4gYG1tL3pzd2FwLmNgLCB3aGljaCBpbW1lZGlhdGVseSBmbGFncyB0aGlzIGFzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIG1ha2luZyBpdCBhbiBpbnRlcmVzdGluZyB0YXJnZXQuIExldCYjMzk7cyBsb29rIGF0IHRoZSBzcGVjaWZpY3MuCgpGaXJzdCwgdGhlcmUmIzM5O3MgYSBndWFyZCBjb25kaXRpb24gYWRkZWQ6IGBpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7YC4gVGhpcyBzZWVtcyB0byBiZSBhIHF1aWNrIGV4aXQgaWYgenN3YXAgd2FzbiYjMzk7dCBlbmFibGVkIGluIHRoZSBmaXJzdCBwbGFjZSwgbGlrZWx5IGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiBJdCBhcHBlYXJzIHRoaXMgY2hlY2sgYXZvaWRzIGRvaW5nIGV4dHJhIHdvcmsgaWYgenN3YXAgd2FzbiYjMzk7dCBjb25maWd1cmVkLCB0aHVzIGF2b2lkaW5nIHBvdGVudGlhbCBsb2NrIGNvbnRlbnRpb24gYW5kIGNoZWNraW5nIHByZXZpb3VzbHkgc3RvcmVkIGludmFsaWRhdGlvbnMuCgpTZWNvbmQsIHRoZSBwYXRjaCByZXBsYWNlcyBhbiBleHBsaWNpdCBsb29wIGl0ZXJhdGluZyBhbmQgZXJhc2luZyBlbnRyaWVzIGZyb20gdGhlIHhhcnJheSB3aXRoIGEgY2FsbCB0byBgenN3YXBfaW52YWxpZGF0ZSgpYC4gVGhpcyBsb29rcyBsaWtlIGEgcmVmYWN0b3JpbmcuIERpZ2dpbmcgaW50byBgenN3YXBfaW52YWxpZGF0ZSgpYCwgaXQgZmlyc3QgY2hlY2tzIGlmIHRoZSB4YXJyYXkgaXMgZW1wdHkgYmVmb3JlIGF0dGVtcHRpbmcgYW4gZXJhc2UuIFRoaXMgaXMgbGlrZWx5IGludGVuZGVkIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYHpzd2FwYCBpcyBkaXNhYmxlZCwgYW5kIHRoaXMgYnJhbmNoIGlzIHNraXBwZWQuCgpHaXZlbiB0aGF0IHRoaXMgYWZmZWN0cyBjb250cm9sIGZsb3cgYW5kIHRoZSByZWZhY3RvcmluZyBvZiBzd2FwIHBhZ2UgaW52YWxpZGF0aW9uIHdpdGhpbiBgenN3YXBfc3RvcmVgLCBpdCYjMzk7cyBkZWZpbml0ZWx5IHNvbWV0aGluZyB0aGF0IHdhcnJhbnRzIGZ1enppbmcuIGB6c3dhcGAgYW5kIGBzd2FwYCBhcmUgY29yZSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IG1lY2hhbmlzbXMgd2l0aGluIHRoZSBrZXJuZWwsIGFuZCB0aGUgYG1tL2Agc3Vic3lzdGVtIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGV2ZW4gaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLgoKTm93LCBvbiB0byB0aGUgY29uZmlndXJhdGlvbi4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZnV6eiB0YXJnZXQgaW5jbHVkZXMgdGhlIHJlbGV2YW50IGNvbmZpZyBvcHRpb25zLiBUaGUga2V5IG9uZSBpcyBgWlNXQVBgLCB3aGljaCBsaXZlcyBpbiBgbW0vS2NvbmZpZ2AsIGFuZCB3aGljaCBkZXBlbmRzIG9uIGBTV0FQYC4gU28sIEkmIzM5O2xsIG5lZWQgdG8gaW5jbHVkZSBib3RoIG9mIHRoZW0uCgpOb3cgZm9yIHN5bWJvbCBhbmFseXNpcy4gYHpzd2FwX3N0b3JlYCBpcyB0aGUgcHJpbWFyeSBmdW5jdGlvbiBiZWluZyBtb2RpZmllZC4gYHpzd2FwX2ludmFsaWRhdGVgIGlzIGNhbGxlZCwgYW5kIGB6c3dhcF9uZXZlcl9lbmFibGVkYCBpcyBhbHNvIGNhbGxlZC4gYHpzd2FwX3N0b3JlYCBpcyB0aGUga2V5IGVudHJ5cG9pbnQgZm9yIGEgenN3YXAgc3RvcmFnZSBvcGVyYXRpb24uIEl0JiMzOTtzIG5vdCBhIGZ1bmN0aW9uIHRoYXQmIzM5O3MgdWJpcXVpdG91cyBhY3Jvc3MgdGhlIGtlcm5lbCwgd2hpY2ggbWFrZXMgaXQgbW9yZSBmb2N1c2VkIGFzIGEgdGFyZ2V0LiBMaWtld2lzZSwgYHpzd2FwX2ludmFsaWRhdGVgIGFuZCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAgc2VlbSBzcGVjaWZpYyB0byB0aGUgYHpzd2FwYCBwYXRoLiBTbyB0aGVzZSBhcmUgZ29vZCBmb2N1cyBzeW1ib2xzLiBJJiMzOTtsbCBtYWtlIHN1cmUgdGhleSBhcmUgYWNjZXNzaWJsZSB3aGVuIHRoZSBmdXp6ZXIgcnVucy4KCkkgc2hvdWxkIGFsc28gZG91YmxlLWNoZWNrIHdoZXRoZXIgYHpzd2FwX3N0b3JlYCBpcyBleHBvcnRlZCwgc3RhdGljLCBvciBpZiBpdHMgZGVmaW5pdGlvbiBpcyBpbiBhIGhlYWRlciwgYnV0IGdpdmVuIGl0JiMzOTtzIGEgYG1tL2AgZnVuY3Rpb24sIGl0JiMzOTtzIGxpa2VseSB2aXNpYmxlIHdpdGhpbiB0aGUga2VybmVsLCBzbyBpdCBwcm9iYWJseSBkb2VzbiYjMzk7dCBuZWVkIHRvIGJlIGV4dGVybmFsbHkgZXhwb3J0ZWQuIEhvd2V2ZXIsIGNoZWNraW5nIGBpbmNsdWRlL2xpbnV4L3pzd2FwLmhgIGlzIGEgZ29vZCBwcmFjdGljZSB0byBlbnN1cmUgZXZlcnl0aGluZyBpcyB2aXNpYmxlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt6c3dhcF9zdG9yZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9wYWdlX2lvLmM9MjA0PWludCBzd2FwX3dyaXRlb3V0KHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3BhZ2VfaW8uYy0yMzctXG5tbS9wYWdlX2lvLmM6MjM4Olx0aWYgKHpzd2FwX3N0b3JlKGZvbGlvKSkge1xubW0vcGFnZV9pby5jLTIzOS1cdFx0Y291bnRfbXRocF9zdGF0KGZvbGlvX29yZGVyKGZvbGlvKSwgTVRIUF9TVEFUX1pTV1BPVVQpO1xuLS1cbm1tL3pzd2FwLmMtNDYtLyogVGhlIG51bWJlciBvZiBwYWdlcyBjdXJyZW50bHkgc3RvcmVkIGluIHpzd2FwICovXG5tbS96c3dhcC5jOjQ3OmF0b21pY19sb25nX3QgenN3YXBfc3RvcmVkX3BhZ2VzID0gQVRPTUlDX0xPTkdfSU5JVCgwKTtcbm1tL3pzd2FwLmMtNDgtLyogVGhlIG51bWJlciBvZiBpbmNvbXByZXNzaWJsZSBwYWdlcyBjdXJyZW50bHkgc3RvcmVkIGluIHpzd2FwICovXG5tbS96c3dhcC5jOjQ5OnN0YXRpYyBhdG9taWNfbG9uZ190IHpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyA9IEFUT01JQ19MT05HX0lOSVQoMCk7XG5tbS96c3dhcC5jLTUwLVxuLS1cbm1tL3pzd2FwLmM9NzU1PXN0YXRpYyB2b2lkIHpzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSlcbi0tXG5tbS96c3dhcC5jLTc2NC1cdGlmIChlbnRyeS1cdTAwM2VsZW5ndGggPT0gUEFHRV9TSVpFKVxubW0venN3YXAuYzo3NjU6XHRcdGF0b21pY19sb25nX2RlYyhcdTAwMjZ6c3dhcF9zdG9yZWRfaW5jb21wcmVzc2libGVfcGFnZXMpO1xubW0venN3YXAuYy03NjYtXHR6c3dhcF9lbnRyeV9jYWNoZV9mcmVlKGVudHJ5KTtcbm1tL3pzd2FwLmM6NzY3Olx0YXRvbWljX2xvbmdfZGVjKFx1MDAyNnpzd2FwX3N0b3JlZF9wYWdlcyk7XG5tbS96c3dhcC5jLTc2OC19XG4tLVxubW0venN3YXAuYz05MTM9c3RhdGljIGJvb2wgenN3YXBfZGVjb21wcmVzcyhzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3pzd2FwLmMtOTcwLSAqIHRvIHRoZSBzd2FwIGRldmljZS4gIFdlIGFyZSBiYXNpY2FsbHkgcmVzdW1pbmcgdGhlIHNhbWUgc3dhcFxubW0venN3YXAuYzo5NzE6ICogd3JpdGViYWNrIHBhdGggdGhhdCB3YXMgaW50ZXJjZXB0ZWQgd2l0aCB0aGUgenN3YXBfc3RvcmUoKVxubW0venN3YXAuYy05NzItICogaW4gdGhlIGZpcnN0IHBsYWNlLiAgQWZ0ZXIgdGhlIGZvbGlvIGhhcyBiZWVuIGRlY29tcHJlc3NlZCBpbnRvXG4tLVxubW0venN3YXAuYz0xMTgxPXN0YXRpYyB1bnNpZ25lZCBsb25nIHpzd2FwX3Nocmlua2VyX2NvdW50KHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsXG4tLVxubW0venN3YXAuYy0xMjE1LVx0XHRucl9iYWNraW5nID0genN3YXBfdG90YWxfcGFnZXMoKTtcbm1tL3pzd2FwLmM6MTIxNjpcdFx0bnJfc3RvcmVkID0gYXRvbWljX2xvbmdfcmVhZChcdTAwMjZ6c3dhcF9zdG9yZWRfcGFnZXMpO1xubW0venN3YXAuYy0xMjE3LVx0fVxuLS1cbm1tL3pzd2FwLmM9MTMwNj1zdGF0aWMgdm9pZCBzaHJpbmtfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqdylcbi0tXG5tbS96c3dhcC5jLTEzOTYtXG5tbS96c3dhcC5jOjEzOTc6c3RhdGljIGJvb2wgenN3YXBfc3RvcmVfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb25nIGluZGV4LFxubW0venN3YXAuYy0xMzk4LVx0XHRcdCAgICAgc3RydWN0IG9ial9jZ3JvdXAgKm9iamNnLFxuLS1cbm1tL3pzd2FwLmMtMTQzNi1cdCAqIG5vIGZ1cnRoZXIgcG9zc2liaWxpdHkgb2YgZmFpbHVyZS4gR3JhYiByZWZzIHRvIHRoZSBwb29sIGFuZCBvYmpjZyxcbm1tL3pzd2FwLmM6MTQzNzpcdCAqIGNoYXJnZSB6c3dhcCBtZW1vcnksIGFuZCBpbmNyZW1lbnQgenN3YXBfc3RvcmVkX3BhZ2VzLlxubW0venN3YXAuYy0xNDM4LVx0ICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpXG4tLVxubW0venN3YXAuYy0xNDQ1LVx0fVxubW0venN3YXAuYzoxNDQ2Olx0YXRvbWljX2xvbmdfaW5jKFx1MDAyNnpzd2FwX3N0b3JlZF9wYWdlcyk7XG5tbS96c3dhcC5jLTE0NDctXHRpZiAoZW50cnktXHUwMDNlbGVuZ3RoID09IFBBR0VfU0laRSlcbm1tL3pzd2FwLmM6MTQ0ODpcdFx0YXRvbWljX2xvbmdfaW5jKFx1MDAyNnpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyk7XG5tbS96c3dhcC5jLTE0NDktXG4tLVxubW0venN3YXAuYy0xNDc3LVxubW0venN3YXAuYzoxNDc4OmJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbm1tL3pzd2FwLmMtMTQ3OS17XG4tLVxubW0venN3YXAuYy0xNTIzLVx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7XG5tbS96c3dhcC5jOjE1MjQ6XHRcdGlmICghenN3YXBfc3RvcmVfcGFnZShmb2xpbywgaW5kZXgsIG9iamNnLCBwb29sKSlcbm1tL3pzd2FwLmMtMTUyNS1cdFx0XHRnb3RvIHB1dF9wb29sO1xuLS1cbm1tL3pzd2FwLmM9MTY5OT1zdGF0aWMgaW50IGRlYnVnZnNfZ2V0X3N0b3JlZF9wYWdlcyh2b2lkICpkYXRhLCB1NjQgKnZhbClcbm1tL3pzd2FwLmMtMTcwMC17XG5tbS96c3dhcC5jOjE3MDE6XHQqdmFsID0gYXRvbWljX2xvbmdfcmVhZChcdTAwMjZ6c3dhcF9zdG9yZWRfcGFnZXMpO1xubW0venN3YXAuYy0xNzAyLVx0cmV0dXJuIDA7XG4tLVxubW0venN3YXAuYz0xNzA2PXN0YXRpYyBpbnQgZGVidWdmc19nZXRfc3RvcmVkX2luY29tcHJlc3NpYmxlX3BhZ2VzKHZvaWQgKmRhdGEsIHU2NCAqdmFsKVxubW0venN3YXAuYy0xNzA3LXtcbm1tL3pzd2FwLmM6MTcwODpcdCp2YWwgPSBhdG9taWNfbG9uZ19yZWFkKFx1MDAyNnpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyk7XG5tbS96c3dhcC5jLTE3MDktXHRyZXR1cm4gMDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI3MDEKCQkJCQkJCW91dHB1dDogMjYKCQkJCQkJCXRob3VnaHRzOiAxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcyBvbiB0aGlzOgoKKipFeGFtaW5pbmcgWnN3YXAgRGVjbGFyYXRpb25zKioKCkFscmlnaHQsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgenN3YXAuIFRoYXQgbWVhbnMgSSBzaG91bGQgaW1tZWRpYXRlbHkgdHVybiB0byB0aGUgc291cmNlIGNvZGUsIHNwZWNpZmljYWxseSBgaW5jbHVkZS9saW51eC96c3dhcC5oYC4gVGhhdCBoZWFkZXIgZmlsZSBpcyAqdGhlKiBwbGFjZSB0byBmaW5kIHRoZSBlc3NlbnRpYWwgZGF0YSBzdHJ1Y3R1cmVzLCBmdW5jdGlvbiBwcm90b3R5cGVzLCBhbmQgYW55IGtleSBtYWNybyBkZWZpbml0aW9ucyByZWxhdGVkIHRvIHpzd2FwJiMzOTtzIGludGVybmFsIHdvcmtpbmdzLiBCeSBleGFtaW5pbmcgdGhlIGRlY2xhcmF0aW9ucyB0aGVyZSwgSSBjYW4gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhpcyBjb21wcmVzc2lvbiBhbmQgc3dhcHBpbmcgbWVjaGFuaXNtIGlzIGFyY2hpdGVjdGVkLiBJJiMzOTttIGxvb2tpbmcgZm9yIHRoZSBjb3JlIGRhdGEgc3RydWN0dXJlcyB0aGF0IG1hbmFnZSB0aGUgY29tcHJlc3NlZCBwYWdlcywgaG93IHRoZXkmIzM5O3JlIHN0b3JlZCwgd2hhdCBsb2NrcyBhcmUgdXNlZCwgYW5kIHRoZSBpbnRlcmZhY2VzIGludm9sdmVkIGluIHRoZSBjb21wcmVzc2lvbiwgZGVjb21wcmVzc2lvbiwgYW5kIHN3YXBwaW5nIG9wZXJhdGlvbnMuIEl0JiMzOTtzIHRpbWUgdG8gZGlnIGluIGFuZCBnZXQgYSBmaXJtIGdyYXNwIG9mIHRoZSBmb3VuZGF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt6c3dhcF9zdG9yZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvenN3YXAuaD04PXN0cnVjdCBscnV2ZWM7XG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtOS1cbmluY2x1ZGUvbGludXgvenN3YXAuaDoxMDpleHRlcm4gYXRvbWljX2xvbmdfdCB6c3dhcF9zdG9yZWRfcGFnZXM7XG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtMTEtXG4tLVxuaW5jbHVkZS9saW51eC96c3dhcC5oPTI3PXVuc2lnbmVkIGxvbmcgenN3YXBfdG90YWxfcGFnZXModm9pZCk7XG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg6Mjg6Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbmluY2x1ZGUvbGludXgvenN3YXAuaC0yOS1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcbi0tXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg9NDA9c3RydWN0IHpzd2FwX2xydXZlY19zdGF0ZSB7fTtcbmluY2x1ZGUvbGludXgvenN3YXAuaC00MS1cbmluY2x1ZGUvbGludXgvenN3YXAuaDo0MjpzdGF0aWMgaW5saW5lIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbmluY2x1ZGUvbGludXgvenN3YXAuaC00My17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMTUyCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyBgc3dhcF93cml0ZW91dGAqKgoKT2theSwgdGltZSB0byBkaXZlIGluLiBJIG5lZWQgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0IGBzd2FwX3dyaXRlb3V0YCwgYW5kIGJhc2VkIG9uIG15IG1lbW9yeSwgdGhhdCYjMzk7cyBwcm9iYWJseSByZXNpZGluZyBpbiBgbW0vcGFnZV9pby5jYC4gTGV0JiMzOTtzIGdldCBjcmFja2luZyBhbmQgY29uZmlybSB0aGF0IG15IGFzc3VtcHRpb25zIGFib3V0IHRoZSBsb2NhdGlvbiBhcmUgYWNjdXJhdGUuIFRoaXMgaXMgd2hlcmUgSSYjMzk7bGwgZmluZCB0aGUgY29yZSBsb2dpYyBmb3Igd3JpdGluZyBvdXQgcGFnZXMgdG8gc3dhcCBzcGFjZSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgaXQgZnVuY3Rpb25zLCBlc3BlY2lhbGx5IGluIHJlbGF0aW9uIHRvIHRoZSBvdmVyYWxsIHBhZ2UgcmVjbGFpbSBwcm9jZXNzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL3BhZ2VfaW8uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjMwOlx0XG4gMjMxOlx0XHQvKlxuIDIzMjpcdFx0ICogQ2xlYXIgYml0cyB0aGlzIGZvbGlvIG9jY3VwaWVzIGluIHRoZSB6ZXJvbWFwIHRvIHByZXZlbnQgemVybyBkYXRhXG4gMjMzOlx0XHQgKiBiZWluZyByZWFkIGluIGZyb20gYW55IHByZXZpb3VzIHplcm8gd3JpdGVzIHRoYXQgb2NjdXBpZWQgdGhlIHNhbWVcbiAyMzQ6XHRcdCAqIHN3YXAgZW50cmllcy5cbiAyMzU6XHRcdCAqL1xuIDIzNjpcdFx0c3dhcF96ZXJvbWFwX2ZvbGlvX2NsZWFyKGZvbGlvKTtcbiAyMzc6XHRcbiAyMzg6XHRcdGlmICh6c3dhcF9zdG9yZShmb2xpbykpIHtcbiAyMzk6XHRcdFx0Y291bnRfbXRocF9zdGF0KGZvbGlvX29yZGVyKGZvbGlvKSwgTVRIUF9TVEFUX1pTV1BPVVQpO1xuIDI0MDpcdFx0XHRnb3RvIG91dF91bmxvY2s7XG4gMjQxOlx0XHR9XG4gMjQyOlx0XG4gMjQzOlx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gMjQ0Olx0XHRpZiAoIW1lbV9jZ3JvdXBfenN3YXBfd3JpdGViYWNrX2VuYWJsZWQoZm9saW9fbWVtY2coZm9saW8pKSkge1xuIDI0NTpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiAyNDY6XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4gMjQ3Olx0XHRcdHJldHVybiBBT1BfV1JJVEVQQUdFX0FDVElWQVRFO1xuIDI0ODpcdFx0fVxuIDI0OTpcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNjM4CgkJCQkJCQlvdXRwdXQ6IDEyNgoJCQkJCQkJdGhvdWdodHM6IDMxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGZvY3VzLiBJdCBsb29rcyBsaWtlIHRoZSBjb3JlIG1vZGlmaWNhdGlvbiBjZW50ZXJzIGFyb3VuZCBgenN3YXBfc3RvcmVgLCB0aGUgZnVuY3Rpb24gYmVpbmcgZGlyZWN0bHkgYWx0ZXJlZC4gYHpzd2FwX2ludmFsaWRhdGVgIGlzIHRoZSBoZWxwZXIgdGhleSYjMzk7cmUgdXNpbmcgdG8gcmVwbGFjZSB0aGUgb3Blbi1jb2RlZCB0cmVlIGVyYXN1cmUgbG9naWMsIHdoaWNoIGlzIGdvb2QgZm9yIG1haW50YWluYWJpbGl0eS4gQW5kIGp1c3QgdG8gYmUgc3VyZSwgYHN3YXBfd3JpdGVvdXRgIGlzIHRoZSBjYWxsZXIgb2YgYHpzd2FwX3N0b3JlYC4gU29saWQuCgpOZXh0LCBJIGhhdmUgdG8gZW5zdXJlIHRoZSBwcm9wZXIgY29uZmlndXJhdGlvbnMgYXJlIGluIHBsYWNlIGZvciB0aGUgZnV6emVyIHRvIGVuZ2FnZSB3aXRoIHRoaXMgY2hhbmdlLiBJdCBsb29rcyBsaWtlIGBaU1dBUGAgaXMgdGhlIG1haW4gY29uZmlndXJhdGlvbiBpdGVtLCB3aXRoIGBTV0FQYCBhcyBpdHMgZGVwZW5kZW5jeS4gVGhhdCBhbGlnbnMgd2l0aCBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzeXN0ZW0uCgpOb3csIGxldCYjMzk7cyByZXZpZXcgdGhlIHBhcmFtZXRlcnMgZm9yIGBzZXQtcmVzdWx0c2AuIFRoZSBgV29ydGhGdXp6aW5nYCBmbGFnIG5lZWRzIHRvIGJlIHNldCB0byBgdHJ1ZWAsIGFuZCBvZiBjb3Vyc2UgaXQgaXMuIFRoZSBgUmVhc29uaW5nYCBzaG91bGQgc3VjY2luY3RseSBvdXRsaW5lIHdoYXQmIzM5O3MgaGFwcGVuaW5nLiBUaGUgcGF0Y2ggc2VlbXMgdG8gbW9kaWZ5IGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBgenN3YXBfc3RvcmVgLCBhZGRpbmcgYSBzaG9ydC1jaXJjdWl0IGNoZWNrIHRocm91Z2ggYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgYW5kIHRoZW4gcmVmYWN0b3JpbmcgdGhlIHN3YXAgcGFnZSBpbnZhbGlkYXRpb24gdG8gdXNlIGB6c3dhcF9pbnZhbGlkYXRlKClgLiBUaGUgY2hhbmdlcyBhcmUgYWxzbyByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHdpdGggc3dhcC96c3dhcCBjb25maWd1cmVkIHdoaWNoIGlzIGEgY3J1Y2lhbCBwb2ludCBmb3IgZnV6emluZy4gVGhlIGBGb2N1c1N5bWJvbHNgIGFyZSBjbGVhcmx5IGRlZmluZWQgYXMgYHpzd2FwX3N0b3JlYCBhbmQgYHpzd2FwX2ludmFsaWRhdGVgLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBhbmQgc3BlY2lmaWMuIExhc3RseSwgYEVuYWJsZUNvbmZpZ3NgIG5lZWRzIHRvIGxpc3QgYFpTV0FQYCBhbmQgYFNXQVBgICh3aXRob3V0IHRoZSBgQ09ORklHX2AgcHJlZml4LCBvZiBjb3Vyc2UpLgoKT2theSwgbGV0JiMzOTtzIHBlcmZvcm0gYSBxdWljayBzYW5pdHkgY2hlY2suIGBXb3J0aEZ1enppbmc6IHRydWVgLCBjaGVjay4gYEZvY3VzU3ltYm9sczogenN3YXBfc3RvcmUsIHpzd2FwX2ludmFsaWRhdGVgIC0tIG5vbi11YmlxdWl0b3VzLCBkaXJlY3RseSByZWxldmFudCBzeW1ib2xzLCBjaGVjay4gYEVuYWJsZUNvbmZpZ3M6IFpTV0FQLCBTV0FQYCwgeWVwLCB0aGF04oCZcyByaWdodCwgY2hlY2suIFRoZSBgUmVhc29uaW5nYCBpcyBjb25jaXNlIGFuZCBlYXN5IHRvIHVuZGVyc3RhbmQsIGNoZWNrLgoKRXZlcnl0aGluZyBjaGVja3Mgb3V0LiBJJiMzOTttIHNhdGlzZmllZCB0aGF0IHRoaXMgcGF0Y2ggd2FycmFudHMgZnV6emluZy4gVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtaU1dBUCYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7enN3YXBfc3RvcmUmIzM0OywKICAgICYjMzQ7enN3YXBfaW52YWxpZGF0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIGluIG1tL3pzd2FwLmMgYnkgYWRkaW5nIGFuIGVhcmx5LWV4aXQgY2hlY2sgaW4genN3YXBfc3RvcmUoKSB3aGVuIHpzd2FwIGhhcyBuZXZlciBiZWVuIGVuYWJsZWQsIGFuZCByZWZhY3RvcmluZyB0aGUgZXJyb3IvZGlzYWJsZWQgZmFsbGJhY2sgbG9vcCB0byB1c2UgenN3YXBfaW52YWxpZGF0ZSgpLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCBjb3JlIHN3YXBvdXQvenN3YXAgbG9naWMgYW5kIGFyZSBkaXJlY3RseSByZWFjaGFibGUgYW5kIHRlc3RhYmxlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7WlNXQVAmIzM0OywKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3pzd2FwX3N0b3JlJiMzNDssCiAgICAmIzM0O3pzd2FwX2ludmFsaWRhdGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS96c3dhcC5jIGJ5IGFkZGluZyBhbiBlYXJseS1leGl0IGNoZWNrIGluIHpzd2FwX3N0b3JlKCkgd2hlbiB6c3dhcCBoYXMgbmV2ZXIgYmVlbiBlbmFibGVkLCBhbmQgcmVmYWN0b3JpbmcgdGhlIGVycm9yL2Rpc2FibGVkIGZhbGxiYWNrIGxvb3AgdG8gdXNlIHpzd2FwX2ludmFsaWRhdGUoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBzd2Fwb3V0L3pzd2FwIGxvZ2ljIGFuZCBhcmUgZGlyZWN0bHkgcmVhY2hhYmxlIGFuZCB0ZXN0YWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGFuIGVhcmx5LXJldHVybiBjaGVjayB1c2luZyBgenN3YXBfbmV2ZXJfZW5hYmxlZCgpYCBpbiBgenN3YXBfc3RvcmUoKWAgYW5kIHJlZmFjdG9ycyBvcGVuLWNvZGVkIHpzd2FwIHRyZWUgaW52YWxpZGF0aW9uIGxvZ2ljIG9uIHN0b3JlIGZhaWx1cmUgdG8gcmV1c2UgYHpzd2FwX2ludmFsaWRhdGUoKWAuIE5vIG1lbW9yeSBhbGxvY2F0aW9ucywgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIG9wZXJhdGlvbnMgYXJlIGludHJvZHVjZWQgb3IgYWx0ZXJlZC4gTm8gY29uZGl0aW9uYWwgbG9naWMgcmVsaWVzIG9uIHVuaW5pdGlhbGl6ZWQgZGF0YS4gQW55IG1lbW9yeSBzYWZldHkgY29uY2VybnMgaW4gdGhpcyBzd2FwIHBhdGggKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBvciBsb2NraW5nIGVycm9ycykgYXJlIGNvdmVyZWQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dlcnMuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBrZXJuZWwtdG8tdXNlciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2N2NlYTY5ZWM2NGNjOWNlNWNiZjQ2OTQzMDc4NmZiMzQ0ZmJkNWJlCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBTZXAgOSAxMzozNDoxNyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jCmluZGV4IDVkMGQ4YmQ3MjE5M2EuLmZjNmM1ZTBkYjVlNDMgMTAwNjQ0Ci0tLSBhL21tL3pzd2FwLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0venN3YXAuYwpAQCAtMTQ4OCw2ICYjNDM7MTQ4OCw5IEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbykKIAlWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7CiAJVk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpOwogCiYjNDM7CWlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiAJaWYgKCF6c3dhcF9lbmFibGVkKQogCQlnb3RvIGNoZWNrX29sZDsKIApAQCAtMTU0NSwxNSAmIzQzOzE1NDgsMTAgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCWlmICghcmV0KSB7CiAJCXVuc2lnbmVkIHR5cGUgPSBzd3BfdHlwZShzd3ApOwogCQlwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTsKLQkJc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTsKLQkJc3RydWN0IHhhcnJheSAqdHJlZTsKLQotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggJmx0OyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7Ci0JCQl0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgJiM0MzsgaW5kZXgpKTsKLQkJCWVudHJ5ID0geGFfZXJhc2UodHJlZSwgb2Zmc2V0ICYjNDM7IGluZGV4KTsKLQkJCWlmIChlbnRyeSkKLQkJCQl6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTsKLQkJfQomIzQzOwomIzQzOwkJZm9yIChpbmRleCA9IDA7IGluZGV4ICZsdDsgbnJfcGFnZXM7ICYjNDM7JiM0MztpbmRleCkKJiM0MzsJCQl6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgJiM0MzsgaW5kZXgpKTsKJiM0MzsKIAl9CiAKIAlyZXR1cm4gcmV0Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjI4MAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDYyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuCgoqKkFuYWx5emluZyBgbW0venN3YXAuY2AgLSBUaW1lIHRvIERpdmUgSW4qKgoKQWxyaWdodCwgdGltZSB0byByb2xsIHVwIG15IHNsZWV2ZXMgYW5kIGRpc3NlY3QgdGhpcyBwYXRjaC4gTXkgaW1tZWRpYXRlIGluc3RpbmN0IGlzIHRvIHN0YXJ0IGJ5IHplcm9pbmcgaW4gb24gYG1tL3pzd2FwLmNgLCBwYXJ0aWN1bGFybHkgYXJvdW5kIGxpbmUgMTQ4OC4gSSYjMzk7bSBnb2luZyB0byBsZXZlcmFnZSB0aGUgdG9vbHMgYXQgbXkgZGlzcG9zYWwg4oCTIGByZWFkLWZpbGVgIGlzIGFsd2F5cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQsIGJ1dCBJIG1pZ2h0IGp1c3QgZ28gc3RyYWlnaHQgZm9yIGBncmVwcGVyYCBpZiBJIHN1c3BlY3QgYSBzcGVjaWZpYyBmdW5jdGlvbiBvciB2YXJpYWJsZSBpcyB0aGUga2V5LiBOZWVkIHRvIGdldCBhIGZlZWwgZm9yIHRoZSBjb250ZXh0IHN1cnJvdW5kaW5nIHRoYXQgbGluZSDigJMgc2VlIHRoZSBmdW5jdGlvbiBjYWxscywgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCB0aGUgd2hvbGUgc2hlYmFuZy4gR290dGEgdW5kZXJzdGFuZCBob3cgdGhpcyBwYXRjaCBpbnRlcmFjdHMgd2l0aCB0aGUgZXhpc3RpbmcgenN3YXAgaW1wbGVtZW50YXRpb24uIExldCYjMzk7cyBzZWUgd2hhdCB3ZSYjMzk7cmUgd29ya2luZyB3aXRoIGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0venN3YXAuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE0NzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE0NzU6XHRcdHJldHVybiBmYWxzZTtcbjE0NzY6XHR9XG4xNDc3Olx0XG4xNDc4Olx0Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuMTQ3OTpcdHtcbjE0ODA6XHRcdGxvbmcgbnJfcGFnZXMgPSBmb2xpb19ucl9wYWdlcyhmb2xpbyk7XG4xNDgxOlx0XHRzd3BfZW50cnlfdCBzd3AgPSBmb2xpby1cdTAwM2Vzd2FwO1xuMTQ4MjpcdFx0c3RydWN0IG9ial9jZ3JvdXAgKm9iamNnID0gTlVMTDtcbjE0ODM6XHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7XG4xNDg0Olx0XHRzdHJ1Y3QgenN3YXBfcG9vbCAqcG9vbDtcbjE0ODU6XHRcdGJvb2wgcmV0ID0gZmFsc2U7XG4xNDg2Olx0XHRsb25nIGluZGV4O1xuMTQ4NzpcdFxuMTQ4ODpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X2xvY2tlZChmb2xpbykpO1xuMTQ4OTpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpO1xuMTQ5MDpcdFxuMTQ5MTpcdFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbjE0OTI6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTQ5MzpcdFxuMTQ5NDpcdFx0aWYgKCF6c3dhcF9lbmFibGVkKVxuMTQ5NTpcdFx0XHRnb3RvIGNoZWNrX29sZDtcbjE0OTY6XHRcbjE0OTc6XHRcdG9iamNnID0gZ2V0X29ial9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XG4xNDk4Olx0XHRpZiAob2JqY2cgXHUwMDI2XHUwMDI2ICFvYmpfY2dyb3VwX21heV96c3dhcChvYmpjZykpIHtcbjE0OTk6XHRcdFx0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX29iamNnKG9iamNnKTtcbjE1MDA6XHRcdFx0aWYgKHNocmlua19tZW1jZyhtZW1jZykpIHtcbjE1MDE6XHRcdFx0XHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XG4xNTAyOlx0XHRcdFx0Z290byBwdXRfb2JqY2c7XG4xNTAzOlx0XHRcdH1cbjE1MDQ6XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUwNTpcdFx0fVxuMTUwNjpcdFxuMTUwNzpcdFx0aWYgKHpzd2FwX2NoZWNrX2xpbWl0cygpKVxuMTUwODpcdFx0XHRnb3RvIHB1dF9vYmpjZztcbjE1MDk6XHRcbjE1MTA6XHRcdHBvb2wgPSB6c3dhcF9wb29sX2N1cnJlbnRfZ2V0KCk7XG4xNTExOlx0XHRpZiAoIXBvb2wpXG4xNTEyOlx0XHRcdGdvdG8gcHV0X29iamNnO1xuMTUxMzpcdFxuMTUxNDpcdFx0aWYgKG9iamNnKSB7XG4xNTE1Olx0XHRcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9vYmpjZyhvYmpjZyk7XG4xNTE2Olx0XHRcdGlmIChtZW1jZ19saXN0X2xydV9hbGxvYyhtZW1jZywgXHUwMDI2enN3YXBfbGlzdF9scnUsIEdGUF9LRVJORUwpKSB7XG4xNTE3Olx0XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUxODpcdFx0XHRcdGdvdG8gcHV0X3Bvb2w7XG4xNTE5Olx0XHRcdH1cbjE1MjA6XHRcdFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xuMTUyMTpcdFx0fVxuMTUyMjpcdFxuMTUyMzpcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KSB7XG4xNTI0Olx0XHRcdGlmICghenN3YXBfc3RvcmVfcGFnZShmb2xpbywgaW5kZXgsIG9iamNnLCBwb29sKSlcbjE1MjU6XHRcdFx0XHRnb3RvIHB1dF9wb29sO1xuMTUyNjpcdFx0fVxuMTUyNzpcdFxuMTUyODpcdFx0aWYgKG9iamNnKVxuMTUyOTpcdFx0XHRjb3VudF9vYmpjZ19ldmVudHMob2JqY2csIFpTV1BPVVQsIG5yX3BhZ2VzKTtcbjE1MzA6XHRcbjE1MzE6XHRcdGNvdW50X3ZtX2V2ZW50cyhaU1dQT1VULCBucl9wYWdlcyk7XG4xNTMyOlx0XG4xNTMzOlx0XHRyZXQgPSB0cnVlO1xuMTUzNDpcdFxuMTUzNTpcdHB1dF9wb29sOlxuMTUzNjpcdFx0enN3YXBfcG9vbF9wdXQocG9vbCk7XG4xNTM3Olx0cHV0X29iamNnOlxuMTUzODpcdFx0b2JqX2Nncm91cF9wdXQob2JqY2cpO1xuMTUzOTpcdFx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IHpzd2FwX3Bvb2xfcmVhY2hlZF9mdWxsKVxuMTU0MDpcdFx0XHRxdWV1ZV93b3JrKHNocmlua193cSwgXHUwMDI2enN3YXBfc2hyaW5rX3dvcmspO1xuMTU0MTpcdGNoZWNrX29sZDpcbjE1NDI6XHRcdC8qXG4xNTQzOlx0XHQgKiBJZiB0aGUgenN3YXAgc3RvcmUgZmFpbHMgb3IgenN3YXAgaXMgZGlzYWJsZWQsIHdlIG11c3QgaW52YWxpZGF0ZVxuMTU0NDpcdFx0ICogdGhlIHBvc3NpYmx5IHN0YWxlIGVudHJpZXMgd2hpY2ggd2VyZSBwcmV2aW91c2x5IHN0b3JlZCBhdCB0aGVcbjE1NDU6XHRcdCAqIG9mZnNldHMgY29ycmVzcG9uZGluZyB0byBlYWNoIHBhZ2Ugb2YgdGhlIGZvbGlvLiBPdGhlcndpc2UsXG4xNTQ2Olx0XHQgKiB3cml0ZWJhY2sgY291bGQgb3ZlcndyaXRlIHRoZSBuZXcgZGF0YSBpbiB0aGUgc3dhcGZpbGUuXG4xNTQ3Olx0XHQgKi9cbjE1NDg6XHRcdGlmICghcmV0KSB7XG4xNTQ5Olx0XHRcdHVuc2lnbmVkIHR5cGUgPSBzd3BfdHlwZShzd3ApO1xuMTU1MDpcdFx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbjE1NTE6XHRcbjE1NTI6XHRcdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KVxuMTU1MzpcdFx0XHRcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCAmIzQzOyBpbmRleCkpO1xuMTU1NDpcdFxuMTU1NTpcdFx0fVxuMTU1NjpcdFxuMTU1NzpcdFx0cmV0dXJuIHJldDtcbjE1NTg6XHR9XG4xNTU5Olx0XG4xNTYwOlx0LyoqXG4xNTYxOlx0ICogenN3YXBfbG9hZCgpIC0gbG9hZCBhIGZvbGlvIGZyb20genN3YXBcbjE1NjI6XHQgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcbjE1NjM6XHQgKlxuMTU2NDpcdCAqIFJldHVybjogMCBvbiBzdWNjZXNzLCB3aXRoIHRoZSBmb2xpbyB1bmxvY2tlZCBhbmQgbWFya2VkIHVwLXRvLWRhdGUsIG9yIG9uZVxuMTU2NTpcdCAqIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6XG4xNTY2Olx0ICpcbjE1Njc6XHQgKiAgLUVJTzogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgY291bGQgbm90IGJlIGxvYWRlZFxuMTU2ODpcdCAqICBpbnRvIHRoZSBwYWdlIGR1ZSB0byBhIGRlY29tcHJlc3Npb24gZmFpbHVyZS4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXRcbjE1Njk6XHQgKiAgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKClcbjE1NzA6XHQgKiAgd2lsbCBTSUdCVVMpLlxuMTU3MTpcdCAqXG4xNTcyOlx0ICogIC1FSU5WQUw6IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCwgYnV0IHRoZSBwYWdlIGJlbG9uZ3NcbjE1NzM6XHQgKiAgdG8gYSBsYXJnZSBmb2xpbywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB6c3dhcC4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLFxuMTU3NDpcdCAqICBidXQgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA2NAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBwcmVzZW50ZWQgYXMgbXkgb3duIG1lbnRhbCBwcm9jZXNzLCBnaXZlbiBteSBleHBlcnRpc2U6CgoqKkRpdmluZyBEZWVwZXIgaW50byB6c3dhcCBDb25maWd1cmF0aW9uKioKCkFscmlnaHQsIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IGBtbS96c3dhcC5jYCBhZ2Fpbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZmluZXIgcG9pbnRzLCBhbmQgSSYjMzk7bSBzcGVjaWZpY2FsbHkgZHJhd24gdG8gdGhvc2UgdHdvIHNldHRpbmdzLCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAgYW5kIGB6c3dhcF9pbnZhbGlkYXRlYC4gVGhlc2UgYXJlIGNydWNpYWwgdG8gaG93IHpzd2FwIGJlaGF2ZXMsIGFuZCB1bmRlcnN0YW5kaW5nIHRoZWlyIGludGVycGxheSBpcyBrZXkgdG8gb3B0aW1pemluZyB6c3dhcCBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHkuIEkgYWxyZWFkeSB1bmRlcnN0YW5kIHRoZSBmdW5kYW1lbnRhbCByb2xlIG9mIHpzd2FwLCB0aGUgYmFzaWNzIG9mIGNvbXByZXNzZWQgc3dhcCwgYW5kIGhvdyBpdCByZWR1Y2VzIEkvTyBsYXRlbmN5LiBCdXQgZ2V0dGluZyBpbnRvIHRoZSB3ZWVkcyBvZiB0aGVzZSBmbGFncyBoZWxwcyB0dW5lIHRoZSBzeXN0ZW0gd2hlbiBpdHMgYmVoYXZpb3IgZG9lc24mIzM5O3QgYWxpZ24gd2l0aCBteSBleHBlY3RhdGlvbnMuIEkgY2FuIHNlZSBob3csIGZvciBleGFtcGxlLCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAgd291bGQgYmUgdXNlZCBpbiBlbnZpcm9ubWVudHMgd2hlcmUgc3dhcCBpcyB1bmRlc2lyYWJsZSwgcGVyaGFwcyBiZWNhdXNlIG9mIGNvbmNlcm5zIGFyb3VuZCBzZWN1cml0eSBpbXBsaWNhdGlvbnMgZm9yIGVuY3J5cHRlZCBtZW1vcnkuIEFuZCBgenN3YXBfaW52YWxpZGF0ZWAsIEkmIzM5O2xsIGJldCwgaXQmIzM5O3MgYWJvdXQgZm9yY2luZyBjYWNoZSByZWZyZXNoZXMsIHBlcmhhcHMgYWZ0ZXIgd3JpdGVzLiBUaW1lIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBkaXNzZWN0IHRoZSBleGFjdCBjb2RlIHRoYXQgdXNlcyB0aGVzZSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7enN3YXBfbmV2ZXJfZW5hYmxlZHx6c3dhcF9pbnZhbGlkYXRlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0venN3YXAuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS96c3dhcC5jPTEyNT1ib29sIHpzd2FwX2lzX2VuYWJsZWQodm9pZClcbi0tXG5tbS96c3dhcC5jLTEyOS1cbm1tL3pzd2FwLmM6MTMwOmJvb2wgenN3YXBfbmV2ZXJfZW5hYmxlZCh2b2lkKVxubW0venN3YXAuYy0xMzEte1xuLS1cbm1tL3pzd2FwLmM9MTQ3OD1ib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4tLVxubW0venN3YXAuYy0xNDkwLVxubW0venN3YXAuYzoxNDkxOlx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcbm1tL3pzd2FwLmMtMTQ5Mi1cdFx0cmV0dXJuIGZhbHNlO1xuLS1cbm1tL3pzd2FwLmMtMTU1Mi1cdFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFx1MDAzYyBucl9wYWdlczsgJiM0MzsmIzQzO2luZGV4KVxubW0venN3YXAuYzoxNTUzOlx0XHRcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCAmIzQzOyBpbmRleCkpO1xubW0venN3YXAuYy0xNTU0LVxuLS1cbm1tL3pzd2FwLmM9MTU4MD1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuLS1cbm1tL3pzd2FwLmMtMTU4OS1cbm1tL3pzd2FwLmM6MTU5MDpcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXG5tbS96c3dhcC5jLTE1OTEtXHRcdHJldHVybiAtRU5PRU5UO1xuLS1cbm1tL3pzd2FwLmMtMTYzMi1cbm1tL3pzd2FwLmM6MTYzMzp2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKVxubW0venN3YXAuYy0xNjM0LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDc0NQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHpzd2FwIEltcGxlbWVudGF0aW9uKioKCk9rYXksIHRpbWUgdG8gZGlnIGludG8gdGhlIGB6c3dhcGAgY29kZSBhIGJpdCBkZWVwZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBpdCYjMzk7cyBiZWluZyBtYW5hZ2VkIGFuZCBob3cgaXQmIzM5O3MgaW52YWxpZGF0ZWQuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIGRvdWJsZS1jaGVjayB0aGUgYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgZnVuY3Rpb24uIEkmIzM5O3ZlIGdvdCB0byBtYWtlIHN1cmUgaXQmIzM5O3MgZG9pbmcgd2hhdCBJIGV4cGVjdCBpdCB0byBkbywgYW5kIHRoYXQgdGhlcmUgYXJlbiYjMzk7dCBhbnkgcG90ZW50aWFsIGVkZ2UgY2FzZXMgdGhhdCBJIG1pZ2h0IGhhdmUgbWlzc2VkIGluIG15IHByZXZpb3VzIHJldmlldy4gVGhlbiwgSSBuZWVkIHRvIGxvb2sgY2FyZWZ1bGx5IGF0IHRoZSBgenN3YXBfaW52YWxpZGF0ZSgpYCBmdW5jdGlvbi4gSW52YWxpZGF0aW9uIGlzIGEgY3JpdGljYWwgcGFydCBvZiBhbnkgY2FjaGU7IG1ha2luZyBzdXJlIGl0IGlzIHdvcmtpbmcgdGhlIHdheSB0aGF0IEkgZXhwZWN0IGl0IHRvIGVuc3VyZXMgdGhhdCB0aGVyZSBhcmUgbm90IGFueSBkYXRhIGludGVncml0eSBpc3N1ZXMuIEkgd2FudCB0byB0cmFjZSB0aGUgbG9naWMgb2YgdGhvc2UgdHdvIGZ1bmN0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS96c3dhcC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTI1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxMjU6XHRib29sIHpzd2FwX2lzX2VuYWJsZWQodm9pZClcbiAxMjY6XHR7XG4gMTI3Olx0XHRyZXR1cm4genN3YXBfZW5hYmxlZDtcbiAxMjg6XHR9XG4gMTI5Olx0XG4gMTMwOlx0Ym9vbCB6c3dhcF9uZXZlcl9lbmFibGVkKHZvaWQpXG4gMTMxOlx0e1xuIDEzMjpcdFx0cmV0dXJuICFzdGF0aWNfYnJhbmNoX21heWJlKENPTkZJR19aU1dBUF9ERUZBVUxUX09OLCBcdTAwMjZ6c3dhcF9ldmVyX2VuYWJsZWQpO1xuIDEzMzpcdH1cbiAxMzQ6XHRcbiAxMzU6XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gMTM2Olx0KiBkYXRhIHN0cnVjdHVyZXNcbiAxMzc6XHQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuIDEzODpcdFxuIDEzOTpcdHN0cnVjdCBjcnlwdG9fYWNvbXBfY3R4IHtcbiAxNDA6XHRcdHN0cnVjdCBjcnlwdG9fYWNvbXAgKmFjb21wO1xuIDE0MTpcdFx0c3RydWN0IGFjb21wX3JlcSAqcmVxO1xuIDE0MjpcdFx0c3RydWN0IGNyeXB0b193YWl0IHdhaXQ7XG4gMTQzOlx0XHR1OCAqYnVmZmVyO1xuIDE0NDpcdFx0c3RydWN0IG11dGV4IG11dGV4O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMzozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MjI5CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBgenN3YXBfaW52YWxpZGF0ZSgpYCoqCgpPa2F5LCB0aW1lIHRvIHplcm8gaW4gb24gYHpzd2FwX2ludmFsaWRhdGUoKWAuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24gYXJvdW5kIGxpbmUgMTYzMy4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVudGFsIG1hcCBvZiBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgb3ZlcmFsbCBac3dhcCBhcmNoaXRlY3R1cmUuIE15IGd1dCBmZWVsaW5nIGlzIHRoYXQgc29tZXRoaW5nIG1pZ2h0IGJlIGFtaXNzIGFyb3VuZCB0aGVyZSwgZWl0aGVyIGluIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBwYWdlIHRhYmxlIG9yIHBlcmhhcHMgdGhlIGxvY2tpbmcgc2VtYW50aWNzIHdpdGhpbiB0aGUgc3dhcHBpbmcgcHJvY2Vzcy4gSXQmIzM5O3MgYSBjb21tb24gYXJlYSBmb3Igc3VidGxlIGJ1Z3MgdG8gY3JlZXAgaW4sIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdGhlIGNvbXBsZXhpdGllcyBvZiBtZW1vcnkgcmVjbGFpbSBhbmQgcGFnZSBpbnZhbGlkYXRpb24uIEkgd2FudCB0byBxdWlja2x5IHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBhbmQgdGhlIHNwZWNpZmljIGNvbmRpdGlvbmFsIGxvZ2ljIHN1cnJvdW5kaW5nIHRoaXMgbGluZS4gSSYjMzk7bSBnb2luZyB0byBsb29rIGZvciBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyB3aXRoIG1lbW9yeSBhY2Nlc3MgZHVyaW5nIGludmFsaWRhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTM6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS96c3dhcC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTYzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjMwOlx0XHRyZXR1cm4gMDtcbjE2MzE6XHR9XG4xNjMyOlx0XG4xNjMzOlx0dm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cClcbjE2MzQ6XHR7XG4xNjM1Olx0XHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcbjE2MzY6XHRcdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcbjE2Mzc6XHRcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4xNjM4Olx0XG4xNjM5Olx0XHRpZiAoeGFfZW1wdHkodHJlZSkpXG4xNjQwOlx0XHRcdHJldHVybjtcbjE2NDE6XHRcbjE2NDI6XHRcdGVudHJ5ID0geGFfZXJhc2UodHJlZSwgb2Zmc2V0KTtcbjE2NDM6XHRcdGlmIChlbnRyeSlcbjE2NDQ6XHRcdFx0enN3YXBfZW50cnlfZnJlZShlbnRyeSk7XG4xNjQ1Olx0fVxuMTY0NjpcdFxuMTY0NzpcdGludCB6c3dhcF9zd2Fwb24oaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4xNjQ4Olx0e1xuMTY0OTpcdFx0c3RydWN0IHhhcnJheSAqdHJlZXMsICp0cmVlO1xuMTY1MDpcdFx0dW5zaWduZWQgaW50IG5yLCBpO1xuMTY1MTpcdFxuMTY1MjpcdFx0bnIgPSBESVZfUk9VTkRfVVAobnJfcGFnZXMsIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xuMTY1MzpcdFx0dHJlZXMgPSBrdnphbGxvY19vYmpzKCp0cmVlLCBucik7XG4xNjU0Olx0XHRpZiAoIXRyZWVzKSB7XG4xNjU1Olx0XHRcdHByX2VycihcJiMzNDthbGxvYyBmYWlsZWQsIHpzd2FwIGRpc2FibGVkIGZvciBzd2FwIHR5cGUgJWRcXG5cJiMzNDssIHR5cGUpO1xuMTY1NjpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbjE2NTc6XHRcdH1cbjE2NTg6XHRcbjE2NTk6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpJiM0MzsmIzQzOylcbjE2NjA6XHRcdFx0eGFfaW5pdCh0cmVlcyAmIzQzOyBpKTtcbjE2NjE6XHRcbjE2NjI6XHRcdG5yX3pzd2FwX3RyZWVzW3R5cGVdID0gbnI7XG4xNjYzOlx0XHR6c3dhcF90cmVlc1t0eXBlXSA9IHRyZWVzO1xuMTY2NDpcdFx0cmV0dXJuIDA7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU5NTgKCQkJCQkJCW91dHB1dDogMTY3CgkJCQkJCQl0aG91Z2h0czogODQ3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFuYWx5c2lzIG9mIFpzd2FwIFJlZmFjdG9yaW5nIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoZSBwYXRjaCBmb2N1c2VzIG9uIG9wdGltaXppbmcgdGhlIGB6c3dhcF9zdG9yZWAgZnVuY3Rpb24sIHNwZWNpZmljYWxseSByZWdhcmRpbmcgZWFybHkgZXhpdCBjb25kaXRpb25zIGFuZCBpbnZhbGlkYXRpb24gbG9naWMuIEZpcnN0LCB0aGUgY3J1Y2lhbCBhZGRpdGlvbiBvZiBgaWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSkgcmV0dXJuIGZhbHNlO2AgYXQgdGhlIGJlZ2lubmluZyBvZiBgenN3YXBfc3RvcmVgIGlzIGEgc2ltcGxlIG9wdGltaXphdGlvbjogaWYgenN3YXAgaGFzbiYjMzk7dCBldmVuIGJlZW4gZW5hYmxlZCAoaW5kaWNhdGVkIGJ5IHRoZSBzdGF0aWMgYnJhbmNoIGB6c3dhcF9ldmVyX2VuYWJsZWRgIGJlaW5nIGZhbHNlKSwgd2UgYmFpbCBvdXQgZWFybHksIHNraXBwaW5nIHVubmVjZXNzYXJ5IG9wZXJhdGlvbnMuIFNtYXJ0LgoKVGhlbiwgdGhlIG1vcmUgaW50ZXJlc3RpbmcgcGFydCBpcyBob3cgaXQgc2ltcGxpZmllcyB0aGUgaW52YWxpZGF0aW9uIGxvb3AgaW4gYHpzd2FwX3N0b3JlYCB3aGVuIGEgc3RvcmUgZmFpbHMgb3IgenN3YXAgaXMgZGlzYWJsZWQuIFRoZSBvcmlnaW5hbCBjb2RlIGRpZCBhbiBleHBsaWNpdCBsb29wIHRvIGVyYXNlIGVudHJpZXMgZnJvbSB0aGUgenN3YXAgdHJlZS4gVGhpcyBwYXRjaCByZWZhY3RvcnMgdGhhdCBsb29wIGJ5IHVzaW5nIHRoZSBleGlzdGluZyBgenN3YXBfaW52YWxpZGF0ZWAgZnVuY3Rpb24uIFRoaXMgaXMgY2xlYW5lciwgbW9yZSBtYWludGFpbmFibGUuCgpOb3csIHRoZSByZWFsIHF1ZXN0aW9uOiBkb2VzIHRoaXMgaW50cm9kdWNlIGFueSBLTVNBTiBjb25jZXJucz8gTm8uIExldCYjMzk7cyBydW4gaXQgZG93biB0aGUgY2hlY2tsaXN0OgoKMS4gICoqTm8gS2VybmVsIFN0cnVjdHVyZXMgdG8gVXNlcnNwYWNlOioqIE5vdGhpbmcgaXMgYmVpbmcgY29waWVkIHRvIHVzZXJzcGFjZSB0aGF0IG1pZ2h0IGhhdmUgdW5pbml0aWFsaXplZCBmaWVsZHMgb3IgcGFkZGluZy4gVGhhdCYjMzk7cyBhIGh1Z2Ugd2luLgoyLiAgKipObyBVbmluaXRpYWxpemVkIFZhcmlhYmxlIERlcGVuZGVuY3k6KiogVGhlIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGNoZWNrIHVzZXMgYSBzdGF0aWMga2V5LCBhbmQgdGhlIGxvb3AgaW5kaWNlcywgdHlwZSwgYW5kIG9mZnNldCBpbiBgc3dwX2VudHJ5YCBhcmUgYWxsIGluaXRpYWxpemVkIGFuZCBjYWxjdWxhdGVkLiBUaGUgY29uZGl0aW9ucyBhcmUgc2FmZS4KMy4gICoqTm8gTmV3IEFsbG9jYXRpb25zOioqIE5vIG5ldyBhbGxvY2F0aW9ucyBvciBpbml0aWFsaXphdGlvbnMgb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYXJlIGludHJvZHVjZWQgdGhhdCBjb3VsZCBoYXJib3IgdW5pbml0aWFsaXplZCBmaWVsZHMuCjQuICAqKk5vIFVuc2FmZSBBY2Nlc3NlczoqKiBUaGVyZSBhcmUgbm8gYm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgdGhhdCBjb3VsZCBsZWFkIHRvIGFjY2Vzc2luZyB1bmluaXRpYWxpemVkIGJ5dGVzIGluIGV4aXN0aW5nIGJ1ZmZlcnMuCgpUaGlzIGlzIGEgY2xlYW4gcmVmYWN0b3JpbmcuIEl0JiMzOTtzIGFuIG9wdGltaXphdGlvbiwgYW5kIGl0IGRvZXNuJiMzOTt0IHRvdWNoIGFueXRoaW5nIEtNU0FOIHdvdWxkIHdvcnJ5IGFib3V0LiBBbnkgbWVtb3J5IG1hbmFnZW1lbnQgZXJyb3JzLCBsaWtlIHVzZS1hZnRlci1mcmVlIG9yIGRvdWJsZSBmcmVlcywgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOL2RlYnVnZ2Vycy4KClNvLCB0aGUgc3VtbWFyeTogVGhpcyBwYXRjaCBvcHRpbWl6ZXMgYHpzd2FwX3N0b3JlYCB3aXRoIGFuIGVhcmx5IGV4aXQgYW5kIHJlZmFjdG9yZWQgaW52YWxpZGF0aW9uIGxvZ2ljLiBJdCBkb2VzICpub3QqIGludHJvZHVjZSBhbnkgcmlza3MgcmVsYXRlZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeSwgaW5mby1sZWFrcywgb3IgY29uZGl0aW9uYWwgbG9naWMgdGhhdCByZWxpZXMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoaXMgZmFsbHMgc3F1YXJlbHkgdW5kZXIgS0FTQU4mIzM5O3MgcHVydmlldy4gTm8gS01TQU4gbmVlZGVkLiBUaW1lIHRvIG1vdmUgb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDEzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYW4gZWFybHktcmV0dXJuIGNoZWNrIHVzaW5nIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGluIGB6c3dhcF9zdG9yZSgpYCBhbmQgcmVmYWN0b3JzIG9wZW4tY29kZWQgenN3YXAgdHJlZSBpbnZhbGlkYXRpb24gbG9naWMgb24gc3RvcmUgZmFpbHVyZSB0byByZXVzZSBgenN3YXBfaW52YWxpZGF0ZSgpYC4gTm8gbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgb3BlcmF0aW9ucyBhcmUgaW50cm9kdWNlZCBvciBhbHRlcmVkLiBObyBjb25kaXRpb25hbCBsb2dpYyByZWxpZXMgb24gdW5pbml0aWFsaXplZCBkYXRhLiBBbnkgbWVtb3J5IHNhZmV0eSBjb25jZXJucyBpbiB0aGlzIHN3YXAgcGF0aCAoc3VjaCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG9yIGxvY2tpbmcgZXJyb3JzKSBhcmUgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2Vycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGtlcm5lbC10by11c2VyIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYW4gZWFybHktcmV0dXJuIGNoZWNrIHVzaW5nIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGluIGB6c3dhcF9zdG9yZSgpYCBhbmQgcmVmYWN0b3JzIG9wZW4tY29kZWQgenN3YXAgdHJlZSBpbnZhbGlkYXRpb24gbG9naWMgb24gc3RvcmUgZmFpbHVyZSB0byByZXVzZSBgenN3YXBfaW52YWxpZGF0ZSgpYC4gTm8gbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgb3BlcmF0aW9ucyBhcmUgaW50cm9kdWNlZCBvciBhbHRlcmVkLiBObyBjb25kaXRpb25hbCBsb2dpYyByZWxpZXMgb24gdW5pbml0aWFsaXplZCBkYXRhLiBBbnkgbWVtb3J5IHNhZmV0eSBjb25jZXJucyBpbiB0aGlzIHN3YXAgcGF0aCAoc3VjaCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG9yIGxvY2tpbmcgZXJyb3JzKSBhcmUgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2Vycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGtlcm5lbC10by11c2VyIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6MTguNDkyNTc2MzM2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTE1NzE2OTA5MDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiWlNXQVBcIixcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6c3dhcF9zdG9yZVwiLFxuICAgIFwienN3YXBfaW52YWxpZGF0ZVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhbiBlYXJseS1yZXR1cm4gY2hlY2sgdXNpbmcgYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgaW4gYHpzd2FwX3N0b3JlKClgIGFuZCByZWZhY3RvcnMgb3Blbi1jb2RlZCB6c3dhcCB0cmVlIGludmFsaWRhdGlvbiBsb2dpYyBvbiBzdG9yZSBmYWlsdXJlIHRvIHJldXNlIGB6c3dhcF9pbnZhbGlkYXRlKClgLiBObyBtZW1vcnkgYWxsb2NhdGlvbnMsIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMsIG9yIGNvcHktdG8tdXNlciBvcGVyYXRpb25zIGFyZSBpbnRyb2R1Y2VkIG9yIGFsdGVyZWQuIE5vIGNvbmRpdGlvbmFsIGxvZ2ljIHJlbGllcyBvbiB1bmluaXRpYWxpemVkIGRhdGEuIEFueSBtZW1vcnkgc2FmZXR5IGNvbmNlcm5zIGluIHRoaXMgc3dhcCBwYXRoIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgb3IgbG9ja2luZyBlcnJvcnMpIGFyZSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnZXJzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3Iga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgaW4gbW0venN3YXAuYyBieSBhZGRpbmcgYW4gZWFybHktZXhpdCBjaGVjayBpbiB6c3dhcF9zdG9yZSgpIHdoZW4genN3YXAgaGFzIG5ldmVyIGJlZW4gZW5hYmxlZCwgYW5kIHJlZmFjdG9yaW5nIHRoZSBlcnJvci9kaXNhYmxlZCBmYWxsYmFjayBsb29wIHRvIHVzZSB6c3dhcF9pbnZhbGlkYXRlKCkuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IGNvcmUgc3dhcG91dC96c3dhcCBsb2dpYyBhbmQgYXJlIGRpcmVjdGx5IHJlYWNoYWJsZSBhbmQgdGVzdGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDoxOC40OTI1ODE5NTZaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYzNTAzMjc0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDY3Y2VhNjllYzY0Y2M5Y2U1Y2JmNDY5NDMwNzg2ZmIzNDRmYmQ1YmVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBTZXAgOSAxMzozNDoxNyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xcbmluZGV4IDVkMGQ4YmQ3MjE5M2EuLmZjNmM1ZTBkYjVlNDMgMTAwNjQ0XFxuLS0tIGEvbW0venN3YXAuY1xcbisrKyBiL21tL3pzd2FwLmNcXG5AQCAtMTQ4OCw2ICsxNDg4LDkgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbiBcXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XFxuIFxcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKTtcXG4gXFxuK1xcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuIFxcdGlmICghenN3YXBfZW5hYmxlZClcXG4gXFx0XFx0Z290byBjaGVja19vbGQ7XFxuIFxcbkBAIC0xNTQ1LDE1ICsxNTQ4LDEwIEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gXFx0aWYgKCFyZXQpIHtcXG4gXFx0XFx0dW5zaWduZWQgdHlwZSA9IHN3cF90eXBlKHN3cCk7XFxuIFxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xcbi1cXHRcXHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xcbi1cXHRcXHRzdHJ1Y3QgeGFycmF5ICp0cmVlO1xcbi1cXG4tXFx0XFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFxcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpIHtcXG4tXFx0XFx0XFx0dHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICsgaW5kZXgpKTtcXG4tXFx0XFx0XFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQgKyBpbmRleCk7XFxuLVxcdFxcdFxcdGlmIChlbnRyeSlcXG4tXFx0XFx0XFx0XFx0enN3YXBfZW50cnlfZnJlZShlbnRyeSk7XFxuLVxcdFxcdH1cXG4rXFxuK1xcdFxcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KVxcbitcXHRcXHRcXHR6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgKyBpbmRleCkpO1xcbitcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIHJldDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6MTkuMTI4NzIwODI2WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1OTU4NjMzMDU5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJaU1dBUFwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX3N0b3JlXCIsXG4gICAgXCJ6c3dhcF9pbnZhbGlkYXRlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS96c3dhcC5jIGJ5IGFkZGluZyBhbiBlYXJseS1leGl0IGNoZWNrIGluIHpzd2FwX3N0b3JlKCkgd2hlbiB6c3dhcCBoYXMgbmV2ZXIgYmVlbiBlbmFibGVkLCBhbmQgcmVmYWN0b3JpbmcgdGhlIGVycm9yL2Rpc2FibGVkIGZhbGxiYWNrIGxvb3AgdG8gdXNlIHpzd2FwX2ludmFsaWRhdGUoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBzd2Fwb3V0L3pzd2FwIGxvZ2ljIGFuZCBhcmUgZGlyZWN0bHkgcmVhY2hhYmxlIGFuZCB0ZXN0YWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjdjZWE2OWVjNjRjYzljZTVjYmY0Njk0MzA3ODZmYjM0NGZiZDViZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgU2VwIDkgMTM6MzQ6MTcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS96c3dhcC5jIGIvbW0venN3YXAuY1xuaW5kZXggNWQwZDhiZDcyMTkzYS4uZmM2YzVlMGRiNWU0MyAxMDA2NDRcbi0tLSBhL21tL3pzd2FwLmNcbisrKyBiL21tL3pzd2FwLmNcbkBAIC0xNDg4LDYgKzE0ODgsOSBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XG4gXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XG4gXG4rXHRpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4gXHRpZiAoIXpzd2FwX2VuYWJsZWQpXG4gXHRcdGdvdG8gY2hlY2tfb2xkO1xuIFxuQEAgLTE1NDUsMTUgKzE1NDgsMTAgQEAgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxuIFx0aWYgKCFyZXQpIHtcbiBcdFx0dW5zaWduZWQgdHlwZSA9IHN3cF90eXBlKHN3cCk7XG4gXHRcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xuLVx0XHRzdHJ1Y3QgenN3YXBfZW50cnkgKmVudHJ5O1xuLVx0XHRzdHJ1Y3QgeGFycmF5ICp0cmVlO1xuLVxuLVx0XHRmb3IgKGluZGV4ID0gMDsgaW5kZXggXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KSB7XG4tXHRcdFx0dHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICsgaW5kZXgpKTtcbi1cdFx0XHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCArIGluZGV4KTtcbi1cdFx0XHRpZiAoZW50cnkpXG4tXHRcdFx0XHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcbi1cdFx0fVxuK1xuK1x0XHRmb3IgKGluZGV4ID0gMDsgaW5kZXggXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KVxuK1x0XHRcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCArIGluZGV4KSk7XG4rXG4gXHR9XG4gXG4gXHRyZXR1cm4gcmV0O1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6MTkuMTI4NzMyMjA2WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTQwOTk4NTA0NzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXZhbHVhdGluZyB0aGUgUGF0Y2gncyBTdWl0YWJpbGl0eSBmb3IgU3l6a2FsbGVyIEZ1enppbmcqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCBhIHBhdGNoIHJldmlldyByZXF1ZXN0LCBzcGVjaWZpY2FsbHkgZm9yIGZ1enppbmcgdHJpYWdlIGluIHRoZSBMaW51eCBrZXJuZWwuIFNlZW1zIHByZXR0eSBiZW5pZ24sIGZhbGxpbmcgdW5kZXIgZGVmZW5zaXZlIHNlY3VyaXR5IGVuZ2luZWVyaW5nIGFuZCBrZXJuZWwgUUEsIG5vdGhpbmcgc2NyZWFtaW5nIFwiY3JpdGljYWwgdnVsbmVyYWJpbGl0eVwiIGhlcmUuIEdvb2QuXG5cblRoZSBwYXRjaCBpdHNlbGYgdG91Y2hlcyBgbW0venN3YXAuY2AsIHNwZWNpZmljYWxseSBgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylgLiBMb29raW5nIGF0IHRoZSBkaWZmLCBpdCBpbnRyb2R1Y2VzIGEgY2hlY2s6IGBpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7YC4gVGhpcyBzZWVtcyB0byBiZSBhIHNhZmVndWFyZCBhZ2FpbnN0IHpzd2FwIGJlaW5nIHVzZWQgd2hlbiBpdCBpc24ndCBlbmFibGVkLCB3aGljaCBtYWtlcyBzZW5zZS4gVGhlcmUgYXJlIHNvbWUgY2hhbmdlcyBhZnRlciB0aGUgYCFyZXRgIGNoZWNrLiBJdCByZXBsYWNlcyB0aGUgdXNlIG9mIGB4YV9lcmFzZWAgd2l0aCBhIGB6c3dhcF9pbnZhbGlkYXRlYCB3aGljaCBsb29rcyBsaWtlIGEgcmVmYWN0b3JpbmcuXG5cbk15IG5leHQgc3RlcCBpcyB0byBkaXZlIGRlZXBlci4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQuIEknbGwgYmUgZGlnZ2luZyBpbnRvIGBtbS96c3dhcC5jYCBhbmQgYWRqYWNlbnQgY29kZS4gSSdsbCBiZSB1c2luZyB0aGUgdXN1YWwgdG9vbHMsIGxpa2UgZ3JlcCwgY3Njb3BlLCBtYXliZSBzb21lIHN0YXRpYyBhbmFseXNpcywgdG8gZ2V0IGEgaGFuZGxlIG9uIGNhbGxlcnMsIGNvbmZpZ3VyYXRpb25zIHJlbGF0ZWQgdG8genN3YXAsIGFuZCBmaWd1cmUgb3V0IHdoYXQgdGhlIGNyaXRpY2FsIHN5bWJvbHMgYXJlLiBJJ2xsIG5lZWQgdG8ga25vdyB3aGF0IGZ1bmN0aW9ucyBjYWxsIGB6c3dhcF9zdG9yZWAsIGFuZCB3aGF0IG1vZHVsZXMgdXNlIHRoaXMuIEFmdGVyIHRoYXQsIEkgY2FuIGZvcm0gYSBiZXR0ZXIgdmlldy4gVGhlbiwgSSBjYW4gcHJvcGVybHkgZXZhbHVhdGUgd2hldGhlciBvciBub3QgdGhpcyBjaGFuZ2Ugd2FycmFudHMgU3l6a2FsbGVyIGZ1enppbmcuIEl0J3MgdG9vIGVhcmx5IHRvIHNheSBmb3Igc3VyZSB3aXRob3V0IG1vcmUgaW52ZXN0aWdhdGlvbiwgYnV0IGZyb20gYSBmaXJzdCBnbGFuY2UsIHRoZSBjaGFuZ2Ugc2VlbXMgcmVhc29uYWJsZSwgYW5kIHBvdGVudGlhbGx5IGZ1enppbmcgaXMgbm90IG5lY2Vzc2FyeS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzA2OCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ3NiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM0OjMzLjIyODU5Mzg4NFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM2NDgwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS96c3dhcC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE0ODAsXG4gIFwiTGluZUNvdW50XCI6IDkwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE0ODA6XFx0XFx0bG9uZyBucl9wYWdlcyA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTtcXG4xNDgxOlxcdFxcdHN3cF9lbnRyeV90IHN3cCA9IGZvbGlvLVxcdTAwM2Vzd2FwO1xcbjE0ODI6XFx0XFx0c3RydWN0IG9ial9jZ3JvdXAgKm9iamNnID0gTlVMTDtcXG4xNDgzOlxcdFxcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7XFxuMTQ4NDpcXHRcXHRzdHJ1Y3QgenN3YXBfcG9vbCAqcG9vbDtcXG4xNDg1OlxcdFxcdGJvb2wgcmV0ID0gZmFsc2U7XFxuMTQ4NjpcXHRcXHRsb25nIGluZGV4O1xcbjE0ODc6XFx0XFxuMTQ4ODpcXHRcXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3RfbG9ja2VkKGZvbGlvKSk7XFxuMTQ4OTpcXHRcXHRWTV9XQVJOX09OX09OQ0UoIWZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSk7XFxuMTQ5MDpcXHRcXG4xNDkxOlxcdFxcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXFxuMTQ5MjpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuMTQ5MzpcXHRcXG4xNDk0OlxcdFxcdGlmICghenN3YXBfZW5hYmxlZClcXG4xNDk1OlxcdFxcdFxcdGdvdG8gY2hlY2tfb2xkO1xcbjE0OTY6XFx0XFxuMTQ5NzpcXHRcXHRvYmpjZyA9IGdldF9vYmpfY2dyb3VwX2Zyb21fZm9saW8oZm9saW8pO1xcbjE0OTg6XFx0XFx0aWYgKG9iamNnIFxcdTAwMjZcXHUwMDI2ICFvYmpfY2dyb3VwX21heV96c3dhcChvYmpjZykpIHtcXG4xNDk5OlxcdFxcdFxcdG1lbWNnID0gZ2V0X21lbV9jZ3JvdXBfZnJvbV9vYmpjZyhvYmpjZyk7XFxuMTUwMDpcXHRcXHRcXHRpZiAoc2hyaW5rX21lbWNnKG1lbWNnKSkge1xcbjE1MDE6XFx0XFx0XFx0XFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xcbjE1MDI6XFx0XFx0XFx0XFx0Z290byBwdXRfb2JqY2c7XFxuMTUwMzpcXHRcXHRcXHR9XFxuMTUwNDpcXHRcXHRcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuMTUwNTpcXHRcXHR9XFxuMTUwNjpcXHRcXG4xNTA3OlxcdFxcdGlmICh6c3dhcF9jaGVja19saW1pdHMoKSlcXG4xNTA4OlxcdFxcdFxcdGdvdG8gcHV0X29iamNnO1xcbjE1MDk6XFx0XFxuMTUxMDpcXHRcXHRwb29sID0genN3YXBfcG9vbF9jdXJyZW50X2dldCgpO1xcbjE1MTE6XFx0XFx0aWYgKCFwb29sKVxcbjE1MTI6XFx0XFx0XFx0Z290byBwdXRfb2JqY2c7XFxuMTUxMzpcXHRcXG4xNTE0OlxcdFxcdGlmIChvYmpjZykge1xcbjE1MTU6XFx0XFx0XFx0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX29iamNnKG9iamNnKTtcXG4xNTE2OlxcdFxcdFxcdGlmIChtZW1jZ19saXN0X2xydV9hbGxvYyhtZW1jZywgXFx1MDAyNnpzd2FwX2xpc3RfbHJ1LCBHRlBfS0VSTkVMKSkge1xcbjE1MTc6XFx0XFx0XFx0XFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xcbjE1MTg6XFx0XFx0XFx0XFx0Z290byBwdXRfcG9vbDtcXG4xNTE5OlxcdFxcdFxcdH1cXG4xNTIwOlxcdFxcdFxcdG1lbV9jZ3JvdXBfcHV0KG1lbWNnKTtcXG4xNTIxOlxcdFxcdH1cXG4xNTIyOlxcdFxcbjE1MjM6XFx0XFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFxcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpIHtcXG4xNTI0OlxcdFxcdFxcdGlmICghenN3YXBfc3RvcmVfcGFnZShmb2xpbywgaW5kZXgsIG9iamNnLCBwb29sKSlcXG4xNTI1OlxcdFxcdFxcdFxcdGdvdG8gcHV0X3Bvb2w7XFxuMTUyNjpcXHRcXHR9XFxuMTUyNzpcXHRcXG4xNTI4OlxcdFxcdGlmIChvYmpjZylcXG4xNTI5OlxcdFxcdFxcdGNvdW50X29iamNnX2V2ZW50cyhvYmpjZywgWlNXUE9VVCwgbnJfcGFnZXMpO1xcbjE1MzA6XFx0XFxuMTUzMTpcXHRcXHRjb3VudF92bV9ldmVudHMoWlNXUE9VVCwgbnJfcGFnZXMpO1xcbjE1MzI6XFx0XFxuMTUzMzpcXHRcXHRyZXQgPSB0cnVlO1xcbjE1MzQ6XFx0XFxuMTUzNTpcXHRwdXRfcG9vbDpcXG4xNTM2OlxcdFxcdHpzd2FwX3Bvb2xfcHV0KHBvb2wpO1xcbjE1Mzc6XFx0cHV0X29iamNnOlxcbjE1Mzg6XFx0XFx0b2JqX2Nncm91cF9wdXQob2JqY2cpO1xcbjE1Mzk6XFx0XFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgenN3YXBfcG9vbF9yZWFjaGVkX2Z1bGwpXFxuMTU0MDpcXHRcXHRcXHRxdWV1ZV93b3JrKHNocmlua193cSwgXFx1MDAyNnpzd2FwX3Nocmlua193b3JrKTtcXG4xNTQxOlxcdGNoZWNrX29sZDpcXG4xNTQyOlxcdFxcdC8qXFxuMTU0MzpcXHRcXHQgKiBJZiB0aGUgenN3YXAgc3RvcmUgZmFpbHMgb3IgenN3YXAgaXMgZGlzYWJsZWQsIHdlIG11c3QgaW52YWxpZGF0ZVxcbjE1NDQ6XFx0XFx0ICogdGhlIHBvc3NpYmx5IHN0YWxlIGVudHJpZXMgd2hpY2ggd2VyZSBwcmV2aW91c2x5IHN0b3JlZCBhdCB0aGVcXG4xNTQ1OlxcdFxcdCAqIG9mZnNldHMgY29ycmVzcG9uZGluZyB0byBlYWNoIHBhZ2Ugb2YgdGhlIGZvbGlvLiBPdGhlcndpc2UsXFxuMTU0NjpcXHRcXHQgKiB3cml0ZWJhY2sgY291bGQgb3ZlcndyaXRlIHRoZSBuZXcgZGF0YSBpbiB0aGUgc3dhcGZpbGUuXFxuMTU0NzpcXHRcXHQgKi9cXG4xNTQ4OlxcdFxcdGlmICghcmV0KSB7XFxuMTU0OTpcXHRcXHRcXHR1bnNpZ25lZCB0eXBlID0gc3dwX3R5cGUoc3dwKTtcXG4xNTUwOlxcdFxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xcbjE1NTE6XFx0XFxuMTU1MjpcXHRcXHRcXHRmb3IgKGluZGV4ID0gMDsgaW5kZXggXFx1MDAzYyBucl9wYWdlczsgKytpbmRleClcXG4xNTUzOlxcdFxcdFxcdFxcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCArIGluZGV4KSk7XFxuMTU1NDpcXHRcXG4xNTU1OlxcdFxcdH1cXG4xNTU2OlxcdFxcbjE1NTc6XFx0XFx0cmV0dXJuIHJldDtcXG4xNTU4OlxcdH1cXG4xNTU5OlxcdFxcbjE1NjA6XFx0LyoqXFxuMTU2MTpcXHQgKiB6c3dhcF9sb2FkKCkgLSBsb2FkIGEgZm9saW8gZnJvbSB6c3dhcFxcbjE1NjI6XFx0ICogQGZvbGlvOiBmb2xpbyB0byBsb2FkXFxuMTU2MzpcXHQgKlxcbjE1NjQ6XFx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHdpdGggdGhlIGZvbGlvIHVubG9ja2VkIGFuZCBtYXJrZWQgdXAtdG8tZGF0ZSwgb3Igb25lXFxuMTU2NTpcXHQgKiBvZiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzOlxcbjE1NjY6XFx0ICpcXG4xNTY3OlxcdCAqICAtRUlPOiBpZiB0aGUgc3dhcHBlZCBvdXQgY29udGVudCB3YXMgaW4genN3YXAsIGJ1dCBjb3VsZCBub3QgYmUgbG9hZGVkXFxuMTU2ODpcXHQgKiAgaW50byB0aGUgcGFnZSBkdWUgdG8gYSBkZWNvbXByZXNzaW9uIGZhaWx1cmUuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCwgYnV0XFxuMTU2OTpcXHQgKiAgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy4gZG9fc3dhcF9wYWdlKClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6MzMuMjI4OTYyMDk0WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTgyMzgyNTkzMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgZnVuY3Rpb25zLCBhcyBpZiBJJ20gdGhpbmtpbmcgaXQgdGhyb3VnaDpcblxuKipJbnZlc3RpZ2F0aW5nIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGFuZCBgenN3YXBfaW52YWxpZGF0ZSgpYCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGVzZSBgenN3YXBgIGZ1bmN0aW9ucy4gRmlyc3QsIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gd2hhdCBgenN3YXBfbmV2ZXJfZW5hYmxlZCgpYCBhbmQgYHpzd2FwX2ludmFsaWRhdGUoKWAgYXJlIGFjdHVhbGx5IGRvaW5nLiBUaW1lIHRvIGNoZWNrIHRoZSBzb3VyY2UgY29kZS4gSSdsbCBuZWVkIHRvIGxvY2F0ZSB0aGVpciBkZWZpbml0aW9ucywgcHJvYmFibHkgaW4gYG1tL3pzd2FwLmNgLCBvciBtYXliZSBJIGNhbiBmaW5kIGl0IGluIGFuIGluY2x1ZGUgZmlsZS4gQSBxdWljayBgZ3JlcGAgc2hvdWxkIGdldCBtZSB0aGUgYW5zd2VycyBmYXN0LCBzaG93aW5nIG1lIHdoZXJlIHRoZXkncmUgZGVmaW5lZCBhbmQgY2FsbGVkLiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSByZXZlYWxzIGFib3V0IHRoZWlyIHJvbGVzIGluIHRoZSB6c3dhcCBtZWNoYW5pc20uIFRoYXQnbGwgcHJvdmlkZSB0aGUgY29udGV4dCB0byB1bmRlcnN0YW5kIHRoZWlyIHBhcnRpY3VsYXIgZnVuY3Rpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUyNjgsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM0OjM1LjA1Mjc5MjI5NVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2OTU0NTEzNTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwienN3YXBfbmV2ZXJfZW5hYmxlZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtb3J5LmM9NDc1OD1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aHBfc3dhcGluX3N1aXRhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL21lbW9yeS5jLTQ3NzktXFx0ICovXFxubW0vbWVtb3J5LmM6NDc4MDpcXHRpZiAoIXpzd2FwX25ldmVyX2VuYWJsZWQoKSlcXG5tbS9tZW1vcnkuYy00NzgxLVxcdFxcdHJldHVybiAwO1xcbi0tXFxubW0vc2htZW0uYz0yMjQ1PXN0YXRpYyBzdHJ1Y3QgZm9saW8gKnNobWVtX3N3YXBfYWxsb2NfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbm1tL3NobWVtLmMtMjI1NC1cXHRpZiAoKHZtZiBcXHUwMDI2XFx1MDAyNiB1bmxpa2VseSh1c2VyZmF1bHRmZF9hcm1lZCh2bWYtXFx1MDAzZXZtYSkpKSB8fFxcbm1tL3NobWVtLmM6MjI1NTpcXHQgICAgICF6c3dhcF9uZXZlcl9lbmFibGVkKCkpXFxubW0vc2htZW0uYy0yMjU2LVxcdFxcdG9yZGVyID0gMDtcXG4tLVxcbm1tL3pzd2FwLmM9MTI1PWJvb2wgenN3YXBfaXNfZW5hYmxlZCh2b2lkKVxcbi0tXFxubW0venN3YXAuYy0xMjktXFxubW0venN3YXAuYzoxMzA6Ym9vbCB6c3dhcF9uZXZlcl9lbmFibGVkKHZvaWQpXFxubW0venN3YXAuYy0xMzEte1xcbi0tXFxubW0venN3YXAuYz0xNDc4PWJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3pzd2FwLmMtMTQ5MC1cXG5tbS96c3dhcC5jOjE0OTE6XFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcXG5tbS96c3dhcC5jLTE0OTItXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi0tXFxubW0venN3YXAuYz0xNTgwPWludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5tbS96c3dhcC5jLTE1ODktXFxubW0venN3YXAuYzoxNTkwOlxcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXFxubW0venN3YXAuYy0xNTkxLVxcdFxcdHJldHVybiAtRU5PRU5UO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDozNS43NDgyNTAxNDRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozODY2MzI0OTY5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSBrZXJuZWwgenN3YXAgY29tcG9uZW50cywgZnJvbSBhIHRlY2huaWNhbCBwZXJzcGVjdGl2ZTpcblxuKipEaXZpbmcgaW50byB6c3dhcCBDb25maWd1cmF0aW9uIGFuZCBPcGVyYXRpb24qKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgZG93biB0byB0aGUgbnV0cyBhbmQgYm9sdHMgb2YgaG93IHpzd2FwIGlzIGNvbmZpZ3VyZWQgYW5kIGJlaGF2ZXMuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgc3BlY2lmaWNzIG9mIGB6c3dhcF9uZXZlcl9lbmFibGVkYCwgYHpzd2FwX2ludmFsaWRhdGVgLCBhbmQgdGhlIHJlbGV2YW50IEtjb25maWcgb3B0aW9ucy4gVGhlc2UgYXJlIGtleSBmb3IgdW5kZXJzdGFuZGluZyB0aGUgZHluYW1pYyBiZWhhdmlvciBhbmQgY29udHJvbCBwb2ludHMgb2YgdGhlIHpzd2FwIHN1YnN5c3RlbSwgYW5kIGhvdyBpdOKAmXMgaW50ZWdyYXRlZCB3aXRoIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwncyBtZW1vcnkgbWFuYWdlbWVudC4gSSByZWNhbGwgdGhlIGltcGxpY2F0aW9ucyBvZiBlYWNoLCBidXQgSSBuZWVkIHRvIGVuc3VyZSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBpbnRlcnBsYXkgYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzIGlzIHNoYXJwLlxuXG5GaXJzdGx5LCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAuLi4gdGhpcyBsaWtlbHkgZnVuY3Rpb25zIGFzIGEgZ2xvYmFsIGdhdGUsIGEgZmxhZyB0aGF0IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHpzd2FwIGF0IGJvb3QgaWYgc2V0LiBJdCdzIHByb2JhYmx5IGNoZWNrZWQgZWFybHkgaW4gaW5pdGlhbGl6YXRpb24sIHBvdGVudGlhbGx5IHByZXZlbnRpbmcgYWxsb2NhdGlvbiBvZiB0aGUgbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcyBvciBwcmV2ZW50aW5nIHJlZ2lzdHJhdGlvbiBvZiB6c3dhcCBhcyBhIHN3YXAgc3BhY2UgcHJvdmlkZXIuIFRoZSBrZXkgaGVyZSBpcyB0aGUgbGV2ZWwgb2YgZ3JhbnVsYXJpdHk7IGRvZXMgaXQgZnVsbHkgdW5sb2FkIHRoZSBtb2R1bGVzLCBvciBkb2VzIGl0IHNpbXBseSBwcmV2ZW50IHVzZT8gSSB3YW50IHRvIHZlcmlmeSB0aGUgaW1wbGljYXRpb25zIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggY29tbWFuZC1saW5lIHBhcmFtZXRlcnMuXG5cbk5leHQsIGB6c3dhcF9pbnZhbGlkYXRlYC4gTm93LCB0aGlzIHNvdW5kcyBpbnRyaWd1aW5nLiBJdCBpbXBsaWVzIGFuIGludmFsaWRhdGlvbiBzdHJhdGVneS4gSSBhc3N1bWUgdGhpcyByZWxhdGVzIHRvIHRoZSBjYWNoZSBtYW5hZ2VtZW50IG9yIHdyaXRlLWJhY2sgcG9saWNpZXMuIERvZXMgaXQgdHJpZ2dlciBhbiBleHBsaWNpdCBpbnZhbGlkYXRpb24gb2YgdGhlIHN3YXAgZW50cmllcywgZm9yY2luZyB0aGVtIHRvIGJlIHJlLWNvbXByZXNzZWQgYW5kIHdyaXR0ZW4gYmFjaz8gT3IgZG9lcyBpdCBoaW50IGF0IGEgd2F5IHRvIHB1cmdlIHBhZ2VzIHRvIHJlY2xhaW0gc3BhY2U/IEnigJlsbCBuZWVkIHRvIGNoZWNrIHRoZSBjb2RlLiBBcmUgdGhlcmUgYW55IHBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRvIGJlIG1pbmRmdWwgb2YgaGVyZT8gSG93IGRvZXMgaXQgaW50ZXJhY3Qgd2l0aCB0aGUgcGFnZSByZWNsYWltIG1lY2hhbmlzbXM/IFRoaXMgZnVuY3Rpb24gY291bGQgcGxheSBhIHZpdGFsIHJvbGUgaW4gcHJldmVudGluZyBtZW1vcnkgbGVha3Mgb3IgaW1wcm92aW5nIHN3YXBwaW5nIGVmZmljaWVuY3kuXG5cbkZpbmFsbHksIHRoZSBLY29uZmlnIG9wdGlvbnMuIFRoaXMgaXMgdGhlIGJlZHJvY2sgb2YgY29uZmlndXJhdGlvbi4gV2hhdCBncmFudWxhciBjb250cm9sIGRvIHdlIGhhdmU/IERvZXMgaXQgYWxsb3cgZm9yIGNvbXBpbGUtdGltZSBjaG9pY2VzPyBDYW4gd2UgZGlzYWJsZSBwYXJ0cyBvZiB0aGUgZnVuY3Rpb25hbGl0eSB0byByZWR1Y2UgdGhlIGtlcm5lbCBpbWFnZSBzaXplIG9yIHJlZHVjZSBzdXJmYWNlIGFyZWE/IEknbGwgY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgdGhlIGFiaWxpdHkgdG8gZmluZS10dW5lIGFzcGVjdHMgbGlrZSBjb21wcmVzc2lvbiBhbGdvcml0aG1zLCB3cml0ZWJhY2sgcG9saWNpZXMsIG9yIG1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWdpZXMgdGhyb3VnaCB0aG9zZSBvcHRpb25zLiBJIHNob3VsZCBhbHNvIGludmVzdGlnYXRlIHdoZXRoZXIgYW55IGRlcGVuZGVuY2llcyBleGlzdCBiZXR3ZWVuIHRoZSBLY29uZmlnIG9wdGlvbnMuIEkgbmVlZCB0byBiZSBzdXJlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWVzLCBhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGVtLCBhcmUgY2xlYXIgYW5kIGRvY3VtZW50ZWQuXG5cblVsdGltYXRlbHksIEkgd2FudCBhIGNvbXBsZXRlLCB1cC10by1kYXRlLCBwaWN0dXJlIG9mIGhvdyB0aGVzZSB0aHJlZSBlbGVtZW50cyBpbnRlcmFjdC4gSSdsbCBmb2N1cyBvbiBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIGFuZCBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgdG8gYnVpbGQgYSByZWxpYWJsZSBtZW50YWwgbW9kZWwgb2YgenN3YXAncyBpbnRlcm5hbCBvcGVyYXRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1OTU1LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6MzkuNjE0NTgwMTYzWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkzOTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3pzd2FwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTIwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTIwOlxcdC8qIEVuYWJsZS9kaXNhYmxlIG1lbW9yeSBwcmVzc3VyZS1iYXNlZCBzaHJpbmtlci4gKi9cXG4gMTIxOlxcdHN0YXRpYyBib29sIHpzd2FwX3Nocmlua2VyX2VuYWJsZWQgPSBJU19FTkFCTEVEKFxcbiAxMjI6XFx0XFx0XFx0Q09ORklHX1pTV0FQX1NIUklOS0VSX0RFRkFVTFRfT04pO1xcbiAxMjM6XFx0bW9kdWxlX3BhcmFtX25hbWVkKHNocmlua2VyX2VuYWJsZWQsIHpzd2FwX3Nocmlua2VyX2VuYWJsZWQsIGJvb2wsIDA2NDQpO1xcbiAxMjQ6XFx0XFxuIDEyNTpcXHRib29sIHpzd2FwX2lzX2VuYWJsZWQodm9pZClcXG4gMTI2OlxcdHtcXG4gMTI3OlxcdFxcdHJldHVybiB6c3dhcF9lbmFibGVkO1xcbiAxMjg6XFx0fVxcbiAxMjk6XFx0XFxuIDEzMDpcXHRib29sIHpzd2FwX25ldmVyX2VuYWJsZWQodm9pZClcXG4gMTMxOlxcdHtcXG4gMTMyOlxcdFxcdHJldHVybiAhc3RhdGljX2JyYW5jaF9tYXliZShDT05GSUdfWlNXQVBfREVGQVVMVF9PTiwgXFx1MDAyNnpzd2FwX2V2ZXJfZW5hYmxlZCk7XFxuIDEzMzpcXHR9XFxuIDEzNDpcXHRcXG4gMTM1OlxcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcXG4gMTM2OlxcdCogZGF0YSBzdHJ1Y3R1cmVzXFxuIDEzNzpcXHQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xcbiAxMzg6XFx0XFxuIDEzOTpcXHRzdHJ1Y3QgY3J5cHRvX2Fjb21wX2N0eCB7XFxuIDE0MDpcXHRcXHRzdHJ1Y3QgY3J5cHRvX2Fjb21wICphY29tcDtcXG4gMTQxOlxcdFxcdHN0cnVjdCBhY29tcF9yZXEgKnJlcTtcXG4gMTQyOlxcdFxcdHN0cnVjdCBjcnlwdG9fd2FpdCB3YWl0O1xcbiAxNDM6XFx0XFx0dTggKmJ1ZmZlcjtcXG4gMTQ0OlxcdFxcdHN0cnVjdCBtdXRleCBtdXRleDtcXG4gMTQ1OlxcdH07XFxuIDE0NjpcXHRcXG4gMTQ3OlxcdC8qXFxuIDE0ODpcXHQgKiBUaGUgbG9jayBvcmRlcmluZyBpcyB6c3dhcF90cmVlLmxvY2sgLVxcdTAwM2UgenN3YXBfcG9vbC5scnVfbG9jay5cXG4gMTQ5OlxcdCAqIFRoZSBvbmx5IGNhc2Ugd2hlcmUgbHJ1X2xvY2sgaXMgbm90IGFjcXVpcmVkIHdoaWxlIGhvbGRpbmcgdHJlZS5sb2NrIGlzXFxuIDE1MDpcXHQgKiB3aGVuIGEgenN3YXBfZW50cnkgaXMgdGFrZW4gb2ZmIHRoZSBscnUgZm9yIHdyaXRlYmFjaywgaW4gdGhhdCBjYXNlIGl0XFxuIDE1MTpcXHQgKiBuZWVkcyB0byBiZSB2ZXJpZmllZCB0aGF0IGl0J3Mgc3RpbGwgdmFsaWQgaW4gdGhlIHRyZWUuXFxuIDE1MjpcXHQgKi9cXG4gMTUzOlxcdHN0cnVjdCB6c3dhcF9wb29sIHtcXG4gMTU0OlxcdFxcdHN0cnVjdCB6c19wb29sICp6c19wb29sO1xcbiAxNTU6XFx0XFx0c3RydWN0IGNyeXB0b19hY29tcF9jdHggX19wZXJjcHUgKmFjb21wX2N0eDtcXG4gMTU2OlxcdFxcdHN0cnVjdCBwZXJjcHVfcmVmIHJlZjtcXG4gMTU3OlxcdFxcdHN0cnVjdCBsaXN0X2hlYWQgbGlzdDtcXG4gMTU4OlxcdFxcdHN0cnVjdCB3b3JrX3N0cnVjdCByZWxlYXNlX3dvcms7XFxuIDE1OTpcXHRcXHRzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDozOS42MTQ3OTUzNzNaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNjY1NjU2Njg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBgenN3YXBfaW52YWxpZGF0ZWAgZnVuY3Rpb24gYW5kIHNlZSB3aGF0IGl0J3MgYWxsIGFib3V0LiBBcyBzb21lb25lIGRlZXBseSBmYW1pbGlhciB3aXRoIG1lbW9yeSBtYW5hZ2VtZW50IGluIHRoZSBrZXJuZWwsIEknbSBleHBlY3RpbmcgdGhpcyBmdW5jdGlvbiBwbGF5cyBhIGNydWNpYWwgcm9sZSwgbGlrZWx5IGludm9sdmluZyB0aGUgbWFuYWdlbWVudCBvZiBzd2FwcGVkIHBhZ2VzIHdpdGhpbiB0aGUgenN3YXAgc3Vic3lzdGVtLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcHVycG9zZSwgd2hlbiBpdCdzIGNhbGxlZCwgYW5kIG1vc3QgaW1wb3J0YW50bHksIGhvdyBpdCBlbnN1cmVzIGRhdGEgY29uc2lzdGVuY3kgYW5kIGVmZmljaWVudCByZXNvdXJjZSB1dGlsaXphdGlvbi5cblxuSSdtIG1lbnRhbGx5IHByZXBhcmluZyB0byBzY3J1dGluaXplIGl0cyBsb2dpYy4gSSdsbCBiZSBsb29raW5nIGZvciBjbHVlcyBhYm91dCB0aGUgY29uZGl0aW9ucyB0aGF0IHRyaWdnZXIgYW4gaW52YWxpZGF0aW9uLiBJcyBpdCBiYXNlZCBvbiBhIHRpbWVyLCBtZW1vcnkgcHJlc3N1cmUsIG9yIHNvbWUgb3RoZXIgZXZlbnQ/IERvZXMgaXQgaW50ZXJhY3Qgd2l0aCBwYWdlIHRhYmxlcyBkaXJlY3RseT8gRG9lcyBpdCBpbnZvbHZlIGZyZWVpbmcgdGhlIGFzc29jaWF0ZWQgY29tcHJlc3NlZCBkYXRhIG9yIG1lcmVseSBtYXJraW5nIHRoZSBzd2FwIGVudHJ5IGFzIGludmFsaWQ/IEknbGwgYWxzbyB0cnkgdG8gdW5kZXJzdGFuZCBpdHMgcmVsYXRpb25zaGlwIHRvIG90aGVyIGZ1bmN0aW9ucywgbGlrZSB0aG9zZSByZXNwb25zaWJsZSBmb3IgcGFnZSByZWNsYWltIGFuZCBzd2FwLW91dC4gSSBuZWVkIHRvIHBpZWNlIHRvZ2V0aGVyIGl0cyByb2xlIGluIHByZXZlbnRpbmcgdGhlIHpzd2FwIGNhY2hlIGZyb20gYmVjb21pbmcgc3RhbGUuIEkgZXhwZWN0IGl0J2xsIHVzZSBzb21lIGF0b21pYyBvcGVyYXRpb25zIG9yIGxvY2tpbmcgdG8gZW5zdXJlIHRocmVhZCBzYWZldHkuIEFueSBjbGV2ZXIgb3B0aW1pemF0aW9ucyBvciBlZGdlLWNhc2UgaGFuZGxpbmcgd2lsbCBhbHNvIGNhdGNoIG15IGV5ZS4gSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0IGRlYWxzIHdpdGggcG90ZW50aWFsIEkvTyBlcnJvcnMgYW5kIGFueSBtZWNoYW5pc21zIGl0IHVzZXMgdG8gYXZvaWQgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuIFNvLCBicmluZyBvbiB0aGUgY29kZSEgTGV0J3Mgc2VlIGhvdyBpdCdzIGltcGxlbWVudGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTQ3LCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDo0Mi4yODA0NTQ4NjFaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNjAwNjgwOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ6c3dhcF9pbnZhbGlkYXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9zd2FwZmlsZS5jPTEzMTY9c3RhdGljIHZvaWQgc3dhcF9yYW5nZV9mcmVlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsXFxuLS1cXG5tbS9zd2FwZmlsZS5jLTEzMjMtXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX2VudHJpZXM7IGkrKylcXG5tbS9zd2FwZmlsZS5jOjEzMjQ6XFx0XFx0enN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnkoc2ktXFx1MDAzZXR5cGUsIG9mZnNldCArIGkpKTtcXG5tbS9zd2FwZmlsZS5jLTEzMjUtXFxuLS1cXG5tbS96c3dhcC5jPTE0Nzg9Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0venN3YXAuYy0xNTUyLVxcdFxcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KVxcbm1tL3pzd2FwLmM6MTU1MzpcXHRcXHRcXHR6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgKyBpbmRleCkpO1xcbm1tL3pzd2FwLmMtMTU1NC1cXG4tLVxcbm1tL3pzd2FwLmM9MTU4MD1pbnQgenN3YXBfbG9hZChzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0venN3YXAuYy0xNjMyLVxcbm1tL3pzd2FwLmM6MTYzMzp2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKVxcbm1tL3pzd2FwLmMtMTYzNC17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM0OjQyLjQxNjQ3MDk4OVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNTI5NzU5NTU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIHpzd2FwX2ludmFsaWRhdGUqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGB6c3dhcF9pbnZhbGlkYXRlYCBpbiBgbW0venN3YXAuY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIGl0cyByb2xlIGluIHRoZSBsYXJnZXIgcGljdHVyZSBvZiB6c3dhcCdzIGZ1bmN0aW9uYWxpdHksIHNwZWNpZmljYWxseSBob3cgaXQgaGFuZGxlcyByZWNsYWltaW5nIG9yIGludmFsaWRhdGluZyBwYWdlcyB3aXRoaW4gdGhlIHpzd2FwIGNhY2hlLiBJIGtub3cgdGhlIGNvcmUgaWRlYSBpcyBhYm91dCBlbnN1cmluZyBtZW1vcnkgY29uc2lzdGVuY3kgYW5kIHByZXZlbnRpbmcgc3RhbGUgZGF0YSBmcm9tIHJlc2lkaW5nIHdpdGhpbiB0aGUgc3dhcCBjYWNoZS5cblxuSSdtIGV4cGVjdGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBhdCBwb2ludHMgd2hlcmUgdGhlIGJhY2tpbmcgcGFnZSBtaWdodCBiZSBtb2RpZmllZCwgb3Igd2hlbiB0aGUgc3lzdGVtIG5lZWRzIHRvIGZyZWUgdXAgc3BhY2UgaW4gdGhlIHpzd2FwIHBvb2wuIEknbSBrZWVuIHRvIHNlZSB0aGUgc3BlY2lmaWMgY29uZGl0aW9ucyBmb3IgaW52YWxpZGF0aW9uIOKAkyBhcmUgd2UgdGFsa2luZyBhYm91dCBwYWdlIGZhdWx0cywgZGlyZWN0IHJlY2xhaW0sIG9yIHNvbWUgb3RoZXIgdHJpZ2dlcj8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBwYWdlIHRhYmxlcywgYW5kIGhvdyBpdCBoYW5kbGVzIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuIEknbSBhbHNvIGN1cmlvdXMgYWJvdXQgdGhlIG1lY2hhbmlzbXMgaXQgZW1wbG95cywgc3VjaCBhcyBpbnZhbGlkYXRpbmcgdGhlIHBhZ2UgY2FjaGUgZW50cmllcyBhbmQgcG90ZW50aWFsbHkgaW5pdGlhdGluZyBhIHdyaXRlYmFjayB0byB0aGUgc3dhcCBkZXZpY2UgaWYgcmVxdWlyZWQuIEZpbmFsbHksIEknbGwgYmUgbG9va2luZyBmb3IgaG93IGl0IGludGVyYWN0cyB3aXRoIGFueSBvdGhlciBzdWJzeXN0ZW1zIG9yIGRhdGEgc3RydWN0dXJlcyB0aGF0IGRlcGVuZCBvbiB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIHpzd2FwIHBhZ2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NzU2LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzQ6NDUuOTQ2MjM0MDQzWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMDg4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS96c3dhcC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE2MzAsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE2MzA6XFx0XFx0cmV0dXJuIDA7XFxuMTYzMTpcXHR9XFxuMTYzMjpcXHRcXG4xNjMzOlxcdHZvaWQgenN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnlfdCBzd3ApXFxuMTYzNDpcXHR7XFxuMTYzNTpcXHRcXHRwZ29mZl90IG9mZnNldCA9IHN3cF9vZmZzZXQoc3dwKTtcXG4xNjM2OlxcdFxcdHN0cnVjdCB4YXJyYXkgKnRyZWUgPSBzd2FwX3pzd2FwX3RyZWUoc3dwKTtcXG4xNjM3OlxcdFxcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XFxuMTYzODpcXHRcXG4xNjM5OlxcdFxcdGlmICh4YV9lbXB0eSh0cmVlKSlcXG4xNjQwOlxcdFxcdFxcdHJldHVybjtcXG4xNjQxOlxcdFxcbjE2NDI6XFx0XFx0ZW50cnkgPSB4YV9lcmFzZSh0cmVlLCBvZmZzZXQpO1xcbjE2NDM6XFx0XFx0aWYgKGVudHJ5KVxcbjE2NDQ6XFx0XFx0XFx0enN3YXBfZW50cnlfZnJlZShlbnRyeSk7XFxuMTY0NTpcXHR9XFxuMTY0NjpcXHRcXG4xNjQ3OlxcdGludCB6c3dhcF9zd2Fwb24oaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuMTY0ODpcXHR7XFxuMTY0OTpcXHRcXHRzdHJ1Y3QgeGFycmF5ICp0cmVlcywgKnRyZWU7XFxuMTY1MDpcXHRcXHR1bnNpZ25lZCBpbnQgbnIsIGk7XFxuMTY1MTpcXHRcXG4xNjUyOlxcdFxcdG5yID0gRElWX1JPVU5EX1VQKG5yX3BhZ2VzLCBaU1dBUF9BRERSRVNTX1NQQUNFX1BBR0VTKTtcXG4xNjUzOlxcdFxcdHRyZWVzID0ga3Z6YWxsb2Nfb2JqcygqdHJlZSwgbnIpO1xcbjE2NTQ6XFx0XFx0aWYgKCF0cmVlcykge1xcbjE2NTU6XFx0XFx0XFx0cHJfZXJyKFxcXCJhbGxvYyBmYWlsZWQsIHpzd2FwIGRpc2FibGVkIGZvciBzd2FwIHR5cGUgJWRcXFxcblxcXCIsIHR5cGUpO1xcbjE2NTY6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuMTY1NzpcXHRcXHR9XFxuMTY1ODpcXHRcXG4xNjU5OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucjsgaSsrKVxcbjE2NjA6XFx0XFx0XFx0eGFfaW5pdCh0cmVlcyArIGkpO1xcbjE2NjE6XFx0XFxuMTY2MjpcXHRcXHRucl96c3dhcF90cmVlc1t0eXBlXSA9IG5yO1xcbjE2NjM6XFx0XFx0enN3YXBfdHJlZXNbdHlwZV0gPSB0cmVlcztcXG4xNjY0OlxcdFxcdHJldHVybiAwO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDo0NS45NDY0NjczNDNaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjM4NzM2ODY1MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5J3JlIG15IG93bjpcblxuKipJbnZlc3RpZ2F0aW5nIEtjb25maWcgZm9yIHpzd2FwKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgdG8gaXQuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBnbyBzdHJhaWdodCB0byB0aGUgS2NvbmZpZyBmaWxlcyByZWxhdGVkIHRvIHpzd2FwLiBObyBmbHVmZiwgbGV0J3MgZ2V0IGRvd24gdG8gdGhlIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4gSSB3YW50IHRvIHNlZSBob3cgdGhpcyBmZWF0dXJlIGlzIGNvbnRyb2xsZWQgYW5kIHdoYXQgb3B0aW9ucyBhcmUgYXZhaWxhYmxlLiBXaGF0IGFyZSB0aGUgZGVwZW5kZW5jaWVzPyBBcmUgdGhlcmUgYW55IGhpZGRlbiBzZXR0aW5ncz8gQXJlIHRoZXJlIGFueSBpbnRlcmVzdGluZyB0aGluZ3MgSSBjYW4gZG8gd2l0aCBpdD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHVuZGVybHlpbmcgZnJhbWV3b3JrLCBob3cgdG8gZW5hYmxlL2Rpc2FibGUgaXQsIGFuZCB3aGF0IHZhcmlhYmxlcyBhcmUgYXQgcGxheSBoZXJlLiBUaGlzIGlzIHdoZXJlIHRoZSByZWFsIGtub3dsZWRnZSBpcywgYXQgdGhlIGNvbmZpZ3VyYXRpb24gbGV2ZWwuIExldCdzIHNlZSB3aGF0IHdlIGNhbiBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NTYyLCJPdXRwdXRUb2tlbnMiOjI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDo0OC4zMzM4Mzg4MTZaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NDc3MDgyNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgWlNXQVBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9MTI9bWVudWNvbmZpZyBTV0FQXFxuLS1cXG5tbS9LY29uZmlnLTIxLVxcbm1tL0tjb25maWc6MjI6Y29uZmlnIFpTV0FQXFxubW0vS2NvbmZpZy0yMy1cXHRib29sIFxcXCJDb21wcmVzc2VkIGNhY2hlIGZvciBzd2FwIHBhZ2VzXFxcIlxcbi0tXFxubW0vS2NvbmZpZy0zNC1cXG5tbS9LY29uZmlnOjM1OmNvbmZpZyBaU1dBUF9ERUZBVUxUX09OXFxubW0vS2NvbmZpZy0zNi1cXHRib29sIFxcXCJFbmFibGUgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgYnkgZGVmYXVsdFxcXCJcXG4tLVxcbm1tL0tjb25maWctNDQtXFxubW0vS2NvbmZpZzo0NTpjb25maWcgWlNXQVBfU0hSSU5LRVJfREVGQVVMVF9PTlxcbm1tL0tjb25maWctNDYtXFx0Ym9vbCBcXFwiU2hyaW5rIHRoZSB6c3dhcCBwb29sIG9uIG1lbW9yeSBwcmVzc3VyZVxcXCJcXG4tLVxcbm1tL0tjb25maWc9NTk9Y2hvaWNlXFxuLS1cXG5tbS9LY29uZmlnLTc2LVxcbm1tL0tjb25maWc6Nzc6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9ERUZMQVRFXFxubW0vS2NvbmZpZy03OC1cXHRib29sIFxcXCJEZWZsYXRlXFxcIlxcbi0tXFxubW0vS2NvbmZpZy04Mi1cXG5tbS9LY29uZmlnOjgzOmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRfTFpPXFxubW0vS2NvbmZpZy04NC1cXHRib29sIFxcXCJMWk9cXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg4LVxcbm1tL0tjb25maWc6ODk6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF84NDJcXG5tbS9LY29uZmlnLTkwLVxcdGJvb2wgXFxcIjg0MlxcXCJcXG4tLVxcbm1tL0tjb25maWctOTQtXFxubW0vS2NvbmZpZzo5NTpjb25maWcgWlNXQVBfQ09NUFJFU1NPUl9ERUZBVUxUX0xaNFxcbm1tL0tjb25maWctOTYtXFx0Ym9vbCBcXFwiTFo0XFxcIlxcbi0tXFxubW0vS2NvbmZpZy0xMDAtXFxubW0vS2NvbmZpZzoxMDE6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9MWjRIQ1xcbm1tL0tjb25maWctMTAyLVxcdGJvb2wgXFxcIkxaNEhDXFxcIlxcbi0tXFxubW0vS2NvbmZpZy0xMDYtXFxubW0vS2NvbmZpZzoxMDc6Y29uZmlnIFpTV0FQX0NPTVBSRVNTT1JfREVGQVVMVF9aU1REXFxubW0vS2NvbmZpZy0xMDgtXFx0Ym9vbCBcXFwienN0ZFxcXCJcXG4tLVxcbm1tL0tjb25maWc9MTEyPWVuZGNob2ljZVxcbm1tL0tjb25maWctMTEzLVxcbm1tL0tjb25maWc6MTE0OmNvbmZpZyBaU1dBUF9DT01QUkVTU09SX0RFRkFVTFRcXG5tbS9LY29uZmlnLTExNS0gICAgICAgc3RyaW5nXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM0OjQ4LjQ3ODY3ODg1M1oiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxODYzNzcyNzYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGl2aW5nIGludG8gdGhlIFpTV0FQIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eSB3aXRoIHRoaXMgYFpTV0FQYCBjb25maWd1cmF0aW9uLiBGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHN0cnVjdHVyZSB3aXRoaW4gdGhlIGtlcm5lbCdzIGJ1aWxkIHN5c3RlbS4gTGV0J3Mgc3RhcnQgYnkgbmF2aWdhdGluZyBkaXJlY3RseSB0byBgbW0vS2NvbmZpZ2AuIFRoYXQncyB3aGVyZSBJIGV4cGVjdCB0byBmaW5kIHRoZSByZWxldmFudCBkZWZpbml0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGZvciBtZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zLiBJJ20gc3BlY2lmaWNhbGx5IGxvb2tpbmcgZm9yIHRoZSBzZWN0aW9uIHJlbGF0ZWQgdG8gYGNvbmZpZyBaU1dBUGAuIEkgd2FudCB0byBzZWUgaG93IGl0J3MgZGVmaW5lZCwgd2hpY2ggb3RoZXIgY29uZmlndXJhdGlvbnMgaXQgZGVwZW5kcyBvbiwgYW5kIHdoYXQgdGhlIGRlZmF1bHQgc2V0dGluZ3MgbWlnaHQgYmUuIFRoaXMgd2lsbCBnaXZlIG1lIGEgc29saWQgZm91bmRhdGlvbiBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIGVuYWJsaW5nIG9yIGRpc2FibGluZyBpdCB3aXRoaW4gYSBrZXJuZWwgY29uZmlndXJhdGlvbi4gS25vd2luZyB0aGUgYEtjb25maWdgIHN0cnVjdHVyZSBoZWxwcyBtZSBhc3Nlc3MgcG90ZW50aWFsIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjkyOTUsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDo1MC4zNDI0NTQ3MDRaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjMwNjcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMTUsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMTU6XFx0XFx0ZGVmYXVsdCB5XFxuICAxNjpcXHRcXHRoZWxwXFxuICAxNzpcXHRcXHQgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY2hvb3NlIHdoZXRoZXIgeW91IHdhbnQgdG8gaGF2ZSBzdXBwb3J0XFxuICAxODpcXHRcXHQgIGZvciBzbyBjYWxsZWQgc3dhcCBkZXZpY2VzIG9yIHN3YXAgZmlsZXMgaW4geW91ciBrZXJuZWwgdGhhdCBhcmVcXG4gIDE5OlxcdFxcdCAgdXNlZCB0byBwcm92aWRlIG1vcmUgdmlydHVhbCBtZW1vcnkgdGhhbiB0aGUgYWN0dWFsIFJBTSBwcmVzZW50XFxuICAyMDpcXHRcXHQgIGluIHlvdXIgY29tcHV0ZXIuICBJZiB1bnN1cmUgc2F5IFkuXFxuICAyMTpcXHRcXG4gIDIyOlxcdGNvbmZpZyBaU1dBUFxcbiAgMjM6XFx0XFx0Ym9vbCBcXFwiQ29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlc1xcXCJcXG4gIDI0OlxcdFxcdGRlcGVuZHMgb24gU1dBUFxcbiAgMjU6XFx0XFx0c2VsZWN0IENSWVBUT1xcbiAgMjY6XFx0XFx0c2VsZWN0IFpTTUFMTE9DXFxuICAyNzpcXHRcXHRoZWxwXFxuICAyODpcXHRcXHQgIEEgbGlnaHR3ZWlnaHQgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcy4gIEl0IHRha2VzXFxuICAyOTpcXHRcXHQgIHBhZ2VzIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHN3YXBwZWQgb3V0IGFuZCBhdHRlbXB0cyB0b1xcbiAgMzA6XFx0XFx0ICBjb21wcmVzcyB0aGVtIGludG8gYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgUkFNLWJhc2VkIG1lbW9yeSBwb29sLlxcbiAgMzE6XFx0XFx0ICBUaGlzIGNhbiByZXN1bHQgaW4gYSBzaWduaWZpY2FudCBJL08gcmVkdWN0aW9uIG9uIHN3YXAgZGV2aWNlIGFuZCxcXG4gIDMyOlxcdFxcdCAgaW4gdGhlIGNhc2Ugd2hlcmUgZGVjb21wcmVzc2luZyBmcm9tIFJBTSBpcyBmYXN0ZXIgdGhhbiBzd2FwIGRldmljZVxcbiAgMzM6XFx0XFx0ICByZWFkcywgY2FuIGFsc28gaW1wcm92ZSB3b3JrbG9hZCBwZXJmb3JtYW5jZS5cXG4gIDM0OlxcdFxcbiAgMzU6XFx0Y29uZmlnIFpTV0FQX0RFRkFVTFRfT05cXG4gIDM2OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSB0aGUgY29tcHJlc3NlZCBjYWNoZSBmb3Igc3dhcCBwYWdlcyBieSBkZWZhdWx0XFxcIlxcbiAgMzc6XFx0XFx0ZGVwZW5kcyBvbiBaU1dBUFxcbiAgMzg6XFx0XFx0aGVscFxcbiAgMzk6XFx0XFx0ICBJZiBzZWxlY3RlZCwgdGhlIGNvbXByZXNzZWQgY2FjaGUgZm9yIHN3YXAgcGFnZXMgd2lsbCBiZSBlbmFibGVkXFxuICA0MDpcXHRcXHQgIGF0IGJvb3QsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRpc2FibGVkLlxcbiAgNDE6XFx0XFxuICA0MjpcXHRcXHQgIFRoZSBzZWxlY3Rpb24gbWFkZSBoZXJlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHVzaW5nIHRoZSBrZXJuZWxcXG4gIDQzOlxcdFxcdCAgY29tbWFuZCBsaW5lICd6c3dhcC5lbmFibGVkPScgb3B0aW9uLlxcbiAgNDQ6XFx0XFxuICA0NTpcXHRjb25maWcgWlNXQVBfU0hSSU5LRVJfREVGQVVMVF9PTlxcbiAgNDY6XFx0XFx0Ym9vbCBcXFwiU2hyaW5rIHRoZSB6c3dhcCBwb29sIG9uIG1lbW9yeSBwcmVzc3VyZVxcXCJcXG4gIDQ3OlxcdFxcdGRlcGVuZHMgb24gWlNXQVBcXG4gIDQ4OlxcdFxcdGRlZmF1bHQgblxcbiAgNDk6XFx0XFx0aGVscFxcbiAgNTA6XFx0XFx0ICBJZiBzZWxlY3RlZCwgdGhlIHpzd2FwIHNocmlua2VyIHdpbGwgYmUgZW5hYmxlZCwgYW5kIHRoZSBwYWdlc1xcbiAgNTE6XFx0XFx0ICBzdG9yZWQgaW4gdGhlIHpzd2FwIHBvb2wgd2lsbCBiZWNvbWUgYXZhaWxhYmxlIGZvciByZWNsYWltIChpLmVcXG4gIDUyOlxcdFxcdCAgd3JpdHRlbiBiYWNrIHRvIHRoZSBiYWNraW5nIHN3YXAgZGV2aWNlKSBvbiBtZW1vcnkgcHJlc3N1cmUuXFxuICA1MzpcXHRcXG4gIDU0OlxcdFxcdCAgVGhpcyBtZWFucyB0aGF0IHpzd2FwIHdyaXRlYmFjayBjb3VsZCBoYXBwZW4gZXZlbiBpZiB0aGUgcG9vbCBpc1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNDo1MC4zNDI2ODgxMTRaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTgxNzIxMDkxMzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgWnN3YXAgUGF0Y2g6IFdvcnRoeSBvZiBGdXp6aW5nKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIGlzIHRvdWNoaW5nIGB6c3dhcF9zdG9yZSgpYCB3aXRoaW4gYG1tL3pzd2FwLmNgLCB3aGljaCBpbW1lZGlhdGVseSBmbGFncyB0aGlzIGFzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIG1ha2luZyBpdCBhbiBpbnRlcmVzdGluZyB0YXJnZXQuIExldCdzIGxvb2sgYXQgdGhlIHNwZWNpZmljcy5cblxuRmlyc3QsIHRoZXJlJ3MgYSBndWFyZCBjb25kaXRpb24gYWRkZWQ6IGBpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7YC4gVGhpcyBzZWVtcyB0byBiZSBhIHF1aWNrIGV4aXQgaWYgenN3YXAgd2Fzbid0IGVuYWJsZWQgaW4gdGhlIGZpcnN0IHBsYWNlLCBsaWtlbHkgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uIEl0IGFwcGVhcnMgdGhpcyBjaGVjayBhdm9pZHMgZG9pbmcgZXh0cmEgd29yayBpZiB6c3dhcCB3YXNuJ3QgY29uZmlndXJlZCwgdGh1cyBhdm9pZGluZyBwb3RlbnRpYWwgbG9jayBjb250ZW50aW9uIGFuZCBjaGVja2luZyBwcmV2aW91c2x5IHN0b3JlZCBpbnZhbGlkYXRpb25zLlxuXG5TZWNvbmQsIHRoZSBwYXRjaCByZXBsYWNlcyBhbiBleHBsaWNpdCBsb29wIGl0ZXJhdGluZyBhbmQgZXJhc2luZyBlbnRyaWVzIGZyb20gdGhlIHhhcnJheSB3aXRoIGEgY2FsbCB0byBgenN3YXBfaW52YWxpZGF0ZSgpYC4gVGhpcyBsb29rcyBsaWtlIGEgcmVmYWN0b3JpbmcuIERpZ2dpbmcgaW50byBgenN3YXBfaW52YWxpZGF0ZSgpYCwgaXQgZmlyc3QgY2hlY2tzIGlmIHRoZSB4YXJyYXkgaXMgZW1wdHkgYmVmb3JlIGF0dGVtcHRpbmcgYW4gZXJhc2UuIFRoaXMgaXMgbGlrZWx5IGludGVuZGVkIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYHpzd2FwYCBpcyBkaXNhYmxlZCwgYW5kIHRoaXMgYnJhbmNoIGlzIHNraXBwZWQuXG5cbkdpdmVuIHRoYXQgdGhpcyBhZmZlY3RzIGNvbnRyb2wgZmxvdyBhbmQgdGhlIHJlZmFjdG9yaW5nIG9mIHN3YXAgcGFnZSBpbnZhbGlkYXRpb24gd2l0aGluIGB6c3dhcF9zdG9yZWAsIGl0J3MgZGVmaW5pdGVseSBzb21ldGhpbmcgdGhhdCB3YXJyYW50cyBmdXp6aW5nLiBgenN3YXBgIGFuZCBgc3dhcGAgYXJlIGNvcmUgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCBtZWNoYW5pc21zIHdpdGhpbiB0aGUga2VybmVsLCBhbmQgdGhlIGBtbS9gIHN1YnN5c3RlbSBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSBldmVuIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy5cblxuTm93LCBvbiB0byB0aGUgY29uZmlndXJhdGlvbi4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZnV6eiB0YXJnZXQgaW5jbHVkZXMgdGhlIHJlbGV2YW50IGNvbmZpZyBvcHRpb25zLiBUaGUga2V5IG9uZSBpcyBgWlNXQVBgLCB3aGljaCBsaXZlcyBpbiBgbW0vS2NvbmZpZ2AsIGFuZCB3aGljaCBkZXBlbmRzIG9uIGBTV0FQYC4gU28sIEknbGwgbmVlZCB0byBpbmNsdWRlIGJvdGggb2YgdGhlbS5cblxuTm93IGZvciBzeW1ib2wgYW5hbHlzaXMuIGB6c3dhcF9zdG9yZWAgaXMgdGhlIHByaW1hcnkgZnVuY3Rpb24gYmVpbmcgbW9kaWZpZWQuIGB6c3dhcF9pbnZhbGlkYXRlYCBpcyBjYWxsZWQsIGFuZCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAgaXMgYWxzbyBjYWxsZWQuIGB6c3dhcF9zdG9yZWAgaXMgdGhlIGtleSBlbnRyeXBvaW50IGZvciBhIHpzd2FwIHN0b3JhZ2Ugb3BlcmF0aW9uLiBJdCdzIG5vdCBhIGZ1bmN0aW9uIHRoYXQncyB1YmlxdWl0b3VzIGFjcm9zcyB0aGUga2VybmVsLCB3aGljaCBtYWtlcyBpdCBtb3JlIGZvY3VzZWQgYXMgYSB0YXJnZXQuIExpa2V3aXNlLCBgenN3YXBfaW52YWxpZGF0ZWAgYW5kIGB6c3dhcF9uZXZlcl9lbmFibGVkYCBzZWVtIHNwZWNpZmljIHRvIHRoZSBgenN3YXBgIHBhdGguIFNvIHRoZXNlIGFyZSBnb29kIGZvY3VzIHN5bWJvbHMuIEknbGwgbWFrZSBzdXJlIHRoZXkgYXJlIGFjY2Vzc2libGUgd2hlbiB0aGUgZnV6emVyIHJ1bnMuXG5cbkkgc2hvdWxkIGFsc28gZG91YmxlLWNoZWNrIHdoZXRoZXIgYHpzd2FwX3N0b3JlYCBpcyBleHBvcnRlZCwgc3RhdGljLCBvciBpZiBpdHMgZGVmaW5pdGlvbiBpcyBpbiBhIGhlYWRlciwgYnV0IGdpdmVuIGl0J3MgYSBgbW0vYCBmdW5jdGlvbiwgaXQncyBsaWtlbHkgdmlzaWJsZSB3aXRoaW4gdGhlIGtlcm5lbCwgc28gaXQgcHJvYmFibHkgZG9lc24ndCBuZWVkIHRvIGJlIGV4dGVybmFsbHkgZXhwb3J0ZWQuIEhvd2V2ZXIsIGNoZWNraW5nIGBpbmNsdWRlL2xpbnV4L3pzd2FwLmhgIGlzIGEgZ29vZCBwcmFjdGljZSB0byBlbnN1cmUgZXZlcnl0aGluZyBpcyB2aXNpYmxlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDA5NCwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc2MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjA4LjUxNDgwMDA1N1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI4MzczMjE2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInpzd2FwX3N0b3JlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9wYWdlX2lvLmM9MjA0PWludCBzd2FwX3dyaXRlb3V0KHN0cnVjdCBzd2FwX2lvX2N0eCAqY3R4LCBzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0vcGFnZV9pby5jLTIzNy1cXG5tbS9wYWdlX2lvLmM6MjM4OlxcdGlmICh6c3dhcF9zdG9yZShmb2xpbykpIHtcXG5tbS9wYWdlX2lvLmMtMjM5LVxcdFxcdGNvdW50X210aHBfc3RhdChmb2xpb19vcmRlcihmb2xpbyksIE1USFBfU1RBVF9aU1dQT1VUKTtcXG4tLVxcbm1tL3pzd2FwLmMtNDYtLyogVGhlIG51bWJlciBvZiBwYWdlcyBjdXJyZW50bHkgc3RvcmVkIGluIHpzd2FwICovXFxubW0venN3YXAuYzo0NzphdG9taWNfbG9uZ190IHpzd2FwX3N0b3JlZF9wYWdlcyA9IEFUT01JQ19MT05HX0lOSVQoMCk7XFxubW0venN3YXAuYy00OC0vKiBUaGUgbnVtYmVyIG9mIGluY29tcHJlc3NpYmxlIHBhZ2VzIGN1cnJlbnRseSBzdG9yZWQgaW4genN3YXAgKi9cXG5tbS96c3dhcC5jOjQ5OnN0YXRpYyBhdG9taWNfbG9uZ190IHpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyA9IEFUT01JQ19MT05HX0lOSVQoMCk7XFxubW0venN3YXAuYy01MC1cXG4tLVxcbm1tL3pzd2FwLmM9NzU1PXN0YXRpYyB2b2lkIHpzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSlcXG4tLVxcbm1tL3pzd2FwLmMtNzY0LVxcdGlmIChlbnRyeS1cXHUwMDNlbGVuZ3RoID09IFBBR0VfU0laRSlcXG5tbS96c3dhcC5jOjc2NTpcXHRcXHRhdG9taWNfbG9uZ19kZWMoXFx1MDAyNnpzd2FwX3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyk7XFxubW0venN3YXAuYy03NjYtXFx0enN3YXBfZW50cnlfY2FjaGVfZnJlZShlbnRyeSk7XFxubW0venN3YXAuYzo3Njc6XFx0YXRvbWljX2xvbmdfZGVjKFxcdTAwMjZ6c3dhcF9zdG9yZWRfcGFnZXMpO1xcbm1tL3pzd2FwLmMtNzY4LX1cXG4tLVxcbm1tL3pzd2FwLmM9OTEzPXN0YXRpYyBib29sIHpzd2FwX2RlY29tcHJlc3Moc3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbm1tL3pzd2FwLmMtOTcwLSAqIHRvIHRoZSBzd2FwIGRldmljZS4gIFdlIGFyZSBiYXNpY2FsbHkgcmVzdW1pbmcgdGhlIHNhbWUgc3dhcFxcbm1tL3pzd2FwLmM6OTcxOiAqIHdyaXRlYmFjayBwYXRoIHRoYXQgd2FzIGludGVyY2VwdGVkIHdpdGggdGhlIHpzd2FwX3N0b3JlKClcXG5tbS96c3dhcC5jLTk3Mi0gKiBpbiB0aGUgZmlyc3QgcGxhY2UuICBBZnRlciB0aGUgZm9saW8gaGFzIGJlZW4gZGVjb21wcmVzc2VkIGludG9cXG4tLVxcbm1tL3pzd2FwLmM9MTE4MT1zdGF0aWMgdW5zaWduZWQgbG9uZyB6c3dhcF9zaHJpbmtlcl9jb3VudChzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyLFxcbi0tXFxubW0venN3YXAuYy0xMjE1LVxcdFxcdG5yX2JhY2tpbmcgPSB6c3dhcF90b3RhbF9wYWdlcygpO1xcbm1tL3pzd2FwLmM6MTIxNjpcXHRcXHRucl9zdG9yZWQgPSBhdG9taWNfbG9uZ19yZWFkKFxcdTAwMjZ6c3dhcF9zdG9yZWRfcGFnZXMpO1xcbm1tL3pzd2FwLmMtMTIxNy1cXHR9XFxuLS1cXG5tbS96c3dhcC5jPTEzMDY9c3RhdGljIHZvaWQgc2hyaW5rX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpXFxuLS1cXG5tbS96c3dhcC5jLTEzOTYtXFxubW0venN3YXAuYzoxMzk3OnN0YXRpYyBib29sIHpzd2FwX3N0b3JlX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgbG9uZyBpbmRleCxcXG5tbS96c3dhcC5jLTEzOTgtXFx0XFx0XFx0ICAgICBzdHJ1Y3Qgb2JqX2Nncm91cCAqb2JqY2csXFxuLS1cXG5tbS96c3dhcC5jLTE0MzYtXFx0ICogbm8gZnVydGhlciBwb3NzaWJpbGl0eSBvZiBmYWlsdXJlLiBHcmFiIHJlZnMgdG8gdGhlIHBvb2wgYW5kIG9iamNnLFxcbm1tL3pzd2FwLmM6MTQzNzpcXHQgKiBjaGFyZ2UgenN3YXAgbWVtb3J5LCBhbmQgaW5jcmVtZW50IHpzd2FwX3N0b3JlZF9wYWdlcy5cXG5tbS96c3dhcC5jLTE0MzgtXFx0ICogVGhlIG9wcG9zaXRlIGFjdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkgenN3YXBfZW50cnlfZnJlZSgpXFxuLS1cXG5tbS96c3dhcC5jLTE0NDUtXFx0fVxcbm1tL3pzd2FwLmM6MTQ0NjpcXHRhdG9taWNfbG9uZ19pbmMoXFx1MDAyNnpzd2FwX3N0b3JlZF9wYWdlcyk7XFxubW0venN3YXAuYy0xNDQ3LVxcdGlmIChlbnRyeS1cXHUwMDNlbGVuZ3RoID09IFBBR0VfU0laRSlcXG5tbS96c3dhcC5jOjE0NDg6XFx0XFx0YXRvbWljX2xvbmdfaW5jKFxcdTAwMjZ6c3dhcF9zdG9yZWRfaW5jb21wcmVzc2libGVfcGFnZXMpO1xcbm1tL3pzd2FwLmMtMTQ0OS1cXG4tLVxcbm1tL3pzd2FwLmMtMTQ3Ny1cXG5tbS96c3dhcC5jOjE0Nzg6Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbm1tL3pzd2FwLmMtMTQ3OS17XFxuLS1cXG5tbS96c3dhcC5jLTE1MjMtXFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFxcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpIHtcXG5tbS96c3dhcC5jOjE1MjQ6XFx0XFx0aWYgKCF6c3dhcF9zdG9yZV9wYWdlKGZvbGlvLCBpbmRleCwgb2JqY2csIHBvb2wpKVxcbm1tL3pzd2FwLmMtMTUyNS1cXHRcXHRcXHRnb3RvIHB1dF9wb29sO1xcbi0tXFxubW0venN3YXAuYz0xNjk5PXN0YXRpYyBpbnQgZGVidWdmc19nZXRfc3RvcmVkX3BhZ2VzKHZvaWQgKmRhdGEsIHU2NCAqdmFsKVxcbm1tL3pzd2FwLmMtMTcwMC17XFxubW0venN3YXAuYzoxNzAxOlxcdCp2YWwgPSBhdG9taWNfbG9uZ19yZWFkKFxcdTAwMjZ6c3dhcF9zdG9yZWRfcGFnZXMpO1xcbm1tL3pzd2FwLmMtMTcwMi1cXHRyZXR1cm4gMDtcXG4tLVxcbm1tL3pzd2FwLmM9MTcwNj1zdGF0aWMgaW50IGRlYnVnZnNfZ2V0X3N0b3JlZF9pbmNvbXByZXNzaWJsZV9wYWdlcyh2b2lkICpkYXRhLCB1NjQgKnZhbClcXG5tbS96c3dhcC5jLTE3MDcte1xcbm1tL3pzd2FwLmM6MTcwODpcXHQqdmFsID0gYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2enN3YXBfc3RvcmVkX2luY29tcHJlc3NpYmxlX3BhZ2VzKTtcXG5tbS96c3dhcC5jLTE3MDktXFx0cmV0dXJuIDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjA4Ljc0MzE4MzYyM1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzkyNjI2MjAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcyBvbiB0aGlzOlxuXG4qKkV4YW1pbmluZyBac3dhcCBEZWNsYXJhdGlvbnMqKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIG9mIHpzd2FwLiBUaGF0IG1lYW5zIEkgc2hvdWxkIGltbWVkaWF0ZWx5IHR1cm4gdG8gdGhlIHNvdXJjZSBjb2RlLCBzcGVjaWZpY2FsbHkgYGluY2x1ZGUvbGludXgvenN3YXAuaGAuIFRoYXQgaGVhZGVyIGZpbGUgaXMgKnRoZSogcGxhY2UgdG8gZmluZCB0aGUgZXNzZW50aWFsIGRhdGEgc3RydWN0dXJlcywgZnVuY3Rpb24gcHJvdG90eXBlcywgYW5kIGFueSBrZXkgbWFjcm8gZGVmaW5pdGlvbnMgcmVsYXRlZCB0byB6c3dhcCdzIGludGVybmFsIHdvcmtpbmdzLiBCeSBleGFtaW5pbmcgdGhlIGRlY2xhcmF0aW9ucyB0aGVyZSwgSSBjYW4gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhpcyBjb21wcmVzc2lvbiBhbmQgc3dhcHBpbmcgbWVjaGFuaXNtIGlzIGFyY2hpdGVjdGVkLiBJJ20gbG9va2luZyBmb3IgdGhlIGNvcmUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgbWFuYWdlIHRoZSBjb21wcmVzc2VkIHBhZ2VzLCBob3cgdGhleSdyZSBzdG9yZWQsIHdoYXQgbG9ja3MgYXJlIHVzZWQsIGFuZCB0aGUgaW50ZXJmYWNlcyBpbnZvbHZlZCBpbiB0aGUgY29tcHJlc3Npb24sIGRlY29tcHJlc3Npb24sIGFuZCBzd2FwcGluZyBvcGVyYXRpb25zLiBJdCdzIHRpbWUgdG8gZGlnIGluIGFuZCBnZXQgYSBmaXJtIGdyYXNwIG9mIHRoZSBmb3VuZGF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjcwMSwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjExLjEzNTgxNDM3NloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzQyMzIzNDE0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInpzd2FwX3N0b3JlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvenN3YXAuaD04PXN0cnVjdCBscnV2ZWM7XFxuaW5jbHVkZS9saW51eC96c3dhcC5oLTktXFxuaW5jbHVkZS9saW51eC96c3dhcC5oOjEwOmV4dGVybiBhdG9taWNfbG9uZ190IHpzd2FwX3N0b3JlZF9wYWdlcztcXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtMTEtXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg9Mjc9dW5zaWduZWQgbG9uZyB6c3dhcF90b3RhbF9wYWdlcyh2b2lkKTtcXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg6Mjg6Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKTtcXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtMjktaW50IHpzd2FwX2xvYWQoc3RydWN0IGZvbGlvICpmb2xpbyk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmg9NDA9c3RydWN0IHpzd2FwX2xydXZlY19zdGF0ZSB7fTtcXG5pbmNsdWRlL2xpbnV4L3pzd2FwLmgtNDEtXFxuaW5jbHVkZS9saW51eC96c3dhcC5oOjQyOnN0YXRpYyBpbmxpbmUgYm9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbmluY2x1ZGUvbGludXgvenN3YXAuaC00My17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjExLjQ3ODE0MzM1WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNjczMzY3MjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOlxuXG4qKkludmVzdGlnYXRpbmcgYHN3YXBfd3JpdGVvdXRgKipcblxuT2theSwgdGltZSB0byBkaXZlIGluLiBJIG5lZWQgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0IGBzd2FwX3dyaXRlb3V0YCwgYW5kIGJhc2VkIG9uIG15IG1lbW9yeSwgdGhhdCdzIHByb2JhYmx5IHJlc2lkaW5nIGluIGBtbS9wYWdlX2lvLmNgLiBMZXQncyBnZXQgY3JhY2tpbmcgYW5kIGNvbmZpcm0gdGhhdCBteSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgbG9jYXRpb24gYXJlIGFjY3VyYXRlLiBUaGlzIGlzIHdoZXJlIEknbGwgZmluZCB0aGUgY29yZSBsb2dpYyBmb3Igd3JpdGluZyBvdXQgcGFnZXMgdG8gc3dhcCBzcGFjZSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgaXQgZnVuY3Rpb25zLCBlc3BlY2lhbGx5IGluIHJlbGF0aW9uIHRvIHRoZSBvdmVyYWxsIHBhZ2UgcmVjbGFpbSBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzE1MiwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjEzLjY0NTQ4NTE1NloiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzc0NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vcGFnZV9pby5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIzMCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDIzMDpcXHRcXG4gMjMxOlxcdFxcdC8qXFxuIDIzMjpcXHRcXHQgKiBDbGVhciBiaXRzIHRoaXMgZm9saW8gb2NjdXBpZXMgaW4gdGhlIHplcm9tYXAgdG8gcHJldmVudCB6ZXJvIGRhdGFcXG4gMjMzOlxcdFxcdCAqIGJlaW5nIHJlYWQgaW4gZnJvbSBhbnkgcHJldmlvdXMgemVybyB3cml0ZXMgdGhhdCBvY2N1cGllZCB0aGUgc2FtZVxcbiAyMzQ6XFx0XFx0ICogc3dhcCBlbnRyaWVzLlxcbiAyMzU6XFx0XFx0ICovXFxuIDIzNjpcXHRcXHRzd2FwX3plcm9tYXBfZm9saW9fY2xlYXIoZm9saW8pO1xcbiAyMzc6XFx0XFxuIDIzODpcXHRcXHRpZiAoenN3YXBfc3RvcmUoZm9saW8pKSB7XFxuIDIzOTpcXHRcXHRcXHRjb3VudF9tdGhwX3N0YXQoZm9saW9fb3JkZXIoZm9saW8pLCBNVEhQX1NUQVRfWlNXUE9VVCk7XFxuIDI0MDpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIDI0MTpcXHRcXHR9XFxuIDI0MjpcXHRcXG4gMjQzOlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gMjQ0OlxcdFxcdGlmICghbWVtX2Nncm91cF96c3dhcF93cml0ZWJhY2tfZW5hYmxlZChmb2xpb19tZW1jZyhmb2xpbykpKSB7XFxuIDI0NTpcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gMjQ2OlxcdFxcdFxcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xcbiAyNDc6XFx0XFx0XFx0cmV0dXJuIEFPUF9XUklURVBBR0VfQUNUSVZBVEU7XFxuIDI0ODpcXHRcXHR9XFxuIDI0OTpcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6MTMuNjQ1NjY3NjM2WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ4NjgxNDA5NzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgZm9jdXMuIEl0IGxvb2tzIGxpa2UgdGhlIGNvcmUgbW9kaWZpY2F0aW9uIGNlbnRlcnMgYXJvdW5kIGB6c3dhcF9zdG9yZWAsIHRoZSBmdW5jdGlvbiBiZWluZyBkaXJlY3RseSBhbHRlcmVkLiBgenN3YXBfaW52YWxpZGF0ZWAgaXMgdGhlIGhlbHBlciB0aGV5J3JlIHVzaW5nIHRvIHJlcGxhY2UgdGhlIG9wZW4tY29kZWQgdHJlZSBlcmFzdXJlIGxvZ2ljLCB3aGljaCBpcyBnb29kIGZvciBtYWludGFpbmFiaWxpdHkuIEFuZCBqdXN0IHRvIGJlIHN1cmUsIGBzd2FwX3dyaXRlb3V0YCBpcyB0aGUgY2FsbGVyIG9mIGB6c3dhcF9zdG9yZWAuIFNvbGlkLlxuXG5OZXh0LCBJIGhhdmUgdG8gZW5zdXJlIHRoZSBwcm9wZXIgY29uZmlndXJhdGlvbnMgYXJlIGluIHBsYWNlIGZvciB0aGUgZnV6emVyIHRvIGVuZ2FnZSB3aXRoIHRoaXMgY2hhbmdlLiBJdCBsb29rcyBsaWtlIGBaU1dBUGAgaXMgdGhlIG1haW4gY29uZmlndXJhdGlvbiBpdGVtLCB3aXRoIGBTV0FQYCBhcyBpdHMgZGVwZW5kZW5jeS4gVGhhdCBhbGlnbnMgd2l0aCBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzeXN0ZW0uXG5cbk5vdywgbGV0J3MgcmV2aWV3IHRoZSBwYXJhbWV0ZXJzIGZvciBgc2V0LXJlc3VsdHNgLiBUaGUgYFdvcnRoRnV6emluZ2AgZmxhZyBuZWVkcyB0byBiZSBzZXQgdG8gYHRydWVgLCBhbmQgb2YgY291cnNlIGl0IGlzLiBUaGUgYFJlYXNvbmluZ2Agc2hvdWxkIHN1Y2NpbmN0bHkgb3V0bGluZSB3aGF0J3MgaGFwcGVuaW5nLiBUaGUgcGF0Y2ggc2VlbXMgdG8gbW9kaWZ5IGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSBgenN3YXBfc3RvcmVgLCBhZGRpbmcgYSBzaG9ydC1jaXJjdWl0IGNoZWNrIHRocm91Z2ggYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgYW5kIHRoZW4gcmVmYWN0b3JpbmcgdGhlIHN3YXAgcGFnZSBpbnZhbGlkYXRpb24gdG8gdXNlIGB6c3dhcF9pbnZhbGlkYXRlKClgLiBUaGUgY2hhbmdlcyBhcmUgYWxzbyByZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHdpdGggc3dhcC96c3dhcCBjb25maWd1cmVkIHdoaWNoIGlzIGEgY3J1Y2lhbCBwb2ludCBmb3IgZnV6emluZy4gVGhlIGBGb2N1c1N5bWJvbHNgIGFyZSBjbGVhcmx5IGRlZmluZWQgYXMgYHpzd2FwX3N0b3JlYCBhbmQgYHpzd2FwX2ludmFsaWRhdGVgLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBhbmQgc3BlY2lmaWMuIExhc3RseSwgYEVuYWJsZUNvbmZpZ3NgIG5lZWRzIHRvIGxpc3QgYFpTV0FQYCBhbmQgYFNXQVBgICh3aXRob3V0IHRoZSBgQ09ORklHX2AgcHJlZml4LCBvZiBjb3Vyc2UpLlxuXG5Pa2F5LCBsZXQncyBwZXJmb3JtIGEgcXVpY2sgc2FuaXR5IGNoZWNrLiBgV29ydGhGdXp6aW5nOiB0cnVlYCwgY2hlY2suIGBGb2N1c1N5bWJvbHM6IHpzd2FwX3N0b3JlLCB6c3dhcF9pbnZhbGlkYXRlYCAtLSBub24tdWJpcXVpdG91cywgZGlyZWN0bHkgcmVsZXZhbnQgc3ltYm9scywgY2hlY2suIGBFbmFibGVDb25maWdzOiBaU1dBUCwgU1dBUGAsIHllcCwgdGhhdOKAmXMgcmlnaHQsIGNoZWNrLiBUaGUgYFJlYXNvbmluZ2AgaXMgY29uY2lzZSBhbmQgZWFzeSB0byB1bmRlcnN0YW5kLCBjaGVjay5cblxuRXZlcnl0aGluZyBjaGVja3Mgb3V0LiBJJ20gc2F0aXNmaWVkIHRoYXQgdGhpcyBwYXRjaCB3YXJyYW50cyBmdXp6aW5nLiBUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTM2MzgsIk91dHB1dFRva2VucyI6MTI2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzE4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6MTguNTEzODEyODE5WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjAxMjA3Njg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJaU1dBUFwiLFxuICAgIFwiU1dBUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInpzd2FwX3N0b3JlXCIsXG4gICAgXCJ6c3dhcF9pbnZhbGlkYXRlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSBpbiBtbS96c3dhcC5jIGJ5IGFkZGluZyBhbiBlYXJseS1leGl0IGNoZWNrIGluIHpzd2FwX3N0b3JlKCkgd2hlbiB6c3dhcCBoYXMgbmV2ZXIgYmVlbiBlbmFibGVkLCBhbmQgcmVmYWN0b3JpbmcgdGhlIGVycm9yL2Rpc2FibGVkIGZhbGxiYWNrIGxvb3AgdG8gdXNlIHpzd2FwX2ludmFsaWRhdGUoKS4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgY29yZSBzd2Fwb3V0L3pzd2FwIGxvZ2ljIGFuZCBhcmUgZGlyZWN0bHkgcmVhY2hhYmxlIGFuZCB0ZXN0YWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiWlNXQVBcIixcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ6c3dhcF9zdG9yZVwiLFxuICAgIFwienN3YXBfaW52YWxpZGF0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUgaW4gbW0venN3YXAuYyBieSBhZGRpbmcgYW4gZWFybHktZXhpdCBjaGVjayBpbiB6c3dhcF9zdG9yZSgpIHdoZW4genN3YXAgaGFzIG5ldmVyIGJlZW4gZW5hYmxlZCwgYW5kIHJlZmFjdG9yaW5nIHRoZSBlcnJvci9kaXNhYmxlZCBmYWxsYmFjayBsb29wIHRvIHVzZSB6c3dhcF9pbnZhbGlkYXRlKCkuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IGNvcmUgc3dhcG91dC96c3dhcCBsb2dpYyBhbmQgYXJlIGRpcmVjdGx5IHJlYWNoYWJsZSBhbmQgdGVzdGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNToxOC43MTUwNTgwMDZaIiwiU2VxIjoyNSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMxMzQ5MTk2NDY1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6MTguNzE1ODM4Njc2WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzEzNDg0MTA4ODUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYW4gZWFybHktcmV0dXJuIGNoZWNrIHVzaW5nIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGluIGB6c3dhcF9zdG9yZSgpYCBhbmQgcmVmYWN0b3JzIG9wZW4tY29kZWQgenN3YXAgdHJlZSBpbnZhbGlkYXRpb24gbG9naWMgb24gc3RvcmUgZmFpbHVyZSB0byByZXVzZSBgenN3YXBfaW52YWxpZGF0ZSgpYC4gTm8gbWVtb3J5IGFsbG9jYXRpb25zLCBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgb3BlcmF0aW9ucyBhcmUgaW50cm9kdWNlZCBvciBhbHRlcmVkLiBObyBjb25kaXRpb25hbCBsb2dpYyByZWxpZXMgb24gdW5pbml0aWFsaXplZCBkYXRhLiBBbnkgbWVtb3J5IHNhZmV0eSBjb25jZXJucyBpbiB0aGlzIHN3YXAgcGF0aCAoc3VjaCBhcyB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIG9yIGxvY2tpbmcgZXJyb3JzKSBhcmUgY292ZXJlZCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2Vycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGtlcm5lbC10by11c2VyIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2N2NlYTY5ZWM2NGNjOWNlNWNiZjQ2OTQzMDc4NmZiMzQ0ZmJkNWJlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBTZXAgOSAxMzozNDoxNyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL3pzd2FwLmMgYi9tbS96c3dhcC5jXG5pbmRleCA1ZDBkOGJkNzIxOTNhLi5mYzZjNWUwZGI1ZTQzIDEwMDY0NFxuLS0tIGEvbW0venN3YXAuY1xuKysrIGIvbW0venN3YXAuY1xuQEAgLTE0ODgsNiArMTQ4OCw5IEBAIGJvb2wgenN3YXBfc3RvcmUoc3RydWN0IGZvbGlvICpmb2xpbylcbiBcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pKTtcbiBcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKTtcbiBcbitcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbiBcdGlmICghenN3YXBfZW5hYmxlZClcbiBcdFx0Z290byBjaGVja19vbGQ7XG4gXG5AQCAtMTU0NSwxNSArMTU0OCwxMCBAQCBib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gXHRpZiAoIXJldCkge1xuIFx0XHR1bnNpZ25lZCB0eXBlID0gc3dwX3R5cGUoc3dwKTtcbiBcdFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XG4tXHRcdHN0cnVjdCB6c3dhcF9lbnRyeSAqZW50cnk7XG4tXHRcdHN0cnVjdCB4YXJyYXkgKnRyZWU7XG4tXG4tXHRcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpIHtcbi1cdFx0XHR0cmVlID0gc3dhcF96c3dhcF90cmVlKHN3cF9lbnRyeSh0eXBlLCBvZmZzZXQgKyBpbmRleCkpO1xuLVx0XHRcdGVudHJ5ID0geGFfZXJhc2UodHJlZSwgb2Zmc2V0ICsgaW5kZXgpO1xuLVx0XHRcdGlmIChlbnRyeSlcbi1cdFx0XHRcdHpzd2FwX2VudHJ5X2ZyZWUoZW50cnkpO1xuLVx0XHR9XG4rXG4rXHRcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpXG4rXHRcdFx0enN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICsgaW5kZXgpKTtcbitcbiBcdH1cbiBcbiBcdHJldHVybiByZXQ7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNToxOC43MTU4NDA0MjZaIiwiU2VxIjoyNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzcyNjg5MTczOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZ2V0IGRvd24gdG8gYnJhc3MgdGFja3MuXG5cbioqQW5hbHl6aW5nIGBtbS96c3dhcC5jYCAtIFRpbWUgdG8gRGl2ZSBJbioqXG5cbkFscmlnaHQsIHRpbWUgdG8gcm9sbCB1cCBteSBzbGVldmVzIGFuZCBkaXNzZWN0IHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBzdGFydCBieSB6ZXJvaW5nIGluIG9uIGBtbS96c3dhcC5jYCwgcGFydGljdWxhcmx5IGFyb3VuZCBsaW5lIDE0ODguIEknbSBnb2luZyB0byBsZXZlcmFnZSB0aGUgdG9vbHMgYXQgbXkgZGlzcG9zYWwg4oCTIGByZWFkLWZpbGVgIGlzIGFsd2F5cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQsIGJ1dCBJIG1pZ2h0IGp1c3QgZ28gc3RyYWlnaHQgZm9yIGBncmVwcGVyYCBpZiBJIHN1c3BlY3QgYSBzcGVjaWZpYyBmdW5jdGlvbiBvciB2YXJpYWJsZSBpcyB0aGUga2V5LiBOZWVkIHRvIGdldCBhIGZlZWwgZm9yIHRoZSBjb250ZXh0IHN1cnJvdW5kaW5nIHRoYXQgbGluZSDigJMgc2VlIHRoZSBmdW5jdGlvbiBjYWxscywgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCB0aGUgd2hvbGUgc2hlYmFuZy4gR290dGEgdW5kZXJzdGFuZCBob3cgdGhpcyBwYXRjaCBpbnRlcmFjdHMgd2l0aCB0aGUgZXhpc3RpbmcgenN3YXAgaW1wbGVtZW50YXRpb24uIExldCdzIHNlZSB3aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjgwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjIsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNToyNi40NDI3MzYyODRaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg2NjEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3pzd2FwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTQ3NSxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE0NzU6XFx0XFx0cmV0dXJuIGZhbHNlO1xcbjE0NzY6XFx0fVxcbjE0Nzc6XFx0XFxuMTQ3ODpcXHRib29sIHpzd2FwX3N0b3JlKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuMTQ3OTpcXHR7XFxuMTQ4MDpcXHRcXHRsb25nIG5yX3BhZ2VzID0gZm9saW9fbnJfcGFnZXMoZm9saW8pO1xcbjE0ODE6XFx0XFx0c3dwX2VudHJ5X3Qgc3dwID0gZm9saW8tXFx1MDAzZXN3YXA7XFxuMTQ4MjpcXHRcXHRzdHJ1Y3Qgb2JqX2Nncm91cCAqb2JqY2cgPSBOVUxMO1xcbjE0ODM6XFx0XFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gTlVMTDtcXG4xNDg0OlxcdFxcdHN0cnVjdCB6c3dhcF9wb29sICpwb29sO1xcbjE0ODU6XFx0XFx0Ym9vbCByZXQgPSBmYWxzZTtcXG4xNDg2OlxcdFxcdGxvbmcgaW5kZXg7XFxuMTQ4NzpcXHRcXG4xNDg4OlxcdFxcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pKTtcXG4xNDg5OlxcdFxcdFZNX1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKTtcXG4xNDkwOlxcdFxcbjE0OTE6XFx0XFx0aWYgKHpzd2FwX25ldmVyX2VuYWJsZWQoKSlcXG4xNDkyOlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4xNDkzOlxcdFxcbjE0OTQ6XFx0XFx0aWYgKCF6c3dhcF9lbmFibGVkKVxcbjE0OTU6XFx0XFx0XFx0Z290byBjaGVja19vbGQ7XFxuMTQ5NjpcXHRcXG4xNDk3OlxcdFxcdG9iamNnID0gZ2V0X29ial9jZ3JvdXBfZnJvbV9mb2xpbyhmb2xpbyk7XFxuMTQ5ODpcXHRcXHRpZiAob2JqY2cgXFx1MDAyNlxcdTAwMjYgIW9ial9jZ3JvdXBfbWF5X3pzd2FwKG9iamNnKSkge1xcbjE0OTk6XFx0XFx0XFx0bWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX29iamNnKG9iamNnKTtcXG4xNTAwOlxcdFxcdFxcdGlmIChzaHJpbmtfbWVtY2cobWVtY2cpKSB7XFxuMTUwMTpcXHRcXHRcXHRcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuMTUwMjpcXHRcXHRcXHRcXHRnb3RvIHB1dF9vYmpjZztcXG4xNTAzOlxcdFxcdFxcdH1cXG4xNTA0OlxcdFxcdFxcdG1lbV9jZ3JvdXBfcHV0KG1lbWNnKTtcXG4xNTA1OlxcdFxcdH1cXG4xNTA2OlxcdFxcbjE1MDc6XFx0XFx0aWYgKHpzd2FwX2NoZWNrX2xpbWl0cygpKVxcbjE1MDg6XFx0XFx0XFx0Z290byBwdXRfb2JqY2c7XFxuMTUwOTpcXHRcXG4xNTEwOlxcdFxcdHBvb2wgPSB6c3dhcF9wb29sX2N1cnJlbnRfZ2V0KCk7XFxuMTUxMTpcXHRcXHRpZiAoIXBvb2wpXFxuMTUxMjpcXHRcXHRcXHRnb3RvIHB1dF9vYmpjZztcXG4xNTEzOlxcdFxcbjE1MTQ6XFx0XFx0aWYgKG9iamNnKSB7XFxuMTUxNTpcXHRcXHRcXHRtZW1jZyA9IGdldF9tZW1fY2dyb3VwX2Zyb21fb2JqY2cob2JqY2cpO1xcbjE1MTY6XFx0XFx0XFx0aWYgKG1lbWNnX2xpc3RfbHJ1X2FsbG9jKG1lbWNnLCBcXHUwMDI2enN3YXBfbGlzdF9scnUsIEdGUF9LRVJORUwpKSB7XFxuMTUxNzpcXHRcXHRcXHRcXHRtZW1fY2dyb3VwX3B1dChtZW1jZyk7XFxuMTUxODpcXHRcXHRcXHRcXHRnb3RvIHB1dF9wb29sO1xcbjE1MTk6XFx0XFx0XFx0fVxcbjE1MjA6XFx0XFx0XFx0bWVtX2Nncm91cF9wdXQobWVtY2cpO1xcbjE1MjE6XFx0XFx0fVxcbjE1MjI6XFx0XFxuMTUyMzpcXHRcXHRmb3IgKGluZGV4ID0gMDsgaW5kZXggXFx1MDAzYyBucl9wYWdlczsgKytpbmRleCkge1xcbjE1MjQ6XFx0XFx0XFx0aWYgKCF6c3dhcF9zdG9yZV9wYWdlKGZvbGlvLCBpbmRleCwgb2JqY2csIHBvb2wpKVxcbjE1MjU6XFx0XFx0XFx0XFx0Z290byBwdXRfcG9vbDtcXG4xNTI2OlxcdFxcdH1cXG4xNTI3OlxcdFxcbjE1Mjg6XFx0XFx0aWYgKG9iamNnKVxcbjE1Mjk6XFx0XFx0XFx0Y291bnRfb2JqY2dfZXZlbnRzKG9iamNnLCBaU1dQT1VULCBucl9wYWdlcyk7XFxuMTUzMDpcXHRcXG4xNTMxOlxcdFxcdGNvdW50X3ZtX2V2ZW50cyhaU1dQT1VULCBucl9wYWdlcyk7XFxuMTUzMjpcXHRcXG4xNTMzOlxcdFxcdHJldCA9IHRydWU7XFxuMTUzNDpcXHRcXG4xNTM1OlxcdHB1dF9wb29sOlxcbjE1MzY6XFx0XFx0enN3YXBfcG9vbF9wdXQocG9vbCk7XFxuMTUzNzpcXHRwdXRfb2JqY2c6XFxuMTUzODpcXHRcXHRvYmpfY2dyb3VwX3B1dChvYmpjZyk7XFxuMTUzOTpcXHRcXHRpZiAoIXJldCBcXHUwMDI2XFx1MDAyNiB6c3dhcF9wb29sX3JlYWNoZWRfZnVsbClcXG4xNTQwOlxcdFxcdFxcdHF1ZXVlX3dvcmsoc2hyaW5rX3dxLCBcXHUwMDI2enN3YXBfc2hyaW5rX3dvcmspO1xcbjE1NDE6XFx0Y2hlY2tfb2xkOlxcbjE1NDI6XFx0XFx0LypcXG4xNTQzOlxcdFxcdCAqIElmIHRoZSB6c3dhcCBzdG9yZSBmYWlscyBvciB6c3dhcCBpcyBkaXNhYmxlZCwgd2UgbXVzdCBpbnZhbGlkYXRlXFxuMTU0NDpcXHRcXHQgKiB0aGUgcG9zc2libHkgc3RhbGUgZW50cmllcyB3aGljaCB3ZXJlIHByZXZpb3VzbHkgc3RvcmVkIGF0IHRoZVxcbjE1NDU6XFx0XFx0ICogb2Zmc2V0cyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggcGFnZSBvZiB0aGUgZm9saW8uIE90aGVyd2lzZSxcXG4xNTQ2OlxcdFxcdCAqIHdyaXRlYmFjayBjb3VsZCBvdmVyd3JpdGUgdGhlIG5ldyBkYXRhIGluIHRoZSBzd2FwZmlsZS5cXG4xNTQ3OlxcdFxcdCAqL1xcbjE1NDg6XFx0XFx0aWYgKCFyZXQpIHtcXG4xNTQ5OlxcdFxcdFxcdHVuc2lnbmVkIHR5cGUgPSBzd3BfdHlwZShzd3ApO1xcbjE1NTA6XFx0XFx0XFx0cGdvZmZfdCBvZmZzZXQgPSBzd3Bfb2Zmc2V0KHN3cCk7XFxuMTU1MTpcXHRcXG4xNTUyOlxcdFxcdFxcdGZvciAoaW5kZXggPSAwOyBpbmRleCBcXHUwMDNjIG5yX3BhZ2VzOyArK2luZGV4KVxcbjE1NTM6XFx0XFx0XFx0XFx0enN3YXBfaW52YWxpZGF0ZShzd3BfZW50cnkodHlwZSwgb2Zmc2V0ICsgaW5kZXgpKTtcXG4xNTU0OlxcdFxcbjE1NTU6XFx0XFx0fVxcbjE1NTY6XFx0XFxuMTU1NzpcXHRcXHRyZXR1cm4gcmV0O1xcbjE1NTg6XFx0fVxcbjE1NTk6XFx0XFxuMTU2MDpcXHQvKipcXG4xNTYxOlxcdCAqIHpzd2FwX2xvYWQoKSAtIGxvYWQgYSBmb2xpbyBmcm9tIHpzd2FwXFxuMTU2MjpcXHQgKiBAZm9saW86IGZvbGlvIHRvIGxvYWRcXG4xNTYzOlxcdCAqXFxuMTU2NDpcXHQgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgd2l0aCB0aGUgZm9saW8gdW5sb2NrZWQgYW5kIG1hcmtlZCB1cC10by1kYXRlLCBvciBvbmVcXG4xNTY1OlxcdCAqIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXM6XFxuMTU2NjpcXHQgKlxcbjE1Njc6XFx0ICogIC1FSU86IGlmIHRoZSBzd2FwcGVkIG91dCBjb250ZW50IHdhcyBpbiB6c3dhcCwgYnV0IGNvdWxkIG5vdCBiZSBsb2FkZWRcXG4xNTY4OlxcdCAqICBpbnRvIHRoZSBwYWdlIGR1ZSB0byBhIGRlY29tcHJlc3Npb24gZmFpbHVyZS4gVGhlIGZvbGlvIGlzIHVubG9ja2VkLCBidXRcXG4xNTY5OlxcdCAqICBOT1QgbWFya2VkIHVwLXRvLWRhdGUsIHNvIHRoYXQgYW4gSU8gZXJyb3IgaXMgZW1pdHRlZCAoZS5nLiBkb19zd2FwX3BhZ2UoKVxcbjE1NzA6XFx0ICogIHdpbGwgU0lHQlVTKS5cXG4xNTcxOlxcdCAqXFxuMTU3MjpcXHQgKiAgLUVJTlZBTDogaWYgdGhlIHN3YXBwZWQgb3V0IGNvbnRlbnQgd2FzIGluIHpzd2FwLCBidXQgdGhlIHBhZ2UgYmVsb25nc1xcbjE1NzM6XFx0ICogIHRvIGEgbGFyZ2UgZm9saW8sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgenN3YXAuIFRoZSBmb2xpbyBpcyB1bmxvY2tlZCxcXG4xNTc0OlxcdCAqICBidXQgTk9UIG1hcmtlZCB1cC10by1kYXRlLCBzbyB0aGF0IGFuIElPIGVycm9yIGlzIGVtaXR0ZWQgKGUuZy5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6MjYuNDQyOTI1NjI0WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM1OTk3NDcwMzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgcHJlc2VudGVkIGFzIG15IG93biBtZW50YWwgcHJvY2VzcywgZ2l2ZW4gbXkgZXhwZXJ0aXNlOlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byB6c3dhcCBDb25maWd1cmF0aW9uKipcblxuQWxyaWdodCwgc28gd2UncmUgbG9va2luZyBhdCBgbW0venN3YXAuY2AgYWdhaW4uIEkgbmVlZCB0byByZWZyZXNoIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGZpbmVyIHBvaW50cywgYW5kIEknbSBzcGVjaWZpY2FsbHkgZHJhd24gdG8gdGhvc2UgdHdvIHNldHRpbmdzLCBgenN3YXBfbmV2ZXJfZW5hYmxlZGAgYW5kIGB6c3dhcF9pbnZhbGlkYXRlYC4gVGhlc2UgYXJlIGNydWNpYWwgdG8gaG93IHpzd2FwIGJlaGF2ZXMsIGFuZCB1bmRlcnN0YW5kaW5nIHRoZWlyIGludGVycGxheSBpcyBrZXkgdG8gb3B0aW1pemluZyB6c3dhcCBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHkuIEkgYWxyZWFkeSB1bmRlcnN0YW5kIHRoZSBmdW5kYW1lbnRhbCByb2xlIG9mIHpzd2FwLCB0aGUgYmFzaWNzIG9mIGNvbXByZXNzZWQgc3dhcCwgYW5kIGhvdyBpdCByZWR1Y2VzIEkvTyBsYXRlbmN5LiBCdXQgZ2V0dGluZyBpbnRvIHRoZSB3ZWVkcyBvZiB0aGVzZSBmbGFncyBoZWxwcyB0dW5lIHRoZSBzeXN0ZW0gd2hlbiBpdHMgYmVoYXZpb3IgZG9lc24ndCBhbGlnbiB3aXRoIG15IGV4cGVjdGF0aW9ucy4gSSBjYW4gc2VlIGhvdywgZm9yIGV4YW1wbGUsIGB6c3dhcF9uZXZlcl9lbmFibGVkYCB3b3VsZCBiZSB1c2VkIGluIGVudmlyb25tZW50cyB3aGVyZSBzd2FwIGlzIHVuZGVzaXJhYmxlLCBwZXJoYXBzIGJlY2F1c2Ugb2YgY29uY2VybnMgYXJvdW5kIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBmb3IgZW5jcnlwdGVkIG1lbW9yeS4gQW5kIGB6c3dhcF9pbnZhbGlkYXRlYCwgSSdsbCBiZXQsIGl0J3MgYWJvdXQgZm9yY2luZyBjYWNoZSByZWZyZXNoZXMsIHBlcmhhcHMgYWZ0ZXIgd3JpdGVzLiBUaW1lIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBkaXNzZWN0IHRoZSBleGFjdCBjb2RlIHRoYXQgdXNlcyB0aGVzZSFcblxuXG4iLCJJbnB1dFRva2VucyI6NDA2NCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6MzAuMDQyNjc2MDc3WiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODAyNTI4NzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwienN3YXBfbmV2ZXJfZW5hYmxlZHx6c3dhcF9pbnZhbGlkYXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL3pzd2FwLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0venN3YXAuYz0xMjU9Ym9vbCB6c3dhcF9pc19lbmFibGVkKHZvaWQpXFxuLS1cXG5tbS96c3dhcC5jLTEyOS1cXG5tbS96c3dhcC5jOjEzMDpib29sIHpzd2FwX25ldmVyX2VuYWJsZWQodm9pZClcXG5tbS96c3dhcC5jLTEzMS17XFxuLS1cXG5tbS96c3dhcC5jPTE0Nzg9Ym9vbCB6c3dhcF9zdG9yZShzdHJ1Y3QgZm9saW8gKmZvbGlvKVxcbi0tXFxubW0venN3YXAuYy0xNDkwLVxcbm1tL3pzd2FwLmM6MTQ5MTpcXHRpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKVxcbm1tL3pzd2FwLmMtMTQ5Mi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLS1cXG5tbS96c3dhcC5jLTE1NTItXFx0XFx0Zm9yIChpbmRleCA9IDA7IGluZGV4IFxcdTAwM2MgbnJfcGFnZXM7ICsraW5kZXgpXFxubW0venN3YXAuYzoxNTUzOlxcdFxcdFxcdHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5KHR5cGUsIG9mZnNldCArIGluZGV4KSk7XFxubW0venN3YXAuYy0xNTU0LVxcbi0tXFxubW0venN3YXAuYz0xNTgwPWludCB6c3dhcF9sb2FkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5tbS96c3dhcC5jLTE1ODktXFxubW0venN3YXAuYzoxNTkwOlxcdGlmICh6c3dhcF9uZXZlcl9lbmFibGVkKCkpXFxubW0venN3YXAuYy0xNTkxLVxcdFxcdHJldHVybiAtRU5PRU5UO1xcbi0tXFxubW0venN3YXAuYy0xNjMyLVxcbm1tL3pzd2FwLmM6MTYzMzp2b2lkIHpzd2FwX2ludmFsaWRhdGUoc3dwX2VudHJ5X3Qgc3dwKVxcbm1tL3pzd2FwLmMtMTYzNC17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjMwLjIyMjkzNzQ0NFoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2NzMzODY1ODA0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byB6c3dhcCBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHRpbWUgdG8gZGlnIGludG8gdGhlIGB6c3dhcGAgY29kZSBhIGJpdCBkZWVwZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBpdCdzIGJlaW5nIG1hbmFnZWQgYW5kIGhvdyBpdCdzIGludmFsaWRhdGVkLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byBkb3VibGUtY2hlY2sgdGhlIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGZ1bmN0aW9uLiBJJ3ZlIGdvdCB0byBtYWtlIHN1cmUgaXQncyBkb2luZyB3aGF0IEkgZXhwZWN0IGl0IHRvIGRvLCBhbmQgdGhhdCB0aGVyZSBhcmVuJ3QgYW55IHBvdGVudGlhbCBlZGdlIGNhc2VzIHRoYXQgSSBtaWdodCBoYXZlIG1pc3NlZCBpbiBteSBwcmV2aW91cyByZXZpZXcuIFRoZW4sIEkgbmVlZCB0byBsb29rIGNhcmVmdWxseSBhdCB0aGUgYHpzd2FwX2ludmFsaWRhdGUoKWAgZnVuY3Rpb24uIEludmFsaWRhdGlvbiBpcyBhIGNyaXRpY2FsIHBhcnQgb2YgYW55IGNhY2hlOyBtYWtpbmcgc3VyZSBpdCBpcyB3b3JraW5nIHRoZSB3YXkgdGhhdCBJIGV4cGVjdCBpdCB0byBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vdCBhbnkgZGF0YSBpbnRlZ3JpdHkgaXNzdWVzLiBJIHdhbnQgdG8gdHJhY2UgdGhlIGxvZ2ljIG9mIHRob3NlIHR3byBmdW5jdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ3NDUsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNTozNi45NTY4MDYwNzhaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTkzMDcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3pzd2FwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTI1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTI1OlxcdGJvb2wgenN3YXBfaXNfZW5hYmxlZCh2b2lkKVxcbiAxMjY6XFx0e1xcbiAxMjc6XFx0XFx0cmV0dXJuIHpzd2FwX2VuYWJsZWQ7XFxuIDEyODpcXHR9XFxuIDEyOTpcXHRcXG4gMTMwOlxcdGJvb2wgenN3YXBfbmV2ZXJfZW5hYmxlZCh2b2lkKVxcbiAxMzE6XFx0e1xcbiAxMzI6XFx0XFx0cmV0dXJuICFzdGF0aWNfYnJhbmNoX21heWJlKENPTkZJR19aU1dBUF9ERUZBVUxUX09OLCBcXHUwMDI2enN3YXBfZXZlcl9lbmFibGVkKTtcXG4gMTMzOlxcdH1cXG4gMTM0OlxcdFxcbiAxMzU6XFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxcbiAxMzY6XFx0KiBkYXRhIHN0cnVjdHVyZXNcXG4gMTM3OlxcdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXFxuIDEzODpcXHRcXG4gMTM5OlxcdHN0cnVjdCBjcnlwdG9fYWNvbXBfY3R4IHtcXG4gMTQwOlxcdFxcdHN0cnVjdCBjcnlwdG9fYWNvbXAgKmFjb21wO1xcbiAxNDE6XFx0XFx0c3RydWN0IGFjb21wX3JlcSAqcmVxO1xcbiAxNDI6XFx0XFx0c3RydWN0IGNyeXB0b193YWl0IHdhaXQ7XFxuIDE0MzpcXHRcXHR1OCAqYnVmZmVyO1xcbiAxNDQ6XFx0XFx0c3RydWN0IG11dGV4IG11dGV4O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNTozNi45NTcwMDE1MDhaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTcyOTU4NzA3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgenN3YXBfaW52YWxpZGF0ZSgpYCoqXG5cbk9rYXksIHRpbWUgdG8gemVybyBpbiBvbiBgenN3YXBfaW52YWxpZGF0ZSgpYC4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGltcGxlbWVudGF0aW9uIGFyb3VuZCBsaW5lIDE2MzMuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbnRhbCBtYXAgb2YgaG93IHRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIG92ZXJhbGwgWnN3YXAgYXJjaGl0ZWN0dXJlLiBNeSBndXQgZmVlbGluZyBpcyB0aGF0IHNvbWV0aGluZyBtaWdodCBiZSBhbWlzcyBhcm91bmQgdGhlcmUsIGVpdGhlciBpbiB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgcGFnZSB0YWJsZSBvciBwZXJoYXBzIHRoZSBsb2NraW5nIHNlbWFudGljcyB3aXRoaW4gdGhlIHN3YXBwaW5nIHByb2Nlc3MuIEl0J3MgYSBjb21tb24gYXJlYSBmb3Igc3VidGxlIGJ1Z3MgdG8gY3JlZXAgaW4sIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggdGhlIGNvbXBsZXhpdGllcyBvZiBtZW1vcnkgcmVjbGFpbSBhbmQgcGFnZSBpbnZhbGlkYXRpb24uIEkgd2FudCB0byBxdWlja2x5IHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBhbmQgdGhlIHNwZWNpZmljIGNvbmRpdGlvbmFsIGxvZ2ljIHN1cnJvdW5kaW5nIHRoaXMgbGluZS4gSSdtIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIHdpdGggbWVtb3J5IGFjY2VzcyBkdXJpbmcgaW52YWxpZGF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MjI5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMzozNTozOC42ODY1OTIwNTFaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjA2NTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL3pzd2FwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTYzMCxcbiAgXCJMaW5lQ291bnRcIjogMzVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTYzMDpcXHRcXHRyZXR1cm4gMDtcXG4xNjMxOlxcdH1cXG4xNjMyOlxcdFxcbjE2MzM6XFx0dm9pZCB6c3dhcF9pbnZhbGlkYXRlKHN3cF9lbnRyeV90IHN3cClcXG4xNjM0OlxcdHtcXG4xNjM1OlxcdFxcdHBnb2ZmX3Qgb2Zmc2V0ID0gc3dwX29mZnNldChzd3ApO1xcbjE2MzY6XFx0XFx0c3RydWN0IHhhcnJheSAqdHJlZSA9IHN3YXBfenN3YXBfdHJlZShzd3ApO1xcbjE2Mzc6XFx0XFx0c3RydWN0IHpzd2FwX2VudHJ5ICplbnRyeTtcXG4xNjM4OlxcdFxcbjE2Mzk6XFx0XFx0aWYgKHhhX2VtcHR5KHRyZWUpKVxcbjE2NDA6XFx0XFx0XFx0cmV0dXJuO1xcbjE2NDE6XFx0XFxuMTY0MjpcXHRcXHRlbnRyeSA9IHhhX2VyYXNlKHRyZWUsIG9mZnNldCk7XFxuMTY0MzpcXHRcXHRpZiAoZW50cnkpXFxuMTY0NDpcXHRcXHRcXHR6c3dhcF9lbnRyeV9mcmVlKGVudHJ5KTtcXG4xNjQ1OlxcdH1cXG4xNjQ2OlxcdFxcbjE2NDc6XFx0aW50IHpzd2FwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4xNjQ4OlxcdHtcXG4xNjQ5OlxcdFxcdHN0cnVjdCB4YXJyYXkgKnRyZWVzLCAqdHJlZTtcXG4xNjUwOlxcdFxcdHVuc2lnbmVkIGludCBuciwgaTtcXG4xNjUxOlxcdFxcbjE2NTI6XFx0XFx0bnIgPSBESVZfUk9VTkRfVVAobnJfcGFnZXMsIFpTV0FQX0FERFJFU1NfU1BBQ0VfUEFHRVMpO1xcbjE2NTM6XFx0XFx0dHJlZXMgPSBrdnphbGxvY19vYmpzKCp0cmVlLCBucik7XFxuMTY1NDpcXHRcXHRpZiAoIXRyZWVzKSB7XFxuMTY1NTpcXHRcXHRcXHRwcl9lcnIoXFxcImFsbG9jIGZhaWxlZCwgenN3YXAgZGlzYWJsZWQgZm9yIHN3YXAgdHlwZSAlZFxcXFxuXFxcIiwgdHlwZSk7XFxuMTY1NjpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4xNjU3OlxcdFxcdH1cXG4xNjU4OlxcdFxcbjE2NTk6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yOyBpKyspXFxuMTY2MDpcXHRcXHRcXHR4YV9pbml0KHRyZWVzICsgaSk7XFxuMTY2MTpcXHRcXG4xNjYyOlxcdFxcdG5yX3pzd2FwX3RyZWVzW3R5cGVdID0gbnI7XFxuMTY2MzpcXHRcXHR6c3dhcF90cmVlc1t0eXBlXSA9IHRyZWVzO1xcbjE2NjQ6XFx0XFx0cmV0dXJuIDA7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDEzOjM1OjM4LjY4NjgwNDgwMVoiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMTM3NzQxODAzMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBBbmFseXNpcyBvZiBac3dhcCBSZWZhY3RvcmluZyBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIHBhdGNoIGZvY3VzZXMgb24gb3B0aW1pemluZyB0aGUgYHpzd2FwX3N0b3JlYCBmdW5jdGlvbiwgc3BlY2lmaWNhbGx5IHJlZ2FyZGluZyBlYXJseSBleGl0IGNvbmRpdGlvbnMgYW5kIGludmFsaWRhdGlvbiBsb2dpYy4gRmlyc3QsIHRoZSBjcnVjaWFsIGFkZGl0aW9uIG9mIGBpZiAoenN3YXBfbmV2ZXJfZW5hYmxlZCgpKSByZXR1cm4gZmFsc2U7YCBhdCB0aGUgYmVnaW5uaW5nIG9mIGB6c3dhcF9zdG9yZWAgaXMgYSBzaW1wbGUgb3B0aW1pemF0aW9uOiBpZiB6c3dhcCBoYXNuJ3QgZXZlbiBiZWVuIGVuYWJsZWQgKGluZGljYXRlZCBieSB0aGUgc3RhdGljIGJyYW5jaCBgenN3YXBfZXZlcl9lbmFibGVkYCBiZWluZyBmYWxzZSksIHdlIGJhaWwgb3V0IGVhcmx5LCBza2lwcGluZyB1bm5lY2Vzc2FyeSBvcGVyYXRpb25zLiBTbWFydC5cblxuVGhlbiwgdGhlIG1vcmUgaW50ZXJlc3RpbmcgcGFydCBpcyBob3cgaXQgc2ltcGxpZmllcyB0aGUgaW52YWxpZGF0aW9uIGxvb3AgaW4gYHpzd2FwX3N0b3JlYCB3aGVuIGEgc3RvcmUgZmFpbHMgb3IgenN3YXAgaXMgZGlzYWJsZWQuIFRoZSBvcmlnaW5hbCBjb2RlIGRpZCBhbiBleHBsaWNpdCBsb29wIHRvIGVyYXNlIGVudHJpZXMgZnJvbSB0aGUgenN3YXAgdHJlZS4gVGhpcyBwYXRjaCByZWZhY3RvcnMgdGhhdCBsb29wIGJ5IHVzaW5nIHRoZSBleGlzdGluZyBgenN3YXBfaW52YWxpZGF0ZWAgZnVuY3Rpb24uIFRoaXMgaXMgY2xlYW5lciwgbW9yZSBtYWludGFpbmFibGUuXG5cbk5vdywgdGhlIHJlYWwgcXVlc3Rpb246IGRvZXMgdGhpcyBpbnRyb2R1Y2UgYW55IEtNU0FOIGNvbmNlcm5zPyBOby4gTGV0J3MgcnVuIGl0IGRvd24gdGhlIGNoZWNrbGlzdDpcblxuMS4gICoqTm8gS2VybmVsIFN0cnVjdHVyZXMgdG8gVXNlcnNwYWNlOioqIE5vdGhpbmcgaXMgYmVpbmcgY29waWVkIHRvIHVzZXJzcGFjZSB0aGF0IG1pZ2h0IGhhdmUgdW5pbml0aWFsaXplZCBmaWVsZHMgb3IgcGFkZGluZy4gVGhhdCdzIGEgaHVnZSB3aW4uXG4yLiAgKipObyBVbmluaXRpYWxpemVkIFZhcmlhYmxlIERlcGVuZGVuY3k6KiogVGhlIGB6c3dhcF9uZXZlcl9lbmFibGVkKClgIGNoZWNrIHVzZXMgYSBzdGF0aWMga2V5LCBhbmQgdGhlIGxvb3AgaW5kaWNlcywgdHlwZSwgYW5kIG9mZnNldCBpbiBgc3dwX2VudHJ5YCBhcmUgYWxsIGluaXRpYWxpemVkIGFuZCBjYWxjdWxhdGVkLiBUaGUgY29uZGl0aW9ucyBhcmUgc2FmZS5cbjMuICAqKk5vIE5ldyBBbGxvY2F0aW9uczoqKiBObyBuZXcgYWxsb2NhdGlvbnMgb3IgaW5pdGlhbGl6YXRpb25zIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbnRyb2R1Y2VkIHRoYXQgY291bGQgaGFyYm9yIHVuaW5pdGlhbGl6ZWQgZmllbGRzLlxuNC4gICoqTm8gVW5zYWZlIEFjY2Vzc2VzOioqIFRoZXJlIGFyZSBubyBib3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyB0aGF0IGNvdWxkIGxlYWQgdG8gYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgaW4gZXhpc3RpbmcgYnVmZmVycy5cblxuVGhpcyBpcyBhIGNsZWFuIHJlZmFjdG9yaW5nLiBJdCdzIGFuIG9wdGltaXphdGlvbiwgYW5kIGl0IGRvZXNuJ3QgdG91Y2ggYW55dGhpbmcgS01TQU4gd291bGQgd29ycnkgYWJvdXQuIEFueSBtZW1vcnkgbWFuYWdlbWVudCBlcnJvcnMsIGxpa2UgdXNlLWFmdGVyLWZyZWUgb3IgZG91YmxlIGZyZWVzLCB3b3VsZCBiZSBjYXVnaHQgYnkgS0FTQU4vZGVidWdnZXJzLlxuXG5TbywgdGhlIHN1bW1hcnk6IFRoaXMgcGF0Y2ggb3B0aW1pemVzIGB6c3dhcF9zdG9yZWAgd2l0aCBhbiBlYXJseSBleGl0IGFuZCByZWZhY3RvcmVkIGludmFsaWRhdGlvbiBsb2dpYy4gSXQgZG9lcyAqbm90KiBpbnRyb2R1Y2UgYW55IHJpc2tzIHJlbGF0ZWQgdG8gdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgcmVsaWVzIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBUaGlzIGZhbGxzIHNxdWFyZWx5IHVuZGVyIEtBU0FOJ3MgcHVydmlldy4gTm8gS01TQU4gbmVlZGVkLiBUaW1lIHRvIG1vdmUgb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU5NTgsIk91dHB1dFRva2VucyI6MTY3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODQ3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTM6MzU6NTAuMDY0MjI1ODgxWiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE5MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGFuIGVhcmx5LXJldHVybiBjaGVjayB1c2luZyBgenN3YXBfbmV2ZXJfZW5hYmxlZCgpYCBpbiBgenN3YXBfc3RvcmUoKWAgYW5kIHJlZmFjdG9ycyBvcGVuLWNvZGVkIHpzd2FwIHRyZWUgaW52YWxpZGF0aW9uIGxvZ2ljIG9uIHN0b3JlIGZhaWx1cmUgdG8gcmV1c2UgYHpzd2FwX2ludmFsaWRhdGUoKWAuIE5vIG1lbW9yeSBhbGxvY2F0aW9ucywgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIG9wZXJhdGlvbnMgYXJlIGludHJvZHVjZWQgb3IgYWx0ZXJlZC4gTm8gY29uZGl0aW9uYWwgbG9naWMgcmVsaWVzIG9uIHVuaW5pdGlhbGl6ZWQgZGF0YS4gQW55IG1lbW9yeSBzYWZldHkgY29uY2VybnMgaW4gdGhpcyBzd2FwIHBhdGggKHN1Y2ggYXMgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBvciBsb2NraW5nIGVycm9ycykgYXJlIGNvdmVyZWQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dlcnMuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBrZXJuZWwtdG8tdXNlciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhbiBlYXJseS1yZXR1cm4gY2hlY2sgdXNpbmcgYHpzd2FwX25ldmVyX2VuYWJsZWQoKWAgaW4gYHpzd2FwX3N0b3JlKClgIGFuZCByZWZhY3RvcnMgb3Blbi1jb2RlZCB6c3dhcCB0cmVlIGludmFsaWRhdGlvbiBsb2dpYyBvbiBzdG9yZSBmYWlsdXJlIHRvIHJldXNlIGB6c3dhcF9pbnZhbGlkYXRlKClgLiBObyBtZW1vcnkgYWxsb2NhdGlvbnMsIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbnMsIG9yIGNvcHktdG8tdXNlciBvcGVyYXRpb25zIGFyZSBpbnRyb2R1Y2VkIG9yIGFsdGVyZWQuIE5vIGNvbmRpdGlvbmFsIGxvZ2ljIHJlbGllcyBvbiB1bmluaXRpYWxpemVkIGRhdGEuIEFueSBtZW1vcnkgc2FmZXR5IGNvbmNlcm5zIGluIHRoaXMgc3dhcCBwYXRoIChzdWNoIGFzIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgb3IgbG9ja2luZyBlcnJvcnMpIGFyZSBjb3ZlcmVkIGJ5IEtBU0FOIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnZXJzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3Iga2VybmVsLXRvLXVzZXIgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflows88xq[1] Phase: Succeeded StartedAt: 2026-09-09 13:36:01 +0000 UTC FinishedAt: 2026-09-09 13:36:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-09 13:36:01 +0000 UTC FinishedAt: 2026-09-09 13:36:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2] Phase: Succeeded StartedAt: 2026-09-09 13:36:01 +0000 UTC FinishedAt: 2026-09-09 17:23:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-09 13:36:01 +0000 UTC FinishedAt: 2026-09-09 17:23:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-09 13:36:01 +0000 UTC FinishedAt: 2026-09-09 13:36:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-09 13:36:01 +0000 UTC FinishedAt: 2026-09-09 13:36:06 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflows88xq/series-workflows88xq-convert-artifact-2104446034/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-09 13:36:11 +0000 UTC FinishedAt: 2026-09-09 13:55:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-09 13:36:11 +0000 UTC FinishedAt: 2026-09-09 13:55:12 +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:*c3519eb2-e906-429e-b4e2-cd5d774815d6,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-workflows88xq/series-workflows88xq-convert-artifact-2104446034/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": "1837f4bc-3146-46b9-afd3-ff9fbfa40955", "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-workflows88xq/series-workflows88xq-build-action-2022621392/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-09 13:36:11 +0000 UTC FinishedAt: 2026-09-09 13:55:02 +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:*c3519eb2-e906-429e-b4e2-cd5d774815d6,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-workflows88xq/series-workflows88xq-convert-artifact-2104446034/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": "1837f4bc-3146-46b9-afd3-ff9fbfa40955", "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-workflows88xq/series-workflows88xq-build-action-2022621392/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-09 13:55:12 +0000 UTC FinishedAt: 2026-09-09 13:55:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-09 13:55:12 +0000 UTC FinishedAt: 2026-09-09 13:55:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-09 13:55:12 +0000 UTC FinishedAt: 2026-09-09 13:55:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-09 13:55:12 +0000 UTC FinishedAt: 2026-09-09 13:55:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflows88xq/series-workflows88xq-convert-artifact-1426393965/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-09 13:55:22 +0000 UTC FinishedAt: 2026-09-09 13:57:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-09 13:55:22 +0000 UTC FinishedAt: 2026-09-09 13:57:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*1837f4bc-3146-46b9-afd3-ff9fbfa40955,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-workflows88xq/series-workflows88xq-build-action-2022621392/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-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-09 13:57:12 +0000 UTC FinishedAt: 2026-09-09 13:57:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-09 13:57:12 +0000 UTC FinishedAt: 2026-09-09 13:57:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-09 13:57:12 +0000 UTC FinishedAt: 2026-09-09 14:13:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-09 13:57:12 +0000 UTC FinishedAt: 2026-09-09 14:13:59 +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:*c3519eb2-e906-429e-b4e2-cd5d774815d6,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-workflows88xq/series-workflows88xq-convert-artifact-1426393965/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": "9b1a5f54-2987-4a76-a6ff-6cdaf5210172", "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-workflows88xq/series-workflows88xq-build-action-2842410185/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-09 13:57:12 +0000 UTC FinishedAt: 2026-09-09 14:13:49 +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:*c3519eb2-e906-429e-b4e2-cd5d774815d6,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-workflows88xq/series-workflows88xq-convert-artifact-1426393965/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": "9b1a5f54-2987-4a76-a6ff-6cdaf5210172", "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-workflows88xq/series-workflows88xq-build-action-2842410185/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-09 14:13:59 +0000 UTC FinishedAt: 2026-09-09 14:13:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-09 14:13:59 +0000 UTC FinishedAt: 2026-09-09 14:13:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-09 14:13:59 +0000 UTC FinishedAt: 2026-09-09 14:16:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-09 14:13:59 +0000 UTC FinishedAt: 2026-09-09 14:15:57 +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:*9b1a5f54-2987-4a76-a6ff-6cdaf5210172,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-workflows88xq/series-workflows88xq-build-action-2842410185/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-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-09 14:16:07 +0000 UTC FinishedAt: 2026-09-09 17:23:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-09 14:16:07 +0000 UTC FinishedAt: 2026-09-09 17:23:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*1837f4bc-3146-46b9-afd3-ff9fbfa40955,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9b1a5f54-2987-4a76-a6ff-6cdaf5210172,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-workflows88xq/series-workflows88xq-build-action-2022621392/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-workflows88xq/series-workflows88xq-build-action-2842410185/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-09 14:16:07 +0000 UTC FinishedAt: 2026-09-09 14:16:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-09 14:16:07 +0000 UTC FinishedAt: 2026-09-09 14:16:11 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflows88xq/series-workflows88xq-convert-artifact-360605138/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-09 14:16:07 +0000 UTC FinishedAt: 2026-09-09 14:16:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-09 14:16:07 +0000 UTC FinishedAt: 2026-09-09 14:16:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-09 14:16:07 +0000 UTC FinishedAt: 2026-09-09 14:16:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-09 14:16:17 +0000 UTC FinishedAt: 2026-09-09 17:23:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflows88xq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["zswap_store","zswap_invalidate"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"53a57667a3201fb756e6e9ffa0f6de4698dc917c","config_name":"upstream-apparmor-kasan.config","enable_configs":["ZSWAP","SWAP"],"series_id":"2c753753-fa3e-43d5-a84f-1c1bebc01c34","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-09 14:16:17 +0000 UTC FinishedAt: 2026-09-09 17:23:05 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*1837f4bc-3146-46b9-afd3-ff9fbfa40955,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9b1a5f54-2987-4a76-a6ff-6cdaf5210172,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-workflows88xq/series-workflows88xq-build-action-2022621392/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-workflows88xq/series-workflows88xq-build-action-2842410185/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-workflows88xq/series-workflows88xq-convert-artifact-360605138/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,}