Name: series-workflowbgtzw Phase: Succeeded StartedAt: 2026-08-13 13:31:35 +0000 UTC FinishedAt: 2026-08-13 18:52:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[0] Phase: Succeeded StartedAt: 2026-08-13 13:31:35 +0000 UTC FinishedAt: 2026-08-13 15:06:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[0].run-triage Phase: Succeeded StartedAt: 2026-08-13 13:31:35 +0000 UTC FinishedAt: 2026-08-13 15:06:44 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "28d012efb4327f9c75d5e042a7c91e9a542efa98", "config_name": "upstream-apparmor-kasan.config", "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "28d012efb4327f9c75d5e042a7c91e9a542efa98", "config_name": "upstream-apparmor-kasan.config", "series_id": "3fd812d8-e66c-424d-804d-73b33814d86b" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "proc_dointvec", "proc_douintvec", "proc_dointvec_minmax", "proc_douintvec_minmax", "proc_doulongvec_minmax", "proc_dou8vec_minmax" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjAyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cHJvY19kb2ludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvaW50dmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlY19taW5tYXgmIzM0OywKICAgICYjMzQ7cHJvY19kb3Vsb25ndmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdTh2ZWNfbWlubWF4JiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHN5c2N0bCBhcnJheSBwYXJzaW5nIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIGJ5IHVzaW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGttZW1kdXBgKSB3aGVuIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gVGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBzaW1wbGUgYXJyYXlzIG9mIGludGVnZXJzIG9yIHVuc2lnbmVkIGxvbmdzIHdpdGhvdXQgcGFkZGluZy4gVGhlIHJlYWQgcGF0aCAoa2VybmVsIHRvIHVzZXIpIGlzIHVuY2hhbmdlZCwgc28gbm8gbmV3IGluZm8tbGVha3MgYXJlIGludHJvZHVjZWQuIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG9ubHkgdXNlZCBmb3Igd3JpdGluZyB0byBrZXJuZWwgc3BhY2UsIGFuZCBvbmx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQgZWxlbWVudHMgYXJlIGNvcGllZCBiYWNrLiBBbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIG1lbW9yeSBsZWFrIGRldGVjdG9ycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgY29yZSBzeXNjdGwgdmVjdG9yIHByb2Nlc3NpbmcgbG9naWMgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMgb24gZXJyb3IgYnkgYWxsb2NhdGluZyBhIHRlbXBvcmFyeSBidWZmZXIuIFRoaXMgYWZmZWN0cyBhbGwgc3lzY3RsIGhhbmRsZXJzIHRoYXQgcHJvY2VzcyBhcnJheXMuIEZ1enppbmcgaXMgbmVlZGVkIHRvIGVuc3VyZSBjb3JyZWN0IGVycm9yIGhhbmRsaW5nLCBubyBtZW1vcnkgbGVha3MsIGFuZCBubyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzeXNjdGwgd3JpdGVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjAyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZTIwODYyODMxY2U3NGEyY2JhZjZmNjNlOTFlYzdlOGYwNDFlZWQxNlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgQXVnIDEzIDE1OjAyOjQ0IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuY1xuaW5kZXggZjdiNzU5ODVkNTQyMC4uNzg3ZjUzZDcwNTA3YiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9zeXNjdGwuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3N5c2N0bC5jXG5AQCAtNTk1LDcgJiM0Mzs1OTUsNyBAQCBzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4KGJvb2wgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLFxuIHN0YXRpYyBjb25zdCBjaGFyIHByb2Nfd3NwYWNlX3NlcFtdID0geyAmIzM5OyAmIzM5OywgJiMzOTtcXHQmIzM5OywgJiMzOTtcXG4mIzM5OyB9O1xuIFxuIC8qXG4tICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBkb19wcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZVxuJiM0MzsgKiBFbGVtZW50IHR5cGUgcHJvY2Vzc2VkIGJ5IHByb2NfdmVjKCkuIFRoZSB0YWcgc2VsZWN0cyB0aGUgZWxlbWVudCBzaXplXG4gICogYW5kIHNpZ25lZG5lc3MsIGFuZCBpdCBzZWxlY3RzIHdoaWNoIG1lbWJlciBvZiB1bmlvbiBwcm9jX3ZlY19jb252IGlzIGxpdmUuXG4gICovXG4gZW51bSBwcm9jX3ZlY190eXBlIHtcbkBAIC02MDUsNyAmIzQzOzYwNSw3IEBAIGVudW0gcHJvY192ZWNfdHlwZSB7XG4gfTtcbiBcbiAvKlxuLSAqIENvbnZlcnRlciBwYXNzZWQgdG8gZG9fcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxuJiM0MzsgKiBDb252ZXJ0ZXIgcGFzc2VkIHRvIHByb2NfdmVjKCkuIE9ubHkgdGhlIG1lbWJlciBtYXRjaGluZyB0aGVcbiAgKiBlbnVtIHByb2NfdmVjX3R5cGUgdGFnIGlzIGV2ZXIgcmVhZCwgc28gZXZlcnkgZGlzcGF0Y2ggc3RheXMgZnVsbHkgdHlwZWQgYW5kXG4gICogbm8gdm9pZCAqIGNvbnZlcnRlciBwb2ludGVyIGlzIG5lZWRlZC5cbiAgKi9cbkBAIC02MzcsMTAxICYjNDM7NjM3LDE2OCBAQCBzdGF0aWMgaW50IHByb2NfdmVjX2NvbnYoZW51bSBwcm9jX3ZlY190eXBlIHR5cGUsIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udixcbiBcdHJldHVybiAtRUlOVkFMO1xuIH1cbiBcbi0vKlxuLSAqIFJlYWQvd3JpdGUgYSB2ZWN0b3Igb2YgQHR5cGUgZWxlbWVudHMuIFRoZSBlbGVtZW50IHNpemUgYW5kIHNpZ25lZG5lc3MgYXJlXG4tICogZGVyaXZlZCBmcm9tIEB0eXBlLCBzbyBhIHNpbmdsZSBydW50aW1lIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBwZXItdHlwZVxuLSAqIHZhcmlhbnRzLiB0YWJsZS1cdTAwM2VkYXRhIGlzIHdhbGtlZCBhcyByYXcgYnl0ZXMgKEBpKSBhZHZhbmNlZCBieSBAc2l6ZTsgdGhlXG4tICogY29udmVydGVyIHBlcmZvcm1zIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS5cbi0gKi9cbi1zdGF0aWMgaW50IGRvX3Byb2NfdmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuLVx0XHQgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyxcbi1cdFx0ICAgICAgIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYpXG4mIzQzO3N0YXRpYyBpbnQgY29tbWl0X2NvbnZfdmVjKGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsIHZvaWQgKmRzdCxcbiYjNDM7XHRcdFx0ICAgIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG5yKVxuIHtcbi1cdGludCB2bGVmdCwgZmlyc3QgPSAxLCBlcnIgPSAwO1xuLVx0c2l6ZV90IGxlZnQsIHNpemU7XG4tXHRib29sIGlzX3Vuc2lnbmVkO1xuLVx0Y2hhciAqaSwgKnA7XG4mIzQzO1x0c2l6ZV90IGk7XG4gXG4tXHRzd2l0Y2ggKHR5cGUpIHtcbiYjNDM7XHRzd2l0Y2ggKGRhdGFfdHlwZSkge1xuIFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YoaW50KTtcbi1cdFx0aXNfdW5zaWduZWQgPSBmYWxzZTtcbi1cdFx0YnJlYWs7XG4tXHRjYXNlIFBST0NfVkVDX1VJTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YodWludCk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdFdSSVRFX09OQ0UoKChpbnQgKilkc3QpW2ldLCAoKGNvbnN0IGludCAqKXNyYylbaV0pO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuIFx0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbi1cdFx0c2l6ZSA9IHNpemVvZih1bG9uZyk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdFdSSVRFX09OQ0UoKCh1bG9uZyAqKWRzdClbaV0sICgoY29uc3QgdWxvbmcgKilzcmMpW2ldKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHR9XG4mIzQzO31cbiBcbi1cdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuLVx0ICAgICgqcHBvcyBcdTAwMjZcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xuLVx0XHQqbGVucCA9IDA7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0aSA9IHRhYmxlLVx1MDAzZWRhdGE7XG4tXHR2bGVmdCA9IHRhYmxlLVx1MDAzZW1heGxlbiAvIHNpemU7XG4tXHRsZWZ0ID0gKmxlbnA7XG4tXG4tXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXG4tXHRpZiAodHlwZSA9PSBQUk9DX1ZFQ19VSU5UIFx1MDAyNlx1MDAyNiB2bGVmdCAhPSAxKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcbi1cdFx0aWYgKHByb2NfZmlyc3RfcG9zX25vbl96ZXJvX2lnbm9yZShwcG9zLCB0YWJsZSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdGlmIChsZWZ0IFx1MDAzZSBQQUdFX1NJWkUgLSAxKVxuLVx0XHRcdGxlZnQgPSBQQUdFX1NJWkUgLSAxO1xuLVx0XHRwID0gYnVmZmVyO1xuJiM0MzsvKipcbiYjNDM7ICogYXBwbHlfY29udl9vbl92ZWMgLSBBcHBseSBjb252ZXJ0ZXIgZnVuY3Rpb24gb24gZGF0YSB2ZWN0b3JcbiYjNDM7ICpcbiYjNDM7ICogRWxlbWVudCBzaWduZWRuZXNzIGlzIGRlcml2ZWQgZnJvbSBAZGF0YV90eXBlLiB0YWJsZS1cdTAwM2VkYXRhIGlzIHdhbGtlZFxuJiM0MzsgKiBhcyByYXcgYnl0ZXMgKEBkYXRhKSBhZHZhbmNlZCBieSBAZGF0YV9zaXplOyB0aGUgY29udmVydGVyIHBlcmZvcm1zXG4mIzQzOyAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mXG4mIzQzOyAqIGJ5dGVzIHRoYXQgd2hlcmUgbGVmdCBvdXRzdGFuZGluZyBhZnRlciBjb252ZXJzaW9uLiBDYW4gYmUgXHUwMDNlIDAuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLiBOb24temVybyBvbiBlcnJvci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYXBwbHlfY29udl9vbl92ZWMoY29uc3QgdW5pb24gcHJvY192ZWNfY29udiBjb252LFxuJiM0MztcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLFxuJiM0MztcdFx0XHQgICAgIGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsXG4mIzQzO1x0XHRcdCAgICAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3QgaW50IGNvbnZfZGlyLFxuJiM0MztcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBidWZfbmJ5dGUsIHZvaWQgKmJ1ZixcbiYjNDM7XHRcdFx0ICAgICBzaXplX3QgKmJ1Zl9sZWZ0X2ZpbmFsKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHZlY19sZWZ0LCBlcnIgPSAwO1xuJiM0MztcdHNpemVfdCBidWZfbGVmdCwgbnJfY29udiA9IDA7XG4mIzQzO1x0Y2hhciAqZGF0YSwgKmRhdGFfc3RhZ2UgPSBOVUxMLCAqcDtcbiYjNDM7XHRib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HO1xuJiM0MztcbiYjNDM7XHRidWZfbGVmdCA9IGJ1Zl9uYnl0ZTtcbiYjNDM7XG4mIzQzO1x0ZGF0YSA9IHRhYmxlLVx1MDAzZWRhdGE7XG4mIzQzO1x0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oY29udl9kaXIpKSB7XG4mIzQzO1x0XHRpZiAoYnVmX2xlZnQgXHUwMDNlIFBBR0VfU0laRSAtIDEpXG4mIzQzO1x0XHRcdGJ1Zl9sZWZ0ID0gUEFHRV9TSVpFIC0gMTtcbiYjNDM7XHRcdHAgPSBidWY7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHRhYmxlLVx1MDAzZW1heGxlbiBcdTAwM2UgZGF0YV9zaXplKSB7XG4mIzQzO1x0XHRcdGRhdGFfc3RhZ2UgPSBrbWVtZHVwKHRhYmxlLVx1MDAzZWRhdGEsIHRhYmxlLVx1MDAzZW1heGxlbiwgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0XHRcdGlmICghZGF0YV9zdGFnZSkge1xuJiM0MztcdFx0XHRcdGVyciA9IC1FTk9NRU07XG4mIzQzO1x0XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0ZGF0YSA9IGRhdGFfc3RhZ2U7XG4mIzQzO1x0XHR9XG4gXHR9XG4gXG4tXHRmb3IgKDsgbGVmdCBcdTAwMjZcdTAwMjYgdmxlZnQtLTsgaSAmIzQzOz0gc2l6ZSwgZmlyc3QgPSAwKSB7XG4mIzQzO1x0dmVjX2xlZnQgPSB0YWJsZS1cdTAwM2VtYXhsZW4gLyBkYXRhX3NpemU7XG4mIzQzO1x0Zm9yICg7IGJ1Zl9sZWZ0IFx1MDAyNlx1MDAyNiB2ZWNfbGVmdC0tOyBkYXRhICYjNDM7PSBkYXRhX3NpemUsIG5yX2NvbnYmIzQzOyYjNDM7KSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgbHZhbDtcbiBcdFx0Ym9vbCBuZWcgPSBmYWxzZTtcbiBcbi1cdFx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkge1xuLVx0XHRcdHByb2Nfc2tpcF9zcGFjZXMoXHUwMDI2cCwgXHUwMDI2bGVmdCk7XG4mIzQzO1x0XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbiYjNDM7XHRcdFx0cHJvY19za2lwX3NwYWNlcyhcdTAwMjZwLCBcdTAwMjZidWZfbGVmdCk7XG4gXG4tXHRcdFx0aWYgKCFsZWZ0KVxuJiM0MztcdFx0XHRpZiAoIWJ1Zl9sZWZ0KVxuIFx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0ZXJyID0gcHJvY19nZXRfbG9uZyhcdTAwMjZwLCBcdTAwMjZsZWZ0LCBcdTAwMjZsdmFsLCBcdTAwMjZuZWcsXG4mIzQzO1x0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQsIFx1MDAyNmx2YWwsIFx1MDAyNm5lZyxcbiBcdFx0XHRcdFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcbiBcdFx0XHRcdFx0ICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTtcbiBcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgbmVnIFx1MDAyNlx1MDAyNiBpc191bnNpZ25lZClcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0aWYgKGVycilcbiBcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGlmIChwcm9jX3ZlY19jb252KHR5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgaSwgZGlyLCB0YWJsZSkpIHtcbiYjNDM7XHRcdFx0aWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCBcdTAwMjZuZWcsIFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0aWYgKHByb2NfdmVjX2NvbnYodHlwZSwgY29udiwgXHUwMDI2bmVnLCBcdTAwMjZsdmFsLCBpLCBkaXIsIHRhYmxlKSkge1xuJiM0MztcdFx0XHRpZiAocHJvY192ZWNfY29udihkYXRhX3R5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkge1xuIFx0XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbi1cdFx0XHRpZiAoIWZpcnN0KVxuLVx0XHRcdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsICYjMzk7XFx0JiMzOTspO1xuLVx0XHRcdHByb2NfcHV0X2xvbmcoXHUwMDI2YnVmZmVyLCBcdTAwMjZsZWZ0LCBsdmFsLCBuZWcpO1xuJiM0MztcdFx0XHRpZiAobnJfY29udilcbiYjNDM7XHRcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICYjMzk7XFx0JiMzOTspO1xuJiM0MztcdFx0XHRwcm9jX3B1dF9sb25nKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsIGx2YWwsIG5lZyk7XG4gXHRcdH1cbiBcdH1cbiBcbi1cdGlmIChTWVNDVExfS0VSTl9UT19VU0VSKGRpcikgXHUwMDI2XHUwMDI2ICFmaXJzdCBcdTAwMjZcdTAwMjYgbGVmdCBcdTAwMjZcdTAwMjYgIWVycilcbi1cdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsICYjMzk7XFxuJiMzOTspO1xuLVx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSBcdTAwMjZcdTAwMjYgIWVyciBcdTAwMjZcdTAwMjYgbGVmdClcbi1cdFx0cHJvY19za2lwX3NwYWNlcyhcdTAwMjZwLCBcdTAwMjZsZWZ0KTtcbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgXHUwMDI2XHUwMDI2IGZpcnN0KVxuLVx0XHRyZXR1cm4gZXJyID8gOiAtRUlOVkFMO1xuLVx0KmxlbnAgLT0gbGVmdDtcbiYjNDM7XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbiYjNDM7XHRcdGlmICghZXJyIFx1MDAyNlx1MDAyNiBidWZfbGVmdClcbiYjNDM7XHRcdFx0cHJvY19za2lwX3NwYWNlcyhcdTAwMjZwLCBcdTAwMjZidWZfbGVmdCk7XG4mIzQzO1x0XHRpZiAoIW5yX2NvbnYpIHtcbiYjNDM7XHRcdFx0ZXJyID0gZXJyID8gOiAtRUlOVkFMO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmICghZXJyIFx1MDAyNlx1MDAyNiBkYXRhX3N0YWdlKVxuJiM0MztcdFx0XHRlcnIgPSBjb21taXRfY29udl92ZWMoZGF0YV90eXBlLCB0YWJsZS1cdTAwM2VkYXRhLCBkYXRhX3N0YWdlLCBucl9jb252KTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0aWYgKG5yX2NvbnYgXHUwMDI2XHUwMDI2IGJ1Zl9sZWZ0IFx1MDAyNlx1MDAyNiAhZXJyKVxuJiM0MztcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICYjMzk7XFxuJiMzOTspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0KmJ1Zl9sZWZ0X2ZpbmFsID0gYnVmX2xlZnQ7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0a2ZyZWUoZGF0YV9zdGFnZSk7XG4mIzQzO1x0cmV0dXJuIGVycjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUmVhZC93cml0ZSBhIHZlY3RvciBvZiBAdHlwZSBlbGVtZW50cy4gKi9cbiYjNDM7c3RhdGljIGludCBwcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuJiM0MztcdFx0ICAgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zLCBlbnVtIHByb2NfdmVjX3R5cGUgdHlwZSxcbiYjNDM7XHRcdCAgICB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZXJyID0gMDtcbiYjNDM7XHRzaXplX3QgZGF0YV9zaXplLCBsZWZ0X25ieXRlID0gU0laRV9NQVg7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAodHlwZSkge1xuJiM0MztcdGNhc2UgUFJPQ19WRUNfSU5UOlxuJiM0MztcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKGludCk7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFBST0NfVkVDX1VJTlQ6XG4mIzQzO1x0XHRkYXRhX3NpemUgPSBzaXplb2YodWludCk7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFBST0NfVkVDX1VMT05HOlxuJiM0MztcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKHVsb25nKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuJiM0MztcdCAgICAoKnBwb3MgXHUwMDI2XHUwMDI2IFNZU0NUTF9LRVJOX1RPX1VTRVIoZGlyKSkpIHtcbiYjNDM7XHRcdCpsZW5wID0gMDtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkge1xuJiM0MztcdFx0aWYgKHByb2NfZmlyc3RfcG9zX25vbl96ZXJvX2lnbm9yZShwcG9zLCB0YWJsZSkpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXJyID0gYXBwbHlfY29udl9vbl92ZWMoY29udiwgdGFibGUsIHR5cGUsIGRhdGFfc2l6ZSwgZGlyLCAqbGVucCwgYnVmZmVyLFxuJiM0MztcdFx0XHRcdFx1MDAyNmxlZnRfbmJ5dGUpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEFuIHVuY2hhbmdlZCBsZWZ0X25ieXRlIHNpZ25hbHMgYSB3cml0ZSB3aXRoIG5vIHBhcnNlZCBlbGVtZW50OyB3aGljaFxuJiM0MztcdCAqIGlzIGFuIGVycm9yLiBVc2luZyBTSVpFX01BWCB0byBkZXRlY3QgdGhpcyBlcnJvciBpcyBwb3NzaWJsZSBiZWNhdXNlOlxuJiM0MztcdCAqIDEuIGxlbnAgaXMgYm91bmRlZCBieSBLTUFMTE9DX01BWF9TSVpFIGluIHByb2Nfc3lzX2NhbGxfaGFuZGxlclxuJiM0MztcdCAqIDIuIGxlbnAgY291bGQgbmV2ZXIgYmUgU0laRV9NQVggYXMgaXQgaXMgYSBcJiMzNDtyaWRpY3Vsb3VzXCYjMzQ7IChleGFieXRlKSBhbGxvY2F0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChsZWZ0X25ieXRlID09IFNJWkVfTUFYKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0KmxlbnAgLT0gbGVmdF9uYnl0ZTtcbiBvdXQ6XG4gXHQqcHBvcyAmIzQzOz0gKmxlbnA7XG4mIzQzO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtNzU2LDEyICYjNDM7ODIzLDE1IEBAIGludCBwcm9jX2RvdWludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gXHRcdFx0aW50ICgqY29udikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCB1aW50ICprX3B0cixcbiBcdFx0XHRcdCAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkpXG4ge1xuJiM0MztcdC8qIHVpbnQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLCAqRG8gbm90KiBhZGQgc3VwcG9ydCBmb3IgdGhlbS4gKi9cbiYjNDM7XHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAyNlx1MDAyNiAodGFibGUtXHUwMDNlbWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4gXHRpZiAoIWNvbnYpXG4gXHRcdGNvbnYgPSBkb19wcm9jX3VpbnRfY29udjtcbiBcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gY29udiB9KTtcbiYjNDM7XHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULFxuJiM0MztcdFx0XHQodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pO1xuIH1cbiBcbiAvKipcbkBAIC04MjAsOCAmIzQzOzg5MCw4IEBAIGludCBwcm9jX2RvYm9vbChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIGludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gXHRcdCAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXG4ge1xuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuLVx0XHRcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcbiYjNDM7XHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4mIzQzO1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtODQwLDggJiM0Mzs5MTAsNyBAQCBpbnQgcHJvY19kb2ludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIFx0XHRzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULFxuLVx0XHRcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252IH0pO1xuJiM0MztcdHJldHVybiBwcm9jX2RvdWludHZlY19jb252KHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgZG9fcHJvY191aW50X2NvbnYpO1xuIH1cbiBcbiAvKipcbkBAIC04NjQsOCAmIzQzOzkzMyw4IEBAIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIGludCBwcm9jX2RvaW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0ICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xuJiM0MztcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbiYjNDM7XHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252X21pbm1heCB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtODkxLDggJiM0Mzs5NjAsOCBAQCBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4gaW50IHByb2NfZG91aW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0XHQgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXG4ge1xuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBkb19wcm9jX3VpbnRfY29udl9taW5tYXggfSk7XG4mIzQzO1x0cmV0dXJuIHByb2NfZG91aW50dmVjX2NvbnYodGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLFxuJiM0MztcdFx0XHRcdCAgIGRvX3Byb2NfdWludF9jb252X21pbm1heCk7XG4gfVxuIFxuIC8qKlxuQEAgLTkzNSw4ICYjNDM7MTAwNCw3IEBAIGludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuIFx0XHR0bXAuZXh0cmEyID0gKHVuc2lnbmVkIGludCAqKSBcdTAwMjZtYXg7XG4gXG4gXHR2YWwgPSBSRUFEX09OQ0UoKmRhdGEpO1xuLVx0cmVzID0gZG9fcHJvY192ZWMoXHUwMDI2dG1wLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252X21pbm1heCB9KTtcbiYjNDM7XHRyZXMgPSBwcm9jX2RvdWludHZlY19taW5tYXgoXHUwMDI2dG1wLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcyk7XG4gXHRpZiAocmVzKVxuIFx0XHRyZXR1cm4gcmVzO1xuIFx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSlcbkBAIC0xMDY2LDggJiM0MzsxMTM0LDggQEAgaW50IHByb2NfZG91bG9uZ3ZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuIFx0XHRcdFx0aW50ICgqY29udikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCB1bG9uZyAqa19wdHIsXG4gXHRcdFx0XHRcdCAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkpXG4ge1xuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGNvbnYgfSk7XG4mIzQzO1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4mIzQzO1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBjb252IH0pO1xuIH1cbiBcbiAvKipcbkBAIC0xMDg3LDEwICYjNDM7MTE1NSwxMCBAQCBpbnQgcHJvY19kb3Vsb25ndmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4gICogUmV0dXJuczogJTAgb24gc3VjY2Vzcy5cbiAgKi9cbiBpbnQgcHJvY19kb3Vsb25ndmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi1cdFx0XHQgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuJiM0MztcdFx0dm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORyxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pO1xuJiM0MztcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLFxuJiM0MztcdFx0XHQodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pO1xuIH1cbiBcbiAvKipcbkBAIC0xMTE0LDggJiM0MzsxMTgyLDggQEAgaW50IHByb2NfZG9pbnR2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIHtcbiBcdGlmICghY29udilcbiBcdFx0Y29udiA9IGRvX3Byb2NfaW50X2NvbnY7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBjb252IH0pO1xuJiM0MztcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbiYjNDM7XHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBjb252IH0pO1xuIH1cbiBcbiAvKipcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaFxuaW5kZXggYjJkOGJkOTAyNmE3Mi4uZmRmM2QyZmIwYTJhZCAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcbkBAIC00LDYgJiM0Mzs0LDcgQEBcbiBcbiAjIFRoaXMgcGVyZm9ybXMgYSBzZXJpZXMgdGVzdHMgYWdhaW5zdCB0aGUgcHJvYyBzeXNjdGwgaW50ZXJmYWNlLlxuIFxuJiM0MzsjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIzMTdcbiAjIEtzZWxmdGVzdCBmcmFtZXdvcmsgcmVxdWlyZW1lbnQgLSBTS0lQIGNvZGUgaXMgNC5cbiBrc2Z0X3NraXA9NFxuIFxuQEAgLTM3LDYgJiM0MzszOCw3IEBAIEFMTF9URVNUUz1cJiMzNDskQUxMX1RFU1RTIDAwMDk6MToxOnVucmVnaXN0ZXJfZXJyb3I6MFwmIzM0O1xuIEFMTF9URVNUUz1cJiMzNDskQUxMX1RFU1RTIDAwMTA6MToxOm1udC9tbnRfZXJyb3I6MFwmIzM0O1xuIEFMTF9URVNUUz1cJiMzNDskQUxMX1RFU1RTIDAwMTE6MToxOmVtcHR5X2FkZDowXCYjMzQ7XG4gQUxMX1RFU1RTPVwmIzM0OyRBTExfVEVTVFMgMDAxMjoxOjE6dThfdmFsaWQ6MFwmIzM0O1xuJiM0MztBTExfVEVTVFM9XCYjMzQ7JEFMTF9URVNUUyAwMDEzOjE6MTppbnRfMDAwMzoxXCYjMzQ7XG4gXG4gZnVuY3Rpb24gYWxsb3dfdXNlcl9kZWZhdWx0cygpXG4ge1xuQEAgLTE5Niw2ICYjNDM7MTk4LDE4IEBAIHZlcmlmeV9kaWZmX3coKVxuIFx0cmV0dXJuICQ/XG4gfVxuIFxuJiM0MzsjIFZlcmlmeSB0aGF0IGFuIGVycm9uZW91cyAoJDIpIHVwZGF0ZSBmYWlscyBhbmQgZG9lcyBub3QgY2hhbmdlIFRBUkdFVFxuJiM0Mzt2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUoKVxuJiM0Mzt7XG4mIzQzO1x0VEVTVF9TVFI9XCYjMzQ7JDFcJiMzNDtcbiYjNDM7XHRlY2hvIC1uIFwmIzM0OyRURVNUX1NUUlwmIzM0OyBcdTAwM2UgXCYjMzQ7JFRBUkdFVFwmIzM0O1xuJiM0MztcbiYjNDM7XHRpZiBlY2hvIC1uIFwmIzM0OyQyXCYjMzQ7IFx1MDAzZSBcJiMzNDskVEFSR0VUXCYjMzQ7IDJcdTAwM2UgL2Rldi9udWxsOyB0aGVuXG4mIzQzO1x0XHRyZXR1cm4gMVxuJiM0MztcdGZpXG4mIzQzO1x0dmVyaWZ5X2RpZmZfdyBcJiMzNDske1RBUkdFVH1cJiMzNDtcbiYjNDM7fVxuJiM0MztcbiB0ZXN0X3JjKClcbiB7XG4gXHRpZiBbWyAkcmMgIT0gMCBdXTsgdGhlblxuQEAgLTUwMSw2ICYjNDM7NTE1LDQwIEBAIHJ1bl9saW1pdF9kaWdpdF9pbnRfYXJyYXkoKVxuIFx0dGVzdF9yY1xuIH1cbiBcbiYjNDM7IyBZb3UgdXNlZCBhbiBpbnQgYXJyYXkgYW5kIG9uZSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGFjY2VwdGFibGVcbiYjNDM7cnVuX2ludF9hcnJheV9ub19wYXJ0aWFsX3VwZGF0ZSgpXG4mIzQzO3tcbiYjNDM7XHRlY2hvIC1uIFwmIzM0O1Rlc3RpbmcgaW52YWxpZCBhcnJheSBlbGVtZW50IGRvZXMgbm90IHBhcnRpYWxseSB1cGRhdGUgLi4uIFwmIzM0O1xuJiM0MzsgICAgICAgICMgRXhwZWN0IGZhaWx1cmUgYmVjYXVzZSBvZiAzcmQgZWxlbWVudCAoYWJjKS5cbiYjNDM7XHRpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSBcJiMzNDsxIDIgMyA0XCYjMzQ7IFwmIzM0OzEwIDIwIGFiYyA0MFwmIzM0OzsgdGhlblxuJiM0MztcdFx0ZWNobyBcJiMzNDtGQUlMXCYjMzQ7IFx1MDAzZVx1MDAyNjJcbiYjNDM7XHRcdHJjPTFcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRlY2hvIFwmIzM0O09LXCYjMzQ7XG4mIzQzO1x0ZmlcbiYjNDM7XHR0ZXN0X3JjXG4mIzQzO1xuJiM0MztcdGVjaG8gLW4gXCYjMzQ7VGVzdGluZyBvdXQgb2YgcmFuZ2UgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCBwYXJ0aWFsbHkgdXBkYXRlIC4uLiBcJiMzNDtcbiYjNDM7ICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIGJlY2F1c2Ugb2YgM3JkIGVsZW1lbnQgKGdyZWF0ZXIgdGhhbiBpbnQpXG4mIzQzO1x0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXCYjMzQ7MSAyIDMgNFwmIzM0OyBcJiMzNDsxMCAyMCAkKChJTlRfTUFYICYjNDM7IDEpKSA0MFwmIzM0OzsgdGhlblxuJiM0MztcdFx0ZWNobyBcJiMzNDtGQUlMXCYjMzQ7IFx1MDAzZVx1MDAyNjJcbiYjNDM7XHRcdHJjPTFcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRlY2hvIFwmIzM0O09LXCYjMzQ7XG4mIzQzO1x0ZmlcbiYjNDM7XHR0ZXN0X3JjXG4mIzQzO1xuJiM0MztcdGVjaG8gLW4gXCYjMzQ7VGVzdGluZyBpbnZhbGlkIGZpcnN0IGFycmF5IGVsZW1lbnQgZG9lcyBub3QgdXBkYXRlIC4uLiBcJiMzNDtcbiYjNDM7ICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIG9mIDFzdCBlbGVtZW50XG4mIzQzO1x0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXCYjMzQ7MSAyIDMgNFwmIzM0OyBcJiMzNDthYmMgMjAgMzAgNDBcJiMzNDs7IHRoZW5cbiYjNDM7XHRcdGVjaG8gXCYjMzQ7RkFJTFwmIzM0OyBcdTAwM2VcdTAwMjYyXG4mIzQzO1x0XHRyYz0xXG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZWNobyBcJiMzNDtPS1wmIzM0O1xuJiM0MztcdGZpXG4mIzQzO1x0dGVzdF9yY1xuJiM0Mzt9XG4mIzQzO1xuICMgWW91IGFyZSB1c2luZyBhbiB1bnNpZ25lZCBpbnRcbiBydW5fbGltaXRfZGlnaXRfdWludCgpXG4ge1xuQEAgLTg4MCw2ICYjNDM7OTI4LDE0IEBAIHN5c2N0bF90ZXN0XzAwMTIoKVxuIFx0cmV0dXJuIDBcbiB9XG4gXG4mIzQzO3N5c2N0bF90ZXN0XzAwMTMoKVxuJiM0Mzt7XG4mIzQzO1x0VEFSR0VUPVwmIzM0OyR7U1lTQ1RMfS8kKGdldF90ZXN0X3RhcmdldCAwMDEzKVwmIzM0O1xuJiM0MztcdHJlc2V0X3ZhbHNcbiYjNDM7XG4mIzQzO1x0cnVuX2ludF9hcnJheV9ub19wYXJ0aWFsX3VwZGF0ZVxuJiM0Mzt9XG4mIzQzO1xuIGxpc3RfdGVzdHMoKVxuIHtcbiBcdGVjaG8gXCYjMzQ7VGVzdCBJRCBsaXN0OlwmIzM0O1xuQEAgLTkwMCw2ICYjNDM7OTU2LDcgQEAgbGlzdF90ZXN0cygpXG4gXHRlY2hvIFwmIzM0OzAwMTAgeCAkKGdldF90ZXN0X2NvdW50IDAwMTApIC0gdGVzdHMgc3lzY3QgbW91bnQgcG9pbnRcJiMzNDtcbiBcdGVjaG8gXCYjMzQ7MDAxMSB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMSkgLSB0ZXN0cyBlbXB0eSBkaXJlY3Rvcmllc1wmIzM0O1xuIFx0ZWNobyBcJiMzNDswMDEyIHggJChnZXRfdGVzdF9jb3VudCAwMDEyKSAtIHRlc3RzIHJhbmdlIGNoZWNrIGZvciB1OCBwcm9jX2hhbmRsZXJcJiMzNDtcbiYjNDM7XHRlY2hvIFwmIzM0OzAwMTMgeCAkKGdldF90ZXN0X2NvdW50IDAwMTMpIC0gdGVzdHMgcGFydGlhbGx5IHVwZGF0ZSB2ZWN0b3JzIG9uIGVycm9yXCYjMzQ7XG4gfVxuIFxuIHVzYWdlKClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtwcm9jX2RvaW50dmVjJiMzNDssCiAgICAmIzM0O3Byb2NfZG91aW50dmVjJiMzNDssCiAgICAmIzM0O3Byb2NfZG9pbnR2ZWNfbWlubWF4JiMzNDssCiAgICAmIzM0O3Byb2NfZG91aW50dmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWxvbmd2ZWNfbWlubWF4JiMzNDssCiAgICAmIzM0O3Byb2NfZG91OHZlY19taW5tYXgmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGNvcmUgc3lzY3RsIHZlY3RvciBwcm9jZXNzaW5nIGxvZ2ljIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIG9uIGVycm9yIGJ5IGFsbG9jYXRpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyLiBUaGlzIGFmZmVjdHMgYWxsIHN5c2N0bCBoYW5kbGVycyB0aGF0IHByb2Nlc3MgYXJyYXlzLiBGdXp6aW5nIGlzIG5lZWRlZCB0byBlbnN1cmUgY29ycmVjdCBlcnJvciBoYW5kbGluZywgbm8gbWVtb3J5IGxlYWtzLCBhbmQgbm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBkdXJpbmcgc3lzY3RsIHdyaXRlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGUyMDg2MjgzMWNlNzRhMmNiYWY2ZjYzZTkxZWM3ZThmMDQxZWVkMTYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IEF1ZyAxMyAxNTowMjo0NCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCBmN2I3NTk4NWQ1NDIwLi43ODdmNTNkNzA1MDdiIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3N5c2N0bC5jCkBAIC01OTUsNyAmIzQzOzU5NSw3IEBAIHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsCiBzdGF0aWMgY29uc3QgY2hhciBwcm9jX3dzcGFjZV9zZXBbXSA9IHsgJiMzOTsgJiMzOTssICYjMzk7XHQmIzM5OywgJiMzOTtcbiYjMzk7IH07CiAKIC8qCi0gKiBFbGVtZW50IHR5cGUgcHJvY2Vzc2VkIGJ5IGRvX3Byb2NfdmVjKCkuIFRoZSB0YWcgc2VsZWN0cyB0aGUgZWxlbWVudCBzaXplCiYjNDM7ICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBwcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZQogICogYW5kIHNpZ25lZG5lc3MsIGFuZCBpdCBzZWxlY3RzIHdoaWNoIG1lbWJlciBvZiB1bmlvbiBwcm9jX3ZlY19jb252IGlzIGxpdmUuCiAgKi8KIGVudW0gcHJvY192ZWNfdHlwZSB7CkBAIC02MDUsNyAmIzQzOzYwNSw3IEBAIGVudW0gcHJvY192ZWNfdHlwZSB7CiB9OwogCiAvKgotICogQ29udmVydGVyIHBhc3NlZCB0byBkb19wcm9jX3ZlYygpLiBPbmx5IHRoZSBtZW1iZXIgbWF0Y2hpbmcgdGhlCiYjNDM7ICogQ29udmVydGVyIHBhc3NlZCB0byBwcm9jX3ZlYygpLiBPbmx5IHRoZSBtZW1iZXIgbWF0Y2hpbmcgdGhlCiAgKiBlbnVtIHByb2NfdmVjX3R5cGUgdGFnIGlzIGV2ZXIgcmVhZCwgc28gZXZlcnkgZGlzcGF0Y2ggc3RheXMgZnVsbHkgdHlwZWQgYW5kCiAgKiBubyB2b2lkICogY29udmVydGVyIHBvaW50ZXIgaXMgbmVlZGVkLgogICovCkBAIC02MzcsMTAxICYjNDM7NjM3LDE2OCBAQCBzdGF0aWMgaW50IHByb2NfdmVjX2NvbnYoZW51bSBwcm9jX3ZlY190eXBlIHR5cGUsIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udiwKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotLyoKLSAqIFJlYWQvd3JpdGUgYSB2ZWN0b3Igb2YgQHR5cGUgZWxlbWVudHMuIFRoZSBlbGVtZW50IHNpemUgYW5kIHNpZ25lZG5lc3MgYXJlCi0gKiBkZXJpdmVkIGZyb20gQHR5cGUsIHNvIGEgc2luZ2xlIHJ1bnRpbWUgZnVuY3Rpb24gcmVwbGFjZXMgdGhlIHBlci10eXBlCi0gKiB2YXJpYW50cy4gdGFibGUtJmd0O2RhdGEgaXMgd2Fsa2VkIGFzIHJhdyBieXRlcyAoQGkpIGFkdmFuY2VkIGJ5IEBzaXplOyB0aGUKLSAqIGNvbnZlcnRlciBwZXJmb3JtcyB0aGUgYWN0dWFsIHR5cGVkIGxvYWQvc3RvcmUuCi0gKi8KLXN0YXRpYyBpbnQgZG9fcHJvY192ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCi0JCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zLAotCQkgICAgICAgZW51bSBwcm9jX3ZlY190eXBlIHR5cGUsIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udikKJiM0MztzdGF0aWMgaW50IGNvbW1pdF9jb252X3ZlYyhjb25zdCBlbnVtIHByb2NfdmVjX3R5cGUgZGF0YV90eXBlLCB2b2lkICpkc3QsCiYjNDM7CQkJICAgIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG5yKQogewotCWludCB2bGVmdCwgZmlyc3QgPSAxLCBlcnIgPSAwOwotCXNpemVfdCBsZWZ0LCBzaXplOwotCWJvb2wgaXNfdW5zaWduZWQ7Ci0JY2hhciAqaSwgKnA7CiYjNDM7CXNpemVfdCBpOwogCi0Jc3dpdGNoICh0eXBlKSB7CiYjNDM7CXN3aXRjaCAoZGF0YV90eXBlKSB7CiAJY2FzZSBQUk9DX1ZFQ19JTlQ6Ci0JCXNpemUgPSBzaXplb2YoaW50KTsKLQkJaXNfdW5zaWduZWQgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JY2FzZSBQUk9DX1ZFQ19VSU5UOgotCQlzaXplID0gc2l6ZW9mKHVpbnQpOwotCQlpc191bnNpZ25lZCA9IHRydWU7Ci0JCWJyZWFrOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlXUklURV9PTkNFKCgoaW50ICopZHN0KVtpXSwgKChjb25zdCBpbnQgKilzcmMpW2ldKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwogCWNhc2UgUFJPQ19WRUNfVUxPTkc6Ci0JCXNpemUgPSBzaXplb2YodWxvbmcpOwotCQlpc191bnNpZ25lZCA9IHRydWU7Ci0JCWJyZWFrOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlXUklURV9PTkNFKCgodWxvbmcgKilkc3QpW2ldLCAoKGNvbnN0IHVsb25nICopc3JjKVtpXSk7CiYjNDM7CQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiYjNDM7fQogCi0JaWYgKCF0YWJsZS0mZ3Q7ZGF0YSB8fCAhdGFibGUtJmd0O21heGxlbiB8fCAhKmxlbnAgfHwKLQkgICAgKCpwcG9zICZhbXA7JmFtcDsgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkgewotCQkqbGVucCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQotCWkgPSB0YWJsZS0mZ3Q7ZGF0YTsKLQl2bGVmdCA9IHRhYmxlLSZndDttYXhsZW4gLyBzaXplOwotCWxlZnQgPSAqbGVucDsKLQotCS8qIHVpbnQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLCAqRG8gbm90KiBhZGQgc3VwcG9ydCBmb3IgdGhlbS4gKi8KLQlpZiAodHlwZSA9PSBQUk9DX1ZFQ19VSU5UICZhbXA7JmFtcDsgdmxlZnQgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKSB7Ci0JCWlmIChwcm9jX2ZpcnN0X3Bvc19ub25femVyb19pZ25vcmUocHBvcywgdGFibGUpKQotCQkJZ290byBvdXQ7Ci0KLQkJaWYgKGxlZnQgJmd0OyBQQUdFX1NJWkUgLSAxKQotCQkJbGVmdCA9IFBBR0VfU0laRSAtIDE7Ci0JCXAgPSBidWZmZXI7CiYjNDM7LyoqCiYjNDM7ICogYXBwbHlfY29udl9vbl92ZWMgLSBBcHBseSBjb252ZXJ0ZXIgZnVuY3Rpb24gb24gZGF0YSB2ZWN0b3IKJiM0MzsgKgomIzQzOyAqIEVsZW1lbnQgc2lnbmVkbmVzcyBpcyBkZXJpdmVkIGZyb20gQGRhdGFfdHlwZS4gdGFibGUtJmd0O2RhdGEgaXMgd2Fsa2VkCiYjNDM7ICogYXMgcmF3IGJ5dGVzIChAZGF0YSkgYWR2YW5jZWQgYnkgQGRhdGFfc2l6ZTsgdGhlIGNvbnZlcnRlciBwZXJmb3JtcwomIzQzOyAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mCiYjNDM7ICogYnl0ZXMgdGhhdCB3aGVyZSBsZWZ0IG91dHN0YW5kaW5nIGFmdGVyIGNvbnZlcnNpb24uIENhbiBiZSAmZ3Q7IDAuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gTm9uLXplcm8gb24gZXJyb3IuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBhcHBseV9jb252X29uX3ZlYyhjb25zdCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsCiYjNDM7CQkJICAgICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwKJiM0MzsJCQkgICAgIGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsCiYjNDM7CQkJICAgICBjb25zdCBzaXplX3QgZGF0YV9zaXplLCBjb25zdCBpbnQgY29udl9kaXIsCiYjNDM7CQkJICAgICBjb25zdCBzaXplX3QgYnVmX25ieXRlLCB2b2lkICpidWYsCiYjNDM7CQkJICAgICBzaXplX3QgKmJ1Zl9sZWZ0X2ZpbmFsKQomIzQzO3sKJiM0MzsJaW50IHZlY19sZWZ0LCBlcnIgPSAwOwomIzQzOwlzaXplX3QgYnVmX2xlZnQsIG5yX2NvbnYgPSAwOwomIzQzOwljaGFyICpkYXRhLCAqZGF0YV9zdGFnZSA9IE5VTEwsICpwOwomIzQzOwlib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HOwomIzQzOwomIzQzOwlidWZfbGVmdCA9IGJ1Zl9uYnl0ZTsKJiM0MzsKJiM0MzsJZGF0YSA9IHRhYmxlLSZndDtkYXRhOwomIzQzOwlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHsKJiM0MzsJCWlmIChidWZfbGVmdCAmZ3Q7IFBBR0VfU0laRSAtIDEpCiYjNDM7CQkJYnVmX2xlZnQgPSBQQUdFX1NJWkUgLSAxOwomIzQzOwkJcCA9IGJ1ZjsKJiM0MzsKJiM0MzsJCWlmICh0YWJsZS0mZ3Q7bWF4bGVuICZndDsgZGF0YV9zaXplKSB7CiYjNDM7CQkJZGF0YV9zdGFnZSA9IGttZW1kdXAodGFibGUtJmd0O2RhdGEsIHRhYmxlLSZndDttYXhsZW4sIEdGUF9LRVJORUwpOwomIzQzOwkJCWlmICghZGF0YV9zdGFnZSkgewomIzQzOwkJCQllcnIgPSAtRU5PTUVNOwomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQl9CiYjNDM7CQkJZGF0YSA9IGRhdGFfc3RhZ2U7CiYjNDM7CQl9CiAJfQogCi0JZm9yICg7IGxlZnQgJmFtcDsmYW1wOyB2bGVmdC0tOyBpICYjNDM7PSBzaXplLCBmaXJzdCA9IDApIHsKJiM0MzsJdmVjX2xlZnQgPSB0YWJsZS0mZ3Q7bWF4bGVuIC8gZGF0YV9zaXplOwomIzQzOwlmb3IgKDsgYnVmX2xlZnQgJmFtcDsmYW1wOyB2ZWNfbGVmdC0tOyBkYXRhICYjNDM7PSBkYXRhX3NpemUsIG5yX2NvbnYmIzQzOyYjNDM7KSB7CiAJCXVuc2lnbmVkIGxvbmcgbHZhbDsKIAkJYm9vbCBuZWcgPSBmYWxzZTsKIAotCQlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKSB7Ci0JCQlwcm9jX3NraXBfc3BhY2VzKCZhbXA7cCwgJmFtcDtsZWZ0KTsKJiM0MzsJCWlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkgewomIzQzOwkJCXByb2Nfc2tpcF9zcGFjZXMoJmFtcDtwLCAmYW1wO2J1Zl9sZWZ0KTsKIAotCQkJaWYgKCFsZWZ0KQomIzQzOwkJCWlmICghYnVmX2xlZnQpCiAJCQkJYnJlYWs7Ci0JCQllcnIgPSBwcm9jX2dldF9sb25nKCZhbXA7cCwgJmFtcDtsZWZ0LCAmYW1wO2x2YWwsICZhbXA7bmVnLAomIzQzOwkJCWVyciA9IHByb2NfZ2V0X2xvbmcoJmFtcDtwLCAmYW1wO2J1Zl9sZWZ0LCAmYW1wO2x2YWwsICZhbXA7bmVnLAogCQkJCQkgICAgcHJvY193c3BhY2Vfc2VwLAogCQkJCQkgICAgc2l6ZW9mKHByb2Nfd3NwYWNlX3NlcCksIE5VTEwpOwogCQkJaWYgKCFlcnIgJmFtcDsmYW1wOyBuZWcgJmFtcDsmYW1wOyBpc191bnNpZ25lZCkKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJaWYgKGVycikKIAkJCQlicmVhazsKLQkJCWlmIChwcm9jX3ZlY19jb252KHR5cGUsIGNvbnYsICZhbXA7bmVnLCAmYW1wO2x2YWwsIGksIGRpciwgdGFibGUpKSB7CiYjNDM7CQkJaWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCAmYW1wO25lZywgJmFtcDtsdmFsLCBkYXRhLCBjb252X2RpciwgdGFibGUpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChwcm9jX3ZlY19jb252KHR5cGUsIGNvbnYsICZhbXA7bmVnLCAmYW1wO2x2YWwsIGksIGRpciwgdGFibGUpKSB7CiYjNDM7CQkJaWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCAmYW1wO25lZywgJmFtcDtsdmFsLCBkYXRhLCBjb252X2RpciwgdGFibGUpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmICghZmlyc3QpCi0JCQkJcHJvY19wdXRfY2hhcigmYW1wO2J1ZmZlciwgJmFtcDtsZWZ0LCAmIzM5O1x0JiMzOTspOwotCQkJcHJvY19wdXRfbG9uZygmYW1wO2J1ZmZlciwgJmFtcDtsZWZ0LCBsdmFsLCBuZWcpOwomIzQzOwkJCWlmIChucl9jb252KQomIzQzOwkJCQlwcm9jX3B1dF9jaGFyKCZhbXA7YnVmLCAmYW1wO2J1Zl9sZWZ0LCAmIzM5O1x0JiMzOTspOwomIzQzOwkJCXByb2NfcHV0X2xvbmcoJmFtcDtidWYsICZhbXA7YnVmX2xlZnQsIGx2YWwsIG5lZyk7CiAJCX0KIAl9CiAKLQlpZiAoU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpICZhbXA7JmFtcDsgIWZpcnN0ICZhbXA7JmFtcDsgbGVmdCAmYW1wOyZhbXA7ICFlcnIpCi0JCXByb2NfcHV0X2NoYXIoJmFtcDtidWZmZXIsICZhbXA7bGVmdCwgJiMzOTtcbiYjMzk7KTsKLQlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpICZhbXA7JmFtcDsgIWVyciAmYW1wOyZhbXA7IGxlZnQpCi0JCXByb2Nfc2tpcF9zcGFjZXMoJmFtcDtwLCAmYW1wO2xlZnQpOwotCWlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgJmFtcDsmYW1wOyBmaXJzdCkKLQkJcmV0dXJuIGVyciA/IDogLUVJTlZBTDsKLQkqbGVucCAtPSBsZWZ0OwomIzQzOwlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHsKJiM0MzsJCWlmICghZXJyICZhbXA7JmFtcDsgYnVmX2xlZnQpCiYjNDM7CQkJcHJvY19za2lwX3NwYWNlcygmYW1wO3AsICZhbXA7YnVmX2xlZnQpOwomIzQzOwkJaWYgKCFucl9jb252KSB7CiYjNDM7CQkJZXJyID0gZXJyID8gOiAtRUlOVkFMOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwkJaWYgKCFlcnIgJmFtcDsmYW1wOyBkYXRhX3N0YWdlKQomIzQzOwkJCWVyciA9IGNvbW1pdF9jb252X3ZlYyhkYXRhX3R5cGUsIHRhYmxlLSZndDtkYXRhLCBkYXRhX3N0YWdlLCBucl9jb252KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWlmIChucl9jb252ICZhbXA7JmFtcDsgYnVmX2xlZnQgJmFtcDsmYW1wOyAhZXJyKQomIzQzOwkJCXByb2NfcHV0X2NoYXIoJmFtcDtidWYsICZhbXA7YnVmX2xlZnQsICYjMzk7XG4mIzM5Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJKmJ1Zl9sZWZ0X2ZpbmFsID0gYnVmX2xlZnQ7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlrZnJlZShkYXRhX3N0YWdlKTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVhZC93cml0ZSBhIHZlY3RvciBvZiBAdHlwZSBlbGVtZW50cy4gKi8KJiM0MztzdGF0aWMgaW50IHByb2NfdmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiYjNDM7CQkgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLAomIzQzOwkJICAgIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udikKJiM0Mzt7CiYjNDM7CWludCBlcnIgPSAwOwomIzQzOwlzaXplX3QgZGF0YV9zaXplLCBsZWZ0X25ieXRlID0gU0laRV9NQVg7CiYjNDM7CiYjNDM7CXN3aXRjaCAodHlwZSkgewomIzQzOwljYXNlIFBST0NfVkVDX0lOVDoKJiM0MzsJCWRhdGFfc2l6ZSA9IHNpemVvZihpbnQpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUFJPQ19WRUNfVUlOVDoKJiM0MzsJCWRhdGFfc2l6ZSA9IHNpemVvZih1aW50KTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFBST0NfVkVDX1VMT05HOgomIzQzOwkJZGF0YV9zaXplID0gc2l6ZW9mKHVsb25nKTsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCF0YWJsZS0mZ3Q7ZGF0YSB8fCAhdGFibGUtJmd0O21heGxlbiB8fCAhKmxlbnAgfHwKJiM0MzsJICAgICgqcHBvcyAmYW1wOyZhbXA7IFNZU0NUTF9LRVJOX1RPX1VTRVIoZGlyKSkpIHsKJiM0MzsJCSpsZW5wID0gMDsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHsKJiM0MzsJCWlmIChwcm9jX2ZpcnN0X3Bvc19ub25femVyb19pZ25vcmUocHBvcywgdGFibGUpKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IGFwcGx5X2NvbnZfb25fdmVjKGNvbnYsIHRhYmxlLCB0eXBlLCBkYXRhX3NpemUsIGRpciwgKmxlbnAsIGJ1ZmZlciwKJiM0MzsJCQkJJmFtcDtsZWZ0X25ieXRlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQW4gdW5jaGFuZ2VkIGxlZnRfbmJ5dGUgc2lnbmFscyBhIHdyaXRlIHdpdGggbm8gcGFyc2VkIGVsZW1lbnQ7IHdoaWNoCiYjNDM7CSAqIGlzIGFuIGVycm9yLiBVc2luZyBTSVpFX01BWCB0byBkZXRlY3QgdGhpcyBlcnJvciBpcyBwb3NzaWJsZSBiZWNhdXNlOgomIzQzOwkgKiAxLiBsZW5wIGlzIGJvdW5kZWQgYnkgS01BTExPQ19NQVhfU0laRSBpbiBwcm9jX3N5c19jYWxsX2hhbmRsZXIKJiM0MzsJICogMi4gbGVucCBjb3VsZCBuZXZlciBiZSBTSVpFX01BWCBhcyBpdCBpcyBhICYjMzQ7cmlkaWN1bG91cyYjMzQ7IChleGFieXRlKSBhbGxvY2F0aW9uLgomIzQzOwkgKi8KJiM0MzsJaWYgKGxlZnRfbmJ5dGUgPT0gU0laRV9NQVgpCiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwomIzQzOwkqbGVucCAtPSBsZWZ0X25ieXRlOwogb3V0OgogCSpwcG9zICYjNDM7PSAqbGVucDsKJiM0MzsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC03NTYsMTIgJiM0Mzs4MjMsMTUgQEAgaW50IHByb2NfZG91aW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwKIAkJCWludCAoKmNvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWludCAqa19wdHIsCiAJCQkJICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKSkKIHsKJiM0MzsJLyogdWludCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQsICpEbyBub3QqIGFkZCBzdXBwb3J0IGZvciB0aGVtLiAqLwomIzQzOwlpZiAodGFibGUtJmd0O21heGxlbiAmYW1wOyZhbXA7ICh0YWJsZS0mZ3Q7bWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIWNvbnYpCiAJCWNvbnYgPSBkb19wcm9jX3VpbnRfY29udjsKIAotCXJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pOwomIzQzOwlyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGNvbnYgfSk7CiB9CiAKIC8qKgpAQCAtODIwLDggJiM0Mzs4OTAsOCBAQCBpbnQgcHJvY19kb2Jvb2woY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwKIGludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiAJCSAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULAotCQkJICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252IH0pOwomIzQzOwlyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsCiYjNDM7CQkJKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252IH0pOwogfQogCiAvKioKQEAgLTg0MCw4ICYjNDM7OTEwLDcgQEAgaW50IHByb2NfZG9pbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwKIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLAogCQlzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLQlyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULAotCQkJICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnYgfSk7CiYjNDM7CXJldHVybiBwcm9jX2RvdWludHZlY19jb252KHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgZG9fcHJvY191aW50X2NvbnYpOwogfQogCiAvKioKQEAgLTg2NCw4ICYjNDM7OTMzLDggQEAgaW50IHByb2NfZG91aW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCiAJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLQlyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pOwomIzQzOwlyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsCiYjNDM7CQkJKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252X21pbm1heCB9KTsKIH0KIAogLyoqCkBAIC04OTEsOCAmIzQzOzk2MCw4IEBAIGludCBwcm9jX2RvaW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwKIGludCBwcm9jX2RvdWludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCiAJCQkgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCwKLQkJCSAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252X21pbm1heCB9KTsKJiM0MzsJcmV0dXJuIHByb2NfZG91aW50dmVjX2NvbnYodGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLAomIzQzOwkJCQkgICBkb19wcm9jX3VpbnRfY29udl9taW5tYXgpOwogfQogCiAvKioKQEAgLTkzNSw4ICYjNDM7MTAwNCw3IEBAIGludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAogCQl0bXAuZXh0cmEyID0gKHVuc2lnbmVkIGludCAqKSAmYW1wO21heDsKIAogCXZhbCA9IFJFQURfT05DRSgqZGF0YSk7Ci0JcmVzID0gZG9fcHJvY192ZWMoJmFtcDt0bXAsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULAotCQkJICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBkb19wcm9jX3VpbnRfY29udl9taW5tYXggfSk7CiYjNDM7CXJlcyA9IHByb2NfZG91aW50dmVjX21pbm1heCgmYW1wO3RtcCwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CiAJaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkKQEAgLTEwNjYsOCAmIzQzOzExMzQsOCBAQCBpbnQgcHJvY19kb3Vsb25ndmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCiAJCQkJaW50ICgqY29udikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCB1bG9uZyAqa19wdHIsCiAJCQkJCSAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gY29udiB9KTsKJiM0MzsJcmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsCiYjNDM7CQkJKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGNvbnYgfSk7CiB9CiAKIC8qKgpAQCAtMTA4NywxMCAmIzQzOzExNTUsMTAgQEAgaW50IHByb2NfZG91bG9uZ3ZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAogICogUmV0dXJuczogJTAgb24gc3VjY2Vzcy4KICAqLwogaW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCi0JCQkgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQomIzQzOwkJdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLQlyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORywKLQkJCSAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBkb19wcm9jX3Vsb25nX2NvbnYgfSk7CiYjNDM7CXJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBkb19wcm9jX3Vsb25nX2NvbnYgfSk7CiB9CiAKIC8qKgpAQCAtMTExNCw4ICYjNDM7MTE4Miw4IEBAIGludCBwcm9jX2RvaW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwKIHsKIAlpZiAoIWNvbnYpCiAJCWNvbnYgPSBkb19wcm9jX2ludF9jb252OwotCXJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCwKLQkJCSAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gY29udiB9KTsKJiM0MzsJcmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gY29udiB9KTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaAppbmRleCBiMmQ4YmQ5MDI2YTcyLi5mZGYzZDJmYjBhMmFkIDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2gKQEAgLTQsNiAmIzQzOzQsNyBAQAogCiAjIFRoaXMgcGVyZm9ybXMgYSBzZXJpZXMgdGVzdHMgYWdhaW5zdCB0aGUgcHJvYyBzeXNjdGwgaW50ZXJmYWNlLgogCiYjNDM7IyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMzE3CiAjIEtzZWxmdGVzdCBmcmFtZXdvcmsgcmVxdWlyZW1lbnQgLSBTS0lQIGNvZGUgaXMgNC4KIGtzZnRfc2tpcD00CiAKQEAgLTM3LDYgJiM0MzszOCw3IEBAIEFMTF9URVNUUz0mIzM0OyRBTExfVEVTVFMgMDAwOToxOjE6dW5yZWdpc3Rlcl9lcnJvcjowJiMzNDsKIEFMTF9URVNUUz0mIzM0OyRBTExfVEVTVFMgMDAxMDoxOjE6bW50L21udF9lcnJvcjowJiMzNDsKIEFMTF9URVNUUz0mIzM0OyRBTExfVEVTVFMgMDAxMToxOjE6ZW1wdHlfYWRkOjAmIzM0OwogQUxMX1RFU1RTPSYjMzQ7JEFMTF9URVNUUyAwMDEyOjE6MTp1OF92YWxpZDowJiMzNDsKJiM0MztBTExfVEVTVFM9JiMzNDskQUxMX1RFU1RTIDAwMTM6MToxOmludF8wMDAzOjEmIzM0OwogCiBmdW5jdGlvbiBhbGxvd191c2VyX2RlZmF1bHRzKCkKIHsKQEAgLTE5Niw2ICYjNDM7MTk4LDE4IEBAIHZlcmlmeV9kaWZmX3coKQogCXJldHVybiAkPwogfQogCiYjNDM7IyBWZXJpZnkgdGhhdCBhbiBlcnJvbmVvdXMgKCQyKSB1cGRhdGUgZmFpbHMgYW5kIGRvZXMgbm90IGNoYW5nZSBUQVJHRVQKJiM0Mzt2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUoKQomIzQzO3sKJiM0MzsJVEVTVF9TVFI9JiMzNDskMSYjMzQ7CiYjNDM7CWVjaG8gLW4gJiMzNDskVEVTVF9TVFImIzM0OyAmZ3Q7ICYjMzQ7JFRBUkdFVCYjMzQ7CiYjNDM7CiYjNDM7CWlmIGVjaG8gLW4gJiMzNDskMiYjMzQ7ICZndDsgJiMzNDskVEFSR0VUJiMzNDsgMiZndDsgL2Rldi9udWxsOyB0aGVuCiYjNDM7CQlyZXR1cm4gMQomIzQzOwlmaQomIzQzOwl2ZXJpZnlfZGlmZl93ICYjMzQ7JHtUQVJHRVR9JiMzNDsKJiM0Mzt9CiYjNDM7CiB0ZXN0X3JjKCkKIHsKIAlpZiBbWyAkcmMgIT0gMCBdXTsgdGhlbgpAQCAtNTAxLDYgJiM0Mzs1MTUsNDAgQEAgcnVuX2xpbWl0X2RpZ2l0X2ludF9hcnJheSgpCiAJdGVzdF9yYwogfQogCiYjNDM7IyBZb3UgdXNlZCBhbiBpbnQgYXJyYXkgYW5kIG9uZSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGFjY2VwdGFibGUKJiM0MztydW5faW50X2FycmF5X25vX3BhcnRpYWxfdXBkYXRlKCkKJiM0Mzt7CiYjNDM7CWVjaG8gLW4gJiMzNDtUZXN0aW5nIGludmFsaWQgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCBwYXJ0aWFsbHkgdXBkYXRlIC4uLiAmIzM0OwomIzQzOyAgICAgICAgIyBFeHBlY3QgZmFpbHVyZSBiZWNhdXNlIG9mIDNyZCBlbGVtZW50IChhYmMpLgomIzQzOwlpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSAmIzM0OzEgMiAzIDQmIzM0OyAmIzM0OzEwIDIwIGFiYyA0MCYjMzQ7OyB0aGVuCiYjNDM7CQllY2hvICYjMzQ7RkFJTCYjMzQ7ICZndDsmYW1wOzIKJiM0MzsJCXJjPTEKJiM0MzsJZWxzZQomIzQzOwkJZWNobyAmIzM0O09LJiMzNDsKJiM0MzsJZmkKJiM0MzsJdGVzdF9yYwomIzQzOwomIzQzOwllY2hvIC1uICYjMzQ7VGVzdGluZyBvdXQgb2YgcmFuZ2UgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCBwYXJ0aWFsbHkgdXBkYXRlIC4uLiAmIzM0OwomIzQzOyAgICAgICAgIyBFeHBlY3QgZmFpbHVyZSBiZWNhdXNlIG9mIDNyZCBlbGVtZW50IChncmVhdGVyIHRoYW4gaW50KQomIzQzOwlpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSAmIzM0OzEgMiAzIDQmIzM0OyAmIzM0OzEwIDIwICQoKElOVF9NQVggJiM0MzsgMSkpIDQwJiMzNDs7IHRoZW4KJiM0MzsJCWVjaG8gJiMzNDtGQUlMJiMzNDsgJmd0OyZhbXA7MgomIzQzOwkJcmM9MQomIzQzOwllbHNlCiYjNDM7CQllY2hvICYjMzQ7T0smIzM0OwomIzQzOwlmaQomIzQzOwl0ZXN0X3JjCiYjNDM7CiYjNDM7CWVjaG8gLW4gJiMzNDtUZXN0aW5nIGludmFsaWQgZmlyc3QgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCB1cGRhdGUgLi4uICYjMzQ7CiYjNDM7ICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIG9mIDFzdCBlbGVtZW50CiYjNDM7CWlmICEgdmVyaWZ5X25vX3BhcnRpYWxfdXBkYXRlICYjMzQ7MSAyIDMgNCYjMzQ7ICYjMzQ7YWJjIDIwIDMwIDQwJiMzNDs7IHRoZW4KJiM0MzsJCWVjaG8gJiMzNDtGQUlMJiMzNDsgJmd0OyZhbXA7MgomIzQzOwkJcmM9MQomIzQzOwllbHNlCiYjNDM7CQllY2hvICYjMzQ7T0smIzM0OwomIzQzOwlmaQomIzQzOwl0ZXN0X3JjCiYjNDM7fQomIzQzOwogIyBZb3UgYXJlIHVzaW5nIGFuIHVuc2lnbmVkIGludAogcnVuX2xpbWl0X2RpZ2l0X3VpbnQoKQogewpAQCAtODgwLDYgJiM0Mzs5MjgsMTQgQEAgc3lzY3RsX3Rlc3RfMDAxMigpCiAJcmV0dXJuIDAKIH0KIAomIzQzO3N5c2N0bF90ZXN0XzAwMTMoKQomIzQzO3sKJiM0MzsJVEFSR0VUPSYjMzQ7JHtTWVNDVEx9LyQoZ2V0X3Rlc3RfdGFyZ2V0IDAwMTMpJiMzNDsKJiM0MzsJcmVzZXRfdmFscwomIzQzOwomIzQzOwlydW5faW50X2FycmF5X25vX3BhcnRpYWxfdXBkYXRlCiYjNDM7fQomIzQzOwogbGlzdF90ZXN0cygpCiB7CiAJZWNobyAmIzM0O1Rlc3QgSUQgbGlzdDomIzM0OwpAQCAtOTAwLDYgJiM0Mzs5NTYsNyBAQCBsaXN0X3Rlc3RzKCkKIAllY2hvICYjMzQ7MDAxMCB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMCkgLSB0ZXN0cyBzeXNjdCBtb3VudCBwb2ludCYjMzQ7CiAJZWNobyAmIzM0OzAwMTEgeCAkKGdldF90ZXN0X2NvdW50IDAwMTEpIC0gdGVzdHMgZW1wdHkgZGlyZWN0b3JpZXMmIzM0OwogCWVjaG8gJiMzNDswMDEyIHggJChnZXRfdGVzdF9jb3VudCAwMDEyKSAtIHRlc3RzIHJhbmdlIGNoZWNrIGZvciB1OCBwcm9jX2hhbmRsZXImIzM0OwomIzQzOwllY2hvICYjMzQ7MDAxMyB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMykgLSB0ZXN0cyBwYXJ0aWFsbHkgdXBkYXRlIHZlY3RvcnMgb24gZXJyb3ImIzM0OwogfQogCiB1c2FnZSgpCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjAyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc2MjUKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiA3MjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBTeXNjdGwgUGF0Y2ggZm9yIEZ1enppbmcgT3Bwb3J0dW5pdGllcyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgdGhpcyBwYXRjaCB0aGF0JiMzOTtzIGZ1bmRhbWVudGFsbHkgY2hhbmdpbmcgaG93IHN5c2N0bCBhcnJheXMgYXJlIGhhbmRsZWQgZHVyaW5nIHdyaXRlcyBpbiBga2VybmVsL3N5c2N0bC5jYC4gIFNwZWNpZmljYWxseSwgaXQmIzM5O3MgbW9kaWZ5aW5nIHRoZSBgZG9fcHJvY192ZWNgIGZ1bmN0aW9uLCByZW5hbWluZyBpdCB0byBgYXBwbHlfY29udl9vbl92ZWNgIGFuZCBgcHJvY192ZWNgLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgcHJvY2Vzc2luZyBzeXNjdGwgdmVjdG9ycyDigJMgdGhvc2UgYXJyYXlzIG9mIGludHMsIHVpbnRzLCB1bG9uZ3Mgd2UgYWxsIGtub3cgYW5kIGxvdmUgKG9yIGF0IGxlYXN0LCB0b2xlcmF0ZSkuICBUaGUgY29yZSBjaGFuZ2UgaGVyZSBpcyBhYm91dCBhdG9taWNpdHk6IHRoZSBvbGQgY29kZSB3b3VsZCBjb21taXQgZWxlbWVudHMgaW4gdGhlIGFycmF5ICpiZWZvcmUqIGEgZmFpbHVyZSwgbGVhZGluZyB0byBwYXJ0aWFsIHVwZGF0ZXMuICBUaGlzIG5ldyBjb2RlLCB0aGFua2Z1bGx5LCB1c2VzIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGRhdGFfc3RhZ2VgKSB0byBzdGFnZSB0aGUgY29udmVyc2lvbiBhbmQgb25seSBjb21taXRzIGlmIGV2ZXJ5dGhpbmcgZ29lcyBzbW9vdGhseS4gIEdvb2QgZm9yIGNvbnNpc3RlbmN5LCBidXQgYWxzbyBpbnRlcmVzdGluZyBmcm9tIGEgdnVsbmVyYWJpbGl0eSBwZXJzcGVjdGl2ZS4KClRoZSBmaXJzdCBxdWVzdGlvbjogaXMgdGhpcyByZWFjaGFibGUsIGFuZCBpcyBpdCB3b3J0aCBmdXp6aW5nPyAgV2VsbCwgc3lzY3RsIHdyaXRlcyBhcmUgKmFic29sdXRlbHkqIHJlYWNoYWJsZSwgYW5kIEkga25vdyBzeXprYWxsZXIgaGl0cyB0aGVtIHByZXR0eSBoYXJkLiBTbywgeWVzLCBpdCYjMzk7cyB3b3J0aCBpdC4gIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBrZXkgZnVuY3Rpb25zIG1vZGlmaWVkLiAgTG9va3MgbGlrZSBpdCYjMzk7cyByZWFsbHkgdGhlIG9uZXMgSSBtZW50aW9uZWQsIHBsdXMgdGhlc2U6IGBjb21taXRfY29udl92ZWNgLCBgcHJvY19kb3VpbnR2ZWNfY29udmAsIGBwcm9jX2RvaW50dmVjYCwgYHByb2NfZG91aW50dmVjYCwgYHByb2NfZG9pbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91aW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfY29udmAsIGBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4YCwgYHByb2NfZG9pbnR2ZWNfY29udmAuCgpNeSBuZXh0IHRob3VnaHQgaXMgdG8gZm9jdXMgdGhlIGZ1enppbmcgZWZmb3J0LiAgTGV0JiMzOTtzIHNlZTogYHByb2NfZG9pbnR2ZWNgLCBgcHJvY19kb3VpbnR2ZWNgLCBgcHJvY19kb2ludHZlY19taW5tYXhgLCBgcHJvY19kb3VpbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91bG9uZ3ZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX2NvbnZgLCBgcHJvY19kb2ludHZlY19jb252YC4gVGhlc2UgYXJlICpleHBvcnRlZCogc3lzY3RsIGhhbmRsZXJzLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgSSYjMzk7bSBsb29raW5nIGZvci4gIFdhaXQgYSBtaW51dGUsIHN5emthbGxlciBmdXp6ZXMgc3lzY3RscyB1c2luZyBgb3BlbmAvYHdyaXRlYCBjYWxscyB0byBgL3Byb2Mvc3lzLy4uLmAuIFRoaXMgaXMgaW1wb3J0YW50LCBhcyB0aGVzZSBjYWxscyBhcmUgaGFuZGxlZCBieSBgcHJvY19zeXNfY2FsbF9oYW5kbGVyYCB3aGljaCBldmVudHVhbGx5IHVzZXMgYHRhYmxlLSZndDtwcm9jX2hhbmRsZXJgLiAgU28sICp0aGVzZSogZnVuY3Rpb25zLCB0aGUgb25lcyBJIGp1c3QgbGlzdGVkLCBhcmUgbGlrZWx5IHRoZSBhY3R1YWwgaGFuZGxlcnMgYmVpbmcgY2FsbGVkLgoKTGV0JiMzOTtzIHF1aWNrbHkgdmVyaWZ5IHRoYXQgbGlzdDogYHByb2NfZG9pbnR2ZWNgLCBgcHJvY19kb3VpbnR2ZWNgLCBgcHJvY19kb2ludHZlY19taW5tYXhgLCBgcHJvY19kb3VpbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91bG9uZ3ZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX2NvbnZgLCBgcHJvY19kb2ludHZlY19jb252YC4gUGVyZmVjdC4KCk5vIHNwZWNpZmljIGNvbmZpZ3MgdG8gd29ycnkgYWJvdXQsIGl0JiMzOTtzIGNvcmUga2VybmVsIGZ1bmN0aW9uYWxpdHkuCgpKdXN0IHRvIGJlIGFic29sdXRlbHkgc3VyZSwgbGV0IG1lIHRha2UgYW5vdGhlciBsb29rIGF0IHRoZSBwYXRjaCBpdHNlbGYuIEkgd2FudCB0byBkb3VibGUtY2hlY2sgdGhhdCBgYXBwbHlfY29udl9vbl92ZWNgIGlzIHRoZSBjZW50cmFsIGNvbXBvbmVudC4gWWVzLCBhbmQgaXQmIzM5O3Mgc3RhdGljLiAgVGhlIGV4cG9ydGVkIGhhbmRsZXJzIGFyZSB0aGUgb25lcyBJIGlkZW50aWZpZWQ6IGBwcm9jX2RvaW50dmVjYCwgYHByb2NfZG91aW50dmVjYCwgYHByb2NfZG9pbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91aW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4YCwgYHByb2NfZG91bG9uZ3ZlY19jb252YCwgYHByb2NfZG9pbnR2ZWNfY29udmAuIEkgbmVlZCB0byBjb25maXJtIHRoZXNlIGFyZSB0cnVseSBleHBvcnRlZC4gVGhpcyBjb25maXJtcyB0aGUgYXR0YWNrIHN1cmZhY2UgSSBpZGVudGlmaWVkLiBOb3csIGxldCYjMzk7cyBnZXQgdG8gd29yayEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFBPUlRfU1lNQk9MLipcXChwcm9jX2RvaW50dmVjJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYz0xNTI1PUVYUE9SVF9TWU1CT0wocHJvY19kb2Jvb2wpO1xua2VybmVsL3N5c2N0bC5jOjE1MjY6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjKTtcbmtlcm5lbC9zeXNjdGwuYy0xNTI3LUVYUE9SVF9TWU1CT0wocHJvY19kb3VpbnR2ZWMpO1xua2VybmVsL3N5c2N0bC5jOjE1Mjg6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX21pbm1heCk7XG5rZXJuZWwvc3lzY3RsLmMtMTUyOS1FWFBPUlRfU1lNQk9MX0dQTChwcm9jX2RvdWludHZlY19taW5tYXgpO1xuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYz0yNTQ9aW50IHByb2NfZG9pbnR2ZWNfamlmZmllcyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi0tXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjU5LX1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYzoyNjA6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX2ppZmZpZXMpO1xua2VybmVsL3RpbWUvamlmZmllcy5jLTI2MS1cbi0tXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9Mjc3PWludCBwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yODItfVxua2VybmVsL3RpbWUvamlmZmllcy5jOjI4MzpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMpO1xua2VybmVsL3RpbWUvamlmZmllcy5jLTI4NC1cbi0tXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9MzAwPWludCBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbi0tXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzA1LX1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYzozMDY6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMpO1xua2VybmVsL3RpbWUvamlmZmllcy5jLTMwNy1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NTY4CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMjAxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBTeXNjdGwgQXJyYXkgV3JpdGUgUGF0Y2gqKgoKT2theSwgc28gdGhpcyBwYXRjaCBpcyBhIGdvb2Qgb25lLiBJdCYjMzk7cyBmdW5kYW1lbnRhbGx5IGNoYW5naW5nIGhvdyBgc3lzY3RsYCBoYW5kbGVzIHdyaXRlcyB0byBhcnJheXMsIHNwZWNpZmljYWxseSB0byBhdm9pZCBwYXJ0aWFsIHVwZGF0ZXMuIFRoZSBhcHByb2FjaCBvZiBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciwgY29udmVydGluZyB0aGUgZWxlbWVudHMgdGhlcmUsIGFuZCBvbmx5IGNvbW1pdHRpbmcgdGhlIGNoYW5nZXMgaWYgZXZlcnl0aGluZyBzdWNjZWVkcyBpcyBzbWFydC4gSXQmIzM5O3MgYSBjbGFzc2ljIHRyYW5zYWN0aW9uYWwgYXBwcm9hY2gsIHJlYWxseS4gUHJldmVudHMgaW5jb25zaXN0ZW50IHN0YXRlIGFuZCBtaXRpZ2F0ZXMgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGludGVycnVwdGVkIHdyaXRlIG9wZXJhdGlvbnMuCgpTaW5jZSB0aGlzIGFmZmVjdHMgYWxsIGBzeXNjdGxgIGhhbmRsZXJzIHRoYXQgZGVhbCB3aXRoIHZlY3RvcnMg4oCTIHRoYXQgaXMsIGFueSBhcnJheSBvciBsaXN0IG9mIHZhbHVlcyDigJMgaXQgaGFzIGEgd2lkZSBpbXBhY3QuIE15IGZpcnN0IHRob3VnaHQgaXM6ICoqYWJzb2x1dGVseSBmdXp6IHRoaXMhKiogV2UgbmVlZCB0byB0aHJvdyBldmVyeXRoaW5nIHdlIGNhbiBhdCBpdC4gIEkmIzM5O20gcGFydGljdWxhcmx5IHdvcnJpZWQgYWJvdXQgbWVtb3J5IGxlYWtzLCBlc3BlY2lhbGx5IHdpdGhpbiBgYXBwbHlfY29udl9vbl92ZWNgLiBga21lbWR1cGAgaXMgYSBwcmltZSBzdXNwZWN0IOKAkyBwb3RlbnRpYWwgZm9yIGxlYWtzIGlmIHRoaW5ncyBnbyB3cm9uZy4gT3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBhcmUgYW5vdGhlciBodWdlIGNvbmNlcm4sIGFuZCB3ZSBuZWVkIHRvIHZlcmlmeSB0aGUgZXJyb3IgaGFuZGxpbmcgaXMgcm9idXN0LiBBbnkgd2Vha25lc3MgaGVyZSBjb3VsZCBiZSBleHBsb2l0ZWQuCgpJIHNob3VsZCBmb2N1cyBvbiB0aGVzZSBzeW1ib2xzOiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfY29udmAsIGFuZCBgcHJvY19kb2ludHZlY19jb252YC4gVGhvc2UgYXJlIGNsZWFybHkgdGhlIGNvcmUgZnVuY3Rpb25zIGludm9sdmVkIGluIHRoZXNlIHZlY3RvciBvcGVyYXRpb25zLgoKV2FpdCBhIHNlY29uZOKApiBgcHJvY19kb3VpbnR2ZWNfY29udmAgaXMgZXhwb3J0ZWQ/IFRoYXTigJlzIGludGVyZXN0aW5nLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB3aGVyZSB0aGF04oCZcyBiZWluZyB1c2VkLiBJIG5lZWQgdG8gY2hlY2sgaXRzIGV4cG9ydCB0byBzZWUgd2hhdCB0aGF0IGltcGxpZXMuIFRoaXMgZGVmaW5pdGVseSB3YXJyYW50cyBmdXJ0aGVyIGludmVzdGlnYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFBPUlRfU1lNQk9MLipcXChwcm9jX2RvdWludHZlY19jb252JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDE1OAoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6CgoqKkNoZWNraW5nIEZ1bmN0aW9uIEV4cG9ydCBTdGF0dXMqKgoKT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgYHByb2NfZG91aW50dmVjX2NvbnZgIGlzIGFuIGV4cG9ydGVkIGZ1bmN0aW9uLiBIbW0sIGl0IGRvZXNuJiMzOTt0ICpzZWVtKiBsaWtlIGl0IGlzLiBCdXQgbGV0JiMzOTtzIG5vdCBqdW1wIHRvIGNvbmNsdXNpb25zLiBJdCYjMzk7cyBlYXN5IHRvIGdldCBmdW5jdGlvbnMgbWl4ZWQgdXAsIHNvIEkmIzM5O2QgYmV0dGVyIGJlIGFic29sdXRlbHkgY2VydGFpbiBiZWZvcmUgSSBtYWtlIGEgZGVjaXNpb24uIExldCYjMzk7cyBub3QgYXNzdW1lIGFueXRoaW5nLiBPa2F5LCBsZXQmIzM5O3MganVzdCBtYWtlIGEgcXVpY2sgY2hlY2sgb2YgYHByb2NfZG91bG9uZ3ZlY19jb252YC4gSSBoYXZlIGEgZmVlbGluZyB0aGVyZSBtaWdodCBiZSBhIHJlbGF0aW9uIHRoYXQgbmVlZHMgdW50YW5nbGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0VYUE9SVF9TWU1CT0wuKlxcKHByb2NfZG91bG9uZ3ZlY19jb252JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDM2MwoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIEkmIzM5O20gcmVhZHkgdG8gZGl2ZSBpbnRvIHRoYXQgJiMzNDtleHBvcnRlZCYjMzQ7IHNpdHVhdGlvbi4gSGVyZSYjMzk7cyBteSB0YWtlOgoKKipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgdGhlIEV4cG9ydGVkIERhdGEqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBGaXJzdCB0aGluZyYjMzk7cyBmaXJzdDogSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0ICpleGFjdGx5KiB3aGF0JiMzOTtzIGJlZW4gZXhwb3J0ZWQuIEl0JiMzOTtzIGNydWNpYWwsIGF0IHRoaXMgc3RhZ2UsIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIGFuZCBuYXR1cmUgb2YgdGhlIGRhdGEgaW52b2x2ZWQuIEkgbmVlZCB0byBiZSBtZXRob2RpY2FsIGhlcmUuIEkmIzM5O2xsIG5lZWQgdG8gaWRlbnRpZnkgdGhlIGtleSB2YXJpYWJsZXMsIHRoZSBmb3JtYXRzIGJlaW5nIHVzZWQsIGFueSBwb3RlbnRpYWwgYmlhc2VzIGludHJvZHVjZWQgZHVyaW5nIHRoZSBleHBvcnQgcHJvY2VzcyBhbmQgdGhlaXIgaW1wbGljYXRpb25zLCB3aGV0aGVyIHRoZSBkYXRhIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGVzaXJlZCBleHBvcnQgb3IgaWYgYW55IGZpZWxkcyBhcmUgb21pdHRlZC4gT25jZSBJIGdyYXNwIHRoZSByYXcgY29udGVudHMsIEkgY2FuIHN0YXJ0IHRvIGZvcm11bGF0ZSBtb3JlIG1lYW5pbmdmdWwgcXVlc3Rpb25zIGFib3V0IGl0cyBzdWl0YWJpbGl0eSBmb3Igb3VyIHB1cnBvc2VzLiBVbHRpbWF0ZWx5LCBpdCYjMzk7cyBhYm91dCBtYWtpbmcgc3VyZSB3ZSYjMzk7cmUgc3RhcnRpbmcgd2l0aCBhIHNvbGlkIGZvdW5kYXRpb24gYmVmb3JlIHdlIHN0YXJ0IG1hbmlwdWxhdGluZyBvciBhbmFseXppbmcgdGhlIGRhdGEuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0VYUE9SVF9TWU1CT0wuKlxcKHByb2NfZC4qdmVjJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYz05ODU9aW50IHByb2NfZG91OHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4tLVxua2VybmVsL3N5c2N0bC5jLTEwMTMtfVxua2VybmVsL3N5c2N0bC5jOjEwMTQ6RVhQT1JUX1NZTUJPTF9HUEwocHJvY19kb3U4dmVjX21pbm1heCk7XG5rZXJuZWwvc3lzY3RsLmMtMTAxNS1cbi0tXG5rZXJuZWwvc3lzY3RsLmM9MTUyNT1FWFBPUlRfU1lNQk9MKHByb2NfZG9ib29sKTtcbmtlcm5lbC9zeXNjdGwuYzoxNTI2OkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlYyk7XG5rZXJuZWwvc3lzY3RsLmM6MTUyNzpFWFBPUlRfU1lNQk9MKHByb2NfZG91aW50dmVjKTtcbmtlcm5lbC9zeXNjdGwuYzoxNTI4OkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY19taW5tYXgpO1xua2VybmVsL3N5c2N0bC5jOjE1Mjk6RVhQT1JUX1NZTUJPTF9HUEwocHJvY19kb3VpbnR2ZWNfbWlubWF4KTtcbmtlcm5lbC9zeXNjdGwuYy0xNTMwLUVYUE9SVF9TWU1CT0wocHJvY19kb3N0cmluZyk7XG5rZXJuZWwvc3lzY3RsLmM6MTUzMTpFWFBPUlRfU1lNQk9MKHByb2NfZG91bG9uZ3ZlY19taW5tYXgpO1xua2VybmVsL3N5c2N0bC5jLTE1MzItRVhQT1JUX1NZTUJPTChwcm9jX2RvX2xhcmdlX2JpdG1hcCk7XG4tLVxua2VybmVsL3RpbWUvamlmZmllcy5jPTI1ND1pbnQgcHJvY19kb2ludHZlY19qaWZmaWVzKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yNTktfVxua2VybmVsL3RpbWUvamlmZmllcy5jOjI2MDpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfamlmZmllcyk7XG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjYxLVxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYz0yNzc9aW50IHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4tLVxua2VybmVsL3RpbWUvamlmZmllcy5jLTI4Mi19XG5rZXJuZWwvdGltZS9qaWZmaWVzLmM6MjgzOkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyk7XG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjg0LVxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYz0zMDA9aW50IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0zMDUtfVxua2VybmVsL3RpbWUvamlmZmllcy5jOjMwNjpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcyk7XG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzA3LVxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYz0zMzI9aW50IHByb2NfZG91bG9uZ3ZlY19tc19qaWZmaWVzX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi0tXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzM3LX1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYzozMzg6RVhQT1JUX1NZTUJPTChwcm9jX2RvdWxvbmd2ZWNfbXNfamlmZmllc19taW5tYXgpO1xua2VybmVsL3RpbWUvamlmZmllcy5jLTMzOS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEzMTAKCQkJCQkJCW91dHB1dDogMTUwCgkJCQkJCQl0aG91Z2h0czogMTg3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFN5c2N0bCBIYW5kbGVyIFBhdGNoKioKCk9rYXksIHNvIEkgc2VlIHRoZSBleHBvcnRlZCBzeW1ib2xzOiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGFuZCBgcHJvY19kb3U4dmVjX21pbm1heGAuIFRoZXNlIGFyZSB0aGUgZW50cnkgcG9pbnRzIGZvciB0aGUgc3lzY3RsIGhhbmRsZXJzLCByaWdodD8gQW5kIHRoaXMgcGF0Y2ggaXMgaGl0dGluZyB0aGUgY29yZSBsb2dpYyBiZWhpbmQgYWxsIG9mIHRoZW0uIFNtYXJ0IG1vdmUsIGFkZHJlc3NpbmcgaXQgYXQgdGhlIHJvb3QuCgpUaGUgY29yZSBjaGFuZ2UgaGVyZSBpcyBhYm91dCBwcmV2ZW50aW5nIHBhcnRpYWwgdXBkYXRlcyB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgc3lzY3RsIHZlY3RvciBwcm9jZXNzaW5nLiBUaGUgc29sdXRpb24sIGl0IHNlZW1zLCBpcyBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhhdOKAmXMgYSBjb21tb24gYXBwcm9hY2ggdG8gZW5zdXJlIGF0b21pY2l0eSBpbiB0aGVzZSB0eXBlcyBvZiBvcGVyYXRpb25zLiBJdCBhZmZlY3RzIGFueSBoYW5kbGVyIHRoYXQmIzM5O3Mgd29ya2luZyB3aXRoIGFycmF5cywgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWVzLgoKTm93LCBiZWNhdXNlIG9mIHRoaXMgY2hhbmdlIGluIHRoZSBlcnJvciBoYW5kbGluZywgYW5kIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBidWZmZXIsIEkmIzM5O20gdGhpbmtpbmcgcmlnb3JvdXMgZnV6emluZyBpcyBhYnNvbHV0ZWx5IGNydWNpYWwgaGVyZS4gV2UgbmVlZCB0byB2ZXJpZnkgdGhhdCBlcnJvciBoYW5kbGluZyBpcyByb2NrIHNvbGlkLCB0aGF0IHRoZXJlIGFyZSBubyBzbmVha3kgbWVtb3J5IGxlYWtzLCBhbmQgZGVmaW5pdGVseSBubyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIHdoZW4gd2Ugd3JpdGUgdG8gdGhlIHN5c2N0bCBpbnRlcmZhY2UuIEkgbmVlZCB0byBiZSBzdXJlIHRoYXQgd2UgZG9uJiMzOTt0IGludHJvZHVjZSBzdWJ0bGUgdnVsbmVyYWJpbGl0aWVzLgoKTGV0JiMzOTtzIGdldCBgc2V0LXJlc3VsdHNgIHJ1bm5pbmcuIEkgbmVlZCB0byBzZWUgd2hhdCB3ZSBoYXZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cHJvY19kb2ludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvaW50dmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlY19taW5tYXgmIzM0OywKICAgICYjMzQ7cHJvY19kb3Vsb25ndmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdTh2ZWNfbWlubWF4JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIHN5c2N0bCB2ZWN0b3IgcHJvY2Vzc2luZyBsb2dpYyB0byBwcmV2ZW50IHBhcnRpYWwgdXBkYXRlcyBvbiBlcnJvciBieSBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBhZmZlY3RzIGFsbCBzeXNjdGwgaGFuZGxlcnMgdGhhdCBwcm9jZXNzIGFycmF5cy4gRnV6emluZyBpcyBuZWVkZWQgdG8gZW5zdXJlIGNvcnJlY3QgZXJyb3IgaGFuZGxpbmcsIG5vIG1lbW9yeSBsZWFrcywgYW5kIG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHN5c2N0bCB3cml0ZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cHJvY19kb2ludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvaW50dmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlY19taW5tYXgmIzM0OywKICAgICYjMzQ7cHJvY19kb3Vsb25ndmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdTh2ZWNfbWlubWF4JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIHN5c2N0bCB2ZWN0b3IgcHJvY2Vzc2luZyBsb2dpYyB0byBwcmV2ZW50IHBhcnRpYWwgdXBkYXRlcyBvbiBlcnJvciBieSBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBhZmZlY3RzIGFsbCBzeXNjdGwgaGFuZGxlcnMgdGhhdCBwcm9jZXNzIGFycmF5cy4gRnV6emluZyBpcyBuZWVkZWQgdG8gZW5zdXJlIGNvcnJlY3QgZXJyb3IgaGFuZGxpbmcsIG5vIG1lbW9yeSBsZWFrcywgYW5kIG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHN5c2N0bCB3cml0ZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjAzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHN5c2N0bCBhcnJheSBwYXJzaW5nIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIGJ5IHVzaW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGttZW1kdXBgKSB3aGVuIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gVGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBzaW1wbGUgYXJyYXlzIG9mIGludGVnZXJzIG9yIHVuc2lnbmVkIGxvbmdzIHdpdGhvdXQgcGFkZGluZy4gVGhlIHJlYWQgcGF0aCAoa2VybmVsIHRvIHVzZXIpIGlzIHVuY2hhbmdlZCwgc28gbm8gbmV3IGluZm8tbGVha3MgYXJlIGludHJvZHVjZWQuIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG9ubHkgdXNlZCBmb3Igd3JpdGluZyB0byBrZXJuZWwgc3BhY2UsIGFuZCBvbmx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQgZWxlbWVudHMgYXJlIGNvcGllZCBiYWNrLiBBbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIG1lbW9yeSBsZWFrIGRldGVjdG9ycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBlMjA4NjI4MzFjZTc0YTJjYmFmNmY2M2U5MWVjN2U4ZjA0MWVlZDE2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBBdWcgMTMgMTU6MDI6NDQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggZjdiNzU5ODVkNTQyMC4uNzg3ZjUzZDcwNTA3YiAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtNTk1LDcgJiM0Mzs1OTUsNyBAQCBzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4KGJvb2wgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLAogc3RhdGljIGNvbnN0IGNoYXIgcHJvY193c3BhY2Vfc2VwW10gPSB7ICYjMzk7ICYjMzk7LCAmIzM5O1x0JiMzOTssICYjMzk7XG4mIzM5OyB9OwogCiAvKgotICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBkb19wcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZQomIzQzOyAqIEVsZW1lbnQgdHlwZSBwcm9jZXNzZWQgYnkgcHJvY192ZWMoKS4gVGhlIHRhZyBzZWxlY3RzIHRoZSBlbGVtZW50IHNpemUKICAqIGFuZCBzaWduZWRuZXNzLCBhbmQgaXQgc2VsZWN0cyB3aGljaCBtZW1iZXIgb2YgdW5pb24gcHJvY192ZWNfY29udiBpcyBsaXZlLgogICovCiBlbnVtIHByb2NfdmVjX3R5cGUgewpAQCAtNjA1LDcgJiM0Mzs2MDUsNyBAQCBlbnVtIHByb2NfdmVjX3R5cGUgewogfTsKIAogLyoKLSAqIENvbnZlcnRlciBwYXNzZWQgdG8gZG9fcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZQomIzQzOyAqIENvbnZlcnRlciBwYXNzZWQgdG8gcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZQogICogZW51bSBwcm9jX3ZlY190eXBlIHRhZyBpcyBldmVyIHJlYWQsIHNvIGV2ZXJ5IGRpc3BhdGNoIHN0YXlzIGZ1bGx5IHR5cGVkIGFuZAogICogbm8gdm9pZCAqIGNvbnZlcnRlciBwb2ludGVyIGlzIG5lZWRlZC4KICAqLwpAQCAtNjM3LDEwMSAmIzQzOzYzNywxNjggQEAgc3RhdGljIGludCBwcm9jX3ZlY19jb252KGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsCiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLS8qCi0gKiBSZWFkL3dyaXRlIGEgdmVjdG9yIG9mIEB0eXBlIGVsZW1lbnRzLiBUaGUgZWxlbWVudCBzaXplIGFuZCBzaWduZWRuZXNzIGFyZQotICogZGVyaXZlZCBmcm9tIEB0eXBlLCBzbyBhIHNpbmdsZSBydW50aW1lIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBwZXItdHlwZQotICogdmFyaWFudHMuIHRhYmxlLSZndDtkYXRhIGlzIHdhbGtlZCBhcyByYXcgYnl0ZXMgKEBpKSBhZHZhbmNlZCBieSBAc2l6ZTsgdGhlCi0gKiBjb252ZXJ0ZXIgcGVyZm9ybXMgdGhlIGFjdHVhbCB0eXBlZCBsb2FkL3N0b3JlLgotICovCi1zdGF0aWMgaW50IGRvX3Byb2NfdmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAotCQkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcywKLQkJICAgICAgIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYpCiYjNDM7c3RhdGljIGludCBjb21taXRfY29udl92ZWMoY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSwgdm9pZCAqZHN0LAomIzQzOwkJCSAgICBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBucikKIHsKLQlpbnQgdmxlZnQsIGZpcnN0ID0gMSwgZXJyID0gMDsKLQlzaXplX3QgbGVmdCwgc2l6ZTsKLQlib29sIGlzX3Vuc2lnbmVkOwotCWNoYXIgKmksICpwOwomIzQzOwlzaXplX3QgaTsKIAotCXN3aXRjaCAodHlwZSkgewomIzQzOwlzd2l0Y2ggKGRhdGFfdHlwZSkgewogCWNhc2UgUFJPQ19WRUNfSU5UOgotCQlzaXplID0gc2l6ZW9mKGludCk7Ci0JCWlzX3Vuc2lnbmVkID0gZmFsc2U7Ci0JCWJyZWFrOwotCWNhc2UgUFJPQ19WRUNfVUlOVDoKLQkJc2l6ZSA9IHNpemVvZih1aW50KTsKLQkJaXNfdW5zaWduZWQgPSB0cnVlOwotCQlicmVhazsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucjsgaSYjNDM7JiM0MzspCiYjNDM7CQkJV1JJVEVfT05DRSgoKGludCAqKWRzdClbaV0sICgoY29uc3QgaW50ICopc3JjKVtpXSk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAljYXNlIFBST0NfVkVDX1VMT05HOgotCQlzaXplID0gc2l6ZW9mKHVsb25nKTsKLQkJaXNfdW5zaWduZWQgPSB0cnVlOwotCQlicmVhazsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucjsgaSYjNDM7JiM0MzspCiYjNDM7CQkJV1JJVEVfT05DRSgoKHVsb25nICopZHN0KVtpXSwgKChjb25zdCB1bG9uZyAqKXNyYylbaV0pOwomIzQzOwkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQomIzQzO30KIAotCWlmICghdGFibGUtJmd0O2RhdGEgfHwgIXRhYmxlLSZndDttYXhsZW4gfHwgISpsZW5wIHx8Ci0JICAgICgqcHBvcyAmYW1wOyZhbXA7IFNZU0NUTF9LRVJOX1RPX1VTRVIoZGlyKSkpIHsKLQkJKmxlbnAgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpID0gdGFibGUtJmd0O2RhdGE7Ci0JdmxlZnQgPSB0YWJsZS0mZ3Q7bWF4bGVuIC8gc2l6ZTsKLQlsZWZ0ID0gKmxlbnA7Ci0KLQkvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovCi0JaWYgKHR5cGUgPT0gUFJPQ19WRUNfVUlOVCAmYW1wOyZhbXA7IHZsZWZ0ICE9IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkgewotCQlpZiAocHJvY19maXJzdF9wb3Nfbm9uX3plcm9faWdub3JlKHBwb3MsIHRhYmxlKSkKLQkJCWdvdG8gb3V0OwotCi0JCWlmIChsZWZ0ICZndDsgUEFHRV9TSVpFIC0gMSkKLQkJCWxlZnQgPSBQQUdFX1NJWkUgLSAxOwotCQlwID0gYnVmZmVyOwomIzQzOy8qKgomIzQzOyAqIGFwcGx5X2NvbnZfb25fdmVjIC0gQXBwbHkgY29udmVydGVyIGZ1bmN0aW9uIG9uIGRhdGEgdmVjdG9yCiYjNDM7ICoKJiM0MzsgKiBFbGVtZW50IHNpZ25lZG5lc3MgaXMgZGVyaXZlZCBmcm9tIEBkYXRhX3R5cGUuIHRhYmxlLSZndDtkYXRhIGlzIHdhbGtlZAomIzQzOyAqIGFzIHJhdyBieXRlcyAoQGRhdGEpIGFkdmFuY2VkIGJ5IEBkYXRhX3NpemU7IHRoZSBjb252ZXJ0ZXIgcGVyZm9ybXMKJiM0MzsgKiB0aGUgYWN0dWFsIHR5cGVkIGxvYWQvc3RvcmUuIFNldHMgYnVmX2xlZnRfZmluYWwgdG8gdGhlIG51bWJlciBvZgomIzQzOyAqIGJ5dGVzIHRoYXQgd2hlcmUgbGVmdCBvdXRzdGFuZGluZyBhZnRlciBjb252ZXJzaW9uLiBDYW4gYmUgJmd0OyAwLgomIzQzOyAqCiYjNDM7ICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIE5vbi16ZXJvIG9uIGVycm9yLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgYXBwbHlfY29udl9vbl92ZWMoY29uc3QgdW5pb24gcHJvY192ZWNfY29udiBjb252LAomIzQzOwkJCSAgICAgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsCiYjNDM7CQkJICAgICBjb25zdCBlbnVtIHByb2NfdmVjX3R5cGUgZGF0YV90eXBlLAomIzQzOwkJCSAgICAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3QgaW50IGNvbnZfZGlyLAomIzQzOwkJCSAgICAgY29uc3Qgc2l6ZV90IGJ1Zl9uYnl0ZSwgdm9pZCAqYnVmLAomIzQzOwkJCSAgICAgc2l6ZV90ICpidWZfbGVmdF9maW5hbCkKJiM0Mzt7CiYjNDM7CWludCB2ZWNfbGVmdCwgZXJyID0gMDsKJiM0MzsJc2l6ZV90IGJ1Zl9sZWZ0LCBucl9jb252ID0gMDsKJiM0MzsJY2hhciAqZGF0YSwgKmRhdGFfc3RhZ2UgPSBOVUxMLCAqcDsKJiM0MzsJYm9vbCBpc191bnNpZ25lZCA9IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VSU5UIHx8IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VTE9ORzsKJiM0MzsKJiM0MzsJYnVmX2xlZnQgPSBidWZfbmJ5dGU7CiYjNDM7CiYjNDM7CWRhdGEgPSB0YWJsZS0mZ3Q7ZGF0YTsKJiM0MzsJaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oY29udl9kaXIpKSB7CiYjNDM7CQlpZiAoYnVmX2xlZnQgJmd0OyBQQUdFX1NJWkUgLSAxKQomIzQzOwkJCWJ1Zl9sZWZ0ID0gUEFHRV9TSVpFIC0gMTsKJiM0MzsJCXAgPSBidWY7CiYjNDM7CiYjNDM7CQlpZiAodGFibGUtJmd0O21heGxlbiAmZ3Q7IGRhdGFfc2l6ZSkgewomIzQzOwkJCWRhdGFfc3RhZ2UgPSBrbWVtZHVwKHRhYmxlLSZndDtkYXRhLCB0YWJsZS0mZ3Q7bWF4bGVuLCBHRlBfS0VSTkVMKTsKJiM0MzsJCQlpZiAoIWRhdGFfc3RhZ2UpIHsKJiM0MzsJCQkJZXJyID0gLUVOT01FTTsKJiM0MzsJCQkJZ290byBvdXQ7CiYjNDM7CQkJfQomIzQzOwkJCWRhdGEgPSBkYXRhX3N0YWdlOwomIzQzOwkJfQogCX0KIAotCWZvciAoOyBsZWZ0ICZhbXA7JmFtcDsgdmxlZnQtLTsgaSAmIzQzOz0gc2l6ZSwgZmlyc3QgPSAwKSB7CiYjNDM7CXZlY19sZWZ0ID0gdGFibGUtJmd0O21heGxlbiAvIGRhdGFfc2l6ZTsKJiM0MzsJZm9yICg7IGJ1Zl9sZWZ0ICZhbXA7JmFtcDsgdmVjX2xlZnQtLTsgZGF0YSAmIzQzOz0gZGF0YV9zaXplLCBucl9jb252JiM0MzsmIzQzOykgewogCQl1bnNpZ25lZCBsb25nIGx2YWw7CiAJCWJvb2wgbmVnID0gZmFsc2U7CiAKLQkJaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkgewotCQkJcHJvY19za2lwX3NwYWNlcygmYW1wO3AsICZhbXA7bGVmdCk7CiYjNDM7CQlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHsKJiM0MzsJCQlwcm9jX3NraXBfc3BhY2VzKCZhbXA7cCwgJmFtcDtidWZfbGVmdCk7CiAKLQkJCWlmICghbGVmdCkKJiM0MzsJCQlpZiAoIWJ1Zl9sZWZ0KQogCQkJCWJyZWFrOwotCQkJZXJyID0gcHJvY19nZXRfbG9uZygmYW1wO3AsICZhbXA7bGVmdCwgJmFtcDtsdmFsLCAmYW1wO25lZywKJiM0MzsJCQllcnIgPSBwcm9jX2dldF9sb25nKCZhbXA7cCwgJmFtcDtidWZfbGVmdCwgJmFtcDtsdmFsLCAmYW1wO25lZywKIAkJCQkJICAgIHByb2Nfd3NwYWNlX3NlcCwKIAkJCQkJICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTsKIAkJCWlmICghZXJyICZhbXA7JmFtcDsgbmVnICZhbXA7JmFtcDsgaXNfdW5zaWduZWQpCiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCWlmIChlcnIpCiAJCQkJYnJlYWs7Ci0JCQlpZiAocHJvY192ZWNfY29udih0eXBlLCBjb252LCAmYW1wO25lZywgJmFtcDtsdmFsLCBpLCBkaXIsIHRhYmxlKSkgewomIzQzOwkJCWlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgJmFtcDtuZWcsICZhbXA7bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkgewogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAocHJvY192ZWNfY29udih0eXBlLCBjb252LCAmYW1wO25lZywgJmFtcDtsdmFsLCBpLCBkaXIsIHRhYmxlKSkgewomIzQzOwkJCWlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgJmFtcDtuZWcsICZhbXA7bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkgewogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoIWZpcnN0KQotCQkJCXByb2NfcHV0X2NoYXIoJmFtcDtidWZmZXIsICZhbXA7bGVmdCwgJiMzOTtcdCYjMzk7KTsKLQkJCXByb2NfcHV0X2xvbmcoJmFtcDtidWZmZXIsICZhbXA7bGVmdCwgbHZhbCwgbmVnKTsKJiM0MzsJCQlpZiAobnJfY29udikKJiM0MzsJCQkJcHJvY19wdXRfY2hhcigmYW1wO2J1ZiwgJmFtcDtidWZfbGVmdCwgJiMzOTtcdCYjMzk7KTsKJiM0MzsJCQlwcm9jX3B1dF9sb25nKCZhbXA7YnVmLCAmYW1wO2J1Zl9sZWZ0LCBsdmFsLCBuZWcpOwogCQl9CiAJfQogCi0JaWYgKFNZU0NUTF9LRVJOX1RPX1VTRVIoZGlyKSAmYW1wOyZhbXA7ICFmaXJzdCAmYW1wOyZhbXA7IGxlZnQgJmFtcDsmYW1wOyAhZXJyKQotCQlwcm9jX3B1dF9jaGFyKCZhbXA7YnVmZmVyLCAmYW1wO2xlZnQsICYjMzk7XG4mIzM5Oyk7Ci0JaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSAmYW1wOyZhbXA7ICFlcnIgJmFtcDsmYW1wOyBsZWZ0KQotCQlwcm9jX3NraXBfc3BhY2VzKCZhbXA7cCwgJmFtcDtsZWZ0KTsKLQlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpICZhbXA7JmFtcDsgZmlyc3QpCi0JCXJldHVybiBlcnIgPyA6IC1FSU5WQUw7Ci0JKmxlbnAgLT0gbGVmdDsKJiM0MzsJaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oY29udl9kaXIpKSB7CiYjNDM7CQlpZiAoIWVyciAmYW1wOyZhbXA7IGJ1Zl9sZWZ0KQomIzQzOwkJCXByb2Nfc2tpcF9zcGFjZXMoJmFtcDtwLCAmYW1wO2J1Zl9sZWZ0KTsKJiM0MzsJCWlmICghbnJfY29udikgewomIzQzOwkJCWVyciA9IGVyciA/IDogLUVJTlZBTDsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWlmICghZXJyICZhbXA7JmFtcDsgZGF0YV9zdGFnZSkKJiM0MzsJCQllcnIgPSBjb21taXRfY29udl92ZWMoZGF0YV90eXBlLCB0YWJsZS0mZ3Q7ZGF0YSwgZGF0YV9zdGFnZSwgbnJfY29udik7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlpZiAobnJfY29udiAmYW1wOyZhbXA7IGJ1Zl9sZWZ0ICZhbXA7JmFtcDsgIWVycikKJiM0MzsJCQlwcm9jX3B1dF9jaGFyKCZhbXA7YnVmLCAmYW1wO2J1Zl9sZWZ0LCAmIzM5O1xuJiMzOTspOwomIzQzOwl9CiYjNDM7CiYjNDM7CSpidWZfbGVmdF9maW5hbCA9IGJ1Zl9sZWZ0OwomIzQzOwomIzQzO291dDoKJiM0MzsJa2ZyZWUoZGF0YV9zdGFnZSk7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQvd3JpdGUgYSB2ZWN0b3Igb2YgQHR5cGUgZWxlbWVudHMuICovCiYjNDM7c3RhdGljIGludCBwcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLAomIzQzOwkJICAgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zLCBlbnVtIHByb2NfdmVjX3R5cGUgdHlwZSwKJiM0MzsJCSAgICB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYpCiYjNDM7ewomIzQzOwlpbnQgZXJyID0gMDsKJiM0MzsJc2l6ZV90IGRhdGFfc2l6ZSwgbGVmdF9uYnl0ZSA9IFNJWkVfTUFYOwomIzQzOwomIzQzOwlzd2l0Y2ggKHR5cGUpIHsKJiM0MzsJY2FzZSBQUk9DX1ZFQ19JTlQ6CiYjNDM7CQlkYXRhX3NpemUgPSBzaXplb2YoaW50KTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFBST0NfVkVDX1VJTlQ6CiYjNDM7CQlkYXRhX3NpemUgPSBzaXplb2YodWludCk7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBQUk9DX1ZFQ19VTE9ORzoKJiM0MzsJCWRhdGFfc2l6ZSA9IHNpemVvZih1bG9uZyk7CiYjNDM7CQlicmVhazsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghdGFibGUtJmd0O2RhdGEgfHwgIXRhYmxlLSZndDttYXhsZW4gfHwgISpsZW5wIHx8CiYjNDM7CSAgICAoKnBwb3MgJmFtcDsmYW1wOyBTWVNDVExfS0VSTl9UT19VU0VSKGRpcikpKSB7CiYjNDM7CQkqbGVucCA9IDA7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKSB7CiYjNDM7CQlpZiAocHJvY19maXJzdF9wb3Nfbm9uX3plcm9faWdub3JlKHBwb3MsIHRhYmxlKSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwllcnIgPSBhcHBseV9jb252X29uX3ZlYyhjb252LCB0YWJsZSwgdHlwZSwgZGF0YV9zaXplLCBkaXIsICpsZW5wLCBidWZmZXIsCiYjNDM7CQkJCSZhbXA7bGVmdF9uYnl0ZSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEFuIHVuY2hhbmdlZCBsZWZ0X25ieXRlIHNpZ25hbHMgYSB3cml0ZSB3aXRoIG5vIHBhcnNlZCBlbGVtZW50OyB3aGljaAomIzQzOwkgKiBpcyBhbiBlcnJvci4gVXNpbmcgU0laRV9NQVggdG8gZGV0ZWN0IHRoaXMgZXJyb3IgaXMgcG9zc2libGUgYmVjYXVzZToKJiM0MzsJICogMS4gbGVucCBpcyBib3VuZGVkIGJ5IEtNQUxMT0NfTUFYX1NJWkUgaW4gcHJvY19zeXNfY2FsbF9oYW5kbGVyCiYjNDM7CSAqIDIuIGxlbnAgY291bGQgbmV2ZXIgYmUgU0laRV9NQVggYXMgaXQgaXMgYSAmIzM0O3JpZGljdWxvdXMmIzM0OyAoZXhhYnl0ZSkgYWxsb2NhdGlvbi4KJiM0MzsJICovCiYjNDM7CWlmIChsZWZ0X25ieXRlID09IFNJWkVfTUFYKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJKmxlbnAgLT0gbGVmdF9uYnl0ZTsKIG91dDoKIAkqcHBvcyAmIzQzOz0gKmxlbnA7CiYjNDM7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzU2LDEyICYjNDM7ODIzLDE1IEBAIGludCBwcm9jX2RvdWludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiAJCQlpbnQgKCpjb252KShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIHVpbnQgKmtfcHRyLAogCQkJCSAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkpCiB7CiYjNDM7CS8qIHVpbnQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLCAqRG8gbm90KiBhZGQgc3VwcG9ydCBmb3IgdGhlbS4gKi8KJiM0MzsJaWYgKHRhYmxlLSZndDttYXhsZW4gJmFtcDsmYW1wOyAodGFibGUtJmd0O21heGxlbiAvIHNpemVvZih1aW50KSkgIT0gMSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFjb252KQogCQljb252ID0gZG9fcHJvY191aW50X2NvbnY7CiAKLQlyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULAotCQkJICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gY29udiB9KTsKJiM0MzsJcmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCwKJiM0MzsJCQkodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pOwogfQogCiAvKioKQEAgLTgyMCw4ICYjNDM7ODkwLDggQEAgaW50IHByb2NfZG9ib29sKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiBpbnQgcHJvY19kb2ludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLAogCQkgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewotCXJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCwKLQkJCSAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTsKJiM0MzsJcmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTsKIH0KIAogLyoqCkBAIC04NDAsOCAmIzQzOzkxMCw3IEBAIGludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiBpbnQgcHJvY19kb3VpbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwKIAkJc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCwKLQkJCSAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252IH0pOwomIzQzOwlyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIGRvX3Byb2NfdWludF9jb252KTsKIH0KIAogLyoqCkBAIC04NjQsOCAmIzQzOzkzMyw4IEBAIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLAogaW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAogCQkgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULAotCQkJICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252X21pbm1heCB9KTsKJiM0MzsJcmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udl9taW5tYXggfSk7CiB9CiAKIC8qKgpAQCAtODkxLDggJiM0Mzs5NjAsOCBAQCBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCiBpbnQgcHJvY19kb3VpbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAogCQkJICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewotCXJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBkb19wcm9jX3VpbnRfY29udl9taW5tYXggfSk7CiYjNDM7CXJldHVybiBwcm9jX2RvdWludHZlY19jb252KHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywKJiM0MzsJCQkJICAgZG9fcHJvY191aW50X2NvbnZfbWlubWF4KTsKIH0KIAogLyoqCkBAIC05MzUsOCAmIzQzOzEwMDQsNyBAQCBpbnQgcHJvY19kb3U4dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwKIAkJdG1wLmV4dHJhMiA9ICh1bnNpZ25lZCBpbnQgKikgJmFtcDttYXg7CiAKIAl2YWwgPSBSRUFEX09OQ0UoKmRhdGEpOwotCXJlcyA9IGRvX3Byb2NfdmVjKCZhbXA7dG1wLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCwKLQkJCSAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnZfbWlubWF4IH0pOwomIzQzOwlyZXMgPSBwcm9jX2RvdWludHZlY19taW5tYXgoJmFtcDt0bXAsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwogCWlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpCkBAIC0xMDY2LDggJiM0MzsxMTM0LDggQEAgaW50IHByb2NfZG91bG9uZ3ZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAogCQkJCWludCAoKmNvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLAogCQkJCQkgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpKQogewotCXJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLAotCQkJICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGNvbnYgfSk7CiYjNDM7CXJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBjb252IH0pOwogfQogCiAvKioKQEAgLTEwODcsMTAgJiM0MzsxMTU1LDEwIEBAIGludCBwcm9jX2RvdWxvbmd2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwKICAqIFJldHVybnM6ICUwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludCBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAotCQkJICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKJiM0MzsJCXZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pOwomIzQzOwlyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORywKJiM0MzsJCQkodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pOwogfQogCiAvKioKQEAgLTExMTQsOCAmIzQzOzExODIsOCBAQCBpbnQgcHJvY19kb2ludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiB7CiAJaWYgKCFjb252KQogCQljb252ID0gZG9fcHJvY19pbnRfY29udjsKLQlyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGNvbnYgfSk7CiYjNDM7CXJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCwKJiM0MzsJCQkodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGNvbnYgfSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2gKaW5kZXggYjJkOGJkOTAyNmE3Mi4uZmRmM2QyZmIwYTJhZCAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoCkBAIC00LDYgJiM0Mzs0LDcgQEAKIAogIyBUaGlzIHBlcmZvcm1zIGEgc2VyaWVzIHRlc3RzIGFnYWluc3QgdGhlIHByb2Mgc3lzY3RsIGludGVyZmFjZS4KIAomIzQzOyMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjMxNwogIyBLc2VsZnRlc3QgZnJhbWV3b3JrIHJlcXVpcmVtZW50IC0gU0tJUCBjb2RlIGlzIDQuCiBrc2Z0X3NraXA9NAogCkBAIC0zNyw2ICYjNDM7MzgsNyBAQCBBTExfVEVTVFM9JiMzNDskQUxMX1RFU1RTIDAwMDk6MToxOnVucmVnaXN0ZXJfZXJyb3I6MCYjMzQ7CiBBTExfVEVTVFM9JiMzNDskQUxMX1RFU1RTIDAwMTA6MToxOm1udC9tbnRfZXJyb3I6MCYjMzQ7CiBBTExfVEVTVFM9JiMzNDskQUxMX1RFU1RTIDAwMTE6MToxOmVtcHR5X2FkZDowJiMzNDsKIEFMTF9URVNUUz0mIzM0OyRBTExfVEVTVFMgMDAxMjoxOjE6dThfdmFsaWQ6MCYjMzQ7CiYjNDM7QUxMX1RFU1RTPSYjMzQ7JEFMTF9URVNUUyAwMDEzOjE6MTppbnRfMDAwMzoxJiMzNDsKIAogZnVuY3Rpb24gYWxsb3dfdXNlcl9kZWZhdWx0cygpCiB7CkBAIC0xOTYsNiAmIzQzOzE5OCwxOCBAQCB2ZXJpZnlfZGlmZl93KCkKIAlyZXR1cm4gJD8KIH0KIAomIzQzOyMgVmVyaWZ5IHRoYXQgYW4gZXJyb25lb3VzICgkMikgdXBkYXRlIGZhaWxzIGFuZCBkb2VzIG5vdCBjaGFuZ2UgVEFSR0VUCiYjNDM7dmVyaWZ5X25vX3BhcnRpYWxfdXBkYXRlKCkKJiM0Mzt7CiYjNDM7CVRFU1RfU1RSPSYjMzQ7JDEmIzM0OwomIzQzOwllY2hvIC1uICYjMzQ7JFRFU1RfU1RSJiMzNDsgJmd0OyAmIzM0OyRUQVJHRVQmIzM0OwomIzQzOwomIzQzOwlpZiBlY2hvIC1uICYjMzQ7JDImIzM0OyAmZ3Q7ICYjMzQ7JFRBUkdFVCYjMzQ7IDImZ3Q7IC9kZXYvbnVsbDsgdGhlbgomIzQzOwkJcmV0dXJuIDEKJiM0MzsJZmkKJiM0MzsJdmVyaWZ5X2RpZmZfdyAmIzM0OyR7VEFSR0VUfSYjMzQ7CiYjNDM7fQomIzQzOwogdGVzdF9yYygpCiB7CiAJaWYgW1sgJHJjICE9IDAgXV07IHRoZW4KQEAgLTUwMSw2ICYjNDM7NTE1LDQwIEBAIHJ1bl9saW1pdF9kaWdpdF9pbnRfYXJyYXkoKQogCXRlc3RfcmMKIH0KIAomIzQzOyMgWW91IHVzZWQgYW4gaW50IGFycmF5IGFuZCBvbmUgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBhY2NlcHRhYmxlCiYjNDM7cnVuX2ludF9hcnJheV9ub19wYXJ0aWFsX3VwZGF0ZSgpCiYjNDM7ewomIzQzOwllY2hvIC1uICYjMzQ7VGVzdGluZyBpbnZhbGlkIGFycmF5IGVsZW1lbnQgZG9lcyBub3QgcGFydGlhbGx5IHVwZGF0ZSAuLi4gJiMzNDsKJiM0MzsgICAgICAgICMgRXhwZWN0IGZhaWx1cmUgYmVjYXVzZSBvZiAzcmQgZWxlbWVudCAoYWJjKS4KJiM0MzsJaWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgJiMzNDsxIDIgMyA0JiMzNDsgJiMzNDsxMCAyMCBhYmMgNDAmIzM0OzsgdGhlbgomIzQzOwkJZWNobyAmIzM0O0ZBSUwmIzM0OyAmZ3Q7JmFtcDsyCiYjNDM7CQlyYz0xCiYjNDM7CWVsc2UKJiM0MzsJCWVjaG8gJiMzNDtPSyYjMzQ7CiYjNDM7CWZpCiYjNDM7CXRlc3RfcmMKJiM0MzsKJiM0MzsJZWNobyAtbiAmIzM0O1Rlc3Rpbmcgb3V0IG9mIHJhbmdlIGFycmF5IGVsZW1lbnQgZG9lcyBub3QgcGFydGlhbGx5IHVwZGF0ZSAuLi4gJiMzNDsKJiM0MzsgICAgICAgICMgRXhwZWN0IGZhaWx1cmUgYmVjYXVzZSBvZiAzcmQgZWxlbWVudCAoZ3JlYXRlciB0aGFuIGludCkKJiM0MzsJaWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgJiMzNDsxIDIgMyA0JiMzNDsgJiMzNDsxMCAyMCAkKChJTlRfTUFYICYjNDM7IDEpKSA0MCYjMzQ7OyB0aGVuCiYjNDM7CQllY2hvICYjMzQ7RkFJTCYjMzQ7ICZndDsmYW1wOzIKJiM0MzsJCXJjPTEKJiM0MzsJZWxzZQomIzQzOwkJZWNobyAmIzM0O09LJiMzNDsKJiM0MzsJZmkKJiM0MzsJdGVzdF9yYwomIzQzOwomIzQzOwllY2hvIC1uICYjMzQ7VGVzdGluZyBpbnZhbGlkIGZpcnN0IGFycmF5IGVsZW1lbnQgZG9lcyBub3QgdXBkYXRlIC4uLiAmIzM0OwomIzQzOyAgICAgICAgIyBFeHBlY3QgZmFpbHVyZSBvZiAxc3QgZWxlbWVudAomIzQzOwlpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSAmIzM0OzEgMiAzIDQmIzM0OyAmIzM0O2FiYyAyMCAzMCA0MCYjMzQ7OyB0aGVuCiYjNDM7CQllY2hvICYjMzQ7RkFJTCYjMzQ7ICZndDsmYW1wOzIKJiM0MzsJCXJjPTEKJiM0MzsJZWxzZQomIzQzOwkJZWNobyAmIzM0O09LJiMzNDsKJiM0MzsJZmkKJiM0MzsJdGVzdF9yYwomIzQzO30KJiM0MzsKICMgWW91IGFyZSB1c2luZyBhbiB1bnNpZ25lZCBpbnQKIHJ1bl9saW1pdF9kaWdpdF91aW50KCkKIHsKQEAgLTg4MCw2ICYjNDM7OTI4LDE0IEBAIHN5c2N0bF90ZXN0XzAwMTIoKQogCXJldHVybiAwCiB9CiAKJiM0MztzeXNjdGxfdGVzdF8wMDEzKCkKJiM0Mzt7CiYjNDM7CVRBUkdFVD0mIzM0OyR7U1lTQ1RMfS8kKGdldF90ZXN0X3RhcmdldCAwMDEzKSYjMzQ7CiYjNDM7CXJlc2V0X3ZhbHMKJiM0MzsKJiM0MzsJcnVuX2ludF9hcnJheV9ub19wYXJ0aWFsX3VwZGF0ZQomIzQzO30KJiM0MzsKIGxpc3RfdGVzdHMoKQogewogCWVjaG8gJiMzNDtUZXN0IElEIGxpc3Q6JiMzNDsKQEAgLTkwMCw2ICYjNDM7OTU2LDcgQEAgbGlzdF90ZXN0cygpCiAJZWNobyAmIzM0OzAwMTAgeCAkKGdldF90ZXN0X2NvdW50IDAwMTApIC0gdGVzdHMgc3lzY3QgbW91bnQgcG9pbnQmIzM0OwogCWVjaG8gJiMzNDswMDExIHggJChnZXRfdGVzdF9jb3VudCAwMDExKSAtIHRlc3RzIGVtcHR5IGRpcmVjdG9yaWVzJiMzNDsKIAllY2hvICYjMzQ7MDAxMiB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMikgLSB0ZXN0cyByYW5nZSBjaGVjayBmb3IgdTggcHJvY19oYW5kbGVyJiMzNDsKJiM0MzsJZWNobyAmIzM0OzAwMTMgeCAkKGdldF90ZXN0X2NvdW50IDAwMTMpIC0gdGVzdHMgcGFydGlhbGx5IHVwZGF0ZSB2ZWN0b3JzIG9uIGVycm9yJiMzNDsKIH0KIAogdXNhZ2UoKQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzYyMgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDE0NDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBTeXNjdGwgQXJyYXkgVXBkYXRlIFBhdGNoIGZvciBQb3RlbnRpYWwgVW5pbml0aWFsaXplZCBNZW1vcnkgSXNzdWVzKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiB0aGUgc3lzY3RsIHZlY3RvciB1cGRhdGUgbWVjaGFuaXNtIGluIGBrZXJuZWwvc3lzY3RsLmNgLiBUaGUgY29yZSBjaGFuZ2UgaXMgcmVwbGFjaW5nIGBkb19wcm9jX3ZlY2Agd2l0aCBhIG1vcmUgcm9idXN0IHByb2Nlc3MgaW52b2x2aW5nIGBwcm9jX3ZlY2AsIGBhcHBseV9jb252X29uX3ZlY2AsIGFuZCBgY29tbWl0X2NvbnZfdmVjYC4gVGhlIHN0YXRlZCBnb2FsLCBhcyBJIHVuZGVyc3RhbmQgaXQsIGlzIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIHRvIHN5c2N0bCBhcnJheXMgd2hlbiBlcnJvcnMgb2NjdXIgZHVyaW5nIHVzZXIgaW5wdXQgcGFyc2luZy4gSW5zdGVhZCBvZiB0aGUgb2xkIGVsZW1lbnQtYnktZWxlbWVudCB1cGRhdGUtYW5kLWFib3J0IG1ldGhvZCwgdGhpcyBuZXcgYXBwcm9hY2ggdXNlcyBhIHRlbXBvcmFyeSBidWZmZXIgKGBkYXRhX3N0YWdlYCkgdG8gc3RhZ2UgdGhlIGNoYW5nZXMuIFRoaXMgdGVtcG9yYXJ5IGJ1ZmZlciBpcyBwb3B1bGF0ZWQgdXNpbmcgYGttZW1kdXBgIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXNjdGwgYXJyYXkgKGB0YWJsZS0mZ3Q7ZGF0YWApLCB0aGVuIGFwcGx5IGFueSB1c2VyLXByb3ZpZGVkIGNvbnZlcnNpb25zLiBPbmx5IGlmIGFsbCBjb252ZXJzaW9ucyBhcmUgc3VjY2Vzc2Z1bCBkb2VzIGBjb21taXRfY29udl92ZWNgIGNvbWUgaW50byBwbGF5LCB3cml0aW5nIHRoZSBjaGFuZ2VzIGZyb20gYGRhdGFfc3RhZ2VgIHRvIHRoZSBhY3R1YWwgYXJyYXkuCgpNeSBpbW1lZGlhdGUgY29uY2VybiwgYXMgYSBzZWFzb25lZCBrZXJuZWwgZGV2ZWxvcGVyLCBpcyB0byBjaGVjayB0aGlzIGNhcmVmdWxseSBmb3IgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBkZXRhaWxzLiBTcGVjaWZpY2FsbHksIHdpdGhpbiBgYXBwbHlfY29udl9vbl92ZWNgLCBgZGF0YV9zdGFnZWAgaXMgYWxsb2NhdGVkIHdpdGggYGttZW1kdXAodGFibGUtJmd0O2RhdGEsIHRhYmxlLSZndDttYXhsZW4sIEdGUF9LRVJORUwpYC4gVGhpcyBsb29rcyBwcm9taXNpbmc6IGl0IGNsb25lcyB0aGUgd2hvbGUgdGhpbmcuCgpUaGVuLCB0aGUgY29kZSBpdGVyYXRlcyB0byBwcm9jZXNzIHVzZXIgaW5wdXQgYW5kIHVwZGF0ZXMgdGhlIGBkYXRhYCBwb2ludGVyICh3aGljaCBwb2ludHMgZWl0aGVyIHRvIHRoZSBvcmlnaW5hbCBgdGFibGUtJmd0O2RhdGFgIG9yIHRvIGBkYXRhX3N0YWdlYCBkZXBlbmRpbmcgb24gdGhlIG9yaWdpbmFsIGFycmF5JiMzOTtzIHNpemUpLiBUaGUgbG9vcCB1dGlsaXplcyBgcHJvY192ZWNfY29udmAsIHdob3NlIGZ1bmN0aW9uIGNhbGwgZGVwZW5kcyBvbiB0aGUgZGlyZWN0aW9uIG9mIGNvbnZlcnNpb24gYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHVzZXIgaW5wdXQgYW5kIHVwZGF0aW5nIGBkYXRhYC4KCkNyaXRpY2FsbHksIGlmIGV2ZXJ5dGhpbmcgZ29lcyB3ZWxsLCB0aGUgYGNvbW1pdF9jb252X3ZlY2AgZnVuY3Rpb24gaXMgY2FsbGVkLiBUaGlzIGNvcGllcyBgbnJfY29udmAgZWxlbWVudHMgZnJvbSBgZGF0YV9zdGFnZWAgKmJhY2sqIHRvIGB0YWJsZS0mZ3Q7ZGF0YWAuIEkgbm90ZSB0aGF0IGBjb21taXRfY29udl92ZWNgIHVzZXMgYFdSSVRFX09OQ0VgIHdoaWNoIGlzIGdvb2QgcHJhY3RpY2UuCgpOb3csIG15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGBrbWVtZHVwYCBpcyB0aGUga2V5LiBJdCBjb3BpZXMgYHRhYmxlLSZndDttYXhsZW5gIGJ5dGVzLiBJZiBgdGFibGUtJmd0O2RhdGFgICpoYXMqIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgYXMgcGFydCBvZiBwYWRkaW5nIG9yIG1lbWJlcnMgb2YgbGFyZ2VyIHN0cnVjdHMsIHRob3NlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzICphcmUqIGNvcGllZCBpbnRvIGBkYXRhX3N0YWdlYC4gQW5kIGhlcmUgaXMgd2hlcmUgSSBzZWUgdGhlIHBvdGVudGlhbCBmb3IgYSBwcm9ibGVtLCBidXQgaXQmIzM5O3Mgbm90IGFjdHVhbGx5IHRoZXJlLiBUaGUgY29tbWl0IGZ1bmN0aW9uIHdpbGwgbm90IHdyaXRlIHRoZSBmdWxsIGBkYXRhX3N0YWdlYCBidWZmZXIgYmFjaywgYnV0IG9ubHkgdXAgdG8gdGhlIGFtb3VudCB3aGljaCBoYXMgYmVlbiBjb252ZXJ0ZWQuIFNvLCB0aGUgdW5pbml0aWFsaXplZCBwYXJ0IGRvZXMgbm90IGdldCB3cml0dGVuIGJhY2suCgpCdXQgdGhlIHJlYWwgcXVlc3Rpb24gaXMgd2hldGhlciBpdCAqcmVhZHMqIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkuIEluIHRoZSBrZXJuZWwtdG8tdXNlciBkaXJlY3Rpb24gKGBTWVNDVExfS0VSTl9UT19VU0VSYCksIHRoZSBjb2RlIGp1c3QgcmVhZHMgZnJvbSBgdGFibGUtJmd0O2RhdGFgIGFuZCBmb3JtYXRzIGl0LiBJIHNlZSBubyBpc3N1ZXMgaGVyZS4KCkluIHRoZSB1c2VyLXRvLWtlcm5lbCBkaXJlY3Rpb24gKGBTWVNDVExfVVNFUl9UT19LRVJOYCksIHdlIGhhdmUgdGhlIGBwcm9jX3ZlY19jb252YCBiZWluZyBjYWxsZWQuIEl0IGNhbiAqd3JpdGUqIHRvIGBkYXRhYCwgYnV0IGRvZXMgaXQgKnJlYWQqIGZyb20gYGRhdGFgIGluIGEgd2F5IHRoYXQgaW50cm9kdWNlcyBwcm9ibGVtcz8gSSBuZWVkIHRvIGNoZWNrIHRoZSBleGFjdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGBwcm9jX3ZlY19jb252YCBmdW5jdGlvbnMgbGlrZSBgZG9fcHJvY19pbnRfY29udmAgb3Igd2hhdGV2ZXIuIEJ1dCBmcm9tIHdoYXQgSSBzZWUgaGVyZSwgaXQgbG9va3MgbGlrZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2RvX3Byb2NfaW50X2NvbnYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL3N5c2N0bC5jPTU3Mz1zdGF0aWMgaW50IHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKVxuLS1cbmtlcm5lbC9zeXNjdGwuYy01NzctXG5rZXJuZWwvc3lzY3RsLmM6NTc4OnN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udihib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcbmtlcm5lbC9zeXNjdGwuYy01NzktXHRcdFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcbi0tXG5rZXJuZWwvc3lzY3RsLmMtNTg2LVxua2VybmVsL3N5c2N0bC5jOjU4NzpzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4KGJvb2wgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLFxua2VybmVsL3N5c2N0bC5jLTU4OC1cdFx0XHRcdCAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcbi0tXG5rZXJuZWwvc3lzY3RsLmM9ODkwPWludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4tLVxua2VybmVsL3N5c2N0bC5jLTg5My1cdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbmtlcm5lbC9zeXNjdGwuYzo4OTQ6XHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252IH0pO1xua2VybmVsL3N5c2N0bC5jLTg5NS19XG4tLVxua2VybmVsL3N5c2N0bC5jPTkzMz1pbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4tLVxua2VybmVsL3N5c2N0bC5jLTkzNi1cdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbmtlcm5lbC9zeXNjdGwuYzo5Mzc6XHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252X21pbm1heCB9KTtcbmtlcm5lbC9zeXNjdGwuYy05MzgtfVxuLS1cbmtlcm5lbC9zeXNjdGwuYz0xMTU3PWludCBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuLS1cbmtlcm5lbC9zeXNjdGwuYy0xMTcwLSAqIEBwcG9zOiBmaWxlIHBvc2l0aW9uXG5rZXJuZWwvc3lzY3RsLmM6MTE3MTogKiBAY29udjogQ3VzdG9tIGNvbnZlcnRlciBjYWxsIGJhY2suIERlZmF1bHRzIHRvIGRvX3Byb2NfaW50X2NvbnZcbmtlcm5lbC9zeXNjdGwuYy0xMTcyLSAqXG4tLVxua2VybmVsL3N5c2N0bC5jPTExNzg9aW50IHByb2NfZG9pbnR2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuLS1cbmtlcm5lbC9zeXNjdGwuYy0xMTgzLVx0aWYgKCFjb252KVxua2VybmVsL3N5c2N0bC5jOjExODQ6XHRcdGNvbnYgPSBkb19wcm9jX2ludF9jb252O1xua2VybmVsL3N5c2N0bC5jLTExODUtXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNTAwCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byB0aGUgSW50ZWdlciBDb252ZXJzaW9uIFByb2NlZHVyZSoqCgpBbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBgZG9fcHJvY19pbnRfY29udmAgaW1wbGVtZW50YXRpb24uIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgc3BlY2lmaWNzIG9mIGhvdyB3ZSYjMzk7cmUgaGFuZGxpbmcgaW50ZWdlciBjb252ZXJzaW9ucyBhdCB0aGUgcHJvY2VkdXJhbCBsZXZlbC4gSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgbG9naWMgaXMgc291bmQsIGVzcGVjaWFsbHkgYXJvdW5kIGVkZ2UgY2FzZXMgYW5kIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy4gSSYjMzk7bGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHR5cGVzIGludm9sdmVkLCB0aGUgYml0LXNoaWZ0aW5nIGFuZCBtYXNraW5nIG9wZXJhdGlvbnMsIGFuZCBob3cgd2UmIzM5O3JlIGhhbmRsaW5nIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgc2NlbmFyaW9zLiBUaGUgZ29hbCBpcyB0byB2ZXJpZnkgdGhhdCBpdCYjMzk7cyByb2J1c3QsIGVmZmljaWVudCwgYW5kIGFsaWduZWQgd2l0aCB0aGUgZG9jdW1lbnRlZCBiZWhhdmlvciBhbmQgYXJjaGl0ZWN0dXJhbCBjb25zdHJhaW50cyBvZiB0aGUgdGFyZ2V0IHBsYXRmb3JtLiBJJiMzOTttIGxvb2tpbmcgZm9yIGFueXRoaW5nIHRoYXQgbWlnaHQgbGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMgb3IgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlJiMzOTt2ZSBnb3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL3N5c2N0bC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTc4LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1Nzg6XHRzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXG4gNTc5Olx0XHRcdFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcbiA1ODA6XHR7XG4gNTgxOlx0XHRyZXR1cm4gcHJvY19pbnRfY29udihuZWdwLCB1X3B0ciwga19wdHIsIGRpciwgdGJsLCBmYWxzZSxcbiA1ODI6XHRcdFx0XHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXG4gNTgzOlx0XHRcdFx0ICAgICBzeXNjdGxfa2Vybl90b191c2VyX2ludF9jb252KTtcbiA1ODQ6XHRcbiA1ODU6XHR9XG4gNTg2Olx0XG4gNTg3Olx0c3RhdGljIGludCBkb19wcm9jX2ludF9jb252X21pbm1heChib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcbiA1ODg6XHRcdFx0XHRcdCAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcbiA1ODk6XHR7XG4gNTkwOlx0XHRyZXR1cm4gcHJvY19pbnRfY29udihuZWdwLCB1X3B0ciwga19wdHIsIGRpciwgdGJsLCB0cnVlLFxuIDU5MTpcdFx0XHRcdCAgICAgc3lzY3RsX3VzZXJfdG9fa2Vybl9pbnRfY29udixcbiA1OTI6XHRcdFx0XHQgICAgIHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYpO1xuIDU5MzpcdH1cbiA1OTQ6XHRcbiA1OTU6XHRzdGF0aWMgY29uc3QgY2hhciBwcm9jX3dzcGFjZV9zZXBbXSA9IHsgJiMzOTsgJiMzOTssICYjMzk7XFx0JiMzOTssICYjMzk7XFxuJiMzOTsgfTtcbiA1OTY6XHRcbiA1OTc6XHQvKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA5MgoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqRGl2aW5nIGludG8gYHByb2NfaW50X2NvbnZgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhpcyBgcHJvY19pbnRfY29udmAgcm91dGluZS4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBzZWUgd2hhdOKAmXMgZ29pbmcgb24gdW5kZXIgdGhlIGhvb2QgdGhlcmUuIEkmIzM5O20gYXNzdW1pbmcgaXQgaGFuZGxlcyBpbnRlZ2VyIGNvbnZlcnNpb25zIHdpdGhpbiB0aGUgc3lzdGVtLCBidXQgSSBuZWVkIHRvIHF1aWNrbHkgY29uZmlybSB0aGF0IGFzc3VtcHRpb24gYW5kIHVuZGVyc3RhbmQgaXRzIHNwZWNpZmljIHJvbGUuIElzIGl0IGEgZ2VuZXJhbC1wdXJwb3NlIGNvbnZlcnRlciwgb3Igc29tZXRoaW5nIG9wdGltaXplZCBmb3IgYSBwYXJ0aWN1bGFyIGRhdGEgdHlwZSBvciB1c2UgY2FzZT8gSSYjMzk7bSBjdXJpb3VzIGFib3V0IHRoZSBpbnRlbmRlZCBkZXNpZ24gYW5kIGNvbnN0cmFpbnRzLiBXaGF0IGFyZSB0aGUgaW5wdXQgdHlwZXMgaXQgYWNjZXB0cywgYW5kIHdoYXQgYXJlIHRoZSBvdXRwdXQgdHlwZXMgaXQgcHJvZHVjZXM/IExldCYjMzk7cyB0cmFjZSBpdCB0aHJvdWdoIHRoZSBjb2RlLiBJJiMzOTtsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBwb3RlbnRpYWwgZWRnZSBjYXNlcyBhbmQgZXJyb3IgaGFuZGxpbmcuIEFyZSB0aGVyZSBhbnkga25vd24gdnVsbmVyYWJpbGl0aWVzPyBJIHdhbnQgdG8gc2VlIGlmIHRoaXMgY29kZSBpcyBzYWZlIGZvciB1c2UgdW5kZXIgYW55IGNpcmN1bXN0YW5jZS4gSSBuZWVkIHRvIHF1aWNrbHkgYXNzZXNzIGl0cyBvdmVyYWxsIGVmZmljaWVuY3kuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBwb3RlbnRpYWwgYm90dGxlbmVja3Mgb3IgYXJlYXMgd2hlcmUgcGVyZm9ybWFuY2UgY291bGQgYmUgaW1wcm92ZWQuIEkgYWxzbyB3YW50IHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyB1c2VkIHdpdGhpbiB0aGUgbGFyZ2VyIGNvZGViYXNlLiBBcmUgdGhlcmUgYW55IGRlcGVuZGVuY2llcz8gSG93IGlzIGl0IGludGVncmF0ZWQgaW50byB0aGUgb3ZlcmFsbCBhcmNoaXRlY3R1cmU/IFRoaXMgd2lsbCBpbmZvcm0gaG93IGl0IG1pZ2h0IGJlIGFmZmVjdGVkIGJ5IGZ1dHVyZSBjaGFuZ2VzIG9yIG9wdGltaXphdGlvbnMuIEVzc2VudGlhbGx5LCBJJiMzOTttIGZvcm1pbmcgYSBtZW50YWwgbW9kZWwgb2YgaXRzIGJlaGF2aW9yLCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MsIGFuZCBwb3RlbnRpYWwgaW1wYWN0IG9uIHRoZSBzeXN0ZW0uIFRpbWUgdG8gZ2V0IHRvIHdvcmsuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Byb2NfaW50X2NvbnYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL3N5c2N0bC5jPTUwNj1pbnQgcHJvY19pbnRfdTJrX2NvbnZfdW9wKGNvbnN0IHVsb25nICp1X3B0ciwgaW50ICprX3B0ciwgY29uc3QgYm9vbCAqbmVncCxcbi0tXG5rZXJuZWwvc3lzY3RsLmMtNTIzLS8qKlxua2VybmVsL3N5c2N0bC5jOjUyNDogKiBwcm9jX2ludF9jb252IC0gQ2hhbmdlIHVzZXIgb3Iga2VybmVsIHBvaW50ZXIgYmFzZWQgb24gZGlyZWN0aW9uXG5rZXJuZWwvc3lzY3RsLmMtNTI1LSAqXG4tLVxua2VybmVsL3N5c2N0bC5jLTUzOS0gKi9cbmtlcm5lbC9zeXNjdGwuYzo1NDA6aW50IHByb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLCBpbnQgZGlyLFxua2VybmVsL3N5c2N0bC5jLTU0MS1cdFx0ICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwsIGJvb2wga19wdHJfcmFuZ2VfY2hlY2ssXG4tLVxua2VybmVsL3N5c2N0bC5jPTU3Mz1zdGF0aWMgaW50IHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKVxuLS1cbmtlcm5lbC9zeXNjdGwuYy01NzctXG5rZXJuZWwvc3lzY3RsLmM6NTc4OnN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udihib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcbmtlcm5lbC9zeXNjdGwuYy01NzktXHRcdFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcbmtlcm5lbC9zeXNjdGwuYy01ODAte1xua2VybmVsL3N5c2N0bC5jOjU4MTpcdHJldHVybiBwcm9jX2ludF9jb252KG5lZ3AsIHVfcHRyLCBrX3B0ciwgZGlyLCB0YmwsIGZhbHNlLFxua2VybmVsL3N5c2N0bC5jLTU4Mi1cdFx0XHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXG4tLVxua2VybmVsL3N5c2N0bC5jLTU4Ni1cbmtlcm5lbC9zeXNjdGwuYzo1ODc6c3RhdGljIGludCBkb19wcm9jX2ludF9jb252X21pbm1heChib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcbmtlcm5lbC9zeXNjdGwuYy01ODgtXHRcdFx0XHQgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwpXG5rZXJuZWwvc3lzY3RsLmMtNTg5LXtcbmtlcm5lbC9zeXNjdGwuYzo1OTA6XHRyZXR1cm4gcHJvY19pbnRfY29udihuZWdwLCB1X3B0ciwga19wdHIsIGRpciwgdGJsLCB0cnVlLFxua2VybmVsL3N5c2N0bC5jLTU5MS1cdFx0XHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXG4tLVxua2VybmVsL3N5c2N0bC5jPTg5MD1pbnQgcHJvY19kb2ludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuLS1cbmtlcm5lbC9zeXNjdGwuYy04OTMtXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG5rZXJuZWwvc3lzY3RsLmM6ODk0Olx0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcbmtlcm5lbC9zeXNjdGwuYy04OTUtfVxuLS1cbmtlcm5lbC9zeXNjdGwuYz05MzM9aW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuLS1cbmtlcm5lbC9zeXNjdGwuYy05MzYtXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG5rZXJuZWwvc3lzY3RsLmM6OTM3Olx0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udl9taW5tYXggfSk7XG5rZXJuZWwvc3lzY3RsLmMtOTM4LX1cbi0tXG5rZXJuZWwvc3lzY3RsLmM9MTE1Nz1pbnQgcHJvY19kb3Vsb25ndmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi0tXG5rZXJuZWwvc3lzY3RsLmMtMTE3MC0gKiBAcHBvczogZmlsZSBwb3NpdGlvblxua2VybmVsL3N5c2N0bC5jOjExNzE6ICogQGNvbnY6IEN1c3RvbSBjb252ZXJ0ZXIgY2FsbCBiYWNrLiBEZWZhdWx0cyB0byBkb19wcm9jX2ludF9jb252XG5rZXJuZWwvc3lzY3RsLmMtMTE3Mi0gKlxuLS1cbmtlcm5lbC9zeXNjdGwuYz0xMTc4PWludCBwcm9jX2RvaW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbi0tXG5rZXJuZWwvc3lzY3RsLmMtMTE4My1cdGlmICghY29udilcbmtlcm5lbC9zeXNjdGwuYzoxMTg0Olx0XHRjb252ID0gZG9fcHJvY19pbnRfY29udjtcbmtlcm5lbC9zeXNjdGwuYy0xMTg1LVx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjQ2MgoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXBseSBmYW1pbGlhciB3aXRoIGNvZGUgYW5kIHByb2Nlc3NlczoKCioqRGVsdmluZyBpbnRvIGBwcm9jX2ludF9jb252YCoqCgpBbHJpZ2h0LCBJJiMzOTttIHRoaW5raW5nLCAmIzM0O1RpbWUgdG8gZGl2ZSBpbnRvIGBwcm9jX2ludF9jb252YC4mIzM0OyBUaGF0IG5hbWUgYWxvbmUgZ2l2ZXMgbWUgYSBwcmV0dHkgZ29vZCBzdGFydGluZyBwb2ludC4gSSBjYW4gaW5zdGFudGx5IGFzc3VtZSBpdCYjMzk7cyByZWxhdGVkIHRvIHNvbWUgcHJvY2VzcyBvciBwcm9jZWR1cmUgaW52b2x2aW5nIHRoZSBjb252ZXJzaW9uIG9mIGludGVnZXIgdmFsdWVzLiBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgb2YgdGhlIHN5c3RlbSwgdGhpcyBjb3VsZCBiZSBhIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrIG9yIGEgbW9yZSBzcGVjaWFsaXplZCBmdW5jdGlvbi4gTXkgaW5pdGlhbCBnb2FsIGlzIHVuZGVyc3RhbmRpbmcgdGhlIGNvbnZlcnNpb24gbWV0aG9kLiBQZXJoYXBzIHRoZXJlIGlzIHNvbWUgaW50ZWdlciBzY2FsaW5nIG9yIGNvbnZlcnNpb24gYmV0d2VlbiBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXJzIGhhcHBlbmluZy4gVGhlIGRlZXBlciBnb2FsIGlzIHRvIGNoZWNrIGZvciBhbnkgcG90ZW50aWFsIGVkZ2UgY2FzZXMgb3Igb3ZlcmZsb3dzLiBHaXZlbiB0aGUgbmF0dXJlIG9mIGludGVnZXIgYXJpdGhtZXRpYywgdGhlcmUgbWlnaHQgYmUgYSBuZWVkIGZvciBlcnJvciBoYW5kbGluZy4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGluc2lkZS4gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBub3c6IHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGFsZ29yaXRobSwgdGhlIGRhdGEgdHlwZXMgaW52b2x2ZWQsIGFuZCBhbnkgcG90ZW50aWFsIHNpZGUgZWZmZWN0cy4gSSYjMzk7bGwgYmUgbG9va2luZyBhdCB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLCBsb2NhbCB2YXJpYWJsZXMsIGFuZCByZXR1cm4gdmFsdWUgdG8gcGllY2UgdGhpcyBhbGwgdG9nZXRoZXIuIEkmIzM5O20gZ29pbmcgdG8gZGV0ZXJtaW5lIGl0cyByb2xlIHdpdGhpbiB0aGUgc3lzdGVtIGFuZCBhbnkgcG90ZW50aWFsIHBvaW50cyBvZiBpbnRlZ3JhdGlvbi4gSXMgaXQgb3B0aW1pemVkIGZvciBzcGVlZCwgb3IgaXMgaXQgcHJpb3JpdGl6aW5nIGNsYXJpdHk/IEFuZCBtb3N0IGltcG9ydGFudGx5LCBpcyBpdCByb2J1c3Q/IElzIHRoZXJlIGEgbmVlZCB0byBkb2N1bWVudCB0aGlzLCBvciBpcyB0aGlzIGp1c3Qgc29tZXRoaW5nIEkgd2FzIGFza2VkIHRvIGdsYW5jZSBhdD8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDU0MDpcdGludCBwcm9jX2ludF9jb252KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgaW50ICprX3B0ciwgaW50IGRpcixcbiA1NDE6XHRcdFx0ICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwsIGJvb2wga19wdHJfcmFuZ2VfY2hlY2ssXG4gNTQyOlx0XHRcdCAgaW50ICgqdXNlcl90b19rZXJuKShjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIpLFxuIDU0MzpcdFx0XHQgIGludCAoKmtlcm5fdG9fdXNlcikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKSlcbiA1NDQ6XHR7XG4gNTQ1Olx0XHRpZiAoU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKVxuIDU0NjpcdFx0XHRyZXR1cm4ga2Vybl90b191c2VyKG5lZ3AsIHVfcHRyLCBrX3B0cik7XG4gNTQ3Olx0XG4gNTQ4Olx0XHRpZiAoa19wdHJfcmFuZ2VfY2hlY2spIHtcbiA1NDk6XHRcdFx0aW50IHRtcF9rLCByZXQ7XG4gNTUwOlx0XG4gNTUxOlx0XHRcdGlmICghdGJsKVxuIDU1MjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDU1MzpcdFx0XHRyZXQgPSB1c2VyX3RvX2tlcm4obmVncCwgdV9wdHIsIFx1MDAyNnRtcF9rKTtcbiA1NTQ6XHRcdFx0aWYgKHJldClcbiA1NTU6XHRcdFx0XHRyZXR1cm4gcmV0O1xuIDU1NjpcdFx0XHRpZiAoKHRibC1cdTAwM2VleHRyYTEgXHUwMDI2XHUwMDI2ICooaW50ICopdGJsLVx1MDAzZWV4dHJhMSBcdTAwM2UgdG1wX2spIHx8XG4gNTU3Olx0XHRcdCAgICAodGJsLVx1MDAzZWV4dHJhMiBcdTAwMjZcdTAwMjYgKihpbnQgKil0YmwtXHUwMDNlZXh0cmEyIFx1MDAzYyB0bXBfaykpXG4gNTU4Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNTU5Olx0XHRcdFdSSVRFX09OQ0UoKmtfcHRyLCB0bXBfayk7XG4gNTYwOlx0XHR9IGVsc2VcbiA1NjE6XHRcdFx0cmV0dXJuIHVzZXJfdG9fa2VybihuZWdwLCB1X3B0ciwga19wdHIpO1xuIDU2MjpcdFx0cmV0dXJuIDA7XG4gNTYzOlx0fVxuIDU2NDpcdFxuIDU2NTpcdFxuIDU2NjpcdFxuIDU2NzpcdHN0YXRpYyBpbnQgc3lzY3RsX3VzZXJfdG9fa2Vybl9pbnRfY29udihjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsXG4gNTY4Olx0XHRcdFx0XHRcdGludCAqa19wdHIpXG4gNTY5Olx0e1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzMxOAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEzNjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBJbXBsaWNhdGlvbnMgb2YgdGhlIGBwcm9jX2ludF9jb252YCBNb2RpZmljYXRpb24qKgoKT2theSwgc28gYHByb2NfaW50X2NvbnZgIHdyaXRlcyB0byBga19wdHJgLCBnb3QgaXQuIFRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gYmUgaGFwcGVuaW5nIHdpdGhpbiBgYXBwbHlfY29udl9vbl92ZWNgLiBgZGF0YWAsIHBhc3NlZCBhcyBga19wdHJgLCBpcyB0aGUga2V5IHZhcmlhYmxlIGhlcmUuIElmIGBTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKWAgaXMgdHJ1ZSwgYHByb2NfdmVjX2NvbnZgIGNhbGxzIGBjb252YCB3aGljaCBpbiB0dXJuIGNhbGxzIGBwcm9jX2ludF9jb252YCwgd3JpdGluZyB0byB0aGlzIGBrX3B0cmAsIHdoaWNoIGluIGVzc2VuY2UgaXMgcG9pbnRpbmcgdG8gZWl0aGVyIGBkYXRhX3N0YWdlYCAoaWYgYWxsb2NhdGVkKSBvciBkaXJlY3RseSB0byBgdGFibGUtJmd0O2RhdGFgLgoKTm93LCBpZiBgZGF0YV9zdGFnZWAgaXMgYWxsb2NhdGVkLCBpdCYjMzk7cyBhIGBrbWVtZHVwYCBjb3B5IG9mIGB0YWJsZS0mZ3Q7ZGF0YWAuIEhlcmUmIzM5O3MgdGhlIHBvdGVudGlhbCB3cmlua2xlOiBpZiBgdGFibGUtJmd0O2RhdGFgIGhhcyB1bmluaXRpYWxpemVkIG1lbW9yeSAocGFkZGluZywgdW51c2VkIGFycmF5IGVsZW1lbnRzLCBldGMuKSwgYGttZW1kdXBgIGNvcGllcyAqdGhhdCogdW5pbml0aWFsaXplZCBkYXRhLiBUaGVuLCBgcHJvY192ZWNfY29udmAgb3ZlcndyaXRlcyB0aGUgZWxlbWVudHMgdGhhdCBpdCBzdWNjZXNzZnVsbHkgcGFyc2VzLiBBbmQgY3J1Y2lhbGx5LCBgY29tbWl0X2NvbnZfdmVjYCAqb25seSogY29waWVzIGBucl9jb252YCBlbGVtZW50cyBmcm9tIGBkYXRhX3N0YWdlYCBiYWNrIHRvIGB0YWJsZS0mZ3Q7ZGF0YWAuIFNvLCBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gYGRhdGFfc3RhZ2VgICpiZXlvbmQqIGBucl9jb252YCBlbGVtZW50cyBpcyAqbm90KiBjb3BpZWQgYmFjay4gSSYjMzk7bSBub3RpbmcgdGhlIGRhdGEgdHlwZSBzcGVjaWZpY3MgaGVyZTogYFBST0NfVkVDX0lOVGAgaGFzIG5vIGVsZW1lbnQgcGFkZGluZyAoNCBieXRlcykgYW5kIG5laXRoZXIgZG9lcyBgUFJPQ19WRUNfVUxPTkdgICg4IGJ5dGVzKSwgc28gbm8gcGFkZGluZy1yZWxhdGVkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4KClRoZSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGUgY29weWluZyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gQnV0IHdhaXQsIGBrbWVtZHVwYCB1c2VzIGBtZW1jcHlgLiBEb2VzIGNvcHlpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgdHJpZ2dlciBhIEtNU0FOIHJlcG9ydD8gTm8uIEtNU0FOIHRyYWNrcyB1bmluaXRpYWxpemVkIHN0YXRlLiBDb3B5aW5nIG1lcmVseSBwcm9wYWdhdGVzIHRoZSB1bmluaXRpYWxpemVkIHN0YXRlLCBhbmQgdGhlIEtNU0FOIHJlcG9ydCBpcyBvbmx5IHRyaWdnZXJlZCBpZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyB1c2VkIGluIGJyYW5jaGVzIG9yIHNpbmtzIChsaWtlIGBjb3B5X3RvX3VzZXJgKS4KCkluIHRoaXMgY2FzZSwgYGttZW1kdXBgIGNvcGllcyBgdGFibGUtJmd0O2RhdGFgIHRvIGBkYXRhX3N0YWdlYCwgYGNvbW1pdF9jb252X3ZlY2AgY29waWVzIGJhY2sgb25seSB0aGUgY29udmVydGVkIGVsZW1lbnRzLiBObyB1c2VyLXNwYWNlIGxlYWsgYmVjYXVzZSBgU1lTQ1RMX1VTRVJfVE9fS0VSTmAgaXMgd3JpdGluZyBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQuICBGb3IgYFNZU0NUTF9LRVJOX1RPX1VTRVJgLCBubyBgZGF0YV9zdGFnZWAgaXMgYWxsb2NhdGVkLCBgZGF0YWAgZGlyZWN0bHkgcG9pbnRzIHRvIGB0YWJsZS0mZ3Q7ZGF0YWAsIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGJlZm9yZSB0aGUgcGF0Y2guIFRoZSBsb2dpYyBmb3IgcmVhZGluZyBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlIGlzIHVuY2hhbmdlZC4KClNvLCB0aGUgbmV3IGFwcHJvYWNoIHVzZXMgYSB0ZW1wb3JhcnkgYnVmZmVyIChgZGF0YV9zdGFnZWApIHdoZW4gd3JpdGluZyBmcm9tIHVzZXIgc3BhY2UgdG8gdGhlIGtlcm5lbDogY29weSwgdXBkYXRlLCBhbmQgdGhlbiBvbmx5IGNvcHkgY2hhbmdlZCBlbGVtZW50cyBiYWNrLgoKTm93LCBhbSBJIG1pc3Npbmcgc29tZXRoaW5nIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnk/IFRoZSBtYWluIGNvbmNlcm4gaGVyZSBpcyB0aGUgcHJvcGFnYXRpb24gb2YgdGhpcyB1bmluaXRpYWxpemVkIG1lbW9yeSB0aHJvdWdoIGBrbWVtZHVwYC4gSXQganVzdCBwYXNzZXMgaXQgdGhyb3VnaCwgd2hpY2ggYnkgaXRzZWxmIGlzIG5vdCBhbiBpc3N1ZSwgYXMgbG9uZyBhcyBpdCBpc24mIzM5O3QgdXNlZCB3aGVyZSBpdCB3b3VsZCBiZSBjaGVja2VkLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgY2hlY2sgYHByb2NfdmVjX2NvbnZgLCB0aGVyZSBtYXkgYmUgc29tZSB1c2Ugb3IgY2hlY2sgb2YgdGhhdCBkYXRhIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjE1Olx0XHRpbnQgKCp1aW50X2NvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWludCAqa19wdHIsXG4gNjE2Olx0XHRcdFx0IGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKTtcbiA2MTc6XHRcdGludCAoKnVsb25nX2NvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLFxuIDYxODpcdFx0XHRcdCAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpO1xuIDYxOTpcdH07XG4gNjIwOlx0XG4gNjIxOlx0LypcbiA2MjI6XHQgKiBEaXNwYXRjaCB0byB0aGUgY29udmVydGVyIG1lbWJlciBzZWxlY3RlZCBieSBAdHlwZS4gQGtfcHRyIHdhbGtzXG4gNjIzOlx0ICogdGFibGUtXHUwMDNlZGF0YSBhcyByYXcgYnl0ZXMgYW5kIGlzIGNhc3QgYmFjayB0byB0aGUgZWxlbWVudCB0eXBlIGhlcmUuXG4gNjI0Olx0ICovXG4gNjI1Olx0c3RhdGljIGludCBwcm9jX3ZlY19jb252KGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXG4gNjI2Olx0XHRcdFx0IGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgY2hhciAqa19wdHIsIGludCBkaXIsXG4gNjI3Olx0XHRcdFx0IGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKVxuIDYyODpcdHtcbiA2Mjk6XHRcdHN3aXRjaCAodHlwZSkge1xuIDYzMDpcdFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XG4gNjMxOlx0XHRcdHJldHVybiBjb252LmludF9jb252KG5lZ3AsIHVfcHRyLCAoaW50ICopa19wdHIsIGRpciwgdGFibGUpO1xuIDYzMjpcdFx0Y2FzZSBQUk9DX1ZFQ19VSU5UOlxuIDYzMzpcdFx0XHRyZXR1cm4gY29udi51aW50X2NvbnYobmVncCwgdV9wdHIsICh1aW50ICopa19wdHIsIGRpciwgdGFibGUpO1xuIDYzNDpcdFx0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbiA2MzU6XHRcdFx0cmV0dXJuIGNvbnYudWxvbmdfY29udihuZWdwLCB1X3B0ciwgKHVsb25nICopa19wdHIsIGRpciwgdGFibGUpO1xuIDYzNjpcdFx0fVxuIDYzNzpcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjM4Olx0fVxuIDYzOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTg0MAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqUmV2aXNpdGluZyBgYXBwbHlfY29udl9vbl92ZWNgKioKCk9rYXksIHRpbWUgdG8gY2lyY2xlIGJhY2sgdG8gYGFwcGx5X2NvbnZfb25fdmVjYC4gSSBuZWVkIHRvIHNvbGlkaWZ5IG15IHVuZGVyc3RhbmRpbmcgb2YgdGhhdCBmdW5jdGlvbiYjMzk7cyBiZWhhdmlvci4gSSB3YW50IHRvIGVuc3VyZSBpdCYjMzk7cyBiZWhhdmluZyBwcmVjaXNlbHkgYXMgSSBleHBlY3Qgd2l0aGluIHRoaXMgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlLCBlc3BlY2lhbGx5IGluIHJlZ2FyZHMgdG8gcGFkZGluZywgc3RyaWRlLCBhbmQgZmlsdGVyIGFwcGxpY2F0aW9uLiBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluIHRoZXJlIGFyZW4mIzM5O3QgYW55IHN1YnRsZSBiaWFzZXMgY3JlZXBpbmcgaW4sIHBhcnRpY3VsYXJseSBhdCB0aGUgYm91bmRhcmllcy4gTGV0IG1lIG1lbnRhbGx5IHdhbGsgdGhyb3VnaCBhIGZldyBleGFtcGxlIGlucHV0cyBhbmQgdHJhY2UgdGhlIGNvbXB1dGF0aW9ucyDigJMgbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWlzc2VkIGEgY29ybmVyIGNhc2UuIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYWN0aXZhdGlvbiBmdW5jdGlvbnMgZG93biB0aGUgbGluZSwgc28gdGhlIG91dHB1dCBkaW1lbnNpb25hbGl0eSBpcyBjcml0aWNhbC4gSSYjMzk7bSBnb2luZyB0byBsb29rIGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB3aXRoIGEgbW9yZSBjcml0aWNhbCBleWUuIEkgc3VzcGVjdCBhIHNpbXBsZSBtZW50YWwgY2hlY2sgd29uJiMzOTt0IHN1ZmZpY2U7IEkgbWlnaHQgZXZlbiB0cnkgd3JpdGluZyBhIHF1aWNrIHVuaXQgdGVzdCB0byB2ZXJpZnkgaXTigJlzIGJlaGF2aW5nIGFjY29yZGluZyB0byB0aGUgZXN0YWJsaXNoZWQgZnJhbWV3b3JrLiBJdCYjMzk7cyBhIGtleSBjb21wb25lbnQsIHNvIGEgZGVlcCB1bmRlcnN0YW5kaW5nIGhlcmUgcGF5cyBkaXZpZGVuZHMgZG93biB0aGUgbGluZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2NjEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY2MTpcdCAqIGFwcGx5X2NvbnZfb25fdmVjIC0gQXBwbHkgY29udmVydGVyIGZ1bmN0aW9uIG9uIGRhdGEgdmVjdG9yXG4gNjYyOlx0ICpcbiA2NjM6XHQgKiBFbGVtZW50IHNpZ25lZG5lc3MgaXMgZGVyaXZlZCBmcm9tIEBkYXRhX3R5cGUuIHRhYmxlLVx1MDAzZWRhdGEgaXMgd2Fsa2VkXG4gNjY0Olx0ICogYXMgcmF3IGJ5dGVzIChAZGF0YSkgYWR2YW5jZWQgYnkgQGRhdGFfc2l6ZTsgdGhlIGNvbnZlcnRlciBwZXJmb3Jtc1xuIDY2NTpcdCAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mXG4gNjY2Olx0ICogYnl0ZXMgdGhhdCB3aGVyZSBsZWZ0IG91dHN0YW5kaW5nIGFmdGVyIGNvbnZlcnNpb24uIENhbiBiZSBcdTAwM2UgMC5cbiA2Njc6XHQgKlxuIDY2ODpcdCAqIFJldHVybnMgMCBvbiBzdWNjZXNzLiBOb24temVybyBvbiBlcnJvci5cbiA2Njk6XHQgKi9cbiA2NzA6XHRzdGF0aWMgaW50IGFwcGx5X2NvbnZfb25fdmVjKGNvbnN0IHVuaW9uIHByb2NfdmVjX2NvbnYgY29udixcbiA2NzE6XHRcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLFxuIDY3MjpcdFx0XHRcdCAgICAgY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSxcbiA2NzM6XHRcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IGludCBjb252X2RpcixcbiA2NzQ6XHRcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBidWZfbmJ5dGUsIHZvaWQgKmJ1ZixcbiA2NzU6XHRcdFx0XHQgICAgIHNpemVfdCAqYnVmX2xlZnRfZmluYWwpXG4gNjc2Olx0e1xuIDY3NzpcdFx0aW50IHZlY19sZWZ0LCBlcnIgPSAwO1xuIDY3ODpcdFx0c2l6ZV90IGJ1Zl9sZWZ0LCBucl9jb252ID0gMDtcbiA2Nzk6XHRcdGNoYXIgKmRhdGEsICpkYXRhX3N0YWdlID0gTlVMTCwgKnA7XG4gNjgwOlx0XHRib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HO1xuIDY4MTpcdFxuIDY4MjpcdFx0YnVmX2xlZnQgPSBidWZfbmJ5dGU7XG4gNjgzOlx0XG4gNjg0Olx0XHRkYXRhID0gdGFibGUtXHUwMDNlZGF0YTtcbiA2ODU6XHRcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xuIDY4NjpcdFx0XHRpZiAoYnVmX2xlZnQgXHUwMDNlIFBBR0VfU0laRSAtIDEpXG4gNjg3Olx0XHRcdFx0YnVmX2xlZnQgPSBQQUdFX1NJWkUgLSAxO1xuIDY4ODpcdFx0XHRwID0gYnVmO1xuIDY4OTpcdFxuIDY5MDpcdFx0XHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAzZSBkYXRhX3NpemUpIHtcbiA2OTE6XHRcdFx0XHRkYXRhX3N0YWdlID0ga21lbWR1cCh0YWJsZS1cdTAwM2VkYXRhLCB0YWJsZS1cdTAwM2VtYXhsZW4sIEdGUF9LRVJORUwpO1xuIDY5MjpcdFx0XHRcdGlmICghZGF0YV9zdGFnZSkge1xuIDY5MzpcdFx0XHRcdFx0ZXJyID0gLUVOT01FTTtcbiA2OTQ6XHRcdFx0XHRcdGdvdG8gb3V0O1xuIDY5NTpcdFx0XHRcdH1cbiA2OTY6XHRcdFx0XHRkYXRhID0gZGF0YV9zdGFnZTtcbiA2OTc6XHRcdFx0fVxuIDY5ODpcdFx0fVxuIDY5OTpcdFxuIDcwMDpcdFx0dmVjX2xlZnQgPSB0YWJsZS1cdTAwM2VtYXhsZW4gLyBkYXRhX3NpemU7XG4gNzAxOlx0XHRmb3IgKDsgYnVmX2xlZnQgXHUwMDI2XHUwMDI2IHZlY19sZWZ0LS07IGRhdGEgJiM0Mzs9IGRhdGFfc2l6ZSwgbnJfY29udiYjNDM7JiM0MzspIHtcbiA3MDI6XHRcdFx0dW5zaWduZWQgbG9uZyBsdmFsO1xuIDcwMzpcdFx0XHRib29sIG5lZyA9IGZhbHNlO1xuIDcwNDpcdFxuIDcwNTpcdFx0XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbiA3MDY6XHRcdFx0XHRwcm9jX3NraXBfc3BhY2VzKFx1MDAyNnAsIFx1MDAyNmJ1Zl9sZWZ0KTtcbiA3MDc6XHRcbiA3MDg6XHRcdFx0XHRpZiAoIWJ1Zl9sZWZ0KVxuIDcwOTpcdFx0XHRcdFx0YnJlYWs7XG4gNzEwOlx0XHRcdFx0ZXJyID0gcHJvY19nZXRfbG9uZyhcdTAwMjZwLCBcdTAwMjZidWZfbGVmdCwgXHUwMDI2bHZhbCwgXHUwMDI2bmVnLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjk0MwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDI3MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBJbW1lZGlhdGUgQ29uY2VybnMgUmVnYXJkaW5nIGBjb21taXRfY29udl92ZWNgKioKCk9rYXksIGhvbGQgb24gYSBzZWNvbmQuIEkgd2FzIHJldmlld2luZyB0aGUgZGF0YSB0eXBlcyBiZWluZyBoYW5kbGVkLCBhbmQgYSBxdWVzdGlvbiBqdXN0IHBvcHBlZCBpbnRvIG15IGhlYWQ6IHdoYXQgaWYgdGhlIGBkYXRhX3R5cGVgIGlzIGBQUk9DX1ZFQ19VSU5UYD8gTGV0JiMzOTtzIHF1aWNrbHkgcmUtZXhhbWluZSB0aGUgYGNvbW1pdF9jb252X3ZlY2AgZnVuY3Rpb24uIEkmIzM5O20gdGFraW5nIGEgbG9vayBhdCB0aGUgY29kZToKCmBgYGMKc3RhdGljIGludCBjb21taXRfY29udl92ZWMoY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSwgdm9pZCAqZHN0LAoJCQkgICAgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnIpCnsKCXNpemVfdCBpOwoKCXN3aXRjaCAoZGF0YV90eXBlKSB7CgljYXNlIFBST0NfVkVDX0lOVDoKCQlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KQoJCQlXUklURV9PTkNFKCgoaW50ICopZHN0KVtpXSwgKChjb25zdCBpbnQgKilzcmMpW2ldKTsKCQlyZXR1cm4gMDsKCgljYXNlIFBST0NfVkVDX1VMT05HOgoJCWZvciAoaSA9IDA7IGkgJmx0OyBucjsgaSYjNDM7JiM0MzspCgkJCVdSSVRFX09OQ0UoKCh1bG9uZyAqKWRzdClbaV0sICgoY29uc3QgdWxvbmcgKilzcmMpW2ldKTsKCQlyZXR1cm4gMDsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KYGBgCgouLi5hbmQgdGhlcmUgaXQgaXMuICoqYFBST0NfVkVDX1VJTlRgIGlzIGdsYXJpbmdseSBhYnNlbnQqKiBmcm9tIHRoZSBgc3dpdGNoYCBzdGF0ZW1lbnQhIElmIHRoZSBmdW5jdGlvbiByZWNlaXZlcyBhIGBkYXRhX3R5cGVgIG9mIGBQUk9DX1ZFQ19VSU5UYCwgdGhlbiB0aGUgYGRlZmF1bHRgIGNhc2Ugd2lsbCBiZSB0cmlnZ2VyZWQsIHJlc3VsdGluZyBpbiBhIHJldHVybiB2YWx1ZSBvZiBgLUVJTlZBTGAuIFRoaXMgaXMgZGVmaW5pdGVseSBhIGJ1ZzsgaXQgaXMgYW4gZXJyb3IgcmV0dXJuIGJlY2F1c2UgYFBST0NfVkVDX1VJTlRgIGlzIGEgdmFsaWQgdHlwZSBpbiB0aGlzIGNvbnRleHQuIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBuZXh0IGFuZCB3aGF0IHRoYXQgbWlzc2luZyB0eXBlIGlzLiBMZXQmIzM5O3Mgc2VlIHdoYXQgaGFwcGVucyB3aXRoaW4gYHByb2NfZG91aW50dmVjX2NvbnZgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgyMywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgODIzOlx0XHRcdFx0aW50ICgqY29udikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCB1aW50ICprX3B0cixcbiA4MjQ6XHRcdFx0XHRcdCAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkpXG4gODI1Olx0e1xuIDgyNjpcdFx0LyogdWludCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQsICpEbyBub3QqIGFkZCBzdXBwb3J0IGZvciB0aGVtLiAqL1xuIDgyNzpcdFx0aWYgKHRhYmxlLVx1MDAzZW1heGxlbiBcdTAwMjZcdTAwMjYgKHRhYmxlLVx1MDAzZW1heGxlbiAvIHNpemVvZih1aW50KSkgIT0gMSlcbiA4Mjg6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gODI5Olx0XG4gODMwOlx0XHRpZiAoIWNvbnYpXG4gODMxOlx0XHRcdGNvbnYgPSBkb19wcm9jX3VpbnRfY29udjtcbiA4MzI6XHRcbiA4MzM6XHRcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXG4gODM0Olx0XHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gY29udiB9KTtcbiA4MzU6XHR9XG4gODM2Olx0XG4gODM3Olx0LyoqXG4gODM4Olx0ICogcHJvY19kb2Jvb2wgLSByZWFkL3dyaXRlIGEgYm9vbFxuIDgzOTpcdCAqIEB0YWJsZTogdGhlIHN5c2N0bCB0YWJsZVxuIDg0MDpcdCAqIEBkaXI6ICVUUlVFIGlmIHRoaXMgaXMgYSB3cml0ZSB0byB0aGUgc3lzY3RsIGZpbGVcbiA4NDE6XHQgKiBAYnVmZmVyOiB0aGUgdXNlciBidWZmZXJcbiA4NDI6XHQgKiBAbGVucDogdGhlIHNpemUgb2YgdGhlIHVzZXIgYnVmZmVyXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3OTgyCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNTI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTWVtb3J5IEhhbmRsaW5nIGluIGBwcm9jX2RvdWludHZlY19jb252YCBhbmQgUmVsYXRlZCBGdW5jdGlvbnMqKgoKT2theSwgc28gYHByb2NfZG91aW50dmVjX2NvbnZgIGVzc2VudGlhbGx5IGhhcmRjb2RlcyBgdGFibGUtJmd0O21heGxlbmAgdG8gYmUgYHNpemVvZih1aW50KWAg4oCTIGdvdCBpdC4gVGhpcyBtZWFucyBpbiBgYXBwbHlfY29udl9vbl92ZWNgLCB3aGVuIGB0YWJsZS0mZ3Q7bWF4bGVuYCBpcyBub3QgZ3JlYXRlciB0aGFuIGBkYXRhX3NpemVgICh3aGljaCBpcyB0aGUgc2FtZSBhcyBgc2l6ZW9mKHVpbnQpYCksIGBkYXRhX3N0YWdlYCAqaXNuJiMzOTt0KiBhbGxvY2F0ZWQuIFRodXMsIGBkYXRhYCBkaXJlY3RseSBwb2ludHMgdG8gYHRhYmxlLSZndDtkYXRhYCwgd2hpY2ggaXMgdmVyeSBjb252ZW5pZW50LiBCZWNhdXNlIGBkYXRhX3N0YWdlYCBpcyBOVUxMLCBgY29tbWl0X2NvbnZfdmVjYCBpcyBza2lwcGVkLiBUaGVyZWZvcmUsIGBQUk9DX1ZFQ19VSU5UYCBkaXJlY3RseSBtb2RpZmllcyBgdGFibGUtJmd0O2RhdGFgLCB3aGljaCBpcyBleHBlY3RlZC4gTm8gbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbXMgdGhlcmUuCgpOb3csIHdoYXQgYWJvdXQgdGhlIGludGVnZXIgYW5kIHVuc2lnbmVkIGxvbmcgdmVyc2lvbnMsIGBQUk9DX1ZFQ19JTlRgIGFuZCBgUFJPQ19WRUNfVUxPTkdgPyBJdCYjMzk7cyBhIHNsaWdodGx5IGRpZmZlcmVudCBzY2VuYXJpby4gSWYgYHRhYmxlLSZndDttYXhsZW5gICppcyogZ3JlYXRlciB0aGFuIGBkYXRhX3NpemVgLCB0aGVuIGBkYXRhX3N0YWdlYCAqaXMqIGFsbG9jYXRlZC4gQnV0IGlmIGB0YWJsZS0mZ3Q7ZGF0YWAgaGFzbiYjMzk7dCBiZWVuIGluaXRpYWxpemVkLCBga21lbWR1cGAgY29waWVzIGl0LiBUaGlzIGlzIHdoZXJlIEkgc3RhcnQgdG8gd29ycnk6IGFyZSB3ZSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBLTVNBTiBpcyB1c3VhbGx5IGdvb2QgYXQgY2F0Y2hpbmcgdGhhdCwgYnV0IGBrbWVtZHVwYCB1c2VzIGBrbWFsbG9jYCBhbmQgYG1lbWNweWAuCgpgbWVtY3B5YCBpdHNlbGYgY29waWVzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBhbmQgS01TQU4gdHJhY2tzIGl0LiBUaGUga2V5IHF1ZXN0aW9uIGlzOiBkb2VzIGBtZW1jcHlgIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5ICp0cmlnZ2VyKiBhIHJlcG9ydD8gTm8sIGl0IGp1c3QgcHJvcGFnYXRlcyB0aGUgc2hhZG93IHN0YXRlLiBUaGF0JiMzOTtzIGdvb2QsIGJ1dCBpdCBtZWFucyB3ZSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bC4KClRoZW4gYHByb2NfdmVjX2NvbnZgIG92ZXJ3cml0ZXMgdGhlIGZpcnN0IGBucl9jb252YCBlbGVtZW50cyBpbiBgZGF0YV9zdGFnZWAuIEFmdGVyIHRoYXQsIGBjb21taXRfY29udl92ZWNgIGNvcGllcyB0aGUgZmlyc3QgYG5yX2NvbnZgIGVsZW1lbnRzIGJhY2sgdG8gYHRhYmxlLSZndDtkYXRhYC4gU3BlY2lmaWNhbGx5OgoKYGBgYwoJCWZvciAoaSA9IDA7IGkgJmx0OyBucjsgaSYjNDM7JiM0MzspCgkJCVdSSVRFX09OQ0UoKChpbnQgKilkc3QpW2ldLCAoKGNvbnN0IGludCAqKXNyYylbaV0pOwpgYGAKClRoaXMgY29waWVzIHRoZSAqaW5pdGlhbGl6ZWQqIGVsZW1lbnRzIGJhY2ssIHdoaWNoIGlzIGZpbmUsIGFzIGBkc3RgIGlzIGB0YWJsZS0mZ3Q7ZGF0YWAsIGFuZCBgc3JjYCBpcyBgZGF0YV9zdGFnZWAuIFRoZSB1bmluaXRpYWxpemVkIHBhcnRzIG9mIGBkYXRhX3N0YWdlYCBhcmUgbmV2ZXIgcmVhZCBvciBjb3BpZWQgKmJhY2sqLgoKSG93ZXZlciwgYW5kIHRoaXMgaXMgY3JpdGljYWw6IFdoYXQgaWYgYHByb2NfdmVjX2NvbnZgIGl0c2VsZiAqcmVhZHMqIGZyb20gYGRhdGFgIGJlZm9yZSBpdCB3cml0ZXMgdG8gaXQ/IEkgc2hvdWxkIHJlLWV4YW1pbmUgYHByb2NfaW50X2NvbnZgIHdpdGggdGhpcyBpbiBtaW5kLiBUaGF0JiMzOTtzIHdoZXJlIGEgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdHkgbGllcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDU0MDpcdGludCBwcm9jX2ludF9jb252KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgaW50ICprX3B0ciwgaW50IGRpcixcbiA1NDE6XHRcdFx0ICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwsIGJvb2wga19wdHJfcmFuZ2VfY2hlY2ssXG4gNTQyOlx0XHRcdCAgaW50ICgqdXNlcl90b19rZXJuKShjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIpLFxuIDU0MzpcdFx0XHQgIGludCAoKmtlcm5fdG9fdXNlcikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKSlcbiA1NDQ6XHR7XG4gNTQ1Olx0XHRpZiAoU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKVxuIDU0NjpcdFx0XHRyZXR1cm4ga2Vybl90b191c2VyKG5lZ3AsIHVfcHRyLCBrX3B0cik7XG4gNTQ3Olx0XG4gNTQ4Olx0XHRpZiAoa19wdHJfcmFuZ2VfY2hlY2spIHtcbiA1NDk6XHRcdFx0aW50IHRtcF9rLCByZXQ7XG4gNTUwOlx0XG4gNTUxOlx0XHRcdGlmICghdGJsKVxuIDU1MjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDU1MzpcdFx0XHRyZXQgPSB1c2VyX3RvX2tlcm4obmVncCwgdV9wdHIsIFx1MDAyNnRtcF9rKTtcbiA1NTQ6XHRcdFx0aWYgKHJldClcbiA1NTU6XHRcdFx0XHRyZXR1cm4gcmV0O1xuIDU1NjpcdFx0XHRpZiAoKHRibC1cdTAwM2VleHRyYTEgXHUwMDI2XHUwMDI2ICooaW50ICopdGJsLVx1MDAzZWV4dHJhMSBcdTAwM2UgdG1wX2spIHx8XG4gNTU3Olx0XHRcdCAgICAodGJsLVx1MDAzZWV4dHJhMiBcdTAwMjZcdTAwMjYgKihpbnQgKil0YmwtXHUwMDNlZXh0cmEyIFx1MDAzYyB0bXBfaykpXG4gNTU4Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNTU5Olx0XHRcdFdSSVRFX09OQ0UoKmtfcHRyLCB0bXBfayk7XG4gNTYwOlx0XHR9IGVsc2VcbiA1NjE6XHRcdFx0cmV0dXJuIHVzZXJfdG9fa2VybihuZWdwLCB1X3B0ciwga19wdHIpO1xuIDU2MjpcdFx0cmV0dXJuIDA7XG4gNTYzOlx0fVxuIDU2NDpcdFxuIDU2NTpcdFxuIDU2NjpcdFxuIDU2NzpcdHN0YXRpYyBpbnQgc3lzY3RsX3VzZXJfdG9fa2Vybl9pbnRfY29udihjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsXG4gNTY4Olx0XHRcdFx0XHRcdGludCAqa19wdHIpXG4gNTY5Olx0e1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTYyOAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgdGhlIERhdGEgRmxvdyB3aXRoaW4gYHByb2NfaW50X2NvbnZgKioKCkFscmlnaHQsIHNvIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlIGBwcm9jX2ludF9jb252YCBmdW5jdGlvbiByaWdodCBub3csIGFuZCBzcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uYWxpdHkgd2l0aGluIGl0LiBNeSBtaW5kIGltbWVkaWF0ZWx5IGZsYWdzIHRoZSBjYWxsIHRvIGB1c2VyX3RvX2tlcm5gLiBUaGF0JiMzOTtzIGEgY3JpdGljYWwgcG9pbnQsIGlzbiYjMzk7dCBpdD8gSXQgbWVhbnMgd2UmIzM5O3JlIG1vdmluZyBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBrZXJuZWwgc3BhY2UgYXQgdGhhdCBwb2ludC4gSSBuZWVkIHRvIGtlZXAgdGhhdCBpbiBtaW5kIHdoZW4gZXhhbWluaW5nIGFueSBhc3NvY2lhdGVkIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MsIG9yIHBvdGVudGlhbCBkYXRhIGNvcnJ1cHRpb24gaXNzdWVzLiBJIG5lZWQgdG8gcmVmcmVzaCB0aGUgcmVhc29ucyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIGRhdGEgaXQgb3BlcmF0ZXMgb24sIGFuZCB3aGF0IHRoZSB1bHRpbWF0ZSBwdXJwb3NlIGlzLiBDb250ZXh0IGlzIGtleSwgYW5kIHRoYXQgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgcmFpc2VzIGEgcmVkIGZsYWcgaW4gbXkgbWluZCB0aGF0IG5lZWRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NjcsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDU2NzpcdHN0YXRpYyBpbnQgc3lzY3RsX3VzZXJfdG9fa2Vybl9pbnRfY29udihjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsXG4gNTY4Olx0XHRcdFx0XHRcdGludCAqa19wdHIpXG4gNTY5Olx0e1xuIDU3MDpcdFx0cmV0dXJuIHByb2NfaW50X3Uya19jb252X3VvcCh1X3B0ciwga19wdHIsIG5lZ3AsIE5VTEwpO1xuIDU3MTpcdH1cbiA1NzI6XHRcbiA1NzM6XHRzdGF0aWMgaW50IHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKVxuIDU3NDpcdHtcbiA1NzU6XHRcdHJldHVybiBwcm9jX2ludF9rMnVfY29udl9rb3AodV9wdHIsIGtfcHRyLCBuZWdwLCBOVUxMKTtcbiA1NzY6XHR9XG4gNTc3Olx0XG4gNTc4Olx0c3RhdGljIGludCBkb19wcm9jX2ludF9jb252KGJvb2wgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLFxuIDU3OTpcdFx0XHRcdCAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwpXG4gNTgwOlx0e1xuIDU4MTpcdFx0cmV0dXJuIHByb2NfaW50X2NvbnYobmVncCwgdV9wdHIsIGtfcHRyLCBkaXIsIHRibCwgZmFsc2UsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMTc5CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gY2hlY2tpbmcgYHByb2NfaW50X3Uya19jb252X3VvcGAgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCBtdXNpbmdzOgoKKipBbmFseXppbmcgYHByb2NfaW50X3Uya19jb252X3VvcGAqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIE15IGZpcnN0IGluc3RpbmN0IGlzIHRvIHplcm8gaW4gb24gdGhhdCBzcGVjaWZpYyBmdW5jdGlvbiDigJMgYHByb2NfaW50X3Uya19jb252X3VvcGAuIEkga25vdyB0aGlzIGlzIGxpa2VseSBzb21lIGtpbmQgb2YgaW50ZWdlciB0byBLIGNvbnZlcnNpb24gbWljcm8tb3AgcHJvY2Vzc29yLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IHdoYXQgdGhhdCBtZWFucy4gSXMgdGhpcyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlPyBJcyBpdCBhIHN0YW5kYXJkIGNvbnZlcnNpb24/IFdoYXQmIzM5O3MgdGhlIGNvbnRleHQ/CgpNeSBpbW1lZGlhdGUgY2hlY2tsaXN0IHN0YXJ0cyBydW5uaW5nOgoKKiAgICoqRGF0YSBUeXBlczoqKiBXaGF0IGFyZSB0aGUgaW5wdXQgaW50ZWdlciB0eXBlcz8gSXMgaXQgYSBzaWduZWQgb3IgdW5zaWduZWQgaW50ZWdlciwgYW5kIHRoZSBleGFjdCBiaXQgd2lkdGg/IFdoZXJlIGlzIGl0IGNvbnZlcnRpbmcgKnRvKj8gSXMgJiMzNDtLJiMzNDsgYSBzcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvciBzb21lIHNvcnQgb2YgaW50ZXJtZWRpYXRlIGludGVybmFsIGZvcm1hdD8KKiAgICoqT3BlcmF0aW9uOioqIFdoYXQgc3BlY2lmaWMgKmNvbnZlcnNpb24qIGlzIGl0IGRvaW5nPyBJcyBpdCBzaW1wbGUgdHJ1bmNhdGlvbiwgcm91bmRpbmcsIHNhdHVyYXRpb24sIG9yIHNvbWV0aGluZyBtb3JlIGNvbXBsZXg/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBiZWhhdmlvciB1bmRlciBkaWZmZXJlbnQgaW5wdXQgY29uZGl0aW9ucywgZXNwZWNpYWxseSBlZGdlIGNhc2VzIGxpa2UgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMsIG5lZ2F0aXZlIG51bWJlcnMsIGFuZCB6ZXJvZXMuCiogICAqKkltcGxlbWVudGF0aW9uOioqIEhvdyBpcyBpdCBpbXBsZW1lbnRlZD8gSXMgdGhpcyBhIGhhcmR3YXJlIGJsb2NrLCBvciBhIHNvZnR3YXJlIHJvdXRpbmU/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIG9yIG9wdGltaXphdGlvbnMgSSBzaG91bGQgY29uc2lkZXI/IEFyZSB0aGVyZSBhbnkgb2J2aW91cyBidWdzIHRoYXQgY2FuIHRyaXAgaXQgdXA/CiogICAqKkNvbnRleHQ6KiogV2hhdCYjMzk7cyB0aGUgc3Vycm91bmRpbmcgY29kZSB1c2luZyB0aGlzIGB1b3BgPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGF0YSBmbG93LCB0aGUgY2FsbGluZyBjb250ZXh0LCBhbmQgdGhlIGRvd25zdHJlYW0gY29uc3VtZXJzIG9mIHRoZSByZXN1bHQuIEhvdyBkb2VzIHRoaXMgZml0IGludG8gdGhlIGxhcmdlciBwaWN0dXJlIG9mIHRoZSBwcm9jZXNzb3ImIzM5O3MgcGlwZWxpbmU/IFdoYXQmIzM5O3MgdGhlIG92ZXJhbGwgaW1wYWN0IG9uIHN5c3RlbSBwZXJmb3JtYW5jZT8KKiAgICoqVGVzdGluZzoqKiBXaGF0IGtpbmQgb2YgdGVzdGluZyBoYXMgYmVlbiBkb25lIG9uIHRoaXM/IFdoYXQgdGVzdHMgYXJlIGluIHBsYWNlIHRvIGNvdmVyIHRoZSBkaWZmZXJlbnQgc2NlbmFyaW9zIEkgbWVudGlvbmVkLCBhbmQgaG93IHRob3JvdWdoIGFyZSB0aGV5PyBBcmUgdGhlcmUgYW55IGtub3duIGlzc3VlcyBvciBhcmVhcyBvZiBjb25jZXJuPwoKSSYjMzk7bGwgbmVlZCB0byBkaWcgaW50byB0aGUgc291cmNlIGNvZGUsIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIGFueSByZWxldmFudCBhcmNoaXRlY3R1cmUgbWFudWFscyB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgdGhpcyBpcyBhIGNyaXRpY2FsIGNvbXBvbmVudCwgaWYgaXQmIzM5O3Mgbm90IHdvcmtpbmcgY29ycmVjdGx5IGl0IGNhbiBlYXNpbHkgY2F1c2UgaXNzdWVzLiBJdCYjMzk7cyB0aW1lIHRvIHB1dCBvbiBteSBkZXRlY3RpdmUgaGF0IGFuZCBmaW5kIG91dCB3aGF0JiMzOTtzIGdvaW5nIG9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDUwNiwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTA2Olx0aW50IHByb2NfaW50X3Uya19jb252X3VvcChjb25zdCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIsIGNvbnN0IGJvb2wgKm5lZ3AsXG4gNTA3Olx0XHRcdFx0ICB1bG9uZyAoKnVfcHRyX29wKShjb25zdCB1bG9uZykpXG4gNTA4Olx0e1xuIDUwOTpcdFx0dWxvbmcgdSA9IHVfcHRyX29wID8gdV9wdHJfb3AoKnVfcHRyKSA6ICp1X3B0cjtcbiA1MTA6XHRcbiA1MTE6XHRcdGlmICgqbmVncCkge1xuIDUxMjpcdFx0XHRpZiAodSBcdTAwM2UgKHVsb25nKSBJTlRfTUFYICYjNDM7IDEpXG4gNTEzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNTE0Olx0XHRcdFdSSVRFX09OQ0UoKmtfcHRyLCAtdSk7XG4gNTE1Olx0XHR9IGVsc2Uge1xuIDUxNjpcdFx0XHRpZiAodSBcdTAwM2UgKHVsb25nKSBJTlRfTUFYKVxuIDUxNzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDUxODpcdFx0XHRXUklURV9PTkNFKCprX3B0ciwgdSk7XG4gNTE5Olx0XHR9XG4gNTIwOlx0XHRyZXR1cm4gMDtcbiA1MjE6XHR9XG4gNTIyOlx0XG4gNTIzOlx0LyoqXG4gNTI0Olx0ICogcHJvY19pbnRfY29udiAtIENoYW5nZSB1c2VyIG9yIGtlcm5lbCBwb2ludGVyIGJhc2VkIG9uIGRpcmVjdGlvblxuIDUyNTpcdCAqXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMDI0CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTWVtb3J5IFNhZmV0eSBvZiB0aGUgQ29udmVyc2lvbiBQcm9jZXNzKioKCk9rYXksIHNvIGBwcm9jX2ludF91MmtfY29udl91b3BgIG9ubHkgKndyaXRlcyogdG8gYCprX3B0cmAsIGFuZCBJJiMzOTttIHByZXR0eSBzdXJlIGBwcm9jX3ZlY19jb252YCBvbmx5ICp3cml0ZXMqIHRvIGBkYXRhYCB3aGVuIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggdGhlIGBTWVNDVExfVVNFUl9UT19LRVJOYCBjYXNlLiBUaGVyZWZvcmUsIGluIHRoYXQgZGlyZWN0aW9uLCB0aGVyZSYjMzk7cyBubyByZWFkIGZyb20gYGRhdGFgIHRoYXQgY291bGQgY2F1c2UgdHJvdWJsZS4gTm93LCBgY29tbWl0X2NvbnZfdmVjYCAqcmVhZHMqIG9ubHkgdGhlIGBkYXRhX3N0YWdlYCBlbGVtZW50cyB0aGF0ICp3ZXJlIHdyaXR0ZW4gdG8qLCB1cCB0byBgbnJfY29udmAuCgpIb2xkIG9uLi4uIHdoYXQgaWYgYHByb2NfdmVjX2NvbnZgIGJhaWxzIG91dCBvbiB0aGUgdmVyeSAqZmlyc3QqIGVsZW1lbnQ/IFRoYXQgbWVhbnMgYG5yX2NvbnZgIHdvdWxkIGJlIHplcm8sIHJpZ2h0PyBMZXQmIzM5O3MgY2hlY2sgdGhlIGNvZGUuLi4gWWVwLCBpZiBgbnJfY29udmAgaXMgemVybywgd2UgYmFpbCBvdXQgaW1tZWRpYXRlbHk6CgpgYGBjCgkJaWYgKCFucl9jb252KSB7CgkJCWVyciA9IGVyciA/IDogLUVJTlZBTDsKCQkJZ290byBvdXQ7CgkJfQoJCWlmICghZXJyICZhbXA7JmFtcDsgZGF0YV9zdGFnZSkKCQkJZXJyID0gY29tbWl0X2NvbnZfdmVjKGRhdGFfdHlwZSwgdGFibGUtJmd0O2RhdGEsIGRhdGFfc3RhZ2UsIG5yX2NvbnYpOwpgYGAKClNvLCBpZiBgbnJfY29udmAgaXMgemVybywgd2UganVtcCB0byBgb3V0YCwgYW5kIGBjb21taXRfY29udl92ZWNgICppc24mIzM5O3QqIGV2ZW4gY2FsbGVkLiBJZiBgbnJfY29udmAgaXMgZ3JlYXRlciB0aGFuIHplcm8sIHRoZW4gd2UgKmRvKiBjYWxsIGBjb21taXRfY29udl92ZWNgIHdpdGggYG5yX2NvbnZgLCBzbyBpdCAqb25seSogY29waWVzIHdoYXQgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYW5kIHdyaXR0ZW4gdG8gYGRhdGFfc3RhZ2VgLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBsZWFrcy4gVGhhdCYjMzk7cyBnb29kLgoKQnV0LCB3aGF0IGlmIGBTWVNDVExfS0VSTl9UT19VU0VSYCBpcyB0aGUgY2FzZT8KCmBgYGMKCQl9IGVsc2UgewoJCQlpZiAocHJvY192ZWNfY29udihkYXRhX3R5cGUsIGNvbnYsICZhbXA7bmVnLCAmYW1wO2x2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHsKCQkJCWVyciA9IC1FSU5WQUw7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAobnJfY29udikKCQkJCXByb2NfcHV0X2NoYXIoJmFtcDtidWYsICZhbXA7YnVmX2xlZnQsICYjMzk7XHQmIzM5Oyk7CgkJCXByb2NfcHV0X2xvbmcoJmFtcDtidWYsICZhbXA7YnVmX2xlZnQsIGx2YWwsIG5lZyk7CgkJfQpgYGAKCk9rYXksIGluIHRoaXMgc2NlbmFyaW8sIGBkYXRhYCBpcyBwb2ludGluZyB0byBgdGFibGUtJmd0O2RhdGFgLCB3aGljaCBtZWFucyB0aGUgYGRhdGFgIGFycmF5IGlzIGJlaW5nIHJlYWQuIExvb2tpbmcgYXQgYHByb2NfdmVjX2NvbnZgIGNhbGxzIGBwcm9jX2ludF9jb252YCB3aGljaCB0aGVuIGNhbGxzIGBrZXJuX3RvX3VzZXJgLiBJJiMzOTttIGdvaW5nIHRvIGhhdmUgdG8gZGl2ZSBpbnRvIHRob3NlIGZ1bmN0aW9ucyBuZXh0LCBidXQgYmFzZWQgb24gdGhlIGNvZGUgSSYjMzk7dmUgbG9va2VkIGF0LCB0aGUgd3JpdGUgcHJvY2VzcyBzZWVtcyBzYWZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ5MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDkxOlx0XHRyZXR1cm4gMDtcbiA0OTI6XHR9XG4gNDkzOlx0XG4gNDk0Olx0LyoqXG4gNDk1Olx0ICogcHJvY19pbnRfdTJrX2NvbnZfdW9wIC0gQXNzaWduIHVzZXIgdmFsdWUgdG8gYSBrZXJuZWwgcG9pbnRlclxuIDQ5NjpcdCAqIEB1X3B0cjogcG9pbnRlciB0byB1c2VyIHNwYWNlIHZhcmlhYmxlXG4gNDk3Olx0ICogQGtfcHRyOiBwb2ludGVyIHRvIGtlcm5lbCB2YXJpYWJsZVxuIDQ5ODpcdCAqIEBuZWdwOiBJZiAlVFJVRSwgdGhlIGNvbnZlcnRlZCB1c2VyIHZhbHVlIGlzIG1hZGUgbmVnYXRpdmUuXG4gNDk5Olx0ICogQHVfcHRyX29wOiBleGVjdXRlIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGFzc2lnbmluZyB0byBrX3B0clxuIDUwMDpcdCAqXG4gNTAxOlx0ICogVXNlcyBXUklURV9PTkNFIHRvIGFzc2lnbiB2YWx1ZSB0byBrX3B0ci4gRXhlY3V0ZXMgdV9wdHJfb3AgaWZcbiA1MDI6XHQgKiBub3QgTlVMTC4gQ2hlY2sgZm9yIG92ZXJmbG93IHdpdGggVUlOVF9NQVguXG4gNTAzOlx0ICpcbiA1MDQ6XHQgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MuXG4gNTA1Olx0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyMzE1CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gdGFja2xpbmcgdGhpcyBzbmlwcGV0LCByZW5kZXJlZCBhcyBpZiBpdCB3ZXJlIG15IG93biBpbnRlcm5hbCBtb25vbG9ndWU6CgoqKkFuYWx5emluZyBgcHJvY19pbnRfazJ1X2NvbnZfa29wYCoqCgpBbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTXkgZmlyc3QgaW5zdGluY3QsIGFzIGFsd2F5cywgaXMgdG8gemVybyBpbiBvbiB0aGF0IGZ1bmN0aW9uOiBgcHJvY19pbnRfazJ1X2NvbnZfa29wYC4gVGhlIG5hbWUgaXRzZWxmIGlzIGEgY2x1ZSwgc28gbGV0JiMzOTtzIGJyZWFrIGl0IGRvd24uICYjMzQ7cHJvYyYjMzQ7IGxpa2VseSBpbmRpY2F0ZXMgYSBwcm9jZWR1cmUgb3IgcHJvY2Vzc2luZyBmdW5jdGlvbi4gJiMzNDtpbnQmIzM0OyBzdWdnZXN0cyB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIGludGVnZXJzLCBhbmQgJiMzNDtrMnUmIzM0OyBzZWVtcyB0byBpbXBseSBzb21lIGtpbmQgb2Yga2VybmVsLXRvLXVzZXIgc3BhY2UgY29udmVyc2lvbi4gVGhlICYjMzQ7Y29udiYjMzQ7IGlzIGNsZWFyIC0gYSBjb252ZXJzaW9uIGlzIGhhcHBlbmluZy4gQW5kIGZpbmFsbHksICYjMzQ7a29wJiMzNDsgLi4uIGhtbW0sIHBvdGVudGlhbGx5IGEga2VybmVsIG9wZXJhdGlvbiBvciBrZXJuZWwgb2JqZWN0LCBvciBzb21ldGhpbmcgbGlrZSB0aGF0LgoKU28sIEkmIzM5O20gYWxyZWFkeSBidWlsZGluZyBhIG1lbnRhbCBtb2RlbDogdGhpcyBmdW5jdGlvbiBwcm9iYWJseSBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGludGVnZXIgZGF0YSwgbGlrZWx5IHJlbGF0ZWQgdG8ga2VybmVsIG9wZXJhdGlvbnMgb3Igb2JqZWN0cywgZnJvbSB0aGUga2VybmVsIHNwYWNlIHRvIHRoZSB1c2VyIHNwYWNlLiBUaGUgZGV2aWwmIzM5O3MgaW4gdGhlIGRldGFpbHMgdGhvdWdoLCBhbmQgSSBuZWVkIHRvIHNlZSB3aGF0IGV4YWN0bHkgaXQgKmRvZXMqLiBJIG5lZWQgdG8gc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBzdXJyb3VuZGluZyBjb2RlLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgdG8gdW5kZXJzdGFuZCAqd2h5KiB0aGlzIGNvbnZlcnNpb24gaXMgbmVlZGVkLCBhbmQgKndoYXQqIGtpbmQgb2YgZGF0YSBpcyBiZWluZyBoYW5kbGVkLiBXaGF0IGFyZSB0aGUgc2VjdXJpdHkgaW1wbGljYXRpb25zPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgcmVsYXRlZCB0byBpbnRlZ2VyIG92ZXJmbG93IG9yIGRhdGEgY29ycnVwdGlvbj8gSSB3YW50IHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBpcyAqdXNlZCogYW5kIHdoZXJlIGl0JiMzOTtzICpjYWxsZWQqIGZyb20uIEkmIzM5O2xsIG5lZWQgdG8gdHJhY2UgdGhlIGRhdGEgZmxvdyB0aHJvdWdoIGl0LiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UmIzM5O3ZlIGdvdC4gTGV0JiMzOTtzIHN0YXJ0IHRoZSBkZWVwIGRpdmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Byb2NfaW50X2sydV9jb252X2tvcCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmM9NDU5PXN0YXRpYyBpbnQgZG9fcHJvY191aW50X2NvbnZfbWlubWF4KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWludCAqa19wdHIsXG4tLVxua2VybmVsL3N5c2N0bC5jLTQ2Ni0vKipcbmtlcm5lbC9zeXNjdGwuYzo0Njc6ICogcHJvY19pbnRfazJ1X2NvbnZfa29wIC0gQXNzaWduIGtlcm5lbCB2YWx1ZSB0byBhIHVzZXIgc3BhY2UgcG9pbnRlclxua2VybmVsL3N5c2N0bC5jLTQ2OC0gKiBAdV9wdHI6IHBvaW50ZXIgdG8gdXNlciBzcGFjZSB2YXJpYWJsZVxuLS1cbmtlcm5lbC9zeXNjdGwuYy00NzgtICovXG5rZXJuZWwvc3lzY3RsLmM6NDc5OmludCBwcm9jX2ludF9rMnVfY29udl9rb3AodWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyLCBib29sICpuZWdwLFxua2VybmVsL3N5c2N0bC5jLTQ4MC1cdFx0XHQgIHVsb25nICgqa19wdHJfb3ApKGNvbnN0IHVsb25nKSlcbi0tXG5rZXJuZWwvc3lzY3RsLmM9NTczPXN0YXRpYyBpbnQgc3lzY3RsX2tlcm5fdG9fdXNlcl9pbnRfY29udihib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGNvbnN0IGludCAqa19wdHIpXG5rZXJuZWwvc3lzY3RsLmMtNTc0LXtcbmtlcm5lbC9zeXNjdGwuYzo1NzU6XHRyZXR1cm4gcHJvY19pbnRfazJ1X2NvbnZfa29wKHVfcHRyLCBrX3B0ciwgbmVncCwgTlVMTCk7XG5rZXJuZWwvc3lzY3RsLmMtNTc2LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjMwMzIKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ3OSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDc5Olx0aW50IHByb2NfaW50X2sydV9jb252X2tvcCh1bG9uZyAqdV9wdHIsIGNvbnN0IGludCAqa19wdHIsIGJvb2wgKm5lZ3AsXG4gNDgwOlx0XHRcdFx0ICB1bG9uZyAoKmtfcHRyX29wKShjb25zdCB1bG9uZykpXG4gNDgxOlx0e1xuIDQ4MjpcdFx0aW50IHZhbCA9IFJFQURfT05DRSgqa19wdHIpO1xuIDQ4MzpcdFxuIDQ4NDpcdFx0aWYgKHZhbCBcdTAwM2MgMCkge1xuIDQ4NTpcdFx0XHQqbmVncCA9IHRydWU7XG4gNDg2Olx0XHRcdCp1X3B0ciA9IGtfcHRyX29wID8gLWtfcHRyX29wKCh1bG9uZyl2YWwpIDogLSh1bG9uZyl2YWw7XG4gNDg3Olx0XHR9IGVsc2Uge1xuIDQ4ODpcdFx0XHQqbmVncCA9IGZhbHNlO1xuIDQ4OTpcdFx0XHQqdV9wdHIgPSBrX3B0cl9vcCA/IGtfcHRyX29wKCh1bG9uZyl2YWwpIDogKHVsb25nKSB2YWw7XG4gNDkwOlx0XHR9XG4gNDkxOlx0XHRyZXR1cm4gMDtcbiA0OTI6XHR9XG4gNDkzOlx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzMzI1CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjk1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLTVNBTiBBbmFseXNpcyBvZiBTeXNjdGwgVmVjdG9yIFVwZGF0ZSBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBwcmltYXJ5IGNvbmNlcm4gaXMgd2hldGhlciB0aGlzIHBhdGNoIGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIHRoYXQgY291bGQgbGVhZCB0byBpbmZvcm1hdGlvbiBsZWFrcy4gRmlyc3QsIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiBgcHJvY19pbnRfazJ1X2NvbnZfa29wYCBpcyB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBwYXRjaCDigJMgaXQgcmVhZHMgZnJvbSBgdGFibGUtJmd0O2RhdGFgLCB3aGljaCBpcyB0aGUgc3lzY3RsIHRhYmxlJiMzOTtzIGRhdGEgYXJlYS4gQ3J1Y2lhbGx5LCB0aGlzIHJlYWQgKndhcyogYWxyZWFkeSBwcmVzZW50LCBzbyBhbnkgZXhpc3RpbmcgaXNzdWVzIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gYHRhYmxlLSZndDtkYXRhYCBhcmUgKnByZS1leGlzdGluZyogYW5kICpub3QqIGEgY29uc2VxdWVuY2Ugb2YgdGhpcyByZWZhY3RvcmluZy4gVGhlIHBhdGNoIHNpbXBseSByZXN0cnVjdHVyZXMgdGhlIGxvb3BpbmcgbG9naWMuCgpUaGUga2V5IGNoYW5nZSBsaWVzIGluIGhhbmRsaW5nIHVzZXItdG8ta2VybmVsIHdyaXRlcy4gQmVmb3JlIHRoZSBwYXRjaCwgdGhlIGNvZGUgaW4gYGRvX3Byb2NfdmVjYCBwYXJzZWQgaW5jb21pbmcgZGF0YSwgYW5kIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgcGFyc2luZyBvZiBhICpzdWJzZXF1ZW50KiBlbGVtZW50IGl0IGNvdWxkIGxlYXZlICpwYXJ0KiBvZiB0aGUgYXJyYXkgdXBkYXRlZCDigJMgdGhpcyBpcyBhIHBhcnRpYWwgdXBkYXRlIHZ1bG5lcmFiaWxpdHkuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgYGRhdGFfc3RhZ2VgIGNvcHkgb2YgYHRhYmxlLSZndDtkYXRhYC4gVGhpcyBpcyBwcm9taXNpbmchIFRoZSBwYXRjaCBub3cgd3JpdGVzIHRvIHRoZSBgZGF0YV9zdGFnZWAsIGFuZCBpbXBvcnRhbnRseSwgdGhlIG9yaWdpbmFsIGNvZGUgKndhcyogc3VzY2VwdGlibGUgdG8gdGhpcywgaXQgd2lsbCBOT1QgY2FsbCBgY29tbWl0X2NvbnZfdmVjYCBvbiBlcnJvcjsgdGhpcyBpcyB0aGUga2V5IHRvIGZpeGluZyB0aGUgcGFydGlhbCB1cGRhdGUgYnVnLiBJdCBhdm9pZHMgdXBkYXRpbmcgYHRhYmxlLSZndDtkYXRhYCBpZiBhbnkgZWxlbWVudCBwYXJzZSBmYWlscy4KClRoZSBpbnRyb2R1Y3Rpb24gb2YgYGRhdGFfc3RhZ2VgIHZpYSBga21lbWR1cGAgaXMgdGhlIGFyZWEgSSBuZWVkIHRvIHNjcnV0aW5pemUuIGBrbWVtZHVwYCBhbGxvY2F0ZXMgbWVtb3J5LCB3aGljaCBpcyBnb29kLiBCdXQgaXQgKmNvcGllcyogZnJvbSBgdGFibGUtJmd0O2RhdGFgLiBJZiBgdGFibGUtJmd0O2RhdGFgIGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBga21lbWR1cGAgd2lsbCBjb3B5IHRoYXQgdG9vLiBIb3dldmVyLCBzaW5jZSB0aGUgY29weSBpcyBkb25lIHdpdGggYG1lbWNweWAsIEtNU0FOIGlzbiYjMzk7dCB0cmlnZ2VyZWQgYnkgdGhhdDsgYGttZW1kdXBgIGNvcGllcyBmcm9tIGB0YWJsZS0mZ3Q7ZGF0YWAgaW50byBhIG5ldyBhbGxvY2F0ZWQgbWVtb3J5LiBBZnRlciB0aGUgbW9kaWZpY2F0aW9uIG9mIGBkYXRhX3N0YWdlYCBpcyB0aGUgcG9pbnQgd2hlcmUgdGhlIGBjb21taXRfY29udl92ZWNgIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgcGFyc2VkIGRhdGEsIGFuZCB3cml0ZSBiYWNrIGludG8gYHRhYmxlLSZndDtkYXRhYC4gVGhlbiwgb25seSBgaW50YCBvciBgdWxvbmdgIGVsZW1lbnRzIGFyZSBjb3BpZWQgdG8gYHRhYmxlLSZndDtkYXRhYCwgbm90IHRoZSBmdWxsIGBkYXRhX3N0YWdlYC4gVGhlcmVmb3JlLCBhbnkgdW5pbml0aWFsaXplZCBwYWRkaW5nIGluIGBkYXRhX3N0YWdlYCBpc24mIzM5O3QgY29waWVkIGJhY2sgdG8gdGhlIHN5c2N0bCBkYXRhLiBTaW5jZSB0aGUgc3lzY3RsIHZlY3RvcnMgYXJlIGV4cGxpY2l0bHkgZGVmaW5lZCBhcyBhcnJheXMgb2YgYGludGAsIGB1aW50YCwgb3IgYHVsb25nYCwgdGhlcmUmIzM5O3Mgbm8gcGFkZGluZyBiZXR3ZWVuIGVsZW1lbnRzLiBUaGVyZWZvcmUsIHRoaXMgZWxpbWluYXRlcyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSAqbGVha2luZyogYmFjayB0byBgdGFibGUtJmd0O2RhdGFgLgoKQSBzZWNvbmRhcnkgY2hlY2sgaXMgd2hldGhlciBgdGFibGUtJmd0O21heGxlbmAgKmNvdWxkKiBiZSBhIHZlY3RvciB3aGVyZSBhIGBrbWVtZHVwYCBjb3VsZCBjYXVzZSBhbiBvdXQtb2YtYm91bmRzIHJlYWQgaWYgdGhlIGludGVuZGVkIGRhdGEuIFRoZSBgdmVjX2xlZnQgPSB0YWJsZS0mZ3Q7bWF4bGVuIC8gZGF0YV9zaXplO2AgaXMgdXNlZCwgdGhlIGxvb3Agb25seSBwcm9jZXNzZXMgdGhlIGNvcnJlY3QgZWxlbWVudHMgYW5kIGBjb21taXRfY29udl92ZWNgIG9ubHkgY29waWVzIHdpdGhpbiB0aGUgY29ycmVjdCBib3VuZGFyaWVzLgoKSWYgYHRhYmxlLSZndDttYXhsZW5gIGlzLCBieSBhbnkgbWVhbnMsIGxhcmdlciB0aGFuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGl0IGlzIGEgYnVnIGluIHRoZSBzeXNjdGwgdGFibGUgZGVmaW5pdGlvbiwgdGhhdCBjYXVzZXMgYW4gT09CIHJlYWQgKmFueXdheSogKGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IGNvZGUpIHdoaWNoIEtBU0FOIHdvdWxkIGNhdGNoLgoKTm93LCBsZXQmIzM5O3MgZXhwbG9yZSBgYXBwbHlfY29udl9vbl92ZWNgLiBJZiBgdGFibGUtJmd0O21heGxlbiAmbHQ7PSBkYXRhX3NpemVgLCB3aGljaCBpcyBhdCBtb3N0IG9uZSBlbGVtZW50LCBgZGF0YV9zdGFnZWAgaXMgYE5VTExgLCBhbmQgdGhlIGNvZGUgKmRpcmVjdGx5KiBtb2RpZmllcyBgdGFibGUtJmd0O2RhdGFgLiBIb3dldmVyLCBgcHJvY192ZWNfY29udmAgaXMgb25seSBjYWxsZWQgKmFmdGVyKiBhIHN1Y2Nlc3NmdWwgYHByb2NfZ2V0X2xvbmdgLiBUaGUgc2luZ2xlLWVsZW1lbnQgY2FzZSBpcyBhbHJlYWR5IHNhZmUhIElmIGBwcm9jX2dldF9sb25nYCBmYWlscywgaXQgZXhpdHMgYmVmb3JlIGFueSBtb2RpZmljYXRpb24uCgpBbHNvLCBgcHJvY19pbnRfY29udmAgcGVyZm9ybXMgYW4gaW50ZWdlciByYW5nZSBjaGVjayAqYmVmb3JlKiB3cml0aW5nIHRvIGAqa19wdHJgLiBUaGlzIGNvbmZpcm1zIHNhZmUgd3JpdGVzIHRvIGAqa19wdHJgLgoKTm93LCByZXZpZXdpbmcgS01TQU4mIzM5O3MgY3JpdGVyaWE6IFRoaXMgcGF0Y2ggbW9kaWZpZXMgdXNlciB0byBrZXJuZWwuIFNpbmNlIHRoZSBkYXRhIGlzIGNvcGllZCBhbmQgYWxsIG9mIHRoZSBib3VuZHMgYXJlIHZhbGlkYXRlZCwgdGhlcmUgaXMgbm8gcmVhbCByZWFzb24gdG8gdXNlIEtNU0FOLiBJdCBmaXhlcyBhIHBhcnRpYWwgdXBkYXRlIGlzc3VlLCB3aGljaCBhdm9pZHMgaW5mb3JtYXRpb24gbGVhay4gVGhlcmUgYXJlIG5vIGtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSB0aGF0IGFyZSBub3QgaW5pdGlhbGl6ZWQuIFRoZXJlJiMzOTtzIG5vIGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGluZyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgYW5kIHRoZSBzdHJ1Y3R1cmVzIGFyZSB3ZWxsLWRlZmluZWQuIFRoZSBga21lbWR1cGAgb25seSBkdXBsaWNhdGVzIHRoZSBpbnRlbmRlZCBkYXRhOyBJdCBhdm9pZHMgaW5mb3JtYXRpb24gbGVha3MuIEtNU0FOIGlzIG5vdCBuZWNlc3NhcnksIGFzIHRoaXMgaXMgYSBmdW5jdGlvbmFsIGltcHJvdmVtZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDY3MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjcwOlx0c3RhdGljIGludCBhcHBseV9jb252X29uX3ZlYyhjb25zdCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXG4gNjcxOlx0XHRcdFx0ICAgICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSxcbiA2NzI6XHRcdFx0XHQgICAgIGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsXG4gNjczOlx0XHRcdFx0ICAgICBjb25zdCBzaXplX3QgZGF0YV9zaXplLCBjb25zdCBpbnQgY29udl9kaXIsXG4gNjc0Olx0XHRcdFx0ICAgICBjb25zdCBzaXplX3QgYnVmX25ieXRlLCB2b2lkICpidWYsXG4gNjc1Olx0XHRcdFx0ICAgICBzaXplX3QgKmJ1Zl9sZWZ0X2ZpbmFsKVxuIDY3NjpcdHtcbiA2Nzc6XHRcdGludCB2ZWNfbGVmdCwgZXJyID0gMDtcbiA2Nzg6XHRcdHNpemVfdCBidWZfbGVmdCwgbnJfY29udiA9IDA7XG4gNjc5Olx0XHRjaGFyICpkYXRhLCAqZGF0YV9zdGFnZSA9IE5VTEwsICpwO1xuIDY4MDpcdFx0Ym9vbCBpc191bnNpZ25lZCA9IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VSU5UIHx8IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VTE9ORztcbiA2ODE6XHRcbiA2ODI6XHRcdGJ1Zl9sZWZ0ID0gYnVmX25ieXRlO1xuIDY4MzpcdFxuIDY4NDpcdFx0ZGF0YSA9IHRhYmxlLVx1MDAzZWRhdGE7XG4gNjg1Olx0XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbiA2ODY6XHRcdFx0aWYgKGJ1Zl9sZWZ0IFx1MDAzZSBQQUdFX1NJWkUgLSAxKVxuIDY4NzpcdFx0XHRcdGJ1Zl9sZWZ0ID0gUEFHRV9TSVpFIC0gMTtcbiA2ODg6XHRcdFx0cCA9IGJ1ZjtcbiA2ODk6XHRcbiA2OTA6XHRcdFx0aWYgKHRhYmxlLVx1MDAzZW1heGxlbiBcdTAwM2UgZGF0YV9zaXplKSB7XG4gNjkxOlx0XHRcdFx0ZGF0YV9zdGFnZSA9IGttZW1kdXAodGFibGUtXHUwMDNlZGF0YSwgdGFibGUtXHUwMDNlbWF4bGVuLCBHRlBfS0VSTkVMKTtcbiA2OTI6XHRcdFx0XHRpZiAoIWRhdGFfc3RhZ2UpIHtcbiA2OTM6XHRcdFx0XHRcdGVyciA9IC1FTk9NRU07XG4gNjk0Olx0XHRcdFx0XHRnb3RvIG91dDtcbiA2OTU6XHRcdFx0XHR9XG4gNjk2Olx0XHRcdFx0ZGF0YSA9IGRhdGFfc3RhZ2U7XG4gNjk3Olx0XHRcdH1cbiA2OTg6XHRcdH1cbiA2OTk6XHRcbiA3MDA6XHRcdHZlY19sZWZ0ID0gdGFibGUtXHUwMDNlbWF4bGVuIC8gZGF0YV9zaXplO1xuIDcwMTpcdFx0Zm9yICg7IGJ1Zl9sZWZ0IFx1MDAyNlx1MDAyNiB2ZWNfbGVmdC0tOyBkYXRhICYjNDM7PSBkYXRhX3NpemUsIG5yX2NvbnYmIzQzOyYjNDM7KSB7XG4gNzAyOlx0XHRcdHVuc2lnbmVkIGxvbmcgbHZhbDtcbiA3MDM6XHRcdFx0Ym9vbCBuZWcgPSBmYWxzZTtcbiA3MDQ6XHRcbiA3MDU6XHRcdFx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oY29udl9kaXIpKSB7XG4gNzA2Olx0XHRcdFx0cHJvY19za2lwX3NwYWNlcyhcdTAwMjZwLCBcdTAwMjZidWZfbGVmdCk7XG4gNzA3Olx0XG4gNzA4Olx0XHRcdFx0aWYgKCFidWZfbGVmdClcbiA3MDk6XHRcdFx0XHRcdGJyZWFrO1xuIDcxMDpcdFx0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQsIFx1MDAyNmx2YWwsIFx1MDAyNm5lZyxcbiA3MTE6XHRcdFx0XHRcdFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcbiA3MTI6XHRcdFx0XHRcdFx0ICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTtcbiA3MTM6XHRcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgbmVnIFx1MDAyNlx1MDAyNiBpc191bnNpZ25lZClcbiA3MTQ6XHRcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gNzE1Olx0XHRcdFx0aWYgKGVycilcbiA3MTY6XHRcdFx0XHRcdGJyZWFrO1xuIDcxNzpcdFx0XHRcdGlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgXHUwMDI2bmVnLCBcdTAwMjZsdmFsLCBkYXRhLCBjb252X2RpciwgdGFibGUpKSB7XG4gNzE4Olx0XHRcdFx0XHRlcnIgPSAtRUlOVkFMO1xuIDcxOTpcdFx0XHRcdFx0YnJlYWs7XG4gNzIwOlx0XHRcdFx0fVxuIDcyMTpcdFx0XHR9IGVsc2Uge1xuIDcyMjpcdFx0XHRcdGlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgXHUwMDI2bmVnLCBcdTAwMjZsdmFsLCBkYXRhLCBjb252X2RpciwgdGFibGUpKSB7XG4gNzIzOlx0XHRcdFx0XHRlcnIgPSAtRUlOVkFMO1xuIDcyNDpcdFx0XHRcdFx0YnJlYWs7XG4gNzI1Olx0XHRcdFx0fVxuIDcyNjpcdFx0XHRcdGlmIChucl9jb252KVxuIDcyNzpcdFx0XHRcdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWYsIFx1MDAyNmJ1Zl9sZWZ0LCAmIzM5O1xcdCYjMzk7KTtcbiA3Mjg6XHRcdFx0XHRwcm9jX3B1dF9sb25nKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsIGx2YWwsIG5lZyk7XG4gNzI5Olx0XHRcdH1cbiA3MzA6XHRcdH1cbiA3MzE6XHRcbiA3MzI6XHRcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xuIDczMzpcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgYnVmX2xlZnQpXG4gNzM0Olx0XHRcdFx0cHJvY19za2lwX3NwYWNlcyhcdTAwMjZwLCBcdTAwMjZidWZfbGVmdCk7XG4gNzM1Olx0XHRcdGlmICghbnJfY29udikge1xuIDczNjpcdFx0XHRcdGVyciA9IGVyciA/IDogLUVJTlZBTDtcbiA3Mzc6XHRcdFx0XHRnb3RvIG91dDtcbiA3Mzg6XHRcdFx0fVxuIDczOTpcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgZGF0YV9zdGFnZSlcbiA3NDA6XHRcdFx0XHRlcnIgPSBjb21taXRfY29udl92ZWMoZGF0YV90eXBlLCB0YWJsZS1cdTAwM2VkYXRhLCBkYXRhX3N0YWdlLCBucl9jb252KTtcbiA3NDE6XHRcdH0gZWxzZSB7XG4gNzQyOlx0XHRcdGlmIChucl9jb252IFx1MDAyNlx1MDAyNiBidWZfbGVmdCBcdTAwMjZcdTAwMjYgIWVycilcbiA3NDM6XHRcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICYjMzk7XFxuJiMzOTspO1xuIDc0NDpcdFx0fVxuIDc0NTpcdFxuIDc0NjpcdFx0KmJ1Zl9sZWZ0X2ZpbmFsID0gYnVmX2xlZnQ7XG4gNzQ3Olx0XG4gNzQ4Olx0b3V0OlxuIDc0OTpcdFx0a2ZyZWUoZGF0YV9zdGFnZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4NDgyCgkJCQkJCQlvdXRwdXQ6IDE2MQoJCQkJCQkJdGhvdWdodHM6IDgzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFN5c2N0bCBBcnJheSBQYXJzaW5nIFJlZmFjdG9yKioKCk9rYXksIGxldCBtZSBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJJiMzOTttIGV4YW1pbmluZyB0aGlzIHJlZmFjdG9yIGZvciBzeXNjdGwgYXJyYXkgcGFyc2luZywgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgYW5kIGNvcnJlY3RuZXNzLiBUaGUgZ29hbCBoZXJlIHNlZW1zIHRvIGJlIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzLCB3aGljaCBpcyBhIGdvb2QgdGhpbmcuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHJlZ3Jlc3Npb25zIG9yIHNlY3VyaXR5IGhvbGVzLgoKSSBzdGFydGVkIGJ5IHRyYWNpbmcgdGhlIGVycm9yIGhhbmRsaW5nLiBJZiBJIGdldCBgLUVOT01FTWAsIHRoZW4gYGJ1Zl9sZWZ0X2ZpbmFsYCAqaXNuJiMzOTt0KiB1cGRhdGVkLCBhbmQgY29uc2VxdWVudGx5LCBgbGVmdF9uYnl0ZWAgcmVtYWlucyBhdCBgU0laRV9NQVhgLiBUaGVuLCBpbiBgcHJvY192ZWNgLCB0aGUgY2hlY2sgZm9yIGBTSVpFX01BWGAgY29ycmVjdGx5IHJldHVybnMgdGhlIGVycm9yIGFuZCAqZG9lc24mIzM5O3QqIG1vZGlmeSBgbGVucGAuIFRoaXMgYmVoYXZpb3IgaXMgYXMgZXhwZWN0ZWQgYW5kIHByZXZlbnRzIGFueSBpc3N1ZXMgd2l0aCBpbmNvbXBsZXRlIHVwZGF0ZXMgaW4gdGhlIGV2ZW50IG9mIG1lbW9yeSBleGhhdXN0aW9uLCB3aGljaCBpcyBnb29kLgoKSSBhbHNvIGNoZWNrZWQgd2hhdCBoYXBwZW5zIHdoZW4gYCFucl9jb252YC4gSWYgbm8gY29udmVyc2lvbnMgb2NjdXIsIGl0IGNvcnJlY3RseSBnb2VzIHRvIGBvdXRgLCBgYnVmX2xlZnRfZmluYWxgIGlzbiYjMzk7dCB1cGRhdGVkLCBgbGVmdF9uYnl0ZWAgc3RheXMgYFNJWkVfTUFYYCwgYW5kIHRoZSBjb3JyZWN0IGVycm9yIGlzIHJldHVybmVkLiBUaGlzIGlzIGFsc28gZmluZSwgYW5kIGV4cGVjdGVkLgoKTm93LCBhIHNsaWdodGx5IG1vcmUgdHJpY2t5IGNhc2U6IGlmIGBTWVNDVExfS0VSTl9UT19VU0VSYCBhbmQgYCFucl9jb252YC4gSGVyZSwgYGJ1Zl9sZWZ0X2ZpbmFsYCAqaXMqIHVwZGF0ZWQgdG8gYGJ1Zl9sZWZ0YCwgYW5kIGBsZWZ0X25ieXRlYCB0aGVuIGJlY29tZXMgYGJ1Zl9uYnl0ZWAuIFRoaXMgbWVhbnMgemVybyBieXRlcyB3ZXJlIHdyaXR0ZW4sIHdoaWNoIGlzIHRoZSBjb3JyZWN0IG91dGNvbWUuIFRoaXMgY2FzZSBkb2VzbiYjMzk7dCByZXByZXNlbnQgYSB2dWxuZXJhYmlsaXR5LgoKSSB0aG91Z2h0IGFib3V0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4gQWZ0ZXIgZ29pbmcgdGhyb3VnaCB0aGUgbG9naWMsIEkgZG9uJiMzOTt0IHNlZSBhbnl0aGluZyB0aGF0IGp1bXBzIG91dC4gVGhlIGNvcmUgaWRlYSBvZiB1c2luZyBga21lbWR1cGAgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciwgZG9pbmcgdGhlIHBhcnNpbmcgdGhlcmUsIGFuZCB0aGVuIGNvcHlpbmcgdGhlIHJlc3VsdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBidWZmZXIgaXMgc291bmQuIFRoZXJlIGFyZW4mIzM5O3QgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCBwYWRkaW5nLCBzbyBubyBwb3RlbnRpYWwgaW5mbyBsZWFrcyBoZXJlLiBBbmQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIHVzZWQgaW4gYnJhbmNoaW5nLiBBbnkgcG90ZW50aWFsIE9PQiBpc3N1ZXMgb3IgbWVtb3J5IGxlYWtzIHdvdWxkIGxpa2VseSBiZSBmbGFnZ2VkIGJ5IEtBU0FOLgoKSSBxdWlja2x5IGRvdWJsZS1jaGVja2VkIHRoZSBgcHJvY19kb3VpbnR2ZWNfY29udmAgZnVuY3Rpb24uIFRoZSBjb2RlIGV4cGxpY2l0bHkgY2hlY2tzIGB0YWJsZS0mZ3Q7bWF4bGVuYCB0byBlbnN1cmUgaXQmIzM5O3MgZWl0aGVyIGAwYCBvciBleGFjdGx5IGBzaXplb2YodWludClgLiBUaGlzIG1lYW5zIGBQUk9DX1ZFQ19VSU5UYCBpcyBvbmx5IHVzZWQgZm9yIHNpbmdsZSBlbGVtZW50cy4gVGhpcyBleHBsYWlucyB3aHkgYFBST0NfVkVDX1VJTlRgIGlzIG5vdCBoYW5kbGVkIGluIGBjb21taXRfY29udl92ZWNgLiBCZWNhdXNlIGZvciBzaW5nbGUgZWxlbWVudHMsIGB0YWJsZS0mZ3Q7bWF4bGVuICZsdDs9IGRhdGFfc2l6ZWAgKHNpbmNlIGBkYXRhX3NpemVgIGlzIGBzaXplb2YodWludClgKSwgc28gYGRhdGFfc3RhZ2VgIGlzIG5vdCBhbGxvY2F0ZWQsIGFuZCBgY29tbWl0X2NvbnZfdmVjYCBpcyBub3QgY2FsbGVkLiBUaGlzIGFsc28gc2VlbXMgcGVyZmVjdGx5IHNhZmUuCgpHaXZlbiBhbGwgb2YgdGhpcywgYW5kIGNvbnNpZGVyaW5nIHRoYXQgdGhlIHBhdGNoIGRvZXNuJiMzOTt0IGNoYW5nZSB0aGUgcmVhZCBwYXRoIChrZXJuZWwgdG8gdXNlcikgaW4gYW55IG1lYW5pbmdmdWwgd2F5LCBJIHRoaW5rIEkmIzM5O20gY29tZm9ydGFibGUgc2V0dGluZyBgTmVlZHNLTVNBTj1mYWxzZWAuIFRoZSByZWZhY3RvciB1dGlsaXplcyBhIHRlbXBvcmFyeSBidWZmZXIgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMsIGFuZCBleGlzdGluZyBtZW1vcnkgdG9vbHMgc2hvdWxkIGNhdGNoIGFueSBwb3RlbnRpYWwgcHJvYmxlbXMuIFRoaXMgY2hhbmdlIGlzIHNvbGlkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgc3lzY3RsIGFycmF5IHBhcnNpbmcgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMgYnkgdXNpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyIChga21lbWR1cGApIHdoZW4gd3JpdGluZyBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLiBUaGUgc3lzY3RsIHZlY3RvcnMgYXJlIHNpbXBsZSBhcnJheXMgb2YgaW50ZWdlcnMgb3IgdW5zaWduZWQgbG9uZ3Mgd2l0aG91dCBwYWRkaW5nLiBUaGUgcmVhZCBwYXRoIChrZXJuZWwgdG8gdXNlcikgaXMgdW5jaGFuZ2VkLCBzbyBubyBuZXcgaW5mby1sZWFrcyBhcmUgaW50cm9kdWNlZC4gVGhlIHRlbXBvcmFyeSBidWZmZXIgaXMgb25seSB1c2VkIGZvciB3cml0aW5nIHRvIGtlcm5lbCBzcGFjZSwgYW5kIG9ubHkgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBlbGVtZW50cyBhcmUgY29waWVkIGJhY2suIEFueSBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyByZWZhY3RvcmluZyB3b3VsZCBiZSBjYXVnaHQgYnkgS0FTQU4gb3Igc3RhbmRhcmQgbWVtb3J5IGxlYWsgZGV0ZWN0b3JzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcyB0aGF0IHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgc3lzY3RsIGFycmF5IHBhcnNpbmcgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMgYnkgdXNpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyIChga21lbWR1cGApIHdoZW4gd3JpdGluZyBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLiBUaGUgc3lzY3RsIHZlY3RvcnMgYXJlIHNpbXBsZSBhcnJheXMgb2YgaW50ZWdlcnMgb3IgdW5zaWduZWQgbG9uZ3Mgd2l0aG91dCBwYWRkaW5nLiBUaGUgcmVhZCBwYXRoIChrZXJuZWwgdG8gdXNlcikgaXMgdW5jaGFuZ2VkLCBzbyBubyBuZXcgaW5mby1sZWFrcyBhcmUgaW50cm9kdWNlZC4gVGhlIHRlbXBvcmFyeSBidWZmZXIgaXMgb25seSB1c2VkIGZvciB3cml0aW5nIHRvIGtlcm5lbCBzcGFjZSwgYW5kIG9ubHkgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBlbGVtZW50cyBhcmUgY29waWVkIGJhY2suIEFueSBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyByZWZhY3RvcmluZyB3b3VsZCBiZSBjYXVnaHQgYnkgS0FTQU4gb3Igc3RhbmRhcmQgbWVtb3J5IGxlYWsgZGV0ZWN0b3JzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcyB0aGF0IHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjAyOjQ2Ljg0MTM0NDA3N1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMjMzNjkzMzk2NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwcm9jX2RvaW50dmVjXCIsXG4gICAgXCJwcm9jX2RvdWludHZlY1wiLFxuICAgIFwicHJvY19kb2ludHZlY19taW5tYXhcIixcbiAgICBcInByb2NfZG91aW50dmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3Vsb25ndmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3U4dmVjX21pbm1heFwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHN5c2N0bCBhcnJheSBwYXJzaW5nIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIGJ5IHVzaW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGttZW1kdXBgKSB3aGVuIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gVGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBzaW1wbGUgYXJyYXlzIG9mIGludGVnZXJzIG9yIHVuc2lnbmVkIGxvbmdzIHdpdGhvdXQgcGFkZGluZy4gVGhlIHJlYWQgcGF0aCAoa2VybmVsIHRvIHVzZXIpIGlzIHVuY2hhbmdlZCwgc28gbm8gbmV3IGluZm8tbGVha3MgYXJlIGludHJvZHVjZWQuIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG9ubHkgdXNlZCBmb3Igd3JpdGluZyB0byBrZXJuZWwgc3BhY2UsIGFuZCBvbmx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQgZWxlbWVudHMgYXJlIGNvcGllZCBiYWNrLiBBbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIG1lbW9yeSBsZWFrIGRldGVjdG9ycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIHN5c2N0bCB2ZWN0b3IgcHJvY2Vzc2luZyBsb2dpYyB0byBwcmV2ZW50IHBhcnRpYWwgdXBkYXRlcyBvbiBlcnJvciBieSBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBhZmZlY3RzIGFsbCBzeXNjdGwgaGFuZGxlcnMgdGhhdCBwcm9jZXNzIGFycmF5cy4gRnV6emluZyBpcyBuZWVkZWQgdG8gZW5zdXJlIGNvcnJlY3QgZXJyb3IgaGFuZGxpbmcsIG5vIG1lbW9yeSBsZWFrcywgYW5kIG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHN5c2N0bCB3cml0ZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjAyOjQ2Ljg0MTM0ODgzN1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUwOTQ0OTk4NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGUyMDg2MjgzMWNlNzRhMmNiYWY2ZjYzZTkxZWM3ZThmMDQxZWVkMTZcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBBdWcgMTMgMTU6MDI6NDQgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jXFxuaW5kZXggZjdiNzU5ODVkNTQyMC4uNzg3ZjUzZDcwNTA3YiAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvc3lzY3RsLmNcXG4rKysgYi9rZXJuZWwvc3lzY3RsLmNcXG5AQCAtNTk1LDcgKzU5NSw3IEBAIHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxuIHN0YXRpYyBjb25zdCBjaGFyIHByb2Nfd3NwYWNlX3NlcFtdID0geyAnICcsICdcXFxcdCcsICdcXFxcbicgfTtcXG4gXFxuIC8qXFxuLSAqIEVsZW1lbnQgdHlwZSBwcm9jZXNzZWQgYnkgZG9fcHJvY192ZWMoKS4gVGhlIHRhZyBzZWxlY3RzIHRoZSBlbGVtZW50IHNpemVcXG4rICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBwcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZVxcbiAgKiBhbmQgc2lnbmVkbmVzcywgYW5kIGl0IHNlbGVjdHMgd2hpY2ggbWVtYmVyIG9mIHVuaW9uIHByb2NfdmVjX2NvbnYgaXMgbGl2ZS5cXG4gICovXFxuIGVudW0gcHJvY192ZWNfdHlwZSB7XFxuQEAgLTYwNSw3ICs2MDUsNyBAQCBlbnVtIHByb2NfdmVjX3R5cGUge1xcbiB9O1xcbiBcXG4gLypcXG4tICogQ29udmVydGVyIHBhc3NlZCB0byBkb19wcm9jX3ZlYygpLiBPbmx5IHRoZSBtZW1iZXIgbWF0Y2hpbmcgdGhlXFxuKyAqIENvbnZlcnRlciBwYXNzZWQgdG8gcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxcbiAgKiBlbnVtIHByb2NfdmVjX3R5cGUgdGFnIGlzIGV2ZXIgcmVhZCwgc28gZXZlcnkgZGlzcGF0Y2ggc3RheXMgZnVsbHkgdHlwZWQgYW5kXFxuICAqIG5vIHZvaWQgKiBjb252ZXJ0ZXIgcG9pbnRlciBpcyBuZWVkZWQuXFxuICAqL1xcbkBAIC02MzcsMTAxICs2MzcsMTY4IEBAIHN0YXRpYyBpbnQgcHJvY192ZWNfY29udihlbnVtIHByb2NfdmVjX3R5cGUgdHlwZSwgdW5pb24gcHJvY192ZWNfY29udiBjb252LFxcbiBcXHRyZXR1cm4gLUVJTlZBTDtcXG4gfVxcbiBcXG4tLypcXG4tICogUmVhZC93cml0ZSBhIHZlY3RvciBvZiBAdHlwZSBlbGVtZW50cy4gVGhlIGVsZW1lbnQgc2l6ZSBhbmQgc2lnbmVkbmVzcyBhcmVcXG4tICogZGVyaXZlZCBmcm9tIEB0eXBlLCBzbyBhIHNpbmdsZSBydW50aW1lIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBwZXItdHlwZVxcbi0gKiB2YXJpYW50cy4gdGFibGUtXFx1MDAzZWRhdGEgaXMgd2Fsa2VkIGFzIHJhdyBieXRlcyAoQGkpIGFkdmFuY2VkIGJ5IEBzaXplOyB0aGVcXG4tICogY29udmVydGVyIHBlcmZvcm1zIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS5cXG4tICovXFxuLXN0YXRpYyBpbnQgZG9fcHJvY192ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuLVxcdFxcdCAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zLFxcbi1cXHRcXHQgICAgICAgZW51bSBwcm9jX3ZlY190eXBlIHR5cGUsIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udilcXG4rc3RhdGljIGludCBjb21taXRfY29udl92ZWMoY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSwgdm9pZCAqZHN0LFxcbitcXHRcXHRcXHQgICAgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnIpXFxuIHtcXG4tXFx0aW50IHZsZWZ0LCBmaXJzdCA9IDEsIGVyciA9IDA7XFxuLVxcdHNpemVfdCBsZWZ0LCBzaXplO1xcbi1cXHRib29sIGlzX3Vuc2lnbmVkO1xcbi1cXHRjaGFyICppLCAqcDtcXG4rXFx0c2l6ZV90IGk7XFxuIFxcbi1cXHRzd2l0Y2ggKHR5cGUpIHtcXG4rXFx0c3dpdGNoIChkYXRhX3R5cGUpIHtcXG4gXFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XFxuLVxcdFxcdHNpemUgPSBzaXplb2YoaW50KTtcXG4tXFx0XFx0aXNfdW5zaWduZWQgPSBmYWxzZTtcXG4tXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgUFJPQ19WRUNfVUlOVDpcXG4tXFx0XFx0c2l6ZSA9IHNpemVvZih1aW50KTtcXG4tXFx0XFx0aXNfdW5zaWduZWQgPSB0cnVlO1xcbi1cXHRcXHRicmVhaztcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yOyBpKyspXFxuK1xcdFxcdFxcdFdSSVRFX09OQ0UoKChpbnQgKilkc3QpW2ldLCAoKGNvbnN0IGludCAqKXNyYylbaV0pO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuIFxcdGNhc2UgUFJPQ19WRUNfVUxPTkc6XFxuLVxcdFxcdHNpemUgPSBzaXplb2YodWxvbmcpO1xcbi1cXHRcXHRpc191bnNpZ25lZCA9IHRydWU7XFxuLVxcdFxcdGJyZWFrO1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnI7IGkrKylcXG4rXFx0XFx0XFx0V1JJVEVfT05DRSgoKHVsb25nICopZHN0KVtpXSwgKChjb25zdCB1bG9uZyAqKXNyYylbaV0pO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcdH1cXG4rfVxcbiBcXG4tXFx0aWYgKCF0YWJsZS1cXHUwMDNlZGF0YSB8fCAhdGFibGUtXFx1MDAzZW1heGxlbiB8fCAhKmxlbnAgfHxcXG4tXFx0ICAgICgqcHBvcyBcXHUwMDI2XFx1MDAyNiBTWVNDVExfS0VSTl9UT19VU0VSKGRpcikpKSB7XFxuLVxcdFxcdCpsZW5wID0gMDtcXG4tXFx0XFx0cmV0dXJuIDA7XFxuLVxcdH1cXG4tXFxuLVxcdGkgPSB0YWJsZS1cXHUwMDNlZGF0YTtcXG4tXFx0dmxlZnQgPSB0YWJsZS1cXHUwMDNlbWF4bGVuIC8gc2l6ZTtcXG4tXFx0bGVmdCA9ICpsZW5wO1xcbi1cXG4tXFx0LyogdWludCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQsICpEbyBub3QqIGFkZCBzdXBwb3J0IGZvciB0aGVtLiAqL1xcbi1cXHRpZiAodHlwZSA9PSBQUk9DX1ZFQ19VSU5UIFxcdTAwMjZcXHUwMDI2IHZsZWZ0ICE9IDEpXFxuLVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXG4tXFx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkge1xcbi1cXHRcXHRpZiAocHJvY19maXJzdF9wb3Nfbm9uX3plcm9faWdub3JlKHBwb3MsIHRhYmxlKSlcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcbi1cXHRcXHRpZiAobGVmdCBcXHUwMDNlIFBBR0VfU0laRSAtIDEpXFxuLVxcdFxcdFxcdGxlZnQgPSBQQUdFX1NJWkUgLSAxO1xcbi1cXHRcXHRwID0gYnVmZmVyO1xcbisvKipcXG4rICogYXBwbHlfY29udl9vbl92ZWMgLSBBcHBseSBjb252ZXJ0ZXIgZnVuY3Rpb24gb24gZGF0YSB2ZWN0b3JcXG4rICpcXG4rICogRWxlbWVudCBzaWduZWRuZXNzIGlzIGRlcml2ZWQgZnJvbSBAZGF0YV90eXBlLiB0YWJsZS1cXHUwMDNlZGF0YSBpcyB3YWxrZWRcXG4rICogYXMgcmF3IGJ5dGVzIChAZGF0YSkgYWR2YW5jZWQgYnkgQGRhdGFfc2l6ZTsgdGhlIGNvbnZlcnRlciBwZXJmb3Jtc1xcbisgKiB0aGUgYWN0dWFsIHR5cGVkIGxvYWQvc3RvcmUuIFNldHMgYnVmX2xlZnRfZmluYWwgdG8gdGhlIG51bWJlciBvZlxcbisgKiBieXRlcyB0aGF0IHdoZXJlIGxlZnQgb3V0c3RhbmRpbmcgYWZ0ZXIgY29udmVyc2lvbi4gQ2FuIGJlIFxcdTAwM2UgMC5cXG4rICpcXG4rICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIE5vbi16ZXJvIG9uIGVycm9yLlxcbisgKi9cXG4rc3RhdGljIGludCBhcHBseV9jb252X29uX3ZlYyhjb25zdCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXFxuK1xcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsXFxuK1xcdFxcdFxcdCAgICAgY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSxcXG4rXFx0XFx0XFx0ICAgICBjb25zdCBzaXplX3QgZGF0YV9zaXplLCBjb25zdCBpbnQgY29udl9kaXIsXFxuK1xcdFxcdFxcdCAgICAgY29uc3Qgc2l6ZV90IGJ1Zl9uYnl0ZSwgdm9pZCAqYnVmLFxcbitcXHRcXHRcXHQgICAgIHNpemVfdCAqYnVmX2xlZnRfZmluYWwpXFxuK3tcXG4rXFx0aW50IHZlY19sZWZ0LCBlcnIgPSAwO1xcbitcXHRzaXplX3QgYnVmX2xlZnQsIG5yX2NvbnYgPSAwO1xcbitcXHRjaGFyICpkYXRhLCAqZGF0YV9zdGFnZSA9IE5VTEwsICpwO1xcbitcXHRib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HO1xcbitcXG4rXFx0YnVmX2xlZnQgPSBidWZfbmJ5dGU7XFxuK1xcbitcXHRkYXRhID0gdGFibGUtXFx1MDAzZWRhdGE7XFxuK1xcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xcbitcXHRcXHRpZiAoYnVmX2xlZnQgXFx1MDAzZSBQQUdFX1NJWkUgLSAxKVxcbitcXHRcXHRcXHRidWZfbGVmdCA9IFBBR0VfU0laRSAtIDE7XFxuK1xcdFxcdHAgPSBidWY7XFxuK1xcbitcXHRcXHRpZiAodGFibGUtXFx1MDAzZW1heGxlbiBcXHUwMDNlIGRhdGFfc2l6ZSkge1xcbitcXHRcXHRcXHRkYXRhX3N0YWdlID0ga21lbWR1cCh0YWJsZS1cXHUwMDNlZGF0YSwgdGFibGUtXFx1MDAzZW1heGxlbiwgR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdFxcdGlmICghZGF0YV9zdGFnZSkge1xcbitcXHRcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbitcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRkYXRhID0gZGF0YV9zdGFnZTtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1cXHRmb3IgKDsgbGVmdCBcXHUwMDI2XFx1MDAyNiB2bGVmdC0tOyBpICs9IHNpemUsIGZpcnN0ID0gMCkge1xcbitcXHR2ZWNfbGVmdCA9IHRhYmxlLVxcdTAwM2VtYXhsZW4gLyBkYXRhX3NpemU7XFxuK1xcdGZvciAoOyBidWZfbGVmdCBcXHUwMDI2XFx1MDAyNiB2ZWNfbGVmdC0tOyBkYXRhICs9IGRhdGFfc2l6ZSwgbnJfY29udisrKSB7XFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgbHZhbDtcXG4gXFx0XFx0Ym9vbCBuZWcgPSBmYWxzZTtcXG4gXFxuLVxcdFxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcXG4tXFx0XFx0XFx0cHJvY19za2lwX3NwYWNlcyhcXHUwMDI2cCwgXFx1MDAyNmxlZnQpO1xcbitcXHRcXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcXG4rXFx0XFx0XFx0cHJvY19za2lwX3NwYWNlcyhcXHUwMDI2cCwgXFx1MDAyNmJ1Zl9sZWZ0KTtcXG4gXFxuLVxcdFxcdFxcdGlmICghbGVmdClcXG4rXFx0XFx0XFx0aWYgKCFidWZfbGVmdClcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdFxcdGVyciA9IHByb2NfZ2V0X2xvbmcoXFx1MDAyNnAsIFxcdTAwMjZsZWZ0LCBcXHUwMDI2bHZhbCwgXFx1MDAyNm5lZyxcXG4rXFx0XFx0XFx0ZXJyID0gcHJvY19nZXRfbG9uZyhcXHUwMDI2cCwgXFx1MDAyNmJ1Zl9sZWZ0LCBcXHUwMDI2bHZhbCwgXFx1MDAyNm5lZyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTtcXG4gXFx0XFx0XFx0aWYgKCFlcnIgXFx1MDAyNlxcdTAwMjYgbmVnIFxcdTAwMjZcXHUwMDI2IGlzX3Vuc2lnbmVkKVxcbiBcXHRcXHRcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbiBcXHRcXHRcXHRpZiAoZXJyKVxcbiBcXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0aWYgKHByb2NfdmVjX2NvbnYodHlwZSwgY29udiwgXFx1MDAyNm5lZywgXFx1MDAyNmx2YWwsIGksIGRpciwgdGFibGUpKSB7XFxuK1xcdFxcdFxcdGlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgXFx1MDAyNm5lZywgXFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcXG4gXFx0XFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0aWYgKHByb2NfdmVjX2NvbnYodHlwZSwgY29udiwgXFx1MDAyNm5lZywgXFx1MDAyNmx2YWwsIGksIGRpciwgdGFibGUpKSB7XFxuK1xcdFxcdFxcdGlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgXFx1MDAyNm5lZywgXFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcXG4gXFx0XFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0aWYgKCFmaXJzdClcXG4tXFx0XFx0XFx0XFx0cHJvY19wdXRfY2hhcihcXHUwMDI2YnVmZmVyLCBcXHUwMDI2bGVmdCwgJ1xcXFx0Jyk7XFxuLVxcdFxcdFxcdHByb2NfcHV0X2xvbmcoXFx1MDAyNmJ1ZmZlciwgXFx1MDAyNmxlZnQsIGx2YWwsIG5lZyk7XFxuK1xcdFxcdFxcdGlmIChucl9jb252KVxcbitcXHRcXHRcXHRcXHRwcm9jX3B1dF9jaGFyKFxcdTAwMjZidWYsIFxcdTAwMjZidWZfbGVmdCwgJ1xcXFx0Jyk7XFxuK1xcdFxcdFxcdHByb2NfcHV0X2xvbmcoXFx1MDAyNmJ1ZiwgXFx1MDAyNmJ1Zl9sZWZ0LCBsdmFsLCBuZWcpO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuLVxcdGlmIChTWVNDVExfS0VSTl9UT19VU0VSKGRpcikgXFx1MDAyNlxcdTAwMjYgIWZpcnN0IFxcdTAwMjZcXHUwMDI2IGxlZnQgXFx1MDAyNlxcdTAwMjYgIWVycilcXG4tXFx0XFx0cHJvY19wdXRfY2hhcihcXHUwMDI2YnVmZmVyLCBcXHUwMDI2bGVmdCwgJ1xcXFxuJyk7XFxuLVxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgXFx1MDAyNlxcdTAwMjYgIWVyciBcXHUwMDI2XFx1MDAyNiBsZWZ0KVxcbi1cXHRcXHRwcm9jX3NraXBfc3BhY2VzKFxcdTAwMjZwLCBcXHUwMDI2bGVmdCk7XFxuLVxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgXFx1MDAyNlxcdTAwMjYgZmlyc3QpXFxuLVxcdFxcdHJldHVybiBlcnIgPyA6IC1FSU5WQUw7XFxuLVxcdCpsZW5wIC09IGxlZnQ7XFxuK1xcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xcbitcXHRcXHRpZiAoIWVyciBcXHUwMDI2XFx1MDAyNiBidWZfbGVmdClcXG4rXFx0XFx0XFx0cHJvY19za2lwX3NwYWNlcyhcXHUwMDI2cCwgXFx1MDAyNmJ1Zl9sZWZ0KTtcXG4rXFx0XFx0aWYgKCFucl9jb252KSB7XFxuK1xcdFxcdFxcdGVyciA9IGVyciA/IDogLUVJTlZBTDtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKCFlcnIgXFx1MDAyNlxcdTAwMjYgZGF0YV9zdGFnZSlcXG4rXFx0XFx0XFx0ZXJyID0gY29tbWl0X2NvbnZfdmVjKGRhdGFfdHlwZSwgdGFibGUtXFx1MDAzZWRhdGEsIGRhdGFfc3RhZ2UsIG5yX2NvbnYpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRpZiAobnJfY29udiBcXHUwMDI2XFx1MDAyNiBidWZfbGVmdCBcXHUwMDI2XFx1MDAyNiAhZXJyKVxcbitcXHRcXHRcXHRwcm9jX3B1dF9jaGFyKFxcdTAwMjZidWYsIFxcdTAwMjZidWZfbGVmdCwgJ1xcXFxuJyk7XFxuK1xcdH1cXG4rXFxuK1xcdCpidWZfbGVmdF9maW5hbCA9IGJ1Zl9sZWZ0O1xcbitcXG4rb3V0OlxcbitcXHRrZnJlZShkYXRhX3N0YWdlKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4rLyogUmVhZC93cml0ZSBhIHZlY3RvciBvZiBAdHlwZSBlbGVtZW50cy4gKi9cXG4rc3RhdGljIGludCBwcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxcbitcXHRcXHQgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLFxcbitcXHRcXHQgICAgdW5pb24gcHJvY192ZWNfY29udiBjb252KVxcbit7XFxuK1xcdGludCBlcnIgPSAwO1xcbitcXHRzaXplX3QgZGF0YV9zaXplLCBsZWZ0X25ieXRlID0gU0laRV9NQVg7XFxuK1xcbitcXHRzd2l0Y2ggKHR5cGUpIHtcXG4rXFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XFxuK1xcdFxcdGRhdGFfc2l6ZSA9IHNpemVvZihpbnQpO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBQUk9DX1ZFQ19VSU5UOlxcbitcXHRcXHRkYXRhX3NpemUgPSBzaXplb2YodWludCk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIFBST0NfVkVDX1VMT05HOlxcbitcXHRcXHRkYXRhX3NpemUgPSBzaXplb2YodWxvbmcpO1xcbitcXHRcXHRicmVhaztcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghdGFibGUtXFx1MDAzZWRhdGEgfHwgIXRhYmxlLVxcdTAwM2VtYXhsZW4gfHwgISpsZW5wIHx8XFxuK1xcdCAgICAoKnBwb3MgXFx1MDAyNlxcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xcbitcXHRcXHQqbGVucCA9IDA7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKSB7XFxuK1xcdFxcdGlmIChwcm9jX2ZpcnN0X3Bvc19ub25femVyb19pZ25vcmUocHBvcywgdGFibGUpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0ZXJyID0gYXBwbHlfY29udl9vbl92ZWMoY29udiwgdGFibGUsIHR5cGUsIGRhdGFfc2l6ZSwgZGlyLCAqbGVucCwgYnVmZmVyLFxcbitcXHRcXHRcXHRcXHRcXHUwMDI2bGVmdF9uYnl0ZSk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBBbiB1bmNoYW5nZWQgbGVmdF9uYnl0ZSBzaWduYWxzIGEgd3JpdGUgd2l0aCBubyBwYXJzZWQgZWxlbWVudDsgd2hpY2hcXG4rXFx0ICogaXMgYW4gZXJyb3IuIFVzaW5nIFNJWkVfTUFYIHRvIGRldGVjdCB0aGlzIGVycm9yIGlzIHBvc3NpYmxlIGJlY2F1c2U6XFxuK1xcdCAqIDEuIGxlbnAgaXMgYm91bmRlZCBieSBLTUFMTE9DX01BWF9TSVpFIGluIHByb2Nfc3lzX2NhbGxfaGFuZGxlclxcbitcXHQgKiAyLiBsZW5wIGNvdWxkIG5ldmVyIGJlIFNJWkVfTUFYIGFzIGl0IGlzIGEgXFxcInJpZGljdWxvdXNcXFwiIChleGFieXRlKSBhbGxvY2F0aW9uLlxcbitcXHQgKi9cXG4rXFx0aWYgKGxlZnRfbmJ5dGUgPT0gU0laRV9NQVgpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHQqbGVucCAtPSBsZWZ0X25ieXRlO1xcbiBvdXQ6XFxuIFxcdCpwcG9zICs9ICpsZW5wO1xcbitcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG5AQCAtNzU2LDEyICs4MjMsMTUgQEAgaW50IHByb2NfZG91aW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4gXFx0XFx0XFx0aW50ICgqY29udikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCB1aW50ICprX3B0cixcXG4gXFx0XFx0XFx0XFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKSlcXG4ge1xcbitcXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXFxuK1xcdGlmICh0YWJsZS1cXHUwMDNlbWF4bGVuIFxcdTAwMjZcXHUwMDI2ICh0YWJsZS1cXHUwMDNlbWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFxuIFxcdGlmICghY29udilcXG4gXFx0XFx0Y29udiA9IGRvX3Byb2NfdWludF9jb252O1xcbiBcXG4tXFx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcXG4tXFx0XFx0XFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gY29udiB9KTtcXG4rXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcXG4rXFx0XFx0XFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gY29udiB9KTtcXG4gfVxcbiBcXG4gLyoqXFxuQEAgLTgyMCw4ICs4OTAsOCBAQCBpbnQgcHJvY19kb2Jvb2woY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4gaW50IHByb2NfZG9pbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4gXFx0XFx0ICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcXG4ge1xcbi1cXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXFxuLVxcdFxcdFxcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcXG4rXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxcbitcXHRcXHRcXHQodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnYgfSk7XFxuIH1cXG4gXFxuIC8qKlxcbkBAIC04NDAsOCArOTEwLDcgQEAgaW50IHByb2NfZG9pbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4gaW50IHByb2NfZG91aW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuIFxcdFxcdHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxcbiB7XFxuLVxcdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXFxuLVxcdFxcdFxcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252IH0pO1xcbitcXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIGRvX3Byb2NfdWludF9jb252KTtcXG4gfVxcbiBcXG4gLyoqXFxuQEAgLTg2NCw4ICs5MzMsOCBAQCBpbnQgcHJvY19kb3VpbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4gaW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbiBcXHRcXHQgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4tXFx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxcbi1cXHRcXHRcXHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xcbitcXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXFxuK1xcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udl9taW5tYXggfSk7XFxuIH1cXG4gXFxuIC8qKlxcbkBAIC04OTEsOCArOTYwLDggQEAgaW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbiBpbnQgcHJvY19kb3VpbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbiBcXHRcXHRcXHQgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4tXFx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcXG4tXFx0XFx0XFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnZfbWlubWF4IH0pO1xcbitcXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsXFxuK1xcdFxcdFxcdFxcdCAgIGRvX3Byb2NfdWludF9jb252X21pbm1heCk7XFxuIH1cXG4gXFxuIC8qKlxcbkBAIC05MzUsOCArMTAwNCw3IEBAIGludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbiBcXHRcXHR0bXAuZXh0cmEyID0gKHVuc2lnbmVkIGludCAqKSBcXHUwMDI2bWF4O1xcbiBcXG4gXFx0dmFsID0gUkVBRF9PTkNFKCpkYXRhKTtcXG4tXFx0cmVzID0gZG9fcHJvY192ZWMoXFx1MDAyNnRtcCwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXFxuLVxcdFxcdFxcdCAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnZfbWlubWF4IH0pO1xcbitcXHRyZXMgPSBwcm9jX2RvdWludHZlY19taW5tYXgoXFx1MDAyNnRtcCwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MpO1xcbiBcXHRpZiAocmVzKVxcbiBcXHRcXHRyZXR1cm4gcmVzO1xcbiBcXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKVxcbkBAIC0xMDY2LDggKzExMzQsOCBAQCBpbnQgcHJvY19kb3Vsb25ndmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuIFxcdFxcdFxcdFxcdGludCAoKmNvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpKVxcbiB7XFxuLVxcdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLFxcbi1cXHRcXHRcXHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gY29udiB9KTtcXG4rXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXFxuK1xcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBjb252IH0pO1xcbiB9XFxuIFxcbiAvKipcXG5AQCAtMTA4NywxMCArMTE1NSwxMCBAQCBpbnQgcHJvY19kb3Vsb25ndmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuICAqIFJldHVybnM6ICUwIG9uIHN1Y2Nlc3MuXFxuICAqL1xcbiBpbnQgcHJvY19kb3Vsb25ndmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcXG4tXFx0XFx0XFx0ICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcXG4rXFx0XFx0dm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcXG4ge1xcbi1cXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORyxcXG4tXFx0XFx0XFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGRvX3Byb2NfdWxvbmdfY29udiB9KTtcXG4rXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXFxuK1xcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBkb19wcm9jX3Vsb25nX2NvbnYgfSk7XFxuIH1cXG4gXFxuIC8qKlxcbkBAIC0xMTE0LDggKzExODIsOCBAQCBpbnQgcHJvY19kb2ludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuIHtcXG4gXFx0aWYgKCFjb252KVxcbiBcXHRcXHRjb252ID0gZG9fcHJvY19pbnRfY29udjtcXG4tXFx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxcbi1cXHRcXHRcXHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGNvbnYgfSk7XFxuK1xcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcXG4rXFx0XFx0XFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBjb252IH0pO1xcbiB9XFxuIFxcbiAvKipcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcXG5pbmRleCBiMmQ4YmQ5MDI2YTcyLi5mZGYzZDJmYjBhMmFkIDEwMDc1NVxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoXFxuQEAgLTQsNiArNCw3IEBAXFxuIFxcbiAjIFRoaXMgcGVyZm9ybXMgYSBzZXJpZXMgdGVzdHMgYWdhaW5zdCB0aGUgcHJvYyBzeXNjdGwgaW50ZXJmYWNlLlxcbiBcXG4rIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMzE3XFxuICMgS3NlbGZ0ZXN0IGZyYW1ld29yayByZXF1aXJlbWVudCAtIFNLSVAgY29kZSBpcyA0LlxcbiBrc2Z0X3NraXA9NFxcbiBcXG5AQCAtMzcsNiArMzgsNyBAQCBBTExfVEVTVFM9XFxcIiRBTExfVEVTVFMgMDAwOToxOjE6dW5yZWdpc3Rlcl9lcnJvcjowXFxcIlxcbiBBTExfVEVTVFM9XFxcIiRBTExfVEVTVFMgMDAxMDoxOjE6bW50L21udF9lcnJvcjowXFxcIlxcbiBBTExfVEVTVFM9XFxcIiRBTExfVEVTVFMgMDAxMToxOjE6ZW1wdHlfYWRkOjBcXFwiXFxuIEFMTF9URVNUUz1cXFwiJEFMTF9URVNUUyAwMDEyOjE6MTp1OF92YWxpZDowXFxcIlxcbitBTExfVEVTVFM9XFxcIiRBTExfVEVTVFMgMDAxMzoxOjE6aW50XzAwMDM6MVxcXCJcXG4gXFxuIGZ1bmN0aW9uIGFsbG93X3VzZXJfZGVmYXVsdHMoKVxcbiB7XFxuQEAgLTE5Niw2ICsxOTgsMTggQEAgdmVyaWZ5X2RpZmZfdygpXFxuIFxcdHJldHVybiAkP1xcbiB9XFxuIFxcbisjIFZlcmlmeSB0aGF0IGFuIGVycm9uZW91cyAoJDIpIHVwZGF0ZSBmYWlscyBhbmQgZG9lcyBub3QgY2hhbmdlIFRBUkdFVFxcbit2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUoKVxcbit7XFxuK1xcdFRFU1RfU1RSPVxcXCIkMVxcXCJcXG4rXFx0ZWNobyAtbiBcXFwiJFRFU1RfU1RSXFxcIiBcXHUwMDNlIFxcXCIkVEFSR0VUXFxcIlxcbitcXG4rXFx0aWYgZWNobyAtbiBcXFwiJDJcXFwiIFxcdTAwM2UgXFxcIiRUQVJHRVRcXFwiIDJcXHUwMDNlIC9kZXYvbnVsbDsgdGhlblxcbitcXHRcXHRyZXR1cm4gMVxcbitcXHRmaVxcbitcXHR2ZXJpZnlfZGlmZl93IFxcXCIke1RBUkdFVH1cXFwiXFxuK31cXG4rXFxuIHRlc3RfcmMoKVxcbiB7XFxuIFxcdGlmIFtbICRyYyAhPSAwIF1dOyB0aGVuXFxuQEAgLTUwMSw2ICs1MTUsNDAgQEAgcnVuX2xpbWl0X2RpZ2l0X2ludF9hcnJheSgpXFxuIFxcdHRlc3RfcmNcXG4gfVxcbiBcXG4rIyBZb3UgdXNlZCBhbiBpbnQgYXJyYXkgYW5kIG9uZSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGFjY2VwdGFibGVcXG4rcnVuX2ludF9hcnJheV9ub19wYXJ0aWFsX3VwZGF0ZSgpXFxuK3tcXG4rXFx0ZWNobyAtbiBcXFwiVGVzdGluZyBpbnZhbGlkIGFycmF5IGVsZW1lbnQgZG9lcyBub3QgcGFydGlhbGx5IHVwZGF0ZSAuLi4gXFxcIlxcbisgICAgICAgICMgRXhwZWN0IGZhaWx1cmUgYmVjYXVzZSBvZiAzcmQgZWxlbWVudCAoYWJjKS5cXG4rXFx0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXFxcIjEgMiAzIDRcXFwiIFxcXCIxMCAyMCBhYmMgNDBcXFwiOyB0aGVuXFxuK1xcdFxcdGVjaG8gXFxcIkZBSUxcXFwiIFxcdTAwM2VcXHUwMDI2MlxcbitcXHRcXHRyYz0xXFxuK1xcdGVsc2VcXG4rXFx0XFx0ZWNobyBcXFwiT0tcXFwiXFxuK1xcdGZpXFxuK1xcdHRlc3RfcmNcXG4rXFxuK1xcdGVjaG8gLW4gXFxcIlRlc3Rpbmcgb3V0IG9mIHJhbmdlIGFycmF5IGVsZW1lbnQgZG9lcyBub3QgcGFydGlhbGx5IHVwZGF0ZSAuLi4gXFxcIlxcbisgICAgICAgICMgRXhwZWN0IGZhaWx1cmUgYmVjYXVzZSBvZiAzcmQgZWxlbWVudCAoZ3JlYXRlciB0aGFuIGludClcXG4rXFx0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXFxcIjEgMiAzIDRcXFwiIFxcXCIxMCAyMCAkKChJTlRfTUFYICsgMSkpIDQwXFxcIjsgdGhlblxcbitcXHRcXHRlY2hvIFxcXCJGQUlMXFxcIiBcXHUwMDNlXFx1MDAyNjJcXG4rXFx0XFx0cmM9MVxcbitcXHRlbHNlXFxuK1xcdFxcdGVjaG8gXFxcIk9LXFxcIlxcbitcXHRmaVxcbitcXHR0ZXN0X3JjXFxuK1xcbitcXHRlY2hvIC1uIFxcXCJUZXN0aW5nIGludmFsaWQgZmlyc3QgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCB1cGRhdGUgLi4uIFxcXCJcXG4rICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIG9mIDFzdCBlbGVtZW50XFxuK1xcdGlmICEgdmVyaWZ5X25vX3BhcnRpYWxfdXBkYXRlIFxcXCIxIDIgMyA0XFxcIiBcXFwiYWJjIDIwIDMwIDQwXFxcIjsgdGhlblxcbitcXHRcXHRlY2hvIFxcXCJGQUlMXFxcIiBcXHUwMDNlXFx1MDAyNjJcXG4rXFx0XFx0cmM9MVxcbitcXHRlbHNlXFxuK1xcdFxcdGVjaG8gXFxcIk9LXFxcIlxcbitcXHRmaVxcbitcXHR0ZXN0X3JjXFxuK31cXG4rXFxuICMgWW91IGFyZSB1c2luZyBhbiB1bnNpZ25lZCBpbnRcXG4gcnVuX2xpbWl0X2RpZ2l0X3VpbnQoKVxcbiB7XFxuQEAgLTg4MCw2ICs5MjgsMTQgQEAgc3lzY3RsX3Rlc3RfMDAxMigpXFxuIFxcdHJldHVybiAwXFxuIH1cXG4gXFxuK3N5c2N0bF90ZXN0XzAwMTMoKVxcbit7XFxuK1xcdFRBUkdFVD1cXFwiJHtTWVNDVEx9LyQoZ2V0X3Rlc3RfdGFyZ2V0IDAwMTMpXFxcIlxcbitcXHRyZXNldF92YWxzXFxuK1xcbitcXHRydW5faW50X2FycmF5X25vX3BhcnRpYWxfdXBkYXRlXFxuK31cXG4rXFxuIGxpc3RfdGVzdHMoKVxcbiB7XFxuIFxcdGVjaG8gXFxcIlRlc3QgSUQgbGlzdDpcXFwiXFxuQEAgLTkwMCw2ICs5NTYsNyBAQCBsaXN0X3Rlc3RzKClcXG4gXFx0ZWNobyBcXFwiMDAxMCB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMCkgLSB0ZXN0cyBzeXNjdCBtb3VudCBwb2ludFxcXCJcXG4gXFx0ZWNobyBcXFwiMDAxMSB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMSkgLSB0ZXN0cyBlbXB0eSBkaXJlY3Rvcmllc1xcXCJcXG4gXFx0ZWNobyBcXFwiMDAxMiB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMikgLSB0ZXN0cyByYW5nZSBjaGVjayBmb3IgdTggcHJvY19oYW5kbGVyXFxcIlxcbitcXHRlY2hvIFxcXCIwMDEzIHggJChnZXRfdGVzdF9jb3VudCAwMDEzKSAtIHRlc3RzIHBhcnRpYWxseSB1cGRhdGUgdmVjdG9ycyBvbiBlcnJvclxcXCJcXG4gfVxcbiBcXG4gdXNhZ2UoKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMjo0OC4zNTE2MTYxNzFaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo0MzQzMzE2NjU3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwcm9jX2RvaW50dmVjXCIsXG4gICAgXCJwcm9jX2RvdWludHZlY1wiLFxuICAgIFwicHJvY19kb2ludHZlY19taW5tYXhcIixcbiAgICBcInByb2NfZG91aW50dmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3Vsb25ndmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3U4dmVjX21pbm1heFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIHN5c2N0bCB2ZWN0b3IgcHJvY2Vzc2luZyBsb2dpYyB0byBwcmV2ZW50IHBhcnRpYWwgdXBkYXRlcyBvbiBlcnJvciBieSBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBhZmZlY3RzIGFsbCBzeXNjdGwgaGFuZGxlcnMgdGhhdCBwcm9jZXNzIGFycmF5cy4gRnV6emluZyBpcyBuZWVkZWQgdG8gZW5zdXJlIGNvcnJlY3QgZXJyb3IgaGFuZGxpbmcsIG5vIG1lbW9yeSBsZWFrcywgYW5kIG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHN5c2N0bCB3cml0ZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGUyMDg2MjgzMWNlNzRhMmNiYWY2ZjYzZTkxZWM3ZThmMDQxZWVkMTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEF1ZyAxMyAxNTowMjo0NCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuY1xuaW5kZXggZjdiNzU5ODVkNTQyMC4uNzg3ZjUzZDcwNTA3YiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9zeXNjdGwuY1xuKysrIGIva2VybmVsL3N5c2N0bC5jXG5AQCAtNTk1LDcgKzU5NSw3IEBAIHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXG4gc3RhdGljIGNvbnN0IGNoYXIgcHJvY193c3BhY2Vfc2VwW10gPSB7ICcgJywgJ1xcdCcsICdcXG4nIH07XG4gXG4gLypcbi0gKiBFbGVtZW50IHR5cGUgcHJvY2Vzc2VkIGJ5IGRvX3Byb2NfdmVjKCkuIFRoZSB0YWcgc2VsZWN0cyB0aGUgZWxlbWVudCBzaXplXG4rICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBwcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZVxuICAqIGFuZCBzaWduZWRuZXNzLCBhbmQgaXQgc2VsZWN0cyB3aGljaCBtZW1iZXIgb2YgdW5pb24gcHJvY192ZWNfY29udiBpcyBsaXZlLlxuICAqL1xuIGVudW0gcHJvY192ZWNfdHlwZSB7XG5AQCAtNjA1LDcgKzYwNSw3IEBAIGVudW0gcHJvY192ZWNfdHlwZSB7XG4gfTtcbiBcbiAvKlxuLSAqIENvbnZlcnRlciBwYXNzZWQgdG8gZG9fcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxuKyAqIENvbnZlcnRlciBwYXNzZWQgdG8gcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxuICAqIGVudW0gcHJvY192ZWNfdHlwZSB0YWcgaXMgZXZlciByZWFkLCBzbyBldmVyeSBkaXNwYXRjaCBzdGF5cyBmdWxseSB0eXBlZCBhbmRcbiAgKiBubyB2b2lkICogY29udmVydGVyIHBvaW50ZXIgaXMgbmVlZGVkLlxuICAqL1xuQEAgLTYzNywxMDEgKzYzNywxNjggQEAgc3RhdGljIGludCBwcm9jX3ZlY19jb252KGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXG4gXHRyZXR1cm4gLUVJTlZBTDtcbiB9XG4gXG4tLypcbi0gKiBSZWFkL3dyaXRlIGEgdmVjdG9yIG9mIEB0eXBlIGVsZW1lbnRzLiBUaGUgZWxlbWVudCBzaXplIGFuZCBzaWduZWRuZXNzIGFyZVxuLSAqIGRlcml2ZWQgZnJvbSBAdHlwZSwgc28gYSBzaW5nbGUgcnVudGltZSBmdW5jdGlvbiByZXBsYWNlcyB0aGUgcGVyLXR5cGVcbi0gKiB2YXJpYW50cy4gdGFibGUtXHUwMDNlZGF0YSBpcyB3YWxrZWQgYXMgcmF3IGJ5dGVzIChAaSkgYWR2YW5jZWQgYnkgQHNpemU7IHRoZVxuLSAqIGNvbnZlcnRlciBwZXJmb3JtcyB0aGUgYWN0dWFsIHR5cGVkIGxvYWQvc3RvcmUuXG4tICovXG4tc3RhdGljIGludCBkb19wcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi1cdFx0ICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsXG4tXHRcdCAgICAgICBlbnVtIHByb2NfdmVjX3R5cGUgdHlwZSwgdW5pb24gcHJvY192ZWNfY29udiBjb252KVxuK3N0YXRpYyBpbnQgY29tbWl0X2NvbnZfdmVjKGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsIHZvaWQgKmRzdCxcbitcdFx0XHQgICAgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnIpXG4ge1xuLVx0aW50IHZsZWZ0LCBmaXJzdCA9IDEsIGVyciA9IDA7XG4tXHRzaXplX3QgbGVmdCwgc2l6ZTtcbi1cdGJvb2wgaXNfdW5zaWduZWQ7XG4tXHRjaGFyICppLCAqcDtcbitcdHNpemVfdCBpO1xuIFxuLVx0c3dpdGNoICh0eXBlKSB7XG4rXHRzd2l0Y2ggKGRhdGFfdHlwZSkge1xuIFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YoaW50KTtcbi1cdFx0aXNfdW5zaWduZWQgPSBmYWxzZTtcbi1cdFx0YnJlYWs7XG4tXHRjYXNlIFBST0NfVkVDX1VJTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YodWludCk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpKyspXG4rXHRcdFx0V1JJVEVfT05DRSgoKGludCAqKWRzdClbaV0sICgoY29uc3QgaW50ICopc3JjKVtpXSk7XG4rXHRcdHJldHVybiAwO1xuK1xuIFx0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbi1cdFx0c2l6ZSA9IHNpemVvZih1bG9uZyk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpKyspXG4rXHRcdFx0V1JJVEVfT05DRSgoKHVsb25nICopZHN0KVtpXSwgKChjb25zdCB1bG9uZyAqKXNyYylbaV0pO1xuK1x0XHRyZXR1cm4gMDtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0fVxuK31cbiBcbi1cdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuLVx0ICAgICgqcHBvcyBcdTAwMjZcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xuLVx0XHQqbGVucCA9IDA7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0aSA9IHRhYmxlLVx1MDAzZWRhdGE7XG4tXHR2bGVmdCA9IHRhYmxlLVx1MDAzZW1heGxlbiAvIHNpemU7XG4tXHRsZWZ0ID0gKmxlbnA7XG4tXG4tXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXG4tXHRpZiAodHlwZSA9PSBQUk9DX1ZFQ19VSU5UIFx1MDAyNlx1MDAyNiB2bGVmdCAhPSAxKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcbi1cdFx0aWYgKHByb2NfZmlyc3RfcG9zX25vbl96ZXJvX2lnbm9yZShwcG9zLCB0YWJsZSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdGlmIChsZWZ0IFx1MDAzZSBQQUdFX1NJWkUgLSAxKVxuLVx0XHRcdGxlZnQgPSBQQUdFX1NJWkUgLSAxO1xuLVx0XHRwID0gYnVmZmVyO1xuKy8qKlxuKyAqIGFwcGx5X2NvbnZfb25fdmVjIC0gQXBwbHkgY29udmVydGVyIGZ1bmN0aW9uIG9uIGRhdGEgdmVjdG9yXG4rICpcbisgKiBFbGVtZW50IHNpZ25lZG5lc3MgaXMgZGVyaXZlZCBmcm9tIEBkYXRhX3R5cGUuIHRhYmxlLVx1MDAzZWRhdGEgaXMgd2Fsa2VkXG4rICogYXMgcmF3IGJ5dGVzIChAZGF0YSkgYWR2YW5jZWQgYnkgQGRhdGFfc2l6ZTsgdGhlIGNvbnZlcnRlciBwZXJmb3Jtc1xuKyAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mXG4rICogYnl0ZXMgdGhhdCB3aGVyZSBsZWZ0IG91dHN0YW5kaW5nIGFmdGVyIGNvbnZlcnNpb24uIENhbiBiZSBcdTAwM2UgMC5cbisgKlxuKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLiBOb24temVybyBvbiBlcnJvci5cbisgKi9cbitzdGF0aWMgaW50IGFwcGx5X2NvbnZfb25fdmVjKGNvbnN0IHVuaW9uIHByb2NfdmVjX2NvbnYgY29udixcbitcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLFxuK1x0XHRcdCAgICAgY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSxcbitcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IGludCBjb252X2RpcixcbitcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBidWZfbmJ5dGUsIHZvaWQgKmJ1ZixcbitcdFx0XHQgICAgIHNpemVfdCAqYnVmX2xlZnRfZmluYWwpXG4re1xuK1x0aW50IHZlY19sZWZ0LCBlcnIgPSAwO1xuK1x0c2l6ZV90IGJ1Zl9sZWZ0LCBucl9jb252ID0gMDtcbitcdGNoYXIgKmRhdGEsICpkYXRhX3N0YWdlID0gTlVMTCwgKnA7XG4rXHRib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HO1xuK1xuK1x0YnVmX2xlZnQgPSBidWZfbmJ5dGU7XG4rXG4rXHRkYXRhID0gdGFibGUtXHUwMDNlZGF0YTtcbitcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xuK1x0XHRpZiAoYnVmX2xlZnQgXHUwMDNlIFBBR0VfU0laRSAtIDEpXG4rXHRcdFx0YnVmX2xlZnQgPSBQQUdFX1NJWkUgLSAxO1xuK1x0XHRwID0gYnVmO1xuK1xuK1x0XHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAzZSBkYXRhX3NpemUpIHtcbitcdFx0XHRkYXRhX3N0YWdlID0ga21lbWR1cCh0YWJsZS1cdTAwM2VkYXRhLCB0YWJsZS1cdTAwM2VtYXhsZW4sIEdGUF9LRVJORUwpO1xuK1x0XHRcdGlmICghZGF0YV9zdGFnZSkge1xuK1x0XHRcdFx0ZXJyID0gLUVOT01FTTtcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdH1cbitcdFx0XHRkYXRhID0gZGF0YV9zdGFnZTtcbitcdFx0fVxuIFx0fVxuIFxuLVx0Zm9yICg7IGxlZnQgXHUwMDI2XHUwMDI2IHZsZWZ0LS07IGkgKz0gc2l6ZSwgZmlyc3QgPSAwKSB7XG4rXHR2ZWNfbGVmdCA9IHRhYmxlLVx1MDAzZW1heGxlbiAvIGRhdGFfc2l6ZTtcbitcdGZvciAoOyBidWZfbGVmdCBcdTAwMjZcdTAwMjYgdmVjX2xlZnQtLTsgZGF0YSArPSBkYXRhX3NpemUsIG5yX2NvbnYrKykge1xuIFx0XHR1bnNpZ25lZCBsb25nIGx2YWw7XG4gXHRcdGJvb2wgbmVnID0gZmFsc2U7XG4gXG4tXHRcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcbi1cdFx0XHRwcm9jX3NraXBfc3BhY2VzKFx1MDAyNnAsIFx1MDAyNmxlZnQpO1xuK1x0XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbitcdFx0XHRwcm9jX3NraXBfc3BhY2VzKFx1MDAyNnAsIFx1MDAyNmJ1Zl9sZWZ0KTtcbiBcbi1cdFx0XHRpZiAoIWxlZnQpXG4rXHRcdFx0aWYgKCFidWZfbGVmdClcbiBcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2bGVmdCwgXHUwMDI2bHZhbCwgXHUwMDI2bmVnLFxuK1x0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQsIFx1MDAyNmx2YWwsIFx1MDAyNm5lZyxcbiBcdFx0XHRcdFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcbiBcdFx0XHRcdFx0ICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTtcbiBcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgbmVnIFx1MDAyNlx1MDAyNiBpc191bnNpZ25lZClcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0aWYgKGVycilcbiBcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGlmIChwcm9jX3ZlY19jb252KHR5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgaSwgZGlyLCB0YWJsZSkpIHtcbitcdFx0XHRpZiAocHJvY192ZWNfY29udihkYXRhX3R5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkge1xuIFx0XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRpZiAocHJvY192ZWNfY29udih0eXBlLCBjb252LCBcdTAwMjZuZWcsIFx1MDAyNmx2YWwsIGksIGRpciwgdGFibGUpKSB7XG4rXHRcdFx0aWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCBcdTAwMjZuZWcsIFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4tXHRcdFx0aWYgKCFmaXJzdClcbi1cdFx0XHRcdHByb2NfcHV0X2NoYXIoXHUwMDI2YnVmZmVyLCBcdTAwMjZsZWZ0LCAnXFx0Jyk7XG4tXHRcdFx0cHJvY19wdXRfbG9uZyhcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsIGx2YWwsIG5lZyk7XG4rXHRcdFx0aWYgKG5yX2NvbnYpXG4rXHRcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICdcXHQnKTtcbitcdFx0XHRwcm9jX3B1dF9sb25nKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsIGx2YWwsIG5lZyk7XG4gXHRcdH1cbiBcdH1cbiBcbi1cdGlmIChTWVNDVExfS0VSTl9UT19VU0VSKGRpcikgXHUwMDI2XHUwMDI2ICFmaXJzdCBcdTAwMjZcdTAwMjYgbGVmdCBcdTAwMjZcdTAwMjYgIWVycilcbi1cdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsICdcXG4nKTtcbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgXHUwMDI2XHUwMDI2ICFlcnIgXHUwMDI2XHUwMDI2IGxlZnQpXG4tXHRcdHByb2Nfc2tpcF9zcGFjZXMoXHUwMDI2cCwgXHUwMDI2bGVmdCk7XG4tXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpIFx1MDAyNlx1MDAyNiBmaXJzdClcbi1cdFx0cmV0dXJuIGVyciA/IDogLUVJTlZBTDtcbi1cdCpsZW5wIC09IGxlZnQ7XG4rXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbitcdFx0aWYgKCFlcnIgXHUwMDI2XHUwMDI2IGJ1Zl9sZWZ0KVxuK1x0XHRcdHByb2Nfc2tpcF9zcGFjZXMoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQpO1xuK1x0XHRpZiAoIW5yX2NvbnYpIHtcbitcdFx0XHRlcnIgPSBlcnIgPyA6IC1FSU5WQUw7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdFx0aWYgKCFlcnIgXHUwMDI2XHUwMDI2IGRhdGFfc3RhZ2UpXG4rXHRcdFx0ZXJyID0gY29tbWl0X2NvbnZfdmVjKGRhdGFfdHlwZSwgdGFibGUtXHUwMDNlZGF0YSwgZGF0YV9zdGFnZSwgbnJfY29udik7XG4rXHR9IGVsc2Uge1xuK1x0XHRpZiAobnJfY29udiBcdTAwMjZcdTAwMjYgYnVmX2xlZnQgXHUwMDI2XHUwMDI2ICFlcnIpXG4rXHRcdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWYsIFx1MDAyNmJ1Zl9sZWZ0LCAnXFxuJyk7XG4rXHR9XG4rXG4rXHQqYnVmX2xlZnRfZmluYWwgPSBidWZfbGVmdDtcbitcbitvdXQ6XG4rXHRrZnJlZShkYXRhX3N0YWdlKTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuKy8qIFJlYWQvd3JpdGUgYSB2ZWN0b3Igb2YgQHR5cGUgZWxlbWVudHMuICovXG4rc3RhdGljIGludCBwcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuK1x0XHQgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLFxuK1x0XHQgICAgdW5pb24gcHJvY192ZWNfY29udiBjb252KVxuK3tcbitcdGludCBlcnIgPSAwO1xuK1x0c2l6ZV90IGRhdGFfc2l6ZSwgbGVmdF9uYnl0ZSA9IFNJWkVfTUFYO1xuK1xuK1x0c3dpdGNoICh0eXBlKSB7XG4rXHRjYXNlIFBST0NfVkVDX0lOVDpcbitcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKGludCk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBQUk9DX1ZFQ19VSU5UOlxuK1x0XHRkYXRhX3NpemUgPSBzaXplb2YodWludCk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbitcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKHVsb25nKTtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuK1x0ICAgICgqcHBvcyBcdTAwMjZcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xuK1x0XHQqbGVucCA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkge1xuK1x0XHRpZiAocHJvY19maXJzdF9wb3Nfbm9uX3plcm9faWdub3JlKHBwb3MsIHRhYmxlKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGVyciA9IGFwcGx5X2NvbnZfb25fdmVjKGNvbnYsIHRhYmxlLCB0eXBlLCBkYXRhX3NpemUsIGRpciwgKmxlbnAsIGJ1ZmZlcixcbitcdFx0XHRcdFx1MDAyNmxlZnRfbmJ5dGUpO1xuK1xuK1x0LypcbitcdCAqIEFuIHVuY2hhbmdlZCBsZWZ0X25ieXRlIHNpZ25hbHMgYSB3cml0ZSB3aXRoIG5vIHBhcnNlZCBlbGVtZW50OyB3aGljaFxuK1x0ICogaXMgYW4gZXJyb3IuIFVzaW5nIFNJWkVfTUFYIHRvIGRldGVjdCB0aGlzIGVycm9yIGlzIHBvc3NpYmxlIGJlY2F1c2U6XG4rXHQgKiAxLiBsZW5wIGlzIGJvdW5kZWQgYnkgS01BTExPQ19NQVhfU0laRSBpbiBwcm9jX3N5c19jYWxsX2hhbmRsZXJcbitcdCAqIDIuIGxlbnAgY291bGQgbmV2ZXIgYmUgU0laRV9NQVggYXMgaXQgaXMgYSBcInJpZGljdWxvdXNcIiAoZXhhYnl0ZSkgYWxsb2NhdGlvbi5cbitcdCAqL1xuK1x0aWYgKGxlZnRfbmJ5dGUgPT0gU0laRV9NQVgpXG4rXHRcdHJldHVybiBlcnI7XG4rXG4rXHQqbGVucCAtPSBsZWZ0X25ieXRlO1xuIG91dDpcbiBcdCpwcG9zICs9ICpsZW5wO1xuK1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtNzU2LDEyICs4MjMsMTUgQEAgaW50IHByb2NfZG91aW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbiBcdFx0XHRpbnQgKCpjb252KShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIHVpbnQgKmtfcHRyLFxuIFx0XHRcdFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKSlcbiB7XG4rXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXG4rXHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAyNlx1MDAyNiAodGFibGUtXHUwMDNlbWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbiBcdGlmICghY29udilcbiBcdFx0Y29udiA9IGRvX3Byb2NfdWludF9jb252O1xuIFxuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbitcdFx0XHQodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pO1xuIH1cbiBcbiAvKipcbkBAIC04MjAsOCArODkwLDggQEAgaW50IHByb2NfZG9ib29sKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gaW50IHByb2NfZG9pbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbiBcdFx0ICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtODQwLDggKzkxMCw3IEBAIGludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gaW50IHByb2NfZG91aW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gXHRcdHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnYgfSk7XG4rXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIGRvX3Byb2NfdWludF9jb252KTtcbiB9XG4gXG4gLyoqXG5AQCAtODY0LDggKzkzMyw4IEBAIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIGludCBwcm9jX2RvaW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0ICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udl9taW5tYXggfSk7XG4gfVxuIFxuIC8qKlxuQEAgLTg5MSw4ICs5NjAsOCBAQCBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4gaW50IHByb2NfZG91aW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0XHQgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXG4ge1xuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBkb19wcm9jX3VpbnRfY29udl9taW5tYXggfSk7XG4rXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsXG4rXHRcdFx0XHQgICBkb19wcm9jX3VpbnRfY29udl9taW5tYXgpO1xuIH1cbiBcbiAvKipcbkBAIC05MzUsOCArMTAwNCw3IEBAIGludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuIFx0XHR0bXAuZXh0cmEyID0gKHVuc2lnbmVkIGludCAqKSBcdTAwMjZtYXg7XG4gXG4gXHR2YWwgPSBSRUFEX09OQ0UoKmRhdGEpO1xuLVx0cmVzID0gZG9fcHJvY192ZWMoXHUwMDI2dG1wLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252X21pbm1heCB9KTtcbitcdHJlcyA9IHByb2NfZG91aW50dmVjX21pbm1heChcdTAwMjZ0bXAsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zKTtcbiBcdGlmIChyZXMpXG4gXHRcdHJldHVybiByZXM7XG4gXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKVxuQEAgLTEwNjYsOCArMTEzNCw4IEBAIGludCBwcm9jX2RvdWxvbmd2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0XHRcdGludCAoKmNvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLFxuIFx0XHRcdFx0XHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLFxuLVx0XHRcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4rXHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGNvbnYgfSk7XG4gfVxuIFxuIC8qKlxuQEAgLTEwODcsMTAgKzExNTUsMTAgQEAgaW50IHByb2NfZG91bG9uZ3ZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuICAqIFJldHVybnM6ICUwIG9uIHN1Y2Nlc3MuXG4gICovXG4gaW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4tXHRcdFx0ICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbitcdFx0dm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORyxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4rXHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGRvX3Byb2NfdWxvbmdfY29udiB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtMTExNCw4ICsxMTgyLDggQEAgaW50IHByb2NfZG9pbnR2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIHtcbiBcdGlmICghY29udilcbiBcdFx0Y29udiA9IGRvX3Byb2NfaW50X2NvbnY7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gY29udiB9KTtcbiB9XG4gXG4gLyoqXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcbmluZGV4IGIyZDhiZDkwMjZhNzIuLmZkZjNkMmZiMGEyYWQgMTAwNzU1XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoXG5AQCAtNCw2ICs0LDcgQEBcbiBcbiAjIFRoaXMgcGVyZm9ybXMgYSBzZXJpZXMgdGVzdHMgYWdhaW5zdCB0aGUgcHJvYyBzeXNjdGwgaW50ZXJmYWNlLlxuIFxuKyMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjMxN1xuICMgS3NlbGZ0ZXN0IGZyYW1ld29yayByZXF1aXJlbWVudCAtIFNLSVAgY29kZSBpcyA0LlxuIGtzZnRfc2tpcD00XG4gXG5AQCAtMzcsNiArMzgsNyBAQCBBTExfVEVTVFM9XCIkQUxMX1RFU1RTIDAwMDk6MToxOnVucmVnaXN0ZXJfZXJyb3I6MFwiXG4gQUxMX1RFU1RTPVwiJEFMTF9URVNUUyAwMDEwOjE6MTptbnQvbW50X2Vycm9yOjBcIlxuIEFMTF9URVNUUz1cIiRBTExfVEVTVFMgMDAxMToxOjE6ZW1wdHlfYWRkOjBcIlxuIEFMTF9URVNUUz1cIiRBTExfVEVTVFMgMDAxMjoxOjE6dThfdmFsaWQ6MFwiXG4rQUxMX1RFU1RTPVwiJEFMTF9URVNUUyAwMDEzOjE6MTppbnRfMDAwMzoxXCJcbiBcbiBmdW5jdGlvbiBhbGxvd191c2VyX2RlZmF1bHRzKClcbiB7XG5AQCAtMTk2LDYgKzE5OCwxOCBAQCB2ZXJpZnlfZGlmZl93KClcbiBcdHJldHVybiAkP1xuIH1cbiBcbisjIFZlcmlmeSB0aGF0IGFuIGVycm9uZW91cyAoJDIpIHVwZGF0ZSBmYWlscyBhbmQgZG9lcyBub3QgY2hhbmdlIFRBUkdFVFxuK3ZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSgpXG4re1xuK1x0VEVTVF9TVFI9XCIkMVwiXG4rXHRlY2hvIC1uIFwiJFRFU1RfU1RSXCIgXHUwMDNlIFwiJFRBUkdFVFwiXG4rXG4rXHRpZiBlY2hvIC1uIFwiJDJcIiBcdTAwM2UgXCIkVEFSR0VUXCIgMlx1MDAzZSAvZGV2L251bGw7IHRoZW5cbitcdFx0cmV0dXJuIDFcbitcdGZpXG4rXHR2ZXJpZnlfZGlmZl93IFwiJHtUQVJHRVR9XCJcbit9XG4rXG4gdGVzdF9yYygpXG4ge1xuIFx0aWYgW1sgJHJjICE9IDAgXV07IHRoZW5cbkBAIC01MDEsNiArNTE1LDQwIEBAIHJ1bl9saW1pdF9kaWdpdF9pbnRfYXJyYXkoKVxuIFx0dGVzdF9yY1xuIH1cbiBcbisjIFlvdSB1c2VkIGFuIGludCBhcnJheSBhbmQgb25lIG9mIHRoZSBlbGVtZW50cyBpcyBub3QgYWNjZXB0YWJsZVxuK3J1bl9pbnRfYXJyYXlfbm9fcGFydGlhbF91cGRhdGUoKVxuK3tcbitcdGVjaG8gLW4gXCJUZXN0aW5nIGludmFsaWQgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCBwYXJ0aWFsbHkgdXBkYXRlIC4uLiBcIlxuKyAgICAgICAgIyBFeHBlY3QgZmFpbHVyZSBiZWNhdXNlIG9mIDNyZCBlbGVtZW50IChhYmMpLlxuK1x0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXCIxIDIgMyA0XCIgXCIxMCAyMCBhYmMgNDBcIjsgdGhlblxuK1x0XHRlY2hvIFwiRkFJTFwiIFx1MDAzZVx1MDAyNjJcbitcdFx0cmM9MVxuK1x0ZWxzZVxuK1x0XHRlY2hvIFwiT0tcIlxuK1x0ZmlcbitcdHRlc3RfcmNcbitcbitcdGVjaG8gLW4gXCJUZXN0aW5nIG91dCBvZiByYW5nZSBhcnJheSBlbGVtZW50IGRvZXMgbm90IHBhcnRpYWxseSB1cGRhdGUgLi4uIFwiXG4rICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIGJlY2F1c2Ugb2YgM3JkIGVsZW1lbnQgKGdyZWF0ZXIgdGhhbiBpbnQpXG4rXHRpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSBcIjEgMiAzIDRcIiBcIjEwIDIwICQoKElOVF9NQVggKyAxKSkgNDBcIjsgdGhlblxuK1x0XHRlY2hvIFwiRkFJTFwiIFx1MDAzZVx1MDAyNjJcbitcdFx0cmM9MVxuK1x0ZWxzZVxuK1x0XHRlY2hvIFwiT0tcIlxuK1x0ZmlcbitcdHRlc3RfcmNcbitcbitcdGVjaG8gLW4gXCJUZXN0aW5nIGludmFsaWQgZmlyc3QgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCB1cGRhdGUgLi4uIFwiXG4rICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIG9mIDFzdCBlbGVtZW50XG4rXHRpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSBcIjEgMiAzIDRcIiBcImFiYyAyMCAzMCA0MFwiOyB0aGVuXG4rXHRcdGVjaG8gXCJGQUlMXCIgXHUwMDNlXHUwMDI2MlxuK1x0XHRyYz0xXG4rXHRlbHNlXG4rXHRcdGVjaG8gXCJPS1wiXG4rXHRmaVxuK1x0dGVzdF9yY1xuK31cbitcbiAjIFlvdSBhcmUgdXNpbmcgYW4gdW5zaWduZWQgaW50XG4gcnVuX2xpbWl0X2RpZ2l0X3VpbnQoKVxuIHtcbkBAIC04ODAsNiArOTI4LDE0IEBAIHN5c2N0bF90ZXN0XzAwMTIoKVxuIFx0cmV0dXJuIDBcbiB9XG4gXG4rc3lzY3RsX3Rlc3RfMDAxMygpXG4re1xuK1x0VEFSR0VUPVwiJHtTWVNDVEx9LyQoZ2V0X3Rlc3RfdGFyZ2V0IDAwMTMpXCJcbitcdHJlc2V0X3ZhbHNcbitcbitcdHJ1bl9pbnRfYXJyYXlfbm9fcGFydGlhbF91cGRhdGVcbit9XG4rXG4gbGlzdF90ZXN0cygpXG4ge1xuIFx0ZWNobyBcIlRlc3QgSUQgbGlzdDpcIlxuQEAgLTkwMCw2ICs5NTYsNyBAQCBsaXN0X3Rlc3RzKClcbiBcdGVjaG8gXCIwMDEwIHggJChnZXRfdGVzdF9jb3VudCAwMDEwKSAtIHRlc3RzIHN5c2N0IG1vdW50IHBvaW50XCJcbiBcdGVjaG8gXCIwMDExIHggJChnZXRfdGVzdF9jb3VudCAwMDExKSAtIHRlc3RzIGVtcHR5IGRpcmVjdG9yaWVzXCJcbiBcdGVjaG8gXCIwMDEyIHggJChnZXRfdGVzdF9jb3VudCAwMDEyKSAtIHRlc3RzIHJhbmdlIGNoZWNrIGZvciB1OCBwcm9jX2hhbmRsZXJcIlxuK1x0ZWNobyBcIjAwMTMgeCAkKGdldF90ZXN0X2NvdW50IDAwMTMpIC0gdGVzdHMgcGFydGlhbGx5IHVwZGF0ZSB2ZWN0b3JzIG9uIGVycm9yXCJcbiB9XG4gXG4gdXNhZ2UoKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDI6NDguMzUxNjE3MzgyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTE5NDk3NDE0MzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBTeXNjdGwgUGF0Y2ggZm9yIEZ1enppbmcgT3Bwb3J0dW5pdGllcyoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggdGhhdCdzIGZ1bmRhbWVudGFsbHkgY2hhbmdpbmcgaG93IHN5c2N0bCBhcnJheXMgYXJlIGhhbmRsZWQgZHVyaW5nIHdyaXRlcyBpbiBga2VybmVsL3N5c2N0bC5jYC4gIFNwZWNpZmljYWxseSwgaXQncyBtb2RpZnlpbmcgdGhlIGBkb19wcm9jX3ZlY2AgZnVuY3Rpb24sIHJlbmFtaW5nIGl0IHRvIGBhcHBseV9jb252X29uX3ZlY2AgYW5kIGBwcm9jX3ZlY2AsIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBwcm9jZXNzaW5nIHN5c2N0bCB2ZWN0b3JzIOKAkyB0aG9zZSBhcnJheXMgb2YgaW50cywgdWludHMsIHVsb25ncyB3ZSBhbGwga25vdyBhbmQgbG92ZSAob3IgYXQgbGVhc3QsIHRvbGVyYXRlKS4gIFRoZSBjb3JlIGNoYW5nZSBoZXJlIGlzIGFib3V0IGF0b21pY2l0eTogdGhlIG9sZCBjb2RlIHdvdWxkIGNvbW1pdCBlbGVtZW50cyBpbiB0aGUgYXJyYXkgKmJlZm9yZSogYSBmYWlsdXJlLCBsZWFkaW5nIHRvIHBhcnRpYWwgdXBkYXRlcy4gIFRoaXMgbmV3IGNvZGUsIHRoYW5rZnVsbHksIHVzZXMgYSB0ZW1wb3JhcnkgYnVmZmVyIChgZGF0YV9zdGFnZWApIHRvIHN0YWdlIHRoZSBjb252ZXJzaW9uIGFuZCBvbmx5IGNvbW1pdHMgaWYgZXZlcnl0aGluZyBnb2VzIHNtb290aGx5LiAgR29vZCBmb3IgY29uc2lzdGVuY3ksIGJ1dCBhbHNvIGludGVyZXN0aW5nIGZyb20gYSB2dWxuZXJhYmlsaXR5IHBlcnNwZWN0aXZlLlxuXG5UaGUgZmlyc3QgcXVlc3Rpb246IGlzIHRoaXMgcmVhY2hhYmxlLCBhbmQgaXMgaXQgd29ydGggZnV6emluZz8gIFdlbGwsIHN5c2N0bCB3cml0ZXMgYXJlICphYnNvbHV0ZWx5KiByZWFjaGFibGUsIGFuZCBJIGtub3cgc3l6a2FsbGVyIGhpdHMgdGhlbSBwcmV0dHkgaGFyZC4gU28sIHllcywgaXQncyB3b3J0aCBpdC4gIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBrZXkgZnVuY3Rpb25zIG1vZGlmaWVkLiAgTG9va3MgbGlrZSBpdCdzIHJlYWxseSB0aGUgb25lcyBJIG1lbnRpb25lZCwgcGx1cyB0aGVzZTogYGNvbW1pdF9jb252X3ZlY2AsIGBwcm9jX2RvdWludHZlY19jb252YCwgYHByb2NfZG9pbnR2ZWNgLCBgcHJvY19kb3VpbnR2ZWNgLCBgcHJvY19kb2ludHZlY19taW5tYXhgLCBgcHJvY19kb3VpbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91bG9uZ3ZlY19jb252YCwgYHByb2NfZG91bG9uZ3ZlY19taW5tYXhgLCBgcHJvY19kb2ludHZlY19jb252YC5cblxuTXkgbmV4dCB0aG91Z2h0IGlzIHRvIGZvY3VzIHRoZSBmdXp6aW5nIGVmZm9ydC4gIExldCdzIHNlZTogYHByb2NfZG9pbnR2ZWNgLCBgcHJvY19kb3VpbnR2ZWNgLCBgcHJvY19kb2ludHZlY19taW5tYXhgLCBgcHJvY19kb3VpbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91bG9uZ3ZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX2NvbnZgLCBgcHJvY19kb2ludHZlY19jb252YC4gVGhlc2UgYXJlICpleHBvcnRlZCogc3lzY3RsIGhhbmRsZXJzLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgSSdtIGxvb2tpbmcgZm9yLiAgV2FpdCBhIG1pbnV0ZSwgc3l6a2FsbGVyIGZ1enplcyBzeXNjdGxzIHVzaW5nIGBvcGVuYC9gd3JpdGVgIGNhbGxzIHRvIGAvcHJvYy9zeXMvLi4uYC4gVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHRoZXNlIGNhbGxzIGFyZSBoYW5kbGVkIGJ5IGBwcm9jX3N5c19jYWxsX2hhbmRsZXJgIHdoaWNoIGV2ZW50dWFsbHkgdXNlcyBgdGFibGUtXHUwMDNlcHJvY19oYW5kbGVyYC4gIFNvLCAqdGhlc2UqIGZ1bmN0aW9ucywgdGhlIG9uZXMgSSBqdXN0IGxpc3RlZCwgYXJlIGxpa2VseSB0aGUgYWN0dWFsIGhhbmRsZXJzIGJlaW5nIGNhbGxlZC5cblxuTGV0J3MgcXVpY2tseSB2ZXJpZnkgdGhhdCBsaXN0OiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfY29udmAsIGBwcm9jX2RvaW50dmVjX2NvbnZgLiBQZXJmZWN0LlxuXG5ObyBzcGVjaWZpYyBjb25maWdzIHRvIHdvcnJ5IGFib3V0LCBpdCdzIGNvcmUga2VybmVsIGZ1bmN0aW9uYWxpdHkuXG5cbkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQgbWUgdGFrZSBhbm90aGVyIGxvb2sgYXQgdGhlIHBhdGNoIGl0c2VsZi4gSSB3YW50IHRvIGRvdWJsZS1jaGVjayB0aGF0IGBhcHBseV9jb252X29uX3ZlY2AgaXMgdGhlIGNlbnRyYWwgY29tcG9uZW50LiBZZXMsIGFuZCBpdCdzIHN0YXRpYy4gIFRoZSBleHBvcnRlZCBoYW5kbGVycyBhcmUgdGhlIG9uZXMgSSBpZGVudGlmaWVkOiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfY29udmAsIGBwcm9jX2RvaW50dmVjX2NvbnZgLiBJIG5lZWQgdG8gY29uZmlybSB0aGVzZSBhcmUgdHJ1bHkgZXhwb3J0ZWQuIFRoaXMgY29uZmlybXMgdGhlIGF0dGFjayBzdXJmYWNlIEkgaWRlbnRpZmllZC4gTm93LCBsZXQncyBnZXQgdG8gd29yayFcblxuXG4iLCJJbnB1dFRva2VucyI6NzYyNSwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcyMSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjAzOjAwLjMwMTM2MjI1N1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODcwNjEwNjkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkVYUE9SVF9TWU1CT0wuKlxcXFwocHJvY19kb2ludHZlY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvc3lzY3RsLmM9MTUyNT1FWFBPUlRfU1lNQk9MKHByb2NfZG9ib29sKTtcXG5rZXJuZWwvc3lzY3RsLmM6MTUyNjpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWMpO1xcbmtlcm5lbC9zeXNjdGwuYy0xNTI3LUVYUE9SVF9TWU1CT0wocHJvY19kb3VpbnR2ZWMpO1xcbmtlcm5lbC9zeXNjdGwuYzoxNTI4OkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY19taW5tYXgpO1xcbmtlcm5lbC9zeXNjdGwuYy0xNTI5LUVYUE9SVF9TWU1CT0xfR1BMKHByb2NfZG91aW50dmVjX21pbm1heCk7XFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9MjU0PWludCBwcm9jX2RvaW50dmVjX2ppZmZpZXMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjU5LX1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM6MjYwOkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY19qaWZmaWVzKTtcXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjYxLVxcbi0tXFxua2VybmVsL3RpbWUvamlmZmllcy5jPTI3Nz1pbnQgcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcXG4tLVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yODItfVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYzoyODM6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzKTtcXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjg0LVxcbi0tXFxua2VybmVsL3RpbWUvamlmZmllcy5jPTMwMD1pbnQgcHJvY19kb2ludHZlY19tc19qaWZmaWVzKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzA1LX1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM6MzA2OkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY19tc19qaWZmaWVzKTtcXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzA3LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzowMy4xNzE5ODA0MzhaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MDEwNjgwMDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBTeXNjdGwgQXJyYXkgV3JpdGUgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGEgZ29vZCBvbmUuIEl0J3MgZnVuZGFtZW50YWxseSBjaGFuZ2luZyBob3cgYHN5c2N0bGAgaGFuZGxlcyB3cml0ZXMgdG8gYXJyYXlzLCBzcGVjaWZpY2FsbHkgdG8gYXZvaWQgcGFydGlhbCB1cGRhdGVzLiBUaGUgYXBwcm9hY2ggb2YgYWxsb2NhdGluZyBhIHRlbXBvcmFyeSBidWZmZXIsIGNvbnZlcnRpbmcgdGhlIGVsZW1lbnRzIHRoZXJlLCBhbmQgb25seSBjb21taXR0aW5nIHRoZSBjaGFuZ2VzIGlmIGV2ZXJ5dGhpbmcgc3VjY2VlZHMgaXMgc21hcnQuIEl0J3MgYSBjbGFzc2ljIHRyYW5zYWN0aW9uYWwgYXBwcm9hY2gsIHJlYWxseS4gUHJldmVudHMgaW5jb25zaXN0ZW50IHN0YXRlIGFuZCBtaXRpZ2F0ZXMgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGludGVycnVwdGVkIHdyaXRlIG9wZXJhdGlvbnMuXG5cblNpbmNlIHRoaXMgYWZmZWN0cyBhbGwgYHN5c2N0bGAgaGFuZGxlcnMgdGhhdCBkZWFsIHdpdGggdmVjdG9ycyDigJMgdGhhdCBpcywgYW55IGFycmF5IG9yIGxpc3Qgb2YgdmFsdWVzIOKAkyBpdCBoYXMgYSB3aWRlIGltcGFjdC4gTXkgZmlyc3QgdGhvdWdodCBpczogKiphYnNvbHV0ZWx5IGZ1enogdGhpcyEqKiBXZSBuZWVkIHRvIHRocm93IGV2ZXJ5dGhpbmcgd2UgY2FuIGF0IGl0LiAgSSdtIHBhcnRpY3VsYXJseSB3b3JyaWVkIGFib3V0IG1lbW9yeSBsZWFrcywgZXNwZWNpYWxseSB3aXRoaW4gYGFwcGx5X2NvbnZfb25fdmVjYC4gYGttZW1kdXBgIGlzIGEgcHJpbWUgc3VzcGVjdCDigJMgcG90ZW50aWFsIGZvciBsZWFrcyBpZiB0aGluZ3MgZ28gd3JvbmcuIE91dC1vZi1ib3VuZHMgYWNjZXNzZXMgYXJlIGFub3RoZXIgaHVnZSBjb25jZXJuLCBhbmQgd2UgbmVlZCB0byB2ZXJpZnkgdGhlIGVycm9yIGhhbmRsaW5nIGlzIHJvYnVzdC4gQW55IHdlYWtuZXNzIGhlcmUgY291bGQgYmUgZXhwbG9pdGVkLlxuXG5JIHNob3VsZCBmb2N1cyBvbiB0aGVzZSBzeW1ib2xzOiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfY29udmAsIGFuZCBgcHJvY19kb2ludHZlY19jb252YC4gVGhvc2UgYXJlIGNsZWFybHkgdGhlIGNvcmUgZnVuY3Rpb25zIGludm9sdmVkIGluIHRoZXNlIHZlY3RvciBvcGVyYXRpb25zLlxuXG5XYWl0IGEgc2Vjb25k4oCmIGBwcm9jX2RvdWludHZlY19jb252YCBpcyBleHBvcnRlZD8gVGhhdOKAmXMgaW50ZXJlc3RpbmcuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHdoZXJlIHRoYXTigJlzIGJlaW5nIHVzZWQuIEkgbmVlZCB0byBjaGVjayBpdHMgZXhwb3J0IHRvIHNlZSB3aGF0IHRoYXQgaW1wbGllcy4gVGhpcyBkZWZpbml0ZWx5IHdhcnJhbnRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6OTU2OCwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzowOS4xODI2NjQzNjdaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc0ODEwNjE5MywiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiRVhQT1JUX1NZTUJPTC4qXFxcXChwcm9jX2RvdWludHZlY19jb252XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzoxMS45MzA3NzY4MjlaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzAxODc5NDkyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipDaGVja2luZyBGdW5jdGlvbiBFeHBvcnQgU3RhdHVzKipcblxuT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgYHByb2NfZG91aW50dmVjX2NvbnZgIGlzIGFuIGV4cG9ydGVkIGZ1bmN0aW9uLiBIbW0sIGl0IGRvZXNuJ3QgKnNlZW0qIGxpa2UgaXQgaXMuIEJ1dCBsZXQncyBub3QganVtcCB0byBjb25jbHVzaW9ucy4gSXQncyBlYXN5IHRvIGdldCBmdW5jdGlvbnMgbWl4ZWQgdXAsIHNvIEknZCBiZXR0ZXIgYmUgYWJzb2x1dGVseSBjZXJ0YWluIGJlZm9yZSBJIG1ha2UgYSBkZWNpc2lvbi4gTGV0J3Mgbm90IGFzc3VtZSBhbnl0aGluZy4gT2theSwgbGV0J3MganVzdCBtYWtlIGEgcXVpY2sgY2hlY2sgb2YgYHByb2NfZG91bG9uZ3ZlY19jb252YC4gSSBoYXZlIGEgZmVlbGluZyB0aGVyZSBtaWdodCBiZSBhIHJlbGF0aW9uIHRoYXQgbmVlZHMgdW50YW5nbGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxNTgsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzoxNS42MzI2NTg2OTFaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjg1NDM0MzQyMCwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiRVhQT1JUX1NZTUJPTC4qXFxcXChwcm9jX2RvdWxvbmd2ZWNfY29udlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDM6MTguNDg3MDEwNDIxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ1NzgwODAwNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgSSdtIHJlYWR5IHRvIGRpdmUgaW50byB0aGF0IFwiZXhwb3J0ZWRcIiBzaXR1YXRpb24uIEhlcmUncyBteSB0YWtlOlxuXG4qKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgRXhwb3J0ZWQgRGF0YSoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBGaXJzdCB0aGluZydzIGZpcnN0OiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgKmV4YWN0bHkqIHdoYXQncyBiZWVuIGV4cG9ydGVkLiBJdCdzIGNydWNpYWwsIGF0IHRoaXMgc3RhZ2UsIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIGFuZCBuYXR1cmUgb2YgdGhlIGRhdGEgaW52b2x2ZWQuIEkgbmVlZCB0byBiZSBtZXRob2RpY2FsIGhlcmUuIEknbGwgbmVlZCB0byBpZGVudGlmeSB0aGUga2V5IHZhcmlhYmxlcywgdGhlIGZvcm1hdHMgYmVpbmcgdXNlZCwgYW55IHBvdGVudGlhbCBiaWFzZXMgaW50cm9kdWNlZCBkdXJpbmcgdGhlIGV4cG9ydCBwcm9jZXNzIGFuZCB0aGVpciBpbXBsaWNhdGlvbnMsIHdoZXRoZXIgdGhlIGRhdGEgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBkZXNpcmVkIGV4cG9ydCBvciBpZiBhbnkgZmllbGRzIGFyZSBvbWl0dGVkLiBPbmNlIEkgZ3Jhc3AgdGhlIHJhdyBjb250ZW50cywgSSBjYW4gc3RhcnQgdG8gZm9ybXVsYXRlIG1vcmUgbWVhbmluZ2Z1bCBxdWVzdGlvbnMgYWJvdXQgaXRzIHN1aXRhYmlsaXR5IGZvciBvdXIgcHVycG9zZXMuIFVsdGltYXRlbHksIGl0J3MgYWJvdXQgbWFraW5nIHN1cmUgd2UncmUgc3RhcnRpbmcgd2l0aCBhIHNvbGlkIGZvdW5kYXRpb24gYmVmb3JlIHdlIHN0YXJ0IG1hbmlwdWxhdGluZyBvciBhbmFseXppbmcgdGhlIGRhdGEuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMzYzLCJPdXRwdXRUb2tlbnMiOjI0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzoyMi45NDQ4MjA4MDhaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3ODQwNzgwOTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiRVhQT1JUX1NZTUJPTC4qXFxcXChwcm9jX2QuKnZlY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvc3lzY3RsLmM9OTg1PWludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbi0tXFxua2VybmVsL3N5c2N0bC5jLTEwMTMtfVxcbmtlcm5lbC9zeXNjdGwuYzoxMDE0OkVYUE9SVF9TWU1CT0xfR1BMKHByb2NfZG91OHZlY19taW5tYXgpO1xcbmtlcm5lbC9zeXNjdGwuYy0xMDE1LVxcbi0tXFxua2VybmVsL3N5c2N0bC5jPTE1MjU9RVhQT1JUX1NZTUJPTChwcm9jX2RvYm9vbCk7XFxua2VybmVsL3N5c2N0bC5jOjE1MjY6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjKTtcXG5rZXJuZWwvc3lzY3RsLmM6MTUyNzpFWFBPUlRfU1lNQk9MKHByb2NfZG91aW50dmVjKTtcXG5rZXJuZWwvc3lzY3RsLmM6MTUyODpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfbWlubWF4KTtcXG5rZXJuZWwvc3lzY3RsLmM6MTUyOTpFWFBPUlRfU1lNQk9MX0dQTChwcm9jX2RvdWludHZlY19taW5tYXgpO1xcbmtlcm5lbC9zeXNjdGwuYy0xNTMwLUVYUE9SVF9TWU1CT0wocHJvY19kb3N0cmluZyk7XFxua2VybmVsL3N5c2N0bC5jOjE1MzE6RVhQT1JUX1NZTUJPTChwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KTtcXG5rZXJuZWwvc3lzY3RsLmMtMTUzMi1FWFBPUlRfU1lNQk9MKHByb2NfZG9fbGFyZ2VfYml0bWFwKTtcXG4tLVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYz0yNTQ9aW50IHByb2NfZG9pbnR2ZWNfamlmZmllcyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcXG4tLVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yNTktfVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYzoyNjA6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX2ppZmZpZXMpO1xcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yNjEtXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9Mjc3PWludCBwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbi0tXFxua2VybmVsL3RpbWUvamlmZmllcy5jLTI4Mi19XFxua2VybmVsL3RpbWUvamlmZmllcy5jOjI4MzpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMpO1xcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yODQtXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9MzAwPWludCBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4tLVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0zMDUtfVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYzozMDY6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMpO1xcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0zMDctXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9MzMyPWludCBwcm9jX2RvdWxvbmd2ZWNfbXNfamlmZmllc19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzM3LX1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM6MzM4OkVYUE9SVF9TWU1CT0wocHJvY19kb3Vsb25ndmVjX21zX2ppZmZpZXNfbWlubWF4KTtcXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzM5LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzoyNS43Mjg5MDU0NTNaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjA1NTgzMDk1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBTeXNjdGwgSGFuZGxlciBQYXRjaCoqXG5cbk9rYXksIHNvIEkgc2VlIHRoZSBleHBvcnRlZCBzeW1ib2xzOiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGFuZCBgcHJvY19kb3U4dmVjX21pbm1heGAuIFRoZXNlIGFyZSB0aGUgZW50cnkgcG9pbnRzIGZvciB0aGUgc3lzY3RsIGhhbmRsZXJzLCByaWdodD8gQW5kIHRoaXMgcGF0Y2ggaXMgaGl0dGluZyB0aGUgY29yZSBsb2dpYyBiZWhpbmQgYWxsIG9mIHRoZW0uIFNtYXJ0IG1vdmUsIGFkZHJlc3NpbmcgaXQgYXQgdGhlIHJvb3QuXG5cblRoZSBjb3JlIGNoYW5nZSBoZXJlIGlzIGFib3V0IHByZXZlbnRpbmcgcGFydGlhbCB1cGRhdGVzIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBzeXNjdGwgdmVjdG9yIHByb2Nlc3NpbmcuIFRoZSBzb2x1dGlvbiwgaXQgc2VlbXMsIGlzIGFsbG9jYXRpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyLiBUaGF04oCZcyBhIGNvbW1vbiBhcHByb2FjaCB0byBlbnN1cmUgYXRvbWljaXR5IGluIHRoZXNlIHR5cGVzIG9mIG9wZXJhdGlvbnMuIEl0IGFmZmVjdHMgYW55IGhhbmRsZXIgdGhhdCdzIHdvcmtpbmcgd2l0aCBhcnJheXMsIHdoaWNoIG1ha2VzIHNlbnNlIGdpdmVuIHRoZSBmdW5jdGlvbiBuYW1lcy5cblxuTm93LCBiZWNhdXNlIG9mIHRoaXMgY2hhbmdlIGluIHRoZSBlcnJvciBoYW5kbGluZywgYW5kIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBidWZmZXIsIEknbSB0aGlua2luZyByaWdvcm91cyBmdXp6aW5nIGlzIGFic29sdXRlbHkgY3J1Y2lhbCBoZXJlLiBXZSBuZWVkIHRvIHZlcmlmeSB0aGF0IGVycm9yIGhhbmRsaW5nIGlzIHJvY2sgc29saWQsIHRoYXQgdGhlcmUgYXJlIG5vIHNuZWFreSBtZW1vcnkgbGVha3MsIGFuZCBkZWZpbml0ZWx5IG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgd2hlbiB3ZSB3cml0ZSB0byB0aGUgc3lzY3RsIGludGVyZmFjZS4gSSBuZWVkIHRvIGJlIHN1cmUgdGhhdCB3ZSBkb24ndCBpbnRyb2R1Y2Ugc3VidGxlIHZ1bG5lcmFiaWxpdGllcy5cblxuTGV0J3MgZ2V0IGBzZXQtcmVzdWx0c2AgcnVubmluZy4gSSBuZWVkIHRvIHNlZSB3aGF0IHdlIGhhdmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMzEwLCJPdXRwdXRUb2tlbnMiOjE1MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzozMS43ODQ3NDIwMzJaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozOTI1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInByb2NfZG9pbnR2ZWNcIixcbiAgICBcInByb2NfZG91aW50dmVjXCIsXG4gICAgXCJwcm9jX2RvaW50dmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3VpbnR2ZWNfbWlubWF4XCIsXG4gICAgXCJwcm9jX2RvdWxvbmd2ZWNfbWlubWF4XCIsXG4gICAgXCJwcm9jX2RvdTh2ZWNfbWlubWF4XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGNvcmUgc3lzY3RsIHZlY3RvciBwcm9jZXNzaW5nIGxvZ2ljIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIG9uIGVycm9yIGJ5IGFsbG9jYXRpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyLiBUaGlzIGFmZmVjdHMgYWxsIHN5c2N0bCBoYW5kbGVycyB0aGF0IHByb2Nlc3MgYXJyYXlzLiBGdXp6aW5nIGlzIG5lZWRlZCB0byBlbnN1cmUgY29ycmVjdCBlcnJvciBoYW5kbGluZywgbm8gbWVtb3J5IGxlYWtzLCBhbmQgbm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBkdXJpbmcgc3lzY3RsIHdyaXRlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwcm9jX2RvaW50dmVjXCIsXG4gICAgXCJwcm9jX2RvdWludHZlY1wiLFxuICAgIFwicHJvY19kb2ludHZlY19taW5tYXhcIixcbiAgICBcInByb2NfZG91aW50dmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3Vsb25ndmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3U4dmVjX21pbm1heFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIHN5c2N0bCB2ZWN0b3IgcHJvY2Vzc2luZyBsb2dpYyB0byBwcmV2ZW50IHBhcnRpYWwgdXBkYXRlcyBvbiBlcnJvciBieSBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBhZmZlY3RzIGFsbCBzeXNjdGwgaGFuZGxlcnMgdGhhdCBwcm9jZXNzIGFycmF5cy4gRnV6emluZyBpcyBuZWVkZWQgdG8gZW5zdXJlIGNvcnJlY3QgZXJyb3IgaGFuZGxpbmcsIG5vIG1lbW9yeSBsZWFrcywgYW5kIG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHN5c2N0bCB3cml0ZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjAzOjMxLjc4NDc4NTAzMloiLCJTZXEiOjEzLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY3MzkzNDgwNjcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDM6MzEuNzg1NTkyMjEyWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE2NzM5MjY2OTg4MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHN5c2N0bCBhcnJheSBwYXJzaW5nIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIGJ5IHVzaW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGttZW1kdXBgKSB3aGVuIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gVGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBzaW1wbGUgYXJyYXlzIG9mIGludGVnZXJzIG9yIHVuc2lnbmVkIGxvbmdzIHdpdGhvdXQgcGFkZGluZy4gVGhlIHJlYWQgcGF0aCAoa2VybmVsIHRvIHVzZXIpIGlzIHVuY2hhbmdlZCwgc28gbm8gbmV3IGluZm8tbGVha3MgYXJlIGludHJvZHVjZWQuIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG9ubHkgdXNlZCBmb3Igd3JpdGluZyB0byBrZXJuZWwgc3BhY2UsIGFuZCBvbmx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQgZWxlbWVudHMgYXJlIGNvcGllZCBiYWNrLiBBbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIG1lbW9yeSBsZWFrIGRldGVjdG9ycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGUyMDg2MjgzMWNlNzRhMmNiYWY2ZjYzZTkxZWM3ZThmMDQxZWVkMTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEF1ZyAxMyAxNTowMjo0NCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuY1xuaW5kZXggZjdiNzU5ODVkNTQyMC4uNzg3ZjUzZDcwNTA3YiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9zeXNjdGwuY1xuKysrIGIva2VybmVsL3N5c2N0bC5jXG5AQCAtNTk1LDcgKzU5NSw3IEBAIHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXG4gc3RhdGljIGNvbnN0IGNoYXIgcHJvY193c3BhY2Vfc2VwW10gPSB7ICcgJywgJ1xcdCcsICdcXG4nIH07XG4gXG4gLypcbi0gKiBFbGVtZW50IHR5cGUgcHJvY2Vzc2VkIGJ5IGRvX3Byb2NfdmVjKCkuIFRoZSB0YWcgc2VsZWN0cyB0aGUgZWxlbWVudCBzaXplXG4rICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBwcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZVxuICAqIGFuZCBzaWduZWRuZXNzLCBhbmQgaXQgc2VsZWN0cyB3aGljaCBtZW1iZXIgb2YgdW5pb24gcHJvY192ZWNfY29udiBpcyBsaXZlLlxuICAqL1xuIGVudW0gcHJvY192ZWNfdHlwZSB7XG5AQCAtNjA1LDcgKzYwNSw3IEBAIGVudW0gcHJvY192ZWNfdHlwZSB7XG4gfTtcbiBcbiAvKlxuLSAqIENvbnZlcnRlciBwYXNzZWQgdG8gZG9fcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxuKyAqIENvbnZlcnRlciBwYXNzZWQgdG8gcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxuICAqIGVudW0gcHJvY192ZWNfdHlwZSB0YWcgaXMgZXZlciByZWFkLCBzbyBldmVyeSBkaXNwYXRjaCBzdGF5cyBmdWxseSB0eXBlZCBhbmRcbiAgKiBubyB2b2lkICogY29udmVydGVyIHBvaW50ZXIgaXMgbmVlZGVkLlxuICAqL1xuQEAgLTYzNywxMDEgKzYzNywxNjggQEAgc3RhdGljIGludCBwcm9jX3ZlY19jb252KGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXG4gXHRyZXR1cm4gLUVJTlZBTDtcbiB9XG4gXG4tLypcbi0gKiBSZWFkL3dyaXRlIGEgdmVjdG9yIG9mIEB0eXBlIGVsZW1lbnRzLiBUaGUgZWxlbWVudCBzaXplIGFuZCBzaWduZWRuZXNzIGFyZVxuLSAqIGRlcml2ZWQgZnJvbSBAdHlwZSwgc28gYSBzaW5nbGUgcnVudGltZSBmdW5jdGlvbiByZXBsYWNlcyB0aGUgcGVyLXR5cGVcbi0gKiB2YXJpYW50cy4gdGFibGUtXHUwMDNlZGF0YSBpcyB3YWxrZWQgYXMgcmF3IGJ5dGVzIChAaSkgYWR2YW5jZWQgYnkgQHNpemU7IHRoZVxuLSAqIGNvbnZlcnRlciBwZXJmb3JtcyB0aGUgYWN0dWFsIHR5cGVkIGxvYWQvc3RvcmUuXG4tICovXG4tc3RhdGljIGludCBkb19wcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi1cdFx0ICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsXG4tXHRcdCAgICAgICBlbnVtIHByb2NfdmVjX3R5cGUgdHlwZSwgdW5pb24gcHJvY192ZWNfY29udiBjb252KVxuK3N0YXRpYyBpbnQgY29tbWl0X2NvbnZfdmVjKGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsIHZvaWQgKmRzdCxcbitcdFx0XHQgICAgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnIpXG4ge1xuLVx0aW50IHZsZWZ0LCBmaXJzdCA9IDEsIGVyciA9IDA7XG4tXHRzaXplX3QgbGVmdCwgc2l6ZTtcbi1cdGJvb2wgaXNfdW5zaWduZWQ7XG4tXHRjaGFyICppLCAqcDtcbitcdHNpemVfdCBpO1xuIFxuLVx0c3dpdGNoICh0eXBlKSB7XG4rXHRzd2l0Y2ggKGRhdGFfdHlwZSkge1xuIFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YoaW50KTtcbi1cdFx0aXNfdW5zaWduZWQgPSBmYWxzZTtcbi1cdFx0YnJlYWs7XG4tXHRjYXNlIFBST0NfVkVDX1VJTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YodWludCk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpKyspXG4rXHRcdFx0V1JJVEVfT05DRSgoKGludCAqKWRzdClbaV0sICgoY29uc3QgaW50ICopc3JjKVtpXSk7XG4rXHRcdHJldHVybiAwO1xuK1xuIFx0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbi1cdFx0c2l6ZSA9IHNpemVvZih1bG9uZyk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpKyspXG4rXHRcdFx0V1JJVEVfT05DRSgoKHVsb25nICopZHN0KVtpXSwgKChjb25zdCB1bG9uZyAqKXNyYylbaV0pO1xuK1x0XHRyZXR1cm4gMDtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0fVxuK31cbiBcbi1cdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuLVx0ICAgICgqcHBvcyBcdTAwMjZcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xuLVx0XHQqbGVucCA9IDA7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0aSA9IHRhYmxlLVx1MDAzZWRhdGE7XG4tXHR2bGVmdCA9IHRhYmxlLVx1MDAzZW1heGxlbiAvIHNpemU7XG4tXHRsZWZ0ID0gKmxlbnA7XG4tXG4tXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXG4tXHRpZiAodHlwZSA9PSBQUk9DX1ZFQ19VSU5UIFx1MDAyNlx1MDAyNiB2bGVmdCAhPSAxKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcbi1cdFx0aWYgKHByb2NfZmlyc3RfcG9zX25vbl96ZXJvX2lnbm9yZShwcG9zLCB0YWJsZSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdGlmIChsZWZ0IFx1MDAzZSBQQUdFX1NJWkUgLSAxKVxuLVx0XHRcdGxlZnQgPSBQQUdFX1NJWkUgLSAxO1xuLVx0XHRwID0gYnVmZmVyO1xuKy8qKlxuKyAqIGFwcGx5X2NvbnZfb25fdmVjIC0gQXBwbHkgY29udmVydGVyIGZ1bmN0aW9uIG9uIGRhdGEgdmVjdG9yXG4rICpcbisgKiBFbGVtZW50IHNpZ25lZG5lc3MgaXMgZGVyaXZlZCBmcm9tIEBkYXRhX3R5cGUuIHRhYmxlLVx1MDAzZWRhdGEgaXMgd2Fsa2VkXG4rICogYXMgcmF3IGJ5dGVzIChAZGF0YSkgYWR2YW5jZWQgYnkgQGRhdGFfc2l6ZTsgdGhlIGNvbnZlcnRlciBwZXJmb3Jtc1xuKyAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mXG4rICogYnl0ZXMgdGhhdCB3aGVyZSBsZWZ0IG91dHN0YW5kaW5nIGFmdGVyIGNvbnZlcnNpb24uIENhbiBiZSBcdTAwM2UgMC5cbisgKlxuKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLiBOb24temVybyBvbiBlcnJvci5cbisgKi9cbitzdGF0aWMgaW50IGFwcGx5X2NvbnZfb25fdmVjKGNvbnN0IHVuaW9uIHByb2NfdmVjX2NvbnYgY29udixcbitcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLFxuK1x0XHRcdCAgICAgY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSxcbitcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IGludCBjb252X2RpcixcbitcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBidWZfbmJ5dGUsIHZvaWQgKmJ1ZixcbitcdFx0XHQgICAgIHNpemVfdCAqYnVmX2xlZnRfZmluYWwpXG4re1xuK1x0aW50IHZlY19sZWZ0LCBlcnIgPSAwO1xuK1x0c2l6ZV90IGJ1Zl9sZWZ0LCBucl9jb252ID0gMDtcbitcdGNoYXIgKmRhdGEsICpkYXRhX3N0YWdlID0gTlVMTCwgKnA7XG4rXHRib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HO1xuK1xuK1x0YnVmX2xlZnQgPSBidWZfbmJ5dGU7XG4rXG4rXHRkYXRhID0gdGFibGUtXHUwMDNlZGF0YTtcbitcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xuK1x0XHRpZiAoYnVmX2xlZnQgXHUwMDNlIFBBR0VfU0laRSAtIDEpXG4rXHRcdFx0YnVmX2xlZnQgPSBQQUdFX1NJWkUgLSAxO1xuK1x0XHRwID0gYnVmO1xuK1xuK1x0XHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAzZSBkYXRhX3NpemUpIHtcbitcdFx0XHRkYXRhX3N0YWdlID0ga21lbWR1cCh0YWJsZS1cdTAwM2VkYXRhLCB0YWJsZS1cdTAwM2VtYXhsZW4sIEdGUF9LRVJORUwpO1xuK1x0XHRcdGlmICghZGF0YV9zdGFnZSkge1xuK1x0XHRcdFx0ZXJyID0gLUVOT01FTTtcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdH1cbitcdFx0XHRkYXRhID0gZGF0YV9zdGFnZTtcbitcdFx0fVxuIFx0fVxuIFxuLVx0Zm9yICg7IGxlZnQgXHUwMDI2XHUwMDI2IHZsZWZ0LS07IGkgKz0gc2l6ZSwgZmlyc3QgPSAwKSB7XG4rXHR2ZWNfbGVmdCA9IHRhYmxlLVx1MDAzZW1heGxlbiAvIGRhdGFfc2l6ZTtcbitcdGZvciAoOyBidWZfbGVmdCBcdTAwMjZcdTAwMjYgdmVjX2xlZnQtLTsgZGF0YSArPSBkYXRhX3NpemUsIG5yX2NvbnYrKykge1xuIFx0XHR1bnNpZ25lZCBsb25nIGx2YWw7XG4gXHRcdGJvb2wgbmVnID0gZmFsc2U7XG4gXG4tXHRcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcbi1cdFx0XHRwcm9jX3NraXBfc3BhY2VzKFx1MDAyNnAsIFx1MDAyNmxlZnQpO1xuK1x0XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbitcdFx0XHRwcm9jX3NraXBfc3BhY2VzKFx1MDAyNnAsIFx1MDAyNmJ1Zl9sZWZ0KTtcbiBcbi1cdFx0XHRpZiAoIWxlZnQpXG4rXHRcdFx0aWYgKCFidWZfbGVmdClcbiBcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2bGVmdCwgXHUwMDI2bHZhbCwgXHUwMDI2bmVnLFxuK1x0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQsIFx1MDAyNmx2YWwsIFx1MDAyNm5lZyxcbiBcdFx0XHRcdFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcbiBcdFx0XHRcdFx0ICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTtcbiBcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgbmVnIFx1MDAyNlx1MDAyNiBpc191bnNpZ25lZClcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0aWYgKGVycilcbiBcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGlmIChwcm9jX3ZlY19jb252KHR5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgaSwgZGlyLCB0YWJsZSkpIHtcbitcdFx0XHRpZiAocHJvY192ZWNfY29udihkYXRhX3R5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkge1xuIFx0XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRpZiAocHJvY192ZWNfY29udih0eXBlLCBjb252LCBcdTAwMjZuZWcsIFx1MDAyNmx2YWwsIGksIGRpciwgdGFibGUpKSB7XG4rXHRcdFx0aWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCBcdTAwMjZuZWcsIFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4tXHRcdFx0aWYgKCFmaXJzdClcbi1cdFx0XHRcdHByb2NfcHV0X2NoYXIoXHUwMDI2YnVmZmVyLCBcdTAwMjZsZWZ0LCAnXFx0Jyk7XG4tXHRcdFx0cHJvY19wdXRfbG9uZyhcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsIGx2YWwsIG5lZyk7XG4rXHRcdFx0aWYgKG5yX2NvbnYpXG4rXHRcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICdcXHQnKTtcbitcdFx0XHRwcm9jX3B1dF9sb25nKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsIGx2YWwsIG5lZyk7XG4gXHRcdH1cbiBcdH1cbiBcbi1cdGlmIChTWVNDVExfS0VSTl9UT19VU0VSKGRpcikgXHUwMDI2XHUwMDI2ICFmaXJzdCBcdTAwMjZcdTAwMjYgbGVmdCBcdTAwMjZcdTAwMjYgIWVycilcbi1cdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsICdcXG4nKTtcbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgXHUwMDI2XHUwMDI2ICFlcnIgXHUwMDI2XHUwMDI2IGxlZnQpXG4tXHRcdHByb2Nfc2tpcF9zcGFjZXMoXHUwMDI2cCwgXHUwMDI2bGVmdCk7XG4tXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpIFx1MDAyNlx1MDAyNiBmaXJzdClcbi1cdFx0cmV0dXJuIGVyciA/IDogLUVJTlZBTDtcbi1cdCpsZW5wIC09IGxlZnQ7XG4rXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbitcdFx0aWYgKCFlcnIgXHUwMDI2XHUwMDI2IGJ1Zl9sZWZ0KVxuK1x0XHRcdHByb2Nfc2tpcF9zcGFjZXMoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQpO1xuK1x0XHRpZiAoIW5yX2NvbnYpIHtcbitcdFx0XHRlcnIgPSBlcnIgPyA6IC1FSU5WQUw7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdFx0aWYgKCFlcnIgXHUwMDI2XHUwMDI2IGRhdGFfc3RhZ2UpXG4rXHRcdFx0ZXJyID0gY29tbWl0X2NvbnZfdmVjKGRhdGFfdHlwZSwgdGFibGUtXHUwMDNlZGF0YSwgZGF0YV9zdGFnZSwgbnJfY29udik7XG4rXHR9IGVsc2Uge1xuK1x0XHRpZiAobnJfY29udiBcdTAwMjZcdTAwMjYgYnVmX2xlZnQgXHUwMDI2XHUwMDI2ICFlcnIpXG4rXHRcdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWYsIFx1MDAyNmJ1Zl9sZWZ0LCAnXFxuJyk7XG4rXHR9XG4rXG4rXHQqYnVmX2xlZnRfZmluYWwgPSBidWZfbGVmdDtcbitcbitvdXQ6XG4rXHRrZnJlZShkYXRhX3N0YWdlKTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuKy8qIFJlYWQvd3JpdGUgYSB2ZWN0b3Igb2YgQHR5cGUgZWxlbWVudHMuICovXG4rc3RhdGljIGludCBwcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuK1x0XHQgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLFxuK1x0XHQgICAgdW5pb24gcHJvY192ZWNfY29udiBjb252KVxuK3tcbitcdGludCBlcnIgPSAwO1xuK1x0c2l6ZV90IGRhdGFfc2l6ZSwgbGVmdF9uYnl0ZSA9IFNJWkVfTUFYO1xuK1xuK1x0c3dpdGNoICh0eXBlKSB7XG4rXHRjYXNlIFBST0NfVkVDX0lOVDpcbitcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKGludCk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBQUk9DX1ZFQ19VSU5UOlxuK1x0XHRkYXRhX3NpemUgPSBzaXplb2YodWludCk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbitcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKHVsb25nKTtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuK1x0ICAgICgqcHBvcyBcdTAwMjZcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xuK1x0XHQqbGVucCA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkge1xuK1x0XHRpZiAocHJvY19maXJzdF9wb3Nfbm9uX3plcm9faWdub3JlKHBwb3MsIHRhYmxlKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGVyciA9IGFwcGx5X2NvbnZfb25fdmVjKGNvbnYsIHRhYmxlLCB0eXBlLCBkYXRhX3NpemUsIGRpciwgKmxlbnAsIGJ1ZmZlcixcbitcdFx0XHRcdFx1MDAyNmxlZnRfbmJ5dGUpO1xuK1xuK1x0LypcbitcdCAqIEFuIHVuY2hhbmdlZCBsZWZ0X25ieXRlIHNpZ25hbHMgYSB3cml0ZSB3aXRoIG5vIHBhcnNlZCBlbGVtZW50OyB3aGljaFxuK1x0ICogaXMgYW4gZXJyb3IuIFVzaW5nIFNJWkVfTUFYIHRvIGRldGVjdCB0aGlzIGVycm9yIGlzIHBvc3NpYmxlIGJlY2F1c2U6XG4rXHQgKiAxLiBsZW5wIGlzIGJvdW5kZWQgYnkgS01BTExPQ19NQVhfU0laRSBpbiBwcm9jX3N5c19jYWxsX2hhbmRsZXJcbitcdCAqIDIuIGxlbnAgY291bGQgbmV2ZXIgYmUgU0laRV9NQVggYXMgaXQgaXMgYSBcInJpZGljdWxvdXNcIiAoZXhhYnl0ZSkgYWxsb2NhdGlvbi5cbitcdCAqL1xuK1x0aWYgKGxlZnRfbmJ5dGUgPT0gU0laRV9NQVgpXG4rXHRcdHJldHVybiBlcnI7XG4rXG4rXHQqbGVucCAtPSBsZWZ0X25ieXRlO1xuIG91dDpcbiBcdCpwcG9zICs9ICpsZW5wO1xuK1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtNzU2LDEyICs4MjMsMTUgQEAgaW50IHByb2NfZG91aW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbiBcdFx0XHRpbnQgKCpjb252KShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIHVpbnQgKmtfcHRyLFxuIFx0XHRcdFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKSlcbiB7XG4rXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXG4rXHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAyNlx1MDAyNiAodGFibGUtXHUwMDNlbWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbiBcdGlmICghY29udilcbiBcdFx0Y29udiA9IGRvX3Byb2NfdWludF9jb252O1xuIFxuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbitcdFx0XHQodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pO1xuIH1cbiBcbiAvKipcbkBAIC04MjAsOCArODkwLDggQEAgaW50IHByb2NfZG9ib29sKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gaW50IHByb2NfZG9pbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbiBcdFx0ICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtODQwLDggKzkxMCw3IEBAIGludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gaW50IHByb2NfZG91aW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gXHRcdHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnYgfSk7XG4rXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIGRvX3Byb2NfdWludF9jb252KTtcbiB9XG4gXG4gLyoqXG5AQCAtODY0LDggKzkzMyw4IEBAIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIGludCBwcm9jX2RvaW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0ICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udl9taW5tYXggfSk7XG4gfVxuIFxuIC8qKlxuQEAgLTg5MSw4ICs5NjAsOCBAQCBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4gaW50IHByb2NfZG91aW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0XHQgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXG4ge1xuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBkb19wcm9jX3VpbnRfY29udl9taW5tYXggfSk7XG4rXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsXG4rXHRcdFx0XHQgICBkb19wcm9jX3VpbnRfY29udl9taW5tYXgpO1xuIH1cbiBcbiAvKipcbkBAIC05MzUsOCArMTAwNCw3IEBAIGludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuIFx0XHR0bXAuZXh0cmEyID0gKHVuc2lnbmVkIGludCAqKSBcdTAwMjZtYXg7XG4gXG4gXHR2YWwgPSBSRUFEX09OQ0UoKmRhdGEpO1xuLVx0cmVzID0gZG9fcHJvY192ZWMoXHUwMDI2dG1wLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252X21pbm1heCB9KTtcbitcdHJlcyA9IHByb2NfZG91aW50dmVjX21pbm1heChcdTAwMjZ0bXAsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zKTtcbiBcdGlmIChyZXMpXG4gXHRcdHJldHVybiByZXM7XG4gXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKVxuQEAgLTEwNjYsOCArMTEzNCw4IEBAIGludCBwcm9jX2RvdWxvbmd2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0XHRcdGludCAoKmNvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLFxuIFx0XHRcdFx0XHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLFxuLVx0XHRcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4rXHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGNvbnYgfSk7XG4gfVxuIFxuIC8qKlxuQEAgLTEwODcsMTAgKzExNTUsMTAgQEAgaW50IHByb2NfZG91bG9uZ3ZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuICAqIFJldHVybnM6ICUwIG9uIHN1Y2Nlc3MuXG4gICovXG4gaW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4tXHRcdFx0ICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbitcdFx0dm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORyxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4rXHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGRvX3Byb2NfdWxvbmdfY29udiB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtMTExNCw4ICsxMTgyLDggQEAgaW50IHByb2NfZG9pbnR2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIHtcbiBcdGlmICghY29udilcbiBcdFx0Y29udiA9IGRvX3Byb2NfaW50X2NvbnY7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gY29udiB9KTtcbiB9XG4gXG4gLyoqXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcbmluZGV4IGIyZDhiZDkwMjZhNzIuLmZkZjNkMmZiMGEyYWQgMTAwNzU1XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoXG5AQCAtNCw2ICs0LDcgQEBcbiBcbiAjIFRoaXMgcGVyZm9ybXMgYSBzZXJpZXMgdGVzdHMgYWdhaW5zdCB0aGUgcHJvYyBzeXNjdGwgaW50ZXJmYWNlLlxuIFxuKyMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjMxN1xuICMgS3NlbGZ0ZXN0IGZyYW1ld29yayByZXF1aXJlbWVudCAtIFNLSVAgY29kZSBpcyA0LlxuIGtzZnRfc2tpcD00XG4gXG5AQCAtMzcsNiArMzgsNyBAQCBBTExfVEVTVFM9XCIkQUxMX1RFU1RTIDAwMDk6MToxOnVucmVnaXN0ZXJfZXJyb3I6MFwiXG4gQUxMX1RFU1RTPVwiJEFMTF9URVNUUyAwMDEwOjE6MTptbnQvbW50X2Vycm9yOjBcIlxuIEFMTF9URVNUUz1cIiRBTExfVEVTVFMgMDAxMToxOjE6ZW1wdHlfYWRkOjBcIlxuIEFMTF9URVNUUz1cIiRBTExfVEVTVFMgMDAxMjoxOjE6dThfdmFsaWQ6MFwiXG4rQUxMX1RFU1RTPVwiJEFMTF9URVNUUyAwMDEzOjE6MTppbnRfMDAwMzoxXCJcbiBcbiBmdW5jdGlvbiBhbGxvd191c2VyX2RlZmF1bHRzKClcbiB7XG5AQCAtMTk2LDYgKzE5OCwxOCBAQCB2ZXJpZnlfZGlmZl93KClcbiBcdHJldHVybiAkP1xuIH1cbiBcbisjIFZlcmlmeSB0aGF0IGFuIGVycm9uZW91cyAoJDIpIHVwZGF0ZSBmYWlscyBhbmQgZG9lcyBub3QgY2hhbmdlIFRBUkdFVFxuK3ZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSgpXG4re1xuK1x0VEVTVF9TVFI9XCIkMVwiXG4rXHRlY2hvIC1uIFwiJFRFU1RfU1RSXCIgXHUwMDNlIFwiJFRBUkdFVFwiXG4rXG4rXHRpZiBlY2hvIC1uIFwiJDJcIiBcdTAwM2UgXCIkVEFSR0VUXCIgMlx1MDAzZSAvZGV2L251bGw7IHRoZW5cbitcdFx0cmV0dXJuIDFcbitcdGZpXG4rXHR2ZXJpZnlfZGlmZl93IFwiJHtUQVJHRVR9XCJcbit9XG4rXG4gdGVzdF9yYygpXG4ge1xuIFx0aWYgW1sgJHJjICE9IDAgXV07IHRoZW5cbkBAIC01MDEsNiArNTE1LDQwIEBAIHJ1bl9saW1pdF9kaWdpdF9pbnRfYXJyYXkoKVxuIFx0dGVzdF9yY1xuIH1cbiBcbisjIFlvdSB1c2VkIGFuIGludCBhcnJheSBhbmQgb25lIG9mIHRoZSBlbGVtZW50cyBpcyBub3QgYWNjZXB0YWJsZVxuK3J1bl9pbnRfYXJyYXlfbm9fcGFydGlhbF91cGRhdGUoKVxuK3tcbitcdGVjaG8gLW4gXCJUZXN0aW5nIGludmFsaWQgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCBwYXJ0aWFsbHkgdXBkYXRlIC4uLiBcIlxuKyAgICAgICAgIyBFeHBlY3QgZmFpbHVyZSBiZWNhdXNlIG9mIDNyZCBlbGVtZW50IChhYmMpLlxuK1x0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXCIxIDIgMyA0XCIgXCIxMCAyMCBhYmMgNDBcIjsgdGhlblxuK1x0XHRlY2hvIFwiRkFJTFwiIFx1MDAzZVx1MDAyNjJcbitcdFx0cmM9MVxuK1x0ZWxzZVxuK1x0XHRlY2hvIFwiT0tcIlxuK1x0ZmlcbitcdHRlc3RfcmNcbitcbitcdGVjaG8gLW4gXCJUZXN0aW5nIG91dCBvZiByYW5nZSBhcnJheSBlbGVtZW50IGRvZXMgbm90IHBhcnRpYWxseSB1cGRhdGUgLi4uIFwiXG4rICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIGJlY2F1c2Ugb2YgM3JkIGVsZW1lbnQgKGdyZWF0ZXIgdGhhbiBpbnQpXG4rXHRpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSBcIjEgMiAzIDRcIiBcIjEwIDIwICQoKElOVF9NQVggKyAxKSkgNDBcIjsgdGhlblxuK1x0XHRlY2hvIFwiRkFJTFwiIFx1MDAzZVx1MDAyNjJcbitcdFx0cmM9MVxuK1x0ZWxzZVxuK1x0XHRlY2hvIFwiT0tcIlxuK1x0ZmlcbitcdHRlc3RfcmNcbitcbitcdGVjaG8gLW4gXCJUZXN0aW5nIGludmFsaWQgZmlyc3QgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCB1cGRhdGUgLi4uIFwiXG4rICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIG9mIDFzdCBlbGVtZW50XG4rXHRpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSBcIjEgMiAzIDRcIiBcImFiYyAyMCAzMCA0MFwiOyB0aGVuXG4rXHRcdGVjaG8gXCJGQUlMXCIgXHUwMDNlXHUwMDI2MlxuK1x0XHRyYz0xXG4rXHRlbHNlXG4rXHRcdGVjaG8gXCJPS1wiXG4rXHRmaVxuK1x0dGVzdF9yY1xuK31cbitcbiAjIFlvdSBhcmUgdXNpbmcgYW4gdW5zaWduZWQgaW50XG4gcnVuX2xpbWl0X2RpZ2l0X3VpbnQoKVxuIHtcbkBAIC04ODAsNiArOTI4LDE0IEBAIHN5c2N0bF90ZXN0XzAwMTIoKVxuIFx0cmV0dXJuIDBcbiB9XG4gXG4rc3lzY3RsX3Rlc3RfMDAxMygpXG4re1xuK1x0VEFSR0VUPVwiJHtTWVNDVEx9LyQoZ2V0X3Rlc3RfdGFyZ2V0IDAwMTMpXCJcbitcdHJlc2V0X3ZhbHNcbitcbitcdHJ1bl9pbnRfYXJyYXlfbm9fcGFydGlhbF91cGRhdGVcbit9XG4rXG4gbGlzdF90ZXN0cygpXG4ge1xuIFx0ZWNobyBcIlRlc3QgSUQgbGlzdDpcIlxuQEAgLTkwMCw2ICs5NTYsNyBAQCBsaXN0X3Rlc3RzKClcbiBcdGVjaG8gXCIwMDEwIHggJChnZXRfdGVzdF9jb3VudCAwMDEwKSAtIHRlc3RzIHN5c2N0IG1vdW50IHBvaW50XCJcbiBcdGVjaG8gXCIwMDExIHggJChnZXRfdGVzdF9jb3VudCAwMDExKSAtIHRlc3RzIGVtcHR5IGRpcmVjdG9yaWVzXCJcbiBcdGVjaG8gXCIwMDEyIHggJChnZXRfdGVzdF9jb3VudCAwMDEyKSAtIHRlc3RzIHJhbmdlIGNoZWNrIGZvciB1OCBwcm9jX2hhbmRsZXJcIlxuK1x0ZWNobyBcIjAwMTMgeCAkKGdldF90ZXN0X2NvdW50IDAwMTMpIC0gdGVzdHMgcGFydGlhbGx5IHVwZGF0ZSB2ZWN0b3JzIG9uIGVycm9yXCJcbiB9XG4gXG4gdXNhZ2UoKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDM6MzEuNzg1NTk1MTAyWiIsIlNlcSI6MTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3NDQ2MTI3Mjc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgU3lzY3RsIEFycmF5IFVwZGF0ZSBQYXRjaCBmb3IgUG90ZW50aWFsIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IElzc3VlcyoqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiB0aGUgc3lzY3RsIHZlY3RvciB1cGRhdGUgbWVjaGFuaXNtIGluIGBrZXJuZWwvc3lzY3RsLmNgLiBUaGUgY29yZSBjaGFuZ2UgaXMgcmVwbGFjaW5nIGBkb19wcm9jX3ZlY2Agd2l0aCBhIG1vcmUgcm9idXN0IHByb2Nlc3MgaW52b2x2aW5nIGBwcm9jX3ZlY2AsIGBhcHBseV9jb252X29uX3ZlY2AsIGFuZCBgY29tbWl0X2NvbnZfdmVjYC4gVGhlIHN0YXRlZCBnb2FsLCBhcyBJIHVuZGVyc3RhbmQgaXQsIGlzIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIHRvIHN5c2N0bCBhcnJheXMgd2hlbiBlcnJvcnMgb2NjdXIgZHVyaW5nIHVzZXIgaW5wdXQgcGFyc2luZy4gSW5zdGVhZCBvZiB0aGUgb2xkIGVsZW1lbnQtYnktZWxlbWVudCB1cGRhdGUtYW5kLWFib3J0IG1ldGhvZCwgdGhpcyBuZXcgYXBwcm9hY2ggdXNlcyBhIHRlbXBvcmFyeSBidWZmZXIgKGBkYXRhX3N0YWdlYCkgdG8gc3RhZ2UgdGhlIGNoYW5nZXMuIFRoaXMgdGVtcG9yYXJ5IGJ1ZmZlciBpcyBwb3B1bGF0ZWQgdXNpbmcgYGttZW1kdXBgIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXNjdGwgYXJyYXkgKGB0YWJsZS1cdTAwM2VkYXRhYCksIHRoZW4gYXBwbHkgYW55IHVzZXItcHJvdmlkZWQgY29udmVyc2lvbnMuIE9ubHkgaWYgYWxsIGNvbnZlcnNpb25zIGFyZSBzdWNjZXNzZnVsIGRvZXMgYGNvbW1pdF9jb252X3ZlY2AgY29tZSBpbnRvIHBsYXksIHdyaXRpbmcgdGhlIGNoYW5nZXMgZnJvbSBgZGF0YV9zdGFnZWAgdG8gdGhlIGFjdHVhbCBhcnJheS5cblxuTXkgaW1tZWRpYXRlIGNvbmNlcm4sIGFzIGEgc2Vhc29uZWQga2VybmVsIGRldmVsb3BlciwgaXMgdG8gY2hlY2sgdGhpcyBjYXJlZnVsbHkgZm9yIHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMuIExldCdzIGRpZyBpbnRvIHRoZSBkZXRhaWxzLiBTcGVjaWZpY2FsbHksIHdpdGhpbiBgYXBwbHlfY29udl9vbl92ZWNgLCBgZGF0YV9zdGFnZWAgaXMgYWxsb2NhdGVkIHdpdGggYGttZW1kdXAodGFibGUtXHUwMDNlZGF0YSwgdGFibGUtXHUwMDNlbWF4bGVuLCBHRlBfS0VSTkVMKWAuIFRoaXMgbG9va3MgcHJvbWlzaW5nOiBpdCBjbG9uZXMgdGhlIHdob2xlIHRoaW5nLlxuXG5UaGVuLCB0aGUgY29kZSBpdGVyYXRlcyB0byBwcm9jZXNzIHVzZXIgaW5wdXQgYW5kIHVwZGF0ZXMgdGhlIGBkYXRhYCBwb2ludGVyICh3aGljaCBwb2ludHMgZWl0aGVyIHRvIHRoZSBvcmlnaW5hbCBgdGFibGUtXHUwMDNlZGF0YWAgb3IgdG8gYGRhdGFfc3RhZ2VgIGRlcGVuZGluZyBvbiB0aGUgb3JpZ2luYWwgYXJyYXkncyBzaXplKS4gVGhlIGxvb3AgdXRpbGl6ZXMgYHByb2NfdmVjX2NvbnZgLCB3aG9zZSBmdW5jdGlvbiBjYWxsIGRlcGVuZHMgb24gdGhlIGRpcmVjdGlvbiBvZiBjb252ZXJzaW9uIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyB1c2VyIGlucHV0IGFuZCB1cGRhdGluZyBgZGF0YWAuXG5cbkNyaXRpY2FsbHksIGlmIGV2ZXJ5dGhpbmcgZ29lcyB3ZWxsLCB0aGUgYGNvbW1pdF9jb252X3ZlY2AgZnVuY3Rpb24gaXMgY2FsbGVkLiBUaGlzIGNvcGllcyBgbnJfY29udmAgZWxlbWVudHMgZnJvbSBgZGF0YV9zdGFnZWAgKmJhY2sqIHRvIGB0YWJsZS1cdTAwM2VkYXRhYC4gSSBub3RlIHRoYXQgYGNvbW1pdF9jb252X3ZlY2AgdXNlcyBgV1JJVEVfT05DRWAgd2hpY2ggaXMgZ29vZCBwcmFjdGljZS5cblxuTm93LCBteSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBga21lbWR1cGAgaXMgdGhlIGtleS4gSXQgY29waWVzIGB0YWJsZS1cdTAwM2VtYXhsZW5gIGJ5dGVzLiBJZiBgdGFibGUtXHUwMDNlZGF0YWAgKmhhcyogdW5pbml0aWFsaXplZCBieXRlcyBhcyBwYXJ0IG9mIHBhZGRpbmcgb3IgbWVtYmVycyBvZiBsYXJnZXIgc3RydWN0cywgdGhvc2UgdW5pbml0aWFsaXplZCB2YWx1ZXMgKmFyZSogY29waWVkIGludG8gYGRhdGFfc3RhZ2VgLiBBbmQgaGVyZSBpcyB3aGVyZSBJIHNlZSB0aGUgcG90ZW50aWFsIGZvciBhIHByb2JsZW0sIGJ1dCBpdCdzIG5vdCBhY3R1YWxseSB0aGVyZS4gVGhlIGNvbW1pdCBmdW5jdGlvbiB3aWxsIG5vdCB3cml0ZSB0aGUgZnVsbCBgZGF0YV9zdGFnZWAgYnVmZmVyIGJhY2ssIGJ1dCBvbmx5IHVwIHRvIHRoZSBhbW91bnQgd2hpY2ggaGFzIGJlZW4gY29udmVydGVkLiBTbywgdGhlIHVuaW5pdGlhbGl6ZWQgcGFydCBkb2VzIG5vdCBnZXQgd3JpdHRlbiBiYWNrLlxuXG5CdXQgdGhlIHJlYWwgcXVlc3Rpb24gaXMgd2hldGhlciBpdCAqcmVhZHMqIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkuIEluIHRoZSBrZXJuZWwtdG8tdXNlciBkaXJlY3Rpb24gKGBTWVNDVExfS0VSTl9UT19VU0VSYCksIHRoZSBjb2RlIGp1c3QgcmVhZHMgZnJvbSBgdGFibGUtXHUwMDNlZGF0YWAgYW5kIGZvcm1hdHMgaXQuIEkgc2VlIG5vIGlzc3VlcyBoZXJlLlxuXG5JbiB0aGUgdXNlci10by1rZXJuZWwgZGlyZWN0aW9uIChgU1lTQ1RMX1VTRVJfVE9fS0VSTmApLCB3ZSBoYXZlIHRoZSBgcHJvY192ZWNfY29udmAgYmVpbmcgY2FsbGVkLiBJdCBjYW4gKndyaXRlKiB0byBgZGF0YWAsIGJ1dCBkb2VzIGl0ICpyZWFkKiBmcm9tIGBkYXRhYCBpbiBhIHdheSB0aGF0IGludHJvZHVjZXMgcHJvYmxlbXM/IEkgbmVlZCB0byBjaGVjayB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBgcHJvY192ZWNfY29udmAgZnVuY3Rpb25zIGxpa2UgYGRvX3Byb2NfaW50X2NvbnZgIG9yIHdoYXRldmVyLiBCdXQgZnJvbSB3aGF0IEkgc2VlIGhlcmUsIGl0IGxvb2tzIGxpa2UgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NjIyLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQ0MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA0OjE5LjIzMTcyNDM1OVoiLCJTZXEiOjE2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEwODI0MDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImRvX3Byb2NfaW50X2NvbnZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL3N5c2N0bC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9zeXNjdGwuYz01NzM9c3RhdGljIGludCBzeXNjdGxfa2Vybl90b191c2VyX2ludF9jb252KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgY29uc3QgaW50ICprX3B0cilcXG4tLVxcbmtlcm5lbC9zeXNjdGwuYy01NzctXFxua2VybmVsL3N5c2N0bC5jOjU3ODpzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxua2VybmVsL3N5c2N0bC5jLTU3OS1cXHRcXHRcXHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGJsKVxcbi0tXFxua2VybmVsL3N5c2N0bC5jLTU4Ni1cXG5rZXJuZWwvc3lzY3RsLmM6NTg3OnN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxua2VybmVsL3N5c2N0bC5jLTU4OC1cXHRcXHRcXHRcXHQgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwpXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmM9ODkwPWludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtODkzLVxcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcXG5rZXJuZWwvc3lzY3RsLmM6ODk0OlxcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcXG5rZXJuZWwvc3lzY3RsLmMtODk1LX1cXG4tLVxcbmtlcm5lbC9zeXNjdGwuYz05MzM9aW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbi0tXFxua2VybmVsL3N5c2N0bC5jLTkzNi1cXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXFxua2VybmVsL3N5c2N0bC5jOjkzNzpcXHRcXHRcXHQodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xcbmtlcm5lbC9zeXNjdGwuYy05MzgtfVxcbi0tXFxua2VybmVsL3N5c2N0bC5jPTExNTc9aW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtMTE3MC0gKiBAcHBvczogZmlsZSBwb3NpdGlvblxcbmtlcm5lbC9zeXNjdGwuYzoxMTcxOiAqIEBjb252OiBDdXN0b20gY29udmVydGVyIGNhbGwgYmFjay4gRGVmYXVsdHMgdG8gZG9fcHJvY19pbnRfY29udlxcbmtlcm5lbC9zeXNjdGwuYy0xMTcyLSAqXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmM9MTE3OD1pbnQgcHJvY19kb2ludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtMTE4My1cXHRpZiAoIWNvbnYpXFxua2VybmVsL3N5c2N0bC5jOjExODQ6XFx0XFx0Y29udiA9IGRvX3Byb2NfaW50X2NvbnY7XFxua2VybmVsL3N5c2N0bC5jLTExODUtXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDoxOS4zNDI1NTI3MDhaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDA5NDQ3ODE1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgSW50ZWdlciBDb252ZXJzaW9uIFByb2NlZHVyZSoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIGBkb19wcm9jX2ludF9jb252YCBpbXBsZW1lbnRhdGlvbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3Mgb2YgaG93IHdlJ3JlIGhhbmRsaW5nIGludGVnZXIgY29udmVyc2lvbnMgYXQgdGhlIHByb2NlZHVyYWwgbGV2ZWwuIEkgd2FudCB0byBtYWtlIHN1cmUgdGhlIGxvZ2ljIGlzIHNvdW5kLCBlc3BlY2lhbGx5IGFyb3VuZCBlZGdlIGNhc2VzIGFuZCBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuIEknbGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHR5cGVzIGludm9sdmVkLCB0aGUgYml0LXNoaWZ0aW5nIGFuZCBtYXNraW5nIG9wZXJhdGlvbnMsIGFuZCBob3cgd2UncmUgaGFuZGxpbmcgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyBzY2VuYXJpb3MuIFRoZSBnb2FsIGlzIHRvIHZlcmlmeSB0aGF0IGl0J3Mgcm9idXN0LCBlZmZpY2llbnQsIGFuZCBhbGlnbmVkIHdpdGggdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3IgYW5kIGFyY2hpdGVjdHVyYWwgY29uc3RyYWludHMgb2YgdGhlIHRhcmdldCBwbGF0Zm9ybS4gSSdtIGxvb2tpbmcgZm9yIGFueXRoaW5nIHRoYXQgbWlnaHQgbGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMgb3IgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy4gTGV0J3Mgc2VlIHdoYXQgd2UndmUgZ290LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDUwMCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA0OjIzLjQzNzAzMzM3NVoiLCJTZXEiOjE4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDEwMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3N5c2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU3OCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDU3ODpcXHRzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxuIDU3OTpcXHRcXHRcXHRcXHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGJsKVxcbiA1ODA6XFx0e1xcbiA1ODE6XFx0XFx0cmV0dXJuIHByb2NfaW50X2NvbnYobmVncCwgdV9wdHIsIGtfcHRyLCBkaXIsIHRibCwgZmFsc2UsXFxuIDU4MjpcXHRcXHRcXHRcXHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXFxuIDU4MzpcXHRcXHRcXHRcXHQgICAgIHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYpO1xcbiA1ODQ6XFx0XFxuIDU4NTpcXHR9XFxuIDU4NjpcXHRcXG4gNTg3OlxcdHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxuIDU4ODpcXHRcXHRcXHRcXHRcXHQgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwpXFxuIDU4OTpcXHR7XFxuIDU5MDpcXHRcXHRyZXR1cm4gcHJvY19pbnRfY29udihuZWdwLCB1X3B0ciwga19wdHIsIGRpciwgdGJsLCB0cnVlLFxcbiA1OTE6XFx0XFx0XFx0XFx0ICAgICBzeXNjdGxfdXNlcl90b19rZXJuX2ludF9jb252LFxcbiA1OTI6XFx0XFx0XFx0XFx0ICAgICBzeXNjdGxfa2Vybl90b191c2VyX2ludF9jb252KTtcXG4gNTkzOlxcdH1cXG4gNTk0OlxcdFxcbiA1OTU6XFx0c3RhdGljIGNvbnN0IGNoYXIgcHJvY193c3BhY2Vfc2VwW10gPSB7ICcgJywgJ1xcXFx0JywgJ1xcXFxuJyB9O1xcbiA1OTY6XFx0XFxuIDU5NzpcXHQvKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDoyMy40MzcxMzYzNjVaIiwiU2VxIjoxOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI5OTY3NzM1NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEaXZpbmcgaW50byBgcHJvY19pbnRfY29udmAqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoaXMgYHByb2NfaW50X2NvbnZgIHJvdXRpbmUuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBhbmQgc2VlIHdoYXTigJlzIGdvaW5nIG9uIHVuZGVyIHRoZSBob29kIHRoZXJlLiBJJ20gYXNzdW1pbmcgaXQgaGFuZGxlcyBpbnRlZ2VyIGNvbnZlcnNpb25zIHdpdGhpbiB0aGUgc3lzdGVtLCBidXQgSSBuZWVkIHRvIHF1aWNrbHkgY29uZmlybSB0aGF0IGFzc3VtcHRpb24gYW5kIHVuZGVyc3RhbmQgaXRzIHNwZWNpZmljIHJvbGUuIElzIGl0IGEgZ2VuZXJhbC1wdXJwb3NlIGNvbnZlcnRlciwgb3Igc29tZXRoaW5nIG9wdGltaXplZCBmb3IgYSBwYXJ0aWN1bGFyIGRhdGEgdHlwZSBvciB1c2UgY2FzZT8gSSdtIGN1cmlvdXMgYWJvdXQgdGhlIGludGVuZGVkIGRlc2lnbiBhbmQgY29uc3RyYWludHMuIFdoYXQgYXJlIHRoZSBpbnB1dCB0eXBlcyBpdCBhY2NlcHRzLCBhbmQgd2hhdCBhcmUgdGhlIG91dHB1dCB0eXBlcyBpdCBwcm9kdWNlcz8gTGV0J3MgdHJhY2UgaXQgdGhyb3VnaCB0aGUgY29kZS4gSSdsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBwb3RlbnRpYWwgZWRnZSBjYXNlcyBhbmQgZXJyb3IgaGFuZGxpbmcuIEFyZSB0aGVyZSBhbnkga25vd24gdnVsbmVyYWJpbGl0aWVzPyBJIHdhbnQgdG8gc2VlIGlmIHRoaXMgY29kZSBpcyBzYWZlIGZvciB1c2UgdW5kZXIgYW55IGNpcmN1bXN0YW5jZS4gSSBuZWVkIHRvIHF1aWNrbHkgYXNzZXNzIGl0cyBvdmVyYWxsIGVmZmljaWVuY3kuIEknbGwgYmUgbG9va2luZyBmb3IgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyB3aGVyZSBwZXJmb3JtYW5jZSBjb3VsZCBiZSBpbXByb3ZlZC4gSSBhbHNvIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIHVzZWQgd2l0aGluIHRoZSBsYXJnZXIgY29kZWJhc2UuIEFyZSB0aGVyZSBhbnkgZGVwZW5kZW5jaWVzPyBIb3cgaXMgaXQgaW50ZWdyYXRlZCBpbnRvIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZT8gVGhpcyB3aWxsIGluZm9ybSBob3cgaXQgbWlnaHQgYmUgYWZmZWN0ZWQgYnkgZnV0dXJlIGNoYW5nZXMgb3Igb3B0aW1pemF0aW9ucy4gRXNzZW50aWFsbHksIEknbSBmb3JtaW5nIGEgbWVudGFsIG1vZGVsIG9mIGl0cyBiZWhhdmlvciwgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzLCBhbmQgcG90ZW50aWFsIGltcGFjdCBvbiB0aGUgc3lzdGVtLiBUaW1lIHRvIGdldCB0byB3b3JrLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTA5MiwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDQ6MjcuNzM2ODE2MjlaIiwiU2VxIjoyMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzOTQ5MTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInByb2NfaW50X2NvbnZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL3N5c2N0bC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9zeXNjdGwuYz01MDY9aW50IHByb2NfaW50X3Uya19jb252X3VvcChjb25zdCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIsIGNvbnN0IGJvb2wgKm5lZ3AsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtNTIzLS8qKlxcbmtlcm5lbC9zeXNjdGwuYzo1MjQ6ICogcHJvY19pbnRfY29udiAtIENoYW5nZSB1c2VyIG9yIGtlcm5lbCBwb2ludGVyIGJhc2VkIG9uIGRpcmVjdGlvblxcbmtlcm5lbC9zeXNjdGwuYy01MjUtICpcXG4tLVxcbmtlcm5lbC9zeXNjdGwuYy01MzktICovXFxua2VybmVsL3N5c2N0bC5jOjU0MDppbnQgcHJvY19pbnRfY29udihib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIsIGludCBkaXIsXFxua2VybmVsL3N5c2N0bC5jLTU0MS1cXHRcXHQgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibCwgYm9vbCBrX3B0cl9yYW5nZV9jaGVjayxcXG4tLVxcbmtlcm5lbC9zeXNjdGwuYz01NzM9c3RhdGljIGludCBzeXNjdGxfa2Vybl90b191c2VyX2ludF9jb252KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgY29uc3QgaW50ICprX3B0cilcXG4tLVxcbmtlcm5lbC9zeXNjdGwuYy01NzctXFxua2VybmVsL3N5c2N0bC5jOjU3ODpzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxua2VybmVsL3N5c2N0bC5jLTU3OS1cXHRcXHRcXHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGJsKVxcbmtlcm5lbC9zeXNjdGwuYy01ODAte1xcbmtlcm5lbC9zeXNjdGwuYzo1ODE6XFx0cmV0dXJuIHByb2NfaW50X2NvbnYobmVncCwgdV9wdHIsIGtfcHRyLCBkaXIsIHRibCwgZmFsc2UsXFxua2VybmVsL3N5c2N0bC5jLTU4Mi1cXHRcXHRcXHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtNTg2LVxcbmtlcm5lbC9zeXNjdGwuYzo1ODc6c3RhdGljIGludCBkb19wcm9jX2ludF9jb252X21pbm1heChib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcXG5rZXJuZWwvc3lzY3RsLmMtNTg4LVxcdFxcdFxcdFxcdCAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcXG5rZXJuZWwvc3lzY3RsLmMtNTg5LXtcXG5rZXJuZWwvc3lzY3RsLmM6NTkwOlxcdHJldHVybiBwcm9jX2ludF9jb252KG5lZ3AsIHVfcHRyLCBrX3B0ciwgZGlyLCB0YmwsIHRydWUsXFxua2VybmVsL3N5c2N0bC5jLTU5MS1cXHRcXHRcXHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmM9ODkwPWludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtODkzLVxcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcXG5rZXJuZWwvc3lzY3RsLmM6ODk0OlxcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcXG5rZXJuZWwvc3lzY3RsLmMtODk1LX1cXG4tLVxcbmtlcm5lbC9zeXNjdGwuYz05MzM9aW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbi0tXFxua2VybmVsL3N5c2N0bC5jLTkzNi1cXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXFxua2VybmVsL3N5c2N0bC5jOjkzNzpcXHRcXHRcXHQodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xcbmtlcm5lbC9zeXNjdGwuYy05MzgtfVxcbi0tXFxua2VybmVsL3N5c2N0bC5jPTExNTc9aW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtMTE3MC0gKiBAcHBvczogZmlsZSBwb3NpdGlvblxcbmtlcm5lbC9zeXNjdGwuYzoxMTcxOiAqIEBjb252OiBDdXN0b20gY29udmVydGVyIGNhbGwgYmFjay4gRGVmYXVsdHMgdG8gZG9fcHJvY19pbnRfY29udlxcbmtlcm5lbC9zeXNjdGwuYy0xMTcyLSAqXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmM9MTE3OD1pbnQgcHJvY19kb2ludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtMTE4My1cXHRpZiAoIWNvbnYpXFxua2VybmVsL3N5c2N0bC5jOjExODQ6XFx0XFx0Y29udiA9IGRvX3Byb2NfaW50X2NvbnY7XFxua2VybmVsL3N5c2N0bC5jLTExODUtXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDoyNy44MzA3NzEwOTlaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDEyOTM3NTMzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJ20gZGVlcGx5IGZhbWlsaWFyIHdpdGggY29kZSBhbmQgcHJvY2Vzc2VzOlxuXG4qKkRlbHZpbmcgaW50byBgcHJvY19pbnRfY29udmAqKlxuXG5BbHJpZ2h0LCBJJ20gdGhpbmtpbmcsIFwiVGltZSB0byBkaXZlIGludG8gYHByb2NfaW50X2NvbnZgLlwiIFRoYXQgbmFtZSBhbG9uZSBnaXZlcyBtZSBhIHByZXR0eSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIGNhbiBpbnN0YW50bHkgYXNzdW1lIGl0J3MgcmVsYXRlZCB0byBzb21lIHByb2Nlc3Mgb3IgcHJvY2VkdXJlIGludm9sdmluZyB0aGUgY29udmVyc2lvbiBvZiBpbnRlZ2VyIHZhbHVlcy4gRGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IG9mIHRoZSBzeXN0ZW0sIHRoaXMgY291bGQgYmUgYSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9jayBvciBhIG1vcmUgc3BlY2lhbGl6ZWQgZnVuY3Rpb24uIE15IGluaXRpYWwgZ29hbCBpcyB1bmRlcnN0YW5kaW5nIHRoZSBjb252ZXJzaW9uIG1ldGhvZC4gUGVyaGFwcyB0aGVyZSBpcyBzb21lIGludGVnZXIgc2NhbGluZyBvciBjb252ZXJzaW9uIGJldHdlZW4gc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VycyBoYXBwZW5pbmcuIFRoZSBkZWVwZXIgZ29hbCBpcyB0byBjaGVjayBmb3IgYW55IHBvdGVudGlhbCBlZGdlIGNhc2VzIG9yIG92ZXJmbG93cy4gR2l2ZW4gdGhlIG5hdHVyZSBvZiBpbnRlZ2VyIGFyaXRobWV0aWMsIHRoZXJlIG1pZ2h0IGJlIGEgbmVlZCBmb3IgZXJyb3IgaGFuZGxpbmcuIExldCdzIHNlZSB3aGF0J3MgaW5zaWRlLiBJJ20gZm9jdXNpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgbm93OiB0aGUgc3BlY2lmaWNzIG9mIHRoZSBhbGdvcml0aG0sIHRoZSBkYXRhIHR5cGVzIGludm9sdmVkLCBhbmQgYW55IHBvdGVudGlhbCBzaWRlIGVmZmVjdHMuIEknbGwgYmUgbG9va2luZyBhdCB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLCBsb2NhbCB2YXJpYWJsZXMsIGFuZCByZXR1cm4gdmFsdWUgdG8gcGllY2UgdGhpcyBhbGwgdG9nZXRoZXIuIEknbSBnb2luZyB0byBkZXRlcm1pbmUgaXRzIHJvbGUgd2l0aGluIHRoZSBzeXN0ZW0gYW5kIGFueSBwb3RlbnRpYWwgcG9pbnRzIG9mIGludGVncmF0aW9uLiBJcyBpdCBvcHRpbWl6ZWQgZm9yIHNwZWVkLCBvciBpcyBpdCBwcmlvcml0aXppbmcgY2xhcml0eT8gQW5kIG1vc3QgaW1wb3J0YW50bHksIGlzIGl0IHJvYnVzdD8gSXMgdGhlcmUgYSBuZWVkIHRvIGRvY3VtZW50IHRoaXMsIG9yIGlzIHRoaXMganVzdCBzb21ldGhpbmcgSSB3YXMgYXNrZWQgdG8gZ2xhbmNlIGF0P1xuXG5cbiIsIklucHV0VG9rZW5zIjoxMjQ2MiwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA0OjMxLjk2MDE1MTA4NloiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzAyMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3N5c2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU0MCxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDU0MDpcXHRpbnQgcHJvY19pbnRfY29udihib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIsIGludCBkaXIsXFxuIDU0MTpcXHRcXHRcXHQgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibCwgYm9vbCBrX3B0cl9yYW5nZV9jaGVjayxcXG4gNTQyOlxcdFxcdFxcdCAgaW50ICgqdXNlcl90b19rZXJuKShjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIpLFxcbiA1NDM6XFx0XFx0XFx0ICBpbnQgKCprZXJuX3RvX3VzZXIpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgY29uc3QgaW50ICprX3B0cikpXFxuIDU0NDpcXHR7XFxuIDU0NTpcXHRcXHRpZiAoU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKVxcbiA1NDY6XFx0XFx0XFx0cmV0dXJuIGtlcm5fdG9fdXNlcihuZWdwLCB1X3B0ciwga19wdHIpO1xcbiA1NDc6XFx0XFxuIDU0ODpcXHRcXHRpZiAoa19wdHJfcmFuZ2VfY2hlY2spIHtcXG4gNTQ5OlxcdFxcdFxcdGludCB0bXBfaywgcmV0O1xcbiA1NTA6XFx0XFxuIDU1MTpcXHRcXHRcXHRpZiAoIXRibClcXG4gNTUyOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA1NTM6XFx0XFx0XFx0cmV0ID0gdXNlcl90b19rZXJuKG5lZ3AsIHVfcHRyLCBcXHUwMDI2dG1wX2spO1xcbiA1NTQ6XFx0XFx0XFx0aWYgKHJldClcXG4gNTU1OlxcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuIDU1NjpcXHRcXHRcXHRpZiAoKHRibC1cXHUwMDNlZXh0cmExIFxcdTAwMjZcXHUwMDI2ICooaW50ICopdGJsLVxcdTAwM2VleHRyYTEgXFx1MDAzZSB0bXBfaykgfHxcXG4gNTU3OlxcdFxcdFxcdCAgICAodGJsLVxcdTAwM2VleHRyYTIgXFx1MDAyNlxcdTAwMjYgKihpbnQgKil0YmwtXFx1MDAzZWV4dHJhMiBcXHUwMDNjIHRtcF9rKSlcXG4gNTU4OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA1NTk6XFx0XFx0XFx0V1JJVEVfT05DRSgqa19wdHIsIHRtcF9rKTtcXG4gNTYwOlxcdFxcdH0gZWxzZVxcbiA1NjE6XFx0XFx0XFx0cmV0dXJuIHVzZXJfdG9fa2VybihuZWdwLCB1X3B0ciwga19wdHIpO1xcbiA1NjI6XFx0XFx0cmV0dXJuIDA7XFxuIDU2MzpcXHR9XFxuIDU2NDpcXHRcXG4gNTY1OlxcdFxcbiA1NjY6XFx0XFxuIDU2NzpcXHRzdGF0aWMgaW50IHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYoY29uc3QgYm9vbCAqbmVncCwgY29uc3QgdWxvbmcgKnVfcHRyLFxcbiA1Njg6XFx0XFx0XFx0XFx0XFx0XFx0aW50ICprX3B0cilcXG4gNTY5OlxcdHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDQ6MzEuOTYwMzI0MTE2WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE1ODA3ODk5NTc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSW1wbGljYXRpb25zIG9mIHRoZSBgcHJvY19pbnRfY29udmAgTW9kaWZpY2F0aW9uKipcblxuT2theSwgc28gYHByb2NfaW50X2NvbnZgIHdyaXRlcyB0byBga19wdHJgLCBnb3QgaXQuIFRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gYmUgaGFwcGVuaW5nIHdpdGhpbiBgYXBwbHlfY29udl9vbl92ZWNgLiBgZGF0YWAsIHBhc3NlZCBhcyBga19wdHJgLCBpcyB0aGUga2V5IHZhcmlhYmxlIGhlcmUuIElmIGBTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKWAgaXMgdHJ1ZSwgYHByb2NfdmVjX2NvbnZgIGNhbGxzIGBjb252YCB3aGljaCBpbiB0dXJuIGNhbGxzIGBwcm9jX2ludF9jb252YCwgd3JpdGluZyB0byB0aGlzIGBrX3B0cmAsIHdoaWNoIGluIGVzc2VuY2UgaXMgcG9pbnRpbmcgdG8gZWl0aGVyIGBkYXRhX3N0YWdlYCAoaWYgYWxsb2NhdGVkKSBvciBkaXJlY3RseSB0byBgdGFibGUtXHUwMDNlZGF0YWAuXG5cbk5vdywgaWYgYGRhdGFfc3RhZ2VgIGlzIGFsbG9jYXRlZCwgaXQncyBhIGBrbWVtZHVwYCBjb3B5IG9mIGB0YWJsZS1cdTAwM2VkYXRhYC4gSGVyZSdzIHRoZSBwb3RlbnRpYWwgd3JpbmtsZTogaWYgYHRhYmxlLVx1MDAzZWRhdGFgIGhhcyB1bmluaXRpYWxpemVkIG1lbW9yeSAocGFkZGluZywgdW51c2VkIGFycmF5IGVsZW1lbnRzLCBldGMuKSwgYGttZW1kdXBgIGNvcGllcyAqdGhhdCogdW5pbml0aWFsaXplZCBkYXRhLiBUaGVuLCBgcHJvY192ZWNfY29udmAgb3ZlcndyaXRlcyB0aGUgZWxlbWVudHMgdGhhdCBpdCBzdWNjZXNzZnVsbHkgcGFyc2VzLiBBbmQgY3J1Y2lhbGx5LCBgY29tbWl0X2NvbnZfdmVjYCAqb25seSogY29waWVzIGBucl9jb252YCBlbGVtZW50cyBmcm9tIGBkYXRhX3N0YWdlYCBiYWNrIHRvIGB0YWJsZS1cdTAwM2VkYXRhYC4gU28sIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBpbiBgZGF0YV9zdGFnZWAgKmJleW9uZCogYG5yX2NvbnZgIGVsZW1lbnRzIGlzICpub3QqIGNvcGllZCBiYWNrLiBJJ20gbm90aW5nIHRoZSBkYXRhIHR5cGUgc3BlY2lmaWNzIGhlcmU6IGBQUk9DX1ZFQ19JTlRgIGhhcyBubyBlbGVtZW50IHBhZGRpbmcgKDQgYnl0ZXMpIGFuZCBuZWl0aGVyIGRvZXMgYFBST0NfVkVDX1VMT05HYCAoOCBieXRlcyksIHNvIG5vIHBhZGRpbmctcmVsYXRlZCB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMuXG5cblRoZSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGUgY29weWluZyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gQnV0IHdhaXQsIGBrbWVtZHVwYCB1c2VzIGBtZW1jcHlgLiBEb2VzIGNvcHlpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgdHJpZ2dlciBhIEtNU0FOIHJlcG9ydD8gTm8uIEtNU0FOIHRyYWNrcyB1bmluaXRpYWxpemVkIHN0YXRlLiBDb3B5aW5nIG1lcmVseSBwcm9wYWdhdGVzIHRoZSB1bmluaXRpYWxpemVkIHN0YXRlLCBhbmQgdGhlIEtNU0FOIHJlcG9ydCBpcyBvbmx5IHRyaWdnZXJlZCBpZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyB1c2VkIGluIGJyYW5jaGVzIG9yIHNpbmtzIChsaWtlIGBjb3B5X3RvX3VzZXJgKS5cblxuSW4gdGhpcyBjYXNlLCBga21lbWR1cGAgY29waWVzIGB0YWJsZS1cdTAwM2VkYXRhYCB0byBgZGF0YV9zdGFnZWAsIGBjb21taXRfY29udl92ZWNgIGNvcGllcyBiYWNrIG9ubHkgdGhlIGNvbnZlcnRlZCBlbGVtZW50cy4gTm8gdXNlci1zcGFjZSBsZWFrIGJlY2F1c2UgYFNZU0NUTF9VU0VSX1RPX0tFUk5gIGlzIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZSwgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLiAgRm9yIGBTWVNDVExfS0VSTl9UT19VU0VSYCwgbm8gYGRhdGFfc3RhZ2VgIGlzIGFsbG9jYXRlZCwgYGRhdGFgIGRpcmVjdGx5IHBvaW50cyB0byBgdGFibGUtXHUwMDNlZGF0YWAsIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGJlZm9yZSB0aGUgcGF0Y2guIFRoZSBsb2dpYyBmb3IgcmVhZGluZyBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlIGlzIHVuY2hhbmdlZC5cblxuU28sIHRoZSBuZXcgYXBwcm9hY2ggdXNlcyBhIHRlbXBvcmFyeSBidWZmZXIgKGBkYXRhX3N0YWdlYCkgd2hlbiB3cml0aW5nIGZyb20gdXNlciBzcGFjZSB0byB0aGUga2VybmVsOiBjb3B5LCB1cGRhdGUsIGFuZCB0aGVuIG9ubHkgY29weSBjaGFuZ2VkIGVsZW1lbnRzIGJhY2suXG5cbk5vdywgYW0gSSBtaXNzaW5nIHNvbWV0aGluZyB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBUaGUgbWFpbiBjb25jZXJuIGhlcmUgaXMgdGhlIHByb3BhZ2F0aW9uIG9mIHRoaXMgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhyb3VnaCBga21lbWR1cGAuIEl0IGp1c3QgcGFzc2VzIGl0IHRocm91Z2gsIHdoaWNoIGJ5IGl0c2VsZiBpcyBub3QgYW4gaXNzdWUsIGFzIGxvbmcgYXMgaXQgaXNuJ3QgdXNlZCB3aGVyZSBpdCB3b3VsZCBiZSBjaGVja2VkLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgY2hlY2sgYHByb2NfdmVjX2NvbnZgLCB0aGVyZSBtYXkgYmUgc29tZSB1c2Ugb3IgY2hlY2sgb2YgdGhhdCBkYXRhIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzMxOCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNjQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDo0Ny43NjgyMjY2NjJaIiwiU2VxIjoyNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYwNDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9zeXNjdGwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA2MTUsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2MTU6XFx0XFx0aW50ICgqdWludF9jb252KShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIHVpbnQgKmtfcHRyLFxcbiA2MTY6XFx0XFx0XFx0XFx0IGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKTtcXG4gNjE3OlxcdFxcdGludCAoKnVsb25nX2NvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLFxcbiA2MTg6XFx0XFx0XFx0XFx0ICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSk7XFxuIDYxOTpcXHR9O1xcbiA2MjA6XFx0XFxuIDYyMTpcXHQvKlxcbiA2MjI6XFx0ICogRGlzcGF0Y2ggdG8gdGhlIGNvbnZlcnRlciBtZW1iZXIgc2VsZWN0ZWQgYnkgQHR5cGUuIEBrX3B0ciB3YWxrc1xcbiA2MjM6XFx0ICogdGFibGUtXFx1MDAzZWRhdGEgYXMgcmF3IGJ5dGVzIGFuZCBpcyBjYXN0IGJhY2sgdG8gdGhlIGVsZW1lbnQgdHlwZSBoZXJlLlxcbiA2MjQ6XFx0ICovXFxuIDYyNTpcXHRzdGF0aWMgaW50IHByb2NfdmVjX2NvbnYoZW51bSBwcm9jX3ZlY190eXBlIHR5cGUsIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udixcXG4gNjI2OlxcdFxcdFxcdFxcdCBib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGNoYXIgKmtfcHRyLCBpbnQgZGlyLFxcbiA2Mjc6XFx0XFx0XFx0XFx0IGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKVxcbiA2Mjg6XFx0e1xcbiA2Mjk6XFx0XFx0c3dpdGNoICh0eXBlKSB7XFxuIDYzMDpcXHRcXHRjYXNlIFBST0NfVkVDX0lOVDpcXG4gNjMxOlxcdFxcdFxcdHJldHVybiBjb252LmludF9jb252KG5lZ3AsIHVfcHRyLCAoaW50ICopa19wdHIsIGRpciwgdGFibGUpO1xcbiA2MzI6XFx0XFx0Y2FzZSBQUk9DX1ZFQ19VSU5UOlxcbiA2MzM6XFx0XFx0XFx0cmV0dXJuIGNvbnYudWludF9jb252KG5lZ3AsIHVfcHRyLCAodWludCAqKWtfcHRyLCBkaXIsIHRhYmxlKTtcXG4gNjM0OlxcdFxcdGNhc2UgUFJPQ19WRUNfVUxPTkc6XFxuIDYzNTpcXHRcXHRcXHRyZXR1cm4gY29udi51bG9uZ19jb252KG5lZ3AsIHVfcHRyLCAodWxvbmcgKilrX3B0ciwgZGlyLCB0YWJsZSk7XFxuIDYzNjpcXHRcXHR9XFxuIDYzNzpcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjM4OlxcdH1cXG4gNjM5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDo0Ny43NjgzOTAwMTJaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzU2NDY1MjE1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipSZXZpc2l0aW5nIGBhcHBseV9jb252X29uX3ZlY2AqKlxuXG5Pa2F5LCB0aW1lIHRvIGNpcmNsZSBiYWNrIHRvIGBhcHBseV9jb252X29uX3ZlY2AuIEkgbmVlZCB0byBzb2xpZGlmeSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoYXQgZnVuY3Rpb24ncyBiZWhhdmlvci4gSSB3YW50IHRvIGVuc3VyZSBpdCdzIGJlaGF2aW5nIHByZWNpc2VseSBhcyBJIGV4cGVjdCB3aXRoaW4gdGhpcyBzcGVjaWZpYyBhcmNoaXRlY3R1cmUsIGVzcGVjaWFsbHkgaW4gcmVnYXJkcyB0byBwYWRkaW5nLCBzdHJpZGUsIGFuZCBmaWx0ZXIgYXBwbGljYXRpb24uIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhlcmUgYXJlbid0IGFueSBzdWJ0bGUgYmlhc2VzIGNyZWVwaW5nIGluLCBwYXJ0aWN1bGFybHkgYXQgdGhlIGJvdW5kYXJpZXMuIExldCBtZSBtZW50YWxseSB3YWxrIHRocm91Z2ggYSBmZXcgZXhhbXBsZSBpbnB1dHMgYW5kIHRyYWNlIHRoZSBjb21wdXRhdGlvbnMg4oCTIG1ha2Ugc3VyZSBJIGhhdmVuJ3QgbWlzc2VkIGEgY29ybmVyIGNhc2UuIEknbGwgbmVlZCB0byBkb3VibGUgY2hlY2sgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9ucyBkb3duIHRoZSBsaW5lLCBzbyB0aGUgb3V0cHV0IGRpbWVuc2lvbmFsaXR5IGlzIGNyaXRpY2FsLiBJJ20gZ29pbmcgdG8gbG9vayBhdCB0aGUgaW1wbGVtZW50YXRpb24gd2l0aCBhIG1vcmUgY3JpdGljYWwgZXllLiBJIHN1c3BlY3QgYSBzaW1wbGUgbWVudGFsIGNoZWNrIHdvbid0IHN1ZmZpY2U7IEkgbWlnaHQgZXZlbiB0cnkgd3JpdGluZyBhIHF1aWNrIHVuaXQgdGVzdCB0byB2ZXJpZnkgaXTigJlzIGJlaGF2aW5nIGFjY29yZGluZyB0byB0aGUgZXN0YWJsaXNoZWQgZnJhbWV3b3JrLiBJdCdzIGEga2V5IGNvbXBvbmVudCwgc28gYSBkZWVwIHVuZGVyc3RhbmRpbmcgaGVyZSBwYXlzIGRpdmlkZW5kcyBkb3duIHRoZSBsaW5lLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTg0MCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDQ6NTEuMzMzMDQ1NzE1WiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1Nzg2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvc3lzY3RsLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjYxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjYxOlxcdCAqIGFwcGx5X2NvbnZfb25fdmVjIC0gQXBwbHkgY29udmVydGVyIGZ1bmN0aW9uIG9uIGRhdGEgdmVjdG9yXFxuIDY2MjpcXHQgKlxcbiA2NjM6XFx0ICogRWxlbWVudCBzaWduZWRuZXNzIGlzIGRlcml2ZWQgZnJvbSBAZGF0YV90eXBlLiB0YWJsZS1cXHUwMDNlZGF0YSBpcyB3YWxrZWRcXG4gNjY0OlxcdCAqIGFzIHJhdyBieXRlcyAoQGRhdGEpIGFkdmFuY2VkIGJ5IEBkYXRhX3NpemU7IHRoZSBjb252ZXJ0ZXIgcGVyZm9ybXNcXG4gNjY1OlxcdCAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mXFxuIDY2NjpcXHQgKiBieXRlcyB0aGF0IHdoZXJlIGxlZnQgb3V0c3RhbmRpbmcgYWZ0ZXIgY29udmVyc2lvbi4gQ2FuIGJlIFxcdTAwM2UgMC5cXG4gNjY3OlxcdCAqXFxuIDY2ODpcXHQgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gTm9uLXplcm8gb24gZXJyb3IuXFxuIDY2OTpcXHQgKi9cXG4gNjcwOlxcdHN0YXRpYyBpbnQgYXBwbHlfY29udl9vbl92ZWMoY29uc3QgdW5pb24gcHJvY192ZWNfY29udiBjb252LFxcbiA2NzE6XFx0XFx0XFx0XFx0ICAgICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSxcXG4gNjcyOlxcdFxcdFxcdFxcdCAgICAgY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSxcXG4gNjczOlxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3QgaW50IGNvbnZfZGlyLFxcbiA2NzQ6XFx0XFx0XFx0XFx0ICAgICBjb25zdCBzaXplX3QgYnVmX25ieXRlLCB2b2lkICpidWYsXFxuIDY3NTpcXHRcXHRcXHRcXHQgICAgIHNpemVfdCAqYnVmX2xlZnRfZmluYWwpXFxuIDY3NjpcXHR7XFxuIDY3NzpcXHRcXHRpbnQgdmVjX2xlZnQsIGVyciA9IDA7XFxuIDY3ODpcXHRcXHRzaXplX3QgYnVmX2xlZnQsIG5yX2NvbnYgPSAwO1xcbiA2Nzk6XFx0XFx0Y2hhciAqZGF0YSwgKmRhdGFfc3RhZ2UgPSBOVUxMLCAqcDtcXG4gNjgwOlxcdFxcdGJvb2wgaXNfdW5zaWduZWQgPSBkYXRhX3R5cGUgPT0gUFJPQ19WRUNfVUlOVCB8fCBkYXRhX3R5cGUgPT0gUFJPQ19WRUNfVUxPTkc7XFxuIDY4MTpcXHRcXG4gNjgyOlxcdFxcdGJ1Zl9sZWZ0ID0gYnVmX25ieXRlO1xcbiA2ODM6XFx0XFxuIDY4NDpcXHRcXHRkYXRhID0gdGFibGUtXFx1MDAzZWRhdGE7XFxuIDY4NTpcXHRcXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcXG4gNjg2OlxcdFxcdFxcdGlmIChidWZfbGVmdCBcXHUwMDNlIFBBR0VfU0laRSAtIDEpXFxuIDY4NzpcXHRcXHRcXHRcXHRidWZfbGVmdCA9IFBBR0VfU0laRSAtIDE7XFxuIDY4ODpcXHRcXHRcXHRwID0gYnVmO1xcbiA2ODk6XFx0XFxuIDY5MDpcXHRcXHRcXHRpZiAodGFibGUtXFx1MDAzZW1heGxlbiBcXHUwMDNlIGRhdGFfc2l6ZSkge1xcbiA2OTE6XFx0XFx0XFx0XFx0ZGF0YV9zdGFnZSA9IGttZW1kdXAodGFibGUtXFx1MDAzZWRhdGEsIHRhYmxlLVxcdTAwM2VtYXhsZW4sIEdGUF9LRVJORUwpO1xcbiA2OTI6XFx0XFx0XFx0XFx0aWYgKCFkYXRhX3N0YWdlKSB7XFxuIDY5MzpcXHRcXHRcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbiA2OTQ6XFx0XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuIDY5NTpcXHRcXHRcXHRcXHR9XFxuIDY5NjpcXHRcXHRcXHRcXHRkYXRhID0gZGF0YV9zdGFnZTtcXG4gNjk3OlxcdFxcdFxcdH1cXG4gNjk4OlxcdFxcdH1cXG4gNjk5OlxcdFxcbiA3MDA6XFx0XFx0dmVjX2xlZnQgPSB0YWJsZS1cXHUwMDNlbWF4bGVuIC8gZGF0YV9zaXplO1xcbiA3MDE6XFx0XFx0Zm9yICg7IGJ1Zl9sZWZ0IFxcdTAwMjZcXHUwMDI2IHZlY19sZWZ0LS07IGRhdGEgKz0gZGF0YV9zaXplLCBucl9jb252KyspIHtcXG4gNzAyOlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgbHZhbDtcXG4gNzAzOlxcdFxcdFxcdGJvb2wgbmVnID0gZmFsc2U7XFxuIDcwNDpcXHRcXG4gNzA1OlxcdFxcdFxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xcbiA3MDY6XFx0XFx0XFx0XFx0cHJvY19za2lwX3NwYWNlcyhcXHUwMDI2cCwgXFx1MDAyNmJ1Zl9sZWZ0KTtcXG4gNzA3OlxcdFxcbiA3MDg6XFx0XFx0XFx0XFx0aWYgKCFidWZfbGVmdClcXG4gNzA5OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA3MTA6XFx0XFx0XFx0XFx0ZXJyID0gcHJvY19nZXRfbG9uZyhcXHUwMDI2cCwgXFx1MDAyNmJ1Zl9sZWZ0LCBcXHUwMDI2bHZhbCwgXFx1MDAyNm5lZyxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDQ6NTEuMzMzMjA1OTU1WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUzODUwNjg4NjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgSW1tZWRpYXRlIENvbmNlcm5zIFJlZ2FyZGluZyBgY29tbWl0X2NvbnZfdmVjYCoqXG5cbk9rYXksIGhvbGQgb24gYSBzZWNvbmQuIEkgd2FzIHJldmlld2luZyB0aGUgZGF0YSB0eXBlcyBiZWluZyBoYW5kbGVkLCBhbmQgYSBxdWVzdGlvbiBqdXN0IHBvcHBlZCBpbnRvIG15IGhlYWQ6IHdoYXQgaWYgdGhlIGBkYXRhX3R5cGVgIGlzIGBQUk9DX1ZFQ19VSU5UYD8gTGV0J3MgcXVpY2tseSByZS1leGFtaW5lIHRoZSBgY29tbWl0X2NvbnZfdmVjYCBmdW5jdGlvbi4gSSdtIHRha2luZyBhIGxvb2sgYXQgdGhlIGNvZGU6XG5cbmBgYGNcbnN0YXRpYyBpbnQgY29tbWl0X2NvbnZfdmVjKGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsIHZvaWQgKmRzdCxcblx0XHRcdCAgICBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBucilcbntcblx0c2l6ZV90IGk7XG5cblx0c3dpdGNoIChkYXRhX3R5cGUpIHtcblx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XG5cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkrKylcblx0XHRcdFdSSVRFX09OQ0UoKChpbnQgKilkc3QpW2ldLCAoKGNvbnN0IGludCAqKXNyYylbaV0pO1xuXHRcdHJldHVybiAwO1xuXG5cdGNhc2UgUFJPQ19WRUNfVUxPTkc6XG5cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkrKylcblx0XHRcdFdSSVRFX09OQ0UoKCh1bG9uZyAqKWRzdClbaV0sICgoY29uc3QgdWxvbmcgKilzcmMpW2ldKTtcblx0XHRyZXR1cm4gMDtcblx0ZGVmYXVsdDpcblx0XHRyZXR1cm4gLUVJTlZBTDtcblx0fVxufVxuYGBgXG5cbi4uLmFuZCB0aGVyZSBpdCBpcy4gKipgUFJPQ19WRUNfVUlOVGAgaXMgZ2xhcmluZ2x5IGFic2VudCoqIGZyb20gdGhlIGBzd2l0Y2hgIHN0YXRlbWVudCEgSWYgdGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGEgYGRhdGFfdHlwZWAgb2YgYFBST0NfVkVDX1VJTlRgLCB0aGVuIHRoZSBgZGVmYXVsdGAgY2FzZSB3aWxsIGJlIHRyaWdnZXJlZCwgcmVzdWx0aW5nIGluIGEgcmV0dXJuIHZhbHVlIG9mIGAtRUlOVkFMYC4gVGhpcyBpcyBkZWZpbml0ZWx5IGEgYnVnOyBpdCBpcyBhbiBlcnJvciByZXR1cm4gYmVjYXVzZSBgUFJPQ19WRUNfVUlOVGAgaXMgYSB2YWxpZCB0eXBlIGluIHRoaXMgY29udGV4dC4gSSBuZWVkIHRvIGludmVzdGlnYXRlIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG5leHQgYW5kIHdoYXQgdGhhdCBtaXNzaW5nIHR5cGUgaXMuIExldCdzIHNlZSB3aGF0IGhhcHBlbnMgd2l0aGluIGBwcm9jX2RvdWludHZlY19jb252YC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY5NDMsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNzMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDo1Ni43MTgyNzY4MTlaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTk0NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3N5c2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDgyMyxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDgyMzpcXHRcXHRcXHRcXHRpbnQgKCpjb252KShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIHVpbnQgKmtfcHRyLFxcbiA4MjQ6XFx0XFx0XFx0XFx0XFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKSlcXG4gODI1OlxcdHtcXG4gODI2OlxcdFxcdC8qIHVpbnQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLCAqRG8gbm90KiBhZGQgc3VwcG9ydCBmb3IgdGhlbS4gKi9cXG4gODI3OlxcdFxcdGlmICh0YWJsZS1cXHUwMDNlbWF4bGVuIFxcdTAwMjZcXHUwMDI2ICh0YWJsZS1cXHUwMDNlbWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKVxcbiA4Mjg6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDgyOTpcXHRcXG4gODMwOlxcdFxcdGlmICghY29udilcXG4gODMxOlxcdFxcdFxcdGNvbnYgPSBkb19wcm9jX3VpbnRfY29udjtcXG4gODMyOlxcdFxcbiA4MzM6XFx0XFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcXG4gODM0OlxcdFxcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGNvbnYgfSk7XFxuIDgzNTpcXHR9XFxuIDgzNjpcXHRcXG4gODM3OlxcdC8qKlxcbiA4Mzg6XFx0ICogcHJvY19kb2Jvb2wgLSByZWFkL3dyaXRlIGEgYm9vbFxcbiA4Mzk6XFx0ICogQHRhYmxlOiB0aGUgc3lzY3RsIHRhYmxlXFxuIDg0MDpcXHQgKiBAZGlyOiAlVFJVRSBpZiB0aGlzIGlzIGEgd3JpdGUgdG8gdGhlIHN5c2N0bCBmaWxlXFxuIDg0MTpcXHQgKiBAYnVmZmVyOiB0aGUgdXNlciBidWZmZXJcXG4gODQyOlxcdCAqIEBsZW5wOiB0aGUgc2l6ZSBvZiB0aGUgdXNlciBidWZmZXJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDQ6NTYuNzE4Mzc3NjY5WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMDcyOTUzNTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IEhhbmRsaW5nIGluIGBwcm9jX2RvdWludHZlY19jb252YCBhbmQgUmVsYXRlZCBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBgcHJvY19kb3VpbnR2ZWNfY29udmAgZXNzZW50aWFsbHkgaGFyZGNvZGVzIGB0YWJsZS1cdTAwM2VtYXhsZW5gIHRvIGJlIGBzaXplb2YodWludClgIOKAkyBnb3QgaXQuIFRoaXMgbWVhbnMgaW4gYGFwcGx5X2NvbnZfb25fdmVjYCwgd2hlbiBgdGFibGUtXHUwMDNlbWF4bGVuYCBpcyBub3QgZ3JlYXRlciB0aGFuIGBkYXRhX3NpemVgICh3aGljaCBpcyB0aGUgc2FtZSBhcyBgc2l6ZW9mKHVpbnQpYCksIGBkYXRhX3N0YWdlYCAqaXNuJ3QqIGFsbG9jYXRlZC4gVGh1cywgYGRhdGFgIGRpcmVjdGx5IHBvaW50cyB0byBgdGFibGUtXHUwMDNlZGF0YWAsIHdoaWNoIGlzIHZlcnkgY29udmVuaWVudC4gQmVjYXVzZSBgZGF0YV9zdGFnZWAgaXMgTlVMTCwgYGNvbW1pdF9jb252X3ZlY2AgaXMgc2tpcHBlZC4gVGhlcmVmb3JlLCBgUFJPQ19WRUNfVUlOVGAgZGlyZWN0bHkgbW9kaWZpZXMgYHRhYmxlLVx1MDAzZWRhdGFgLCB3aGljaCBpcyBleHBlY3RlZC4gTm8gbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbXMgdGhlcmUuXG5cbk5vdywgd2hhdCBhYm91dCB0aGUgaW50ZWdlciBhbmQgdW5zaWduZWQgbG9uZyB2ZXJzaW9ucywgYFBST0NfVkVDX0lOVGAgYW5kIGBQUk9DX1ZFQ19VTE9OR2A/IEl0J3MgYSBzbGlnaHRseSBkaWZmZXJlbnQgc2NlbmFyaW8uIElmIGB0YWJsZS1cdTAwM2VtYXhsZW5gICppcyogZ3JlYXRlciB0aGFuIGBkYXRhX3NpemVgLCB0aGVuIGBkYXRhX3N0YWdlYCAqaXMqIGFsbG9jYXRlZC4gQnV0IGlmIGB0YWJsZS1cdTAwM2VkYXRhYCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCwgYGttZW1kdXBgIGNvcGllcyBpdC4gVGhpcyBpcyB3aGVyZSBJIHN0YXJ0IHRvIHdvcnJ5OiBhcmUgd2UgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeT8gS01TQU4gaXMgdXN1YWxseSBnb29kIGF0IGNhdGNoaW5nIHRoYXQsIGJ1dCBga21lbWR1cGAgdXNlcyBga21hbGxvY2AgYW5kIGBtZW1jcHlgLlxuXG5gbWVtY3B5YCBpdHNlbGYgY29waWVzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBhbmQgS01TQU4gdHJhY2tzIGl0LiBUaGUga2V5IHF1ZXN0aW9uIGlzOiBkb2VzIGBtZW1jcHlgIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5ICp0cmlnZ2VyKiBhIHJlcG9ydD8gTm8sIGl0IGp1c3QgcHJvcGFnYXRlcyB0aGUgc2hhZG93IHN0YXRlLiBUaGF0J3MgZ29vZCwgYnV0IGl0IG1lYW5zIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsLlxuXG5UaGVuIGBwcm9jX3ZlY19jb252YCBvdmVyd3JpdGVzIHRoZSBmaXJzdCBgbnJfY29udmAgZWxlbWVudHMgaW4gYGRhdGFfc3RhZ2VgLiBBZnRlciB0aGF0LCBgY29tbWl0X2NvbnZfdmVjYCBjb3BpZXMgdGhlIGZpcnN0IGBucl9jb252YCBlbGVtZW50cyBiYWNrIHRvIGB0YWJsZS1cdTAwM2VkYXRhYC4gU3BlY2lmaWNhbGx5OlxuXG5gYGBjXG5cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkrKylcblx0XHRcdFdSSVRFX09OQ0UoKChpbnQgKilkc3QpW2ldLCAoKGNvbnN0IGludCAqKXNyYylbaV0pO1xuYGBgXG5cblRoaXMgY29waWVzIHRoZSAqaW5pdGlhbGl6ZWQqIGVsZW1lbnRzIGJhY2ssIHdoaWNoIGlzIGZpbmUsIGFzIGBkc3RgIGlzIGB0YWJsZS1cdTAwM2VkYXRhYCwgYW5kIGBzcmNgIGlzIGBkYXRhX3N0YWdlYC4gVGhlIHVuaW5pdGlhbGl6ZWQgcGFydHMgb2YgYGRhdGFfc3RhZ2VgIGFyZSBuZXZlciByZWFkIG9yIGNvcGllZCAqYmFjayouXG5cbkhvd2V2ZXIsIGFuZCB0aGlzIGlzIGNyaXRpY2FsOiBXaGF0IGlmIGBwcm9jX3ZlY19jb252YCBpdHNlbGYgKnJlYWRzKiBmcm9tIGBkYXRhYCBiZWZvcmUgaXQgd3JpdGVzIHRvIGl0PyBJIHNob3VsZCByZS1leGFtaW5lIGBwcm9jX2ludF9jb252YCB3aXRoIHRoaXMgaW4gbWluZC4gVGhhdCdzIHdoZXJlIGEgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdHkgbGllcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc5ODIsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MjcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNTowNi43OTEzMzM5NzRaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc0ODEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9zeXNjdGwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1NDAsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1NDA6XFx0aW50IHByb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLCBpbnQgZGlyLFxcbiA1NDE6XFx0XFx0XFx0ICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwsIGJvb2wga19wdHJfcmFuZ2VfY2hlY2ssXFxuIDU0MjpcXHRcXHRcXHQgIGludCAoKnVzZXJfdG9fa2VybikoY29uc3QgYm9vbCAqbmVncCwgY29uc3QgdWxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyKSxcXG4gNTQzOlxcdFxcdFxcdCAgaW50ICgqa2Vybl90b191c2VyKShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGNvbnN0IGludCAqa19wdHIpKVxcbiA1NDQ6XFx0e1xcbiA1NDU6XFx0XFx0aWYgKFNZU0NUTF9LRVJOX1RPX1VTRVIoZGlyKSlcXG4gNTQ2OlxcdFxcdFxcdHJldHVybiBrZXJuX3RvX3VzZXIobmVncCwgdV9wdHIsIGtfcHRyKTtcXG4gNTQ3OlxcdFxcbiA1NDg6XFx0XFx0aWYgKGtfcHRyX3JhbmdlX2NoZWNrKSB7XFxuIDU0OTpcXHRcXHRcXHRpbnQgdG1wX2ssIHJldDtcXG4gNTUwOlxcdFxcbiA1NTE6XFx0XFx0XFx0aWYgKCF0YmwpXFxuIDU1MjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNTUzOlxcdFxcdFxcdHJldCA9IHVzZXJfdG9fa2VybihuZWdwLCB1X3B0ciwgXFx1MDAyNnRtcF9rKTtcXG4gNTU0OlxcdFxcdFxcdGlmIChyZXQpXFxuIDU1NTpcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA1NTY6XFx0XFx0XFx0aWYgKCh0YmwtXFx1MDAzZWV4dHJhMSBcXHUwMDI2XFx1MDAyNiAqKGludCAqKXRibC1cXHUwMDNlZXh0cmExIFxcdTAwM2UgdG1wX2spIHx8XFxuIDU1NzpcXHRcXHRcXHQgICAgKHRibC1cXHUwMDNlZXh0cmEyIFxcdTAwMjZcXHUwMDI2ICooaW50ICopdGJsLVxcdTAwM2VleHRyYTIgXFx1MDAzYyB0bXBfaykpXFxuIDU1ODpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNTU5OlxcdFxcdFxcdFdSSVRFX09OQ0UoKmtfcHRyLCB0bXBfayk7XFxuIDU2MDpcXHRcXHR9IGVsc2VcXG4gNTYxOlxcdFxcdFxcdHJldHVybiB1c2VyX3RvX2tlcm4obmVncCwgdV9wdHIsIGtfcHRyKTtcXG4gNTYyOlxcdFxcdHJldHVybiAwO1xcbiA1NjM6XFx0fVxcbiA1NjQ6XFx0XFxuIDU2NTpcXHRcXG4gNTY2OlxcdFxcbiA1Njc6XFx0c3RhdGljIGludCBzeXNjdGxfdXNlcl90b19rZXJuX2ludF9jb252KGNvbnN0IGJvb2wgKm5lZ3AsIGNvbnN0IHVsb25nICp1X3B0cixcXG4gNTY4OlxcdFxcdFxcdFxcdFxcdFxcdGludCAqa19wdHIpXFxuIDU2OTpcXHR7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA1OjA2Ljc5MTUxMjExNFoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzI4NDc3ODEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQW5hbHl6aW5nIHRoZSBEYXRhIEZsb3cgd2l0aGluIGBwcm9jX2ludF9jb252YCoqXG5cbkFscmlnaHQsIHNvIEknbSBmb2N1c2luZyBvbiB0aGUgYHByb2NfaW50X2NvbnZgIGZ1bmN0aW9uIHJpZ2h0IG5vdywgYW5kIHNwZWNpZmljYWxseSwgSSdtIHRoaW5raW5nIGFib3V0IHRoZSBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbmFsaXR5IHdpdGhpbiBpdC4gTXkgbWluZCBpbW1lZGlhdGVseSBmbGFncyB0aGUgY2FsbCB0byBgdXNlcl90b19rZXJuYC4gVGhhdCdzIGEgY3JpdGljYWwgcG9pbnQsIGlzbid0IGl0PyBJdCBtZWFucyB3ZSdyZSBtb3ZpbmcgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlIGF0IHRoYXQgcG9pbnQuIEkgbmVlZCB0byBrZWVwIHRoYXQgaW4gbWluZCB3aGVuIGV4YW1pbmluZyBhbnkgYXNzb2NpYXRlZCBzZWN1cml0eSBpbXBsaWNhdGlvbnMsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLCBvciBwb3RlbnRpYWwgZGF0YSBjb3JydXB0aW9uIGlzc3Vlcy4gSSBuZWVkIHRvIHJlZnJlc2ggdGhlIHJlYXNvbnMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBkYXRhIGl0IG9wZXJhdGVzIG9uLCBhbmQgd2hhdCB0aGUgdWx0aW1hdGUgcHVycG9zZSBpcy4gQ29udGV4dCBpcyBrZXksIGFuZCB0aGF0IHNpbmdsZSBmdW5jdGlvbiBjYWxsIHJhaXNlcyBhIHJlZCBmbGFnIGluIG15IG1pbmQgdGhhdCBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NjI4LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNToxMC41MTk5OTI0NTZaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU0MDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9zeXNjdGwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1NjcsXG4gIFwiTGluZUNvdW50XCI6IDE1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1Njc6XFx0c3RhdGljIGludCBzeXNjdGxfdXNlcl90b19rZXJuX2ludF9jb252KGNvbnN0IGJvb2wgKm5lZ3AsIGNvbnN0IHVsb25nICp1X3B0cixcXG4gNTY4OlxcdFxcdFxcdFxcdFxcdFxcdGludCAqa19wdHIpXFxuIDU2OTpcXHR7XFxuIDU3MDpcXHRcXHRyZXR1cm4gcHJvY19pbnRfdTJrX2NvbnZfdW9wKHVfcHRyLCBrX3B0ciwgbmVncCwgTlVMTCk7XFxuIDU3MTpcXHR9XFxuIDU3MjpcXHRcXG4gNTczOlxcdHN0YXRpYyBpbnQgc3lzY3RsX2tlcm5fdG9fdXNlcl9pbnRfY29udihib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGNvbnN0IGludCAqa19wdHIpXFxuIDU3NDpcXHR7XFxuIDU3NTpcXHRcXHRyZXR1cm4gcHJvY19pbnRfazJ1X2NvbnZfa29wKHVfcHRyLCBrX3B0ciwgbmVncCwgTlVMTCk7XFxuIDU3NjpcXHR9XFxuIDU3NzpcXHRcXG4gNTc4OlxcdHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udihib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcXG4gNTc5OlxcdFxcdFxcdFxcdCAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwpXFxuIDU4MDpcXHR7XFxuIDU4MTpcXHRcXHRyZXR1cm4gcHJvY19pbnRfY29udihuZWdwLCB1X3B0ciwga19wdHIsIGRpciwgdGJsLCBmYWxzZSxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDU6MTAuNTIwMTQ4MjA1WiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUxNDM0Njg5NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzIG9uIGNoZWNraW5nIGBwcm9jX2ludF91MmtfY29udl91b3BgIGFzIGlmIHRoZXNlIHdlcmUgbXkgaW50ZXJuYWwgbXVzaW5nczpcblxuKipBbmFseXppbmcgYHByb2NfaW50X3Uya19jb252X3VvcGAqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gemVybyBpbiBvbiB0aGF0IHNwZWNpZmljIGZ1bmN0aW9uIOKAkyBgcHJvY19pbnRfdTJrX2NvbnZfdW9wYC4gSSBrbm93IHRoaXMgaXMgbGlrZWx5IHNvbWUga2luZCBvZiBpbnRlZ2VyIHRvIEsgY29udmVyc2lvbiBtaWNyby1vcCBwcm9jZXNzb3IuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCB0aGF0IG1lYW5zLiBJcyB0aGlzIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmU/IElzIGl0IGEgc3RhbmRhcmQgY29udmVyc2lvbj8gV2hhdCdzIHRoZSBjb250ZXh0P1xuXG5NeSBpbW1lZGlhdGUgY2hlY2tsaXN0IHN0YXJ0cyBydW5uaW5nOlxuXG4qICAgKipEYXRhIFR5cGVzOioqIFdoYXQgYXJlIHRoZSBpbnB1dCBpbnRlZ2VyIHR5cGVzPyBJcyBpdCBhIHNpZ25lZCBvciB1bnNpZ25lZCBpbnRlZ2VyLCBhbmQgdGhlIGV4YWN0IGJpdCB3aWR0aD8gV2hlcmUgaXMgaXQgY29udmVydGluZyAqdG8qPyBJcyBcIktcIiBhIHNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9yIHNvbWUgc29ydCBvZiBpbnRlcm1lZGlhdGUgaW50ZXJuYWwgZm9ybWF0P1xuKiAgICoqT3BlcmF0aW9uOioqIFdoYXQgc3BlY2lmaWMgKmNvbnZlcnNpb24qIGlzIGl0IGRvaW5nPyBJcyBpdCBzaW1wbGUgdHJ1bmNhdGlvbiwgcm91bmRpbmcsIHNhdHVyYXRpb24sIG9yIHNvbWV0aGluZyBtb3JlIGNvbXBsZXg/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBiZWhhdmlvciB1bmRlciBkaWZmZXJlbnQgaW5wdXQgY29uZGl0aW9ucywgZXNwZWNpYWxseSBlZGdlIGNhc2VzIGxpa2UgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMsIG5lZ2F0aXZlIG51bWJlcnMsIGFuZCB6ZXJvZXMuXG4qICAgKipJbXBsZW1lbnRhdGlvbjoqKiBIb3cgaXMgaXQgaW1wbGVtZW50ZWQ/IElzIHRoaXMgYSBoYXJkd2FyZSBibG9jaywgb3IgYSBzb2Z0d2FyZSByb3V0aW5lPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBvcHRpbWl6YXRpb25zIEkgc2hvdWxkIGNvbnNpZGVyPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgYnVncyB0aGF0IGNhbiB0cmlwIGl0IHVwP1xuKiAgICoqQ29udGV4dDoqKiBXaGF0J3MgdGhlIHN1cnJvdW5kaW5nIGNvZGUgdXNpbmcgdGhpcyBgdW9wYD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRhdGEgZmxvdywgdGhlIGNhbGxpbmcgY29udGV4dCwgYW5kIHRoZSBkb3duc3RyZWFtIGNvbnN1bWVycyBvZiB0aGUgcmVzdWx0LiBIb3cgZG9lcyB0aGlzIGZpdCBpbnRvIHRoZSBsYXJnZXIgcGljdHVyZSBvZiB0aGUgcHJvY2Vzc29yJ3MgcGlwZWxpbmU/IFdoYXQncyB0aGUgb3ZlcmFsbCBpbXBhY3Qgb24gc3lzdGVtIHBlcmZvcm1hbmNlP1xuKiAgICoqVGVzdGluZzoqKiBXaGF0IGtpbmQgb2YgdGVzdGluZyBoYXMgYmVlbiBkb25lIG9uIHRoaXM/IFdoYXQgdGVzdHMgYXJlIGluIHBsYWNlIHRvIGNvdmVyIHRoZSBkaWZmZXJlbnQgc2NlbmFyaW9zIEkgbWVudGlvbmVkLCBhbmQgaG93IHRob3JvdWdoIGFyZSB0aGV5PyBBcmUgdGhlcmUgYW55IGtub3duIGlzc3VlcyBvciBhcmVhcyBvZiBjb25jZXJuP1xuXG5JJ2xsIG5lZWQgdG8gZGlnIGludG8gdGhlIHNvdXJjZSBjb2RlLCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24sIGFuZCBhbnkgcmVsZXZhbnQgYXJjaGl0ZWN0dXJlIG1hbnVhbHMgdG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IHRoaXMgaXMgYSBjcml0aWNhbCBjb21wb25lbnQsIGlmIGl0J3Mgbm90IHdvcmtpbmcgY29ycmVjdGx5IGl0IGNhbiBlYXNpbHkgY2F1c2UgaXNzdWVzLiBJdCdzIHRpbWUgdG8gcHV0IG9uIG15IGRldGVjdGl2ZSBoYXQgYW5kIGZpbmQgb3V0IHdoYXQncyBnb2luZyBvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAxNzksIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA1OjE1LjY2MzYxOTc5MloiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDMzODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3N5c2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUwNixcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUwNjpcXHRpbnQgcHJvY19pbnRfdTJrX2NvbnZfdW9wKGNvbnN0IHVsb25nICp1X3B0ciwgaW50ICprX3B0ciwgY29uc3QgYm9vbCAqbmVncCxcXG4gNTA3OlxcdFxcdFxcdFxcdCAgdWxvbmcgKCp1X3B0cl9vcCkoY29uc3QgdWxvbmcpKVxcbiA1MDg6XFx0e1xcbiA1MDk6XFx0XFx0dWxvbmcgdSA9IHVfcHRyX29wID8gdV9wdHJfb3AoKnVfcHRyKSA6ICp1X3B0cjtcXG4gNTEwOlxcdFxcbiA1MTE6XFx0XFx0aWYgKCpuZWdwKSB7XFxuIDUxMjpcXHRcXHRcXHRpZiAodSBcXHUwMDNlICh1bG9uZykgSU5UX01BWCArIDEpXFxuIDUxMzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNTE0OlxcdFxcdFxcdFdSSVRFX09OQ0UoKmtfcHRyLCAtdSk7XFxuIDUxNTpcXHRcXHR9IGVsc2Uge1xcbiA1MTY6XFx0XFx0XFx0aWYgKHUgXFx1MDAzZSAodWxvbmcpIElOVF9NQVgpXFxuIDUxNzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNTE4OlxcdFxcdFxcdFdSSVRFX09OQ0UoKmtfcHRyLCB1KTtcXG4gNTE5OlxcdFxcdH1cXG4gNTIwOlxcdFxcdHJldHVybiAwO1xcbiA1MjE6XFx0fVxcbiA1MjI6XFx0XFxuIDUyMzpcXHQvKipcXG4gNTI0OlxcdCAqIHByb2NfaW50X2NvbnYgLSBDaGFuZ2UgdXNlciBvciBrZXJuZWwgcG9pbnRlciBiYXNlZCBvbiBkaXJlY3Rpb25cXG4gNTI1OlxcdCAqXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA1OjE1LjY2MzcyNDM1MloiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5NjEwNjczODgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IFNhZmV0eSBvZiB0aGUgQ29udmVyc2lvbiBQcm9jZXNzKipcblxuT2theSwgc28gYHByb2NfaW50X3Uya19jb252X3VvcGAgb25seSAqd3JpdGVzKiB0byBgKmtfcHRyYCwgYW5kIEknbSBwcmV0dHkgc3VyZSBgcHJvY192ZWNfY29udmAgb25seSAqd3JpdGVzKiB0byBgZGF0YWAgd2hlbiB3ZSdyZSBkZWFsaW5nIHdpdGggdGhlIGBTWVNDVExfVVNFUl9UT19LRVJOYCBjYXNlLiBUaGVyZWZvcmUsIGluIHRoYXQgZGlyZWN0aW9uLCB0aGVyZSdzIG5vIHJlYWQgZnJvbSBgZGF0YWAgdGhhdCBjb3VsZCBjYXVzZSB0cm91YmxlLiBOb3csIGBjb21taXRfY29udl92ZWNgICpyZWFkcyogb25seSB0aGUgYGRhdGFfc3RhZ2VgIGVsZW1lbnRzIHRoYXQgKndlcmUgd3JpdHRlbiB0byosIHVwIHRvIGBucl9jb252YC5cblxuSG9sZCBvbi4uLiB3aGF0IGlmIGBwcm9jX3ZlY19jb252YCBiYWlscyBvdXQgb24gdGhlIHZlcnkgKmZpcnN0KiBlbGVtZW50PyBUaGF0IG1lYW5zIGBucl9jb252YCB3b3VsZCBiZSB6ZXJvLCByaWdodD8gTGV0J3MgY2hlY2sgdGhlIGNvZGUuLi4gWWVwLCBpZiBgbnJfY29udmAgaXMgemVybywgd2UgYmFpbCBvdXQgaW1tZWRpYXRlbHk6XG5cbmBgYGNcblx0XHRpZiAoIW5yX2NvbnYpIHtcblx0XHRcdGVyciA9IGVyciA/IDogLUVJTlZBTDtcblx0XHRcdGdvdG8gb3V0O1xuXHRcdH1cblx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgZGF0YV9zdGFnZSlcblx0XHRcdGVyciA9IGNvbW1pdF9jb252X3ZlYyhkYXRhX3R5cGUsIHRhYmxlLVx1MDAzZWRhdGEsIGRhdGFfc3RhZ2UsIG5yX2NvbnYpO1xuYGBgXG5cblNvLCBpZiBgbnJfY29udmAgaXMgemVybywgd2UganVtcCB0byBgb3V0YCwgYW5kIGBjb21taXRfY29udl92ZWNgICppc24ndCogZXZlbiBjYWxsZWQuIElmIGBucl9jb252YCBpcyBncmVhdGVyIHRoYW4gemVybywgdGhlbiB3ZSAqZG8qIGNhbGwgYGNvbW1pdF9jb252X3ZlY2Agd2l0aCBgbnJfY29udmAsIHNvIGl0ICpvbmx5KiBjb3BpZXMgd2hhdCB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBhbmQgd3JpdHRlbiB0byBgZGF0YV9zdGFnZWAuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGxlYWtzLiBUaGF0J3MgZ29vZC5cblxuQnV0LCB3aGF0IGlmIGBTWVNDVExfS0VSTl9UT19VU0VSYCBpcyB0aGUgY2FzZT9cblxuYGBgY1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAocHJvY192ZWNfY29udihkYXRhX3R5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkge1xuXHRcdFx0XHRlcnIgPSAtRUlOVkFMO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmIChucl9jb252KVxuXHRcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICdcXHQnKTtcblx0XHRcdHByb2NfcHV0X2xvbmcoXHUwMDI2YnVmLCBcdTAwMjZidWZfbGVmdCwgbHZhbCwgbmVnKTtcblx0XHR9XG5gYGBcblxuT2theSwgaW4gdGhpcyBzY2VuYXJpbywgYGRhdGFgIGlzIHBvaW50aW5nIHRvIGB0YWJsZS1cdTAwM2VkYXRhYCwgd2hpY2ggbWVhbnMgdGhlIGBkYXRhYCBhcnJheSBpcyBiZWluZyByZWFkLiBMb29raW5nIGF0IGBwcm9jX3ZlY19jb252YCBjYWxscyBgcHJvY19pbnRfY29udmAgd2hpY2ggdGhlbiBjYWxscyBga2Vybl90b191c2VyYC4gSSdtIGdvaW5nIHRvIGhhdmUgdG8gZGl2ZSBpbnRvIHRob3NlIGZ1bmN0aW9ucyBuZXh0LCBidXQgYmFzZWQgb24gdGhlIGNvZGUgSSd2ZSBsb29rZWQgYXQsIHRoZSB3cml0ZSBwcm9jZXNzIHNlZW1zIHNhZmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxMDI0LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDQ1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDU6MjUuMjc0NDAxMDAyWiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMjMxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvc3lzY3RsLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDkxLFxuICBcIkxpbmVDb3VudFwiOiAxNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDkxOlxcdFxcdHJldHVybiAwO1xcbiA0OTI6XFx0fVxcbiA0OTM6XFx0XFxuIDQ5NDpcXHQvKipcXG4gNDk1OlxcdCAqIHByb2NfaW50X3Uya19jb252X3VvcCAtIEFzc2lnbiB1c2VyIHZhbHVlIHRvIGEga2VybmVsIHBvaW50ZXJcXG4gNDk2OlxcdCAqIEB1X3B0cjogcG9pbnRlciB0byB1c2VyIHNwYWNlIHZhcmlhYmxlXFxuIDQ5NzpcXHQgKiBAa19wdHI6IHBvaW50ZXIgdG8ga2VybmVsIHZhcmlhYmxlXFxuIDQ5ODpcXHQgKiBAbmVncDogSWYgJVRSVUUsIHRoZSBjb252ZXJ0ZWQgdXNlciB2YWx1ZSBpcyBtYWRlIG5lZ2F0aXZlLlxcbiA0OTk6XFx0ICogQHVfcHRyX29wOiBleGVjdXRlIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGFzc2lnbmluZyB0byBrX3B0clxcbiA1MDA6XFx0ICpcXG4gNTAxOlxcdCAqIFVzZXMgV1JJVEVfT05DRSB0byBhc3NpZ24gdmFsdWUgdG8ga19wdHIuIEV4ZWN1dGVzIHVfcHRyX29wIGlmXFxuIDUwMjpcXHQgKiBub3QgTlVMTC4gQ2hlY2sgZm9yIG92ZXJmbG93IHdpdGggVUlOVF9NQVguXFxuIDUwMzpcXHQgKlxcbiA1MDQ6XFx0ICogUmV0dXJuczogMCBvbiBzdWNjZXNzLlxcbiA1MDU6XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA1OjI1LjI3NDUxNDc3MloiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MDgzMzkxNzA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcyBvbiB0YWNrbGluZyB0aGlzIHNuaXBwZXQsIHJlbmRlcmVkIGFzIGlmIGl0IHdlcmUgbXkgb3duIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipBbmFseXppbmcgYHByb2NfaW50X2sydV9jb252X2tvcGAqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTXkgZmlyc3QgaW5zdGluY3QsIGFzIGFsd2F5cywgaXMgdG8gemVybyBpbiBvbiB0aGF0IGZ1bmN0aW9uOiBgcHJvY19pbnRfazJ1X2NvbnZfa29wYC4gVGhlIG5hbWUgaXRzZWxmIGlzIGEgY2x1ZSwgc28gbGV0J3MgYnJlYWsgaXQgZG93bi4gXCJwcm9jXCIgbGlrZWx5IGluZGljYXRlcyBhIHByb2NlZHVyZSBvciBwcm9jZXNzaW5nIGZ1bmN0aW9uLiBcImludFwiIHN1Z2dlc3RzIHdlJ3JlIGRlYWxpbmcgd2l0aCBpbnRlZ2VycywgYW5kIFwiazJ1XCIgc2VlbXMgdG8gaW1wbHkgc29tZSBraW5kIG9mIGtlcm5lbC10by11c2VyIHNwYWNlIGNvbnZlcnNpb24uIFRoZSBcImNvbnZcIiBpcyBjbGVhciAtIGEgY29udmVyc2lvbiBpcyBoYXBwZW5pbmcuIEFuZCBmaW5hbGx5LCBcImtvcFwiIC4uLiBobW1tLCBwb3RlbnRpYWxseSBhIGtlcm5lbCBvcGVyYXRpb24gb3Iga2VybmVsIG9iamVjdCwgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC5cblxuU28sIEknbSBhbHJlYWR5IGJ1aWxkaW5nIGEgbWVudGFsIG1vZGVsOiB0aGlzIGZ1bmN0aW9uIHByb2JhYmx5IGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gb2YgaW50ZWdlciBkYXRhLCBsaWtlbHkgcmVsYXRlZCB0byBrZXJuZWwgb3BlcmF0aW9ucyBvciBvYmplY3RzLCBmcm9tIHRoZSBrZXJuZWwgc3BhY2UgdG8gdGhlIHVzZXIgc3BhY2UuIFRoZSBkZXZpbCdzIGluIHRoZSBkZXRhaWxzIHRob3VnaCwgYW5kIEkgbmVlZCB0byBzZWUgd2hhdCBleGFjdGx5IGl0ICpkb2VzKi4gSSBuZWVkIHRvIHN0YXJ0IGRpZ2dpbmcgdGhyb3VnaCB0aGUgc3Vycm91bmRpbmcgY29kZS4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRvIHVuZGVyc3RhbmQgKndoeSogdGhpcyBjb252ZXJzaW9uIGlzIG5lZWRlZCwgYW5kICp3aGF0KiBraW5kIG9mIGRhdGEgaXMgYmVpbmcgaGFuZGxlZC4gV2hhdCBhcmUgdGhlIHNlY3VyaXR5IGltcGxpY2F0aW9ucz8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIHJlbGF0ZWQgdG8gaW50ZWdlciBvdmVyZmxvdyBvciBkYXRhIGNvcnJ1cHRpb24/IEkgd2FudCB0byBzZWUgaG93IHRoaXMgZnVuY3Rpb24gaXMgKnVzZWQqIGFuZCB3aGVyZSBpdCdzICpjYWxsZWQqIGZyb20uIEknbGwgbmVlZCB0byB0cmFjZSB0aGUgZGF0YSBmbG93IHRocm91Z2ggaXQuIExldCdzIHNlZSB3aGF0IHdlJ3ZlIGdvdC4gTGV0J3Mgc3RhcnQgdGhlIGRlZXAgZGl2ZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjIzMTUsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA1OjMxLjM1NzkwOTQ0OVoiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDcxNDk5ODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicHJvY19pbnRfazJ1X2NvbnZfa29wXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9zeXNjdGwuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvc3lzY3RsLmM9NDU5PXN0YXRpYyBpbnQgZG9fcHJvY191aW50X2NvbnZfbWlubWF4KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWludCAqa19wdHIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtNDY2LS8qKlxcbmtlcm5lbC9zeXNjdGwuYzo0Njc6ICogcHJvY19pbnRfazJ1X2NvbnZfa29wIC0gQXNzaWduIGtlcm5lbCB2YWx1ZSB0byBhIHVzZXIgc3BhY2UgcG9pbnRlclxcbmtlcm5lbC9zeXNjdGwuYy00NjgtICogQHVfcHRyOiBwb2ludGVyIHRvIHVzZXIgc3BhY2UgdmFyaWFibGVcXG4tLVxcbmtlcm5lbC9zeXNjdGwuYy00NzgtICovXFxua2VybmVsL3N5c2N0bC5jOjQ3OTppbnQgcHJvY19pbnRfazJ1X2NvbnZfa29wKHVsb25nICp1X3B0ciwgY29uc3QgaW50ICprX3B0ciwgYm9vbCAqbmVncCxcXG5rZXJuZWwvc3lzY3RsLmMtNDgwLVxcdFxcdFxcdCAgdWxvbmcgKCprX3B0cl9vcCkoY29uc3QgdWxvbmcpKVxcbi0tXFxua2VybmVsL3N5c2N0bC5jPTU3Mz1zdGF0aWMgaW50IHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKVxcbmtlcm5lbC9zeXNjdGwuYy01NzQte1xcbmtlcm5lbC9zeXNjdGwuYzo1NzU6XFx0cmV0dXJuIHByb2NfaW50X2sydV9jb252X2tvcCh1X3B0ciwga19wdHIsIG5lZ3AsIE5VTEwpO1xcbmtlcm5lbC9zeXNjdGwuYy01NzYtfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNTozMS40MDUwNjM5NDhaIiwiU2VxIjozOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzAyNjY0NTM4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjIzMDMyLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNTozNC40MzE3MTE0ODdaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTk4ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3N5c2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQ3OSxcbiAgXCJMaW5lQ291bnRcIjogMTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQ3OTpcXHRpbnQgcHJvY19pbnRfazJ1X2NvbnZfa29wKHVsb25nICp1X3B0ciwgY29uc3QgaW50ICprX3B0ciwgYm9vbCAqbmVncCxcXG4gNDgwOlxcdFxcdFxcdFxcdCAgdWxvbmcgKCprX3B0cl9vcCkoY29uc3QgdWxvbmcpKVxcbiA0ODE6XFx0e1xcbiA0ODI6XFx0XFx0aW50IHZhbCA9IFJFQURfT05DRSgqa19wdHIpO1xcbiA0ODM6XFx0XFxuIDQ4NDpcXHRcXHRpZiAodmFsIFxcdTAwM2MgMCkge1xcbiA0ODU6XFx0XFx0XFx0Km5lZ3AgPSB0cnVlO1xcbiA0ODY6XFx0XFx0XFx0KnVfcHRyID0ga19wdHJfb3AgPyAta19wdHJfb3AoKHVsb25nKXZhbCkgOiAtKHVsb25nKXZhbDtcXG4gNDg3OlxcdFxcdH0gZWxzZSB7XFxuIDQ4ODpcXHRcXHRcXHQqbmVncCA9IGZhbHNlO1xcbiA0ODk6XFx0XFx0XFx0KnVfcHRyID0ga19wdHJfb3AgPyBrX3B0cl9vcCgodWxvbmcpdmFsKSA6ICh1bG9uZykgdmFsO1xcbiA0OTA6XFx0XFx0fVxcbiA0OTE6XFx0XFx0cmV0dXJuIDA7XFxuIDQ5MjpcXHR9XFxuIDQ5MzpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDU6MzQuNDMxODEyNjQ3WiIsIlNlcSI6NDEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI5MjY5MjYyNTI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFuYWx5c2lzIG9mIFN5c2N0bCBWZWN0b3IgVXBkYXRlIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBwcmltYXJ5IGNvbmNlcm4gaXMgd2hldGhlciB0aGlzIHBhdGNoIGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIHRoYXQgY291bGQgbGVhZCB0byBpbmZvcm1hdGlvbiBsZWFrcy4gRmlyc3QsIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiBgcHJvY19pbnRfazJ1X2NvbnZfa29wYCBpcyB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBwYXRjaCDigJMgaXQgcmVhZHMgZnJvbSBgdGFibGUtXHUwMDNlZGF0YWAsIHdoaWNoIGlzIHRoZSBzeXNjdGwgdGFibGUncyBkYXRhIGFyZWEuIENydWNpYWxseSwgdGhpcyByZWFkICp3YXMqIGFscmVhZHkgcHJlc2VudCwgc28gYW55IGV4aXN0aW5nIGlzc3VlcyB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIGB0YWJsZS1cdTAwM2VkYXRhYCBhcmUgKnByZS1leGlzdGluZyogYW5kICpub3QqIGEgY29uc2VxdWVuY2Ugb2YgdGhpcyByZWZhY3RvcmluZy4gVGhlIHBhdGNoIHNpbXBseSByZXN0cnVjdHVyZXMgdGhlIGxvb3BpbmcgbG9naWMuXG5cblRoZSBrZXkgY2hhbmdlIGxpZXMgaW4gaGFuZGxpbmcgdXNlci10by1rZXJuZWwgd3JpdGVzLiBCZWZvcmUgdGhlIHBhdGNoLCB0aGUgY29kZSBpbiBgZG9fcHJvY192ZWNgIHBhcnNlZCBpbmNvbWluZyBkYXRhLCBhbmQgaWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBwYXJzaW5nIG9mIGEgKnN1YnNlcXVlbnQqIGVsZW1lbnQgaXQgY291bGQgbGVhdmUgKnBhcnQqIG9mIHRoZSBhcnJheSB1cGRhdGVkIOKAkyB0aGlzIGlzIGEgcGFydGlhbCB1cGRhdGUgdnVsbmVyYWJpbGl0eS4gVGhlIHBhdGNoIGludHJvZHVjZXMgYSBgZGF0YV9zdGFnZWAgY29weSBvZiBgdGFibGUtXHUwMDNlZGF0YWAuIFRoaXMgaXMgcHJvbWlzaW5nISBUaGUgcGF0Y2ggbm93IHdyaXRlcyB0byB0aGUgYGRhdGFfc3RhZ2VgLCBhbmQgaW1wb3J0YW50bHksIHRoZSBvcmlnaW5hbCBjb2RlICp3YXMqIHN1c2NlcHRpYmxlIHRvIHRoaXMsIGl0IHdpbGwgTk9UIGNhbGwgYGNvbW1pdF9jb252X3ZlY2Agb24gZXJyb3I7IHRoaXMgaXMgdGhlIGtleSB0byBmaXhpbmcgdGhlIHBhcnRpYWwgdXBkYXRlIGJ1Zy4gSXQgYXZvaWRzIHVwZGF0aW5nIGB0YWJsZS1cdTAwM2VkYXRhYCBpZiBhbnkgZWxlbWVudCBwYXJzZSBmYWlscy5cblxuVGhlIGludHJvZHVjdGlvbiBvZiBgZGF0YV9zdGFnZWAgdmlhIGBrbWVtZHVwYCBpcyB0aGUgYXJlYSBJIG5lZWQgdG8gc2NydXRpbml6ZS4gYGttZW1kdXBgIGFsbG9jYXRlcyBtZW1vcnksIHdoaWNoIGlzIGdvb2QuIEJ1dCBpdCAqY29waWVzKiBmcm9tIGB0YWJsZS1cdTAwM2VkYXRhYC4gSWYgYHRhYmxlLVx1MDAzZWRhdGFgIGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBga21lbWR1cGAgd2lsbCBjb3B5IHRoYXQgdG9vLiBIb3dldmVyLCBzaW5jZSB0aGUgY29weSBpcyBkb25lIHdpdGggYG1lbWNweWAsIEtNU0FOIGlzbid0IHRyaWdnZXJlZCBieSB0aGF0OyBga21lbWR1cGAgY29waWVzIGZyb20gYHRhYmxlLVx1MDAzZWRhdGFgIGludG8gYSBuZXcgYWxsb2NhdGVkIG1lbW9yeS4gQWZ0ZXIgdGhlIG1vZGlmaWNhdGlvbiBvZiBgZGF0YV9zdGFnZWAgaXMgdGhlIHBvaW50IHdoZXJlIHRoZSBgY29tbWl0X2NvbnZfdmVjYCBmdW5jdGlvbiB3aWxsIHRha2UgdGhlIHBhcnNlZCBkYXRhLCBhbmQgd3JpdGUgYmFjayBpbnRvIGB0YWJsZS1cdTAwM2VkYXRhYC4gVGhlbiwgb25seSBgaW50YCBvciBgdWxvbmdgIGVsZW1lbnRzIGFyZSBjb3BpZWQgdG8gYHRhYmxlLVx1MDAzZWRhdGFgLCBub3QgdGhlIGZ1bGwgYGRhdGFfc3RhZ2VgLiBUaGVyZWZvcmUsIGFueSB1bmluaXRpYWxpemVkIHBhZGRpbmcgaW4gYGRhdGFfc3RhZ2VgIGlzbid0IGNvcGllZCBiYWNrIHRvIHRoZSBzeXNjdGwgZGF0YS4gU2luY2UgdGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBleHBsaWNpdGx5IGRlZmluZWQgYXMgYXJyYXlzIG9mIGBpbnRgLCBgdWludGAsIG9yIGB1bG9uZ2AsIHRoZXJlJ3Mgbm8gcGFkZGluZyBiZXR3ZWVuIGVsZW1lbnRzLiBUaGVyZWZvcmUsIHRoaXMgZWxpbWluYXRlcyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSAqbGVha2luZyogYmFjayB0byBgdGFibGUtXHUwMDNlZGF0YWAuXG5cbkEgc2Vjb25kYXJ5IGNoZWNrIGlzIHdoZXRoZXIgYHRhYmxlLVx1MDAzZW1heGxlbmAgKmNvdWxkKiBiZSBhIHZlY3RvciB3aGVyZSBhIGBrbWVtZHVwYCBjb3VsZCBjYXVzZSBhbiBvdXQtb2YtYm91bmRzIHJlYWQgaWYgdGhlIGludGVuZGVkIGRhdGEuIFRoZSBgdmVjX2xlZnQgPSB0YWJsZS1cdTAwM2VtYXhsZW4gLyBkYXRhX3NpemU7YCBpcyB1c2VkLCB0aGUgbG9vcCBvbmx5IHByb2Nlc3NlcyB0aGUgY29ycmVjdCBlbGVtZW50cyBhbmQgYGNvbW1pdF9jb252X3ZlY2Agb25seSBjb3BpZXMgd2l0aGluIHRoZSBjb3JyZWN0IGJvdW5kYXJpZXMuXG5cbklmIGB0YWJsZS1cdTAwM2VtYXhsZW5gIGlzLCBieSBhbnkgbWVhbnMsIGxhcmdlciB0aGFuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGl0IGlzIGEgYnVnIGluIHRoZSBzeXNjdGwgdGFibGUgZGVmaW5pdGlvbiwgdGhhdCBjYXVzZXMgYW4gT09CIHJlYWQgKmFueXdheSogKGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IGNvZGUpIHdoaWNoIEtBU0FOIHdvdWxkIGNhdGNoLlxuXG5Ob3csIGxldCdzIGV4cGxvcmUgYGFwcGx5X2NvbnZfb25fdmVjYC4gSWYgYHRhYmxlLVx1MDAzZW1heGxlbiBcdTAwM2M9IGRhdGFfc2l6ZWAsIHdoaWNoIGlzIGF0IG1vc3Qgb25lIGVsZW1lbnQsIGBkYXRhX3N0YWdlYCBpcyBgTlVMTGAsIGFuZCB0aGUgY29kZSAqZGlyZWN0bHkqIG1vZGlmaWVzIGB0YWJsZS1cdTAwM2VkYXRhYC4gSG93ZXZlciwgYHByb2NfdmVjX2NvbnZgIGlzIG9ubHkgY2FsbGVkICphZnRlciogYSBzdWNjZXNzZnVsIGBwcm9jX2dldF9sb25nYC4gVGhlIHNpbmdsZS1lbGVtZW50IGNhc2UgaXMgYWxyZWFkeSBzYWZlISBJZiBgcHJvY19nZXRfbG9uZ2AgZmFpbHMsIGl0IGV4aXRzIGJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uLlxuXG5BbHNvLCBgcHJvY19pbnRfY29udmAgcGVyZm9ybXMgYW4gaW50ZWdlciByYW5nZSBjaGVjayAqYmVmb3JlKiB3cml0aW5nIHRvIGAqa19wdHJgLiBUaGlzIGNvbmZpcm1zIHNhZmUgd3JpdGVzIHRvIGAqa19wdHJgLlxuXG5Ob3csIHJldmlld2luZyBLTVNBTidzIGNyaXRlcmlhOiBUaGlzIHBhdGNoIG1vZGlmaWVzIHVzZXIgdG8ga2VybmVsLiBTaW5jZSB0aGUgZGF0YSBpcyBjb3BpZWQgYW5kIGFsbCBvZiB0aGUgYm91bmRzIGFyZSB2YWxpZGF0ZWQsIHRoZXJlIGlzIG5vIHJlYWwgcmVhc29uIHRvIHVzZSBLTVNBTi4gSXQgZml4ZXMgYSBwYXJ0aWFsIHVwZGF0ZSBpc3N1ZSwgd2hpY2ggYXZvaWRzIGluZm9ybWF0aW9uIGxlYWsuIFRoZXJlIGFyZSBubyBrZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgdGhhdCBhcmUgbm90IGluaXRpYWxpemVkLiBUaGVyZSdzIG5vIGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGluZyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgYW5kIHRoZSBzdHJ1Y3R1cmVzIGFyZSB3ZWxsLWRlZmluZWQuIFRoZSBga21lbWR1cGAgb25seSBkdXBsaWNhdGVzIHRoZSBpbnRlbmRlZCBkYXRhOyBJdCBhdm9pZHMgaW5mb3JtYXRpb24gbGVha3MuIEtNU0FOIGlzIG5vdCBuZWNlc3NhcnksIGFzIHRoaXMgaXMgYSBmdW5jdGlvbmFsIGltcHJvdmVtZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzMyNSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5NTYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNjowMy43MDEwNzcyNDNaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMyMjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9zeXNjdGwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA2NzAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2NzA6XFx0c3RhdGljIGludCBhcHBseV9jb252X29uX3ZlYyhjb25zdCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXFxuIDY3MTpcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLFxcbiA2NzI6XFx0XFx0XFx0XFx0ICAgICBjb25zdCBlbnVtIHByb2NfdmVjX3R5cGUgZGF0YV90eXBlLFxcbiA2NzM6XFx0XFx0XFx0XFx0ICAgICBjb25zdCBzaXplX3QgZGF0YV9zaXplLCBjb25zdCBpbnQgY29udl9kaXIsXFxuIDY3NDpcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHNpemVfdCBidWZfbmJ5dGUsIHZvaWQgKmJ1ZixcXG4gNjc1OlxcdFxcdFxcdFxcdCAgICAgc2l6ZV90ICpidWZfbGVmdF9maW5hbClcXG4gNjc2OlxcdHtcXG4gNjc3OlxcdFxcdGludCB2ZWNfbGVmdCwgZXJyID0gMDtcXG4gNjc4OlxcdFxcdHNpemVfdCBidWZfbGVmdCwgbnJfY29udiA9IDA7XFxuIDY3OTpcXHRcXHRjaGFyICpkYXRhLCAqZGF0YV9zdGFnZSA9IE5VTEwsICpwO1xcbiA2ODA6XFx0XFx0Ym9vbCBpc191bnNpZ25lZCA9IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VSU5UIHx8IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VTE9ORztcXG4gNjgxOlxcdFxcbiA2ODI6XFx0XFx0YnVmX2xlZnQgPSBidWZfbmJ5dGU7XFxuIDY4MzpcXHRcXG4gNjg0OlxcdFxcdGRhdGEgPSB0YWJsZS1cXHUwMDNlZGF0YTtcXG4gNjg1OlxcdFxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xcbiA2ODY6XFx0XFx0XFx0aWYgKGJ1Zl9sZWZ0IFxcdTAwM2UgUEFHRV9TSVpFIC0gMSlcXG4gNjg3OlxcdFxcdFxcdFxcdGJ1Zl9sZWZ0ID0gUEFHRV9TSVpFIC0gMTtcXG4gNjg4OlxcdFxcdFxcdHAgPSBidWY7XFxuIDY4OTpcXHRcXG4gNjkwOlxcdFxcdFxcdGlmICh0YWJsZS1cXHUwMDNlbWF4bGVuIFxcdTAwM2UgZGF0YV9zaXplKSB7XFxuIDY5MTpcXHRcXHRcXHRcXHRkYXRhX3N0YWdlID0ga21lbWR1cCh0YWJsZS1cXHUwMDNlZGF0YSwgdGFibGUtXFx1MDAzZW1heGxlbiwgR0ZQX0tFUk5FTCk7XFxuIDY5MjpcXHRcXHRcXHRcXHRpZiAoIWRhdGFfc3RhZ2UpIHtcXG4gNjkzOlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuIDY5NDpcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gNjk1OlxcdFxcdFxcdFxcdH1cXG4gNjk2OlxcdFxcdFxcdFxcdGRhdGEgPSBkYXRhX3N0YWdlO1xcbiA2OTc6XFx0XFx0XFx0fVxcbiA2OTg6XFx0XFx0fVxcbiA2OTk6XFx0XFxuIDcwMDpcXHRcXHR2ZWNfbGVmdCA9IHRhYmxlLVxcdTAwM2VtYXhsZW4gLyBkYXRhX3NpemU7XFxuIDcwMTpcXHRcXHRmb3IgKDsgYnVmX2xlZnQgXFx1MDAyNlxcdTAwMjYgdmVjX2xlZnQtLTsgZGF0YSArPSBkYXRhX3NpemUsIG5yX2NvbnYrKykge1xcbiA3MDI6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBsdmFsO1xcbiA3MDM6XFx0XFx0XFx0Ym9vbCBuZWcgPSBmYWxzZTtcXG4gNzA0OlxcdFxcbiA3MDU6XFx0XFx0XFx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oY29udl9kaXIpKSB7XFxuIDcwNjpcXHRcXHRcXHRcXHRwcm9jX3NraXBfc3BhY2VzKFxcdTAwMjZwLCBcXHUwMDI2YnVmX2xlZnQpO1xcbiA3MDc6XFx0XFxuIDcwODpcXHRcXHRcXHRcXHRpZiAoIWJ1Zl9sZWZ0KVxcbiA3MDk6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDcxMDpcXHRcXHRcXHRcXHRlcnIgPSBwcm9jX2dldF9sb25nKFxcdTAwMjZwLCBcXHUwMDI2YnVmX2xlZnQsIFxcdTAwMjZsdmFsLCBcXHUwMDI2bmVnLFxcbiA3MTE6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcXG4gNzEyOlxcdFxcdFxcdFxcdFxcdFxcdCAgICBzaXplb2YocHJvY193c3BhY2Vfc2VwKSwgTlVMTCk7XFxuIDcxMzpcXHRcXHRcXHRcXHRpZiAoIWVyciBcXHUwMDI2XFx1MDAyNiBuZWcgXFx1MDAyNlxcdTAwMjYgaXNfdW5zaWduZWQpXFxuIDcxNDpcXHRcXHRcXHRcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbiA3MTU6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gNzE2OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA3MTc6XFx0XFx0XFx0XFx0aWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCBcXHUwMDI2bmVnLCBcXHUwMDI2bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkge1xcbiA3MTg6XFx0XFx0XFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4gNzE5OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA3MjA6XFx0XFx0XFx0XFx0fVxcbiA3MjE6XFx0XFx0XFx0fSBlbHNlIHtcXG4gNzIyOlxcdFxcdFxcdFxcdGlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgXFx1MDAyNm5lZywgXFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcXG4gNzIzOlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FSU5WQUw7XFxuIDcyNDpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gNzI1OlxcdFxcdFxcdFxcdH1cXG4gNzI2OlxcdFxcdFxcdFxcdGlmIChucl9jb252KVxcbiA3Mjc6XFx0XFx0XFx0XFx0XFx0cHJvY19wdXRfY2hhcihcXHUwMDI2YnVmLCBcXHUwMDI2YnVmX2xlZnQsICdcXFxcdCcpO1xcbiA3Mjg6XFx0XFx0XFx0XFx0cHJvY19wdXRfbG9uZyhcXHUwMDI2YnVmLCBcXHUwMDI2YnVmX2xlZnQsIGx2YWwsIG5lZyk7XFxuIDcyOTpcXHRcXHRcXHR9XFxuIDczMDpcXHRcXHR9XFxuIDczMTpcXHRcXG4gNzMyOlxcdFxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xcbiA3MzM6XFx0XFx0XFx0aWYgKCFlcnIgXFx1MDAyNlxcdTAwMjYgYnVmX2xlZnQpXFxuIDczNDpcXHRcXHRcXHRcXHRwcm9jX3NraXBfc3BhY2VzKFxcdTAwMjZwLCBcXHUwMDI2YnVmX2xlZnQpO1xcbiA3MzU6XFx0XFx0XFx0aWYgKCFucl9jb252KSB7XFxuIDczNjpcXHRcXHRcXHRcXHRlcnIgPSBlcnIgPyA6IC1FSU5WQUw7XFxuIDczNzpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gNzM4OlxcdFxcdFxcdH1cXG4gNzM5OlxcdFxcdFxcdGlmICghZXJyIFxcdTAwMjZcXHUwMDI2IGRhdGFfc3RhZ2UpXFxuIDc0MDpcXHRcXHRcXHRcXHRlcnIgPSBjb21taXRfY29udl92ZWMoZGF0YV90eXBlLCB0YWJsZS1cXHUwMDNlZGF0YSwgZGF0YV9zdGFnZSwgbnJfY29udik7XFxuIDc0MTpcXHRcXHR9IGVsc2Uge1xcbiA3NDI6XFx0XFx0XFx0aWYgKG5yX2NvbnYgXFx1MDAyNlxcdTAwMjYgYnVmX2xlZnQgXFx1MDAyNlxcdTAwMjYgIWVycilcXG4gNzQzOlxcdFxcdFxcdFxcdHByb2NfcHV0X2NoYXIoXFx1MDAyNmJ1ZiwgXFx1MDAyNmJ1Zl9sZWZ0LCAnXFxcXG4nKTtcXG4gNzQ0OlxcdFxcdH1cXG4gNzQ1OlxcdFxcbiA3NDY6XFx0XFx0KmJ1Zl9sZWZ0X2ZpbmFsID0gYnVmX2xlZnQ7XFxuIDc0NzpcXHRcXG4gNzQ4OlxcdG91dDpcXG4gNzQ5OlxcdFxcdGtmcmVlKGRhdGFfc3RhZ2UpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNjowMy43MDEyMTA3NTNaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTU0NzcwMTc2NDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBTeXNjdGwgQXJyYXkgUGFyc2luZyBSZWZhY3RvcioqXG5cbk9rYXksIGxldCBtZSBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJJ20gZXhhbWluaW5nIHRoaXMgcmVmYWN0b3IgZm9yIHN5c2N0bCBhcnJheSBwYXJzaW5nLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyBhbmQgY29ycmVjdG5lc3MuIFRoZSBnb2FsIGhlcmUgc2VlbXMgdG8gYmUgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMsIHdoaWNoIGlzIGEgZ29vZCB0aGluZy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgaW50cm9kdWNlIGFueSByZWdyZXNzaW9ucyBvciBzZWN1cml0eSBob2xlcy5cblxuSSBzdGFydGVkIGJ5IHRyYWNpbmcgdGhlIGVycm9yIGhhbmRsaW5nLiBJZiBJIGdldCBgLUVOT01FTWAsIHRoZW4gYGJ1Zl9sZWZ0X2ZpbmFsYCAqaXNuJ3QqIHVwZGF0ZWQsIGFuZCBjb25zZXF1ZW50bHksIGBsZWZ0X25ieXRlYCByZW1haW5zIGF0IGBTSVpFX01BWGAuIFRoZW4sIGluIGBwcm9jX3ZlY2AsIHRoZSBjaGVjayBmb3IgYFNJWkVfTUFYYCBjb3JyZWN0bHkgcmV0dXJucyB0aGUgZXJyb3IgYW5kICpkb2Vzbid0KiBtb2RpZnkgYGxlbnBgLiBUaGlzIGJlaGF2aW9yIGlzIGFzIGV4cGVjdGVkIGFuZCBwcmV2ZW50cyBhbnkgaXNzdWVzIHdpdGggaW5jb21wbGV0ZSB1cGRhdGVzIGluIHRoZSBldmVudCBvZiBtZW1vcnkgZXhoYXVzdGlvbiwgd2hpY2ggaXMgZ29vZC5cblxuSSBhbHNvIGNoZWNrZWQgd2hhdCBoYXBwZW5zIHdoZW4gYCFucl9jb252YC4gSWYgbm8gY29udmVyc2lvbnMgb2NjdXIsIGl0IGNvcnJlY3RseSBnb2VzIHRvIGBvdXRgLCBgYnVmX2xlZnRfZmluYWxgIGlzbid0IHVwZGF0ZWQsIGBsZWZ0X25ieXRlYCBzdGF5cyBgU0laRV9NQVhgLCBhbmQgdGhlIGNvcnJlY3QgZXJyb3IgaXMgcmV0dXJuZWQuIFRoaXMgaXMgYWxzbyBmaW5lLCBhbmQgZXhwZWN0ZWQuXG5cbk5vdywgYSBzbGlnaHRseSBtb3JlIHRyaWNreSBjYXNlOiBpZiBgU1lTQ1RMX0tFUk5fVE9fVVNFUmAgYW5kIGAhbnJfY29udmAuIEhlcmUsIGBidWZfbGVmdF9maW5hbGAgKmlzKiB1cGRhdGVkIHRvIGBidWZfbGVmdGAsIGFuZCBgbGVmdF9uYnl0ZWAgdGhlbiBiZWNvbWVzIGBidWZfbmJ5dGVgLiBUaGlzIG1lYW5zIHplcm8gYnl0ZXMgd2VyZSB3cml0dGVuLCB3aGljaCBpcyB0aGUgY29ycmVjdCBvdXRjb21lLiBUaGlzIGNhc2UgZG9lc24ndCByZXByZXNlbnQgYSB2dWxuZXJhYmlsaXR5LlxuXG5JIHRob3VnaHQgYWJvdXQgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBBZnRlciBnb2luZyB0aHJvdWdoIHRoZSBsb2dpYywgSSBkb24ndCBzZWUgYW55dGhpbmcgdGhhdCBqdW1wcyBvdXQuIFRoZSBjb3JlIGlkZWEgb2YgdXNpbmcgYGttZW1kdXBgIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBidWZmZXIsIGRvaW5nIHRoZSBwYXJzaW5nIHRoZXJlLCBhbmQgdGhlbiBjb3B5aW5nIHRoZSByZXN1bHQgYmFjayB0byB0aGUgb3JpZ2luYWwgYnVmZmVyIGlzIHNvdW5kLiBUaGVyZSBhcmVuJ3QgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCBwYWRkaW5nLCBzbyBubyBwb3RlbnRpYWwgaW5mbyBsZWFrcyBoZXJlLiBBbmQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIHVzZWQgaW4gYnJhbmNoaW5nLiBBbnkgcG90ZW50aWFsIE9PQiBpc3N1ZXMgb3IgbWVtb3J5IGxlYWtzIHdvdWxkIGxpa2VseSBiZSBmbGFnZ2VkIGJ5IEtBU0FOLlxuXG5JIHF1aWNrbHkgZG91YmxlLWNoZWNrZWQgdGhlIGBwcm9jX2RvdWludHZlY19jb252YCBmdW5jdGlvbi4gVGhlIGNvZGUgZXhwbGljaXRseSBjaGVja3MgYHRhYmxlLVx1MDAzZW1heGxlbmAgdG8gZW5zdXJlIGl0J3MgZWl0aGVyIGAwYCBvciBleGFjdGx5IGBzaXplb2YodWludClgLiBUaGlzIG1lYW5zIGBQUk9DX1ZFQ19VSU5UYCBpcyBvbmx5IHVzZWQgZm9yIHNpbmdsZSBlbGVtZW50cy4gVGhpcyBleHBsYWlucyB3aHkgYFBST0NfVkVDX1VJTlRgIGlzIG5vdCBoYW5kbGVkIGluIGBjb21taXRfY29udl92ZWNgLiBCZWNhdXNlIGZvciBzaW5nbGUgZWxlbWVudHMsIGB0YWJsZS1cdTAwM2VtYXhsZW4gXHUwMDNjPSBkYXRhX3NpemVgIChzaW5jZSBgZGF0YV9zaXplYCBpcyBgc2l6ZW9mKHVpbnQpYCksIHNvIGBkYXRhX3N0YWdlYCBpcyBub3QgYWxsb2NhdGVkLCBhbmQgYGNvbW1pdF9jb252X3ZlY2AgaXMgbm90IGNhbGxlZC4gVGhpcyBhbHNvIHNlZW1zIHBlcmZlY3RseSBzYWZlLlxuXG5HaXZlbiBhbGwgb2YgdGhpcywgYW5kIGNvbnNpZGVyaW5nIHRoYXQgdGhlIHBhdGNoIGRvZXNuJ3QgY2hhbmdlIHRoZSByZWFkIHBhdGggKGtlcm5lbCB0byB1c2VyKSBpbiBhbnkgbWVhbmluZ2Z1bCB3YXksIEkgdGhpbmsgSSdtIGNvbWZvcnRhYmxlIHNldHRpbmcgYE5lZWRzS01TQU49ZmFsc2VgLiBUaGUgcmVmYWN0b3IgdXRpbGl6ZXMgYSB0ZW1wb3JhcnkgYnVmZmVyIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzLCBhbmQgZXhpc3RpbmcgbWVtb3J5IHRvb2xzIHNob3VsZCBjYXRjaCBhbnkgcG90ZW50aWFsIHByb2JsZW1zLiBUaGlzIGNoYW5nZSBpcyBzb2xpZC5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg0ODIsIk91dHB1dFRva2VucyI6MTYxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODMyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDY6MTkuMTc4MjM0OTMyWiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUwMzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgc3lzY3RsIGFycmF5IHBhcnNpbmcgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMgYnkgdXNpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyIChga21lbWR1cGApIHdoZW4gd3JpdGluZyBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLiBUaGUgc3lzY3RsIHZlY3RvcnMgYXJlIHNpbXBsZSBhcnJheXMgb2YgaW50ZWdlcnMgb3IgdW5zaWduZWQgbG9uZ3Mgd2l0aG91dCBwYWRkaW5nLiBUaGUgcmVhZCBwYXRoIChrZXJuZWwgdG8gdXNlcikgaXMgdW5jaGFuZ2VkLCBzbyBubyBuZXcgaW5mby1sZWFrcyBhcmUgaW50cm9kdWNlZC4gVGhlIHRlbXBvcmFyeSBidWZmZXIgaXMgb25seSB1c2VkIGZvciB3cml0aW5nIHRvIGtlcm5lbCBzcGFjZSwgYW5kIG9ubHkgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBlbGVtZW50cyBhcmUgY29waWVkIGJhY2suIEFueSBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyByZWZhY3RvcmluZyB3b3VsZCBiZSBjYXVnaHQgYnkgS0FTQU4gb3Igc3RhbmRhcmQgbWVtb3J5IGxlYWsgZGV0ZWN0b3JzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcyB0aGF0IHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHN5c2N0bCBhcnJheSBwYXJzaW5nIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIGJ5IHVzaW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGttZW1kdXBgKSB3aGVuIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gVGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBzaW1wbGUgYXJyYXlzIG9mIGludGVnZXJzIG9yIHVuc2lnbmVkIGxvbmdzIHdpdGhvdXQgcGFkZGluZy4gVGhlIHJlYWQgcGF0aCAoa2VybmVsIHRvIHVzZXIpIGlzIHVuY2hhbmdlZCwgc28gbm8gbmV3IGluZm8tbGVha3MgYXJlIGludHJvZHVjZWQuIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG9ubHkgdXNlZCBmb3Igd3JpdGluZyB0byBrZXJuZWwgc3BhY2UsIGFuZCBvbmx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQgZWxlbWVudHMgYXJlIGNvcGllZCBiYWNrLiBBbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIG1lbW9yeSBsZWFrIGRldGVjdG9ycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowbgtzw[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-13 13:31:35 +0000 UTC FinishedAt: 2026-08-13 15:06:21 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "28d012efb4327f9c75d5e042a7c91e9a542efa98", "config_name": "upstream-apparmor-kasan.config", "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "28d012efb4327f9c75d5e042a7c91e9a542efa98", "config_name": "upstream-apparmor-kasan.config", "series_id": "3fd812d8-e66c-424d-804d-73b33814d86b" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "proc_dointvec", "proc_douintvec", "proc_dointvec_minmax", "proc_douintvec_minmax", "proc_doulongvec_minmax", "proc_dou8vec_minmax" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjAyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cHJvY19kb2ludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvaW50dmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlY19taW5tYXgmIzM0OywKICAgICYjMzQ7cHJvY19kb3Vsb25ndmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdTh2ZWNfbWlubWF4JiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHN5c2N0bCBhcnJheSBwYXJzaW5nIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIGJ5IHVzaW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGttZW1kdXBgKSB3aGVuIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gVGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBzaW1wbGUgYXJyYXlzIG9mIGludGVnZXJzIG9yIHVuc2lnbmVkIGxvbmdzIHdpdGhvdXQgcGFkZGluZy4gVGhlIHJlYWQgcGF0aCAoa2VybmVsIHRvIHVzZXIpIGlzIHVuY2hhbmdlZCwgc28gbm8gbmV3IGluZm8tbGVha3MgYXJlIGludHJvZHVjZWQuIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG9ubHkgdXNlZCBmb3Igd3JpdGluZyB0byBrZXJuZWwgc3BhY2UsIGFuZCBvbmx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQgZWxlbWVudHMgYXJlIGNvcGllZCBiYWNrLiBBbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIG1lbW9yeSBsZWFrIGRldGVjdG9ycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgY29yZSBzeXNjdGwgdmVjdG9yIHByb2Nlc3NpbmcgbG9naWMgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMgb24gZXJyb3IgYnkgYWxsb2NhdGluZyBhIHRlbXBvcmFyeSBidWZmZXIuIFRoaXMgYWZmZWN0cyBhbGwgc3lzY3RsIGhhbmRsZXJzIHRoYXQgcHJvY2VzcyBhcnJheXMuIEZ1enppbmcgaXMgbmVlZGVkIHRvIGVuc3VyZSBjb3JyZWN0IGVycm9yIGhhbmRsaW5nLCBubyBtZW1vcnkgbGVha3MsIGFuZCBubyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIGR1cmluZyBzeXNjdGwgd3JpdGVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjAyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZTIwODYyODMxY2U3NGEyY2JhZjZmNjNlOTFlYzdlOGYwNDFlZWQxNlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgQXVnIDEzIDE1OjAyOjQ0IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuY1xuaW5kZXggZjdiNzU5ODVkNTQyMC4uNzg3ZjUzZDcwNTA3YiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9zeXNjdGwuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3N5c2N0bC5jXG5AQCAtNTk1LDcgJiM0Mzs1OTUsNyBAQCBzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4KGJvb2wgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLFxuIHN0YXRpYyBjb25zdCBjaGFyIHByb2Nfd3NwYWNlX3NlcFtdID0geyAmIzM5OyAmIzM5OywgJiMzOTtcXHQmIzM5OywgJiMzOTtcXG4mIzM5OyB9O1xuIFxuIC8qXG4tICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBkb19wcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZVxuJiM0MzsgKiBFbGVtZW50IHR5cGUgcHJvY2Vzc2VkIGJ5IHByb2NfdmVjKCkuIFRoZSB0YWcgc2VsZWN0cyB0aGUgZWxlbWVudCBzaXplXG4gICogYW5kIHNpZ25lZG5lc3MsIGFuZCBpdCBzZWxlY3RzIHdoaWNoIG1lbWJlciBvZiB1bmlvbiBwcm9jX3ZlY19jb252IGlzIGxpdmUuXG4gICovXG4gZW51bSBwcm9jX3ZlY190eXBlIHtcbkBAIC02MDUsNyAmIzQzOzYwNSw3IEBAIGVudW0gcHJvY192ZWNfdHlwZSB7XG4gfTtcbiBcbiAvKlxuLSAqIENvbnZlcnRlciBwYXNzZWQgdG8gZG9fcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxuJiM0MzsgKiBDb252ZXJ0ZXIgcGFzc2VkIHRvIHByb2NfdmVjKCkuIE9ubHkgdGhlIG1lbWJlciBtYXRjaGluZyB0aGVcbiAgKiBlbnVtIHByb2NfdmVjX3R5cGUgdGFnIGlzIGV2ZXIgcmVhZCwgc28gZXZlcnkgZGlzcGF0Y2ggc3RheXMgZnVsbHkgdHlwZWQgYW5kXG4gICogbm8gdm9pZCAqIGNvbnZlcnRlciBwb2ludGVyIGlzIG5lZWRlZC5cbiAgKi9cbkBAIC02MzcsMTAxICYjNDM7NjM3LDE2OCBAQCBzdGF0aWMgaW50IHByb2NfdmVjX2NvbnYoZW51bSBwcm9jX3ZlY190eXBlIHR5cGUsIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udixcbiBcdHJldHVybiAtRUlOVkFMO1xuIH1cbiBcbi0vKlxuLSAqIFJlYWQvd3JpdGUgYSB2ZWN0b3Igb2YgQHR5cGUgZWxlbWVudHMuIFRoZSBlbGVtZW50IHNpemUgYW5kIHNpZ25lZG5lc3MgYXJlXG4tICogZGVyaXZlZCBmcm9tIEB0eXBlLCBzbyBhIHNpbmdsZSBydW50aW1lIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBwZXItdHlwZVxuLSAqIHZhcmlhbnRzLiB0YWJsZS1cdTAwM2VkYXRhIGlzIHdhbGtlZCBhcyByYXcgYnl0ZXMgKEBpKSBhZHZhbmNlZCBieSBAc2l6ZTsgdGhlXG4tICogY29udmVydGVyIHBlcmZvcm1zIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS5cbi0gKi9cbi1zdGF0aWMgaW50IGRvX3Byb2NfdmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuLVx0XHQgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyxcbi1cdFx0ICAgICAgIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYpXG4mIzQzO3N0YXRpYyBpbnQgY29tbWl0X2NvbnZfdmVjKGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsIHZvaWQgKmRzdCxcbiYjNDM7XHRcdFx0ICAgIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG5yKVxuIHtcbi1cdGludCB2bGVmdCwgZmlyc3QgPSAxLCBlcnIgPSAwO1xuLVx0c2l6ZV90IGxlZnQsIHNpemU7XG4tXHRib29sIGlzX3Vuc2lnbmVkO1xuLVx0Y2hhciAqaSwgKnA7XG4mIzQzO1x0c2l6ZV90IGk7XG4gXG4tXHRzd2l0Y2ggKHR5cGUpIHtcbiYjNDM7XHRzd2l0Y2ggKGRhdGFfdHlwZSkge1xuIFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YoaW50KTtcbi1cdFx0aXNfdW5zaWduZWQgPSBmYWxzZTtcbi1cdFx0YnJlYWs7XG4tXHRjYXNlIFBST0NfVkVDX1VJTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YodWludCk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdFdSSVRFX09OQ0UoKChpbnQgKilkc3QpW2ldLCAoKGNvbnN0IGludCAqKXNyYylbaV0pO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuIFx0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbi1cdFx0c2l6ZSA9IHNpemVvZih1bG9uZyk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdFdSSVRFX09OQ0UoKCh1bG9uZyAqKWRzdClbaV0sICgoY29uc3QgdWxvbmcgKilzcmMpW2ldKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHR9XG4mIzQzO31cbiBcbi1cdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuLVx0ICAgICgqcHBvcyBcdTAwMjZcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xuLVx0XHQqbGVucCA9IDA7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0aSA9IHRhYmxlLVx1MDAzZWRhdGE7XG4tXHR2bGVmdCA9IHRhYmxlLVx1MDAzZW1heGxlbiAvIHNpemU7XG4tXHRsZWZ0ID0gKmxlbnA7XG4tXG4tXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXG4tXHRpZiAodHlwZSA9PSBQUk9DX1ZFQ19VSU5UIFx1MDAyNlx1MDAyNiB2bGVmdCAhPSAxKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcbi1cdFx0aWYgKHByb2NfZmlyc3RfcG9zX25vbl96ZXJvX2lnbm9yZShwcG9zLCB0YWJsZSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdGlmIChsZWZ0IFx1MDAzZSBQQUdFX1NJWkUgLSAxKVxuLVx0XHRcdGxlZnQgPSBQQUdFX1NJWkUgLSAxO1xuLVx0XHRwID0gYnVmZmVyO1xuJiM0MzsvKipcbiYjNDM7ICogYXBwbHlfY29udl9vbl92ZWMgLSBBcHBseSBjb252ZXJ0ZXIgZnVuY3Rpb24gb24gZGF0YSB2ZWN0b3JcbiYjNDM7ICpcbiYjNDM7ICogRWxlbWVudCBzaWduZWRuZXNzIGlzIGRlcml2ZWQgZnJvbSBAZGF0YV90eXBlLiB0YWJsZS1cdTAwM2VkYXRhIGlzIHdhbGtlZFxuJiM0MzsgKiBhcyByYXcgYnl0ZXMgKEBkYXRhKSBhZHZhbmNlZCBieSBAZGF0YV9zaXplOyB0aGUgY29udmVydGVyIHBlcmZvcm1zXG4mIzQzOyAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mXG4mIzQzOyAqIGJ5dGVzIHRoYXQgd2hlcmUgbGVmdCBvdXRzdGFuZGluZyBhZnRlciBjb252ZXJzaW9uLiBDYW4gYmUgXHUwMDNlIDAuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLiBOb24temVybyBvbiBlcnJvci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYXBwbHlfY29udl9vbl92ZWMoY29uc3QgdW5pb24gcHJvY192ZWNfY29udiBjb252LFxuJiM0MztcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLFxuJiM0MztcdFx0XHQgICAgIGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsXG4mIzQzO1x0XHRcdCAgICAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3QgaW50IGNvbnZfZGlyLFxuJiM0MztcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBidWZfbmJ5dGUsIHZvaWQgKmJ1ZixcbiYjNDM7XHRcdFx0ICAgICBzaXplX3QgKmJ1Zl9sZWZ0X2ZpbmFsKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHZlY19sZWZ0LCBlcnIgPSAwO1xuJiM0MztcdHNpemVfdCBidWZfbGVmdCwgbnJfY29udiA9IDA7XG4mIzQzO1x0Y2hhciAqZGF0YSwgKmRhdGFfc3RhZ2UgPSBOVUxMLCAqcDtcbiYjNDM7XHRib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HO1xuJiM0MztcbiYjNDM7XHRidWZfbGVmdCA9IGJ1Zl9uYnl0ZTtcbiYjNDM7XG4mIzQzO1x0ZGF0YSA9IHRhYmxlLVx1MDAzZWRhdGE7XG4mIzQzO1x0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oY29udl9kaXIpKSB7XG4mIzQzO1x0XHRpZiAoYnVmX2xlZnQgXHUwMDNlIFBBR0VfU0laRSAtIDEpXG4mIzQzO1x0XHRcdGJ1Zl9sZWZ0ID0gUEFHRV9TSVpFIC0gMTtcbiYjNDM7XHRcdHAgPSBidWY7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHRhYmxlLVx1MDAzZW1heGxlbiBcdTAwM2UgZGF0YV9zaXplKSB7XG4mIzQzO1x0XHRcdGRhdGFfc3RhZ2UgPSBrbWVtZHVwKHRhYmxlLVx1MDAzZWRhdGEsIHRhYmxlLVx1MDAzZW1heGxlbiwgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0XHRcdGlmICghZGF0YV9zdGFnZSkge1xuJiM0MztcdFx0XHRcdGVyciA9IC1FTk9NRU07XG4mIzQzO1x0XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0ZGF0YSA9IGRhdGFfc3RhZ2U7XG4mIzQzO1x0XHR9XG4gXHR9XG4gXG4tXHRmb3IgKDsgbGVmdCBcdTAwMjZcdTAwMjYgdmxlZnQtLTsgaSAmIzQzOz0gc2l6ZSwgZmlyc3QgPSAwKSB7XG4mIzQzO1x0dmVjX2xlZnQgPSB0YWJsZS1cdTAwM2VtYXhsZW4gLyBkYXRhX3NpemU7XG4mIzQzO1x0Zm9yICg7IGJ1Zl9sZWZ0IFx1MDAyNlx1MDAyNiB2ZWNfbGVmdC0tOyBkYXRhICYjNDM7PSBkYXRhX3NpemUsIG5yX2NvbnYmIzQzOyYjNDM7KSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgbHZhbDtcbiBcdFx0Ym9vbCBuZWcgPSBmYWxzZTtcbiBcbi1cdFx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkge1xuLVx0XHRcdHByb2Nfc2tpcF9zcGFjZXMoXHUwMDI2cCwgXHUwMDI2bGVmdCk7XG4mIzQzO1x0XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbiYjNDM7XHRcdFx0cHJvY19za2lwX3NwYWNlcyhcdTAwMjZwLCBcdTAwMjZidWZfbGVmdCk7XG4gXG4tXHRcdFx0aWYgKCFsZWZ0KVxuJiM0MztcdFx0XHRpZiAoIWJ1Zl9sZWZ0KVxuIFx0XHRcdFx0YnJlYWs7XG4tXHRcdFx0ZXJyID0gcHJvY19nZXRfbG9uZyhcdTAwMjZwLCBcdTAwMjZsZWZ0LCBcdTAwMjZsdmFsLCBcdTAwMjZuZWcsXG4mIzQzO1x0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQsIFx1MDAyNmx2YWwsIFx1MDAyNm5lZyxcbiBcdFx0XHRcdFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcbiBcdFx0XHRcdFx0ICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTtcbiBcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgbmVnIFx1MDAyNlx1MDAyNiBpc191bnNpZ25lZClcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0aWYgKGVycilcbiBcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGlmIChwcm9jX3ZlY19jb252KHR5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgaSwgZGlyLCB0YWJsZSkpIHtcbiYjNDM7XHRcdFx0aWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCBcdTAwMjZuZWcsIFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0aWYgKHByb2NfdmVjX2NvbnYodHlwZSwgY29udiwgXHUwMDI2bmVnLCBcdTAwMjZsdmFsLCBpLCBkaXIsIHRhYmxlKSkge1xuJiM0MztcdFx0XHRpZiAocHJvY192ZWNfY29udihkYXRhX3R5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkge1xuIFx0XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbi1cdFx0XHRpZiAoIWZpcnN0KVxuLVx0XHRcdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsICYjMzk7XFx0JiMzOTspO1xuLVx0XHRcdHByb2NfcHV0X2xvbmcoXHUwMDI2YnVmZmVyLCBcdTAwMjZsZWZ0LCBsdmFsLCBuZWcpO1xuJiM0MztcdFx0XHRpZiAobnJfY29udilcbiYjNDM7XHRcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICYjMzk7XFx0JiMzOTspO1xuJiM0MztcdFx0XHRwcm9jX3B1dF9sb25nKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsIGx2YWwsIG5lZyk7XG4gXHRcdH1cbiBcdH1cbiBcbi1cdGlmIChTWVNDVExfS0VSTl9UT19VU0VSKGRpcikgXHUwMDI2XHUwMDI2ICFmaXJzdCBcdTAwMjZcdTAwMjYgbGVmdCBcdTAwMjZcdTAwMjYgIWVycilcbi1cdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsICYjMzk7XFxuJiMzOTspO1xuLVx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSBcdTAwMjZcdTAwMjYgIWVyciBcdTAwMjZcdTAwMjYgbGVmdClcbi1cdFx0cHJvY19za2lwX3NwYWNlcyhcdTAwMjZwLCBcdTAwMjZsZWZ0KTtcbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgXHUwMDI2XHUwMDI2IGZpcnN0KVxuLVx0XHRyZXR1cm4gZXJyID8gOiAtRUlOVkFMO1xuLVx0KmxlbnAgLT0gbGVmdDtcbiYjNDM7XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbiYjNDM7XHRcdGlmICghZXJyIFx1MDAyNlx1MDAyNiBidWZfbGVmdClcbiYjNDM7XHRcdFx0cHJvY19za2lwX3NwYWNlcyhcdTAwMjZwLCBcdTAwMjZidWZfbGVmdCk7XG4mIzQzO1x0XHRpZiAoIW5yX2NvbnYpIHtcbiYjNDM7XHRcdFx0ZXJyID0gZXJyID8gOiAtRUlOVkFMO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmICghZXJyIFx1MDAyNlx1MDAyNiBkYXRhX3N0YWdlKVxuJiM0MztcdFx0XHRlcnIgPSBjb21taXRfY29udl92ZWMoZGF0YV90eXBlLCB0YWJsZS1cdTAwM2VkYXRhLCBkYXRhX3N0YWdlLCBucl9jb252KTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0aWYgKG5yX2NvbnYgXHUwMDI2XHUwMDI2IGJ1Zl9sZWZ0IFx1MDAyNlx1MDAyNiAhZXJyKVxuJiM0MztcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICYjMzk7XFxuJiMzOTspO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0KmJ1Zl9sZWZ0X2ZpbmFsID0gYnVmX2xlZnQ7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0a2ZyZWUoZGF0YV9zdGFnZSk7XG4mIzQzO1x0cmV0dXJuIGVycjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUmVhZC93cml0ZSBhIHZlY3RvciBvZiBAdHlwZSBlbGVtZW50cy4gKi9cbiYjNDM7c3RhdGljIGludCBwcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuJiM0MztcdFx0ICAgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zLCBlbnVtIHByb2NfdmVjX3R5cGUgdHlwZSxcbiYjNDM7XHRcdCAgICB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZXJyID0gMDtcbiYjNDM7XHRzaXplX3QgZGF0YV9zaXplLCBsZWZ0X25ieXRlID0gU0laRV9NQVg7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAodHlwZSkge1xuJiM0MztcdGNhc2UgUFJPQ19WRUNfSU5UOlxuJiM0MztcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKGludCk7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFBST0NfVkVDX1VJTlQ6XG4mIzQzO1x0XHRkYXRhX3NpemUgPSBzaXplb2YodWludCk7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRjYXNlIFBST0NfVkVDX1VMT05HOlxuJiM0MztcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKHVsb25nKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGRlZmF1bHQ6XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuJiM0MztcdCAgICAoKnBwb3MgXHUwMDI2XHUwMDI2IFNZU0NUTF9LRVJOX1RPX1VTRVIoZGlyKSkpIHtcbiYjNDM7XHRcdCpsZW5wID0gMDtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkge1xuJiM0MztcdFx0aWYgKHByb2NfZmlyc3RfcG9zX25vbl96ZXJvX2lnbm9yZShwcG9zLCB0YWJsZSkpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXJyID0gYXBwbHlfY29udl9vbl92ZWMoY29udiwgdGFibGUsIHR5cGUsIGRhdGFfc2l6ZSwgZGlyLCAqbGVucCwgYnVmZmVyLFxuJiM0MztcdFx0XHRcdFx1MDAyNmxlZnRfbmJ5dGUpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEFuIHVuY2hhbmdlZCBsZWZ0X25ieXRlIHNpZ25hbHMgYSB3cml0ZSB3aXRoIG5vIHBhcnNlZCBlbGVtZW50OyB3aGljaFxuJiM0MztcdCAqIGlzIGFuIGVycm9yLiBVc2luZyBTSVpFX01BWCB0byBkZXRlY3QgdGhpcyBlcnJvciBpcyBwb3NzaWJsZSBiZWNhdXNlOlxuJiM0MztcdCAqIDEuIGxlbnAgaXMgYm91bmRlZCBieSBLTUFMTE9DX01BWF9TSVpFIGluIHByb2Nfc3lzX2NhbGxfaGFuZGxlclxuJiM0MztcdCAqIDIuIGxlbnAgY291bGQgbmV2ZXIgYmUgU0laRV9NQVggYXMgaXQgaXMgYSBcJiMzNDtyaWRpY3Vsb3VzXCYjMzQ7IChleGFieXRlKSBhbGxvY2F0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChsZWZ0X25ieXRlID09IFNJWkVfTUFYKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0KmxlbnAgLT0gbGVmdF9uYnl0ZTtcbiBvdXQ6XG4gXHQqcHBvcyAmIzQzOz0gKmxlbnA7XG4mIzQzO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtNzU2LDEyICYjNDM7ODIzLDE1IEBAIGludCBwcm9jX2RvdWludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gXHRcdFx0aW50ICgqY29udikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCB1aW50ICprX3B0cixcbiBcdFx0XHRcdCAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkpXG4ge1xuJiM0MztcdC8qIHVpbnQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLCAqRG8gbm90KiBhZGQgc3VwcG9ydCBmb3IgdGhlbS4gKi9cbiYjNDM7XHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAyNlx1MDAyNiAodGFibGUtXHUwMDNlbWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXG4gXHRpZiAoIWNvbnYpXG4gXHRcdGNvbnYgPSBkb19wcm9jX3VpbnRfY29udjtcbiBcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gY29udiB9KTtcbiYjNDM7XHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULFxuJiM0MztcdFx0XHQodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pO1xuIH1cbiBcbiAvKipcbkBAIC04MjAsOCAmIzQzOzg5MCw4IEBAIGludCBwcm9jX2RvYm9vbChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIGludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gXHRcdCAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXG4ge1xuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuLVx0XHRcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcbiYjNDM7XHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4mIzQzO1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtODQwLDggJiM0Mzs5MTAsNyBAQCBpbnQgcHJvY19kb2ludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIFx0XHRzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULFxuLVx0XHRcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252IH0pO1xuJiM0MztcdHJldHVybiBwcm9jX2RvdWludHZlY19jb252KHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgZG9fcHJvY191aW50X2NvbnYpO1xuIH1cbiBcbiAvKipcbkBAIC04NjQsOCAmIzQzOzkzMyw4IEBAIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIGludCBwcm9jX2RvaW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0ICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xuJiM0MztcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbiYjNDM7XHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252X21pbm1heCB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtODkxLDggJiM0Mzs5NjAsOCBAQCBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4gaW50IHByb2NfZG91aW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0XHQgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXG4ge1xuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBkb19wcm9jX3VpbnRfY29udl9taW5tYXggfSk7XG4mIzQzO1x0cmV0dXJuIHByb2NfZG91aW50dmVjX2NvbnYodGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLFxuJiM0MztcdFx0XHRcdCAgIGRvX3Byb2NfdWludF9jb252X21pbm1heCk7XG4gfVxuIFxuIC8qKlxuQEAgLTkzNSw4ICYjNDM7MTAwNCw3IEBAIGludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuIFx0XHR0bXAuZXh0cmEyID0gKHVuc2lnbmVkIGludCAqKSBcdTAwMjZtYXg7XG4gXG4gXHR2YWwgPSBSRUFEX09OQ0UoKmRhdGEpO1xuLVx0cmVzID0gZG9fcHJvY192ZWMoXHUwMDI2dG1wLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252X21pbm1heCB9KTtcbiYjNDM7XHRyZXMgPSBwcm9jX2RvdWludHZlY19taW5tYXgoXHUwMDI2dG1wLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcyk7XG4gXHRpZiAocmVzKVxuIFx0XHRyZXR1cm4gcmVzO1xuIFx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSlcbkBAIC0xMDY2LDggJiM0MzsxMTM0LDggQEAgaW50IHByb2NfZG91bG9uZ3ZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuIFx0XHRcdFx0aW50ICgqY29udikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCB1bG9uZyAqa19wdHIsXG4gXHRcdFx0XHRcdCAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkpXG4ge1xuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGNvbnYgfSk7XG4mIzQzO1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4mIzQzO1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBjb252IH0pO1xuIH1cbiBcbiAvKipcbkBAIC0xMDg3LDEwICYjNDM7MTE1NSwxMCBAQCBpbnQgcHJvY19kb3Vsb25ndmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4gICogUmV0dXJuczogJTAgb24gc3VjY2Vzcy5cbiAgKi9cbiBpbnQgcHJvY19kb3Vsb25ndmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi1cdFx0XHQgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuJiM0MztcdFx0dm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORyxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pO1xuJiM0MztcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLFxuJiM0MztcdFx0XHQodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pO1xuIH1cbiBcbiAvKipcbkBAIC0xMTE0LDggJiM0MzsxMTgyLDggQEAgaW50IHByb2NfZG9pbnR2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIHtcbiBcdGlmICghY29udilcbiBcdFx0Y29udiA9IGRvX3Byb2NfaW50X2NvbnY7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBjb252IH0pO1xuJiM0MztcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbiYjNDM7XHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBjb252IH0pO1xuIH1cbiBcbiAvKipcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaFxuaW5kZXggYjJkOGJkOTAyNmE3Mi4uZmRmM2QyZmIwYTJhZCAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcbkBAIC00LDYgJiM0Mzs0LDcgQEBcbiBcbiAjIFRoaXMgcGVyZm9ybXMgYSBzZXJpZXMgdGVzdHMgYWdhaW5zdCB0aGUgcHJvYyBzeXNjdGwgaW50ZXJmYWNlLlxuIFxuJiM0MzsjIHNoZWxsY2hlY2sgZGlzYWJsZT1TQzIzMTdcbiAjIEtzZWxmdGVzdCBmcmFtZXdvcmsgcmVxdWlyZW1lbnQgLSBTS0lQIGNvZGUgaXMgNC5cbiBrc2Z0X3NraXA9NFxuIFxuQEAgLTM3LDYgJiM0MzszOCw3IEBAIEFMTF9URVNUUz1cJiMzNDskQUxMX1RFU1RTIDAwMDk6MToxOnVucmVnaXN0ZXJfZXJyb3I6MFwmIzM0O1xuIEFMTF9URVNUUz1cJiMzNDskQUxMX1RFU1RTIDAwMTA6MToxOm1udC9tbnRfZXJyb3I6MFwmIzM0O1xuIEFMTF9URVNUUz1cJiMzNDskQUxMX1RFU1RTIDAwMTE6MToxOmVtcHR5X2FkZDowXCYjMzQ7XG4gQUxMX1RFU1RTPVwmIzM0OyRBTExfVEVTVFMgMDAxMjoxOjE6dThfdmFsaWQ6MFwmIzM0O1xuJiM0MztBTExfVEVTVFM9XCYjMzQ7JEFMTF9URVNUUyAwMDEzOjE6MTppbnRfMDAwMzoxXCYjMzQ7XG4gXG4gZnVuY3Rpb24gYWxsb3dfdXNlcl9kZWZhdWx0cygpXG4ge1xuQEAgLTE5Niw2ICYjNDM7MTk4LDE4IEBAIHZlcmlmeV9kaWZmX3coKVxuIFx0cmV0dXJuICQ/XG4gfVxuIFxuJiM0MzsjIFZlcmlmeSB0aGF0IGFuIGVycm9uZW91cyAoJDIpIHVwZGF0ZSBmYWlscyBhbmQgZG9lcyBub3QgY2hhbmdlIFRBUkdFVFxuJiM0Mzt2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUoKVxuJiM0Mzt7XG4mIzQzO1x0VEVTVF9TVFI9XCYjMzQ7JDFcJiMzNDtcbiYjNDM7XHRlY2hvIC1uIFwmIzM0OyRURVNUX1NUUlwmIzM0OyBcdTAwM2UgXCYjMzQ7JFRBUkdFVFwmIzM0O1xuJiM0MztcbiYjNDM7XHRpZiBlY2hvIC1uIFwmIzM0OyQyXCYjMzQ7IFx1MDAzZSBcJiMzNDskVEFSR0VUXCYjMzQ7IDJcdTAwM2UgL2Rldi9udWxsOyB0aGVuXG4mIzQzO1x0XHRyZXR1cm4gMVxuJiM0MztcdGZpXG4mIzQzO1x0dmVyaWZ5X2RpZmZfdyBcJiMzNDske1RBUkdFVH1cJiMzNDtcbiYjNDM7fVxuJiM0MztcbiB0ZXN0X3JjKClcbiB7XG4gXHRpZiBbWyAkcmMgIT0gMCBdXTsgdGhlblxuQEAgLTUwMSw2ICYjNDM7NTE1LDQwIEBAIHJ1bl9saW1pdF9kaWdpdF9pbnRfYXJyYXkoKVxuIFx0dGVzdF9yY1xuIH1cbiBcbiYjNDM7IyBZb3UgdXNlZCBhbiBpbnQgYXJyYXkgYW5kIG9uZSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGFjY2VwdGFibGVcbiYjNDM7cnVuX2ludF9hcnJheV9ub19wYXJ0aWFsX3VwZGF0ZSgpXG4mIzQzO3tcbiYjNDM7XHRlY2hvIC1uIFwmIzM0O1Rlc3RpbmcgaW52YWxpZCBhcnJheSBlbGVtZW50IGRvZXMgbm90IHBhcnRpYWxseSB1cGRhdGUgLi4uIFwmIzM0O1xuJiM0MzsgICAgICAgICMgRXhwZWN0IGZhaWx1cmUgYmVjYXVzZSBvZiAzcmQgZWxlbWVudCAoYWJjKS5cbiYjNDM7XHRpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSBcJiMzNDsxIDIgMyA0XCYjMzQ7IFwmIzM0OzEwIDIwIGFiYyA0MFwmIzM0OzsgdGhlblxuJiM0MztcdFx0ZWNobyBcJiMzNDtGQUlMXCYjMzQ7IFx1MDAzZVx1MDAyNjJcbiYjNDM7XHRcdHJjPTFcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRlY2hvIFwmIzM0O09LXCYjMzQ7XG4mIzQzO1x0ZmlcbiYjNDM7XHR0ZXN0X3JjXG4mIzQzO1xuJiM0MztcdGVjaG8gLW4gXCYjMzQ7VGVzdGluZyBvdXQgb2YgcmFuZ2UgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCBwYXJ0aWFsbHkgdXBkYXRlIC4uLiBcJiMzNDtcbiYjNDM7ICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIGJlY2F1c2Ugb2YgM3JkIGVsZW1lbnQgKGdyZWF0ZXIgdGhhbiBpbnQpXG4mIzQzO1x0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXCYjMzQ7MSAyIDMgNFwmIzM0OyBcJiMzNDsxMCAyMCAkKChJTlRfTUFYICYjNDM7IDEpKSA0MFwmIzM0OzsgdGhlblxuJiM0MztcdFx0ZWNobyBcJiMzNDtGQUlMXCYjMzQ7IFx1MDAzZVx1MDAyNjJcbiYjNDM7XHRcdHJjPTFcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRlY2hvIFwmIzM0O09LXCYjMzQ7XG4mIzQzO1x0ZmlcbiYjNDM7XHR0ZXN0X3JjXG4mIzQzO1xuJiM0MztcdGVjaG8gLW4gXCYjMzQ7VGVzdGluZyBpbnZhbGlkIGZpcnN0IGFycmF5IGVsZW1lbnQgZG9lcyBub3QgdXBkYXRlIC4uLiBcJiMzNDtcbiYjNDM7ICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIG9mIDFzdCBlbGVtZW50XG4mIzQzO1x0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXCYjMzQ7MSAyIDMgNFwmIzM0OyBcJiMzNDthYmMgMjAgMzAgNDBcJiMzNDs7IHRoZW5cbiYjNDM7XHRcdGVjaG8gXCYjMzQ7RkFJTFwmIzM0OyBcdTAwM2VcdTAwMjYyXG4mIzQzO1x0XHRyYz0xXG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZWNobyBcJiMzNDtPS1wmIzM0O1xuJiM0MztcdGZpXG4mIzQzO1x0dGVzdF9yY1xuJiM0Mzt9XG4mIzQzO1xuICMgWW91IGFyZSB1c2luZyBhbiB1bnNpZ25lZCBpbnRcbiBydW5fbGltaXRfZGlnaXRfdWludCgpXG4ge1xuQEAgLTg4MCw2ICYjNDM7OTI4LDE0IEBAIHN5c2N0bF90ZXN0XzAwMTIoKVxuIFx0cmV0dXJuIDBcbiB9XG4gXG4mIzQzO3N5c2N0bF90ZXN0XzAwMTMoKVxuJiM0Mzt7XG4mIzQzO1x0VEFSR0VUPVwmIzM0OyR7U1lTQ1RMfS8kKGdldF90ZXN0X3RhcmdldCAwMDEzKVwmIzM0O1xuJiM0MztcdHJlc2V0X3ZhbHNcbiYjNDM7XG4mIzQzO1x0cnVuX2ludF9hcnJheV9ub19wYXJ0aWFsX3VwZGF0ZVxuJiM0Mzt9XG4mIzQzO1xuIGxpc3RfdGVzdHMoKVxuIHtcbiBcdGVjaG8gXCYjMzQ7VGVzdCBJRCBsaXN0OlwmIzM0O1xuQEAgLTkwMCw2ICYjNDM7OTU2LDcgQEAgbGlzdF90ZXN0cygpXG4gXHRlY2hvIFwmIzM0OzAwMTAgeCAkKGdldF90ZXN0X2NvdW50IDAwMTApIC0gdGVzdHMgc3lzY3QgbW91bnQgcG9pbnRcJiMzNDtcbiBcdGVjaG8gXCYjMzQ7MDAxMSB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMSkgLSB0ZXN0cyBlbXB0eSBkaXJlY3Rvcmllc1wmIzM0O1xuIFx0ZWNobyBcJiMzNDswMDEyIHggJChnZXRfdGVzdF9jb3VudCAwMDEyKSAtIHRlc3RzIHJhbmdlIGNoZWNrIGZvciB1OCBwcm9jX2hhbmRsZXJcJiMzNDtcbiYjNDM7XHRlY2hvIFwmIzM0OzAwMTMgeCAkKGdldF90ZXN0X2NvdW50IDAwMTMpIC0gdGVzdHMgcGFydGlhbGx5IHVwZGF0ZSB2ZWN0b3JzIG9uIGVycm9yXCYjMzQ7XG4gfVxuIFxuIHVzYWdlKClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtwcm9jX2RvaW50dmVjJiMzNDssCiAgICAmIzM0O3Byb2NfZG91aW50dmVjJiMzNDssCiAgICAmIzM0O3Byb2NfZG9pbnR2ZWNfbWlubWF4JiMzNDssCiAgICAmIzM0O3Byb2NfZG91aW50dmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWxvbmd2ZWNfbWlubWF4JiMzNDssCiAgICAmIzM0O3Byb2NfZG91OHZlY19taW5tYXgmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGNvcmUgc3lzY3RsIHZlY3RvciBwcm9jZXNzaW5nIGxvZ2ljIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIG9uIGVycm9yIGJ5IGFsbG9jYXRpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyLiBUaGlzIGFmZmVjdHMgYWxsIHN5c2N0bCBoYW5kbGVycyB0aGF0IHByb2Nlc3MgYXJyYXlzLiBGdXp6aW5nIGlzIG5lZWRlZCB0byBlbnN1cmUgY29ycmVjdCBlcnJvciBoYW5kbGluZywgbm8gbWVtb3J5IGxlYWtzLCBhbmQgbm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBkdXJpbmcgc3lzY3RsIHdyaXRlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGUyMDg2MjgzMWNlNzRhMmNiYWY2ZjYzZTkxZWM3ZThmMDQxZWVkMTYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IEF1ZyAxMyAxNTowMjo0NCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCBmN2I3NTk4NWQ1NDIwLi43ODdmNTNkNzA1MDdiIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3N5c2N0bC5jCkBAIC01OTUsNyAmIzQzOzU5NSw3IEBAIHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsCiBzdGF0aWMgY29uc3QgY2hhciBwcm9jX3dzcGFjZV9zZXBbXSA9IHsgJiMzOTsgJiMzOTssICYjMzk7XHQmIzM5OywgJiMzOTtcbiYjMzk7IH07CiAKIC8qCi0gKiBFbGVtZW50IHR5cGUgcHJvY2Vzc2VkIGJ5IGRvX3Byb2NfdmVjKCkuIFRoZSB0YWcgc2VsZWN0cyB0aGUgZWxlbWVudCBzaXplCiYjNDM7ICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBwcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZQogICogYW5kIHNpZ25lZG5lc3MsIGFuZCBpdCBzZWxlY3RzIHdoaWNoIG1lbWJlciBvZiB1bmlvbiBwcm9jX3ZlY19jb252IGlzIGxpdmUuCiAgKi8KIGVudW0gcHJvY192ZWNfdHlwZSB7CkBAIC02MDUsNyAmIzQzOzYwNSw3IEBAIGVudW0gcHJvY192ZWNfdHlwZSB7CiB9OwogCiAvKgotICogQ29udmVydGVyIHBhc3NlZCB0byBkb19wcm9jX3ZlYygpLiBPbmx5IHRoZSBtZW1iZXIgbWF0Y2hpbmcgdGhlCiYjNDM7ICogQ29udmVydGVyIHBhc3NlZCB0byBwcm9jX3ZlYygpLiBPbmx5IHRoZSBtZW1iZXIgbWF0Y2hpbmcgdGhlCiAgKiBlbnVtIHByb2NfdmVjX3R5cGUgdGFnIGlzIGV2ZXIgcmVhZCwgc28gZXZlcnkgZGlzcGF0Y2ggc3RheXMgZnVsbHkgdHlwZWQgYW5kCiAgKiBubyB2b2lkICogY29udmVydGVyIHBvaW50ZXIgaXMgbmVlZGVkLgogICovCkBAIC02MzcsMTAxICYjNDM7NjM3LDE2OCBAQCBzdGF0aWMgaW50IHByb2NfdmVjX2NvbnYoZW51bSBwcm9jX3ZlY190eXBlIHR5cGUsIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udiwKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotLyoKLSAqIFJlYWQvd3JpdGUgYSB2ZWN0b3Igb2YgQHR5cGUgZWxlbWVudHMuIFRoZSBlbGVtZW50IHNpemUgYW5kIHNpZ25lZG5lc3MgYXJlCi0gKiBkZXJpdmVkIGZyb20gQHR5cGUsIHNvIGEgc2luZ2xlIHJ1bnRpbWUgZnVuY3Rpb24gcmVwbGFjZXMgdGhlIHBlci10eXBlCi0gKiB2YXJpYW50cy4gdGFibGUtJmd0O2RhdGEgaXMgd2Fsa2VkIGFzIHJhdyBieXRlcyAoQGkpIGFkdmFuY2VkIGJ5IEBzaXplOyB0aGUKLSAqIGNvbnZlcnRlciBwZXJmb3JtcyB0aGUgYWN0dWFsIHR5cGVkIGxvYWQvc3RvcmUuCi0gKi8KLXN0YXRpYyBpbnQgZG9fcHJvY192ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCi0JCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zLAotCQkgICAgICAgZW51bSBwcm9jX3ZlY190eXBlIHR5cGUsIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udikKJiM0MztzdGF0aWMgaW50IGNvbW1pdF9jb252X3ZlYyhjb25zdCBlbnVtIHByb2NfdmVjX3R5cGUgZGF0YV90eXBlLCB2b2lkICpkc3QsCiYjNDM7CQkJICAgIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG5yKQogewotCWludCB2bGVmdCwgZmlyc3QgPSAxLCBlcnIgPSAwOwotCXNpemVfdCBsZWZ0LCBzaXplOwotCWJvb2wgaXNfdW5zaWduZWQ7Ci0JY2hhciAqaSwgKnA7CiYjNDM7CXNpemVfdCBpOwogCi0Jc3dpdGNoICh0eXBlKSB7CiYjNDM7CXN3aXRjaCAoZGF0YV90eXBlKSB7CiAJY2FzZSBQUk9DX1ZFQ19JTlQ6Ci0JCXNpemUgPSBzaXplb2YoaW50KTsKLQkJaXNfdW5zaWduZWQgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JY2FzZSBQUk9DX1ZFQ19VSU5UOgotCQlzaXplID0gc2l6ZW9mKHVpbnQpOwotCQlpc191bnNpZ25lZCA9IHRydWU7Ci0JCWJyZWFrOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlXUklURV9PTkNFKCgoaW50ICopZHN0KVtpXSwgKChjb25zdCBpbnQgKilzcmMpW2ldKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwogCWNhc2UgUFJPQ19WRUNfVUxPTkc6Ci0JCXNpemUgPSBzaXplb2YodWxvbmcpOwotCQlpc191bnNpZ25lZCA9IHRydWU7Ci0JCWJyZWFrOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCQlXUklURV9PTkNFKCgodWxvbmcgKilkc3QpW2ldLCAoKGNvbnN0IHVsb25nICopc3JjKVtpXSk7CiYjNDM7CQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiYjNDM7fQogCi0JaWYgKCF0YWJsZS0mZ3Q7ZGF0YSB8fCAhdGFibGUtJmd0O21heGxlbiB8fCAhKmxlbnAgfHwKLQkgICAgKCpwcG9zICZhbXA7JmFtcDsgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkgewotCQkqbGVucCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQotCWkgPSB0YWJsZS0mZ3Q7ZGF0YTsKLQl2bGVmdCA9IHRhYmxlLSZndDttYXhsZW4gLyBzaXplOwotCWxlZnQgPSAqbGVucDsKLQotCS8qIHVpbnQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLCAqRG8gbm90KiBhZGQgc3VwcG9ydCBmb3IgdGhlbS4gKi8KLQlpZiAodHlwZSA9PSBQUk9DX1ZFQ19VSU5UICZhbXA7JmFtcDsgdmxlZnQgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKSB7Ci0JCWlmIChwcm9jX2ZpcnN0X3Bvc19ub25femVyb19pZ25vcmUocHBvcywgdGFibGUpKQotCQkJZ290byBvdXQ7Ci0KLQkJaWYgKGxlZnQgJmd0OyBQQUdFX1NJWkUgLSAxKQotCQkJbGVmdCA9IFBBR0VfU0laRSAtIDE7Ci0JCXAgPSBidWZmZXI7CiYjNDM7LyoqCiYjNDM7ICogYXBwbHlfY29udl9vbl92ZWMgLSBBcHBseSBjb252ZXJ0ZXIgZnVuY3Rpb24gb24gZGF0YSB2ZWN0b3IKJiM0MzsgKgomIzQzOyAqIEVsZW1lbnQgc2lnbmVkbmVzcyBpcyBkZXJpdmVkIGZyb20gQGRhdGFfdHlwZS4gdGFibGUtJmd0O2RhdGEgaXMgd2Fsa2VkCiYjNDM7ICogYXMgcmF3IGJ5dGVzIChAZGF0YSkgYWR2YW5jZWQgYnkgQGRhdGFfc2l6ZTsgdGhlIGNvbnZlcnRlciBwZXJmb3JtcwomIzQzOyAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mCiYjNDM7ICogYnl0ZXMgdGhhdCB3aGVyZSBsZWZ0IG91dHN0YW5kaW5nIGFmdGVyIGNvbnZlcnNpb24uIENhbiBiZSAmZ3Q7IDAuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gTm9uLXplcm8gb24gZXJyb3IuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBhcHBseV9jb252X29uX3ZlYyhjb25zdCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsCiYjNDM7CQkJICAgICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwKJiM0MzsJCQkgICAgIGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsCiYjNDM7CQkJICAgICBjb25zdCBzaXplX3QgZGF0YV9zaXplLCBjb25zdCBpbnQgY29udl9kaXIsCiYjNDM7CQkJICAgICBjb25zdCBzaXplX3QgYnVmX25ieXRlLCB2b2lkICpidWYsCiYjNDM7CQkJICAgICBzaXplX3QgKmJ1Zl9sZWZ0X2ZpbmFsKQomIzQzO3sKJiM0MzsJaW50IHZlY19sZWZ0LCBlcnIgPSAwOwomIzQzOwlzaXplX3QgYnVmX2xlZnQsIG5yX2NvbnYgPSAwOwomIzQzOwljaGFyICpkYXRhLCAqZGF0YV9zdGFnZSA9IE5VTEwsICpwOwomIzQzOwlib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HOwomIzQzOwomIzQzOwlidWZfbGVmdCA9IGJ1Zl9uYnl0ZTsKJiM0MzsKJiM0MzsJZGF0YSA9IHRhYmxlLSZndDtkYXRhOwomIzQzOwlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHsKJiM0MzsJCWlmIChidWZfbGVmdCAmZ3Q7IFBBR0VfU0laRSAtIDEpCiYjNDM7CQkJYnVmX2xlZnQgPSBQQUdFX1NJWkUgLSAxOwomIzQzOwkJcCA9IGJ1ZjsKJiM0MzsKJiM0MzsJCWlmICh0YWJsZS0mZ3Q7bWF4bGVuICZndDsgZGF0YV9zaXplKSB7CiYjNDM7CQkJZGF0YV9zdGFnZSA9IGttZW1kdXAodGFibGUtJmd0O2RhdGEsIHRhYmxlLSZndDttYXhsZW4sIEdGUF9LRVJORUwpOwomIzQzOwkJCWlmICghZGF0YV9zdGFnZSkgewomIzQzOwkJCQllcnIgPSAtRU5PTUVNOwomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQl9CiYjNDM7CQkJZGF0YSA9IGRhdGFfc3RhZ2U7CiYjNDM7CQl9CiAJfQogCi0JZm9yICg7IGxlZnQgJmFtcDsmYW1wOyB2bGVmdC0tOyBpICYjNDM7PSBzaXplLCBmaXJzdCA9IDApIHsKJiM0MzsJdmVjX2xlZnQgPSB0YWJsZS0mZ3Q7bWF4bGVuIC8gZGF0YV9zaXplOwomIzQzOwlmb3IgKDsgYnVmX2xlZnQgJmFtcDsmYW1wOyB2ZWNfbGVmdC0tOyBkYXRhICYjNDM7PSBkYXRhX3NpemUsIG5yX2NvbnYmIzQzOyYjNDM7KSB7CiAJCXVuc2lnbmVkIGxvbmcgbHZhbDsKIAkJYm9vbCBuZWcgPSBmYWxzZTsKIAotCQlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKSB7Ci0JCQlwcm9jX3NraXBfc3BhY2VzKCZhbXA7cCwgJmFtcDtsZWZ0KTsKJiM0MzsJCWlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkgewomIzQzOwkJCXByb2Nfc2tpcF9zcGFjZXMoJmFtcDtwLCAmYW1wO2J1Zl9sZWZ0KTsKIAotCQkJaWYgKCFsZWZ0KQomIzQzOwkJCWlmICghYnVmX2xlZnQpCiAJCQkJYnJlYWs7Ci0JCQllcnIgPSBwcm9jX2dldF9sb25nKCZhbXA7cCwgJmFtcDtsZWZ0LCAmYW1wO2x2YWwsICZhbXA7bmVnLAomIzQzOwkJCWVyciA9IHByb2NfZ2V0X2xvbmcoJmFtcDtwLCAmYW1wO2J1Zl9sZWZ0LCAmYW1wO2x2YWwsICZhbXA7bmVnLAogCQkJCQkgICAgcHJvY193c3BhY2Vfc2VwLAogCQkJCQkgICAgc2l6ZW9mKHByb2Nfd3NwYWNlX3NlcCksIE5VTEwpOwogCQkJaWYgKCFlcnIgJmFtcDsmYW1wOyBuZWcgJmFtcDsmYW1wOyBpc191bnNpZ25lZCkKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJaWYgKGVycikKIAkJCQlicmVhazsKLQkJCWlmIChwcm9jX3ZlY19jb252KHR5cGUsIGNvbnYsICZhbXA7bmVnLCAmYW1wO2x2YWwsIGksIGRpciwgdGFibGUpKSB7CiYjNDM7CQkJaWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCAmYW1wO25lZywgJmFtcDtsdmFsLCBkYXRhLCBjb252X2RpciwgdGFibGUpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChwcm9jX3ZlY19jb252KHR5cGUsIGNvbnYsICZhbXA7bmVnLCAmYW1wO2x2YWwsIGksIGRpciwgdGFibGUpKSB7CiYjNDM7CQkJaWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCAmYW1wO25lZywgJmFtcDtsdmFsLCBkYXRhLCBjb252X2RpciwgdGFibGUpKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmICghZmlyc3QpCi0JCQkJcHJvY19wdXRfY2hhcigmYW1wO2J1ZmZlciwgJmFtcDtsZWZ0LCAmIzM5O1x0JiMzOTspOwotCQkJcHJvY19wdXRfbG9uZygmYW1wO2J1ZmZlciwgJmFtcDtsZWZ0LCBsdmFsLCBuZWcpOwomIzQzOwkJCWlmIChucl9jb252KQomIzQzOwkJCQlwcm9jX3B1dF9jaGFyKCZhbXA7YnVmLCAmYW1wO2J1Zl9sZWZ0LCAmIzM5O1x0JiMzOTspOwomIzQzOwkJCXByb2NfcHV0X2xvbmcoJmFtcDtidWYsICZhbXA7YnVmX2xlZnQsIGx2YWwsIG5lZyk7CiAJCX0KIAl9CiAKLQlpZiAoU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpICZhbXA7JmFtcDsgIWZpcnN0ICZhbXA7JmFtcDsgbGVmdCAmYW1wOyZhbXA7ICFlcnIpCi0JCXByb2NfcHV0X2NoYXIoJmFtcDtidWZmZXIsICZhbXA7bGVmdCwgJiMzOTtcbiYjMzk7KTsKLQlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpICZhbXA7JmFtcDsgIWVyciAmYW1wOyZhbXA7IGxlZnQpCi0JCXByb2Nfc2tpcF9zcGFjZXMoJmFtcDtwLCAmYW1wO2xlZnQpOwotCWlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgJmFtcDsmYW1wOyBmaXJzdCkKLQkJcmV0dXJuIGVyciA/IDogLUVJTlZBTDsKLQkqbGVucCAtPSBsZWZ0OwomIzQzOwlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHsKJiM0MzsJCWlmICghZXJyICZhbXA7JmFtcDsgYnVmX2xlZnQpCiYjNDM7CQkJcHJvY19za2lwX3NwYWNlcygmYW1wO3AsICZhbXA7YnVmX2xlZnQpOwomIzQzOwkJaWYgKCFucl9jb252KSB7CiYjNDM7CQkJZXJyID0gZXJyID8gOiAtRUlOVkFMOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwkJaWYgKCFlcnIgJmFtcDsmYW1wOyBkYXRhX3N0YWdlKQomIzQzOwkJCWVyciA9IGNvbW1pdF9jb252X3ZlYyhkYXRhX3R5cGUsIHRhYmxlLSZndDtkYXRhLCBkYXRhX3N0YWdlLCBucl9jb252KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWlmIChucl9jb252ICZhbXA7JmFtcDsgYnVmX2xlZnQgJmFtcDsmYW1wOyAhZXJyKQomIzQzOwkJCXByb2NfcHV0X2NoYXIoJmFtcDtidWYsICZhbXA7YnVmX2xlZnQsICYjMzk7XG4mIzM5Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJKmJ1Zl9sZWZ0X2ZpbmFsID0gYnVmX2xlZnQ7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlrZnJlZShkYXRhX3N0YWdlKTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVhZC93cml0ZSBhIHZlY3RvciBvZiBAdHlwZSBlbGVtZW50cy4gKi8KJiM0MztzdGF0aWMgaW50IHByb2NfdmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiYjNDM7CQkgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLAomIzQzOwkJICAgIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udikKJiM0Mzt7CiYjNDM7CWludCBlcnIgPSAwOwomIzQzOwlzaXplX3QgZGF0YV9zaXplLCBsZWZ0X25ieXRlID0gU0laRV9NQVg7CiYjNDM7CiYjNDM7CXN3aXRjaCAodHlwZSkgewomIzQzOwljYXNlIFBST0NfVkVDX0lOVDoKJiM0MzsJCWRhdGFfc2l6ZSA9IHNpemVvZihpbnQpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUFJPQ19WRUNfVUlOVDoKJiM0MzsJCWRhdGFfc2l6ZSA9IHNpemVvZih1aW50KTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFBST0NfVkVDX1VMT05HOgomIzQzOwkJZGF0YV9zaXplID0gc2l6ZW9mKHVsb25nKTsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCF0YWJsZS0mZ3Q7ZGF0YSB8fCAhdGFibGUtJmd0O21heGxlbiB8fCAhKmxlbnAgfHwKJiM0MzsJICAgICgqcHBvcyAmYW1wOyZhbXA7IFNZU0NUTF9LRVJOX1RPX1VTRVIoZGlyKSkpIHsKJiM0MzsJCSpsZW5wID0gMDsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHsKJiM0MzsJCWlmIChwcm9jX2ZpcnN0X3Bvc19ub25femVyb19pZ25vcmUocHBvcywgdGFibGUpKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IGFwcGx5X2NvbnZfb25fdmVjKGNvbnYsIHRhYmxlLCB0eXBlLCBkYXRhX3NpemUsIGRpciwgKmxlbnAsIGJ1ZmZlciwKJiM0MzsJCQkJJmFtcDtsZWZ0X25ieXRlKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQW4gdW5jaGFuZ2VkIGxlZnRfbmJ5dGUgc2lnbmFscyBhIHdyaXRlIHdpdGggbm8gcGFyc2VkIGVsZW1lbnQ7IHdoaWNoCiYjNDM7CSAqIGlzIGFuIGVycm9yLiBVc2luZyBTSVpFX01BWCB0byBkZXRlY3QgdGhpcyBlcnJvciBpcyBwb3NzaWJsZSBiZWNhdXNlOgomIzQzOwkgKiAxLiBsZW5wIGlzIGJvdW5kZWQgYnkgS01BTExPQ19NQVhfU0laRSBpbiBwcm9jX3N5c19jYWxsX2hhbmRsZXIKJiM0MzsJICogMi4gbGVucCBjb3VsZCBuZXZlciBiZSBTSVpFX01BWCBhcyBpdCBpcyBhICYjMzQ7cmlkaWN1bG91cyYjMzQ7IChleGFieXRlKSBhbGxvY2F0aW9uLgomIzQzOwkgKi8KJiM0MzsJaWYgKGxlZnRfbmJ5dGUgPT0gU0laRV9NQVgpCiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwomIzQzOwkqbGVucCAtPSBsZWZ0X25ieXRlOwogb3V0OgogCSpwcG9zICYjNDM7PSAqbGVucDsKJiM0MzsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC03NTYsMTIgJiM0Mzs4MjMsMTUgQEAgaW50IHByb2NfZG91aW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwKIAkJCWludCAoKmNvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWludCAqa19wdHIsCiAJCQkJICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKSkKIHsKJiM0MzsJLyogdWludCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQsICpEbyBub3QqIGFkZCBzdXBwb3J0IGZvciB0aGVtLiAqLwomIzQzOwlpZiAodGFibGUtJmd0O21heGxlbiAmYW1wOyZhbXA7ICh0YWJsZS0mZ3Q7bWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIWNvbnYpCiAJCWNvbnYgPSBkb19wcm9jX3VpbnRfY29udjsKIAotCXJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pOwomIzQzOwlyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGNvbnYgfSk7CiB9CiAKIC8qKgpAQCAtODIwLDggJiM0Mzs4OTAsOCBAQCBpbnQgcHJvY19kb2Jvb2woY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwKIGludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiAJCSAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULAotCQkJICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252IH0pOwomIzQzOwlyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsCiYjNDM7CQkJKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252IH0pOwogfQogCiAvKioKQEAgLTg0MCw4ICYjNDM7OTEwLDcgQEAgaW50IHByb2NfZG9pbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwKIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLAogCQlzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLQlyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULAotCQkJICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnYgfSk7CiYjNDM7CXJldHVybiBwcm9jX2RvdWludHZlY19jb252KHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgZG9fcHJvY191aW50X2NvbnYpOwogfQogCiAvKioKQEAgLTg2NCw4ICYjNDM7OTMzLDggQEAgaW50IHByb2NfZG91aW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCiAJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLQlyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pOwomIzQzOwlyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsCiYjNDM7CQkJKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252X21pbm1heCB9KTsKIH0KIAogLyoqCkBAIC04OTEsOCAmIzQzOzk2MCw4IEBAIGludCBwcm9jX2RvaW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwKIGludCBwcm9jX2RvdWludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCiAJCQkgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCwKLQkJCSAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252X21pbm1heCB9KTsKJiM0MzsJcmV0dXJuIHByb2NfZG91aW50dmVjX2NvbnYodGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLAomIzQzOwkJCQkgICBkb19wcm9jX3VpbnRfY29udl9taW5tYXgpOwogfQogCiAvKioKQEAgLTkzNSw4ICYjNDM7MTAwNCw3IEBAIGludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAogCQl0bXAuZXh0cmEyID0gKHVuc2lnbmVkIGludCAqKSAmYW1wO21heDsKIAogCXZhbCA9IFJFQURfT05DRSgqZGF0YSk7Ci0JcmVzID0gZG9fcHJvY192ZWMoJmFtcDt0bXAsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULAotCQkJICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBkb19wcm9jX3VpbnRfY29udl9taW5tYXggfSk7CiYjNDM7CXJlcyA9IHByb2NfZG91aW50dmVjX21pbm1heCgmYW1wO3RtcCwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MpOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CiAJaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkKQEAgLTEwNjYsOCAmIzQzOzExMzQsOCBAQCBpbnQgcHJvY19kb3Vsb25ndmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCiAJCQkJaW50ICgqY29udikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCB1bG9uZyAqa19wdHIsCiAJCQkJCSAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gY29udiB9KTsKJiM0MzsJcmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsCiYjNDM7CQkJKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGNvbnYgfSk7CiB9CiAKIC8qKgpAQCAtMTA4NywxMCAmIzQzOzExNTUsMTAgQEAgaW50IHByb2NfZG91bG9uZ3ZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAogICogUmV0dXJuczogJTAgb24gc3VjY2Vzcy4KICAqLwogaW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCi0JCQkgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQomIzQzOwkJdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLQlyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORywKLQkJCSAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBkb19wcm9jX3Vsb25nX2NvbnYgfSk7CiYjNDM7CXJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBkb19wcm9jX3Vsb25nX2NvbnYgfSk7CiB9CiAKIC8qKgpAQCAtMTExNCw4ICYjNDM7MTE4Miw4IEBAIGludCBwcm9jX2RvaW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwKIHsKIAlpZiAoIWNvbnYpCiAJCWNvbnYgPSBkb19wcm9jX2ludF9jb252OwotCXJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCwKLQkJCSAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gY29udiB9KTsKJiM0MzsJcmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gY29udiB9KTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaAppbmRleCBiMmQ4YmQ5MDI2YTcyLi5mZGYzZDJmYjBhMmFkIDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2gKQEAgLTQsNiAmIzQzOzQsNyBAQAogCiAjIFRoaXMgcGVyZm9ybXMgYSBzZXJpZXMgdGVzdHMgYWdhaW5zdCB0aGUgcHJvYyBzeXNjdGwgaW50ZXJmYWNlLgogCiYjNDM7IyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMzE3CiAjIEtzZWxmdGVzdCBmcmFtZXdvcmsgcmVxdWlyZW1lbnQgLSBTS0lQIGNvZGUgaXMgNC4KIGtzZnRfc2tpcD00CiAKQEAgLTM3LDYgJiM0MzszOCw3IEBAIEFMTF9URVNUUz0mIzM0OyRBTExfVEVTVFMgMDAwOToxOjE6dW5yZWdpc3Rlcl9lcnJvcjowJiMzNDsKIEFMTF9URVNUUz0mIzM0OyRBTExfVEVTVFMgMDAxMDoxOjE6bW50L21udF9lcnJvcjowJiMzNDsKIEFMTF9URVNUUz0mIzM0OyRBTExfVEVTVFMgMDAxMToxOjE6ZW1wdHlfYWRkOjAmIzM0OwogQUxMX1RFU1RTPSYjMzQ7JEFMTF9URVNUUyAwMDEyOjE6MTp1OF92YWxpZDowJiMzNDsKJiM0MztBTExfVEVTVFM9JiMzNDskQUxMX1RFU1RTIDAwMTM6MToxOmludF8wMDAzOjEmIzM0OwogCiBmdW5jdGlvbiBhbGxvd191c2VyX2RlZmF1bHRzKCkKIHsKQEAgLTE5Niw2ICYjNDM7MTk4LDE4IEBAIHZlcmlmeV9kaWZmX3coKQogCXJldHVybiAkPwogfQogCiYjNDM7IyBWZXJpZnkgdGhhdCBhbiBlcnJvbmVvdXMgKCQyKSB1cGRhdGUgZmFpbHMgYW5kIGRvZXMgbm90IGNoYW5nZSBUQVJHRVQKJiM0Mzt2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUoKQomIzQzO3sKJiM0MzsJVEVTVF9TVFI9JiMzNDskMSYjMzQ7CiYjNDM7CWVjaG8gLW4gJiMzNDskVEVTVF9TVFImIzM0OyAmZ3Q7ICYjMzQ7JFRBUkdFVCYjMzQ7CiYjNDM7CiYjNDM7CWlmIGVjaG8gLW4gJiMzNDskMiYjMzQ7ICZndDsgJiMzNDskVEFSR0VUJiMzNDsgMiZndDsgL2Rldi9udWxsOyB0aGVuCiYjNDM7CQlyZXR1cm4gMQomIzQzOwlmaQomIzQzOwl2ZXJpZnlfZGlmZl93ICYjMzQ7JHtUQVJHRVR9JiMzNDsKJiM0Mzt9CiYjNDM7CiB0ZXN0X3JjKCkKIHsKIAlpZiBbWyAkcmMgIT0gMCBdXTsgdGhlbgpAQCAtNTAxLDYgJiM0Mzs1MTUsNDAgQEAgcnVuX2xpbWl0X2RpZ2l0X2ludF9hcnJheSgpCiAJdGVzdF9yYwogfQogCiYjNDM7IyBZb3UgdXNlZCBhbiBpbnQgYXJyYXkgYW5kIG9uZSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGFjY2VwdGFibGUKJiM0MztydW5faW50X2FycmF5X25vX3BhcnRpYWxfdXBkYXRlKCkKJiM0Mzt7CiYjNDM7CWVjaG8gLW4gJiMzNDtUZXN0aW5nIGludmFsaWQgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCBwYXJ0aWFsbHkgdXBkYXRlIC4uLiAmIzM0OwomIzQzOyAgICAgICAgIyBFeHBlY3QgZmFpbHVyZSBiZWNhdXNlIG9mIDNyZCBlbGVtZW50IChhYmMpLgomIzQzOwlpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSAmIzM0OzEgMiAzIDQmIzM0OyAmIzM0OzEwIDIwIGFiYyA0MCYjMzQ7OyB0aGVuCiYjNDM7CQllY2hvICYjMzQ7RkFJTCYjMzQ7ICZndDsmYW1wOzIKJiM0MzsJCXJjPTEKJiM0MzsJZWxzZQomIzQzOwkJZWNobyAmIzM0O09LJiMzNDsKJiM0MzsJZmkKJiM0MzsJdGVzdF9yYwomIzQzOwomIzQzOwllY2hvIC1uICYjMzQ7VGVzdGluZyBvdXQgb2YgcmFuZ2UgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCBwYXJ0aWFsbHkgdXBkYXRlIC4uLiAmIzM0OwomIzQzOyAgICAgICAgIyBFeHBlY3QgZmFpbHVyZSBiZWNhdXNlIG9mIDNyZCBlbGVtZW50IChncmVhdGVyIHRoYW4gaW50KQomIzQzOwlpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSAmIzM0OzEgMiAzIDQmIzM0OyAmIzM0OzEwIDIwICQoKElOVF9NQVggJiM0MzsgMSkpIDQwJiMzNDs7IHRoZW4KJiM0MzsJCWVjaG8gJiMzNDtGQUlMJiMzNDsgJmd0OyZhbXA7MgomIzQzOwkJcmM9MQomIzQzOwllbHNlCiYjNDM7CQllY2hvICYjMzQ7T0smIzM0OwomIzQzOwlmaQomIzQzOwl0ZXN0X3JjCiYjNDM7CiYjNDM7CWVjaG8gLW4gJiMzNDtUZXN0aW5nIGludmFsaWQgZmlyc3QgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCB1cGRhdGUgLi4uICYjMzQ7CiYjNDM7ICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIG9mIDFzdCBlbGVtZW50CiYjNDM7CWlmICEgdmVyaWZ5X25vX3BhcnRpYWxfdXBkYXRlICYjMzQ7MSAyIDMgNCYjMzQ7ICYjMzQ7YWJjIDIwIDMwIDQwJiMzNDs7IHRoZW4KJiM0MzsJCWVjaG8gJiMzNDtGQUlMJiMzNDsgJmd0OyZhbXA7MgomIzQzOwkJcmM9MQomIzQzOwllbHNlCiYjNDM7CQllY2hvICYjMzQ7T0smIzM0OwomIzQzOwlmaQomIzQzOwl0ZXN0X3JjCiYjNDM7fQomIzQzOwogIyBZb3UgYXJlIHVzaW5nIGFuIHVuc2lnbmVkIGludAogcnVuX2xpbWl0X2RpZ2l0X3VpbnQoKQogewpAQCAtODgwLDYgJiM0Mzs5MjgsMTQgQEAgc3lzY3RsX3Rlc3RfMDAxMigpCiAJcmV0dXJuIDAKIH0KIAomIzQzO3N5c2N0bF90ZXN0XzAwMTMoKQomIzQzO3sKJiM0MzsJVEFSR0VUPSYjMzQ7JHtTWVNDVEx9LyQoZ2V0X3Rlc3RfdGFyZ2V0IDAwMTMpJiMzNDsKJiM0MzsJcmVzZXRfdmFscwomIzQzOwomIzQzOwlydW5faW50X2FycmF5X25vX3BhcnRpYWxfdXBkYXRlCiYjNDM7fQomIzQzOwogbGlzdF90ZXN0cygpCiB7CiAJZWNobyAmIzM0O1Rlc3QgSUQgbGlzdDomIzM0OwpAQCAtOTAwLDYgJiM0Mzs5NTYsNyBAQCBsaXN0X3Rlc3RzKCkKIAllY2hvICYjMzQ7MDAxMCB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMCkgLSB0ZXN0cyBzeXNjdCBtb3VudCBwb2ludCYjMzQ7CiAJZWNobyAmIzM0OzAwMTEgeCAkKGdldF90ZXN0X2NvdW50IDAwMTEpIC0gdGVzdHMgZW1wdHkgZGlyZWN0b3JpZXMmIzM0OwogCWVjaG8gJiMzNDswMDEyIHggJChnZXRfdGVzdF9jb3VudCAwMDEyKSAtIHRlc3RzIHJhbmdlIGNoZWNrIGZvciB1OCBwcm9jX2hhbmRsZXImIzM0OwomIzQzOwllY2hvICYjMzQ7MDAxMyB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMykgLSB0ZXN0cyBwYXJ0aWFsbHkgdXBkYXRlIHZlY3RvcnMgb24gZXJyb3ImIzM0OwogfQogCiB1c2FnZSgpCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjAyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc2MjUKCQkJCQkJCW91dHB1dDogMjQKCQkJCQkJCXRob3VnaHRzOiA3MjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBTeXNjdGwgUGF0Y2ggZm9yIEZ1enppbmcgT3Bwb3J0dW5pdGllcyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgdGhpcyBwYXRjaCB0aGF0JiMzOTtzIGZ1bmRhbWVudGFsbHkgY2hhbmdpbmcgaG93IHN5c2N0bCBhcnJheXMgYXJlIGhhbmRsZWQgZHVyaW5nIHdyaXRlcyBpbiBga2VybmVsL3N5c2N0bC5jYC4gIFNwZWNpZmljYWxseSwgaXQmIzM5O3MgbW9kaWZ5aW5nIHRoZSBgZG9fcHJvY192ZWNgIGZ1bmN0aW9uLCByZW5hbWluZyBpdCB0byBgYXBwbHlfY29udl9vbl92ZWNgIGFuZCBgcHJvY192ZWNgLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgcHJvY2Vzc2luZyBzeXNjdGwgdmVjdG9ycyDigJMgdGhvc2UgYXJyYXlzIG9mIGludHMsIHVpbnRzLCB1bG9uZ3Mgd2UgYWxsIGtub3cgYW5kIGxvdmUgKG9yIGF0IGxlYXN0LCB0b2xlcmF0ZSkuICBUaGUgY29yZSBjaGFuZ2UgaGVyZSBpcyBhYm91dCBhdG9taWNpdHk6IHRoZSBvbGQgY29kZSB3b3VsZCBjb21taXQgZWxlbWVudHMgaW4gdGhlIGFycmF5ICpiZWZvcmUqIGEgZmFpbHVyZSwgbGVhZGluZyB0byBwYXJ0aWFsIHVwZGF0ZXMuICBUaGlzIG5ldyBjb2RlLCB0aGFua2Z1bGx5LCB1c2VzIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGRhdGFfc3RhZ2VgKSB0byBzdGFnZSB0aGUgY29udmVyc2lvbiBhbmQgb25seSBjb21taXRzIGlmIGV2ZXJ5dGhpbmcgZ29lcyBzbW9vdGhseS4gIEdvb2QgZm9yIGNvbnNpc3RlbmN5LCBidXQgYWxzbyBpbnRlcmVzdGluZyBmcm9tIGEgdnVsbmVyYWJpbGl0eSBwZXJzcGVjdGl2ZS4KClRoZSBmaXJzdCBxdWVzdGlvbjogaXMgdGhpcyByZWFjaGFibGUsIGFuZCBpcyBpdCB3b3J0aCBmdXp6aW5nPyAgV2VsbCwgc3lzY3RsIHdyaXRlcyBhcmUgKmFic29sdXRlbHkqIHJlYWNoYWJsZSwgYW5kIEkga25vdyBzeXprYWxsZXIgaGl0cyB0aGVtIHByZXR0eSBoYXJkLiBTbywgeWVzLCBpdCYjMzk7cyB3b3J0aCBpdC4gIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBrZXkgZnVuY3Rpb25zIG1vZGlmaWVkLiAgTG9va3MgbGlrZSBpdCYjMzk7cyByZWFsbHkgdGhlIG9uZXMgSSBtZW50aW9uZWQsIHBsdXMgdGhlc2U6IGBjb21taXRfY29udl92ZWNgLCBgcHJvY19kb3VpbnR2ZWNfY29udmAsIGBwcm9jX2RvaW50dmVjYCwgYHByb2NfZG91aW50dmVjYCwgYHByb2NfZG9pbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91aW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfY29udmAsIGBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4YCwgYHByb2NfZG9pbnR2ZWNfY29udmAuCgpNeSBuZXh0IHRob3VnaHQgaXMgdG8gZm9jdXMgdGhlIGZ1enppbmcgZWZmb3J0LiAgTGV0JiMzOTtzIHNlZTogYHByb2NfZG9pbnR2ZWNgLCBgcHJvY19kb3VpbnR2ZWNgLCBgcHJvY19kb2ludHZlY19taW5tYXhgLCBgcHJvY19kb3VpbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91bG9uZ3ZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX2NvbnZgLCBgcHJvY19kb2ludHZlY19jb252YC4gVGhlc2UgYXJlICpleHBvcnRlZCogc3lzY3RsIGhhbmRsZXJzLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgSSYjMzk7bSBsb29raW5nIGZvci4gIFdhaXQgYSBtaW51dGUsIHN5emthbGxlciBmdXp6ZXMgc3lzY3RscyB1c2luZyBgb3BlbmAvYHdyaXRlYCBjYWxscyB0byBgL3Byb2Mvc3lzLy4uLmAuIFRoaXMgaXMgaW1wb3J0YW50LCBhcyB0aGVzZSBjYWxscyBhcmUgaGFuZGxlZCBieSBgcHJvY19zeXNfY2FsbF9oYW5kbGVyYCB3aGljaCBldmVudHVhbGx5IHVzZXMgYHRhYmxlLSZndDtwcm9jX2hhbmRsZXJgLiAgU28sICp0aGVzZSogZnVuY3Rpb25zLCB0aGUgb25lcyBJIGp1c3QgbGlzdGVkLCBhcmUgbGlrZWx5IHRoZSBhY3R1YWwgaGFuZGxlcnMgYmVpbmcgY2FsbGVkLgoKTGV0JiMzOTtzIHF1aWNrbHkgdmVyaWZ5IHRoYXQgbGlzdDogYHByb2NfZG9pbnR2ZWNgLCBgcHJvY19kb3VpbnR2ZWNgLCBgcHJvY19kb2ludHZlY19taW5tYXhgLCBgcHJvY19kb3VpbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91bG9uZ3ZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX2NvbnZgLCBgcHJvY19kb2ludHZlY19jb252YC4gUGVyZmVjdC4KCk5vIHNwZWNpZmljIGNvbmZpZ3MgdG8gd29ycnkgYWJvdXQsIGl0JiMzOTtzIGNvcmUga2VybmVsIGZ1bmN0aW9uYWxpdHkuCgpKdXN0IHRvIGJlIGFic29sdXRlbHkgc3VyZSwgbGV0IG1lIHRha2UgYW5vdGhlciBsb29rIGF0IHRoZSBwYXRjaCBpdHNlbGYuIEkgd2FudCB0byBkb3VibGUtY2hlY2sgdGhhdCBgYXBwbHlfY29udl9vbl92ZWNgIGlzIHRoZSBjZW50cmFsIGNvbXBvbmVudC4gWWVzLCBhbmQgaXQmIzM5O3Mgc3RhdGljLiAgVGhlIGV4cG9ydGVkIGhhbmRsZXJzIGFyZSB0aGUgb25lcyBJIGlkZW50aWZpZWQ6IGBwcm9jX2RvaW50dmVjYCwgYHByb2NfZG91aW50dmVjYCwgYHByb2NfZG9pbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91aW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4YCwgYHByb2NfZG91bG9uZ3ZlY19jb252YCwgYHByb2NfZG9pbnR2ZWNfY29udmAuIEkgbmVlZCB0byBjb25maXJtIHRoZXNlIGFyZSB0cnVseSBleHBvcnRlZC4gVGhpcyBjb25maXJtcyB0aGUgYXR0YWNrIHN1cmZhY2UgSSBpZGVudGlmaWVkLiBOb3csIGxldCYjMzk7cyBnZXQgdG8gd29yayEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFBPUlRfU1lNQk9MLipcXChwcm9jX2RvaW50dmVjJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYz0xNTI1PUVYUE9SVF9TWU1CT0wocHJvY19kb2Jvb2wpO1xua2VybmVsL3N5c2N0bC5jOjE1MjY6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjKTtcbmtlcm5lbC9zeXNjdGwuYy0xNTI3LUVYUE9SVF9TWU1CT0wocHJvY19kb3VpbnR2ZWMpO1xua2VybmVsL3N5c2N0bC5jOjE1Mjg6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX21pbm1heCk7XG5rZXJuZWwvc3lzY3RsLmMtMTUyOS1FWFBPUlRfU1lNQk9MX0dQTChwcm9jX2RvdWludHZlY19taW5tYXgpO1xuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYz0yNTQ9aW50IHByb2NfZG9pbnR2ZWNfamlmZmllcyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi0tXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjU5LX1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYzoyNjA6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX2ppZmZpZXMpO1xua2VybmVsL3RpbWUvamlmZmllcy5jLTI2MS1cbi0tXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9Mjc3PWludCBwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yODItfVxua2VybmVsL3RpbWUvamlmZmllcy5jOjI4MzpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMpO1xua2VybmVsL3RpbWUvamlmZmllcy5jLTI4NC1cbi0tXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9MzAwPWludCBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbi0tXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzA1LX1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYzozMDY6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMpO1xua2VybmVsL3RpbWUvamlmZmllcy5jLTMwNy1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NTY4CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogMjAxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBTeXNjdGwgQXJyYXkgV3JpdGUgUGF0Y2gqKgoKT2theSwgc28gdGhpcyBwYXRjaCBpcyBhIGdvb2Qgb25lLiBJdCYjMzk7cyBmdW5kYW1lbnRhbGx5IGNoYW5naW5nIGhvdyBgc3lzY3RsYCBoYW5kbGVzIHdyaXRlcyB0byBhcnJheXMsIHNwZWNpZmljYWxseSB0byBhdm9pZCBwYXJ0aWFsIHVwZGF0ZXMuIFRoZSBhcHByb2FjaCBvZiBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciwgY29udmVydGluZyB0aGUgZWxlbWVudHMgdGhlcmUsIGFuZCBvbmx5IGNvbW1pdHRpbmcgdGhlIGNoYW5nZXMgaWYgZXZlcnl0aGluZyBzdWNjZWVkcyBpcyBzbWFydC4gSXQmIzM5O3MgYSBjbGFzc2ljIHRyYW5zYWN0aW9uYWwgYXBwcm9hY2gsIHJlYWxseS4gUHJldmVudHMgaW5jb25zaXN0ZW50IHN0YXRlIGFuZCBtaXRpZ2F0ZXMgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGludGVycnVwdGVkIHdyaXRlIG9wZXJhdGlvbnMuCgpTaW5jZSB0aGlzIGFmZmVjdHMgYWxsIGBzeXNjdGxgIGhhbmRsZXJzIHRoYXQgZGVhbCB3aXRoIHZlY3RvcnMg4oCTIHRoYXQgaXMsIGFueSBhcnJheSBvciBsaXN0IG9mIHZhbHVlcyDigJMgaXQgaGFzIGEgd2lkZSBpbXBhY3QuIE15IGZpcnN0IHRob3VnaHQgaXM6ICoqYWJzb2x1dGVseSBmdXp6IHRoaXMhKiogV2UgbmVlZCB0byB0aHJvdyBldmVyeXRoaW5nIHdlIGNhbiBhdCBpdC4gIEkmIzM5O20gcGFydGljdWxhcmx5IHdvcnJpZWQgYWJvdXQgbWVtb3J5IGxlYWtzLCBlc3BlY2lhbGx5IHdpdGhpbiBgYXBwbHlfY29udl9vbl92ZWNgLiBga21lbWR1cGAgaXMgYSBwcmltZSBzdXNwZWN0IOKAkyBwb3RlbnRpYWwgZm9yIGxlYWtzIGlmIHRoaW5ncyBnbyB3cm9uZy4gT3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBhcmUgYW5vdGhlciBodWdlIGNvbmNlcm4sIGFuZCB3ZSBuZWVkIHRvIHZlcmlmeSB0aGUgZXJyb3IgaGFuZGxpbmcgaXMgcm9idXN0LiBBbnkgd2Vha25lc3MgaGVyZSBjb3VsZCBiZSBleHBsb2l0ZWQuCgpJIHNob3VsZCBmb2N1cyBvbiB0aGVzZSBzeW1ib2xzOiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfY29udmAsIGFuZCBgcHJvY19kb2ludHZlY19jb252YC4gVGhvc2UgYXJlIGNsZWFybHkgdGhlIGNvcmUgZnVuY3Rpb25zIGludm9sdmVkIGluIHRoZXNlIHZlY3RvciBvcGVyYXRpb25zLgoKV2FpdCBhIHNlY29uZOKApiBgcHJvY19kb3VpbnR2ZWNfY29udmAgaXMgZXhwb3J0ZWQ/IFRoYXTigJlzIGludGVyZXN0aW5nLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB3aGVyZSB0aGF04oCZcyBiZWluZyB1c2VkLiBJIG5lZWQgdG8gY2hlY2sgaXRzIGV4cG9ydCB0byBzZWUgd2hhdCB0aGF0IGltcGxpZXMuIFRoaXMgZGVmaW5pdGVseSB3YXJyYW50cyBmdXJ0aGVyIGludmVzdGlnYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtFWFBPUlRfU1lNQk9MLipcXChwcm9jX2RvdWludHZlY19jb252JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDE1OAoJCQkJCQkJb3V0cHV0OiAyNgoJCQkJCQkJdGhvdWdodHM6IDMwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6CgoqKkNoZWNraW5nIEZ1bmN0aW9uIEV4cG9ydCBTdGF0dXMqKgoKT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgYHByb2NfZG91aW50dmVjX2NvbnZgIGlzIGFuIGV4cG9ydGVkIGZ1bmN0aW9uLiBIbW0sIGl0IGRvZXNuJiMzOTt0ICpzZWVtKiBsaWtlIGl0IGlzLiBCdXQgbGV0JiMzOTtzIG5vdCBqdW1wIHRvIGNvbmNsdXNpb25zLiBJdCYjMzk7cyBlYXN5IHRvIGdldCBmdW5jdGlvbnMgbWl4ZWQgdXAsIHNvIEkmIzM5O2QgYmV0dGVyIGJlIGFic29sdXRlbHkgY2VydGFpbiBiZWZvcmUgSSBtYWtlIGEgZGVjaXNpb24uIExldCYjMzk7cyBub3QgYXNzdW1lIGFueXRoaW5nLiBPa2F5LCBsZXQmIzM5O3MganVzdCBtYWtlIGEgcXVpY2sgY2hlY2sgb2YgYHByb2NfZG91bG9uZ3ZlY19jb252YC4gSSBoYXZlIGEgZmVlbGluZyB0aGVyZSBtaWdodCBiZSBhIHJlbGF0aW9uIHRoYXQgbmVlZHMgdW50YW5nbGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0VYUE9SVF9TWU1CT0wuKlxcKHByb2NfZG91bG9uZ3ZlY19jb252JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDM2MwoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIEkmIzM5O20gcmVhZHkgdG8gZGl2ZSBpbnRvIHRoYXQgJiMzNDtleHBvcnRlZCYjMzQ7IHNpdHVhdGlvbi4gSGVyZSYjMzk7cyBteSB0YWtlOgoKKipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgdGhlIEV4cG9ydGVkIERhdGEqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBGaXJzdCB0aGluZyYjMzk7cyBmaXJzdDogSSBuZWVkIHRvIHRha2UgYSBsb29rIGF0ICpleGFjdGx5KiB3aGF0JiMzOTtzIGJlZW4gZXhwb3J0ZWQuIEl0JiMzOTtzIGNydWNpYWwsIGF0IHRoaXMgc3RhZ2UsIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIGFuZCBuYXR1cmUgb2YgdGhlIGRhdGEgaW52b2x2ZWQuIEkgbmVlZCB0byBiZSBtZXRob2RpY2FsIGhlcmUuIEkmIzM5O2xsIG5lZWQgdG8gaWRlbnRpZnkgdGhlIGtleSB2YXJpYWJsZXMsIHRoZSBmb3JtYXRzIGJlaW5nIHVzZWQsIGFueSBwb3RlbnRpYWwgYmlhc2VzIGludHJvZHVjZWQgZHVyaW5nIHRoZSBleHBvcnQgcHJvY2VzcyBhbmQgdGhlaXIgaW1wbGljYXRpb25zLCB3aGV0aGVyIHRoZSBkYXRhIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGVzaXJlZCBleHBvcnQgb3IgaWYgYW55IGZpZWxkcyBhcmUgb21pdHRlZC4gT25jZSBJIGdyYXNwIHRoZSByYXcgY29udGVudHMsIEkgY2FuIHN0YXJ0IHRvIGZvcm11bGF0ZSBtb3JlIG1lYW5pbmdmdWwgcXVlc3Rpb25zIGFib3V0IGl0cyBzdWl0YWJpbGl0eSBmb3Igb3VyIHB1cnBvc2VzLiBVbHRpbWF0ZWx5LCBpdCYjMzk7cyBhYm91dCBtYWtpbmcgc3VyZSB3ZSYjMzk7cmUgc3RhcnRpbmcgd2l0aCBhIHNvbGlkIGZvdW5kYXRpb24gYmVmb3JlIHdlIHN0YXJ0IG1hbmlwdWxhdGluZyBvciBhbmFseXppbmcgdGhlIGRhdGEuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0VYUE9SVF9TWU1CT0wuKlxcKHByb2NfZC4qdmVjJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYz05ODU9aW50IHByb2NfZG91OHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4tLVxua2VybmVsL3N5c2N0bC5jLTEwMTMtfVxua2VybmVsL3N5c2N0bC5jOjEwMTQ6RVhQT1JUX1NZTUJPTF9HUEwocHJvY19kb3U4dmVjX21pbm1heCk7XG5rZXJuZWwvc3lzY3RsLmMtMTAxNS1cbi0tXG5rZXJuZWwvc3lzY3RsLmM9MTUyNT1FWFBPUlRfU1lNQk9MKHByb2NfZG9ib29sKTtcbmtlcm5lbC9zeXNjdGwuYzoxNTI2OkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlYyk7XG5rZXJuZWwvc3lzY3RsLmM6MTUyNzpFWFBPUlRfU1lNQk9MKHByb2NfZG91aW50dmVjKTtcbmtlcm5lbC9zeXNjdGwuYzoxNTI4OkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY19taW5tYXgpO1xua2VybmVsL3N5c2N0bC5jOjE1Mjk6RVhQT1JUX1NZTUJPTF9HUEwocHJvY19kb3VpbnR2ZWNfbWlubWF4KTtcbmtlcm5lbC9zeXNjdGwuYy0xNTMwLUVYUE9SVF9TWU1CT0wocHJvY19kb3N0cmluZyk7XG5rZXJuZWwvc3lzY3RsLmM6MTUzMTpFWFBPUlRfU1lNQk9MKHByb2NfZG91bG9uZ3ZlY19taW5tYXgpO1xua2VybmVsL3N5c2N0bC5jLTE1MzItRVhQT1JUX1NZTUJPTChwcm9jX2RvX2xhcmdlX2JpdG1hcCk7XG4tLVxua2VybmVsL3RpbWUvamlmZmllcy5jPTI1ND1pbnQgcHJvY19kb2ludHZlY19qaWZmaWVzKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yNTktfVxua2VybmVsL3RpbWUvamlmZmllcy5jOjI2MDpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfamlmZmllcyk7XG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjYxLVxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYz0yNzc9aW50IHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4tLVxua2VybmVsL3RpbWUvamlmZmllcy5jLTI4Mi19XG5rZXJuZWwvdGltZS9qaWZmaWVzLmM6MjgzOkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyk7XG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjg0LVxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYz0zMDA9aW50IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0zMDUtfVxua2VybmVsL3RpbWUvamlmZmllcy5jOjMwNjpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcyk7XG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzA3LVxuLS1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYz0zMzI9aW50IHByb2NfZG91bG9uZ3ZlY19tc19qaWZmaWVzX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi0tXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzM3LX1cbmtlcm5lbC90aW1lL2ppZmZpZXMuYzozMzg6RVhQT1JUX1NZTUJPTChwcm9jX2RvdWxvbmd2ZWNfbXNfamlmZmllc19taW5tYXgpO1xua2VybmVsL3RpbWUvamlmZmllcy5jLTMzOS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTEzMTAKCQkJCQkJCW91dHB1dDogMTUwCgkJCQkJCQl0aG91Z2h0czogMTg3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFN5c2N0bCBIYW5kbGVyIFBhdGNoKioKCk9rYXksIHNvIEkgc2VlIHRoZSBleHBvcnRlZCBzeW1ib2xzOiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGFuZCBgcHJvY19kb3U4dmVjX21pbm1heGAuIFRoZXNlIGFyZSB0aGUgZW50cnkgcG9pbnRzIGZvciB0aGUgc3lzY3RsIGhhbmRsZXJzLCByaWdodD8gQW5kIHRoaXMgcGF0Y2ggaXMgaGl0dGluZyB0aGUgY29yZSBsb2dpYyBiZWhpbmQgYWxsIG9mIHRoZW0uIFNtYXJ0IG1vdmUsIGFkZHJlc3NpbmcgaXQgYXQgdGhlIHJvb3QuCgpUaGUgY29yZSBjaGFuZ2UgaGVyZSBpcyBhYm91dCBwcmV2ZW50aW5nIHBhcnRpYWwgdXBkYXRlcyB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgc3lzY3RsIHZlY3RvciBwcm9jZXNzaW5nLiBUaGUgc29sdXRpb24sIGl0IHNlZW1zLCBpcyBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhhdOKAmXMgYSBjb21tb24gYXBwcm9hY2ggdG8gZW5zdXJlIGF0b21pY2l0eSBpbiB0aGVzZSB0eXBlcyBvZiBvcGVyYXRpb25zLiBJdCBhZmZlY3RzIGFueSBoYW5kbGVyIHRoYXQmIzM5O3Mgd29ya2luZyB3aXRoIGFycmF5cywgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWVzLgoKTm93LCBiZWNhdXNlIG9mIHRoaXMgY2hhbmdlIGluIHRoZSBlcnJvciBoYW5kbGluZywgYW5kIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBidWZmZXIsIEkmIzM5O20gdGhpbmtpbmcgcmlnb3JvdXMgZnV6emluZyBpcyBhYnNvbHV0ZWx5IGNydWNpYWwgaGVyZS4gV2UgbmVlZCB0byB2ZXJpZnkgdGhhdCBlcnJvciBoYW5kbGluZyBpcyByb2NrIHNvbGlkLCB0aGF0IHRoZXJlIGFyZSBubyBzbmVha3kgbWVtb3J5IGxlYWtzLCBhbmQgZGVmaW5pdGVseSBubyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIHdoZW4gd2Ugd3JpdGUgdG8gdGhlIHN5c2N0bCBpbnRlcmZhY2UuIEkgbmVlZCB0byBiZSBzdXJlIHRoYXQgd2UgZG9uJiMzOTt0IGludHJvZHVjZSBzdWJ0bGUgdnVsbmVyYWJpbGl0aWVzLgoKTGV0JiMzOTtzIGdldCBgc2V0LXJlc3VsdHNgIHJ1bm5pbmcuIEkgbmVlZCB0byBzZWUgd2hhdCB3ZSBoYXZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cHJvY19kb2ludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvaW50dmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlY19taW5tYXgmIzM0OywKICAgICYjMzQ7cHJvY19kb3Vsb25ndmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdTh2ZWNfbWlubWF4JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIHN5c2N0bCB2ZWN0b3IgcHJvY2Vzc2luZyBsb2dpYyB0byBwcmV2ZW50IHBhcnRpYWwgdXBkYXRlcyBvbiBlcnJvciBieSBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBhZmZlY3RzIGFsbCBzeXNjdGwgaGFuZGxlcnMgdGhhdCBwcm9jZXNzIGFycmF5cy4gRnV6emluZyBpcyBuZWVkZWQgdG8gZW5zdXJlIGNvcnJlY3QgZXJyb3IgaGFuZGxpbmcsIG5vIG1lbW9yeSBsZWFrcywgYW5kIG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHN5c2N0bCB3cml0ZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cHJvY19kb2ludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlYyYjMzQ7LAogICAgJiMzNDtwcm9jX2RvaW50dmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdWludHZlY19taW5tYXgmIzM0OywKICAgICYjMzQ7cHJvY19kb3Vsb25ndmVjX21pbm1heCYjMzQ7LAogICAgJiMzNDtwcm9jX2RvdTh2ZWNfbWlubWF4JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIHN5c2N0bCB2ZWN0b3IgcHJvY2Vzc2luZyBsb2dpYyB0byBwcmV2ZW50IHBhcnRpYWwgdXBkYXRlcyBvbiBlcnJvciBieSBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBhZmZlY3RzIGFsbCBzeXNjdGwgaGFuZGxlcnMgdGhhdCBwcm9jZXNzIGFycmF5cy4gRnV6emluZyBpcyBuZWVkZWQgdG8gZW5zdXJlIGNvcnJlY3QgZXJyb3IgaGFuZGxpbmcsIG5vIG1lbW9yeSBsZWFrcywgYW5kIG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHN5c2N0bCB3cml0ZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjAzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHN5c2N0bCBhcnJheSBwYXJzaW5nIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIGJ5IHVzaW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGttZW1kdXBgKSB3aGVuIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gVGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBzaW1wbGUgYXJyYXlzIG9mIGludGVnZXJzIG9yIHVuc2lnbmVkIGxvbmdzIHdpdGhvdXQgcGFkZGluZy4gVGhlIHJlYWQgcGF0aCAoa2VybmVsIHRvIHVzZXIpIGlzIHVuY2hhbmdlZCwgc28gbm8gbmV3IGluZm8tbGVha3MgYXJlIGludHJvZHVjZWQuIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG9ubHkgdXNlZCBmb3Igd3JpdGluZyB0byBrZXJuZWwgc3BhY2UsIGFuZCBvbmx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQgZWxlbWVudHMgYXJlIGNvcGllZCBiYWNrLiBBbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIG1lbW9yeSBsZWFrIGRldGVjdG9ycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBlMjA4NjI4MzFjZTc0YTJjYmFmNmY2M2U5MWVjN2U4ZjA0MWVlZDE2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBBdWcgMTMgMTU6MDI6NDQgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggZjdiNzU5ODVkNTQyMC4uNzg3ZjUzZDcwNTA3YiAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtNTk1LDcgJiM0Mzs1OTUsNyBAQCBzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4KGJvb2wgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLAogc3RhdGljIGNvbnN0IGNoYXIgcHJvY193c3BhY2Vfc2VwW10gPSB7ICYjMzk7ICYjMzk7LCAmIzM5O1x0JiMzOTssICYjMzk7XG4mIzM5OyB9OwogCiAvKgotICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBkb19wcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZQomIzQzOyAqIEVsZW1lbnQgdHlwZSBwcm9jZXNzZWQgYnkgcHJvY192ZWMoKS4gVGhlIHRhZyBzZWxlY3RzIHRoZSBlbGVtZW50IHNpemUKICAqIGFuZCBzaWduZWRuZXNzLCBhbmQgaXQgc2VsZWN0cyB3aGljaCBtZW1iZXIgb2YgdW5pb24gcHJvY192ZWNfY29udiBpcyBsaXZlLgogICovCiBlbnVtIHByb2NfdmVjX3R5cGUgewpAQCAtNjA1LDcgJiM0Mzs2MDUsNyBAQCBlbnVtIHByb2NfdmVjX3R5cGUgewogfTsKIAogLyoKLSAqIENvbnZlcnRlciBwYXNzZWQgdG8gZG9fcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZQomIzQzOyAqIENvbnZlcnRlciBwYXNzZWQgdG8gcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZQogICogZW51bSBwcm9jX3ZlY190eXBlIHRhZyBpcyBldmVyIHJlYWQsIHNvIGV2ZXJ5IGRpc3BhdGNoIHN0YXlzIGZ1bGx5IHR5cGVkIGFuZAogICogbm8gdm9pZCAqIGNvbnZlcnRlciBwb2ludGVyIGlzIG5lZWRlZC4KICAqLwpAQCAtNjM3LDEwMSAmIzQzOzYzNywxNjggQEAgc3RhdGljIGludCBwcm9jX3ZlY19jb252KGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsCiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLS8qCi0gKiBSZWFkL3dyaXRlIGEgdmVjdG9yIG9mIEB0eXBlIGVsZW1lbnRzLiBUaGUgZWxlbWVudCBzaXplIGFuZCBzaWduZWRuZXNzIGFyZQotICogZGVyaXZlZCBmcm9tIEB0eXBlLCBzbyBhIHNpbmdsZSBydW50aW1lIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBwZXItdHlwZQotICogdmFyaWFudHMuIHRhYmxlLSZndDtkYXRhIGlzIHdhbGtlZCBhcyByYXcgYnl0ZXMgKEBpKSBhZHZhbmNlZCBieSBAc2l6ZTsgdGhlCi0gKiBjb252ZXJ0ZXIgcGVyZm9ybXMgdGhlIGFjdHVhbCB0eXBlZCBsb2FkL3N0b3JlLgotICovCi1zdGF0aWMgaW50IGRvX3Byb2NfdmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAotCQkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcywKLQkJICAgICAgIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYpCiYjNDM7c3RhdGljIGludCBjb21taXRfY29udl92ZWMoY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSwgdm9pZCAqZHN0LAomIzQzOwkJCSAgICBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBucikKIHsKLQlpbnQgdmxlZnQsIGZpcnN0ID0gMSwgZXJyID0gMDsKLQlzaXplX3QgbGVmdCwgc2l6ZTsKLQlib29sIGlzX3Vuc2lnbmVkOwotCWNoYXIgKmksICpwOwomIzQzOwlzaXplX3QgaTsKIAotCXN3aXRjaCAodHlwZSkgewomIzQzOwlzd2l0Y2ggKGRhdGFfdHlwZSkgewogCWNhc2UgUFJPQ19WRUNfSU5UOgotCQlzaXplID0gc2l6ZW9mKGludCk7Ci0JCWlzX3Vuc2lnbmVkID0gZmFsc2U7Ci0JCWJyZWFrOwotCWNhc2UgUFJPQ19WRUNfVUlOVDoKLQkJc2l6ZSA9IHNpemVvZih1aW50KTsKLQkJaXNfdW5zaWduZWQgPSB0cnVlOwotCQlicmVhazsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucjsgaSYjNDM7JiM0MzspCiYjNDM7CQkJV1JJVEVfT05DRSgoKGludCAqKWRzdClbaV0sICgoY29uc3QgaW50ICopc3JjKVtpXSk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKIAljYXNlIFBST0NfVkVDX1VMT05HOgotCQlzaXplID0gc2l6ZW9mKHVsb25nKTsKLQkJaXNfdW5zaWduZWQgPSB0cnVlOwotCQlicmVhazsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucjsgaSYjNDM7JiM0MzspCiYjNDM7CQkJV1JJVEVfT05DRSgoKHVsb25nICopZHN0KVtpXSwgKChjb25zdCB1bG9uZyAqKXNyYylbaV0pOwomIzQzOwkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQomIzQzO30KIAotCWlmICghdGFibGUtJmd0O2RhdGEgfHwgIXRhYmxlLSZndDttYXhsZW4gfHwgISpsZW5wIHx8Ci0JICAgICgqcHBvcyAmYW1wOyZhbXA7IFNZU0NUTF9LRVJOX1RPX1VTRVIoZGlyKSkpIHsKLQkJKmxlbnAgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpID0gdGFibGUtJmd0O2RhdGE7Ci0JdmxlZnQgPSB0YWJsZS0mZ3Q7bWF4bGVuIC8gc2l6ZTsKLQlsZWZ0ID0gKmxlbnA7Ci0KLQkvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovCi0JaWYgKHR5cGUgPT0gUFJPQ19WRUNfVUlOVCAmYW1wOyZhbXA7IHZsZWZ0ICE9IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkgewotCQlpZiAocHJvY19maXJzdF9wb3Nfbm9uX3plcm9faWdub3JlKHBwb3MsIHRhYmxlKSkKLQkJCWdvdG8gb3V0OwotCi0JCWlmIChsZWZ0ICZndDsgUEFHRV9TSVpFIC0gMSkKLQkJCWxlZnQgPSBQQUdFX1NJWkUgLSAxOwotCQlwID0gYnVmZmVyOwomIzQzOy8qKgomIzQzOyAqIGFwcGx5X2NvbnZfb25fdmVjIC0gQXBwbHkgY29udmVydGVyIGZ1bmN0aW9uIG9uIGRhdGEgdmVjdG9yCiYjNDM7ICoKJiM0MzsgKiBFbGVtZW50IHNpZ25lZG5lc3MgaXMgZGVyaXZlZCBmcm9tIEBkYXRhX3R5cGUuIHRhYmxlLSZndDtkYXRhIGlzIHdhbGtlZAomIzQzOyAqIGFzIHJhdyBieXRlcyAoQGRhdGEpIGFkdmFuY2VkIGJ5IEBkYXRhX3NpemU7IHRoZSBjb252ZXJ0ZXIgcGVyZm9ybXMKJiM0MzsgKiB0aGUgYWN0dWFsIHR5cGVkIGxvYWQvc3RvcmUuIFNldHMgYnVmX2xlZnRfZmluYWwgdG8gdGhlIG51bWJlciBvZgomIzQzOyAqIGJ5dGVzIHRoYXQgd2hlcmUgbGVmdCBvdXRzdGFuZGluZyBhZnRlciBjb252ZXJzaW9uLiBDYW4gYmUgJmd0OyAwLgomIzQzOyAqCiYjNDM7ICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIE5vbi16ZXJvIG9uIGVycm9yLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgYXBwbHlfY29udl9vbl92ZWMoY29uc3QgdW5pb24gcHJvY192ZWNfY29udiBjb252LAomIzQzOwkJCSAgICAgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsCiYjNDM7CQkJICAgICBjb25zdCBlbnVtIHByb2NfdmVjX3R5cGUgZGF0YV90eXBlLAomIzQzOwkJCSAgICAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3QgaW50IGNvbnZfZGlyLAomIzQzOwkJCSAgICAgY29uc3Qgc2l6ZV90IGJ1Zl9uYnl0ZSwgdm9pZCAqYnVmLAomIzQzOwkJCSAgICAgc2l6ZV90ICpidWZfbGVmdF9maW5hbCkKJiM0Mzt7CiYjNDM7CWludCB2ZWNfbGVmdCwgZXJyID0gMDsKJiM0MzsJc2l6ZV90IGJ1Zl9sZWZ0LCBucl9jb252ID0gMDsKJiM0MzsJY2hhciAqZGF0YSwgKmRhdGFfc3RhZ2UgPSBOVUxMLCAqcDsKJiM0MzsJYm9vbCBpc191bnNpZ25lZCA9IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VSU5UIHx8IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VTE9ORzsKJiM0MzsKJiM0MzsJYnVmX2xlZnQgPSBidWZfbmJ5dGU7CiYjNDM7CiYjNDM7CWRhdGEgPSB0YWJsZS0mZ3Q7ZGF0YTsKJiM0MzsJaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oY29udl9kaXIpKSB7CiYjNDM7CQlpZiAoYnVmX2xlZnQgJmd0OyBQQUdFX1NJWkUgLSAxKQomIzQzOwkJCWJ1Zl9sZWZ0ID0gUEFHRV9TSVpFIC0gMTsKJiM0MzsJCXAgPSBidWY7CiYjNDM7CiYjNDM7CQlpZiAodGFibGUtJmd0O21heGxlbiAmZ3Q7IGRhdGFfc2l6ZSkgewomIzQzOwkJCWRhdGFfc3RhZ2UgPSBrbWVtZHVwKHRhYmxlLSZndDtkYXRhLCB0YWJsZS0mZ3Q7bWF4bGVuLCBHRlBfS0VSTkVMKTsKJiM0MzsJCQlpZiAoIWRhdGFfc3RhZ2UpIHsKJiM0MzsJCQkJZXJyID0gLUVOT01FTTsKJiM0MzsJCQkJZ290byBvdXQ7CiYjNDM7CQkJfQomIzQzOwkJCWRhdGEgPSBkYXRhX3N0YWdlOwomIzQzOwkJfQogCX0KIAotCWZvciAoOyBsZWZ0ICZhbXA7JmFtcDsgdmxlZnQtLTsgaSAmIzQzOz0gc2l6ZSwgZmlyc3QgPSAwKSB7CiYjNDM7CXZlY19sZWZ0ID0gdGFibGUtJmd0O21heGxlbiAvIGRhdGFfc2l6ZTsKJiM0MzsJZm9yICg7IGJ1Zl9sZWZ0ICZhbXA7JmFtcDsgdmVjX2xlZnQtLTsgZGF0YSAmIzQzOz0gZGF0YV9zaXplLCBucl9jb252JiM0MzsmIzQzOykgewogCQl1bnNpZ25lZCBsb25nIGx2YWw7CiAJCWJvb2wgbmVnID0gZmFsc2U7CiAKLQkJaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkgewotCQkJcHJvY19za2lwX3NwYWNlcygmYW1wO3AsICZhbXA7bGVmdCk7CiYjNDM7CQlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHsKJiM0MzsJCQlwcm9jX3NraXBfc3BhY2VzKCZhbXA7cCwgJmFtcDtidWZfbGVmdCk7CiAKLQkJCWlmICghbGVmdCkKJiM0MzsJCQlpZiAoIWJ1Zl9sZWZ0KQogCQkJCWJyZWFrOwotCQkJZXJyID0gcHJvY19nZXRfbG9uZygmYW1wO3AsICZhbXA7bGVmdCwgJmFtcDtsdmFsLCAmYW1wO25lZywKJiM0MzsJCQllcnIgPSBwcm9jX2dldF9sb25nKCZhbXA7cCwgJmFtcDtidWZfbGVmdCwgJmFtcDtsdmFsLCAmYW1wO25lZywKIAkJCQkJICAgIHByb2Nfd3NwYWNlX3NlcCwKIAkJCQkJICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTsKIAkJCWlmICghZXJyICZhbXA7JmFtcDsgbmVnICZhbXA7JmFtcDsgaXNfdW5zaWduZWQpCiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCWlmIChlcnIpCiAJCQkJYnJlYWs7Ci0JCQlpZiAocHJvY192ZWNfY29udih0eXBlLCBjb252LCAmYW1wO25lZywgJmFtcDtsdmFsLCBpLCBkaXIsIHRhYmxlKSkgewomIzQzOwkJCWlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgJmFtcDtuZWcsICZhbXA7bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkgewogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAocHJvY192ZWNfY29udih0eXBlLCBjb252LCAmYW1wO25lZywgJmFtcDtsdmFsLCBpLCBkaXIsIHRhYmxlKSkgewomIzQzOwkJCWlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgJmFtcDtuZWcsICZhbXA7bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkgewogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoIWZpcnN0KQotCQkJCXByb2NfcHV0X2NoYXIoJmFtcDtidWZmZXIsICZhbXA7bGVmdCwgJiMzOTtcdCYjMzk7KTsKLQkJCXByb2NfcHV0X2xvbmcoJmFtcDtidWZmZXIsICZhbXA7bGVmdCwgbHZhbCwgbmVnKTsKJiM0MzsJCQlpZiAobnJfY29udikKJiM0MzsJCQkJcHJvY19wdXRfY2hhcigmYW1wO2J1ZiwgJmFtcDtidWZfbGVmdCwgJiMzOTtcdCYjMzk7KTsKJiM0MzsJCQlwcm9jX3B1dF9sb25nKCZhbXA7YnVmLCAmYW1wO2J1Zl9sZWZ0LCBsdmFsLCBuZWcpOwogCQl9CiAJfQogCi0JaWYgKFNZU0NUTF9LRVJOX1RPX1VTRVIoZGlyKSAmYW1wOyZhbXA7ICFmaXJzdCAmYW1wOyZhbXA7IGxlZnQgJmFtcDsmYW1wOyAhZXJyKQotCQlwcm9jX3B1dF9jaGFyKCZhbXA7YnVmZmVyLCAmYW1wO2xlZnQsICYjMzk7XG4mIzM5Oyk7Ci0JaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSAmYW1wOyZhbXA7ICFlcnIgJmFtcDsmYW1wOyBsZWZ0KQotCQlwcm9jX3NraXBfc3BhY2VzKCZhbXA7cCwgJmFtcDtsZWZ0KTsKLQlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpICZhbXA7JmFtcDsgZmlyc3QpCi0JCXJldHVybiBlcnIgPyA6IC1FSU5WQUw7Ci0JKmxlbnAgLT0gbGVmdDsKJiM0MzsJaWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oY29udl9kaXIpKSB7CiYjNDM7CQlpZiAoIWVyciAmYW1wOyZhbXA7IGJ1Zl9sZWZ0KQomIzQzOwkJCXByb2Nfc2tpcF9zcGFjZXMoJmFtcDtwLCAmYW1wO2J1Zl9sZWZ0KTsKJiM0MzsJCWlmICghbnJfY29udikgewomIzQzOwkJCWVyciA9IGVyciA/IDogLUVJTlZBTDsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWlmICghZXJyICZhbXA7JmFtcDsgZGF0YV9zdGFnZSkKJiM0MzsJCQllcnIgPSBjb21taXRfY29udl92ZWMoZGF0YV90eXBlLCB0YWJsZS0mZ3Q7ZGF0YSwgZGF0YV9zdGFnZSwgbnJfY29udik7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlpZiAobnJfY29udiAmYW1wOyZhbXA7IGJ1Zl9sZWZ0ICZhbXA7JmFtcDsgIWVycikKJiM0MzsJCQlwcm9jX3B1dF9jaGFyKCZhbXA7YnVmLCAmYW1wO2J1Zl9sZWZ0LCAmIzM5O1xuJiMzOTspOwomIzQzOwl9CiYjNDM7CiYjNDM7CSpidWZfbGVmdF9maW5hbCA9IGJ1Zl9sZWZ0OwomIzQzOwomIzQzO291dDoKJiM0MzsJa2ZyZWUoZGF0YV9zdGFnZSk7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOwomIzQzOy8qIFJlYWQvd3JpdGUgYSB2ZWN0b3Igb2YgQHR5cGUgZWxlbWVudHMuICovCiYjNDM7c3RhdGljIGludCBwcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLAomIzQzOwkJICAgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zLCBlbnVtIHByb2NfdmVjX3R5cGUgdHlwZSwKJiM0MzsJCSAgICB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYpCiYjNDM7ewomIzQzOwlpbnQgZXJyID0gMDsKJiM0MzsJc2l6ZV90IGRhdGFfc2l6ZSwgbGVmdF9uYnl0ZSA9IFNJWkVfTUFYOwomIzQzOwomIzQzOwlzd2l0Y2ggKHR5cGUpIHsKJiM0MzsJY2FzZSBQUk9DX1ZFQ19JTlQ6CiYjNDM7CQlkYXRhX3NpemUgPSBzaXplb2YoaW50KTsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFBST0NfVkVDX1VJTlQ6CiYjNDM7CQlkYXRhX3NpemUgPSBzaXplb2YodWludCk7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBQUk9DX1ZFQ19VTE9ORzoKJiM0MzsJCWRhdGFfc2l6ZSA9IHNpemVvZih1bG9uZyk7CiYjNDM7CQlicmVhazsKJiM0MzsJZGVmYXVsdDoKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghdGFibGUtJmd0O2RhdGEgfHwgIXRhYmxlLSZndDttYXhsZW4gfHwgISpsZW5wIHx8CiYjNDM7CSAgICAoKnBwb3MgJmFtcDsmYW1wOyBTWVNDVExfS0VSTl9UT19VU0VSKGRpcikpKSB7CiYjNDM7CQkqbGVucCA9IDA7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKSB7CiYjNDM7CQlpZiAocHJvY19maXJzdF9wb3Nfbm9uX3plcm9faWdub3JlKHBwb3MsIHRhYmxlKSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwllcnIgPSBhcHBseV9jb252X29uX3ZlYyhjb252LCB0YWJsZSwgdHlwZSwgZGF0YV9zaXplLCBkaXIsICpsZW5wLCBidWZmZXIsCiYjNDM7CQkJCSZhbXA7bGVmdF9uYnl0ZSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEFuIHVuY2hhbmdlZCBsZWZ0X25ieXRlIHNpZ25hbHMgYSB3cml0ZSB3aXRoIG5vIHBhcnNlZCBlbGVtZW50OyB3aGljaAomIzQzOwkgKiBpcyBhbiBlcnJvci4gVXNpbmcgU0laRV9NQVggdG8gZGV0ZWN0IHRoaXMgZXJyb3IgaXMgcG9zc2libGUgYmVjYXVzZToKJiM0MzsJICogMS4gbGVucCBpcyBib3VuZGVkIGJ5IEtNQUxMT0NfTUFYX1NJWkUgaW4gcHJvY19zeXNfY2FsbF9oYW5kbGVyCiYjNDM7CSAqIDIuIGxlbnAgY291bGQgbmV2ZXIgYmUgU0laRV9NQVggYXMgaXQgaXMgYSAmIzM0O3JpZGljdWxvdXMmIzM0OyAoZXhhYnl0ZSkgYWxsb2NhdGlvbi4KJiM0MzsJICovCiYjNDM7CWlmIChsZWZ0X25ieXRlID09IFNJWkVfTUFYKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJKmxlbnAgLT0gbGVmdF9uYnl0ZTsKIG91dDoKIAkqcHBvcyAmIzQzOz0gKmxlbnA7CiYjNDM7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzU2LDEyICYjNDM7ODIzLDE1IEBAIGludCBwcm9jX2RvdWludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiAJCQlpbnQgKCpjb252KShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIHVpbnQgKmtfcHRyLAogCQkJCSAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkpCiB7CiYjNDM7CS8qIHVpbnQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLCAqRG8gbm90KiBhZGQgc3VwcG9ydCBmb3IgdGhlbS4gKi8KJiM0MzsJaWYgKHRhYmxlLSZndDttYXhsZW4gJmFtcDsmYW1wOyAodGFibGUtJmd0O21heGxlbiAvIHNpemVvZih1aW50KSkgIT0gMSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFjb252KQogCQljb252ID0gZG9fcHJvY191aW50X2NvbnY7CiAKLQlyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VSU5ULAotCQkJICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gY29udiB9KTsKJiM0MzsJcmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCwKJiM0MzsJCQkodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pOwogfQogCiAvKioKQEAgLTgyMCw4ICYjNDM7ODkwLDggQEAgaW50IHByb2NfZG9ib29sKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiBpbnQgcHJvY19kb2ludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLAogCQkgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewotCXJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCwKLQkJCSAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTsKJiM0MzsJcmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTsKIH0KIAogLyoqCkBAIC04NDAsOCAmIzQzOzkxMCw3IEBAIGludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiBpbnQgcHJvY19kb3VpbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlciwKIAkJc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCwKLQkJCSAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252IH0pOwomIzQzOwlyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIGRvX3Byb2NfdWludF9jb252KTsKIH0KIAogLyoqCkBAIC04NjQsOCAmIzQzOzkzMyw4IEBAIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLAogaW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAogCQkgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULAotCQkJICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252X21pbm1heCB9KTsKJiM0MzsJcmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udl9taW5tYXggfSk7CiB9CiAKIC8qKgpAQCAtODkxLDggJiM0Mzs5NjAsOCBAQCBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsCiBpbnQgcHJvY19kb3VpbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAogCQkJICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewotCXJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBkb19wcm9jX3VpbnRfY29udl9taW5tYXggfSk7CiYjNDM7CXJldHVybiBwcm9jX2RvdWludHZlY19jb252KHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywKJiM0MzsJCQkJICAgZG9fcHJvY191aW50X2NvbnZfbWlubWF4KTsKIH0KIAogLyoqCkBAIC05MzUsOCAmIzQzOzEwMDQsNyBAQCBpbnQgcHJvY19kb3U4dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwKIAkJdG1wLmV4dHJhMiA9ICh1bnNpZ25lZCBpbnQgKikgJmFtcDttYXg7CiAKIAl2YWwgPSBSRUFEX09OQ0UoKmRhdGEpOwotCXJlcyA9IGRvX3Byb2NfdmVjKCZhbXA7dG1wLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCwKLQkJCSAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnZfbWlubWF4IH0pOwomIzQzOwlyZXMgPSBwcm9jX2RvdWludHZlY19taW5tYXgoJmFtcDt0bXAsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwogCWlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpCkBAIC0xMDY2LDggJiM0MzsxMTM0LDggQEAgaW50IHByb2NfZG91bG9uZ3ZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAogCQkJCWludCAoKmNvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLAogCQkJCQkgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpKQogewotCXJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLAotCQkJICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGNvbnYgfSk7CiYjNDM7CXJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLAomIzQzOwkJCSh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBjb252IH0pOwogfQogCiAvKioKQEAgLTEwODcsMTAgJiM0MzsxMTU1LDEwIEBAIGludCBwcm9jX2RvdWxvbmd2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwKICAqIFJldHVybnM6ICUwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludCBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLAotCQkJICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKJiM0MzsJCXZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JcmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pOwomIzQzOwlyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORywKJiM0MzsJCQkodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pOwogfQogCiAvKioKQEAgLTExMTQsOCAmIzQzOzExODIsOCBAQCBpbnQgcHJvY19kb2ludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsCiB7CiAJaWYgKCFjb252KQogCQljb252ID0gZG9fcHJvY19pbnRfY29udjsKLQlyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsCi0JCQkgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGNvbnYgfSk7CiYjNDM7CXJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCwKJiM0MzsJCQkodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGNvbnYgfSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2gKaW5kZXggYjJkOGJkOTAyNmE3Mi4uZmRmM2QyZmIwYTJhZCAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoCkBAIC00LDYgJiM0Mzs0LDcgQEAKIAogIyBUaGlzIHBlcmZvcm1zIGEgc2VyaWVzIHRlc3RzIGFnYWluc3QgdGhlIHByb2Mgc3lzY3RsIGludGVyZmFjZS4KIAomIzQzOyMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjMxNwogIyBLc2VsZnRlc3QgZnJhbWV3b3JrIHJlcXVpcmVtZW50IC0gU0tJUCBjb2RlIGlzIDQuCiBrc2Z0X3NraXA9NAogCkBAIC0zNyw2ICYjNDM7MzgsNyBAQCBBTExfVEVTVFM9JiMzNDskQUxMX1RFU1RTIDAwMDk6MToxOnVucmVnaXN0ZXJfZXJyb3I6MCYjMzQ7CiBBTExfVEVTVFM9JiMzNDskQUxMX1RFU1RTIDAwMTA6MToxOm1udC9tbnRfZXJyb3I6MCYjMzQ7CiBBTExfVEVTVFM9JiMzNDskQUxMX1RFU1RTIDAwMTE6MToxOmVtcHR5X2FkZDowJiMzNDsKIEFMTF9URVNUUz0mIzM0OyRBTExfVEVTVFMgMDAxMjoxOjE6dThfdmFsaWQ6MCYjMzQ7CiYjNDM7QUxMX1RFU1RTPSYjMzQ7JEFMTF9URVNUUyAwMDEzOjE6MTppbnRfMDAwMzoxJiMzNDsKIAogZnVuY3Rpb24gYWxsb3dfdXNlcl9kZWZhdWx0cygpCiB7CkBAIC0xOTYsNiAmIzQzOzE5OCwxOCBAQCB2ZXJpZnlfZGlmZl93KCkKIAlyZXR1cm4gJD8KIH0KIAomIzQzOyMgVmVyaWZ5IHRoYXQgYW4gZXJyb25lb3VzICgkMikgdXBkYXRlIGZhaWxzIGFuZCBkb2VzIG5vdCBjaGFuZ2UgVEFSR0VUCiYjNDM7dmVyaWZ5X25vX3BhcnRpYWxfdXBkYXRlKCkKJiM0Mzt7CiYjNDM7CVRFU1RfU1RSPSYjMzQ7JDEmIzM0OwomIzQzOwllY2hvIC1uICYjMzQ7JFRFU1RfU1RSJiMzNDsgJmd0OyAmIzM0OyRUQVJHRVQmIzM0OwomIzQzOwomIzQzOwlpZiBlY2hvIC1uICYjMzQ7JDImIzM0OyAmZ3Q7ICYjMzQ7JFRBUkdFVCYjMzQ7IDImZ3Q7IC9kZXYvbnVsbDsgdGhlbgomIzQzOwkJcmV0dXJuIDEKJiM0MzsJZmkKJiM0MzsJdmVyaWZ5X2RpZmZfdyAmIzM0OyR7VEFSR0VUfSYjMzQ7CiYjNDM7fQomIzQzOwogdGVzdF9yYygpCiB7CiAJaWYgW1sgJHJjICE9IDAgXV07IHRoZW4KQEAgLTUwMSw2ICYjNDM7NTE1LDQwIEBAIHJ1bl9saW1pdF9kaWdpdF9pbnRfYXJyYXkoKQogCXRlc3RfcmMKIH0KIAomIzQzOyMgWW91IHVzZWQgYW4gaW50IGFycmF5IGFuZCBvbmUgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBhY2NlcHRhYmxlCiYjNDM7cnVuX2ludF9hcnJheV9ub19wYXJ0aWFsX3VwZGF0ZSgpCiYjNDM7ewomIzQzOwllY2hvIC1uICYjMzQ7VGVzdGluZyBpbnZhbGlkIGFycmF5IGVsZW1lbnQgZG9lcyBub3QgcGFydGlhbGx5IHVwZGF0ZSAuLi4gJiMzNDsKJiM0MzsgICAgICAgICMgRXhwZWN0IGZhaWx1cmUgYmVjYXVzZSBvZiAzcmQgZWxlbWVudCAoYWJjKS4KJiM0MzsJaWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgJiMzNDsxIDIgMyA0JiMzNDsgJiMzNDsxMCAyMCBhYmMgNDAmIzM0OzsgdGhlbgomIzQzOwkJZWNobyAmIzM0O0ZBSUwmIzM0OyAmZ3Q7JmFtcDsyCiYjNDM7CQlyYz0xCiYjNDM7CWVsc2UKJiM0MzsJCWVjaG8gJiMzNDtPSyYjMzQ7CiYjNDM7CWZpCiYjNDM7CXRlc3RfcmMKJiM0MzsKJiM0MzsJZWNobyAtbiAmIzM0O1Rlc3Rpbmcgb3V0IG9mIHJhbmdlIGFycmF5IGVsZW1lbnQgZG9lcyBub3QgcGFydGlhbGx5IHVwZGF0ZSAuLi4gJiMzNDsKJiM0MzsgICAgICAgICMgRXhwZWN0IGZhaWx1cmUgYmVjYXVzZSBvZiAzcmQgZWxlbWVudCAoZ3JlYXRlciB0aGFuIGludCkKJiM0MzsJaWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgJiMzNDsxIDIgMyA0JiMzNDsgJiMzNDsxMCAyMCAkKChJTlRfTUFYICYjNDM7IDEpKSA0MCYjMzQ7OyB0aGVuCiYjNDM7CQllY2hvICYjMzQ7RkFJTCYjMzQ7ICZndDsmYW1wOzIKJiM0MzsJCXJjPTEKJiM0MzsJZWxzZQomIzQzOwkJZWNobyAmIzM0O09LJiMzNDsKJiM0MzsJZmkKJiM0MzsJdGVzdF9yYwomIzQzOwomIzQzOwllY2hvIC1uICYjMzQ7VGVzdGluZyBpbnZhbGlkIGZpcnN0IGFycmF5IGVsZW1lbnQgZG9lcyBub3QgdXBkYXRlIC4uLiAmIzM0OwomIzQzOyAgICAgICAgIyBFeHBlY3QgZmFpbHVyZSBvZiAxc3QgZWxlbWVudAomIzQzOwlpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSAmIzM0OzEgMiAzIDQmIzM0OyAmIzM0O2FiYyAyMCAzMCA0MCYjMzQ7OyB0aGVuCiYjNDM7CQllY2hvICYjMzQ7RkFJTCYjMzQ7ICZndDsmYW1wOzIKJiM0MzsJCXJjPTEKJiM0MzsJZWxzZQomIzQzOwkJZWNobyAmIzM0O09LJiMzNDsKJiM0MzsJZmkKJiM0MzsJdGVzdF9yYwomIzQzO30KJiM0MzsKICMgWW91IGFyZSB1c2luZyBhbiB1bnNpZ25lZCBpbnQKIHJ1bl9saW1pdF9kaWdpdF91aW50KCkKIHsKQEAgLTg4MCw2ICYjNDM7OTI4LDE0IEBAIHN5c2N0bF90ZXN0XzAwMTIoKQogCXJldHVybiAwCiB9CiAKJiM0MztzeXNjdGxfdGVzdF8wMDEzKCkKJiM0Mzt7CiYjNDM7CVRBUkdFVD0mIzM0OyR7U1lTQ1RMfS8kKGdldF90ZXN0X3RhcmdldCAwMDEzKSYjMzQ7CiYjNDM7CXJlc2V0X3ZhbHMKJiM0MzsKJiM0MzsJcnVuX2ludF9hcnJheV9ub19wYXJ0aWFsX3VwZGF0ZQomIzQzO30KJiM0MzsKIGxpc3RfdGVzdHMoKQogewogCWVjaG8gJiMzNDtUZXN0IElEIGxpc3Q6JiMzNDsKQEAgLTkwMCw2ICYjNDM7OTU2LDcgQEAgbGlzdF90ZXN0cygpCiAJZWNobyAmIzM0OzAwMTAgeCAkKGdldF90ZXN0X2NvdW50IDAwMTApIC0gdGVzdHMgc3lzY3QgbW91bnQgcG9pbnQmIzM0OwogCWVjaG8gJiMzNDswMDExIHggJChnZXRfdGVzdF9jb3VudCAwMDExKSAtIHRlc3RzIGVtcHR5IGRpcmVjdG9yaWVzJiMzNDsKIAllY2hvICYjMzQ7MDAxMiB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMikgLSB0ZXN0cyByYW5nZSBjaGVjayBmb3IgdTggcHJvY19oYW5kbGVyJiMzNDsKJiM0MzsJZWNobyAmIzM0OzAwMTMgeCAkKGdldF90ZXN0X2NvdW50IDAwMTMpIC0gdGVzdHMgcGFydGlhbGx5IHVwZGF0ZSB2ZWN0b3JzIG9uIGVycm9yJiMzNDsKIH0KIAogdXNhZ2UoKQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzYyMgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDE0NDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBTeXNjdGwgQXJyYXkgVXBkYXRlIFBhdGNoIGZvciBQb3RlbnRpYWwgVW5pbml0aWFsaXplZCBNZW1vcnkgSXNzdWVzKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiB0aGUgc3lzY3RsIHZlY3RvciB1cGRhdGUgbWVjaGFuaXNtIGluIGBrZXJuZWwvc3lzY3RsLmNgLiBUaGUgY29yZSBjaGFuZ2UgaXMgcmVwbGFjaW5nIGBkb19wcm9jX3ZlY2Agd2l0aCBhIG1vcmUgcm9idXN0IHByb2Nlc3MgaW52b2x2aW5nIGBwcm9jX3ZlY2AsIGBhcHBseV9jb252X29uX3ZlY2AsIGFuZCBgY29tbWl0X2NvbnZfdmVjYC4gVGhlIHN0YXRlZCBnb2FsLCBhcyBJIHVuZGVyc3RhbmQgaXQsIGlzIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIHRvIHN5c2N0bCBhcnJheXMgd2hlbiBlcnJvcnMgb2NjdXIgZHVyaW5nIHVzZXIgaW5wdXQgcGFyc2luZy4gSW5zdGVhZCBvZiB0aGUgb2xkIGVsZW1lbnQtYnktZWxlbWVudCB1cGRhdGUtYW5kLWFib3J0IG1ldGhvZCwgdGhpcyBuZXcgYXBwcm9hY2ggdXNlcyBhIHRlbXBvcmFyeSBidWZmZXIgKGBkYXRhX3N0YWdlYCkgdG8gc3RhZ2UgdGhlIGNoYW5nZXMuIFRoaXMgdGVtcG9yYXJ5IGJ1ZmZlciBpcyBwb3B1bGF0ZWQgdXNpbmcgYGttZW1kdXBgIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXNjdGwgYXJyYXkgKGB0YWJsZS0mZ3Q7ZGF0YWApLCB0aGVuIGFwcGx5IGFueSB1c2VyLXByb3ZpZGVkIGNvbnZlcnNpb25zLiBPbmx5IGlmIGFsbCBjb252ZXJzaW9ucyBhcmUgc3VjY2Vzc2Z1bCBkb2VzIGBjb21taXRfY29udl92ZWNgIGNvbWUgaW50byBwbGF5LCB3cml0aW5nIHRoZSBjaGFuZ2VzIGZyb20gYGRhdGFfc3RhZ2VgIHRvIHRoZSBhY3R1YWwgYXJyYXkuCgpNeSBpbW1lZGlhdGUgY29uY2VybiwgYXMgYSBzZWFzb25lZCBrZXJuZWwgZGV2ZWxvcGVyLCBpcyB0byBjaGVjayB0aGlzIGNhcmVmdWxseSBmb3IgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBkZXRhaWxzLiBTcGVjaWZpY2FsbHksIHdpdGhpbiBgYXBwbHlfY29udl9vbl92ZWNgLCBgZGF0YV9zdGFnZWAgaXMgYWxsb2NhdGVkIHdpdGggYGttZW1kdXAodGFibGUtJmd0O2RhdGEsIHRhYmxlLSZndDttYXhsZW4sIEdGUF9LRVJORUwpYC4gVGhpcyBsb29rcyBwcm9taXNpbmc6IGl0IGNsb25lcyB0aGUgd2hvbGUgdGhpbmcuCgpUaGVuLCB0aGUgY29kZSBpdGVyYXRlcyB0byBwcm9jZXNzIHVzZXIgaW5wdXQgYW5kIHVwZGF0ZXMgdGhlIGBkYXRhYCBwb2ludGVyICh3aGljaCBwb2ludHMgZWl0aGVyIHRvIHRoZSBvcmlnaW5hbCBgdGFibGUtJmd0O2RhdGFgIG9yIHRvIGBkYXRhX3N0YWdlYCBkZXBlbmRpbmcgb24gdGhlIG9yaWdpbmFsIGFycmF5JiMzOTtzIHNpemUpLiBUaGUgbG9vcCB1dGlsaXplcyBgcHJvY192ZWNfY29udmAsIHdob3NlIGZ1bmN0aW9uIGNhbGwgZGVwZW5kcyBvbiB0aGUgZGlyZWN0aW9uIG9mIGNvbnZlcnNpb24gYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHVzZXIgaW5wdXQgYW5kIHVwZGF0aW5nIGBkYXRhYC4KCkNyaXRpY2FsbHksIGlmIGV2ZXJ5dGhpbmcgZ29lcyB3ZWxsLCB0aGUgYGNvbW1pdF9jb252X3ZlY2AgZnVuY3Rpb24gaXMgY2FsbGVkLiBUaGlzIGNvcGllcyBgbnJfY29udmAgZWxlbWVudHMgZnJvbSBgZGF0YV9zdGFnZWAgKmJhY2sqIHRvIGB0YWJsZS0mZ3Q7ZGF0YWAuIEkgbm90ZSB0aGF0IGBjb21taXRfY29udl92ZWNgIHVzZXMgYFdSSVRFX09OQ0VgIHdoaWNoIGlzIGdvb2QgcHJhY3RpY2UuCgpOb3csIG15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IGBrbWVtZHVwYCBpcyB0aGUga2V5LiBJdCBjb3BpZXMgYHRhYmxlLSZndDttYXhsZW5gIGJ5dGVzLiBJZiBgdGFibGUtJmd0O2RhdGFgICpoYXMqIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgYXMgcGFydCBvZiBwYWRkaW5nIG9yIG1lbWJlcnMgb2YgbGFyZ2VyIHN0cnVjdHMsIHRob3NlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzICphcmUqIGNvcGllZCBpbnRvIGBkYXRhX3N0YWdlYC4gQW5kIGhlcmUgaXMgd2hlcmUgSSBzZWUgdGhlIHBvdGVudGlhbCBmb3IgYSBwcm9ibGVtLCBidXQgaXQmIzM5O3Mgbm90IGFjdHVhbGx5IHRoZXJlLiBUaGUgY29tbWl0IGZ1bmN0aW9uIHdpbGwgbm90IHdyaXRlIHRoZSBmdWxsIGBkYXRhX3N0YWdlYCBidWZmZXIgYmFjaywgYnV0IG9ubHkgdXAgdG8gdGhlIGFtb3VudCB3aGljaCBoYXMgYmVlbiBjb252ZXJ0ZWQuIFNvLCB0aGUgdW5pbml0aWFsaXplZCBwYXJ0IGRvZXMgbm90IGdldCB3cml0dGVuIGJhY2suCgpCdXQgdGhlIHJlYWwgcXVlc3Rpb24gaXMgd2hldGhlciBpdCAqcmVhZHMqIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkuIEluIHRoZSBrZXJuZWwtdG8tdXNlciBkaXJlY3Rpb24gKGBTWVNDVExfS0VSTl9UT19VU0VSYCksIHRoZSBjb2RlIGp1c3QgcmVhZHMgZnJvbSBgdGFibGUtJmd0O2RhdGFgIGFuZCBmb3JtYXRzIGl0LiBJIHNlZSBubyBpc3N1ZXMgaGVyZS4KCkluIHRoZSB1c2VyLXRvLWtlcm5lbCBkaXJlY3Rpb24gKGBTWVNDVExfVVNFUl9UT19LRVJOYCksIHdlIGhhdmUgdGhlIGBwcm9jX3ZlY19jb252YCBiZWluZyBjYWxsZWQuIEl0IGNhbiAqd3JpdGUqIHRvIGBkYXRhYCwgYnV0IGRvZXMgaXQgKnJlYWQqIGZyb20gYGRhdGFgIGluIGEgd2F5IHRoYXQgaW50cm9kdWNlcyBwcm9ibGVtcz8gSSBuZWVkIHRvIGNoZWNrIHRoZSBleGFjdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGBwcm9jX3ZlY19jb252YCBmdW5jdGlvbnMgbGlrZSBgZG9fcHJvY19pbnRfY29udmAgb3Igd2hhdGV2ZXIuIEJ1dCBmcm9tIHdoYXQgSSBzZWUgaGVyZSwgaXQgbG9va3MgbGlrZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2RvX3Byb2NfaW50X2NvbnYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL3N5c2N0bC5jPTU3Mz1zdGF0aWMgaW50IHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKVxuLS1cbmtlcm5lbC9zeXNjdGwuYy01NzctXG5rZXJuZWwvc3lzY3RsLmM6NTc4OnN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udihib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcbmtlcm5lbC9zeXNjdGwuYy01NzktXHRcdFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcbi0tXG5rZXJuZWwvc3lzY3RsLmMtNTg2LVxua2VybmVsL3N5c2N0bC5jOjU4NzpzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4KGJvb2wgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLFxua2VybmVsL3N5c2N0bC5jLTU4OC1cdFx0XHRcdCAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcbi0tXG5rZXJuZWwvc3lzY3RsLmM9ODkwPWludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4tLVxua2VybmVsL3N5c2N0bC5jLTg5My1cdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbmtlcm5lbC9zeXNjdGwuYzo4OTQ6XHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252IH0pO1xua2VybmVsL3N5c2N0bC5jLTg5NS19XG4tLVxua2VybmVsL3N5c2N0bC5jPTkzMz1pbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4tLVxua2VybmVsL3N5c2N0bC5jLTkzNi1cdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbmtlcm5lbC9zeXNjdGwuYzo5Mzc6XHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252X21pbm1heCB9KTtcbmtlcm5lbC9zeXNjdGwuYy05MzgtfVxuLS1cbmtlcm5lbC9zeXNjdGwuYz0xMTU3PWludCBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuLS1cbmtlcm5lbC9zeXNjdGwuYy0xMTcwLSAqIEBwcG9zOiBmaWxlIHBvc2l0aW9uXG5rZXJuZWwvc3lzY3RsLmM6MTE3MTogKiBAY29udjogQ3VzdG9tIGNvbnZlcnRlciBjYWxsIGJhY2suIERlZmF1bHRzIHRvIGRvX3Byb2NfaW50X2NvbnZcbmtlcm5lbC9zeXNjdGwuYy0xMTcyLSAqXG4tLVxua2VybmVsL3N5c2N0bC5jPTExNzg9aW50IHByb2NfZG9pbnR2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuLS1cbmtlcm5lbC9zeXNjdGwuYy0xMTgzLVx0aWYgKCFjb252KVxua2VybmVsL3N5c2N0bC5jOjExODQ6XHRcdGNvbnYgPSBkb19wcm9jX2ludF9jb252O1xua2VybmVsL3N5c2N0bC5jLTExODUtXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNTAwCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byB0aGUgSW50ZWdlciBDb252ZXJzaW9uIFByb2NlZHVyZSoqCgpBbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBgZG9fcHJvY19pbnRfY29udmAgaW1wbGVtZW50YXRpb24uIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgc3BlY2lmaWNzIG9mIGhvdyB3ZSYjMzk7cmUgaGFuZGxpbmcgaW50ZWdlciBjb252ZXJzaW9ucyBhdCB0aGUgcHJvY2VkdXJhbCBsZXZlbC4gSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgbG9naWMgaXMgc291bmQsIGVzcGVjaWFsbHkgYXJvdW5kIGVkZ2UgY2FzZXMgYW5kIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcy4gSSYjMzk7bGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHR5cGVzIGludm9sdmVkLCB0aGUgYml0LXNoaWZ0aW5nIGFuZCBtYXNraW5nIG9wZXJhdGlvbnMsIGFuZCBob3cgd2UmIzM5O3JlIGhhbmRsaW5nIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgc2NlbmFyaW9zLiBUaGUgZ29hbCBpcyB0byB2ZXJpZnkgdGhhdCBpdCYjMzk7cyByb2J1c3QsIGVmZmljaWVudCwgYW5kIGFsaWduZWQgd2l0aCB0aGUgZG9jdW1lbnRlZCBiZWhhdmlvciBhbmQgYXJjaGl0ZWN0dXJhbCBjb25zdHJhaW50cyBvZiB0aGUgdGFyZ2V0IHBsYXRmb3JtLiBJJiMzOTttIGxvb2tpbmcgZm9yIGFueXRoaW5nIHRoYXQgbWlnaHQgbGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMgb3IgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlJiMzOTt2ZSBnb3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL3N5c2N0bC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTc4LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1Nzg6XHRzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXG4gNTc5Olx0XHRcdFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcbiA1ODA6XHR7XG4gNTgxOlx0XHRyZXR1cm4gcHJvY19pbnRfY29udihuZWdwLCB1X3B0ciwga19wdHIsIGRpciwgdGJsLCBmYWxzZSxcbiA1ODI6XHRcdFx0XHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXG4gNTgzOlx0XHRcdFx0ICAgICBzeXNjdGxfa2Vybl90b191c2VyX2ludF9jb252KTtcbiA1ODQ6XHRcbiA1ODU6XHR9XG4gNTg2Olx0XG4gNTg3Olx0c3RhdGljIGludCBkb19wcm9jX2ludF9jb252X21pbm1heChib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcbiA1ODg6XHRcdFx0XHRcdCAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcbiA1ODk6XHR7XG4gNTkwOlx0XHRyZXR1cm4gcHJvY19pbnRfY29udihuZWdwLCB1X3B0ciwga19wdHIsIGRpciwgdGJsLCB0cnVlLFxuIDU5MTpcdFx0XHRcdCAgICAgc3lzY3RsX3VzZXJfdG9fa2Vybl9pbnRfY29udixcbiA1OTI6XHRcdFx0XHQgICAgIHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYpO1xuIDU5MzpcdH1cbiA1OTQ6XHRcbiA1OTU6XHRzdGF0aWMgY29uc3QgY2hhciBwcm9jX3dzcGFjZV9zZXBbXSA9IHsgJiMzOTsgJiMzOTssICYjMzk7XFx0JiMzOTssICYjMzk7XFxuJiMzOTsgfTtcbiA1OTY6XHRcbiA1OTc6XHQvKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA5MgoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqRGl2aW5nIGludG8gYHByb2NfaW50X2NvbnZgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhpcyBgcHJvY19pbnRfY29udmAgcm91dGluZS4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBzZWUgd2hhdOKAmXMgZ29pbmcgb24gdW5kZXIgdGhlIGhvb2QgdGhlcmUuIEkmIzM5O20gYXNzdW1pbmcgaXQgaGFuZGxlcyBpbnRlZ2VyIGNvbnZlcnNpb25zIHdpdGhpbiB0aGUgc3lzdGVtLCBidXQgSSBuZWVkIHRvIHF1aWNrbHkgY29uZmlybSB0aGF0IGFzc3VtcHRpb24gYW5kIHVuZGVyc3RhbmQgaXRzIHNwZWNpZmljIHJvbGUuIElzIGl0IGEgZ2VuZXJhbC1wdXJwb3NlIGNvbnZlcnRlciwgb3Igc29tZXRoaW5nIG9wdGltaXplZCBmb3IgYSBwYXJ0aWN1bGFyIGRhdGEgdHlwZSBvciB1c2UgY2FzZT8gSSYjMzk7bSBjdXJpb3VzIGFib3V0IHRoZSBpbnRlbmRlZCBkZXNpZ24gYW5kIGNvbnN0cmFpbnRzLiBXaGF0IGFyZSB0aGUgaW5wdXQgdHlwZXMgaXQgYWNjZXB0cywgYW5kIHdoYXQgYXJlIHRoZSBvdXRwdXQgdHlwZXMgaXQgcHJvZHVjZXM/IExldCYjMzk7cyB0cmFjZSBpdCB0aHJvdWdoIHRoZSBjb2RlLiBJJiMzOTtsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBwb3RlbnRpYWwgZWRnZSBjYXNlcyBhbmQgZXJyb3IgaGFuZGxpbmcuIEFyZSB0aGVyZSBhbnkga25vd24gdnVsbmVyYWJpbGl0aWVzPyBJIHdhbnQgdG8gc2VlIGlmIHRoaXMgY29kZSBpcyBzYWZlIGZvciB1c2UgdW5kZXIgYW55IGNpcmN1bXN0YW5jZS4gSSBuZWVkIHRvIHF1aWNrbHkgYXNzZXNzIGl0cyBvdmVyYWxsIGVmZmljaWVuY3kuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBwb3RlbnRpYWwgYm90dGxlbmVja3Mgb3IgYXJlYXMgd2hlcmUgcGVyZm9ybWFuY2UgY291bGQgYmUgaW1wcm92ZWQuIEkgYWxzbyB3YW50IHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyB1c2VkIHdpdGhpbiB0aGUgbGFyZ2VyIGNvZGViYXNlLiBBcmUgdGhlcmUgYW55IGRlcGVuZGVuY2llcz8gSG93IGlzIGl0IGludGVncmF0ZWQgaW50byB0aGUgb3ZlcmFsbCBhcmNoaXRlY3R1cmU/IFRoaXMgd2lsbCBpbmZvcm0gaG93IGl0IG1pZ2h0IGJlIGFmZmVjdGVkIGJ5IGZ1dHVyZSBjaGFuZ2VzIG9yIG9wdGltaXphdGlvbnMuIEVzc2VudGlhbGx5LCBJJiMzOTttIGZvcm1pbmcgYSBtZW50YWwgbW9kZWwgb2YgaXRzIGJlaGF2aW9yLCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3MsIGFuZCBwb3RlbnRpYWwgaW1wYWN0IG9uIHRoZSBzeXN0ZW0uIFRpbWUgdG8gZ2V0IHRvIHdvcmsuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Byb2NfaW50X2NvbnYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL3N5c2N0bC5jPTUwNj1pbnQgcHJvY19pbnRfdTJrX2NvbnZfdW9wKGNvbnN0IHVsb25nICp1X3B0ciwgaW50ICprX3B0ciwgY29uc3QgYm9vbCAqbmVncCxcbi0tXG5rZXJuZWwvc3lzY3RsLmMtNTIzLS8qKlxua2VybmVsL3N5c2N0bC5jOjUyNDogKiBwcm9jX2ludF9jb252IC0gQ2hhbmdlIHVzZXIgb3Iga2VybmVsIHBvaW50ZXIgYmFzZWQgb24gZGlyZWN0aW9uXG5rZXJuZWwvc3lzY3RsLmMtNTI1LSAqXG4tLVxua2VybmVsL3N5c2N0bC5jLTUzOS0gKi9cbmtlcm5lbC9zeXNjdGwuYzo1NDA6aW50IHByb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLCBpbnQgZGlyLFxua2VybmVsL3N5c2N0bC5jLTU0MS1cdFx0ICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwsIGJvb2wga19wdHJfcmFuZ2VfY2hlY2ssXG4tLVxua2VybmVsL3N5c2N0bC5jPTU3Mz1zdGF0aWMgaW50IHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKVxuLS1cbmtlcm5lbC9zeXNjdGwuYy01NzctXG5rZXJuZWwvc3lzY3RsLmM6NTc4OnN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udihib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcbmtlcm5lbC9zeXNjdGwuYy01NzktXHRcdFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcbmtlcm5lbC9zeXNjdGwuYy01ODAte1xua2VybmVsL3N5c2N0bC5jOjU4MTpcdHJldHVybiBwcm9jX2ludF9jb252KG5lZ3AsIHVfcHRyLCBrX3B0ciwgZGlyLCB0YmwsIGZhbHNlLFxua2VybmVsL3N5c2N0bC5jLTU4Mi1cdFx0XHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXG4tLVxua2VybmVsL3N5c2N0bC5jLTU4Ni1cbmtlcm5lbC9zeXNjdGwuYzo1ODc6c3RhdGljIGludCBkb19wcm9jX2ludF9jb252X21pbm1heChib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcbmtlcm5lbC9zeXNjdGwuYy01ODgtXHRcdFx0XHQgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwpXG5rZXJuZWwvc3lzY3RsLmMtNTg5LXtcbmtlcm5lbC9zeXNjdGwuYzo1OTA6XHRyZXR1cm4gcHJvY19pbnRfY29udihuZWdwLCB1X3B0ciwga19wdHIsIGRpciwgdGJsLCB0cnVlLFxua2VybmVsL3N5c2N0bC5jLTU5MS1cdFx0XHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXG4tLVxua2VybmVsL3N5c2N0bC5jPTg5MD1pbnQgcHJvY19kb2ludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuLS1cbmtlcm5lbC9zeXNjdGwuYy04OTMtXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG5rZXJuZWwvc3lzY3RsLmM6ODk0Olx0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcbmtlcm5lbC9zeXNjdGwuYy04OTUtfVxuLS1cbmtlcm5lbC9zeXNjdGwuYz05MzM9aW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuLS1cbmtlcm5lbC9zeXNjdGwuYy05MzYtXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG5rZXJuZWwvc3lzY3RsLmM6OTM3Olx0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udl9taW5tYXggfSk7XG5rZXJuZWwvc3lzY3RsLmMtOTM4LX1cbi0tXG5rZXJuZWwvc3lzY3RsLmM9MTE1Nz1pbnQgcHJvY19kb3Vsb25ndmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi0tXG5rZXJuZWwvc3lzY3RsLmMtMTE3MC0gKiBAcHBvczogZmlsZSBwb3NpdGlvblxua2VybmVsL3N5c2N0bC5jOjExNzE6ICogQGNvbnY6IEN1c3RvbSBjb252ZXJ0ZXIgY2FsbCBiYWNrLiBEZWZhdWx0cyB0byBkb19wcm9jX2ludF9jb252XG5rZXJuZWwvc3lzY3RsLmMtMTE3Mi0gKlxuLS1cbmtlcm5lbC9zeXNjdGwuYz0xMTc4PWludCBwcm9jX2RvaW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbi0tXG5rZXJuZWwvc3lzY3RsLmMtMTE4My1cdGlmICghY29udilcbmtlcm5lbC9zeXNjdGwuYzoxMTg0Olx0XHRjb252ID0gZG9fcHJvY19pbnRfY29udjtcbmtlcm5lbC9zeXNjdGwuYy0xMTg1LVx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjQ2MgoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJiMzOTttIGRlZXBseSBmYW1pbGlhciB3aXRoIGNvZGUgYW5kIHByb2Nlc3NlczoKCioqRGVsdmluZyBpbnRvIGBwcm9jX2ludF9jb252YCoqCgpBbHJpZ2h0LCBJJiMzOTttIHRoaW5raW5nLCAmIzM0O1RpbWUgdG8gZGl2ZSBpbnRvIGBwcm9jX2ludF9jb252YC4mIzM0OyBUaGF0IG5hbWUgYWxvbmUgZ2l2ZXMgbWUgYSBwcmV0dHkgZ29vZCBzdGFydGluZyBwb2ludC4gSSBjYW4gaW5zdGFudGx5IGFzc3VtZSBpdCYjMzk7cyByZWxhdGVkIHRvIHNvbWUgcHJvY2VzcyBvciBwcm9jZWR1cmUgaW52b2x2aW5nIHRoZSBjb252ZXJzaW9uIG9mIGludGVnZXIgdmFsdWVzLiBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgb2YgdGhlIHN5c3RlbSwgdGhpcyBjb3VsZCBiZSBhIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrIG9yIGEgbW9yZSBzcGVjaWFsaXplZCBmdW5jdGlvbi4gTXkgaW5pdGlhbCBnb2FsIGlzIHVuZGVyc3RhbmRpbmcgdGhlIGNvbnZlcnNpb24gbWV0aG9kLiBQZXJoYXBzIHRoZXJlIGlzIHNvbWUgaW50ZWdlciBzY2FsaW5nIG9yIGNvbnZlcnNpb24gYmV0d2VlbiBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXJzIGhhcHBlbmluZy4gVGhlIGRlZXBlciBnb2FsIGlzIHRvIGNoZWNrIGZvciBhbnkgcG90ZW50aWFsIGVkZ2UgY2FzZXMgb3Igb3ZlcmZsb3dzLiBHaXZlbiB0aGUgbmF0dXJlIG9mIGludGVnZXIgYXJpdGhtZXRpYywgdGhlcmUgbWlnaHQgYmUgYSBuZWVkIGZvciBlcnJvciBoYW5kbGluZy4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGluc2lkZS4gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBub3c6IHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGFsZ29yaXRobSwgdGhlIGRhdGEgdHlwZXMgaW52b2x2ZWQsIGFuZCBhbnkgcG90ZW50aWFsIHNpZGUgZWZmZWN0cy4gSSYjMzk7bGwgYmUgbG9va2luZyBhdCB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLCBsb2NhbCB2YXJpYWJsZXMsIGFuZCByZXR1cm4gdmFsdWUgdG8gcGllY2UgdGhpcyBhbGwgdG9nZXRoZXIuIEkmIzM5O20gZ29pbmcgdG8gZGV0ZXJtaW5lIGl0cyByb2xlIHdpdGhpbiB0aGUgc3lzdGVtIGFuZCBhbnkgcG90ZW50aWFsIHBvaW50cyBvZiBpbnRlZ3JhdGlvbi4gSXMgaXQgb3B0aW1pemVkIGZvciBzcGVlZCwgb3IgaXMgaXQgcHJpb3JpdGl6aW5nIGNsYXJpdHk/IEFuZCBtb3N0IGltcG9ydGFudGx5LCBpcyBpdCByb2J1c3Q/IElzIHRoZXJlIGEgbmVlZCB0byBkb2N1bWVudCB0aGlzLCBvciBpcyB0aGlzIGp1c3Qgc29tZXRoaW5nIEkgd2FzIGFza2VkIHRvIGdsYW5jZSBhdD8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDU0MDpcdGludCBwcm9jX2ludF9jb252KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgaW50ICprX3B0ciwgaW50IGRpcixcbiA1NDE6XHRcdFx0ICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwsIGJvb2wga19wdHJfcmFuZ2VfY2hlY2ssXG4gNTQyOlx0XHRcdCAgaW50ICgqdXNlcl90b19rZXJuKShjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIpLFxuIDU0MzpcdFx0XHQgIGludCAoKmtlcm5fdG9fdXNlcikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKSlcbiA1NDQ6XHR7XG4gNTQ1Olx0XHRpZiAoU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKVxuIDU0NjpcdFx0XHRyZXR1cm4ga2Vybl90b191c2VyKG5lZ3AsIHVfcHRyLCBrX3B0cik7XG4gNTQ3Olx0XG4gNTQ4Olx0XHRpZiAoa19wdHJfcmFuZ2VfY2hlY2spIHtcbiA1NDk6XHRcdFx0aW50IHRtcF9rLCByZXQ7XG4gNTUwOlx0XG4gNTUxOlx0XHRcdGlmICghdGJsKVxuIDU1MjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDU1MzpcdFx0XHRyZXQgPSB1c2VyX3RvX2tlcm4obmVncCwgdV9wdHIsIFx1MDAyNnRtcF9rKTtcbiA1NTQ6XHRcdFx0aWYgKHJldClcbiA1NTU6XHRcdFx0XHRyZXR1cm4gcmV0O1xuIDU1NjpcdFx0XHRpZiAoKHRibC1cdTAwM2VleHRyYTEgXHUwMDI2XHUwMDI2ICooaW50ICopdGJsLVx1MDAzZWV4dHJhMSBcdTAwM2UgdG1wX2spIHx8XG4gNTU3Olx0XHRcdCAgICAodGJsLVx1MDAzZWV4dHJhMiBcdTAwMjZcdTAwMjYgKihpbnQgKil0YmwtXHUwMDNlZXh0cmEyIFx1MDAzYyB0bXBfaykpXG4gNTU4Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNTU5Olx0XHRcdFdSSVRFX09OQ0UoKmtfcHRyLCB0bXBfayk7XG4gNTYwOlx0XHR9IGVsc2VcbiA1NjE6XHRcdFx0cmV0dXJuIHVzZXJfdG9fa2VybihuZWdwLCB1X3B0ciwga19wdHIpO1xuIDU2MjpcdFx0cmV0dXJuIDA7XG4gNTYzOlx0fVxuIDU2NDpcdFxuIDU2NTpcdFxuIDU2NjpcdFxuIDU2NzpcdHN0YXRpYyBpbnQgc3lzY3RsX3VzZXJfdG9fa2Vybl9pbnRfY29udihjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsXG4gNTY4Olx0XHRcdFx0XHRcdGludCAqa19wdHIpXG4gNTY5Olx0e1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzMxOAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEzNjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBJbXBsaWNhdGlvbnMgb2YgdGhlIGBwcm9jX2ludF9jb252YCBNb2RpZmljYXRpb24qKgoKT2theSwgc28gYHByb2NfaW50X2NvbnZgIHdyaXRlcyB0byBga19wdHJgLCBnb3QgaXQuIFRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gYmUgaGFwcGVuaW5nIHdpdGhpbiBgYXBwbHlfY29udl9vbl92ZWNgLiBgZGF0YWAsIHBhc3NlZCBhcyBga19wdHJgLCBpcyB0aGUga2V5IHZhcmlhYmxlIGhlcmUuIElmIGBTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKWAgaXMgdHJ1ZSwgYHByb2NfdmVjX2NvbnZgIGNhbGxzIGBjb252YCB3aGljaCBpbiB0dXJuIGNhbGxzIGBwcm9jX2ludF9jb252YCwgd3JpdGluZyB0byB0aGlzIGBrX3B0cmAsIHdoaWNoIGluIGVzc2VuY2UgaXMgcG9pbnRpbmcgdG8gZWl0aGVyIGBkYXRhX3N0YWdlYCAoaWYgYWxsb2NhdGVkKSBvciBkaXJlY3RseSB0byBgdGFibGUtJmd0O2RhdGFgLgoKTm93LCBpZiBgZGF0YV9zdGFnZWAgaXMgYWxsb2NhdGVkLCBpdCYjMzk7cyBhIGBrbWVtZHVwYCBjb3B5IG9mIGB0YWJsZS0mZ3Q7ZGF0YWAuIEhlcmUmIzM5O3MgdGhlIHBvdGVudGlhbCB3cmlua2xlOiBpZiBgdGFibGUtJmd0O2RhdGFgIGhhcyB1bmluaXRpYWxpemVkIG1lbW9yeSAocGFkZGluZywgdW51c2VkIGFycmF5IGVsZW1lbnRzLCBldGMuKSwgYGttZW1kdXBgIGNvcGllcyAqdGhhdCogdW5pbml0aWFsaXplZCBkYXRhLiBUaGVuLCBgcHJvY192ZWNfY29udmAgb3ZlcndyaXRlcyB0aGUgZWxlbWVudHMgdGhhdCBpdCBzdWNjZXNzZnVsbHkgcGFyc2VzLiBBbmQgY3J1Y2lhbGx5LCBgY29tbWl0X2NvbnZfdmVjYCAqb25seSogY29waWVzIGBucl9jb252YCBlbGVtZW50cyBmcm9tIGBkYXRhX3N0YWdlYCBiYWNrIHRvIGB0YWJsZS0mZ3Q7ZGF0YWAuIFNvLCBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gYGRhdGFfc3RhZ2VgICpiZXlvbmQqIGBucl9jb252YCBlbGVtZW50cyBpcyAqbm90KiBjb3BpZWQgYmFjay4gSSYjMzk7bSBub3RpbmcgdGhlIGRhdGEgdHlwZSBzcGVjaWZpY3MgaGVyZTogYFBST0NfVkVDX0lOVGAgaGFzIG5vIGVsZW1lbnQgcGFkZGluZyAoNCBieXRlcykgYW5kIG5laXRoZXIgZG9lcyBgUFJPQ19WRUNfVUxPTkdgICg4IGJ5dGVzKSwgc28gbm8gcGFkZGluZy1yZWxhdGVkIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4KClRoZSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGUgY29weWluZyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gQnV0IHdhaXQsIGBrbWVtZHVwYCB1c2VzIGBtZW1jcHlgLiBEb2VzIGNvcHlpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgdHJpZ2dlciBhIEtNU0FOIHJlcG9ydD8gTm8uIEtNU0FOIHRyYWNrcyB1bmluaXRpYWxpemVkIHN0YXRlLiBDb3B5aW5nIG1lcmVseSBwcm9wYWdhdGVzIHRoZSB1bmluaXRpYWxpemVkIHN0YXRlLCBhbmQgdGhlIEtNU0FOIHJlcG9ydCBpcyBvbmx5IHRyaWdnZXJlZCBpZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyB1c2VkIGluIGJyYW5jaGVzIG9yIHNpbmtzIChsaWtlIGBjb3B5X3RvX3VzZXJgKS4KCkluIHRoaXMgY2FzZSwgYGttZW1kdXBgIGNvcGllcyBgdGFibGUtJmd0O2RhdGFgIHRvIGBkYXRhX3N0YWdlYCwgYGNvbW1pdF9jb252X3ZlY2AgY29waWVzIGJhY2sgb25seSB0aGUgY29udmVydGVkIGVsZW1lbnRzLiBObyB1c2VyLXNwYWNlIGxlYWsgYmVjYXVzZSBgU1lTQ1RMX1VTRVJfVE9fS0VSTmAgaXMgd3JpdGluZyBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQuICBGb3IgYFNZU0NUTF9LRVJOX1RPX1VTRVJgLCBubyBgZGF0YV9zdGFnZWAgaXMgYWxsb2NhdGVkLCBgZGF0YWAgZGlyZWN0bHkgcG9pbnRzIHRvIGB0YWJsZS0mZ3Q7ZGF0YWAsIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGJlZm9yZSB0aGUgcGF0Y2guIFRoZSBsb2dpYyBmb3IgcmVhZGluZyBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlIGlzIHVuY2hhbmdlZC4KClNvLCB0aGUgbmV3IGFwcHJvYWNoIHVzZXMgYSB0ZW1wb3JhcnkgYnVmZmVyIChgZGF0YV9zdGFnZWApIHdoZW4gd3JpdGluZyBmcm9tIHVzZXIgc3BhY2UgdG8gdGhlIGtlcm5lbDogY29weSwgdXBkYXRlLCBhbmQgdGhlbiBvbmx5IGNvcHkgY2hhbmdlZCBlbGVtZW50cyBiYWNrLgoKTm93LCBhbSBJIG1pc3Npbmcgc29tZXRoaW5nIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnk/IFRoZSBtYWluIGNvbmNlcm4gaGVyZSBpcyB0aGUgcHJvcGFnYXRpb24gb2YgdGhpcyB1bmluaXRpYWxpemVkIG1lbW9yeSB0aHJvdWdoIGBrbWVtZHVwYC4gSXQganVzdCBwYXNzZXMgaXQgdGhyb3VnaCwgd2hpY2ggYnkgaXRzZWxmIGlzIG5vdCBhbiBpc3N1ZSwgYXMgbG9uZyBhcyBpdCBpc24mIzM5O3QgdXNlZCB3aGVyZSBpdCB3b3VsZCBiZSBjaGVja2VkLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgY2hlY2sgYHByb2NfdmVjX2NvbnZgLCB0aGVyZSBtYXkgYmUgc29tZSB1c2Ugb3IgY2hlY2sgb2YgdGhhdCBkYXRhIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjE1Olx0XHRpbnQgKCp1aW50X2NvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWludCAqa19wdHIsXG4gNjE2Olx0XHRcdFx0IGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKTtcbiA2MTc6XHRcdGludCAoKnVsb25nX2NvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLFxuIDYxODpcdFx0XHRcdCAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpO1xuIDYxOTpcdH07XG4gNjIwOlx0XG4gNjIxOlx0LypcbiA2MjI6XHQgKiBEaXNwYXRjaCB0byB0aGUgY29udmVydGVyIG1lbWJlciBzZWxlY3RlZCBieSBAdHlwZS4gQGtfcHRyIHdhbGtzXG4gNjIzOlx0ICogdGFibGUtXHUwMDNlZGF0YSBhcyByYXcgYnl0ZXMgYW5kIGlzIGNhc3QgYmFjayB0byB0aGUgZWxlbWVudCB0eXBlIGhlcmUuXG4gNjI0Olx0ICovXG4gNjI1Olx0c3RhdGljIGludCBwcm9jX3ZlY19jb252KGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXG4gNjI2Olx0XHRcdFx0IGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgY2hhciAqa19wdHIsIGludCBkaXIsXG4gNjI3Olx0XHRcdFx0IGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKVxuIDYyODpcdHtcbiA2Mjk6XHRcdHN3aXRjaCAodHlwZSkge1xuIDYzMDpcdFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XG4gNjMxOlx0XHRcdHJldHVybiBjb252LmludF9jb252KG5lZ3AsIHVfcHRyLCAoaW50ICopa19wdHIsIGRpciwgdGFibGUpO1xuIDYzMjpcdFx0Y2FzZSBQUk9DX1ZFQ19VSU5UOlxuIDYzMzpcdFx0XHRyZXR1cm4gY29udi51aW50X2NvbnYobmVncCwgdV9wdHIsICh1aW50ICopa19wdHIsIGRpciwgdGFibGUpO1xuIDYzNDpcdFx0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbiA2MzU6XHRcdFx0cmV0dXJuIGNvbnYudWxvbmdfY29udihuZWdwLCB1X3B0ciwgKHVsb25nICopa19wdHIsIGRpciwgdGFibGUpO1xuIDYzNjpcdFx0fVxuIDYzNzpcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjM4Olx0fVxuIDYzOTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTg0MAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqUmV2aXNpdGluZyBgYXBwbHlfY29udl9vbl92ZWNgKioKCk9rYXksIHRpbWUgdG8gY2lyY2xlIGJhY2sgdG8gYGFwcGx5X2NvbnZfb25fdmVjYC4gSSBuZWVkIHRvIHNvbGlkaWZ5IG15IHVuZGVyc3RhbmRpbmcgb2YgdGhhdCBmdW5jdGlvbiYjMzk7cyBiZWhhdmlvci4gSSB3YW50IHRvIGVuc3VyZSBpdCYjMzk7cyBiZWhhdmluZyBwcmVjaXNlbHkgYXMgSSBleHBlY3Qgd2l0aGluIHRoaXMgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlLCBlc3BlY2lhbGx5IGluIHJlZ2FyZHMgdG8gcGFkZGluZywgc3RyaWRlLCBhbmQgZmlsdGVyIGFwcGxpY2F0aW9uLiBJIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluIHRoZXJlIGFyZW4mIzM5O3QgYW55IHN1YnRsZSBiaWFzZXMgY3JlZXBpbmcgaW4sIHBhcnRpY3VsYXJseSBhdCB0aGUgYm91bmRhcmllcy4gTGV0IG1lIG1lbnRhbGx5IHdhbGsgdGhyb3VnaCBhIGZldyBleGFtcGxlIGlucHV0cyBhbmQgdHJhY2UgdGhlIGNvbXB1dGF0aW9ucyDigJMgbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWlzc2VkIGEgY29ybmVyIGNhc2UuIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgYWN0aXZhdGlvbiBmdW5jdGlvbnMgZG93biB0aGUgbGluZSwgc28gdGhlIG91dHB1dCBkaW1lbnNpb25hbGl0eSBpcyBjcml0aWNhbC4gSSYjMzk7bSBnb2luZyB0byBsb29rIGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB3aXRoIGEgbW9yZSBjcml0aWNhbCBleWUuIEkgc3VzcGVjdCBhIHNpbXBsZSBtZW50YWwgY2hlY2sgd29uJiMzOTt0IHN1ZmZpY2U7IEkgbWlnaHQgZXZlbiB0cnkgd3JpdGluZyBhIHF1aWNrIHVuaXQgdGVzdCB0byB2ZXJpZnkgaXTigJlzIGJlaGF2aW5nIGFjY29yZGluZyB0byB0aGUgZXN0YWJsaXNoZWQgZnJhbWV3b3JrLiBJdCYjMzk7cyBhIGtleSBjb21wb25lbnQsIHNvIGEgZGVlcCB1bmRlcnN0YW5kaW5nIGhlcmUgcGF5cyBkaXZpZGVuZHMgZG93biB0aGUgbGluZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2NjEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY2MTpcdCAqIGFwcGx5X2NvbnZfb25fdmVjIC0gQXBwbHkgY29udmVydGVyIGZ1bmN0aW9uIG9uIGRhdGEgdmVjdG9yXG4gNjYyOlx0ICpcbiA2NjM6XHQgKiBFbGVtZW50IHNpZ25lZG5lc3MgaXMgZGVyaXZlZCBmcm9tIEBkYXRhX3R5cGUuIHRhYmxlLVx1MDAzZWRhdGEgaXMgd2Fsa2VkXG4gNjY0Olx0ICogYXMgcmF3IGJ5dGVzIChAZGF0YSkgYWR2YW5jZWQgYnkgQGRhdGFfc2l6ZTsgdGhlIGNvbnZlcnRlciBwZXJmb3Jtc1xuIDY2NTpcdCAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mXG4gNjY2Olx0ICogYnl0ZXMgdGhhdCB3aGVyZSBsZWZ0IG91dHN0YW5kaW5nIGFmdGVyIGNvbnZlcnNpb24uIENhbiBiZSBcdTAwM2UgMC5cbiA2Njc6XHQgKlxuIDY2ODpcdCAqIFJldHVybnMgMCBvbiBzdWNjZXNzLiBOb24temVybyBvbiBlcnJvci5cbiA2Njk6XHQgKi9cbiA2NzA6XHRzdGF0aWMgaW50IGFwcGx5X2NvbnZfb25fdmVjKGNvbnN0IHVuaW9uIHByb2NfdmVjX2NvbnYgY29udixcbiA2NzE6XHRcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLFxuIDY3MjpcdFx0XHRcdCAgICAgY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSxcbiA2NzM6XHRcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IGludCBjb252X2RpcixcbiA2NzQ6XHRcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBidWZfbmJ5dGUsIHZvaWQgKmJ1ZixcbiA2NzU6XHRcdFx0XHQgICAgIHNpemVfdCAqYnVmX2xlZnRfZmluYWwpXG4gNjc2Olx0e1xuIDY3NzpcdFx0aW50IHZlY19sZWZ0LCBlcnIgPSAwO1xuIDY3ODpcdFx0c2l6ZV90IGJ1Zl9sZWZ0LCBucl9jb252ID0gMDtcbiA2Nzk6XHRcdGNoYXIgKmRhdGEsICpkYXRhX3N0YWdlID0gTlVMTCwgKnA7XG4gNjgwOlx0XHRib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HO1xuIDY4MTpcdFxuIDY4MjpcdFx0YnVmX2xlZnQgPSBidWZfbmJ5dGU7XG4gNjgzOlx0XG4gNjg0Olx0XHRkYXRhID0gdGFibGUtXHUwMDNlZGF0YTtcbiA2ODU6XHRcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xuIDY4NjpcdFx0XHRpZiAoYnVmX2xlZnQgXHUwMDNlIFBBR0VfU0laRSAtIDEpXG4gNjg3Olx0XHRcdFx0YnVmX2xlZnQgPSBQQUdFX1NJWkUgLSAxO1xuIDY4ODpcdFx0XHRwID0gYnVmO1xuIDY4OTpcdFxuIDY5MDpcdFx0XHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAzZSBkYXRhX3NpemUpIHtcbiA2OTE6XHRcdFx0XHRkYXRhX3N0YWdlID0ga21lbWR1cCh0YWJsZS1cdTAwM2VkYXRhLCB0YWJsZS1cdTAwM2VtYXhsZW4sIEdGUF9LRVJORUwpO1xuIDY5MjpcdFx0XHRcdGlmICghZGF0YV9zdGFnZSkge1xuIDY5MzpcdFx0XHRcdFx0ZXJyID0gLUVOT01FTTtcbiA2OTQ6XHRcdFx0XHRcdGdvdG8gb3V0O1xuIDY5NTpcdFx0XHRcdH1cbiA2OTY6XHRcdFx0XHRkYXRhID0gZGF0YV9zdGFnZTtcbiA2OTc6XHRcdFx0fVxuIDY5ODpcdFx0fVxuIDY5OTpcdFxuIDcwMDpcdFx0dmVjX2xlZnQgPSB0YWJsZS1cdTAwM2VtYXhsZW4gLyBkYXRhX3NpemU7XG4gNzAxOlx0XHRmb3IgKDsgYnVmX2xlZnQgXHUwMDI2XHUwMDI2IHZlY19sZWZ0LS07IGRhdGEgJiM0Mzs9IGRhdGFfc2l6ZSwgbnJfY29udiYjNDM7JiM0MzspIHtcbiA3MDI6XHRcdFx0dW5zaWduZWQgbG9uZyBsdmFsO1xuIDcwMzpcdFx0XHRib29sIG5lZyA9IGZhbHNlO1xuIDcwNDpcdFxuIDcwNTpcdFx0XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbiA3MDY6XHRcdFx0XHRwcm9jX3NraXBfc3BhY2VzKFx1MDAyNnAsIFx1MDAyNmJ1Zl9sZWZ0KTtcbiA3MDc6XHRcbiA3MDg6XHRcdFx0XHRpZiAoIWJ1Zl9sZWZ0KVxuIDcwOTpcdFx0XHRcdFx0YnJlYWs7XG4gNzEwOlx0XHRcdFx0ZXJyID0gcHJvY19nZXRfbG9uZyhcdTAwMjZwLCBcdTAwMjZidWZfbGVmdCwgXHUwMDI2bHZhbCwgXHUwMDI2bmVnLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjk0MwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDI3MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBJbW1lZGlhdGUgQ29uY2VybnMgUmVnYXJkaW5nIGBjb21taXRfY29udl92ZWNgKioKCk9rYXksIGhvbGQgb24gYSBzZWNvbmQuIEkgd2FzIHJldmlld2luZyB0aGUgZGF0YSB0eXBlcyBiZWluZyBoYW5kbGVkLCBhbmQgYSBxdWVzdGlvbiBqdXN0IHBvcHBlZCBpbnRvIG15IGhlYWQ6IHdoYXQgaWYgdGhlIGBkYXRhX3R5cGVgIGlzIGBQUk9DX1ZFQ19VSU5UYD8gTGV0JiMzOTtzIHF1aWNrbHkgcmUtZXhhbWluZSB0aGUgYGNvbW1pdF9jb252X3ZlY2AgZnVuY3Rpb24uIEkmIzM5O20gdGFraW5nIGEgbG9vayBhdCB0aGUgY29kZToKCmBgYGMKc3RhdGljIGludCBjb21taXRfY29udl92ZWMoY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSwgdm9pZCAqZHN0LAoJCQkgICAgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnIpCnsKCXNpemVfdCBpOwoKCXN3aXRjaCAoZGF0YV90eXBlKSB7CgljYXNlIFBST0NfVkVDX0lOVDoKCQlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KQoJCQlXUklURV9PTkNFKCgoaW50ICopZHN0KVtpXSwgKChjb25zdCBpbnQgKilzcmMpW2ldKTsKCQlyZXR1cm4gMDsKCgljYXNlIFBST0NfVkVDX1VMT05HOgoJCWZvciAoaSA9IDA7IGkgJmx0OyBucjsgaSYjNDM7JiM0MzspCgkJCVdSSVRFX09OQ0UoKCh1bG9uZyAqKWRzdClbaV0sICgoY29uc3QgdWxvbmcgKilzcmMpW2ldKTsKCQlyZXR1cm4gMDsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KYGBgCgouLi5hbmQgdGhlcmUgaXQgaXMuICoqYFBST0NfVkVDX1VJTlRgIGlzIGdsYXJpbmdseSBhYnNlbnQqKiBmcm9tIHRoZSBgc3dpdGNoYCBzdGF0ZW1lbnQhIElmIHRoZSBmdW5jdGlvbiByZWNlaXZlcyBhIGBkYXRhX3R5cGVgIG9mIGBQUk9DX1ZFQ19VSU5UYCwgdGhlbiB0aGUgYGRlZmF1bHRgIGNhc2Ugd2lsbCBiZSB0cmlnZ2VyZWQsIHJlc3VsdGluZyBpbiBhIHJldHVybiB2YWx1ZSBvZiBgLUVJTlZBTGAuIFRoaXMgaXMgZGVmaW5pdGVseSBhIGJ1ZzsgaXQgaXMgYW4gZXJyb3IgcmV0dXJuIGJlY2F1c2UgYFBST0NfVkVDX1VJTlRgIGlzIGEgdmFsaWQgdHlwZSBpbiB0aGlzIGNvbnRleHQuIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBuZXh0IGFuZCB3aGF0IHRoYXQgbWlzc2luZyB0eXBlIGlzLiBMZXQmIzM5O3Mgc2VlIHdoYXQgaGFwcGVucyB3aXRoaW4gYHByb2NfZG91aW50dmVjX2NvbnZgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgyMywKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgODIzOlx0XHRcdFx0aW50ICgqY29udikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCB1aW50ICprX3B0cixcbiA4MjQ6XHRcdFx0XHRcdCAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkpXG4gODI1Olx0e1xuIDgyNjpcdFx0LyogdWludCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQsICpEbyBub3QqIGFkZCBzdXBwb3J0IGZvciB0aGVtLiAqL1xuIDgyNzpcdFx0aWYgKHRhYmxlLVx1MDAzZW1heGxlbiBcdTAwMjZcdTAwMjYgKHRhYmxlLVx1MDAzZW1heGxlbiAvIHNpemVvZih1aW50KSkgIT0gMSlcbiA4Mjg6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gODI5Olx0XG4gODMwOlx0XHRpZiAoIWNvbnYpXG4gODMxOlx0XHRcdGNvbnYgPSBkb19wcm9jX3VpbnRfY29udjtcbiA4MzI6XHRcbiA4MzM6XHRcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXG4gODM0Olx0XHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gY29udiB9KTtcbiA4MzU6XHR9XG4gODM2Olx0XG4gODM3Olx0LyoqXG4gODM4Olx0ICogcHJvY19kb2Jvb2wgLSByZWFkL3dyaXRlIGEgYm9vbFxuIDgzOTpcdCAqIEB0YWJsZTogdGhlIHN5c2N0bCB0YWJsZVxuIDg0MDpcdCAqIEBkaXI6ICVUUlVFIGlmIHRoaXMgaXMgYSB3cml0ZSB0byB0aGUgc3lzY3RsIGZpbGVcbiA4NDE6XHQgKiBAYnVmZmVyOiB0aGUgdXNlciBidWZmZXJcbiA4NDI6XHQgKiBAbGVucDogdGhlIHNpemUgb2YgdGhlIHVzZXIgYnVmZmVyXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3OTgyCgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNTI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTWVtb3J5IEhhbmRsaW5nIGluIGBwcm9jX2RvdWludHZlY19jb252YCBhbmQgUmVsYXRlZCBGdW5jdGlvbnMqKgoKT2theSwgc28gYHByb2NfZG91aW50dmVjX2NvbnZgIGVzc2VudGlhbGx5IGhhcmRjb2RlcyBgdGFibGUtJmd0O21heGxlbmAgdG8gYmUgYHNpemVvZih1aW50KWAg4oCTIGdvdCBpdC4gVGhpcyBtZWFucyBpbiBgYXBwbHlfY29udl9vbl92ZWNgLCB3aGVuIGB0YWJsZS0mZ3Q7bWF4bGVuYCBpcyBub3QgZ3JlYXRlciB0aGFuIGBkYXRhX3NpemVgICh3aGljaCBpcyB0aGUgc2FtZSBhcyBgc2l6ZW9mKHVpbnQpYCksIGBkYXRhX3N0YWdlYCAqaXNuJiMzOTt0KiBhbGxvY2F0ZWQuIFRodXMsIGBkYXRhYCBkaXJlY3RseSBwb2ludHMgdG8gYHRhYmxlLSZndDtkYXRhYCwgd2hpY2ggaXMgdmVyeSBjb252ZW5pZW50LiBCZWNhdXNlIGBkYXRhX3N0YWdlYCBpcyBOVUxMLCBgY29tbWl0X2NvbnZfdmVjYCBpcyBza2lwcGVkLiBUaGVyZWZvcmUsIGBQUk9DX1ZFQ19VSU5UYCBkaXJlY3RseSBtb2RpZmllcyBgdGFibGUtJmd0O2RhdGFgLCB3aGljaCBpcyBleHBlY3RlZC4gTm8gbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbXMgdGhlcmUuCgpOb3csIHdoYXQgYWJvdXQgdGhlIGludGVnZXIgYW5kIHVuc2lnbmVkIGxvbmcgdmVyc2lvbnMsIGBQUk9DX1ZFQ19JTlRgIGFuZCBgUFJPQ19WRUNfVUxPTkdgPyBJdCYjMzk7cyBhIHNsaWdodGx5IGRpZmZlcmVudCBzY2VuYXJpby4gSWYgYHRhYmxlLSZndDttYXhsZW5gICppcyogZ3JlYXRlciB0aGFuIGBkYXRhX3NpemVgLCB0aGVuIGBkYXRhX3N0YWdlYCAqaXMqIGFsbG9jYXRlZC4gQnV0IGlmIGB0YWJsZS0mZ3Q7ZGF0YWAgaGFzbiYjMzk7dCBiZWVuIGluaXRpYWxpemVkLCBga21lbWR1cGAgY29waWVzIGl0LiBUaGlzIGlzIHdoZXJlIEkgc3RhcnQgdG8gd29ycnk6IGFyZSB3ZSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBLTVNBTiBpcyB1c3VhbGx5IGdvb2QgYXQgY2F0Y2hpbmcgdGhhdCwgYnV0IGBrbWVtZHVwYCB1c2VzIGBrbWFsbG9jYCBhbmQgYG1lbWNweWAuCgpgbWVtY3B5YCBpdHNlbGYgY29waWVzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBhbmQgS01TQU4gdHJhY2tzIGl0LiBUaGUga2V5IHF1ZXN0aW9uIGlzOiBkb2VzIGBtZW1jcHlgIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5ICp0cmlnZ2VyKiBhIHJlcG9ydD8gTm8sIGl0IGp1c3QgcHJvcGFnYXRlcyB0aGUgc2hhZG93IHN0YXRlLiBUaGF0JiMzOTtzIGdvb2QsIGJ1dCBpdCBtZWFucyB3ZSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bC4KClRoZW4gYHByb2NfdmVjX2NvbnZgIG92ZXJ3cml0ZXMgdGhlIGZpcnN0IGBucl9jb252YCBlbGVtZW50cyBpbiBgZGF0YV9zdGFnZWAuIEFmdGVyIHRoYXQsIGBjb21taXRfY29udl92ZWNgIGNvcGllcyB0aGUgZmlyc3QgYG5yX2NvbnZgIGVsZW1lbnRzIGJhY2sgdG8gYHRhYmxlLSZndDtkYXRhYC4gU3BlY2lmaWNhbGx5OgoKYGBgYwoJCWZvciAoaSA9IDA7IGkgJmx0OyBucjsgaSYjNDM7JiM0MzspCgkJCVdSSVRFX09OQ0UoKChpbnQgKilkc3QpW2ldLCAoKGNvbnN0IGludCAqKXNyYylbaV0pOwpgYGAKClRoaXMgY29waWVzIHRoZSAqaW5pdGlhbGl6ZWQqIGVsZW1lbnRzIGJhY2ssIHdoaWNoIGlzIGZpbmUsIGFzIGBkc3RgIGlzIGB0YWJsZS0mZ3Q7ZGF0YWAsIGFuZCBgc3JjYCBpcyBgZGF0YV9zdGFnZWAuIFRoZSB1bmluaXRpYWxpemVkIHBhcnRzIG9mIGBkYXRhX3N0YWdlYCBhcmUgbmV2ZXIgcmVhZCBvciBjb3BpZWQgKmJhY2sqLgoKSG93ZXZlciwgYW5kIHRoaXMgaXMgY3JpdGljYWw6IFdoYXQgaWYgYHByb2NfdmVjX2NvbnZgIGl0c2VsZiAqcmVhZHMqIGZyb20gYGRhdGFgIGJlZm9yZSBpdCB3cml0ZXMgdG8gaXQ/IEkgc2hvdWxkIHJlLWV4YW1pbmUgYHByb2NfaW50X2NvbnZgIHdpdGggdGhpcyBpbiBtaW5kLiBUaGF0JiMzOTtzIHdoZXJlIGEgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdHkgbGllcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDU0MDpcdGludCBwcm9jX2ludF9jb252KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgaW50ICprX3B0ciwgaW50IGRpcixcbiA1NDE6XHRcdFx0ICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwsIGJvb2wga19wdHJfcmFuZ2VfY2hlY2ssXG4gNTQyOlx0XHRcdCAgaW50ICgqdXNlcl90b19rZXJuKShjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIpLFxuIDU0MzpcdFx0XHQgIGludCAoKmtlcm5fdG9fdXNlcikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKSlcbiA1NDQ6XHR7XG4gNTQ1Olx0XHRpZiAoU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKVxuIDU0NjpcdFx0XHRyZXR1cm4ga2Vybl90b191c2VyKG5lZ3AsIHVfcHRyLCBrX3B0cik7XG4gNTQ3Olx0XG4gNTQ4Olx0XHRpZiAoa19wdHJfcmFuZ2VfY2hlY2spIHtcbiA1NDk6XHRcdFx0aW50IHRtcF9rLCByZXQ7XG4gNTUwOlx0XG4gNTUxOlx0XHRcdGlmICghdGJsKVxuIDU1MjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDU1MzpcdFx0XHRyZXQgPSB1c2VyX3RvX2tlcm4obmVncCwgdV9wdHIsIFx1MDAyNnRtcF9rKTtcbiA1NTQ6XHRcdFx0aWYgKHJldClcbiA1NTU6XHRcdFx0XHRyZXR1cm4gcmV0O1xuIDU1NjpcdFx0XHRpZiAoKHRibC1cdTAwM2VleHRyYTEgXHUwMDI2XHUwMDI2ICooaW50ICopdGJsLVx1MDAzZWV4dHJhMSBcdTAwM2UgdG1wX2spIHx8XG4gNTU3Olx0XHRcdCAgICAodGJsLVx1MDAzZWV4dHJhMiBcdTAwMjZcdTAwMjYgKihpbnQgKil0YmwtXHUwMDNlZXh0cmEyIFx1MDAzYyB0bXBfaykpXG4gNTU4Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNTU5Olx0XHRcdFdSSVRFX09OQ0UoKmtfcHRyLCB0bXBfayk7XG4gNTYwOlx0XHR9IGVsc2VcbiA1NjE6XHRcdFx0cmV0dXJuIHVzZXJfdG9fa2VybihuZWdwLCB1X3B0ciwga19wdHIpO1xuIDU2MjpcdFx0cmV0dXJuIDA7XG4gNTYzOlx0fVxuIDU2NDpcdFxuIDU2NTpcdFxuIDU2NjpcdFxuIDU2NzpcdHN0YXRpYyBpbnQgc3lzY3RsX3VzZXJfdG9fa2Vybl9pbnRfY29udihjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsXG4gNTY4Olx0XHRcdFx0XHRcdGludCAqa19wdHIpXG4gNTY5Olx0e1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTYyOAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgdGhlIERhdGEgRmxvdyB3aXRoaW4gYHByb2NfaW50X2NvbnZgKioKCkFscmlnaHQsIHNvIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlIGBwcm9jX2ludF9jb252YCBmdW5jdGlvbiByaWdodCBub3csIGFuZCBzcGVjaWZpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uYWxpdHkgd2l0aGluIGl0LiBNeSBtaW5kIGltbWVkaWF0ZWx5IGZsYWdzIHRoZSBjYWxsIHRvIGB1c2VyX3RvX2tlcm5gLiBUaGF0JiMzOTtzIGEgY3JpdGljYWwgcG9pbnQsIGlzbiYjMzk7dCBpdD8gSXQgbWVhbnMgd2UmIzM5O3JlIG1vdmluZyBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBrZXJuZWwgc3BhY2UgYXQgdGhhdCBwb2ludC4gSSBuZWVkIHRvIGtlZXAgdGhhdCBpbiBtaW5kIHdoZW4gZXhhbWluaW5nIGFueSBhc3NvY2lhdGVkIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MsIG9yIHBvdGVudGlhbCBkYXRhIGNvcnJ1cHRpb24gaXNzdWVzLiBJIG5lZWQgdG8gcmVmcmVzaCB0aGUgcmVhc29ucyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIGRhdGEgaXQgb3BlcmF0ZXMgb24sIGFuZCB3aGF0IHRoZSB1bHRpbWF0ZSBwdXJwb3NlIGlzLiBDb250ZXh0IGlzIGtleSwgYW5kIHRoYXQgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgcmFpc2VzIGEgcmVkIGZsYWcgaW4gbXkgbWluZCB0aGF0IG5lZWRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NjcsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDU2NzpcdHN0YXRpYyBpbnQgc3lzY3RsX3VzZXJfdG9fa2Vybl9pbnRfY29udihjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsXG4gNTY4Olx0XHRcdFx0XHRcdGludCAqa19wdHIpXG4gNTY5Olx0e1xuIDU3MDpcdFx0cmV0dXJuIHByb2NfaW50X3Uya19jb252X3VvcCh1X3B0ciwga19wdHIsIG5lZ3AsIE5VTEwpO1xuIDU3MTpcdH1cbiA1NzI6XHRcbiA1NzM6XHRzdGF0aWMgaW50IHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKVxuIDU3NDpcdHtcbiA1NzU6XHRcdHJldHVybiBwcm9jX2ludF9rMnVfY29udl9rb3AodV9wdHIsIGtfcHRyLCBuZWdwLCBOVUxMKTtcbiA1NzY6XHR9XG4gNTc3Olx0XG4gNTc4Olx0c3RhdGljIGludCBkb19wcm9jX2ludF9jb252KGJvb2wgKm5lZ3AsIHVuc2lnbmVkIGxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLFxuIDU3OTpcdFx0XHRcdCAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwpXG4gNTgwOlx0e1xuIDU4MTpcdFx0cmV0dXJuIHByb2NfaW50X2NvbnYobmVncCwgdV9wdHIsIGtfcHRyLCBkaXIsIHRibCwgZmFsc2UsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwMTc5CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gY2hlY2tpbmcgYHByb2NfaW50X3Uya19jb252X3VvcGAgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCBtdXNpbmdzOgoKKipBbmFseXppbmcgYHByb2NfaW50X3Uya19jb252X3VvcGAqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIE15IGZpcnN0IGluc3RpbmN0IGlzIHRvIHplcm8gaW4gb24gdGhhdCBzcGVjaWZpYyBmdW5jdGlvbiDigJMgYHByb2NfaW50X3Uya19jb252X3VvcGAuIEkga25vdyB0aGlzIGlzIGxpa2VseSBzb21lIGtpbmQgb2YgaW50ZWdlciB0byBLIGNvbnZlcnNpb24gbWljcm8tb3AgcHJvY2Vzc29yLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IHdoYXQgdGhhdCBtZWFucy4gSXMgdGhpcyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlPyBJcyBpdCBhIHN0YW5kYXJkIGNvbnZlcnNpb24/IFdoYXQmIzM5O3MgdGhlIGNvbnRleHQ/CgpNeSBpbW1lZGlhdGUgY2hlY2tsaXN0IHN0YXJ0cyBydW5uaW5nOgoKKiAgICoqRGF0YSBUeXBlczoqKiBXaGF0IGFyZSB0aGUgaW5wdXQgaW50ZWdlciB0eXBlcz8gSXMgaXQgYSBzaWduZWQgb3IgdW5zaWduZWQgaW50ZWdlciwgYW5kIHRoZSBleGFjdCBiaXQgd2lkdGg/IFdoZXJlIGlzIGl0IGNvbnZlcnRpbmcgKnRvKj8gSXMgJiMzNDtLJiMzNDsgYSBzcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvciBzb21lIHNvcnQgb2YgaW50ZXJtZWRpYXRlIGludGVybmFsIGZvcm1hdD8KKiAgICoqT3BlcmF0aW9uOioqIFdoYXQgc3BlY2lmaWMgKmNvbnZlcnNpb24qIGlzIGl0IGRvaW5nPyBJcyBpdCBzaW1wbGUgdHJ1bmNhdGlvbiwgcm91bmRpbmcsIHNhdHVyYXRpb24sIG9yIHNvbWV0aGluZyBtb3JlIGNvbXBsZXg/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBiZWhhdmlvciB1bmRlciBkaWZmZXJlbnQgaW5wdXQgY29uZGl0aW9ucywgZXNwZWNpYWxseSBlZGdlIGNhc2VzIGxpa2UgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMsIG5lZ2F0aXZlIG51bWJlcnMsIGFuZCB6ZXJvZXMuCiogICAqKkltcGxlbWVudGF0aW9uOioqIEhvdyBpcyBpdCBpbXBsZW1lbnRlZD8gSXMgdGhpcyBhIGhhcmR3YXJlIGJsb2NrLCBvciBhIHNvZnR3YXJlIHJvdXRpbmU/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIG9yIG9wdGltaXphdGlvbnMgSSBzaG91bGQgY29uc2lkZXI/IEFyZSB0aGVyZSBhbnkgb2J2aW91cyBidWdzIHRoYXQgY2FuIHRyaXAgaXQgdXA/CiogICAqKkNvbnRleHQ6KiogV2hhdCYjMzk7cyB0aGUgc3Vycm91bmRpbmcgY29kZSB1c2luZyB0aGlzIGB1b3BgPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGF0YSBmbG93LCB0aGUgY2FsbGluZyBjb250ZXh0LCBhbmQgdGhlIGRvd25zdHJlYW0gY29uc3VtZXJzIG9mIHRoZSByZXN1bHQuIEhvdyBkb2VzIHRoaXMgZml0IGludG8gdGhlIGxhcmdlciBwaWN0dXJlIG9mIHRoZSBwcm9jZXNzb3ImIzM5O3MgcGlwZWxpbmU/IFdoYXQmIzM5O3MgdGhlIG92ZXJhbGwgaW1wYWN0IG9uIHN5c3RlbSBwZXJmb3JtYW5jZT8KKiAgICoqVGVzdGluZzoqKiBXaGF0IGtpbmQgb2YgdGVzdGluZyBoYXMgYmVlbiBkb25lIG9uIHRoaXM/IFdoYXQgdGVzdHMgYXJlIGluIHBsYWNlIHRvIGNvdmVyIHRoZSBkaWZmZXJlbnQgc2NlbmFyaW9zIEkgbWVudGlvbmVkLCBhbmQgaG93IHRob3JvdWdoIGFyZSB0aGV5PyBBcmUgdGhlcmUgYW55IGtub3duIGlzc3VlcyBvciBhcmVhcyBvZiBjb25jZXJuPwoKSSYjMzk7bGwgbmVlZCB0byBkaWcgaW50byB0aGUgc291cmNlIGNvZGUsIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIGFueSByZWxldmFudCBhcmNoaXRlY3R1cmUgbWFudWFscyB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgdGhpcyBpcyBhIGNyaXRpY2FsIGNvbXBvbmVudCwgaWYgaXQmIzM5O3Mgbm90IHdvcmtpbmcgY29ycmVjdGx5IGl0IGNhbiBlYXNpbHkgY2F1c2UgaXNzdWVzLiBJdCYjMzk7cyB0aW1lIHRvIHB1dCBvbiBteSBkZXRlY3RpdmUgaGF0IGFuZCBmaW5kIG91dCB3aGF0JiMzOTtzIGdvaW5nIG9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDUwNiwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTA2Olx0aW50IHByb2NfaW50X3Uya19jb252X3VvcChjb25zdCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIsIGNvbnN0IGJvb2wgKm5lZ3AsXG4gNTA3Olx0XHRcdFx0ICB1bG9uZyAoKnVfcHRyX29wKShjb25zdCB1bG9uZykpXG4gNTA4Olx0e1xuIDUwOTpcdFx0dWxvbmcgdSA9IHVfcHRyX29wID8gdV9wdHJfb3AoKnVfcHRyKSA6ICp1X3B0cjtcbiA1MTA6XHRcbiA1MTE6XHRcdGlmICgqbmVncCkge1xuIDUxMjpcdFx0XHRpZiAodSBcdTAwM2UgKHVsb25nKSBJTlRfTUFYICYjNDM7IDEpXG4gNTEzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNTE0Olx0XHRcdFdSSVRFX09OQ0UoKmtfcHRyLCAtdSk7XG4gNTE1Olx0XHR9IGVsc2Uge1xuIDUxNjpcdFx0XHRpZiAodSBcdTAwM2UgKHVsb25nKSBJTlRfTUFYKVxuIDUxNzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDUxODpcdFx0XHRXUklURV9PTkNFKCprX3B0ciwgdSk7XG4gNTE5Olx0XHR9XG4gNTIwOlx0XHRyZXR1cm4gMDtcbiA1MjE6XHR9XG4gNTIyOlx0XG4gNTIzOlx0LyoqXG4gNTI0Olx0ICogcHJvY19pbnRfY29udiAtIENoYW5nZSB1c2VyIG9yIGtlcm5lbCBwb2ludGVyIGJhc2VkIG9uIGRpcmVjdGlvblxuIDUyNTpcdCAqXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxMDI0CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTWVtb3J5IFNhZmV0eSBvZiB0aGUgQ29udmVyc2lvbiBQcm9jZXNzKioKCk9rYXksIHNvIGBwcm9jX2ludF91MmtfY29udl91b3BgIG9ubHkgKndyaXRlcyogdG8gYCprX3B0cmAsIGFuZCBJJiMzOTttIHByZXR0eSBzdXJlIGBwcm9jX3ZlY19jb252YCBvbmx5ICp3cml0ZXMqIHRvIGBkYXRhYCB3aGVuIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggdGhlIGBTWVNDVExfVVNFUl9UT19LRVJOYCBjYXNlLiBUaGVyZWZvcmUsIGluIHRoYXQgZGlyZWN0aW9uLCB0aGVyZSYjMzk7cyBubyByZWFkIGZyb20gYGRhdGFgIHRoYXQgY291bGQgY2F1c2UgdHJvdWJsZS4gTm93LCBgY29tbWl0X2NvbnZfdmVjYCAqcmVhZHMqIG9ubHkgdGhlIGBkYXRhX3N0YWdlYCBlbGVtZW50cyB0aGF0ICp3ZXJlIHdyaXR0ZW4gdG8qLCB1cCB0byBgbnJfY29udmAuCgpIb2xkIG9uLi4uIHdoYXQgaWYgYHByb2NfdmVjX2NvbnZgIGJhaWxzIG91dCBvbiB0aGUgdmVyeSAqZmlyc3QqIGVsZW1lbnQ/IFRoYXQgbWVhbnMgYG5yX2NvbnZgIHdvdWxkIGJlIHplcm8sIHJpZ2h0PyBMZXQmIzM5O3MgY2hlY2sgdGhlIGNvZGUuLi4gWWVwLCBpZiBgbnJfY29udmAgaXMgemVybywgd2UgYmFpbCBvdXQgaW1tZWRpYXRlbHk6CgpgYGBjCgkJaWYgKCFucl9jb252KSB7CgkJCWVyciA9IGVyciA/IDogLUVJTlZBTDsKCQkJZ290byBvdXQ7CgkJfQoJCWlmICghZXJyICZhbXA7JmFtcDsgZGF0YV9zdGFnZSkKCQkJZXJyID0gY29tbWl0X2NvbnZfdmVjKGRhdGFfdHlwZSwgdGFibGUtJmd0O2RhdGEsIGRhdGFfc3RhZ2UsIG5yX2NvbnYpOwpgYGAKClNvLCBpZiBgbnJfY29udmAgaXMgemVybywgd2UganVtcCB0byBgb3V0YCwgYW5kIGBjb21taXRfY29udl92ZWNgICppc24mIzM5O3QqIGV2ZW4gY2FsbGVkLiBJZiBgbnJfY29udmAgaXMgZ3JlYXRlciB0aGFuIHplcm8sIHRoZW4gd2UgKmRvKiBjYWxsIGBjb21taXRfY29udl92ZWNgIHdpdGggYG5yX2NvbnZgLCBzbyBpdCAqb25seSogY29waWVzIHdoYXQgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYW5kIHdyaXR0ZW4gdG8gYGRhdGFfc3RhZ2VgLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBsZWFrcy4gVGhhdCYjMzk7cyBnb29kLgoKQnV0LCB3aGF0IGlmIGBTWVNDVExfS0VSTl9UT19VU0VSYCBpcyB0aGUgY2FzZT8KCmBgYGMKCQl9IGVsc2UgewoJCQlpZiAocHJvY192ZWNfY29udihkYXRhX3R5cGUsIGNvbnYsICZhbXA7bmVnLCAmYW1wO2x2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHsKCQkJCWVyciA9IC1FSU5WQUw7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAobnJfY29udikKCQkJCXByb2NfcHV0X2NoYXIoJmFtcDtidWYsICZhbXA7YnVmX2xlZnQsICYjMzk7XHQmIzM5Oyk7CgkJCXByb2NfcHV0X2xvbmcoJmFtcDtidWYsICZhbXA7YnVmX2xlZnQsIGx2YWwsIG5lZyk7CgkJfQpgYGAKCk9rYXksIGluIHRoaXMgc2NlbmFyaW8sIGBkYXRhYCBpcyBwb2ludGluZyB0byBgdGFibGUtJmd0O2RhdGFgLCB3aGljaCBtZWFucyB0aGUgYGRhdGFgIGFycmF5IGlzIGJlaW5nIHJlYWQuIExvb2tpbmcgYXQgYHByb2NfdmVjX2NvbnZgIGNhbGxzIGBwcm9jX2ludF9jb252YCB3aGljaCB0aGVuIGNhbGxzIGBrZXJuX3RvX3VzZXJgLiBJJiMzOTttIGdvaW5nIHRvIGhhdmUgdG8gZGl2ZSBpbnRvIHRob3NlIGZ1bmN0aW9ucyBuZXh0LCBidXQgYmFzZWQgb24gdGhlIGNvZGUgSSYjMzk7dmUgbG9va2VkIGF0LCB0aGUgd3JpdGUgcHJvY2VzcyBzZWVtcyBzYWZlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ5MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDkxOlx0XHRyZXR1cm4gMDtcbiA0OTI6XHR9XG4gNDkzOlx0XG4gNDk0Olx0LyoqXG4gNDk1Olx0ICogcHJvY19pbnRfdTJrX2NvbnZfdW9wIC0gQXNzaWduIHVzZXIgdmFsdWUgdG8gYSBrZXJuZWwgcG9pbnRlclxuIDQ5NjpcdCAqIEB1X3B0cjogcG9pbnRlciB0byB1c2VyIHNwYWNlIHZhcmlhYmxlXG4gNDk3Olx0ICogQGtfcHRyOiBwb2ludGVyIHRvIGtlcm5lbCB2YXJpYWJsZVxuIDQ5ODpcdCAqIEBuZWdwOiBJZiAlVFJVRSwgdGhlIGNvbnZlcnRlZCB1c2VyIHZhbHVlIGlzIG1hZGUgbmVnYXRpdmUuXG4gNDk5Olx0ICogQHVfcHRyX29wOiBleGVjdXRlIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGFzc2lnbmluZyB0byBrX3B0clxuIDUwMDpcdCAqXG4gNTAxOlx0ICogVXNlcyBXUklURV9PTkNFIHRvIGFzc2lnbiB2YWx1ZSB0byBrX3B0ci4gRXhlY3V0ZXMgdV9wdHJfb3AgaWZcbiA1MDI6XHQgKiBub3QgTlVMTC4gQ2hlY2sgZm9yIG92ZXJmbG93IHdpdGggVUlOVF9NQVguXG4gNTAzOlx0ICpcbiA1MDQ6XHQgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MuXG4gNTA1Olx0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyMzE1CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gdGFja2xpbmcgdGhpcyBzbmlwcGV0LCByZW5kZXJlZCBhcyBpZiBpdCB3ZXJlIG15IG93biBpbnRlcm5hbCBtb25vbG9ndWU6CgoqKkFuYWx5emluZyBgcHJvY19pbnRfazJ1X2NvbnZfa29wYCoqCgpBbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTXkgZmlyc3QgaW5zdGluY3QsIGFzIGFsd2F5cywgaXMgdG8gemVybyBpbiBvbiB0aGF0IGZ1bmN0aW9uOiBgcHJvY19pbnRfazJ1X2NvbnZfa29wYC4gVGhlIG5hbWUgaXRzZWxmIGlzIGEgY2x1ZSwgc28gbGV0JiMzOTtzIGJyZWFrIGl0IGRvd24uICYjMzQ7cHJvYyYjMzQ7IGxpa2VseSBpbmRpY2F0ZXMgYSBwcm9jZWR1cmUgb3IgcHJvY2Vzc2luZyBmdW5jdGlvbi4gJiMzNDtpbnQmIzM0OyBzdWdnZXN0cyB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIGludGVnZXJzLCBhbmQgJiMzNDtrMnUmIzM0OyBzZWVtcyB0byBpbXBseSBzb21lIGtpbmQgb2Yga2VybmVsLXRvLXVzZXIgc3BhY2UgY29udmVyc2lvbi4gVGhlICYjMzQ7Y29udiYjMzQ7IGlzIGNsZWFyIC0gYSBjb252ZXJzaW9uIGlzIGhhcHBlbmluZy4gQW5kIGZpbmFsbHksICYjMzQ7a29wJiMzNDsgLi4uIGhtbW0sIHBvdGVudGlhbGx5IGEga2VybmVsIG9wZXJhdGlvbiBvciBrZXJuZWwgb2JqZWN0LCBvciBzb21ldGhpbmcgbGlrZSB0aGF0LgoKU28sIEkmIzM5O20gYWxyZWFkeSBidWlsZGluZyBhIG1lbnRhbCBtb2RlbDogdGhpcyBmdW5jdGlvbiBwcm9iYWJseSBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGludGVnZXIgZGF0YSwgbGlrZWx5IHJlbGF0ZWQgdG8ga2VybmVsIG9wZXJhdGlvbnMgb3Igb2JqZWN0cywgZnJvbSB0aGUga2VybmVsIHNwYWNlIHRvIHRoZSB1c2VyIHNwYWNlLiBUaGUgZGV2aWwmIzM5O3MgaW4gdGhlIGRldGFpbHMgdGhvdWdoLCBhbmQgSSBuZWVkIHRvIHNlZSB3aGF0IGV4YWN0bHkgaXQgKmRvZXMqLiBJIG5lZWQgdG8gc3RhcnQgZGlnZ2luZyB0aHJvdWdoIHRoZSBzdXJyb3VuZGluZyBjb2RlLiBNeSBpbW1lZGlhdGUgZm9jdXMgaXMgdG8gdW5kZXJzdGFuZCAqd2h5KiB0aGlzIGNvbnZlcnNpb24gaXMgbmVlZGVkLCBhbmQgKndoYXQqIGtpbmQgb2YgZGF0YSBpcyBiZWluZyBoYW5kbGVkLiBXaGF0IGFyZSB0aGUgc2VjdXJpdHkgaW1wbGljYXRpb25zPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgcmVsYXRlZCB0byBpbnRlZ2VyIG92ZXJmbG93IG9yIGRhdGEgY29ycnVwdGlvbj8gSSB3YW50IHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBpcyAqdXNlZCogYW5kIHdoZXJlIGl0JiMzOTtzICpjYWxsZWQqIGZyb20uIEkmIzM5O2xsIG5lZWQgdG8gdHJhY2UgdGhlIGRhdGEgZmxvdyB0aHJvdWdoIGl0LiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UmIzM5O3ZlIGdvdC4gTGV0JiMzOTtzIHN0YXJ0IHRoZSBkZWVwIGRpdmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Byb2NfaW50X2sydV9jb252X2tvcCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvc3lzY3RsLmM9NDU5PXN0YXRpYyBpbnQgZG9fcHJvY191aW50X2NvbnZfbWlubWF4KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWludCAqa19wdHIsXG4tLVxua2VybmVsL3N5c2N0bC5jLTQ2Ni0vKipcbmtlcm5lbC9zeXNjdGwuYzo0Njc6ICogcHJvY19pbnRfazJ1X2NvbnZfa29wIC0gQXNzaWduIGtlcm5lbCB2YWx1ZSB0byBhIHVzZXIgc3BhY2UgcG9pbnRlclxua2VybmVsL3N5c2N0bC5jLTQ2OC0gKiBAdV9wdHI6IHBvaW50ZXIgdG8gdXNlciBzcGFjZSB2YXJpYWJsZVxuLS1cbmtlcm5lbC9zeXNjdGwuYy00NzgtICovXG5rZXJuZWwvc3lzY3RsLmM6NDc5OmludCBwcm9jX2ludF9rMnVfY29udl9rb3AodWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyLCBib29sICpuZWdwLFxua2VybmVsL3N5c2N0bC5jLTQ4MC1cdFx0XHQgIHVsb25nICgqa19wdHJfb3ApKGNvbnN0IHVsb25nKSlcbi0tXG5rZXJuZWwvc3lzY3RsLmM9NTczPXN0YXRpYyBpbnQgc3lzY3RsX2tlcm5fdG9fdXNlcl9pbnRfY29udihib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGNvbnN0IGludCAqa19wdHIpXG5rZXJuZWwvc3lzY3RsLmMtNTc0LXtcbmtlcm5lbC9zeXNjdGwuYzo1NzU6XHRyZXR1cm4gcHJvY19pbnRfazJ1X2NvbnZfa29wKHVfcHRyLCBrX3B0ciwgbmVncCwgTlVMTCk7XG5rZXJuZWwvc3lzY3RsLmMtNTc2LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTMgMTU6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjMwMzIKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ3OSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDc5Olx0aW50IHByb2NfaW50X2sydV9jb252X2tvcCh1bG9uZyAqdV9wdHIsIGNvbnN0IGludCAqa19wdHIsIGJvb2wgKm5lZ3AsXG4gNDgwOlx0XHRcdFx0ICB1bG9uZyAoKmtfcHRyX29wKShjb25zdCB1bG9uZykpXG4gNDgxOlx0e1xuIDQ4MjpcdFx0aW50IHZhbCA9IFJFQURfT05DRSgqa19wdHIpO1xuIDQ4MzpcdFxuIDQ4NDpcdFx0aWYgKHZhbCBcdTAwM2MgMCkge1xuIDQ4NTpcdFx0XHQqbmVncCA9IHRydWU7XG4gNDg2Olx0XHRcdCp1X3B0ciA9IGtfcHRyX29wID8gLWtfcHRyX29wKCh1bG9uZyl2YWwpIDogLSh1bG9uZyl2YWw7XG4gNDg3Olx0XHR9IGVsc2Uge1xuIDQ4ODpcdFx0XHQqbmVncCA9IGZhbHNlO1xuIDQ4OTpcdFx0XHQqdV9wdHIgPSBrX3B0cl9vcCA/IGtfcHRyX29wKCh1bG9uZyl2YWwpIDogKHVsb25nKSB2YWw7XG4gNDkwOlx0XHR9XG4gNDkxOlx0XHRyZXR1cm4gMDtcbiA0OTI6XHR9XG4gNDkzOlx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzMzI1CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjk1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLTVNBTiBBbmFseXNpcyBvZiBTeXNjdGwgVmVjdG9yIFVwZGF0ZSBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBwcmltYXJ5IGNvbmNlcm4gaXMgd2hldGhlciB0aGlzIHBhdGNoIGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIHRoYXQgY291bGQgbGVhZCB0byBpbmZvcm1hdGlvbiBsZWFrcy4gRmlyc3QsIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiBgcHJvY19pbnRfazJ1X2NvbnZfa29wYCBpcyB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBwYXRjaCDigJMgaXQgcmVhZHMgZnJvbSBgdGFibGUtJmd0O2RhdGFgLCB3aGljaCBpcyB0aGUgc3lzY3RsIHRhYmxlJiMzOTtzIGRhdGEgYXJlYS4gQ3J1Y2lhbGx5LCB0aGlzIHJlYWQgKndhcyogYWxyZWFkeSBwcmVzZW50LCBzbyBhbnkgZXhpc3RpbmcgaXNzdWVzIHdpdGggdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gYHRhYmxlLSZndDtkYXRhYCBhcmUgKnByZS1leGlzdGluZyogYW5kICpub3QqIGEgY29uc2VxdWVuY2Ugb2YgdGhpcyByZWZhY3RvcmluZy4gVGhlIHBhdGNoIHNpbXBseSByZXN0cnVjdHVyZXMgdGhlIGxvb3BpbmcgbG9naWMuCgpUaGUga2V5IGNoYW5nZSBsaWVzIGluIGhhbmRsaW5nIHVzZXItdG8ta2VybmVsIHdyaXRlcy4gQmVmb3JlIHRoZSBwYXRjaCwgdGhlIGNvZGUgaW4gYGRvX3Byb2NfdmVjYCBwYXJzZWQgaW5jb21pbmcgZGF0YSwgYW5kIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgcGFyc2luZyBvZiBhICpzdWJzZXF1ZW50KiBlbGVtZW50IGl0IGNvdWxkIGxlYXZlICpwYXJ0KiBvZiB0aGUgYXJyYXkgdXBkYXRlZCDigJMgdGhpcyBpcyBhIHBhcnRpYWwgdXBkYXRlIHZ1bG5lcmFiaWxpdHkuIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgYGRhdGFfc3RhZ2VgIGNvcHkgb2YgYHRhYmxlLSZndDtkYXRhYC4gVGhpcyBpcyBwcm9taXNpbmchIFRoZSBwYXRjaCBub3cgd3JpdGVzIHRvIHRoZSBgZGF0YV9zdGFnZWAsIGFuZCBpbXBvcnRhbnRseSwgdGhlIG9yaWdpbmFsIGNvZGUgKndhcyogc3VzY2VwdGlibGUgdG8gdGhpcywgaXQgd2lsbCBOT1QgY2FsbCBgY29tbWl0X2NvbnZfdmVjYCBvbiBlcnJvcjsgdGhpcyBpcyB0aGUga2V5IHRvIGZpeGluZyB0aGUgcGFydGlhbCB1cGRhdGUgYnVnLiBJdCBhdm9pZHMgdXBkYXRpbmcgYHRhYmxlLSZndDtkYXRhYCBpZiBhbnkgZWxlbWVudCBwYXJzZSBmYWlscy4KClRoZSBpbnRyb2R1Y3Rpb24gb2YgYGRhdGFfc3RhZ2VgIHZpYSBga21lbWR1cGAgaXMgdGhlIGFyZWEgSSBuZWVkIHRvIHNjcnV0aW5pemUuIGBrbWVtZHVwYCBhbGxvY2F0ZXMgbWVtb3J5LCB3aGljaCBpcyBnb29kLiBCdXQgaXQgKmNvcGllcyogZnJvbSBgdGFibGUtJmd0O2RhdGFgLiBJZiBgdGFibGUtJmd0O2RhdGFgIGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBga21lbWR1cGAgd2lsbCBjb3B5IHRoYXQgdG9vLiBIb3dldmVyLCBzaW5jZSB0aGUgY29weSBpcyBkb25lIHdpdGggYG1lbWNweWAsIEtNU0FOIGlzbiYjMzk7dCB0cmlnZ2VyZWQgYnkgdGhhdDsgYGttZW1kdXBgIGNvcGllcyBmcm9tIGB0YWJsZS0mZ3Q7ZGF0YWAgaW50byBhIG5ldyBhbGxvY2F0ZWQgbWVtb3J5LiBBZnRlciB0aGUgbW9kaWZpY2F0aW9uIG9mIGBkYXRhX3N0YWdlYCBpcyB0aGUgcG9pbnQgd2hlcmUgdGhlIGBjb21taXRfY29udl92ZWNgIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgcGFyc2VkIGRhdGEsIGFuZCB3cml0ZSBiYWNrIGludG8gYHRhYmxlLSZndDtkYXRhYC4gVGhlbiwgb25seSBgaW50YCBvciBgdWxvbmdgIGVsZW1lbnRzIGFyZSBjb3BpZWQgdG8gYHRhYmxlLSZndDtkYXRhYCwgbm90IHRoZSBmdWxsIGBkYXRhX3N0YWdlYC4gVGhlcmVmb3JlLCBhbnkgdW5pbml0aWFsaXplZCBwYWRkaW5nIGluIGBkYXRhX3N0YWdlYCBpc24mIzM5O3QgY29waWVkIGJhY2sgdG8gdGhlIHN5c2N0bCBkYXRhLiBTaW5jZSB0aGUgc3lzY3RsIHZlY3RvcnMgYXJlIGV4cGxpY2l0bHkgZGVmaW5lZCBhcyBhcnJheXMgb2YgYGludGAsIGB1aW50YCwgb3IgYHVsb25nYCwgdGhlcmUmIzM5O3Mgbm8gcGFkZGluZyBiZXR3ZWVuIGVsZW1lbnRzLiBUaGVyZWZvcmUsIHRoaXMgZWxpbWluYXRlcyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSAqbGVha2luZyogYmFjayB0byBgdGFibGUtJmd0O2RhdGFgLgoKQSBzZWNvbmRhcnkgY2hlY2sgaXMgd2hldGhlciBgdGFibGUtJmd0O21heGxlbmAgKmNvdWxkKiBiZSBhIHZlY3RvciB3aGVyZSBhIGBrbWVtZHVwYCBjb3VsZCBjYXVzZSBhbiBvdXQtb2YtYm91bmRzIHJlYWQgaWYgdGhlIGludGVuZGVkIGRhdGEuIFRoZSBgdmVjX2xlZnQgPSB0YWJsZS0mZ3Q7bWF4bGVuIC8gZGF0YV9zaXplO2AgaXMgdXNlZCwgdGhlIGxvb3Agb25seSBwcm9jZXNzZXMgdGhlIGNvcnJlY3QgZWxlbWVudHMgYW5kIGBjb21taXRfY29udl92ZWNgIG9ubHkgY29waWVzIHdpdGhpbiB0aGUgY29ycmVjdCBib3VuZGFyaWVzLgoKSWYgYHRhYmxlLSZndDttYXhsZW5gIGlzLCBieSBhbnkgbWVhbnMsIGxhcmdlciB0aGFuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGl0IGlzIGEgYnVnIGluIHRoZSBzeXNjdGwgdGFibGUgZGVmaW5pdGlvbiwgdGhhdCBjYXVzZXMgYW4gT09CIHJlYWQgKmFueXdheSogKGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IGNvZGUpIHdoaWNoIEtBU0FOIHdvdWxkIGNhdGNoLgoKTm93LCBsZXQmIzM5O3MgZXhwbG9yZSBgYXBwbHlfY29udl9vbl92ZWNgLiBJZiBgdGFibGUtJmd0O21heGxlbiAmbHQ7PSBkYXRhX3NpemVgLCB3aGljaCBpcyBhdCBtb3N0IG9uZSBlbGVtZW50LCBgZGF0YV9zdGFnZWAgaXMgYE5VTExgLCBhbmQgdGhlIGNvZGUgKmRpcmVjdGx5KiBtb2RpZmllcyBgdGFibGUtJmd0O2RhdGFgLiBIb3dldmVyLCBgcHJvY192ZWNfY29udmAgaXMgb25seSBjYWxsZWQgKmFmdGVyKiBhIHN1Y2Nlc3NmdWwgYHByb2NfZ2V0X2xvbmdgLiBUaGUgc2luZ2xlLWVsZW1lbnQgY2FzZSBpcyBhbHJlYWR5IHNhZmUhIElmIGBwcm9jX2dldF9sb25nYCBmYWlscywgaXQgZXhpdHMgYmVmb3JlIGFueSBtb2RpZmljYXRpb24uCgpBbHNvLCBgcHJvY19pbnRfY29udmAgcGVyZm9ybXMgYW4gaW50ZWdlciByYW5nZSBjaGVjayAqYmVmb3JlKiB3cml0aW5nIHRvIGAqa19wdHJgLiBUaGlzIGNvbmZpcm1zIHNhZmUgd3JpdGVzIHRvIGAqa19wdHJgLgoKTm93LCByZXZpZXdpbmcgS01TQU4mIzM5O3MgY3JpdGVyaWE6IFRoaXMgcGF0Y2ggbW9kaWZpZXMgdXNlciB0byBrZXJuZWwuIFNpbmNlIHRoZSBkYXRhIGlzIGNvcGllZCBhbmQgYWxsIG9mIHRoZSBib3VuZHMgYXJlIHZhbGlkYXRlZCwgdGhlcmUgaXMgbm8gcmVhbCByZWFzb24gdG8gdXNlIEtNU0FOLiBJdCBmaXhlcyBhIHBhcnRpYWwgdXBkYXRlIGlzc3VlLCB3aGljaCBhdm9pZHMgaW5mb3JtYXRpb24gbGVhay4gVGhlcmUgYXJlIG5vIGtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSB0aGF0IGFyZSBub3QgaW5pdGlhbGl6ZWQuIFRoZXJlJiMzOTtzIG5vIGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGluZyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgYW5kIHRoZSBzdHJ1Y3R1cmVzIGFyZSB3ZWxsLWRlZmluZWQuIFRoZSBga21lbWR1cGAgb25seSBkdXBsaWNhdGVzIHRoZSBpbnRlbmRlZCBkYXRhOyBJdCBhdm9pZHMgaW5mb3JtYXRpb24gbGVha3MuIEtNU0FOIGlzIG5vdCBuZWNlc3NhcnksIGFzIHRoaXMgaXMgYSBmdW5jdGlvbmFsIGltcHJvdmVtZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9zeXNjdGwuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDY3MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjcwOlx0c3RhdGljIGludCBhcHBseV9jb252X29uX3ZlYyhjb25zdCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXG4gNjcxOlx0XHRcdFx0ICAgICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSxcbiA2NzI6XHRcdFx0XHQgICAgIGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsXG4gNjczOlx0XHRcdFx0ICAgICBjb25zdCBzaXplX3QgZGF0YV9zaXplLCBjb25zdCBpbnQgY29udl9kaXIsXG4gNjc0Olx0XHRcdFx0ICAgICBjb25zdCBzaXplX3QgYnVmX25ieXRlLCB2b2lkICpidWYsXG4gNjc1Olx0XHRcdFx0ICAgICBzaXplX3QgKmJ1Zl9sZWZ0X2ZpbmFsKVxuIDY3NjpcdHtcbiA2Nzc6XHRcdGludCB2ZWNfbGVmdCwgZXJyID0gMDtcbiA2Nzg6XHRcdHNpemVfdCBidWZfbGVmdCwgbnJfY29udiA9IDA7XG4gNjc5Olx0XHRjaGFyICpkYXRhLCAqZGF0YV9zdGFnZSA9IE5VTEwsICpwO1xuIDY4MDpcdFx0Ym9vbCBpc191bnNpZ25lZCA9IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VSU5UIHx8IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VTE9ORztcbiA2ODE6XHRcbiA2ODI6XHRcdGJ1Zl9sZWZ0ID0gYnVmX25ieXRlO1xuIDY4MzpcdFxuIDY4NDpcdFx0ZGF0YSA9IHRhYmxlLVx1MDAzZWRhdGE7XG4gNjg1Olx0XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbiA2ODY6XHRcdFx0aWYgKGJ1Zl9sZWZ0IFx1MDAzZSBQQUdFX1NJWkUgLSAxKVxuIDY4NzpcdFx0XHRcdGJ1Zl9sZWZ0ID0gUEFHRV9TSVpFIC0gMTtcbiA2ODg6XHRcdFx0cCA9IGJ1ZjtcbiA2ODk6XHRcbiA2OTA6XHRcdFx0aWYgKHRhYmxlLVx1MDAzZW1heGxlbiBcdTAwM2UgZGF0YV9zaXplKSB7XG4gNjkxOlx0XHRcdFx0ZGF0YV9zdGFnZSA9IGttZW1kdXAodGFibGUtXHUwMDNlZGF0YSwgdGFibGUtXHUwMDNlbWF4bGVuLCBHRlBfS0VSTkVMKTtcbiA2OTI6XHRcdFx0XHRpZiAoIWRhdGFfc3RhZ2UpIHtcbiA2OTM6XHRcdFx0XHRcdGVyciA9IC1FTk9NRU07XG4gNjk0Olx0XHRcdFx0XHRnb3RvIG91dDtcbiA2OTU6XHRcdFx0XHR9XG4gNjk2Olx0XHRcdFx0ZGF0YSA9IGRhdGFfc3RhZ2U7XG4gNjk3Olx0XHRcdH1cbiA2OTg6XHRcdH1cbiA2OTk6XHRcbiA3MDA6XHRcdHZlY19sZWZ0ID0gdGFibGUtXHUwMDNlbWF4bGVuIC8gZGF0YV9zaXplO1xuIDcwMTpcdFx0Zm9yICg7IGJ1Zl9sZWZ0IFx1MDAyNlx1MDAyNiB2ZWNfbGVmdC0tOyBkYXRhICYjNDM7PSBkYXRhX3NpemUsIG5yX2NvbnYmIzQzOyYjNDM7KSB7XG4gNzAyOlx0XHRcdHVuc2lnbmVkIGxvbmcgbHZhbDtcbiA3MDM6XHRcdFx0Ym9vbCBuZWcgPSBmYWxzZTtcbiA3MDQ6XHRcbiA3MDU6XHRcdFx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oY29udl9kaXIpKSB7XG4gNzA2Olx0XHRcdFx0cHJvY19za2lwX3NwYWNlcyhcdTAwMjZwLCBcdTAwMjZidWZfbGVmdCk7XG4gNzA3Olx0XG4gNzA4Olx0XHRcdFx0aWYgKCFidWZfbGVmdClcbiA3MDk6XHRcdFx0XHRcdGJyZWFrO1xuIDcxMDpcdFx0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQsIFx1MDAyNmx2YWwsIFx1MDAyNm5lZyxcbiA3MTE6XHRcdFx0XHRcdFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcbiA3MTI6XHRcdFx0XHRcdFx0ICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTtcbiA3MTM6XHRcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgbmVnIFx1MDAyNlx1MDAyNiBpc191bnNpZ25lZClcbiA3MTQ6XHRcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gNzE1Olx0XHRcdFx0aWYgKGVycilcbiA3MTY6XHRcdFx0XHRcdGJyZWFrO1xuIDcxNzpcdFx0XHRcdGlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgXHUwMDI2bmVnLCBcdTAwMjZsdmFsLCBkYXRhLCBjb252X2RpciwgdGFibGUpKSB7XG4gNzE4Olx0XHRcdFx0XHRlcnIgPSAtRUlOVkFMO1xuIDcxOTpcdFx0XHRcdFx0YnJlYWs7XG4gNzIwOlx0XHRcdFx0fVxuIDcyMTpcdFx0XHR9IGVsc2Uge1xuIDcyMjpcdFx0XHRcdGlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgXHUwMDI2bmVnLCBcdTAwMjZsdmFsLCBkYXRhLCBjb252X2RpciwgdGFibGUpKSB7XG4gNzIzOlx0XHRcdFx0XHRlcnIgPSAtRUlOVkFMO1xuIDcyNDpcdFx0XHRcdFx0YnJlYWs7XG4gNzI1Olx0XHRcdFx0fVxuIDcyNjpcdFx0XHRcdGlmIChucl9jb252KVxuIDcyNzpcdFx0XHRcdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWYsIFx1MDAyNmJ1Zl9sZWZ0LCAmIzM5O1xcdCYjMzk7KTtcbiA3Mjg6XHRcdFx0XHRwcm9jX3B1dF9sb25nKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsIGx2YWwsIG5lZyk7XG4gNzI5Olx0XHRcdH1cbiA3MzA6XHRcdH1cbiA3MzE6XHRcbiA3MzI6XHRcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xuIDczMzpcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgYnVmX2xlZnQpXG4gNzM0Olx0XHRcdFx0cHJvY19za2lwX3NwYWNlcyhcdTAwMjZwLCBcdTAwMjZidWZfbGVmdCk7XG4gNzM1Olx0XHRcdGlmICghbnJfY29udikge1xuIDczNjpcdFx0XHRcdGVyciA9IGVyciA/IDogLUVJTlZBTDtcbiA3Mzc6XHRcdFx0XHRnb3RvIG91dDtcbiA3Mzg6XHRcdFx0fVxuIDczOTpcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgZGF0YV9zdGFnZSlcbiA3NDA6XHRcdFx0XHRlcnIgPSBjb21taXRfY29udl92ZWMoZGF0YV90eXBlLCB0YWJsZS1cdTAwM2VkYXRhLCBkYXRhX3N0YWdlLCBucl9jb252KTtcbiA3NDE6XHRcdH0gZWxzZSB7XG4gNzQyOlx0XHRcdGlmIChucl9jb252IFx1MDAyNlx1MDAyNiBidWZfbGVmdCBcdTAwMjZcdTAwMjYgIWVycilcbiA3NDM6XHRcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICYjMzk7XFxuJiMzOTspO1xuIDc0NDpcdFx0fVxuIDc0NTpcdFxuIDc0NjpcdFx0KmJ1Zl9sZWZ0X2ZpbmFsID0gYnVmX2xlZnQ7XG4gNzQ3Olx0XG4gNzQ4Olx0b3V0OlxuIDc0OTpcdFx0a2ZyZWUoZGF0YV9zdGFnZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEzIDE1OjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4NDgyCgkJCQkJCQlvdXRwdXQ6IDE2MQoJCQkJCQkJdGhvdWdodHM6IDgzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFN5c2N0bCBBcnJheSBQYXJzaW5nIFJlZmFjdG9yKioKCk9rYXksIGxldCBtZSBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJJiMzOTttIGV4YW1pbmluZyB0aGlzIHJlZmFjdG9yIGZvciBzeXNjdGwgYXJyYXkgcGFyc2luZywgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgYW5kIGNvcnJlY3RuZXNzLiBUaGUgZ29hbCBoZXJlIHNlZW1zIHRvIGJlIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzLCB3aGljaCBpcyBhIGdvb2QgdGhpbmcuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHJlZ3Jlc3Npb25zIG9yIHNlY3VyaXR5IGhvbGVzLgoKSSBzdGFydGVkIGJ5IHRyYWNpbmcgdGhlIGVycm9yIGhhbmRsaW5nLiBJZiBJIGdldCBgLUVOT01FTWAsIHRoZW4gYGJ1Zl9sZWZ0X2ZpbmFsYCAqaXNuJiMzOTt0KiB1cGRhdGVkLCBhbmQgY29uc2VxdWVudGx5LCBgbGVmdF9uYnl0ZWAgcmVtYWlucyBhdCBgU0laRV9NQVhgLiBUaGVuLCBpbiBgcHJvY192ZWNgLCB0aGUgY2hlY2sgZm9yIGBTSVpFX01BWGAgY29ycmVjdGx5IHJldHVybnMgdGhlIGVycm9yIGFuZCAqZG9lc24mIzM5O3QqIG1vZGlmeSBgbGVucGAuIFRoaXMgYmVoYXZpb3IgaXMgYXMgZXhwZWN0ZWQgYW5kIHByZXZlbnRzIGFueSBpc3N1ZXMgd2l0aCBpbmNvbXBsZXRlIHVwZGF0ZXMgaW4gdGhlIGV2ZW50IG9mIG1lbW9yeSBleGhhdXN0aW9uLCB3aGljaCBpcyBnb29kLgoKSSBhbHNvIGNoZWNrZWQgd2hhdCBoYXBwZW5zIHdoZW4gYCFucl9jb252YC4gSWYgbm8gY29udmVyc2lvbnMgb2NjdXIsIGl0IGNvcnJlY3RseSBnb2VzIHRvIGBvdXRgLCBgYnVmX2xlZnRfZmluYWxgIGlzbiYjMzk7dCB1cGRhdGVkLCBgbGVmdF9uYnl0ZWAgc3RheXMgYFNJWkVfTUFYYCwgYW5kIHRoZSBjb3JyZWN0IGVycm9yIGlzIHJldHVybmVkLiBUaGlzIGlzIGFsc28gZmluZSwgYW5kIGV4cGVjdGVkLgoKTm93LCBhIHNsaWdodGx5IG1vcmUgdHJpY2t5IGNhc2U6IGlmIGBTWVNDVExfS0VSTl9UT19VU0VSYCBhbmQgYCFucl9jb252YC4gSGVyZSwgYGJ1Zl9sZWZ0X2ZpbmFsYCAqaXMqIHVwZGF0ZWQgdG8gYGJ1Zl9sZWZ0YCwgYW5kIGBsZWZ0X25ieXRlYCB0aGVuIGJlY29tZXMgYGJ1Zl9uYnl0ZWAuIFRoaXMgbWVhbnMgemVybyBieXRlcyB3ZXJlIHdyaXR0ZW4sIHdoaWNoIGlzIHRoZSBjb3JyZWN0IG91dGNvbWUuIFRoaXMgY2FzZSBkb2VzbiYjMzk7dCByZXByZXNlbnQgYSB2dWxuZXJhYmlsaXR5LgoKSSB0aG91Z2h0IGFib3V0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4gQWZ0ZXIgZ29pbmcgdGhyb3VnaCB0aGUgbG9naWMsIEkgZG9uJiMzOTt0IHNlZSBhbnl0aGluZyB0aGF0IGp1bXBzIG91dC4gVGhlIGNvcmUgaWRlYSBvZiB1c2luZyBga21lbWR1cGAgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciwgZG9pbmcgdGhlIHBhcnNpbmcgdGhlcmUsIGFuZCB0aGVuIGNvcHlpbmcgdGhlIHJlc3VsdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBidWZmZXIgaXMgc291bmQuIFRoZXJlIGFyZW4mIzM5O3QgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCBwYWRkaW5nLCBzbyBubyBwb3RlbnRpYWwgaW5mbyBsZWFrcyBoZXJlLiBBbmQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIHVzZWQgaW4gYnJhbmNoaW5nLiBBbnkgcG90ZW50aWFsIE9PQiBpc3N1ZXMgb3IgbWVtb3J5IGxlYWtzIHdvdWxkIGxpa2VseSBiZSBmbGFnZ2VkIGJ5IEtBU0FOLgoKSSBxdWlja2x5IGRvdWJsZS1jaGVja2VkIHRoZSBgcHJvY19kb3VpbnR2ZWNfY29udmAgZnVuY3Rpb24uIFRoZSBjb2RlIGV4cGxpY2l0bHkgY2hlY2tzIGB0YWJsZS0mZ3Q7bWF4bGVuYCB0byBlbnN1cmUgaXQmIzM5O3MgZWl0aGVyIGAwYCBvciBleGFjdGx5IGBzaXplb2YodWludClgLiBUaGlzIG1lYW5zIGBQUk9DX1ZFQ19VSU5UYCBpcyBvbmx5IHVzZWQgZm9yIHNpbmdsZSBlbGVtZW50cy4gVGhpcyBleHBsYWlucyB3aHkgYFBST0NfVkVDX1VJTlRgIGlzIG5vdCBoYW5kbGVkIGluIGBjb21taXRfY29udl92ZWNgLiBCZWNhdXNlIGZvciBzaW5nbGUgZWxlbWVudHMsIGB0YWJsZS0mZ3Q7bWF4bGVuICZsdDs9IGRhdGFfc2l6ZWAgKHNpbmNlIGBkYXRhX3NpemVgIGlzIGBzaXplb2YodWludClgKSwgc28gYGRhdGFfc3RhZ2VgIGlzIG5vdCBhbGxvY2F0ZWQsIGFuZCBgY29tbWl0X2NvbnZfdmVjYCBpcyBub3QgY2FsbGVkLiBUaGlzIGFsc28gc2VlbXMgcGVyZmVjdGx5IHNhZmUuCgpHaXZlbiBhbGwgb2YgdGhpcywgYW5kIGNvbnNpZGVyaW5nIHRoYXQgdGhlIHBhdGNoIGRvZXNuJiMzOTt0IGNoYW5nZSB0aGUgcmVhZCBwYXRoIChrZXJuZWwgdG8gdXNlcikgaW4gYW55IG1lYW5pbmdmdWwgd2F5LCBJIHRoaW5rIEkmIzM5O20gY29tZm9ydGFibGUgc2V0dGluZyBgTmVlZHNLTVNBTj1mYWxzZWAuIFRoZSByZWZhY3RvciB1dGlsaXplcyBhIHRlbXBvcmFyeSBidWZmZXIgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMsIGFuZCBleGlzdGluZyBtZW1vcnkgdG9vbHMgc2hvdWxkIGNhdGNoIGFueSBwb3RlbnRpYWwgcHJvYmxlbXMuIFRoaXMgY2hhbmdlIGlzIHNvbGlkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMyAxNTowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgc3lzY3RsIGFycmF5IHBhcnNpbmcgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMgYnkgdXNpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyIChga21lbWR1cGApIHdoZW4gd3JpdGluZyBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLiBUaGUgc3lzY3RsIHZlY3RvcnMgYXJlIHNpbXBsZSBhcnJheXMgb2YgaW50ZWdlcnMgb3IgdW5zaWduZWQgbG9uZ3Mgd2l0aG91dCBwYWRkaW5nLiBUaGUgcmVhZCBwYXRoIChrZXJuZWwgdG8gdXNlcikgaXMgdW5jaGFuZ2VkLCBzbyBubyBuZXcgaW5mby1sZWFrcyBhcmUgaW50cm9kdWNlZC4gVGhlIHRlbXBvcmFyeSBidWZmZXIgaXMgb25seSB1c2VkIGZvciB3cml0aW5nIHRvIGtlcm5lbCBzcGFjZSwgYW5kIG9ubHkgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBlbGVtZW50cyBhcmUgY29waWVkIGJhY2suIEFueSBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyByZWZhY3RvcmluZyB3b3VsZCBiZSBjYXVnaHQgYnkgS0FTQU4gb3Igc3RhbmRhcmQgbWVtb3J5IGxlYWsgZGV0ZWN0b3JzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcyB0aGF0IHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgc3lzY3RsIGFycmF5IHBhcnNpbmcgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMgYnkgdXNpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyIChga21lbWR1cGApIHdoZW4gd3JpdGluZyBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLiBUaGUgc3lzY3RsIHZlY3RvcnMgYXJlIHNpbXBsZSBhcnJheXMgb2YgaW50ZWdlcnMgb3IgdW5zaWduZWQgbG9uZ3Mgd2l0aG91dCBwYWRkaW5nLiBUaGUgcmVhZCBwYXRoIChrZXJuZWwgdG8gdXNlcikgaXMgdW5jaGFuZ2VkLCBzbyBubyBuZXcgaW5mby1sZWFrcyBhcmUgaW50cm9kdWNlZC4gVGhlIHRlbXBvcmFyeSBidWZmZXIgaXMgb25seSB1c2VkIGZvciB3cml0aW5nIHRvIGtlcm5lbCBzcGFjZSwgYW5kIG9ubHkgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBlbGVtZW50cyBhcmUgY29waWVkIGJhY2suIEFueSBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyByZWZhY3RvcmluZyB3b3VsZCBiZSBjYXVnaHQgYnkgS0FTQU4gb3Igc3RhbmRhcmQgbWVtb3J5IGxlYWsgZGV0ZWN0b3JzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcyB0aGF0IHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjAyOjQ2Ljg0MTM0NDA3N1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxMjMzNjkzMzk2NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwcm9jX2RvaW50dmVjXCIsXG4gICAgXCJwcm9jX2RvdWludHZlY1wiLFxuICAgIFwicHJvY19kb2ludHZlY19taW5tYXhcIixcbiAgICBcInByb2NfZG91aW50dmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3Vsb25ndmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3U4dmVjX21pbm1heFwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHN5c2N0bCBhcnJheSBwYXJzaW5nIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIGJ5IHVzaW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGttZW1kdXBgKSB3aGVuIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gVGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBzaW1wbGUgYXJyYXlzIG9mIGludGVnZXJzIG9yIHVuc2lnbmVkIGxvbmdzIHdpdGhvdXQgcGFkZGluZy4gVGhlIHJlYWQgcGF0aCAoa2VybmVsIHRvIHVzZXIpIGlzIHVuY2hhbmdlZCwgc28gbm8gbmV3IGluZm8tbGVha3MgYXJlIGludHJvZHVjZWQuIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG9ubHkgdXNlZCBmb3Igd3JpdGluZyB0byBrZXJuZWwgc3BhY2UsIGFuZCBvbmx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQgZWxlbWVudHMgYXJlIGNvcGllZCBiYWNrLiBBbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIG1lbW9yeSBsZWFrIGRldGVjdG9ycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIHN5c2N0bCB2ZWN0b3IgcHJvY2Vzc2luZyBsb2dpYyB0byBwcmV2ZW50IHBhcnRpYWwgdXBkYXRlcyBvbiBlcnJvciBieSBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBhZmZlY3RzIGFsbCBzeXNjdGwgaGFuZGxlcnMgdGhhdCBwcm9jZXNzIGFycmF5cy4gRnV6emluZyBpcyBuZWVkZWQgdG8gZW5zdXJlIGNvcnJlY3QgZXJyb3IgaGFuZGxpbmcsIG5vIG1lbW9yeSBsZWFrcywgYW5kIG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHN5c2N0bCB3cml0ZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjAyOjQ2Ljg0MTM0ODgzN1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUwOTQ0OTk4NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGUyMDg2MjgzMWNlNzRhMmNiYWY2ZjYzZTkxZWM3ZThmMDQxZWVkMTZcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBBdWcgMTMgMTU6MDI6NDQgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jXFxuaW5kZXggZjdiNzU5ODVkNTQyMC4uNzg3ZjUzZDcwNTA3YiAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvc3lzY3RsLmNcXG4rKysgYi9rZXJuZWwvc3lzY3RsLmNcXG5AQCAtNTk1LDcgKzU5NSw3IEBAIHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxuIHN0YXRpYyBjb25zdCBjaGFyIHByb2Nfd3NwYWNlX3NlcFtdID0geyAnICcsICdcXFxcdCcsICdcXFxcbicgfTtcXG4gXFxuIC8qXFxuLSAqIEVsZW1lbnQgdHlwZSBwcm9jZXNzZWQgYnkgZG9fcHJvY192ZWMoKS4gVGhlIHRhZyBzZWxlY3RzIHRoZSBlbGVtZW50IHNpemVcXG4rICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBwcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZVxcbiAgKiBhbmQgc2lnbmVkbmVzcywgYW5kIGl0IHNlbGVjdHMgd2hpY2ggbWVtYmVyIG9mIHVuaW9uIHByb2NfdmVjX2NvbnYgaXMgbGl2ZS5cXG4gICovXFxuIGVudW0gcHJvY192ZWNfdHlwZSB7XFxuQEAgLTYwNSw3ICs2MDUsNyBAQCBlbnVtIHByb2NfdmVjX3R5cGUge1xcbiB9O1xcbiBcXG4gLypcXG4tICogQ29udmVydGVyIHBhc3NlZCB0byBkb19wcm9jX3ZlYygpLiBPbmx5IHRoZSBtZW1iZXIgbWF0Y2hpbmcgdGhlXFxuKyAqIENvbnZlcnRlciBwYXNzZWQgdG8gcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxcbiAgKiBlbnVtIHByb2NfdmVjX3R5cGUgdGFnIGlzIGV2ZXIgcmVhZCwgc28gZXZlcnkgZGlzcGF0Y2ggc3RheXMgZnVsbHkgdHlwZWQgYW5kXFxuICAqIG5vIHZvaWQgKiBjb252ZXJ0ZXIgcG9pbnRlciBpcyBuZWVkZWQuXFxuICAqL1xcbkBAIC02MzcsMTAxICs2MzcsMTY4IEBAIHN0YXRpYyBpbnQgcHJvY192ZWNfY29udihlbnVtIHByb2NfdmVjX3R5cGUgdHlwZSwgdW5pb24gcHJvY192ZWNfY29udiBjb252LFxcbiBcXHRyZXR1cm4gLUVJTlZBTDtcXG4gfVxcbiBcXG4tLypcXG4tICogUmVhZC93cml0ZSBhIHZlY3RvciBvZiBAdHlwZSBlbGVtZW50cy4gVGhlIGVsZW1lbnQgc2l6ZSBhbmQgc2lnbmVkbmVzcyBhcmVcXG4tICogZGVyaXZlZCBmcm9tIEB0eXBlLCBzbyBhIHNpbmdsZSBydW50aW1lIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBwZXItdHlwZVxcbi0gKiB2YXJpYW50cy4gdGFibGUtXFx1MDAzZWRhdGEgaXMgd2Fsa2VkIGFzIHJhdyBieXRlcyAoQGkpIGFkdmFuY2VkIGJ5IEBzaXplOyB0aGVcXG4tICogY29udmVydGVyIHBlcmZvcm1zIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS5cXG4tICovXFxuLXN0YXRpYyBpbnQgZG9fcHJvY192ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuLVxcdFxcdCAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zLFxcbi1cXHRcXHQgICAgICAgZW51bSBwcm9jX3ZlY190eXBlIHR5cGUsIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udilcXG4rc3RhdGljIGludCBjb21taXRfY29udl92ZWMoY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSwgdm9pZCAqZHN0LFxcbitcXHRcXHRcXHQgICAgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnIpXFxuIHtcXG4tXFx0aW50IHZsZWZ0LCBmaXJzdCA9IDEsIGVyciA9IDA7XFxuLVxcdHNpemVfdCBsZWZ0LCBzaXplO1xcbi1cXHRib29sIGlzX3Vuc2lnbmVkO1xcbi1cXHRjaGFyICppLCAqcDtcXG4rXFx0c2l6ZV90IGk7XFxuIFxcbi1cXHRzd2l0Y2ggKHR5cGUpIHtcXG4rXFx0c3dpdGNoIChkYXRhX3R5cGUpIHtcXG4gXFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XFxuLVxcdFxcdHNpemUgPSBzaXplb2YoaW50KTtcXG4tXFx0XFx0aXNfdW5zaWduZWQgPSBmYWxzZTtcXG4tXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgUFJPQ19WRUNfVUlOVDpcXG4tXFx0XFx0c2l6ZSA9IHNpemVvZih1aW50KTtcXG4tXFx0XFx0aXNfdW5zaWduZWQgPSB0cnVlO1xcbi1cXHRcXHRicmVhaztcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yOyBpKyspXFxuK1xcdFxcdFxcdFdSSVRFX09OQ0UoKChpbnQgKilkc3QpW2ldLCAoKGNvbnN0IGludCAqKXNyYylbaV0pO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuIFxcdGNhc2UgUFJPQ19WRUNfVUxPTkc6XFxuLVxcdFxcdHNpemUgPSBzaXplb2YodWxvbmcpO1xcbi1cXHRcXHRpc191bnNpZ25lZCA9IHRydWU7XFxuLVxcdFxcdGJyZWFrO1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnI7IGkrKylcXG4rXFx0XFx0XFx0V1JJVEVfT05DRSgoKHVsb25nICopZHN0KVtpXSwgKChjb25zdCB1bG9uZyAqKXNyYylbaV0pO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcdH1cXG4rfVxcbiBcXG4tXFx0aWYgKCF0YWJsZS1cXHUwMDNlZGF0YSB8fCAhdGFibGUtXFx1MDAzZW1heGxlbiB8fCAhKmxlbnAgfHxcXG4tXFx0ICAgICgqcHBvcyBcXHUwMDI2XFx1MDAyNiBTWVNDVExfS0VSTl9UT19VU0VSKGRpcikpKSB7XFxuLVxcdFxcdCpsZW5wID0gMDtcXG4tXFx0XFx0cmV0dXJuIDA7XFxuLVxcdH1cXG4tXFxuLVxcdGkgPSB0YWJsZS1cXHUwMDNlZGF0YTtcXG4tXFx0dmxlZnQgPSB0YWJsZS1cXHUwMDNlbWF4bGVuIC8gc2l6ZTtcXG4tXFx0bGVmdCA9ICpsZW5wO1xcbi1cXG4tXFx0LyogdWludCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQsICpEbyBub3QqIGFkZCBzdXBwb3J0IGZvciB0aGVtLiAqL1xcbi1cXHRpZiAodHlwZSA9PSBQUk9DX1ZFQ19VSU5UIFxcdTAwMjZcXHUwMDI2IHZsZWZ0ICE9IDEpXFxuLVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXG4tXFx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkge1xcbi1cXHRcXHRpZiAocHJvY19maXJzdF9wb3Nfbm9uX3plcm9faWdub3JlKHBwb3MsIHRhYmxlKSlcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcbi1cXHRcXHRpZiAobGVmdCBcXHUwMDNlIFBBR0VfU0laRSAtIDEpXFxuLVxcdFxcdFxcdGxlZnQgPSBQQUdFX1NJWkUgLSAxO1xcbi1cXHRcXHRwID0gYnVmZmVyO1xcbisvKipcXG4rICogYXBwbHlfY29udl9vbl92ZWMgLSBBcHBseSBjb252ZXJ0ZXIgZnVuY3Rpb24gb24gZGF0YSB2ZWN0b3JcXG4rICpcXG4rICogRWxlbWVudCBzaWduZWRuZXNzIGlzIGRlcml2ZWQgZnJvbSBAZGF0YV90eXBlLiB0YWJsZS1cXHUwMDNlZGF0YSBpcyB3YWxrZWRcXG4rICogYXMgcmF3IGJ5dGVzIChAZGF0YSkgYWR2YW5jZWQgYnkgQGRhdGFfc2l6ZTsgdGhlIGNvbnZlcnRlciBwZXJmb3Jtc1xcbisgKiB0aGUgYWN0dWFsIHR5cGVkIGxvYWQvc3RvcmUuIFNldHMgYnVmX2xlZnRfZmluYWwgdG8gdGhlIG51bWJlciBvZlxcbisgKiBieXRlcyB0aGF0IHdoZXJlIGxlZnQgb3V0c3RhbmRpbmcgYWZ0ZXIgY29udmVyc2lvbi4gQ2FuIGJlIFxcdTAwM2UgMC5cXG4rICpcXG4rICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIE5vbi16ZXJvIG9uIGVycm9yLlxcbisgKi9cXG4rc3RhdGljIGludCBhcHBseV9jb252X29uX3ZlYyhjb25zdCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXFxuK1xcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsXFxuK1xcdFxcdFxcdCAgICAgY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSxcXG4rXFx0XFx0XFx0ICAgICBjb25zdCBzaXplX3QgZGF0YV9zaXplLCBjb25zdCBpbnQgY29udl9kaXIsXFxuK1xcdFxcdFxcdCAgICAgY29uc3Qgc2l6ZV90IGJ1Zl9uYnl0ZSwgdm9pZCAqYnVmLFxcbitcXHRcXHRcXHQgICAgIHNpemVfdCAqYnVmX2xlZnRfZmluYWwpXFxuK3tcXG4rXFx0aW50IHZlY19sZWZ0LCBlcnIgPSAwO1xcbitcXHRzaXplX3QgYnVmX2xlZnQsIG5yX2NvbnYgPSAwO1xcbitcXHRjaGFyICpkYXRhLCAqZGF0YV9zdGFnZSA9IE5VTEwsICpwO1xcbitcXHRib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HO1xcbitcXG4rXFx0YnVmX2xlZnQgPSBidWZfbmJ5dGU7XFxuK1xcbitcXHRkYXRhID0gdGFibGUtXFx1MDAzZWRhdGE7XFxuK1xcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xcbitcXHRcXHRpZiAoYnVmX2xlZnQgXFx1MDAzZSBQQUdFX1NJWkUgLSAxKVxcbitcXHRcXHRcXHRidWZfbGVmdCA9IFBBR0VfU0laRSAtIDE7XFxuK1xcdFxcdHAgPSBidWY7XFxuK1xcbitcXHRcXHRpZiAodGFibGUtXFx1MDAzZW1heGxlbiBcXHUwMDNlIGRhdGFfc2l6ZSkge1xcbitcXHRcXHRcXHRkYXRhX3N0YWdlID0ga21lbWR1cCh0YWJsZS1cXHUwMDNlZGF0YSwgdGFibGUtXFx1MDAzZW1heGxlbiwgR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdFxcdGlmICghZGF0YV9zdGFnZSkge1xcbitcXHRcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbitcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRkYXRhID0gZGF0YV9zdGFnZTtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1cXHRmb3IgKDsgbGVmdCBcXHUwMDI2XFx1MDAyNiB2bGVmdC0tOyBpICs9IHNpemUsIGZpcnN0ID0gMCkge1xcbitcXHR2ZWNfbGVmdCA9IHRhYmxlLVxcdTAwM2VtYXhsZW4gLyBkYXRhX3NpemU7XFxuK1xcdGZvciAoOyBidWZfbGVmdCBcXHUwMDI2XFx1MDAyNiB2ZWNfbGVmdC0tOyBkYXRhICs9IGRhdGFfc2l6ZSwgbnJfY29udisrKSB7XFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgbHZhbDtcXG4gXFx0XFx0Ym9vbCBuZWcgPSBmYWxzZTtcXG4gXFxuLVxcdFxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcXG4tXFx0XFx0XFx0cHJvY19za2lwX3NwYWNlcyhcXHUwMDI2cCwgXFx1MDAyNmxlZnQpO1xcbitcXHRcXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcXG4rXFx0XFx0XFx0cHJvY19za2lwX3NwYWNlcyhcXHUwMDI2cCwgXFx1MDAyNmJ1Zl9sZWZ0KTtcXG4gXFxuLVxcdFxcdFxcdGlmICghbGVmdClcXG4rXFx0XFx0XFx0aWYgKCFidWZfbGVmdClcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdFxcdGVyciA9IHByb2NfZ2V0X2xvbmcoXFx1MDAyNnAsIFxcdTAwMjZsZWZ0LCBcXHUwMDI2bHZhbCwgXFx1MDAyNm5lZyxcXG4rXFx0XFx0XFx0ZXJyID0gcHJvY19nZXRfbG9uZyhcXHUwMDI2cCwgXFx1MDAyNmJ1Zl9sZWZ0LCBcXHUwMDI2bHZhbCwgXFx1MDAyNm5lZyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTtcXG4gXFx0XFx0XFx0aWYgKCFlcnIgXFx1MDAyNlxcdTAwMjYgbmVnIFxcdTAwMjZcXHUwMDI2IGlzX3Vuc2lnbmVkKVxcbiBcXHRcXHRcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbiBcXHRcXHRcXHRpZiAoZXJyKVxcbiBcXHRcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0XFx0aWYgKHByb2NfdmVjX2NvbnYodHlwZSwgY29udiwgXFx1MDAyNm5lZywgXFx1MDAyNmx2YWwsIGksIGRpciwgdGFibGUpKSB7XFxuK1xcdFxcdFxcdGlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgXFx1MDAyNm5lZywgXFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcXG4gXFx0XFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0aWYgKHByb2NfdmVjX2NvbnYodHlwZSwgY29udiwgXFx1MDAyNm5lZywgXFx1MDAyNmx2YWwsIGksIGRpciwgdGFibGUpKSB7XFxuK1xcdFxcdFxcdGlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgXFx1MDAyNm5lZywgXFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcXG4gXFx0XFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0aWYgKCFmaXJzdClcXG4tXFx0XFx0XFx0XFx0cHJvY19wdXRfY2hhcihcXHUwMDI2YnVmZmVyLCBcXHUwMDI2bGVmdCwgJ1xcXFx0Jyk7XFxuLVxcdFxcdFxcdHByb2NfcHV0X2xvbmcoXFx1MDAyNmJ1ZmZlciwgXFx1MDAyNmxlZnQsIGx2YWwsIG5lZyk7XFxuK1xcdFxcdFxcdGlmIChucl9jb252KVxcbitcXHRcXHRcXHRcXHRwcm9jX3B1dF9jaGFyKFxcdTAwMjZidWYsIFxcdTAwMjZidWZfbGVmdCwgJ1xcXFx0Jyk7XFxuK1xcdFxcdFxcdHByb2NfcHV0X2xvbmcoXFx1MDAyNmJ1ZiwgXFx1MDAyNmJ1Zl9sZWZ0LCBsdmFsLCBuZWcpO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuLVxcdGlmIChTWVNDVExfS0VSTl9UT19VU0VSKGRpcikgXFx1MDAyNlxcdTAwMjYgIWZpcnN0IFxcdTAwMjZcXHUwMDI2IGxlZnQgXFx1MDAyNlxcdTAwMjYgIWVycilcXG4tXFx0XFx0cHJvY19wdXRfY2hhcihcXHUwMDI2YnVmZmVyLCBcXHUwMDI2bGVmdCwgJ1xcXFxuJyk7XFxuLVxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgXFx1MDAyNlxcdTAwMjYgIWVyciBcXHUwMDI2XFx1MDAyNiBsZWZ0KVxcbi1cXHRcXHRwcm9jX3NraXBfc3BhY2VzKFxcdTAwMjZwLCBcXHUwMDI2bGVmdCk7XFxuLVxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgXFx1MDAyNlxcdTAwMjYgZmlyc3QpXFxuLVxcdFxcdHJldHVybiBlcnIgPyA6IC1FSU5WQUw7XFxuLVxcdCpsZW5wIC09IGxlZnQ7XFxuK1xcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xcbitcXHRcXHRpZiAoIWVyciBcXHUwMDI2XFx1MDAyNiBidWZfbGVmdClcXG4rXFx0XFx0XFx0cHJvY19za2lwX3NwYWNlcyhcXHUwMDI2cCwgXFx1MDAyNmJ1Zl9sZWZ0KTtcXG4rXFx0XFx0aWYgKCFucl9jb252KSB7XFxuK1xcdFxcdFxcdGVyciA9IGVyciA/IDogLUVJTlZBTDtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKCFlcnIgXFx1MDAyNlxcdTAwMjYgZGF0YV9zdGFnZSlcXG4rXFx0XFx0XFx0ZXJyID0gY29tbWl0X2NvbnZfdmVjKGRhdGFfdHlwZSwgdGFibGUtXFx1MDAzZWRhdGEsIGRhdGFfc3RhZ2UsIG5yX2NvbnYpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRpZiAobnJfY29udiBcXHUwMDI2XFx1MDAyNiBidWZfbGVmdCBcXHUwMDI2XFx1MDAyNiAhZXJyKVxcbitcXHRcXHRcXHRwcm9jX3B1dF9jaGFyKFxcdTAwMjZidWYsIFxcdTAwMjZidWZfbGVmdCwgJ1xcXFxuJyk7XFxuK1xcdH1cXG4rXFxuK1xcdCpidWZfbGVmdF9maW5hbCA9IGJ1Zl9sZWZ0O1xcbitcXG4rb3V0OlxcbitcXHRrZnJlZShkYXRhX3N0YWdlKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4rLyogUmVhZC93cml0ZSBhIHZlY3RvciBvZiBAdHlwZSBlbGVtZW50cy4gKi9cXG4rc3RhdGljIGludCBwcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxcbitcXHRcXHQgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLFxcbitcXHRcXHQgICAgdW5pb24gcHJvY192ZWNfY29udiBjb252KVxcbit7XFxuK1xcdGludCBlcnIgPSAwO1xcbitcXHRzaXplX3QgZGF0YV9zaXplLCBsZWZ0X25ieXRlID0gU0laRV9NQVg7XFxuK1xcbitcXHRzd2l0Y2ggKHR5cGUpIHtcXG4rXFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XFxuK1xcdFxcdGRhdGFfc2l6ZSA9IHNpemVvZihpbnQpO1xcbitcXHRcXHRicmVhaztcXG4rXFx0Y2FzZSBQUk9DX1ZFQ19VSU5UOlxcbitcXHRcXHRkYXRhX3NpemUgPSBzaXplb2YodWludCk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIFBST0NfVkVDX1VMT05HOlxcbitcXHRcXHRkYXRhX3NpemUgPSBzaXplb2YodWxvbmcpO1xcbitcXHRcXHRicmVhaztcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghdGFibGUtXFx1MDAzZWRhdGEgfHwgIXRhYmxlLVxcdTAwM2VtYXhsZW4gfHwgISpsZW5wIHx8XFxuK1xcdCAgICAoKnBwb3MgXFx1MDAyNlxcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xcbitcXHRcXHQqbGVucCA9IDA7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKSB7XFxuK1xcdFxcdGlmIChwcm9jX2ZpcnN0X3Bvc19ub25femVyb19pZ25vcmUocHBvcywgdGFibGUpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0ZXJyID0gYXBwbHlfY29udl9vbl92ZWMoY29udiwgdGFibGUsIHR5cGUsIGRhdGFfc2l6ZSwgZGlyLCAqbGVucCwgYnVmZmVyLFxcbitcXHRcXHRcXHRcXHRcXHUwMDI2bGVmdF9uYnl0ZSk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBBbiB1bmNoYW5nZWQgbGVmdF9uYnl0ZSBzaWduYWxzIGEgd3JpdGUgd2l0aCBubyBwYXJzZWQgZWxlbWVudDsgd2hpY2hcXG4rXFx0ICogaXMgYW4gZXJyb3IuIFVzaW5nIFNJWkVfTUFYIHRvIGRldGVjdCB0aGlzIGVycm9yIGlzIHBvc3NpYmxlIGJlY2F1c2U6XFxuK1xcdCAqIDEuIGxlbnAgaXMgYm91bmRlZCBieSBLTUFMTE9DX01BWF9TSVpFIGluIHByb2Nfc3lzX2NhbGxfaGFuZGxlclxcbitcXHQgKiAyLiBsZW5wIGNvdWxkIG5ldmVyIGJlIFNJWkVfTUFYIGFzIGl0IGlzIGEgXFxcInJpZGljdWxvdXNcXFwiIChleGFieXRlKSBhbGxvY2F0aW9uLlxcbitcXHQgKi9cXG4rXFx0aWYgKGxlZnRfbmJ5dGUgPT0gU0laRV9NQVgpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHQqbGVucCAtPSBsZWZ0X25ieXRlO1xcbiBvdXQ6XFxuIFxcdCpwcG9zICs9ICpsZW5wO1xcbitcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG5AQCAtNzU2LDEyICs4MjMsMTUgQEAgaW50IHByb2NfZG91aW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4gXFx0XFx0XFx0aW50ICgqY29udikoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCB1aW50ICprX3B0cixcXG4gXFx0XFx0XFx0XFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKSlcXG4ge1xcbitcXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXFxuK1xcdGlmICh0YWJsZS1cXHUwMDNlbWF4bGVuIFxcdTAwMjZcXHUwMDI2ICh0YWJsZS1cXHUwMDNlbWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gXFxuIFxcdGlmICghY29udilcXG4gXFx0XFx0Y29udiA9IGRvX3Byb2NfdWludF9jb252O1xcbiBcXG4tXFx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcXG4tXFx0XFx0XFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gY29udiB9KTtcXG4rXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcXG4rXFx0XFx0XFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gY29udiB9KTtcXG4gfVxcbiBcXG4gLyoqXFxuQEAgLTgyMCw4ICs4OTAsOCBAQCBpbnQgcHJvY19kb2Jvb2woY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4gaW50IHByb2NfZG9pbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4gXFx0XFx0ICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcXG4ge1xcbi1cXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXFxuLVxcdFxcdFxcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcXG4rXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxcbitcXHRcXHRcXHQodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnYgfSk7XFxuIH1cXG4gXFxuIC8qKlxcbkBAIC04NDAsOCArOTEwLDcgQEAgaW50IHByb2NfZG9pbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4gaW50IHByb2NfZG91aW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuIFxcdFxcdHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxcbiB7XFxuLVxcdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXFxuLVxcdFxcdFxcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252IH0pO1xcbitcXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIGRvX3Byb2NfdWludF9jb252KTtcXG4gfVxcbiBcXG4gLyoqXFxuQEAgLTg2NCw4ICs5MzMsOCBAQCBpbnQgcHJvY19kb3VpbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4gaW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbiBcXHRcXHQgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4tXFx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxcbi1cXHRcXHRcXHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xcbitcXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXFxuK1xcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udl9taW5tYXggfSk7XFxuIH1cXG4gXFxuIC8qKlxcbkBAIC04OTEsOCArOTYwLDggQEAgaW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbiBpbnQgcHJvY19kb3VpbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbiBcXHRcXHRcXHQgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4tXFx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcXG4tXFx0XFx0XFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnZfbWlubWF4IH0pO1xcbitcXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsXFxuK1xcdFxcdFxcdFxcdCAgIGRvX3Byb2NfdWludF9jb252X21pbm1heCk7XFxuIH1cXG4gXFxuIC8qKlxcbkBAIC05MzUsOCArMTAwNCw3IEBAIGludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbiBcXHRcXHR0bXAuZXh0cmEyID0gKHVuc2lnbmVkIGludCAqKSBcXHUwMDI2bWF4O1xcbiBcXG4gXFx0dmFsID0gUkVBRF9PTkNFKCpkYXRhKTtcXG4tXFx0cmVzID0gZG9fcHJvY192ZWMoXFx1MDAyNnRtcCwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXFxuLVxcdFxcdFxcdCAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnZfbWlubWF4IH0pO1xcbitcXHRyZXMgPSBwcm9jX2RvdWludHZlY19taW5tYXgoXFx1MDAyNnRtcCwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MpO1xcbiBcXHRpZiAocmVzKVxcbiBcXHRcXHRyZXR1cm4gcmVzO1xcbiBcXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKVxcbkBAIC0xMDY2LDggKzExMzQsOCBAQCBpbnQgcHJvY19kb3Vsb25ndmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuIFxcdFxcdFxcdFxcdGludCAoKmNvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpKVxcbiB7XFxuLVxcdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLFxcbi1cXHRcXHRcXHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gY29udiB9KTtcXG4rXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXFxuK1xcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBjb252IH0pO1xcbiB9XFxuIFxcbiAvKipcXG5AQCAtMTA4NywxMCArMTE1NSwxMCBAQCBpbnQgcHJvY19kb3Vsb25ndmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuICAqIFJldHVybnM6ICUwIG9uIHN1Y2Nlc3MuXFxuICAqL1xcbiBpbnQgcHJvY19kb3Vsb25ndmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcXG4tXFx0XFx0XFx0ICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcXG4rXFx0XFx0dm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcXG4ge1xcbi1cXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORyxcXG4tXFx0XFx0XFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGRvX3Byb2NfdWxvbmdfY29udiB9KTtcXG4rXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXFxuK1xcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBkb19wcm9jX3Vsb25nX2NvbnYgfSk7XFxuIH1cXG4gXFxuIC8qKlxcbkBAIC0xMTE0LDggKzExODIsOCBAQCBpbnQgcHJvY19kb2ludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuIHtcXG4gXFx0aWYgKCFjb252KVxcbiBcXHRcXHRjb252ID0gZG9fcHJvY19pbnRfY29udjtcXG4tXFx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxcbi1cXHRcXHRcXHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGNvbnYgfSk7XFxuK1xcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcXG4rXFx0XFx0XFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBjb252IH0pO1xcbiB9XFxuIFxcbiAvKipcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcXG5pbmRleCBiMmQ4YmQ5MDI2YTcyLi5mZGYzZDJmYjBhMmFkIDEwMDc1NVxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoXFxuQEAgLTQsNiArNCw3IEBAXFxuIFxcbiAjIFRoaXMgcGVyZm9ybXMgYSBzZXJpZXMgdGVzdHMgYWdhaW5zdCB0aGUgcHJvYyBzeXNjdGwgaW50ZXJmYWNlLlxcbiBcXG4rIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MyMzE3XFxuICMgS3NlbGZ0ZXN0IGZyYW1ld29yayByZXF1aXJlbWVudCAtIFNLSVAgY29kZSBpcyA0LlxcbiBrc2Z0X3NraXA9NFxcbiBcXG5AQCAtMzcsNiArMzgsNyBAQCBBTExfVEVTVFM9XFxcIiRBTExfVEVTVFMgMDAwOToxOjE6dW5yZWdpc3Rlcl9lcnJvcjowXFxcIlxcbiBBTExfVEVTVFM9XFxcIiRBTExfVEVTVFMgMDAxMDoxOjE6bW50L21udF9lcnJvcjowXFxcIlxcbiBBTExfVEVTVFM9XFxcIiRBTExfVEVTVFMgMDAxMToxOjE6ZW1wdHlfYWRkOjBcXFwiXFxuIEFMTF9URVNUUz1cXFwiJEFMTF9URVNUUyAwMDEyOjE6MTp1OF92YWxpZDowXFxcIlxcbitBTExfVEVTVFM9XFxcIiRBTExfVEVTVFMgMDAxMzoxOjE6aW50XzAwMDM6MVxcXCJcXG4gXFxuIGZ1bmN0aW9uIGFsbG93X3VzZXJfZGVmYXVsdHMoKVxcbiB7XFxuQEAgLTE5Niw2ICsxOTgsMTggQEAgdmVyaWZ5X2RpZmZfdygpXFxuIFxcdHJldHVybiAkP1xcbiB9XFxuIFxcbisjIFZlcmlmeSB0aGF0IGFuIGVycm9uZW91cyAoJDIpIHVwZGF0ZSBmYWlscyBhbmQgZG9lcyBub3QgY2hhbmdlIFRBUkdFVFxcbit2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUoKVxcbit7XFxuK1xcdFRFU1RfU1RSPVxcXCIkMVxcXCJcXG4rXFx0ZWNobyAtbiBcXFwiJFRFU1RfU1RSXFxcIiBcXHUwMDNlIFxcXCIkVEFSR0VUXFxcIlxcbitcXG4rXFx0aWYgZWNobyAtbiBcXFwiJDJcXFwiIFxcdTAwM2UgXFxcIiRUQVJHRVRcXFwiIDJcXHUwMDNlIC9kZXYvbnVsbDsgdGhlblxcbitcXHRcXHRyZXR1cm4gMVxcbitcXHRmaVxcbitcXHR2ZXJpZnlfZGlmZl93IFxcXCIke1RBUkdFVH1cXFwiXFxuK31cXG4rXFxuIHRlc3RfcmMoKVxcbiB7XFxuIFxcdGlmIFtbICRyYyAhPSAwIF1dOyB0aGVuXFxuQEAgLTUwMSw2ICs1MTUsNDAgQEAgcnVuX2xpbWl0X2RpZ2l0X2ludF9hcnJheSgpXFxuIFxcdHRlc3RfcmNcXG4gfVxcbiBcXG4rIyBZb3UgdXNlZCBhbiBpbnQgYXJyYXkgYW5kIG9uZSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGFjY2VwdGFibGVcXG4rcnVuX2ludF9hcnJheV9ub19wYXJ0aWFsX3VwZGF0ZSgpXFxuK3tcXG4rXFx0ZWNobyAtbiBcXFwiVGVzdGluZyBpbnZhbGlkIGFycmF5IGVsZW1lbnQgZG9lcyBub3QgcGFydGlhbGx5IHVwZGF0ZSAuLi4gXFxcIlxcbisgICAgICAgICMgRXhwZWN0IGZhaWx1cmUgYmVjYXVzZSBvZiAzcmQgZWxlbWVudCAoYWJjKS5cXG4rXFx0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXFxcIjEgMiAzIDRcXFwiIFxcXCIxMCAyMCBhYmMgNDBcXFwiOyB0aGVuXFxuK1xcdFxcdGVjaG8gXFxcIkZBSUxcXFwiIFxcdTAwM2VcXHUwMDI2MlxcbitcXHRcXHRyYz0xXFxuK1xcdGVsc2VcXG4rXFx0XFx0ZWNobyBcXFwiT0tcXFwiXFxuK1xcdGZpXFxuK1xcdHRlc3RfcmNcXG4rXFxuK1xcdGVjaG8gLW4gXFxcIlRlc3Rpbmcgb3V0IG9mIHJhbmdlIGFycmF5IGVsZW1lbnQgZG9lcyBub3QgcGFydGlhbGx5IHVwZGF0ZSAuLi4gXFxcIlxcbisgICAgICAgICMgRXhwZWN0IGZhaWx1cmUgYmVjYXVzZSBvZiAzcmQgZWxlbWVudCAoZ3JlYXRlciB0aGFuIGludClcXG4rXFx0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXFxcIjEgMiAzIDRcXFwiIFxcXCIxMCAyMCAkKChJTlRfTUFYICsgMSkpIDQwXFxcIjsgdGhlblxcbitcXHRcXHRlY2hvIFxcXCJGQUlMXFxcIiBcXHUwMDNlXFx1MDAyNjJcXG4rXFx0XFx0cmM9MVxcbitcXHRlbHNlXFxuK1xcdFxcdGVjaG8gXFxcIk9LXFxcIlxcbitcXHRmaVxcbitcXHR0ZXN0X3JjXFxuK1xcbitcXHRlY2hvIC1uIFxcXCJUZXN0aW5nIGludmFsaWQgZmlyc3QgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCB1cGRhdGUgLi4uIFxcXCJcXG4rICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIG9mIDFzdCBlbGVtZW50XFxuK1xcdGlmICEgdmVyaWZ5X25vX3BhcnRpYWxfdXBkYXRlIFxcXCIxIDIgMyA0XFxcIiBcXFwiYWJjIDIwIDMwIDQwXFxcIjsgdGhlblxcbitcXHRcXHRlY2hvIFxcXCJGQUlMXFxcIiBcXHUwMDNlXFx1MDAyNjJcXG4rXFx0XFx0cmM9MVxcbitcXHRlbHNlXFxuK1xcdFxcdGVjaG8gXFxcIk9LXFxcIlxcbitcXHRmaVxcbitcXHR0ZXN0X3JjXFxuK31cXG4rXFxuICMgWW91IGFyZSB1c2luZyBhbiB1bnNpZ25lZCBpbnRcXG4gcnVuX2xpbWl0X2RpZ2l0X3VpbnQoKVxcbiB7XFxuQEAgLTg4MCw2ICs5MjgsMTQgQEAgc3lzY3RsX3Rlc3RfMDAxMigpXFxuIFxcdHJldHVybiAwXFxuIH1cXG4gXFxuK3N5c2N0bF90ZXN0XzAwMTMoKVxcbit7XFxuK1xcdFRBUkdFVD1cXFwiJHtTWVNDVEx9LyQoZ2V0X3Rlc3RfdGFyZ2V0IDAwMTMpXFxcIlxcbitcXHRyZXNldF92YWxzXFxuK1xcbitcXHRydW5faW50X2FycmF5X25vX3BhcnRpYWxfdXBkYXRlXFxuK31cXG4rXFxuIGxpc3RfdGVzdHMoKVxcbiB7XFxuIFxcdGVjaG8gXFxcIlRlc3QgSUQgbGlzdDpcXFwiXFxuQEAgLTkwMCw2ICs5NTYsNyBAQCBsaXN0X3Rlc3RzKClcXG4gXFx0ZWNobyBcXFwiMDAxMCB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMCkgLSB0ZXN0cyBzeXNjdCBtb3VudCBwb2ludFxcXCJcXG4gXFx0ZWNobyBcXFwiMDAxMSB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMSkgLSB0ZXN0cyBlbXB0eSBkaXJlY3Rvcmllc1xcXCJcXG4gXFx0ZWNobyBcXFwiMDAxMiB4ICQoZ2V0X3Rlc3RfY291bnQgMDAxMikgLSB0ZXN0cyByYW5nZSBjaGVjayBmb3IgdTggcHJvY19oYW5kbGVyXFxcIlxcbitcXHRlY2hvIFxcXCIwMDEzIHggJChnZXRfdGVzdF9jb3VudCAwMDEzKSAtIHRlc3RzIHBhcnRpYWxseSB1cGRhdGUgdmVjdG9ycyBvbiBlcnJvclxcXCJcXG4gfVxcbiBcXG4gdXNhZ2UoKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMjo0OC4zNTE2MTYxNzFaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo0MzQzMzE2NjU3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwcm9jX2RvaW50dmVjXCIsXG4gICAgXCJwcm9jX2RvdWludHZlY1wiLFxuICAgIFwicHJvY19kb2ludHZlY19taW5tYXhcIixcbiAgICBcInByb2NfZG91aW50dmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3Vsb25ndmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3U4dmVjX21pbm1heFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIHN5c2N0bCB2ZWN0b3IgcHJvY2Vzc2luZyBsb2dpYyB0byBwcmV2ZW50IHBhcnRpYWwgdXBkYXRlcyBvbiBlcnJvciBieSBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBhZmZlY3RzIGFsbCBzeXNjdGwgaGFuZGxlcnMgdGhhdCBwcm9jZXNzIGFycmF5cy4gRnV6emluZyBpcyBuZWVkZWQgdG8gZW5zdXJlIGNvcnJlY3QgZXJyb3IgaGFuZGxpbmcsIG5vIG1lbW9yeSBsZWFrcywgYW5kIG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHN5c2N0bCB3cml0ZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGUyMDg2MjgzMWNlNzRhMmNiYWY2ZjYzZTkxZWM3ZThmMDQxZWVkMTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEF1ZyAxMyAxNTowMjo0NCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuY1xuaW5kZXggZjdiNzU5ODVkNTQyMC4uNzg3ZjUzZDcwNTA3YiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9zeXNjdGwuY1xuKysrIGIva2VybmVsL3N5c2N0bC5jXG5AQCAtNTk1LDcgKzU5NSw3IEBAIHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXG4gc3RhdGljIGNvbnN0IGNoYXIgcHJvY193c3BhY2Vfc2VwW10gPSB7ICcgJywgJ1xcdCcsICdcXG4nIH07XG4gXG4gLypcbi0gKiBFbGVtZW50IHR5cGUgcHJvY2Vzc2VkIGJ5IGRvX3Byb2NfdmVjKCkuIFRoZSB0YWcgc2VsZWN0cyB0aGUgZWxlbWVudCBzaXplXG4rICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBwcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZVxuICAqIGFuZCBzaWduZWRuZXNzLCBhbmQgaXQgc2VsZWN0cyB3aGljaCBtZW1iZXIgb2YgdW5pb24gcHJvY192ZWNfY29udiBpcyBsaXZlLlxuICAqL1xuIGVudW0gcHJvY192ZWNfdHlwZSB7XG5AQCAtNjA1LDcgKzYwNSw3IEBAIGVudW0gcHJvY192ZWNfdHlwZSB7XG4gfTtcbiBcbiAvKlxuLSAqIENvbnZlcnRlciBwYXNzZWQgdG8gZG9fcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxuKyAqIENvbnZlcnRlciBwYXNzZWQgdG8gcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxuICAqIGVudW0gcHJvY192ZWNfdHlwZSB0YWcgaXMgZXZlciByZWFkLCBzbyBldmVyeSBkaXNwYXRjaCBzdGF5cyBmdWxseSB0eXBlZCBhbmRcbiAgKiBubyB2b2lkICogY29udmVydGVyIHBvaW50ZXIgaXMgbmVlZGVkLlxuICAqL1xuQEAgLTYzNywxMDEgKzYzNywxNjggQEAgc3RhdGljIGludCBwcm9jX3ZlY19jb252KGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXG4gXHRyZXR1cm4gLUVJTlZBTDtcbiB9XG4gXG4tLypcbi0gKiBSZWFkL3dyaXRlIGEgdmVjdG9yIG9mIEB0eXBlIGVsZW1lbnRzLiBUaGUgZWxlbWVudCBzaXplIGFuZCBzaWduZWRuZXNzIGFyZVxuLSAqIGRlcml2ZWQgZnJvbSBAdHlwZSwgc28gYSBzaW5nbGUgcnVudGltZSBmdW5jdGlvbiByZXBsYWNlcyB0aGUgcGVyLXR5cGVcbi0gKiB2YXJpYW50cy4gdGFibGUtXHUwMDNlZGF0YSBpcyB3YWxrZWQgYXMgcmF3IGJ5dGVzIChAaSkgYWR2YW5jZWQgYnkgQHNpemU7IHRoZVxuLSAqIGNvbnZlcnRlciBwZXJmb3JtcyB0aGUgYWN0dWFsIHR5cGVkIGxvYWQvc3RvcmUuXG4tICovXG4tc3RhdGljIGludCBkb19wcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi1cdFx0ICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsXG4tXHRcdCAgICAgICBlbnVtIHByb2NfdmVjX3R5cGUgdHlwZSwgdW5pb24gcHJvY192ZWNfY29udiBjb252KVxuK3N0YXRpYyBpbnQgY29tbWl0X2NvbnZfdmVjKGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsIHZvaWQgKmRzdCxcbitcdFx0XHQgICAgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnIpXG4ge1xuLVx0aW50IHZsZWZ0LCBmaXJzdCA9IDEsIGVyciA9IDA7XG4tXHRzaXplX3QgbGVmdCwgc2l6ZTtcbi1cdGJvb2wgaXNfdW5zaWduZWQ7XG4tXHRjaGFyICppLCAqcDtcbitcdHNpemVfdCBpO1xuIFxuLVx0c3dpdGNoICh0eXBlKSB7XG4rXHRzd2l0Y2ggKGRhdGFfdHlwZSkge1xuIFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YoaW50KTtcbi1cdFx0aXNfdW5zaWduZWQgPSBmYWxzZTtcbi1cdFx0YnJlYWs7XG4tXHRjYXNlIFBST0NfVkVDX1VJTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YodWludCk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpKyspXG4rXHRcdFx0V1JJVEVfT05DRSgoKGludCAqKWRzdClbaV0sICgoY29uc3QgaW50ICopc3JjKVtpXSk7XG4rXHRcdHJldHVybiAwO1xuK1xuIFx0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbi1cdFx0c2l6ZSA9IHNpemVvZih1bG9uZyk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpKyspXG4rXHRcdFx0V1JJVEVfT05DRSgoKHVsb25nICopZHN0KVtpXSwgKChjb25zdCB1bG9uZyAqKXNyYylbaV0pO1xuK1x0XHRyZXR1cm4gMDtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0fVxuK31cbiBcbi1cdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuLVx0ICAgICgqcHBvcyBcdTAwMjZcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xuLVx0XHQqbGVucCA9IDA7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0aSA9IHRhYmxlLVx1MDAzZWRhdGE7XG4tXHR2bGVmdCA9IHRhYmxlLVx1MDAzZW1heGxlbiAvIHNpemU7XG4tXHRsZWZ0ID0gKmxlbnA7XG4tXG4tXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXG4tXHRpZiAodHlwZSA9PSBQUk9DX1ZFQ19VSU5UIFx1MDAyNlx1MDAyNiB2bGVmdCAhPSAxKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcbi1cdFx0aWYgKHByb2NfZmlyc3RfcG9zX25vbl96ZXJvX2lnbm9yZShwcG9zLCB0YWJsZSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdGlmIChsZWZ0IFx1MDAzZSBQQUdFX1NJWkUgLSAxKVxuLVx0XHRcdGxlZnQgPSBQQUdFX1NJWkUgLSAxO1xuLVx0XHRwID0gYnVmZmVyO1xuKy8qKlxuKyAqIGFwcGx5X2NvbnZfb25fdmVjIC0gQXBwbHkgY29udmVydGVyIGZ1bmN0aW9uIG9uIGRhdGEgdmVjdG9yXG4rICpcbisgKiBFbGVtZW50IHNpZ25lZG5lc3MgaXMgZGVyaXZlZCBmcm9tIEBkYXRhX3R5cGUuIHRhYmxlLVx1MDAzZWRhdGEgaXMgd2Fsa2VkXG4rICogYXMgcmF3IGJ5dGVzIChAZGF0YSkgYWR2YW5jZWQgYnkgQGRhdGFfc2l6ZTsgdGhlIGNvbnZlcnRlciBwZXJmb3Jtc1xuKyAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mXG4rICogYnl0ZXMgdGhhdCB3aGVyZSBsZWZ0IG91dHN0YW5kaW5nIGFmdGVyIGNvbnZlcnNpb24uIENhbiBiZSBcdTAwM2UgMC5cbisgKlxuKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLiBOb24temVybyBvbiBlcnJvci5cbisgKi9cbitzdGF0aWMgaW50IGFwcGx5X2NvbnZfb25fdmVjKGNvbnN0IHVuaW9uIHByb2NfdmVjX2NvbnYgY29udixcbitcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLFxuK1x0XHRcdCAgICAgY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSxcbitcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IGludCBjb252X2RpcixcbitcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBidWZfbmJ5dGUsIHZvaWQgKmJ1ZixcbitcdFx0XHQgICAgIHNpemVfdCAqYnVmX2xlZnRfZmluYWwpXG4re1xuK1x0aW50IHZlY19sZWZ0LCBlcnIgPSAwO1xuK1x0c2l6ZV90IGJ1Zl9sZWZ0LCBucl9jb252ID0gMDtcbitcdGNoYXIgKmRhdGEsICpkYXRhX3N0YWdlID0gTlVMTCwgKnA7XG4rXHRib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HO1xuK1xuK1x0YnVmX2xlZnQgPSBidWZfbmJ5dGU7XG4rXG4rXHRkYXRhID0gdGFibGUtXHUwMDNlZGF0YTtcbitcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xuK1x0XHRpZiAoYnVmX2xlZnQgXHUwMDNlIFBBR0VfU0laRSAtIDEpXG4rXHRcdFx0YnVmX2xlZnQgPSBQQUdFX1NJWkUgLSAxO1xuK1x0XHRwID0gYnVmO1xuK1xuK1x0XHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAzZSBkYXRhX3NpemUpIHtcbitcdFx0XHRkYXRhX3N0YWdlID0ga21lbWR1cCh0YWJsZS1cdTAwM2VkYXRhLCB0YWJsZS1cdTAwM2VtYXhsZW4sIEdGUF9LRVJORUwpO1xuK1x0XHRcdGlmICghZGF0YV9zdGFnZSkge1xuK1x0XHRcdFx0ZXJyID0gLUVOT01FTTtcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdH1cbitcdFx0XHRkYXRhID0gZGF0YV9zdGFnZTtcbitcdFx0fVxuIFx0fVxuIFxuLVx0Zm9yICg7IGxlZnQgXHUwMDI2XHUwMDI2IHZsZWZ0LS07IGkgKz0gc2l6ZSwgZmlyc3QgPSAwKSB7XG4rXHR2ZWNfbGVmdCA9IHRhYmxlLVx1MDAzZW1heGxlbiAvIGRhdGFfc2l6ZTtcbitcdGZvciAoOyBidWZfbGVmdCBcdTAwMjZcdTAwMjYgdmVjX2xlZnQtLTsgZGF0YSArPSBkYXRhX3NpemUsIG5yX2NvbnYrKykge1xuIFx0XHR1bnNpZ25lZCBsb25nIGx2YWw7XG4gXHRcdGJvb2wgbmVnID0gZmFsc2U7XG4gXG4tXHRcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcbi1cdFx0XHRwcm9jX3NraXBfc3BhY2VzKFx1MDAyNnAsIFx1MDAyNmxlZnQpO1xuK1x0XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbitcdFx0XHRwcm9jX3NraXBfc3BhY2VzKFx1MDAyNnAsIFx1MDAyNmJ1Zl9sZWZ0KTtcbiBcbi1cdFx0XHRpZiAoIWxlZnQpXG4rXHRcdFx0aWYgKCFidWZfbGVmdClcbiBcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2bGVmdCwgXHUwMDI2bHZhbCwgXHUwMDI2bmVnLFxuK1x0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQsIFx1MDAyNmx2YWwsIFx1MDAyNm5lZyxcbiBcdFx0XHRcdFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcbiBcdFx0XHRcdFx0ICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTtcbiBcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgbmVnIFx1MDAyNlx1MDAyNiBpc191bnNpZ25lZClcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0aWYgKGVycilcbiBcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGlmIChwcm9jX3ZlY19jb252KHR5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgaSwgZGlyLCB0YWJsZSkpIHtcbitcdFx0XHRpZiAocHJvY192ZWNfY29udihkYXRhX3R5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkge1xuIFx0XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRpZiAocHJvY192ZWNfY29udih0eXBlLCBjb252LCBcdTAwMjZuZWcsIFx1MDAyNmx2YWwsIGksIGRpciwgdGFibGUpKSB7XG4rXHRcdFx0aWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCBcdTAwMjZuZWcsIFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4tXHRcdFx0aWYgKCFmaXJzdClcbi1cdFx0XHRcdHByb2NfcHV0X2NoYXIoXHUwMDI2YnVmZmVyLCBcdTAwMjZsZWZ0LCAnXFx0Jyk7XG4tXHRcdFx0cHJvY19wdXRfbG9uZyhcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsIGx2YWwsIG5lZyk7XG4rXHRcdFx0aWYgKG5yX2NvbnYpXG4rXHRcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICdcXHQnKTtcbitcdFx0XHRwcm9jX3B1dF9sb25nKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsIGx2YWwsIG5lZyk7XG4gXHRcdH1cbiBcdH1cbiBcbi1cdGlmIChTWVNDVExfS0VSTl9UT19VU0VSKGRpcikgXHUwMDI2XHUwMDI2ICFmaXJzdCBcdTAwMjZcdTAwMjYgbGVmdCBcdTAwMjZcdTAwMjYgIWVycilcbi1cdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsICdcXG4nKTtcbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgXHUwMDI2XHUwMDI2ICFlcnIgXHUwMDI2XHUwMDI2IGxlZnQpXG4tXHRcdHByb2Nfc2tpcF9zcGFjZXMoXHUwMDI2cCwgXHUwMDI2bGVmdCk7XG4tXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpIFx1MDAyNlx1MDAyNiBmaXJzdClcbi1cdFx0cmV0dXJuIGVyciA/IDogLUVJTlZBTDtcbi1cdCpsZW5wIC09IGxlZnQ7XG4rXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbitcdFx0aWYgKCFlcnIgXHUwMDI2XHUwMDI2IGJ1Zl9sZWZ0KVxuK1x0XHRcdHByb2Nfc2tpcF9zcGFjZXMoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQpO1xuK1x0XHRpZiAoIW5yX2NvbnYpIHtcbitcdFx0XHRlcnIgPSBlcnIgPyA6IC1FSU5WQUw7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdFx0aWYgKCFlcnIgXHUwMDI2XHUwMDI2IGRhdGFfc3RhZ2UpXG4rXHRcdFx0ZXJyID0gY29tbWl0X2NvbnZfdmVjKGRhdGFfdHlwZSwgdGFibGUtXHUwMDNlZGF0YSwgZGF0YV9zdGFnZSwgbnJfY29udik7XG4rXHR9IGVsc2Uge1xuK1x0XHRpZiAobnJfY29udiBcdTAwMjZcdTAwMjYgYnVmX2xlZnQgXHUwMDI2XHUwMDI2ICFlcnIpXG4rXHRcdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWYsIFx1MDAyNmJ1Zl9sZWZ0LCAnXFxuJyk7XG4rXHR9XG4rXG4rXHQqYnVmX2xlZnRfZmluYWwgPSBidWZfbGVmdDtcbitcbitvdXQ6XG4rXHRrZnJlZShkYXRhX3N0YWdlKTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuKy8qIFJlYWQvd3JpdGUgYSB2ZWN0b3Igb2YgQHR5cGUgZWxlbWVudHMuICovXG4rc3RhdGljIGludCBwcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuK1x0XHQgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLFxuK1x0XHQgICAgdW5pb24gcHJvY192ZWNfY29udiBjb252KVxuK3tcbitcdGludCBlcnIgPSAwO1xuK1x0c2l6ZV90IGRhdGFfc2l6ZSwgbGVmdF9uYnl0ZSA9IFNJWkVfTUFYO1xuK1xuK1x0c3dpdGNoICh0eXBlKSB7XG4rXHRjYXNlIFBST0NfVkVDX0lOVDpcbitcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKGludCk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBQUk9DX1ZFQ19VSU5UOlxuK1x0XHRkYXRhX3NpemUgPSBzaXplb2YodWludCk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbitcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKHVsb25nKTtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuK1x0ICAgICgqcHBvcyBcdTAwMjZcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xuK1x0XHQqbGVucCA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkge1xuK1x0XHRpZiAocHJvY19maXJzdF9wb3Nfbm9uX3plcm9faWdub3JlKHBwb3MsIHRhYmxlKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGVyciA9IGFwcGx5X2NvbnZfb25fdmVjKGNvbnYsIHRhYmxlLCB0eXBlLCBkYXRhX3NpemUsIGRpciwgKmxlbnAsIGJ1ZmZlcixcbitcdFx0XHRcdFx1MDAyNmxlZnRfbmJ5dGUpO1xuK1xuK1x0LypcbitcdCAqIEFuIHVuY2hhbmdlZCBsZWZ0X25ieXRlIHNpZ25hbHMgYSB3cml0ZSB3aXRoIG5vIHBhcnNlZCBlbGVtZW50OyB3aGljaFxuK1x0ICogaXMgYW4gZXJyb3IuIFVzaW5nIFNJWkVfTUFYIHRvIGRldGVjdCB0aGlzIGVycm9yIGlzIHBvc3NpYmxlIGJlY2F1c2U6XG4rXHQgKiAxLiBsZW5wIGlzIGJvdW5kZWQgYnkgS01BTExPQ19NQVhfU0laRSBpbiBwcm9jX3N5c19jYWxsX2hhbmRsZXJcbitcdCAqIDIuIGxlbnAgY291bGQgbmV2ZXIgYmUgU0laRV9NQVggYXMgaXQgaXMgYSBcInJpZGljdWxvdXNcIiAoZXhhYnl0ZSkgYWxsb2NhdGlvbi5cbitcdCAqL1xuK1x0aWYgKGxlZnRfbmJ5dGUgPT0gU0laRV9NQVgpXG4rXHRcdHJldHVybiBlcnI7XG4rXG4rXHQqbGVucCAtPSBsZWZ0X25ieXRlO1xuIG91dDpcbiBcdCpwcG9zICs9ICpsZW5wO1xuK1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtNzU2LDEyICs4MjMsMTUgQEAgaW50IHByb2NfZG91aW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbiBcdFx0XHRpbnQgKCpjb252KShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIHVpbnQgKmtfcHRyLFxuIFx0XHRcdFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKSlcbiB7XG4rXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXG4rXHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAyNlx1MDAyNiAodGFibGUtXHUwMDNlbWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbiBcdGlmICghY29udilcbiBcdFx0Y29udiA9IGRvX3Byb2NfdWludF9jb252O1xuIFxuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbitcdFx0XHQodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pO1xuIH1cbiBcbiAvKipcbkBAIC04MjAsOCArODkwLDggQEAgaW50IHByb2NfZG9ib29sKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gaW50IHByb2NfZG9pbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbiBcdFx0ICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtODQwLDggKzkxMCw3IEBAIGludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gaW50IHByb2NfZG91aW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gXHRcdHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnYgfSk7XG4rXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIGRvX3Byb2NfdWludF9jb252KTtcbiB9XG4gXG4gLyoqXG5AQCAtODY0LDggKzkzMyw4IEBAIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIGludCBwcm9jX2RvaW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0ICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udl9taW5tYXggfSk7XG4gfVxuIFxuIC8qKlxuQEAgLTg5MSw4ICs5NjAsOCBAQCBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4gaW50IHByb2NfZG91aW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0XHQgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXG4ge1xuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBkb19wcm9jX3VpbnRfY29udl9taW5tYXggfSk7XG4rXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsXG4rXHRcdFx0XHQgICBkb19wcm9jX3VpbnRfY29udl9taW5tYXgpO1xuIH1cbiBcbiAvKipcbkBAIC05MzUsOCArMTAwNCw3IEBAIGludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuIFx0XHR0bXAuZXh0cmEyID0gKHVuc2lnbmVkIGludCAqKSBcdTAwMjZtYXg7XG4gXG4gXHR2YWwgPSBSRUFEX09OQ0UoKmRhdGEpO1xuLVx0cmVzID0gZG9fcHJvY192ZWMoXHUwMDI2dG1wLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252X21pbm1heCB9KTtcbitcdHJlcyA9IHByb2NfZG91aW50dmVjX21pbm1heChcdTAwMjZ0bXAsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zKTtcbiBcdGlmIChyZXMpXG4gXHRcdHJldHVybiByZXM7XG4gXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKVxuQEAgLTEwNjYsOCArMTEzNCw4IEBAIGludCBwcm9jX2RvdWxvbmd2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0XHRcdGludCAoKmNvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLFxuIFx0XHRcdFx0XHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLFxuLVx0XHRcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4rXHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGNvbnYgfSk7XG4gfVxuIFxuIC8qKlxuQEAgLTEwODcsMTAgKzExNTUsMTAgQEAgaW50IHByb2NfZG91bG9uZ3ZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuICAqIFJldHVybnM6ICUwIG9uIHN1Y2Nlc3MuXG4gICovXG4gaW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4tXHRcdFx0ICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbitcdFx0dm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORyxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4rXHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGRvX3Byb2NfdWxvbmdfY29udiB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtMTExNCw4ICsxMTgyLDggQEAgaW50IHByb2NfZG9pbnR2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIHtcbiBcdGlmICghY29udilcbiBcdFx0Y29udiA9IGRvX3Byb2NfaW50X2NvbnY7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gY29udiB9KTtcbiB9XG4gXG4gLyoqXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcbmluZGV4IGIyZDhiZDkwMjZhNzIuLmZkZjNkMmZiMGEyYWQgMTAwNzU1XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoXG5AQCAtNCw2ICs0LDcgQEBcbiBcbiAjIFRoaXMgcGVyZm9ybXMgYSBzZXJpZXMgdGVzdHMgYWdhaW5zdCB0aGUgcHJvYyBzeXNjdGwgaW50ZXJmYWNlLlxuIFxuKyMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjMxN1xuICMgS3NlbGZ0ZXN0IGZyYW1ld29yayByZXF1aXJlbWVudCAtIFNLSVAgY29kZSBpcyA0LlxuIGtzZnRfc2tpcD00XG4gXG5AQCAtMzcsNiArMzgsNyBAQCBBTExfVEVTVFM9XCIkQUxMX1RFU1RTIDAwMDk6MToxOnVucmVnaXN0ZXJfZXJyb3I6MFwiXG4gQUxMX1RFU1RTPVwiJEFMTF9URVNUUyAwMDEwOjE6MTptbnQvbW50X2Vycm9yOjBcIlxuIEFMTF9URVNUUz1cIiRBTExfVEVTVFMgMDAxMToxOjE6ZW1wdHlfYWRkOjBcIlxuIEFMTF9URVNUUz1cIiRBTExfVEVTVFMgMDAxMjoxOjE6dThfdmFsaWQ6MFwiXG4rQUxMX1RFU1RTPVwiJEFMTF9URVNUUyAwMDEzOjE6MTppbnRfMDAwMzoxXCJcbiBcbiBmdW5jdGlvbiBhbGxvd191c2VyX2RlZmF1bHRzKClcbiB7XG5AQCAtMTk2LDYgKzE5OCwxOCBAQCB2ZXJpZnlfZGlmZl93KClcbiBcdHJldHVybiAkP1xuIH1cbiBcbisjIFZlcmlmeSB0aGF0IGFuIGVycm9uZW91cyAoJDIpIHVwZGF0ZSBmYWlscyBhbmQgZG9lcyBub3QgY2hhbmdlIFRBUkdFVFxuK3ZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSgpXG4re1xuK1x0VEVTVF9TVFI9XCIkMVwiXG4rXHRlY2hvIC1uIFwiJFRFU1RfU1RSXCIgXHUwMDNlIFwiJFRBUkdFVFwiXG4rXG4rXHRpZiBlY2hvIC1uIFwiJDJcIiBcdTAwM2UgXCIkVEFSR0VUXCIgMlx1MDAzZSAvZGV2L251bGw7IHRoZW5cbitcdFx0cmV0dXJuIDFcbitcdGZpXG4rXHR2ZXJpZnlfZGlmZl93IFwiJHtUQVJHRVR9XCJcbit9XG4rXG4gdGVzdF9yYygpXG4ge1xuIFx0aWYgW1sgJHJjICE9IDAgXV07IHRoZW5cbkBAIC01MDEsNiArNTE1LDQwIEBAIHJ1bl9saW1pdF9kaWdpdF9pbnRfYXJyYXkoKVxuIFx0dGVzdF9yY1xuIH1cbiBcbisjIFlvdSB1c2VkIGFuIGludCBhcnJheSBhbmQgb25lIG9mIHRoZSBlbGVtZW50cyBpcyBub3QgYWNjZXB0YWJsZVxuK3J1bl9pbnRfYXJyYXlfbm9fcGFydGlhbF91cGRhdGUoKVxuK3tcbitcdGVjaG8gLW4gXCJUZXN0aW5nIGludmFsaWQgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCBwYXJ0aWFsbHkgdXBkYXRlIC4uLiBcIlxuKyAgICAgICAgIyBFeHBlY3QgZmFpbHVyZSBiZWNhdXNlIG9mIDNyZCBlbGVtZW50IChhYmMpLlxuK1x0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXCIxIDIgMyA0XCIgXCIxMCAyMCBhYmMgNDBcIjsgdGhlblxuK1x0XHRlY2hvIFwiRkFJTFwiIFx1MDAzZVx1MDAyNjJcbitcdFx0cmM9MVxuK1x0ZWxzZVxuK1x0XHRlY2hvIFwiT0tcIlxuK1x0ZmlcbitcdHRlc3RfcmNcbitcbitcdGVjaG8gLW4gXCJUZXN0aW5nIG91dCBvZiByYW5nZSBhcnJheSBlbGVtZW50IGRvZXMgbm90IHBhcnRpYWxseSB1cGRhdGUgLi4uIFwiXG4rICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIGJlY2F1c2Ugb2YgM3JkIGVsZW1lbnQgKGdyZWF0ZXIgdGhhbiBpbnQpXG4rXHRpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSBcIjEgMiAzIDRcIiBcIjEwIDIwICQoKElOVF9NQVggKyAxKSkgNDBcIjsgdGhlblxuK1x0XHRlY2hvIFwiRkFJTFwiIFx1MDAzZVx1MDAyNjJcbitcdFx0cmM9MVxuK1x0ZWxzZVxuK1x0XHRlY2hvIFwiT0tcIlxuK1x0ZmlcbitcdHRlc3RfcmNcbitcbitcdGVjaG8gLW4gXCJUZXN0aW5nIGludmFsaWQgZmlyc3QgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCB1cGRhdGUgLi4uIFwiXG4rICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIG9mIDFzdCBlbGVtZW50XG4rXHRpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSBcIjEgMiAzIDRcIiBcImFiYyAyMCAzMCA0MFwiOyB0aGVuXG4rXHRcdGVjaG8gXCJGQUlMXCIgXHUwMDNlXHUwMDI2MlxuK1x0XHRyYz0xXG4rXHRlbHNlXG4rXHRcdGVjaG8gXCJPS1wiXG4rXHRmaVxuK1x0dGVzdF9yY1xuK31cbitcbiAjIFlvdSBhcmUgdXNpbmcgYW4gdW5zaWduZWQgaW50XG4gcnVuX2xpbWl0X2RpZ2l0X3VpbnQoKVxuIHtcbkBAIC04ODAsNiArOTI4LDE0IEBAIHN5c2N0bF90ZXN0XzAwMTIoKVxuIFx0cmV0dXJuIDBcbiB9XG4gXG4rc3lzY3RsX3Rlc3RfMDAxMygpXG4re1xuK1x0VEFSR0VUPVwiJHtTWVNDVEx9LyQoZ2V0X3Rlc3RfdGFyZ2V0IDAwMTMpXCJcbitcdHJlc2V0X3ZhbHNcbitcbitcdHJ1bl9pbnRfYXJyYXlfbm9fcGFydGlhbF91cGRhdGVcbit9XG4rXG4gbGlzdF90ZXN0cygpXG4ge1xuIFx0ZWNobyBcIlRlc3QgSUQgbGlzdDpcIlxuQEAgLTkwMCw2ICs5NTYsNyBAQCBsaXN0X3Rlc3RzKClcbiBcdGVjaG8gXCIwMDEwIHggJChnZXRfdGVzdF9jb3VudCAwMDEwKSAtIHRlc3RzIHN5c2N0IG1vdW50IHBvaW50XCJcbiBcdGVjaG8gXCIwMDExIHggJChnZXRfdGVzdF9jb3VudCAwMDExKSAtIHRlc3RzIGVtcHR5IGRpcmVjdG9yaWVzXCJcbiBcdGVjaG8gXCIwMDEyIHggJChnZXRfdGVzdF9jb3VudCAwMDEyKSAtIHRlc3RzIHJhbmdlIGNoZWNrIGZvciB1OCBwcm9jX2hhbmRsZXJcIlxuK1x0ZWNobyBcIjAwMTMgeCAkKGdldF90ZXN0X2NvdW50IDAwMTMpIC0gdGVzdHMgcGFydGlhbGx5IHVwZGF0ZSB2ZWN0b3JzIG9uIGVycm9yXCJcbiB9XG4gXG4gdXNhZ2UoKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDI6NDguMzUxNjE3MzgyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTE5NDk3NDE0MzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBTeXNjdGwgUGF0Y2ggZm9yIEZ1enppbmcgT3Bwb3J0dW5pdGllcyoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggdGhhdCdzIGZ1bmRhbWVudGFsbHkgY2hhbmdpbmcgaG93IHN5c2N0bCBhcnJheXMgYXJlIGhhbmRsZWQgZHVyaW5nIHdyaXRlcyBpbiBga2VybmVsL3N5c2N0bC5jYC4gIFNwZWNpZmljYWxseSwgaXQncyBtb2RpZnlpbmcgdGhlIGBkb19wcm9jX3ZlY2AgZnVuY3Rpb24sIHJlbmFtaW5nIGl0IHRvIGBhcHBseV9jb252X29uX3ZlY2AgYW5kIGBwcm9jX3ZlY2AsIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBwcm9jZXNzaW5nIHN5c2N0bCB2ZWN0b3JzIOKAkyB0aG9zZSBhcnJheXMgb2YgaW50cywgdWludHMsIHVsb25ncyB3ZSBhbGwga25vdyBhbmQgbG92ZSAob3IgYXQgbGVhc3QsIHRvbGVyYXRlKS4gIFRoZSBjb3JlIGNoYW5nZSBoZXJlIGlzIGFib3V0IGF0b21pY2l0eTogdGhlIG9sZCBjb2RlIHdvdWxkIGNvbW1pdCBlbGVtZW50cyBpbiB0aGUgYXJyYXkgKmJlZm9yZSogYSBmYWlsdXJlLCBsZWFkaW5nIHRvIHBhcnRpYWwgdXBkYXRlcy4gIFRoaXMgbmV3IGNvZGUsIHRoYW5rZnVsbHksIHVzZXMgYSB0ZW1wb3JhcnkgYnVmZmVyIChgZGF0YV9zdGFnZWApIHRvIHN0YWdlIHRoZSBjb252ZXJzaW9uIGFuZCBvbmx5IGNvbW1pdHMgaWYgZXZlcnl0aGluZyBnb2VzIHNtb290aGx5LiAgR29vZCBmb3IgY29uc2lzdGVuY3ksIGJ1dCBhbHNvIGludGVyZXN0aW5nIGZyb20gYSB2dWxuZXJhYmlsaXR5IHBlcnNwZWN0aXZlLlxuXG5UaGUgZmlyc3QgcXVlc3Rpb246IGlzIHRoaXMgcmVhY2hhYmxlLCBhbmQgaXMgaXQgd29ydGggZnV6emluZz8gIFdlbGwsIHN5c2N0bCB3cml0ZXMgYXJlICphYnNvbHV0ZWx5KiByZWFjaGFibGUsIGFuZCBJIGtub3cgc3l6a2FsbGVyIGhpdHMgdGhlbSBwcmV0dHkgaGFyZC4gU28sIHllcywgaXQncyB3b3J0aCBpdC4gIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBrZXkgZnVuY3Rpb25zIG1vZGlmaWVkLiAgTG9va3MgbGlrZSBpdCdzIHJlYWxseSB0aGUgb25lcyBJIG1lbnRpb25lZCwgcGx1cyB0aGVzZTogYGNvbW1pdF9jb252X3ZlY2AsIGBwcm9jX2RvdWludHZlY19jb252YCwgYHByb2NfZG9pbnR2ZWNgLCBgcHJvY19kb3VpbnR2ZWNgLCBgcHJvY19kb2ludHZlY19taW5tYXhgLCBgcHJvY19kb3VpbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91bG9uZ3ZlY19jb252YCwgYHByb2NfZG91bG9uZ3ZlY19taW5tYXhgLCBgcHJvY19kb2ludHZlY19jb252YC5cblxuTXkgbmV4dCB0aG91Z2h0IGlzIHRvIGZvY3VzIHRoZSBmdXp6aW5nIGVmZm9ydC4gIExldCdzIHNlZTogYHByb2NfZG9pbnR2ZWNgLCBgcHJvY19kb3VpbnR2ZWNgLCBgcHJvY19kb2ludHZlY19taW5tYXhgLCBgcHJvY19kb3VpbnR2ZWNfbWlubWF4YCwgYHByb2NfZG91bG9uZ3ZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX2NvbnZgLCBgcHJvY19kb2ludHZlY19jb252YC4gVGhlc2UgYXJlICpleHBvcnRlZCogc3lzY3RsIGhhbmRsZXJzLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgSSdtIGxvb2tpbmcgZm9yLiAgV2FpdCBhIG1pbnV0ZSwgc3l6a2FsbGVyIGZ1enplcyBzeXNjdGxzIHVzaW5nIGBvcGVuYC9gd3JpdGVgIGNhbGxzIHRvIGAvcHJvYy9zeXMvLi4uYC4gVGhpcyBpcyBpbXBvcnRhbnQsIGFzIHRoZXNlIGNhbGxzIGFyZSBoYW5kbGVkIGJ5IGBwcm9jX3N5c19jYWxsX2hhbmRsZXJgIHdoaWNoIGV2ZW50dWFsbHkgdXNlcyBgdGFibGUtXHUwMDNlcHJvY19oYW5kbGVyYC4gIFNvLCAqdGhlc2UqIGZ1bmN0aW9ucywgdGhlIG9uZXMgSSBqdXN0IGxpc3RlZCwgYXJlIGxpa2VseSB0aGUgYWN0dWFsIGhhbmRsZXJzIGJlaW5nIGNhbGxlZC5cblxuTGV0J3MgcXVpY2tseSB2ZXJpZnkgdGhhdCBsaXN0OiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfY29udmAsIGBwcm9jX2RvaW50dmVjX2NvbnZgLiBQZXJmZWN0LlxuXG5ObyBzcGVjaWZpYyBjb25maWdzIHRvIHdvcnJ5IGFib3V0LCBpdCdzIGNvcmUga2VybmVsIGZ1bmN0aW9uYWxpdHkuXG5cbkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQgbWUgdGFrZSBhbm90aGVyIGxvb2sgYXQgdGhlIHBhdGNoIGl0c2VsZi4gSSB3YW50IHRvIGRvdWJsZS1jaGVjayB0aGF0IGBhcHBseV9jb252X29uX3ZlY2AgaXMgdGhlIGNlbnRyYWwgY29tcG9uZW50LiBZZXMsIGFuZCBpdCdzIHN0YXRpYy4gIFRoZSBleHBvcnRlZCBoYW5kbGVycyBhcmUgdGhlIG9uZXMgSSBpZGVudGlmaWVkOiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfY29udmAsIGBwcm9jX2RvaW50dmVjX2NvbnZgLiBJIG5lZWQgdG8gY29uZmlybSB0aGVzZSBhcmUgdHJ1bHkgZXhwb3J0ZWQuIFRoaXMgY29uZmlybXMgdGhlIGF0dGFjayBzdXJmYWNlIEkgaWRlbnRpZmllZC4gTm93LCBsZXQncyBnZXQgdG8gd29yayFcblxuXG4iLCJJbnB1dFRva2VucyI6NzYyNSwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcyMSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjAzOjAwLjMwMTM2MjI1N1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODcwNjEwNjkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkVYUE9SVF9TWU1CT0wuKlxcXFwocHJvY19kb2ludHZlY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvc3lzY3RsLmM9MTUyNT1FWFBPUlRfU1lNQk9MKHByb2NfZG9ib29sKTtcXG5rZXJuZWwvc3lzY3RsLmM6MTUyNjpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWMpO1xcbmtlcm5lbC9zeXNjdGwuYy0xNTI3LUVYUE9SVF9TWU1CT0wocHJvY19kb3VpbnR2ZWMpO1xcbmtlcm5lbC9zeXNjdGwuYzoxNTI4OkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY19taW5tYXgpO1xcbmtlcm5lbC9zeXNjdGwuYy0xNTI5LUVYUE9SVF9TWU1CT0xfR1BMKHByb2NfZG91aW50dmVjX21pbm1heCk7XFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9MjU0PWludCBwcm9jX2RvaW50dmVjX2ppZmZpZXMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjU5LX1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM6MjYwOkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY19qaWZmaWVzKTtcXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjYxLVxcbi0tXFxua2VybmVsL3RpbWUvamlmZmllcy5jPTI3Nz1pbnQgcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcXG4tLVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yODItfVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYzoyODM6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzKTtcXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMjg0LVxcbi0tXFxua2VybmVsL3RpbWUvamlmZmllcy5jPTMwMD1pbnQgcHJvY19kb2ludHZlY19tc19qaWZmaWVzKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzA1LX1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM6MzA2OkVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY19tc19qaWZmaWVzKTtcXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzA3LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzowMy4xNzE5ODA0MzhaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MDEwNjgwMDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBTeXNjdGwgQXJyYXkgV3JpdGUgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGEgZ29vZCBvbmUuIEl0J3MgZnVuZGFtZW50YWxseSBjaGFuZ2luZyBob3cgYHN5c2N0bGAgaGFuZGxlcyB3cml0ZXMgdG8gYXJyYXlzLCBzcGVjaWZpY2FsbHkgdG8gYXZvaWQgcGFydGlhbCB1cGRhdGVzLiBUaGUgYXBwcm9hY2ggb2YgYWxsb2NhdGluZyBhIHRlbXBvcmFyeSBidWZmZXIsIGNvbnZlcnRpbmcgdGhlIGVsZW1lbnRzIHRoZXJlLCBhbmQgb25seSBjb21taXR0aW5nIHRoZSBjaGFuZ2VzIGlmIGV2ZXJ5dGhpbmcgc3VjY2VlZHMgaXMgc21hcnQuIEl0J3MgYSBjbGFzc2ljIHRyYW5zYWN0aW9uYWwgYXBwcm9hY2gsIHJlYWxseS4gUHJldmVudHMgaW5jb25zaXN0ZW50IHN0YXRlIGFuZCBtaXRpZ2F0ZXMgcG90ZW50aWFsIGlzc3VlcyB3aXRoIGludGVycnVwdGVkIHdyaXRlIG9wZXJhdGlvbnMuXG5cblNpbmNlIHRoaXMgYWZmZWN0cyBhbGwgYHN5c2N0bGAgaGFuZGxlcnMgdGhhdCBkZWFsIHdpdGggdmVjdG9ycyDigJMgdGhhdCBpcywgYW55IGFycmF5IG9yIGxpc3Qgb2YgdmFsdWVzIOKAkyBpdCBoYXMgYSB3aWRlIGltcGFjdC4gTXkgZmlyc3QgdGhvdWdodCBpczogKiphYnNvbHV0ZWx5IGZ1enogdGhpcyEqKiBXZSBuZWVkIHRvIHRocm93IGV2ZXJ5dGhpbmcgd2UgY2FuIGF0IGl0LiAgSSdtIHBhcnRpY3VsYXJseSB3b3JyaWVkIGFib3V0IG1lbW9yeSBsZWFrcywgZXNwZWNpYWxseSB3aXRoaW4gYGFwcGx5X2NvbnZfb25fdmVjYC4gYGttZW1kdXBgIGlzIGEgcHJpbWUgc3VzcGVjdCDigJMgcG90ZW50aWFsIGZvciBsZWFrcyBpZiB0aGluZ3MgZ28gd3JvbmcuIE91dC1vZi1ib3VuZHMgYWNjZXNzZXMgYXJlIGFub3RoZXIgaHVnZSBjb25jZXJuLCBhbmQgd2UgbmVlZCB0byB2ZXJpZnkgdGhlIGVycm9yIGhhbmRsaW5nIGlzIHJvYnVzdC4gQW55IHdlYWtuZXNzIGhlcmUgY291bGQgYmUgZXhwbG9pdGVkLlxuXG5JIHNob3VsZCBmb2N1cyBvbiB0aGVzZSBzeW1ib2xzOiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGBwcm9jX2RvdWxvbmd2ZWNfY29udmAsIGFuZCBgcHJvY19kb2ludHZlY19jb252YC4gVGhvc2UgYXJlIGNsZWFybHkgdGhlIGNvcmUgZnVuY3Rpb25zIGludm9sdmVkIGluIHRoZXNlIHZlY3RvciBvcGVyYXRpb25zLlxuXG5XYWl0IGEgc2Vjb25k4oCmIGBwcm9jX2RvdWludHZlY19jb252YCBpcyBleHBvcnRlZD8gVGhhdOKAmXMgaW50ZXJlc3RpbmcuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHdoZXJlIHRoYXTigJlzIGJlaW5nIHVzZWQuIEkgbmVlZCB0byBjaGVjayBpdHMgZXhwb3J0IHRvIHNlZSB3aGF0IHRoYXQgaW1wbGllcy4gVGhpcyBkZWZpbml0ZWx5IHdhcnJhbnRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6OTU2OCwiT3V0cHV0VG9rZW5zIjoyNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzowOS4xODI2NjQzNjdaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc0ODEwNjE5MywiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiRVhQT1JUX1NZTUJPTC4qXFxcXChwcm9jX2RvdWludHZlY19jb252XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzoxMS45MzA3NzY4MjlaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzAxODc5NDkyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipDaGVja2luZyBGdW5jdGlvbiBFeHBvcnQgU3RhdHVzKipcblxuT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgYHByb2NfZG91aW50dmVjX2NvbnZgIGlzIGFuIGV4cG9ydGVkIGZ1bmN0aW9uLiBIbW0sIGl0IGRvZXNuJ3QgKnNlZW0qIGxpa2UgaXQgaXMuIEJ1dCBsZXQncyBub3QganVtcCB0byBjb25jbHVzaW9ucy4gSXQncyBlYXN5IHRvIGdldCBmdW5jdGlvbnMgbWl4ZWQgdXAsIHNvIEknZCBiZXR0ZXIgYmUgYWJzb2x1dGVseSBjZXJ0YWluIGJlZm9yZSBJIG1ha2UgYSBkZWNpc2lvbi4gTGV0J3Mgbm90IGFzc3VtZSBhbnl0aGluZy4gT2theSwgbGV0J3MganVzdCBtYWtlIGEgcXVpY2sgY2hlY2sgb2YgYHByb2NfZG91bG9uZ3ZlY19jb252YC4gSSBoYXZlIGEgZmVlbGluZyB0aGVyZSBtaWdodCBiZSBhIHJlbGF0aW9uIHRoYXQgbmVlZHMgdW50YW5nbGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxNTgsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzoxNS42MzI2NTg2OTFaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjg1NDM0MzQyMCwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiRVhQT1JUX1NZTUJPTC4qXFxcXChwcm9jX2RvdWxvbmd2ZWNfY29udlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDM6MTguNDg3MDEwNDIxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ1NzgwODAwNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgSSdtIHJlYWR5IHRvIGRpdmUgaW50byB0aGF0IFwiZXhwb3J0ZWRcIiBzaXR1YXRpb24uIEhlcmUncyBteSB0YWtlOlxuXG4qKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgRXhwb3J0ZWQgRGF0YSoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBGaXJzdCB0aGluZydzIGZpcnN0OiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgKmV4YWN0bHkqIHdoYXQncyBiZWVuIGV4cG9ydGVkLiBJdCdzIGNydWNpYWwsIGF0IHRoaXMgc3RhZ2UsIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIGFuZCBuYXR1cmUgb2YgdGhlIGRhdGEgaW52b2x2ZWQuIEkgbmVlZCB0byBiZSBtZXRob2RpY2FsIGhlcmUuIEknbGwgbmVlZCB0byBpZGVudGlmeSB0aGUga2V5IHZhcmlhYmxlcywgdGhlIGZvcm1hdHMgYmVpbmcgdXNlZCwgYW55IHBvdGVudGlhbCBiaWFzZXMgaW50cm9kdWNlZCBkdXJpbmcgdGhlIGV4cG9ydCBwcm9jZXNzIGFuZCB0aGVpciBpbXBsaWNhdGlvbnMsIHdoZXRoZXIgdGhlIGRhdGEgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBkZXNpcmVkIGV4cG9ydCBvciBpZiBhbnkgZmllbGRzIGFyZSBvbWl0dGVkLiBPbmNlIEkgZ3Jhc3AgdGhlIHJhdyBjb250ZW50cywgSSBjYW4gc3RhcnQgdG8gZm9ybXVsYXRlIG1vcmUgbWVhbmluZ2Z1bCBxdWVzdGlvbnMgYWJvdXQgaXRzIHN1aXRhYmlsaXR5IGZvciBvdXIgcHVycG9zZXMuIFVsdGltYXRlbHksIGl0J3MgYWJvdXQgbWFraW5nIHN1cmUgd2UncmUgc3RhcnRpbmcgd2l0aCBhIHNvbGlkIGZvdW5kYXRpb24gYmVmb3JlIHdlIHN0YXJ0IG1hbmlwdWxhdGluZyBvciBhbmFseXppbmcgdGhlIGRhdGEuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMzYzLCJPdXRwdXRUb2tlbnMiOjI0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzoyMi45NDQ4MjA4MDhaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3ODQwNzgwOTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiRVhQT1JUX1NZTUJPTC4qXFxcXChwcm9jX2QuKnZlY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvc3lzY3RsLmM9OTg1PWludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbi0tXFxua2VybmVsL3N5c2N0bC5jLTEwMTMtfVxcbmtlcm5lbC9zeXNjdGwuYzoxMDE0OkVYUE9SVF9TWU1CT0xfR1BMKHByb2NfZG91OHZlY19taW5tYXgpO1xcbmtlcm5lbC9zeXNjdGwuYy0xMDE1LVxcbi0tXFxua2VybmVsL3N5c2N0bC5jPTE1MjU9RVhQT1JUX1NZTUJPTChwcm9jX2RvYm9vbCk7XFxua2VybmVsL3N5c2N0bC5jOjE1MjY6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjKTtcXG5rZXJuZWwvc3lzY3RsLmM6MTUyNzpFWFBPUlRfU1lNQk9MKHByb2NfZG91aW50dmVjKTtcXG5rZXJuZWwvc3lzY3RsLmM6MTUyODpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfbWlubWF4KTtcXG5rZXJuZWwvc3lzY3RsLmM6MTUyOTpFWFBPUlRfU1lNQk9MX0dQTChwcm9jX2RvdWludHZlY19taW5tYXgpO1xcbmtlcm5lbC9zeXNjdGwuYy0xNTMwLUVYUE9SVF9TWU1CT0wocHJvY19kb3N0cmluZyk7XFxua2VybmVsL3N5c2N0bC5jOjE1MzE6RVhQT1JUX1NZTUJPTChwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KTtcXG5rZXJuZWwvc3lzY3RsLmMtMTUzMi1FWFBPUlRfU1lNQk9MKHByb2NfZG9fbGFyZ2VfYml0bWFwKTtcXG4tLVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYz0yNTQ9aW50IHByb2NfZG9pbnR2ZWNfamlmZmllcyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcXG4tLVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yNTktfVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYzoyNjA6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX2ppZmZpZXMpO1xcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yNjEtXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9Mjc3PWludCBwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbi0tXFxua2VybmVsL3RpbWUvamlmZmllcy5jLTI4Mi19XFxua2VybmVsL3RpbWUvamlmZmllcy5jOjI4MzpFWFBPUlRfU1lNQk9MKHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMpO1xcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0yODQtXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9MzAwPWludCBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcXG4tLVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0zMDUtfVxcbmtlcm5lbC90aW1lL2ppZmZpZXMuYzozMDY6RVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMpO1xcbmtlcm5lbC90aW1lL2ppZmZpZXMuYy0zMDctXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM9MzMyPWludCBwcm9jX2RvdWxvbmd2ZWNfbXNfamlmZmllc19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuLS1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzM3LX1cXG5rZXJuZWwvdGltZS9qaWZmaWVzLmM6MzM4OkVYUE9SVF9TWU1CT0wocHJvY19kb3Vsb25ndmVjX21zX2ppZmZpZXNfbWlubWF4KTtcXG5rZXJuZWwvdGltZS9qaWZmaWVzLmMtMzM5LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzoyNS43Mjg5MDU0NTNaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjA1NTgzMDk1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBTeXNjdGwgSGFuZGxlciBQYXRjaCoqXG5cbk9rYXksIHNvIEkgc2VlIHRoZSBleHBvcnRlZCBzeW1ib2xzOiBgcHJvY19kb2ludHZlY2AsIGBwcm9jX2RvdWludHZlY2AsIGBwcm9jX2RvaW50dmVjX21pbm1heGAsIGBwcm9jX2RvdWludHZlY19taW5tYXhgLCBgcHJvY19kb3Vsb25ndmVjX21pbm1heGAsIGFuZCBgcHJvY19kb3U4dmVjX21pbm1heGAuIFRoZXNlIGFyZSB0aGUgZW50cnkgcG9pbnRzIGZvciB0aGUgc3lzY3RsIGhhbmRsZXJzLCByaWdodD8gQW5kIHRoaXMgcGF0Y2ggaXMgaGl0dGluZyB0aGUgY29yZSBsb2dpYyBiZWhpbmQgYWxsIG9mIHRoZW0uIFNtYXJ0IG1vdmUsIGFkZHJlc3NpbmcgaXQgYXQgdGhlIHJvb3QuXG5cblRoZSBjb3JlIGNoYW5nZSBoZXJlIGlzIGFib3V0IHByZXZlbnRpbmcgcGFydGlhbCB1cGRhdGVzIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBzeXNjdGwgdmVjdG9yIHByb2Nlc3NpbmcuIFRoZSBzb2x1dGlvbiwgaXQgc2VlbXMsIGlzIGFsbG9jYXRpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyLiBUaGF04oCZcyBhIGNvbW1vbiBhcHByb2FjaCB0byBlbnN1cmUgYXRvbWljaXR5IGluIHRoZXNlIHR5cGVzIG9mIG9wZXJhdGlvbnMuIEl0IGFmZmVjdHMgYW55IGhhbmRsZXIgdGhhdCdzIHdvcmtpbmcgd2l0aCBhcnJheXMsIHdoaWNoIG1ha2VzIHNlbnNlIGdpdmVuIHRoZSBmdW5jdGlvbiBuYW1lcy5cblxuTm93LCBiZWNhdXNlIG9mIHRoaXMgY2hhbmdlIGluIHRoZSBlcnJvciBoYW5kbGluZywgYW5kIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBidWZmZXIsIEknbSB0aGlua2luZyByaWdvcm91cyBmdXp6aW5nIGlzIGFic29sdXRlbHkgY3J1Y2lhbCBoZXJlLiBXZSBuZWVkIHRvIHZlcmlmeSB0aGF0IGVycm9yIGhhbmRsaW5nIGlzIHJvY2sgc29saWQsIHRoYXQgdGhlcmUgYXJlIG5vIHNuZWFreSBtZW1vcnkgbGVha3MsIGFuZCBkZWZpbml0ZWx5IG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgd2hlbiB3ZSB3cml0ZSB0byB0aGUgc3lzY3RsIGludGVyZmFjZS4gSSBuZWVkIHRvIGJlIHN1cmUgdGhhdCB3ZSBkb24ndCBpbnRyb2R1Y2Ugc3VidGxlIHZ1bG5lcmFiaWxpdGllcy5cblxuTGV0J3MgZ2V0IGBzZXQtcmVzdWx0c2AgcnVubmluZy4gSSBuZWVkIHRvIHNlZSB3aGF0IHdlIGhhdmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMzEwLCJPdXRwdXRUb2tlbnMiOjE1MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowMzozMS43ODQ3NDIwMzJaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozOTI1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInByb2NfZG9pbnR2ZWNcIixcbiAgICBcInByb2NfZG91aW50dmVjXCIsXG4gICAgXCJwcm9jX2RvaW50dmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3VpbnR2ZWNfbWlubWF4XCIsXG4gICAgXCJwcm9jX2RvdWxvbmd2ZWNfbWlubWF4XCIsXG4gICAgXCJwcm9jX2RvdTh2ZWNfbWlubWF4XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGNvcmUgc3lzY3RsIHZlY3RvciBwcm9jZXNzaW5nIGxvZ2ljIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIG9uIGVycm9yIGJ5IGFsbG9jYXRpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyLiBUaGlzIGFmZmVjdHMgYWxsIHN5c2N0bCBoYW5kbGVycyB0aGF0IHByb2Nlc3MgYXJyYXlzLiBGdXp6aW5nIGlzIG5lZWRlZCB0byBlbnN1cmUgY29ycmVjdCBlcnJvciBoYW5kbGluZywgbm8gbWVtb3J5IGxlYWtzLCBhbmQgbm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBkdXJpbmcgc3lzY3RsIHdyaXRlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwcm9jX2RvaW50dmVjXCIsXG4gICAgXCJwcm9jX2RvdWludHZlY1wiLFxuICAgIFwicHJvY19kb2ludHZlY19taW5tYXhcIixcbiAgICBcInByb2NfZG91aW50dmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3Vsb25ndmVjX21pbm1heFwiLFxuICAgIFwicHJvY19kb3U4dmVjX21pbm1heFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBjb3JlIHN5c2N0bCB2ZWN0b3IgcHJvY2Vzc2luZyBsb2dpYyB0byBwcmV2ZW50IHBhcnRpYWwgdXBkYXRlcyBvbiBlcnJvciBieSBhbGxvY2F0aW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gVGhpcyBhZmZlY3RzIGFsbCBzeXNjdGwgaGFuZGxlcnMgdGhhdCBwcm9jZXNzIGFycmF5cy4gRnV6emluZyBpcyBuZWVkZWQgdG8gZW5zdXJlIGNvcnJlY3QgZXJyb3IgaGFuZGxpbmcsIG5vIG1lbW9yeSBsZWFrcywgYW5kIG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgZHVyaW5nIHN5c2N0bCB3cml0ZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjAzOjMxLjc4NDc4NTAzMloiLCJTZXEiOjEzLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY3MzkzNDgwNjcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDM6MzEuNzg1NTkyMjEyWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE2NzM5MjY2OTg4MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHN5c2N0bCBhcnJheSBwYXJzaW5nIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIGJ5IHVzaW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGttZW1kdXBgKSB3aGVuIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gVGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBzaW1wbGUgYXJyYXlzIG9mIGludGVnZXJzIG9yIHVuc2lnbmVkIGxvbmdzIHdpdGhvdXQgcGFkZGluZy4gVGhlIHJlYWQgcGF0aCAoa2VybmVsIHRvIHVzZXIpIGlzIHVuY2hhbmdlZCwgc28gbm8gbmV3IGluZm8tbGVha3MgYXJlIGludHJvZHVjZWQuIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG9ubHkgdXNlZCBmb3Igd3JpdGluZyB0byBrZXJuZWwgc3BhY2UsIGFuZCBvbmx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQgZWxlbWVudHMgYXJlIGNvcGllZCBiYWNrLiBBbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIG1lbW9yeSBsZWFrIGRldGVjdG9ycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGUyMDg2MjgzMWNlNzRhMmNiYWY2ZjYzZTkxZWM3ZThmMDQxZWVkMTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IEF1ZyAxMyAxNTowMjo0NCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuY1xuaW5kZXggZjdiNzU5ODVkNTQyMC4uNzg3ZjUzZDcwNTA3YiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9zeXNjdGwuY1xuKysrIGIva2VybmVsL3N5c2N0bC5jXG5AQCAtNTk1LDcgKzU5NSw3IEBAIHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXG4gc3RhdGljIGNvbnN0IGNoYXIgcHJvY193c3BhY2Vfc2VwW10gPSB7ICcgJywgJ1xcdCcsICdcXG4nIH07XG4gXG4gLypcbi0gKiBFbGVtZW50IHR5cGUgcHJvY2Vzc2VkIGJ5IGRvX3Byb2NfdmVjKCkuIFRoZSB0YWcgc2VsZWN0cyB0aGUgZWxlbWVudCBzaXplXG4rICogRWxlbWVudCB0eXBlIHByb2Nlc3NlZCBieSBwcm9jX3ZlYygpLiBUaGUgdGFnIHNlbGVjdHMgdGhlIGVsZW1lbnQgc2l6ZVxuICAqIGFuZCBzaWduZWRuZXNzLCBhbmQgaXQgc2VsZWN0cyB3aGljaCBtZW1iZXIgb2YgdW5pb24gcHJvY192ZWNfY29udiBpcyBsaXZlLlxuICAqL1xuIGVudW0gcHJvY192ZWNfdHlwZSB7XG5AQCAtNjA1LDcgKzYwNSw3IEBAIGVudW0gcHJvY192ZWNfdHlwZSB7XG4gfTtcbiBcbiAvKlxuLSAqIENvbnZlcnRlciBwYXNzZWQgdG8gZG9fcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxuKyAqIENvbnZlcnRlciBwYXNzZWQgdG8gcHJvY192ZWMoKS4gT25seSB0aGUgbWVtYmVyIG1hdGNoaW5nIHRoZVxuICAqIGVudW0gcHJvY192ZWNfdHlwZSB0YWcgaXMgZXZlciByZWFkLCBzbyBldmVyeSBkaXNwYXRjaCBzdGF5cyBmdWxseSB0eXBlZCBhbmRcbiAgKiBubyB2b2lkICogY29udmVydGVyIHBvaW50ZXIgaXMgbmVlZGVkLlxuICAqL1xuQEAgLTYzNywxMDEgKzYzNywxNjggQEAgc3RhdGljIGludCBwcm9jX3ZlY19jb252KGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXG4gXHRyZXR1cm4gLUVJTlZBTDtcbiB9XG4gXG4tLypcbi0gKiBSZWFkL3dyaXRlIGEgdmVjdG9yIG9mIEB0eXBlIGVsZW1lbnRzLiBUaGUgZWxlbWVudCBzaXplIGFuZCBzaWduZWRuZXNzIGFyZVxuLSAqIGRlcml2ZWQgZnJvbSBAdHlwZSwgc28gYSBzaW5nbGUgcnVudGltZSBmdW5jdGlvbiByZXBsYWNlcyB0aGUgcGVyLXR5cGVcbi0gKiB2YXJpYW50cy4gdGFibGUtXHUwMDNlZGF0YSBpcyB3YWxrZWQgYXMgcmF3IGJ5dGVzIChAaSkgYWR2YW5jZWQgYnkgQHNpemU7IHRoZVxuLSAqIGNvbnZlcnRlciBwZXJmb3JtcyB0aGUgYWN0dWFsIHR5cGVkIGxvYWQvc3RvcmUuXG4tICovXG4tc3RhdGljIGludCBkb19wcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbi1cdFx0ICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsXG4tXHRcdCAgICAgICBlbnVtIHByb2NfdmVjX3R5cGUgdHlwZSwgdW5pb24gcHJvY192ZWNfY29udiBjb252KVxuK3N0YXRpYyBpbnQgY29tbWl0X2NvbnZfdmVjKGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsIHZvaWQgKmRzdCxcbitcdFx0XHQgICAgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnIpXG4ge1xuLVx0aW50IHZsZWZ0LCBmaXJzdCA9IDEsIGVyciA9IDA7XG4tXHRzaXplX3QgbGVmdCwgc2l6ZTtcbi1cdGJvb2wgaXNfdW5zaWduZWQ7XG4tXHRjaGFyICppLCAqcDtcbitcdHNpemVfdCBpO1xuIFxuLVx0c3dpdGNoICh0eXBlKSB7XG4rXHRzd2l0Y2ggKGRhdGFfdHlwZSkge1xuIFx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YoaW50KTtcbi1cdFx0aXNfdW5zaWduZWQgPSBmYWxzZTtcbi1cdFx0YnJlYWs7XG4tXHRjYXNlIFBST0NfVkVDX1VJTlQ6XG4tXHRcdHNpemUgPSBzaXplb2YodWludCk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpKyspXG4rXHRcdFx0V1JJVEVfT05DRSgoKGludCAqKWRzdClbaV0sICgoY29uc3QgaW50ICopc3JjKVtpXSk7XG4rXHRcdHJldHVybiAwO1xuK1xuIFx0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbi1cdFx0c2l6ZSA9IHNpemVvZih1bG9uZyk7XG4tXHRcdGlzX3Vuc2lnbmVkID0gdHJ1ZTtcbi1cdFx0YnJlYWs7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpKyspXG4rXHRcdFx0V1JJVEVfT05DRSgoKHVsb25nICopZHN0KVtpXSwgKChjb25zdCB1bG9uZyAqKXNyYylbaV0pO1xuK1x0XHRyZXR1cm4gMDtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiAtRUlOVkFMO1xuIFx0fVxuK31cbiBcbi1cdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuLVx0ICAgICgqcHBvcyBcdTAwMjZcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xuLVx0XHQqbGVucCA9IDA7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0aSA9IHRhYmxlLVx1MDAzZWRhdGE7XG4tXHR2bGVmdCA9IHRhYmxlLVx1MDAzZW1heGxlbiAvIHNpemU7XG4tXHRsZWZ0ID0gKmxlbnA7XG4tXG4tXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXG4tXHRpZiAodHlwZSA9PSBQUk9DX1ZFQ19VSU5UIFx1MDAyNlx1MDAyNiB2bGVmdCAhPSAxKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcbi1cdFx0aWYgKHByb2NfZmlyc3RfcG9zX25vbl96ZXJvX2lnbm9yZShwcG9zLCB0YWJsZSkpXG4tXHRcdFx0Z290byBvdXQ7XG4tXG4tXHRcdGlmIChsZWZ0IFx1MDAzZSBQQUdFX1NJWkUgLSAxKVxuLVx0XHRcdGxlZnQgPSBQQUdFX1NJWkUgLSAxO1xuLVx0XHRwID0gYnVmZmVyO1xuKy8qKlxuKyAqIGFwcGx5X2NvbnZfb25fdmVjIC0gQXBwbHkgY29udmVydGVyIGZ1bmN0aW9uIG9uIGRhdGEgdmVjdG9yXG4rICpcbisgKiBFbGVtZW50IHNpZ25lZG5lc3MgaXMgZGVyaXZlZCBmcm9tIEBkYXRhX3R5cGUuIHRhYmxlLVx1MDAzZWRhdGEgaXMgd2Fsa2VkXG4rICogYXMgcmF3IGJ5dGVzIChAZGF0YSkgYWR2YW5jZWQgYnkgQGRhdGFfc2l6ZTsgdGhlIGNvbnZlcnRlciBwZXJmb3Jtc1xuKyAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mXG4rICogYnl0ZXMgdGhhdCB3aGVyZSBsZWZ0IG91dHN0YW5kaW5nIGFmdGVyIGNvbnZlcnNpb24uIENhbiBiZSBcdTAwM2UgMC5cbisgKlxuKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLiBOb24temVybyBvbiBlcnJvci5cbisgKi9cbitzdGF0aWMgaW50IGFwcGx5X2NvbnZfb25fdmVjKGNvbnN0IHVuaW9uIHByb2NfdmVjX2NvbnYgY29udixcbitcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLFxuK1x0XHRcdCAgICAgY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSxcbitcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IGludCBjb252X2RpcixcbitcdFx0XHQgICAgIGNvbnN0IHNpemVfdCBidWZfbmJ5dGUsIHZvaWQgKmJ1ZixcbitcdFx0XHQgICAgIHNpemVfdCAqYnVmX2xlZnRfZmluYWwpXG4re1xuK1x0aW50IHZlY19sZWZ0LCBlcnIgPSAwO1xuK1x0c2l6ZV90IGJ1Zl9sZWZ0LCBucl9jb252ID0gMDtcbitcdGNoYXIgKmRhdGEsICpkYXRhX3N0YWdlID0gTlVMTCwgKnA7XG4rXHRib29sIGlzX3Vuc2lnbmVkID0gZGF0YV90eXBlID09IFBST0NfVkVDX1VJTlQgfHwgZGF0YV90eXBlID09IFBST0NfVkVDX1VMT05HO1xuK1xuK1x0YnVmX2xlZnQgPSBidWZfbmJ5dGU7XG4rXG4rXHRkYXRhID0gdGFibGUtXHUwMDNlZGF0YTtcbitcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xuK1x0XHRpZiAoYnVmX2xlZnQgXHUwMDNlIFBBR0VfU0laRSAtIDEpXG4rXHRcdFx0YnVmX2xlZnQgPSBQQUdFX1NJWkUgLSAxO1xuK1x0XHRwID0gYnVmO1xuK1xuK1x0XHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAzZSBkYXRhX3NpemUpIHtcbitcdFx0XHRkYXRhX3N0YWdlID0ga21lbWR1cCh0YWJsZS1cdTAwM2VkYXRhLCB0YWJsZS1cdTAwM2VtYXhsZW4sIEdGUF9LRVJORUwpO1xuK1x0XHRcdGlmICghZGF0YV9zdGFnZSkge1xuK1x0XHRcdFx0ZXJyID0gLUVOT01FTTtcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdH1cbitcdFx0XHRkYXRhID0gZGF0YV9zdGFnZTtcbitcdFx0fVxuIFx0fVxuIFxuLVx0Zm9yICg7IGxlZnQgXHUwMDI2XHUwMDI2IHZsZWZ0LS07IGkgKz0gc2l6ZSwgZmlyc3QgPSAwKSB7XG4rXHR2ZWNfbGVmdCA9IHRhYmxlLVx1MDAzZW1heGxlbiAvIGRhdGFfc2l6ZTtcbitcdGZvciAoOyBidWZfbGVmdCBcdTAwMjZcdTAwMjYgdmVjX2xlZnQtLTsgZGF0YSArPSBkYXRhX3NpemUsIG5yX2NvbnYrKykge1xuIFx0XHR1bnNpZ25lZCBsb25nIGx2YWw7XG4gXHRcdGJvb2wgbmVnID0gZmFsc2U7XG4gXG4tXHRcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikpIHtcbi1cdFx0XHRwcm9jX3NraXBfc3BhY2VzKFx1MDAyNnAsIFx1MDAyNmxlZnQpO1xuK1x0XHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbitcdFx0XHRwcm9jX3NraXBfc3BhY2VzKFx1MDAyNnAsIFx1MDAyNmJ1Zl9sZWZ0KTtcbiBcbi1cdFx0XHRpZiAoIWxlZnQpXG4rXHRcdFx0aWYgKCFidWZfbGVmdClcbiBcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2bGVmdCwgXHUwMDI2bHZhbCwgXHUwMDI2bmVnLFxuK1x0XHRcdGVyciA9IHByb2NfZ2V0X2xvbmcoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQsIFx1MDAyNmx2YWwsIFx1MDAyNm5lZyxcbiBcdFx0XHRcdFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcbiBcdFx0XHRcdFx0ICAgIHNpemVvZihwcm9jX3dzcGFjZV9zZXApLCBOVUxMKTtcbiBcdFx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgbmVnIFx1MDAyNlx1MDAyNiBpc191bnNpZ25lZClcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0aWYgKGVycilcbiBcdFx0XHRcdGJyZWFrO1xuLVx0XHRcdGlmIChwcm9jX3ZlY19jb252KHR5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgaSwgZGlyLCB0YWJsZSkpIHtcbitcdFx0XHRpZiAocHJvY192ZWNfY29udihkYXRhX3R5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkge1xuIFx0XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRpZiAocHJvY192ZWNfY29udih0eXBlLCBjb252LCBcdTAwMjZuZWcsIFx1MDAyNmx2YWwsIGksIGRpciwgdGFibGUpKSB7XG4rXHRcdFx0aWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCBcdTAwMjZuZWcsIFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcbiBcdFx0XHRcdGVyciA9IC1FSU5WQUw7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4tXHRcdFx0aWYgKCFmaXJzdClcbi1cdFx0XHRcdHByb2NfcHV0X2NoYXIoXHUwMDI2YnVmZmVyLCBcdTAwMjZsZWZ0LCAnXFx0Jyk7XG4tXHRcdFx0cHJvY19wdXRfbG9uZyhcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsIGx2YWwsIG5lZyk7XG4rXHRcdFx0aWYgKG5yX2NvbnYpXG4rXHRcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICdcXHQnKTtcbitcdFx0XHRwcm9jX3B1dF9sb25nKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsIGx2YWwsIG5lZyk7XG4gXHRcdH1cbiBcdH1cbiBcbi1cdGlmIChTWVNDVExfS0VSTl9UT19VU0VSKGRpcikgXHUwMDI2XHUwMDI2ICFmaXJzdCBcdTAwMjZcdTAwMjYgbGVmdCBcdTAwMjZcdTAwMjYgIWVycilcbi1cdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWZmZXIsIFx1MDAyNmxlZnQsICdcXG4nKTtcbi1cdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGRpcikgXHUwMDI2XHUwMDI2ICFlcnIgXHUwMDI2XHUwMDI2IGxlZnQpXG4tXHRcdHByb2Nfc2tpcF9zcGFjZXMoXHUwMDI2cCwgXHUwMDI2bGVmdCk7XG4tXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpIFx1MDAyNlx1MDAyNiBmaXJzdClcbi1cdFx0cmV0dXJuIGVyciA/IDogLUVJTlZBTDtcbi1cdCpsZW5wIC09IGxlZnQ7XG4rXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcbitcdFx0aWYgKCFlcnIgXHUwMDI2XHUwMDI2IGJ1Zl9sZWZ0KVxuK1x0XHRcdHByb2Nfc2tpcF9zcGFjZXMoXHUwMDI2cCwgXHUwMDI2YnVmX2xlZnQpO1xuK1x0XHRpZiAoIW5yX2NvbnYpIHtcbitcdFx0XHRlcnIgPSBlcnIgPyA6IC1FSU5WQUw7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdFx0aWYgKCFlcnIgXHUwMDI2XHUwMDI2IGRhdGFfc3RhZ2UpXG4rXHRcdFx0ZXJyID0gY29tbWl0X2NvbnZfdmVjKGRhdGFfdHlwZSwgdGFibGUtXHUwMDNlZGF0YSwgZGF0YV9zdGFnZSwgbnJfY29udik7XG4rXHR9IGVsc2Uge1xuK1x0XHRpZiAobnJfY29udiBcdTAwMjZcdTAwMjYgYnVmX2xlZnQgXHUwMDI2XHUwMDI2ICFlcnIpXG4rXHRcdFx0cHJvY19wdXRfY2hhcihcdTAwMjZidWYsIFx1MDAyNmJ1Zl9sZWZ0LCAnXFxuJyk7XG4rXHR9XG4rXG4rXHQqYnVmX2xlZnRfZmluYWwgPSBidWZfbGVmdDtcbitcbitvdXQ6XG4rXHRrZnJlZShkYXRhX3N0YWdlKTtcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuKy8qIFJlYWQvd3JpdGUgYSB2ZWN0b3Igb2YgQHR5cGUgZWxlbWVudHMuICovXG4rc3RhdGljIGludCBwcm9jX3ZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuK1x0XHQgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MsIGVudW0gcHJvY192ZWNfdHlwZSB0eXBlLFxuK1x0XHQgICAgdW5pb24gcHJvY192ZWNfY29udiBjb252KVxuK3tcbitcdGludCBlcnIgPSAwO1xuK1x0c2l6ZV90IGRhdGFfc2l6ZSwgbGVmdF9uYnl0ZSA9IFNJWkVfTUFYO1xuK1xuK1x0c3dpdGNoICh0eXBlKSB7XG4rXHRjYXNlIFBST0NfVkVDX0lOVDpcbitcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKGludCk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBQUk9DX1ZFQ19VSU5UOlxuK1x0XHRkYXRhX3NpemUgPSBzaXplb2YodWludCk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBQUk9DX1ZFQ19VTE9ORzpcbitcdFx0ZGF0YV9zaXplID0gc2l6ZW9mKHVsb25nKTtcbitcdFx0YnJlYWs7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdGlmICghdGFibGUtXHUwMDNlZGF0YSB8fCAhdGFibGUtXHUwMDNlbWF4bGVuIHx8ICEqbGVucCB8fFxuK1x0ICAgICgqcHBvcyBcdTAwMjZcdTAwMjYgU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKSkge1xuK1x0XHQqbGVucCA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oZGlyKSkge1xuK1x0XHRpZiAocHJvY19maXJzdF9wb3Nfbm9uX3plcm9faWdub3JlKHBwb3MsIHRhYmxlKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGVyciA9IGFwcGx5X2NvbnZfb25fdmVjKGNvbnYsIHRhYmxlLCB0eXBlLCBkYXRhX3NpemUsIGRpciwgKmxlbnAsIGJ1ZmZlcixcbitcdFx0XHRcdFx1MDAyNmxlZnRfbmJ5dGUpO1xuK1xuK1x0LypcbitcdCAqIEFuIHVuY2hhbmdlZCBsZWZ0X25ieXRlIHNpZ25hbHMgYSB3cml0ZSB3aXRoIG5vIHBhcnNlZCBlbGVtZW50OyB3aGljaFxuK1x0ICogaXMgYW4gZXJyb3IuIFVzaW5nIFNJWkVfTUFYIHRvIGRldGVjdCB0aGlzIGVycm9yIGlzIHBvc3NpYmxlIGJlY2F1c2U6XG4rXHQgKiAxLiBsZW5wIGlzIGJvdW5kZWQgYnkgS01BTExPQ19NQVhfU0laRSBpbiBwcm9jX3N5c19jYWxsX2hhbmRsZXJcbitcdCAqIDIuIGxlbnAgY291bGQgbmV2ZXIgYmUgU0laRV9NQVggYXMgaXQgaXMgYSBcInJpZGljdWxvdXNcIiAoZXhhYnl0ZSkgYWxsb2NhdGlvbi5cbitcdCAqL1xuK1x0aWYgKGxlZnRfbmJ5dGUgPT0gU0laRV9NQVgpXG4rXHRcdHJldHVybiBlcnI7XG4rXG4rXHQqbGVucCAtPSBsZWZ0X25ieXRlO1xuIG91dDpcbiBcdCpwcG9zICs9ICpsZW5wO1xuK1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtNzU2LDEyICs4MjMsMTUgQEAgaW50IHByb2NfZG91aW50dmVjX2NvbnYoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbiBcdFx0XHRpbnQgKCpjb252KShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIHVpbnQgKmtfcHRyLFxuIFx0XHRcdFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKSlcbiB7XG4rXHQvKiB1aW50IGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCwgKkRvIG5vdCogYWRkIHN1cHBvcnQgZm9yIHRoZW0uICovXG4rXHRpZiAodGFibGUtXHUwMDNlbWF4bGVuIFx1MDAyNlx1MDAyNiAodGFibGUtXHUwMDNlbWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbiBcdGlmICghY29udilcbiBcdFx0Y29udiA9IGRvX3Byb2NfdWludF9jb252O1xuIFxuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbitcdFx0XHQodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBjb252IH0pO1xuIH1cbiBcbiAvKipcbkBAIC04MjAsOCArODkwLDggQEAgaW50IHByb2NfZG9ib29sKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gaW50IHByb2NfZG9pbnR2ZWMoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsIHZvaWQgKmJ1ZmZlcixcbiBcdFx0ICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBkb19wcm9jX2ludF9jb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtODQwLDggKzkxMCw3IEBAIGludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gaW50IHByb2NfZG91aW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXG4gXHRcdHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VJTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWludF9jb252ID0gZG9fcHJvY191aW50X2NvbnYgfSk7XG4rXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIGRvX3Byb2NfdWludF9jb252KTtcbiB9XG4gXG4gLyoqXG5AQCAtODY0LDggKzkzMyw4IEBAIGludCBwcm9jX2RvdWludHZlYyhjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIGludCBwcm9jX2RvaW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0ICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udl9taW5tYXggfSk7XG4gfVxuIFxuIC8qKlxuQEAgLTg5MSw4ICs5NjAsOCBAQCBpbnQgcHJvY19kb2ludHZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4gaW50IHByb2NfZG91aW50dmVjX21pbm1heChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0XHQgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpXG4ge1xuLVx0cmV0dXJuIGRvX3Byb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51aW50X2NvbnYgPSBkb19wcm9jX3VpbnRfY29udl9taW5tYXggfSk7XG4rXHRyZXR1cm4gcHJvY19kb3VpbnR2ZWNfY29udih0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsXG4rXHRcdFx0XHQgICBkb19wcm9jX3VpbnRfY29udl9taW5tYXgpO1xuIH1cbiBcbiAvKipcbkBAIC05MzUsOCArMTAwNCw3IEBAIGludCBwcm9jX2RvdTh2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuIFx0XHR0bXAuZXh0cmEyID0gKHVuc2lnbmVkIGludCAqKSBcdTAwMjZtYXg7XG4gXG4gXHR2YWwgPSBSRUFEX09OQ0UoKmRhdGEpO1xuLVx0cmVzID0gZG9fcHJvY192ZWMoXHUwMDI2dG1wLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcbi1cdFx0XHQgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGRvX3Byb2NfdWludF9jb252X21pbm1heCB9KTtcbitcdHJlcyA9IHByb2NfZG91aW50dmVjX21pbm1heChcdTAwMjZ0bXAsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zKTtcbiBcdGlmIChyZXMpXG4gXHRcdHJldHVybiByZXM7XG4gXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihkaXIpKVxuQEAgLTEwNjYsOCArMTEzNCw4IEBAIGludCBwcm9jX2RvdWxvbmd2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpcixcbiBcdFx0XHRcdGludCAoKmNvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLFxuIFx0XHRcdFx0XHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpKVxuIHtcbi1cdHJldHVybiBkb19wcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX1VMT05HLFxuLVx0XHRcdCAgICh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVsb25nX2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4rXHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGNvbnYgfSk7XG4gfVxuIFxuIC8qKlxuQEAgLTEwODcsMTAgKzExNTUsMTAgQEAgaW50IHByb2NfZG91bG9uZ3ZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxuICAqIFJldHVybnM6ICUwIG9uIHN1Y2Nlc3MuXG4gICovXG4gaW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXG4tXHRcdFx0ICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbitcdFx0dm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19VTE9ORyxcbi1cdFx0XHQgICAodW5pb24gcHJvY192ZWNfY29udil7IC51bG9uZ19jb252ID0gZG9fcHJvY191bG9uZ19jb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUxPTkcsXG4rXHRcdFx0KHVuaW9uIHByb2NfdmVjX2NvbnYpeyAudWxvbmdfY29udiA9IGRvX3Byb2NfdWxvbmdfY29udiB9KTtcbiB9XG4gXG4gLyoqXG5AQCAtMTExNCw4ICsxMTgyLDggQEAgaW50IHByb2NfZG9pbnR2ZWNfY29udihjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IGRpciwgdm9pZCAqYnVmZmVyLFxuIHtcbiBcdGlmICghY29udilcbiBcdFx0Y29udiA9IGRvX3Byb2NfaW50X2NvbnY7XG4tXHRyZXR1cm4gZG9fcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXG4tXHRcdFx0ICAgKHVuaW9uIHByb2NfdmVjX2NvbnYpeyAuaW50X2NvbnYgPSBjb252IH0pO1xuK1x0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxuK1x0XHRcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gY29udiB9KTtcbiB9XG4gXG4gLyoqXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL3N5c2N0bC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9zeXNjdGwuc2hcbmluZGV4IGIyZDhiZDkwMjZhNzIuLmZkZjNkMmZiMGEyYWQgMTAwNzU1XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvc3lzY3RsLnNoXG5AQCAtNCw2ICs0LDcgQEBcbiBcbiAjIFRoaXMgcGVyZm9ybXMgYSBzZXJpZXMgdGVzdHMgYWdhaW5zdCB0aGUgcHJvYyBzeXNjdGwgaW50ZXJmYWNlLlxuIFxuKyMgc2hlbGxjaGVjayBkaXNhYmxlPVNDMjMxN1xuICMgS3NlbGZ0ZXN0IGZyYW1ld29yayByZXF1aXJlbWVudCAtIFNLSVAgY29kZSBpcyA0LlxuIGtzZnRfc2tpcD00XG4gXG5AQCAtMzcsNiArMzgsNyBAQCBBTExfVEVTVFM9XCIkQUxMX1RFU1RTIDAwMDk6MToxOnVucmVnaXN0ZXJfZXJyb3I6MFwiXG4gQUxMX1RFU1RTPVwiJEFMTF9URVNUUyAwMDEwOjE6MTptbnQvbW50X2Vycm9yOjBcIlxuIEFMTF9URVNUUz1cIiRBTExfVEVTVFMgMDAxMToxOjE6ZW1wdHlfYWRkOjBcIlxuIEFMTF9URVNUUz1cIiRBTExfVEVTVFMgMDAxMjoxOjE6dThfdmFsaWQ6MFwiXG4rQUxMX1RFU1RTPVwiJEFMTF9URVNUUyAwMDEzOjE6MTppbnRfMDAwMzoxXCJcbiBcbiBmdW5jdGlvbiBhbGxvd191c2VyX2RlZmF1bHRzKClcbiB7XG5AQCAtMTk2LDYgKzE5OCwxOCBAQCB2ZXJpZnlfZGlmZl93KClcbiBcdHJldHVybiAkP1xuIH1cbiBcbisjIFZlcmlmeSB0aGF0IGFuIGVycm9uZW91cyAoJDIpIHVwZGF0ZSBmYWlscyBhbmQgZG9lcyBub3QgY2hhbmdlIFRBUkdFVFxuK3ZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSgpXG4re1xuK1x0VEVTVF9TVFI9XCIkMVwiXG4rXHRlY2hvIC1uIFwiJFRFU1RfU1RSXCIgXHUwMDNlIFwiJFRBUkdFVFwiXG4rXG4rXHRpZiBlY2hvIC1uIFwiJDJcIiBcdTAwM2UgXCIkVEFSR0VUXCIgMlx1MDAzZSAvZGV2L251bGw7IHRoZW5cbitcdFx0cmV0dXJuIDFcbitcdGZpXG4rXHR2ZXJpZnlfZGlmZl93IFwiJHtUQVJHRVR9XCJcbit9XG4rXG4gdGVzdF9yYygpXG4ge1xuIFx0aWYgW1sgJHJjICE9IDAgXV07IHRoZW5cbkBAIC01MDEsNiArNTE1LDQwIEBAIHJ1bl9saW1pdF9kaWdpdF9pbnRfYXJyYXkoKVxuIFx0dGVzdF9yY1xuIH1cbiBcbisjIFlvdSB1c2VkIGFuIGludCBhcnJheSBhbmQgb25lIG9mIHRoZSBlbGVtZW50cyBpcyBub3QgYWNjZXB0YWJsZVxuK3J1bl9pbnRfYXJyYXlfbm9fcGFydGlhbF91cGRhdGUoKVxuK3tcbitcdGVjaG8gLW4gXCJUZXN0aW5nIGludmFsaWQgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCBwYXJ0aWFsbHkgdXBkYXRlIC4uLiBcIlxuKyAgICAgICAgIyBFeHBlY3QgZmFpbHVyZSBiZWNhdXNlIG9mIDNyZCBlbGVtZW50IChhYmMpLlxuK1x0aWYgISB2ZXJpZnlfbm9fcGFydGlhbF91cGRhdGUgXCIxIDIgMyA0XCIgXCIxMCAyMCBhYmMgNDBcIjsgdGhlblxuK1x0XHRlY2hvIFwiRkFJTFwiIFx1MDAzZVx1MDAyNjJcbitcdFx0cmM9MVxuK1x0ZWxzZVxuK1x0XHRlY2hvIFwiT0tcIlxuK1x0ZmlcbitcdHRlc3RfcmNcbitcbitcdGVjaG8gLW4gXCJUZXN0aW5nIG91dCBvZiByYW5nZSBhcnJheSBlbGVtZW50IGRvZXMgbm90IHBhcnRpYWxseSB1cGRhdGUgLi4uIFwiXG4rICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIGJlY2F1c2Ugb2YgM3JkIGVsZW1lbnQgKGdyZWF0ZXIgdGhhbiBpbnQpXG4rXHRpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSBcIjEgMiAzIDRcIiBcIjEwIDIwICQoKElOVF9NQVggKyAxKSkgNDBcIjsgdGhlblxuK1x0XHRlY2hvIFwiRkFJTFwiIFx1MDAzZVx1MDAyNjJcbitcdFx0cmM9MVxuK1x0ZWxzZVxuK1x0XHRlY2hvIFwiT0tcIlxuK1x0ZmlcbitcdHRlc3RfcmNcbitcbitcdGVjaG8gLW4gXCJUZXN0aW5nIGludmFsaWQgZmlyc3QgYXJyYXkgZWxlbWVudCBkb2VzIG5vdCB1cGRhdGUgLi4uIFwiXG4rICAgICAgICAjIEV4cGVjdCBmYWlsdXJlIG9mIDFzdCBlbGVtZW50XG4rXHRpZiAhIHZlcmlmeV9ub19wYXJ0aWFsX3VwZGF0ZSBcIjEgMiAzIDRcIiBcImFiYyAyMCAzMCA0MFwiOyB0aGVuXG4rXHRcdGVjaG8gXCJGQUlMXCIgXHUwMDNlXHUwMDI2MlxuK1x0XHRyYz0xXG4rXHRlbHNlXG4rXHRcdGVjaG8gXCJPS1wiXG4rXHRmaVxuK1x0dGVzdF9yY1xuK31cbitcbiAjIFlvdSBhcmUgdXNpbmcgYW4gdW5zaWduZWQgaW50XG4gcnVuX2xpbWl0X2RpZ2l0X3VpbnQoKVxuIHtcbkBAIC04ODAsNiArOTI4LDE0IEBAIHN5c2N0bF90ZXN0XzAwMTIoKVxuIFx0cmV0dXJuIDBcbiB9XG4gXG4rc3lzY3RsX3Rlc3RfMDAxMygpXG4re1xuK1x0VEFSR0VUPVwiJHtTWVNDVEx9LyQoZ2V0X3Rlc3RfdGFyZ2V0IDAwMTMpXCJcbitcdHJlc2V0X3ZhbHNcbitcbitcdHJ1bl9pbnRfYXJyYXlfbm9fcGFydGlhbF91cGRhdGVcbit9XG4rXG4gbGlzdF90ZXN0cygpXG4ge1xuIFx0ZWNobyBcIlRlc3QgSUQgbGlzdDpcIlxuQEAgLTkwMCw2ICs5NTYsNyBAQCBsaXN0X3Rlc3RzKClcbiBcdGVjaG8gXCIwMDEwIHggJChnZXRfdGVzdF9jb3VudCAwMDEwKSAtIHRlc3RzIHN5c2N0IG1vdW50IHBvaW50XCJcbiBcdGVjaG8gXCIwMDExIHggJChnZXRfdGVzdF9jb3VudCAwMDExKSAtIHRlc3RzIGVtcHR5IGRpcmVjdG9yaWVzXCJcbiBcdGVjaG8gXCIwMDEyIHggJChnZXRfdGVzdF9jb3VudCAwMDEyKSAtIHRlc3RzIHJhbmdlIGNoZWNrIGZvciB1OCBwcm9jX2hhbmRsZXJcIlxuK1x0ZWNobyBcIjAwMTMgeCAkKGdldF90ZXN0X2NvdW50IDAwMTMpIC0gdGVzdHMgcGFydGlhbGx5IHVwZGF0ZSB2ZWN0b3JzIG9uIGVycm9yXCJcbiB9XG4gXG4gdXNhZ2UoKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDM6MzEuNzg1NTk1MTAyWiIsIlNlcSI6MTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3NDQ2MTI3Mjc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgU3lzY3RsIEFycmF5IFVwZGF0ZSBQYXRjaCBmb3IgUG90ZW50aWFsIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IElzc3VlcyoqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiB0aGUgc3lzY3RsIHZlY3RvciB1cGRhdGUgbWVjaGFuaXNtIGluIGBrZXJuZWwvc3lzY3RsLmNgLiBUaGUgY29yZSBjaGFuZ2UgaXMgcmVwbGFjaW5nIGBkb19wcm9jX3ZlY2Agd2l0aCBhIG1vcmUgcm9idXN0IHByb2Nlc3MgaW52b2x2aW5nIGBwcm9jX3ZlY2AsIGBhcHBseV9jb252X29uX3ZlY2AsIGFuZCBgY29tbWl0X2NvbnZfdmVjYC4gVGhlIHN0YXRlZCBnb2FsLCBhcyBJIHVuZGVyc3RhbmQgaXQsIGlzIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIHRvIHN5c2N0bCBhcnJheXMgd2hlbiBlcnJvcnMgb2NjdXIgZHVyaW5nIHVzZXIgaW5wdXQgcGFyc2luZy4gSW5zdGVhZCBvZiB0aGUgb2xkIGVsZW1lbnQtYnktZWxlbWVudCB1cGRhdGUtYW5kLWFib3J0IG1ldGhvZCwgdGhpcyBuZXcgYXBwcm9hY2ggdXNlcyBhIHRlbXBvcmFyeSBidWZmZXIgKGBkYXRhX3N0YWdlYCkgdG8gc3RhZ2UgdGhlIGNoYW5nZXMuIFRoaXMgdGVtcG9yYXJ5IGJ1ZmZlciBpcyBwb3B1bGF0ZWQgdXNpbmcgYGttZW1kdXBgIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXNjdGwgYXJyYXkgKGB0YWJsZS1cdTAwM2VkYXRhYCksIHRoZW4gYXBwbHkgYW55IHVzZXItcHJvdmlkZWQgY29udmVyc2lvbnMuIE9ubHkgaWYgYWxsIGNvbnZlcnNpb25zIGFyZSBzdWNjZXNzZnVsIGRvZXMgYGNvbW1pdF9jb252X3ZlY2AgY29tZSBpbnRvIHBsYXksIHdyaXRpbmcgdGhlIGNoYW5nZXMgZnJvbSBgZGF0YV9zdGFnZWAgdG8gdGhlIGFjdHVhbCBhcnJheS5cblxuTXkgaW1tZWRpYXRlIGNvbmNlcm4sIGFzIGEgc2Vhc29uZWQga2VybmVsIGRldmVsb3BlciwgaXMgdG8gY2hlY2sgdGhpcyBjYXJlZnVsbHkgZm9yIHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMuIExldCdzIGRpZyBpbnRvIHRoZSBkZXRhaWxzLiBTcGVjaWZpY2FsbHksIHdpdGhpbiBgYXBwbHlfY29udl9vbl92ZWNgLCBgZGF0YV9zdGFnZWAgaXMgYWxsb2NhdGVkIHdpdGggYGttZW1kdXAodGFibGUtXHUwMDNlZGF0YSwgdGFibGUtXHUwMDNlbWF4bGVuLCBHRlBfS0VSTkVMKWAuIFRoaXMgbG9va3MgcHJvbWlzaW5nOiBpdCBjbG9uZXMgdGhlIHdob2xlIHRoaW5nLlxuXG5UaGVuLCB0aGUgY29kZSBpdGVyYXRlcyB0byBwcm9jZXNzIHVzZXIgaW5wdXQgYW5kIHVwZGF0ZXMgdGhlIGBkYXRhYCBwb2ludGVyICh3aGljaCBwb2ludHMgZWl0aGVyIHRvIHRoZSBvcmlnaW5hbCBgdGFibGUtXHUwMDNlZGF0YWAgb3IgdG8gYGRhdGFfc3RhZ2VgIGRlcGVuZGluZyBvbiB0aGUgb3JpZ2luYWwgYXJyYXkncyBzaXplKS4gVGhlIGxvb3AgdXRpbGl6ZXMgYHByb2NfdmVjX2NvbnZgLCB3aG9zZSBmdW5jdGlvbiBjYWxsIGRlcGVuZHMgb24gdGhlIGRpcmVjdGlvbiBvZiBjb252ZXJzaW9uIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyB1c2VyIGlucHV0IGFuZCB1cGRhdGluZyBgZGF0YWAuXG5cbkNyaXRpY2FsbHksIGlmIGV2ZXJ5dGhpbmcgZ29lcyB3ZWxsLCB0aGUgYGNvbW1pdF9jb252X3ZlY2AgZnVuY3Rpb24gaXMgY2FsbGVkLiBUaGlzIGNvcGllcyBgbnJfY29udmAgZWxlbWVudHMgZnJvbSBgZGF0YV9zdGFnZWAgKmJhY2sqIHRvIGB0YWJsZS1cdTAwM2VkYXRhYC4gSSBub3RlIHRoYXQgYGNvbW1pdF9jb252X3ZlY2AgdXNlcyBgV1JJVEVfT05DRWAgd2hpY2ggaXMgZ29vZCBwcmFjdGljZS5cblxuTm93LCBteSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBga21lbWR1cGAgaXMgdGhlIGtleS4gSXQgY29waWVzIGB0YWJsZS1cdTAwM2VtYXhsZW5gIGJ5dGVzLiBJZiBgdGFibGUtXHUwMDNlZGF0YWAgKmhhcyogdW5pbml0aWFsaXplZCBieXRlcyBhcyBwYXJ0IG9mIHBhZGRpbmcgb3IgbWVtYmVycyBvZiBsYXJnZXIgc3RydWN0cywgdGhvc2UgdW5pbml0aWFsaXplZCB2YWx1ZXMgKmFyZSogY29waWVkIGludG8gYGRhdGFfc3RhZ2VgLiBBbmQgaGVyZSBpcyB3aGVyZSBJIHNlZSB0aGUgcG90ZW50aWFsIGZvciBhIHByb2JsZW0sIGJ1dCBpdCdzIG5vdCBhY3R1YWxseSB0aGVyZS4gVGhlIGNvbW1pdCBmdW5jdGlvbiB3aWxsIG5vdCB3cml0ZSB0aGUgZnVsbCBgZGF0YV9zdGFnZWAgYnVmZmVyIGJhY2ssIGJ1dCBvbmx5IHVwIHRvIHRoZSBhbW91bnQgd2hpY2ggaGFzIGJlZW4gY29udmVydGVkLiBTbywgdGhlIHVuaW5pdGlhbGl6ZWQgcGFydCBkb2VzIG5vdCBnZXQgd3JpdHRlbiBiYWNrLlxuXG5CdXQgdGhlIHJlYWwgcXVlc3Rpb24gaXMgd2hldGhlciBpdCAqcmVhZHMqIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkuIEluIHRoZSBrZXJuZWwtdG8tdXNlciBkaXJlY3Rpb24gKGBTWVNDVExfS0VSTl9UT19VU0VSYCksIHRoZSBjb2RlIGp1c3QgcmVhZHMgZnJvbSBgdGFibGUtXHUwMDNlZGF0YWAgYW5kIGZvcm1hdHMgaXQuIEkgc2VlIG5vIGlzc3VlcyBoZXJlLlxuXG5JbiB0aGUgdXNlci10by1rZXJuZWwgZGlyZWN0aW9uIChgU1lTQ1RMX1VTRVJfVE9fS0VSTmApLCB3ZSBoYXZlIHRoZSBgcHJvY192ZWNfY29udmAgYmVpbmcgY2FsbGVkLiBJdCBjYW4gKndyaXRlKiB0byBgZGF0YWAsIGJ1dCBkb2VzIGl0ICpyZWFkKiBmcm9tIGBkYXRhYCBpbiBhIHdheSB0aGF0IGludHJvZHVjZXMgcHJvYmxlbXM/IEkgbmVlZCB0byBjaGVjayB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBgcHJvY192ZWNfY29udmAgZnVuY3Rpb25zIGxpa2UgYGRvX3Byb2NfaW50X2NvbnZgIG9yIHdoYXRldmVyLiBCdXQgZnJvbSB3aGF0IEkgc2VlIGhlcmUsIGl0IGxvb2tzIGxpa2UgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NjIyLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQ0MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA0OjE5LjIzMTcyNDM1OVoiLCJTZXEiOjE2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEwODI0MDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImRvX3Byb2NfaW50X2NvbnZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL3N5c2N0bC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9zeXNjdGwuYz01NzM9c3RhdGljIGludCBzeXNjdGxfa2Vybl90b191c2VyX2ludF9jb252KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgY29uc3QgaW50ICprX3B0cilcXG4tLVxcbmtlcm5lbC9zeXNjdGwuYy01NzctXFxua2VybmVsL3N5c2N0bC5jOjU3ODpzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxua2VybmVsL3N5c2N0bC5jLTU3OS1cXHRcXHRcXHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGJsKVxcbi0tXFxua2VybmVsL3N5c2N0bC5jLTU4Ni1cXG5rZXJuZWwvc3lzY3RsLmM6NTg3OnN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxua2VybmVsL3N5c2N0bC5jLTU4OC1cXHRcXHRcXHRcXHQgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwpXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmM9ODkwPWludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtODkzLVxcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcXG5rZXJuZWwvc3lzY3RsLmM6ODk0OlxcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcXG5rZXJuZWwvc3lzY3RsLmMtODk1LX1cXG4tLVxcbmtlcm5lbC9zeXNjdGwuYz05MzM9aW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbi0tXFxua2VybmVsL3N5c2N0bC5jLTkzNi1cXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXFxua2VybmVsL3N5c2N0bC5jOjkzNzpcXHRcXHRcXHQodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xcbmtlcm5lbC9zeXNjdGwuYy05MzgtfVxcbi0tXFxua2VybmVsL3N5c2N0bC5jPTExNTc9aW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtMTE3MC0gKiBAcHBvczogZmlsZSBwb3NpdGlvblxcbmtlcm5lbC9zeXNjdGwuYzoxMTcxOiAqIEBjb252OiBDdXN0b20gY29udmVydGVyIGNhbGwgYmFjay4gRGVmYXVsdHMgdG8gZG9fcHJvY19pbnRfY29udlxcbmtlcm5lbC9zeXNjdGwuYy0xMTcyLSAqXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmM9MTE3OD1pbnQgcHJvY19kb2ludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtMTE4My1cXHRpZiAoIWNvbnYpXFxua2VybmVsL3N5c2N0bC5jOjExODQ6XFx0XFx0Y29udiA9IGRvX3Byb2NfaW50X2NvbnY7XFxua2VybmVsL3N5c2N0bC5jLTExODUtXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDoxOS4zNDI1NTI3MDhaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDA5NDQ3ODE1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgSW50ZWdlciBDb252ZXJzaW9uIFByb2NlZHVyZSoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIGBkb19wcm9jX2ludF9jb252YCBpbXBsZW1lbnRhdGlvbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3Mgb2YgaG93IHdlJ3JlIGhhbmRsaW5nIGludGVnZXIgY29udmVyc2lvbnMgYXQgdGhlIHByb2NlZHVyYWwgbGV2ZWwuIEkgd2FudCB0byBtYWtlIHN1cmUgdGhlIGxvZ2ljIGlzIHNvdW5kLCBlc3BlY2lhbGx5IGFyb3VuZCBlZGdlIGNhc2VzIGFuZCBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MuIEknbGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHR5cGVzIGludm9sdmVkLCB0aGUgYml0LXNoaWZ0aW5nIGFuZCBtYXNraW5nIG9wZXJhdGlvbnMsIGFuZCBob3cgd2UncmUgaGFuZGxpbmcgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyBzY2VuYXJpb3MuIFRoZSBnb2FsIGlzIHRvIHZlcmlmeSB0aGF0IGl0J3Mgcm9idXN0LCBlZmZpY2llbnQsIGFuZCBhbGlnbmVkIHdpdGggdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3IgYW5kIGFyY2hpdGVjdHVyYWwgY29uc3RyYWludHMgb2YgdGhlIHRhcmdldCBwbGF0Zm9ybS4gSSdtIGxvb2tpbmcgZm9yIGFueXRoaW5nIHRoYXQgbWlnaHQgbGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMgb3IgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcy4gTGV0J3Mgc2VlIHdoYXQgd2UndmUgZ290LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDUwMCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA0OjIzLjQzNzAzMzM3NVoiLCJTZXEiOjE4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDEwMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3N5c2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU3OCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDU3ODpcXHRzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxuIDU3OTpcXHRcXHRcXHRcXHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGJsKVxcbiA1ODA6XFx0e1xcbiA1ODE6XFx0XFx0cmV0dXJuIHByb2NfaW50X2NvbnYobmVncCwgdV9wdHIsIGtfcHRyLCBkaXIsIHRibCwgZmFsc2UsXFxuIDU4MjpcXHRcXHRcXHRcXHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXFxuIDU4MzpcXHRcXHRcXHRcXHQgICAgIHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYpO1xcbiA1ODQ6XFx0XFxuIDU4NTpcXHR9XFxuIDU4NjpcXHRcXG4gNTg3OlxcdHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udl9taW5tYXgoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxuIDU4ODpcXHRcXHRcXHRcXHRcXHQgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwpXFxuIDU4OTpcXHR7XFxuIDU5MDpcXHRcXHRyZXR1cm4gcHJvY19pbnRfY29udihuZWdwLCB1X3B0ciwga19wdHIsIGRpciwgdGJsLCB0cnVlLFxcbiA1OTE6XFx0XFx0XFx0XFx0ICAgICBzeXNjdGxfdXNlcl90b19rZXJuX2ludF9jb252LFxcbiA1OTI6XFx0XFx0XFx0XFx0ICAgICBzeXNjdGxfa2Vybl90b191c2VyX2ludF9jb252KTtcXG4gNTkzOlxcdH1cXG4gNTk0OlxcdFxcbiA1OTU6XFx0c3RhdGljIGNvbnN0IGNoYXIgcHJvY193c3BhY2Vfc2VwW10gPSB7ICcgJywgJ1xcXFx0JywgJ1xcXFxuJyB9O1xcbiA1OTY6XFx0XFxuIDU5NzpcXHQvKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDoyMy40MzcxMzYzNjVaIiwiU2VxIjoxOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI5OTY3NzM1NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEaXZpbmcgaW50byBgcHJvY19pbnRfY29udmAqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGRpZyBpbnRvIHRoaXMgYHByb2NfaW50X2NvbnZgIHJvdXRpbmUuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBhbmQgc2VlIHdoYXTigJlzIGdvaW5nIG9uIHVuZGVyIHRoZSBob29kIHRoZXJlLiBJJ20gYXNzdW1pbmcgaXQgaGFuZGxlcyBpbnRlZ2VyIGNvbnZlcnNpb25zIHdpdGhpbiB0aGUgc3lzdGVtLCBidXQgSSBuZWVkIHRvIHF1aWNrbHkgY29uZmlybSB0aGF0IGFzc3VtcHRpb24gYW5kIHVuZGVyc3RhbmQgaXRzIHNwZWNpZmljIHJvbGUuIElzIGl0IGEgZ2VuZXJhbC1wdXJwb3NlIGNvbnZlcnRlciwgb3Igc29tZXRoaW5nIG9wdGltaXplZCBmb3IgYSBwYXJ0aWN1bGFyIGRhdGEgdHlwZSBvciB1c2UgY2FzZT8gSSdtIGN1cmlvdXMgYWJvdXQgdGhlIGludGVuZGVkIGRlc2lnbiBhbmQgY29uc3RyYWludHMuIFdoYXQgYXJlIHRoZSBpbnB1dCB0eXBlcyBpdCBhY2NlcHRzLCBhbmQgd2hhdCBhcmUgdGhlIG91dHB1dCB0eXBlcyBpdCBwcm9kdWNlcz8gTGV0J3MgdHJhY2UgaXQgdGhyb3VnaCB0aGUgY29kZS4gSSdsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBwb3RlbnRpYWwgZWRnZSBjYXNlcyBhbmQgZXJyb3IgaGFuZGxpbmcuIEFyZSB0aGVyZSBhbnkga25vd24gdnVsbmVyYWJpbGl0aWVzPyBJIHdhbnQgdG8gc2VlIGlmIHRoaXMgY29kZSBpcyBzYWZlIGZvciB1c2UgdW5kZXIgYW55IGNpcmN1bXN0YW5jZS4gSSBuZWVkIHRvIHF1aWNrbHkgYXNzZXNzIGl0cyBvdmVyYWxsIGVmZmljaWVuY3kuIEknbGwgYmUgbG9va2luZyBmb3IgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyB3aGVyZSBwZXJmb3JtYW5jZSBjb3VsZCBiZSBpbXByb3ZlZC4gSSBhbHNvIHdhbnQgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIHVzZWQgd2l0aGluIHRoZSBsYXJnZXIgY29kZWJhc2UuIEFyZSB0aGVyZSBhbnkgZGVwZW5kZW5jaWVzPyBIb3cgaXMgaXQgaW50ZWdyYXRlZCBpbnRvIHRoZSBvdmVyYWxsIGFyY2hpdGVjdHVyZT8gVGhpcyB3aWxsIGluZm9ybSBob3cgaXQgbWlnaHQgYmUgYWZmZWN0ZWQgYnkgZnV0dXJlIGNoYW5nZXMgb3Igb3B0aW1pemF0aW9ucy4gRXNzZW50aWFsbHksIEknbSBmb3JtaW5nIGEgbWVudGFsIG1vZGVsIG9mIGl0cyBiZWhhdmlvciwgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzLCBhbmQgcG90ZW50aWFsIGltcGFjdCBvbiB0aGUgc3lzdGVtLiBUaW1lIHRvIGdldCB0byB3b3JrLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTA5MiwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDQ6MjcuNzM2ODE2MjlaIiwiU2VxIjoyMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzOTQ5MTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInByb2NfaW50X2NvbnZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL3N5c2N0bC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9zeXNjdGwuYz01MDY9aW50IHByb2NfaW50X3Uya19jb252X3VvcChjb25zdCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIsIGNvbnN0IGJvb2wgKm5lZ3AsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtNTIzLS8qKlxcbmtlcm5lbC9zeXNjdGwuYzo1MjQ6ICogcHJvY19pbnRfY29udiAtIENoYW5nZSB1c2VyIG9yIGtlcm5lbCBwb2ludGVyIGJhc2VkIG9uIGRpcmVjdGlvblxcbmtlcm5lbC9zeXNjdGwuYy01MjUtICpcXG4tLVxcbmtlcm5lbC9zeXNjdGwuYy01MzktICovXFxua2VybmVsL3N5c2N0bC5jOjU0MDppbnQgcHJvY19pbnRfY29udihib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIsIGludCBkaXIsXFxua2VybmVsL3N5c2N0bC5jLTU0MS1cXHRcXHQgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibCwgYm9vbCBrX3B0cl9yYW5nZV9jaGVjayxcXG4tLVxcbmtlcm5lbC9zeXNjdGwuYz01NzM9c3RhdGljIGludCBzeXNjdGxfa2Vybl90b191c2VyX2ludF9jb252KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgY29uc3QgaW50ICprX3B0cilcXG4tLVxcbmtlcm5lbC9zeXNjdGwuYy01NzctXFxua2VybmVsL3N5c2N0bC5jOjU3ODpzdGF0aWMgaW50IGRvX3Byb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqdV9wdHIsIGludCAqa19wdHIsXFxua2VybmVsL3N5c2N0bC5jLTU3OS1cXHRcXHRcXHQgICAgaW50IGRpciwgY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGJsKVxcbmtlcm5lbC9zeXNjdGwuYy01ODAte1xcbmtlcm5lbC9zeXNjdGwuYzo1ODE6XFx0cmV0dXJuIHByb2NfaW50X2NvbnYobmVncCwgdV9wdHIsIGtfcHRyLCBkaXIsIHRibCwgZmFsc2UsXFxua2VybmVsL3N5c2N0bC5jLTU4Mi1cXHRcXHRcXHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtNTg2LVxcbmtlcm5lbC9zeXNjdGwuYzo1ODc6c3RhdGljIGludCBkb19wcm9jX2ludF9jb252X21pbm1heChib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcXG5rZXJuZWwvc3lzY3RsLmMtNTg4LVxcdFxcdFxcdFxcdCAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibClcXG5rZXJuZWwvc3lzY3RsLmMtNTg5LXtcXG5rZXJuZWwvc3lzY3RsLmM6NTkwOlxcdHJldHVybiBwcm9jX2ludF9jb252KG5lZ3AsIHVfcHRyLCBrX3B0ciwgZGlyLCB0YmwsIHRydWUsXFxua2VybmVsL3N5c2N0bC5jLTU5MS1cXHRcXHRcXHQgICAgIHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmM9ODkwPWludCBwcm9jX2RvaW50dmVjKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtODkzLVxcdHJldHVybiBwcm9jX3ZlYyh0YWJsZSwgZGlyLCBidWZmZXIsIGxlbnAsIHBwb3MsIFBST0NfVkVDX0lOVCxcXG5rZXJuZWwvc3lzY3RsLmM6ODk0OlxcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLmludF9jb252ID0gZG9fcHJvY19pbnRfY29udiB9KTtcXG5rZXJuZWwvc3lzY3RsLmMtODk1LX1cXG4tLVxcbmtlcm5lbC9zeXNjdGwuYz05MzM9aW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLFxcbi0tXFxua2VybmVsL3N5c2N0bC5jLTkzNi1cXHRyZXR1cm4gcHJvY192ZWModGFibGUsIGRpciwgYnVmZmVyLCBsZW5wLCBwcG9zLCBQUk9DX1ZFQ19JTlQsXFxua2VybmVsL3N5c2N0bC5jOjkzNzpcXHRcXHRcXHQodW5pb24gcHJvY192ZWNfY29udil7IC5pbnRfY29udiA9IGRvX3Byb2NfaW50X2NvbnZfbWlubWF4IH0pO1xcbmtlcm5lbC9zeXNjdGwuYy05MzgtfVxcbi0tXFxua2VybmVsL3N5c2N0bC5jPTExNTc9aW50IHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCBkaXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtMTE3MC0gKiBAcHBvczogZmlsZSBwb3NpdGlvblxcbmtlcm5lbC9zeXNjdGwuYzoxMTcxOiAqIEBjb252OiBDdXN0b20gY29udmVydGVyIGNhbGwgYmFjay4gRGVmYXVsdHMgdG8gZG9fcHJvY19pbnRfY29udlxcbmtlcm5lbC9zeXNjdGwuYy0xMTcyLSAqXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmM9MTE3OD1pbnQgcHJvY19kb2ludHZlY19jb252KGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgZGlyLCB2b2lkICpidWZmZXIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtMTE4My1cXHRpZiAoIWNvbnYpXFxua2VybmVsL3N5c2N0bC5jOjExODQ6XFx0XFx0Y29udiA9IGRvX3Byb2NfaW50X2NvbnY7XFxua2VybmVsL3N5c2N0bC5jLTExODUtXFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfSU5ULFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDoyNy44MzA3NzEwOTlaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDEyOTM3NTMzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBhc3N1bWluZyBJJ20gZGVlcGx5IGZhbWlsaWFyIHdpdGggY29kZSBhbmQgcHJvY2Vzc2VzOlxuXG4qKkRlbHZpbmcgaW50byBgcHJvY19pbnRfY29udmAqKlxuXG5BbHJpZ2h0LCBJJ20gdGhpbmtpbmcsIFwiVGltZSB0byBkaXZlIGludG8gYHByb2NfaW50X2NvbnZgLlwiIFRoYXQgbmFtZSBhbG9uZSBnaXZlcyBtZSBhIHByZXR0eSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJIGNhbiBpbnN0YW50bHkgYXNzdW1lIGl0J3MgcmVsYXRlZCB0byBzb21lIHByb2Nlc3Mgb3IgcHJvY2VkdXJlIGludm9sdmluZyB0aGUgY29udmVyc2lvbiBvZiBpbnRlZ2VyIHZhbHVlcy4gRGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IG9mIHRoZSBzeXN0ZW0sIHRoaXMgY291bGQgYmUgYSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9jayBvciBhIG1vcmUgc3BlY2lhbGl6ZWQgZnVuY3Rpb24uIE15IGluaXRpYWwgZ29hbCBpcyB1bmRlcnN0YW5kaW5nIHRoZSBjb252ZXJzaW9uIG1ldGhvZC4gUGVyaGFwcyB0aGVyZSBpcyBzb21lIGludGVnZXIgc2NhbGluZyBvciBjb252ZXJzaW9uIGJldHdlZW4gc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VycyBoYXBwZW5pbmcuIFRoZSBkZWVwZXIgZ29hbCBpcyB0byBjaGVjayBmb3IgYW55IHBvdGVudGlhbCBlZGdlIGNhc2VzIG9yIG92ZXJmbG93cy4gR2l2ZW4gdGhlIG5hdHVyZSBvZiBpbnRlZ2VyIGFyaXRobWV0aWMsIHRoZXJlIG1pZ2h0IGJlIGEgbmVlZCBmb3IgZXJyb3IgaGFuZGxpbmcuIExldCdzIHNlZSB3aGF0J3MgaW5zaWRlLiBJJ20gZm9jdXNpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgbm93OiB0aGUgc3BlY2lmaWNzIG9mIHRoZSBhbGdvcml0aG0sIHRoZSBkYXRhIHR5cGVzIGludm9sdmVkLCBhbmQgYW55IHBvdGVudGlhbCBzaWRlIGVmZmVjdHMuIEknbGwgYmUgbG9va2luZyBhdCB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLCBsb2NhbCB2YXJpYWJsZXMsIGFuZCByZXR1cm4gdmFsdWUgdG8gcGllY2UgdGhpcyBhbGwgdG9nZXRoZXIuIEknbSBnb2luZyB0byBkZXRlcm1pbmUgaXRzIHJvbGUgd2l0aGluIHRoZSBzeXN0ZW0gYW5kIGFueSBwb3RlbnRpYWwgcG9pbnRzIG9mIGludGVncmF0aW9uLiBJcyBpdCBvcHRpbWl6ZWQgZm9yIHNwZWVkLCBvciBpcyBpdCBwcmlvcml0aXppbmcgY2xhcml0eT8gQW5kIG1vc3QgaW1wb3J0YW50bHksIGlzIGl0IHJvYnVzdD8gSXMgdGhlcmUgYSBuZWVkIHRvIGRvY3VtZW50IHRoaXMsIG9yIGlzIHRoaXMganVzdCBzb21ldGhpbmcgSSB3YXMgYXNrZWQgdG8gZ2xhbmNlIGF0P1xuXG5cbiIsIklucHV0VG9rZW5zIjoxMjQ2MiwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA0OjMxLjk2MDE1MTA4NloiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzAyMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3N5c2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU0MCxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDU0MDpcXHRpbnQgcHJvY19pbnRfY29udihib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIsIGludCBkaXIsXFxuIDU0MTpcXHRcXHRcXHQgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRibCwgYm9vbCBrX3B0cl9yYW5nZV9jaGVjayxcXG4gNTQyOlxcdFxcdFxcdCAgaW50ICgqdXNlcl90b19rZXJuKShjb25zdCBib29sICpuZWdwLCBjb25zdCB1bG9uZyAqdV9wdHIsIGludCAqa19wdHIpLFxcbiA1NDM6XFx0XFx0XFx0ICBpbnQgKCprZXJuX3RvX3VzZXIpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgY29uc3QgaW50ICprX3B0cikpXFxuIDU0NDpcXHR7XFxuIDU0NTpcXHRcXHRpZiAoU1lTQ1RMX0tFUk5fVE9fVVNFUihkaXIpKVxcbiA1NDY6XFx0XFx0XFx0cmV0dXJuIGtlcm5fdG9fdXNlcihuZWdwLCB1X3B0ciwga19wdHIpO1xcbiA1NDc6XFx0XFxuIDU0ODpcXHRcXHRpZiAoa19wdHJfcmFuZ2VfY2hlY2spIHtcXG4gNTQ5OlxcdFxcdFxcdGludCB0bXBfaywgcmV0O1xcbiA1NTA6XFx0XFxuIDU1MTpcXHRcXHRcXHRpZiAoIXRibClcXG4gNTUyOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA1NTM6XFx0XFx0XFx0cmV0ID0gdXNlcl90b19rZXJuKG5lZ3AsIHVfcHRyLCBcXHUwMDI2dG1wX2spO1xcbiA1NTQ6XFx0XFx0XFx0aWYgKHJldClcXG4gNTU1OlxcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuIDU1NjpcXHRcXHRcXHRpZiAoKHRibC1cXHUwMDNlZXh0cmExIFxcdTAwMjZcXHUwMDI2ICooaW50ICopdGJsLVxcdTAwM2VleHRyYTEgXFx1MDAzZSB0bXBfaykgfHxcXG4gNTU3OlxcdFxcdFxcdCAgICAodGJsLVxcdTAwM2VleHRyYTIgXFx1MDAyNlxcdTAwMjYgKihpbnQgKil0YmwtXFx1MDAzZWV4dHJhMiBcXHUwMDNjIHRtcF9rKSlcXG4gNTU4OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA1NTk6XFx0XFx0XFx0V1JJVEVfT05DRSgqa19wdHIsIHRtcF9rKTtcXG4gNTYwOlxcdFxcdH0gZWxzZVxcbiA1NjE6XFx0XFx0XFx0cmV0dXJuIHVzZXJfdG9fa2VybihuZWdwLCB1X3B0ciwga19wdHIpO1xcbiA1NjI6XFx0XFx0cmV0dXJuIDA7XFxuIDU2MzpcXHR9XFxuIDU2NDpcXHRcXG4gNTY1OlxcdFxcbiA1NjY6XFx0XFxuIDU2NzpcXHRzdGF0aWMgaW50IHN5c2N0bF91c2VyX3RvX2tlcm5faW50X2NvbnYoY29uc3QgYm9vbCAqbmVncCwgY29uc3QgdWxvbmcgKnVfcHRyLFxcbiA1Njg6XFx0XFx0XFx0XFx0XFx0XFx0aW50ICprX3B0cilcXG4gNTY5OlxcdHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDQ6MzEuOTYwMzI0MTE2WiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE1ODA3ODk5NTc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgSW1wbGljYXRpb25zIG9mIHRoZSBgcHJvY19pbnRfY29udmAgTW9kaWZpY2F0aW9uKipcblxuT2theSwgc28gYHByb2NfaW50X2NvbnZgIHdyaXRlcyB0byBga19wdHJgLCBnb3QgaXQuIFRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gYmUgaGFwcGVuaW5nIHdpdGhpbiBgYXBwbHlfY29udl9vbl92ZWNgLiBgZGF0YWAsIHBhc3NlZCBhcyBga19wdHJgLCBpcyB0aGUga2V5IHZhcmlhYmxlIGhlcmUuIElmIGBTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKWAgaXMgdHJ1ZSwgYHByb2NfdmVjX2NvbnZgIGNhbGxzIGBjb252YCB3aGljaCBpbiB0dXJuIGNhbGxzIGBwcm9jX2ludF9jb252YCwgd3JpdGluZyB0byB0aGlzIGBrX3B0cmAsIHdoaWNoIGluIGVzc2VuY2UgaXMgcG9pbnRpbmcgdG8gZWl0aGVyIGBkYXRhX3N0YWdlYCAoaWYgYWxsb2NhdGVkKSBvciBkaXJlY3RseSB0byBgdGFibGUtXHUwMDNlZGF0YWAuXG5cbk5vdywgaWYgYGRhdGFfc3RhZ2VgIGlzIGFsbG9jYXRlZCwgaXQncyBhIGBrbWVtZHVwYCBjb3B5IG9mIGB0YWJsZS1cdTAwM2VkYXRhYC4gSGVyZSdzIHRoZSBwb3RlbnRpYWwgd3JpbmtsZTogaWYgYHRhYmxlLVx1MDAzZWRhdGFgIGhhcyB1bmluaXRpYWxpemVkIG1lbW9yeSAocGFkZGluZywgdW51c2VkIGFycmF5IGVsZW1lbnRzLCBldGMuKSwgYGttZW1kdXBgIGNvcGllcyAqdGhhdCogdW5pbml0aWFsaXplZCBkYXRhLiBUaGVuLCBgcHJvY192ZWNfY29udmAgb3ZlcndyaXRlcyB0aGUgZWxlbWVudHMgdGhhdCBpdCBzdWNjZXNzZnVsbHkgcGFyc2VzLiBBbmQgY3J1Y2lhbGx5LCBgY29tbWl0X2NvbnZfdmVjYCAqb25seSogY29waWVzIGBucl9jb252YCBlbGVtZW50cyBmcm9tIGBkYXRhX3N0YWdlYCBiYWNrIHRvIGB0YWJsZS1cdTAwM2VkYXRhYC4gU28sIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBpbiBgZGF0YV9zdGFnZWAgKmJleW9uZCogYG5yX2NvbnZgIGVsZW1lbnRzIGlzICpub3QqIGNvcGllZCBiYWNrLiBJJ20gbm90aW5nIHRoZSBkYXRhIHR5cGUgc3BlY2lmaWNzIGhlcmU6IGBQUk9DX1ZFQ19JTlRgIGhhcyBubyBlbGVtZW50IHBhZGRpbmcgKDQgYnl0ZXMpIGFuZCBuZWl0aGVyIGRvZXMgYFBST0NfVkVDX1VMT05HYCAoOCBieXRlcyksIHNvIG5vIHBhZGRpbmctcmVsYXRlZCB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMuXG5cblRoZSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGUgY29weWluZyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gQnV0IHdhaXQsIGBrbWVtZHVwYCB1c2VzIGBtZW1jcHlgLiBEb2VzIGNvcHlpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgdHJpZ2dlciBhIEtNU0FOIHJlcG9ydD8gTm8uIEtNU0FOIHRyYWNrcyB1bmluaXRpYWxpemVkIHN0YXRlLiBDb3B5aW5nIG1lcmVseSBwcm9wYWdhdGVzIHRoZSB1bmluaXRpYWxpemVkIHN0YXRlLCBhbmQgdGhlIEtNU0FOIHJlcG9ydCBpcyBvbmx5IHRyaWdnZXJlZCBpZiB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyB1c2VkIGluIGJyYW5jaGVzIG9yIHNpbmtzIChsaWtlIGBjb3B5X3RvX3VzZXJgKS5cblxuSW4gdGhpcyBjYXNlLCBga21lbWR1cGAgY29waWVzIGB0YWJsZS1cdTAwM2VkYXRhYCB0byBgZGF0YV9zdGFnZWAsIGBjb21taXRfY29udl92ZWNgIGNvcGllcyBiYWNrIG9ubHkgdGhlIGNvbnZlcnRlZCBlbGVtZW50cy4gTm8gdXNlci1zcGFjZSBsZWFrIGJlY2F1c2UgYFNZU0NUTF9VU0VSX1RPX0tFUk5gIGlzIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZSwgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLiAgRm9yIGBTWVNDVExfS0VSTl9UT19VU0VSYCwgbm8gYGRhdGFfc3RhZ2VgIGlzIGFsbG9jYXRlZCwgYGRhdGFgIGRpcmVjdGx5IHBvaW50cyB0byBgdGFibGUtXHUwMDNlZGF0YWAsIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGJlZm9yZSB0aGUgcGF0Y2guIFRoZSBsb2dpYyBmb3IgcmVhZGluZyBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlIGlzIHVuY2hhbmdlZC5cblxuU28sIHRoZSBuZXcgYXBwcm9hY2ggdXNlcyBhIHRlbXBvcmFyeSBidWZmZXIgKGBkYXRhX3N0YWdlYCkgd2hlbiB3cml0aW5nIGZyb20gdXNlciBzcGFjZSB0byB0aGUga2VybmVsOiBjb3B5LCB1cGRhdGUsIGFuZCB0aGVuIG9ubHkgY29weSBjaGFuZ2VkIGVsZW1lbnRzIGJhY2suXG5cbk5vdywgYW0gSSBtaXNzaW5nIHNvbWV0aGluZyB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBUaGUgbWFpbiBjb25jZXJuIGhlcmUgaXMgdGhlIHByb3BhZ2F0aW9uIG9mIHRoaXMgdW5pbml0aWFsaXplZCBtZW1vcnkgdGhyb3VnaCBga21lbWR1cGAuIEl0IGp1c3QgcGFzc2VzIGl0IHRocm91Z2gsIHdoaWNoIGJ5IGl0c2VsZiBpcyBub3QgYW4gaXNzdWUsIGFzIGxvbmcgYXMgaXQgaXNuJ3QgdXNlZCB3aGVyZSBpdCB3b3VsZCBiZSBjaGVja2VkLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgY2hlY2sgYHByb2NfdmVjX2NvbnZgLCB0aGVyZSBtYXkgYmUgc29tZSB1c2Ugb3IgY2hlY2sgb2YgdGhhdCBkYXRhIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzMxOCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzNjQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDo0Ny43NjgyMjY2NjJaIiwiU2VxIjoyNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYwNDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9zeXNjdGwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA2MTUsXG4gIFwiTGluZUNvdW50XCI6IDI1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2MTU6XFx0XFx0aW50ICgqdWludF9jb252KShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIHVpbnQgKmtfcHRyLFxcbiA2MTY6XFx0XFx0XFx0XFx0IGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKTtcXG4gNjE3OlxcdFxcdGludCAoKnVsb25nX2NvbnYpKGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWxvbmcgKmtfcHRyLFxcbiA2MTg6XFx0XFx0XFx0XFx0ICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSk7XFxuIDYxOTpcXHR9O1xcbiA2MjA6XFx0XFxuIDYyMTpcXHQvKlxcbiA2MjI6XFx0ICogRGlzcGF0Y2ggdG8gdGhlIGNvbnZlcnRlciBtZW1iZXIgc2VsZWN0ZWQgYnkgQHR5cGUuIEBrX3B0ciB3YWxrc1xcbiA2MjM6XFx0ICogdGFibGUtXFx1MDAzZWRhdGEgYXMgcmF3IGJ5dGVzIGFuZCBpcyBjYXN0IGJhY2sgdG8gdGhlIGVsZW1lbnQgdHlwZSBoZXJlLlxcbiA2MjQ6XFx0ICovXFxuIDYyNTpcXHRzdGF0aWMgaW50IHByb2NfdmVjX2NvbnYoZW51bSBwcm9jX3ZlY190eXBlIHR5cGUsIHVuaW9uIHByb2NfdmVjX2NvbnYgY29udixcXG4gNjI2OlxcdFxcdFxcdFxcdCBib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGNoYXIgKmtfcHRyLCBpbnQgZGlyLFxcbiA2Mjc6XFx0XFx0XFx0XFx0IGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKVxcbiA2Mjg6XFx0e1xcbiA2Mjk6XFx0XFx0c3dpdGNoICh0eXBlKSB7XFxuIDYzMDpcXHRcXHRjYXNlIFBST0NfVkVDX0lOVDpcXG4gNjMxOlxcdFxcdFxcdHJldHVybiBjb252LmludF9jb252KG5lZ3AsIHVfcHRyLCAoaW50ICopa19wdHIsIGRpciwgdGFibGUpO1xcbiA2MzI6XFx0XFx0Y2FzZSBQUk9DX1ZFQ19VSU5UOlxcbiA2MzM6XFx0XFx0XFx0cmV0dXJuIGNvbnYudWludF9jb252KG5lZ3AsIHVfcHRyLCAodWludCAqKWtfcHRyLCBkaXIsIHRhYmxlKTtcXG4gNjM0OlxcdFxcdGNhc2UgUFJPQ19WRUNfVUxPTkc6XFxuIDYzNTpcXHRcXHRcXHRyZXR1cm4gY29udi51bG9uZ19jb252KG5lZ3AsIHVfcHRyLCAodWxvbmcgKilrX3B0ciwgZGlyLCB0YWJsZSk7XFxuIDYzNjpcXHRcXHR9XFxuIDYzNzpcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNjM4OlxcdH1cXG4gNjM5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDo0Ny43NjgzOTAwMTJaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzU2NDY1MjE1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipSZXZpc2l0aW5nIGBhcHBseV9jb252X29uX3ZlY2AqKlxuXG5Pa2F5LCB0aW1lIHRvIGNpcmNsZSBiYWNrIHRvIGBhcHBseV9jb252X29uX3ZlY2AuIEkgbmVlZCB0byBzb2xpZGlmeSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoYXQgZnVuY3Rpb24ncyBiZWhhdmlvci4gSSB3YW50IHRvIGVuc3VyZSBpdCdzIGJlaGF2aW5nIHByZWNpc2VseSBhcyBJIGV4cGVjdCB3aXRoaW4gdGhpcyBzcGVjaWZpYyBhcmNoaXRlY3R1cmUsIGVzcGVjaWFsbHkgaW4gcmVnYXJkcyB0byBwYWRkaW5nLCBzdHJpZGUsIGFuZCBmaWx0ZXIgYXBwbGljYXRpb24uIEkgbmVlZCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhlcmUgYXJlbid0IGFueSBzdWJ0bGUgYmlhc2VzIGNyZWVwaW5nIGluLCBwYXJ0aWN1bGFybHkgYXQgdGhlIGJvdW5kYXJpZXMuIExldCBtZSBtZW50YWxseSB3YWxrIHRocm91Z2ggYSBmZXcgZXhhbXBsZSBpbnB1dHMgYW5kIHRyYWNlIHRoZSBjb21wdXRhdGlvbnMg4oCTIG1ha2Ugc3VyZSBJIGhhdmVuJ3QgbWlzc2VkIGEgY29ybmVyIGNhc2UuIEknbGwgbmVlZCB0byBkb3VibGUgY2hlY2sgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9ucyBkb3duIHRoZSBsaW5lLCBzbyB0aGUgb3V0cHV0IGRpbWVuc2lvbmFsaXR5IGlzIGNyaXRpY2FsLiBJJ20gZ29pbmcgdG8gbG9vayBhdCB0aGUgaW1wbGVtZW50YXRpb24gd2l0aCBhIG1vcmUgY3JpdGljYWwgZXllLiBJIHN1c3BlY3QgYSBzaW1wbGUgbWVudGFsIGNoZWNrIHdvbid0IHN1ZmZpY2U7IEkgbWlnaHQgZXZlbiB0cnkgd3JpdGluZyBhIHF1aWNrIHVuaXQgdGVzdCB0byB2ZXJpZnkgaXTigJlzIGJlaGF2aW5nIGFjY29yZGluZyB0byB0aGUgZXN0YWJsaXNoZWQgZnJhbWV3b3JrLiBJdCdzIGEga2V5IGNvbXBvbmVudCwgc28gYSBkZWVwIHVuZGVyc3RhbmRpbmcgaGVyZSBwYXlzIGRpdmlkZW5kcyBkb3duIHRoZSBsaW5lLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTg0MCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDQ6NTEuMzMzMDQ1NzE1WiIsIlNlcSI6MjYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1Nzg2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvc3lzY3RsLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjYxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjYxOlxcdCAqIGFwcGx5X2NvbnZfb25fdmVjIC0gQXBwbHkgY29udmVydGVyIGZ1bmN0aW9uIG9uIGRhdGEgdmVjdG9yXFxuIDY2MjpcXHQgKlxcbiA2NjM6XFx0ICogRWxlbWVudCBzaWduZWRuZXNzIGlzIGRlcml2ZWQgZnJvbSBAZGF0YV90eXBlLiB0YWJsZS1cXHUwMDNlZGF0YSBpcyB3YWxrZWRcXG4gNjY0OlxcdCAqIGFzIHJhdyBieXRlcyAoQGRhdGEpIGFkdmFuY2VkIGJ5IEBkYXRhX3NpemU7IHRoZSBjb252ZXJ0ZXIgcGVyZm9ybXNcXG4gNjY1OlxcdCAqIHRoZSBhY3R1YWwgdHlwZWQgbG9hZC9zdG9yZS4gU2V0cyBidWZfbGVmdF9maW5hbCB0byB0aGUgbnVtYmVyIG9mXFxuIDY2NjpcXHQgKiBieXRlcyB0aGF0IHdoZXJlIGxlZnQgb3V0c3RhbmRpbmcgYWZ0ZXIgY29udmVyc2lvbi4gQ2FuIGJlIFxcdTAwM2UgMC5cXG4gNjY3OlxcdCAqXFxuIDY2ODpcXHQgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gTm9uLXplcm8gb24gZXJyb3IuXFxuIDY2OTpcXHQgKi9cXG4gNjcwOlxcdHN0YXRpYyBpbnQgYXBwbHlfY29udl9vbl92ZWMoY29uc3QgdW5pb24gcHJvY192ZWNfY29udiBjb252LFxcbiA2NzE6XFx0XFx0XFx0XFx0ICAgICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSxcXG4gNjcyOlxcdFxcdFxcdFxcdCAgICAgY29uc3QgZW51bSBwcm9jX3ZlY190eXBlIGRhdGFfdHlwZSxcXG4gNjczOlxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3QgaW50IGNvbnZfZGlyLFxcbiA2NzQ6XFx0XFx0XFx0XFx0ICAgICBjb25zdCBzaXplX3QgYnVmX25ieXRlLCB2b2lkICpidWYsXFxuIDY3NTpcXHRcXHRcXHRcXHQgICAgIHNpemVfdCAqYnVmX2xlZnRfZmluYWwpXFxuIDY3NjpcXHR7XFxuIDY3NzpcXHRcXHRpbnQgdmVjX2xlZnQsIGVyciA9IDA7XFxuIDY3ODpcXHRcXHRzaXplX3QgYnVmX2xlZnQsIG5yX2NvbnYgPSAwO1xcbiA2Nzk6XFx0XFx0Y2hhciAqZGF0YSwgKmRhdGFfc3RhZ2UgPSBOVUxMLCAqcDtcXG4gNjgwOlxcdFxcdGJvb2wgaXNfdW5zaWduZWQgPSBkYXRhX3R5cGUgPT0gUFJPQ19WRUNfVUlOVCB8fCBkYXRhX3R5cGUgPT0gUFJPQ19WRUNfVUxPTkc7XFxuIDY4MTpcXHRcXG4gNjgyOlxcdFxcdGJ1Zl9sZWZ0ID0gYnVmX25ieXRlO1xcbiA2ODM6XFx0XFxuIDY4NDpcXHRcXHRkYXRhID0gdGFibGUtXFx1MDAzZWRhdGE7XFxuIDY4NTpcXHRcXHRpZiAoU1lTQ1RMX1VTRVJfVE9fS0VSTihjb252X2RpcikpIHtcXG4gNjg2OlxcdFxcdFxcdGlmIChidWZfbGVmdCBcXHUwMDNlIFBBR0VfU0laRSAtIDEpXFxuIDY4NzpcXHRcXHRcXHRcXHRidWZfbGVmdCA9IFBBR0VfU0laRSAtIDE7XFxuIDY4ODpcXHRcXHRcXHRwID0gYnVmO1xcbiA2ODk6XFx0XFxuIDY5MDpcXHRcXHRcXHRpZiAodGFibGUtXFx1MDAzZW1heGxlbiBcXHUwMDNlIGRhdGFfc2l6ZSkge1xcbiA2OTE6XFx0XFx0XFx0XFx0ZGF0YV9zdGFnZSA9IGttZW1kdXAodGFibGUtXFx1MDAzZWRhdGEsIHRhYmxlLVxcdTAwM2VtYXhsZW4sIEdGUF9LRVJORUwpO1xcbiA2OTI6XFx0XFx0XFx0XFx0aWYgKCFkYXRhX3N0YWdlKSB7XFxuIDY5MzpcXHRcXHRcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbiA2OTQ6XFx0XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuIDY5NTpcXHRcXHRcXHRcXHR9XFxuIDY5NjpcXHRcXHRcXHRcXHRkYXRhID0gZGF0YV9zdGFnZTtcXG4gNjk3OlxcdFxcdFxcdH1cXG4gNjk4OlxcdFxcdH1cXG4gNjk5OlxcdFxcbiA3MDA6XFx0XFx0dmVjX2xlZnQgPSB0YWJsZS1cXHUwMDNlbWF4bGVuIC8gZGF0YV9zaXplO1xcbiA3MDE6XFx0XFx0Zm9yICg7IGJ1Zl9sZWZ0IFxcdTAwMjZcXHUwMDI2IHZlY19sZWZ0LS07IGRhdGEgKz0gZGF0YV9zaXplLCBucl9jb252KyspIHtcXG4gNzAyOlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgbHZhbDtcXG4gNzAzOlxcdFxcdFxcdGJvb2wgbmVnID0gZmFsc2U7XFxuIDcwNDpcXHRcXG4gNzA1OlxcdFxcdFxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xcbiA3MDY6XFx0XFx0XFx0XFx0cHJvY19za2lwX3NwYWNlcyhcXHUwMDI2cCwgXFx1MDAyNmJ1Zl9sZWZ0KTtcXG4gNzA3OlxcdFxcbiA3MDg6XFx0XFx0XFx0XFx0aWYgKCFidWZfbGVmdClcXG4gNzA5OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA3MTA6XFx0XFx0XFx0XFx0ZXJyID0gcHJvY19nZXRfbG9uZyhcXHUwMDI2cCwgXFx1MDAyNmJ1Zl9sZWZ0LCBcXHUwMDI2bHZhbCwgXFx1MDAyNm5lZyxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDQ6NTEuMzMzMjA1OTU1WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUzODUwNjg4NjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgSW1tZWRpYXRlIENvbmNlcm5zIFJlZ2FyZGluZyBgY29tbWl0X2NvbnZfdmVjYCoqXG5cbk9rYXksIGhvbGQgb24gYSBzZWNvbmQuIEkgd2FzIHJldmlld2luZyB0aGUgZGF0YSB0eXBlcyBiZWluZyBoYW5kbGVkLCBhbmQgYSBxdWVzdGlvbiBqdXN0IHBvcHBlZCBpbnRvIG15IGhlYWQ6IHdoYXQgaWYgdGhlIGBkYXRhX3R5cGVgIGlzIGBQUk9DX1ZFQ19VSU5UYD8gTGV0J3MgcXVpY2tseSByZS1leGFtaW5lIHRoZSBgY29tbWl0X2NvbnZfdmVjYCBmdW5jdGlvbi4gSSdtIHRha2luZyBhIGxvb2sgYXQgdGhlIGNvZGU6XG5cbmBgYGNcbnN0YXRpYyBpbnQgY29tbWl0X2NvbnZfdmVjKGNvbnN0IGVudW0gcHJvY192ZWNfdHlwZSBkYXRhX3R5cGUsIHZvaWQgKmRzdCxcblx0XHRcdCAgICBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBucilcbntcblx0c2l6ZV90IGk7XG5cblx0c3dpdGNoIChkYXRhX3R5cGUpIHtcblx0Y2FzZSBQUk9DX1ZFQ19JTlQ6XG5cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkrKylcblx0XHRcdFdSSVRFX09OQ0UoKChpbnQgKilkc3QpW2ldLCAoKGNvbnN0IGludCAqKXNyYylbaV0pO1xuXHRcdHJldHVybiAwO1xuXG5cdGNhc2UgUFJPQ19WRUNfVUxPTkc6XG5cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkrKylcblx0XHRcdFdSSVRFX09OQ0UoKCh1bG9uZyAqKWRzdClbaV0sICgoY29uc3QgdWxvbmcgKilzcmMpW2ldKTtcblx0XHRyZXR1cm4gMDtcblx0ZGVmYXVsdDpcblx0XHRyZXR1cm4gLUVJTlZBTDtcblx0fVxufVxuYGBgXG5cbi4uLmFuZCB0aGVyZSBpdCBpcy4gKipgUFJPQ19WRUNfVUlOVGAgaXMgZ2xhcmluZ2x5IGFic2VudCoqIGZyb20gdGhlIGBzd2l0Y2hgIHN0YXRlbWVudCEgSWYgdGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGEgYGRhdGFfdHlwZWAgb2YgYFBST0NfVkVDX1VJTlRgLCB0aGVuIHRoZSBgZGVmYXVsdGAgY2FzZSB3aWxsIGJlIHRyaWdnZXJlZCwgcmVzdWx0aW5nIGluIGEgcmV0dXJuIHZhbHVlIG9mIGAtRUlOVkFMYC4gVGhpcyBpcyBkZWZpbml0ZWx5IGEgYnVnOyBpdCBpcyBhbiBlcnJvciByZXR1cm4gYmVjYXVzZSBgUFJPQ19WRUNfVUlOVGAgaXMgYSB2YWxpZCB0eXBlIGluIHRoaXMgY29udGV4dC4gSSBuZWVkIHRvIGludmVzdGlnYXRlIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG5leHQgYW5kIHdoYXQgdGhhdCBtaXNzaW5nIHR5cGUgaXMuIExldCdzIHNlZSB3aGF0IGhhcHBlbnMgd2l0aGluIGBwcm9jX2RvdWludHZlY19jb252YC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY5NDMsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNzMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNDo1Ni43MTgyNzY4MTlaIiwiU2VxIjoyOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTk0NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3N5c2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDgyMyxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDgyMzpcXHRcXHRcXHRcXHRpbnQgKCpjb252KShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIHVpbnQgKmtfcHRyLFxcbiA4MjQ6XFx0XFx0XFx0XFx0XFx0ICAgIGludCBkaXIsIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKSlcXG4gODI1OlxcdHtcXG4gODI2OlxcdFxcdC8qIHVpbnQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkLCAqRG8gbm90KiBhZGQgc3VwcG9ydCBmb3IgdGhlbS4gKi9cXG4gODI3OlxcdFxcdGlmICh0YWJsZS1cXHUwMDNlbWF4bGVuIFxcdTAwMjZcXHUwMDI2ICh0YWJsZS1cXHUwMDNlbWF4bGVuIC8gc2l6ZW9mKHVpbnQpKSAhPSAxKVxcbiA4Mjg6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDgyOTpcXHRcXG4gODMwOlxcdFxcdGlmICghY29udilcXG4gODMxOlxcdFxcdFxcdGNvbnYgPSBkb19wcm9jX3VpbnRfY29udjtcXG4gODMyOlxcdFxcbiA4MzM6XFx0XFx0cmV0dXJuIHByb2NfdmVjKHRhYmxlLCBkaXIsIGJ1ZmZlciwgbGVucCwgcHBvcywgUFJPQ19WRUNfVUlOVCxcXG4gODM0OlxcdFxcdFxcdFxcdCh1bmlvbiBwcm9jX3ZlY19jb252KXsgLnVpbnRfY29udiA9IGNvbnYgfSk7XFxuIDgzNTpcXHR9XFxuIDgzNjpcXHRcXG4gODM3OlxcdC8qKlxcbiA4Mzg6XFx0ICogcHJvY19kb2Jvb2wgLSByZWFkL3dyaXRlIGEgYm9vbFxcbiA4Mzk6XFx0ICogQHRhYmxlOiB0aGUgc3lzY3RsIHRhYmxlXFxuIDg0MDpcXHQgKiBAZGlyOiAlVFJVRSBpZiB0aGlzIGlzIGEgd3JpdGUgdG8gdGhlIHN5c2N0bCBmaWxlXFxuIDg0MTpcXHQgKiBAYnVmZmVyOiB0aGUgdXNlciBidWZmZXJcXG4gODQyOlxcdCAqIEBsZW5wOiB0aGUgc2l6ZSBvZiB0aGUgdXNlciBidWZmZXJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDQ6NTYuNzE4Mzc3NjY5WiIsIlNlcSI6MjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMDcyOTUzNTM1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IEhhbmRsaW5nIGluIGBwcm9jX2RvdWludHZlY19jb252YCBhbmQgUmVsYXRlZCBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBgcHJvY19kb3VpbnR2ZWNfY29udmAgZXNzZW50aWFsbHkgaGFyZGNvZGVzIGB0YWJsZS1cdTAwM2VtYXhsZW5gIHRvIGJlIGBzaXplb2YodWludClgIOKAkyBnb3QgaXQuIFRoaXMgbWVhbnMgaW4gYGFwcGx5X2NvbnZfb25fdmVjYCwgd2hlbiBgdGFibGUtXHUwMDNlbWF4bGVuYCBpcyBub3QgZ3JlYXRlciB0aGFuIGBkYXRhX3NpemVgICh3aGljaCBpcyB0aGUgc2FtZSBhcyBgc2l6ZW9mKHVpbnQpYCksIGBkYXRhX3N0YWdlYCAqaXNuJ3QqIGFsbG9jYXRlZC4gVGh1cywgYGRhdGFgIGRpcmVjdGx5IHBvaW50cyB0byBgdGFibGUtXHUwMDNlZGF0YWAsIHdoaWNoIGlzIHZlcnkgY29udmVuaWVudC4gQmVjYXVzZSBgZGF0YV9zdGFnZWAgaXMgTlVMTCwgYGNvbW1pdF9jb252X3ZlY2AgaXMgc2tpcHBlZC4gVGhlcmVmb3JlLCBgUFJPQ19WRUNfVUlOVGAgZGlyZWN0bHkgbW9kaWZpZXMgYHRhYmxlLVx1MDAzZWRhdGFgLCB3aGljaCBpcyBleHBlY3RlZC4gTm8gbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbXMgdGhlcmUuXG5cbk5vdywgd2hhdCBhYm91dCB0aGUgaW50ZWdlciBhbmQgdW5zaWduZWQgbG9uZyB2ZXJzaW9ucywgYFBST0NfVkVDX0lOVGAgYW5kIGBQUk9DX1ZFQ19VTE9OR2A/IEl0J3MgYSBzbGlnaHRseSBkaWZmZXJlbnQgc2NlbmFyaW8uIElmIGB0YWJsZS1cdTAwM2VtYXhsZW5gICppcyogZ3JlYXRlciB0aGFuIGBkYXRhX3NpemVgLCB0aGVuIGBkYXRhX3N0YWdlYCAqaXMqIGFsbG9jYXRlZC4gQnV0IGlmIGB0YWJsZS1cdTAwM2VkYXRhYCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCwgYGttZW1kdXBgIGNvcGllcyBpdC4gVGhpcyBpcyB3aGVyZSBJIHN0YXJ0IHRvIHdvcnJ5OiBhcmUgd2UgcmVhZGluZyB1bmluaXRpYWxpemVkIG1lbW9yeT8gS01TQU4gaXMgdXN1YWxseSBnb29kIGF0IGNhdGNoaW5nIHRoYXQsIGJ1dCBga21lbWR1cGAgdXNlcyBga21hbGxvY2AgYW5kIGBtZW1jcHlgLlxuXG5gbWVtY3B5YCBpdHNlbGYgY29waWVzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBhbmQgS01TQU4gdHJhY2tzIGl0LiBUaGUga2V5IHF1ZXN0aW9uIGlzOiBkb2VzIGBtZW1jcHlgIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5ICp0cmlnZ2VyKiBhIHJlcG9ydD8gTm8sIGl0IGp1c3QgcHJvcGFnYXRlcyB0aGUgc2hhZG93IHN0YXRlLiBUaGF0J3MgZ29vZCwgYnV0IGl0IG1lYW5zIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsLlxuXG5UaGVuIGBwcm9jX3ZlY19jb252YCBvdmVyd3JpdGVzIHRoZSBmaXJzdCBgbnJfY29udmAgZWxlbWVudHMgaW4gYGRhdGFfc3RhZ2VgLiBBZnRlciB0aGF0LCBgY29tbWl0X2NvbnZfdmVjYCBjb3BpZXMgdGhlIGZpcnN0IGBucl9jb252YCBlbGVtZW50cyBiYWNrIHRvIGB0YWJsZS1cdTAwM2VkYXRhYC4gU3BlY2lmaWNhbGx5OlxuXG5gYGBjXG5cdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkrKylcblx0XHRcdFdSSVRFX09OQ0UoKChpbnQgKilkc3QpW2ldLCAoKGNvbnN0IGludCAqKXNyYylbaV0pO1xuYGBgXG5cblRoaXMgY29waWVzIHRoZSAqaW5pdGlhbGl6ZWQqIGVsZW1lbnRzIGJhY2ssIHdoaWNoIGlzIGZpbmUsIGFzIGBkc3RgIGlzIGB0YWJsZS1cdTAwM2VkYXRhYCwgYW5kIGBzcmNgIGlzIGBkYXRhX3N0YWdlYC4gVGhlIHVuaW5pdGlhbGl6ZWQgcGFydHMgb2YgYGRhdGFfc3RhZ2VgIGFyZSBuZXZlciByZWFkIG9yIGNvcGllZCAqYmFjayouXG5cbkhvd2V2ZXIsIGFuZCB0aGlzIGlzIGNyaXRpY2FsOiBXaGF0IGlmIGBwcm9jX3ZlY19jb252YCBpdHNlbGYgKnJlYWRzKiBmcm9tIGBkYXRhYCBiZWZvcmUgaXQgd3JpdGVzIHRvIGl0PyBJIHNob3VsZCByZS1leGFtaW5lIGBwcm9jX2ludF9jb252YCB3aXRoIHRoaXMgaW4gbWluZC4gVGhhdCdzIHdoZXJlIGEgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdHkgbGllcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc5ODIsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MjcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNTowNi43OTEzMzM5NzRaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc0ODEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9zeXNjdGwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1NDAsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1NDA6XFx0aW50IHByb2NfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyLCBpbnQgZGlyLFxcbiA1NDE6XFx0XFx0XFx0ICBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwsIGJvb2wga19wdHJfcmFuZ2VfY2hlY2ssXFxuIDU0MjpcXHRcXHRcXHQgIGludCAoKnVzZXJfdG9fa2VybikoY29uc3QgYm9vbCAqbmVncCwgY29uc3QgdWxvbmcgKnVfcHRyLCBpbnQgKmtfcHRyKSxcXG4gNTQzOlxcdFxcdFxcdCAgaW50ICgqa2Vybl90b191c2VyKShib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGNvbnN0IGludCAqa19wdHIpKVxcbiA1NDQ6XFx0e1xcbiA1NDU6XFx0XFx0aWYgKFNZU0NUTF9LRVJOX1RPX1VTRVIoZGlyKSlcXG4gNTQ2OlxcdFxcdFxcdHJldHVybiBrZXJuX3RvX3VzZXIobmVncCwgdV9wdHIsIGtfcHRyKTtcXG4gNTQ3OlxcdFxcbiA1NDg6XFx0XFx0aWYgKGtfcHRyX3JhbmdlX2NoZWNrKSB7XFxuIDU0OTpcXHRcXHRcXHRpbnQgdG1wX2ssIHJldDtcXG4gNTUwOlxcdFxcbiA1NTE6XFx0XFx0XFx0aWYgKCF0YmwpXFxuIDU1MjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNTUzOlxcdFxcdFxcdHJldCA9IHVzZXJfdG9fa2VybihuZWdwLCB1X3B0ciwgXFx1MDAyNnRtcF9rKTtcXG4gNTU0OlxcdFxcdFxcdGlmIChyZXQpXFxuIDU1NTpcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA1NTY6XFx0XFx0XFx0aWYgKCh0YmwtXFx1MDAzZWV4dHJhMSBcXHUwMDI2XFx1MDAyNiAqKGludCAqKXRibC1cXHUwMDNlZXh0cmExIFxcdTAwM2UgdG1wX2spIHx8XFxuIDU1NzpcXHRcXHRcXHQgICAgKHRibC1cXHUwMDNlZXh0cmEyIFxcdTAwMjZcXHUwMDI2ICooaW50ICopdGJsLVxcdTAwM2VleHRyYTIgXFx1MDAzYyB0bXBfaykpXFxuIDU1ODpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNTU5OlxcdFxcdFxcdFdSSVRFX09OQ0UoKmtfcHRyLCB0bXBfayk7XFxuIDU2MDpcXHRcXHR9IGVsc2VcXG4gNTYxOlxcdFxcdFxcdHJldHVybiB1c2VyX3RvX2tlcm4obmVncCwgdV9wdHIsIGtfcHRyKTtcXG4gNTYyOlxcdFxcdHJldHVybiAwO1xcbiA1NjM6XFx0fVxcbiA1NjQ6XFx0XFxuIDU2NTpcXHRcXG4gNTY2OlxcdFxcbiA1Njc6XFx0c3RhdGljIGludCBzeXNjdGxfdXNlcl90b19rZXJuX2ludF9jb252KGNvbnN0IGJvb2wgKm5lZ3AsIGNvbnN0IHVsb25nICp1X3B0cixcXG4gNTY4OlxcdFxcdFxcdFxcdFxcdFxcdGludCAqa19wdHIpXFxuIDU2OTpcXHR7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA1OjA2Ljc5MTUxMjExNFoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzI4NDc3ODEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqQW5hbHl6aW5nIHRoZSBEYXRhIEZsb3cgd2l0aGluIGBwcm9jX2ludF9jb252YCoqXG5cbkFscmlnaHQsIHNvIEknbSBmb2N1c2luZyBvbiB0aGUgYHByb2NfaW50X2NvbnZgIGZ1bmN0aW9uIHJpZ2h0IG5vdywgYW5kIHNwZWNpZmljYWxseSwgSSdtIHRoaW5raW5nIGFib3V0IHRoZSBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbmFsaXR5IHdpdGhpbiBpdC4gTXkgbWluZCBpbW1lZGlhdGVseSBmbGFncyB0aGUgY2FsbCB0byBgdXNlcl90b19rZXJuYC4gVGhhdCdzIGEgY3JpdGljYWwgcG9pbnQsIGlzbid0IGl0PyBJdCBtZWFucyB3ZSdyZSBtb3ZpbmcgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlIGF0IHRoYXQgcG9pbnQuIEkgbmVlZCB0byBrZWVwIHRoYXQgaW4gbWluZCB3aGVuIGV4YW1pbmluZyBhbnkgYXNzb2NpYXRlZCBzZWN1cml0eSBpbXBsaWNhdGlvbnMsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzLCBvciBwb3RlbnRpYWwgZGF0YSBjb3JydXB0aW9uIGlzc3Vlcy4gSSBuZWVkIHRvIHJlZnJlc2ggdGhlIHJlYXNvbnMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBkYXRhIGl0IG9wZXJhdGVzIG9uLCBhbmQgd2hhdCB0aGUgdWx0aW1hdGUgcHVycG9zZSBpcy4gQ29udGV4dCBpcyBrZXksIGFuZCB0aGF0IHNpbmdsZSBmdW5jdGlvbiBjYWxsIHJhaXNlcyBhIHJlZCBmbGFnIGluIG15IG1pbmQgdGhhdCBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE5NjI4LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNToxMC41MTk5OTI0NTZaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU0MDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9zeXNjdGwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1NjcsXG4gIFwiTGluZUNvdW50XCI6IDE1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1Njc6XFx0c3RhdGljIGludCBzeXNjdGxfdXNlcl90b19rZXJuX2ludF9jb252KGNvbnN0IGJvb2wgKm5lZ3AsIGNvbnN0IHVsb25nICp1X3B0cixcXG4gNTY4OlxcdFxcdFxcdFxcdFxcdFxcdGludCAqa19wdHIpXFxuIDU2OTpcXHR7XFxuIDU3MDpcXHRcXHRyZXR1cm4gcHJvY19pbnRfdTJrX2NvbnZfdW9wKHVfcHRyLCBrX3B0ciwgbmVncCwgTlVMTCk7XFxuIDU3MTpcXHR9XFxuIDU3MjpcXHRcXG4gNTczOlxcdHN0YXRpYyBpbnQgc3lzY3RsX2tlcm5fdG9fdXNlcl9pbnRfY29udihib29sICpuZWdwLCB1bG9uZyAqdV9wdHIsIGNvbnN0IGludCAqa19wdHIpXFxuIDU3NDpcXHR7XFxuIDU3NTpcXHRcXHRyZXR1cm4gcHJvY19pbnRfazJ1X2NvbnZfa29wKHVfcHRyLCBrX3B0ciwgbmVncCwgTlVMTCk7XFxuIDU3NjpcXHR9XFxuIDU3NzpcXHRcXG4gNTc4OlxcdHN0YXRpYyBpbnQgZG9fcHJvY19pbnRfY29udihib29sICpuZWdwLCB1bnNpZ25lZCBsb25nICp1X3B0ciwgaW50ICprX3B0cixcXG4gNTc5OlxcdFxcdFxcdFxcdCAgICBpbnQgZGlyLCBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YmwpXFxuIDU4MDpcXHR7XFxuIDU4MTpcXHRcXHRyZXR1cm4gcHJvY19pbnRfY29udihuZWdwLCB1X3B0ciwga19wdHIsIGRpciwgdGJsLCBmYWxzZSxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDU6MTAuNTIwMTQ4MjA1WiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUxNDM0Njg5NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzIG9uIGNoZWNraW5nIGBwcm9jX2ludF91MmtfY29udl91b3BgIGFzIGlmIHRoZXNlIHdlcmUgbXkgaW50ZXJuYWwgbXVzaW5nczpcblxuKipBbmFseXppbmcgYHByb2NfaW50X3Uya19jb252X3VvcGAqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gemVybyBpbiBvbiB0aGF0IHNwZWNpZmljIGZ1bmN0aW9uIOKAkyBgcHJvY19pbnRfdTJrX2NvbnZfdW9wYC4gSSBrbm93IHRoaXMgaXMgbGlrZWx5IHNvbWUga2luZCBvZiBpbnRlZ2VyIHRvIEsgY29udmVyc2lvbiBtaWNyby1vcCBwcm9jZXNzb3IuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCB0aGF0IG1lYW5zLiBJcyB0aGlzIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmU/IElzIGl0IGEgc3RhbmRhcmQgY29udmVyc2lvbj8gV2hhdCdzIHRoZSBjb250ZXh0P1xuXG5NeSBpbW1lZGlhdGUgY2hlY2tsaXN0IHN0YXJ0cyBydW5uaW5nOlxuXG4qICAgKipEYXRhIFR5cGVzOioqIFdoYXQgYXJlIHRoZSBpbnB1dCBpbnRlZ2VyIHR5cGVzPyBJcyBpdCBhIHNpZ25lZCBvciB1bnNpZ25lZCBpbnRlZ2VyLCBhbmQgdGhlIGV4YWN0IGJpdCB3aWR0aD8gV2hlcmUgaXMgaXQgY29udmVydGluZyAqdG8qPyBJcyBcIktcIiBhIHNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9yIHNvbWUgc29ydCBvZiBpbnRlcm1lZGlhdGUgaW50ZXJuYWwgZm9ybWF0P1xuKiAgICoqT3BlcmF0aW9uOioqIFdoYXQgc3BlY2lmaWMgKmNvbnZlcnNpb24qIGlzIGl0IGRvaW5nPyBJcyBpdCBzaW1wbGUgdHJ1bmNhdGlvbiwgcm91bmRpbmcsIHNhdHVyYXRpb24sIG9yIHNvbWV0aGluZyBtb3JlIGNvbXBsZXg/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBiZWhhdmlvciB1bmRlciBkaWZmZXJlbnQgaW5wdXQgY29uZGl0aW9ucywgZXNwZWNpYWxseSBlZGdlIGNhc2VzIGxpa2UgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMsIG5lZ2F0aXZlIG51bWJlcnMsIGFuZCB6ZXJvZXMuXG4qICAgKipJbXBsZW1lbnRhdGlvbjoqKiBIb3cgaXMgaXQgaW1wbGVtZW50ZWQ/IElzIHRoaXMgYSBoYXJkd2FyZSBibG9jaywgb3IgYSBzb2Z0d2FyZSByb3V0aW5lPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyBvciBvcHRpbWl6YXRpb25zIEkgc2hvdWxkIGNvbnNpZGVyPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgYnVncyB0aGF0IGNhbiB0cmlwIGl0IHVwP1xuKiAgICoqQ29udGV4dDoqKiBXaGF0J3MgdGhlIHN1cnJvdW5kaW5nIGNvZGUgdXNpbmcgdGhpcyBgdW9wYD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRhdGEgZmxvdywgdGhlIGNhbGxpbmcgY29udGV4dCwgYW5kIHRoZSBkb3duc3RyZWFtIGNvbnN1bWVycyBvZiB0aGUgcmVzdWx0LiBIb3cgZG9lcyB0aGlzIGZpdCBpbnRvIHRoZSBsYXJnZXIgcGljdHVyZSBvZiB0aGUgcHJvY2Vzc29yJ3MgcGlwZWxpbmU/IFdoYXQncyB0aGUgb3ZlcmFsbCBpbXBhY3Qgb24gc3lzdGVtIHBlcmZvcm1hbmNlP1xuKiAgICoqVGVzdGluZzoqKiBXaGF0IGtpbmQgb2YgdGVzdGluZyBoYXMgYmVlbiBkb25lIG9uIHRoaXM/IFdoYXQgdGVzdHMgYXJlIGluIHBsYWNlIHRvIGNvdmVyIHRoZSBkaWZmZXJlbnQgc2NlbmFyaW9zIEkgbWVudGlvbmVkLCBhbmQgaG93IHRob3JvdWdoIGFyZSB0aGV5PyBBcmUgdGhlcmUgYW55IGtub3duIGlzc3VlcyBvciBhcmVhcyBvZiBjb25jZXJuP1xuXG5JJ2xsIG5lZWQgdG8gZGlnIGludG8gdGhlIHNvdXJjZSBjb2RlLCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24sIGFuZCBhbnkgcmVsZXZhbnQgYXJjaGl0ZWN0dXJlIG1hbnVhbHMgdG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IHRoaXMgaXMgYSBjcml0aWNhbCBjb21wb25lbnQsIGlmIGl0J3Mgbm90IHdvcmtpbmcgY29ycmVjdGx5IGl0IGNhbiBlYXNpbHkgY2F1c2UgaXNzdWVzLiBJdCdzIHRpbWUgdG8gcHV0IG9uIG15IGRldGVjdGl2ZSBoYXQgYW5kIGZpbmQgb3V0IHdoYXQncyBnb2luZyBvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MjAxNzksIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA1OjE1LjY2MzYxOTc5MloiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDMzODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3N5c2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUwNixcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUwNjpcXHRpbnQgcHJvY19pbnRfdTJrX2NvbnZfdW9wKGNvbnN0IHVsb25nICp1X3B0ciwgaW50ICprX3B0ciwgY29uc3QgYm9vbCAqbmVncCxcXG4gNTA3OlxcdFxcdFxcdFxcdCAgdWxvbmcgKCp1X3B0cl9vcCkoY29uc3QgdWxvbmcpKVxcbiA1MDg6XFx0e1xcbiA1MDk6XFx0XFx0dWxvbmcgdSA9IHVfcHRyX29wID8gdV9wdHJfb3AoKnVfcHRyKSA6ICp1X3B0cjtcXG4gNTEwOlxcdFxcbiA1MTE6XFx0XFx0aWYgKCpuZWdwKSB7XFxuIDUxMjpcXHRcXHRcXHRpZiAodSBcXHUwMDNlICh1bG9uZykgSU5UX01BWCArIDEpXFxuIDUxMzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNTE0OlxcdFxcdFxcdFdSSVRFX09OQ0UoKmtfcHRyLCAtdSk7XFxuIDUxNTpcXHRcXHR9IGVsc2Uge1xcbiA1MTY6XFx0XFx0XFx0aWYgKHUgXFx1MDAzZSAodWxvbmcpIElOVF9NQVgpXFxuIDUxNzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNTE4OlxcdFxcdFxcdFdSSVRFX09OQ0UoKmtfcHRyLCB1KTtcXG4gNTE5OlxcdFxcdH1cXG4gNTIwOlxcdFxcdHJldHVybiAwO1xcbiA1MjE6XFx0fVxcbiA1MjI6XFx0XFxuIDUyMzpcXHQvKipcXG4gNTI0OlxcdCAqIHByb2NfaW50X2NvbnYgLSBDaGFuZ2UgdXNlciBvciBrZXJuZWwgcG9pbnRlciBiYXNlZCBvbiBkaXJlY3Rpb25cXG4gNTI1OlxcdCAqXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA1OjE1LjY2MzcyNDM1MloiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5NjEwNjczODgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IFNhZmV0eSBvZiB0aGUgQ29udmVyc2lvbiBQcm9jZXNzKipcblxuT2theSwgc28gYHByb2NfaW50X3Uya19jb252X3VvcGAgb25seSAqd3JpdGVzKiB0byBgKmtfcHRyYCwgYW5kIEknbSBwcmV0dHkgc3VyZSBgcHJvY192ZWNfY29udmAgb25seSAqd3JpdGVzKiB0byBgZGF0YWAgd2hlbiB3ZSdyZSBkZWFsaW5nIHdpdGggdGhlIGBTWVNDVExfVVNFUl9UT19LRVJOYCBjYXNlLiBUaGVyZWZvcmUsIGluIHRoYXQgZGlyZWN0aW9uLCB0aGVyZSdzIG5vIHJlYWQgZnJvbSBgZGF0YWAgdGhhdCBjb3VsZCBjYXVzZSB0cm91YmxlLiBOb3csIGBjb21taXRfY29udl92ZWNgICpyZWFkcyogb25seSB0aGUgYGRhdGFfc3RhZ2VgIGVsZW1lbnRzIHRoYXQgKndlcmUgd3JpdHRlbiB0byosIHVwIHRvIGBucl9jb252YC5cblxuSG9sZCBvbi4uLiB3aGF0IGlmIGBwcm9jX3ZlY19jb252YCBiYWlscyBvdXQgb24gdGhlIHZlcnkgKmZpcnN0KiBlbGVtZW50PyBUaGF0IG1lYW5zIGBucl9jb252YCB3b3VsZCBiZSB6ZXJvLCByaWdodD8gTGV0J3MgY2hlY2sgdGhlIGNvZGUuLi4gWWVwLCBpZiBgbnJfY29udmAgaXMgemVybywgd2UgYmFpbCBvdXQgaW1tZWRpYXRlbHk6XG5cbmBgYGNcblx0XHRpZiAoIW5yX2NvbnYpIHtcblx0XHRcdGVyciA9IGVyciA/IDogLUVJTlZBTDtcblx0XHRcdGdvdG8gb3V0O1xuXHRcdH1cblx0XHRpZiAoIWVyciBcdTAwMjZcdTAwMjYgZGF0YV9zdGFnZSlcblx0XHRcdGVyciA9IGNvbW1pdF9jb252X3ZlYyhkYXRhX3R5cGUsIHRhYmxlLVx1MDAzZWRhdGEsIGRhdGFfc3RhZ2UsIG5yX2NvbnYpO1xuYGBgXG5cblNvLCBpZiBgbnJfY29udmAgaXMgemVybywgd2UganVtcCB0byBgb3V0YCwgYW5kIGBjb21taXRfY29udl92ZWNgICppc24ndCogZXZlbiBjYWxsZWQuIElmIGBucl9jb252YCBpcyBncmVhdGVyIHRoYW4gemVybywgdGhlbiB3ZSAqZG8qIGNhbGwgYGNvbW1pdF9jb252X3ZlY2Agd2l0aCBgbnJfY29udmAsIHNvIGl0ICpvbmx5KiBjb3BpZXMgd2hhdCB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBhbmQgd3JpdHRlbiB0byBgZGF0YV9zdGFnZWAuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGxlYWtzLiBUaGF0J3MgZ29vZC5cblxuQnV0LCB3aGF0IGlmIGBTWVNDVExfS0VSTl9UT19VU0VSYCBpcyB0aGUgY2FzZT9cblxuYGBgY1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAocHJvY192ZWNfY29udihkYXRhX3R5cGUsIGNvbnYsIFx1MDAyNm5lZywgXHUwMDI2bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkge1xuXHRcdFx0XHRlcnIgPSAtRUlOVkFMO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmIChucl9jb252KVxuXHRcdFx0XHRwcm9jX3B1dF9jaGFyKFx1MDAyNmJ1ZiwgXHUwMDI2YnVmX2xlZnQsICdcXHQnKTtcblx0XHRcdHByb2NfcHV0X2xvbmcoXHUwMDI2YnVmLCBcdTAwMjZidWZfbGVmdCwgbHZhbCwgbmVnKTtcblx0XHR9XG5gYGBcblxuT2theSwgaW4gdGhpcyBzY2VuYXJpbywgYGRhdGFgIGlzIHBvaW50aW5nIHRvIGB0YWJsZS1cdTAwM2VkYXRhYCwgd2hpY2ggbWVhbnMgdGhlIGBkYXRhYCBhcnJheSBpcyBiZWluZyByZWFkLiBMb29raW5nIGF0IGBwcm9jX3ZlY19jb252YCBjYWxscyBgcHJvY19pbnRfY29udmAgd2hpY2ggdGhlbiBjYWxscyBga2Vybl90b191c2VyYC4gSSdtIGdvaW5nIHRvIGhhdmUgdG8gZGl2ZSBpbnRvIHRob3NlIGZ1bmN0aW9ucyBuZXh0LCBidXQgYmFzZWQgb24gdGhlIGNvZGUgSSd2ZSBsb29rZWQgYXQsIHRoZSB3cml0ZSBwcm9jZXNzIHNlZW1zIHNhZmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxMDI0LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDQ1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDU6MjUuMjc0NDAxMDAyWiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMjMxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvc3lzY3RsLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDkxLFxuICBcIkxpbmVDb3VudFwiOiAxNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDkxOlxcdFxcdHJldHVybiAwO1xcbiA0OTI6XFx0fVxcbiA0OTM6XFx0XFxuIDQ5NDpcXHQvKipcXG4gNDk1OlxcdCAqIHByb2NfaW50X3Uya19jb252X3VvcCAtIEFzc2lnbiB1c2VyIHZhbHVlIHRvIGEga2VybmVsIHBvaW50ZXJcXG4gNDk2OlxcdCAqIEB1X3B0cjogcG9pbnRlciB0byB1c2VyIHNwYWNlIHZhcmlhYmxlXFxuIDQ5NzpcXHQgKiBAa19wdHI6IHBvaW50ZXIgdG8ga2VybmVsIHZhcmlhYmxlXFxuIDQ5ODpcXHQgKiBAbmVncDogSWYgJVRSVUUsIHRoZSBjb252ZXJ0ZWQgdXNlciB2YWx1ZSBpcyBtYWRlIG5lZ2F0aXZlLlxcbiA0OTk6XFx0ICogQHVfcHRyX29wOiBleGVjdXRlIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGFzc2lnbmluZyB0byBrX3B0clxcbiA1MDA6XFx0ICpcXG4gNTAxOlxcdCAqIFVzZXMgV1JJVEVfT05DRSB0byBhc3NpZ24gdmFsdWUgdG8ga19wdHIuIEV4ZWN1dGVzIHVfcHRyX29wIGlmXFxuIDUwMjpcXHQgKiBub3QgTlVMTC4gQ2hlY2sgZm9yIG92ZXJmbG93IHdpdGggVUlOVF9NQVguXFxuIDUwMzpcXHQgKlxcbiA1MDQ6XFx0ICogUmV0dXJuczogMCBvbiBzdWNjZXNzLlxcbiA1MDU6XFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA1OjI1LjI3NDUxNDc3MloiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MDgzMzkxNzA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcyBvbiB0YWNrbGluZyB0aGlzIHNuaXBwZXQsIHJlbmRlcmVkIGFzIGlmIGl0IHdlcmUgbXkgb3duIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipBbmFseXppbmcgYHByb2NfaW50X2sydV9jb252X2tvcGAqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gTXkgZmlyc3QgaW5zdGluY3QsIGFzIGFsd2F5cywgaXMgdG8gemVybyBpbiBvbiB0aGF0IGZ1bmN0aW9uOiBgcHJvY19pbnRfazJ1X2NvbnZfa29wYC4gVGhlIG5hbWUgaXRzZWxmIGlzIGEgY2x1ZSwgc28gbGV0J3MgYnJlYWsgaXQgZG93bi4gXCJwcm9jXCIgbGlrZWx5IGluZGljYXRlcyBhIHByb2NlZHVyZSBvciBwcm9jZXNzaW5nIGZ1bmN0aW9uLiBcImludFwiIHN1Z2dlc3RzIHdlJ3JlIGRlYWxpbmcgd2l0aCBpbnRlZ2VycywgYW5kIFwiazJ1XCIgc2VlbXMgdG8gaW1wbHkgc29tZSBraW5kIG9mIGtlcm5lbC10by11c2VyIHNwYWNlIGNvbnZlcnNpb24uIFRoZSBcImNvbnZcIiBpcyBjbGVhciAtIGEgY29udmVyc2lvbiBpcyBoYXBwZW5pbmcuIEFuZCBmaW5hbGx5LCBcImtvcFwiIC4uLiBobW1tLCBwb3RlbnRpYWxseSBhIGtlcm5lbCBvcGVyYXRpb24gb3Iga2VybmVsIG9iamVjdCwgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC5cblxuU28sIEknbSBhbHJlYWR5IGJ1aWxkaW5nIGEgbWVudGFsIG1vZGVsOiB0aGlzIGZ1bmN0aW9uIHByb2JhYmx5IGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gb2YgaW50ZWdlciBkYXRhLCBsaWtlbHkgcmVsYXRlZCB0byBrZXJuZWwgb3BlcmF0aW9ucyBvciBvYmplY3RzLCBmcm9tIHRoZSBrZXJuZWwgc3BhY2UgdG8gdGhlIHVzZXIgc3BhY2UuIFRoZSBkZXZpbCdzIGluIHRoZSBkZXRhaWxzIHRob3VnaCwgYW5kIEkgbmVlZCB0byBzZWUgd2hhdCBleGFjdGx5IGl0ICpkb2VzKi4gSSBuZWVkIHRvIHN0YXJ0IGRpZ2dpbmcgdGhyb3VnaCB0aGUgc3Vycm91bmRpbmcgY29kZS4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRvIHVuZGVyc3RhbmQgKndoeSogdGhpcyBjb252ZXJzaW9uIGlzIG5lZWRlZCwgYW5kICp3aGF0KiBraW5kIG9mIGRhdGEgaXMgYmVpbmcgaGFuZGxlZC4gV2hhdCBhcmUgdGhlIHNlY3VyaXR5IGltcGxpY2F0aW9ucz8gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIHJlbGF0ZWQgdG8gaW50ZWdlciBvdmVyZmxvdyBvciBkYXRhIGNvcnJ1cHRpb24/IEkgd2FudCB0byBzZWUgaG93IHRoaXMgZnVuY3Rpb24gaXMgKnVzZWQqIGFuZCB3aGVyZSBpdCdzICpjYWxsZWQqIGZyb20uIEknbGwgbmVlZCB0byB0cmFjZSB0aGUgZGF0YSBmbG93IHRocm91Z2ggaXQuIExldCdzIHNlZSB3aGF0IHdlJ3ZlIGdvdC4gTGV0J3Mgc3RhcnQgdGhlIGRlZXAgZGl2ZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjIzMTUsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEzVDE1OjA1OjMxLjM1NzkwOTQ0OVoiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDcxNDk5ODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicHJvY19pbnRfazJ1X2NvbnZfa29wXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9zeXNjdGwuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvc3lzY3RsLmM9NDU5PXN0YXRpYyBpbnQgZG9fcHJvY191aW50X2NvbnZfbWlubWF4KGJvb2wgKm5lZ3AsIHVsb25nICp1X3B0ciwgdWludCAqa19wdHIsXFxuLS1cXG5rZXJuZWwvc3lzY3RsLmMtNDY2LS8qKlxcbmtlcm5lbC9zeXNjdGwuYzo0Njc6ICogcHJvY19pbnRfazJ1X2NvbnZfa29wIC0gQXNzaWduIGtlcm5lbCB2YWx1ZSB0byBhIHVzZXIgc3BhY2UgcG9pbnRlclxcbmtlcm5lbC9zeXNjdGwuYy00NjgtICogQHVfcHRyOiBwb2ludGVyIHRvIHVzZXIgc3BhY2UgdmFyaWFibGVcXG4tLVxcbmtlcm5lbC9zeXNjdGwuYy00NzgtICovXFxua2VybmVsL3N5c2N0bC5jOjQ3OTppbnQgcHJvY19pbnRfazJ1X2NvbnZfa29wKHVsb25nICp1X3B0ciwgY29uc3QgaW50ICprX3B0ciwgYm9vbCAqbmVncCxcXG5rZXJuZWwvc3lzY3RsLmMtNDgwLVxcdFxcdFxcdCAgdWxvbmcgKCprX3B0cl9vcCkoY29uc3QgdWxvbmcpKVxcbi0tXFxua2VybmVsL3N5c2N0bC5jPTU3Mz1zdGF0aWMgaW50IHN5c2N0bF9rZXJuX3RvX3VzZXJfaW50X2NvbnYoYm9vbCAqbmVncCwgdWxvbmcgKnVfcHRyLCBjb25zdCBpbnQgKmtfcHRyKVxcbmtlcm5lbC9zeXNjdGwuYy01NzQte1xcbmtlcm5lbC9zeXNjdGwuYzo1NzU6XFx0cmV0dXJuIHByb2NfaW50X2sydV9jb252X2tvcCh1X3B0ciwga19wdHIsIG5lZ3AsIE5VTEwpO1xcbmtlcm5lbC9zeXNjdGwuYy01NzYtfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNTozMS40MDUwNjM5NDhaIiwiU2VxIjozOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzAyNjY0NTM4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjIzMDMyLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNTozNC40MzE3MTE0ODdaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTk4ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL3N5c2N0bC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQ3OSxcbiAgXCJMaW5lQ291bnRcIjogMTVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQ3OTpcXHRpbnQgcHJvY19pbnRfazJ1X2NvbnZfa29wKHVsb25nICp1X3B0ciwgY29uc3QgaW50ICprX3B0ciwgYm9vbCAqbmVncCxcXG4gNDgwOlxcdFxcdFxcdFxcdCAgdWxvbmcgKCprX3B0cl9vcCkoY29uc3QgdWxvbmcpKVxcbiA0ODE6XFx0e1xcbiA0ODI6XFx0XFx0aW50IHZhbCA9IFJFQURfT05DRSgqa19wdHIpO1xcbiA0ODM6XFx0XFxuIDQ4NDpcXHRcXHRpZiAodmFsIFxcdTAwM2MgMCkge1xcbiA0ODU6XFx0XFx0XFx0Km5lZ3AgPSB0cnVlO1xcbiA0ODY6XFx0XFx0XFx0KnVfcHRyID0ga19wdHJfb3AgPyAta19wdHJfb3AoKHVsb25nKXZhbCkgOiAtKHVsb25nKXZhbDtcXG4gNDg3OlxcdFxcdH0gZWxzZSB7XFxuIDQ4ODpcXHRcXHRcXHQqbmVncCA9IGZhbHNlO1xcbiA0ODk6XFx0XFx0XFx0KnVfcHRyID0ga19wdHJfb3AgPyBrX3B0cl9vcCgodWxvbmcpdmFsKSA6ICh1bG9uZykgdmFsO1xcbiA0OTA6XFx0XFx0fVxcbiA0OTE6XFx0XFx0cmV0dXJuIDA7XFxuIDQ5MjpcXHR9XFxuIDQ5MzpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDU6MzQuNDMxODEyNjQ3WiIsIlNlcSI6NDEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI5MjY5MjYyNTI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFuYWx5c2lzIG9mIFN5c2N0bCBWZWN0b3IgVXBkYXRlIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBwcmltYXJ5IGNvbmNlcm4gaXMgd2hldGhlciB0aGlzIHBhdGNoIGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIHRoYXQgY291bGQgbGVhZCB0byBpbmZvcm1hdGlvbiBsZWFrcy4gRmlyc3QsIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiBgcHJvY19pbnRfazJ1X2NvbnZfa29wYCBpcyB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBwYXRjaCDigJMgaXQgcmVhZHMgZnJvbSBgdGFibGUtXHUwMDNlZGF0YWAsIHdoaWNoIGlzIHRoZSBzeXNjdGwgdGFibGUncyBkYXRhIGFyZWEuIENydWNpYWxseSwgdGhpcyByZWFkICp3YXMqIGFscmVhZHkgcHJlc2VudCwgc28gYW55IGV4aXN0aW5nIGlzc3VlcyB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIGB0YWJsZS1cdTAwM2VkYXRhYCBhcmUgKnByZS1leGlzdGluZyogYW5kICpub3QqIGEgY29uc2VxdWVuY2Ugb2YgdGhpcyByZWZhY3RvcmluZy4gVGhlIHBhdGNoIHNpbXBseSByZXN0cnVjdHVyZXMgdGhlIGxvb3BpbmcgbG9naWMuXG5cblRoZSBrZXkgY2hhbmdlIGxpZXMgaW4gaGFuZGxpbmcgdXNlci10by1rZXJuZWwgd3JpdGVzLiBCZWZvcmUgdGhlIHBhdGNoLCB0aGUgY29kZSBpbiBgZG9fcHJvY192ZWNgIHBhcnNlZCBpbmNvbWluZyBkYXRhLCBhbmQgaWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBwYXJzaW5nIG9mIGEgKnN1YnNlcXVlbnQqIGVsZW1lbnQgaXQgY291bGQgbGVhdmUgKnBhcnQqIG9mIHRoZSBhcnJheSB1cGRhdGVkIOKAkyB0aGlzIGlzIGEgcGFydGlhbCB1cGRhdGUgdnVsbmVyYWJpbGl0eS4gVGhlIHBhdGNoIGludHJvZHVjZXMgYSBgZGF0YV9zdGFnZWAgY29weSBvZiBgdGFibGUtXHUwMDNlZGF0YWAuIFRoaXMgaXMgcHJvbWlzaW5nISBUaGUgcGF0Y2ggbm93IHdyaXRlcyB0byB0aGUgYGRhdGFfc3RhZ2VgLCBhbmQgaW1wb3J0YW50bHksIHRoZSBvcmlnaW5hbCBjb2RlICp3YXMqIHN1c2NlcHRpYmxlIHRvIHRoaXMsIGl0IHdpbGwgTk9UIGNhbGwgYGNvbW1pdF9jb252X3ZlY2Agb24gZXJyb3I7IHRoaXMgaXMgdGhlIGtleSB0byBmaXhpbmcgdGhlIHBhcnRpYWwgdXBkYXRlIGJ1Zy4gSXQgYXZvaWRzIHVwZGF0aW5nIGB0YWJsZS1cdTAwM2VkYXRhYCBpZiBhbnkgZWxlbWVudCBwYXJzZSBmYWlscy5cblxuVGhlIGludHJvZHVjdGlvbiBvZiBgZGF0YV9zdGFnZWAgdmlhIGBrbWVtZHVwYCBpcyB0aGUgYXJlYSBJIG5lZWQgdG8gc2NydXRpbml6ZS4gYGttZW1kdXBgIGFsbG9jYXRlcyBtZW1vcnksIHdoaWNoIGlzIGdvb2QuIEJ1dCBpdCAqY29waWVzKiBmcm9tIGB0YWJsZS1cdTAwM2VkYXRhYC4gSWYgYHRhYmxlLVx1MDAzZWRhdGFgIGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBga21lbWR1cGAgd2lsbCBjb3B5IHRoYXQgdG9vLiBIb3dldmVyLCBzaW5jZSB0aGUgY29weSBpcyBkb25lIHdpdGggYG1lbWNweWAsIEtNU0FOIGlzbid0IHRyaWdnZXJlZCBieSB0aGF0OyBga21lbWR1cGAgY29waWVzIGZyb20gYHRhYmxlLVx1MDAzZWRhdGFgIGludG8gYSBuZXcgYWxsb2NhdGVkIG1lbW9yeS4gQWZ0ZXIgdGhlIG1vZGlmaWNhdGlvbiBvZiBgZGF0YV9zdGFnZWAgaXMgdGhlIHBvaW50IHdoZXJlIHRoZSBgY29tbWl0X2NvbnZfdmVjYCBmdW5jdGlvbiB3aWxsIHRha2UgdGhlIHBhcnNlZCBkYXRhLCBhbmQgd3JpdGUgYmFjayBpbnRvIGB0YWJsZS1cdTAwM2VkYXRhYC4gVGhlbiwgb25seSBgaW50YCBvciBgdWxvbmdgIGVsZW1lbnRzIGFyZSBjb3BpZWQgdG8gYHRhYmxlLVx1MDAzZWRhdGFgLCBub3QgdGhlIGZ1bGwgYGRhdGFfc3RhZ2VgLiBUaGVyZWZvcmUsIGFueSB1bmluaXRpYWxpemVkIHBhZGRpbmcgaW4gYGRhdGFfc3RhZ2VgIGlzbid0IGNvcGllZCBiYWNrIHRvIHRoZSBzeXNjdGwgZGF0YS4gU2luY2UgdGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBleHBsaWNpdGx5IGRlZmluZWQgYXMgYXJyYXlzIG9mIGBpbnRgLCBgdWludGAsIG9yIGB1bG9uZ2AsIHRoZXJlJ3Mgbm8gcGFkZGluZyBiZXR3ZWVuIGVsZW1lbnRzLiBUaGVyZWZvcmUsIHRoaXMgZWxpbWluYXRlcyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSAqbGVha2luZyogYmFjayB0byBgdGFibGUtXHUwMDNlZGF0YWAuXG5cbkEgc2Vjb25kYXJ5IGNoZWNrIGlzIHdoZXRoZXIgYHRhYmxlLVx1MDAzZW1heGxlbmAgKmNvdWxkKiBiZSBhIHZlY3RvciB3aGVyZSBhIGBrbWVtZHVwYCBjb3VsZCBjYXVzZSBhbiBvdXQtb2YtYm91bmRzIHJlYWQgaWYgdGhlIGludGVuZGVkIGRhdGEuIFRoZSBgdmVjX2xlZnQgPSB0YWJsZS1cdTAwM2VtYXhsZW4gLyBkYXRhX3NpemU7YCBpcyB1c2VkLCB0aGUgbG9vcCBvbmx5IHByb2Nlc3NlcyB0aGUgY29ycmVjdCBlbGVtZW50cyBhbmQgYGNvbW1pdF9jb252X3ZlY2Agb25seSBjb3BpZXMgd2l0aGluIHRoZSBjb3JyZWN0IGJvdW5kYXJpZXMuXG5cbklmIGB0YWJsZS1cdTAwM2VtYXhsZW5gIGlzLCBieSBhbnkgbWVhbnMsIGxhcmdlciB0aGFuIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGl0IGlzIGEgYnVnIGluIHRoZSBzeXNjdGwgdGFibGUgZGVmaW5pdGlvbiwgdGhhdCBjYXVzZXMgYW4gT09CIHJlYWQgKmFueXdheSogKGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IGNvZGUpIHdoaWNoIEtBU0FOIHdvdWxkIGNhdGNoLlxuXG5Ob3csIGxldCdzIGV4cGxvcmUgYGFwcGx5X2NvbnZfb25fdmVjYC4gSWYgYHRhYmxlLVx1MDAzZW1heGxlbiBcdTAwM2M9IGRhdGFfc2l6ZWAsIHdoaWNoIGlzIGF0IG1vc3Qgb25lIGVsZW1lbnQsIGBkYXRhX3N0YWdlYCBpcyBgTlVMTGAsIGFuZCB0aGUgY29kZSAqZGlyZWN0bHkqIG1vZGlmaWVzIGB0YWJsZS1cdTAwM2VkYXRhYC4gSG93ZXZlciwgYHByb2NfdmVjX2NvbnZgIGlzIG9ubHkgY2FsbGVkICphZnRlciogYSBzdWNjZXNzZnVsIGBwcm9jX2dldF9sb25nYC4gVGhlIHNpbmdsZS1lbGVtZW50IGNhc2UgaXMgYWxyZWFkeSBzYWZlISBJZiBgcHJvY19nZXRfbG9uZ2AgZmFpbHMsIGl0IGV4aXRzIGJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uLlxuXG5BbHNvLCBgcHJvY19pbnRfY29udmAgcGVyZm9ybXMgYW4gaW50ZWdlciByYW5nZSBjaGVjayAqYmVmb3JlKiB3cml0aW5nIHRvIGAqa19wdHJgLiBUaGlzIGNvbmZpcm1zIHNhZmUgd3JpdGVzIHRvIGAqa19wdHJgLlxuXG5Ob3csIHJldmlld2luZyBLTVNBTidzIGNyaXRlcmlhOiBUaGlzIHBhdGNoIG1vZGlmaWVzIHVzZXIgdG8ga2VybmVsLiBTaW5jZSB0aGUgZGF0YSBpcyBjb3BpZWQgYW5kIGFsbCBvZiB0aGUgYm91bmRzIGFyZSB2YWxpZGF0ZWQsIHRoZXJlIGlzIG5vIHJlYWwgcmVhc29uIHRvIHVzZSBLTVNBTi4gSXQgZml4ZXMgYSBwYXJ0aWFsIHVwZGF0ZSBpc3N1ZSwgd2hpY2ggYXZvaWRzIGluZm9ybWF0aW9uIGxlYWsuIFRoZXJlIGFyZSBubyBrZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgdGhhdCBhcmUgbm90IGluaXRpYWxpemVkLiBUaGVyZSdzIG5vIGNvbmRpdGlvbmFsIGxvZ2ljIGRlcGVuZGluZyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgYW5kIHRoZSBzdHJ1Y3R1cmVzIGFyZSB3ZWxsLWRlZmluZWQuIFRoZSBga21lbWR1cGAgb25seSBkdXBsaWNhdGVzIHRoZSBpbnRlbmRlZCBkYXRhOyBJdCBhdm9pZHMgaW5mb3JtYXRpb24gbGVha3MuIEtNU0FOIGlzIG5vdCBuZWNlc3NhcnksIGFzIHRoaXMgaXMgYSBmdW5jdGlvbmFsIGltcHJvdmVtZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMzMyNSwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5NTYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNjowMy43MDEwNzcyNDNaIiwiU2VxIjo0MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMyMjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9zeXNjdGwuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA2NzAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2NzA6XFx0c3RhdGljIGludCBhcHBseV9jb252X29uX3ZlYyhjb25zdCB1bmlvbiBwcm9jX3ZlY19jb252IGNvbnYsXFxuIDY3MTpcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLFxcbiA2NzI6XFx0XFx0XFx0XFx0ICAgICBjb25zdCBlbnVtIHByb2NfdmVjX3R5cGUgZGF0YV90eXBlLFxcbiA2NzM6XFx0XFx0XFx0XFx0ICAgICBjb25zdCBzaXplX3QgZGF0YV9zaXplLCBjb25zdCBpbnQgY29udl9kaXIsXFxuIDY3NDpcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHNpemVfdCBidWZfbmJ5dGUsIHZvaWQgKmJ1ZixcXG4gNjc1OlxcdFxcdFxcdFxcdCAgICAgc2l6ZV90ICpidWZfbGVmdF9maW5hbClcXG4gNjc2OlxcdHtcXG4gNjc3OlxcdFxcdGludCB2ZWNfbGVmdCwgZXJyID0gMDtcXG4gNjc4OlxcdFxcdHNpemVfdCBidWZfbGVmdCwgbnJfY29udiA9IDA7XFxuIDY3OTpcXHRcXHRjaGFyICpkYXRhLCAqZGF0YV9zdGFnZSA9IE5VTEwsICpwO1xcbiA2ODA6XFx0XFx0Ym9vbCBpc191bnNpZ25lZCA9IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VSU5UIHx8IGRhdGFfdHlwZSA9PSBQUk9DX1ZFQ19VTE9ORztcXG4gNjgxOlxcdFxcbiA2ODI6XFx0XFx0YnVmX2xlZnQgPSBidWZfbmJ5dGU7XFxuIDY4MzpcXHRcXG4gNjg0OlxcdFxcdGRhdGEgPSB0YWJsZS1cXHUwMDNlZGF0YTtcXG4gNjg1OlxcdFxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xcbiA2ODY6XFx0XFx0XFx0aWYgKGJ1Zl9sZWZ0IFxcdTAwM2UgUEFHRV9TSVpFIC0gMSlcXG4gNjg3OlxcdFxcdFxcdFxcdGJ1Zl9sZWZ0ID0gUEFHRV9TSVpFIC0gMTtcXG4gNjg4OlxcdFxcdFxcdHAgPSBidWY7XFxuIDY4OTpcXHRcXG4gNjkwOlxcdFxcdFxcdGlmICh0YWJsZS1cXHUwMDNlbWF4bGVuIFxcdTAwM2UgZGF0YV9zaXplKSB7XFxuIDY5MTpcXHRcXHRcXHRcXHRkYXRhX3N0YWdlID0ga21lbWR1cCh0YWJsZS1cXHUwMDNlZGF0YSwgdGFibGUtXFx1MDAzZW1heGxlbiwgR0ZQX0tFUk5FTCk7XFxuIDY5MjpcXHRcXHRcXHRcXHRpZiAoIWRhdGFfc3RhZ2UpIHtcXG4gNjkzOlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuIDY5NDpcXHRcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gNjk1OlxcdFxcdFxcdFxcdH1cXG4gNjk2OlxcdFxcdFxcdFxcdGRhdGEgPSBkYXRhX3N0YWdlO1xcbiA2OTc6XFx0XFx0XFx0fVxcbiA2OTg6XFx0XFx0fVxcbiA2OTk6XFx0XFxuIDcwMDpcXHRcXHR2ZWNfbGVmdCA9IHRhYmxlLVxcdTAwM2VtYXhsZW4gLyBkYXRhX3NpemU7XFxuIDcwMTpcXHRcXHRmb3IgKDsgYnVmX2xlZnQgXFx1MDAyNlxcdTAwMjYgdmVjX2xlZnQtLTsgZGF0YSArPSBkYXRhX3NpemUsIG5yX2NvbnYrKykge1xcbiA3MDI6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBsdmFsO1xcbiA3MDM6XFx0XFx0XFx0Ym9vbCBuZWcgPSBmYWxzZTtcXG4gNzA0OlxcdFxcbiA3MDU6XFx0XFx0XFx0aWYgKFNZU0NUTF9VU0VSX1RPX0tFUk4oY29udl9kaXIpKSB7XFxuIDcwNjpcXHRcXHRcXHRcXHRwcm9jX3NraXBfc3BhY2VzKFxcdTAwMjZwLCBcXHUwMDI2YnVmX2xlZnQpO1xcbiA3MDc6XFx0XFxuIDcwODpcXHRcXHRcXHRcXHRpZiAoIWJ1Zl9sZWZ0KVxcbiA3MDk6XFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDcxMDpcXHRcXHRcXHRcXHRlcnIgPSBwcm9jX2dldF9sb25nKFxcdTAwMjZwLCBcXHUwMDI2YnVmX2xlZnQsIFxcdTAwMjZsdmFsLCBcXHUwMDI2bmVnLFxcbiA3MTE6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHByb2Nfd3NwYWNlX3NlcCxcXG4gNzEyOlxcdFxcdFxcdFxcdFxcdFxcdCAgICBzaXplb2YocHJvY193c3BhY2Vfc2VwKSwgTlVMTCk7XFxuIDcxMzpcXHRcXHRcXHRcXHRpZiAoIWVyciBcXHUwMDI2XFx1MDAyNiBuZWcgXFx1MDAyNlxcdTAwMjYgaXNfdW5zaWduZWQpXFxuIDcxNDpcXHRcXHRcXHRcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbiA3MTU6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gNzE2OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA3MTc6XFx0XFx0XFx0XFx0aWYgKHByb2NfdmVjX2NvbnYoZGF0YV90eXBlLCBjb252LCBcXHUwMDI2bmVnLCBcXHUwMDI2bHZhbCwgZGF0YSwgY29udl9kaXIsIHRhYmxlKSkge1xcbiA3MTg6XFx0XFx0XFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4gNzE5OlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA3MjA6XFx0XFx0XFx0XFx0fVxcbiA3MjE6XFx0XFx0XFx0fSBlbHNlIHtcXG4gNzIyOlxcdFxcdFxcdFxcdGlmIChwcm9jX3ZlY19jb252KGRhdGFfdHlwZSwgY29udiwgXFx1MDAyNm5lZywgXFx1MDAyNmx2YWwsIGRhdGEsIGNvbnZfZGlyLCB0YWJsZSkpIHtcXG4gNzIzOlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FSU5WQUw7XFxuIDcyNDpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gNzI1OlxcdFxcdFxcdFxcdH1cXG4gNzI2OlxcdFxcdFxcdFxcdGlmIChucl9jb252KVxcbiA3Mjc6XFx0XFx0XFx0XFx0XFx0cHJvY19wdXRfY2hhcihcXHUwMDI2YnVmLCBcXHUwMDI2YnVmX2xlZnQsICdcXFxcdCcpO1xcbiA3Mjg6XFx0XFx0XFx0XFx0cHJvY19wdXRfbG9uZyhcXHUwMDI2YnVmLCBcXHUwMDI2YnVmX2xlZnQsIGx2YWwsIG5lZyk7XFxuIDcyOTpcXHRcXHRcXHR9XFxuIDczMDpcXHRcXHR9XFxuIDczMTpcXHRcXG4gNzMyOlxcdFxcdGlmIChTWVNDVExfVVNFUl9UT19LRVJOKGNvbnZfZGlyKSkge1xcbiA3MzM6XFx0XFx0XFx0aWYgKCFlcnIgXFx1MDAyNlxcdTAwMjYgYnVmX2xlZnQpXFxuIDczNDpcXHRcXHRcXHRcXHRwcm9jX3NraXBfc3BhY2VzKFxcdTAwMjZwLCBcXHUwMDI2YnVmX2xlZnQpO1xcbiA3MzU6XFx0XFx0XFx0aWYgKCFucl9jb252KSB7XFxuIDczNjpcXHRcXHRcXHRcXHRlcnIgPSBlcnIgPyA6IC1FSU5WQUw7XFxuIDczNzpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gNzM4OlxcdFxcdFxcdH1cXG4gNzM5OlxcdFxcdFxcdGlmICghZXJyIFxcdTAwMjZcXHUwMDI2IGRhdGFfc3RhZ2UpXFxuIDc0MDpcXHRcXHRcXHRcXHRlcnIgPSBjb21taXRfY29udl92ZWMoZGF0YV90eXBlLCB0YWJsZS1cXHUwMDNlZGF0YSwgZGF0YV9zdGFnZSwgbnJfY29udik7XFxuIDc0MTpcXHRcXHR9IGVsc2Uge1xcbiA3NDI6XFx0XFx0XFx0aWYgKG5yX2NvbnYgXFx1MDAyNlxcdTAwMjYgYnVmX2xlZnQgXFx1MDAyNlxcdTAwMjYgIWVycilcXG4gNzQzOlxcdFxcdFxcdFxcdHByb2NfcHV0X2NoYXIoXFx1MDAyNmJ1ZiwgXFx1MDAyNmJ1Zl9sZWZ0LCAnXFxcXG4nKTtcXG4gNzQ0OlxcdFxcdH1cXG4gNzQ1OlxcdFxcbiA3NDY6XFx0XFx0KmJ1Zl9sZWZ0X2ZpbmFsID0gYnVmX2xlZnQ7XFxuIDc0NzpcXHRcXG4gNzQ4OlxcdG91dDpcXG4gNzQ5OlxcdFxcdGtmcmVlKGRhdGFfc3RhZ2UpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xM1QxNTowNjowMy43MDEyMTA3NTNaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTU0NzcwMTc2NDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBTeXNjdGwgQXJyYXkgUGFyc2luZyBSZWZhY3RvcioqXG5cbk9rYXksIGxldCBtZSBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJJ20gZXhhbWluaW5nIHRoaXMgcmVmYWN0b3IgZm9yIHN5c2N0bCBhcnJheSBwYXJzaW5nLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyBhbmQgY29ycmVjdG5lc3MuIFRoZSBnb2FsIGhlcmUgc2VlbXMgdG8gYmUgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMsIHdoaWNoIGlzIGEgZ29vZCB0aGluZy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgaW50cm9kdWNlIGFueSByZWdyZXNzaW9ucyBvciBzZWN1cml0eSBob2xlcy5cblxuSSBzdGFydGVkIGJ5IHRyYWNpbmcgdGhlIGVycm9yIGhhbmRsaW5nLiBJZiBJIGdldCBgLUVOT01FTWAsIHRoZW4gYGJ1Zl9sZWZ0X2ZpbmFsYCAqaXNuJ3QqIHVwZGF0ZWQsIGFuZCBjb25zZXF1ZW50bHksIGBsZWZ0X25ieXRlYCByZW1haW5zIGF0IGBTSVpFX01BWGAuIFRoZW4sIGluIGBwcm9jX3ZlY2AsIHRoZSBjaGVjayBmb3IgYFNJWkVfTUFYYCBjb3JyZWN0bHkgcmV0dXJucyB0aGUgZXJyb3IgYW5kICpkb2Vzbid0KiBtb2RpZnkgYGxlbnBgLiBUaGlzIGJlaGF2aW9yIGlzIGFzIGV4cGVjdGVkIGFuZCBwcmV2ZW50cyBhbnkgaXNzdWVzIHdpdGggaW5jb21wbGV0ZSB1cGRhdGVzIGluIHRoZSBldmVudCBvZiBtZW1vcnkgZXhoYXVzdGlvbiwgd2hpY2ggaXMgZ29vZC5cblxuSSBhbHNvIGNoZWNrZWQgd2hhdCBoYXBwZW5zIHdoZW4gYCFucl9jb252YC4gSWYgbm8gY29udmVyc2lvbnMgb2NjdXIsIGl0IGNvcnJlY3RseSBnb2VzIHRvIGBvdXRgLCBgYnVmX2xlZnRfZmluYWxgIGlzbid0IHVwZGF0ZWQsIGBsZWZ0X25ieXRlYCBzdGF5cyBgU0laRV9NQVhgLCBhbmQgdGhlIGNvcnJlY3QgZXJyb3IgaXMgcmV0dXJuZWQuIFRoaXMgaXMgYWxzbyBmaW5lLCBhbmQgZXhwZWN0ZWQuXG5cbk5vdywgYSBzbGlnaHRseSBtb3JlIHRyaWNreSBjYXNlOiBpZiBgU1lTQ1RMX0tFUk5fVE9fVVNFUmAgYW5kIGAhbnJfY29udmAuIEhlcmUsIGBidWZfbGVmdF9maW5hbGAgKmlzKiB1cGRhdGVkIHRvIGBidWZfbGVmdGAsIGFuZCBgbGVmdF9uYnl0ZWAgdGhlbiBiZWNvbWVzIGBidWZfbmJ5dGVgLiBUaGlzIG1lYW5zIHplcm8gYnl0ZXMgd2VyZSB3cml0dGVuLCB3aGljaCBpcyB0aGUgY29ycmVjdCBvdXRjb21lLiBUaGlzIGNhc2UgZG9lc24ndCByZXByZXNlbnQgYSB2dWxuZXJhYmlsaXR5LlxuXG5JIHRob3VnaHQgYWJvdXQgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLiBBZnRlciBnb2luZyB0aHJvdWdoIHRoZSBsb2dpYywgSSBkb24ndCBzZWUgYW55dGhpbmcgdGhhdCBqdW1wcyBvdXQuIFRoZSBjb3JlIGlkZWEgb2YgdXNpbmcgYGttZW1kdXBgIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBidWZmZXIsIGRvaW5nIHRoZSBwYXJzaW5nIHRoZXJlLCBhbmQgdGhlbiBjb3B5aW5nIHRoZSByZXN1bHQgYmFjayB0byB0aGUgb3JpZ2luYWwgYnVmZmVyIGlzIHNvdW5kLiBUaGVyZSBhcmVuJ3QgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCBwYWRkaW5nLCBzbyBubyBwb3RlbnRpYWwgaW5mbyBsZWFrcyBoZXJlLiBBbmQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIHVzZWQgaW4gYnJhbmNoaW5nLiBBbnkgcG90ZW50aWFsIE9PQiBpc3N1ZXMgb3IgbWVtb3J5IGxlYWtzIHdvdWxkIGxpa2VseSBiZSBmbGFnZ2VkIGJ5IEtBU0FOLlxuXG5JIHF1aWNrbHkgZG91YmxlLWNoZWNrZWQgdGhlIGBwcm9jX2RvdWludHZlY19jb252YCBmdW5jdGlvbi4gVGhlIGNvZGUgZXhwbGljaXRseSBjaGVja3MgYHRhYmxlLVx1MDAzZW1heGxlbmAgdG8gZW5zdXJlIGl0J3MgZWl0aGVyIGAwYCBvciBleGFjdGx5IGBzaXplb2YodWludClgLiBUaGlzIG1lYW5zIGBQUk9DX1ZFQ19VSU5UYCBpcyBvbmx5IHVzZWQgZm9yIHNpbmdsZSBlbGVtZW50cy4gVGhpcyBleHBsYWlucyB3aHkgYFBST0NfVkVDX1VJTlRgIGlzIG5vdCBoYW5kbGVkIGluIGBjb21taXRfY29udl92ZWNgLiBCZWNhdXNlIGZvciBzaW5nbGUgZWxlbWVudHMsIGB0YWJsZS1cdTAwM2VtYXhsZW4gXHUwMDNjPSBkYXRhX3NpemVgIChzaW5jZSBgZGF0YV9zaXplYCBpcyBgc2l6ZW9mKHVpbnQpYCksIHNvIGBkYXRhX3N0YWdlYCBpcyBub3QgYWxsb2NhdGVkLCBhbmQgYGNvbW1pdF9jb252X3ZlY2AgaXMgbm90IGNhbGxlZC4gVGhpcyBhbHNvIHNlZW1zIHBlcmZlY3RseSBzYWZlLlxuXG5HaXZlbiBhbGwgb2YgdGhpcywgYW5kIGNvbnNpZGVyaW5nIHRoYXQgdGhlIHBhdGNoIGRvZXNuJ3QgY2hhbmdlIHRoZSByZWFkIHBhdGggKGtlcm5lbCB0byB1c2VyKSBpbiBhbnkgbWVhbmluZ2Z1bCB3YXksIEkgdGhpbmsgSSdtIGNvbWZvcnRhYmxlIHNldHRpbmcgYE5lZWRzS01TQU49ZmFsc2VgLiBUaGUgcmVmYWN0b3IgdXRpbGl6ZXMgYSB0ZW1wb3JhcnkgYnVmZmVyIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzLCBhbmQgZXhpc3RpbmcgbWVtb3J5IHRvb2xzIHNob3VsZCBjYXRjaCBhbnkgcG90ZW50aWFsIHByb2JsZW1zLiBUaGlzIGNoYW5nZSBpcyBzb2xpZC5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg0ODIsIk91dHB1dFRva2VucyI6MTYxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODMyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTNUMTU6MDY6MTkuMTc4MjM0OTMyWiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUwMzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgc3lzY3RsIGFycmF5IHBhcnNpbmcgdG8gcHJldmVudCBwYXJ0aWFsIHVwZGF0ZXMgYnkgdXNpbmcgYSB0ZW1wb3JhcnkgYnVmZmVyIChga21lbWR1cGApIHdoZW4gd3JpdGluZyBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsIHNwYWNlLiBUaGUgc3lzY3RsIHZlY3RvcnMgYXJlIHNpbXBsZSBhcnJheXMgb2YgaW50ZWdlcnMgb3IgdW5zaWduZWQgbG9uZ3Mgd2l0aG91dCBwYWRkaW5nLiBUaGUgcmVhZCBwYXRoIChrZXJuZWwgdG8gdXNlcikgaXMgdW5jaGFuZ2VkLCBzbyBubyBuZXcgaW5mby1sZWFrcyBhcmUgaW50cm9kdWNlZC4gVGhlIHRlbXBvcmFyeSBidWZmZXIgaXMgb25seSB1c2VkIGZvciB3cml0aW5nIHRvIGtlcm5lbCBzcGFjZSwgYW5kIG9ubHkgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBlbGVtZW50cyBhcmUgY29waWVkIGJhY2suIEFueSBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIGludHJvZHVjZWQgYnkgdGhpcyByZWZhY3RvcmluZyB3b3VsZCBiZSBjYXVnaHQgYnkgS0FTQU4gb3Igc3RhbmRhcmQgbWVtb3J5IGxlYWsgZGV0ZWN0b3JzLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgb3IgaW5mby1sZWFrcyB0aGF0IHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHN5c2N0bCBhcnJheSBwYXJzaW5nIHRvIHByZXZlbnQgcGFydGlhbCB1cGRhdGVzIGJ5IHVzaW5nIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoYGttZW1kdXBgKSB3aGVuIHdyaXRpbmcgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gVGhlIHN5c2N0bCB2ZWN0b3JzIGFyZSBzaW1wbGUgYXJyYXlzIG9mIGludGVnZXJzIG9yIHVuc2lnbmVkIGxvbmdzIHdpdGhvdXQgcGFkZGluZy4gVGhlIHJlYWQgcGF0aCAoa2VybmVsIHRvIHVzZXIpIGlzIHVuY2hhbmdlZCwgc28gbm8gbmV3IGluZm8tbGVha3MgYXJlIGludHJvZHVjZWQuIFRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG9ubHkgdXNlZCBmb3Igd3JpdGluZyB0byBrZXJuZWwgc3BhY2UsIGFuZCBvbmx5IHN1Y2Nlc3NmdWxseSBwYXJzZWQgZWxlbWVudHMgYXJlIGNvcGllZCBiYWNrLiBBbnkgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcmVmYWN0b3Jpbmcgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIG1lbW9yeSBsZWFrIGRldGVjdG9ycy4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCByZXF1aXJlIEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowbgtzw[1] Phase: Succeeded StartedAt: 2026-08-13 15:06:44 +0000 UTC FinishedAt: 2026-08-13 15:06:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-13 15:06:44 +0000 UTC FinishedAt: 2026-08-13 15:06:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2] Phase: Succeeded StartedAt: 2026-08-13 15:06:44 +0000 UTC FinishedAt: 2026-08-13 18:52:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-13 15:06:44 +0000 UTC FinishedAt: 2026-08-13 18:52:38 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-13 15:06:44 +0000 UTC FinishedAt: 2026-08-13 15:06:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-13 15:06:44 +0000 UTC FinishedAt: 2026-08-13 15:06:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},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-workflowbgtzw/series-workflowbgtzw-convert-artifact-255799960/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-13 15:06:54 +0000 UTC FinishedAt: 2026-08-13 15:28:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-13 15:06:54 +0000 UTC FinishedAt: 2026-08-13 15:28:49 +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:*1c091f92-b28d-472f-8177-fd26c9cb2a38,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-workflowbgtzw/series-workflowbgtzw-convert-artifact-255799960/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": "60f97d04-2cfd-492c-89fd-e82d13ca6f6d", "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-workflowbgtzw/series-workflowbgtzw-build-action-1835954126/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-13 15:06:54 +0000 UTC FinishedAt: 2026-08-13 15:28:39 +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:*1c091f92-b28d-472f-8177-fd26c9cb2a38,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-workflowbgtzw/series-workflowbgtzw-convert-artifact-255799960/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": "60f97d04-2cfd-492c-89fd-e82d13ca6f6d", "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-workflowbgtzw/series-workflowbgtzw-build-action-1835954126/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-13 15:28:49 +0000 UTC FinishedAt: 2026-08-13 15:28:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-13 15:28:49 +0000 UTC FinishedAt: 2026-08-13 15:28:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-13 15:28:49 +0000 UTC FinishedAt: 2026-08-13 15:28:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-13 15:28:49 +0000 UTC FinishedAt: 2026-08-13 15:28:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},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-workflowbgtzw/series-workflowbgtzw-convert-artifact-4026319615/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-13 15:28:59 +0000 UTC FinishedAt: 2026-08-13 15:30:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-13 15:28:59 +0000 UTC FinishedAt: 2026-08-13 15:30:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*60f97d04-2cfd-492c-89fd-e82d13ca6f6d,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-workflowbgtzw/series-workflowbgtzw-build-action-1835954126/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-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-13 15:30:58 +0000 UTC FinishedAt: 2026-08-13 15:30:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-13 15:30:58 +0000 UTC FinishedAt: 2026-08-13 15:30:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-13 15:30:58 +0000 UTC FinishedAt: 2026-08-13 15:48:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-13 15:30:58 +0000 UTC FinishedAt: 2026-08-13 15:48:03 +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:*1c091f92-b28d-472f-8177-fd26c9cb2a38,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-workflowbgtzw/series-workflowbgtzw-convert-artifact-4026319615/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": "650a10b5-7940-4475-bd25-c3c918ee5bc1", "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-workflowbgtzw/series-workflowbgtzw-build-action-1276086547/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-13 15:30:58 +0000 UTC FinishedAt: 2026-08-13 15:47:53 +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:*1c091f92-b28d-472f-8177-fd26c9cb2a38,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-workflowbgtzw/series-workflowbgtzw-convert-artifact-4026319615/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": "650a10b5-7940-4475-bd25-c3c918ee5bc1", "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-workflowbgtzw/series-workflowbgtzw-build-action-1276086547/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-13 15:48:03 +0000 UTC FinishedAt: 2026-08-13 15:48:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-13 15:48:03 +0000 UTC FinishedAt: 2026-08-13 15:48:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-13 15:48:03 +0000 UTC FinishedAt: 2026-08-13 15:50:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-13 15:48:03 +0000 UTC FinishedAt: 2026-08-13 15:49:52 +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:*650a10b5-7940-4475-bd25-c3c918ee5bc1,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-workflowbgtzw/series-workflowbgtzw-build-action-1276086547/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-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-13 15:50:01 +0000 UTC FinishedAt: 2026-08-13 18:52:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-13 15:50:01 +0000 UTC FinishedAt: 2026-08-13 18:52:38 +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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"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:*60f97d04-2cfd-492c-89fd-e82d13ca6f6d,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*650a10b5-7940-4475-bd25-c3c918ee5bc1,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-workflowbgtzw/series-workflowbgtzw-build-action-1835954126/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-workflowbgtzw/series-workflowbgtzw-build-action-1276086547/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-13 15:50:01 +0000 UTC FinishedAt: 2026-08-13 15:50:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-13 15:50:01 +0000 UTC FinishedAt: 2026-08-13 15:50:06 +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","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"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-workflowbgtzw/series-workflowbgtzw-convert-artifact-3729959320/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-13 15:50:01 +0000 UTC FinishedAt: 2026-08-13 15:50:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-13 15:50:01 +0000 UTC FinishedAt: 2026-08-13 15:50:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-13 15:50:01 +0000 UTC FinishedAt: 2026-08-13 15:50:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-13 15:50:11 +0000 UTC FinishedAt: 2026-08-13 18:52:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbgtzw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":null,"focus_symbols":["proc_dointvec","proc_douintvec","proc_dointvec_minmax","proc_douintvec_minmax","proc_doulongvec_minmax","proc_dou8vec_minmax"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"28d012efb4327f9c75d5e042a7c91e9a542efa98","config_name":"upstream-apparmor-kasan.config","series_id":"3fd812d8-e66c-424d-804d-73b33814d86b","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-13 15:50:11 +0000 UTC FinishedAt: 2026-08-13 18:52:28 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*60f97d04-2cfd-492c-89fd-e82d13ca6f6d,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*650a10b5-7940-4475-bd25-c3c918ee5bc1,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-workflowbgtzw/series-workflowbgtzw-build-action-1835954126/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-workflowbgtzw/series-workflowbgtzw-build-action-1276086547/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-workflowbgtzw/series-workflowbgtzw-convert-artifact-3729959320/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,}