Name: series-workflowzdqdq Phase: Succeeded StartedAt: 2026-07-07 03:13:02 +0000 UTC FinishedAt: 2026-07-07 07:56:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[0] Phase: Succeeded StartedAt: 2026-07-07 03:13:02 +0000 UTC FinishedAt: 2026-07-07 03:40:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[0].run-triage Phase: Succeeded StartedAt: 2026-07-07 03:13:02 +0000 UTC FinishedAt: 2026-07-07 03:40:51 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "8cdeaa50eae8dad34885515f62559ee83e7e8dda", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "IO_URING", "NET" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "8cdeaa50eae8dad34885515f62559ee83e7e8dda", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "IO_URING", "NET" ], "series_id": "468dd25d-90fc-4f9c-bfd8-20ef558367b9" }, "track": "KASAN", "fuzz": { "focus": [ "io_uring" ], "focus_symbols": [ "io_ring_buffers_peek", "io_buffers_select", "io_send_select_buffer", "io_recv_buf_select" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+OG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lPX1VSSU5HJiMzNDssCiAgICAmIzM0O05FVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2lvX3JpbmdfYnVmZmVyc19wZWVrJiMzNDssCiAgICAmIzM0O2lvX2J1ZmZlcnNfc2VsZWN0JiMzNDssCiAgICAmIzM0O2lvX3NlbmRfc2VsZWN0X2J1ZmZlciYjMzQ7LAogICAgJiMzNDtpb19yZWN2X2J1Zl9zZWxlY3QmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW92ZXMgYGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKWAgdG8gdGhlIGVuZCBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBJZiBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgdGhpcyB1bmNvbmRpdGlvbmFsbHkgZnJlZXMgYGFyZy1cdTAwM2Vpb3ZzYCBiZWZvcmUgcmV0dXJuaW5nLiBIb3dldmVyLCBgYXJnLVx1MDAzZWlvdnNgIGlzIGVpdGhlciB0aGUgbmV3bHkgYWxsb2NhdGVkIGFycmF5IChpZiBleHBhbmRlZCkgb3IgdGhlIG9yaWdpbmFsIGFycmF5LCBhbmQgaW4gYm90aCBjYXNlcywgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciAoYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgb3IgYGlvX3JlY3ZfYnVmX3NlbGVjdGApIHdoaWNoIHRoZW4gdXNlcyBpdC4gVGhpcyBpbnRyb2R1Y2VzIGEgMTAwJSByZXByb2R1Y2libGUgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0eSB3aGVuIHVzaW5nIHByb3ZpZGVkIGJ1ZmZlcnMgd2l0aCBgaW9fc2VuZGAgb3IgYGlvX3JlY3ZgIGFuZCBwcmUtYWxsb2NhdGVkIGlvdmVjcy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDcxYmVjNjE5MWE3YTdhNWM1ZDMwMWU2MWMzMDcxZTQ3NTJlY2UwOWRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEp1bCA3IDAzOjMxOjQ3IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2lvX3VyaW5nL2tidWYuYyBiL2lvX3VyaW5nL2tidWYuY1xuaW5kZXggM2NkMjk0NzdmZmYyZDMuLmI2Yjk2OWI1NWUxMjI0IDEwMDY0NFxuLS0tIGEvaW9fdXJpbmcva2J1Zi5jXG4mIzQzOyYjNDM7JiM0MzsgYi9pb191cmluZy9rYnVmLmNcbkBAIC0yODcsOCAmIzQzOzI4Nyw2IEBAIHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuIFx0XHRpb3YgPSBrbWFsbG9jX29ianMoc3RydWN0IGlvdmVjLCBucl9hdmFpbCk7XG4gXHRcdGlmICh1bmxpa2VseSghaW92KSlcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbi1cdFx0aWYgKGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRlJFRSlcbi1cdFx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG4gXHRcdGFyZy1cdTAwM2Vpb3ZzID0gaW92O1xuIFx0XHRucl9pb3ZzID0gbnJfYXZhaWw7XG4gXHR9IGVsc2UgaWYgKG5yX2F2YWlsIFx1MDAzYyBucl9pb3ZzKSB7XG5AQCAtMzMwLDYgJiM0MzszMjgsOSBAQCBzdGF0aWMgaW50IGlvX3JpbmdfYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcbiBcdFx0YnVmID0gaW9fcmluZ19oZWFkX3RvX2J1ZihiciwgJiM0MzsmIzQzO2hlYWQsIGJsLVx1MDAzZW1hc2spO1xuIFx0fSB3aGlsZSAoLS1ucl9pb3ZzKTtcbiBcbiYjNDM7XHRpZiAoYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxuJiM0MztcdFx0a2ZyZWUoYXJnLVx1MDAzZWlvdnMpO1xuJiM0MztcbiBcdGlmIChoZWFkID09IHRhaWwpXG4gXHRcdHJlcS1cdTAwM2VmbGFncyB8PSBSRVFfRl9CTF9FTVBUWTtcbiBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT44bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtJT19VUklORyYjMzQ7LAogICAgJiMzNDtORVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpb19yaW5nX2J1ZmZlcnNfcGVlayYjMzQ7LAogICAgJiMzNDtpb19idWZmZXJzX3NlbGVjdCYjMzQ7LAogICAgJiMzNDtpb19zZW5kX3NlbGVjdF9idWZmZXImIzM0OywKICAgICYjMzQ7aW9fcmVjdl9idWZfc2VsZWN0JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vdmVzIGBrZnJlZShhcmctXHUwMDNlaW92cylgIHRvIHRoZSBlbmQgb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC4gSWYgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQsIHRoaXMgdW5jb25kaXRpb25hbGx5IGZyZWVzIGBhcmctXHUwMDNlaW92c2AgYmVmb3JlIHJldHVybmluZy4gSG93ZXZlciwgYGFyZy1cdTAwM2Vpb3ZzYCBpcyBlaXRoZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCBhcnJheSAoaWYgZXhwYW5kZWQpIG9yIHRoZSBvcmlnaW5hbCBhcnJheSwgYW5kIGluIGJvdGggY2FzZXMsIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIG9yIGBpb19yZWN2X2J1Zl9zZWxlY3RgKSB3aGljaCB0aGVuIHVzZXMgaXQuIFRoaXMgaW50cm9kdWNlcyBhIDEwMCUgcmVwcm9kdWNpYmxlIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkgd2hlbiB1c2luZyBwcm92aWRlZCBidWZmZXJzIHdpdGggYGlvX3NlbmRgIG9yIGBpb19yZWN2YCBhbmQgcHJlLWFsbG9jYXRlZCBpb3ZlY3MuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDcxYmVjNjE5MWE3YTdhNWM1ZDMwMWU2MWMzMDcxZTQ3NTJlY2UwOWQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEp1bCA3IDAzOjMxOjQ3IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW9fdXJpbmcva2J1Zi5jIGIvaW9fdXJpbmcva2J1Zi5jCmluZGV4IDNjZDI5NDc3ZmZmMmQzLi5iNmI5NjliNTVlMTIyNCAxMDA2NDQKLS0tIGEvaW9fdXJpbmcva2J1Zi5jCiYjNDM7JiM0MzsmIzQzOyBiL2lvX3VyaW5nL2tidWYuYwpAQCAtMjg3LDggJiM0MzsyODcsNiBAQCBzdGF0aWMgaW50IGlvX3JpbmdfYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZywKIAkJaW92ID0ga21hbGxvY19vYmpzKHN0cnVjdCBpb3ZlYywgbnJfYXZhaWwpOwogCQlpZiAodW5saWtlbHkoIWlvdikpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJaWYgKGFyZy0mZ3Q7bW9kZSAmYW1wOyBLQlVGX01PREVfRlJFRSkKLQkJCWtmcmVlKGFyZy0mZ3Q7aW92cyk7CiAJCWFyZy0mZ3Q7aW92cyA9IGlvdjsKIAkJbnJfaW92cyA9IG5yX2F2YWlsOwogCX0gZWxzZSBpZiAobnJfYXZhaWwgJmx0OyBucl9pb3ZzKSB7CkBAIC0zMzAsNiAmIzQzOzMyOCw5IEBAIHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLAogCQlidWYgPSBpb19yaW5nX2hlYWRfdG9fYnVmKGJyLCAmIzQzOyYjNDM7aGVhZCwgYmwtJmd0O21hc2spOwogCX0gd2hpbGUgKC0tbnJfaW92cyk7CiAKJiM0MzsJaWYgKGFyZy0mZ3Q7bW9kZSAmYW1wOyBLQlVGX01PREVfRlJFRSkKJiM0MzsJCWtmcmVlKGFyZy0mZ3Q7aW92cyk7CiYjNDM7CiAJaWYgKGhlYWQgPT0gdGFpbCkKIAkJcmVxLSZndDtmbGFncyB8PSBSRVFfRl9CTF9FTVBUWTsKIAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTkwCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uCgoqKkFuYWx5emluZyBhIEtlcm5lbCBQYXRjaCBpbiBpb191cmluZy9rYnVmLmMqKgoKQWxyaWdodCwgSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBpb191cmluZy9rYnVmLmNgLiBJdCYjMzk7cyBhIGZhaXJseSBzcGVjaWZpYyBvbmUsIGNvbmNlcm5pbmcgaG93IG1lbW9yeSBpcyBoYW5kbGVkIGluIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuIFRoZSBjaGFuZ2UgaXMgYWJvdXQgKndoZW4qIHdlIGNhbGwgYGtmcmVlKGFyZy0mZ3Q7aW92cylgLiBBcHBhcmVudGx5LCBpdCYjMzk7cyBiZWluZyBtb3ZlZCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiB3aXRoaW4gdGhhdCBmdW5jdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5LiBTbywgSSYjMzk7bSBnb2luZyB0byBkaXZlIHJpZ2h0IGludG8gdGhlIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgZnVuY3Rpb24gaXRzZWxmIHRvIHNlZSB3aGF0JiMzOTtzIGhhcHBlbmluZyBhbmQgZmlndXJlIG91dCB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIHNoaWZ0LiBJJiMzOTtsbCBuZWVkIHRvIGFuYWx5emUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgdG8gZGV0ZXJtaW5lIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBjaGFuZ2UgYW5kIHdoZXRoZXIgaXQgYWRkcmVzc2VzIGEgcG90ZW50aWFsIGJ1ZywgaW1wcm92ZXMgcGVyZm9ybWFuY2UsIG9yIHBlcmhhcHMgYWxpZ25zIHdpdGggc29tZSBvdGhlciBkZXNpZ24gcHJpbmNpcGxlLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgcmVhbGx5IGdvaW5nIG9uIGluIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lvX3JpbmdfYnVmZmVyc19wZWVrJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL2tidWYuYz0yMzA9c3RydWN0IGlvX2JyX3NlbCBpb19idWZmZXJfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzaXplX3QgKmxlbixcbi0tXG5pb191cmluZy9rYnVmLmMtMjUyLVxuaW9fdXJpbmcva2J1Zi5jOjI1MzpzdGF0aWMgaW50IGlvX3JpbmdfYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcbmlvX3VyaW5nL2tidWYuYy0yNTQtXHRcdFx0XHRzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsKVxuLS1cbmlvX3VyaW5nL2tidWYuYz0zNDE9aW50IGlvX2J1ZmZlcnNfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcbi0tXG5pb191cmluZy9rYnVmLmMtMzUyLVx0aWYgKHNlbC1cdTAwM2VidWZfbGlzdC1cdTAwM2VmbGFncyBcdTAwMjYgSU9CTF9CVUZfUklORykge1xuaW9fdXJpbmcva2J1Zi5jOjM1MzpcdFx0cmV0ID0gaW9fcmluZ19idWZmZXJzX3BlZWsocmVxLCBhcmcsIHNlbC1cdTAwM2VidWZfbGlzdCk7XG5pb191cmluZy9rYnVmLmMtMzU0LVx0XHQvKlxuLS1cbmlvX3VyaW5nL2tidWYuYz0zNzc9aW50IGlvX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXG4tLVxuaW9fdXJpbmcva2J1Zi5jLTM5MC1cdGlmIChibC1cdTAwM2VmbGFncyBcdTAwMjYgSU9CTF9CVUZfUklORykge1xuaW9fdXJpbmcva2J1Zi5jOjM5MTpcdFx0cmV0ID0gaW9fcmluZ19idWZmZXJzX3BlZWsocmVxLCBhcmcsIGJsKTtcbmlvX3VyaW5nL2tidWYuYy0zOTItXHRcdGlmIChyZXQgXHUwMDNlIDApXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjY3NQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDkzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkgd2VyZSBzd2lybGluZyBhcm91bmQgaW4gbXkgb3duIGhlYWQ6CgoqKkFuYWx5emluZyBhIFBvdGVudGlhbCBNZW1vcnkgTWFuYWdlbWVudCBJc3N1ZSoqCgpBbHJpZ2h0LCBzbyB0aGlzIHBhdGNoICpsb29rcyogbGlrZSBpdCYjMzk7cyBhZGRyZXNzaW5nIHNvbWUgc29ydCBvZiBtZW1vcnkgY29ycnVwdGlvbiBwcm9ibGVtIOKAkyBtYXliZSBhIG1lbW9yeSBsZWFrLCBvciBhIHVzZS1hZnRlci1mcmVlIHNjZW5hcmlvLiBJdCBzZWVtcyB0aGUgY29yZSBvZiB0aGUgZml4IHJldm9sdmVzIGFyb3VuZCB0aGUgdGltaW5nIG9mIGBrZnJlZShhcmctJmd0O2lvdnMpYC4gSXQgKmxvb2tzKiBsaWtlIHRoZXkmIzM5O3JlIG1vdmluZyB0aGUgYGtmcmVlYCBjYWxsICphZnRlciogYSBsb29wIHRoYXQmIzM5O3MgdXNpbmcgYGFyZy0mZ3Q7aW92c2AuIAoKSG9sZCBvbiBhIHNlY29uZC4uLiBUaGF0IGRvZXNuJiMzOTt0IHF1aXRlIG1ha2Ugc2Vuc2UuIElmIHRoZXkmIzM5O3JlIGZyZWVpbmcgYGFyZy0mZ3Q7aW92c2AgYW5kICp0aGVuKiByZWFzc2lnbmluZyBgYXJnLSZndDtpb3ZzID0gaW92O2AsIHRoZW4gdGhlIGxvb3AgKm11c3QqIGJlIHVzaW5nIHRoZSBvcmlnaW5hbCBtZW1vcnkgbG9jYXRpb24sIHJpZ2h0PyBPciBhbSBJIG1pc3Npbmcgc29tZXRoaW5nPyBJZiB0aGF0JiMzOTtzIHRydWUsIHRoZW4gdGhlIG5ldyB2YWx1ZSBgaW92YCBtdXN0IGJlIGFzc2lnbmVkICpiZWZvcmUqIHRoZSBrZnJlZSB0byBwcmV2ZW50IHVzZSBhZnRlciBmcmVlLiBJIG5lZWQgdG8gYmUgc3VyZS4KCkkgbmVlZCB0byBkaWcgZGVlcGVyIGhlcmUuIFRoZSBrZXkgZnVuY3Rpb24gaXMgcHJvYmFibHkgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBpbiBgaW9fdXJpbmcva2J1Zi5jYC4gSSYjMzk7bSBnb2luZyB0byBwdWxsIHVwIHRoYXQgZnVuY3Rpb24gYW5kIHJlYWQgdGhlIGxvZ2ljIGNhcmVmdWxseS4gSSBuZWVkIHRvIHNlZSBleGFjdGx5IGhvdyBgYXJnLSZndDtpb3ZzYCBpcyBiZWluZyB1c2VkIGFuZCBtb2RpZmllZCB3aXRoaW4gdGhhdCBmdW5jdGlvbiBhbmQgd2hldGhlciB0aGlzIGBrZnJlZWAgcGxhY2VtZW50IGlzIHJlYWxseSBzb2x2aW5nIHRoZSBwcm9ibGVtIG9yLCBwZXJoYXBzLCBpbnRyb2R1Y2luZyBhIG5ldyBvbmUgb3IgbWlzdW5kZXJzdGFuZGluZyBob3cgdG8gZGVhbCB3aXRoIHRoZSBleGlzdGluZyBpc3N1ZS4gTGV0JiMzOTtzIHNlZS4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjUzLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjUzOlx0c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXG4gMjU0Olx0XHRcdFx0XHRzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsKVxuIDI1NTpcdHtcbiAyNTY6XHRcdHN0cnVjdCBpb191cmluZ19idWZfcmluZyAqYnIgPSBibC1cdTAwM2VidWZfcmluZztcbiAyNTc6XHRcdHN0cnVjdCBpb3ZlYyAqb3JnX2lvdnMgPSBhcmctXHUwMDNlaW92cztcbiAyNTg6XHRcdHN0cnVjdCBpb3ZlYyAqaW92ID0gYXJnLVx1MDAzZWlvdnM7XG4gMjU5Olx0XHRpbnQgbnJfaW92cyA9IGFyZy1cdTAwM2Vucl9pb3ZzO1xuIDI2MDpcdFx0X191MTYgbnJfYXZhaWwsIHRhaWwsIGhlYWQ7XG4gMjYxOlx0XHRzdHJ1Y3QgaW9fdXJpbmdfYnVmICpidWY7XG4gMjYyOlx0XG4gMjYzOlx0XHR0YWlsID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZici1cdTAwM2V0YWlsKTtcbiAyNjQ6XHRcdGhlYWQgPSBibC1cdTAwM2VoZWFkO1xuIDI2NTpcdFx0bnJfYXZhaWwgPSBtaW5fdChfX3UxNiwgdGFpbCAtIGhlYWQsIFVJT19NQVhJT1YpO1xuIDI2NjpcdFx0aWYgKHVubGlrZWx5KCFucl9hdmFpbCkpXG4gMjY3Olx0XHRcdHJldHVybiAtRU5PQlVGUztcbiAyNjg6XHRcbiAyNjk6XHRcdGJ1ZiA9IGlvX3JpbmdfaGVhZF90b19idWYoYnIsIGhlYWQsIGJsLVx1MDAzZW1hc2spO1xuIDI3MDpcdFx0aWYgKGFyZy1cdTAwM2VtYXhfbGVuKSB7XG4gMjcxOlx0XHRcdHUzMiBsZW4gPSBSRUFEX09OQ0UoYnVmLVx1MDAzZWxlbik7XG4gMjcyOlx0XHRcdHNpemVfdCBuZWVkZWQ7XG4gMjczOlx0XG4gMjc0Olx0XHRcdGlmICh1bmxpa2VseSghbGVuKSlcbiAyNzU6XHRcdFx0XHRyZXR1cm4gLUVOT0JVRlM7XG4gMjc2Olx0XHRcdG5lZWRlZCA9IChhcmctXHUwMDNlbWF4X2xlbiAmIzQzOyBsZW4gLSAxKSAvIGxlbjtcbiAyNzc6XHRcdFx0bmVlZGVkID0gbWluX25vdF96ZXJvKG5lZWRlZCwgKHNpemVfdCkgUEVFS19NQVhfSU1QT1JUKTtcbiAyNzg6XHRcdFx0aWYgKG5yX2F2YWlsIFx1MDAzZSBuZWVkZWQpXG4gMjc5Olx0XHRcdFx0bnJfYXZhaWwgPSBuZWVkZWQ7XG4gMjgwOlx0XHR9XG4gMjgxOlx0XG4gMjgyOlx0XHQvKlxuIDI4MzpcdFx0ICogb25seSBhbGxvYyBhIGJpZ2dlciBhcnJheSBpZiB3ZSBrbm93IHdlIGhhdmUgZGF0YSB0byBtYXAsIGVnIG5vdFxuIDI4NDpcdFx0ICogYSBzcGVjdWxhdGl2ZSBwZWVrIG9wZXJhdGlvbi5cbiAyODU6XHRcdCAqL1xuIDI4NjpcdFx0aWYgKGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRVhQQU5EIFx1MDAyNlx1MDAyNiBucl9hdmFpbCBcdTAwM2UgbnJfaW92cyBcdTAwMjZcdTAwMjYgYXJnLVx1MDAzZW1heF9sZW4pIHtcbiAyODc6XHRcdFx0aW92ID0ga21hbGxvY19vYmpzKHN0cnVjdCBpb3ZlYywgbnJfYXZhaWwpO1xuIDI4ODpcdFx0XHRpZiAodW5saWtlbHkoIWlvdikpXG4gMjg5Olx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMjkwOlx0XHRcdGFyZy1cdTAwM2Vpb3ZzID0gaW92O1xuIDI5MTpcdFx0XHRucl9pb3ZzID0gbnJfYXZhaWw7XG4gMjkyOlx0XHR9IGVsc2UgaWYgKG5yX2F2YWlsIFx1MDAzYyBucl9pb3ZzKSB7XG4gMjkzOlx0XHRcdG5yX2lvdnMgPSBucl9hdmFpbDtcbiAyOTQ6XHRcdH1cbiAyOTU6XHRcbiAyOTY6XHRcdC8qIHNldCBpdCB0byBtYXgsIGlmIG5vdCBzZXQsIHNvIHdlIGNhbiB1c2UgaXQgdW5jb25kaXRpb25hbGx5ICovXG4gMjk3Olx0XHRpZiAoIWFyZy1cdTAwM2VtYXhfbGVuKVxuIDI5ODpcdFx0XHRhcmctXHUwMDNlbWF4X2xlbiA9IElOVF9NQVg7XG4gMjk5Olx0XG4gMzAwOlx0XHRyZXEtXHUwMDNlYnVmX2luZGV4ID0gUkVBRF9PTkNFKGJ1Zi1cdTAwM2ViaWQpO1xuIDMwMTpcdFx0ZG8ge1xuIDMwMjpcdFx0XHR1MzIgbGVuID0gUkVBRF9PTkNFKGJ1Zi1cdTAwM2VsZW4pO1xuIDMwMzpcdFxuIDMwNDpcdFx0XHQvKiB0cnVuY2F0ZSBlbmQgcGllY2UsIGlmIG5lZWRlZCwgZm9yIG5vbiBwYXJ0aWFsIGJ1ZmZlcnMgKi9cbiAzMDU6XHRcdFx0aWYgKGxlbiBcdTAwM2UgYXJnLVx1MDAzZW1heF9sZW4pIHtcbiAzMDY6XHRcdFx0XHRsZW4gPSBhcmctXHUwMDNlbWF4X2xlbjtcbiAzMDc6XHRcdFx0XHRpZiAoIShibC1cdTAwM2VmbGFncyBcdTAwMjYgSU9CTF9JTkMpKSB7XG4gMzA4Olx0XHRcdFx0XHRhcmctXHUwMDNlcGFydGlhbF9tYXAgPSAxO1xuIDMwOTpcdFx0XHRcdFx0aWYgKGlvdiAhPSBhcmctXHUwMDNlaW92cylcbiAzMTA6XHRcdFx0XHRcdFx0YnJlYWs7XG4gMzExOlx0XHRcdFx0fVxuIDMxMjpcdFx0XHR9XG4gMzEzOlx0XG4gMzE0Olx0XHRcdGlvdi1cdTAwM2Vpb3ZfYmFzZSA9IHU2NF90b191c2VyX3B0cihSRUFEX09OQ0UoYnVmLVx1MDAzZWFkZHIpKTtcbiAzMTU6XHRcdFx0aW92LVx1MDAzZWlvdl9sZW4gPSBsZW47XG4gMzE2Olx0XHRcdGlmICh1bmxpa2VseSghYWNjZXNzX29rKGlvdi1cdTAwM2Vpb3ZfYmFzZSwgbGVuKSkpIHtcbiAzMTc6XHRcdFx0XHRpZiAoYXJnLVx1MDAzZWlvdnMgIT0gb3JnX2lvdnMpXG4gMzE4Olx0XHRcdFx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG4gMzE5Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gMzIwOlx0XHRcdH1cbiAzMjE6XHRcdFx0aW92JiM0MzsmIzQzOztcbiAzMjI6XHRcbiAzMjM6XHRcdFx0YXJnLVx1MDAzZW91dF9sZW4gJiM0Mzs9IGxlbjtcbiAzMjQ6XHRcdFx0YXJnLVx1MDAzZW1heF9sZW4gLT0gbGVuO1xuIDMyNTpcdFx0XHRpZiAoIWFyZy1cdTAwM2VtYXhfbGVuKVxuIDMyNjpcdFx0XHRcdGJyZWFrO1xuIDMyNzpcdFxuIDMyODpcdFx0XHRidWYgPSBpb19yaW5nX2hlYWRfdG9fYnVmKGJyLCAmIzQzOyYjNDM7aGVhZCwgYmwtXHUwMDNlbWFzayk7XG4gMzI5Olx0XHR9IHdoaWxlICgtLW5yX2lvdnMpO1xuIDMzMDpcdFxuIDMzMTpcdFx0aWYgKGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRlJFRSlcbiAzMzI6XHRcdFx0a2ZyZWUoYXJnLVx1MDAzZWlvdnMpO1xuIDMzMzpcdFxuIDMzNDpcdFx0aWYgKGhlYWQgPT0gdGFpbClcbiAzMzU6XHRcdFx0cmVxLVx1MDAzZWZsYWdzIHw9IFJFUV9GX0JMX0VNUFRZO1xuIDMzNjpcdFxuIDMzNzpcdFx0cmVxLVx1MDAzZWZsYWdzIHw9IFJFUV9GX0JVRkZFUl9SSU5HO1xuIDMzODpcdFx0cmV0dXJuIGlvdiAtIGFyZy1cdTAwM2Vpb3ZzO1xuIDMzOTpcdH1cbiAzNDA6XHRcbiAzNDE6XHRpbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuIDM0MjpcdFx0XHQgICAgICBzdHJ1Y3QgaW9fYnJfc2VsICpzZWwsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcbiAzNDM6XHR7XG4gMzQ0Olx0XHRzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCA9IHJlcS1cdTAwM2VjdHg7XG4gMzQ1Olx0XHRpbnQgcmV0ID0gLUVOT0VOVDtcbiAzNDY6XHRcbiAzNDc6XHRcdGlvX3Jpbmdfc3VibWl0X2xvY2soY3R4LCBpc3N1ZV9mbGFncyk7XG4gMzQ4Olx0XHRzZWwtXHUwMDNlYnVmX2xpc3QgPSBpb19idWZmZXJfZ2V0X2xpc3QoY3R4LCBhcmctXHUwMDNlYnVmX2dyb3VwKTtcbiAzNDk6XHRcdGlmICh1bmxpa2VseSghc2VsLVx1MDAzZWJ1Zl9saXN0KSlcbiAzNTA6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuIDM1MTpcdFxuIDM1MjpcdFx0aWYgKHNlbC1cdTAwM2VidWZfbGlzdC1cdTAwM2VmbGFncyBcdTAwMjYgSU9CTF9CVUZfUklORykge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3MTEKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiA0MDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgS0JVRiBQYXRjaDogUG90ZW50aWFsIE1lbW9yeSBMZWFrKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggbW92ZXMgdGhlIGBrZnJlZShhcmctJmd0O2lvdnMpYCBjYWxsIG91dHNpZGUgb2YgdGhlIGNvbmRpdGlvbmFsIGJsb2NrLCBwbGFjaW5nIGl0IGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZnVuY3Rpb24uIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdGhhdCB0aGlzIHNlZW1lZCBsaWtlIGEgc2ltcGxlIGNsZWFudXAsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSBidWdzLgoKTm93LCBJJiMzOTttIHN0YXJ0aW5nIHRvIHNlZSB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgY2hhbmdlLiBQcmV2aW91c2x5LCBpZiBgYXJnLSZndDttb2RlICZhbXA7IEtCVUZfTU9ERV9GUkVFYCB3YXMgc2V0LCB0aGUgY29kZSB3b3VsZCBmcmVlIGBhcmctJmd0O2lvdnNgIOKAkyB3aGljaCwgY3JpdGljYWxseSwgd2FzIHRoZSAqb2xkKiBgaW92c2Ag4oCTICpiZWZvcmUqIHBvdGVudGlhbGx5IGFsbG9jYXRpbmcgYSAqbmV3KiBgaW92c2AgYW5kIGFzc2lnbmluZyBpdCB0byBgYXJnLSZndDtpb3ZzYC4KClRoZSBpbnRlcmVzdGluZyBzZWN0aW9uIG9mIGNvZGUgaGVyZSBpczoKCmBgYGMKCQlpZiAoYXJnLSZndDttb2RlICZhbXA7IEtCVUZfTU9ERV9FWFBBTkQgJmFtcDsmYW1wOyBucl9hdmFpbCAmZ3Q7IG5yX2lvdnMgJmFtcDsmYW1wOyBhcmctJmd0O21heF9sZW4pIHsKCQkJaW92ID0ga21hbGxvY19vYmpzKHN0cnVjdCBpb3ZlYywgbnJfYXZhaWwpOwoJCQlpZiAodW5saWtlbHkoIWlvdikpCgkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCWlmIChhcmctJmd0O21vZGUgJmFtcDsgS0JVRl9NT0RFX0ZSRUUpCi0JCQkJa2ZyZWUoYXJnLSZndDtpb3ZzKTsKCQkJYXJnLSZndDtpb3ZzID0gaW92OwoJCQlucl9pb3ZzID0gbnJfYXZhaWw7CgkJfQpgYGAKCk9rYXksIHNvIGlmIHRoZSBjb2RlICpkb2VzKiBlbnRlciB0aGF0IGBpZmAgYmxvY2ssIGEgbmV3IGBpb3ZgIGlzIGFsbG9jYXRlZCBhbmQgYXNzaWduZWQgdG8gYGFyZy0mZ3Q7aW92c2AsIGFuZCBvbmx5IHRoZW4sIHRoZSBvbGQgYGlvdnNgIHdpbGwgYmUgZnJlZWQsIGJ1dCBvbmx5IGlmIHRoZSBmbGFnIGlzIHNldC4KClRoZSBjb2RlIG5vdywgYWZ0ZXIgdGhlIHBhdGNoLCBsb29rcyBsaWtlIHRoaXM6CgpgYGBjCglpZiAoYXJnLSZndDttb2RlICZhbXA7IEtCVUZfTU9ERV9GUkVFKQoJCWtmcmVlKGFyZy0mZ3Q7aW92cyk7CmBgYAoKVGhlIHByb2JsZW0gaXMgaW1tZWRpYXRlbHkgY2xlYXI6IElmIHRoZSBleHBhbnNpb24gKmRvZXMqIG9jY3VyIGFuZCBhICpuZXcqIGBpb3ZgIGlzIGFsbG9jYXRlZCwgYXQgdGhlIGVuZCwgdGhlIGNvZGUgd2lsbCBmcmVlIHRoZSAqbmV3KiBgYXJnLSZndDtpb3ZzYCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBgaW92c2AuIFRoaXMgaXMgbm93IGEgYnVnOiB3ZSBhcmUgbGVha2luZyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9sZCBgYXJnLSZndDtpb3ZzYCEgV2UgYXJlIHN1cHBvc2VkIHRvIGJlIGZyZWVpbmcgdGhlIG9sZCBvbmUuIFdlIG5vdyBoYXZlIGFuIGlzc3VlIG9mIG1lbW9yeSBjb3JydXB0aW9uIG9yIGV2ZW4gd29yc2UuIEkgYmV0dGVyIHJlLWV4YW1pbmUgdGhlIGRpZmYgdmVyeSBjYXJlZnVsbHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aWYgXFwoYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFXFwpJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL2tidWYuYz0yNTM9c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXG4tLVxuaW9fdXJpbmcva2J1Zi5jLTMzMC1cbmlvX3VyaW5nL2tidWYuYzozMzE6XHRpZiAoYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxuaW9fdXJpbmcva2J1Zi5jLTMzMi1cdFx0a2ZyZWUoYXJnLVx1MDAzZWlvdnMpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU3NjYKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxNTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBpb19yaW5nX2J1ZmZlcnNfcGVlayBMb2dpYyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBJZiBgYXJnLSZndDttb2RlICZhbXA7IEtCVUZfTU9ERV9GUkVFYCBpcyB0cnVlLCB0aGF0IHNpZ25hbHMgdGhhdCB0aGUgb3JpZ2luYWwgYGFyZy0mZ3Q7aW92c2Agd2FzICpkeW5hbWljYWxseSBhbGxvY2F0ZWQqIGFuZCB0aHVzIG5lZWRzIHRvIGJlIGRlYWxsb2NhdGVkLiBUaGF0JiMzOTtzIHN0cmFpZ2h0Zm9yd2FyZC4gSG93ZXZlciwgdGhlIGxvZ2ljIGdldHMgdHJpY2t5IHdoZW4gd2UgKmFsc28qIGFsbG9jYXRlIGEgKm5ldyogYGlvdmAsIGFuZCBhc3NpZ24gaXQgdG8gYGFyZy0mZ3Q7aW92c2AuIFNvLCBgYXJnLSZndDtpb3ZzYCBpcyBlaXRoZXIgdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gb3IgYSBuZXcgb25lLCBkZXBlbmRpbmcuIFRoZSBjb2RlIHRoZW4gZnJlZXMgYGFyZy0mZ3Q7aW92c2AgYXQgdGhlIGVuZCBpZiB0aGUgZnJlZSBtb2RlIGlzIGVuYWJsZWQuCgpCdXQgaGVyZSYjMzk7cyB3aGVyZSB0aGUgcmVkIGZsYWcgZ29lcyB1cC4gVGhlICpjYWxsZXIqIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgZXhwZWN0cyBgYXJnLSZndDtpb3ZzYCB0byBjb250YWluIHZhbGlkIGlvdmVjcywgcmlnaHQ/IEl0JiMzOTtzIGhvdyB0aGUgY2FsbGVyIHJldHJpZXZlcyB0aGUgZGF0YS4gSWYgd2UgKmZyZWUqIGBhcmctJmd0O2lvdnNgIGF0IHRoZSBlbmQgb2YgKnRoaXMqIGZ1bmN0aW9uLCB0aGUgY2FsbGVyIGlzIGxlZnQgaG9sZGluZyBhIGRhbmdsaW5nIHBvaW50ZXIuIFRoYXQmIzM5O3MgYSBjbGFzc2ljIG1lbW9yeSBtYW5hZ2VtZW50IGlzc3VlLiBJIG5lZWQgdG8gY29uZmlybSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3Igb2YgYGFyZy0mZ3Q7aW92c2AgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24uIExldCBtZSBjaGVjayB0aGUgY2FsbGVyIHRvIGNvbmZpcm0gdGhlIGludGVuZGVkIGJlaGF2aW9yLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtpb19idWZmZXJzX3BlZWsmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpb191cmluZy9rYnVmLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jPTM0MT1pbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuLS1cbmlvX3VyaW5nL2tidWYuYy0zNzYtXG5pb191cmluZy9rYnVmLmM6Mzc3OmludCBpb19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuaW9fdXJpbmcva2J1Zi5jLTM3OC1cdFx0ICAgIHN0cnVjdCBpb19icl9zZWwgKnNlbClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjMzOAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZXNlIG1ldGhvZHMsIGBpb19idWZmZXJzX3BlZWtgIGFuZCBgaW9fYnVmZmVyc19zZWxlY3RgLiBNeSBleHBlcnRpc2UgdGVsbHMgbWUgdGhlcmUmIzM5O3MgbW9yZSBoZXJlIHRoYW4gbWVldHMgdGhlIGV5ZSwgYW5kIHRoZSBuYW1lICYjMzQ7YnVmZmVycyYjMzQ7IGFscmVhZHkgc3VnZ2VzdHMgc29tZSBsZXZlbCBvZiBtZW1vcnkgbWFuYWdlbWVudC4gSSYjMzk7bSBpbW1lZGlhdGVseSBjdXJpb3VzIGFib3V0IHRoZWlyIGNvbnRleHQg4oCTIGFyZSB0aGVzZSBsaW5rZWQgdG8gbmV0d29yayBvcGVyYXRpb25zLCBmaWxlIEkvTywgb3Igc29tZXRoaW5nIG1vcmUgZ2VuZXJpYz8gSSYjMzk7bSBhbHJlYWR5IGZvcm11bGF0aW5nIHF1ZXN0aW9uczoKCioqUGVla2luZywgU2VsZWN0aW5nLCBhbmQgQnVmZmVyczogSW5pdGlhbCBBc3Nlc3NtZW50KioKClNvLCBgaW9fYnVmZmVyc19wZWVrYCwgdGhpcyBpcyBpbnRlcmVzdGluZy4gSSYjMzk7bSBndWVzc2luZyBpdCBhbGxvd3MgYSBub24tZGVzdHJ1Y3RpdmUgbG9vayBhdCBidWZmZXJlZCBkYXRhLCBwcm9iYWJseSB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIGJ1ZmZlci4gVGhpcyBpbXBsaWVzIGEgbmVlZCB0byBpbnNwZWN0IGluY29taW5nIG9yIG91dGdvaW5nIGRhdGEgd2l0aG91dCBhbHRlcmluZyBpdHMgc3RhdGUsIGxpa2VseSBmb3IgdGhpbmdzIGxpa2UgZGV0ZXJtaW5pbmcgdGhlIG1lc3NhZ2UgdHlwZSBiZWZvcmUgY29tbWl0dGluZyB0byBwcm9jZXNzaW5nIGl0LiBJJiMzOTttIHRoaW5raW5nIHBlcmhhcHMgdGhpcyBmdW5jdGlvbiBoYXMgc29tZSBvdmVybGFwIHdpdGggYSBgcmVjdl9wZWVrYCBmdW5jdGlvbiBpbiBhIHNvY2tldC1iYXNlZCBhcHBsaWNhdGlvbi4gVGhpcyBtaWdodCBiZSB1c2VkIHRvIGluc3BlY3QgYSBwYWNrZXQgYmVmb3JlIGFwcGx5aW5nIGEgY2VydGFpbiBoYW5kbGVyLgoKYGlvX2J1ZmZlcnNfc2VsZWN0YCwgbm93IHRoYXQmIzM5O3MgZXZlbiBtb3JlIGludHJpZ3VpbmcuICYjMzQ7U2VsZWN0JiMzNDsgYWx3YXlzIHN1Z2dlc3RzIHNvbWUga2luZCBvZiBtdWx0aXBsZXhpbmcgb3IgZXZlbnQgaGFuZGxpbmcuIElzIHRoaXMgbWV0aG9kIHJlbGF0ZWQgdG8gdGhlIGBzZWxlY3QoKWAgc3lzdGVtIGNhbGwsIGZvciBpbmRpY2F0aW5nIG9uZSBvciBtb3JlIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGV4ZWN1dGVkPyBUaGlzIGZ1bmN0aW9uIHdvdWxkIGJlIHF1aXRlIHZhbHVhYmxlLCBlc3BlY2lhbGx5IGluIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50cywgd2hlcmUgd2UgY2FuIGNob29zZSB3aGljaCBvcGVyYXRpb24gZnJvbSBhbiBhcnJheSBvZiBidWZmZXIgY2FuZGlkYXRlcyB3b3VsZCBiZSBzdWl0YWJsZSB0byBvcGVyYXRlIHVwb24uIFdoYXQgY3JpdGVyaWEgYXJlIHVzZWQgZm9yIHRoaXMgc2VsZWN0aW9uPyBBcmUgd2UgdGFsa2luZyBhYm91dCBwcmlvcml0aXppbmcgYmFzZWQgb24gYnVmZmVyIGZ1bGxuZXNzLCBhdmFpbGFibGUgc3BhY2UsIG9yIHNvbWUgb3RoZXIgYXBwbGljYXRpb24tc3BlY2lmaWMgbWV0cmljPyBBcmUgdGhlcmUgaW1wbGljYXRpb25zIGZvciBjb25jdXJyZW5jeSBjb250cm9sPyBJJiMzOTttIGFscmVhZHkgYW50aWNpcGF0aW5nIHBvdGVudGlhbCBzeW5jaHJvbml6YXRpb24gY2hhbGxlbmdlcy4gSSBjYW4gaW1hZ2luZSBzY2VuYXJpb3Mgd2hlcmUgdGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbm9uLWJsb2NraW5nIEkvTyB0byBoYW5kbGUgbXVsdGlwbGUgY29ubmVjdGlvbnMgb3Igc3RyZWFtcyBlZmZpY2llbnRseS4gSSYjMzk7bSByZWFkeSB0byBkaWcgZGVlcGVyIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIHRvIGdldCBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGVzZSBmdW5jdGlvbnMgZml0IGludG8gdGhlIGxhcmdlciBzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzQwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzQwOlx0XG4gMzQxOlx0aW50IGlvX2J1ZmZlcnNfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcbiAzNDI6XHRcdFx0ICAgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXG4gMzQzOlx0e1xuIDM0NDpcdFx0c3RydWN0IGlvX3JpbmdfY3R4ICpjdHggPSByZXEtXHUwMDNlY3R4O1xuIDM0NTpcdFx0aW50IHJldCA9IC1FTk9FTlQ7XG4gMzQ2Olx0XG4gMzQ3Olx0XHRpb19yaW5nX3N1Ym1pdF9sb2NrKGN0eCwgaXNzdWVfZmxhZ3MpO1xuIDM0ODpcdFx0c2VsLVx1MDAzZWJ1Zl9saXN0ID0gaW9fYnVmZmVyX2dldF9saXN0KGN0eCwgYXJnLVx1MDAzZWJ1Zl9ncm91cCk7XG4gMzQ5Olx0XHRpZiAodW5saWtlbHkoIXNlbC1cdTAwM2VidWZfbGlzdCkpXG4gMzUwOlx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiAzNTE6XHRcbiAzNTI6XHRcdGlmIChzZWwtXHUwMDNlYnVmX2xpc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IElPQkxfQlVGX1JJTkcpIHtcbiAzNTM6XHRcdFx0cmV0ID0gaW9fcmluZ19idWZmZXJzX3BlZWsocmVxLCBhcmcsIHNlbC1cdTAwM2VidWZfbGlzdCk7XG4gMzU0Olx0XHRcdC8qXG4gMzU1Olx0XHRcdCAqIERvbiYjMzk7dCByZWN5Y2xlIHRoZXNlIGJ1ZmZlcnMgaWYgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHBvbGwuXG4gMzU2Olx0XHRcdCAqIE5vYm9keSBlbHNlIGNhbiB1c2UgdGhlbSBhbnl3YXksIGFuZCBob2xkaW5nIG9uIHRvIHByb3ZpZGVkXG4gMzU3Olx0XHRcdCAqIGJ1ZmZlcnMgZm9yIGEgc2VuZC93cml0ZSBvcGVyYXRpb24gd291bGQgaGFwcGVuIG9uIHRoZSBhcHBcbiAzNTg6XHRcdFx0ICogc2lkZSBhbnl3YXkgd2l0aCBub3JtYWwgYnVmZmVycy4gQmVzaWRlcywgd2UgYWxyZWFkeVxuIDM1OTpcdFx0XHQgKiBjb21taXR0ZWQgdGhlbSwgdGhleSBjYW5ub3QgYmUgcHV0IGJhY2sgaW4gdGhlIHF1ZXVlLlxuIDM2MDpcdFx0XHQgKi9cbiAzNjE6XHRcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuIDM2MjpcdFx0XHRcdHJlcS1cdTAwM2VmbGFncyB8PSBSRVFfRl9CVUZGRVJTX0NPTU1JVCB8IFJFUV9GX0JMX05PX1JFQ1lDTEU7XG4gMzYzOlx0XHRcdFx0aWYgKCFpb19rYnVmX2NvbW1pdChyZXEsIHNlbC1cdTAwM2VidWZfbGlzdCwgYXJnLVx1MDAzZW91dF9sZW4sIHJldCkpXG4gMzY0Olx0XHRcdFx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfQlVGX01PUkU7XG4gMzY1Olx0XHRcdH1cbiAzNjY6XHRcdH0gZWxzZSB7XG4gMzY3Olx0XHRcdHJldCA9IGlvX3Byb3ZpZGVkX2J1ZmZlcnNfc2VsZWN0KHJlcSwgXHUwMDI2YXJnLVx1MDAzZW91dF9sZW4sIHNlbC1cdTAwM2VidWZfbGlzdCwgYXJnLVx1MDAzZWlvdnMpO1xuIDM2ODpcdFx0fVxuIDM2OTpcdG91dF91bmxvY2s6XG4gMzcwOlx0XHRpZiAoaXNzdWVfZmxhZ3MgXHUwMDI2IElPX1VSSU5HX0ZfVU5MT0NLRUQpIHtcbiAzNzE6XHRcdFx0c2VsLVx1MDAzZWJ1Zl9saXN0ID0gTlVMTDtcbiAzNzI6XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmN0eC1cdTAwM2V1cmluZ19sb2NrKTtcbiAzNzM6XHRcdH1cbiAzNzQ6XHRcdHJldHVybiByZXQ7XG4gMzc1Olx0fVxuIDM3NjpcdFxuIDM3NzpcdGludCBpb19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuIDM3ODpcdFx0XHQgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsKVxuIDM3OTpcdHtcbiAzODA6XHRcdHN0cnVjdCBpb19yaW5nX2N0eCAqY3R4ID0gcmVxLVx1MDAzZWN0eDtcbiAzODE6XHRcdHN0cnVjdCBpb19idWZmZXJfbGlzdCAqYmw7XG4gMzgyOlx0XHRpbnQgcmV0O1xuIDM4MzpcdFxuIDM4NDpcdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZjdHgtXHUwMDNldXJpbmdfbG9jayk7XG4gMzg1Olx0XG4gMzg2Olx0XHRibCA9IGlvX2J1ZmZlcl9nZXRfbGlzdChjdHgsIGFyZy1cdTAwM2VidWZfZ3JvdXApO1xuIDM4NzpcdFx0aWYgKHVubGlrZWx5KCFibCkpXG4gMzg4Olx0XHRcdHJldHVybiAtRU5PRU5UO1xuIDM4OTpcdFxuIDM5MDpcdFx0aWYgKGJsLVx1MDAzZWZsYWdzIFx1MDAyNiBJT0JMX0JVRl9SSU5HKSB7XG4gMzkxOlx0XHRcdHJldCA9IGlvX3JpbmdfYnVmZmVyc19wZWVrKHJlcSwgYXJnLCBibCk7XG4gMzkyOlx0XHRcdGlmIChyZXQgXHUwMDNlIDApXG4gMzkzOlx0XHRcdFx0cmVxLVx1MDAzZWZsYWdzIHw9IFJFUV9GX0JVRkZFUlNfQ09NTUlUO1xuIDM5NDpcdFx0XHRzZWwtXHUwMDNlYnVmX2xpc3QgPSBibDtcbiAzOTU6XHRcdFx0cmV0dXJuIHJldDtcbiAzOTY6XHRcdH1cbiAzOTc6XHRcbiAzOTg6XHRcdC8qIGRvbiYjMzk7dCBzdXBwb3J0IG11bHRpcGxlIGJ1ZmZlciBzZWxlY3Rpb25zIGZvciBsZWdhY3kgKi9cbiAzOTk6XHRcdHNlbC1cdTAwM2VidWZfbGlzdCA9IE5VTEw7XG4gNDAwOlx0XHRyZXR1cm4gaW9fcHJvdmlkZWRfYnVmZmVyc19zZWxlY3QocmVxLCBcdTAwMjZhcmctXHUwMDNlbWF4X2xlbiwgYmwsIGFyZy1cdTAwM2Vpb3ZzKTtcbiA0MDE6XHR9XG4gNDAyOlx0XG4gNDAzOlx0c3RhdGljIGlubGluZSBib29sIF9faW9fcHV0X2tidWZfcmluZyhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSxcbiA0MDQ6XHRcdFx0XHRcdCAgICAgIHN0cnVjdCBpb19idWZmZXJfbGlzdCAqYmwsIGludCBsZW4sIGludCBucilcbiA0MDU6XHR7XG4gNDA2Olx0XHRib29sIHJldCA9IHRydWU7XG4gNDA3Olx0XG4gNDA4Olx0XHRpZiAoYmwpXG4gNDA5Olx0XHRcdHJldCA9IGlvX2tidWZfY29tbWl0KHJlcSwgYmwsIGxlbiwgbnIpO1xuIDQxMDpcdFx0aWYgKHJldCBcdTAwMjZcdTAwMjYgKHJlcS1cdTAwM2VmbGFncyBcdTAwMjYgUkVRX0ZfQlVGX01PUkUpKVxuIDQxMTpcdFx0XHRyZXQgPSBmYWxzZTtcbiA0MTI6XHRcbiA0MTM6XHRcdHJlcS1cdTAwM2VmbGFncyBcdTAwMjY9IH4oUkVRX0ZfQlVGRkVSX1JJTkcgfCBSRVFfRl9CVUZfTU9SRSk7XG4gNDE0Olx0XHRyZXR1cm4gcmV0O1xuIDQxNTpcdH1cbiA0MTY6XHRcbiA0MTc6XHR1bnNpZ25lZCBpbnQgX19pb19wdXRfa2J1ZnMoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBpb19idWZmZXJfbGlzdCAqYmwsXG4gNDE4Olx0XHRcdFx0ICAgIGludCBsZW4sIGludCBuYnVmcylcbiA0MTk6XHR7XG4gNDIwOlx0XHR1bnNpZ25lZCBpbnQgcmV0O1xuIDQyMTpcdFxuIDQyMjpcdFx0cmV0ID0gSU9SSU5HX0NRRV9GX0JVRkZFUiB8IChyZXEtXHUwMDNlYnVmX2luZGV4IFx1MDAzY1x1MDAzYyBJT1JJTkdfQ1FFX0JVRkZFUl9TSElGVCk7XG4gNDIzOlx0XG4gNDI0Olx0XHRpZiAodW5saWtlbHkoIShyZXEtXHUwMDNlZmxhZ3MgXHUwMDI2IFJFUV9GX0JVRkZFUl9SSU5HKSkpIHtcbiA0MjU6XHRcdFx0aW9fa2J1Zl9kcm9wX2xlZ2FjeShyZXEpO1xuIDQyNjpcdFx0XHRyZXR1cm4gcmV0O1xuIDQyNzpcdFx0fVxuIDQyODpcdFxuIDQyOTpcdFx0aWYgKCFfX2lvX3B1dF9rYnVmX3JpbmcocmVxLCBibCwgbGVuLCBuYnVmcykpXG4gNDMwOlx0XHRcdHJldCB8PSBJT1JJTkdfQ1FFX0ZfQlVGX01PUkU7XG4gNDMxOlx0XHRyZXR1cm4gcmV0O1xuIDQzMjpcdH1cbiA0MzM6XHRcbiA0MzQ6XHRzdGF0aWMgaW50IGlvX3JlbW92ZV9idWZmZXJzX2xlZ2FjeShzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCxcbiA0MzU6XHRcdFx0XHRcdCAgICBzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsLFxuIDQzNjpcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgbmJ1ZnMpXG4gNDM3Olx0e1xuIDQzODpcdFx0dW5zaWduZWQgbG9uZyBpID0gMDtcbiA0Mzk6XHRcdHN0cnVjdCBpb19idWZmZXIgKm54dDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODM4NgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDE5NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQb3RlbnRpYWwgTWVtb3J5IE1hbmFnZW1lbnQgSXNzdWUqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSBzbmlwcGV0LCBzcGVjaWZpY2FsbHkgdGhlIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgZnVuY3Rpb24sIGFuZCBzb21ldGhpbmcmIzM5O3MgaW1tZWRpYXRlbHkganVtcGluZyBvdXQgYXQgbWUuIElmIGBhcmctJmd0O21vZGUgJmFtcDsgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGBhcmctJmd0O2lvdnNgLiBIaXN0b3JpY2FsbHksIGl0IGxvb2tzIGxpa2UgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBtaWdodCBoYXZlIGJlZW4gZnJlZWluZyB0aGUgb2xkIGBhcmctJmd0O2lvdnNgIGlmIGl0IGFsbG9jYXRlZCBhIG5ldyBvbmUuIEkgdGhpbmsgSSBzZWUgYSBwb3RlbnRpYWwgaXNzdWUuLi4KCkhvbGQgb24sIEkgc2VlIHRoZSBwYXRjaC4gSXQgc2VlbXMgdGhhdCB0aGUgYGtmcmVlKGFyZy0mZ3Q7aW92cylgIGNhbGwgKnVzZWQqIHRvIGJlIHdpdGhpbiB0aGUgZnVuY3Rpb24gYnV0IGlzIG5vdyBhdCB0aGUgZW5kLiBUaGF0JiMzOTtzIGEgcmVkIGZsYWchIElmIGBhcmctJmd0O21vZGUgJmFtcDsgS0JVRl9NT0RFX0ZSRUVgIGlzIHRydWUsIHRoZW4gdGhhdCBtZWFucyB0aGUgY2FsbGVyIGlzIGV4cGVjdGluZyB0byB1c2UgYGFyZy0mZ3Q7aW92c2AgKmFmdGVyKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIEJ1dCBpZiB3ZSBmcmVlIGBhcmctJmd0O2lvdnNgIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCB0aGUgY2FsbGVyIGlzIGdvaW5nIHRvIGJlIGxlZnQgaG9sZGluZyBhIGRhbmdsaW5nIHBvaW50ZXIuIFRoYXQmIzM5O3MgYSBjbGFzc2ljIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkhCgpMZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBwYXRjaCBvbmUgbW9yZSB0aW1lIHRvIGJlIHN1cmUuIFRoaXMgZGVmaW5pdGVseSBuZWVkcyBhIGNsb3NlciBsb29rLCBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byB0aGUgbGlmZXRpbWUgb2YgYGFyZy0mZ3Q7aW92c2AgYW5kIHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSBjYWxsZXIgYW5kIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0tCVUZfTU9ERV9GUkVFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW9fdXJpbmcvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL2tidWYuYz0yNTM9c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXG4tLVxuaW9fdXJpbmcva2J1Zi5jLTMzMC1cbmlvX3VyaW5nL2tidWYuYzozMzE6XHRpZiAoYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxuaW9fdXJpbmcva2J1Zi5jLTMzMi1cdFx0a2ZyZWUoYXJnLVx1MDAzZWlvdnMpO1xuLS1cbmlvX3VyaW5nL2tidWYuaD01Mz1lbnVtIHtcbi0tXG5pb191cmluZy9rYnVmLmgtNTYtXHQvKiBpZiBiaWdnZXIgdmVjIGFsbG9jYXRlZCwgZnJlZSBvbGQgb25lICovXG5pb191cmluZy9rYnVmLmg6NTc6XHRLQlVGX01PREVfRlJFRVx0XHQ9IDIsXG5pb191cmluZy9rYnVmLmgtNTgtfTtcbi0tXG5pb191cmluZy9uZXQuYz02MDg9c3RhdGljIGludCBpb19zZW5kX3NlbGVjdF9idWZmZXIoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncyxcbi0tXG5pb191cmluZy9uZXQuYy02MjItXHRcdGFyZy5pb3ZzID0ga21zZy1cdTAwM2V2ZWMuaW92ZWM7XG5pb191cmluZy9uZXQuYzo2MjM6XHRcdGFyZy5tb2RlID0gS0JVRl9NT0RFX0ZSRUU7XG5pb191cmluZy9uZXQuYy02MjQtXHR9XG4tLVxuaW9fdXJpbmcvbmV0LmM9MTEzNz1zdGF0aWMgaW50IGlvX3JlY3ZfYnVmX3NlbGVjdChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZyxcbi0tXG5pb191cmluZy9uZXQuYy0xMTU5LVx0XHRcdGFyZy5pb3ZzID0ga21zZy1cdTAwM2V2ZWMuaW92ZWM7XG5pb191cmluZy9uZXQuYzoxMTYwOlx0XHRcdGFyZy5tb2RlIHw9IEtCVUZfTU9ERV9GUkVFO1xuaW9fdXJpbmcvbmV0LmMtMTE2MS1cdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5MzMzCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNzM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFBvdGVudGlhbCBVc2UtQWZ0ZXItRnJlZSBWdWxuZXJhYmlsaXR5IGluIGlvX3VyaW5nKioKCk9rYXksIGxldCYjMzk7cyBzZWUuIEluIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AsIEkmIzM5O20gbG9va2luZyBhdCB0aGUgbG9naWMgcmVsYXRlZCB0byBgYXJnLSZndDtpb3ZzYCBhbmQgaG93IGl0IGhhbmRsZXMgcG90ZW50aWFsIHJlYWxsb2NhdGlvbi4gSSBzZWUgdGhhdCBpZiBgS0JVRl9NT0RFX0VYUEFORGAgaXMgc2V0IGFuZCBtb3JlIGlvdmVjcyBhcmUgbmVlZGVkLCBhIG5ldyBgaW92YCBhcnJheSBpcyBhbGxvY2F0ZWQgdXNpbmcgYGttYWxsb2Nfb2Jqc2AuIFRoaXMgbmV3IGFycmF5IHRoZW4gb3ZlcndyaXRlcyB0aGUgZXhpc3RpbmcgYGFyZy0mZ3Q7aW92c2AgcG9pbnRlci4gVGhlIGZ1bmN0aW9uIHRoZW4gcHJvY2VlZHMgdG8gcHJvY2VzcyB0aGUgZGF0YS4KCk5vdywgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgZnJlZWluZyBsb2dpYyBhdCB0aGUgZW5kLiBPcmlnaW5hbGx5LCBga2ZyZWUoYXJnLSZndDtpb3ZzKWAgd2FzIGNhbGxlZCBvbmx5IGlmIGEgbmV3IGBpb3ZgIHdhc24mIzM5O3QgYWxsb2NhdGVkLiBUaGlzIG1lYW5zIHRoYXQgaWYgaXQgKndhcyogcmVhbGxvY2F0ZWQsIHRoZSBvbGQgb25lIHdhcyBsZWFrZWQuIEl0IHdhcyBhdHRlbXB0aW5nIHRvIHNvbHZlIHRoZSBvbGQgbGVhaywgYnkgaW50cm9kdWNpbmcgYSBuZXcgYGtmcmVlKGFyZy0mZ3Q7aW92cylgIGNhbGwgYXQgdGhlIGVuZCwgY29uZGl0aW9uYWwgb24gYEtCVUZfTU9ERV9GUkVFYC4KCkJ1dC4uLiBob2xkIG9uLiBJZiBgYXJnLSZndDtpb3ZzYCBpcyB1cGRhdGVkIHRvIGEgbmV3IGBpb3ZgLCB0aGVuIGBrZnJlZShhcmctJmd0O2lvdnMpYCBhdCB0aGUgZW5kIHdpbGwgZnJlZSB0aGUgbmV3bHkgYWxsb2NhdGVkIGBpb3ZgISBUaGUgKm5ldyogb25lLiBBbmQgaXQgKmRvZXNuJiMzOTt0KiBmcmVlIHRoZSBvbGQgb25lIGJlY2F1c2UgYGFyZy0mZ3Q7aW92c2Agd2FzIG92ZXJ3cml0dGVuISBIb3dldmVyLCBpZiBgYXJnLSZndDtpb3ZzYCBpcyAqbm90KiB1cGRhdGVkLCB0aGUgb2xkIG9uZSAqaXMqIGZyZWVkLCB3aGljaCBpcyB0aGUgb3JpZ2luYWwgaW50ZW50LgoKV2h5IGRpZCBzeXotY2x1c3RlciBhcHBseSB0aGlzIHBhdGNoPyBIbW0sIEkgc2VlIHRoZSBwYXRjaCBub3cuIEl0ICptb3ZlZCogdGhlIGBrZnJlZShhcmctJmd0O2lvdnMpYCB0byB0aGUgZW5kIGFuZCBhZGRlZCB0aGUgYEtCVUZfTU9ERV9GUkVFYCBjb25kaXRpb24uIEFoYSEgVGhpcyBpcyB0aGUga2V5LiBUaGUgcGF0Y2ggbm93IGludHJvZHVjZXMgYSBidWchIEl0IGZyZWVzIGBhcmctJmd0O2lvdnNgIGF0IHRoZSAqZW5kKiBvZiB0aGUgZnVuY3Rpb24sIHdoaWNoIG1lYW5zIHRoZSBwb2ludGVyIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBhcmctJmd0O2lvdnNgKSBpcyBiZWluZyBmcmVlZCAqYmVmb3JlKiB0aGUgY2FsbGVyIGdldHMgYSBjaGFuY2UgdG8gdXNlIGl0LgoKU28sIGlmIGBLQlVGX01PREVfRlJFRWAgaXMgc2V0LCBgYXJnLSZndDtpb3ZzYCB3aWxsIEFMV0FZUyBiZSBmcmVlZCBhdCB0aGUgZW5kLiBUaGlzIGlzIGEgY2xlYXIgdXNlLWFmdGVyLWZyZWUhIEFuZCBpdCBsb29rcyBsaWtlIHRoZSBwYXRjaCBpcyBmcm9tIHN5ei1jbHVzdGVyLiAmIzM0O3N5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldyYjMzQ7Li4uIFllcCwgdGhpcyBpcyBhIHBhdGNoIHVuZGVyIHJldmlldywgYW5kIGl0IGludHJvZHVjZXMgYSB1c2UtYWZ0ZXItZnJlZSwgcGxhaW4gYW5kIHNpbXBsZSEKClNpbmNlIGl0IGludHJvZHVjZXMgYSB1c2UtYWZ0ZXItZnJlZSwgaXQgZGVmaW5pdGVseSBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgYW5kIHNob3VsZCBiZSBmdXp6ZWQhIEl0JiMzOTtzIGNyaXRpY2FsLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCBhbmQgaG93IGBhcmctJmd0O2lvdnNgIGlzIHVzZWQgYWZ0ZXIgdGhpcyBjYWxsLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGFuZCBgaW9fcmVjdl9idWZfc2VsZWN0YCBpbiBgaW9fdXJpbmcvbmV0LmNgIGJlY2F1c2UgdGhleSBhcmUgbGlrZWx5IHRoZSBjYWxsZXJzIHRoYXQgcGFzcyBpbiBgYXJnYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpb191cmluZy9uZXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwOCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDYwODpcdHN0YXRpYyBpbnQgaW9fc2VuZF9zZWxlY3RfYnVmZmVyKHN0cnVjdCBpb19raW9jYiAqcmVxLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MsXG4gNjA5Olx0XHRcdFx0XHQgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnKVxuIDYxMDpcdHtcbiA2MTE6XHRcdHN0cnVjdCBpb19zcl9tc2cgKnNyID0gaW9fa2lvY2JfdG9fY21kKHJlcSwgc3RydWN0IGlvX3NyX21zZyk7XG4gNjEyOlx0XHRzdHJ1Y3QgYnVmX3NlbF9hcmcgYXJnID0ge1xuIDYxMzpcdFx0XHQuaW92cyA9IFx1MDAyNmttc2ctXHUwMDNlZmFzdF9pb3YsXG4gNjE0Olx0XHRcdC5tYXhfbGVuID0gbWluX25vdF96ZXJvKHNyLVx1MDAzZWxlbiwgSU5UX01BWCksXG4gNjE1Olx0XHRcdC5ucl9pb3ZzID0gMSxcbiA2MTY6XHRcdFx0LmJ1Zl9ncm91cCA9IHNyLVx1MDAzZWJ1Zl9ncm91cCxcbiA2MTc6XHRcdH07XG4gNjE4Olx0XHRpbnQgcmV0O1xuIDYxOTpcdFxuIDYyMDpcdFx0aWYgKGttc2ctXHUwMDNldmVjLmlvdmVjKSB7XG4gNjIxOlx0XHRcdGFyZy5ucl9pb3ZzID0ga21zZy1cdTAwM2V2ZWMubnI7XG4gNjIyOlx0XHRcdGFyZy5pb3ZzID0ga21zZy1cdTAwM2V2ZWMuaW92ZWM7XG4gNjIzOlx0XHRcdGFyZy5tb2RlID0gS0JVRl9NT0RFX0ZSRUU7XG4gNjI0Olx0XHR9XG4gNjI1Olx0XG4gNjI2Olx0XHRpZiAoIShzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0JVTkRMRSkpXG4gNjI3Olx0XHRcdGFyZy5ucl9pb3ZzID0gMTtcbiA2Mjg6XHRcdGVsc2VcbiA2Mjk6XHRcdFx0YXJnLm1vZGUgfD0gS0JVRl9NT0RFX0VYUEFORDtcbiA2MzA6XHRcbiA2MzE6XHRcdHJldCA9IGlvX2J1ZmZlcnNfc2VsZWN0KHJlcSwgXHUwMDI2YXJnLCBzZWwsIGlzc3VlX2ZsYWdzKTtcbiA2MzI6XHRcdGlmICh1bmxpa2VseShyZXQgXHUwMDNjIDApKVxuIDYzMzpcdFx0XHRyZXR1cm4gcmV0O1xuIDYzNDpcdFxuIDYzNTpcdFx0aWYgKGFyZy5pb3ZzICE9IFx1MDAyNmttc2ctXHUwMDNlZmFzdF9pb3YgXHUwMDI2XHUwMDI2IGFyZy5pb3ZzICE9IGttc2ctXHUwMDNldmVjLmlvdmVjKSB7XG4gNjM2Olx0XHRcdGttc2ctXHUwMDNldmVjLm5yID0gcmV0O1xuIDYzNzpcdFx0XHRrbXNnLVx1MDAzZXZlYy5pb3ZlYyA9IGFyZy5pb3ZzO1xuIDYzODpcdFx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTkVFRF9DTEVBTlVQO1xuIDYzOTpcdFx0fVxuIDY0MDpcdFx0c3ItXHUwMDNlbGVuID0gYXJnLm91dF9sZW47XG4gNjQxOlx0XG4gNjQyOlx0XHRpZiAocmV0ID09IDEpIHtcbiA2NDM6XHRcdFx0c3ItXHUwMDNlYnVmID0gYXJnLmlvdnNbMF0uaW92X2Jhc2U7XG4gNjQ0Olx0XHRcdHJldCA9IGltcG9ydF91YnVmKElURVJfU09VUkNFLCBzci1cdTAwM2VidWYsIHNyLVx1MDAzZWxlbixcbiA2NDU6XHRcdFx0XHRcdFx0XHUwMDI2a21zZy1cdTAwM2Vtc2cubXNnX2l0ZXIpO1xuIDY0NjpcdFx0XHRpZiAodW5saWtlbHkocmV0KSlcbiA2NDc6XHRcdFx0XHRyZXR1cm4gcmV0O1xuIDY0ODpcdFx0fSBlbHNlIHtcbiA2NDk6XHRcdFx0aW92X2l0ZXJfaW5pdChcdTAwMjZrbXNnLVx1MDAzZW1zZy5tc2dfaXRlciwgSVRFUl9TT1VSQ0UsXG4gNjUwOlx0XHRcdFx0XHRhcmcuaW92cywgcmV0LCBhcmcub3V0X2xlbik7XG4gNjUxOlx0XHR9XG4gNjUyOlx0XG4gNjUzOlx0XHRyZXR1cm4gMDtcbiA2NTQ6XHR9XG4gNjU1Olx0XG4gNjU2Olx0aW50IGlvX3NlbmQoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcbiA2NTc6XHR7XG4gNjU4Olx0XHRzdHJ1Y3QgaW9fc3JfbXNnICpzciA9IGlvX2tpb2NiX3RvX2NtZChyZXEsIHN0cnVjdCBpb19zcl9tc2cpO1xuIDY1OTpcdFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZyA9IHJlcS1cdTAwM2Vhc3luY19kYXRhO1xuIDY2MDpcdFx0c3RydWN0IGlvX2JyX3NlbCBzZWwgPSB7IH07XG4gNjYxOlx0XHRzdHJ1Y3Qgc29ja2V0ICpzb2NrO1xuIDY2MjpcdFx0dW5zaWduZWQgZmxhZ3M7XG4gNjYzOlx0XHRpbnQgbWluX3JldCA9IDA7XG4gNjY0Olx0XHRpbnQgcmV0O1xuIDY2NTpcdFxuIDY2NjpcdFx0c29jayA9IHNvY2tfZnJvbV9maWxlKHJlcS1cdTAwM2VmaWxlKTtcbiA2Njc6XHRcdGlmICh1bmxpa2VseSghc29jaykpXG4gNjY4Olx0XHRcdHJldHVybiAtRU5PVFNPQ0s7XG4gNjY5Olx0XG4gNjcwOlx0XHRpZiAoIShyZXEtXHUwMDNlZmxhZ3MgXHUwMDI2IFJFUV9GX1BPTExFRCkgXHUwMDI2XHUwMDI2XG4gNjcxOlx0XHQgICAgKHNyLVx1MDAzZWZsYWdzIFx1MDAyNiBJT1JJTkdfUkVDVlNFTkRfUE9MTF9GSVJTVCkpXG4gNjcyOlx0XHRcdHJldHVybiAtRUFHQUlOO1xuIDY3MzpcdFxuIDY3NDpcdFx0aWYgKHJlcS1cdTAwM2VmbGFncyBcdTAwMjYgUkVRX0ZfSU1QT1JUX0JVRkZFUikge1xuIDY3NTpcdFx0XHRyZXQgPSBpb19pbXBvcnRfcmVnX2J1ZihyZXEsIFx1MDAyNmttc2ctXHUwMDNlbXNnLm1zZ19pdGVyLFxuIDY3NjpcdFx0XHRcdFx0XHQodTY0KSh1aW50cHRyX3Qpc3ItXHUwMDNlYnVmLCBzci1cdTAwM2VsZW4sXG4gNjc3Olx0XHRcdFx0XHRcdElURVJfU09VUkNFLCBpc3N1ZV9mbGFncyk7XG4gNjc4Olx0XHRcdGlmICh1bmxpa2VseShyZXQpKVxuIDY3OTpcdFx0XHRcdHJldHVybiByZXQ7XG4gNjgwOlx0XHRcdHJlcS1cdTAwM2VmbGFncyBcdTAwMjY9IH5SRVFfRl9JTVBPUlRfQlVGRkVSO1xuIDY4MTpcdFx0fVxuIDY4MjpcdFxuIDY4MzpcdFx0ZmxhZ3MgPSBzci1cdTAwM2Vtc2dfZmxhZ3M7XG4gNjg0Olx0XHRpZiAoaXNzdWVfZmxhZ3MgXHUwMDI2IElPX1VSSU5HX0ZfTk9OQkxPQ0spXG4gNjg1Olx0XHRcdGZsYWdzIHw9IE1TR19ET05UV0FJVDtcbiA2ODY6XHRcbiA2ODc6XHRyZXRyeV9idW5kbGU6XG4gNjg4Olx0XHRzZWwuYnVmX2xpc3QgPSBOVUxMO1xuIDY4OTpcdFx0aWYgKGlvX2RvX2J1ZmZlcl9zZWxlY3QocmVxKSkge1xuIDY5MDpcdFx0XHRyZXQgPSBpb19zZW5kX3NlbGVjdF9idWZmZXIocmVxLCBpc3N1ZV9mbGFncywgXHUwMDI2c2VsLCBrbXNnKTtcbiA2OTE6XHRcdFx0aWYgKHJldClcbiA2OTI6XHRcdFx0XHRyZXR1cm4gcmV0O1xuIDY5MzpcdFx0fVxuIDY5NDpcdFxuIDY5NTpcdFx0LypcbiA2OTY6XHRcdCAqIElmIE1TR19XQUlUQUxMIGlzIHNldCwgb3IgdGhpcyBpcyBhIGJ1bmRsZSBzZW5kLCB0aGVuIHdlIG5lZWRcbiA2OTc6XHRcdCAqIHRoZSBmdWxsIGFtb3VudC4gSWYganVzdCBidW5kbGUgaXMgc2V0LCBpZiB3ZSBkbyBhIHNob3J0IHNlbmRcbiA2OTg6XHRcdCAqIHRoZW4gd2UgY29tcGxldGUgdGhlIGJ1bmRsZSBzZXF1ZW5jZSByYXRoZXIgdGhhbiBjb250aW51ZSBvbi5cbiA2OTk6XHRcdCAqL1xuIDcwMDpcdFx0aWYgKGZsYWdzIFx1MDAyNiBNU0dfV0FJVEFMTCB8fCBzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0JVTkRMRSlcbiA3MDE6XHRcdFx0bWluX3JldCA9IGlvdl9pdGVyX2NvdW50KFx1MDAyNmttc2ctXHUwMDNlbXNnLm1zZ19pdGVyKTtcbiA3MDI6XHRcbiA3MDM6XHRcdGZsYWdzIFx1MDAyNj0gfk1TR19JTlRFUk5BTF9TRU5ETVNHX0ZMQUdTO1xuIDcwNDpcdFx0a21zZy1cdTAwM2Vtc2cubXNnX2ZsYWdzID0gZmxhZ3M7XG4gNzA1Olx0XHRyZXQgPSBzb2NrX3NlbmRtc2coc29jaywgXHUwMDI2a21zZy1cdTAwM2Vtc2cpO1xuIDcwNjpcdFx0aWYgKHJldCBcdTAwM2MgbWluX3JldCkge1xuIDcwNzpcdFx0XHRpZiAocmV0ID09IC1FQUdBSU4gXHUwMDI2XHUwMDI2IChpc3N1ZV9mbGFncyBcdTAwMjYgSU9fVVJJTkdfRl9OT05CTE9DSykpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMzY2CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogODc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlVzZS1BZnRlci1GcmVlIEJ1ZyBpbiBpb19zZW5kX3NlbGVjdF9idWZmZXIqKgoKT2theSwgbGV0IG1lIGJyZWFrIHRoaXMgZG93bi4gSXQgbG9va3MgbGlrZSBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBoYXMgYSBjcml0aWNhbCB1c2UtYWZ0ZXItZnJlZSB2dWxuZXJhYmlsaXR5LiBUaGUgY29yZSBwcm9ibGVtIGxpZXMgaW4gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAsIGBpb19idWZmZXJzX3NlbGVjdGAsIGFuZCBgaW9fcmluZ19idWZmZXJzX3BlZWtgLgoKRmlyc3QsIGlmIGBrbXNnLSZndDt2ZWMuaW92ZWNgIGlzIGFscmVhZHkgYWxsb2NhdGVkIOKAkyBtZWFuaW5nIGBpb19zZW5kYCB3YXMgcHJldmlvdXNseSBjYWxsZWQgd2l0aCBhbiBpb3ZlYyBhcnJheSAobGlrZWx5IHRocm91Z2ggYGlvX3NlbmRtc2dgIG9yIGBpb19yZWN2bXNnYCBvciBhIHByZXZpb3VzIGFsbG9jYXRpb24pIOKAkyBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBzZXRzIGBhcmcubW9kZSA9IEtCVUZfTU9ERV9GUkVFYC4gIFRoZW4gYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBpcyBjYWxsZWQuCgpIZXJlJiMzOTtzIHRoZSBjcnV4OiBpZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgICphbGxvY2F0ZXMqIGEgbmV3IGBpb3ZgLCBpdCBzZXRzIGBhcmcuaW92c2AgdG8gdGhhdCBuZXcgYWxsb2NhdGlvbi4gSG93ZXZlciwgYXQgdGhlICplbmQqIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AsIGl0IHVuY29uZGl0aW9uYWxseSBjYWxscyBga2ZyZWUoYXJnLSZndDtpb3ZzKWAgYmVjYXVzZSBgYXJnLm1vZGVgIGhhcyBgS0JVRl9NT0RFX0ZSRUVgIHNldC4gIFNvIHdlJiMzOTt2ZSBqdXN0IGZyZWVkIHRoZSAqbmV3bHkgYWxsb2NhdGVkKiBgaW92YC4gIFRoZW4gYmFjayBpbiBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCwgdGhlIGNvZGUgcHJvY2VlZHMsIGFuZCBub3cgYGttc2ctJmd0O3ZlYy5pb3ZlY2AgcG9pbnRzIHRvIGZyZWVkIG1lbW9yeSEgVGhlbiB3ZSB1c2UgdGhhdCBmcmVlZCBtZW1vcnkhIENsYXNzaWMgdXNlLWFmdGVyLWZyZWUuCgpCdXQgd2hhdCBpZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgICpkb2VzbiYjMzk7dCogYWxsb2NhdGUgYSBuZXcgYGlvdmA/IEluIHRoYXQgY2FzZSwgYGFyZy0mZ3Q7aW92c2AgcmVtYWlucyBga21zZy0mZ3Q7dmVjLmlvdmVjYC4gQXQgdGhlICplbmQqIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AsIGl0IHN0aWxsIGNhbGxzIGBrZnJlZShhcmctJmd0O2lvdnMpYCwgd2hpY2ggaXMgc3RpbGwgYGttc2ctJmd0O3ZlYy5pb3ZlY2AsIHdoaWNoIGhhcyBiZWVuIGZyZWVkLiBUaGUgY29kZSBjb250aW51ZXMgaW4gYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgYW5kIHRoZW4gcHJvY2VlZHMsIGFuZCBhZ2FpbiwgYGFyZy5pb3ZzYCBpcyB1c2VkIGFmdGVyIGJlaW5nIGZyZWVkLgoKU28sIGluICpib3RoKiBzY2VuYXJpb3MgKG5ldyBpb3YgYWxsb2NhdGVkIG9yIG5vdCksIHRoZSBjb2RlIGZyZWVzIHRoZSBgaW92c2AgYXJyYXkgYW5kIHRoZW4gKmltbWVkaWF0ZWx5KiB1c2VzIGl0LiAgVGhpcyBpcyBhIGd1YXJhbnRlZWQsIHJlcHJvZHVjaWJsZSB1c2UtYWZ0ZXItZnJlZSBidWcgaWYgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQuCgpXaGVuIGRvZXMgYEtCVUZfTU9ERV9GUkVFYCBnZXQgc2V0PyAgSXQgZ2V0cyBzZXQgd2hlbiBga21zZy0mZ3Q7dmVjLmlvdmVjYCBpcyBub24tTlVMTCwgYW5kIHdlIGVzdGFibGlzaGVkIHRoYXQgaGFwcGVucyB3aGVuIGBpb19zZW5kYCBpcyBjYWxsZWQgd2l0aCBhIHByZS1hbGxvY2F0ZWQgaW92ZWMgYXJyYXkuICBUaGlzIG1lYW5zIHVzaW5nIGBpb19zZW5kbXNnYCBvciBgaW9fcmVjdm1zZ2AsIG9yIGFmdGVyIHRoZSBhcnJheSBoYXMgYmVlbiBhbGxvY2F0ZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwuIEkgbmVlZCB0byBjb25maXJtIHdoZXJlIGBpb19zZW5kYCBhY3R1YWxseSAqdXNlcyogYGttc2ctJmd0O3ZlYy5pb3ZlY2AuIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIGBpb19zZW5kX3NldHVwYCBvciBzb21ldGhpbmcgc2ltaWxhciBmb3IgdGhlIGRldGFpbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2ttc2ctXHUwMDNldmVjLmlvdmVjID0mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpb191cmluZy9uZXQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpb191cmluZy9uZXQuYz02MDg9c3RhdGljIGludCBpb19zZW5kX3NlbGVjdF9idWZmZXIoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncyxcbi0tXG5pb191cmluZy9uZXQuYy02MzYtXHRcdGttc2ctXHUwMDNldmVjLm5yID0gcmV0O1xuaW9fdXJpbmcvbmV0LmM6NjM3Olx0XHRrbXNnLVx1MDAzZXZlYy5pb3ZlYyA9IGFyZy5pb3ZzO1xuaW9fdXJpbmcvbmV0LmMtNjM4LVx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTkVFRF9DTEVBTlVQO1xuLS1cbmlvX3VyaW5nL25ldC5jPTExMzc9c3RhdGljIGludCBpb19yZWN2X2J1Zl9zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2csXG4tLVxuaW9fdXJpbmcvbmV0LmMtMTE3Ni1cdFx0XHRrbXNnLVx1MDAzZXZlYy5uciA9IHJldDtcbmlvX3VyaW5nL25ldC5jOjExNzc6XHRcdFx0a21zZy1cdTAwM2V2ZWMuaW92ZWMgPSBhcmcuaW92cztcbmlvX3VyaW5nL25ldC5jLTExNzgtXHRcdFx0cmVxLVx1MDAzZWZsYWdzIHw9IFJFUV9GX05FRURfQ0xFQU5VUDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQxNjIKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEZWJ1Z2dpbmcgYSBLZXJuZWwgTWVzc2FnaW5nIElzc3VlKioKCk9rYXksIGhvbGQgb24uIFRoaXMgYGttc2ctJmd0O3ZlYy5pb3ZlY2AgcG9pbnRlci4uLiBpdCYjMzk7cyBpbml0aWFsaXplZCB0byBgTlVMTGA/IFRoYXQmIzM5O3MgZGVmaW5pdGVseSBub3QgcmlnaHQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoZW4gYW5kIGhvdyB0aGlzIHZlY3RvciBpcyBzdXBwb3NlZCB0byBiZSBwb3B1bGF0ZWQuIFRoZSBmYWN0IHRoYXQgaXQmIzM5O3MgYE5VTExgIG5vdyBpbXBsaWVzIGFuIGlzc3VlIGVhcmxpZXIgaW4gdGhlIHNldHVwLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gdHJhY2UgdGhpcyBiYWNrIHRocm91Z2ggdGhlIHNlbmQgcGF0aC4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IGVpdGhlciBgaW9fc2VuZG1zZ19wcmVwYCBvciBwb3NzaWJseSBldmVuIGBpb19zZW5kX3ByZXBgIGRlcGVuZGluZyBvbiBob3cgdGhlIG1lc3NhZ2luZyBpcyBzdHJ1Y3R1cmVkIGluIHRoaXMgc3BlY2lmaWMgbW9kdWxlLiBJdCBpcyBtb3N0IGxpa2VseSBpbiBvbmUgb2YgdGhvc2UgZnVuY3Rpb25zLiBJIG5lZWQgdG8gcXVpY2tseSBpZGVudGlmeSB3aGVyZSB0aGUgYGlvdmVjYCBnZXRzIGFsbG9jYXRlZCBhbmQgcG9wdWxhdGVkLiBUaGlzIHdpbGwgYWxsb3cgbWUgdG8gbmFycm93IGRvd24gdGhlIHNvdXJjZSBvZiB0aGlzIHBvdGVudGlhbGx5IGZhdGFsIGVycm9yLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lvX3NlbmRfcHJlcCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ0MzAKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgZGVsaXZlcmVkIGFzIGEgZmlyc3QtcGVyc29uIHN1bW1hcnk6CgoqKkRpdmluZyBpbnRvIGlvXF9zZW5kbXNnXF9wcmVwKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGluLiBMZXQmIzM5O3MgZ2V0IHJpZ2h0IGRvd24gdG8gaXQuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIGBpb19zZW5kbXNnX3ByZXBgLiBHaXZlbiBteSBleHBlcmllbmNlLCBJIGtub3cgdGhpcyBpcyBvZnRlbiBhIGNyaXRpY2FsIHBvaW50IGluIHRoZSBuZXR3b3JraW5nIHN0YWNrLCBzbyBJJiMzOTtsbCB3YW50IHRvIGNhcmVmdWxseSBleGFtaW5lIHRoZSBwcmVwYXJhdGlvbiBzdGFnZXMgZm9yIGBzZW5kbXNnYC4gVGhpbmdzIGNhbiBnZXQgaGFpcnkgcXVpY2tseSBpbiB0aGlzIGFyZWEsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggYW5jaWxsYXJ5IGRhdGEsIHNjYXR0ZXIvZ2F0aGVyIEkvTywgYW5kIHRoZSBudWFuY2VzIG9mIHZhcmlvdXMgc29ja2V0IHR5cGVzLiBJJiMzOTttIGltbWVkaWF0ZWx5IHRoaW5raW5nIGFib3V0IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGJ1ZmZlciBtYW5hZ2VtZW50IGlzc3VlcywgYW5kIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgdGhlIHRyYW5zaXRpb24gZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGNsb3NlbHkgYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBiZWluZyB1c2VkLCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gc3RyYXRlZ2llcywgYW5kIGFueSBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLiBUaW1lIHRvIHNlZSB3aGF0JiMzOTtzIHJlYWxseSBnb2luZyBvbiB1bmRlciB0aGUgaG9vZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aW9fc2VuZG1zZ19wcmVwJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmM9Mzk2PXN0YXRpYyBpbnQgaW9fc2VuZG1zZ19zZXR1cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxuLS1cbmlvX3VyaW5nL25ldC5jLTQyMy1cbmlvX3VyaW5nL25ldC5jOjQyNDppbnQgaW9fc2VuZG1zZ19wcmVwKHN0cnVjdCBpb19raW9jYiAqcmVxLCBjb25zdCBzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWUpXG5pb191cmluZy9uZXQuYy00MjUte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDgwMgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgY29kZS4KCioqQW5hbHl6aW5nIGBpb19zZW5kbXNnX3ByZXBgIGFuZCBgaW9fc2VuZF9wcmVwYCoqCgpBbHJpZ2h0LCBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIGhvdyB0aGVzZSBmdW5jdGlvbnMgd29yay4gU3RhcnRpbmcgd2l0aCBgaW9fc2VuZG1zZ19wcmVwYC4uLiBhbmQgbm93IEkmIzM5O20gdGhpbmtpbmcsIGJhc2VkIG9uIHRoZSBuYW1pbmcgY29udmVudGlvbiwgYGlvX3NlbmRfcHJlcGAgaXMgcHJvYmFibHkgdGhlIGFzeW5jaHJvbm91cyB2ZXJzaW9uIG9yIGhhcyBzb21lIHNvcnQgb2YgYXN5bmNocm9ub3VzIGNvbXBvbmVudC4gUGVyaGFwcyBpdCYjMzk7cyBjYWxsZWQgc29tZXRoaW5nIGxpa2UgYGlvX3NlbmRfcHJlcF9hc3luY2AsIG9yIGhhcyBhIHNpbWlsYXIgbmFtaW5nIHBhdHRlcm4uIE5lZWQgdG8gY29uZmlybSB0aGF0IHF1aWNrbHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MDA6XHRcdHN0cnVjdCB1c2VyX21zZ2hkciBtc2c7XG4gNDAxOlx0XHRpbnQgcmV0O1xuIDQwMjpcdFxuIDQwMzpcdFx0c3ItXHUwMDNlZmxhZ3MgfD0gSU9SSU5HX1NFTkRfVkVDVE9SSVpFRDtcbiA0MDQ6XHRcdHNyLVx1MDAzZXVtc2cgPSB1NjRfdG9fdXNlcl9wdHIoUkVBRF9PTkNFKHNxZS1cdTAwM2VhZGRyKSk7XG4gNDA1Olx0XHRyZXQgPSBpb19tc2dfY29weV9oZHIocmVxLCBrbXNnLCBcdTAwMjZtc2csIElURVJfU09VUkNFLCBOVUxMKTtcbiA0MDY6XHRcdGlmICh1bmxpa2VseShyZXQpKVxuIDQwNzpcdFx0XHRyZXR1cm4gcmV0O1xuIDQwODpcdFx0Lyogc2F2ZSBtc2dfY29udHJvbCBhcyBzeXNfc2VuZG1zZygpIG92ZXJ3cml0ZXMgaXQgKi9cbiA0MDk6XHRcdHNyLVx1MDAzZW1zZ19jb250cm9sID0ga21zZy1cdTAwM2Vtc2cubXNnX2NvbnRyb2xfdXNlcjtcbiA0MTA6XHRcbiA0MTE6XHRcdGlmIChzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRikge1xuIDQxMjpcdFx0XHRrbXNnLVx1MDAzZW1zZy5tc2dfaXRlci5ucl9zZWdzID0gbXNnLm1zZ19pb3ZsZW47XG4gNDEzOlx0XHRcdHJldHVybiBpb19wcmVwX3JlZ19pb3ZlYyhyZXEsIFx1MDAyNmttc2ctXHUwMDNldmVjLCBtc2cubXNnX2lvdixcbiA0MTQ6XHRcdFx0XHRcdFx0IG1zZy5tc2dfaW92bGVuKTtcbiA0MTU6XHRcdH1cbiA0MTY6XHRcdGlmIChyZXEtXHUwMDNlZmxhZ3MgXHUwMDI2IFJFUV9GX0JVRkZFUl9TRUxFQ1QpXG4gNDE3Olx0XHRcdHJldHVybiAwO1xuIDQxODpcdFx0cmV0dXJuIGlvX25ldF9pbXBvcnRfdmVjKHJlcSwga21zZywgbXNnLm1zZ19pb3YsIG1zZy5tc2dfaW92bGVuLCBJVEVSX1NPVVJDRSk7XG4gNDE5Olx0fVxuIDQyMDpcdFxuIDQyMTpcdCNkZWZpbmUgU0VORE1TR19GTEFHUyAoSU9SSU5HX1JFQ1ZTRU5EX1BPTExfRklSU1QgfCBJT1JJTkdfUkVDVlNFTkRfQlVORExFIHwgXFxcbiA0MjI6XHRcdFx0XHRJT1JJTkdfU0VORF9WRUNUT1JJWkVEIHwgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRilcbiA0MjM6XHRcbiA0MjQ6XHRpbnQgaW9fc2VuZG1zZ19wcmVwKHN0cnVjdCBpb19raW9jYiAqcmVxLCBjb25zdCBzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWUpXG4gNDI1Olx0e1xuIDQyNjpcdFx0c3RydWN0IGlvX3NyX21zZyAqc3IgPSBpb19raW9jYl90b19jbWQocmVxLCBzdHJ1Y3QgaW9fc3JfbXNnKTtcbiA0Mjc6XHRcbiA0Mjg6XHRcdHNyLVx1MDAzZWRvbmVfaW8gPSAwO1xuIDQyOTpcdFx0c3ItXHUwMDNlbGVuID0gUkVBRF9PTkNFKHNxZS1cdTAwM2VsZW4pO1xuIDQzMDpcdFx0aWYgKHVubGlrZWx5KHNyLVx1MDAzZWxlbiBcdTAwM2MgMCkpXG4gNDMxOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDQzMjpcdFx0c3ItXHUwMDNlZmxhZ3MgPSBSRUFEX09OQ0Uoc3FlLVx1MDAzZWlvcHJpbyk7XG4gNDMzOlx0XHRpZiAoc3ItXHUwMDNlZmxhZ3MgXHUwMDI2IH5TRU5ETVNHX0ZMQUdTKVxuIDQzNDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0MzU6XHRcdGlmIChzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRikge1xuIDQzNjpcdFx0XHQvKiByZWdpc3RlcmVkIGJ1ZmZlciBzZW5kIG9ubHkgc3VwcG9ydGVkIGZvciBwbGFpbiBJT1JJTkdfT1BfU0VORCAqL1xuIDQzNzpcdFx0XHRpZiAocmVxLVx1MDAzZW9wY29kZSAhPSBJT1JJTkdfT1BfU0VORCB8fFxuIDQzODpcdFx0XHQgICAgKHJlcS1cdTAwM2VmbGFncyBcdTAwMjYgUkVRX0ZfQlVGRkVSX1NFTEVDVCkgfHxcbiA0Mzk6XHRcdFx0ICAgIChzci1cdTAwM2VmbGFncyBcdTAwMjYgKElPUklOR19SRUNWU0VORF9CVU5ETEV8SU9SSU5HX1NFTkRfVkVDVE9SSVpFRCkpKVxuIDQ0MDpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDQ0MTpcdFx0XHRyZXEtXHUwMDNlYnVmX2luZGV4ID0gUkVBRF9PTkNFKHNxZS1cdTAwM2VidWZfaW5kZXgpO1xuIDQ0MjpcdFx0fVxuIDQ0MzpcdFx0c3ItXHUwMDNlbXNnX2ZsYWdzID0gUkVBRF9PTkNFKHNxZS1cdTAwM2Vtc2dfZmxhZ3MpIHwgTVNHX05PU0lHTkFMO1xuIDQ0NDpcdFx0aWYgKHNyLVx1MDAzZW1zZ19mbGFncyBcdTAwMjYgTVNHX0RPTlRXQUlUKVxuIDQ0NTpcdFx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTk9XQUlUO1xuIDQ0NjpcdFx0aWYgKHJlcS1cdTAwM2VmbGFncyBcdTAwMjYgUkVRX0ZfQlVGRkVSX1NFTEVDVClcbiA0NDc6XHRcdFx0c3ItXHUwMDNlYnVmX2dyb3VwID0gcmVxLVx1MDAzZWJ1Zl9pbmRleDtcbiA0NDg6XHRcdGlmIChzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0JVTkRMRSkge1xuIDQ0OTpcdFx0XHRpZiAocmVxLVx1MDAzZW9wY29kZSA9PSBJT1JJTkdfT1BfU0VORE1TRylcbiA0NTA6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0NTE6XHRcdFx0c3ItXHUwMDNlbXNnX2ZsYWdzIHw9IE1TR19XQUlUQUxMO1xuIDQ1MjpcdFx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTVVMVElTSE9UO1xuIDQ1MzpcdFx0fVxuIDQ1NDpcdFxuIDQ1NTpcdFx0aWYgKGlvX2lzX2NvbXBhdChyZXEtXHUwMDNlY3R4KSlcbiA0NTY6XHRcdFx0c3ItXHUwMDNlbXNnX2ZsYWdzIHw9IE1TR19DTVNHX0NPTVBBVDtcbiA0NTc6XHRcbiA0NTg6XHRcdGlmICh1bmxpa2VseSghaW9fbXNnX2FsbG9jX2FzeW5jKHJlcSkpKVxuIDQ1OTpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiA0NjA6XHRcdGlmIChyZXEtXHUwMDNlb3Bjb2RlICE9IElPUklOR19PUF9TRU5ETVNHKVxuIDQ2MTpcdFx0XHRyZXR1cm4gaW9fc2VuZF9zZXR1cChyZXEsIHNxZSk7XG4gNDYyOlx0XHRpZiAodW5saWtlbHkoc3FlLVx1MDAzZWFkZHIyIHx8IHNxZS1cdTAwM2VmaWxlX2luZGV4KSlcbiA0NjM6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNDY0Olx0XHRyZXR1cm4gaW9fc2VuZG1zZ19zZXR1cChyZXEsIHNxZSk7XG4gNDY1Olx0fVxuIDQ2NjpcdFxuIDQ2NzpcdHN0YXRpYyB2b2lkIGlvX3JlcV9tc2dfY2xlYW51cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSxcbiA0Njg6XHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxuIDQ2OTpcdHtcbiA0NzA6XHRcdGlvX25ldG1zZ19yZWN5Y2xlKHJlcSwgaXNzdWVfZmxhZ3MpO1xuIDQ3MTpcdH1cbiA0NzI6XHRcbiA0NzM6XHQvKlxuIDQ3NDpcdCAqIEZvciBidW5kbGUgY29tcGxldGlvbnMsIHdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgbWFueSBzZWdtZW50cyB3ZSBjb25zdW1lZC5cbiA0NzU6XHQgKiBBIGJ1bmRsZSBjb3VsZCBiZSB1c2luZyBhIHNpbmdsZSBJVEVSX1VCVUYgaWYgdGhhdCYjMzk7cyBhbGwgd2UgbWFwcGVkLCBvciBpdFxuIDQ3NjpcdCAqIGNvdWxkIGJlIHVzaW5nIGFuIElURVJfSU9WRUMuIElmIHRoZSBsYXR0ZXIsIHRoZW4gaWYgd2UgY29uc3VtZWQgYWxsIG9mXG4gNDc3Olx0ICogdGhlIHNlZ21lbnRzLCB0aGVuIGl0JiMzOTtzIGEgdHJpdmlhbCBxdWVzdGlvbnQgbyBhbnN3ZXIuIElmIHdlIGhhdmUgcmVzaWR1YWxcbiA0Nzg6XHQgKiBkYXRhIGluIHRoZSBpdGVyLCB0aGVuIGxvb3AgdGhlIHNlZ21lbnRzIHRvIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2VcbiA0Nzk6XHQgKiB0cmFuc2ZlcnJlZC5cbiA0ODA6XHQgKi9cbiA0ODE6XHRzdGF0aWMgaW50IGlvX2J1bmRsZV9uYnVmcyhzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLCBpbnQgcmV0KVxuIDQ4MjpcdHtcbiA0ODM6XHRcdHN0cnVjdCBpb3ZlYyAqaW92O1xuIDQ4NDpcdFx0aW50IG5idWZzO1xuIDQ4NTpcdFxuIDQ4NjpcdFx0Lyogbm8gZGF0YSBpcyBhbHdheXMgemVybyBzZWdtZW50cywgYW5kIGEgdWJ1ZiBpcyBhbHdheXMgMSBzZWdtZW50ICovXG4gNDg3Olx0XHRpZiAocmV0IFx1MDAzYz0gMClcbiA0ODg6XHRcdFx0cmV0dXJuIDA7XG4gNDg5Olx0XHRpZiAoaXRlcl9pc191YnVmKFx1MDAyNmttc2ctXHUwMDNlbXNnLm1zZ19pdGVyKSlcbiA0OTA6XHRcdFx0cmV0dXJuIDE7XG4gNDkxOlx0XG4gNDkyOlx0XHRpb3YgPSBrbXNnLVx1MDAzZXZlYy5pb3ZlYztcbiA0OTM6XHRcdGlmICghaW92KVxuIDQ5NDpcdFx0XHRpb3YgPSBcdTAwMjZrbXNnLVx1MDAzZWZhc3RfaW92O1xuIDQ5NTpcdFxuIDQ5NjpcdFx0LyogaWYgYWxsIGRhdGEgd2FzIHRyYW5zZmVycmVkLCBpdCYjMzk7cyBiYXNpYyBwb2ludGVyIG1hdGggKi9cbiA0OTc6XHRcdGlmICghaW92X2l0ZXJfY291bnQoXHUwMDI2a21zZy1cdTAwM2Vtc2cubXNnX2l0ZXIpKVxuIDQ5ODpcdFx0XHRyZXR1cm4gaXRlcl9pb3YoXHUwMDI2a21zZy1cdTAwM2Vtc2cubXNnX2l0ZXIpIC0gaW92O1xuIDQ5OTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjc5OAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDMxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQmIzM5O3MgaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipJbnZlc3RpZ2F0aW5nIGBJT1JJTkdfT1BfU0VORGAgYW5kIGBpb19zZW5kX3NldHVwYCoqCgpBbHJpZ2h0LCBoYW5nIG9uIGEgc2Vjb25kLiBJJiMzOTttIHNlZWluZyBgaW9fc2VuZF9zZXR1cGAgYmVpbmcgY2FsbGVkIGluIHJlbGF0aW9uIHRvIGBJT1JJTkdfT1BfU0VORGAuIFRoYXQgZG9lc24mIzM5O3QgaW1tZWRpYXRlbHkgc3RyaWtlIG1lIGFzIHRoZSBtb3N0IG9idmlvdXMgc2V0dXAgZnVuY3Rpb24sIHNvIG15IGN1cmlvc2l0eSBpcyBwaXF1ZWQuIEkgbmVlZCB0byBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQgdGhhdCBwYXJ0aWN1bGFyIHNldHVwIGZ1bmN0aW9uIGlzIGRvaW5nIGluIHRoaXMgY29udGV4dC4gTGV0JiMzOTtzIGRpdmUgaW50byBgaW9fc2VuZF9zZXR1cGAgYW5kIG1ha2Ugc3VyZSBpdCYjMzk7cyBoYW5kbGluZyB0aGUgcmlnaHQgdGhpbmdzLCBhbmQgdGhhdCB0aGVyZSBhcmVuJiMzOTt0IGFueSBwb3RlbnRpYWwgc3VidGxldGllcyBJJiMzOTttIG1pc3NpbmcuIFRpbWUgdG8gc2VlIHdoYXQmIzM5O3MgYWN0dWFsbHkgaGFwcGVuaW5nIHVuZGVyIHRoZSBob29kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtpb19zZW5kX3NldHVwJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmM9MzQzPXZvaWQgaW9fc2VuZG1zZ19yZWN2bXNnX2NsZWFudXAoc3RydWN0IGlvX2tpb2NiICpyZXEpXG4tLVxuaW9fdXJpbmcvbmV0LmMtMzQ5LVxuaW9fdXJpbmcvbmV0LmM6MzUwOnN0YXRpYyBpbnQgaW9fc2VuZF9zZXR1cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxuaW9fdXJpbmcvbmV0LmMtMzUxLXtcbi0tXG5pb191cmluZy9uZXQuYz00MjQ9aW50IGlvX3NlbmRtc2dfcHJlcChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxuLS1cbmlvX3VyaW5nL25ldC5jLTQ2MC1cdGlmIChyZXEtXHUwMDNlb3Bjb2RlICE9IElPUklOR19PUF9TRU5ETVNHKVxuaW9fdXJpbmcvbmV0LmM6NDYxOlx0XHRyZXR1cm4gaW9fc2VuZF9zZXR1cChyZXEsIHNxZSk7XG5pb191cmluZy9uZXQuYy00NjItXHRpZiAodW5saWtlbHkoc3FlLVx1MDAzZWFkZHIyIHx8IHNxZS1cdTAwM2VmaWxlX2luZGV4KSlcbi0tXG5pb191cmluZy9uZXQuYz0xMzc3PWludCBpb19zZW5kX3pjX3ByZXAoc3RydWN0IGlvX2tpb2NiICpyZXEsIGNvbnN0IHN0cnVjdCBpb191cmluZ19zcWUgKnNxZSlcbi0tXG5pb191cmluZy9uZXQuYy0xNDMyLVx0aWYgKHJlcS1cdTAwM2VvcGNvZGUgPT0gSU9SSU5HX09QX1NFTkRfWkMpIHtcbmlvX3VyaW5nL25ldC5jOjE0MzM6XHRcdHJldCA9IGlvX3NlbmRfc2V0dXAocmVxLCBzcWUpO1xuaW9fdXJpbmcvbmV0LmMtMTQzNC1cdH0gZWxzZSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3Mzk4CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5JiMzOTtyZSBteSBvd246CgoqKkFuYWx5emluZyBgaW9fc2VuZF9zZXR1cGAqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgaW50byB0aGlzIGBpb19zZW5kX3NldHVwYCBmdW5jdGlvbi4gVGhlIG5hbWUgaXRzZWxmIGlzIHByZXR0eSBjbGVhcjsgaXQmIzM5O3MgYWJvdXQgc2V0dGluZyB1cCB0aGUgc2VuZGluZyBwcm9jZXNzIGZvciBJL08uIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCBzdGVwcyBpdCYjMzk7cyB0YWtpbmcgdG8gZ2V0IGRhdGEgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbiwgd2hhdGV2ZXIgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgb3IgcHJvdG9jb2wgbWlnaHQgYmUuIFdoYXQgcmVzb3VyY2VzIGlzIGl0IGFsbG9jYXRpbmc/IFdoYXQgY2hlY2tzIGlzIGl0IHBlcmZvcm1pbmcgdG8gZW5zdXJlIHRoZSBzZW5kIG9wZXJhdGlvbiBpcyB2aWFibGU/IEFyZSB0aGVyZSBhbnkgb3B0aW1pemF0aW9ucywgYnVmZmVyaW5nIHN0cmF0ZWdpZXMsIG9yIGVycm9yLWhhbmRsaW5nIG1lY2hhbmlzbXMgYXQgcGxheT8gSSYjMzk7bGwgbmVlZCB0byBkaXNzZWN0IHRoZSBjb2RlIGNhcmVmdWxseSB0byB1bmRlcnN0YW5kIHRoZSBmbG93IGNvbnRyb2wgYW5kIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQuIEkmIzM5O2xsIGJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGlkZW50aWZ5aW5nIGFueSBwb3RlbnRpYWwgYm90dGxlbmVja3Mgb3IgYXJlYXMgd2hlcmUgcGVyZm9ybWFuY2UgY291bGQgYmUgaW1wcm92ZWQsIGdpdmVuIG15IGV4cGVydGlzZS4gTGV0JiMzOTtzIHNlZSBpZiB0aGlzIHNldHVwIGZ1bmN0aW9uIGlzIG9wdGltaXplZCBvciBqdXN0IGEgYmFzaWMgaW1wbGVtZW50YXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM1MDpcdHN0YXRpYyBpbnQgaW9fc2VuZF9zZXR1cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxuIDM1MTpcdHtcbiAzNTI6XHRcdHN0cnVjdCBpb19zcl9tc2cgKnNyID0gaW9fa2lvY2JfdG9fY21kKHJlcSwgc3RydWN0IGlvX3NyX21zZyk7XG4gMzUzOlx0XHRzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnID0gcmVxLVx1MDAzZWFzeW5jX2RhdGE7XG4gMzU0Olx0XHR2b2lkIF9fdXNlciAqYWRkcjtcbiAzNTU6XHRcdHUxNiBhZGRyX2xlbjtcbiAzNTY6XHRcdGludCByZXQ7XG4gMzU3Olx0XG4gMzU4Olx0XHRzci1cdTAwM2VidWYgPSB1NjRfdG9fdXNlcl9wdHIoUkVBRF9PTkNFKHNxZS1cdTAwM2VhZGRyKSk7XG4gMzU5Olx0XG4gMzYwOlx0XHRpZiAoUkVBRF9PTkNFKHNxZS1cdTAwM2VfX3BhZDNbMF0pKVxuIDM2MTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzNjI6XHRcbiAzNjM6XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19uYW1lID0gTlVMTDtcbiAzNjQ6XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19uYW1lbGVuID0gMDtcbiAzNjU6XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19jb250cm9sID0gTlVMTDtcbiAzNjY6XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19jb250cm9sbGVuID0gMDtcbiAzNjc6XHRcdGttc2ctXHUwMDNlbXNnLm1zZ191YnVmID0gTlVMTDtcbiAzNjg6XHRcbiAzNjk6XHRcdGFkZHIgPSB1NjRfdG9fdXNlcl9wdHIoUkVBRF9PTkNFKHNxZS1cdTAwM2VhZGRyMikpO1xuIDM3MDpcdFx0YWRkcl9sZW4gPSBSRUFEX09OQ0Uoc3FlLVx1MDAzZWFkZHJfbGVuKTtcbiAzNzE6XHRcdGlmIChhZGRyKSB7XG4gMzcyOlx0XHRcdHJldCA9IG1vdmVfYWRkcl90b19rZXJuZWwoYWRkciwgYWRkcl9sZW4sIFx1MDAyNmttc2ctXHUwMDNlYWRkcik7XG4gMzczOlx0XHRcdGlmICh1bmxpa2VseShyZXQgXHUwMDNjIDApKVxuIDM3NDpcdFx0XHRcdHJldHVybiByZXQ7XG4gMzc1Olx0XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19uYW1lID0gXHUwMDI2a21zZy1cdTAwM2VhZGRyO1xuIDM3NjpcdFx0XHRrbXNnLVx1MDAzZW1zZy5tc2dfbmFtZWxlbiA9IGFkZHJfbGVuO1xuIDM3NzpcdFx0fVxuIDM3ODpcdFx0aWYgKHNyLVx1MDAzZWZsYWdzIFx1MDAyNiBJT1JJTkdfUkVDVlNFTkRfRklYRURfQlVGKSB7XG4gMzc5Olx0XHRcdGlmICghKHNyLVx1MDAzZWZsYWdzIFx1MDAyNiBJT1JJTkdfU0VORF9WRUNUT1JJWkVEKSkge1xuIDM4MDpcdFx0XHRcdHJlcS1cdTAwM2VmbGFncyB8PSBSRVFfRl9JTVBPUlRfQlVGRkVSO1xuIDM4MTpcdFx0XHRcdHJldHVybiAwO1xuIDM4MjpcdFx0XHR9XG4gMzgzOlx0XG4gMzg0Olx0XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19pdGVyLm5yX3NlZ3MgPSBzci1cdTAwM2VsZW47XG4gMzg1Olx0XHRcdHJldHVybiBpb19wcmVwX3JlZ19pb3ZlYyhyZXEsIFx1MDAyNmttc2ctXHUwMDNldmVjLCBzci1cdTAwM2VidWYsIHNyLVx1MDAzZWxlbik7XG4gMzg2Olx0XHR9XG4gMzg3Olx0XHRpZiAocmVxLVx1MDAzZWZsYWdzIFx1MDAyNiBSRVFfRl9CVUZGRVJfU0VMRUNUKVxuIDM4ODpcdFx0XHRyZXR1cm4gMDtcbiAzODk6XHRcbiAzOTA6XHRcdGlmIChzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1NFTkRfVkVDVE9SSVpFRClcbiAzOTE6XHRcdFx0cmV0dXJuIGlvX25ldF9pbXBvcnRfdmVjKHJlcSwga21zZywgc3ItXHUwMDNlYnVmLCBzci1cdTAwM2VsZW4sIElURVJfU09VUkNFKTtcbiAzOTI6XHRcbiAzOTM6XHRcdHJldHVybiBpbXBvcnRfdWJ1ZihJVEVSX1NPVVJDRSwgc3ItXHUwMDNlYnVmLCBzci1cdTAwM2VsZW4sIFx1MDAyNmttc2ctXHUwMDNlbXNnLm1zZ19pdGVyKTtcbiAzOTQ6XHR9XG4gMzk1Olx0XG4gMzk2Olx0c3RhdGljIGludCBpb19zZW5kbXNnX3NldHVwKHN0cnVjdCBpb19raW9jYiAqcmVxLCBjb25zdCBzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWUpXG4gMzk3Olx0e1xuIDM5ODpcdFx0c3RydWN0IGlvX3NyX21zZyAqc3IgPSBpb19raW9jYl90b19jbWQocmVxLCBzdHJ1Y3QgaW9fc3JfbXNnKTtcbiAzOTk6XHRcdHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2cgPSByZXEtXHUwMDNlYXN5bmNfZGF0YTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg1NzQKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA3NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aGUgZXhwZXJ0OgoKKipJbnZlc3RpZ2F0aW5nIGEgUG90ZW50aWFsIE1lbW9yeSBJc3N1ZSoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byBgaW9fc2VuZF9zZXR1cGAsIGFuZCBzb21ldGhpbmcmIzM5O3MgYnVnZ2luZyBtZS4gSXQgbG9va3MgbGlrZSBpdCAqaW1wbGljaXRseSogYXNzdW1lcyBga21zZy0mZ3Q7dmVjLmlvdmVjYCBpcyBpbml0aWFsaXplZCB0byBOVUxMLiBUaGUgY29kZSBkb2VzbiYjMzk7dCBleHBsaWNpdGx5IHNldCBpdCB0byBOVUxMLCB3aGljaCBpcyBhIGJpdCBvZiBhIHJlZCBmbGFnLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpdCByZWxpZXMgb24gdGhlIGFsbG9jYXRpb24sIGJ1dCBJIG5lZWQgdG8gYmUgc3VyZS4gSSBoYXZlIGEgaHVuY2ggdGhhdCBgaW9fbXNnX2FsbG9jX2FzeW5jYCAqbWlnaHQqIGJlIHplcm9pbmcgdGhlIGFsbG9jYXRlZCBtZW1vcnksIGluY2x1ZGluZyB0aGUgYGlvdmVjYCBwb2ludGVyIHdpdGhpbiB0aGF0IGBrbXNnYCBzdHJ1Y3R1cmUuIEJ1dCBJIGNhbiYjMzk7dCBiZSBjZXJ0YWluLiBUaGF0IGZ1bmN0aW9uIGlzIHRoZSBjcml0aWNhbCBwaWVjZSBvZiB0aGUgcHV6emxlIGhlcmUuIEkgcmVhbGx5IG5lZWQgdG8gY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBpb19tc2dfYWxsb2NfYXN5bmNgIHRvIGNvbmZpcm0gb3IgZWxpbWluYXRlIHRoaXMgcG9zc2libGUgc291cmNlIG9mIGFuIGlzc3VlLiBJcyBpdCBzYWZlIHRvIGFzc3VtZSB0aGF0IGBpb3ZlY2Agd2lsbCBiZSBudWxsLCBvciBhcmUgd2UgcmVseWluZyBvbiBzb21lIHNpZGUgZWZmZWN0IG9mIG1lbW9yeSBhbGxvY2F0aW9uPyBCZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5IOKAkyBsZXQmIzM5O3MgZ28gY2hlY2sgdGhlIGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lvX21zZ19hbGxvY19hc3luYyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jPTE2Nz1zdGF0aWMgdm9pZCBpb19uZXRtc2dfcmVjeWNsZShzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxuLS1cbmlvX3VyaW5nL25ldC5jLTE4NS1cbmlvX3VyaW5nL25ldC5jOjE4NjpzdGF0aWMgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaW9fbXNnX2FsbG9jX2FzeW5jKHN0cnVjdCBpb19raW9jYiAqcmVxKVxuaW9fdXJpbmcvbmV0LmMtMTg3LXtcbi0tXG5pb191cmluZy9uZXQuYz00MjQ9aW50IGlvX3NlbmRtc2dfcHJlcChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxuLS1cbmlvX3VyaW5nL25ldC5jLTQ1Ny1cbmlvX3VyaW5nL25ldC5jOjQ1ODpcdGlmICh1bmxpa2VseSghaW9fbXNnX2FsbG9jX2FzeW5jKHJlcSkpKVxuaW9fdXJpbmcvbmV0LmMtNDU5LVx0XHRyZXR1cm4gLUVOT01FTTtcbi0tXG5pb191cmluZy9uZXQuYz03Nzc9c3RhdGljIGludCBpb19yZWN2bXNnX3ByZXBfc2V0dXAoc3RydWN0IGlvX2tpb2NiICpyZXEpXG4tLVxuaW9fdXJpbmcvbmV0LmMtNzgxLVxuaW9fdXJpbmcvbmV0LmM6NzgyOlx0a21zZyA9IGlvX21zZ19hbGxvY19hc3luYyhyZXEpO1xuaW9fdXJpbmcvbmV0LmMtNzgzLVx0aWYgKHVubGlrZWx5KCFrbXNnKSlcbi0tXG5pb191cmluZy9uZXQuYz0xMzc3PWludCBpb19zZW5kX3pjX3ByZXAoc3RydWN0IGlvX2tpb2NiICpyZXEsIGNvbnN0IHN0cnVjdCBpb191cmluZ19zcWUgKnNxZSlcbi0tXG5pb191cmluZy9uZXQuYy0xNDI3LVxuaW9fdXJpbmcvbmV0LmM6MTQyODpcdGlvbXNnID0gaW9fbXNnX2FsbG9jX2FzeW5jKHJlcSk7XG5pb191cmluZy9uZXQuYy0xNDI5LVx0aWYgKHVubGlrZWx5KCFpb21zZykpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MzUzCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIGBpb19tc2dfYWxsb2NfYXN5bmNgOgoKKipEZWNvbnN0cnVjdGluZyBpb19tc2dfYWxsb2NfYXN5bmM6IEEgRGVlcCBEaXZlKioKCkFscmlnaHQsIHNvIEkgc2VlIHdlJiMzOTtyZSBsb29raW5nIGF0IGBpb19tc2dfYWxsb2NfYXN5bmNgLiBJbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGJyYWluIGtpY2tzIGluLCBjb25zaWRlcmluZyB3aGF0IGNvbnRleHQgdGhpcyBsaWtlbHkgc2l0cyB3aXRoaW4uIEJhc2VkIG9uIHRoZSBuYW1lLCBJJiMzOTttIGFscmVhZHkgZm9ybXVsYXRpbmcgYW4gZXhwZWN0YXRpb24uIEl0JiMzOTtzIGFuIGFsbG9jYXRpb24gZnVuY3Rpb24sIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIGFzeW5jaHJvbm91cyBJL08gbWVzc2FnZXMuIFRoZSAmIzM0O2FzeW5jJiMzNDsgaXMgdGhlIGtleSBpbmRpY2F0b3IgaGVyZSwgc3VnZ2VzdGluZyBub24tYmxvY2tpbmcgb3BlcmF0aW9ucyBhcmUgY2VudHJhbCB0byBpdHMgcHVycG9zZS4gSSYjMzk7bSBtZW50YWxseSBwaWN0dXJpbmcgYSBzeXN0ZW0gd2hlcmUgSS9PIHJlcXVlc3RzIGFyZSBpbml0aWF0ZWQgd2l0aG91dCB3YWl0aW5nIGZvciBjb21wbGV0aW9uLCBmcmVlaW5nIHVwIHJlc291cmNlcyBmb3Igb3RoZXIgdGFza3MuIFRoZSBuYW1lICYjMzQ7aW9fbXNnJiMzNDsgZnVydGhlciBoaW50cyBhdCBhIHN0cnVjdHVyZWQgZGF0YSBwYWNrYWdlLCBwcm9iYWJseSBob2xkaW5nIGRldGFpbHMgYWJvdXQgdGhlIEkvTyBvcGVyYXRpb24gaXRzZWxmOiB0aGUgdGFyZ2V0IGZpbGUgZGVzY3JpcHRvciwgdGhlIGJ1ZmZlciwgdGhlIG9wZXJhdGlvbiB0eXBlIChyZWFkIG9yIHdyaXRlKSwgcG90ZW50aWFsbHkgc29tZSBmbGFncywgYW5kIGRlZmluaXRlbHkgYSBjb21wbGV0aW9uIGNhbGxiYWNrIG9yIHNvbWUgZm9ybSBvZiBzaWduYWxpbmcgbWVjaGFuaXNtLgoKTXkgaW1tZWRpYXRlIHF1ZXN0aW9ucyBhcmU6IFdoYXQgZXhhY3RseSBpcyBiZWluZyBhbGxvY2F0ZWQ/IElzIGl0IGEgY29tcGxldGUgYGlvX21zZ2Agc3RydWN0dXJlLCBvciBzb21lIGludGVybmFsIGRhdGEgcmVsYXRlZCB0byBpdD8gRG9lcyBpdCBoYW5kbGUgbWVtb3J5IG1hbmFnZW1lbnQgZm9yIHRoZSBhY3R1YWwgZGF0YSBidWZmZXIsIG9yIGlzIHRoYXQgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXI/IFdoYXQgc29ydCBvZiBtZW1vcnkgYWxsb2NhdG9yIGlzIGl0IHVzaW5nPyBJcyBpdCB0aHJlYWQtc2FmZT8gSG93IGRvZXMgaXQgaGFuZGxlIGVycm9ycz8gRG9lcyBpdCBoYXZlIGFueSBvcHRpb25zIGZvciBwcmUtYWxsb2NhdGlvbiBvciByZXNvdXJjZSBwb29saW5nIHRvIG1pbmltaXplIG92ZXJoZWFkPyBVbmRlcnN0YW5kaW5nIHRoZXNlIGRldGFpbHMgaXMgY3J1Y2lhbCB0byBwZXJmb3JtYW5jZSBhbmQgcm9idXN0bmVzcywgZXNwZWNpYWxseSBpbiBhIGhlYXZpbHkgdGhyZWFkZWQgb3IgY29uY3VycmVudCBlbnZpcm9ubWVudC4gSSB3YW50IHRvIHNlZSBob3cgaXQgaW50ZWdyYXRlcyB3aXRoIHRoZSB1bmRlcmx5aW5nIGtlcm5lbCYjMzk7cyBhc3luY2hyb25vdXMgSS9PIG1lY2hhbmlzbXMsIGxpa2UgYGFpb19yZWFkYCBhbmQgYGFpb193cml0ZWAsIG9yIHdoYXRldmVyIGxvdy1sZXZlbCBwcmltaXRpdmVzIGl0JiMzOTtzIGJ1aWx0IHVwb24uIEkmIzM5O20ga2VlbiB0byB1bmRlcnN0YW5kIGhvdyBpdCBoYW5kbGVzIHN5bmNocm9uaXphdGlvbiBhbmQgYXZvaWRzIHJhY2UgY29uZGl0aW9ucywgZXNwZWNpYWxseSBpZiBpdCYjMzk7cyBpbnRlcmFjdGluZyB3aXRoIHNoYXJlZCBkYXRhIHN0cnVjdHVyZXMgb3Iga2VybmVsIHJlc291cmNlcy4gVGhpcyBpcyBhIGNyaXRpY2FsIGJ1aWxkaW5nIGJsb2NrIGZvciBhbnkgYXN5bmNocm9ub3VzIEkvTyBzeXN0ZW0sIGFuZCB1bmRlcnN0YW5kaW5nIGl0cyBkZXNpZ24gaXMga2V5IHRvIG9wdGltaXppbmcgdGhlIG92ZXJhbGwgYXBwbGljYXRpb24gcGVyZm9ybWFuY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxODYsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE4NjpcdHN0YXRpYyBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICppb19tc2dfYWxsb2NfYXN5bmMoc3RydWN0IGlvX2tpb2NiICpyZXEpXG4gMTg3Olx0e1xuIDE4ODpcdFx0c3RydWN0IGlvX3JpbmdfY3R4ICpjdHggPSByZXEtXHUwMDNlY3R4O1xuIDE4OTpcdFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaGRyO1xuIDE5MDpcdFxuIDE5MTpcdFx0aGRyID0gaW9fdXJpbmdfYWxsb2NfYXN5bmNfZGF0YShcdTAwMjZjdHgtXHUwMDNlbmV0bXNnX2NhY2hlLCByZXEpO1xuIDE5MjpcdFx0aWYgKCFoZHIpXG4gMTkzOlx0XHRcdHJldHVybiBOVUxMO1xuIDE5NDpcdFxuIDE5NTpcdFx0LyogSWYgdGhlIGFzeW5jIGRhdGEgd2FzIGNhY2hlZCwgd2UgbWlnaHQgaGF2ZSBhbiBpb3YgY2FjaGVkIGluc2lkZS4gKi9cbiAxOTY6XHRcdGlmIChoZHItXHUwMDNldmVjLmlvdmVjKVxuIDE5NzpcdFx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTkVFRF9DTEVBTlVQO1xuIDE5ODpcdFx0cmV0dXJuIGhkcjtcbiAxOTk6XHR9XG4gMjAwOlx0XG4gMjAxOlx0c3RhdGljIGlubGluZSB2b2lkIGlvX21zaG90X3ByZXBfcmV0cnkoc3RydWN0IGlvX2tpb2NiICpyZXEsXG4gMjAyOlx0XHRcdFx0XHQgICAgICAgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZylcbiAyMDM6XHR7XG4gMjA0Olx0XHRzdHJ1Y3QgaW9fc3JfbXNnICpzciA9IGlvX2tpb2NiX3RvX2NtZChyZXEsIHN0cnVjdCBpb19zcl9tc2cpO1xuIDIwNTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDE2MQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDgyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLgoKKipBbmFseXppbmcgdGhlIEFsbG9jYXRpb24gYW5kIFJlY3ljbGluZyBvZiBOZXR3b3JrIE1lc3NhZ2UgSGVhZGVycyoqCgpBbHJpZ2h0LCBzbyBgaW9fbXNnX2FsbG9jX2FzeW5jYCBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyB0aGUgaGVhZGVyLCBgaGRyYCwgZm9yIG5ldHdvcmsgbWVzc2FnZXMuIFRoZSBwb3RlbnRpYWwgd3JpbmtsZSBoZXJlIGlzIHRoYXQgaWYgdGhpcyBoZWFkZXIgd2FzIHByZXZpb3VzbHkgY2FjaGVkLCB0aGVyZSYjMzk7cyBhIGdvb2QgY2hhbmNlIHRoYXQgYGhkci0mZ3Q7dmVjLmlvdmVjYCBtaWdodCBhbHJlYWR5IGJlIHBvcHVsYXRlZC4gVGhlIGtleSBpcyB0byByZW1lbWJlciBpZiB0aGUgSS9PIHZlY3RvciBpcyBwb3B1bGF0ZWQsIGl0IG1lYW5zIHRoZSBoZWFkZXIgaGFzIGJlZW4gYWxsb2NhdGVkLCBpbiBhIHBhc3QgaW5zdGFuY2UuCgpOb3cgSSByZW1lbWJlciB0aGF0IGBpb19uZXRtc2dfcmVjeWNsZWAgY29tZXMgaW50byBwbGF5IGhlcmUsIGJlY2F1c2UgdGhhdCYjMzk7cyB3aGVyZSB0aGUgY2FjaGluZyBpcyBpbXBsZW1lbnRlZC4gU28sIG15IG5leHQgc3RlcCBpcyB0byBkcmlsbCBkb3duIGludG8gYGlvX25ldG1zZ19yZWN5Y2xlYCBhbmQgdmVyaWZ5IGhvdyBpdCBtYW5hZ2VzIGFuZCByZXVzZXMgdGhlc2UgaGVhZGVycy4gSXQmIzM5O3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucyBhbmQgaG93IHRoZSBgaW92ZWNgIGlzIG1hbmFnZWQgZHVyaW5nIHJlY3ljbGluZyB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIG1lbW9yeSBtYW5hZ2VtZW50IGNvbmZsaWN0cy4gVGhpcyByZXF1aXJlcyBhIGRlZXBlciBkaXZlIGludG8gdGhlIGBpb19uZXRtc2dfcmVjeWNsZWAgZnVuY3Rpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNjcsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE2NzpcdHN0YXRpYyB2b2lkIGlvX25ldG1zZ19yZWN5Y2xlKHN0cnVjdCBpb19raW9jYiAqcmVxLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXG4gMTY4Olx0e1xuIDE2OTpcdFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaGRyID0gcmVxLVx1MDAzZWFzeW5jX2RhdGE7XG4gMTcwOlx0XG4gMTcxOlx0XHQvKiBjYW4mIzM5O3QgcmVjeWNsZSwgZW5zdXJlIHdlIGZyZWUgdGhlIGlvdmVjIGlmIHdlIGhhdmUgb25lICovXG4gMTcyOlx0XHRpZiAodW5saWtlbHkoaXNzdWVfZmxhZ3MgXHUwMDI2IElPX1VSSU5HX0ZfVU5MT0NLRUQpKSB7XG4gMTczOlx0XHRcdGlvX25ldG1zZ19pb3ZlY19mcmVlKGhkcik7XG4gMTc0Olx0XHRcdHJldHVybjtcbiAxNzU6XHRcdH1cbiAxNzY6XHRcbiAxNzc6XHRcdC8qIExldCBub3JtYWwgY2xlYW51cCBwYXRoIHJlYXAgaXQgaWYgd2UgZmFpbCBhZGRpbmcgdG8gdGhlIGNhY2hlICovXG4gMTc4Olx0XHRpb19hbGxvY19jYWNoZV92ZWNfa2FzYW4oXHUwMDI2aGRyLVx1MDAzZXZlYyk7XG4gMTc5Olx0XHRpZiAoaGRyLVx1MDAzZXZlYy5uciBcdTAwM2UgSU9fVkVDX0NBQ0hFX1NPRlRfQ0FQKVxuIDE4MDpcdFx0XHRpb192ZWNfZnJlZShcdTAwMjZoZHItXHUwMDNldmVjKTtcbiAxODE6XHRcbiAxODI6XHRcdGlmIChpb19hbGxvY19jYWNoZV9wdXQoXHUwMDI2cmVxLVx1MDAzZWN0eC1cdTAwM2VuZXRtc2dfY2FjaGUsIGhkcikpXG4gMTgzOlx0XHRcdGlvX3JlcV9hc3luY19kYXRhX2NsZWFyKHJlcSwgUkVRX0ZfTkVFRF9DTEVBTlVQKTtcbiAxODQ6XHR9XG4gMTg1Olx0XG4gMTg2Olx0c3RhdGljIHN0cnVjdCBpb19hc3luY19tc2doZHIgKmlvX21zZ19hbGxvY19hc3luYyhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA4NjcKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAyNDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVXNlLUFmdGVyLUZyZWUgVnVsbmVyYWJpbGl0eSBpbiBpb191cmluZzogTXkgQW5hbHlzaXMqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBpb191cmluZyBjb2RlLCBhbmQgSSB0aGluayBJJiMzOTt2ZSBmb3VuZCBhIHByZXR0eSBzZXJpb3VzIGlzc3VlLiBUaGUgYGhkci0mZ3Q7dmVjLmlvdmVjYCBwb2ludGVyIGNhbiBiZSBub24tTlVMTCwgZXNwZWNpYWxseSBpZiBpdCB3YXMgcHJldmlvdXNseSBjYWNoZWQsIG9yIGlmIHRoZSB1c2VyIHN1cHBsaWVkIG1vcmUgdGhhbiBgVUlPX0ZBU1RJT1ZgIGlvdmVjcywgd2hpY2ggbGVhZHMgdG8gYGlvX25ldF9pbXBvcnRfdmVjYCBhbGxvY2F0aW5nIGBrbXNnLSZndDt2ZWMuaW92ZWNgLiBUaGF0JiMzOTtzIHdoZXJlIGl0IHJlYWxseSBnZXRzIGludGVyZXN0aW5nIGJlY2F1c2UgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgc2V0cyBgYXJnLm1vZGUgPSBLQlVGX01PREVfRlJFRWAgd2hlbiBga21zZy0mZ3Q7dmVjLmlvdmVjYCBpcyBub24tTlVMTC4gQnV0IGhlcmUmIzM5O3MgdGhlIGtpY2tlcjogYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBnb2VzIGFuZCBmcmVlcyBpdCEgUmlnaHQgYXQgdGhlIGVuZCEKCkFuZCB0aGVuLCBpbmNyZWRpYmx5LCBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCAqc3RpbGwqIHRyaWVzIHRvIHVzZSB0aGF0IGZyZWVkIG1lbW9yeS4gSXTigJlzIGEgdGV4dGJvb2sgdXNlLWFmdGVyLWZyZWUhIEnigJltIHByZXR0eSBjb25maWRlbnQgdGhhdCB0aGlzIGlzIGEgMTAwJSByZXByb2R1Y2libGUgZXhwbG9pdC4gVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcgYW5kIGxvb2tpbmcgYXQgbW9yZSBjbG9zZWx5LgoKTGV0JiMzOTtzIGNoZWNrIGBXb3J0aEZ1enppbmdgLiBZZXMsIGFic29sdXRlbHkhIFdoYXQgY29uZmlndXJhdGlvbnMgYXJlIG5lZWRlZD8gYENPTkZJR19JT19VUklOR2AgaXMgZXNzZW50aWFsLCBhbmQgSSBzdXNwZWN0IGBDT05GSUdfTkVUYCBpcyByZXF1aXJlZCBhcyB3ZWxsLCBnaXZlbiB0aGF0IHRoaXMgc2VlbXMgbmV0d29ya2luZyByZWxhdGVkIGFuZCBJIHNlZSBpdCYjMzk7cyBpbiBgaW9fdXJpbmcvbmV0LmNgLiBJIHNob3VsZCBwcm9iYWJseSBjb25maXJtIHRoYXQgd2l0aCB0aGUgYGlvX3VyaW5nL0tjb25maWdgIGFuZCBgaW9fdXJpbmcvTWFrZWZpbGVgIGZpbGVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtrYnVmLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpb191cmluZy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcvTWFrZWZpbGU9Nz1lbmRpZlxuaW9fdXJpbmcvTWFrZWZpbGUtOC1cbmlvX3VyaW5nL01ha2VmaWxlOjk6b2JqLSQoQ09ORklHX0lPX1VSSU5HKVx0XHQmIzQzOz0gaW9fdXJpbmcubyBvcGRlZi5vIGtidWYubyByc3JjLm8gbm90aWYubyBcXFxuaW9fdXJpbmcvTWFrZWZpbGUtMTAtXHRcdFx0XHRcdHRjdHgubyBmaWxldGFibGUubyBydy5vIHBvbGwubyBcXFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTU3NgoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkluaXRpYWwgSW5xdWlyeTogVGhlIFNpZ25pZmljYW5jZSBvZiBgbmV0Lm9gKioKCkhtbSwgbGV0IG1lIHNlZeKApiBXaGF0JiMzOTtzIHRoZSBjb250ZXh0IGhlcmU/IEp1c3QgdGhlIG1lbnRpb24gb2YgYG5ldC5vYCBtYWtlcyBteSBtaW5kIGp1bXAgdG8gYSBmZXcgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMuIElzIHRoaXMgcmVsYXRlZCB0byBuZXR3b3JraW5nLCBwZXJoYXBzIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZywgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFdpdGhvdXQgbW9yZSBpbmZvcm1hdGlvbiwgSSYjMzk7bSBhbHJlYWR5IHN0YXJ0aW5nIHRvIG1lbnRhbGx5IHJ1biB0aHJvdWdoIHNjZW5hcmlvcy4gSXMgYG5ldC5vYCBhIGNvbXBpbGVkIG9iamVjdCBmaWxlIHJlbGF0ZWQgdG8gYSBuZXR3b3JrIG1vZHVsZSwgcGVyaGFwcyBmcm9tIGEgbGFyZ2VyIHByb2plY3Q/IENvdWxkIGl0IGJlIGEgZGVidWdnaW5nIHN5bWJvbCBmaWxlPyBPciBtYXliZSBpdCYjMzk7cyBzb21lIGN1c3RvbSBmb3JtYXQgb3IgbGlicmFyeT8gVGhlIGxhY2sgb2Ygc3Vycm91bmRpbmcgY29udGV4dCBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gaW1tZWRpYXRlbHkgY2xhc3NpZnkuIEkgd2FudCB0byBkZWx2ZSBmdXJ0aGVyIHRvIHVuZGVyc3RhbmQgaXRzIHNpZ25pZmljYW5jZS4gTXkgaW50dWl0aW9uIHRlbGxzIG1lIHRoYXQgdGhlIGltbWVkaWF0ZSBpbXBvcnRhbmNlIGxpZXMgbm90IGluIHRoZSBmaWxlIGl0c2VsZiwgYnV0IHdoZXJlIGl0IHNpdHMsIGFuZCBob3cgaXQgaXMgdXNlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmV0Lm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpb191cmluZy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcvTWFrZWZpbGU9MjM9b2JqLSQoQ09ORklHX05FVF9SWF9CVVNZX1BPTEwpXHQmIzQzOz0gbmFwaS5vXG5pb191cmluZy9NYWtlZmlsZToyNDpvYmotJChDT05GSUdfTkVUKSAmIzQzOz0gbmV0Lm8gY21kX25ldC5vXG5pb191cmluZy9NYWtlZmlsZS0yNS1vYmotJChDT05GSUdfUFJPQ19GUykgJiM0Mzs9IGZkaW5mby5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxODk3CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTk1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgS2VybmVsIEJ1ZyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gbWFrZSBzdXJlIGBDT05GSUdfSU9fVVJJTkdgIGFuZCBgQ09ORklHX05FVGAgYXJlIGVuYWJsZWQuIFRoYXQgc2VlbXMgbGlrZSBhIGxvZ2ljYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhpcyBidWcuCgpOb3csIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGRldGFpbHMuIEkgbmVlZCB0byB6ZXJvIGluIG9uIHRoZSByZWxldmFudCBzeW1ib2xzLiBUaGUgYnVnIGFwcGVhcnMgdG8gYmUgaW4gYGlvX3JpbmdfYnVmZmVyc19wZWVrYCB3aXRoaW4gYGlvX3VyaW5nL2tidWYuY2AuIEFscmlnaHQsIGxldCYjMzk7cyBzZWUgd2hlcmUgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQuIFRyYWNpbmcgdGhlIGNhbGxzLCBJIHNlZSBgaW9fYnVmZmVyc19zZWxlY3RgIGxlYWRzIHRvIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgLCB3aGljaCB0aGVuIGNhbGxzIGBpb19zZW5kYC4gSSBhbHNvIHNlZSBhIHNlcGFyYXRlIHBhdGggdGhyb3VnaCBgaW9fcmVjdl9idWZfc2VsZWN0YCB0aGF0IGFsc28gZXZlbnR1YWxseSBlbmRzIHVwIGNhbGxpbmcgYGlvX3JlY3ZgLgoKU28gbXkga2V5IGZvY3VzIGFyZWFzIGFyZTogYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBpcyBjZW50cmFsLCBidXQgYWxzbyBgaW9fYnVmZmVyc19zZWxlY3RgLCBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCwgYGlvX3JlY3ZfYnVmX3NlbGVjdGAsIGBpb19zZW5kYCwgYW5kIGBpb19yZWN2YC4gTGV0IG1lIHF1aWNrbHkgY29uZmlybSB3aGV0aGVyIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgaXMgc3RhdGljLCBpbiBjYXNlIGl0IGlzbiYjMzk7dCwgc28gSSB1bmRlcnN0YW5kIHRoZSBzY29wZSBvZiB0aGUgcHJvYmxlbS4gQWgsIHllcywgaXQmIzM5O3Mgc3RhdGljLiBUaGF0IG5hcnJvd3MgdGhlIHNjb3BlIG9mIHRoZSBwb3RlbnRpYWwgaW1wYWN0LiBTbyBub3csIEkmIzM5O2xsIGNvbmNlbnRyYXRlIG15IGFuYWx5c2lzIG9uIHRoZSBvdGhlciBmdW5jdGlvbnMgSSBqdXN0IGlkZW50aWZpZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lvX3NlbmRfc2VsZWN0X2J1ZmZlciYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jPTU1OT1pbnQgaW9fc2VuZG1zZyhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxuLS1cbmlvX3VyaW5nL25ldC5jLTYwNy1cbmlvX3VyaW5nL25ldC5jOjYwODpzdGF0aWMgaW50IGlvX3NlbmRfc2VsZWN0X2J1ZmZlcihzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzLFxuaW9fdXJpbmcvbmV0LmMtNjA5LVx0XHRcdFx0IHN0cnVjdCBpb19icl9zZWwgKnNlbCwgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZylcbi0tXG5pb191cmluZy9uZXQuYz02NTY9aW50IGlvX3NlbmQoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcbi0tXG5pb191cmluZy9uZXQuYy02ODktXHRpZiAoaW9fZG9fYnVmZmVyX3NlbGVjdChyZXEpKSB7XG5pb191cmluZy9uZXQuYzo2OTA6XHRcdHJldCA9IGlvX3NlbmRfc2VsZWN0X2J1ZmZlcihyZXEsIGlzc3VlX2ZsYWdzLCBcdTAwMjZzZWwsIGttc2cpO1xuaW9fdXJpbmcvbmV0LmMtNjkxLVx0XHRpZiAocmV0KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjY2NwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgUG90ZW50aWFsIEZ1enppbmcgVGFyZ2V0cyoqCgpPa2F5LCBob2xkIG9uLiBJIG5lZWQgdG8gdGhpbmsgdGhyb3VnaCB0aGlzLiBJIGp1c3Qgc2F3IHRoYXQgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgaXMgYSBzdGF0aWMgZnVuY3Rpb24uIFRoYXQmIzM5O3MgYSBrZXkgZGV0YWlsLiBDYW4gc3l6a2FsbGVyICpkaXJlY3RseSogZnV6eiBzdGF0aWMgZnVuY3Rpb25zIGxpa2UgdGhhdD8gSSBkb24mIzM5O3QgdGhpbmsgc28sIGJ1dCBpdCYjMzk7cyBzdGlsbCB3b3J0aHdoaWxlIHRvIGluY2x1ZGUgdGhlbSBpbiB0aGUgbGlzdC4gQnkgbGlzdGluZyB0aGVtLCBldmVuIGlmIHRoZSBmdXp6ZXIgY2FuJiMzOTt0IHRhcmdldCAqdGhlbSogZGlyZWN0bHksIHdlIGNhbiBlbnN1cmUgdGhhdCBjb2RlIHBhdGhzIHVzaW5nIHRoZXNlIGZ1bmN0aW9ucyBhcmUgcHJpb3JpdGl6ZWQgZHVyaW5nIGZ1enppbmcuCgpSaWdodCwgYmFjayB0byB0aGUgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OyBkZWZpbml0aW9uLiBUaGF0JiMzOTtzIGEgZ29vZCBwcm9tcHQgZm9yIG1lIHRvIHJldmlldy4gSXQgaXMgYSAmIzM0O0xpc3Qgb2Ygc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0byBmb2N1cyBmdXp6aW5nIG9uLiBTaG91bGQgYXZvaWQgaG90LXBhdGggZnVuY3Rpb25zJiMzNDsuIFdlIHdhbnQgdG8ga2VlcCBmcm9tIG92ZXJ3aGVsbWluZyB0aGUgZnV6emVyLgoKT2theSwgbGV0JiMzOTtzIHNlZS4uLiBhIGdvb2QgY2FuZGlkYXRlIGZvciB0aGlzIGlzIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuIEl04oCZcyBsaWtlbHkgYSBnb29kIGVudHJ5IHBvaW50LiBUaGVuLCBsZXQmIzM5O3MgYWxzbyByZW1lbWJlciBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBhbmQgYGlvX3JlY3ZfYnVmX3NlbGVjdGAuIFRob3NlIGxvb2sgbGlrZSBwcm9taXNpbmcgdGFyZ2V0cyBhcyB3ZWxsLiBJJiMzOTttIHN0YXJ0aW5nIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBhcHByb2FjaCBpcyB2YWx1YWJsZS4gTGV0IG1lIGZvY3VzIG9uIGBpb19yZWN2X2J1Zl9zZWxlY3RgIGZvciBhIG1vbWVudCBhbmQgc2VlIHdoZXJlIHRoYXQgbGVhZHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lvX3JlY3ZfYnVmX3NlbGVjdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jPTEwNTA9aW50IGlvX3JlY3Ztc2coc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcbi0tXG5pb191cmluZy9uZXQuYy0xMTM2LVxuaW9fdXJpbmcvbmV0LmM6MTEzNzpzdGF0aWMgaW50IGlvX3JlY3ZfYnVmX3NlbGVjdChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZyxcbmlvX3VyaW5nL25ldC5jLTExMzgtXHRcdFx0ICAgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXG4tLVxuaW9fdXJpbmcvbmV0LmM9MTIwOT1pbnQgaW9fcmVjdihzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxuLS1cbmlvX3VyaW5nL25ldC5jLTEyNDctXHRcdHNlbC52YWwgPSBzci1cdTAwM2VsZW47XG5pb191cmluZy9uZXQuYzoxMjQ4Olx0XHRyZXQgPSBpb19yZWN2X2J1Zl9zZWxlY3QocmVxLCBrbXNnLCBcdTAwMjZzZWwsIGlzc3VlX2ZsYWdzKTtcbmlvX3VyaW5nL25ldC5jLTEyNDktXHRcdGlmICh1bmxpa2VseShyZXQgXHUwMDNjIDApKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzMzYwCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMjg4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBQb3RlbnRpYWwgVnVsbmVyYWJpbGl0aWVzIGluIGlvX3VyaW5nL2tidWYuYyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGRpZ2dpbmcgaW50byB0aGlzIGBpb191cmluZy9rYnVmLmNgIGNvZGUsIGFuZCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucy4gRnJvbSB3aGF0IEkgY2FuIHRlbGwsIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AsIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgLCBhbmQgYGlvX3JlY3ZfYnVmX3NlbGVjdGAgYXJlIHRoZSBwcmltYXJ5IG9uZXMgdG8gd2F0Y2guIEkgYWxzbyBuZWVkIHRvIGtlZXAgYGlvX2J1ZmZlcnNfc2VsZWN0YCBhbmQgYGlvX2J1ZmZlcnNfcGVla2AgaW4gbWluZC4KCkZpcnN0LCBsZXQgbWUgY29uZmlybSBzb21ldGhpbmc6IGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgaXMgaW5kZWVkIHN0YXRpYywgYXMgSSBzdXNwZWN0ZWQuIE5vdywgSSYjMzk7bGwgY3JlYXRlIGEgY2hlY2tsaXN0IG9mIHRob3NlIGZ1bmN0aW9ucy4KCiogICBgaW9fcmluZ19idWZmZXJzX3BlZWtgCiogICBgaW9fYnVmZmVyc19zZWxlY3RgCiogICBgaW9fYnVmZmVyc19wZWVrYAoqICAgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAKKiAgIGBpb19yZWN2X2J1Zl9zZWxlY3RgCgpIb2xkIG9uLCBJIHNlZSBzb21ldGhpbmcgc2lnbmlmaWNhbnQgYWJvdXQgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBmcm9tIHRoaXMgcGF0Y2guIEl0IHNlZW1zIHRoYXQgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgKnVzZS1hZnRlci1mcmVlKiB2dWxuZXJhYmlsaXR5IGJ5IG1vdmluZyB0aGUgYGtmcmVlKGFyZy0mZ3Q7aW92cylgIGNhbGwgdG8gdGhlIGVuZCBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBUaGlzIGhhcHBlbnMgd2hlbiBgYXJnLSZndDttb2RlICZhbXA7IEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQuIE5vdywgd2hlcmUgaXMgYEtCVUZfTU9ERV9GUkVFYCBiZWluZyBzZXQ/IEFoYSEgSXQmIzM5O3Mgc2V0IGluIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGFuZCBgaW9fcmVjdl9idWZfc2VsZWN0YCBzcGVjaWZpY2FsbHkgd2hlbiBga21zZy0mZ3Q7dmVjLmlvdmVjYCBpcyBhbHJlYWR5IGFsbG9jYXRlZC4KClRoZXJlZm9yZSwgdGhlIGZ1enplciBzaG91bGQgZGVmaW5pdGVseSBwcmlvcml0aXplIHRhcmdldGluZyB0aG9zZSB0d28gZnVuY3Rpb25zIChgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBhbmQgYGlvX3JlY3ZfYnVmX3NlbGVjdGApIGJlY2F1c2UgdGhleSBhcmUgcHJpbWUgY2FuZGlkYXRlcyBmb3IgdHJpZ2dlcmluZyB0aGUgYnVnLiBJIHJlYWxseSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0byBiZSBzdXJlIEkgYW0gbm90IG1pc3NpbmcgYW55IG90aGVyIHBsYWNlcyBgS0JVRl9NT0RFX0ZSRUVgIG1pZ2h0IGJlIHNldC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7S0JVRl9NT0RFX0ZSRUUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpb191cmluZy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jPTI1Mz1zdGF0aWMgaW50IGlvX3JpbmdfYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcbi0tXG5pb191cmluZy9rYnVmLmMtMzMwLVxuaW9fdXJpbmcva2J1Zi5jOjMzMTpcdGlmIChhcmctXHUwMDNlbW9kZSBcdTAwMjYgS0JVRl9NT0RFX0ZSRUUpXG5pb191cmluZy9rYnVmLmMtMzMyLVx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG4tLVxuaW9fdXJpbmcva2J1Zi5oPTUzPWVudW0ge1xuLS1cbmlvX3VyaW5nL2tidWYuaC01Ni1cdC8qIGlmIGJpZ2dlciB2ZWMgYWxsb2NhdGVkLCBmcmVlIG9sZCBvbmUgKi9cbmlvX3VyaW5nL2tidWYuaDo1NzpcdEtCVUZfTU9ERV9GUkVFXHRcdD0gMixcbmlvX3VyaW5nL2tidWYuaC01OC19O1xuLS1cbmlvX3VyaW5nL25ldC5jPTYwOD1zdGF0aWMgaW50IGlvX3NlbmRfc2VsZWN0X2J1ZmZlcihzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzLFxuLS1cbmlvX3VyaW5nL25ldC5jLTYyMi1cdFx0YXJnLmlvdnMgPSBrbXNnLVx1MDAzZXZlYy5pb3ZlYztcbmlvX3VyaW5nL25ldC5jOjYyMzpcdFx0YXJnLm1vZGUgPSBLQlVGX01PREVfRlJFRTtcbmlvX3VyaW5nL25ldC5jLTYyNC1cdH1cbi0tXG5pb191cmluZy9uZXQuYz0xMTM3PXN0YXRpYyBpbnQgaW9fcmVjdl9idWZfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLFxuLS1cbmlvX3VyaW5nL25ldC5jLTExNTktXHRcdFx0YXJnLmlvdnMgPSBrbXNnLVx1MDAzZXZlYy5pb3ZlYztcbmlvX3VyaW5nL25ldC5jOjExNjA6XHRcdFx0YXJnLm1vZGUgfD0gS0JVRl9NT0RFX0ZSRUU7XG5pb191cmluZy9uZXQuYy0xMTYxLVx0XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0NTIzCgkJCQkJCQlvdXRwdXQ6IDIzNQoJCQkJCQkJdGhvdWdodHM6IDI2OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgSU9fVVJJTkcgVnVsbmVyYWJpbGl0eSoqCgpPa2F5LCBzbyB0aGlzIGlzIGZvY3VzZWQgb24gYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgYW5kIGBpb19yZWN2X2J1Zl9zZWxlY3RgIOKAkyB3aGljaCBjb25maXJtcyB0aGUgZm9jdXMgc3ltYm9scyBJIGlkZW50aWZpZWQgYXJlIGNvcnJlY3QuIExldCYjMzk7cyBicmVhayBkb3duIHRoZSBpc3N1ZSBtZXRob2RpY2FsbHkuCgpUaGUgcGF0Y2gmIzM5O3MgcHJvYmxlbSBsaWVzIGluIG1vdmluZyB0aGF0IGBrZnJlZShhcmctJmd0O2lvdnMpYCBjYWxsIHRvIHRoZSBlbmQgb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC4gVGhlIGxvZ2ljIGhlcmUgaXMga2V5OiBpZiBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgYGFyZy0mZ3Q7aW92c2AgZ2V0cyB1bmNvbmRpdGlvbmFsbHkgZnJlZWQgKmJlZm9yZSogdGhlIGZ1bmN0aW9uIHJldHVybnMuIE5vdywgYGFyZy0mZ3Q7aW92c2AgaXMgKmVpdGhlciogYSBmcmVzaGx5IGFsbG9jYXRlZCBhcnJheSAoaWYgdGhlIG9yaWdpbmFsIG5lZWRlZCBleHBhbnNpb24pICpvciogdGhlIG9yaWdpbmFsIGFycmF5IHBhc3NlZCBpbi4gVGhlIGNyaXRpY2FsIHBvaW50IGlzIHRoYXQsIHJlZ2FyZGxlc3Mgb2YgYWxsb2NhdGlvbiwgdGhlIHBvaW50ZXIgdG8gYGFyZy0mZ3Q7aW92c2AgaXMgKnN0aWxsKiBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyLCB3aGljaCBpcyBlaXRoZXIgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgb3IgYGlvX3JlY3ZfYnVmX3NlbGVjdGAuCgpUaGlzIGNyZWF0ZXMgYSBuYXN0eSwgMTAwJSByZXByb2R1Y2libGUgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0eS4gRXNzZW50aWFsbHksIGlmIHlvdSYjMzk7cmUgdXNpbmcgcHJvdmlkZWQgYnVmZmVycyB3aXRoIGBpb19zZW5kYCBvciBgaW9fcmVjdmAsIHdpdGggcHJlLWFsbG9jYXRlZCBpb3ZlY3MsIHRoZSBidWZmZXJzIGFyZSBmcmVlZCBiZWZvcmUgdGhlIGNhbGxlciBjYW4gcHJvY2VzcyB0aGVtLiBUaGlzIGlzIGEgY2xlYXIsIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgc2NyZWFtcyBmb3IgZnV6emluZy4KCk15IHByaW1hcnkgY29uZmlndXJhdGlvbiBjb25jZXJucyBhcmUgYElPX1VSSU5HYCBhbmQgYE5FVGAsIG5hdHVyYWxseS4KCk5vdywgbGV0JiMzOTtzIHByb2NlZWQgdG8gc2V0LXJlc3VsdHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtJT19VUklORyYjMzQ7LAogICAgJiMzNDtORVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpb19yaW5nX2J1ZmZlcnNfcGVlayYjMzQ7LAogICAgJiMzNDtpb19idWZmZXJzX3NlbGVjdCYjMzQ7LAogICAgJiMzNDtpb19zZW5kX3NlbGVjdF9idWZmZXImIzM0OywKICAgICYjMzQ7aW9fcmVjdl9idWZfc2VsZWN0JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vdmVzIGBrZnJlZShhcmctXHUwMDNlaW92cylgIHRvIHRoZSBlbmQgb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC4gSWYgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQsIHRoaXMgdW5jb25kaXRpb25hbGx5IGZyZWVzIGBhcmctXHUwMDNlaW92c2AgYmVmb3JlIHJldHVybmluZy4gSG93ZXZlciwgYGFyZy1cdTAwM2Vpb3ZzYCBpcyBlaXRoZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCBhcnJheSAoaWYgZXhwYW5kZWQpIG9yIHRoZSBvcmlnaW5hbCBhcnJheSwgYW5kIGluIGJvdGggY2FzZXMsIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIG9yIGBpb19yZWN2X2J1Zl9zZWxlY3RgKSB3aGljaCB0aGVuIHVzZXMgaXQuIFRoaXMgaW50cm9kdWNlcyBhIDEwMCUgcmVwcm9kdWNpYmxlIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkgd2hlbiB1c2luZyBwcm92aWRlZCBidWZmZXJzIHdpdGggYGlvX3NlbmRgIG9yIGBpb19yZWN2YCBhbmQgcHJlLWFsbG9jYXRlZCBpb3ZlY3MuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lPX1VSSU5HJiMzNDssCiAgICAmIzM0O05FVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2lvX3JpbmdfYnVmZmVyc19wZWVrJiMzNDssCiAgICAmIzM0O2lvX2J1ZmZlcnNfc2VsZWN0JiMzNDssCiAgICAmIzM0O2lvX3NlbmRfc2VsZWN0X2J1ZmZlciYjMzQ7LAogICAgJiMzNDtpb19yZWN2X2J1Zl9zZWxlY3QmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW92ZXMgYGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKWAgdG8gdGhlIGVuZCBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBJZiBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgdGhpcyB1bmNvbmRpdGlvbmFsbHkgZnJlZXMgYGFyZy1cdTAwM2Vpb3ZzYCBiZWZvcmUgcmV0dXJuaW5nLiBIb3dldmVyLCBgYXJnLVx1MDAzZWlvdnNgIGlzIGVpdGhlciB0aGUgbmV3bHkgYWxsb2NhdGVkIGFycmF5IChpZiBleHBhbmRlZCkgb3IgdGhlIG9yaWdpbmFsIGFycmF5LCBhbmQgaW4gYm90aCBjYXNlcywgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciAoYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgb3IgYGlvX3JlY3ZfYnVmX3NlbGVjdGApIHdoaWNoIHRoZW4gdXNlcyBpdC4gVGhpcyBpbnRyb2R1Y2VzIGEgMTAwJSByZXByb2R1Y2libGUgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0eSB3aGVuIHVzaW5nIHByb3ZpZGVkIGJ1ZmZlcnMgd2l0aCBgaW9fc2VuZGAgb3IgYGlvX3JlY3ZgIGFuZCBwcmUtYWxsb2NhdGVkIGlvdmVjcy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMxOjQ4Ljg1ODE2MzE1OVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4ODM0NDI1ODEyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJT19VUklOR1wiLFxuICAgIFwiTkVUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaW9fcmluZ19idWZmZXJzX3BlZWtcIixcbiAgICBcImlvX2J1ZmZlcnNfc2VsZWN0XCIsXG4gICAgXCJpb19zZW5kX3NlbGVjdF9idWZmZXJcIixcbiAgICBcImlvX3JlY3ZfYnVmX3NlbGVjdFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vdmVzIGBrZnJlZShhcmctXFx1MDAzZWlvdnMpYCB0byB0aGUgZW5kIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuIElmIGBLQlVGX01PREVfRlJFRWAgaXMgc2V0LCB0aGlzIHVuY29uZGl0aW9uYWxseSBmcmVlcyBgYXJnLVxcdTAwM2Vpb3ZzYCBiZWZvcmUgcmV0dXJuaW5nLiBIb3dldmVyLCBgYXJnLVxcdTAwM2Vpb3ZzYCBpcyBlaXRoZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCBhcnJheSAoaWYgZXhwYW5kZWQpIG9yIHRoZSBvcmlnaW5hbCBhcnJheSwgYW5kIGluIGJvdGggY2FzZXMsIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIG9yIGBpb19yZWN2X2J1Zl9zZWxlY3RgKSB3aGljaCB0aGVuIHVzZXMgaXQuIFRoaXMgaW50cm9kdWNlcyBhIDEwMCUgcmVwcm9kdWNpYmxlIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkgd2hlbiB1c2luZyBwcm92aWRlZCBidWZmZXJzIHdpdGggYGlvX3NlbmRgIG9yIGBpb19yZWN2YCBhbmQgcHJlLWFsbG9jYXRlZCBpb3ZlY3MuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMxOjQ4Ljg1ODE2OTIxWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2Njk4NDA2MTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA3MWJlYzYxOTFhN2E3YTVjNWQzMDFlNjFjMzA3MWU0NzUyZWNlMDlkXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUdWUgSnVsIDcgMDM6MzE6NDcgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvaW9fdXJpbmcva2J1Zi5jIGIvaW9fdXJpbmcva2J1Zi5jXFxuaW5kZXggM2NkMjk0NzdmZmYyZDMuLmI2Yjk2OWI1NWUxMjI0IDEwMDY0NFxcbi0tLSBhL2lvX3VyaW5nL2tidWYuY1xcbisrKyBiL2lvX3VyaW5nL2tidWYuY1xcbkBAIC0yODcsOCArMjg3LDYgQEAgc3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXFxuIFxcdFxcdGlvdiA9IGttYWxsb2Nfb2JqcyhzdHJ1Y3QgaW92ZWMsIG5yX2F2YWlsKTtcXG4gXFx0XFx0aWYgKHVubGlrZWx5KCFpb3YpKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4tXFx0XFx0aWYgKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxcbi1cXHRcXHRcXHRrZnJlZShhcmctXFx1MDAzZWlvdnMpO1xcbiBcXHRcXHRhcmctXFx1MDAzZWlvdnMgPSBpb3Y7XFxuIFxcdFxcdG5yX2lvdnMgPSBucl9hdmFpbDtcXG4gXFx0fSBlbHNlIGlmIChucl9hdmFpbCBcXHUwMDNjIG5yX2lvdnMpIHtcXG5AQCAtMzMwLDYgKzMyOCw5IEBAIHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbiBcXHRcXHRidWYgPSBpb19yaW5nX2hlYWRfdG9fYnVmKGJyLCArK2hlYWQsIGJsLVxcdTAwM2VtYXNrKTtcXG4gXFx0fSB3aGlsZSAoLS1ucl9pb3ZzKTtcXG4gXFxuK1xcdGlmIChhcmctXFx1MDAzZW1vZGUgXFx1MDAyNiBLQlVGX01PREVfRlJFRSlcXG4rXFx0XFx0a2ZyZWUoYXJnLVxcdTAwM2Vpb3ZzKTtcXG4rXFxuIFxcdGlmIChoZWFkID09IHRhaWwpXFxuIFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfQkxfRU1QVFk7XFxuIFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMTo0OS41MjkwMjY2MzdaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ4NzY3MzM4NTAyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJT19VUklOR1wiLFxuICAgIFwiTkVUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaW9fcmluZ19idWZmZXJzX3BlZWtcIixcbiAgICBcImlvX2J1ZmZlcnNfc2VsZWN0XCIsXG4gICAgXCJpb19zZW5kX3NlbGVjdF9idWZmZXJcIixcbiAgICBcImlvX3JlY3ZfYnVmX3NlbGVjdFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vdmVzIGBrZnJlZShhcmctXFx1MDAzZWlvdnMpYCB0byB0aGUgZW5kIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuIElmIGBLQlVGX01PREVfRlJFRWAgaXMgc2V0LCB0aGlzIHVuY29uZGl0aW9uYWxseSBmcmVlcyBgYXJnLVxcdTAwM2Vpb3ZzYCBiZWZvcmUgcmV0dXJuaW5nLiBIb3dldmVyLCBgYXJnLVxcdTAwM2Vpb3ZzYCBpcyBlaXRoZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCBhcnJheSAoaWYgZXhwYW5kZWQpIG9yIHRoZSBvcmlnaW5hbCBhcnJheSwgYW5kIGluIGJvdGggY2FzZXMsIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIG9yIGBpb19yZWN2X2J1Zl9zZWxlY3RgKSB3aGljaCB0aGVuIHVzZXMgaXQuIFRoaXMgaW50cm9kdWNlcyBhIDEwMCUgcmVwcm9kdWNpYmxlIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkgd2hlbiB1c2luZyBwcm92aWRlZCBidWZmZXJzIHdpdGggYGlvX3NlbmRgIG9yIGBpb19yZWN2YCBhbmQgcHJlLWFsbG9jYXRlZCBpb3ZlY3MuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNzFiZWM2MTkxYTdhN2E1YzVkMzAxZTYxYzMwNzFlNDc1MmVjZTA5ZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgSnVsIDcgMDM6MzE6NDcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pb191cmluZy9rYnVmLmMgYi9pb191cmluZy9rYnVmLmNcbmluZGV4IDNjZDI5NDc3ZmZmMmQzLi5iNmI5NjliNTVlMTIyNCAxMDA2NDRcbi0tLSBhL2lvX3VyaW5nL2tidWYuY1xuKysrIGIvaW9fdXJpbmcva2J1Zi5jXG5AQCAtMjg3LDggKzI4Nyw2IEBAIHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuIFx0XHRpb3YgPSBrbWFsbG9jX29ianMoc3RydWN0IGlvdmVjLCBucl9hdmFpbCk7XG4gXHRcdGlmICh1bmxpa2VseSghaW92KSlcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbi1cdFx0aWYgKGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRlJFRSlcbi1cdFx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG4gXHRcdGFyZy1cdTAwM2Vpb3ZzID0gaW92O1xuIFx0XHRucl9pb3ZzID0gbnJfYXZhaWw7XG4gXHR9IGVsc2UgaWYgKG5yX2F2YWlsIFx1MDAzYyBucl9pb3ZzKSB7XG5AQCAtMzMwLDYgKzMyOCw5IEBAIHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuIFx0XHRidWYgPSBpb19yaW5nX2hlYWRfdG9fYnVmKGJyLCArK2hlYWQsIGJsLVx1MDAzZW1hc2spO1xuIFx0fSB3aGlsZSAoLS1ucl9pb3ZzKTtcbiBcbitcdGlmIChhcmctXHUwMDNlbW9kZSBcdTAwMjYgS0JVRl9NT0RFX0ZSRUUpXG4rXHRcdGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKTtcbitcbiBcdGlmIChoZWFkID09IHRhaWwpXG4gXHRcdHJlcS1cdTAwM2VmbGFncyB8PSBSRVFfRl9CTF9FTVBUWTtcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMxOjQ5LjUyOTAyODY5N1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxNDc1MDA5MDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi5cblxuKipBbmFseXppbmcgYSBLZXJuZWwgUGF0Y2ggaW4gaW9fdXJpbmcva2J1Zi5jKipcblxuQWxyaWdodCwgSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYGlvX3VyaW5nL2tidWYuY2AuIEl0J3MgYSBmYWlybHkgc3BlY2lmaWMgb25lLCBjb25jZXJuaW5nIGhvdyBtZW1vcnkgaXMgaGFuZGxlZCBpbiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBUaGUgY2hhbmdlIGlzIGFib3V0ICp3aGVuKiB3ZSBjYWxsIGBrZnJlZShhcmctXHUwMDNlaW92cylgLiBBcHBhcmVudGx5LCBpdCdzIGJlaW5nIG1vdmVkIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIHdpdGhpbiB0aGF0IGZ1bmN0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aHkuIFNvLCBJJ20gZ29pbmcgdG8gZGl2ZSByaWdodCBpbnRvIHRoZSBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGZ1bmN0aW9uIGl0c2VsZiB0byBzZWUgd2hhdCdzIGhhcHBlbmluZyBhbmQgZmlndXJlIG91dCB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIHNoaWZ0LiBJJ2xsIG5lZWQgdG8gYW5hbHl6ZSB0aGUgc3Vycm91bmRpbmcgY29kZSB0byBkZXRlcm1pbmUgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNoYW5nZSBhbmQgd2hldGhlciBpdCBhZGRyZXNzZXMgYSBwb3RlbnRpYWwgYnVnLCBpbXByb3ZlcyBwZXJmb3JtYW5jZSwgb3IgcGVyaGFwcyBhbGlnbnMgd2l0aCBzb21lIG90aGVyIGRlc2lnbiBwcmluY2lwbGUuIExldCdzIHNlZSB3aGF0J3MgcmVhbGx5IGdvaW5nIG9uIGluIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTkwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMTo1My42NzY1MzIxODZaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAyNTY5MTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX3JpbmdfYnVmZmVyc19wZWVrXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImlvX3VyaW5nL2tidWYuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpb191cmluZy9rYnVmLmM9MjMwPXN0cnVjdCBpb19icl9zZWwgaW9fYnVmZmVyX3NlbGVjdChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc2l6ZV90ICpsZW4sXFxuLS1cXG5pb191cmluZy9rYnVmLmMtMjUyLVxcbmlvX3VyaW5nL2tidWYuYzoyNTM6c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXFxuaW9fdXJpbmcva2J1Zi5jLTI1NC1cXHRcXHRcXHRcXHRzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsKVxcbi0tXFxuaW9fdXJpbmcva2J1Zi5jPTM0MT1pbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbi0tXFxuaW9fdXJpbmcva2J1Zi5jLTM1Mi1cXHRpZiAoc2VsLVxcdTAwM2VidWZfbGlzdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT0JMX0JVRl9SSU5HKSB7XFxuaW9fdXJpbmcva2J1Zi5jOjM1MzpcXHRcXHRyZXQgPSBpb19yaW5nX2J1ZmZlcnNfcGVlayhyZXEsIGFyZywgc2VsLVxcdTAwM2VidWZfbGlzdCk7XFxuaW9fdXJpbmcva2J1Zi5jLTM1NC1cXHRcXHQvKlxcbi0tXFxuaW9fdXJpbmcva2J1Zi5jPTM3Nz1pbnQgaW9fYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcXG4tLVxcbmlvX3VyaW5nL2tidWYuYy0zOTAtXFx0aWYgKGJsLVxcdTAwM2VmbGFncyBcXHUwMDI2IElPQkxfQlVGX1JJTkcpIHtcXG5pb191cmluZy9rYnVmLmM6MzkxOlxcdFxcdHJldCA9IGlvX3JpbmdfYnVmZmVyc19wZWVrKHJlcSwgYXJnLCBibCk7XFxuaW9fdXJpbmcva2J1Zi5jLTM5Mi1cXHRcXHRpZiAocmV0IFxcdTAwM2UgMClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzE6NTMuNzc5MTA3Nzg2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ4NzU0MjA5MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5IHdlcmUgc3dpcmxpbmcgYXJvdW5kIGluIG15IG93biBoZWFkOlxuXG4qKkFuYWx5emluZyBhIFBvdGVudGlhbCBNZW1vcnkgTWFuYWdlbWVudCBJc3N1ZSoqXG5cbkFscmlnaHQsIHNvIHRoaXMgcGF0Y2ggKmxvb2tzKiBsaWtlIGl0J3MgYWRkcmVzc2luZyBzb21lIHNvcnQgb2YgbWVtb3J5IGNvcnJ1cHRpb24gcHJvYmxlbSDigJMgbWF5YmUgYSBtZW1vcnkgbGVhaywgb3IgYSB1c2UtYWZ0ZXItZnJlZSBzY2VuYXJpby4gSXQgc2VlbXMgdGhlIGNvcmUgb2YgdGhlIGZpeCByZXZvbHZlcyBhcm91bmQgdGhlIHRpbWluZyBvZiBga2ZyZWUoYXJnLVx1MDAzZWlvdnMpYC4gSXQgKmxvb2tzKiBsaWtlIHRoZXkncmUgbW92aW5nIHRoZSBga2ZyZWVgIGNhbGwgKmFmdGVyKiBhIGxvb3AgdGhhdCdzIHVzaW5nIGBhcmctXHUwMDNlaW92c2AuIFxuXG5Ib2xkIG9uIGEgc2Vjb25kLi4uIFRoYXQgZG9lc24ndCBxdWl0ZSBtYWtlIHNlbnNlLiBJZiB0aGV5J3JlIGZyZWVpbmcgYGFyZy1cdTAwM2Vpb3ZzYCBhbmQgKnRoZW4qIHJlYXNzaWduaW5nIGBhcmctXHUwMDNlaW92cyA9IGlvdjtgLCB0aGVuIHRoZSBsb29wICptdXN0KiBiZSB1c2luZyB0aGUgb3JpZ2luYWwgbWVtb3J5IGxvY2F0aW9uLCByaWdodD8gT3IgYW0gSSBtaXNzaW5nIHNvbWV0aGluZz8gSWYgdGhhdCdzIHRydWUsIHRoZW4gdGhlIG5ldyB2YWx1ZSBgaW92YCBtdXN0IGJlIGFzc2lnbmVkICpiZWZvcmUqIHRoZSBrZnJlZSB0byBwcmV2ZW50IHVzZSBhZnRlciBmcmVlLiBJIG5lZWQgdG8gYmUgc3VyZS5cblxuSSBuZWVkIHRvIGRpZyBkZWVwZXIgaGVyZS4gVGhlIGtleSBmdW5jdGlvbiBpcyBwcm9iYWJseSBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGluIGBpb191cmluZy9rYnVmLmNgLiBJJ20gZ29pbmcgdG8gcHVsbCB1cCB0aGF0IGZ1bmN0aW9uIGFuZCByZWFkIHRoZSBsb2dpYyBjYXJlZnVsbHkuIEkgbmVlZCB0byBzZWUgZXhhY3RseSBob3cgYGFyZy1cdTAwM2Vpb3ZzYCBpcyBiZWluZyB1c2VkIGFuZCBtb2RpZmllZCB3aXRoaW4gdGhhdCBmdW5jdGlvbiBhbmQgd2hldGhlciB0aGlzIGBrZnJlZWAgcGxhY2VtZW50IGlzIHJlYWxseSBzb2x2aW5nIHRoZSBwcm9ibGVtIG9yLCBwZXJoYXBzLCBpbnRyb2R1Y2luZyBhIG5ldyBvbmUgb3IgbWlzdW5kZXJzdGFuZGluZyBob3cgdG8gZGVhbCB3aXRoIHRoZSBleGlzdGluZyBpc3N1ZS4gTGV0J3Mgc2VlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2NzUsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMjozOC42NTQ1MzEyNjlaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjIzMjA5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImlvX3VyaW5nL2tidWYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTMsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjUzOlxcdHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbiAyNTQ6XFx0XFx0XFx0XFx0XFx0c3RydWN0IGlvX2J1ZmZlcl9saXN0ICpibClcXG4gMjU1OlxcdHtcXG4gMjU2OlxcdFxcdHN0cnVjdCBpb191cmluZ19idWZfcmluZyAqYnIgPSBibC1cXHUwMDNlYnVmX3Jpbmc7XFxuIDI1NzpcXHRcXHRzdHJ1Y3QgaW92ZWMgKm9yZ19pb3ZzID0gYXJnLVxcdTAwM2Vpb3ZzO1xcbiAyNTg6XFx0XFx0c3RydWN0IGlvdmVjICppb3YgPSBhcmctXFx1MDAzZWlvdnM7XFxuIDI1OTpcXHRcXHRpbnQgbnJfaW92cyA9IGFyZy1cXHUwMDNlbnJfaW92cztcXG4gMjYwOlxcdFxcdF9fdTE2IG5yX2F2YWlsLCB0YWlsLCBoZWFkO1xcbiAyNjE6XFx0XFx0c3RydWN0IGlvX3VyaW5nX2J1ZiAqYnVmO1xcbiAyNjI6XFx0XFxuIDI2MzpcXHRcXHR0YWlsID0gc21wX2xvYWRfYWNxdWlyZShcXHUwMDI2YnItXFx1MDAzZXRhaWwpO1xcbiAyNjQ6XFx0XFx0aGVhZCA9IGJsLVxcdTAwM2VoZWFkO1xcbiAyNjU6XFx0XFx0bnJfYXZhaWwgPSBtaW5fdChfX3UxNiwgdGFpbCAtIGhlYWQsIFVJT19NQVhJT1YpO1xcbiAyNjY6XFx0XFx0aWYgKHVubGlrZWx5KCFucl9hdmFpbCkpXFxuIDI2NzpcXHRcXHRcXHRyZXR1cm4gLUVOT0JVRlM7XFxuIDI2ODpcXHRcXG4gMjY5OlxcdFxcdGJ1ZiA9IGlvX3JpbmdfaGVhZF90b19idWYoYnIsIGhlYWQsIGJsLVxcdTAwM2VtYXNrKTtcXG4gMjcwOlxcdFxcdGlmIChhcmctXFx1MDAzZW1heF9sZW4pIHtcXG4gMjcxOlxcdFxcdFxcdHUzMiBsZW4gPSBSRUFEX09OQ0UoYnVmLVxcdTAwM2VsZW4pO1xcbiAyNzI6XFx0XFx0XFx0c2l6ZV90IG5lZWRlZDtcXG4gMjczOlxcdFxcbiAyNzQ6XFx0XFx0XFx0aWYgKHVubGlrZWx5KCFsZW4pKVxcbiAyNzU6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9CVUZTO1xcbiAyNzY6XFx0XFx0XFx0bmVlZGVkID0gKGFyZy1cXHUwMDNlbWF4X2xlbiArIGxlbiAtIDEpIC8gbGVuO1xcbiAyNzc6XFx0XFx0XFx0bmVlZGVkID0gbWluX25vdF96ZXJvKG5lZWRlZCwgKHNpemVfdCkgUEVFS19NQVhfSU1QT1JUKTtcXG4gMjc4OlxcdFxcdFxcdGlmIChucl9hdmFpbCBcXHUwMDNlIG5lZWRlZClcXG4gMjc5OlxcdFxcdFxcdFxcdG5yX2F2YWlsID0gbmVlZGVkO1xcbiAyODA6XFx0XFx0fVxcbiAyODE6XFx0XFxuIDI4MjpcXHRcXHQvKlxcbiAyODM6XFx0XFx0ICogb25seSBhbGxvYyBhIGJpZ2dlciBhcnJheSBpZiB3ZSBrbm93IHdlIGhhdmUgZGF0YSB0byBtYXAsIGVnIG5vdFxcbiAyODQ6XFx0XFx0ICogYSBzcGVjdWxhdGl2ZSBwZWVrIG9wZXJhdGlvbi5cXG4gMjg1OlxcdFxcdCAqL1xcbiAyODY6XFx0XFx0aWYgKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9FWFBBTkQgXFx1MDAyNlxcdTAwMjYgbnJfYXZhaWwgXFx1MDAzZSBucl9pb3ZzIFxcdTAwMjZcXHUwMDI2IGFyZy1cXHUwMDNlbWF4X2xlbikge1xcbiAyODc6XFx0XFx0XFx0aW92ID0ga21hbGxvY19vYmpzKHN0cnVjdCBpb3ZlYywgbnJfYXZhaWwpO1xcbiAyODg6XFx0XFx0XFx0aWYgKHVubGlrZWx5KCFpb3YpKVxcbiAyODk6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIDI5MDpcXHRcXHRcXHRhcmctXFx1MDAzZWlvdnMgPSBpb3Y7XFxuIDI5MTpcXHRcXHRcXHRucl9pb3ZzID0gbnJfYXZhaWw7XFxuIDI5MjpcXHRcXHR9IGVsc2UgaWYgKG5yX2F2YWlsIFxcdTAwM2MgbnJfaW92cykge1xcbiAyOTM6XFx0XFx0XFx0bnJfaW92cyA9IG5yX2F2YWlsO1xcbiAyOTQ6XFx0XFx0fVxcbiAyOTU6XFx0XFxuIDI5NjpcXHRcXHQvKiBzZXQgaXQgdG8gbWF4LCBpZiBub3Qgc2V0LCBzbyB3ZSBjYW4gdXNlIGl0IHVuY29uZGl0aW9uYWxseSAqL1xcbiAyOTc6XFx0XFx0aWYgKCFhcmctXFx1MDAzZW1heF9sZW4pXFxuIDI5ODpcXHRcXHRcXHRhcmctXFx1MDAzZW1heF9sZW4gPSBJTlRfTUFYO1xcbiAyOTk6XFx0XFxuIDMwMDpcXHRcXHRyZXEtXFx1MDAzZWJ1Zl9pbmRleCA9IFJFQURfT05DRShidWYtXFx1MDAzZWJpZCk7XFxuIDMwMTpcXHRcXHRkbyB7XFxuIDMwMjpcXHRcXHRcXHR1MzIgbGVuID0gUkVBRF9PTkNFKGJ1Zi1cXHUwMDNlbGVuKTtcXG4gMzAzOlxcdFxcbiAzMDQ6XFx0XFx0XFx0LyogdHJ1bmNhdGUgZW5kIHBpZWNlLCBpZiBuZWVkZWQsIGZvciBub24gcGFydGlhbCBidWZmZXJzICovXFxuIDMwNTpcXHRcXHRcXHRpZiAobGVuIFxcdTAwM2UgYXJnLVxcdTAwM2VtYXhfbGVuKSB7XFxuIDMwNjpcXHRcXHRcXHRcXHRsZW4gPSBhcmctXFx1MDAzZW1heF9sZW47XFxuIDMwNzpcXHRcXHRcXHRcXHRpZiAoIShibC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT0JMX0lOQykpIHtcXG4gMzA4OlxcdFxcdFxcdFxcdFxcdGFyZy1cXHUwMDNlcGFydGlhbF9tYXAgPSAxO1xcbiAzMDk6XFx0XFx0XFx0XFx0XFx0aWYgKGlvdiAhPSBhcmctXFx1MDAzZWlvdnMpXFxuIDMxMDpcXHRcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMzExOlxcdFxcdFxcdFxcdH1cXG4gMzEyOlxcdFxcdFxcdH1cXG4gMzEzOlxcdFxcbiAzMTQ6XFx0XFx0XFx0aW92LVxcdTAwM2Vpb3ZfYmFzZSA9IHU2NF90b191c2VyX3B0cihSRUFEX09OQ0UoYnVmLVxcdTAwM2VhZGRyKSk7XFxuIDMxNTpcXHRcXHRcXHRpb3YtXFx1MDAzZWlvdl9sZW4gPSBsZW47XFxuIDMxNjpcXHRcXHRcXHRpZiAodW5saWtlbHkoIWFjY2Vzc19vayhpb3YtXFx1MDAzZWlvdl9iYXNlLCBsZW4pKSkge1xcbiAzMTc6XFx0XFx0XFx0XFx0aWYgKGFyZy1cXHUwMDNlaW92cyAhPSBvcmdfaW92cylcXG4gMzE4OlxcdFxcdFxcdFxcdFxcdGtmcmVlKGFyZy1cXHUwMDNlaW92cyk7XFxuIDMxOTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gMzIwOlxcdFxcdFxcdH1cXG4gMzIxOlxcdFxcdFxcdGlvdisrO1xcbiAzMjI6XFx0XFxuIDMyMzpcXHRcXHRcXHRhcmctXFx1MDAzZW91dF9sZW4gKz0gbGVuO1xcbiAzMjQ6XFx0XFx0XFx0YXJnLVxcdTAwM2VtYXhfbGVuIC09IGxlbjtcXG4gMzI1OlxcdFxcdFxcdGlmICghYXJnLVxcdTAwM2VtYXhfbGVuKVxcbiAzMjY6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDMyNzpcXHRcXG4gMzI4OlxcdFxcdFxcdGJ1ZiA9IGlvX3JpbmdfaGVhZF90b19idWYoYnIsICsraGVhZCwgYmwtXFx1MDAzZW1hc2spO1xcbiAzMjk6XFx0XFx0fSB3aGlsZSAoLS1ucl9pb3ZzKTtcXG4gMzMwOlxcdFxcbiAzMzE6XFx0XFx0aWYgKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxcbiAzMzI6XFx0XFx0XFx0a2ZyZWUoYXJnLVxcdTAwM2Vpb3ZzKTtcXG4gMzMzOlxcdFxcbiAzMzQ6XFx0XFx0aWYgKGhlYWQgPT0gdGFpbClcXG4gMzM1OlxcdFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfQkxfRU1QVFk7XFxuIDMzNjpcXHRcXG4gMzM3OlxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfQlVGRkVSX1JJTkc7XFxuIDMzODpcXHRcXHRyZXR1cm4gaW92IC0gYXJnLVxcdTAwM2Vpb3ZzO1xcbiAzMzk6XFx0fVxcbiAzNDA6XFx0XFxuIDM0MTpcXHRpbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbiAzNDI6XFx0XFx0XFx0ICAgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXFxuIDM0MzpcXHR7XFxuIDM0NDpcXHRcXHRzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCA9IHJlcS1cXHUwMDNlY3R4O1xcbiAzNDU6XFx0XFx0aW50IHJldCA9IC1FTk9FTlQ7XFxuIDM0NjpcXHRcXG4gMzQ3OlxcdFxcdGlvX3Jpbmdfc3VibWl0X2xvY2soY3R4LCBpc3N1ZV9mbGFncyk7XFxuIDM0ODpcXHRcXHRzZWwtXFx1MDAzZWJ1Zl9saXN0ID0gaW9fYnVmZmVyX2dldF9saXN0KGN0eCwgYXJnLVxcdTAwM2VidWZfZ3JvdXApO1xcbiAzNDk6XFx0XFx0aWYgKHVubGlrZWx5KCFzZWwtXFx1MDAzZWJ1Zl9saXN0KSlcXG4gMzUwOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gMzUxOlxcdFxcbiAzNTI6XFx0XFx0aWYgKHNlbC1cXHUwMDNlYnVmX2xpc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9CTF9CVUZfUklORykge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMjozOC42NTY3NTc4ODhaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTA2NDgzNjc2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLQlVGIFBhdGNoOiBQb3RlbnRpYWwgTWVtb3J5IExlYWsqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIG1vdmVzIHRoZSBga2ZyZWUoYXJnLVx1MDAzZWlvdnMpYCBjYWxsIG91dHNpZGUgb2YgdGhlIGNvbmRpdGlvbmFsIGJsb2NrLCBwbGFjaW5nIGl0IGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZnVuY3Rpb24uIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdGhhdCB0aGlzIHNlZW1lZCBsaWtlIGEgc2ltcGxlIGNsZWFudXAsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgZG9lc24ndCBpbnRyb2R1Y2UgYW55IGJ1Z3MuXG5cbk5vdywgSSdtIHN0YXJ0aW5nIHRvIHNlZSB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgY2hhbmdlLiBQcmV2aW91c2x5LCBpZiBgYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFYCB3YXMgc2V0LCB0aGUgY29kZSB3b3VsZCBmcmVlIGBhcmctXHUwMDNlaW92c2Ag4oCTIHdoaWNoLCBjcml0aWNhbGx5LCB3YXMgdGhlICpvbGQqIGBpb3ZzYCDigJMgKmJlZm9yZSogcG90ZW50aWFsbHkgYWxsb2NhdGluZyBhICpuZXcqIGBpb3ZzYCBhbmQgYXNzaWduaW5nIGl0IHRvIGBhcmctXHUwMDNlaW92c2AuXG5cblRoZSBpbnRlcmVzdGluZyBzZWN0aW9uIG9mIGNvZGUgaGVyZSBpczpcblxuYGBgY1xuXHRcdGlmIChhcmctXHUwMDNlbW9kZSBcdTAwMjYgS0JVRl9NT0RFX0VYUEFORCBcdTAwMjZcdTAwMjYgbnJfYXZhaWwgXHUwMDNlIG5yX2lvdnMgXHUwMDI2XHUwMDI2IGFyZy1cdTAwM2VtYXhfbGVuKSB7XG5cdFx0XHRpb3YgPSBrbWFsbG9jX29ianMoc3RydWN0IGlvdmVjLCBucl9hdmFpbCk7XG5cdFx0XHRpZiAodW5saWtlbHkoIWlvdikpXG5cdFx0XHRcdHJldHVybiAtRU5PTUVNO1xuLVx0XHRcdGlmIChhcmctXHUwMDNlbW9kZSBcdTAwMjYgS0JVRl9NT0RFX0ZSRUUpXG4tXHRcdFx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG5cdFx0XHRhcmctXHUwMDNlaW92cyA9IGlvdjtcblx0XHRcdG5yX2lvdnMgPSBucl9hdmFpbDtcblx0XHR9XG5gYGBcblxuT2theSwgc28gaWYgdGhlIGNvZGUgKmRvZXMqIGVudGVyIHRoYXQgYGlmYCBibG9jaywgYSBuZXcgYGlvdmAgaXMgYWxsb2NhdGVkIGFuZCBhc3NpZ25lZCB0byBgYXJnLVx1MDAzZWlvdnNgLCBhbmQgb25seSB0aGVuLCB0aGUgb2xkIGBpb3ZzYCB3aWxsIGJlIGZyZWVkLCBidXQgb25seSBpZiB0aGUgZmxhZyBpcyBzZXQuXG5cblRoZSBjb2RlIG5vdywgYWZ0ZXIgdGhlIHBhdGNoLCBsb29rcyBsaWtlIHRoaXM6XG5cbmBgYGNcblx0aWYgKGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRlJFRSlcblx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG5gYGBcblxuVGhlIHByb2JsZW0gaXMgaW1tZWRpYXRlbHkgY2xlYXI6IElmIHRoZSBleHBhbnNpb24gKmRvZXMqIG9jY3VyIGFuZCBhICpuZXcqIGBpb3ZgIGlzIGFsbG9jYXRlZCwgYXQgdGhlIGVuZCwgdGhlIGNvZGUgd2lsbCBmcmVlIHRoZSAqbmV3KiBgYXJnLVx1MDAzZWlvdnNgIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGBpb3ZzYC4gVGhpcyBpcyBub3cgYSBidWc6IHdlIGFyZSBsZWFraW5nIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb2xkIGBhcmctXHUwMDNlaW92c2AhIFdlIGFyZSBzdXBwb3NlZCB0byBiZSBmcmVlaW5nIHRoZSBvbGQgb25lLiBXZSBub3cgaGF2ZSBhbiBpc3N1ZSBvZiBtZW1vcnkgY29ycnVwdGlvbiBvciBldmVuIHdvcnNlLiBJIGJldHRlciByZS1leGFtaW5lIHRoZSBkaWZmIHZlcnkgY2FyZWZ1bGx5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NzExLCJPdXRwdXRUb2tlbnMiOjQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDA2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzI6NTMuNzIxNTk3MjUxWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU1MzY3ODY4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpZiBcXFxcKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9GUkVFXFxcXClcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW9fdXJpbmcva2J1Zi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImlvX3VyaW5nL2tidWYuYz0yNTM9c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXFxuLS1cXG5pb191cmluZy9rYnVmLmMtMzMwLVxcbmlvX3VyaW5nL2tidWYuYzozMzE6XFx0aWYgKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxcbmlvX3VyaW5nL2tidWYuYy0zMzItXFx0XFx0a2ZyZWUoYXJnLVxcdTAwM2Vpb3ZzKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzI6NTQuMjc1Mjg1MTEyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzAxNjM2MDg4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGlvX3JpbmdfYnVmZmVyc19wZWVrIExvZ2ljKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJZiBgYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFYCBpcyB0cnVlLCB0aGF0IHNpZ25hbHMgdGhhdCB0aGUgb3JpZ2luYWwgYGFyZy1cdTAwM2Vpb3ZzYCB3YXMgKmR5bmFtaWNhbGx5IGFsbG9jYXRlZCogYW5kIHRodXMgbmVlZHMgdG8gYmUgZGVhbGxvY2F0ZWQuIFRoYXQncyBzdHJhaWdodGZvcndhcmQuIEhvd2V2ZXIsIHRoZSBsb2dpYyBnZXRzIHRyaWNreSB3aGVuIHdlICphbHNvKiBhbGxvY2F0ZSBhICpuZXcqIGBpb3ZgLCBhbmQgYXNzaWduIGl0IHRvIGBhcmctXHUwMDNlaW92c2AuIFNvLCBgYXJnLVx1MDAzZWlvdnNgIGlzIGVpdGhlciB0aGUgb3JpZ2luYWwgYWxsb2NhdGlvbiBvciBhIG5ldyBvbmUsIGRlcGVuZGluZy4gVGhlIGNvZGUgdGhlbiBmcmVlcyBgYXJnLVx1MDAzZWlvdnNgIGF0IHRoZSBlbmQgaWYgdGhlIGZyZWUgbW9kZSBpcyBlbmFibGVkLlxuXG5CdXQgaGVyZSdzIHdoZXJlIHRoZSByZWQgZmxhZyBnb2VzIHVwLiBUaGUgKmNhbGxlciogb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBleHBlY3RzIGBhcmctXHUwMDNlaW92c2AgdG8gY29udGFpbiB2YWxpZCBpb3ZlY3MsIHJpZ2h0PyBJdCdzIGhvdyB0aGUgY2FsbGVyIHJldHJpZXZlcyB0aGUgZGF0YS4gSWYgd2UgKmZyZWUqIGBhcmctXHUwMDNlaW92c2AgYXQgdGhlIGVuZCBvZiAqdGhpcyogZnVuY3Rpb24sIHRoZSBjYWxsZXIgaXMgbGVmdCBob2xkaW5nIGEgZGFuZ2xpbmcgcG9pbnRlci4gVGhhdCdzIGEgY2xhc3NpYyBtZW1vcnkgbWFuYWdlbWVudCBpc3N1ZS4gSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGV4cGVjdGVkIGJlaGF2aW9yIG9mIGBhcmctXHUwMDNlaW92c2AgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24uIExldCBtZSBjaGVjayB0aGUgY2FsbGVyIHRvIGNvbmZpcm0gdGhlIGludGVuZGVkIGJlaGF2aW9yLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NzY2LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTUwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMzOjAxLjI5MTY0NzkzN1oiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEwMjU0NTE4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX2J1ZmZlcnNfcGVla1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9rYnVmLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcva2J1Zi5jPTM0MT1pbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbi0tXFxuaW9fdXJpbmcva2J1Zi5jLTM3Ni1cXG5pb191cmluZy9rYnVmLmM6Mzc3OmludCBpb19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbmlvX3VyaW5nL2tidWYuYy0zNzgtXFx0XFx0ICAgIHN0cnVjdCBpb19icl9zZWwgKnNlbClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzM6MDEuNDAxOTEwNTM2WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUxNDI1Mzg0ODMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGVzZSBtZXRob2RzLCBgaW9fYnVmZmVyc19wZWVrYCBhbmQgYGlvX2J1ZmZlcnNfc2VsZWN0YC4gTXkgZXhwZXJ0aXNlIHRlbGxzIG1lIHRoZXJlJ3MgbW9yZSBoZXJlIHRoYW4gbWVldHMgdGhlIGV5ZSwgYW5kIHRoZSBuYW1lIFwiYnVmZmVyc1wiIGFscmVhZHkgc3VnZ2VzdHMgc29tZSBsZXZlbCBvZiBtZW1vcnkgbWFuYWdlbWVudC4gSSdtIGltbWVkaWF0ZWx5IGN1cmlvdXMgYWJvdXQgdGhlaXIgY29udGV4dCDigJMgYXJlIHRoZXNlIGxpbmtlZCB0byBuZXR3b3JrIG9wZXJhdGlvbnMsIGZpbGUgSS9PLCBvciBzb21ldGhpbmcgbW9yZSBnZW5lcmljPyBJJ20gYWxyZWFkeSBmb3JtdWxhdGluZyBxdWVzdGlvbnM6XG5cbioqUGVla2luZywgU2VsZWN0aW5nLCBhbmQgQnVmZmVyczogSW5pdGlhbCBBc3Nlc3NtZW50KipcblxuU28sIGBpb19idWZmZXJzX3BlZWtgLCB0aGlzIGlzIGludGVyZXN0aW5nLiBJJ20gZ3Vlc3NpbmcgaXQgYWxsb3dzIGEgbm9uLWRlc3RydWN0aXZlIGxvb2sgYXQgYnVmZmVyZWQgZGF0YSwgcHJvYmFibHkgd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBidWZmZXIuIFRoaXMgaW1wbGllcyBhIG5lZWQgdG8gaW5zcGVjdCBpbmNvbWluZyBvciBvdXRnb2luZyBkYXRhIHdpdGhvdXQgYWx0ZXJpbmcgaXRzIHN0YXRlLCBsaWtlbHkgZm9yIHRoaW5ncyBsaWtlIGRldGVybWluaW5nIHRoZSBtZXNzYWdlIHR5cGUgYmVmb3JlIGNvbW1pdHRpbmcgdG8gcHJvY2Vzc2luZyBpdC4gSSdtIHRoaW5raW5nIHBlcmhhcHMgdGhpcyBmdW5jdGlvbiBoYXMgc29tZSBvdmVybGFwIHdpdGggYSBgcmVjdl9wZWVrYCBmdW5jdGlvbiBpbiBhIHNvY2tldC1iYXNlZCBhcHBsaWNhdGlvbi4gVGhpcyBtaWdodCBiZSB1c2VkIHRvIGluc3BlY3QgYSBwYWNrZXQgYmVmb3JlIGFwcGx5aW5nIGEgY2VydGFpbiBoYW5kbGVyLlxuXG5gaW9fYnVmZmVyc19zZWxlY3RgLCBub3cgdGhhdCdzIGV2ZW4gbW9yZSBpbnRyaWd1aW5nLiBcIlNlbGVjdFwiIGFsd2F5cyBzdWdnZXN0cyBzb21lIGtpbmQgb2YgbXVsdGlwbGV4aW5nIG9yIGV2ZW50IGhhbmRsaW5nLiBJcyB0aGlzIG1ldGhvZCByZWxhdGVkIHRvIHRoZSBgc2VsZWN0KClgIHN5c3RlbSBjYWxsLCBmb3IgaW5kaWNhdGluZyBvbmUgb3IgbW9yZSBvcGVyYXRpb25zIHNob3VsZCBiZSBleGVjdXRlZD8gVGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBxdWl0ZSB2YWx1YWJsZSwgZXNwZWNpYWxseSBpbiBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudHMsIHdoZXJlIHdlIGNhbiBjaG9vc2Ugd2hpY2ggb3BlcmF0aW9uIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVyIGNhbmRpZGF0ZXMgd291bGQgYmUgc3VpdGFibGUgdG8gb3BlcmF0ZSB1cG9uLiBXaGF0IGNyaXRlcmlhIGFyZSB1c2VkIGZvciB0aGlzIHNlbGVjdGlvbj8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgcHJpb3JpdGl6aW5nIGJhc2VkIG9uIGJ1ZmZlciBmdWxsbmVzcywgYXZhaWxhYmxlIHNwYWNlLCBvciBzb21lIG90aGVyIGFwcGxpY2F0aW9uLXNwZWNpZmljIG1ldHJpYz8gQXJlIHRoZXJlIGltcGxpY2F0aW9ucyBmb3IgY29uY3VycmVuY3kgY29udHJvbD8gSSdtIGFscmVhZHkgYW50aWNpcGF0aW5nIHBvdGVudGlhbCBzeW5jaHJvbml6YXRpb24gY2hhbGxlbmdlcy4gSSBjYW4gaW1hZ2luZSBzY2VuYXJpb3Mgd2hlcmUgdGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbm9uLWJsb2NraW5nIEkvTyB0byBoYW5kbGUgbXVsdGlwbGUgY29ubmVjdGlvbnMgb3Igc3RyZWFtcyBlZmZpY2llbnRseS4gSSdtIHJlYWR5IHRvIGRpZyBkZWVwZXIgYW5kIGludmVzdGlnYXRlIHRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgdG8gZ2V0IGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZXNlIGZ1bmN0aW9ucyBmaXQgaW50byB0aGUgbGFyZ2VyIHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6NjMzOCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMzOjA2LjU0NDQ1MTk0OFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzI5MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW9fdXJpbmcva2J1Zi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM0MCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNDA6XFx0XFxuIDM0MTpcXHRpbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbiAzNDI6XFx0XFx0XFx0ICAgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXFxuIDM0MzpcXHR7XFxuIDM0NDpcXHRcXHRzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCA9IHJlcS1cXHUwMDNlY3R4O1xcbiAzNDU6XFx0XFx0aW50IHJldCA9IC1FTk9FTlQ7XFxuIDM0NjpcXHRcXG4gMzQ3OlxcdFxcdGlvX3Jpbmdfc3VibWl0X2xvY2soY3R4LCBpc3N1ZV9mbGFncyk7XFxuIDM0ODpcXHRcXHRzZWwtXFx1MDAzZWJ1Zl9saXN0ID0gaW9fYnVmZmVyX2dldF9saXN0KGN0eCwgYXJnLVxcdTAwM2VidWZfZ3JvdXApO1xcbiAzNDk6XFx0XFx0aWYgKHVubGlrZWx5KCFzZWwtXFx1MDAzZWJ1Zl9saXN0KSlcXG4gMzUwOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gMzUxOlxcdFxcbiAzNTI6XFx0XFx0aWYgKHNlbC1cXHUwMDNlYnVmX2xpc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9CTF9CVUZfUklORykge1xcbiAzNTM6XFx0XFx0XFx0cmV0ID0gaW9fcmluZ19idWZmZXJzX3BlZWsocmVxLCBhcmcsIHNlbC1cXHUwMDNlYnVmX2xpc3QpO1xcbiAzNTQ6XFx0XFx0XFx0LypcXG4gMzU1OlxcdFxcdFxcdCAqIERvbid0IHJlY3ljbGUgdGhlc2UgYnVmZmVycyBpZiB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggcG9sbC5cXG4gMzU2OlxcdFxcdFxcdCAqIE5vYm9keSBlbHNlIGNhbiB1c2UgdGhlbSBhbnl3YXksIGFuZCBob2xkaW5nIG9uIHRvIHByb3ZpZGVkXFxuIDM1NzpcXHRcXHRcXHQgKiBidWZmZXJzIGZvciBhIHNlbmQvd3JpdGUgb3BlcmF0aW9uIHdvdWxkIGhhcHBlbiBvbiB0aGUgYXBwXFxuIDM1ODpcXHRcXHRcXHQgKiBzaWRlIGFueXdheSB3aXRoIG5vcm1hbCBidWZmZXJzLiBCZXNpZGVzLCB3ZSBhbHJlYWR5XFxuIDM1OTpcXHRcXHRcXHQgKiBjb21taXR0ZWQgdGhlbSwgdGhleSBjYW5ub3QgYmUgcHV0IGJhY2sgaW4gdGhlIHF1ZXVlLlxcbiAzNjA6XFx0XFx0XFx0ICovXFxuIDM2MTpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2UgMCkge1xcbiAzNjI6XFx0XFx0XFx0XFx0cmVxLVxcdTAwM2VmbGFncyB8PSBSRVFfRl9CVUZGRVJTX0NPTU1JVCB8IFJFUV9GX0JMX05PX1JFQ1lDTEU7XFxuIDM2MzpcXHRcXHRcXHRcXHRpZiAoIWlvX2tidWZfY29tbWl0KHJlcSwgc2VsLVxcdTAwM2VidWZfbGlzdCwgYXJnLVxcdTAwM2VvdXRfbGVuLCByZXQpKVxcbiAzNjQ6XFx0XFx0XFx0XFx0XFx0cmVxLVxcdTAwM2VmbGFncyB8PSBSRVFfRl9CVUZfTU9SRTtcXG4gMzY1OlxcdFxcdFxcdH1cXG4gMzY2OlxcdFxcdH0gZWxzZSB7XFxuIDM2NzpcXHRcXHRcXHRyZXQgPSBpb19wcm92aWRlZF9idWZmZXJzX3NlbGVjdChyZXEsIFxcdTAwMjZhcmctXFx1MDAzZW91dF9sZW4sIHNlbC1cXHUwMDNlYnVmX2xpc3QsIGFyZy1cXHUwMDNlaW92cyk7XFxuIDM2ODpcXHRcXHR9XFxuIDM2OTpcXHRvdXRfdW5sb2NrOlxcbiAzNzA6XFx0XFx0aWYgKGlzc3VlX2ZsYWdzIFxcdTAwMjYgSU9fVVJJTkdfRl9VTkxPQ0tFRCkge1xcbiAzNzE6XFx0XFx0XFx0c2VsLVxcdTAwM2VidWZfbGlzdCA9IE5VTEw7XFxuIDM3MjpcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmN0eC1cXHUwMDNldXJpbmdfbG9jayk7XFxuIDM3MzpcXHRcXHR9XFxuIDM3NDpcXHRcXHRyZXR1cm4gcmV0O1xcbiAzNzU6XFx0fVxcbiAzNzY6XFx0XFxuIDM3NzpcXHRpbnQgaW9fYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcXG4gMzc4OlxcdFxcdFxcdCAgICBzdHJ1Y3QgaW9fYnJfc2VsICpzZWwpXFxuIDM3OTpcXHR7XFxuIDM4MDpcXHRcXHRzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCA9IHJlcS1cXHUwMDNlY3R4O1xcbiAzODE6XFx0XFx0c3RydWN0IGlvX2J1ZmZlcl9saXN0ICpibDtcXG4gMzgyOlxcdFxcdGludCByZXQ7XFxuIDM4MzpcXHRcXG4gMzg0OlxcdFxcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNmN0eC1cXHUwMDNldXJpbmdfbG9jayk7XFxuIDM4NTpcXHRcXG4gMzg2OlxcdFxcdGJsID0gaW9fYnVmZmVyX2dldF9saXN0KGN0eCwgYXJnLVxcdTAwM2VidWZfZ3JvdXApO1xcbiAzODc6XFx0XFx0aWYgKHVubGlrZWx5KCFibCkpXFxuIDM4ODpcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4gMzg5OlxcdFxcbiAzOTA6XFx0XFx0aWYgKGJsLVxcdTAwM2VmbGFncyBcXHUwMDI2IElPQkxfQlVGX1JJTkcpIHtcXG4gMzkxOlxcdFxcdFxcdHJldCA9IGlvX3JpbmdfYnVmZmVyc19wZWVrKHJlcSwgYXJnLCBibCk7XFxuIDM5MjpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2UgMClcXG4gMzkzOlxcdFxcdFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfQlVGRkVSU19DT01NSVQ7XFxuIDM5NDpcXHRcXHRcXHRzZWwtXFx1MDAzZWJ1Zl9saXN0ID0gYmw7XFxuIDM5NTpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiAzOTY6XFx0XFx0fVxcbiAzOTc6XFx0XFxuIDM5ODpcXHRcXHQvKiBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGJ1ZmZlciBzZWxlY3Rpb25zIGZvciBsZWdhY3kgKi9cXG4gMzk5OlxcdFxcdHNlbC1cXHUwMDNlYnVmX2xpc3QgPSBOVUxMO1xcbiA0MDA6XFx0XFx0cmV0dXJuIGlvX3Byb3ZpZGVkX2J1ZmZlcnNfc2VsZWN0KHJlcSwgXFx1MDAyNmFyZy1cXHUwMDNlbWF4X2xlbiwgYmwsIGFyZy1cXHUwMDNlaW92cyk7XFxuIDQwMTpcXHR9XFxuIDQwMjpcXHRcXG4gNDAzOlxcdHN0YXRpYyBpbmxpbmUgYm9vbCBfX2lvX3B1dF9rYnVmX3Jpbmcoc3RydWN0IGlvX2tpb2NiICpyZXEsXFxuIDQwNDpcXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsLCBpbnQgbGVuLCBpbnQgbnIpXFxuIDQwNTpcXHR7XFxuIDQwNjpcXHRcXHRib29sIHJldCA9IHRydWU7XFxuIDQwNzpcXHRcXG4gNDA4OlxcdFxcdGlmIChibClcXG4gNDA5OlxcdFxcdFxcdHJldCA9IGlvX2tidWZfY29tbWl0KHJlcSwgYmwsIGxlbiwgbnIpO1xcbiA0MTA6XFx0XFx0aWYgKHJldCBcXHUwMDI2XFx1MDAyNiAocmVxLVxcdTAwM2VmbGFncyBcXHUwMDI2IFJFUV9GX0JVRl9NT1JFKSlcXG4gNDExOlxcdFxcdFxcdHJldCA9IGZhbHNlO1xcbiA0MTI6XFx0XFxuIDQxMzpcXHRcXHRyZXEtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH4oUkVRX0ZfQlVGRkVSX1JJTkcgfCBSRVFfRl9CVUZfTU9SRSk7XFxuIDQxNDpcXHRcXHRyZXR1cm4gcmV0O1xcbiA0MTU6XFx0fVxcbiA0MTY6XFx0XFxuIDQxNzpcXHR1bnNpZ25lZCBpbnQgX19pb19wdXRfa2J1ZnMoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBpb19idWZmZXJfbGlzdCAqYmwsXFxuIDQxODpcXHRcXHRcXHRcXHQgICAgaW50IGxlbiwgaW50IG5idWZzKVxcbiA0MTk6XFx0e1xcbiA0MjA6XFx0XFx0dW5zaWduZWQgaW50IHJldDtcXG4gNDIxOlxcdFxcbiA0MjI6XFx0XFx0cmV0ID0gSU9SSU5HX0NRRV9GX0JVRkZFUiB8IChyZXEtXFx1MDAzZWJ1Zl9pbmRleCBcXHUwMDNjXFx1MDAzYyBJT1JJTkdfQ1FFX0JVRkZFUl9TSElGVCk7XFxuIDQyMzpcXHRcXG4gNDI0OlxcdFxcdGlmICh1bmxpa2VseSghKHJlcS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBSRVFfRl9CVUZGRVJfUklORykpKSB7XFxuIDQyNTpcXHRcXHRcXHRpb19rYnVmX2Ryb3BfbGVnYWN5KHJlcSk7XFxuIDQyNjpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA0Mjc6XFx0XFx0fVxcbiA0Mjg6XFx0XFxuIDQyOTpcXHRcXHRpZiAoIV9faW9fcHV0X2tidWZfcmluZyhyZXEsIGJsLCBsZW4sIG5idWZzKSlcXG4gNDMwOlxcdFxcdFxcdHJldCB8PSBJT1JJTkdfQ1FFX0ZfQlVGX01PUkU7XFxuIDQzMTpcXHRcXHRyZXR1cm4gcmV0O1xcbiA0MzI6XFx0fVxcbiA0MzM6XFx0XFxuIDQzNDpcXHRzdGF0aWMgaW50IGlvX3JlbW92ZV9idWZmZXJzX2xlZ2FjeShzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCxcXG4gNDM1OlxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsLFxcbiA0MzY6XFx0XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgbmJ1ZnMpXFxuIDQzNzpcXHR7XFxuIDQzODpcXHRcXHR1bnNpZ25lZCBsb25nIGkgPSAwO1xcbiA0Mzk6XFx0XFx0c3RydWN0IGlvX2J1ZmZlciAqbnh0O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMzowNi41NDQ2MjY5NzlaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzUxNTk2NTY0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgTWVtb3J5IE1hbmFnZW1lbnQgSXNzdWUqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgc25pcHBldCwgc3BlY2lmaWNhbGx5IHRoZSBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGZ1bmN0aW9uLCBhbmQgc29tZXRoaW5nJ3MgaW1tZWRpYXRlbHkganVtcGluZyBvdXQgYXQgbWUuIElmIGBhcmctXHUwMDNlbW9kZSBcdTAwMjYgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGBhcmctXHUwMDNlaW92c2AuIEhpc3RvcmljYWxseSwgaXQgbG9va3MgbGlrZSBgaW9fcmluZ19idWZmZXJzX3BlZWtgIG1pZ2h0IGhhdmUgYmVlbiBmcmVlaW5nIHRoZSBvbGQgYGFyZy1cdTAwM2Vpb3ZzYCBpZiBpdCBhbGxvY2F0ZWQgYSBuZXcgb25lLiBJIHRoaW5rIEkgc2VlIGEgcG90ZW50aWFsIGlzc3VlLi4uXG5cbkhvbGQgb24sIEkgc2VlIHRoZSBwYXRjaC4gSXQgc2VlbXMgdGhhdCB0aGUgYGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKWAgY2FsbCAqdXNlZCogdG8gYmUgd2l0aGluIHRoZSBmdW5jdGlvbiBidXQgaXMgbm93IGF0IHRoZSBlbmQuIFRoYXQncyBhIHJlZCBmbGFnISBJZiBgYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFYCBpcyB0cnVlLCB0aGVuIHRoYXQgbWVhbnMgdGhlIGNhbGxlciBpcyBleHBlY3RpbmcgdG8gdXNlIGBhcmctXHUwMDNlaW92c2AgKmFmdGVyKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIEJ1dCBpZiB3ZSBmcmVlIGBhcmctXHUwMDNlaW92c2AgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHRoZSBjYWxsZXIgaXMgZ29pbmcgdG8gYmUgbGVmdCBob2xkaW5nIGEgZGFuZ2xpbmcgcG9pbnRlci4gVGhhdCdzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSB2dWxuZXJhYmlsaXR5IVxuXG5MZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBwYXRjaCBvbmUgbW9yZSB0aW1lIHRvIGJlIHN1cmUuIFRoaXMgZGVmaW5pdGVseSBuZWVkcyBhIGNsb3NlciBsb29rLCBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byB0aGUgbGlmZXRpbWUgb2YgYGFyZy1cdTAwM2Vpb3ZzYCBhbmQgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNhbGxlciBhbmQgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODM4NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMzOjE0LjA2MDU5NTY5WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTcxMTY0MzYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiS0JVRl9NT0RFX0ZSRUVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW9fdXJpbmcvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImlvX3VyaW5nL2tidWYuYz0yNTM9c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXFxuLS1cXG5pb191cmluZy9rYnVmLmMtMzMwLVxcbmlvX3VyaW5nL2tidWYuYzozMzE6XFx0aWYgKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxcbmlvX3VyaW5nL2tidWYuYy0zMzItXFx0XFx0a2ZyZWUoYXJnLVxcdTAwM2Vpb3ZzKTtcXG4tLVxcbmlvX3VyaW5nL2tidWYuaD01Mz1lbnVtIHtcXG4tLVxcbmlvX3VyaW5nL2tidWYuaC01Ni1cXHQvKiBpZiBiaWdnZXIgdmVjIGFsbG9jYXRlZCwgZnJlZSBvbGQgb25lICovXFxuaW9fdXJpbmcva2J1Zi5oOjU3OlxcdEtCVUZfTU9ERV9GUkVFXFx0XFx0PSAyLFxcbmlvX3VyaW5nL2tidWYuaC01OC19O1xcbi0tXFxuaW9fdXJpbmcvbmV0LmM9NjA4PXN0YXRpYyBpbnQgaW9fc2VuZF9zZWxlY3RfYnVmZmVyKHN0cnVjdCBpb19raW9jYiAqcmVxLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MsXFxuLS1cXG5pb191cmluZy9uZXQuYy02MjItXFx0XFx0YXJnLmlvdnMgPSBrbXNnLVxcdTAwM2V2ZWMuaW92ZWM7XFxuaW9fdXJpbmcvbmV0LmM6NjIzOlxcdFxcdGFyZy5tb2RlID0gS0JVRl9NT0RFX0ZSRUU7XFxuaW9fdXJpbmcvbmV0LmMtNjI0LVxcdH1cXG4tLVxcbmlvX3VyaW5nL25ldC5jPTExMzc9c3RhdGljIGludCBpb19yZWN2X2J1Zl9zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2csXFxuLS1cXG5pb191cmluZy9uZXQuYy0xMTU5LVxcdFxcdFxcdGFyZy5pb3ZzID0ga21zZy1cXHUwMDNldmVjLmlvdmVjO1xcbmlvX3VyaW5nL25ldC5jOjExNjA6XFx0XFx0XFx0YXJnLm1vZGUgfD0gS0JVRl9NT0RFX0ZSRUU7XFxuaW9fdXJpbmcvbmV0LmMtMTE2MS1cXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMzOjE0LjE3NzcxNjYxNloiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMzg3NzcyNjE2NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgVXNlLUFmdGVyLUZyZWUgVnVsbmVyYWJpbGl0eSBpbiBpb191cmluZyoqXG5cbk9rYXksIGxldCdzIHNlZS4gSW4gYGlvX3JpbmdfYnVmZmVyc19wZWVrYCwgSSdtIGxvb2tpbmcgYXQgdGhlIGxvZ2ljIHJlbGF0ZWQgdG8gYGFyZy1cdTAwM2Vpb3ZzYCBhbmQgaG93IGl0IGhhbmRsZXMgcG90ZW50aWFsIHJlYWxsb2NhdGlvbi4gSSBzZWUgdGhhdCBpZiBgS0JVRl9NT0RFX0VYUEFORGAgaXMgc2V0IGFuZCBtb3JlIGlvdmVjcyBhcmUgbmVlZGVkLCBhIG5ldyBgaW92YCBhcnJheSBpcyBhbGxvY2F0ZWQgdXNpbmcgYGttYWxsb2Nfb2Jqc2AuIFRoaXMgbmV3IGFycmF5IHRoZW4gb3ZlcndyaXRlcyB0aGUgZXhpc3RpbmcgYGFyZy1cdTAwM2Vpb3ZzYCBwb2ludGVyLiBUaGUgZnVuY3Rpb24gdGhlbiBwcm9jZWVkcyB0byBwcm9jZXNzIHRoZSBkYXRhLlxuXG5Ob3csIEknbSB0aGlua2luZyBhYm91dCB0aGUgZnJlZWluZyBsb2dpYyBhdCB0aGUgZW5kLiBPcmlnaW5hbGx5LCBga2ZyZWUoYXJnLVx1MDAzZWlvdnMpYCB3YXMgY2FsbGVkIG9ubHkgaWYgYSBuZXcgYGlvdmAgd2Fzbid0IGFsbG9jYXRlZC4gVGhpcyBtZWFucyB0aGF0IGlmIGl0ICp3YXMqIHJlYWxsb2NhdGVkLCB0aGUgb2xkIG9uZSB3YXMgbGVha2VkLiBJdCB3YXMgYXR0ZW1wdGluZyB0byBzb2x2ZSB0aGUgb2xkIGxlYWssIGJ5IGludHJvZHVjaW5nIGEgbmV3IGBrZnJlZShhcmctXHUwMDNlaW92cylgIGNhbGwgYXQgdGhlIGVuZCwgY29uZGl0aW9uYWwgb24gYEtCVUZfTU9ERV9GUkVFYC5cblxuQnV0Li4uIGhvbGQgb24uIElmIGBhcmctXHUwMDNlaW92c2AgaXMgdXBkYXRlZCB0byBhIG5ldyBgaW92YCwgdGhlbiBga2ZyZWUoYXJnLVx1MDAzZWlvdnMpYCBhdCB0aGUgZW5kIHdpbGwgZnJlZSB0aGUgbmV3bHkgYWxsb2NhdGVkIGBpb3ZgISBUaGUgKm5ldyogb25lLiBBbmQgaXQgKmRvZXNuJ3QqIGZyZWUgdGhlIG9sZCBvbmUgYmVjYXVzZSBgYXJnLVx1MDAzZWlvdnNgIHdhcyBvdmVyd3JpdHRlbiEgSG93ZXZlciwgaWYgYGFyZy1cdTAwM2Vpb3ZzYCBpcyAqbm90KiB1cGRhdGVkLCB0aGUgb2xkIG9uZSAqaXMqIGZyZWVkLCB3aGljaCBpcyB0aGUgb3JpZ2luYWwgaW50ZW50LlxuXG5XaHkgZGlkIHN5ei1jbHVzdGVyIGFwcGx5IHRoaXMgcGF0Y2g/IEhtbSwgSSBzZWUgdGhlIHBhdGNoIG5vdy4gSXQgKm1vdmVkKiB0aGUgYGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKWAgdG8gdGhlIGVuZCBhbmQgYWRkZWQgdGhlIGBLQlVGX01PREVfRlJFRWAgY29uZGl0aW9uLiBBaGEhIFRoaXMgaXMgdGhlIGtleS4gVGhlIHBhdGNoIG5vdyBpbnRyb2R1Y2VzIGEgYnVnISBJdCBmcmVlcyBgYXJnLVx1MDAzZWlvdnNgIGF0IHRoZSAqZW5kKiBvZiB0aGUgZnVuY3Rpb24sIHdoaWNoIG1lYW5zIHRoZSBwb2ludGVyIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBhcmctXHUwMDNlaW92c2ApIGlzIGJlaW5nIGZyZWVkICpiZWZvcmUqIHRoZSBjYWxsZXIgZ2V0cyBhIGNoYW5jZSB0byB1c2UgaXQuXG5cblNvLCBpZiBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgYGFyZy1cdTAwM2Vpb3ZzYCB3aWxsIEFMV0FZUyBiZSBmcmVlZCBhdCB0aGUgZW5kLiBUaGlzIGlzIGEgY2xlYXIgdXNlLWFmdGVyLWZyZWUhIEFuZCBpdCBsb29rcyBsaWtlIHRoZSBwYXRjaCBpcyBmcm9tIHN5ei1jbHVzdGVyLiBcInN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1wiLi4uIFllcCwgdGhpcyBpcyBhIHBhdGNoIHVuZGVyIHJldmlldywgYW5kIGl0IGludHJvZHVjZXMgYSB1c2UtYWZ0ZXItZnJlZSwgcGxhaW4gYW5kIHNpbXBsZSFcblxuU2luY2UgaXQgaW50cm9kdWNlcyBhIHVzZS1hZnRlci1mcmVlLCBpdCBkZWZpbml0ZWx5IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyBhbmQgc2hvdWxkIGJlIGZ1enplZCEgSXQncyBjcml0aWNhbC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQgYW5kIGhvdyBgYXJnLVx1MDAzZWlvdnNgIGlzIHVzZWQgYWZ0ZXIgdGhpcyBjYWxsLiBJJ2xsIG5lZWQgdG8gY2hlY2sgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgYW5kIGBpb19yZWN2X2J1Zl9zZWxlY3RgIGluIGBpb191cmluZy9uZXQuY2AgYmVjYXVzZSB0aGV5IGFyZSBsaWtlbHkgdGhlIGNhbGxlcnMgdGhhdCBwYXNzIGluIGBhcmdgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MzMzLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzM0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMzOjI4LjA1NTQ0NTQwMVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDc5NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW9fdXJpbmcvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjA4LFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDYwODpcXHRzdGF0aWMgaW50IGlvX3NlbmRfc2VsZWN0X2J1ZmZlcihzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzLFxcbiA2MDk6XFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBpb19icl9zZWwgKnNlbCwgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZylcXG4gNjEwOlxcdHtcXG4gNjExOlxcdFxcdHN0cnVjdCBpb19zcl9tc2cgKnNyID0gaW9fa2lvY2JfdG9fY21kKHJlcSwgc3RydWN0IGlvX3NyX21zZyk7XFxuIDYxMjpcXHRcXHRzdHJ1Y3QgYnVmX3NlbF9hcmcgYXJnID0ge1xcbiA2MTM6XFx0XFx0XFx0LmlvdnMgPSBcXHUwMDI2a21zZy1cXHUwMDNlZmFzdF9pb3YsXFxuIDYxNDpcXHRcXHRcXHQubWF4X2xlbiA9IG1pbl9ub3RfemVybyhzci1cXHUwMDNlbGVuLCBJTlRfTUFYKSxcXG4gNjE1OlxcdFxcdFxcdC5ucl9pb3ZzID0gMSxcXG4gNjE2OlxcdFxcdFxcdC5idWZfZ3JvdXAgPSBzci1cXHUwMDNlYnVmX2dyb3VwLFxcbiA2MTc6XFx0XFx0fTtcXG4gNjE4OlxcdFxcdGludCByZXQ7XFxuIDYxOTpcXHRcXG4gNjIwOlxcdFxcdGlmIChrbXNnLVxcdTAwM2V2ZWMuaW92ZWMpIHtcXG4gNjIxOlxcdFxcdFxcdGFyZy5ucl9pb3ZzID0ga21zZy1cXHUwMDNldmVjLm5yO1xcbiA2MjI6XFx0XFx0XFx0YXJnLmlvdnMgPSBrbXNnLVxcdTAwM2V2ZWMuaW92ZWM7XFxuIDYyMzpcXHRcXHRcXHRhcmcubW9kZSA9IEtCVUZfTU9ERV9GUkVFO1xcbiA2MjQ6XFx0XFx0fVxcbiA2MjU6XFx0XFxuIDYyNjpcXHRcXHRpZiAoIShzci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT1JJTkdfUkVDVlNFTkRfQlVORExFKSlcXG4gNjI3OlxcdFxcdFxcdGFyZy5ucl9pb3ZzID0gMTtcXG4gNjI4OlxcdFxcdGVsc2VcXG4gNjI5OlxcdFxcdFxcdGFyZy5tb2RlIHw9IEtCVUZfTU9ERV9FWFBBTkQ7XFxuIDYzMDpcXHRcXG4gNjMxOlxcdFxcdHJldCA9IGlvX2J1ZmZlcnNfc2VsZWN0KHJlcSwgXFx1MDAyNmFyZywgc2VsLCBpc3N1ZV9mbGFncyk7XFxuIDYzMjpcXHRcXHRpZiAodW5saWtlbHkocmV0IFxcdTAwM2MgMCkpXFxuIDYzMzpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA2MzQ6XFx0XFxuIDYzNTpcXHRcXHRpZiAoYXJnLmlvdnMgIT0gXFx1MDAyNmttc2ctXFx1MDAzZWZhc3RfaW92IFxcdTAwMjZcXHUwMDI2IGFyZy5pb3ZzICE9IGttc2ctXFx1MDAzZXZlYy5pb3ZlYykge1xcbiA2MzY6XFx0XFx0XFx0a21zZy1cXHUwMDNldmVjLm5yID0gcmV0O1xcbiA2Mzc6XFx0XFx0XFx0a21zZy1cXHUwMDNldmVjLmlvdmVjID0gYXJnLmlvdnM7XFxuIDYzODpcXHRcXHRcXHRyZXEtXFx1MDAzZWZsYWdzIHw9IFJFUV9GX05FRURfQ0xFQU5VUDtcXG4gNjM5OlxcdFxcdH1cXG4gNjQwOlxcdFxcdHNyLVxcdTAwM2VsZW4gPSBhcmcub3V0X2xlbjtcXG4gNjQxOlxcdFxcbiA2NDI6XFx0XFx0aWYgKHJldCA9PSAxKSB7XFxuIDY0MzpcXHRcXHRcXHRzci1cXHUwMDNlYnVmID0gYXJnLmlvdnNbMF0uaW92X2Jhc2U7XFxuIDY0NDpcXHRcXHRcXHRyZXQgPSBpbXBvcnRfdWJ1ZihJVEVSX1NPVVJDRSwgc3ItXFx1MDAzZWJ1Ziwgc3ItXFx1MDAzZWxlbixcXG4gNjQ1OlxcdFxcdFxcdFxcdFxcdFxcdFxcdTAwMjZrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIpO1xcbiA2NDY6XFx0XFx0XFx0aWYgKHVubGlrZWx5KHJldCkpXFxuIDY0NzpcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA2NDg6XFx0XFx0fSBlbHNlIHtcXG4gNjQ5OlxcdFxcdFxcdGlvdl9pdGVyX2luaXQoXFx1MDAyNmttc2ctXFx1MDAzZW1zZy5tc2dfaXRlciwgSVRFUl9TT1VSQ0UsXFxuIDY1MDpcXHRcXHRcXHRcXHRcXHRhcmcuaW92cywgcmV0LCBhcmcub3V0X2xlbik7XFxuIDY1MTpcXHRcXHR9XFxuIDY1MjpcXHRcXG4gNjUzOlxcdFxcdHJldHVybiAwO1xcbiA2NTQ6XFx0fVxcbiA2NTU6XFx0XFxuIDY1NjpcXHRpbnQgaW9fc2VuZChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxcbiA2NTc6XFx0e1xcbiA2NTg6XFx0XFx0c3RydWN0IGlvX3NyX21zZyAqc3IgPSBpb19raW9jYl90b19jbWQocmVxLCBzdHJ1Y3QgaW9fc3JfbXNnKTtcXG4gNjU5OlxcdFxcdHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2cgPSByZXEtXFx1MDAzZWFzeW5jX2RhdGE7XFxuIDY2MDpcXHRcXHRzdHJ1Y3QgaW9fYnJfc2VsIHNlbCA9IHsgfTtcXG4gNjYxOlxcdFxcdHN0cnVjdCBzb2NrZXQgKnNvY2s7XFxuIDY2MjpcXHRcXHR1bnNpZ25lZCBmbGFncztcXG4gNjYzOlxcdFxcdGludCBtaW5fcmV0ID0gMDtcXG4gNjY0OlxcdFxcdGludCByZXQ7XFxuIDY2NTpcXHRcXG4gNjY2OlxcdFxcdHNvY2sgPSBzb2NrX2Zyb21fZmlsZShyZXEtXFx1MDAzZWZpbGUpO1xcbiA2Njc6XFx0XFx0aWYgKHVubGlrZWx5KCFzb2NrKSlcXG4gNjY4OlxcdFxcdFxcdHJldHVybiAtRU5PVFNPQ0s7XFxuIDY2OTpcXHRcXG4gNjcwOlxcdFxcdGlmICghKHJlcS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBSRVFfRl9QT0xMRUQpIFxcdTAwMjZcXHUwMDI2XFxuIDY3MTpcXHRcXHQgICAgKHNyLVxcdTAwM2VmbGFncyBcXHUwMDI2IElPUklOR19SRUNWU0VORF9QT0xMX0ZJUlNUKSlcXG4gNjcyOlxcdFxcdFxcdHJldHVybiAtRUFHQUlOO1xcbiA2NzM6XFx0XFxuIDY3NDpcXHRcXHRpZiAocmVxLVxcdTAwM2VmbGFncyBcXHUwMDI2IFJFUV9GX0lNUE9SVF9CVUZGRVIpIHtcXG4gNjc1OlxcdFxcdFxcdHJldCA9IGlvX2ltcG9ydF9yZWdfYnVmKHJlcSwgXFx1MDAyNmttc2ctXFx1MDAzZW1zZy5tc2dfaXRlcixcXG4gNjc2OlxcdFxcdFxcdFxcdFxcdFxcdCh1NjQpKHVpbnRwdHJfdClzci1cXHUwMDNlYnVmLCBzci1cXHUwMDNlbGVuLFxcbiA2Nzc6XFx0XFx0XFx0XFx0XFx0XFx0SVRFUl9TT1VSQ0UsIGlzc3VlX2ZsYWdzKTtcXG4gNjc4OlxcdFxcdFxcdGlmICh1bmxpa2VseShyZXQpKVxcbiA2Nzk6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gNjgwOlxcdFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgXFx1MDAyNj0gflJFUV9GX0lNUE9SVF9CVUZGRVI7XFxuIDY4MTpcXHRcXHR9XFxuIDY4MjpcXHRcXG4gNjgzOlxcdFxcdGZsYWdzID0gc3ItXFx1MDAzZW1zZ19mbGFncztcXG4gNjg0OlxcdFxcdGlmIChpc3N1ZV9mbGFncyBcXHUwMDI2IElPX1VSSU5HX0ZfTk9OQkxPQ0spXFxuIDY4NTpcXHRcXHRcXHRmbGFncyB8PSBNU0dfRE9OVFdBSVQ7XFxuIDY4NjpcXHRcXG4gNjg3OlxcdHJldHJ5X2J1bmRsZTpcXG4gNjg4OlxcdFxcdHNlbC5idWZfbGlzdCA9IE5VTEw7XFxuIDY4OTpcXHRcXHRpZiAoaW9fZG9fYnVmZmVyX3NlbGVjdChyZXEpKSB7XFxuIDY5MDpcXHRcXHRcXHRyZXQgPSBpb19zZW5kX3NlbGVjdF9idWZmZXIocmVxLCBpc3N1ZV9mbGFncywgXFx1MDAyNnNlbCwga21zZyk7XFxuIDY5MTpcXHRcXHRcXHRpZiAocmV0KVxcbiA2OTI6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gNjkzOlxcdFxcdH1cXG4gNjk0OlxcdFxcbiA2OTU6XFx0XFx0LypcXG4gNjk2OlxcdFxcdCAqIElmIE1TR19XQUlUQUxMIGlzIHNldCwgb3IgdGhpcyBpcyBhIGJ1bmRsZSBzZW5kLCB0aGVuIHdlIG5lZWRcXG4gNjk3OlxcdFxcdCAqIHRoZSBmdWxsIGFtb3VudC4gSWYganVzdCBidW5kbGUgaXMgc2V0LCBpZiB3ZSBkbyBhIHNob3J0IHNlbmRcXG4gNjk4OlxcdFxcdCAqIHRoZW4gd2UgY29tcGxldGUgdGhlIGJ1bmRsZSBzZXF1ZW5jZSByYXRoZXIgdGhhbiBjb250aW51ZSBvbi5cXG4gNjk5OlxcdFxcdCAqL1xcbiA3MDA6XFx0XFx0aWYgKGZsYWdzIFxcdTAwMjYgTVNHX1dBSVRBTEwgfHwgc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0JVTkRMRSlcXG4gNzAxOlxcdFxcdFxcdG1pbl9yZXQgPSBpb3ZfaXRlcl9jb3VudChcXHUwMDI2a21zZy1cXHUwMDNlbXNnLm1zZ19pdGVyKTtcXG4gNzAyOlxcdFxcbiA3MDM6XFx0XFx0ZmxhZ3MgXFx1MDAyNj0gfk1TR19JTlRFUk5BTF9TRU5ETVNHX0ZMQUdTO1xcbiA3MDQ6XFx0XFx0a21zZy1cXHUwMDNlbXNnLm1zZ19mbGFncyA9IGZsYWdzO1xcbiA3MDU6XFx0XFx0cmV0ID0gc29ja19zZW5kbXNnKHNvY2ssIFxcdTAwMjZrbXNnLVxcdTAwM2Vtc2cpO1xcbiA3MDY6XFx0XFx0aWYgKHJldCBcXHUwMDNjIG1pbl9yZXQpIHtcXG4gNzA3OlxcdFxcdFxcdGlmIChyZXQgPT0gLUVBR0FJTiBcXHUwMDI2XFx1MDAyNiAoaXNzdWVfZmxhZ3MgXFx1MDAyNiBJT19VUklOR19GX05PTkJMT0NLKSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzM6MjguMDU1Nzk2NDIxWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwNTc4NTEwNzAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlVzZS1BZnRlci1GcmVlIEJ1ZyBpbiBpb19zZW5kX3NlbGVjdF9idWZmZXIqKlxuXG5Pa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBJdCBsb29rcyBsaWtlIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGhhcyBhIGNyaXRpY2FsIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkuIFRoZSBjb3JlIHByb2JsZW0gbGllcyBpbiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCwgYGlvX2J1ZmZlcnNfc2VsZWN0YCwgYW5kIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuXG5cbkZpcnN0LCBpZiBga21zZy1cdTAwM2V2ZWMuaW92ZWNgIGlzIGFscmVhZHkgYWxsb2NhdGVkIOKAkyBtZWFuaW5nIGBpb19zZW5kYCB3YXMgcHJldmlvdXNseSBjYWxsZWQgd2l0aCBhbiBpb3ZlYyBhcnJheSAobGlrZWx5IHRocm91Z2ggYGlvX3NlbmRtc2dgIG9yIGBpb19yZWN2bXNnYCBvciBhIHByZXZpb3VzIGFsbG9jYXRpb24pIOKAkyBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBzZXRzIGBhcmcubW9kZSA9IEtCVUZfTU9ERV9GUkVFYC4gIFRoZW4gYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBpcyBjYWxsZWQuXG5cbkhlcmUncyB0aGUgY3J1eDogaWYgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCAqYWxsb2NhdGVzKiBhIG5ldyBgaW92YCwgaXQgc2V0cyBgYXJnLmlvdnNgIHRvIHRoYXQgbmV3IGFsbG9jYXRpb24uIEhvd2V2ZXIsIGF0IHRoZSAqZW5kKiBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLCBpdCB1bmNvbmRpdGlvbmFsbHkgY2FsbHMgYGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKWAgYmVjYXVzZSBgYXJnLm1vZGVgIGhhcyBgS0JVRl9NT0RFX0ZSRUVgIHNldC4gIFNvIHdlJ3ZlIGp1c3QgZnJlZWQgdGhlICpuZXdseSBhbGxvY2F0ZWQqIGBpb3ZgLiAgVGhlbiBiYWNrIGluIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgLCB0aGUgY29kZSBwcm9jZWVkcywgYW5kIG5vdyBga21zZy1cdTAwM2V2ZWMuaW92ZWNgIHBvaW50cyB0byBmcmVlZCBtZW1vcnkhIFRoZW4gd2UgdXNlIHRoYXQgZnJlZWQgbWVtb3J5ISBDbGFzc2ljIHVzZS1hZnRlci1mcmVlLlxuXG5CdXQgd2hhdCBpZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgICpkb2Vzbid0KiBhbGxvY2F0ZSBhIG5ldyBgaW92YD8gSW4gdGhhdCBjYXNlLCBgYXJnLVx1MDAzZWlvdnNgIHJlbWFpbnMgYGttc2ctXHUwMDNldmVjLmlvdmVjYC4gQXQgdGhlICplbmQqIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AsIGl0IHN0aWxsIGNhbGxzIGBrZnJlZShhcmctXHUwMDNlaW92cylgLCB3aGljaCBpcyBzdGlsbCBga21zZy1cdTAwM2V2ZWMuaW92ZWNgLCB3aGljaCBoYXMgYmVlbiBmcmVlZC4gVGhlIGNvZGUgY29udGludWVzIGluIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGFuZCB0aGVuIHByb2NlZWRzLCBhbmQgYWdhaW4sIGBhcmcuaW92c2AgaXMgdXNlZCBhZnRlciBiZWluZyBmcmVlZC5cblxuU28sIGluICpib3RoKiBzY2VuYXJpb3MgKG5ldyBpb3YgYWxsb2NhdGVkIG9yIG5vdCksIHRoZSBjb2RlIGZyZWVzIHRoZSBgaW92c2AgYXJyYXkgYW5kIHRoZW4gKmltbWVkaWF0ZWx5KiB1c2VzIGl0LiAgVGhpcyBpcyBhIGd1YXJhbnRlZWQsIHJlcHJvZHVjaWJsZSB1c2UtYWZ0ZXItZnJlZSBidWcgaWYgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQuXG5cbldoZW4gZG9lcyBgS0JVRl9NT0RFX0ZSRUVgIGdldCBzZXQ/ICBJdCBnZXRzIHNldCB3aGVuIGBrbXNnLVx1MDAzZXZlYy5pb3ZlY2AgaXMgbm9uLU5VTEwsIGFuZCB3ZSBlc3RhYmxpc2hlZCB0aGF0IGhhcHBlbnMgd2hlbiBgaW9fc2VuZGAgaXMgY2FsbGVkIHdpdGggYSBwcmUtYWxsb2NhdGVkIGlvdmVjIGFycmF5LiAgVGhpcyBtZWFucyB1c2luZyBgaW9fc2VuZG1zZ2Agb3IgYGlvX3JlY3Ztc2dgLCBvciBhZnRlciB0aGUgYXJyYXkgaGFzIGJlZW4gYWxsb2NhdGVkIGZyb20gYSBwcmV2aW91cyBjYWxsLiBJIG5lZWQgdG8gY29uZmlybSB3aGVyZSBgaW9fc2VuZGAgYWN0dWFsbHkgKnVzZXMqIGBrbXNnLVx1MDAzZXZlYy5pb3ZlY2AuIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIGBpb19zZW5kX3NldHVwYCBvciBzb21ldGhpbmcgc2ltaWxhciBmb3IgdGhlIGRldGFpbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMzY2LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODc2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzM6MzguNjM0MzA5ODQzWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTIwMDEzNTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia21zZy1cXHUwMDNldmVjLmlvdmVjID1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW9fdXJpbmcvbmV0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcvbmV0LmM9NjA4PXN0YXRpYyBpbnQgaW9fc2VuZF9zZWxlY3RfYnVmZmVyKHN0cnVjdCBpb19raW9jYiAqcmVxLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MsXFxuLS1cXG5pb191cmluZy9uZXQuYy02MzYtXFx0XFx0a21zZy1cXHUwMDNldmVjLm5yID0gcmV0O1xcbmlvX3VyaW5nL25ldC5jOjYzNzpcXHRcXHRrbXNnLVxcdTAwM2V2ZWMuaW92ZWMgPSBhcmcuaW92cztcXG5pb191cmluZy9uZXQuYy02MzgtXFx0XFx0cmVxLVxcdTAwM2VmbGFncyB8PSBSRVFfRl9ORUVEX0NMRUFOVVA7XFxuLS1cXG5pb191cmluZy9uZXQuYz0xMTM3PXN0YXRpYyBpbnQgaW9fcmVjdl9idWZfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLFxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtMTE3Ni1cXHRcXHRcXHRrbXNnLVxcdTAwM2V2ZWMubnIgPSByZXQ7XFxuaW9fdXJpbmcvbmV0LmM6MTE3NzpcXHRcXHRcXHRrbXNnLVxcdTAwM2V2ZWMuaW92ZWMgPSBhcmcuaW92cztcXG5pb191cmluZy9uZXQuYy0xMTc4LVxcdFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTkVFRF9DTEVBTlVQO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMzozOC43ODYzMTc5MDlaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTExMDA3MzExODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRlYnVnZ2luZyBhIEtlcm5lbCBNZXNzYWdpbmcgSXNzdWUqKlxuXG5Pa2F5LCBob2xkIG9uLiBUaGlzIGBrbXNnLVx1MDAzZXZlYy5pb3ZlY2AgcG9pbnRlci4uLiBpdCdzIGluaXRpYWxpemVkIHRvIGBOVUxMYD8gVGhhdCdzIGRlZmluaXRlbHkgbm90IHJpZ2h0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGVuIGFuZCBob3cgdGhpcyB2ZWN0b3IgaXMgc3VwcG9zZWQgdG8gYmUgcG9wdWxhdGVkLiBUaGUgZmFjdCB0aGF0IGl0J3MgYE5VTExgIG5vdyBpbXBsaWVzIGFuIGlzc3VlIGVhcmxpZXIgaW4gdGhlIHNldHVwLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gdHJhY2UgdGhpcyBiYWNrIHRocm91Z2ggdGhlIHNlbmQgcGF0aC4gSSdsbCBuZWVkIHRvIGxvb2sgYXQgZWl0aGVyIGBpb19zZW5kbXNnX3ByZXBgIG9yIHBvc3NpYmx5IGV2ZW4gYGlvX3NlbmRfcHJlcGAgZGVwZW5kaW5nIG9uIGhvdyB0aGUgbWVzc2FnaW5nIGlzIHN0cnVjdHVyZWQgaW4gdGhpcyBzcGVjaWZpYyBtb2R1bGUuIEl0IGlzIG1vc3QgbGlrZWx5IGluIG9uZSBvZiB0aG9zZSBmdW5jdGlvbnMuIEkgbmVlZCB0byBxdWlja2x5IGlkZW50aWZ5IHdoZXJlIHRoZSBgaW92ZWNgIGdldHMgYWxsb2NhdGVkIGFuZCBwb3B1bGF0ZWQuIFRoaXMgd2lsbCBhbGxvdyBtZSB0byBuYXJyb3cgZG93biB0aGUgc291cmNlIG9mIHRoaXMgcG90ZW50aWFsbHkgZmF0YWwgZXJyb3IuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MTYyLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzM6NDkuODg3MDUxNjAxWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDgzNDA1OTksIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX3NlbmRfcHJlcFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzM6NDkuOTk1NDEyODRaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjc0MTYzNjYyMzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgZGVsaXZlcmVkIGFzIGEgZmlyc3QtcGVyc29uIHN1bW1hcnk6XG5cbioqRGl2aW5nIGludG8gaW9cXF9zZW5kbXNnXFxfcHJlcCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGluLiBMZXQncyBnZXQgcmlnaHQgZG93biB0byBpdC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gYGlvX3NlbmRtc2dfcHJlcGAuIEdpdmVuIG15IGV4cGVyaWVuY2UsIEkga25vdyB0aGlzIGlzIG9mdGVuIGEgY3JpdGljYWwgcG9pbnQgaW4gdGhlIG5ldHdvcmtpbmcgc3RhY2ssIHNvIEknbGwgd2FudCB0byBjYXJlZnVsbHkgZXhhbWluZSB0aGUgcHJlcGFyYXRpb24gc3RhZ2VzIGZvciBgc2VuZG1zZ2AuIFRoaW5ncyBjYW4gZ2V0IGhhaXJ5IHF1aWNrbHkgaW4gdGhpcyBhcmVhLCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIGFuY2lsbGFyeSBkYXRhLCBzY2F0dGVyL2dhdGhlciBJL08sIGFuZCB0aGUgbnVhbmNlcyBvZiB2YXJpb3VzIHNvY2tldCB0eXBlcy4gSSdtIGltbWVkaWF0ZWx5IHRoaW5raW5nIGFib3V0IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGJ1ZmZlciBtYW5hZ2VtZW50IGlzc3VlcywgYW5kIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgdGhlIHRyYW5zaXRpb24gZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gSSdsbCBuZWVkIHRvIGxvb2sgY2xvc2VseSBhdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIHVzZWQsIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHJhdGVnaWVzLCBhbmQgYW55IHBvdGVudGlhbCBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuIFRpbWUgdG8gc2VlIHdoYXQncyByZWFsbHkgZ29pbmcgb24gdW5kZXIgdGhlIGhvb2QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0NDMwLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzQ6MTcuNDExNzgzMjk2WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1ODEwNzYwNDMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaW9fc2VuZG1zZ19wcmVwXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImlvX3VyaW5nL25ldC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImlvX3VyaW5nL25ldC5jPTM5Nj1zdGF0aWMgaW50IGlvX3NlbmRtc2dfc2V0dXAoc3RydWN0IGlvX2tpb2NiICpyZXEsIGNvbnN0IHN0cnVjdCBpb191cmluZ19zcWUgKnNxZSlcXG4tLVxcbmlvX3VyaW5nL25ldC5jLTQyMy1cXG5pb191cmluZy9uZXQuYzo0MjQ6aW50IGlvX3NlbmRtc2dfcHJlcChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxcbmlvX3VyaW5nL25ldC5jLTQyNS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjE3Ljk5Mjg2NDc5OVoiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MTI1MTA1NDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBjb2RlLlxuXG4qKkFuYWx5emluZyBgaW9fc2VuZG1zZ19wcmVwYCBhbmQgYGlvX3NlbmRfcHJlcGAqKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIGhvdyB0aGVzZSBmdW5jdGlvbnMgd29yay4gU3RhcnRpbmcgd2l0aCBgaW9fc2VuZG1zZ19wcmVwYC4uLiBhbmQgbm93IEknbSB0aGlua2luZywgYmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uLCBgaW9fc2VuZF9wcmVwYCBpcyBwcm9iYWJseSB0aGUgYXN5bmNocm9ub3VzIHZlcnNpb24gb3IgaGFzIHNvbWUgc29ydCBvZiBhc3luY2hyb25vdXMgY29tcG9uZW50LiBQZXJoYXBzIGl0J3MgY2FsbGVkIHNvbWV0aGluZyBsaWtlIGBpb19zZW5kX3ByZXBfYXN5bmNgLCBvciBoYXMgYSBzaW1pbGFyIG5hbWluZyBwYXR0ZXJuLiBOZWVkIHRvIGNvbmZpcm0gdGhhdCBxdWlja2x5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDgwMiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjIyLjExNzk3NDU5NFoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTA2NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW9fdXJpbmcvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDAwLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQwMDpcXHRcXHRzdHJ1Y3QgdXNlcl9tc2doZHIgbXNnO1xcbiA0MDE6XFx0XFx0aW50IHJldDtcXG4gNDAyOlxcdFxcbiA0MDM6XFx0XFx0c3ItXFx1MDAzZWZsYWdzIHw9IElPUklOR19TRU5EX1ZFQ1RPUklaRUQ7XFxuIDQwNDpcXHRcXHRzci1cXHUwMDNldW1zZyA9IHU2NF90b191c2VyX3B0cihSRUFEX09OQ0Uoc3FlLVxcdTAwM2VhZGRyKSk7XFxuIDQwNTpcXHRcXHRyZXQgPSBpb19tc2dfY29weV9oZHIocmVxLCBrbXNnLCBcXHUwMDI2bXNnLCBJVEVSX1NPVVJDRSwgTlVMTCk7XFxuIDQwNjpcXHRcXHRpZiAodW5saWtlbHkocmV0KSlcXG4gNDA3OlxcdFxcdFxcdHJldHVybiByZXQ7XFxuIDQwODpcXHRcXHQvKiBzYXZlIG1zZ19jb250cm9sIGFzIHN5c19zZW5kbXNnKCkgb3ZlcndyaXRlcyBpdCAqL1xcbiA0MDk6XFx0XFx0c3ItXFx1MDAzZW1zZ19jb250cm9sID0ga21zZy1cXHUwMDNlbXNnLm1zZ19jb250cm9sX3VzZXI7XFxuIDQxMDpcXHRcXG4gNDExOlxcdFxcdGlmIChzci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT1JJTkdfUkVDVlNFTkRfRklYRURfQlVGKSB7XFxuIDQxMjpcXHRcXHRcXHRrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIubnJfc2VncyA9IG1zZy5tc2dfaW92bGVuO1xcbiA0MTM6XFx0XFx0XFx0cmV0dXJuIGlvX3ByZXBfcmVnX2lvdmVjKHJlcSwgXFx1MDAyNmttc2ctXFx1MDAzZXZlYywgbXNnLm1zZ19pb3YsXFxuIDQxNDpcXHRcXHRcXHRcXHRcXHRcXHQgbXNnLm1zZ19pb3ZsZW4pO1xcbiA0MTU6XFx0XFx0fVxcbiA0MTY6XFx0XFx0aWYgKHJlcS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBSRVFfRl9CVUZGRVJfU0VMRUNUKVxcbiA0MTc6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDQxODpcXHRcXHRyZXR1cm4gaW9fbmV0X2ltcG9ydF92ZWMocmVxLCBrbXNnLCBtc2cubXNnX2lvdiwgbXNnLm1zZ19pb3ZsZW4sIElURVJfU09VUkNFKTtcXG4gNDE5OlxcdH1cXG4gNDIwOlxcdFxcbiA0MjE6XFx0I2RlZmluZSBTRU5ETVNHX0ZMQUdTIChJT1JJTkdfUkVDVlNFTkRfUE9MTF9GSVJTVCB8IElPUklOR19SRUNWU0VORF9CVU5ETEUgfCBcXFxcXFxuIDQyMjpcXHRcXHRcXHRcXHRJT1JJTkdfU0VORF9WRUNUT1JJWkVEIHwgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRilcXG4gNDIzOlxcdFxcbiA0MjQ6XFx0aW50IGlvX3NlbmRtc2dfcHJlcChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxcbiA0MjU6XFx0e1xcbiA0MjY6XFx0XFx0c3RydWN0IGlvX3NyX21zZyAqc3IgPSBpb19raW9jYl90b19jbWQocmVxLCBzdHJ1Y3QgaW9fc3JfbXNnKTtcXG4gNDI3OlxcdFxcbiA0Mjg6XFx0XFx0c3ItXFx1MDAzZWRvbmVfaW8gPSAwO1xcbiA0Mjk6XFx0XFx0c3ItXFx1MDAzZWxlbiA9IFJFQURfT05DRShzcWUtXFx1MDAzZWxlbik7XFxuIDQzMDpcXHRcXHRpZiAodW5saWtlbHkoc3ItXFx1MDAzZWxlbiBcXHUwMDNjIDApKVxcbiA0MzE6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQzMjpcXHRcXHRzci1cXHUwMDNlZmxhZ3MgPSBSRUFEX09OQ0Uoc3FlLVxcdTAwM2Vpb3ByaW8pO1xcbiA0MzM6XFx0XFx0aWYgKHNyLVxcdTAwM2VmbGFncyBcXHUwMDI2IH5TRU5ETVNHX0ZMQUdTKVxcbiA0MzQ6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQzNTpcXHRcXHRpZiAoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRikge1xcbiA0MzY6XFx0XFx0XFx0LyogcmVnaXN0ZXJlZCBidWZmZXIgc2VuZCBvbmx5IHN1cHBvcnRlZCBmb3IgcGxhaW4gSU9SSU5HX09QX1NFTkQgKi9cXG4gNDM3OlxcdFxcdFxcdGlmIChyZXEtXFx1MDAzZW9wY29kZSAhPSBJT1JJTkdfT1BfU0VORCB8fFxcbiA0Mzg6XFx0XFx0XFx0ICAgIChyZXEtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUkVRX0ZfQlVGRkVSX1NFTEVDVCkgfHxcXG4gNDM5OlxcdFxcdFxcdCAgICAoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgKElPUklOR19SRUNWU0VORF9CVU5ETEV8SU9SSU5HX1NFTkRfVkVDVE9SSVpFRCkpKVxcbiA0NDA6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQ0MTpcXHRcXHRcXHRyZXEtXFx1MDAzZWJ1Zl9pbmRleCA9IFJFQURfT05DRShzcWUtXFx1MDAzZWJ1Zl9pbmRleCk7XFxuIDQ0MjpcXHRcXHR9XFxuIDQ0MzpcXHRcXHRzci1cXHUwMDNlbXNnX2ZsYWdzID0gUkVBRF9PTkNFKHNxZS1cXHUwMDNlbXNnX2ZsYWdzKSB8IE1TR19OT1NJR05BTDtcXG4gNDQ0OlxcdFxcdGlmIChzci1cXHUwMDNlbXNnX2ZsYWdzIFxcdTAwMjYgTVNHX0RPTlRXQUlUKVxcbiA0NDU6XFx0XFx0XFx0cmVxLVxcdTAwM2VmbGFncyB8PSBSRVFfRl9OT1dBSVQ7XFxuIDQ0NjpcXHRcXHRpZiAocmVxLVxcdTAwM2VmbGFncyBcXHUwMDI2IFJFUV9GX0JVRkZFUl9TRUxFQ1QpXFxuIDQ0NzpcXHRcXHRcXHRzci1cXHUwMDNlYnVmX2dyb3VwID0gcmVxLVxcdTAwM2VidWZfaW5kZXg7XFxuIDQ0ODpcXHRcXHRpZiAoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0JVTkRMRSkge1xcbiA0NDk6XFx0XFx0XFx0aWYgKHJlcS1cXHUwMDNlb3Bjb2RlID09IElPUklOR19PUF9TRU5ETVNHKVxcbiA0NTA6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQ1MTpcXHRcXHRcXHRzci1cXHUwMDNlbXNnX2ZsYWdzIHw9IE1TR19XQUlUQUxMO1xcbiA0NTI6XFx0XFx0XFx0cmVxLVxcdTAwM2VmbGFncyB8PSBSRVFfRl9NVUxUSVNIT1Q7XFxuIDQ1MzpcXHRcXHR9XFxuIDQ1NDpcXHRcXG4gNDU1OlxcdFxcdGlmIChpb19pc19jb21wYXQocmVxLVxcdTAwM2VjdHgpKVxcbiA0NTY6XFx0XFx0XFx0c3ItXFx1MDAzZW1zZ19mbGFncyB8PSBNU0dfQ01TR19DT01QQVQ7XFxuIDQ1NzpcXHRcXG4gNDU4OlxcdFxcdGlmICh1bmxpa2VseSghaW9fbXNnX2FsbG9jX2FzeW5jKHJlcSkpKVxcbiA0NTk6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIDQ2MDpcXHRcXHRpZiAocmVxLVxcdTAwM2VvcGNvZGUgIT0gSU9SSU5HX09QX1NFTkRNU0cpXFxuIDQ2MTpcXHRcXHRcXHRyZXR1cm4gaW9fc2VuZF9zZXR1cChyZXEsIHNxZSk7XFxuIDQ2MjpcXHRcXHRpZiAodW5saWtlbHkoc3FlLVxcdTAwM2VhZGRyMiB8fCBzcWUtXFx1MDAzZWZpbGVfaW5kZXgpKVxcbiA0NjM6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQ2NDpcXHRcXHRyZXR1cm4gaW9fc2VuZG1zZ19zZXR1cChyZXEsIHNxZSk7XFxuIDQ2NTpcXHR9XFxuIDQ2NjpcXHRcXG4gNDY3OlxcdHN0YXRpYyB2b2lkIGlvX3JlcV9tc2dfY2xlYW51cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSxcXG4gNDY4OlxcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXFxuIDQ2OTpcXHR7XFxuIDQ3MDpcXHRcXHRpb19uZXRtc2dfcmVjeWNsZShyZXEsIGlzc3VlX2ZsYWdzKTtcXG4gNDcxOlxcdH1cXG4gNDcyOlxcdFxcbiA0NzM6XFx0LypcXG4gNDc0OlxcdCAqIEZvciBidW5kbGUgY29tcGxldGlvbnMsIHdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgbWFueSBzZWdtZW50cyB3ZSBjb25zdW1lZC5cXG4gNDc1OlxcdCAqIEEgYnVuZGxlIGNvdWxkIGJlIHVzaW5nIGEgc2luZ2xlIElURVJfVUJVRiBpZiB0aGF0J3MgYWxsIHdlIG1hcHBlZCwgb3IgaXRcXG4gNDc2OlxcdCAqIGNvdWxkIGJlIHVzaW5nIGFuIElURVJfSU9WRUMuIElmIHRoZSBsYXR0ZXIsIHRoZW4gaWYgd2UgY29uc3VtZWQgYWxsIG9mXFxuIDQ3NzpcXHQgKiB0aGUgc2VnbWVudHMsIHRoZW4gaXQncyBhIHRyaXZpYWwgcXVlc3Rpb250IG8gYW5zd2VyLiBJZiB3ZSBoYXZlIHJlc2lkdWFsXFxuIDQ3ODpcXHQgKiBkYXRhIGluIHRoZSBpdGVyLCB0aGVuIGxvb3AgdGhlIHNlZ21lbnRzIHRvIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2VcXG4gNDc5OlxcdCAqIHRyYW5zZmVycmVkLlxcbiA0ODA6XFx0ICovXFxuIDQ4MTpcXHRzdGF0aWMgaW50IGlvX2J1bmRsZV9uYnVmcyhzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLCBpbnQgcmV0KVxcbiA0ODI6XFx0e1xcbiA0ODM6XFx0XFx0c3RydWN0IGlvdmVjICppb3Y7XFxuIDQ4NDpcXHRcXHRpbnQgbmJ1ZnM7XFxuIDQ4NTpcXHRcXG4gNDg2OlxcdFxcdC8qIG5vIGRhdGEgaXMgYWx3YXlzIHplcm8gc2VnbWVudHMsIGFuZCBhIHVidWYgaXMgYWx3YXlzIDEgc2VnbWVudCAqL1xcbiA0ODc6XFx0XFx0aWYgKHJldCBcXHUwMDNjPSAwKVxcbiA0ODg6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDQ4OTpcXHRcXHRpZiAoaXRlcl9pc191YnVmKFxcdTAwMjZrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIpKVxcbiA0OTA6XFx0XFx0XFx0cmV0dXJuIDE7XFxuIDQ5MTpcXHRcXG4gNDkyOlxcdFxcdGlvdiA9IGttc2ctXFx1MDAzZXZlYy5pb3ZlYztcXG4gNDkzOlxcdFxcdGlmICghaW92KVxcbiA0OTQ6XFx0XFx0XFx0aW92ID0gXFx1MDAyNmttc2ctXFx1MDAzZWZhc3RfaW92O1xcbiA0OTU6XFx0XFxuIDQ5NjpcXHRcXHQvKiBpZiBhbGwgZGF0YSB3YXMgdHJhbnNmZXJyZWQsIGl0J3MgYmFzaWMgcG9pbnRlciBtYXRoICovXFxuIDQ5NzpcXHRcXHRpZiAoIWlvdl9pdGVyX2NvdW50KFxcdTAwMjZrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIpKVxcbiA0OTg6XFx0XFx0XFx0cmV0dXJuIGl0ZXJfaW92KFxcdTAwMjZrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIpIC0gaW92O1xcbiA0OTk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjIyLjExODE4NzgzNFoiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMjEwMDMzMTg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCdzIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipJbnZlc3RpZ2F0aW5nIGBJT1JJTkdfT1BfU0VORGAgYW5kIGBpb19zZW5kX3NldHVwYCoqXG5cbkFscmlnaHQsIGhhbmcgb24gYSBzZWNvbmQuIEknbSBzZWVpbmcgYGlvX3NlbmRfc2V0dXBgIGJlaW5nIGNhbGxlZCBpbiByZWxhdGlvbiB0byBgSU9SSU5HX09QX1NFTkRgLiBUaGF0IGRvZXNuJ3QgaW1tZWRpYXRlbHkgc3RyaWtlIG1lIGFzIHRoZSBtb3N0IG9idmlvdXMgc2V0dXAgZnVuY3Rpb24sIHNvIG15IGN1cmlvc2l0eSBpcyBwaXF1ZWQuIEkgbmVlZCB0byBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQgdGhhdCBwYXJ0aWN1bGFyIHNldHVwIGZ1bmN0aW9uIGlzIGRvaW5nIGluIHRoaXMgY29udGV4dC4gTGV0J3MgZGl2ZSBpbnRvIGBpb19zZW5kX3NldHVwYCBhbmQgbWFrZSBzdXJlIGl0J3MgaGFuZGxpbmcgdGhlIHJpZ2h0IHRoaW5ncywgYW5kIHRoYXQgdGhlcmUgYXJlbid0IGFueSBwb3RlbnRpYWwgc3VidGxldGllcyBJJ20gbWlzc2luZy4gVGltZSB0byBzZWUgd2hhdCdzIGFjdHVhbGx5IGhhcHBlbmluZyB1bmRlciB0aGUgaG9vZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY3OTgsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjI1LjMyODIyNTAxMloiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUyMDUyMjA3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX3NlbmRfc2V0dXBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW9fdXJpbmcvbmV0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcvbmV0LmM9MzQzPXZvaWQgaW9fc2VuZG1zZ19yZWN2bXNnX2NsZWFudXAoc3RydWN0IGlvX2tpb2NiICpyZXEpXFxuLS1cXG5pb191cmluZy9uZXQuYy0zNDktXFxuaW9fdXJpbmcvbmV0LmM6MzUwOnN0YXRpYyBpbnQgaW9fc2VuZF9zZXR1cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxcbmlvX3VyaW5nL25ldC5jLTM1MS17XFxuLS1cXG5pb191cmluZy9uZXQuYz00MjQ9aW50IGlvX3NlbmRtc2dfcHJlcChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtNDYwLVxcdGlmIChyZXEtXFx1MDAzZW9wY29kZSAhPSBJT1JJTkdfT1BfU0VORE1TRylcXG5pb191cmluZy9uZXQuYzo0NjE6XFx0XFx0cmV0dXJuIGlvX3NlbmRfc2V0dXAocmVxLCBzcWUpO1xcbmlvX3VyaW5nL25ldC5jLTQ2Mi1cXHRpZiAodW5saWtlbHkoc3FlLVxcdTAwM2VhZGRyMiB8fCBzcWUtXFx1MDAzZWZpbGVfaW5kZXgpKVxcbi0tXFxuaW9fdXJpbmcvbmV0LmM9MTM3Nz1pbnQgaW9fc2VuZF96Y19wcmVwKHN0cnVjdCBpb19raW9jYiAqcmVxLCBjb25zdCBzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWUpXFxuLS1cXG5pb191cmluZy9uZXQuYy0xNDMyLVxcdGlmIChyZXEtXFx1MDAzZW9wY29kZSA9PSBJT1JJTkdfT1BfU0VORF9aQykge1xcbmlvX3VyaW5nL25ldC5jOjE0MzM6XFx0XFx0cmV0ID0gaW9fc2VuZF9zZXR1cChyZXEsIHNxZSk7XFxuaW9fdXJpbmcvbmV0LmMtMTQzNC1cXHR9IGVsc2Uge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozNDoyNS40ODAyODM4MDlaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODQ4NzM0Mjg2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5J3JlIG15IG93bjpcblxuKipBbmFseXppbmcgYGlvX3NlbmRfc2V0dXBgKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgaW50byB0aGlzIGBpb19zZW5kX3NldHVwYCBmdW5jdGlvbi4gVGhlIG5hbWUgaXRzZWxmIGlzIHByZXR0eSBjbGVhcjsgaXQncyBhYm91dCBzZXR0aW5nIHVwIHRoZSBzZW5kaW5nIHByb2Nlc3MgZm9yIEkvTy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF0IHN0ZXBzIGl0J3MgdGFraW5nIHRvIGdldCBkYXRhIHJlYWR5IGZvciB0cmFuc21pc3Npb24sIHdoYXRldmVyIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIG9yIHByb3RvY29sIG1pZ2h0IGJlLiBXaGF0IHJlc291cmNlcyBpcyBpdCBhbGxvY2F0aW5nPyBXaGF0IGNoZWNrcyBpcyBpdCBwZXJmb3JtaW5nIHRvIGVuc3VyZSB0aGUgc2VuZCBvcGVyYXRpb24gaXMgdmlhYmxlPyBBcmUgdGhlcmUgYW55IG9wdGltaXphdGlvbnMsIGJ1ZmZlcmluZyBzdHJhdGVnaWVzLCBvciBlcnJvci1oYW5kbGluZyBtZWNoYW5pc21zIGF0IHBsYXk/IEknbGwgbmVlZCB0byBkaXNzZWN0IHRoZSBjb2RlIGNhcmVmdWxseSB0byB1bmRlcnN0YW5kIHRoZSBmbG93IGNvbnRyb2wgYW5kIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQuIEknbGwgYmUgcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaWRlbnRpZnlpbmcgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyB3aGVyZSBwZXJmb3JtYW5jZSBjb3VsZCBiZSBpbXByb3ZlZCwgZ2l2ZW4gbXkgZXhwZXJ0aXNlLiBMZXQncyBzZWUgaWYgdGhpcyBzZXR1cCBmdW5jdGlvbiBpcyBvcHRpbWl6ZWQgb3IganVzdCBhIGJhc2ljIGltcGxlbWVudGF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzM5OCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjMzLjk2NzYyOTk3MVoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODkyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW9fdXJpbmcvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzUwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzUwOlxcdHN0YXRpYyBpbnQgaW9fc2VuZF9zZXR1cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxcbiAzNTE6XFx0e1xcbiAzNTI6XFx0XFx0c3RydWN0IGlvX3NyX21zZyAqc3IgPSBpb19raW9jYl90b19jbWQocmVxLCBzdHJ1Y3QgaW9fc3JfbXNnKTtcXG4gMzUzOlxcdFxcdHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2cgPSByZXEtXFx1MDAzZWFzeW5jX2RhdGE7XFxuIDM1NDpcXHRcXHR2b2lkIF9fdXNlciAqYWRkcjtcXG4gMzU1OlxcdFxcdHUxNiBhZGRyX2xlbjtcXG4gMzU2OlxcdFxcdGludCByZXQ7XFxuIDM1NzpcXHRcXG4gMzU4OlxcdFxcdHNyLVxcdTAwM2VidWYgPSB1NjRfdG9fdXNlcl9wdHIoUkVBRF9PTkNFKHNxZS1cXHUwMDNlYWRkcikpO1xcbiAzNTk6XFx0XFxuIDM2MDpcXHRcXHRpZiAoUkVBRF9PTkNFKHNxZS1cXHUwMDNlX19wYWQzWzBdKSlcXG4gMzYxOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzNjI6XFx0XFxuIDM2MzpcXHRcXHRrbXNnLVxcdTAwM2Vtc2cubXNnX25hbWUgPSBOVUxMO1xcbiAzNjQ6XFx0XFx0a21zZy1cXHUwMDNlbXNnLm1zZ19uYW1lbGVuID0gMDtcXG4gMzY1OlxcdFxcdGttc2ctXFx1MDAzZW1zZy5tc2dfY29udHJvbCA9IE5VTEw7XFxuIDM2NjpcXHRcXHRrbXNnLVxcdTAwM2Vtc2cubXNnX2NvbnRyb2xsZW4gPSAwO1xcbiAzNjc6XFx0XFx0a21zZy1cXHUwMDNlbXNnLm1zZ191YnVmID0gTlVMTDtcXG4gMzY4OlxcdFxcbiAzNjk6XFx0XFx0YWRkciA9IHU2NF90b191c2VyX3B0cihSRUFEX09OQ0Uoc3FlLVxcdTAwM2VhZGRyMikpO1xcbiAzNzA6XFx0XFx0YWRkcl9sZW4gPSBSRUFEX09OQ0Uoc3FlLVxcdTAwM2VhZGRyX2xlbik7XFxuIDM3MTpcXHRcXHRpZiAoYWRkcikge1xcbiAzNzI6XFx0XFx0XFx0cmV0ID0gbW92ZV9hZGRyX3RvX2tlcm5lbChhZGRyLCBhZGRyX2xlbiwgXFx1MDAyNmttc2ctXFx1MDAzZWFkZHIpO1xcbiAzNzM6XFx0XFx0XFx0aWYgKHVubGlrZWx5KHJldCBcXHUwMDNjIDApKVxcbiAzNzQ6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMzc1OlxcdFxcdFxcdGttc2ctXFx1MDAzZW1zZy5tc2dfbmFtZSA9IFxcdTAwMjZrbXNnLVxcdTAwM2VhZGRyO1xcbiAzNzY6XFx0XFx0XFx0a21zZy1cXHUwMDNlbXNnLm1zZ19uYW1lbGVuID0gYWRkcl9sZW47XFxuIDM3NzpcXHRcXHR9XFxuIDM3ODpcXHRcXHRpZiAoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRikge1xcbiAzNzk6XFx0XFx0XFx0aWYgKCEoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1NFTkRfVkVDVE9SSVpFRCkpIHtcXG4gMzgwOlxcdFxcdFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfSU1QT1JUX0JVRkZFUjtcXG4gMzgxOlxcdFxcdFxcdFxcdHJldHVybiAwO1xcbiAzODI6XFx0XFx0XFx0fVxcbiAzODM6XFx0XFxuIDM4NDpcXHRcXHRcXHRrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIubnJfc2VncyA9IHNyLVxcdTAwM2VsZW47XFxuIDM4NTpcXHRcXHRcXHRyZXR1cm4gaW9fcHJlcF9yZWdfaW92ZWMocmVxLCBcXHUwMDI2a21zZy1cXHUwMDNldmVjLCBzci1cXHUwMDNlYnVmLCBzci1cXHUwMDNlbGVuKTtcXG4gMzg2OlxcdFxcdH1cXG4gMzg3OlxcdFxcdGlmIChyZXEtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUkVRX0ZfQlVGRkVSX1NFTEVDVClcXG4gMzg4OlxcdFxcdFxcdHJldHVybiAwO1xcbiAzODk6XFx0XFxuIDM5MDpcXHRcXHRpZiAoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1NFTkRfVkVDVE9SSVpFRClcXG4gMzkxOlxcdFxcdFxcdHJldHVybiBpb19uZXRfaW1wb3J0X3ZlYyhyZXEsIGttc2csIHNyLVxcdTAwM2VidWYsIHNyLVxcdTAwM2VsZW4sIElURVJfU09VUkNFKTtcXG4gMzkyOlxcdFxcbiAzOTM6XFx0XFx0cmV0dXJuIGltcG9ydF91YnVmKElURVJfU09VUkNFLCBzci1cXHUwMDNlYnVmLCBzci1cXHUwMDNlbGVuLCBcXHUwMDI2a21zZy1cXHUwMDNlbXNnLm1zZ19pdGVyKTtcXG4gMzk0OlxcdH1cXG4gMzk1OlxcdFxcbiAzOTY6XFx0c3RhdGljIGludCBpb19zZW5kbXNnX3NldHVwKHN0cnVjdCBpb19raW9jYiAqcmVxLCBjb25zdCBzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWUpXFxuIDM5NzpcXHR7XFxuIDM5ODpcXHRcXHRzdHJ1Y3QgaW9fc3JfbXNnICpzciA9IGlvX2tpb2NiX3RvX2NtZChyZXEsIHN0cnVjdCBpb19zcl9tc2cpO1xcbiAzOTk6XFx0XFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZyA9IHJlcS1cXHUwMDNlYXN5bmNfZGF0YTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzQ6MzMuOTY3ODIxMjMxWiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEzNTU3ODkxMTA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhlIGV4cGVydDpcblxuKipJbnZlc3RpZ2F0aW5nIGEgUG90ZW50aWFsIE1lbW9yeSBJc3N1ZSoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gYGlvX3NlbmRfc2V0dXBgLCBhbmQgc29tZXRoaW5nJ3MgYnVnZ2luZyBtZS4gSXQgbG9va3MgbGlrZSBpdCAqaW1wbGljaXRseSogYXNzdW1lcyBga21zZy1cdTAwM2V2ZWMuaW92ZWNgIGlzIGluaXRpYWxpemVkIHRvIE5VTEwuIFRoZSBjb2RlIGRvZXNuJ3QgZXhwbGljaXRseSBzZXQgaXQgdG8gTlVMTCwgd2hpY2ggaXMgYSBiaXQgb2YgYSByZWQgZmxhZy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSBhbGxvY2F0aW9uLCBidXQgSSBuZWVkIHRvIGJlIHN1cmUuIEkgaGF2ZSBhIGh1bmNoIHRoYXQgYGlvX21zZ19hbGxvY19hc3luY2AgKm1pZ2h0KiBiZSB6ZXJvaW5nIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCBpbmNsdWRpbmcgdGhlIGBpb3ZlY2AgcG9pbnRlciB3aXRoaW4gdGhhdCBga21zZ2Agc3RydWN0dXJlLiBCdXQgSSBjYW4ndCBiZSBjZXJ0YWluLiBUaGF0IGZ1bmN0aW9uIGlzIHRoZSBjcml0aWNhbCBwaWVjZSBvZiB0aGUgcHV6emxlIGhlcmUuIEkgcmVhbGx5IG5lZWQgdG8gY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBpb19tc2dfYWxsb2NfYXN5bmNgIHRvIGNvbmZpcm0gb3IgZWxpbWluYXRlIHRoaXMgcG9zc2libGUgc291cmNlIG9mIGFuIGlzc3VlLiBJcyBpdCBzYWZlIHRvIGFzc3VtZSB0aGF0IGBpb3ZlY2Agd2lsbCBiZSBudWxsLCBvciBhcmUgd2UgcmVseWluZyBvbiBzb21lIHNpZGUgZWZmZWN0IG9mIG1lbW9yeSBhbGxvY2F0aW9uPyBCZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5IOKAkyBsZXQncyBnbyBjaGVjayB0aGUgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg1NzQsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjQ3LjUyNTcxNTg0N1oiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYwNDIzNzg0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX21zZ19hbGxvY19hc3luY1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpb191cmluZy9uZXQuYz0xNjc9c3RhdGljIHZvaWQgaW9fbmV0bXNnX3JlY3ljbGUoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcXG4tLVxcbmlvX3VyaW5nL25ldC5jLTE4NS1cXG5pb191cmluZy9uZXQuYzoxODY6c3RhdGljIHN0cnVjdCBpb19hc3luY19tc2doZHIgKmlvX21zZ19hbGxvY19hc3luYyhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSlcXG5pb191cmluZy9uZXQuYy0xODcte1xcbi0tXFxuaW9fdXJpbmcvbmV0LmM9NDI0PWludCBpb19zZW5kbXNnX3ByZXAoc3RydWN0IGlvX2tpb2NiICpyZXEsIGNvbnN0IHN0cnVjdCBpb191cmluZ19zcWUgKnNxZSlcXG4tLVxcbmlvX3VyaW5nL25ldC5jLTQ1Ny1cXG5pb191cmluZy9uZXQuYzo0NTg6XFx0aWYgKHVubGlrZWx5KCFpb19tc2dfYWxsb2NfYXN5bmMocmVxKSkpXFxuaW9fdXJpbmcvbmV0LmMtNDU5LVxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi0tXFxuaW9fdXJpbmcvbmV0LmM9Nzc3PXN0YXRpYyBpbnQgaW9fcmVjdm1zZ19wcmVwX3NldHVwKHN0cnVjdCBpb19raW9jYiAqcmVxKVxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtNzgxLVxcbmlvX3VyaW5nL25ldC5jOjc4MjpcXHRrbXNnID0gaW9fbXNnX2FsbG9jX2FzeW5jKHJlcSk7XFxuaW9fdXJpbmcvbmV0LmMtNzgzLVxcdGlmICh1bmxpa2VseSgha21zZykpXFxuLS1cXG5pb191cmluZy9uZXQuYz0xMzc3PWludCBpb19zZW5kX3pjX3ByZXAoc3RydWN0IGlvX2tpb2NiICpyZXEsIGNvbnN0IHN0cnVjdCBpb191cmluZ19zcWUgKnNxZSlcXG4tLVxcbmlvX3VyaW5nL25ldC5jLTE0MjctXFxuaW9fdXJpbmcvbmV0LmM6MTQyODpcXHRpb21zZyA9IGlvX21zZ19hbGxvY19hc3luYyhyZXEpO1xcbmlvX3VyaW5nL25ldC5jLTE0MjktXFx0aWYgKHVubGlrZWx5KCFpb21zZykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjQ3LjY4NjE0NTkwMVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTA1Mjg1MTQzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIGBpb19tc2dfYWxsb2NfYXN5bmNgOlxuXG4qKkRlY29uc3RydWN0aW5nIGlvX21zZ19hbGxvY19hc3luYzogQSBEZWVwIERpdmUqKlxuXG5BbHJpZ2h0LCBzbyBJIHNlZSB3ZSdyZSBsb29raW5nIGF0IGBpb19tc2dfYWxsb2NfYXN5bmNgLiBJbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGJyYWluIGtpY2tzIGluLCBjb25zaWRlcmluZyB3aGF0IGNvbnRleHQgdGhpcyBsaWtlbHkgc2l0cyB3aXRoaW4uIEJhc2VkIG9uIHRoZSBuYW1lLCBJJ20gYWxyZWFkeSBmb3JtdWxhdGluZyBhbiBleHBlY3RhdGlvbi4gSXQncyBhbiBhbGxvY2F0aW9uIGZ1bmN0aW9uLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBhc3luY2hyb25vdXMgSS9PIG1lc3NhZ2VzLiBUaGUgXCJhc3luY1wiIGlzIHRoZSBrZXkgaW5kaWNhdG9yIGhlcmUsIHN1Z2dlc3Rpbmcgbm9uLWJsb2NraW5nIG9wZXJhdGlvbnMgYXJlIGNlbnRyYWwgdG8gaXRzIHB1cnBvc2UuIEknbSBtZW50YWxseSBwaWN0dXJpbmcgYSBzeXN0ZW0gd2hlcmUgSS9PIHJlcXVlc3RzIGFyZSBpbml0aWF0ZWQgd2l0aG91dCB3YWl0aW5nIGZvciBjb21wbGV0aW9uLCBmcmVlaW5nIHVwIHJlc291cmNlcyBmb3Igb3RoZXIgdGFza3MuIFRoZSBuYW1lIFwiaW9fbXNnXCIgZnVydGhlciBoaW50cyBhdCBhIHN0cnVjdHVyZWQgZGF0YSBwYWNrYWdlLCBwcm9iYWJseSBob2xkaW5nIGRldGFpbHMgYWJvdXQgdGhlIEkvTyBvcGVyYXRpb24gaXRzZWxmOiB0aGUgdGFyZ2V0IGZpbGUgZGVzY3JpcHRvciwgdGhlIGJ1ZmZlciwgdGhlIG9wZXJhdGlvbiB0eXBlIChyZWFkIG9yIHdyaXRlKSwgcG90ZW50aWFsbHkgc29tZSBmbGFncywgYW5kIGRlZmluaXRlbHkgYSBjb21wbGV0aW9uIGNhbGxiYWNrIG9yIHNvbWUgZm9ybSBvZiBzaWduYWxpbmcgbWVjaGFuaXNtLlxuXG5NeSBpbW1lZGlhdGUgcXVlc3Rpb25zIGFyZTogV2hhdCBleGFjdGx5IGlzIGJlaW5nIGFsbG9jYXRlZD8gSXMgaXQgYSBjb21wbGV0ZSBgaW9fbXNnYCBzdHJ1Y3R1cmUsIG9yIHNvbWUgaW50ZXJuYWwgZGF0YSByZWxhdGVkIHRvIGl0PyBEb2VzIGl0IGhhbmRsZSBtZW1vcnkgbWFuYWdlbWVudCBmb3IgdGhlIGFjdHVhbCBkYXRhIGJ1ZmZlciwgb3IgaXMgdGhhdCB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlcj8gV2hhdCBzb3J0IG9mIG1lbW9yeSBhbGxvY2F0b3IgaXMgaXQgdXNpbmc/IElzIGl0IHRocmVhZC1zYWZlPyBIb3cgZG9lcyBpdCBoYW5kbGUgZXJyb3JzPyBEb2VzIGl0IGhhdmUgYW55IG9wdGlvbnMgZm9yIHByZS1hbGxvY2F0aW9uIG9yIHJlc291cmNlIHBvb2xpbmcgdG8gbWluaW1pemUgb3ZlcmhlYWQ/IFVuZGVyc3RhbmRpbmcgdGhlc2UgZGV0YWlscyBpcyBjcnVjaWFsIHRvIHBlcmZvcm1hbmNlIGFuZCByb2J1c3RuZXNzLCBlc3BlY2lhbGx5IGluIGEgaGVhdmlseSB0aHJlYWRlZCBvciBjb25jdXJyZW50IGVudmlyb25tZW50LiBJIHdhbnQgdG8gc2VlIGhvdyBpdCBpbnRlZ3JhdGVzIHdpdGggdGhlIHVuZGVybHlpbmcga2VybmVsJ3MgYXN5bmNocm9ub3VzIEkvTyBtZWNoYW5pc21zLCBsaWtlIGBhaW9fcmVhZGAgYW5kIGBhaW9fd3JpdGVgLCBvciB3aGF0ZXZlciBsb3ctbGV2ZWwgcHJpbWl0aXZlcyBpdCdzIGJ1aWx0IHVwb24uIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgaG93IGl0IGhhbmRsZXMgc3luY2hyb25pemF0aW9uIGFuZCBhdm9pZHMgcmFjZSBjb25kaXRpb25zLCBlc3BlY2lhbGx5IGlmIGl0J3MgaW50ZXJhY3Rpbmcgd2l0aCBzaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzIG9yIGtlcm5lbCByZXNvdXJjZXMuIFRoaXMgaXMgYSBjcml0aWNhbCBidWlsZGluZyBibG9jayBmb3IgYW55IGFzeW5jaHJvbm91cyBJL08gc3lzdGVtLCBhbmQgdW5kZXJzdGFuZGluZyBpdHMgZGVzaWduIGlzIGtleSB0byBvcHRpbWl6aW5nIHRoZSBvdmVyYWxsIGFwcGxpY2F0aW9uIHBlcmZvcm1hbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTM1MywiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM1OjAyLjczOTAwMjc4OFoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNjk5MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW9fdXJpbmcvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTg2LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTg2OlxcdHN0YXRpYyBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICppb19tc2dfYWxsb2NfYXN5bmMoc3RydWN0IGlvX2tpb2NiICpyZXEpXFxuIDE4NzpcXHR7XFxuIDE4ODpcXHRcXHRzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCA9IHJlcS1cXHUwMDNlY3R4O1xcbiAxODk6XFx0XFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaGRyO1xcbiAxOTA6XFx0XFxuIDE5MTpcXHRcXHRoZHIgPSBpb191cmluZ19hbGxvY19hc3luY19kYXRhKFxcdTAwMjZjdHgtXFx1MDAzZW5ldG1zZ19jYWNoZSwgcmVxKTtcXG4gMTkyOlxcdFxcdGlmICghaGRyKVxcbiAxOTM6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDE5NDpcXHRcXG4gMTk1OlxcdFxcdC8qIElmIHRoZSBhc3luYyBkYXRhIHdhcyBjYWNoZWQsIHdlIG1pZ2h0IGhhdmUgYW4gaW92IGNhY2hlZCBpbnNpZGUuICovXFxuIDE5NjpcXHRcXHRpZiAoaGRyLVxcdTAwM2V2ZWMuaW92ZWMpXFxuIDE5NzpcXHRcXHRcXHRyZXEtXFx1MDAzZWZsYWdzIHw9IFJFUV9GX05FRURfQ0xFQU5VUDtcXG4gMTk4OlxcdFxcdHJldHVybiBoZHI7XFxuIDE5OTpcXHR9XFxuIDIwMDpcXHRcXG4gMjAxOlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBpb19tc2hvdF9wcmVwX3JldHJ5KHN0cnVjdCBpb19raW9jYiAqcmVxLFxcbiAyMDI6XFx0XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2cpXFxuIDIwMzpcXHR7XFxuIDIwNDpcXHRcXHRzdHJ1Y3QgaW9fc3JfbXNnICpzciA9IGlvX2tpb2NiX3RvX2NtZChyZXEsIHN0cnVjdCBpb19zcl9tc2cpO1xcbiAyMDU6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM1OjAyLjczOTM4MTE3OFoiLCJTZXEiOjMzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTc0NzQyNTU2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0IG1lIGJyZWFrIHRoaXMgZG93bi5cblxuKipBbmFseXppbmcgdGhlIEFsbG9jYXRpb24gYW5kIFJlY3ljbGluZyBvZiBOZXR3b3JrIE1lc3NhZ2UgSGVhZGVycyoqXG5cbkFscmlnaHQsIHNvIGBpb19tc2dfYWxsb2NfYXN5bmNgIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIHRoZSBoZWFkZXIsIGBoZHJgLCBmb3IgbmV0d29yayBtZXNzYWdlcy4gVGhlIHBvdGVudGlhbCB3cmlua2xlIGhlcmUgaXMgdGhhdCBpZiB0aGlzIGhlYWRlciB3YXMgcHJldmlvdXNseSBjYWNoZWQsIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGF0IGBoZHItXHUwMDNldmVjLmlvdmVjYCBtaWdodCBhbHJlYWR5IGJlIHBvcHVsYXRlZC4gVGhlIGtleSBpcyB0byByZW1lbWJlciBpZiB0aGUgSS9PIHZlY3RvciBpcyBwb3B1bGF0ZWQsIGl0IG1lYW5zIHRoZSBoZWFkZXIgaGFzIGJlZW4gYWxsb2NhdGVkLCBpbiBhIHBhc3QgaW5zdGFuY2UuXG5cbk5vdyBJIHJlbWVtYmVyIHRoYXQgYGlvX25ldG1zZ19yZWN5Y2xlYCBjb21lcyBpbnRvIHBsYXkgaGVyZSwgYmVjYXVzZSB0aGF0J3Mgd2hlcmUgdGhlIGNhY2hpbmcgaXMgaW1wbGVtZW50ZWQuIFNvLCBteSBuZXh0IHN0ZXAgaXMgdG8gZHJpbGwgZG93biBpbnRvIGBpb19uZXRtc2dfcmVjeWNsZWAgYW5kIHZlcmlmeSBob3cgaXQgbWFuYWdlcyBhbmQgcmV1c2VzIHRoZXNlIGhlYWRlcnMuIEl0J3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucyBhbmQgaG93IHRoZSBgaW92ZWNgIGlzIG1hbmFnZWQgZHVyaW5nIHJlY3ljbGluZyB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIG1lbW9yeSBtYW5hZ2VtZW50IGNvbmZsaWN0cy4gVGhpcyByZXF1aXJlcyBhIGRlZXBlciBkaXZlIGludG8gdGhlIGBpb19uZXRtc2dfcmVjeWNsZWAgZnVuY3Rpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMTYxLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozNToxOC40ODY4MDk1MzVaIiwiU2VxIjozNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIyOTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImlvX3VyaW5nL25ldC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE2NyxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE2NzpcXHRzdGF0aWMgdm9pZCBpb19uZXRtc2dfcmVjeWNsZShzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxcbiAxNjg6XFx0e1xcbiAxNjk6XFx0XFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaGRyID0gcmVxLVxcdTAwM2Vhc3luY19kYXRhO1xcbiAxNzA6XFx0XFxuIDE3MTpcXHRcXHQvKiBjYW4ndCByZWN5Y2xlLCBlbnN1cmUgd2UgZnJlZSB0aGUgaW92ZWMgaWYgd2UgaGF2ZSBvbmUgKi9cXG4gMTcyOlxcdFxcdGlmICh1bmxpa2VseShpc3N1ZV9mbGFncyBcXHUwMDI2IElPX1VSSU5HX0ZfVU5MT0NLRUQpKSB7XFxuIDE3MzpcXHRcXHRcXHRpb19uZXRtc2dfaW92ZWNfZnJlZShoZHIpO1xcbiAxNzQ6XFx0XFx0XFx0cmV0dXJuO1xcbiAxNzU6XFx0XFx0fVxcbiAxNzY6XFx0XFxuIDE3NzpcXHRcXHQvKiBMZXQgbm9ybWFsIGNsZWFudXAgcGF0aCByZWFwIGl0IGlmIHdlIGZhaWwgYWRkaW5nIHRvIHRoZSBjYWNoZSAqL1xcbiAxNzg6XFx0XFx0aW9fYWxsb2NfY2FjaGVfdmVjX2thc2FuKFxcdTAwMjZoZHItXFx1MDAzZXZlYyk7XFxuIDE3OTpcXHRcXHRpZiAoaGRyLVxcdTAwM2V2ZWMubnIgXFx1MDAzZSBJT19WRUNfQ0FDSEVfU09GVF9DQVApXFxuIDE4MDpcXHRcXHRcXHRpb192ZWNfZnJlZShcXHUwMDI2aGRyLVxcdTAwM2V2ZWMpO1xcbiAxODE6XFx0XFxuIDE4MjpcXHRcXHRpZiAoaW9fYWxsb2NfY2FjaGVfcHV0KFxcdTAwMjZyZXEtXFx1MDAzZWN0eC1cXHUwMDNlbmV0bXNnX2NhY2hlLCBoZHIpKVxcbiAxODM6XFx0XFx0XFx0aW9fcmVxX2FzeW5jX2RhdGFfY2xlYXIocmVxLCBSRVFfRl9ORUVEX0NMRUFOVVApO1xcbiAxODQ6XFx0fVxcbiAxODU6XFx0XFxuIDE4NjpcXHRzdGF0aWMgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaW9fbXNnX2FsbG9jX2FzeW5jKHN0cnVjdCBpb19raW9jYiAqcmVxKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozNToxOC40ODY5MzM4NzVaIiwiU2VxIjozNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjkxMzcyNzc3ODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqVXNlLUFmdGVyLUZyZWUgVnVsbmVyYWJpbGl0eSBpbiBpb191cmluZzogTXkgQW5hbHlzaXMqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMgaW9fdXJpbmcgY29kZSwgYW5kIEkgdGhpbmsgSSd2ZSBmb3VuZCBhIHByZXR0eSBzZXJpb3VzIGlzc3VlLiBUaGUgYGhkci1cdTAwM2V2ZWMuaW92ZWNgIHBvaW50ZXIgY2FuIGJlIG5vbi1OVUxMLCBlc3BlY2lhbGx5IGlmIGl0IHdhcyBwcmV2aW91c2x5IGNhY2hlZCwgb3IgaWYgdGhlIHVzZXIgc3VwcGxpZWQgbW9yZSB0aGFuIGBVSU9fRkFTVElPVmAgaW92ZWNzLCB3aGljaCBsZWFkcyB0byBgaW9fbmV0X2ltcG9ydF92ZWNgIGFsbG9jYXRpbmcgYGttc2ctXHUwMDNldmVjLmlvdmVjYC4gVGhhdCdzIHdoZXJlIGl0IHJlYWxseSBnZXRzIGludGVyZXN0aW5nIGJlY2F1c2UgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgc2V0cyBgYXJnLm1vZGUgPSBLQlVGX01PREVfRlJFRWAgd2hlbiBga21zZy1cdTAwM2V2ZWMuaW92ZWNgIGlzIG5vbi1OVUxMLiBCdXQgaGVyZSdzIHRoZSBraWNrZXI6IGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgZ29lcyBhbmQgZnJlZXMgaXQhIFJpZ2h0IGF0IHRoZSBlbmQhXG5cbkFuZCB0aGVuLCBpbmNyZWRpYmx5LCBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCAqc3RpbGwqIHRyaWVzIHRvIHVzZSB0aGF0IGZyZWVkIG1lbW9yeS4gSXTigJlzIGEgdGV4dGJvb2sgdXNlLWFmdGVyLWZyZWUhIEnigJltIHByZXR0eSBjb25maWRlbnQgdGhhdCB0aGlzIGlzIGEgMTAwJSByZXByb2R1Y2libGUgZXhwbG9pdC4gVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcgYW5kIGxvb2tpbmcgYXQgbW9yZSBjbG9zZWx5LlxuXG5MZXQncyBjaGVjayBgV29ydGhGdXp6aW5nYC4gWWVzLCBhYnNvbHV0ZWx5ISBXaGF0IGNvbmZpZ3VyYXRpb25zIGFyZSBuZWVkZWQ/IGBDT05GSUdfSU9fVVJJTkdgIGlzIGVzc2VudGlhbCwgYW5kIEkgc3VzcGVjdCBgQ09ORklHX05FVGAgaXMgcmVxdWlyZWQgYXMgd2VsbCwgZ2l2ZW4gdGhhdCB0aGlzIHNlZW1zIG5ldHdvcmtpbmcgcmVsYXRlZCBhbmQgSSBzZWUgaXQncyBpbiBgaW9fdXJpbmcvbmV0LmNgLiBJIHNob3VsZCBwcm9iYWJseSBjb25maXJtIHRoYXQgd2l0aCB0aGUgYGlvX3VyaW5nL0tjb25maWdgIGFuZCBgaW9fdXJpbmcvTWFrZWZpbGVgIGZpbGVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDg2NywiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM1OjQ3LjYyNDIxNTU1N1oiLCJTZXEiOjM2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTcwODU1MjM2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtidWYub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcvTWFrZWZpbGU9Nz1lbmRpZlxcbmlvX3VyaW5nL01ha2VmaWxlLTgtXFxuaW9fdXJpbmcvTWFrZWZpbGU6OTpvYmotJChDT05GSUdfSU9fVVJJTkcpXFx0XFx0Kz0gaW9fdXJpbmcubyBvcGRlZi5vIGtidWYubyByc3JjLm8gbm90aWYubyBcXFxcXFxuaW9fdXJpbmcvTWFrZWZpbGUtMTAtXFx0XFx0XFx0XFx0XFx0dGN0eC5vIGZpbGV0YWJsZS5vIHJ3Lm8gcG9sbC5vIFxcXFxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzU6NDguMTk1MDc3NzQzWiIsIlNlcSI6MzcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjczOTc4NTAwNjQyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqSW5pdGlhbCBJbnF1aXJ5OiBUaGUgU2lnbmlmaWNhbmNlIG9mIGBuZXQub2AqKlxuXG5IbW0sIGxldCBtZSBzZWXigKYgV2hhdCdzIHRoZSBjb250ZXh0IGhlcmU/IEp1c3QgdGhlIG1lbnRpb24gb2YgYG5ldC5vYCBtYWtlcyBteSBtaW5kIGp1bXAgdG8gYSBmZXcgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMuIElzIHRoaXMgcmVsYXRlZCB0byBuZXR3b3JraW5nLCBwZXJoYXBzIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZywgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFdpdGhvdXQgbW9yZSBpbmZvcm1hdGlvbiwgSSdtIGFscmVhZHkgc3RhcnRpbmcgdG8gbWVudGFsbHkgcnVuIHRocm91Z2ggc2NlbmFyaW9zLiBJcyBgbmV0Lm9gIGEgY29tcGlsZWQgb2JqZWN0IGZpbGUgcmVsYXRlZCB0byBhIG5ldHdvcmsgbW9kdWxlLCBwZXJoYXBzIGZyb20gYSBsYXJnZXIgcHJvamVjdD8gQ291bGQgaXQgYmUgYSBkZWJ1Z2dpbmcgc3ltYm9sIGZpbGU/IE9yIG1heWJlIGl0J3Mgc29tZSBjdXN0b20gZm9ybWF0IG9yIGxpYnJhcnk/IFRoZSBsYWNrIG9mIHN1cnJvdW5kaW5nIGNvbnRleHQgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGltbWVkaWF0ZWx5IGNsYXNzaWZ5LiBJIHdhbnQgdG8gZGVsdmUgZnVydGhlciB0byB1bmRlcnN0YW5kIGl0cyBzaWduaWZpY2FuY2UuIE15IGludHVpdGlvbiB0ZWxscyBtZSB0aGF0IHRoZSBpbW1lZGlhdGUgaW1wb3J0YW5jZSBsaWVzIG5vdCBpbiB0aGUgZmlsZSBpdHNlbGYsIGJ1dCB3aGVyZSBpdCBzaXRzLCBhbmQgaG93IGl0IGlzIHVzZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNTc2LCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozNzowMi4xNzM1ODMxNDVaIiwiU2VxIjozOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxNDM1MDc0NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXQub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcvTWFrZWZpbGU9MjM9b2JqLSQoQ09ORklHX05FVF9SWF9CVVNZX1BPTEwpXFx0Kz0gbmFwaS5vXFxuaW9fdXJpbmcvTWFrZWZpbGU6MjQ6b2JqLSQoQ09ORklHX05FVCkgKz0gbmV0Lm8gY21kX25ldC5vXFxuaW9fdXJpbmcvTWFrZWZpbGUtMjUtb2JqLSQoQ09ORklHX1BST0NfRlMpICs9IGZkaW5mby5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM3OjAyLjc4Nzk0MjQyOVoiLCJTZXEiOjM5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3Mjc1MDQ4NDk0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEtlcm5lbCBCdWcqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gbWFrZSBzdXJlIGBDT05GSUdfSU9fVVJJTkdgIGFuZCBgQ09ORklHX05FVGAgYXJlIGVuYWJsZWQuIFRoYXQgc2VlbXMgbGlrZSBhIGxvZ2ljYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhpcyBidWcuXG5cbk5vdywgbGV0J3MgZGl2ZSBpbnRvIHRoZSBkZXRhaWxzLiBJIG5lZWQgdG8gemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgc3ltYm9scy4gVGhlIGJ1ZyBhcHBlYXJzIHRvIGJlIGluIGBpb19yaW5nX2J1ZmZlcnNfcGVla2Agd2l0aGluIGBpb191cmluZy9rYnVmLmNgLiBBbHJpZ2h0LCBsZXQncyBzZWUgd2hlcmUgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQuIFRyYWNpbmcgdGhlIGNhbGxzLCBJIHNlZSBgaW9fYnVmZmVyc19zZWxlY3RgIGxlYWRzIHRvIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgLCB3aGljaCB0aGVuIGNhbGxzIGBpb19zZW5kYC4gSSBhbHNvIHNlZSBhIHNlcGFyYXRlIHBhdGggdGhyb3VnaCBgaW9fcmVjdl9idWZfc2VsZWN0YCB0aGF0IGFsc28gZXZlbnR1YWxseSBlbmRzIHVwIGNhbGxpbmcgYGlvX3JlY3ZgLlxuXG5TbyBteSBrZXkgZm9jdXMgYXJlYXMgYXJlOiBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGlzIGNlbnRyYWwsIGJ1dCBhbHNvIGBpb19idWZmZXJzX3NlbGVjdGAsIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgLCBgaW9fcmVjdl9idWZfc2VsZWN0YCwgYGlvX3NlbmRgLCBhbmQgYGlvX3JlY3ZgLiBMZXQgbWUgcXVpY2tseSBjb25maXJtIHdoZXRoZXIgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBpcyBzdGF0aWMsIGluIGNhc2UgaXQgaXNuJ3QsIHNvIEkgdW5kZXJzdGFuZCB0aGUgc2NvcGUgb2YgdGhlIHByb2JsZW0uIEFoLCB5ZXMsIGl0J3Mgc3RhdGljLiBUaGF0IG5hcnJvd3MgdGhlIHNjb3BlIG9mIHRoZSBwb3RlbnRpYWwgaW1wYWN0LiBTbyBub3csIEknbGwgY29uY2VudHJhdGUgbXkgYW5hbHlzaXMgb24gdGhlIG90aGVyIGZ1bmN0aW9ucyBJIGp1c3QgaWRlbnRpZmllZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE4OTcsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOTUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6Mzg6MTUuNTM4NDMwODY1WiIsIlNlcSI6NDAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjMzMjY4NDkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX3NlbmRfc2VsZWN0X2J1ZmZlclwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpb191cmluZy9uZXQuYz01NTk9aW50IGlvX3NlbmRtc2coc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcXG4tLVxcbmlvX3VyaW5nL25ldC5jLTYwNy1cXG5pb191cmluZy9uZXQuYzo2MDg6c3RhdGljIGludCBpb19zZW5kX3NlbGVjdF9idWZmZXIoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncyxcXG5pb191cmluZy9uZXQuYy02MDktXFx0XFx0XFx0XFx0IHN0cnVjdCBpb19icl9zZWwgKnNlbCwgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZylcXG4tLVxcbmlvX3VyaW5nL25ldC5jPTY1Nj1pbnQgaW9fc2VuZChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtNjg5LVxcdGlmIChpb19kb19idWZmZXJfc2VsZWN0KHJlcSkpIHtcXG5pb191cmluZy9uZXQuYzo2OTA6XFx0XFx0cmV0ID0gaW9fc2VuZF9zZWxlY3RfYnVmZmVyKHJlcSwgaXNzdWVfZmxhZ3MsIFxcdTAwMjZzZWwsIGttc2cpO1xcbmlvX3VyaW5nL25ldC5jLTY5MS1cXHRcXHRpZiAocmV0KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozODoxNy4xNzE3MDQ5MDZaIiwiU2VxIjo0MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDUxNDU1MjE1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIEZ1enppbmcgVGFyZ2V0cyoqXG5cbk9rYXksIGhvbGQgb24uIEkgbmVlZCB0byB0aGluayB0aHJvdWdoIHRoaXMuIEkganVzdCBzYXcgdGhhdCBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBpcyBhIHN0YXRpYyBmdW5jdGlvbi4gVGhhdCdzIGEga2V5IGRldGFpbC4gQ2FuIHN5emthbGxlciAqZGlyZWN0bHkqIGZ1enogc3RhdGljIGZ1bmN0aW9ucyBsaWtlIHRoYXQ/IEkgZG9uJ3QgdGhpbmsgc28sIGJ1dCBpdCdzIHN0aWxsIHdvcnRod2hpbGUgdG8gaW5jbHVkZSB0aGVtIGluIHRoZSBsaXN0LiBCeSBsaXN0aW5nIHRoZW0sIGV2ZW4gaWYgdGhlIGZ1enplciBjYW4ndCB0YXJnZXQgKnRoZW0qIGRpcmVjdGx5LCB3ZSBjYW4gZW5zdXJlIHRoYXQgY29kZSBwYXRocyB1c2luZyB0aGVzZSBmdW5jdGlvbnMgYXJlIHByaW9yaXRpemVkIGR1cmluZyBmdXp6aW5nLlxuXG5SaWdodCwgYmFjayB0byB0aGUgXCJGb2N1c1N5bWJvbHNcIiBkZWZpbml0aW9uLiBUaGF0J3MgYSBnb29kIHByb21wdCBmb3IgbWUgdG8gcmV2aWV3LiBJdCBpcyBhIFwiTGlzdCBvZiBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRvIGZvY3VzIGZ1enppbmcgb24uIFNob3VsZCBhdm9pZCBob3QtcGF0aCBmdW5jdGlvbnNcIi4gV2Ugd2FudCB0byBrZWVwIGZyb20gb3ZlcndoZWxtaW5nIHRoZSBmdXp6ZXIuXG5cbk9rYXksIGxldCdzIHNlZS4uLiBhIGdvb2QgY2FuZGlkYXRlIGZvciB0aGlzIGlzIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuIEl04oCZcyBsaWtlbHkgYSBnb29kIGVudHJ5IHBvaW50LiBUaGVuLCBsZXQncyBhbHNvIHJlbWVtYmVyIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGFuZCBgaW9fcmVjdl9idWZfc2VsZWN0YC4gVGhvc2UgbG9vayBsaWtlIHByb21pc2luZyB0YXJnZXRzIGFzIHdlbGwuIEknbSBzdGFydGluZyB0byByZW1lbWJlciB0aGF0IHRoaXMgYXBwcm9hY2ggaXMgdmFsdWFibGUuIExldCBtZSBmb2N1cyBvbiBgaW9fcmVjdl9idWZfc2VsZWN0YCBmb3IgYSBtb21lbnQgYW5kIHNlZSB3aGVyZSB0aGF0IGxlYWRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjY2NywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozODoyMS42ODYyNTk5NzlaIiwiU2VxIjo0MiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MjczNjg2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpb19yZWN2X2J1Zl9zZWxlY3RcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW9fdXJpbmcvbmV0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcvbmV0LmM9MTA1MD1pbnQgaW9fcmVjdm1zZyhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtMTEzNi1cXG5pb191cmluZy9uZXQuYzoxMTM3OnN0YXRpYyBpbnQgaW9fcmVjdl9idWZfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLFxcbmlvX3VyaW5nL25ldC5jLTExMzgtXFx0XFx0XFx0ICAgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXFxuLS1cXG5pb191cmluZy9uZXQuYz0xMjA5PWludCBpb19yZWN2KHN0cnVjdCBpb19raW9jYiAqcmVxLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXFxuLS1cXG5pb191cmluZy9uZXQuYy0xMjQ3LVxcdFxcdHNlbC52YWwgPSBzci1cXHUwMDNlbGVuO1xcbmlvX3VyaW5nL25ldC5jOjEyNDg6XFx0XFx0cmV0ID0gaW9fcmVjdl9idWZfc2VsZWN0KHJlcSwga21zZywgXFx1MDAyNnNlbCwgaXNzdWVfZmxhZ3MpO1xcbmlvX3VyaW5nL25ldC5jLTEyNDktXFx0XFx0aWYgKHVubGlrZWx5KHJldCBcXHUwMDNjIDApKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM4OjIyLjEzOTAwNDE0OVoiLCJTZXEiOjQzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxOTM4MDczMjIwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIFZ1bG5lcmFiaWxpdGllcyBpbiBpb191cmluZy9rYnVmLmMqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMgYGlvX3VyaW5nL2tidWYuY2AgY29kZSwgYW5kIEkgbmVlZCB0byBwaW5wb2ludCB0aGUgY3JpdGljYWwgZnVuY3Rpb25zLiBGcm9tIHdoYXQgSSBjYW4gdGVsbCwgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCwgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAsIGFuZCBgaW9fcmVjdl9idWZfc2VsZWN0YCBhcmUgdGhlIHByaW1hcnkgb25lcyB0byB3YXRjaC4gSSBhbHNvIG5lZWQgdG8ga2VlcCBgaW9fYnVmZmVyc19zZWxlY3RgIGFuZCBgaW9fYnVmZmVyc19wZWVrYCBpbiBtaW5kLlxuXG5GaXJzdCwgbGV0IG1lIGNvbmZpcm0gc29tZXRoaW5nOiBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGlzIGluZGVlZCBzdGF0aWMsIGFzIEkgc3VzcGVjdGVkLiBOb3csIEknbGwgY3JlYXRlIGEgY2hlY2tsaXN0IG9mIHRob3NlIGZ1bmN0aW9ucy5cblxuKiAgIGBpb19yaW5nX2J1ZmZlcnNfcGVla2BcbiogICBgaW9fYnVmZmVyc19zZWxlY3RgXG4qICAgYGlvX2J1ZmZlcnNfcGVla2BcbiogICBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYFxuKiAgIGBpb19yZWN2X2J1Zl9zZWxlY3RgXG5cbkhvbGQgb24sIEkgc2VlIHNvbWV0aGluZyBzaWduaWZpY2FudCBhYm91dCBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGZyb20gdGhpcyBwYXRjaC4gSXQgc2VlbXMgdGhhdCB0aGlzIHBhdGNoIGludHJvZHVjZXMgYSAqdXNlLWFmdGVyLWZyZWUqIHZ1bG5lcmFiaWxpdHkgYnkgbW92aW5nIHRoZSBga2ZyZWUoYXJnLVx1MDAzZWlvdnMpYCBjYWxsIHRvIHRoZSBlbmQgb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC4gVGhpcyBoYXBwZW5zIHdoZW4gYGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRlJFRWAgaXMgc2V0LiBOb3csIHdoZXJlIGlzIGBLQlVGX01PREVfRlJFRWAgYmVpbmcgc2V0PyBBaGEhIEl0J3Mgc2V0IGluIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGFuZCBgaW9fcmVjdl9idWZfc2VsZWN0YCBzcGVjaWZpY2FsbHkgd2hlbiBga21zZy1cdTAwM2V2ZWMuaW92ZWNgIGlzIGFscmVhZHkgYWxsb2NhdGVkLlxuXG5UaGVyZWZvcmUsIHRoZSBmdXp6ZXIgc2hvdWxkIGRlZmluaXRlbHkgcHJpb3JpdGl6ZSB0YXJnZXRpbmcgdGhvc2UgdHdvIGZ1bmN0aW9ucyAoYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgYW5kIGBpb19yZWN2X2J1Zl9zZWxlY3RgKSBiZWNhdXNlIHRoZXkgYXJlIHByaW1lIGNhbmRpZGF0ZXMgZm9yIHRyaWdnZXJpbmcgdGhlIGJ1Zy4gSSByZWFsbHkgbmVlZCB0byBkb3VibGUtY2hlY2sgdG8gYmUgc3VyZSBJIGFtIG5vdCBtaXNzaW5nIGFueSBvdGhlciBwbGFjZXMgYEtCVUZfTU9ERV9GUkVFYCBtaWdodCBiZSBzZXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzMzYwLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mjg4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM4OjQxLjUxOTczODY5M1oiLCJTZXEiOjQ0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ3NjI2MzExLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIktCVUZfTU9ERV9GUkVFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImlvX3VyaW5nL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpb191cmluZy9rYnVmLmM9MjUzPXN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbi0tXFxuaW9fdXJpbmcva2J1Zi5jLTMzMC1cXG5pb191cmluZy9rYnVmLmM6MzMxOlxcdGlmIChhcmctXFx1MDAzZW1vZGUgXFx1MDAyNiBLQlVGX01PREVfRlJFRSlcXG5pb191cmluZy9rYnVmLmMtMzMyLVxcdFxcdGtmcmVlKGFyZy1cXHUwMDNlaW92cyk7XFxuLS1cXG5pb191cmluZy9rYnVmLmg9NTM9ZW51bSB7XFxuLS1cXG5pb191cmluZy9rYnVmLmgtNTYtXFx0LyogaWYgYmlnZ2VyIHZlYyBhbGxvY2F0ZWQsIGZyZWUgb2xkIG9uZSAqL1xcbmlvX3VyaW5nL2tidWYuaDo1NzpcXHRLQlVGX01PREVfRlJFRVxcdFxcdD0gMixcXG5pb191cmluZy9rYnVmLmgtNTgtfTtcXG4tLVxcbmlvX3VyaW5nL25ldC5jPTYwOD1zdGF0aWMgaW50IGlvX3NlbmRfc2VsZWN0X2J1ZmZlcihzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzLFxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtNjIyLVxcdFxcdGFyZy5pb3ZzID0ga21zZy1cXHUwMDNldmVjLmlvdmVjO1xcbmlvX3VyaW5nL25ldC5jOjYyMzpcXHRcXHRhcmcubW9kZSA9IEtCVUZfTU9ERV9GUkVFO1xcbmlvX3VyaW5nL25ldC5jLTYyNC1cXHR9XFxuLS1cXG5pb191cmluZy9uZXQuYz0xMTM3PXN0YXRpYyBpbnQgaW9fcmVjdl9idWZfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLFxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtMTE1OS1cXHRcXHRcXHRhcmcuaW92cyA9IGttc2ctXFx1MDAzZXZlYy5pb3ZlYztcXG5pb191cmluZy9uZXQuYzoxMTYwOlxcdFxcdFxcdGFyZy5tb2RlIHw9IEtCVUZfTU9ERV9GUkVFO1xcbmlvX3VyaW5nL25ldC5jLTExNjEtXFx0XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozODo0MS45NjczNzAwNzRaIiwiU2VxIjo0NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzQ4MDMzMjI4MDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIElPX1VSSU5HIFZ1bG5lcmFiaWxpdHkqKlxuXG5Pa2F5LCBzbyB0aGlzIGlzIGZvY3VzZWQgb24gYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgYW5kIGBpb19yZWN2X2J1Zl9zZWxlY3RgIOKAkyB3aGljaCBjb25maXJtcyB0aGUgZm9jdXMgc3ltYm9scyBJIGlkZW50aWZpZWQgYXJlIGNvcnJlY3QuIExldCdzIGJyZWFrIGRvd24gdGhlIGlzc3VlIG1ldGhvZGljYWxseS5cblxuVGhlIHBhdGNoJ3MgcHJvYmxlbSBsaWVzIGluIG1vdmluZyB0aGF0IGBrZnJlZShhcmctXHUwMDNlaW92cylgIGNhbGwgdG8gdGhlIGVuZCBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBUaGUgbG9naWMgaGVyZSBpcyBrZXk6IGlmIGBLQlVGX01PREVfRlJFRWAgaXMgc2V0LCBgYXJnLVx1MDAzZWlvdnNgIGdldHMgdW5jb25kaXRpb25hbGx5IGZyZWVkICpiZWZvcmUqIHRoZSBmdW5jdGlvbiByZXR1cm5zLiBOb3csIGBhcmctXHUwMDNlaW92c2AgaXMgKmVpdGhlciogYSBmcmVzaGx5IGFsbG9jYXRlZCBhcnJheSAoaWYgdGhlIG9yaWdpbmFsIG5lZWRlZCBleHBhbnNpb24pICpvciogdGhlIG9yaWdpbmFsIGFycmF5IHBhc3NlZCBpbi4gVGhlIGNyaXRpY2FsIHBvaW50IGlzIHRoYXQsIHJlZ2FyZGxlc3Mgb2YgYWxsb2NhdGlvbiwgdGhlIHBvaW50ZXIgdG8gYGFyZy1cdTAwM2Vpb3ZzYCBpcyAqc3RpbGwqIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIsIHdoaWNoIGlzIGVpdGhlciBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBvciBgaW9fcmVjdl9idWZfc2VsZWN0YC5cblxuVGhpcyBjcmVhdGVzIGEgbmFzdHksIDEwMCUgcmVwcm9kdWNpYmxlIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkuIEVzc2VudGlhbGx5LCBpZiB5b3UncmUgdXNpbmcgcHJvdmlkZWQgYnVmZmVycyB3aXRoIGBpb19zZW5kYCBvciBgaW9fcmVjdmAsIHdpdGggcHJlLWFsbG9jYXRlZCBpb3ZlY3MsIHRoZSBidWZmZXJzIGFyZSBmcmVlZCBiZWZvcmUgdGhlIGNhbGxlciBjYW4gcHJvY2VzcyB0aGVtLiBUaGlzIGlzIGEgY2xlYXIsIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgc2NyZWFtcyBmb3IgZnV6emluZy5cblxuTXkgcHJpbWFyeSBjb25maWd1cmF0aW9uIGNvbmNlcm5zIGFyZSBgSU9fVVJJTkdgIGFuZCBgTkVUYCwgbmF0dXJhbGx5LlxuXG5Ob3csIGxldCdzIHByb2NlZWQgdG8gc2V0LXJlc3VsdHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0NTIzLCJPdXRwdXRUb2tlbnMiOjIzNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozOTo1Ni43NzA2OTUzNFoiLCJTZXEiOjQ2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzMTcxMjQ1NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSU9fVVJJTkdcIixcbiAgICBcIk5FVFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImlvX3JpbmdfYnVmZmVyc19wZWVrXCIsXG4gICAgXCJpb19idWZmZXJzX3NlbGVjdFwiLFxuICAgIFwiaW9fc2VuZF9zZWxlY3RfYnVmZmVyXCIsXG4gICAgXCJpb19yZWN2X2J1Zl9zZWxlY3RcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb3ZlcyBga2ZyZWUoYXJnLVxcdTAwM2Vpb3ZzKWAgdG8gdGhlIGVuZCBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBJZiBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgdGhpcyB1bmNvbmRpdGlvbmFsbHkgZnJlZXMgYGFyZy1cXHUwMDNlaW92c2AgYmVmb3JlIHJldHVybmluZy4gSG93ZXZlciwgYGFyZy1cXHUwMDNlaW92c2AgaXMgZWl0aGVyIHRoZSBuZXdseSBhbGxvY2F0ZWQgYXJyYXkgKGlmIGV4cGFuZGVkKSBvciB0aGUgb3JpZ2luYWwgYXJyYXksIGFuZCBpbiBib3RoIGNhc2VzLCBpdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyIChgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBvciBgaW9fcmVjdl9idWZfc2VsZWN0YCkgd2hpY2ggdGhlbiB1c2VzIGl0LiBUaGlzIGludHJvZHVjZXMgYSAxMDAlIHJlcHJvZHVjaWJsZSB1c2UtYWZ0ZXItZnJlZSB2dWxuZXJhYmlsaXR5IHdoZW4gdXNpbmcgcHJvdmlkZWQgYnVmZmVycyB3aXRoIGBpb19zZW5kYCBvciBgaW9fcmVjdmAgYW5kIHByZS1hbGxvY2F0ZWQgaW92ZWNzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklPX1VSSU5HXCIsXG4gICAgXCJORVRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJpb19yaW5nX2J1ZmZlcnNfcGVla1wiLFxuICAgIFwiaW9fYnVmZmVyc19zZWxlY3RcIixcbiAgICBcImlvX3NlbmRfc2VsZWN0X2J1ZmZlclwiLFxuICAgIFwiaW9fcmVjdl9idWZfc2VsZWN0XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW92ZXMgYGtmcmVlKGFyZy1cXHUwMDNlaW92cylgIHRvIHRoZSBlbmQgb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC4gSWYgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQsIHRoaXMgdW5jb25kaXRpb25hbGx5IGZyZWVzIGBhcmctXFx1MDAzZWlvdnNgIGJlZm9yZSByZXR1cm5pbmcuIEhvd2V2ZXIsIGBhcmctXFx1MDAzZWlvdnNgIGlzIGVpdGhlciB0aGUgbmV3bHkgYWxsb2NhdGVkIGFycmF5IChpZiBleHBhbmRlZCkgb3IgdGhlIG9yaWdpbmFsIGFycmF5LCBhbmQgaW4gYm90aCBjYXNlcywgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciAoYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgb3IgYGlvX3JlY3ZfYnVmX3NlbGVjdGApIHdoaWNoIHRoZW4gdXNlcyBpdC4gVGhpcyBpbnRyb2R1Y2VzIGEgMTAwJSByZXByb2R1Y2libGUgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0eSB3aGVuIHVzaW5nIHByb3ZpZGVkIGJ1ZmZlcnMgd2l0aCBgaW9fc2VuZGAgb3IgYGlvX3JlY3ZgIGFuZCBwcmUtYWxsb2NhdGVkIGlvdmVjcy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowzdqdq[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-07 03:13:02 +0000 UTC FinishedAt: 2026-07-07 03:39:58 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "8cdeaa50eae8dad34885515f62559ee83e7e8dda", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "IO_URING", "NET" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "8cdeaa50eae8dad34885515f62559ee83e7e8dda", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "IO_URING", "NET" ], "series_id": "468dd25d-90fc-4f9c-bfd8-20ef558367b9" }, "track": "KASAN", "fuzz": { "focus": [ "io_uring" ], "focus_symbols": [ "io_ring_buffers_peek", "io_buffers_select", "io_send_select_buffer", "io_recv_buf_select" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+OG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lPX1VSSU5HJiMzNDssCiAgICAmIzM0O05FVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2lvX3JpbmdfYnVmZmVyc19wZWVrJiMzNDssCiAgICAmIzM0O2lvX2J1ZmZlcnNfc2VsZWN0JiMzNDssCiAgICAmIzM0O2lvX3NlbmRfc2VsZWN0X2J1ZmZlciYjMzQ7LAogICAgJiMzNDtpb19yZWN2X2J1Zl9zZWxlY3QmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW92ZXMgYGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKWAgdG8gdGhlIGVuZCBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBJZiBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgdGhpcyB1bmNvbmRpdGlvbmFsbHkgZnJlZXMgYGFyZy1cdTAwM2Vpb3ZzYCBiZWZvcmUgcmV0dXJuaW5nLiBIb3dldmVyLCBgYXJnLVx1MDAzZWlvdnNgIGlzIGVpdGhlciB0aGUgbmV3bHkgYWxsb2NhdGVkIGFycmF5IChpZiBleHBhbmRlZCkgb3IgdGhlIG9yaWdpbmFsIGFycmF5LCBhbmQgaW4gYm90aCBjYXNlcywgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciAoYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgb3IgYGlvX3JlY3ZfYnVmX3NlbGVjdGApIHdoaWNoIHRoZW4gdXNlcyBpdC4gVGhpcyBpbnRyb2R1Y2VzIGEgMTAwJSByZXByb2R1Y2libGUgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0eSB3aGVuIHVzaW5nIHByb3ZpZGVkIGJ1ZmZlcnMgd2l0aCBgaW9fc2VuZGAgb3IgYGlvX3JlY3ZgIGFuZCBwcmUtYWxsb2NhdGVkIGlvdmVjcy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDcxYmVjNjE5MWE3YTdhNWM1ZDMwMWU2MWMzMDcxZTQ3NTJlY2UwOWRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEp1bCA3IDAzOjMxOjQ3IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2lvX3VyaW5nL2tidWYuYyBiL2lvX3VyaW5nL2tidWYuY1xuaW5kZXggM2NkMjk0NzdmZmYyZDMuLmI2Yjk2OWI1NWUxMjI0IDEwMDY0NFxuLS0tIGEvaW9fdXJpbmcva2J1Zi5jXG4mIzQzOyYjNDM7JiM0MzsgYi9pb191cmluZy9rYnVmLmNcbkBAIC0yODcsOCAmIzQzOzI4Nyw2IEBAIHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuIFx0XHRpb3YgPSBrbWFsbG9jX29ianMoc3RydWN0IGlvdmVjLCBucl9hdmFpbCk7XG4gXHRcdGlmICh1bmxpa2VseSghaW92KSlcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbi1cdFx0aWYgKGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRlJFRSlcbi1cdFx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG4gXHRcdGFyZy1cdTAwM2Vpb3ZzID0gaW92O1xuIFx0XHRucl9pb3ZzID0gbnJfYXZhaWw7XG4gXHR9IGVsc2UgaWYgKG5yX2F2YWlsIFx1MDAzYyBucl9pb3ZzKSB7XG5AQCAtMzMwLDYgJiM0MzszMjgsOSBAQCBzdGF0aWMgaW50IGlvX3JpbmdfYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcbiBcdFx0YnVmID0gaW9fcmluZ19oZWFkX3RvX2J1ZihiciwgJiM0MzsmIzQzO2hlYWQsIGJsLVx1MDAzZW1hc2spO1xuIFx0fSB3aGlsZSAoLS1ucl9pb3ZzKTtcbiBcbiYjNDM7XHRpZiAoYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxuJiM0MztcdFx0a2ZyZWUoYXJnLVx1MDAzZWlvdnMpO1xuJiM0MztcbiBcdGlmIChoZWFkID09IHRhaWwpXG4gXHRcdHJlcS1cdTAwM2VmbGFncyB8PSBSRVFfRl9CTF9FTVBUWTtcbiBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT44bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtJT19VUklORyYjMzQ7LAogICAgJiMzNDtORVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpb19yaW5nX2J1ZmZlcnNfcGVlayYjMzQ7LAogICAgJiMzNDtpb19idWZmZXJzX3NlbGVjdCYjMzQ7LAogICAgJiMzNDtpb19zZW5kX3NlbGVjdF9idWZmZXImIzM0OywKICAgICYjMzQ7aW9fcmVjdl9idWZfc2VsZWN0JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vdmVzIGBrZnJlZShhcmctXHUwMDNlaW92cylgIHRvIHRoZSBlbmQgb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC4gSWYgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQsIHRoaXMgdW5jb25kaXRpb25hbGx5IGZyZWVzIGBhcmctXHUwMDNlaW92c2AgYmVmb3JlIHJldHVybmluZy4gSG93ZXZlciwgYGFyZy1cdTAwM2Vpb3ZzYCBpcyBlaXRoZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCBhcnJheSAoaWYgZXhwYW5kZWQpIG9yIHRoZSBvcmlnaW5hbCBhcnJheSwgYW5kIGluIGJvdGggY2FzZXMsIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIG9yIGBpb19yZWN2X2J1Zl9zZWxlY3RgKSB3aGljaCB0aGVuIHVzZXMgaXQuIFRoaXMgaW50cm9kdWNlcyBhIDEwMCUgcmVwcm9kdWNpYmxlIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkgd2hlbiB1c2luZyBwcm92aWRlZCBidWZmZXJzIHdpdGggYGlvX3NlbmRgIG9yIGBpb19yZWN2YCBhbmQgcHJlLWFsbG9jYXRlZCBpb3ZlY3MuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDcxYmVjNjE5MWE3YTdhNWM1ZDMwMWU2MWMzMDcxZTQ3NTJlY2UwOWQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEp1bCA3IDAzOjMxOjQ3IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvaW9fdXJpbmcva2J1Zi5jIGIvaW9fdXJpbmcva2J1Zi5jCmluZGV4IDNjZDI5NDc3ZmZmMmQzLi5iNmI5NjliNTVlMTIyNCAxMDA2NDQKLS0tIGEvaW9fdXJpbmcva2J1Zi5jCiYjNDM7JiM0MzsmIzQzOyBiL2lvX3VyaW5nL2tidWYuYwpAQCAtMjg3LDggJiM0MzsyODcsNiBAQCBzdGF0aWMgaW50IGlvX3JpbmdfYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZywKIAkJaW92ID0ga21hbGxvY19vYmpzKHN0cnVjdCBpb3ZlYywgbnJfYXZhaWwpOwogCQlpZiAodW5saWtlbHkoIWlvdikpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJaWYgKGFyZy0mZ3Q7bW9kZSAmYW1wOyBLQlVGX01PREVfRlJFRSkKLQkJCWtmcmVlKGFyZy0mZ3Q7aW92cyk7CiAJCWFyZy0mZ3Q7aW92cyA9IGlvdjsKIAkJbnJfaW92cyA9IG5yX2F2YWlsOwogCX0gZWxzZSBpZiAobnJfYXZhaWwgJmx0OyBucl9pb3ZzKSB7CkBAIC0zMzAsNiAmIzQzOzMyOCw5IEBAIHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLAogCQlidWYgPSBpb19yaW5nX2hlYWRfdG9fYnVmKGJyLCAmIzQzOyYjNDM7aGVhZCwgYmwtJmd0O21hc2spOwogCX0gd2hpbGUgKC0tbnJfaW92cyk7CiAKJiM0MzsJaWYgKGFyZy0mZ3Q7bW9kZSAmYW1wOyBLQlVGX01PREVfRlJFRSkKJiM0MzsJCWtmcmVlKGFyZy0mZ3Q7aW92cyk7CiYjNDM7CiAJaWYgKGhlYWQgPT0gdGFpbCkKIAkJcmVxLSZndDtmbGFncyB8PSBSRVFfRl9CTF9FTVBUWTsKIAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTkwCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uCgoqKkFuYWx5emluZyBhIEtlcm5lbCBQYXRjaCBpbiBpb191cmluZy9rYnVmLmMqKgoKQWxyaWdodCwgSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIGBpb191cmluZy9rYnVmLmNgLiBJdCYjMzk7cyBhIGZhaXJseSBzcGVjaWZpYyBvbmUsIGNvbmNlcm5pbmcgaG93IG1lbW9yeSBpcyBoYW5kbGVkIGluIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuIFRoZSBjaGFuZ2UgaXMgYWJvdXQgKndoZW4qIHdlIGNhbGwgYGtmcmVlKGFyZy0mZ3Q7aW92cylgLiBBcHBhcmVudGx5LCBpdCYjMzk7cyBiZWluZyBtb3ZlZCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiB3aXRoaW4gdGhhdCBmdW5jdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5LiBTbywgSSYjMzk7bSBnb2luZyB0byBkaXZlIHJpZ2h0IGludG8gdGhlIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgZnVuY3Rpb24gaXRzZWxmIHRvIHNlZSB3aGF0JiMzOTtzIGhhcHBlbmluZyBhbmQgZmlndXJlIG91dCB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIHNoaWZ0LiBJJiMzOTtsbCBuZWVkIHRvIGFuYWx5emUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgdG8gZGV0ZXJtaW5lIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBjaGFuZ2UgYW5kIHdoZXRoZXIgaXQgYWRkcmVzc2VzIGEgcG90ZW50aWFsIGJ1ZywgaW1wcm92ZXMgcGVyZm9ybWFuY2UsIG9yIHBlcmhhcHMgYWxpZ25zIHdpdGggc29tZSBvdGhlciBkZXNpZ24gcHJpbmNpcGxlLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgcmVhbGx5IGdvaW5nIG9uIGluIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lvX3JpbmdfYnVmZmVyc19wZWVrJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL2tidWYuYz0yMzA9c3RydWN0IGlvX2JyX3NlbCBpb19idWZmZXJfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzaXplX3QgKmxlbixcbi0tXG5pb191cmluZy9rYnVmLmMtMjUyLVxuaW9fdXJpbmcva2J1Zi5jOjI1MzpzdGF0aWMgaW50IGlvX3JpbmdfYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcbmlvX3VyaW5nL2tidWYuYy0yNTQtXHRcdFx0XHRzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsKVxuLS1cbmlvX3VyaW5nL2tidWYuYz0zNDE9aW50IGlvX2J1ZmZlcnNfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcbi0tXG5pb191cmluZy9rYnVmLmMtMzUyLVx0aWYgKHNlbC1cdTAwM2VidWZfbGlzdC1cdTAwM2VmbGFncyBcdTAwMjYgSU9CTF9CVUZfUklORykge1xuaW9fdXJpbmcva2J1Zi5jOjM1MzpcdFx0cmV0ID0gaW9fcmluZ19idWZmZXJzX3BlZWsocmVxLCBhcmcsIHNlbC1cdTAwM2VidWZfbGlzdCk7XG5pb191cmluZy9rYnVmLmMtMzU0LVx0XHQvKlxuLS1cbmlvX3VyaW5nL2tidWYuYz0zNzc9aW50IGlvX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXG4tLVxuaW9fdXJpbmcva2J1Zi5jLTM5MC1cdGlmIChibC1cdTAwM2VmbGFncyBcdTAwMjYgSU9CTF9CVUZfUklORykge1xuaW9fdXJpbmcva2J1Zi5jOjM5MTpcdFx0cmV0ID0gaW9fcmluZ19idWZmZXJzX3BlZWsocmVxLCBhcmcsIGJsKTtcbmlvX3VyaW5nL2tidWYuYy0zOTItXHRcdGlmIChyZXQgXHUwMDNlIDApXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjY3NQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDkzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkgd2VyZSBzd2lybGluZyBhcm91bmQgaW4gbXkgb3duIGhlYWQ6CgoqKkFuYWx5emluZyBhIFBvdGVudGlhbCBNZW1vcnkgTWFuYWdlbWVudCBJc3N1ZSoqCgpBbHJpZ2h0LCBzbyB0aGlzIHBhdGNoICpsb29rcyogbGlrZSBpdCYjMzk7cyBhZGRyZXNzaW5nIHNvbWUgc29ydCBvZiBtZW1vcnkgY29ycnVwdGlvbiBwcm9ibGVtIOKAkyBtYXliZSBhIG1lbW9yeSBsZWFrLCBvciBhIHVzZS1hZnRlci1mcmVlIHNjZW5hcmlvLiBJdCBzZWVtcyB0aGUgY29yZSBvZiB0aGUgZml4IHJldm9sdmVzIGFyb3VuZCB0aGUgdGltaW5nIG9mIGBrZnJlZShhcmctJmd0O2lvdnMpYC4gSXQgKmxvb2tzKiBsaWtlIHRoZXkmIzM5O3JlIG1vdmluZyB0aGUgYGtmcmVlYCBjYWxsICphZnRlciogYSBsb29wIHRoYXQmIzM5O3MgdXNpbmcgYGFyZy0mZ3Q7aW92c2AuIAoKSG9sZCBvbiBhIHNlY29uZC4uLiBUaGF0IGRvZXNuJiMzOTt0IHF1aXRlIG1ha2Ugc2Vuc2UuIElmIHRoZXkmIzM5O3JlIGZyZWVpbmcgYGFyZy0mZ3Q7aW92c2AgYW5kICp0aGVuKiByZWFzc2lnbmluZyBgYXJnLSZndDtpb3ZzID0gaW92O2AsIHRoZW4gdGhlIGxvb3AgKm11c3QqIGJlIHVzaW5nIHRoZSBvcmlnaW5hbCBtZW1vcnkgbG9jYXRpb24sIHJpZ2h0PyBPciBhbSBJIG1pc3Npbmcgc29tZXRoaW5nPyBJZiB0aGF0JiMzOTtzIHRydWUsIHRoZW4gdGhlIG5ldyB2YWx1ZSBgaW92YCBtdXN0IGJlIGFzc2lnbmVkICpiZWZvcmUqIHRoZSBrZnJlZSB0byBwcmV2ZW50IHVzZSBhZnRlciBmcmVlLiBJIG5lZWQgdG8gYmUgc3VyZS4KCkkgbmVlZCB0byBkaWcgZGVlcGVyIGhlcmUuIFRoZSBrZXkgZnVuY3Rpb24gaXMgcHJvYmFibHkgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBpbiBgaW9fdXJpbmcva2J1Zi5jYC4gSSYjMzk7bSBnb2luZyB0byBwdWxsIHVwIHRoYXQgZnVuY3Rpb24gYW5kIHJlYWQgdGhlIGxvZ2ljIGNhcmVmdWxseS4gSSBuZWVkIHRvIHNlZSBleGFjdGx5IGhvdyBgYXJnLSZndDtpb3ZzYCBpcyBiZWluZyB1c2VkIGFuZCBtb2RpZmllZCB3aXRoaW4gdGhhdCBmdW5jdGlvbiBhbmQgd2hldGhlciB0aGlzIGBrZnJlZWAgcGxhY2VtZW50IGlzIHJlYWxseSBzb2x2aW5nIHRoZSBwcm9ibGVtIG9yLCBwZXJoYXBzLCBpbnRyb2R1Y2luZyBhIG5ldyBvbmUgb3IgbWlzdW5kZXJzdGFuZGluZyBob3cgdG8gZGVhbCB3aXRoIHRoZSBleGlzdGluZyBpc3N1ZS4gTGV0JiMzOTtzIHNlZS4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjUzLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjUzOlx0c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXG4gMjU0Olx0XHRcdFx0XHRzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsKVxuIDI1NTpcdHtcbiAyNTY6XHRcdHN0cnVjdCBpb191cmluZ19idWZfcmluZyAqYnIgPSBibC1cdTAwM2VidWZfcmluZztcbiAyNTc6XHRcdHN0cnVjdCBpb3ZlYyAqb3JnX2lvdnMgPSBhcmctXHUwMDNlaW92cztcbiAyNTg6XHRcdHN0cnVjdCBpb3ZlYyAqaW92ID0gYXJnLVx1MDAzZWlvdnM7XG4gMjU5Olx0XHRpbnQgbnJfaW92cyA9IGFyZy1cdTAwM2Vucl9pb3ZzO1xuIDI2MDpcdFx0X191MTYgbnJfYXZhaWwsIHRhaWwsIGhlYWQ7XG4gMjYxOlx0XHRzdHJ1Y3QgaW9fdXJpbmdfYnVmICpidWY7XG4gMjYyOlx0XG4gMjYzOlx0XHR0YWlsID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZici1cdTAwM2V0YWlsKTtcbiAyNjQ6XHRcdGhlYWQgPSBibC1cdTAwM2VoZWFkO1xuIDI2NTpcdFx0bnJfYXZhaWwgPSBtaW5fdChfX3UxNiwgdGFpbCAtIGhlYWQsIFVJT19NQVhJT1YpO1xuIDI2NjpcdFx0aWYgKHVubGlrZWx5KCFucl9hdmFpbCkpXG4gMjY3Olx0XHRcdHJldHVybiAtRU5PQlVGUztcbiAyNjg6XHRcbiAyNjk6XHRcdGJ1ZiA9IGlvX3JpbmdfaGVhZF90b19idWYoYnIsIGhlYWQsIGJsLVx1MDAzZW1hc2spO1xuIDI3MDpcdFx0aWYgKGFyZy1cdTAwM2VtYXhfbGVuKSB7XG4gMjcxOlx0XHRcdHUzMiBsZW4gPSBSRUFEX09OQ0UoYnVmLVx1MDAzZWxlbik7XG4gMjcyOlx0XHRcdHNpemVfdCBuZWVkZWQ7XG4gMjczOlx0XG4gMjc0Olx0XHRcdGlmICh1bmxpa2VseSghbGVuKSlcbiAyNzU6XHRcdFx0XHRyZXR1cm4gLUVOT0JVRlM7XG4gMjc2Olx0XHRcdG5lZWRlZCA9IChhcmctXHUwMDNlbWF4X2xlbiAmIzQzOyBsZW4gLSAxKSAvIGxlbjtcbiAyNzc6XHRcdFx0bmVlZGVkID0gbWluX25vdF96ZXJvKG5lZWRlZCwgKHNpemVfdCkgUEVFS19NQVhfSU1QT1JUKTtcbiAyNzg6XHRcdFx0aWYgKG5yX2F2YWlsIFx1MDAzZSBuZWVkZWQpXG4gMjc5Olx0XHRcdFx0bnJfYXZhaWwgPSBuZWVkZWQ7XG4gMjgwOlx0XHR9XG4gMjgxOlx0XG4gMjgyOlx0XHQvKlxuIDI4MzpcdFx0ICogb25seSBhbGxvYyBhIGJpZ2dlciBhcnJheSBpZiB3ZSBrbm93IHdlIGhhdmUgZGF0YSB0byBtYXAsIGVnIG5vdFxuIDI4NDpcdFx0ICogYSBzcGVjdWxhdGl2ZSBwZWVrIG9wZXJhdGlvbi5cbiAyODU6XHRcdCAqL1xuIDI4NjpcdFx0aWYgKGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRVhQQU5EIFx1MDAyNlx1MDAyNiBucl9hdmFpbCBcdTAwM2UgbnJfaW92cyBcdTAwMjZcdTAwMjYgYXJnLVx1MDAzZW1heF9sZW4pIHtcbiAyODc6XHRcdFx0aW92ID0ga21hbGxvY19vYmpzKHN0cnVjdCBpb3ZlYywgbnJfYXZhaWwpO1xuIDI4ODpcdFx0XHRpZiAodW5saWtlbHkoIWlvdikpXG4gMjg5Olx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMjkwOlx0XHRcdGFyZy1cdTAwM2Vpb3ZzID0gaW92O1xuIDI5MTpcdFx0XHRucl9pb3ZzID0gbnJfYXZhaWw7XG4gMjkyOlx0XHR9IGVsc2UgaWYgKG5yX2F2YWlsIFx1MDAzYyBucl9pb3ZzKSB7XG4gMjkzOlx0XHRcdG5yX2lvdnMgPSBucl9hdmFpbDtcbiAyOTQ6XHRcdH1cbiAyOTU6XHRcbiAyOTY6XHRcdC8qIHNldCBpdCB0byBtYXgsIGlmIG5vdCBzZXQsIHNvIHdlIGNhbiB1c2UgaXQgdW5jb25kaXRpb25hbGx5ICovXG4gMjk3Olx0XHRpZiAoIWFyZy1cdTAwM2VtYXhfbGVuKVxuIDI5ODpcdFx0XHRhcmctXHUwMDNlbWF4X2xlbiA9IElOVF9NQVg7XG4gMjk5Olx0XG4gMzAwOlx0XHRyZXEtXHUwMDNlYnVmX2luZGV4ID0gUkVBRF9PTkNFKGJ1Zi1cdTAwM2ViaWQpO1xuIDMwMTpcdFx0ZG8ge1xuIDMwMjpcdFx0XHR1MzIgbGVuID0gUkVBRF9PTkNFKGJ1Zi1cdTAwM2VsZW4pO1xuIDMwMzpcdFxuIDMwNDpcdFx0XHQvKiB0cnVuY2F0ZSBlbmQgcGllY2UsIGlmIG5lZWRlZCwgZm9yIG5vbiBwYXJ0aWFsIGJ1ZmZlcnMgKi9cbiAzMDU6XHRcdFx0aWYgKGxlbiBcdTAwM2UgYXJnLVx1MDAzZW1heF9sZW4pIHtcbiAzMDY6XHRcdFx0XHRsZW4gPSBhcmctXHUwMDNlbWF4X2xlbjtcbiAzMDc6XHRcdFx0XHRpZiAoIShibC1cdTAwM2VmbGFncyBcdTAwMjYgSU9CTF9JTkMpKSB7XG4gMzA4Olx0XHRcdFx0XHRhcmctXHUwMDNlcGFydGlhbF9tYXAgPSAxO1xuIDMwOTpcdFx0XHRcdFx0aWYgKGlvdiAhPSBhcmctXHUwMDNlaW92cylcbiAzMTA6XHRcdFx0XHRcdFx0YnJlYWs7XG4gMzExOlx0XHRcdFx0fVxuIDMxMjpcdFx0XHR9XG4gMzEzOlx0XG4gMzE0Olx0XHRcdGlvdi1cdTAwM2Vpb3ZfYmFzZSA9IHU2NF90b191c2VyX3B0cihSRUFEX09OQ0UoYnVmLVx1MDAzZWFkZHIpKTtcbiAzMTU6XHRcdFx0aW92LVx1MDAzZWlvdl9sZW4gPSBsZW47XG4gMzE2Olx0XHRcdGlmICh1bmxpa2VseSghYWNjZXNzX29rKGlvdi1cdTAwM2Vpb3ZfYmFzZSwgbGVuKSkpIHtcbiAzMTc6XHRcdFx0XHRpZiAoYXJnLVx1MDAzZWlvdnMgIT0gb3JnX2lvdnMpXG4gMzE4Olx0XHRcdFx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG4gMzE5Olx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gMzIwOlx0XHRcdH1cbiAzMjE6XHRcdFx0aW92JiM0MzsmIzQzOztcbiAzMjI6XHRcbiAzMjM6XHRcdFx0YXJnLVx1MDAzZW91dF9sZW4gJiM0Mzs9IGxlbjtcbiAzMjQ6XHRcdFx0YXJnLVx1MDAzZW1heF9sZW4gLT0gbGVuO1xuIDMyNTpcdFx0XHRpZiAoIWFyZy1cdTAwM2VtYXhfbGVuKVxuIDMyNjpcdFx0XHRcdGJyZWFrO1xuIDMyNzpcdFxuIDMyODpcdFx0XHRidWYgPSBpb19yaW5nX2hlYWRfdG9fYnVmKGJyLCAmIzQzOyYjNDM7aGVhZCwgYmwtXHUwMDNlbWFzayk7XG4gMzI5Olx0XHR9IHdoaWxlICgtLW5yX2lvdnMpO1xuIDMzMDpcdFxuIDMzMTpcdFx0aWYgKGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRlJFRSlcbiAzMzI6XHRcdFx0a2ZyZWUoYXJnLVx1MDAzZWlvdnMpO1xuIDMzMzpcdFxuIDMzNDpcdFx0aWYgKGhlYWQgPT0gdGFpbClcbiAzMzU6XHRcdFx0cmVxLVx1MDAzZWZsYWdzIHw9IFJFUV9GX0JMX0VNUFRZO1xuIDMzNjpcdFxuIDMzNzpcdFx0cmVxLVx1MDAzZWZsYWdzIHw9IFJFUV9GX0JVRkZFUl9SSU5HO1xuIDMzODpcdFx0cmV0dXJuIGlvdiAtIGFyZy1cdTAwM2Vpb3ZzO1xuIDMzOTpcdH1cbiAzNDA6XHRcbiAzNDE6XHRpbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuIDM0MjpcdFx0XHQgICAgICBzdHJ1Y3QgaW9fYnJfc2VsICpzZWwsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcbiAzNDM6XHR7XG4gMzQ0Olx0XHRzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCA9IHJlcS1cdTAwM2VjdHg7XG4gMzQ1Olx0XHRpbnQgcmV0ID0gLUVOT0VOVDtcbiAzNDY6XHRcbiAzNDc6XHRcdGlvX3Jpbmdfc3VibWl0X2xvY2soY3R4LCBpc3N1ZV9mbGFncyk7XG4gMzQ4Olx0XHRzZWwtXHUwMDNlYnVmX2xpc3QgPSBpb19idWZmZXJfZ2V0X2xpc3QoY3R4LCBhcmctXHUwMDNlYnVmX2dyb3VwKTtcbiAzNDk6XHRcdGlmICh1bmxpa2VseSghc2VsLVx1MDAzZWJ1Zl9saXN0KSlcbiAzNTA6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuIDM1MTpcdFxuIDM1MjpcdFx0aWYgKHNlbC1cdTAwM2VidWZfbGlzdC1cdTAwM2VmbGFncyBcdTAwMjYgSU9CTF9CVUZfUklORykge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3MTEKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiA0MDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgS0JVRiBQYXRjaDogUG90ZW50aWFsIE1lbW9yeSBMZWFrKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggbW92ZXMgdGhlIGBrZnJlZShhcmctJmd0O2lvdnMpYCBjYWxsIG91dHNpZGUgb2YgdGhlIGNvbmRpdGlvbmFsIGJsb2NrLCBwbGFjaW5nIGl0IGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZnVuY3Rpb24uIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdGhhdCB0aGlzIHNlZW1lZCBsaWtlIGEgc2ltcGxlIGNsZWFudXAsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSBidWdzLgoKTm93LCBJJiMzOTttIHN0YXJ0aW5nIHRvIHNlZSB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgY2hhbmdlLiBQcmV2aW91c2x5LCBpZiBgYXJnLSZndDttb2RlICZhbXA7IEtCVUZfTU9ERV9GUkVFYCB3YXMgc2V0LCB0aGUgY29kZSB3b3VsZCBmcmVlIGBhcmctJmd0O2lvdnNgIOKAkyB3aGljaCwgY3JpdGljYWxseSwgd2FzIHRoZSAqb2xkKiBgaW92c2Ag4oCTICpiZWZvcmUqIHBvdGVudGlhbGx5IGFsbG9jYXRpbmcgYSAqbmV3KiBgaW92c2AgYW5kIGFzc2lnbmluZyBpdCB0byBgYXJnLSZndDtpb3ZzYC4KClRoZSBpbnRlcmVzdGluZyBzZWN0aW9uIG9mIGNvZGUgaGVyZSBpczoKCmBgYGMKCQlpZiAoYXJnLSZndDttb2RlICZhbXA7IEtCVUZfTU9ERV9FWFBBTkQgJmFtcDsmYW1wOyBucl9hdmFpbCAmZ3Q7IG5yX2lvdnMgJmFtcDsmYW1wOyBhcmctJmd0O21heF9sZW4pIHsKCQkJaW92ID0ga21hbGxvY19vYmpzKHN0cnVjdCBpb3ZlYywgbnJfYXZhaWwpOwoJCQlpZiAodW5saWtlbHkoIWlvdikpCgkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCWlmIChhcmctJmd0O21vZGUgJmFtcDsgS0JVRl9NT0RFX0ZSRUUpCi0JCQkJa2ZyZWUoYXJnLSZndDtpb3ZzKTsKCQkJYXJnLSZndDtpb3ZzID0gaW92OwoJCQlucl9pb3ZzID0gbnJfYXZhaWw7CgkJfQpgYGAKCk9rYXksIHNvIGlmIHRoZSBjb2RlICpkb2VzKiBlbnRlciB0aGF0IGBpZmAgYmxvY2ssIGEgbmV3IGBpb3ZgIGlzIGFsbG9jYXRlZCBhbmQgYXNzaWduZWQgdG8gYGFyZy0mZ3Q7aW92c2AsIGFuZCBvbmx5IHRoZW4sIHRoZSBvbGQgYGlvdnNgIHdpbGwgYmUgZnJlZWQsIGJ1dCBvbmx5IGlmIHRoZSBmbGFnIGlzIHNldC4KClRoZSBjb2RlIG5vdywgYWZ0ZXIgdGhlIHBhdGNoLCBsb29rcyBsaWtlIHRoaXM6CgpgYGBjCglpZiAoYXJnLSZndDttb2RlICZhbXA7IEtCVUZfTU9ERV9GUkVFKQoJCWtmcmVlKGFyZy0mZ3Q7aW92cyk7CmBgYAoKVGhlIHByb2JsZW0gaXMgaW1tZWRpYXRlbHkgY2xlYXI6IElmIHRoZSBleHBhbnNpb24gKmRvZXMqIG9jY3VyIGFuZCBhICpuZXcqIGBpb3ZgIGlzIGFsbG9jYXRlZCwgYXQgdGhlIGVuZCwgdGhlIGNvZGUgd2lsbCBmcmVlIHRoZSAqbmV3KiBgYXJnLSZndDtpb3ZzYCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBgaW92c2AuIFRoaXMgaXMgbm93IGEgYnVnOiB3ZSBhcmUgbGVha2luZyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9sZCBgYXJnLSZndDtpb3ZzYCEgV2UgYXJlIHN1cHBvc2VkIHRvIGJlIGZyZWVpbmcgdGhlIG9sZCBvbmUuIFdlIG5vdyBoYXZlIGFuIGlzc3VlIG9mIG1lbW9yeSBjb3JydXB0aW9uIG9yIGV2ZW4gd29yc2UuIEkgYmV0dGVyIHJlLWV4YW1pbmUgdGhlIGRpZmYgdmVyeSBjYXJlZnVsbHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aWYgXFwoYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFXFwpJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL2tidWYuYz0yNTM9c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXG4tLVxuaW9fdXJpbmcva2J1Zi5jLTMzMC1cbmlvX3VyaW5nL2tidWYuYzozMzE6XHRpZiAoYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxuaW9fdXJpbmcva2J1Zi5jLTMzMi1cdFx0a2ZyZWUoYXJnLVx1MDAzZWlvdnMpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU3NjYKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxNTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBpb19yaW5nX2J1ZmZlcnNfcGVlayBMb2dpYyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBJZiBgYXJnLSZndDttb2RlICZhbXA7IEtCVUZfTU9ERV9GUkVFYCBpcyB0cnVlLCB0aGF0IHNpZ25hbHMgdGhhdCB0aGUgb3JpZ2luYWwgYGFyZy0mZ3Q7aW92c2Agd2FzICpkeW5hbWljYWxseSBhbGxvY2F0ZWQqIGFuZCB0aHVzIG5lZWRzIHRvIGJlIGRlYWxsb2NhdGVkLiBUaGF0JiMzOTtzIHN0cmFpZ2h0Zm9yd2FyZC4gSG93ZXZlciwgdGhlIGxvZ2ljIGdldHMgdHJpY2t5IHdoZW4gd2UgKmFsc28qIGFsbG9jYXRlIGEgKm5ldyogYGlvdmAsIGFuZCBhc3NpZ24gaXQgdG8gYGFyZy0mZ3Q7aW92c2AuIFNvLCBgYXJnLSZndDtpb3ZzYCBpcyBlaXRoZXIgdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gb3IgYSBuZXcgb25lLCBkZXBlbmRpbmcuIFRoZSBjb2RlIHRoZW4gZnJlZXMgYGFyZy0mZ3Q7aW92c2AgYXQgdGhlIGVuZCBpZiB0aGUgZnJlZSBtb2RlIGlzIGVuYWJsZWQuCgpCdXQgaGVyZSYjMzk7cyB3aGVyZSB0aGUgcmVkIGZsYWcgZ29lcyB1cC4gVGhlICpjYWxsZXIqIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgZXhwZWN0cyBgYXJnLSZndDtpb3ZzYCB0byBjb250YWluIHZhbGlkIGlvdmVjcywgcmlnaHQ/IEl0JiMzOTtzIGhvdyB0aGUgY2FsbGVyIHJldHJpZXZlcyB0aGUgZGF0YS4gSWYgd2UgKmZyZWUqIGBhcmctJmd0O2lvdnNgIGF0IHRoZSBlbmQgb2YgKnRoaXMqIGZ1bmN0aW9uLCB0aGUgY2FsbGVyIGlzIGxlZnQgaG9sZGluZyBhIGRhbmdsaW5nIHBvaW50ZXIuIFRoYXQmIzM5O3MgYSBjbGFzc2ljIG1lbW9yeSBtYW5hZ2VtZW50IGlzc3VlLiBJIG5lZWQgdG8gY29uZmlybSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3Igb2YgYGFyZy0mZ3Q7aW92c2AgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24uIExldCBtZSBjaGVjayB0aGUgY2FsbGVyIHRvIGNvbmZpcm0gdGhlIGludGVuZGVkIGJlaGF2aW9yLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtpb19idWZmZXJzX3BlZWsmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpb191cmluZy9rYnVmLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jPTM0MT1pbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuLS1cbmlvX3VyaW5nL2tidWYuYy0zNzYtXG5pb191cmluZy9rYnVmLmM6Mzc3OmludCBpb19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuaW9fdXJpbmcva2J1Zi5jLTM3OC1cdFx0ICAgIHN0cnVjdCBpb19icl9zZWwgKnNlbClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjMzOAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZXNlIG1ldGhvZHMsIGBpb19idWZmZXJzX3BlZWtgIGFuZCBgaW9fYnVmZmVyc19zZWxlY3RgLiBNeSBleHBlcnRpc2UgdGVsbHMgbWUgdGhlcmUmIzM5O3MgbW9yZSBoZXJlIHRoYW4gbWVldHMgdGhlIGV5ZSwgYW5kIHRoZSBuYW1lICYjMzQ7YnVmZmVycyYjMzQ7IGFscmVhZHkgc3VnZ2VzdHMgc29tZSBsZXZlbCBvZiBtZW1vcnkgbWFuYWdlbWVudC4gSSYjMzk7bSBpbW1lZGlhdGVseSBjdXJpb3VzIGFib3V0IHRoZWlyIGNvbnRleHQg4oCTIGFyZSB0aGVzZSBsaW5rZWQgdG8gbmV0d29yayBvcGVyYXRpb25zLCBmaWxlIEkvTywgb3Igc29tZXRoaW5nIG1vcmUgZ2VuZXJpYz8gSSYjMzk7bSBhbHJlYWR5IGZvcm11bGF0aW5nIHF1ZXN0aW9uczoKCioqUGVla2luZywgU2VsZWN0aW5nLCBhbmQgQnVmZmVyczogSW5pdGlhbCBBc3Nlc3NtZW50KioKClNvLCBgaW9fYnVmZmVyc19wZWVrYCwgdGhpcyBpcyBpbnRlcmVzdGluZy4gSSYjMzk7bSBndWVzc2luZyBpdCBhbGxvd3MgYSBub24tZGVzdHJ1Y3RpdmUgbG9vayBhdCBidWZmZXJlZCBkYXRhLCBwcm9iYWJseSB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIGJ1ZmZlci4gVGhpcyBpbXBsaWVzIGEgbmVlZCB0byBpbnNwZWN0IGluY29taW5nIG9yIG91dGdvaW5nIGRhdGEgd2l0aG91dCBhbHRlcmluZyBpdHMgc3RhdGUsIGxpa2VseSBmb3IgdGhpbmdzIGxpa2UgZGV0ZXJtaW5pbmcgdGhlIG1lc3NhZ2UgdHlwZSBiZWZvcmUgY29tbWl0dGluZyB0byBwcm9jZXNzaW5nIGl0LiBJJiMzOTttIHRoaW5raW5nIHBlcmhhcHMgdGhpcyBmdW5jdGlvbiBoYXMgc29tZSBvdmVybGFwIHdpdGggYSBgcmVjdl9wZWVrYCBmdW5jdGlvbiBpbiBhIHNvY2tldC1iYXNlZCBhcHBsaWNhdGlvbi4gVGhpcyBtaWdodCBiZSB1c2VkIHRvIGluc3BlY3QgYSBwYWNrZXQgYmVmb3JlIGFwcGx5aW5nIGEgY2VydGFpbiBoYW5kbGVyLgoKYGlvX2J1ZmZlcnNfc2VsZWN0YCwgbm93IHRoYXQmIzM5O3MgZXZlbiBtb3JlIGludHJpZ3VpbmcuICYjMzQ7U2VsZWN0JiMzNDsgYWx3YXlzIHN1Z2dlc3RzIHNvbWUga2luZCBvZiBtdWx0aXBsZXhpbmcgb3IgZXZlbnQgaGFuZGxpbmcuIElzIHRoaXMgbWV0aG9kIHJlbGF0ZWQgdG8gdGhlIGBzZWxlY3QoKWAgc3lzdGVtIGNhbGwsIGZvciBpbmRpY2F0aW5nIG9uZSBvciBtb3JlIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGV4ZWN1dGVkPyBUaGlzIGZ1bmN0aW9uIHdvdWxkIGJlIHF1aXRlIHZhbHVhYmxlLCBlc3BlY2lhbGx5IGluIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50cywgd2hlcmUgd2UgY2FuIGNob29zZSB3aGljaCBvcGVyYXRpb24gZnJvbSBhbiBhcnJheSBvZiBidWZmZXIgY2FuZGlkYXRlcyB3b3VsZCBiZSBzdWl0YWJsZSB0byBvcGVyYXRlIHVwb24uIFdoYXQgY3JpdGVyaWEgYXJlIHVzZWQgZm9yIHRoaXMgc2VsZWN0aW9uPyBBcmUgd2UgdGFsa2luZyBhYm91dCBwcmlvcml0aXppbmcgYmFzZWQgb24gYnVmZmVyIGZ1bGxuZXNzLCBhdmFpbGFibGUgc3BhY2UsIG9yIHNvbWUgb3RoZXIgYXBwbGljYXRpb24tc3BlY2lmaWMgbWV0cmljPyBBcmUgdGhlcmUgaW1wbGljYXRpb25zIGZvciBjb25jdXJyZW5jeSBjb250cm9sPyBJJiMzOTttIGFscmVhZHkgYW50aWNpcGF0aW5nIHBvdGVudGlhbCBzeW5jaHJvbml6YXRpb24gY2hhbGxlbmdlcy4gSSBjYW4gaW1hZ2luZSBzY2VuYXJpb3Mgd2hlcmUgdGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbm9uLWJsb2NraW5nIEkvTyB0byBoYW5kbGUgbXVsdGlwbGUgY29ubmVjdGlvbnMgb3Igc3RyZWFtcyBlZmZpY2llbnRseS4gSSYjMzk7bSByZWFkeSB0byBkaWcgZGVlcGVyIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIHRvIGdldCBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGVzZSBmdW5jdGlvbnMgZml0IGludG8gdGhlIGxhcmdlciBzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzQwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMzQwOlx0XG4gMzQxOlx0aW50IGlvX2J1ZmZlcnNfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcbiAzNDI6XHRcdFx0ICAgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXG4gMzQzOlx0e1xuIDM0NDpcdFx0c3RydWN0IGlvX3JpbmdfY3R4ICpjdHggPSByZXEtXHUwMDNlY3R4O1xuIDM0NTpcdFx0aW50IHJldCA9IC1FTk9FTlQ7XG4gMzQ2Olx0XG4gMzQ3Olx0XHRpb19yaW5nX3N1Ym1pdF9sb2NrKGN0eCwgaXNzdWVfZmxhZ3MpO1xuIDM0ODpcdFx0c2VsLVx1MDAzZWJ1Zl9saXN0ID0gaW9fYnVmZmVyX2dldF9saXN0KGN0eCwgYXJnLVx1MDAzZWJ1Zl9ncm91cCk7XG4gMzQ5Olx0XHRpZiAodW5saWtlbHkoIXNlbC1cdTAwM2VidWZfbGlzdCkpXG4gMzUwOlx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiAzNTE6XHRcbiAzNTI6XHRcdGlmIChzZWwtXHUwMDNlYnVmX2xpc3QtXHUwMDNlZmxhZ3MgXHUwMDI2IElPQkxfQlVGX1JJTkcpIHtcbiAzNTM6XHRcdFx0cmV0ID0gaW9fcmluZ19idWZmZXJzX3BlZWsocmVxLCBhcmcsIHNlbC1cdTAwM2VidWZfbGlzdCk7XG4gMzU0Olx0XHRcdC8qXG4gMzU1Olx0XHRcdCAqIERvbiYjMzk7dCByZWN5Y2xlIHRoZXNlIGJ1ZmZlcnMgaWYgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHBvbGwuXG4gMzU2Olx0XHRcdCAqIE5vYm9keSBlbHNlIGNhbiB1c2UgdGhlbSBhbnl3YXksIGFuZCBob2xkaW5nIG9uIHRvIHByb3ZpZGVkXG4gMzU3Olx0XHRcdCAqIGJ1ZmZlcnMgZm9yIGEgc2VuZC93cml0ZSBvcGVyYXRpb24gd291bGQgaGFwcGVuIG9uIHRoZSBhcHBcbiAzNTg6XHRcdFx0ICogc2lkZSBhbnl3YXkgd2l0aCBub3JtYWwgYnVmZmVycy4gQmVzaWRlcywgd2UgYWxyZWFkeVxuIDM1OTpcdFx0XHQgKiBjb21taXR0ZWQgdGhlbSwgdGhleSBjYW5ub3QgYmUgcHV0IGJhY2sgaW4gdGhlIHF1ZXVlLlxuIDM2MDpcdFx0XHQgKi9cbiAzNjE6XHRcdFx0aWYgKHJldCBcdTAwM2UgMCkge1xuIDM2MjpcdFx0XHRcdHJlcS1cdTAwM2VmbGFncyB8PSBSRVFfRl9CVUZGRVJTX0NPTU1JVCB8IFJFUV9GX0JMX05PX1JFQ1lDTEU7XG4gMzYzOlx0XHRcdFx0aWYgKCFpb19rYnVmX2NvbW1pdChyZXEsIHNlbC1cdTAwM2VidWZfbGlzdCwgYXJnLVx1MDAzZW91dF9sZW4sIHJldCkpXG4gMzY0Olx0XHRcdFx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfQlVGX01PUkU7XG4gMzY1Olx0XHRcdH1cbiAzNjY6XHRcdH0gZWxzZSB7XG4gMzY3Olx0XHRcdHJldCA9IGlvX3Byb3ZpZGVkX2J1ZmZlcnNfc2VsZWN0KHJlcSwgXHUwMDI2YXJnLVx1MDAzZW91dF9sZW4sIHNlbC1cdTAwM2VidWZfbGlzdCwgYXJnLVx1MDAzZWlvdnMpO1xuIDM2ODpcdFx0fVxuIDM2OTpcdG91dF91bmxvY2s6XG4gMzcwOlx0XHRpZiAoaXNzdWVfZmxhZ3MgXHUwMDI2IElPX1VSSU5HX0ZfVU5MT0NLRUQpIHtcbiAzNzE6XHRcdFx0c2VsLVx1MDAzZWJ1Zl9saXN0ID0gTlVMTDtcbiAzNzI6XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmN0eC1cdTAwM2V1cmluZ19sb2NrKTtcbiAzNzM6XHRcdH1cbiAzNzQ6XHRcdHJldHVybiByZXQ7XG4gMzc1Olx0fVxuIDM3NjpcdFxuIDM3NzpcdGludCBpb19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuIDM3ODpcdFx0XHQgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsKVxuIDM3OTpcdHtcbiAzODA6XHRcdHN0cnVjdCBpb19yaW5nX2N0eCAqY3R4ID0gcmVxLVx1MDAzZWN0eDtcbiAzODE6XHRcdHN0cnVjdCBpb19idWZmZXJfbGlzdCAqYmw7XG4gMzgyOlx0XHRpbnQgcmV0O1xuIDM4MzpcdFxuIDM4NDpcdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZjdHgtXHUwMDNldXJpbmdfbG9jayk7XG4gMzg1Olx0XG4gMzg2Olx0XHRibCA9IGlvX2J1ZmZlcl9nZXRfbGlzdChjdHgsIGFyZy1cdTAwM2VidWZfZ3JvdXApO1xuIDM4NzpcdFx0aWYgKHVubGlrZWx5KCFibCkpXG4gMzg4Olx0XHRcdHJldHVybiAtRU5PRU5UO1xuIDM4OTpcdFxuIDM5MDpcdFx0aWYgKGJsLVx1MDAzZWZsYWdzIFx1MDAyNiBJT0JMX0JVRl9SSU5HKSB7XG4gMzkxOlx0XHRcdHJldCA9IGlvX3JpbmdfYnVmZmVyc19wZWVrKHJlcSwgYXJnLCBibCk7XG4gMzkyOlx0XHRcdGlmIChyZXQgXHUwMDNlIDApXG4gMzkzOlx0XHRcdFx0cmVxLVx1MDAzZWZsYWdzIHw9IFJFUV9GX0JVRkZFUlNfQ09NTUlUO1xuIDM5NDpcdFx0XHRzZWwtXHUwMDNlYnVmX2xpc3QgPSBibDtcbiAzOTU6XHRcdFx0cmV0dXJuIHJldDtcbiAzOTY6XHRcdH1cbiAzOTc6XHRcbiAzOTg6XHRcdC8qIGRvbiYjMzk7dCBzdXBwb3J0IG11bHRpcGxlIGJ1ZmZlciBzZWxlY3Rpb25zIGZvciBsZWdhY3kgKi9cbiAzOTk6XHRcdHNlbC1cdTAwM2VidWZfbGlzdCA9IE5VTEw7XG4gNDAwOlx0XHRyZXR1cm4gaW9fcHJvdmlkZWRfYnVmZmVyc19zZWxlY3QocmVxLCBcdTAwMjZhcmctXHUwMDNlbWF4X2xlbiwgYmwsIGFyZy1cdTAwM2Vpb3ZzKTtcbiA0MDE6XHR9XG4gNDAyOlx0XG4gNDAzOlx0c3RhdGljIGlubGluZSBib29sIF9faW9fcHV0X2tidWZfcmluZyhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSxcbiA0MDQ6XHRcdFx0XHRcdCAgICAgIHN0cnVjdCBpb19idWZmZXJfbGlzdCAqYmwsIGludCBsZW4sIGludCBucilcbiA0MDU6XHR7XG4gNDA2Olx0XHRib29sIHJldCA9IHRydWU7XG4gNDA3Olx0XG4gNDA4Olx0XHRpZiAoYmwpXG4gNDA5Olx0XHRcdHJldCA9IGlvX2tidWZfY29tbWl0KHJlcSwgYmwsIGxlbiwgbnIpO1xuIDQxMDpcdFx0aWYgKHJldCBcdTAwMjZcdTAwMjYgKHJlcS1cdTAwM2VmbGFncyBcdTAwMjYgUkVRX0ZfQlVGX01PUkUpKVxuIDQxMTpcdFx0XHRyZXQgPSBmYWxzZTtcbiA0MTI6XHRcbiA0MTM6XHRcdHJlcS1cdTAwM2VmbGFncyBcdTAwMjY9IH4oUkVRX0ZfQlVGRkVSX1JJTkcgfCBSRVFfRl9CVUZfTU9SRSk7XG4gNDE0Olx0XHRyZXR1cm4gcmV0O1xuIDQxNTpcdH1cbiA0MTY6XHRcbiA0MTc6XHR1bnNpZ25lZCBpbnQgX19pb19wdXRfa2J1ZnMoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBpb19idWZmZXJfbGlzdCAqYmwsXG4gNDE4Olx0XHRcdFx0ICAgIGludCBsZW4sIGludCBuYnVmcylcbiA0MTk6XHR7XG4gNDIwOlx0XHR1bnNpZ25lZCBpbnQgcmV0O1xuIDQyMTpcdFxuIDQyMjpcdFx0cmV0ID0gSU9SSU5HX0NRRV9GX0JVRkZFUiB8IChyZXEtXHUwMDNlYnVmX2luZGV4IFx1MDAzY1x1MDAzYyBJT1JJTkdfQ1FFX0JVRkZFUl9TSElGVCk7XG4gNDIzOlx0XG4gNDI0Olx0XHRpZiAodW5saWtlbHkoIShyZXEtXHUwMDNlZmxhZ3MgXHUwMDI2IFJFUV9GX0JVRkZFUl9SSU5HKSkpIHtcbiA0MjU6XHRcdFx0aW9fa2J1Zl9kcm9wX2xlZ2FjeShyZXEpO1xuIDQyNjpcdFx0XHRyZXR1cm4gcmV0O1xuIDQyNzpcdFx0fVxuIDQyODpcdFxuIDQyOTpcdFx0aWYgKCFfX2lvX3B1dF9rYnVmX3JpbmcocmVxLCBibCwgbGVuLCBuYnVmcykpXG4gNDMwOlx0XHRcdHJldCB8PSBJT1JJTkdfQ1FFX0ZfQlVGX01PUkU7XG4gNDMxOlx0XHRyZXR1cm4gcmV0O1xuIDQzMjpcdH1cbiA0MzM6XHRcbiA0MzQ6XHRzdGF0aWMgaW50IGlvX3JlbW92ZV9idWZmZXJzX2xlZ2FjeShzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCxcbiA0MzU6XHRcdFx0XHRcdCAgICBzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsLFxuIDQzNjpcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgbmJ1ZnMpXG4gNDM3Olx0e1xuIDQzODpcdFx0dW5zaWduZWQgbG9uZyBpID0gMDtcbiA0Mzk6XHRcdHN0cnVjdCBpb19idWZmZXIgKm54dDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODM4NgoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDE5NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBQb3RlbnRpYWwgTWVtb3J5IE1hbmFnZW1lbnQgSXNzdWUqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgY29kZSBzbmlwcGV0LCBzcGVjaWZpY2FsbHkgdGhlIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgZnVuY3Rpb24sIGFuZCBzb21ldGhpbmcmIzM5O3MgaW1tZWRpYXRlbHkganVtcGluZyBvdXQgYXQgbWUuIElmIGBhcmctJmd0O21vZGUgJmFtcDsgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGBhcmctJmd0O2lvdnNgLiBIaXN0b3JpY2FsbHksIGl0IGxvb2tzIGxpa2UgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBtaWdodCBoYXZlIGJlZW4gZnJlZWluZyB0aGUgb2xkIGBhcmctJmd0O2lvdnNgIGlmIGl0IGFsbG9jYXRlZCBhIG5ldyBvbmUuIEkgdGhpbmsgSSBzZWUgYSBwb3RlbnRpYWwgaXNzdWUuLi4KCkhvbGQgb24sIEkgc2VlIHRoZSBwYXRjaC4gSXQgc2VlbXMgdGhhdCB0aGUgYGtmcmVlKGFyZy0mZ3Q7aW92cylgIGNhbGwgKnVzZWQqIHRvIGJlIHdpdGhpbiB0aGUgZnVuY3Rpb24gYnV0IGlzIG5vdyBhdCB0aGUgZW5kLiBUaGF0JiMzOTtzIGEgcmVkIGZsYWchIElmIGBhcmctJmd0O21vZGUgJmFtcDsgS0JVRl9NT0RFX0ZSRUVgIGlzIHRydWUsIHRoZW4gdGhhdCBtZWFucyB0aGUgY2FsbGVyIGlzIGV4cGVjdGluZyB0byB1c2UgYGFyZy0mZ3Q7aW92c2AgKmFmdGVyKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIEJ1dCBpZiB3ZSBmcmVlIGBhcmctJmd0O2lvdnNgIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCB0aGUgY2FsbGVyIGlzIGdvaW5nIHRvIGJlIGxlZnQgaG9sZGluZyBhIGRhbmdsaW5nIHBvaW50ZXIuIFRoYXQmIzM5O3MgYSBjbGFzc2ljIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkhCgpMZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBwYXRjaCBvbmUgbW9yZSB0aW1lIHRvIGJlIHN1cmUuIFRoaXMgZGVmaW5pdGVseSBuZWVkcyBhIGNsb3NlciBsb29rLCBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byB0aGUgbGlmZXRpbWUgb2YgYGFyZy0mZ3Q7aW92c2AgYW5kIHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSBjYWxsZXIgYW5kIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0tCVUZfTU9ERV9GUkVFJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW9fdXJpbmcvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL2tidWYuYz0yNTM9c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXG4tLVxuaW9fdXJpbmcva2J1Zi5jLTMzMC1cbmlvX3VyaW5nL2tidWYuYzozMzE6XHRpZiAoYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxuaW9fdXJpbmcva2J1Zi5jLTMzMi1cdFx0a2ZyZWUoYXJnLVx1MDAzZWlvdnMpO1xuLS1cbmlvX3VyaW5nL2tidWYuaD01Mz1lbnVtIHtcbi0tXG5pb191cmluZy9rYnVmLmgtNTYtXHQvKiBpZiBiaWdnZXIgdmVjIGFsbG9jYXRlZCwgZnJlZSBvbGQgb25lICovXG5pb191cmluZy9rYnVmLmg6NTc6XHRLQlVGX01PREVfRlJFRVx0XHQ9IDIsXG5pb191cmluZy9rYnVmLmgtNTgtfTtcbi0tXG5pb191cmluZy9uZXQuYz02MDg9c3RhdGljIGludCBpb19zZW5kX3NlbGVjdF9idWZmZXIoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncyxcbi0tXG5pb191cmluZy9uZXQuYy02MjItXHRcdGFyZy5pb3ZzID0ga21zZy1cdTAwM2V2ZWMuaW92ZWM7XG5pb191cmluZy9uZXQuYzo2MjM6XHRcdGFyZy5tb2RlID0gS0JVRl9NT0RFX0ZSRUU7XG5pb191cmluZy9uZXQuYy02MjQtXHR9XG4tLVxuaW9fdXJpbmcvbmV0LmM9MTEzNz1zdGF0aWMgaW50IGlvX3JlY3ZfYnVmX3NlbGVjdChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZyxcbi0tXG5pb191cmluZy9uZXQuYy0xMTU5LVx0XHRcdGFyZy5pb3ZzID0ga21zZy1cdTAwM2V2ZWMuaW92ZWM7XG5pb191cmluZy9uZXQuYzoxMTYwOlx0XHRcdGFyZy5tb2RlIHw9IEtCVUZfTU9ERV9GUkVFO1xuaW9fdXJpbmcvbmV0LmMtMTE2MS1cdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5MzMzCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNzM0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIFBvdGVudGlhbCBVc2UtQWZ0ZXItRnJlZSBWdWxuZXJhYmlsaXR5IGluIGlvX3VyaW5nKioKCk9rYXksIGxldCYjMzk7cyBzZWUuIEluIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AsIEkmIzM5O20gbG9va2luZyBhdCB0aGUgbG9naWMgcmVsYXRlZCB0byBgYXJnLSZndDtpb3ZzYCBhbmQgaG93IGl0IGhhbmRsZXMgcG90ZW50aWFsIHJlYWxsb2NhdGlvbi4gSSBzZWUgdGhhdCBpZiBgS0JVRl9NT0RFX0VYUEFORGAgaXMgc2V0IGFuZCBtb3JlIGlvdmVjcyBhcmUgbmVlZGVkLCBhIG5ldyBgaW92YCBhcnJheSBpcyBhbGxvY2F0ZWQgdXNpbmcgYGttYWxsb2Nfb2Jqc2AuIFRoaXMgbmV3IGFycmF5IHRoZW4gb3ZlcndyaXRlcyB0aGUgZXhpc3RpbmcgYGFyZy0mZ3Q7aW92c2AgcG9pbnRlci4gVGhlIGZ1bmN0aW9uIHRoZW4gcHJvY2VlZHMgdG8gcHJvY2VzcyB0aGUgZGF0YS4KCk5vdywgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgZnJlZWluZyBsb2dpYyBhdCB0aGUgZW5kLiBPcmlnaW5hbGx5LCBga2ZyZWUoYXJnLSZndDtpb3ZzKWAgd2FzIGNhbGxlZCBvbmx5IGlmIGEgbmV3IGBpb3ZgIHdhc24mIzM5O3QgYWxsb2NhdGVkLiBUaGlzIG1lYW5zIHRoYXQgaWYgaXQgKndhcyogcmVhbGxvY2F0ZWQsIHRoZSBvbGQgb25lIHdhcyBsZWFrZWQuIEl0IHdhcyBhdHRlbXB0aW5nIHRvIHNvbHZlIHRoZSBvbGQgbGVhaywgYnkgaW50cm9kdWNpbmcgYSBuZXcgYGtmcmVlKGFyZy0mZ3Q7aW92cylgIGNhbGwgYXQgdGhlIGVuZCwgY29uZGl0aW9uYWwgb24gYEtCVUZfTU9ERV9GUkVFYC4KCkJ1dC4uLiBob2xkIG9uLiBJZiBgYXJnLSZndDtpb3ZzYCBpcyB1cGRhdGVkIHRvIGEgbmV3IGBpb3ZgLCB0aGVuIGBrZnJlZShhcmctJmd0O2lvdnMpYCBhdCB0aGUgZW5kIHdpbGwgZnJlZSB0aGUgbmV3bHkgYWxsb2NhdGVkIGBpb3ZgISBUaGUgKm5ldyogb25lLiBBbmQgaXQgKmRvZXNuJiMzOTt0KiBmcmVlIHRoZSBvbGQgb25lIGJlY2F1c2UgYGFyZy0mZ3Q7aW92c2Agd2FzIG92ZXJ3cml0dGVuISBIb3dldmVyLCBpZiBgYXJnLSZndDtpb3ZzYCBpcyAqbm90KiB1cGRhdGVkLCB0aGUgb2xkIG9uZSAqaXMqIGZyZWVkLCB3aGljaCBpcyB0aGUgb3JpZ2luYWwgaW50ZW50LgoKV2h5IGRpZCBzeXotY2x1c3RlciBhcHBseSB0aGlzIHBhdGNoPyBIbW0sIEkgc2VlIHRoZSBwYXRjaCBub3cuIEl0ICptb3ZlZCogdGhlIGBrZnJlZShhcmctJmd0O2lvdnMpYCB0byB0aGUgZW5kIGFuZCBhZGRlZCB0aGUgYEtCVUZfTU9ERV9GUkVFYCBjb25kaXRpb24uIEFoYSEgVGhpcyBpcyB0aGUga2V5LiBUaGUgcGF0Y2ggbm93IGludHJvZHVjZXMgYSBidWchIEl0IGZyZWVzIGBhcmctJmd0O2lvdnNgIGF0IHRoZSAqZW5kKiBvZiB0aGUgZnVuY3Rpb24sIHdoaWNoIG1lYW5zIHRoZSBwb2ludGVyIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBhcmctJmd0O2lvdnNgKSBpcyBiZWluZyBmcmVlZCAqYmVmb3JlKiB0aGUgY2FsbGVyIGdldHMgYSBjaGFuY2UgdG8gdXNlIGl0LgoKU28sIGlmIGBLQlVGX01PREVfRlJFRWAgaXMgc2V0LCBgYXJnLSZndDtpb3ZzYCB3aWxsIEFMV0FZUyBiZSBmcmVlZCBhdCB0aGUgZW5kLiBUaGlzIGlzIGEgY2xlYXIgdXNlLWFmdGVyLWZyZWUhIEFuZCBpdCBsb29rcyBsaWtlIHRoZSBwYXRjaCBpcyBmcm9tIHN5ei1jbHVzdGVyLiAmIzM0O3N5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldyYjMzQ7Li4uIFllcCwgdGhpcyBpcyBhIHBhdGNoIHVuZGVyIHJldmlldywgYW5kIGl0IGludHJvZHVjZXMgYSB1c2UtYWZ0ZXItZnJlZSwgcGxhaW4gYW5kIHNpbXBsZSEKClNpbmNlIGl0IGludHJvZHVjZXMgYSB1c2UtYWZ0ZXItZnJlZSwgaXQgZGVmaW5pdGVseSBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgYW5kIHNob3VsZCBiZSBmdXp6ZWQhIEl0JiMzOTtzIGNyaXRpY2FsLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCBhbmQgaG93IGBhcmctJmd0O2lvdnNgIGlzIHVzZWQgYWZ0ZXIgdGhpcyBjYWxsLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGFuZCBgaW9fcmVjdl9idWZfc2VsZWN0YCBpbiBgaW9fdXJpbmcvbmV0LmNgIGJlY2F1c2UgdGhleSBhcmUgbGlrZWx5IHRoZSBjYWxsZXJzIHRoYXQgcGFzcyBpbiBgYXJnYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpb191cmluZy9uZXQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwOCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDYwODpcdHN0YXRpYyBpbnQgaW9fc2VuZF9zZWxlY3RfYnVmZmVyKHN0cnVjdCBpb19raW9jYiAqcmVxLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MsXG4gNjA5Olx0XHRcdFx0XHQgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnKVxuIDYxMDpcdHtcbiA2MTE6XHRcdHN0cnVjdCBpb19zcl9tc2cgKnNyID0gaW9fa2lvY2JfdG9fY21kKHJlcSwgc3RydWN0IGlvX3NyX21zZyk7XG4gNjEyOlx0XHRzdHJ1Y3QgYnVmX3NlbF9hcmcgYXJnID0ge1xuIDYxMzpcdFx0XHQuaW92cyA9IFx1MDAyNmttc2ctXHUwMDNlZmFzdF9pb3YsXG4gNjE0Olx0XHRcdC5tYXhfbGVuID0gbWluX25vdF96ZXJvKHNyLVx1MDAzZWxlbiwgSU5UX01BWCksXG4gNjE1Olx0XHRcdC5ucl9pb3ZzID0gMSxcbiA2MTY6XHRcdFx0LmJ1Zl9ncm91cCA9IHNyLVx1MDAzZWJ1Zl9ncm91cCxcbiA2MTc6XHRcdH07XG4gNjE4Olx0XHRpbnQgcmV0O1xuIDYxOTpcdFxuIDYyMDpcdFx0aWYgKGttc2ctXHUwMDNldmVjLmlvdmVjKSB7XG4gNjIxOlx0XHRcdGFyZy5ucl9pb3ZzID0ga21zZy1cdTAwM2V2ZWMubnI7XG4gNjIyOlx0XHRcdGFyZy5pb3ZzID0ga21zZy1cdTAwM2V2ZWMuaW92ZWM7XG4gNjIzOlx0XHRcdGFyZy5tb2RlID0gS0JVRl9NT0RFX0ZSRUU7XG4gNjI0Olx0XHR9XG4gNjI1Olx0XG4gNjI2Olx0XHRpZiAoIShzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0JVTkRMRSkpXG4gNjI3Olx0XHRcdGFyZy5ucl9pb3ZzID0gMTtcbiA2Mjg6XHRcdGVsc2VcbiA2Mjk6XHRcdFx0YXJnLm1vZGUgfD0gS0JVRl9NT0RFX0VYUEFORDtcbiA2MzA6XHRcbiA2MzE6XHRcdHJldCA9IGlvX2J1ZmZlcnNfc2VsZWN0KHJlcSwgXHUwMDI2YXJnLCBzZWwsIGlzc3VlX2ZsYWdzKTtcbiA2MzI6XHRcdGlmICh1bmxpa2VseShyZXQgXHUwMDNjIDApKVxuIDYzMzpcdFx0XHRyZXR1cm4gcmV0O1xuIDYzNDpcdFxuIDYzNTpcdFx0aWYgKGFyZy5pb3ZzICE9IFx1MDAyNmttc2ctXHUwMDNlZmFzdF9pb3YgXHUwMDI2XHUwMDI2IGFyZy5pb3ZzICE9IGttc2ctXHUwMDNldmVjLmlvdmVjKSB7XG4gNjM2Olx0XHRcdGttc2ctXHUwMDNldmVjLm5yID0gcmV0O1xuIDYzNzpcdFx0XHRrbXNnLVx1MDAzZXZlYy5pb3ZlYyA9IGFyZy5pb3ZzO1xuIDYzODpcdFx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTkVFRF9DTEVBTlVQO1xuIDYzOTpcdFx0fVxuIDY0MDpcdFx0c3ItXHUwMDNlbGVuID0gYXJnLm91dF9sZW47XG4gNjQxOlx0XG4gNjQyOlx0XHRpZiAocmV0ID09IDEpIHtcbiA2NDM6XHRcdFx0c3ItXHUwMDNlYnVmID0gYXJnLmlvdnNbMF0uaW92X2Jhc2U7XG4gNjQ0Olx0XHRcdHJldCA9IGltcG9ydF91YnVmKElURVJfU09VUkNFLCBzci1cdTAwM2VidWYsIHNyLVx1MDAzZWxlbixcbiA2NDU6XHRcdFx0XHRcdFx0XHUwMDI2a21zZy1cdTAwM2Vtc2cubXNnX2l0ZXIpO1xuIDY0NjpcdFx0XHRpZiAodW5saWtlbHkocmV0KSlcbiA2NDc6XHRcdFx0XHRyZXR1cm4gcmV0O1xuIDY0ODpcdFx0fSBlbHNlIHtcbiA2NDk6XHRcdFx0aW92X2l0ZXJfaW5pdChcdTAwMjZrbXNnLVx1MDAzZW1zZy5tc2dfaXRlciwgSVRFUl9TT1VSQ0UsXG4gNjUwOlx0XHRcdFx0XHRhcmcuaW92cywgcmV0LCBhcmcub3V0X2xlbik7XG4gNjUxOlx0XHR9XG4gNjUyOlx0XG4gNjUzOlx0XHRyZXR1cm4gMDtcbiA2NTQ6XHR9XG4gNjU1Olx0XG4gNjU2Olx0aW50IGlvX3NlbmQoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcbiA2NTc6XHR7XG4gNjU4Olx0XHRzdHJ1Y3QgaW9fc3JfbXNnICpzciA9IGlvX2tpb2NiX3RvX2NtZChyZXEsIHN0cnVjdCBpb19zcl9tc2cpO1xuIDY1OTpcdFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZyA9IHJlcS1cdTAwM2Vhc3luY19kYXRhO1xuIDY2MDpcdFx0c3RydWN0IGlvX2JyX3NlbCBzZWwgPSB7IH07XG4gNjYxOlx0XHRzdHJ1Y3Qgc29ja2V0ICpzb2NrO1xuIDY2MjpcdFx0dW5zaWduZWQgZmxhZ3M7XG4gNjYzOlx0XHRpbnQgbWluX3JldCA9IDA7XG4gNjY0Olx0XHRpbnQgcmV0O1xuIDY2NTpcdFxuIDY2NjpcdFx0c29jayA9IHNvY2tfZnJvbV9maWxlKHJlcS1cdTAwM2VmaWxlKTtcbiA2Njc6XHRcdGlmICh1bmxpa2VseSghc29jaykpXG4gNjY4Olx0XHRcdHJldHVybiAtRU5PVFNPQ0s7XG4gNjY5Olx0XG4gNjcwOlx0XHRpZiAoIShyZXEtXHUwMDNlZmxhZ3MgXHUwMDI2IFJFUV9GX1BPTExFRCkgXHUwMDI2XHUwMDI2XG4gNjcxOlx0XHQgICAgKHNyLVx1MDAzZWZsYWdzIFx1MDAyNiBJT1JJTkdfUkVDVlNFTkRfUE9MTF9GSVJTVCkpXG4gNjcyOlx0XHRcdHJldHVybiAtRUFHQUlOO1xuIDY3MzpcdFxuIDY3NDpcdFx0aWYgKHJlcS1cdTAwM2VmbGFncyBcdTAwMjYgUkVRX0ZfSU1QT1JUX0JVRkZFUikge1xuIDY3NTpcdFx0XHRyZXQgPSBpb19pbXBvcnRfcmVnX2J1ZihyZXEsIFx1MDAyNmttc2ctXHUwMDNlbXNnLm1zZ19pdGVyLFxuIDY3NjpcdFx0XHRcdFx0XHQodTY0KSh1aW50cHRyX3Qpc3ItXHUwMDNlYnVmLCBzci1cdTAwM2VsZW4sXG4gNjc3Olx0XHRcdFx0XHRcdElURVJfU09VUkNFLCBpc3N1ZV9mbGFncyk7XG4gNjc4Olx0XHRcdGlmICh1bmxpa2VseShyZXQpKVxuIDY3OTpcdFx0XHRcdHJldHVybiByZXQ7XG4gNjgwOlx0XHRcdHJlcS1cdTAwM2VmbGFncyBcdTAwMjY9IH5SRVFfRl9JTVBPUlRfQlVGRkVSO1xuIDY4MTpcdFx0fVxuIDY4MjpcdFxuIDY4MzpcdFx0ZmxhZ3MgPSBzci1cdTAwM2Vtc2dfZmxhZ3M7XG4gNjg0Olx0XHRpZiAoaXNzdWVfZmxhZ3MgXHUwMDI2IElPX1VSSU5HX0ZfTk9OQkxPQ0spXG4gNjg1Olx0XHRcdGZsYWdzIHw9IE1TR19ET05UV0FJVDtcbiA2ODY6XHRcbiA2ODc6XHRyZXRyeV9idW5kbGU6XG4gNjg4Olx0XHRzZWwuYnVmX2xpc3QgPSBOVUxMO1xuIDY4OTpcdFx0aWYgKGlvX2RvX2J1ZmZlcl9zZWxlY3QocmVxKSkge1xuIDY5MDpcdFx0XHRyZXQgPSBpb19zZW5kX3NlbGVjdF9idWZmZXIocmVxLCBpc3N1ZV9mbGFncywgXHUwMDI2c2VsLCBrbXNnKTtcbiA2OTE6XHRcdFx0aWYgKHJldClcbiA2OTI6XHRcdFx0XHRyZXR1cm4gcmV0O1xuIDY5MzpcdFx0fVxuIDY5NDpcdFxuIDY5NTpcdFx0LypcbiA2OTY6XHRcdCAqIElmIE1TR19XQUlUQUxMIGlzIHNldCwgb3IgdGhpcyBpcyBhIGJ1bmRsZSBzZW5kLCB0aGVuIHdlIG5lZWRcbiA2OTc6XHRcdCAqIHRoZSBmdWxsIGFtb3VudC4gSWYganVzdCBidW5kbGUgaXMgc2V0LCBpZiB3ZSBkbyBhIHNob3J0IHNlbmRcbiA2OTg6XHRcdCAqIHRoZW4gd2UgY29tcGxldGUgdGhlIGJ1bmRsZSBzZXF1ZW5jZSByYXRoZXIgdGhhbiBjb250aW51ZSBvbi5cbiA2OTk6XHRcdCAqL1xuIDcwMDpcdFx0aWYgKGZsYWdzIFx1MDAyNiBNU0dfV0FJVEFMTCB8fCBzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0JVTkRMRSlcbiA3MDE6XHRcdFx0bWluX3JldCA9IGlvdl9pdGVyX2NvdW50KFx1MDAyNmttc2ctXHUwMDNlbXNnLm1zZ19pdGVyKTtcbiA3MDI6XHRcbiA3MDM6XHRcdGZsYWdzIFx1MDAyNj0gfk1TR19JTlRFUk5BTF9TRU5ETVNHX0ZMQUdTO1xuIDcwNDpcdFx0a21zZy1cdTAwM2Vtc2cubXNnX2ZsYWdzID0gZmxhZ3M7XG4gNzA1Olx0XHRyZXQgPSBzb2NrX3NlbmRtc2coc29jaywgXHUwMDI2a21zZy1cdTAwM2Vtc2cpO1xuIDcwNjpcdFx0aWYgKHJldCBcdTAwM2MgbWluX3JldCkge1xuIDcwNzpcdFx0XHRpZiAocmV0ID09IC1FQUdBSU4gXHUwMDI2XHUwMDI2IChpc3N1ZV9mbGFncyBcdTAwMjYgSU9fVVJJTkdfRl9OT05CTE9DSykpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMzY2CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogODc2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlVzZS1BZnRlci1GcmVlIEJ1ZyBpbiBpb19zZW5kX3NlbGVjdF9idWZmZXIqKgoKT2theSwgbGV0IG1lIGJyZWFrIHRoaXMgZG93bi4gSXQgbG9va3MgbGlrZSBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBoYXMgYSBjcml0aWNhbCB1c2UtYWZ0ZXItZnJlZSB2dWxuZXJhYmlsaXR5LiBUaGUgY29yZSBwcm9ibGVtIGxpZXMgaW4gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAsIGBpb19idWZmZXJzX3NlbGVjdGAsIGFuZCBgaW9fcmluZ19idWZmZXJzX3BlZWtgLgoKRmlyc3QsIGlmIGBrbXNnLSZndDt2ZWMuaW92ZWNgIGlzIGFscmVhZHkgYWxsb2NhdGVkIOKAkyBtZWFuaW5nIGBpb19zZW5kYCB3YXMgcHJldmlvdXNseSBjYWxsZWQgd2l0aCBhbiBpb3ZlYyBhcnJheSAobGlrZWx5IHRocm91Z2ggYGlvX3NlbmRtc2dgIG9yIGBpb19yZWN2bXNnYCBvciBhIHByZXZpb3VzIGFsbG9jYXRpb24pIOKAkyBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBzZXRzIGBhcmcubW9kZSA9IEtCVUZfTU9ERV9GUkVFYC4gIFRoZW4gYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBpcyBjYWxsZWQuCgpIZXJlJiMzOTtzIHRoZSBjcnV4OiBpZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgICphbGxvY2F0ZXMqIGEgbmV3IGBpb3ZgLCBpdCBzZXRzIGBhcmcuaW92c2AgdG8gdGhhdCBuZXcgYWxsb2NhdGlvbi4gSG93ZXZlciwgYXQgdGhlICplbmQqIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AsIGl0IHVuY29uZGl0aW9uYWxseSBjYWxscyBga2ZyZWUoYXJnLSZndDtpb3ZzKWAgYmVjYXVzZSBgYXJnLm1vZGVgIGhhcyBgS0JVRl9NT0RFX0ZSRUVgIHNldC4gIFNvIHdlJiMzOTt2ZSBqdXN0IGZyZWVkIHRoZSAqbmV3bHkgYWxsb2NhdGVkKiBgaW92YC4gIFRoZW4gYmFjayBpbiBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCwgdGhlIGNvZGUgcHJvY2VlZHMsIGFuZCBub3cgYGttc2ctJmd0O3ZlYy5pb3ZlY2AgcG9pbnRzIHRvIGZyZWVkIG1lbW9yeSEgVGhlbiB3ZSB1c2UgdGhhdCBmcmVlZCBtZW1vcnkhIENsYXNzaWMgdXNlLWFmdGVyLWZyZWUuCgpCdXQgd2hhdCBpZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgICpkb2VzbiYjMzk7dCogYWxsb2NhdGUgYSBuZXcgYGlvdmA/IEluIHRoYXQgY2FzZSwgYGFyZy0mZ3Q7aW92c2AgcmVtYWlucyBga21zZy0mZ3Q7dmVjLmlvdmVjYC4gQXQgdGhlICplbmQqIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AsIGl0IHN0aWxsIGNhbGxzIGBrZnJlZShhcmctJmd0O2lvdnMpYCwgd2hpY2ggaXMgc3RpbGwgYGttc2ctJmd0O3ZlYy5pb3ZlY2AsIHdoaWNoIGhhcyBiZWVuIGZyZWVkLiBUaGUgY29kZSBjb250aW51ZXMgaW4gYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgYW5kIHRoZW4gcHJvY2VlZHMsIGFuZCBhZ2FpbiwgYGFyZy5pb3ZzYCBpcyB1c2VkIGFmdGVyIGJlaW5nIGZyZWVkLgoKU28sIGluICpib3RoKiBzY2VuYXJpb3MgKG5ldyBpb3YgYWxsb2NhdGVkIG9yIG5vdCksIHRoZSBjb2RlIGZyZWVzIHRoZSBgaW92c2AgYXJyYXkgYW5kIHRoZW4gKmltbWVkaWF0ZWx5KiB1c2VzIGl0LiAgVGhpcyBpcyBhIGd1YXJhbnRlZWQsIHJlcHJvZHVjaWJsZSB1c2UtYWZ0ZXItZnJlZSBidWcgaWYgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQuCgpXaGVuIGRvZXMgYEtCVUZfTU9ERV9GUkVFYCBnZXQgc2V0PyAgSXQgZ2V0cyBzZXQgd2hlbiBga21zZy0mZ3Q7dmVjLmlvdmVjYCBpcyBub24tTlVMTCwgYW5kIHdlIGVzdGFibGlzaGVkIHRoYXQgaGFwcGVucyB3aGVuIGBpb19zZW5kYCBpcyBjYWxsZWQgd2l0aCBhIHByZS1hbGxvY2F0ZWQgaW92ZWMgYXJyYXkuICBUaGlzIG1lYW5zIHVzaW5nIGBpb19zZW5kbXNnYCBvciBgaW9fcmVjdm1zZ2AsIG9yIGFmdGVyIHRoZSBhcnJheSBoYXMgYmVlbiBhbGxvY2F0ZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwuIEkgbmVlZCB0byBjb25maXJtIHdoZXJlIGBpb19zZW5kYCBhY3R1YWxseSAqdXNlcyogYGttc2ctJmd0O3ZlYy5pb3ZlY2AuIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIGBpb19zZW5kX3NldHVwYCBvciBzb21ldGhpbmcgc2ltaWxhciBmb3IgdGhlIGRldGFpbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2ttc2ctXHUwMDNldmVjLmlvdmVjID0mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpb191cmluZy9uZXQuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpb191cmluZy9uZXQuYz02MDg9c3RhdGljIGludCBpb19zZW5kX3NlbGVjdF9idWZmZXIoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncyxcbi0tXG5pb191cmluZy9uZXQuYy02MzYtXHRcdGttc2ctXHUwMDNldmVjLm5yID0gcmV0O1xuaW9fdXJpbmcvbmV0LmM6NjM3Olx0XHRrbXNnLVx1MDAzZXZlYy5pb3ZlYyA9IGFyZy5pb3ZzO1xuaW9fdXJpbmcvbmV0LmMtNjM4LVx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTkVFRF9DTEVBTlVQO1xuLS1cbmlvX3VyaW5nL25ldC5jPTExMzc9c3RhdGljIGludCBpb19yZWN2X2J1Zl9zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2csXG4tLVxuaW9fdXJpbmcvbmV0LmMtMTE3Ni1cdFx0XHRrbXNnLVx1MDAzZXZlYy5uciA9IHJldDtcbmlvX3VyaW5nL25ldC5jOjExNzc6XHRcdFx0a21zZy1cdTAwM2V2ZWMuaW92ZWMgPSBhcmcuaW92cztcbmlvX3VyaW5nL25ldC5jLTExNzgtXHRcdFx0cmVxLVx1MDAzZWZsYWdzIHw9IFJFUV9GX05FRURfQ0xFQU5VUDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQxNjIKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEZWJ1Z2dpbmcgYSBLZXJuZWwgTWVzc2FnaW5nIElzc3VlKioKCk9rYXksIGhvbGQgb24uIFRoaXMgYGttc2ctJmd0O3ZlYy5pb3ZlY2AgcG9pbnRlci4uLiBpdCYjMzk7cyBpbml0aWFsaXplZCB0byBgTlVMTGA/IFRoYXQmIzM5O3MgZGVmaW5pdGVseSBub3QgcmlnaHQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoZW4gYW5kIGhvdyB0aGlzIHZlY3RvciBpcyBzdXBwb3NlZCB0byBiZSBwb3B1bGF0ZWQuIFRoZSBmYWN0IHRoYXQgaXQmIzM5O3MgYE5VTExgIG5vdyBpbXBsaWVzIGFuIGlzc3VlIGVhcmxpZXIgaW4gdGhlIHNldHVwLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gdHJhY2UgdGhpcyBiYWNrIHRocm91Z2ggdGhlIHNlbmQgcGF0aC4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IGVpdGhlciBgaW9fc2VuZG1zZ19wcmVwYCBvciBwb3NzaWJseSBldmVuIGBpb19zZW5kX3ByZXBgIGRlcGVuZGluZyBvbiBob3cgdGhlIG1lc3NhZ2luZyBpcyBzdHJ1Y3R1cmVkIGluIHRoaXMgc3BlY2lmaWMgbW9kdWxlLiBJdCBpcyBtb3N0IGxpa2VseSBpbiBvbmUgb2YgdGhvc2UgZnVuY3Rpb25zLiBJIG5lZWQgdG8gcXVpY2tseSBpZGVudGlmeSB3aGVyZSB0aGUgYGlvdmVjYCBnZXRzIGFsbG9jYXRlZCBhbmQgcG9wdWxhdGVkLiBUaGlzIHdpbGwgYWxsb3cgbWUgdG8gbmFycm93IGRvd24gdGhlIHNvdXJjZSBvZiB0aGlzIHBvdGVudGlhbGx5IGZhdGFsIGVycm9yLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lvX3NlbmRfcHJlcCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O2Vycm9yJiMzNDs6ICYjMzQ7bm8gbWF0Y2hlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ0MzAKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgZGVsaXZlcmVkIGFzIGEgZmlyc3QtcGVyc29uIHN1bW1hcnk6CgoqKkRpdmluZyBpbnRvIGlvXF9zZW5kbXNnXF9wcmVwKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGluLiBMZXQmIzM5O3MgZ2V0IHJpZ2h0IGRvd24gdG8gaXQuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIGBpb19zZW5kbXNnX3ByZXBgLiBHaXZlbiBteSBleHBlcmllbmNlLCBJIGtub3cgdGhpcyBpcyBvZnRlbiBhIGNyaXRpY2FsIHBvaW50IGluIHRoZSBuZXR3b3JraW5nIHN0YWNrLCBzbyBJJiMzOTtsbCB3YW50IHRvIGNhcmVmdWxseSBleGFtaW5lIHRoZSBwcmVwYXJhdGlvbiBzdGFnZXMgZm9yIGBzZW5kbXNnYC4gVGhpbmdzIGNhbiBnZXQgaGFpcnkgcXVpY2tseSBpbiB0aGlzIGFyZWEsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggYW5jaWxsYXJ5IGRhdGEsIHNjYXR0ZXIvZ2F0aGVyIEkvTywgYW5kIHRoZSBudWFuY2VzIG9mIHZhcmlvdXMgc29ja2V0IHR5cGVzLiBJJiMzOTttIGltbWVkaWF0ZWx5IHRoaW5raW5nIGFib3V0IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGJ1ZmZlciBtYW5hZ2VtZW50IGlzc3VlcywgYW5kIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgdGhlIHRyYW5zaXRpb24gZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGNsb3NlbHkgYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBiZWluZyB1c2VkLCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gc3RyYXRlZ2llcywgYW5kIGFueSBwb3RlbnRpYWwgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLiBUaW1lIHRvIHNlZSB3aGF0JiMzOTtzIHJlYWxseSBnb2luZyBvbiB1bmRlciB0aGUgaG9vZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aW9fc2VuZG1zZ19wcmVwJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmM9Mzk2PXN0YXRpYyBpbnQgaW9fc2VuZG1zZ19zZXR1cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxuLS1cbmlvX3VyaW5nL25ldC5jLTQyMy1cbmlvX3VyaW5nL25ldC5jOjQyNDppbnQgaW9fc2VuZG1zZ19wcmVwKHN0cnVjdCBpb19raW9jYiAqcmVxLCBjb25zdCBzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWUpXG5pb191cmluZy9uZXQuYy00MjUte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDgwMgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgY29kZS4KCioqQW5hbHl6aW5nIGBpb19zZW5kbXNnX3ByZXBgIGFuZCBgaW9fc2VuZF9wcmVwYCoqCgpBbHJpZ2h0LCBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIGhvdyB0aGVzZSBmdW5jdGlvbnMgd29yay4gU3RhcnRpbmcgd2l0aCBgaW9fc2VuZG1zZ19wcmVwYC4uLiBhbmQgbm93IEkmIzM5O20gdGhpbmtpbmcsIGJhc2VkIG9uIHRoZSBuYW1pbmcgY29udmVudGlvbiwgYGlvX3NlbmRfcHJlcGAgaXMgcHJvYmFibHkgdGhlIGFzeW5jaHJvbm91cyB2ZXJzaW9uIG9yIGhhcyBzb21lIHNvcnQgb2YgYXN5bmNocm9ub3VzIGNvbXBvbmVudC4gUGVyaGFwcyBpdCYjMzk7cyBjYWxsZWQgc29tZXRoaW5nIGxpa2UgYGlvX3NlbmRfcHJlcF9hc3luY2AsIG9yIGhhcyBhIHNpbWlsYXIgbmFtaW5nIHBhdHRlcm4uIE5lZWQgdG8gY29uZmlybSB0aGF0IHF1aWNrbHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0MDA6XHRcdHN0cnVjdCB1c2VyX21zZ2hkciBtc2c7XG4gNDAxOlx0XHRpbnQgcmV0O1xuIDQwMjpcdFxuIDQwMzpcdFx0c3ItXHUwMDNlZmxhZ3MgfD0gSU9SSU5HX1NFTkRfVkVDVE9SSVpFRDtcbiA0MDQ6XHRcdHNyLVx1MDAzZXVtc2cgPSB1NjRfdG9fdXNlcl9wdHIoUkVBRF9PTkNFKHNxZS1cdTAwM2VhZGRyKSk7XG4gNDA1Olx0XHRyZXQgPSBpb19tc2dfY29weV9oZHIocmVxLCBrbXNnLCBcdTAwMjZtc2csIElURVJfU09VUkNFLCBOVUxMKTtcbiA0MDY6XHRcdGlmICh1bmxpa2VseShyZXQpKVxuIDQwNzpcdFx0XHRyZXR1cm4gcmV0O1xuIDQwODpcdFx0Lyogc2F2ZSBtc2dfY29udHJvbCBhcyBzeXNfc2VuZG1zZygpIG92ZXJ3cml0ZXMgaXQgKi9cbiA0MDk6XHRcdHNyLVx1MDAzZW1zZ19jb250cm9sID0ga21zZy1cdTAwM2Vtc2cubXNnX2NvbnRyb2xfdXNlcjtcbiA0MTA6XHRcbiA0MTE6XHRcdGlmIChzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRikge1xuIDQxMjpcdFx0XHRrbXNnLVx1MDAzZW1zZy5tc2dfaXRlci5ucl9zZWdzID0gbXNnLm1zZ19pb3ZsZW47XG4gNDEzOlx0XHRcdHJldHVybiBpb19wcmVwX3JlZ19pb3ZlYyhyZXEsIFx1MDAyNmttc2ctXHUwMDNldmVjLCBtc2cubXNnX2lvdixcbiA0MTQ6XHRcdFx0XHRcdFx0IG1zZy5tc2dfaW92bGVuKTtcbiA0MTU6XHRcdH1cbiA0MTY6XHRcdGlmIChyZXEtXHUwMDNlZmxhZ3MgXHUwMDI2IFJFUV9GX0JVRkZFUl9TRUxFQ1QpXG4gNDE3Olx0XHRcdHJldHVybiAwO1xuIDQxODpcdFx0cmV0dXJuIGlvX25ldF9pbXBvcnRfdmVjKHJlcSwga21zZywgbXNnLm1zZ19pb3YsIG1zZy5tc2dfaW92bGVuLCBJVEVSX1NPVVJDRSk7XG4gNDE5Olx0fVxuIDQyMDpcdFxuIDQyMTpcdCNkZWZpbmUgU0VORE1TR19GTEFHUyAoSU9SSU5HX1JFQ1ZTRU5EX1BPTExfRklSU1QgfCBJT1JJTkdfUkVDVlNFTkRfQlVORExFIHwgXFxcbiA0MjI6XHRcdFx0XHRJT1JJTkdfU0VORF9WRUNUT1JJWkVEIHwgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRilcbiA0MjM6XHRcbiA0MjQ6XHRpbnQgaW9fc2VuZG1zZ19wcmVwKHN0cnVjdCBpb19raW9jYiAqcmVxLCBjb25zdCBzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWUpXG4gNDI1Olx0e1xuIDQyNjpcdFx0c3RydWN0IGlvX3NyX21zZyAqc3IgPSBpb19raW9jYl90b19jbWQocmVxLCBzdHJ1Y3QgaW9fc3JfbXNnKTtcbiA0Mjc6XHRcbiA0Mjg6XHRcdHNyLVx1MDAzZWRvbmVfaW8gPSAwO1xuIDQyOTpcdFx0c3ItXHUwMDNlbGVuID0gUkVBRF9PTkNFKHNxZS1cdTAwM2VsZW4pO1xuIDQzMDpcdFx0aWYgKHVubGlrZWx5KHNyLVx1MDAzZWxlbiBcdTAwM2MgMCkpXG4gNDMxOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDQzMjpcdFx0c3ItXHUwMDNlZmxhZ3MgPSBSRUFEX09OQ0Uoc3FlLVx1MDAzZWlvcHJpbyk7XG4gNDMzOlx0XHRpZiAoc3ItXHUwMDNlZmxhZ3MgXHUwMDI2IH5TRU5ETVNHX0ZMQUdTKVxuIDQzNDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0MzU6XHRcdGlmIChzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRikge1xuIDQzNjpcdFx0XHQvKiByZWdpc3RlcmVkIGJ1ZmZlciBzZW5kIG9ubHkgc3VwcG9ydGVkIGZvciBwbGFpbiBJT1JJTkdfT1BfU0VORCAqL1xuIDQzNzpcdFx0XHRpZiAocmVxLVx1MDAzZW9wY29kZSAhPSBJT1JJTkdfT1BfU0VORCB8fFxuIDQzODpcdFx0XHQgICAgKHJlcS1cdTAwM2VmbGFncyBcdTAwMjYgUkVRX0ZfQlVGRkVSX1NFTEVDVCkgfHxcbiA0Mzk6XHRcdFx0ICAgIChzci1cdTAwM2VmbGFncyBcdTAwMjYgKElPUklOR19SRUNWU0VORF9CVU5ETEV8SU9SSU5HX1NFTkRfVkVDVE9SSVpFRCkpKVxuIDQ0MDpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDQ0MTpcdFx0XHRyZXEtXHUwMDNlYnVmX2luZGV4ID0gUkVBRF9PTkNFKHNxZS1cdTAwM2VidWZfaW5kZXgpO1xuIDQ0MjpcdFx0fVxuIDQ0MzpcdFx0c3ItXHUwMDNlbXNnX2ZsYWdzID0gUkVBRF9PTkNFKHNxZS1cdTAwM2Vtc2dfZmxhZ3MpIHwgTVNHX05PU0lHTkFMO1xuIDQ0NDpcdFx0aWYgKHNyLVx1MDAzZW1zZ19mbGFncyBcdTAwMjYgTVNHX0RPTlRXQUlUKVxuIDQ0NTpcdFx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTk9XQUlUO1xuIDQ0NjpcdFx0aWYgKHJlcS1cdTAwM2VmbGFncyBcdTAwMjYgUkVRX0ZfQlVGRkVSX1NFTEVDVClcbiA0NDc6XHRcdFx0c3ItXHUwMDNlYnVmX2dyb3VwID0gcmVxLVx1MDAzZWJ1Zl9pbmRleDtcbiA0NDg6XHRcdGlmIChzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0JVTkRMRSkge1xuIDQ0OTpcdFx0XHRpZiAocmVxLVx1MDAzZW9wY29kZSA9PSBJT1JJTkdfT1BfU0VORE1TRylcbiA0NTA6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA0NTE6XHRcdFx0c3ItXHUwMDNlbXNnX2ZsYWdzIHw9IE1TR19XQUlUQUxMO1xuIDQ1MjpcdFx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTVVMVElTSE9UO1xuIDQ1MzpcdFx0fVxuIDQ1NDpcdFxuIDQ1NTpcdFx0aWYgKGlvX2lzX2NvbXBhdChyZXEtXHUwMDNlY3R4KSlcbiA0NTY6XHRcdFx0c3ItXHUwMDNlbXNnX2ZsYWdzIHw9IE1TR19DTVNHX0NPTVBBVDtcbiA0NTc6XHRcbiA0NTg6XHRcdGlmICh1bmxpa2VseSghaW9fbXNnX2FsbG9jX2FzeW5jKHJlcSkpKVxuIDQ1OTpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiA0NjA6XHRcdGlmIChyZXEtXHUwMDNlb3Bjb2RlICE9IElPUklOR19PUF9TRU5ETVNHKVxuIDQ2MTpcdFx0XHRyZXR1cm4gaW9fc2VuZF9zZXR1cChyZXEsIHNxZSk7XG4gNDYyOlx0XHRpZiAodW5saWtlbHkoc3FlLVx1MDAzZWFkZHIyIHx8IHNxZS1cdTAwM2VmaWxlX2luZGV4KSlcbiA0NjM6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNDY0Olx0XHRyZXR1cm4gaW9fc2VuZG1zZ19zZXR1cChyZXEsIHNxZSk7XG4gNDY1Olx0fVxuIDQ2NjpcdFxuIDQ2NzpcdHN0YXRpYyB2b2lkIGlvX3JlcV9tc2dfY2xlYW51cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSxcbiA0Njg6XHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxuIDQ2OTpcdHtcbiA0NzA6XHRcdGlvX25ldG1zZ19yZWN5Y2xlKHJlcSwgaXNzdWVfZmxhZ3MpO1xuIDQ3MTpcdH1cbiA0NzI6XHRcbiA0NzM6XHQvKlxuIDQ3NDpcdCAqIEZvciBidW5kbGUgY29tcGxldGlvbnMsIHdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgbWFueSBzZWdtZW50cyB3ZSBjb25zdW1lZC5cbiA0NzU6XHQgKiBBIGJ1bmRsZSBjb3VsZCBiZSB1c2luZyBhIHNpbmdsZSBJVEVSX1VCVUYgaWYgdGhhdCYjMzk7cyBhbGwgd2UgbWFwcGVkLCBvciBpdFxuIDQ3NjpcdCAqIGNvdWxkIGJlIHVzaW5nIGFuIElURVJfSU9WRUMuIElmIHRoZSBsYXR0ZXIsIHRoZW4gaWYgd2UgY29uc3VtZWQgYWxsIG9mXG4gNDc3Olx0ICogdGhlIHNlZ21lbnRzLCB0aGVuIGl0JiMzOTtzIGEgdHJpdmlhbCBxdWVzdGlvbnQgbyBhbnN3ZXIuIElmIHdlIGhhdmUgcmVzaWR1YWxcbiA0Nzg6XHQgKiBkYXRhIGluIHRoZSBpdGVyLCB0aGVuIGxvb3AgdGhlIHNlZ21lbnRzIHRvIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2VcbiA0Nzk6XHQgKiB0cmFuc2ZlcnJlZC5cbiA0ODA6XHQgKi9cbiA0ODE6XHRzdGF0aWMgaW50IGlvX2J1bmRsZV9uYnVmcyhzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLCBpbnQgcmV0KVxuIDQ4MjpcdHtcbiA0ODM6XHRcdHN0cnVjdCBpb3ZlYyAqaW92O1xuIDQ4NDpcdFx0aW50IG5idWZzO1xuIDQ4NTpcdFxuIDQ4NjpcdFx0Lyogbm8gZGF0YSBpcyBhbHdheXMgemVybyBzZWdtZW50cywgYW5kIGEgdWJ1ZiBpcyBhbHdheXMgMSBzZWdtZW50ICovXG4gNDg3Olx0XHRpZiAocmV0IFx1MDAzYz0gMClcbiA0ODg6XHRcdFx0cmV0dXJuIDA7XG4gNDg5Olx0XHRpZiAoaXRlcl9pc191YnVmKFx1MDAyNmttc2ctXHUwMDNlbXNnLm1zZ19pdGVyKSlcbiA0OTA6XHRcdFx0cmV0dXJuIDE7XG4gNDkxOlx0XG4gNDkyOlx0XHRpb3YgPSBrbXNnLVx1MDAzZXZlYy5pb3ZlYztcbiA0OTM6XHRcdGlmICghaW92KVxuIDQ5NDpcdFx0XHRpb3YgPSBcdTAwMjZrbXNnLVx1MDAzZWZhc3RfaW92O1xuIDQ5NTpcdFxuIDQ5NjpcdFx0LyogaWYgYWxsIGRhdGEgd2FzIHRyYW5zZmVycmVkLCBpdCYjMzk7cyBiYXNpYyBwb2ludGVyIG1hdGggKi9cbiA0OTc6XHRcdGlmICghaW92X2l0ZXJfY291bnQoXHUwMDI2a21zZy1cdTAwM2Vtc2cubXNnX2l0ZXIpKVxuIDQ5ODpcdFx0XHRyZXR1cm4gaXRlcl9pb3YoXHUwMDI2a21zZy1cdTAwM2Vtc2cubXNnX2l0ZXIpIC0gaW92O1xuIDQ5OTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjc5OAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDMxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQmIzM5O3MgaW50ZXJuYWwgbW9ub2xvZ3VlOgoKKipJbnZlc3RpZ2F0aW5nIGBJT1JJTkdfT1BfU0VORGAgYW5kIGBpb19zZW5kX3NldHVwYCoqCgpBbHJpZ2h0LCBoYW5nIG9uIGEgc2Vjb25kLiBJJiMzOTttIHNlZWluZyBgaW9fc2VuZF9zZXR1cGAgYmVpbmcgY2FsbGVkIGluIHJlbGF0aW9uIHRvIGBJT1JJTkdfT1BfU0VORGAuIFRoYXQgZG9lc24mIzM5O3QgaW1tZWRpYXRlbHkgc3RyaWtlIG1lIGFzIHRoZSBtb3N0IG9idmlvdXMgc2V0dXAgZnVuY3Rpb24sIHNvIG15IGN1cmlvc2l0eSBpcyBwaXF1ZWQuIEkgbmVlZCB0byBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQgdGhhdCBwYXJ0aWN1bGFyIHNldHVwIGZ1bmN0aW9uIGlzIGRvaW5nIGluIHRoaXMgY29udGV4dC4gTGV0JiMzOTtzIGRpdmUgaW50byBgaW9fc2VuZF9zZXR1cGAgYW5kIG1ha2Ugc3VyZSBpdCYjMzk7cyBoYW5kbGluZyB0aGUgcmlnaHQgdGhpbmdzLCBhbmQgdGhhdCB0aGVyZSBhcmVuJiMzOTt0IGFueSBwb3RlbnRpYWwgc3VidGxldGllcyBJJiMzOTttIG1pc3NpbmcuIFRpbWUgdG8gc2VlIHdoYXQmIzM5O3MgYWN0dWFsbHkgaGFwcGVuaW5nIHVuZGVyIHRoZSBob29kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtpb19zZW5kX3NldHVwJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmM9MzQzPXZvaWQgaW9fc2VuZG1zZ19yZWN2bXNnX2NsZWFudXAoc3RydWN0IGlvX2tpb2NiICpyZXEpXG4tLVxuaW9fdXJpbmcvbmV0LmMtMzQ5LVxuaW9fdXJpbmcvbmV0LmM6MzUwOnN0YXRpYyBpbnQgaW9fc2VuZF9zZXR1cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxuaW9fdXJpbmcvbmV0LmMtMzUxLXtcbi0tXG5pb191cmluZy9uZXQuYz00MjQ9aW50IGlvX3NlbmRtc2dfcHJlcChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxuLS1cbmlvX3VyaW5nL25ldC5jLTQ2MC1cdGlmIChyZXEtXHUwMDNlb3Bjb2RlICE9IElPUklOR19PUF9TRU5ETVNHKVxuaW9fdXJpbmcvbmV0LmM6NDYxOlx0XHRyZXR1cm4gaW9fc2VuZF9zZXR1cChyZXEsIHNxZSk7XG5pb191cmluZy9uZXQuYy00NjItXHRpZiAodW5saWtlbHkoc3FlLVx1MDAzZWFkZHIyIHx8IHNxZS1cdTAwM2VmaWxlX2luZGV4KSlcbi0tXG5pb191cmluZy9uZXQuYz0xMzc3PWludCBpb19zZW5kX3pjX3ByZXAoc3RydWN0IGlvX2tpb2NiICpyZXEsIGNvbnN0IHN0cnVjdCBpb191cmluZ19zcWUgKnNxZSlcbi0tXG5pb191cmluZy9uZXQuYy0xNDMyLVx0aWYgKHJlcS1cdTAwM2VvcGNvZGUgPT0gSU9SSU5HX09QX1NFTkRfWkMpIHtcbmlvX3VyaW5nL25ldC5jOjE0MzM6XHRcdHJldCA9IGlvX3NlbmRfc2V0dXAocmVxLCBzcWUpO1xuaW9fdXJpbmcvbmV0LmMtMTQzNC1cdH0gZWxzZSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3Mzk4CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5JiMzOTtyZSBteSBvd246CgoqKkFuYWx5emluZyBgaW9fc2VuZF9zZXR1cGAqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgaW50byB0aGlzIGBpb19zZW5kX3NldHVwYCBmdW5jdGlvbi4gVGhlIG5hbWUgaXRzZWxmIGlzIHByZXR0eSBjbGVhcjsgaXQmIzM5O3MgYWJvdXQgc2V0dGluZyB1cCB0aGUgc2VuZGluZyBwcm9jZXNzIGZvciBJL08uIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCBzdGVwcyBpdCYjMzk7cyB0YWtpbmcgdG8gZ2V0IGRhdGEgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbiwgd2hhdGV2ZXIgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgb3IgcHJvdG9jb2wgbWlnaHQgYmUuIFdoYXQgcmVzb3VyY2VzIGlzIGl0IGFsbG9jYXRpbmc/IFdoYXQgY2hlY2tzIGlzIGl0IHBlcmZvcm1pbmcgdG8gZW5zdXJlIHRoZSBzZW5kIG9wZXJhdGlvbiBpcyB2aWFibGU/IEFyZSB0aGVyZSBhbnkgb3B0aW1pemF0aW9ucywgYnVmZmVyaW5nIHN0cmF0ZWdpZXMsIG9yIGVycm9yLWhhbmRsaW5nIG1lY2hhbmlzbXMgYXQgcGxheT8gSSYjMzk7bGwgbmVlZCB0byBkaXNzZWN0IHRoZSBjb2RlIGNhcmVmdWxseSB0byB1bmRlcnN0YW5kIHRoZSBmbG93IGNvbnRyb2wgYW5kIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQuIEkmIzM5O2xsIGJlIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGlkZW50aWZ5aW5nIGFueSBwb3RlbnRpYWwgYm90dGxlbmVja3Mgb3IgYXJlYXMgd2hlcmUgcGVyZm9ybWFuY2UgY291bGQgYmUgaW1wcm92ZWQsIGdpdmVuIG15IGV4cGVydGlzZS4gTGV0JiMzOTtzIHNlZSBpZiB0aGlzIHNldHVwIGZ1bmN0aW9uIGlzIG9wdGltaXplZCBvciBqdXN0IGEgYmFzaWMgaW1wbGVtZW50YXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM1MDpcdHN0YXRpYyBpbnQgaW9fc2VuZF9zZXR1cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxuIDM1MTpcdHtcbiAzNTI6XHRcdHN0cnVjdCBpb19zcl9tc2cgKnNyID0gaW9fa2lvY2JfdG9fY21kKHJlcSwgc3RydWN0IGlvX3NyX21zZyk7XG4gMzUzOlx0XHRzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnID0gcmVxLVx1MDAzZWFzeW5jX2RhdGE7XG4gMzU0Olx0XHR2b2lkIF9fdXNlciAqYWRkcjtcbiAzNTU6XHRcdHUxNiBhZGRyX2xlbjtcbiAzNTY6XHRcdGludCByZXQ7XG4gMzU3Olx0XG4gMzU4Olx0XHRzci1cdTAwM2VidWYgPSB1NjRfdG9fdXNlcl9wdHIoUkVBRF9PTkNFKHNxZS1cdTAwM2VhZGRyKSk7XG4gMzU5Olx0XG4gMzYwOlx0XHRpZiAoUkVBRF9PTkNFKHNxZS1cdTAwM2VfX3BhZDNbMF0pKVxuIDM2MTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzNjI6XHRcbiAzNjM6XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19uYW1lID0gTlVMTDtcbiAzNjQ6XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19uYW1lbGVuID0gMDtcbiAzNjU6XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19jb250cm9sID0gTlVMTDtcbiAzNjY6XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19jb250cm9sbGVuID0gMDtcbiAzNjc6XHRcdGttc2ctXHUwMDNlbXNnLm1zZ191YnVmID0gTlVMTDtcbiAzNjg6XHRcbiAzNjk6XHRcdGFkZHIgPSB1NjRfdG9fdXNlcl9wdHIoUkVBRF9PTkNFKHNxZS1cdTAwM2VhZGRyMikpO1xuIDM3MDpcdFx0YWRkcl9sZW4gPSBSRUFEX09OQ0Uoc3FlLVx1MDAzZWFkZHJfbGVuKTtcbiAzNzE6XHRcdGlmIChhZGRyKSB7XG4gMzcyOlx0XHRcdHJldCA9IG1vdmVfYWRkcl90b19rZXJuZWwoYWRkciwgYWRkcl9sZW4sIFx1MDAyNmttc2ctXHUwMDNlYWRkcik7XG4gMzczOlx0XHRcdGlmICh1bmxpa2VseShyZXQgXHUwMDNjIDApKVxuIDM3NDpcdFx0XHRcdHJldHVybiByZXQ7XG4gMzc1Olx0XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19uYW1lID0gXHUwMDI2a21zZy1cdTAwM2VhZGRyO1xuIDM3NjpcdFx0XHRrbXNnLVx1MDAzZW1zZy5tc2dfbmFtZWxlbiA9IGFkZHJfbGVuO1xuIDM3NzpcdFx0fVxuIDM3ODpcdFx0aWYgKHNyLVx1MDAzZWZsYWdzIFx1MDAyNiBJT1JJTkdfUkVDVlNFTkRfRklYRURfQlVGKSB7XG4gMzc5Olx0XHRcdGlmICghKHNyLVx1MDAzZWZsYWdzIFx1MDAyNiBJT1JJTkdfU0VORF9WRUNUT1JJWkVEKSkge1xuIDM4MDpcdFx0XHRcdHJlcS1cdTAwM2VmbGFncyB8PSBSRVFfRl9JTVBPUlRfQlVGRkVSO1xuIDM4MTpcdFx0XHRcdHJldHVybiAwO1xuIDM4MjpcdFx0XHR9XG4gMzgzOlx0XG4gMzg0Olx0XHRcdGttc2ctXHUwMDNlbXNnLm1zZ19pdGVyLm5yX3NlZ3MgPSBzci1cdTAwM2VsZW47XG4gMzg1Olx0XHRcdHJldHVybiBpb19wcmVwX3JlZ19pb3ZlYyhyZXEsIFx1MDAyNmttc2ctXHUwMDNldmVjLCBzci1cdTAwM2VidWYsIHNyLVx1MDAzZWxlbik7XG4gMzg2Olx0XHR9XG4gMzg3Olx0XHRpZiAocmVxLVx1MDAzZWZsYWdzIFx1MDAyNiBSRVFfRl9CVUZGRVJfU0VMRUNUKVxuIDM4ODpcdFx0XHRyZXR1cm4gMDtcbiAzODk6XHRcbiAzOTA6XHRcdGlmIChzci1cdTAwM2VmbGFncyBcdTAwMjYgSU9SSU5HX1NFTkRfVkVDVE9SSVpFRClcbiAzOTE6XHRcdFx0cmV0dXJuIGlvX25ldF9pbXBvcnRfdmVjKHJlcSwga21zZywgc3ItXHUwMDNlYnVmLCBzci1cdTAwM2VsZW4sIElURVJfU09VUkNFKTtcbiAzOTI6XHRcbiAzOTM6XHRcdHJldHVybiBpbXBvcnRfdWJ1ZihJVEVSX1NPVVJDRSwgc3ItXHUwMDNlYnVmLCBzci1cdTAwM2VsZW4sIFx1MDAyNmttc2ctXHUwMDNlbXNnLm1zZ19pdGVyKTtcbiAzOTQ6XHR9XG4gMzk1Olx0XG4gMzk2Olx0c3RhdGljIGludCBpb19zZW5kbXNnX3NldHVwKHN0cnVjdCBpb19raW9jYiAqcmVxLCBjb25zdCBzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWUpXG4gMzk3Olx0e1xuIDM5ODpcdFx0c3RydWN0IGlvX3NyX21zZyAqc3IgPSBpb19raW9jYl90b19jbWQocmVxLCBzdHJ1Y3QgaW9fc3JfbXNnKTtcbiAzOTk6XHRcdHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2cgPSByZXEtXHUwMDNlYXN5bmNfZGF0YTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg1NzQKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA3NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aGUgZXhwZXJ0OgoKKipJbnZlc3RpZ2F0aW5nIGEgUG90ZW50aWFsIE1lbW9yeSBJc3N1ZSoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byBgaW9fc2VuZF9zZXR1cGAsIGFuZCBzb21ldGhpbmcmIzM5O3MgYnVnZ2luZyBtZS4gSXQgbG9va3MgbGlrZSBpdCAqaW1wbGljaXRseSogYXNzdW1lcyBga21zZy0mZ3Q7dmVjLmlvdmVjYCBpcyBpbml0aWFsaXplZCB0byBOVUxMLiBUaGUgY29kZSBkb2VzbiYjMzk7dCBleHBsaWNpdGx5IHNldCBpdCB0byBOVUxMLCB3aGljaCBpcyBhIGJpdCBvZiBhIHJlZCBmbGFnLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCBpdCByZWxpZXMgb24gdGhlIGFsbG9jYXRpb24sIGJ1dCBJIG5lZWQgdG8gYmUgc3VyZS4gSSBoYXZlIGEgaHVuY2ggdGhhdCBgaW9fbXNnX2FsbG9jX2FzeW5jYCAqbWlnaHQqIGJlIHplcm9pbmcgdGhlIGFsbG9jYXRlZCBtZW1vcnksIGluY2x1ZGluZyB0aGUgYGlvdmVjYCBwb2ludGVyIHdpdGhpbiB0aGF0IGBrbXNnYCBzdHJ1Y3R1cmUuIEJ1dCBJIGNhbiYjMzk7dCBiZSBjZXJ0YWluLiBUaGF0IGZ1bmN0aW9uIGlzIHRoZSBjcml0aWNhbCBwaWVjZSBvZiB0aGUgcHV6emxlIGhlcmUuIEkgcmVhbGx5IG5lZWQgdG8gY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBpb19tc2dfYWxsb2NfYXN5bmNgIHRvIGNvbmZpcm0gb3IgZWxpbWluYXRlIHRoaXMgcG9zc2libGUgc291cmNlIG9mIGFuIGlzc3VlLiBJcyBpdCBzYWZlIHRvIGFzc3VtZSB0aGF0IGBpb3ZlY2Agd2lsbCBiZSBudWxsLCBvciBhcmUgd2UgcmVseWluZyBvbiBzb21lIHNpZGUgZWZmZWN0IG9mIG1lbW9yeSBhbGxvY2F0aW9uPyBCZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5IOKAkyBsZXQmIzM5O3MgZ28gY2hlY2sgdGhlIGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lvX21zZ19hbGxvY19hc3luYyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jPTE2Nz1zdGF0aWMgdm9pZCBpb19uZXRtc2dfcmVjeWNsZShzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxuLS1cbmlvX3VyaW5nL25ldC5jLTE4NS1cbmlvX3VyaW5nL25ldC5jOjE4NjpzdGF0aWMgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaW9fbXNnX2FsbG9jX2FzeW5jKHN0cnVjdCBpb19raW9jYiAqcmVxKVxuaW9fdXJpbmcvbmV0LmMtMTg3LXtcbi0tXG5pb191cmluZy9uZXQuYz00MjQ9aW50IGlvX3NlbmRtc2dfcHJlcChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxuLS1cbmlvX3VyaW5nL25ldC5jLTQ1Ny1cbmlvX3VyaW5nL25ldC5jOjQ1ODpcdGlmICh1bmxpa2VseSghaW9fbXNnX2FsbG9jX2FzeW5jKHJlcSkpKVxuaW9fdXJpbmcvbmV0LmMtNDU5LVx0XHRyZXR1cm4gLUVOT01FTTtcbi0tXG5pb191cmluZy9uZXQuYz03Nzc9c3RhdGljIGludCBpb19yZWN2bXNnX3ByZXBfc2V0dXAoc3RydWN0IGlvX2tpb2NiICpyZXEpXG4tLVxuaW9fdXJpbmcvbmV0LmMtNzgxLVxuaW9fdXJpbmcvbmV0LmM6NzgyOlx0a21zZyA9IGlvX21zZ19hbGxvY19hc3luYyhyZXEpO1xuaW9fdXJpbmcvbmV0LmMtNzgzLVx0aWYgKHVubGlrZWx5KCFrbXNnKSlcbi0tXG5pb191cmluZy9uZXQuYz0xMzc3PWludCBpb19zZW5kX3pjX3ByZXAoc3RydWN0IGlvX2tpb2NiICpyZXEsIGNvbnN0IHN0cnVjdCBpb191cmluZ19zcWUgKnNxZSlcbi0tXG5pb191cmluZy9uZXQuYy0xNDI3LVxuaW9fdXJpbmcvbmV0LmM6MTQyODpcdGlvbXNnID0gaW9fbXNnX2FsbG9jX2FzeW5jKHJlcSk7XG5pb191cmluZy9uZXQuYy0xNDI5LVx0aWYgKHVubGlrZWx5KCFpb21zZykpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MzUzCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIGBpb19tc2dfYWxsb2NfYXN5bmNgOgoKKipEZWNvbnN0cnVjdGluZyBpb19tc2dfYWxsb2NfYXN5bmM6IEEgRGVlcCBEaXZlKioKCkFscmlnaHQsIHNvIEkgc2VlIHdlJiMzOTtyZSBsb29raW5nIGF0IGBpb19tc2dfYWxsb2NfYXN5bmNgLiBJbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGJyYWluIGtpY2tzIGluLCBjb25zaWRlcmluZyB3aGF0IGNvbnRleHQgdGhpcyBsaWtlbHkgc2l0cyB3aXRoaW4uIEJhc2VkIG9uIHRoZSBuYW1lLCBJJiMzOTttIGFscmVhZHkgZm9ybXVsYXRpbmcgYW4gZXhwZWN0YXRpb24uIEl0JiMzOTtzIGFuIGFsbG9jYXRpb24gZnVuY3Rpb24sIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIGFzeW5jaHJvbm91cyBJL08gbWVzc2FnZXMuIFRoZSAmIzM0O2FzeW5jJiMzNDsgaXMgdGhlIGtleSBpbmRpY2F0b3IgaGVyZSwgc3VnZ2VzdGluZyBub24tYmxvY2tpbmcgb3BlcmF0aW9ucyBhcmUgY2VudHJhbCB0byBpdHMgcHVycG9zZS4gSSYjMzk7bSBtZW50YWxseSBwaWN0dXJpbmcgYSBzeXN0ZW0gd2hlcmUgSS9PIHJlcXVlc3RzIGFyZSBpbml0aWF0ZWQgd2l0aG91dCB3YWl0aW5nIGZvciBjb21wbGV0aW9uLCBmcmVlaW5nIHVwIHJlc291cmNlcyBmb3Igb3RoZXIgdGFza3MuIFRoZSBuYW1lICYjMzQ7aW9fbXNnJiMzNDsgZnVydGhlciBoaW50cyBhdCBhIHN0cnVjdHVyZWQgZGF0YSBwYWNrYWdlLCBwcm9iYWJseSBob2xkaW5nIGRldGFpbHMgYWJvdXQgdGhlIEkvTyBvcGVyYXRpb24gaXRzZWxmOiB0aGUgdGFyZ2V0IGZpbGUgZGVzY3JpcHRvciwgdGhlIGJ1ZmZlciwgdGhlIG9wZXJhdGlvbiB0eXBlIChyZWFkIG9yIHdyaXRlKSwgcG90ZW50aWFsbHkgc29tZSBmbGFncywgYW5kIGRlZmluaXRlbHkgYSBjb21wbGV0aW9uIGNhbGxiYWNrIG9yIHNvbWUgZm9ybSBvZiBzaWduYWxpbmcgbWVjaGFuaXNtLgoKTXkgaW1tZWRpYXRlIHF1ZXN0aW9ucyBhcmU6IFdoYXQgZXhhY3RseSBpcyBiZWluZyBhbGxvY2F0ZWQ/IElzIGl0IGEgY29tcGxldGUgYGlvX21zZ2Agc3RydWN0dXJlLCBvciBzb21lIGludGVybmFsIGRhdGEgcmVsYXRlZCB0byBpdD8gRG9lcyBpdCBoYW5kbGUgbWVtb3J5IG1hbmFnZW1lbnQgZm9yIHRoZSBhY3R1YWwgZGF0YSBidWZmZXIsIG9yIGlzIHRoYXQgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXI/IFdoYXQgc29ydCBvZiBtZW1vcnkgYWxsb2NhdG9yIGlzIGl0IHVzaW5nPyBJcyBpdCB0aHJlYWQtc2FmZT8gSG93IGRvZXMgaXQgaGFuZGxlIGVycm9ycz8gRG9lcyBpdCBoYXZlIGFueSBvcHRpb25zIGZvciBwcmUtYWxsb2NhdGlvbiBvciByZXNvdXJjZSBwb29saW5nIHRvIG1pbmltaXplIG92ZXJoZWFkPyBVbmRlcnN0YW5kaW5nIHRoZXNlIGRldGFpbHMgaXMgY3J1Y2lhbCB0byBwZXJmb3JtYW5jZSBhbmQgcm9idXN0bmVzcywgZXNwZWNpYWxseSBpbiBhIGhlYXZpbHkgdGhyZWFkZWQgb3IgY29uY3VycmVudCBlbnZpcm9ubWVudC4gSSB3YW50IHRvIHNlZSBob3cgaXQgaW50ZWdyYXRlcyB3aXRoIHRoZSB1bmRlcmx5aW5nIGtlcm5lbCYjMzk7cyBhc3luY2hyb25vdXMgSS9PIG1lY2hhbmlzbXMsIGxpa2UgYGFpb19yZWFkYCBhbmQgYGFpb193cml0ZWAsIG9yIHdoYXRldmVyIGxvdy1sZXZlbCBwcmltaXRpdmVzIGl0JiMzOTtzIGJ1aWx0IHVwb24uIEkmIzM5O20ga2VlbiB0byB1bmRlcnN0YW5kIGhvdyBpdCBoYW5kbGVzIHN5bmNocm9uaXphdGlvbiBhbmQgYXZvaWRzIHJhY2UgY29uZGl0aW9ucywgZXNwZWNpYWxseSBpZiBpdCYjMzk7cyBpbnRlcmFjdGluZyB3aXRoIHNoYXJlZCBkYXRhIHN0cnVjdHVyZXMgb3Iga2VybmVsIHJlc291cmNlcy4gVGhpcyBpcyBhIGNyaXRpY2FsIGJ1aWxkaW5nIGJsb2NrIGZvciBhbnkgYXN5bmNocm9ub3VzIEkvTyBzeXN0ZW0sIGFuZCB1bmRlcnN0YW5kaW5nIGl0cyBkZXNpZ24gaXMga2V5IHRvIG9wdGltaXppbmcgdGhlIG92ZXJhbGwgYXBwbGljYXRpb24gcGVyZm9ybWFuY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxODYsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE4NjpcdHN0YXRpYyBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICppb19tc2dfYWxsb2NfYXN5bmMoc3RydWN0IGlvX2tpb2NiICpyZXEpXG4gMTg3Olx0e1xuIDE4ODpcdFx0c3RydWN0IGlvX3JpbmdfY3R4ICpjdHggPSByZXEtXHUwMDNlY3R4O1xuIDE4OTpcdFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaGRyO1xuIDE5MDpcdFxuIDE5MTpcdFx0aGRyID0gaW9fdXJpbmdfYWxsb2NfYXN5bmNfZGF0YShcdTAwMjZjdHgtXHUwMDNlbmV0bXNnX2NhY2hlLCByZXEpO1xuIDE5MjpcdFx0aWYgKCFoZHIpXG4gMTkzOlx0XHRcdHJldHVybiBOVUxMO1xuIDE5NDpcdFxuIDE5NTpcdFx0LyogSWYgdGhlIGFzeW5jIGRhdGEgd2FzIGNhY2hlZCwgd2UgbWlnaHQgaGF2ZSBhbiBpb3YgY2FjaGVkIGluc2lkZS4gKi9cbiAxOTY6XHRcdGlmIChoZHItXHUwMDNldmVjLmlvdmVjKVxuIDE5NzpcdFx0XHRyZXEtXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTkVFRF9DTEVBTlVQO1xuIDE5ODpcdFx0cmV0dXJuIGhkcjtcbiAxOTk6XHR9XG4gMjAwOlx0XG4gMjAxOlx0c3RhdGljIGlubGluZSB2b2lkIGlvX21zaG90X3ByZXBfcmV0cnkoc3RydWN0IGlvX2tpb2NiICpyZXEsXG4gMjAyOlx0XHRcdFx0XHQgICAgICAgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZylcbiAyMDM6XHR7XG4gMjA0Olx0XHRzdHJ1Y3QgaW9fc3JfbXNnICpzciA9IGlvX2tpb2NiX3RvX2NtZChyZXEsIHN0cnVjdCBpb19zcl9tc2cpO1xuIDIwNTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDE2MQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDgyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLgoKKipBbmFseXppbmcgdGhlIEFsbG9jYXRpb24gYW5kIFJlY3ljbGluZyBvZiBOZXR3b3JrIE1lc3NhZ2UgSGVhZGVycyoqCgpBbHJpZ2h0LCBzbyBgaW9fbXNnX2FsbG9jX2FzeW5jYCBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyB0aGUgaGVhZGVyLCBgaGRyYCwgZm9yIG5ldHdvcmsgbWVzc2FnZXMuIFRoZSBwb3RlbnRpYWwgd3JpbmtsZSBoZXJlIGlzIHRoYXQgaWYgdGhpcyBoZWFkZXIgd2FzIHByZXZpb3VzbHkgY2FjaGVkLCB0aGVyZSYjMzk7cyBhIGdvb2QgY2hhbmNlIHRoYXQgYGhkci0mZ3Q7dmVjLmlvdmVjYCBtaWdodCBhbHJlYWR5IGJlIHBvcHVsYXRlZC4gVGhlIGtleSBpcyB0byByZW1lbWJlciBpZiB0aGUgSS9PIHZlY3RvciBpcyBwb3B1bGF0ZWQsIGl0IG1lYW5zIHRoZSBoZWFkZXIgaGFzIGJlZW4gYWxsb2NhdGVkLCBpbiBhIHBhc3QgaW5zdGFuY2UuCgpOb3cgSSByZW1lbWJlciB0aGF0IGBpb19uZXRtc2dfcmVjeWNsZWAgY29tZXMgaW50byBwbGF5IGhlcmUsIGJlY2F1c2UgdGhhdCYjMzk7cyB3aGVyZSB0aGUgY2FjaGluZyBpcyBpbXBsZW1lbnRlZC4gU28sIG15IG5leHQgc3RlcCBpcyB0byBkcmlsbCBkb3duIGludG8gYGlvX25ldG1zZ19yZWN5Y2xlYCBhbmQgdmVyaWZ5IGhvdyBpdCBtYW5hZ2VzIGFuZCByZXVzZXMgdGhlc2UgaGVhZGVycy4gSXQmIzM5O3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucyBhbmQgaG93IHRoZSBgaW92ZWNgIGlzIG1hbmFnZWQgZHVyaW5nIHJlY3ljbGluZyB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIG1lbW9yeSBtYW5hZ2VtZW50IGNvbmZsaWN0cy4gVGhpcyByZXF1aXJlcyBhIGRlZXBlciBkaXZlIGludG8gdGhlIGBpb19uZXRtc2dfcmVjeWNsZWAgZnVuY3Rpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW9fdXJpbmcvbmV0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNjcsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE2NzpcdHN0YXRpYyB2b2lkIGlvX25ldG1zZ19yZWN5Y2xlKHN0cnVjdCBpb19raW9jYiAqcmVxLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXG4gMTY4Olx0e1xuIDE2OTpcdFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaGRyID0gcmVxLVx1MDAzZWFzeW5jX2RhdGE7XG4gMTcwOlx0XG4gMTcxOlx0XHQvKiBjYW4mIzM5O3QgcmVjeWNsZSwgZW5zdXJlIHdlIGZyZWUgdGhlIGlvdmVjIGlmIHdlIGhhdmUgb25lICovXG4gMTcyOlx0XHRpZiAodW5saWtlbHkoaXNzdWVfZmxhZ3MgXHUwMDI2IElPX1VSSU5HX0ZfVU5MT0NLRUQpKSB7XG4gMTczOlx0XHRcdGlvX25ldG1zZ19pb3ZlY19mcmVlKGhkcik7XG4gMTc0Olx0XHRcdHJldHVybjtcbiAxNzU6XHRcdH1cbiAxNzY6XHRcbiAxNzc6XHRcdC8qIExldCBub3JtYWwgY2xlYW51cCBwYXRoIHJlYXAgaXQgaWYgd2UgZmFpbCBhZGRpbmcgdG8gdGhlIGNhY2hlICovXG4gMTc4Olx0XHRpb19hbGxvY19jYWNoZV92ZWNfa2FzYW4oXHUwMDI2aGRyLVx1MDAzZXZlYyk7XG4gMTc5Olx0XHRpZiAoaGRyLVx1MDAzZXZlYy5uciBcdTAwM2UgSU9fVkVDX0NBQ0hFX1NPRlRfQ0FQKVxuIDE4MDpcdFx0XHRpb192ZWNfZnJlZShcdTAwMjZoZHItXHUwMDNldmVjKTtcbiAxODE6XHRcbiAxODI6XHRcdGlmIChpb19hbGxvY19jYWNoZV9wdXQoXHUwMDI2cmVxLVx1MDAzZWN0eC1cdTAwM2VuZXRtc2dfY2FjaGUsIGhkcikpXG4gMTgzOlx0XHRcdGlvX3JlcV9hc3luY19kYXRhX2NsZWFyKHJlcSwgUkVRX0ZfTkVFRF9DTEVBTlVQKTtcbiAxODQ6XHR9XG4gMTg1Olx0XG4gMTg2Olx0c3RhdGljIHN0cnVjdCBpb19hc3luY19tc2doZHIgKmlvX21zZ19hbGxvY19hc3luYyhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA4NjcKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAyNDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVXNlLUFmdGVyLUZyZWUgVnVsbmVyYWJpbGl0eSBpbiBpb191cmluZzogTXkgQW5hbHlzaXMqKgoKT2theSwgc28gSSYjMzk7dmUgYmVlbiBkaWdnaW5nIGludG8gdGhpcyBpb191cmluZyBjb2RlLCBhbmQgSSB0aGluayBJJiMzOTt2ZSBmb3VuZCBhIHByZXR0eSBzZXJpb3VzIGlzc3VlLiBUaGUgYGhkci0mZ3Q7dmVjLmlvdmVjYCBwb2ludGVyIGNhbiBiZSBub24tTlVMTCwgZXNwZWNpYWxseSBpZiBpdCB3YXMgcHJldmlvdXNseSBjYWNoZWQsIG9yIGlmIHRoZSB1c2VyIHN1cHBsaWVkIG1vcmUgdGhhbiBgVUlPX0ZBU1RJT1ZgIGlvdmVjcywgd2hpY2ggbGVhZHMgdG8gYGlvX25ldF9pbXBvcnRfdmVjYCBhbGxvY2F0aW5nIGBrbXNnLSZndDt2ZWMuaW92ZWNgLiBUaGF0JiMzOTtzIHdoZXJlIGl0IHJlYWxseSBnZXRzIGludGVyZXN0aW5nIGJlY2F1c2UgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgc2V0cyBgYXJnLm1vZGUgPSBLQlVGX01PREVfRlJFRWAgd2hlbiBga21zZy0mZ3Q7dmVjLmlvdmVjYCBpcyBub24tTlVMTC4gQnV0IGhlcmUmIzM5O3MgdGhlIGtpY2tlcjogYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBnb2VzIGFuZCBmcmVlcyBpdCEgUmlnaHQgYXQgdGhlIGVuZCEKCkFuZCB0aGVuLCBpbmNyZWRpYmx5LCBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCAqc3RpbGwqIHRyaWVzIHRvIHVzZSB0aGF0IGZyZWVkIG1lbW9yeS4gSXTigJlzIGEgdGV4dGJvb2sgdXNlLWFmdGVyLWZyZWUhIEnigJltIHByZXR0eSBjb25maWRlbnQgdGhhdCB0aGlzIGlzIGEgMTAwJSByZXByb2R1Y2libGUgZXhwbG9pdC4gVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcgYW5kIGxvb2tpbmcgYXQgbW9yZSBjbG9zZWx5LgoKTGV0JiMzOTtzIGNoZWNrIGBXb3J0aEZ1enppbmdgLiBZZXMsIGFic29sdXRlbHkhIFdoYXQgY29uZmlndXJhdGlvbnMgYXJlIG5lZWRlZD8gYENPTkZJR19JT19VUklOR2AgaXMgZXNzZW50aWFsLCBhbmQgSSBzdXNwZWN0IGBDT05GSUdfTkVUYCBpcyByZXF1aXJlZCBhcyB3ZWxsLCBnaXZlbiB0aGF0IHRoaXMgc2VlbXMgbmV0d29ya2luZyByZWxhdGVkIGFuZCBJIHNlZSBpdCYjMzk7cyBpbiBgaW9fdXJpbmcvbmV0LmNgLiBJIHNob3VsZCBwcm9iYWJseSBjb25maXJtIHRoYXQgd2l0aCB0aGUgYGlvX3VyaW5nL0tjb25maWdgIGFuZCBgaW9fdXJpbmcvTWFrZWZpbGVgIGZpbGVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtrYnVmLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpb191cmluZy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcvTWFrZWZpbGU9Nz1lbmRpZlxuaW9fdXJpbmcvTWFrZWZpbGUtOC1cbmlvX3VyaW5nL01ha2VmaWxlOjk6b2JqLSQoQ09ORklHX0lPX1VSSU5HKVx0XHQmIzQzOz0gaW9fdXJpbmcubyBvcGRlZi5vIGtidWYubyByc3JjLm8gbm90aWYubyBcXFxuaW9fdXJpbmcvTWFrZWZpbGUtMTAtXHRcdFx0XHRcdHRjdHgubyBmaWxldGFibGUubyBydy5vIHBvbGwubyBcXFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTU3NgoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246CgoqKkluaXRpYWwgSW5xdWlyeTogVGhlIFNpZ25pZmljYW5jZSBvZiBgbmV0Lm9gKioKCkhtbSwgbGV0IG1lIHNlZeKApiBXaGF0JiMzOTtzIHRoZSBjb250ZXh0IGhlcmU/IEp1c3QgdGhlIG1lbnRpb24gb2YgYG5ldC5vYCBtYWtlcyBteSBtaW5kIGp1bXAgdG8gYSBmZXcgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMuIElzIHRoaXMgcmVsYXRlZCB0byBuZXR3b3JraW5nLCBwZXJoYXBzIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZywgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFdpdGhvdXQgbW9yZSBpbmZvcm1hdGlvbiwgSSYjMzk7bSBhbHJlYWR5IHN0YXJ0aW5nIHRvIG1lbnRhbGx5IHJ1biB0aHJvdWdoIHNjZW5hcmlvcy4gSXMgYG5ldC5vYCBhIGNvbXBpbGVkIG9iamVjdCBmaWxlIHJlbGF0ZWQgdG8gYSBuZXR3b3JrIG1vZHVsZSwgcGVyaGFwcyBmcm9tIGEgbGFyZ2VyIHByb2plY3Q/IENvdWxkIGl0IGJlIGEgZGVidWdnaW5nIHN5bWJvbCBmaWxlPyBPciBtYXliZSBpdCYjMzk7cyBzb21lIGN1c3RvbSBmb3JtYXQgb3IgbGlicmFyeT8gVGhlIGxhY2sgb2Ygc3Vycm91bmRpbmcgY29udGV4dCBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gaW1tZWRpYXRlbHkgY2xhc3NpZnkuIEkgd2FudCB0byBkZWx2ZSBmdXJ0aGVyIHRvIHVuZGVyc3RhbmQgaXRzIHNpZ25pZmljYW5jZS4gTXkgaW50dWl0aW9uIHRlbGxzIG1lIHRoYXQgdGhlIGltbWVkaWF0ZSBpbXBvcnRhbmNlIGxpZXMgbm90IGluIHRoZSBmaWxlIGl0c2VsZiwgYnV0IHdoZXJlIGl0IHNpdHMsIGFuZCBob3cgaXQgaXMgdXNlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6Mzc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmV0Lm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpb191cmluZy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcvTWFrZWZpbGU9MjM9b2JqLSQoQ09ORklHX05FVF9SWF9CVVNZX1BPTEwpXHQmIzQzOz0gbmFwaS5vXG5pb191cmluZy9NYWtlZmlsZToyNDpvYmotJChDT05GSUdfTkVUKSAmIzQzOz0gbmV0Lm8gY21kX25ldC5vXG5pb191cmluZy9NYWtlZmlsZS0yNS1vYmotJChDT05GSUdfUFJPQ19GUykgJiM0Mzs9IGZkaW5mby5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxODk3CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTk1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgS2VybmVsIEJ1ZyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gbWFrZSBzdXJlIGBDT05GSUdfSU9fVVJJTkdgIGFuZCBgQ09ORklHX05FVGAgYXJlIGVuYWJsZWQuIFRoYXQgc2VlbXMgbGlrZSBhIGxvZ2ljYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhpcyBidWcuCgpOb3csIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGRldGFpbHMuIEkgbmVlZCB0byB6ZXJvIGluIG9uIHRoZSByZWxldmFudCBzeW1ib2xzLiBUaGUgYnVnIGFwcGVhcnMgdG8gYmUgaW4gYGlvX3JpbmdfYnVmZmVyc19wZWVrYCB3aXRoaW4gYGlvX3VyaW5nL2tidWYuY2AuIEFscmlnaHQsIGxldCYjMzk7cyBzZWUgd2hlcmUgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQuIFRyYWNpbmcgdGhlIGNhbGxzLCBJIHNlZSBgaW9fYnVmZmVyc19zZWxlY3RgIGxlYWRzIHRvIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgLCB3aGljaCB0aGVuIGNhbGxzIGBpb19zZW5kYC4gSSBhbHNvIHNlZSBhIHNlcGFyYXRlIHBhdGggdGhyb3VnaCBgaW9fcmVjdl9idWZfc2VsZWN0YCB0aGF0IGFsc28gZXZlbnR1YWxseSBlbmRzIHVwIGNhbGxpbmcgYGlvX3JlY3ZgLgoKU28gbXkga2V5IGZvY3VzIGFyZWFzIGFyZTogYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBpcyBjZW50cmFsLCBidXQgYWxzbyBgaW9fYnVmZmVyc19zZWxlY3RgLCBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCwgYGlvX3JlY3ZfYnVmX3NlbGVjdGAsIGBpb19zZW5kYCwgYW5kIGBpb19yZWN2YC4gTGV0IG1lIHF1aWNrbHkgY29uZmlybSB3aGV0aGVyIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgaXMgc3RhdGljLCBpbiBjYXNlIGl0IGlzbiYjMzk7dCwgc28gSSB1bmRlcnN0YW5kIHRoZSBzY29wZSBvZiB0aGUgcHJvYmxlbS4gQWgsIHllcywgaXQmIzM5O3Mgc3RhdGljLiBUaGF0IG5hcnJvd3MgdGhlIHNjb3BlIG9mIHRoZSBwb3RlbnRpYWwgaW1wYWN0LiBTbyBub3csIEkmIzM5O2xsIGNvbmNlbnRyYXRlIG15IGFuYWx5c2lzIG9uIHRoZSBvdGhlciBmdW5jdGlvbnMgSSBqdXN0IGlkZW50aWZpZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lvX3NlbmRfc2VsZWN0X2J1ZmZlciYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jPTU1OT1pbnQgaW9fc2VuZG1zZyhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxuLS1cbmlvX3VyaW5nL25ldC5jLTYwNy1cbmlvX3VyaW5nL25ldC5jOjYwODpzdGF0aWMgaW50IGlvX3NlbmRfc2VsZWN0X2J1ZmZlcihzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzLFxuaW9fdXJpbmcvbmV0LmMtNjA5LVx0XHRcdFx0IHN0cnVjdCBpb19icl9zZWwgKnNlbCwgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZylcbi0tXG5pb191cmluZy9uZXQuYz02NTY9aW50IGlvX3NlbmQoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcbi0tXG5pb191cmluZy9uZXQuYy02ODktXHRpZiAoaW9fZG9fYnVmZmVyX3NlbGVjdChyZXEpKSB7XG5pb191cmluZy9uZXQuYzo2OTA6XHRcdHJldCA9IGlvX3NlbmRfc2VsZWN0X2J1ZmZlcihyZXEsIGlzc3VlX2ZsYWdzLCBcdTAwMjZzZWwsIGttc2cpO1xuaW9fdXJpbmcvbmV0LmMtNjkxLVx0XHRpZiAocmV0KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNyAwMzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjY2NwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEyNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgUG90ZW50aWFsIEZ1enppbmcgVGFyZ2V0cyoqCgpPa2F5LCBob2xkIG9uLiBJIG5lZWQgdG8gdGhpbmsgdGhyb3VnaCB0aGlzLiBJIGp1c3Qgc2F3IHRoYXQgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgaXMgYSBzdGF0aWMgZnVuY3Rpb24uIFRoYXQmIzM5O3MgYSBrZXkgZGV0YWlsLiBDYW4gc3l6a2FsbGVyICpkaXJlY3RseSogZnV6eiBzdGF0aWMgZnVuY3Rpb25zIGxpa2UgdGhhdD8gSSBkb24mIzM5O3QgdGhpbmsgc28sIGJ1dCBpdCYjMzk7cyBzdGlsbCB3b3J0aHdoaWxlIHRvIGluY2x1ZGUgdGhlbSBpbiB0aGUgbGlzdC4gQnkgbGlzdGluZyB0aGVtLCBldmVuIGlmIHRoZSBmdXp6ZXIgY2FuJiMzOTt0IHRhcmdldCAqdGhlbSogZGlyZWN0bHksIHdlIGNhbiBlbnN1cmUgdGhhdCBjb2RlIHBhdGhzIHVzaW5nIHRoZXNlIGZ1bmN0aW9ucyBhcmUgcHJpb3JpdGl6ZWQgZHVyaW5nIGZ1enppbmcuCgpSaWdodCwgYmFjayB0byB0aGUgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OyBkZWZpbml0aW9uLiBUaGF0JiMzOTtzIGEgZ29vZCBwcm9tcHQgZm9yIG1lIHRvIHJldmlldy4gSXQgaXMgYSAmIzM0O0xpc3Qgb2Ygc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0byBmb2N1cyBmdXp6aW5nIG9uLiBTaG91bGQgYXZvaWQgaG90LXBhdGggZnVuY3Rpb25zJiMzNDsuIFdlIHdhbnQgdG8ga2VlcCBmcm9tIG92ZXJ3aGVsbWluZyB0aGUgZnV6emVyLgoKT2theSwgbGV0JiMzOTtzIHNlZS4uLiBhIGdvb2QgY2FuZGlkYXRlIGZvciB0aGlzIGlzIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuIEl04oCZcyBsaWtlbHkgYSBnb29kIGVudHJ5IHBvaW50LiBUaGVuLCBsZXQmIzM5O3MgYWxzbyByZW1lbWJlciBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBhbmQgYGlvX3JlY3ZfYnVmX3NlbGVjdGAuIFRob3NlIGxvb2sgbGlrZSBwcm9taXNpbmcgdGFyZ2V0cyBhcyB3ZWxsLiBJJiMzOTttIHN0YXJ0aW5nIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBhcHByb2FjaCBpcyB2YWx1YWJsZS4gTGV0IG1lIGZvY3VzIG9uIGBpb19yZWN2X2J1Zl9zZWxlY3RgIGZvciBhIG1vbWVudCBhbmQgc2VlIHdoZXJlIHRoYXQgbGVhZHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lvX3JlY3ZfYnVmX3NlbGVjdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2lvX3VyaW5nL25ldC5jPTEwNTA9aW50IGlvX3JlY3Ztc2coc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcbi0tXG5pb191cmluZy9uZXQuYy0xMTM2LVxuaW9fdXJpbmcvbmV0LmM6MTEzNzpzdGF0aWMgaW50IGlvX3JlY3ZfYnVmX3NlbGVjdChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZyxcbmlvX3VyaW5nL25ldC5jLTExMzgtXHRcdFx0ICAgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXG4tLVxuaW9fdXJpbmcvbmV0LmM9MTIwOT1pbnQgaW9fcmVjdihzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxuLS1cbmlvX3VyaW5nL25ldC5jLTEyNDctXHRcdHNlbC52YWwgPSBzci1cdTAwM2VsZW47XG5pb191cmluZy9uZXQuYzoxMjQ4Olx0XHRyZXQgPSBpb19yZWN2X2J1Zl9zZWxlY3QocmVxLCBrbXNnLCBcdTAwMjZzZWwsIGlzc3VlX2ZsYWdzKTtcbmlvX3VyaW5nL25ldC5jLTEyNDktXHRcdGlmICh1bmxpa2VseShyZXQgXHUwMDNjIDApKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzMzYwCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMjg4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBQb3RlbnRpYWwgVnVsbmVyYWJpbGl0aWVzIGluIGlvX3VyaW5nL2tidWYuYyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIGRpZ2dpbmcgaW50byB0aGlzIGBpb191cmluZy9rYnVmLmNgIGNvZGUsIGFuZCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucy4gRnJvbSB3aGF0IEkgY2FuIHRlbGwsIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AsIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgLCBhbmQgYGlvX3JlY3ZfYnVmX3NlbGVjdGAgYXJlIHRoZSBwcmltYXJ5IG9uZXMgdG8gd2F0Y2guIEkgYWxzbyBuZWVkIHRvIGtlZXAgYGlvX2J1ZmZlcnNfc2VsZWN0YCBhbmQgYGlvX2J1ZmZlcnNfcGVla2AgaW4gbWluZC4KCkZpcnN0LCBsZXQgbWUgY29uZmlybSBzb21ldGhpbmc6IGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgaXMgaW5kZWVkIHN0YXRpYywgYXMgSSBzdXNwZWN0ZWQuIE5vdywgSSYjMzk7bGwgY3JlYXRlIGEgY2hlY2tsaXN0IG9mIHRob3NlIGZ1bmN0aW9ucy4KCiogICBgaW9fcmluZ19idWZmZXJzX3BlZWtgCiogICBgaW9fYnVmZmVyc19zZWxlY3RgCiogICBgaW9fYnVmZmVyc19wZWVrYAoqICAgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAKKiAgIGBpb19yZWN2X2J1Zl9zZWxlY3RgCgpIb2xkIG9uLCBJIHNlZSBzb21ldGhpbmcgc2lnbmlmaWNhbnQgYWJvdXQgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBmcm9tIHRoaXMgcGF0Y2guIEl0IHNlZW1zIHRoYXQgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgKnVzZS1hZnRlci1mcmVlKiB2dWxuZXJhYmlsaXR5IGJ5IG1vdmluZyB0aGUgYGtmcmVlKGFyZy0mZ3Q7aW92cylgIGNhbGwgdG8gdGhlIGVuZCBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBUaGlzIGhhcHBlbnMgd2hlbiBgYXJnLSZndDttb2RlICZhbXA7IEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQuIE5vdywgd2hlcmUgaXMgYEtCVUZfTU9ERV9GUkVFYCBiZWluZyBzZXQ/IEFoYSEgSXQmIzM5O3Mgc2V0IGluIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGFuZCBgaW9fcmVjdl9idWZfc2VsZWN0YCBzcGVjaWZpY2FsbHkgd2hlbiBga21zZy0mZ3Q7dmVjLmlvdmVjYCBpcyBhbHJlYWR5IGFsbG9jYXRlZC4KClRoZXJlZm9yZSwgdGhlIGZ1enplciBzaG91bGQgZGVmaW5pdGVseSBwcmlvcml0aXplIHRhcmdldGluZyB0aG9zZSB0d28gZnVuY3Rpb25zIChgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBhbmQgYGlvX3JlY3ZfYnVmX3NlbGVjdGApIGJlY2F1c2UgdGhleSBhcmUgcHJpbWUgY2FuZGlkYXRlcyBmb3IgdHJpZ2dlcmluZyB0aGUgYnVnLiBJIHJlYWxseSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0byBiZSBzdXJlIEkgYW0gbm90IG1pc3NpbmcgYW55IG90aGVyIHBsYWNlcyBgS0JVRl9NT0RFX0ZSRUVgIG1pZ2h0IGJlIHNldC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDcgMDM6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7S0JVRl9NT0RFX0ZSRUUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpb191cmluZy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW9fdXJpbmcva2J1Zi5jPTI1Mz1zdGF0aWMgaW50IGlvX3JpbmdfYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcbi0tXG5pb191cmluZy9rYnVmLmMtMzMwLVxuaW9fdXJpbmcva2J1Zi5jOjMzMTpcdGlmIChhcmctXHUwMDNlbW9kZSBcdTAwMjYgS0JVRl9NT0RFX0ZSRUUpXG5pb191cmluZy9rYnVmLmMtMzMyLVx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG4tLVxuaW9fdXJpbmcva2J1Zi5oPTUzPWVudW0ge1xuLS1cbmlvX3VyaW5nL2tidWYuaC01Ni1cdC8qIGlmIGJpZ2dlciB2ZWMgYWxsb2NhdGVkLCBmcmVlIG9sZCBvbmUgKi9cbmlvX3VyaW5nL2tidWYuaDo1NzpcdEtCVUZfTU9ERV9GUkVFXHRcdD0gMixcbmlvX3VyaW5nL2tidWYuaC01OC19O1xuLS1cbmlvX3VyaW5nL25ldC5jPTYwOD1zdGF0aWMgaW50IGlvX3NlbmRfc2VsZWN0X2J1ZmZlcihzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzLFxuLS1cbmlvX3VyaW5nL25ldC5jLTYyMi1cdFx0YXJnLmlvdnMgPSBrbXNnLVx1MDAzZXZlYy5pb3ZlYztcbmlvX3VyaW5nL25ldC5jOjYyMzpcdFx0YXJnLm1vZGUgPSBLQlVGX01PREVfRlJFRTtcbmlvX3VyaW5nL25ldC5jLTYyNC1cdH1cbi0tXG5pb191cmluZy9uZXQuYz0xMTM3PXN0YXRpYyBpbnQgaW9fcmVjdl9idWZfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLFxuLS1cbmlvX3VyaW5nL25ldC5jLTExNTktXHRcdFx0YXJnLmlvdnMgPSBrbXNnLVx1MDAzZXZlYy5pb3ZlYztcbmlvX3VyaW5nL25ldC5jOjExNjA6XHRcdFx0YXJnLm1vZGUgfD0gS0JVRl9NT0RFX0ZSRUU7XG5pb191cmluZy9uZXQuYy0xMTYxLVx0XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0NTIzCgkJCQkJCQlvdXRwdXQ6IDIzNQoJCQkJCQkJdGhvdWdodHM6IDI2OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgSU9fVVJJTkcgVnVsbmVyYWJpbGl0eSoqCgpPa2F5LCBzbyB0aGlzIGlzIGZvY3VzZWQgb24gYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgYW5kIGBpb19yZWN2X2J1Zl9zZWxlY3RgIOKAkyB3aGljaCBjb25maXJtcyB0aGUgZm9jdXMgc3ltYm9scyBJIGlkZW50aWZpZWQgYXJlIGNvcnJlY3QuIExldCYjMzk7cyBicmVhayBkb3duIHRoZSBpc3N1ZSBtZXRob2RpY2FsbHkuCgpUaGUgcGF0Y2gmIzM5O3MgcHJvYmxlbSBsaWVzIGluIG1vdmluZyB0aGF0IGBrZnJlZShhcmctJmd0O2lvdnMpYCBjYWxsIHRvIHRoZSBlbmQgb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC4gVGhlIGxvZ2ljIGhlcmUgaXMga2V5OiBpZiBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgYGFyZy0mZ3Q7aW92c2AgZ2V0cyB1bmNvbmRpdGlvbmFsbHkgZnJlZWQgKmJlZm9yZSogdGhlIGZ1bmN0aW9uIHJldHVybnMuIE5vdywgYGFyZy0mZ3Q7aW92c2AgaXMgKmVpdGhlciogYSBmcmVzaGx5IGFsbG9jYXRlZCBhcnJheSAoaWYgdGhlIG9yaWdpbmFsIG5lZWRlZCBleHBhbnNpb24pICpvciogdGhlIG9yaWdpbmFsIGFycmF5IHBhc3NlZCBpbi4gVGhlIGNyaXRpY2FsIHBvaW50IGlzIHRoYXQsIHJlZ2FyZGxlc3Mgb2YgYWxsb2NhdGlvbiwgdGhlIHBvaW50ZXIgdG8gYGFyZy0mZ3Q7aW92c2AgaXMgKnN0aWxsKiBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyLCB3aGljaCBpcyBlaXRoZXIgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgb3IgYGlvX3JlY3ZfYnVmX3NlbGVjdGAuCgpUaGlzIGNyZWF0ZXMgYSBuYXN0eSwgMTAwJSByZXByb2R1Y2libGUgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0eS4gRXNzZW50aWFsbHksIGlmIHlvdSYjMzk7cmUgdXNpbmcgcHJvdmlkZWQgYnVmZmVycyB3aXRoIGBpb19zZW5kYCBvciBgaW9fcmVjdmAsIHdpdGggcHJlLWFsbG9jYXRlZCBpb3ZlY3MsIHRoZSBidWZmZXJzIGFyZSBmcmVlZCBiZWZvcmUgdGhlIGNhbGxlciBjYW4gcHJvY2VzcyB0aGVtLiBUaGlzIGlzIGEgY2xlYXIsIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgc2NyZWFtcyBmb3IgZnV6emluZy4KCk15IHByaW1hcnkgY29uZmlndXJhdGlvbiBjb25jZXJucyBhcmUgYElPX1VSSU5HYCBhbmQgYE5FVGAsIG5hdHVyYWxseS4KCk5vdywgbGV0JiMzOTtzIHByb2NlZWQgdG8gc2V0LXJlc3VsdHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA3IDAzOjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtJT19VUklORyYjMzQ7LAogICAgJiMzNDtORVQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtpb19yaW5nX2J1ZmZlcnNfcGVlayYjMzQ7LAogICAgJiMzNDtpb19idWZmZXJzX3NlbGVjdCYjMzQ7LAogICAgJiMzNDtpb19zZW5kX3NlbGVjdF9idWZmZXImIzM0OywKICAgICYjMzQ7aW9fcmVjdl9idWZfc2VsZWN0JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vdmVzIGBrZnJlZShhcmctXHUwMDNlaW92cylgIHRvIHRoZSBlbmQgb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC4gSWYgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQsIHRoaXMgdW5jb25kaXRpb25hbGx5IGZyZWVzIGBhcmctXHUwMDNlaW92c2AgYmVmb3JlIHJldHVybmluZy4gSG93ZXZlciwgYGFyZy1cdTAwM2Vpb3ZzYCBpcyBlaXRoZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCBhcnJheSAoaWYgZXhwYW5kZWQpIG9yIHRoZSBvcmlnaW5hbCBhcnJheSwgYW5kIGluIGJvdGggY2FzZXMsIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIG9yIGBpb19yZWN2X2J1Zl9zZWxlY3RgKSB3aGljaCB0aGVuIHVzZXMgaXQuIFRoaXMgaW50cm9kdWNlcyBhIDEwMCUgcmVwcm9kdWNpYmxlIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkgd2hlbiB1c2luZyBwcm92aWRlZCBidWZmZXJzIHdpdGggYGlvX3NlbmRgIG9yIGBpb19yZWN2YCBhbmQgcHJlLWFsbG9jYXRlZCBpb3ZlY3MuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lPX1VSSU5HJiMzNDssCiAgICAmIzM0O05FVCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2lvX3JpbmdfYnVmZmVyc19wZWVrJiMzNDssCiAgICAmIzM0O2lvX2J1ZmZlcnNfc2VsZWN0JiMzNDssCiAgICAmIzM0O2lvX3NlbmRfc2VsZWN0X2J1ZmZlciYjMzQ7LAogICAgJiMzNDtpb19yZWN2X2J1Zl9zZWxlY3QmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW92ZXMgYGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKWAgdG8gdGhlIGVuZCBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBJZiBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgdGhpcyB1bmNvbmRpdGlvbmFsbHkgZnJlZXMgYGFyZy1cdTAwM2Vpb3ZzYCBiZWZvcmUgcmV0dXJuaW5nLiBIb3dldmVyLCBgYXJnLVx1MDAzZWlvdnNgIGlzIGVpdGhlciB0aGUgbmV3bHkgYWxsb2NhdGVkIGFycmF5IChpZiBleHBhbmRlZCkgb3IgdGhlIG9yaWdpbmFsIGFycmF5LCBhbmQgaW4gYm90aCBjYXNlcywgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciAoYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgb3IgYGlvX3JlY3ZfYnVmX3NlbGVjdGApIHdoaWNoIHRoZW4gdXNlcyBpdC4gVGhpcyBpbnRyb2R1Y2VzIGEgMTAwJSByZXByb2R1Y2libGUgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0eSB3aGVuIHVzaW5nIHByb3ZpZGVkIGJ1ZmZlcnMgd2l0aCBgaW9fc2VuZGAgb3IgYGlvX3JlY3ZgIGFuZCBwcmUtYWxsb2NhdGVkIGlvdmVjcy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMxOjQ4Ljg1ODE2MzE1OVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ4ODM0NDI1ODEyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJT19VUklOR1wiLFxuICAgIFwiTkVUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaW9fcmluZ19idWZmZXJzX3BlZWtcIixcbiAgICBcImlvX2J1ZmZlcnNfc2VsZWN0XCIsXG4gICAgXCJpb19zZW5kX3NlbGVjdF9idWZmZXJcIixcbiAgICBcImlvX3JlY3ZfYnVmX3NlbGVjdFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vdmVzIGBrZnJlZShhcmctXFx1MDAzZWlvdnMpYCB0byB0aGUgZW5kIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuIElmIGBLQlVGX01PREVfRlJFRWAgaXMgc2V0LCB0aGlzIHVuY29uZGl0aW9uYWxseSBmcmVlcyBgYXJnLVxcdTAwM2Vpb3ZzYCBiZWZvcmUgcmV0dXJuaW5nLiBIb3dldmVyLCBgYXJnLVxcdTAwM2Vpb3ZzYCBpcyBlaXRoZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCBhcnJheSAoaWYgZXhwYW5kZWQpIG9yIHRoZSBvcmlnaW5hbCBhcnJheSwgYW5kIGluIGJvdGggY2FzZXMsIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIG9yIGBpb19yZWN2X2J1Zl9zZWxlY3RgKSB3aGljaCB0aGVuIHVzZXMgaXQuIFRoaXMgaW50cm9kdWNlcyBhIDEwMCUgcmVwcm9kdWNpYmxlIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkgd2hlbiB1c2luZyBwcm92aWRlZCBidWZmZXJzIHdpdGggYGlvX3NlbmRgIG9yIGBpb19yZWN2YCBhbmQgcHJlLWFsbG9jYXRlZCBpb3ZlY3MuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMxOjQ4Ljg1ODE2OTIxWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2Njk4NDA2MTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA3MWJlYzYxOTFhN2E3YTVjNWQzMDFlNjFjMzA3MWU0NzUyZWNlMDlkXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUdWUgSnVsIDcgMDM6MzE6NDcgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvaW9fdXJpbmcva2J1Zi5jIGIvaW9fdXJpbmcva2J1Zi5jXFxuaW5kZXggM2NkMjk0NzdmZmYyZDMuLmI2Yjk2OWI1NWUxMjI0IDEwMDY0NFxcbi0tLSBhL2lvX3VyaW5nL2tidWYuY1xcbisrKyBiL2lvX3VyaW5nL2tidWYuY1xcbkBAIC0yODcsOCArMjg3LDYgQEAgc3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXFxuIFxcdFxcdGlvdiA9IGttYWxsb2Nfb2JqcyhzdHJ1Y3QgaW92ZWMsIG5yX2F2YWlsKTtcXG4gXFx0XFx0aWYgKHVubGlrZWx5KCFpb3YpKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4tXFx0XFx0aWYgKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxcbi1cXHRcXHRcXHRrZnJlZShhcmctXFx1MDAzZWlvdnMpO1xcbiBcXHRcXHRhcmctXFx1MDAzZWlvdnMgPSBpb3Y7XFxuIFxcdFxcdG5yX2lvdnMgPSBucl9hdmFpbDtcXG4gXFx0fSBlbHNlIGlmIChucl9hdmFpbCBcXHUwMDNjIG5yX2lvdnMpIHtcXG5AQCAtMzMwLDYgKzMyOCw5IEBAIHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbiBcXHRcXHRidWYgPSBpb19yaW5nX2hlYWRfdG9fYnVmKGJyLCArK2hlYWQsIGJsLVxcdTAwM2VtYXNrKTtcXG4gXFx0fSB3aGlsZSAoLS1ucl9pb3ZzKTtcXG4gXFxuK1xcdGlmIChhcmctXFx1MDAzZW1vZGUgXFx1MDAyNiBLQlVGX01PREVfRlJFRSlcXG4rXFx0XFx0a2ZyZWUoYXJnLVxcdTAwM2Vpb3ZzKTtcXG4rXFxuIFxcdGlmIChoZWFkID09IHRhaWwpXFxuIFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfQkxfRU1QVFk7XFxuIFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMTo0OS41MjkwMjY2MzdaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ4NzY3MzM4NTAyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJT19VUklOR1wiLFxuICAgIFwiTkVUXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaW9fcmluZ19idWZmZXJzX3BlZWtcIixcbiAgICBcImlvX2J1ZmZlcnNfc2VsZWN0XCIsXG4gICAgXCJpb19zZW5kX3NlbGVjdF9idWZmZXJcIixcbiAgICBcImlvX3JlY3ZfYnVmX3NlbGVjdFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vdmVzIGBrZnJlZShhcmctXFx1MDAzZWlvdnMpYCB0byB0aGUgZW5kIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuIElmIGBLQlVGX01PREVfRlJFRWAgaXMgc2V0LCB0aGlzIHVuY29uZGl0aW9uYWxseSBmcmVlcyBgYXJnLVxcdTAwM2Vpb3ZzYCBiZWZvcmUgcmV0dXJuaW5nLiBIb3dldmVyLCBgYXJnLVxcdTAwM2Vpb3ZzYCBpcyBlaXRoZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCBhcnJheSAoaWYgZXhwYW5kZWQpIG9yIHRoZSBvcmlnaW5hbCBhcnJheSwgYW5kIGluIGJvdGggY2FzZXMsIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIG9yIGBpb19yZWN2X2J1Zl9zZWxlY3RgKSB3aGljaCB0aGVuIHVzZXMgaXQuIFRoaXMgaW50cm9kdWNlcyBhIDEwMCUgcmVwcm9kdWNpYmxlIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkgd2hlbiB1c2luZyBwcm92aWRlZCBidWZmZXJzIHdpdGggYGlvX3NlbmRgIG9yIGBpb19yZWN2YCBhbmQgcHJlLWFsbG9jYXRlZCBpb3ZlY3MuIFRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNzFiZWM2MTkxYTdhN2E1YzVkMzAxZTYxYzMwNzFlNDc1MmVjZTA5ZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgSnVsIDcgMDM6MzE6NDcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pb191cmluZy9rYnVmLmMgYi9pb191cmluZy9rYnVmLmNcbmluZGV4IDNjZDI5NDc3ZmZmMmQzLi5iNmI5NjliNTVlMTIyNCAxMDA2NDRcbi0tLSBhL2lvX3VyaW5nL2tidWYuY1xuKysrIGIvaW9fdXJpbmcva2J1Zi5jXG5AQCAtMjg3LDggKzI4Nyw2IEBAIHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuIFx0XHRpb3YgPSBrbWFsbG9jX29ianMoc3RydWN0IGlvdmVjLCBucl9hdmFpbCk7XG4gXHRcdGlmICh1bmxpa2VseSghaW92KSlcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbi1cdFx0aWYgKGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRlJFRSlcbi1cdFx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG4gXHRcdGFyZy1cdTAwM2Vpb3ZzID0gaW92O1xuIFx0XHRucl9pb3ZzID0gbnJfYXZhaWw7XG4gXHR9IGVsc2UgaWYgKG5yX2F2YWlsIFx1MDAzYyBucl9pb3ZzKSB7XG5AQCAtMzMwLDYgKzMyOCw5IEBAIHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxuIFx0XHRidWYgPSBpb19yaW5nX2hlYWRfdG9fYnVmKGJyLCArK2hlYWQsIGJsLVx1MDAzZW1hc2spO1xuIFx0fSB3aGlsZSAoLS1ucl9pb3ZzKTtcbiBcbitcdGlmIChhcmctXHUwMDNlbW9kZSBcdTAwMjYgS0JVRl9NT0RFX0ZSRUUpXG4rXHRcdGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKTtcbitcbiBcdGlmIChoZWFkID09IHRhaWwpXG4gXHRcdHJlcS1cdTAwM2VmbGFncyB8PSBSRVFfRl9CTF9FTVBUWTtcbiBcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMxOjQ5LjUyOTAyODY5N1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxNDc1MDA5MDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi5cblxuKipBbmFseXppbmcgYSBLZXJuZWwgUGF0Y2ggaW4gaW9fdXJpbmcva2J1Zi5jKipcblxuQWxyaWdodCwgSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgYGlvX3VyaW5nL2tidWYuY2AuIEl0J3MgYSBmYWlybHkgc3BlY2lmaWMgb25lLCBjb25jZXJuaW5nIGhvdyBtZW1vcnkgaXMgaGFuZGxlZCBpbiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBUaGUgY2hhbmdlIGlzIGFib3V0ICp3aGVuKiB3ZSBjYWxsIGBrZnJlZShhcmctXHUwMDNlaW92cylgLiBBcHBhcmVudGx5LCBpdCdzIGJlaW5nIG1vdmVkIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIHdpdGhpbiB0aGF0IGZ1bmN0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aHkuIFNvLCBJJ20gZ29pbmcgdG8gZGl2ZSByaWdodCBpbnRvIHRoZSBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGZ1bmN0aW9uIGl0c2VsZiB0byBzZWUgd2hhdCdzIGhhcHBlbmluZyBhbmQgZmlndXJlIG91dCB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGlzIHNoaWZ0LiBJJ2xsIG5lZWQgdG8gYW5hbHl6ZSB0aGUgc3Vycm91bmRpbmcgY29kZSB0byBkZXRlcm1pbmUgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGNoYW5nZSBhbmQgd2hldGhlciBpdCBhZGRyZXNzZXMgYSBwb3RlbnRpYWwgYnVnLCBpbXByb3ZlcyBwZXJmb3JtYW5jZSwgb3IgcGVyaGFwcyBhbGlnbnMgd2l0aCBzb21lIG90aGVyIGRlc2lnbiBwcmluY2lwbGUuIExldCdzIHNlZSB3aGF0J3MgcmVhbGx5IGdvaW5nIG9uIGluIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTkwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMTo1My42NzY1MzIxODZaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAyNTY5MTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX3JpbmdfYnVmZmVyc19wZWVrXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImlvX3VyaW5nL2tidWYuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpb191cmluZy9rYnVmLmM9MjMwPXN0cnVjdCBpb19icl9zZWwgaW9fYnVmZmVyX3NlbGVjdChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc2l6ZV90ICpsZW4sXFxuLS1cXG5pb191cmluZy9rYnVmLmMtMjUyLVxcbmlvX3VyaW5nL2tidWYuYzoyNTM6c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXFxuaW9fdXJpbmcva2J1Zi5jLTI1NC1cXHRcXHRcXHRcXHRzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsKVxcbi0tXFxuaW9fdXJpbmcva2J1Zi5jPTM0MT1pbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbi0tXFxuaW9fdXJpbmcva2J1Zi5jLTM1Mi1cXHRpZiAoc2VsLVxcdTAwM2VidWZfbGlzdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT0JMX0JVRl9SSU5HKSB7XFxuaW9fdXJpbmcva2J1Zi5jOjM1MzpcXHRcXHRyZXQgPSBpb19yaW5nX2J1ZmZlcnNfcGVlayhyZXEsIGFyZywgc2VsLVxcdTAwM2VidWZfbGlzdCk7XFxuaW9fdXJpbmcva2J1Zi5jLTM1NC1cXHRcXHQvKlxcbi0tXFxuaW9fdXJpbmcva2J1Zi5jPTM3Nz1pbnQgaW9fYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcXG4tLVxcbmlvX3VyaW5nL2tidWYuYy0zOTAtXFx0aWYgKGJsLVxcdTAwM2VmbGFncyBcXHUwMDI2IElPQkxfQlVGX1JJTkcpIHtcXG5pb191cmluZy9rYnVmLmM6MzkxOlxcdFxcdHJldCA9IGlvX3JpbmdfYnVmZmVyc19wZWVrKHJlcSwgYXJnLCBibCk7XFxuaW9fdXJpbmcva2J1Zi5jLTM5Mi1cXHRcXHRpZiAocmV0IFxcdTAwM2UgMClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzE6NTMuNzc5MTA3Nzg2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ4NzU0MjA5MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5IHdlcmUgc3dpcmxpbmcgYXJvdW5kIGluIG15IG93biBoZWFkOlxuXG4qKkFuYWx5emluZyBhIFBvdGVudGlhbCBNZW1vcnkgTWFuYWdlbWVudCBJc3N1ZSoqXG5cbkFscmlnaHQsIHNvIHRoaXMgcGF0Y2ggKmxvb2tzKiBsaWtlIGl0J3MgYWRkcmVzc2luZyBzb21lIHNvcnQgb2YgbWVtb3J5IGNvcnJ1cHRpb24gcHJvYmxlbSDigJMgbWF5YmUgYSBtZW1vcnkgbGVhaywgb3IgYSB1c2UtYWZ0ZXItZnJlZSBzY2VuYXJpby4gSXQgc2VlbXMgdGhlIGNvcmUgb2YgdGhlIGZpeCByZXZvbHZlcyBhcm91bmQgdGhlIHRpbWluZyBvZiBga2ZyZWUoYXJnLVx1MDAzZWlvdnMpYC4gSXQgKmxvb2tzKiBsaWtlIHRoZXkncmUgbW92aW5nIHRoZSBga2ZyZWVgIGNhbGwgKmFmdGVyKiBhIGxvb3AgdGhhdCdzIHVzaW5nIGBhcmctXHUwMDNlaW92c2AuIFxuXG5Ib2xkIG9uIGEgc2Vjb25kLi4uIFRoYXQgZG9lc24ndCBxdWl0ZSBtYWtlIHNlbnNlLiBJZiB0aGV5J3JlIGZyZWVpbmcgYGFyZy1cdTAwM2Vpb3ZzYCBhbmQgKnRoZW4qIHJlYXNzaWduaW5nIGBhcmctXHUwMDNlaW92cyA9IGlvdjtgLCB0aGVuIHRoZSBsb29wICptdXN0KiBiZSB1c2luZyB0aGUgb3JpZ2luYWwgbWVtb3J5IGxvY2F0aW9uLCByaWdodD8gT3IgYW0gSSBtaXNzaW5nIHNvbWV0aGluZz8gSWYgdGhhdCdzIHRydWUsIHRoZW4gdGhlIG5ldyB2YWx1ZSBgaW92YCBtdXN0IGJlIGFzc2lnbmVkICpiZWZvcmUqIHRoZSBrZnJlZSB0byBwcmV2ZW50IHVzZSBhZnRlciBmcmVlLiBJIG5lZWQgdG8gYmUgc3VyZS5cblxuSSBuZWVkIHRvIGRpZyBkZWVwZXIgaGVyZS4gVGhlIGtleSBmdW5jdGlvbiBpcyBwcm9iYWJseSBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGluIGBpb191cmluZy9rYnVmLmNgLiBJJ20gZ29pbmcgdG8gcHVsbCB1cCB0aGF0IGZ1bmN0aW9uIGFuZCByZWFkIHRoZSBsb2dpYyBjYXJlZnVsbHkuIEkgbmVlZCB0byBzZWUgZXhhY3RseSBob3cgYGFyZy1cdTAwM2Vpb3ZzYCBpcyBiZWluZyB1c2VkIGFuZCBtb2RpZmllZCB3aXRoaW4gdGhhdCBmdW5jdGlvbiBhbmQgd2hldGhlciB0aGlzIGBrZnJlZWAgcGxhY2VtZW50IGlzIHJlYWxseSBzb2x2aW5nIHRoZSBwcm9ibGVtIG9yLCBwZXJoYXBzLCBpbnRyb2R1Y2luZyBhIG5ldyBvbmUgb3IgbWlzdW5kZXJzdGFuZGluZyBob3cgdG8gZGVhbCB3aXRoIHRoZSBleGlzdGluZyBpc3N1ZS4gTGV0J3Mgc2VlLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2NzUsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMjozOC42NTQ1MzEyNjlaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjIzMjA5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImlvX3VyaW5nL2tidWYuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTMsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjUzOlxcdHN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbiAyNTQ6XFx0XFx0XFx0XFx0XFx0c3RydWN0IGlvX2J1ZmZlcl9saXN0ICpibClcXG4gMjU1OlxcdHtcXG4gMjU2OlxcdFxcdHN0cnVjdCBpb191cmluZ19idWZfcmluZyAqYnIgPSBibC1cXHUwMDNlYnVmX3Jpbmc7XFxuIDI1NzpcXHRcXHRzdHJ1Y3QgaW92ZWMgKm9yZ19pb3ZzID0gYXJnLVxcdTAwM2Vpb3ZzO1xcbiAyNTg6XFx0XFx0c3RydWN0IGlvdmVjICppb3YgPSBhcmctXFx1MDAzZWlvdnM7XFxuIDI1OTpcXHRcXHRpbnQgbnJfaW92cyA9IGFyZy1cXHUwMDNlbnJfaW92cztcXG4gMjYwOlxcdFxcdF9fdTE2IG5yX2F2YWlsLCB0YWlsLCBoZWFkO1xcbiAyNjE6XFx0XFx0c3RydWN0IGlvX3VyaW5nX2J1ZiAqYnVmO1xcbiAyNjI6XFx0XFxuIDI2MzpcXHRcXHR0YWlsID0gc21wX2xvYWRfYWNxdWlyZShcXHUwMDI2YnItXFx1MDAzZXRhaWwpO1xcbiAyNjQ6XFx0XFx0aGVhZCA9IGJsLVxcdTAwM2VoZWFkO1xcbiAyNjU6XFx0XFx0bnJfYXZhaWwgPSBtaW5fdChfX3UxNiwgdGFpbCAtIGhlYWQsIFVJT19NQVhJT1YpO1xcbiAyNjY6XFx0XFx0aWYgKHVubGlrZWx5KCFucl9hdmFpbCkpXFxuIDI2NzpcXHRcXHRcXHRyZXR1cm4gLUVOT0JVRlM7XFxuIDI2ODpcXHRcXG4gMjY5OlxcdFxcdGJ1ZiA9IGlvX3JpbmdfaGVhZF90b19idWYoYnIsIGhlYWQsIGJsLVxcdTAwM2VtYXNrKTtcXG4gMjcwOlxcdFxcdGlmIChhcmctXFx1MDAzZW1heF9sZW4pIHtcXG4gMjcxOlxcdFxcdFxcdHUzMiBsZW4gPSBSRUFEX09OQ0UoYnVmLVxcdTAwM2VsZW4pO1xcbiAyNzI6XFx0XFx0XFx0c2l6ZV90IG5lZWRlZDtcXG4gMjczOlxcdFxcbiAyNzQ6XFx0XFx0XFx0aWYgKHVubGlrZWx5KCFsZW4pKVxcbiAyNzU6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9CVUZTO1xcbiAyNzY6XFx0XFx0XFx0bmVlZGVkID0gKGFyZy1cXHUwMDNlbWF4X2xlbiArIGxlbiAtIDEpIC8gbGVuO1xcbiAyNzc6XFx0XFx0XFx0bmVlZGVkID0gbWluX25vdF96ZXJvKG5lZWRlZCwgKHNpemVfdCkgUEVFS19NQVhfSU1QT1JUKTtcXG4gMjc4OlxcdFxcdFxcdGlmIChucl9hdmFpbCBcXHUwMDNlIG5lZWRlZClcXG4gMjc5OlxcdFxcdFxcdFxcdG5yX2F2YWlsID0gbmVlZGVkO1xcbiAyODA6XFx0XFx0fVxcbiAyODE6XFx0XFxuIDI4MjpcXHRcXHQvKlxcbiAyODM6XFx0XFx0ICogb25seSBhbGxvYyBhIGJpZ2dlciBhcnJheSBpZiB3ZSBrbm93IHdlIGhhdmUgZGF0YSB0byBtYXAsIGVnIG5vdFxcbiAyODQ6XFx0XFx0ICogYSBzcGVjdWxhdGl2ZSBwZWVrIG9wZXJhdGlvbi5cXG4gMjg1OlxcdFxcdCAqL1xcbiAyODY6XFx0XFx0aWYgKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9FWFBBTkQgXFx1MDAyNlxcdTAwMjYgbnJfYXZhaWwgXFx1MDAzZSBucl9pb3ZzIFxcdTAwMjZcXHUwMDI2IGFyZy1cXHUwMDNlbWF4X2xlbikge1xcbiAyODc6XFx0XFx0XFx0aW92ID0ga21hbGxvY19vYmpzKHN0cnVjdCBpb3ZlYywgbnJfYXZhaWwpO1xcbiAyODg6XFx0XFx0XFx0aWYgKHVubGlrZWx5KCFpb3YpKVxcbiAyODk6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIDI5MDpcXHRcXHRcXHRhcmctXFx1MDAzZWlvdnMgPSBpb3Y7XFxuIDI5MTpcXHRcXHRcXHRucl9pb3ZzID0gbnJfYXZhaWw7XFxuIDI5MjpcXHRcXHR9IGVsc2UgaWYgKG5yX2F2YWlsIFxcdTAwM2MgbnJfaW92cykge1xcbiAyOTM6XFx0XFx0XFx0bnJfaW92cyA9IG5yX2F2YWlsO1xcbiAyOTQ6XFx0XFx0fVxcbiAyOTU6XFx0XFxuIDI5NjpcXHRcXHQvKiBzZXQgaXQgdG8gbWF4LCBpZiBub3Qgc2V0LCBzbyB3ZSBjYW4gdXNlIGl0IHVuY29uZGl0aW9uYWxseSAqL1xcbiAyOTc6XFx0XFx0aWYgKCFhcmctXFx1MDAzZW1heF9sZW4pXFxuIDI5ODpcXHRcXHRcXHRhcmctXFx1MDAzZW1heF9sZW4gPSBJTlRfTUFYO1xcbiAyOTk6XFx0XFxuIDMwMDpcXHRcXHRyZXEtXFx1MDAzZWJ1Zl9pbmRleCA9IFJFQURfT05DRShidWYtXFx1MDAzZWJpZCk7XFxuIDMwMTpcXHRcXHRkbyB7XFxuIDMwMjpcXHRcXHRcXHR1MzIgbGVuID0gUkVBRF9PTkNFKGJ1Zi1cXHUwMDNlbGVuKTtcXG4gMzAzOlxcdFxcbiAzMDQ6XFx0XFx0XFx0LyogdHJ1bmNhdGUgZW5kIHBpZWNlLCBpZiBuZWVkZWQsIGZvciBub24gcGFydGlhbCBidWZmZXJzICovXFxuIDMwNTpcXHRcXHRcXHRpZiAobGVuIFxcdTAwM2UgYXJnLVxcdTAwM2VtYXhfbGVuKSB7XFxuIDMwNjpcXHRcXHRcXHRcXHRsZW4gPSBhcmctXFx1MDAzZW1heF9sZW47XFxuIDMwNzpcXHRcXHRcXHRcXHRpZiAoIShibC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT0JMX0lOQykpIHtcXG4gMzA4OlxcdFxcdFxcdFxcdFxcdGFyZy1cXHUwMDNlcGFydGlhbF9tYXAgPSAxO1xcbiAzMDk6XFx0XFx0XFx0XFx0XFx0aWYgKGlvdiAhPSBhcmctXFx1MDAzZWlvdnMpXFxuIDMxMDpcXHRcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gMzExOlxcdFxcdFxcdFxcdH1cXG4gMzEyOlxcdFxcdFxcdH1cXG4gMzEzOlxcdFxcbiAzMTQ6XFx0XFx0XFx0aW92LVxcdTAwM2Vpb3ZfYmFzZSA9IHU2NF90b191c2VyX3B0cihSRUFEX09OQ0UoYnVmLVxcdTAwM2VhZGRyKSk7XFxuIDMxNTpcXHRcXHRcXHRpb3YtXFx1MDAzZWlvdl9sZW4gPSBsZW47XFxuIDMxNjpcXHRcXHRcXHRpZiAodW5saWtlbHkoIWFjY2Vzc19vayhpb3YtXFx1MDAzZWlvdl9iYXNlLCBsZW4pKSkge1xcbiAzMTc6XFx0XFx0XFx0XFx0aWYgKGFyZy1cXHUwMDNlaW92cyAhPSBvcmdfaW92cylcXG4gMzE4OlxcdFxcdFxcdFxcdFxcdGtmcmVlKGFyZy1cXHUwMDNlaW92cyk7XFxuIDMxOTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gMzIwOlxcdFxcdFxcdH1cXG4gMzIxOlxcdFxcdFxcdGlvdisrO1xcbiAzMjI6XFx0XFxuIDMyMzpcXHRcXHRcXHRhcmctXFx1MDAzZW91dF9sZW4gKz0gbGVuO1xcbiAzMjQ6XFx0XFx0XFx0YXJnLVxcdTAwM2VtYXhfbGVuIC09IGxlbjtcXG4gMzI1OlxcdFxcdFxcdGlmICghYXJnLVxcdTAwM2VtYXhfbGVuKVxcbiAzMjY6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDMyNzpcXHRcXG4gMzI4OlxcdFxcdFxcdGJ1ZiA9IGlvX3JpbmdfaGVhZF90b19idWYoYnIsICsraGVhZCwgYmwtXFx1MDAzZW1hc2spO1xcbiAzMjk6XFx0XFx0fSB3aGlsZSAoLS1ucl9pb3ZzKTtcXG4gMzMwOlxcdFxcbiAzMzE6XFx0XFx0aWYgKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxcbiAzMzI6XFx0XFx0XFx0a2ZyZWUoYXJnLVxcdTAwM2Vpb3ZzKTtcXG4gMzMzOlxcdFxcbiAzMzQ6XFx0XFx0aWYgKGhlYWQgPT0gdGFpbClcXG4gMzM1OlxcdFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfQkxfRU1QVFk7XFxuIDMzNjpcXHRcXG4gMzM3OlxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfQlVGRkVSX1JJTkc7XFxuIDMzODpcXHRcXHRyZXR1cm4gaW92IC0gYXJnLVxcdTAwM2Vpb3ZzO1xcbiAzMzk6XFx0fVxcbiAzNDA6XFx0XFxuIDM0MTpcXHRpbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbiAzNDI6XFx0XFx0XFx0ICAgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXFxuIDM0MzpcXHR7XFxuIDM0NDpcXHRcXHRzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCA9IHJlcS1cXHUwMDNlY3R4O1xcbiAzNDU6XFx0XFx0aW50IHJldCA9IC1FTk9FTlQ7XFxuIDM0NjpcXHRcXG4gMzQ3OlxcdFxcdGlvX3Jpbmdfc3VibWl0X2xvY2soY3R4LCBpc3N1ZV9mbGFncyk7XFxuIDM0ODpcXHRcXHRzZWwtXFx1MDAzZWJ1Zl9saXN0ID0gaW9fYnVmZmVyX2dldF9saXN0KGN0eCwgYXJnLVxcdTAwM2VidWZfZ3JvdXApO1xcbiAzNDk6XFx0XFx0aWYgKHVubGlrZWx5KCFzZWwtXFx1MDAzZWJ1Zl9saXN0KSlcXG4gMzUwOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gMzUxOlxcdFxcbiAzNTI6XFx0XFx0aWYgKHNlbC1cXHUwMDNlYnVmX2xpc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9CTF9CVUZfUklORykge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMjozOC42NTY3NTc4ODhaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTA2NDgzNjc2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBLQlVGIFBhdGNoOiBQb3RlbnRpYWwgTWVtb3J5IExlYWsqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIG1vdmVzIHRoZSBga2ZyZWUoYXJnLVx1MDAzZWlvdnMpYCBjYWxsIG91dHNpZGUgb2YgdGhlIGNvbmRpdGlvbmFsIGJsb2NrLCBwbGFjaW5nIGl0IGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZnVuY3Rpb24uIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdGhhdCB0aGlzIHNlZW1lZCBsaWtlIGEgc2ltcGxlIGNsZWFudXAsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgZG9lc24ndCBpbnRyb2R1Y2UgYW55IGJ1Z3MuXG5cbk5vdywgSSdtIHN0YXJ0aW5nIHRvIHNlZSB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgY2hhbmdlLiBQcmV2aW91c2x5LCBpZiBgYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFYCB3YXMgc2V0LCB0aGUgY29kZSB3b3VsZCBmcmVlIGBhcmctXHUwMDNlaW92c2Ag4oCTIHdoaWNoLCBjcml0aWNhbGx5LCB3YXMgdGhlICpvbGQqIGBpb3ZzYCDigJMgKmJlZm9yZSogcG90ZW50aWFsbHkgYWxsb2NhdGluZyBhICpuZXcqIGBpb3ZzYCBhbmQgYXNzaWduaW5nIGl0IHRvIGBhcmctXHUwMDNlaW92c2AuXG5cblRoZSBpbnRlcmVzdGluZyBzZWN0aW9uIG9mIGNvZGUgaGVyZSBpczpcblxuYGBgY1xuXHRcdGlmIChhcmctXHUwMDNlbW9kZSBcdTAwMjYgS0JVRl9NT0RFX0VYUEFORCBcdTAwMjZcdTAwMjYgbnJfYXZhaWwgXHUwMDNlIG5yX2lvdnMgXHUwMDI2XHUwMDI2IGFyZy1cdTAwM2VtYXhfbGVuKSB7XG5cdFx0XHRpb3YgPSBrbWFsbG9jX29ianMoc3RydWN0IGlvdmVjLCBucl9hdmFpbCk7XG5cdFx0XHRpZiAodW5saWtlbHkoIWlvdikpXG5cdFx0XHRcdHJldHVybiAtRU5PTUVNO1xuLVx0XHRcdGlmIChhcmctXHUwMDNlbW9kZSBcdTAwMjYgS0JVRl9NT0RFX0ZSRUUpXG4tXHRcdFx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG5cdFx0XHRhcmctXHUwMDNlaW92cyA9IGlvdjtcblx0XHRcdG5yX2lvdnMgPSBucl9hdmFpbDtcblx0XHR9XG5gYGBcblxuT2theSwgc28gaWYgdGhlIGNvZGUgKmRvZXMqIGVudGVyIHRoYXQgYGlmYCBibG9jaywgYSBuZXcgYGlvdmAgaXMgYWxsb2NhdGVkIGFuZCBhc3NpZ25lZCB0byBgYXJnLVx1MDAzZWlvdnNgLCBhbmQgb25seSB0aGVuLCB0aGUgb2xkIGBpb3ZzYCB3aWxsIGJlIGZyZWVkLCBidXQgb25seSBpZiB0aGUgZmxhZyBpcyBzZXQuXG5cblRoZSBjb2RlIG5vdywgYWZ0ZXIgdGhlIHBhdGNoLCBsb29rcyBsaWtlIHRoaXM6XG5cbmBgYGNcblx0aWYgKGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRlJFRSlcblx0XHRrZnJlZShhcmctXHUwMDNlaW92cyk7XG5gYGBcblxuVGhlIHByb2JsZW0gaXMgaW1tZWRpYXRlbHkgY2xlYXI6IElmIHRoZSBleHBhbnNpb24gKmRvZXMqIG9jY3VyIGFuZCBhICpuZXcqIGBpb3ZgIGlzIGFsbG9jYXRlZCwgYXQgdGhlIGVuZCwgdGhlIGNvZGUgd2lsbCBmcmVlIHRoZSAqbmV3KiBgYXJnLVx1MDAzZWlvdnNgIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIGBpb3ZzYC4gVGhpcyBpcyBub3cgYSBidWc6IHdlIGFyZSBsZWFraW5nIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb2xkIGBhcmctXHUwMDNlaW92c2AhIFdlIGFyZSBzdXBwb3NlZCB0byBiZSBmcmVlaW5nIHRoZSBvbGQgb25lLiBXZSBub3cgaGF2ZSBhbiBpc3N1ZSBvZiBtZW1vcnkgY29ycnVwdGlvbiBvciBldmVuIHdvcnNlLiBJIGJldHRlciByZS1leGFtaW5lIHRoZSBkaWZmIHZlcnkgY2FyZWZ1bGx5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NzExLCJPdXRwdXRUb2tlbnMiOjQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDA2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzI6NTMuNzIxNTk3MjUxWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU1MzY3ODY4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpZiBcXFxcKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9GUkVFXFxcXClcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW9fdXJpbmcva2J1Zi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImlvX3VyaW5nL2tidWYuYz0yNTM9c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXFxuLS1cXG5pb191cmluZy9rYnVmLmMtMzMwLVxcbmlvX3VyaW5nL2tidWYuYzozMzE6XFx0aWYgKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxcbmlvX3VyaW5nL2tidWYuYy0zMzItXFx0XFx0a2ZyZWUoYXJnLVxcdTAwM2Vpb3ZzKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzI6NTQuMjc1Mjg1MTEyWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzAxNjM2MDg4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGlvX3JpbmdfYnVmZmVyc19wZWVrIExvZ2ljKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJZiBgYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFYCBpcyB0cnVlLCB0aGF0IHNpZ25hbHMgdGhhdCB0aGUgb3JpZ2luYWwgYGFyZy1cdTAwM2Vpb3ZzYCB3YXMgKmR5bmFtaWNhbGx5IGFsbG9jYXRlZCogYW5kIHRodXMgbmVlZHMgdG8gYmUgZGVhbGxvY2F0ZWQuIFRoYXQncyBzdHJhaWdodGZvcndhcmQuIEhvd2V2ZXIsIHRoZSBsb2dpYyBnZXRzIHRyaWNreSB3aGVuIHdlICphbHNvKiBhbGxvY2F0ZSBhICpuZXcqIGBpb3ZgLCBhbmQgYXNzaWduIGl0IHRvIGBhcmctXHUwMDNlaW92c2AuIFNvLCBgYXJnLVx1MDAzZWlvdnNgIGlzIGVpdGhlciB0aGUgb3JpZ2luYWwgYWxsb2NhdGlvbiBvciBhIG5ldyBvbmUsIGRlcGVuZGluZy4gVGhlIGNvZGUgdGhlbiBmcmVlcyBgYXJnLVx1MDAzZWlvdnNgIGF0IHRoZSBlbmQgaWYgdGhlIGZyZWUgbW9kZSBpcyBlbmFibGVkLlxuXG5CdXQgaGVyZSdzIHdoZXJlIHRoZSByZWQgZmxhZyBnb2VzIHVwLiBUaGUgKmNhbGxlciogb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBleHBlY3RzIGBhcmctXHUwMDNlaW92c2AgdG8gY29udGFpbiB2YWxpZCBpb3ZlY3MsIHJpZ2h0PyBJdCdzIGhvdyB0aGUgY2FsbGVyIHJldHJpZXZlcyB0aGUgZGF0YS4gSWYgd2UgKmZyZWUqIGBhcmctXHUwMDNlaW92c2AgYXQgdGhlIGVuZCBvZiAqdGhpcyogZnVuY3Rpb24sIHRoZSBjYWxsZXIgaXMgbGVmdCBob2xkaW5nIGEgZGFuZ2xpbmcgcG9pbnRlci4gVGhhdCdzIGEgY2xhc3NpYyBtZW1vcnkgbWFuYWdlbWVudCBpc3N1ZS4gSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGV4cGVjdGVkIGJlaGF2aW9yIG9mIGBhcmctXHUwMDNlaW92c2AgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24uIExldCBtZSBjaGVjayB0aGUgY2FsbGVyIHRvIGNvbmZpcm0gdGhlIGludGVuZGVkIGJlaGF2aW9yLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NzY2LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTUwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMzOjAxLjI5MTY0NzkzN1oiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEwMjU0NTE4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX2J1ZmZlcnNfcGVla1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9rYnVmLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcva2J1Zi5jPTM0MT1pbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbi0tXFxuaW9fdXJpbmcva2J1Zi5jLTM3Ni1cXG5pb191cmluZy9rYnVmLmM6Mzc3OmludCBpb19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbmlvX3VyaW5nL2tidWYuYy0zNzgtXFx0XFx0ICAgIHN0cnVjdCBpb19icl9zZWwgKnNlbClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzM6MDEuNDAxOTEwNTM2WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUxNDI1Mzg0ODMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGVzZSBtZXRob2RzLCBgaW9fYnVmZmVyc19wZWVrYCBhbmQgYGlvX2J1ZmZlcnNfc2VsZWN0YC4gTXkgZXhwZXJ0aXNlIHRlbGxzIG1lIHRoZXJlJ3MgbW9yZSBoZXJlIHRoYW4gbWVldHMgdGhlIGV5ZSwgYW5kIHRoZSBuYW1lIFwiYnVmZmVyc1wiIGFscmVhZHkgc3VnZ2VzdHMgc29tZSBsZXZlbCBvZiBtZW1vcnkgbWFuYWdlbWVudC4gSSdtIGltbWVkaWF0ZWx5IGN1cmlvdXMgYWJvdXQgdGhlaXIgY29udGV4dCDigJMgYXJlIHRoZXNlIGxpbmtlZCB0byBuZXR3b3JrIG9wZXJhdGlvbnMsIGZpbGUgSS9PLCBvciBzb21ldGhpbmcgbW9yZSBnZW5lcmljPyBJJ20gYWxyZWFkeSBmb3JtdWxhdGluZyBxdWVzdGlvbnM6XG5cbioqUGVla2luZywgU2VsZWN0aW5nLCBhbmQgQnVmZmVyczogSW5pdGlhbCBBc3Nlc3NtZW50KipcblxuU28sIGBpb19idWZmZXJzX3BlZWtgLCB0aGlzIGlzIGludGVyZXN0aW5nLiBJJ20gZ3Vlc3NpbmcgaXQgYWxsb3dzIGEgbm9uLWRlc3RydWN0aXZlIGxvb2sgYXQgYnVmZmVyZWQgZGF0YSwgcHJvYmFibHkgd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBidWZmZXIuIFRoaXMgaW1wbGllcyBhIG5lZWQgdG8gaW5zcGVjdCBpbmNvbWluZyBvciBvdXRnb2luZyBkYXRhIHdpdGhvdXQgYWx0ZXJpbmcgaXRzIHN0YXRlLCBsaWtlbHkgZm9yIHRoaW5ncyBsaWtlIGRldGVybWluaW5nIHRoZSBtZXNzYWdlIHR5cGUgYmVmb3JlIGNvbW1pdHRpbmcgdG8gcHJvY2Vzc2luZyBpdC4gSSdtIHRoaW5raW5nIHBlcmhhcHMgdGhpcyBmdW5jdGlvbiBoYXMgc29tZSBvdmVybGFwIHdpdGggYSBgcmVjdl9wZWVrYCBmdW5jdGlvbiBpbiBhIHNvY2tldC1iYXNlZCBhcHBsaWNhdGlvbi4gVGhpcyBtaWdodCBiZSB1c2VkIHRvIGluc3BlY3QgYSBwYWNrZXQgYmVmb3JlIGFwcGx5aW5nIGEgY2VydGFpbiBoYW5kbGVyLlxuXG5gaW9fYnVmZmVyc19zZWxlY3RgLCBub3cgdGhhdCdzIGV2ZW4gbW9yZSBpbnRyaWd1aW5nLiBcIlNlbGVjdFwiIGFsd2F5cyBzdWdnZXN0cyBzb21lIGtpbmQgb2YgbXVsdGlwbGV4aW5nIG9yIGV2ZW50IGhhbmRsaW5nLiBJcyB0aGlzIG1ldGhvZCByZWxhdGVkIHRvIHRoZSBgc2VsZWN0KClgIHN5c3RlbSBjYWxsLCBmb3IgaW5kaWNhdGluZyBvbmUgb3IgbW9yZSBvcGVyYXRpb25zIHNob3VsZCBiZSBleGVjdXRlZD8gVGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBxdWl0ZSB2YWx1YWJsZSwgZXNwZWNpYWxseSBpbiBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudHMsIHdoZXJlIHdlIGNhbiBjaG9vc2Ugd2hpY2ggb3BlcmF0aW9uIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVyIGNhbmRpZGF0ZXMgd291bGQgYmUgc3VpdGFibGUgdG8gb3BlcmF0ZSB1cG9uLiBXaGF0IGNyaXRlcmlhIGFyZSB1c2VkIGZvciB0aGlzIHNlbGVjdGlvbj8gQXJlIHdlIHRhbGtpbmcgYWJvdXQgcHJpb3JpdGl6aW5nIGJhc2VkIG9uIGJ1ZmZlciBmdWxsbmVzcywgYXZhaWxhYmxlIHNwYWNlLCBvciBzb21lIG90aGVyIGFwcGxpY2F0aW9uLXNwZWNpZmljIG1ldHJpYz8gQXJlIHRoZXJlIGltcGxpY2F0aW9ucyBmb3IgY29uY3VycmVuY3kgY29udHJvbD8gSSdtIGFscmVhZHkgYW50aWNpcGF0aW5nIHBvdGVudGlhbCBzeW5jaHJvbml6YXRpb24gY2hhbGxlbmdlcy4gSSBjYW4gaW1hZ2luZSBzY2VuYXJpb3Mgd2hlcmUgdGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbm9uLWJsb2NraW5nIEkvTyB0byBoYW5kbGUgbXVsdGlwbGUgY29ubmVjdGlvbnMgb3Igc3RyZWFtcyBlZmZpY2llbnRseS4gSSdtIHJlYWR5IHRvIGRpZyBkZWVwZXIgYW5kIGludmVzdGlnYXRlIHRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgdG8gZ2V0IGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZXNlIGZ1bmN0aW9ucyBmaXQgaW50byB0aGUgbGFyZ2VyIHN5c3RlbS5cblxuXG4iLCJJbnB1dFRva2VucyI6NjMzOCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMzOjA2LjU0NDQ1MTk0OFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzI5MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW9fdXJpbmcva2J1Zi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM0MCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNDA6XFx0XFxuIDM0MTpcXHRpbnQgaW9fYnVmZmVyc19zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbiAzNDI6XFx0XFx0XFx0ICAgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXFxuIDM0MzpcXHR7XFxuIDM0NDpcXHRcXHRzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCA9IHJlcS1cXHUwMDNlY3R4O1xcbiAzNDU6XFx0XFx0aW50IHJldCA9IC1FTk9FTlQ7XFxuIDM0NjpcXHRcXG4gMzQ3OlxcdFxcdGlvX3Jpbmdfc3VibWl0X2xvY2soY3R4LCBpc3N1ZV9mbGFncyk7XFxuIDM0ODpcXHRcXHRzZWwtXFx1MDAzZWJ1Zl9saXN0ID0gaW9fYnVmZmVyX2dldF9saXN0KGN0eCwgYXJnLVxcdTAwM2VidWZfZ3JvdXApO1xcbiAzNDk6XFx0XFx0aWYgKHVubGlrZWx5KCFzZWwtXFx1MDAzZWJ1Zl9saXN0KSlcXG4gMzUwOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gMzUxOlxcdFxcbiAzNTI6XFx0XFx0aWYgKHNlbC1cXHUwMDNlYnVmX2xpc3QtXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9CTF9CVUZfUklORykge1xcbiAzNTM6XFx0XFx0XFx0cmV0ID0gaW9fcmluZ19idWZmZXJzX3BlZWsocmVxLCBhcmcsIHNlbC1cXHUwMDNlYnVmX2xpc3QpO1xcbiAzNTQ6XFx0XFx0XFx0LypcXG4gMzU1OlxcdFxcdFxcdCAqIERvbid0IHJlY3ljbGUgdGhlc2UgYnVmZmVycyBpZiB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggcG9sbC5cXG4gMzU2OlxcdFxcdFxcdCAqIE5vYm9keSBlbHNlIGNhbiB1c2UgdGhlbSBhbnl3YXksIGFuZCBob2xkaW5nIG9uIHRvIHByb3ZpZGVkXFxuIDM1NzpcXHRcXHRcXHQgKiBidWZmZXJzIGZvciBhIHNlbmQvd3JpdGUgb3BlcmF0aW9uIHdvdWxkIGhhcHBlbiBvbiB0aGUgYXBwXFxuIDM1ODpcXHRcXHRcXHQgKiBzaWRlIGFueXdheSB3aXRoIG5vcm1hbCBidWZmZXJzLiBCZXNpZGVzLCB3ZSBhbHJlYWR5XFxuIDM1OTpcXHRcXHRcXHQgKiBjb21taXR0ZWQgdGhlbSwgdGhleSBjYW5ub3QgYmUgcHV0IGJhY2sgaW4gdGhlIHF1ZXVlLlxcbiAzNjA6XFx0XFx0XFx0ICovXFxuIDM2MTpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2UgMCkge1xcbiAzNjI6XFx0XFx0XFx0XFx0cmVxLVxcdTAwM2VmbGFncyB8PSBSRVFfRl9CVUZGRVJTX0NPTU1JVCB8IFJFUV9GX0JMX05PX1JFQ1lDTEU7XFxuIDM2MzpcXHRcXHRcXHRcXHRpZiAoIWlvX2tidWZfY29tbWl0KHJlcSwgc2VsLVxcdTAwM2VidWZfbGlzdCwgYXJnLVxcdTAwM2VvdXRfbGVuLCByZXQpKVxcbiAzNjQ6XFx0XFx0XFx0XFx0XFx0cmVxLVxcdTAwM2VmbGFncyB8PSBSRVFfRl9CVUZfTU9SRTtcXG4gMzY1OlxcdFxcdFxcdH1cXG4gMzY2OlxcdFxcdH0gZWxzZSB7XFxuIDM2NzpcXHRcXHRcXHRyZXQgPSBpb19wcm92aWRlZF9idWZmZXJzX3NlbGVjdChyZXEsIFxcdTAwMjZhcmctXFx1MDAzZW91dF9sZW4sIHNlbC1cXHUwMDNlYnVmX2xpc3QsIGFyZy1cXHUwMDNlaW92cyk7XFxuIDM2ODpcXHRcXHR9XFxuIDM2OTpcXHRvdXRfdW5sb2NrOlxcbiAzNzA6XFx0XFx0aWYgKGlzc3VlX2ZsYWdzIFxcdTAwMjYgSU9fVVJJTkdfRl9VTkxPQ0tFRCkge1xcbiAzNzE6XFx0XFx0XFx0c2VsLVxcdTAwM2VidWZfbGlzdCA9IE5VTEw7XFxuIDM3MjpcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmN0eC1cXHUwMDNldXJpbmdfbG9jayk7XFxuIDM3MzpcXHRcXHR9XFxuIDM3NDpcXHRcXHRyZXR1cm4gcmV0O1xcbiAzNzU6XFx0fVxcbiAzNzY6XFx0XFxuIDM3NzpcXHRpbnQgaW9fYnVmZmVyc19wZWVrKHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgYnVmX3NlbF9hcmcgKmFyZyxcXG4gMzc4OlxcdFxcdFxcdCAgICBzdHJ1Y3QgaW9fYnJfc2VsICpzZWwpXFxuIDM3OTpcXHR7XFxuIDM4MDpcXHRcXHRzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCA9IHJlcS1cXHUwMDNlY3R4O1xcbiAzODE6XFx0XFx0c3RydWN0IGlvX2J1ZmZlcl9saXN0ICpibDtcXG4gMzgyOlxcdFxcdGludCByZXQ7XFxuIDM4MzpcXHRcXG4gMzg0OlxcdFxcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNmN0eC1cXHUwMDNldXJpbmdfbG9jayk7XFxuIDM4NTpcXHRcXG4gMzg2OlxcdFxcdGJsID0gaW9fYnVmZmVyX2dldF9saXN0KGN0eCwgYXJnLVxcdTAwM2VidWZfZ3JvdXApO1xcbiAzODc6XFx0XFx0aWYgKHVubGlrZWx5KCFibCkpXFxuIDM4ODpcXHRcXHRcXHRyZXR1cm4gLUVOT0VOVDtcXG4gMzg5OlxcdFxcbiAzOTA6XFx0XFx0aWYgKGJsLVxcdTAwM2VmbGFncyBcXHUwMDI2IElPQkxfQlVGX1JJTkcpIHtcXG4gMzkxOlxcdFxcdFxcdHJldCA9IGlvX3JpbmdfYnVmZmVyc19wZWVrKHJlcSwgYXJnLCBibCk7XFxuIDM5MjpcXHRcXHRcXHRpZiAocmV0IFxcdTAwM2UgMClcXG4gMzkzOlxcdFxcdFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfQlVGRkVSU19DT01NSVQ7XFxuIDM5NDpcXHRcXHRcXHRzZWwtXFx1MDAzZWJ1Zl9saXN0ID0gYmw7XFxuIDM5NTpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiAzOTY6XFx0XFx0fVxcbiAzOTc6XFx0XFxuIDM5ODpcXHRcXHQvKiBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGJ1ZmZlciBzZWxlY3Rpb25zIGZvciBsZWdhY3kgKi9cXG4gMzk5OlxcdFxcdHNlbC1cXHUwMDNlYnVmX2xpc3QgPSBOVUxMO1xcbiA0MDA6XFx0XFx0cmV0dXJuIGlvX3Byb3ZpZGVkX2J1ZmZlcnNfc2VsZWN0KHJlcSwgXFx1MDAyNmFyZy1cXHUwMDNlbWF4X2xlbiwgYmwsIGFyZy1cXHUwMDNlaW92cyk7XFxuIDQwMTpcXHR9XFxuIDQwMjpcXHRcXG4gNDAzOlxcdHN0YXRpYyBpbmxpbmUgYm9vbCBfX2lvX3B1dF9rYnVmX3Jpbmcoc3RydWN0IGlvX2tpb2NiICpyZXEsXFxuIDQwNDpcXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsLCBpbnQgbGVuLCBpbnQgbnIpXFxuIDQwNTpcXHR7XFxuIDQwNjpcXHRcXHRib29sIHJldCA9IHRydWU7XFxuIDQwNzpcXHRcXG4gNDA4OlxcdFxcdGlmIChibClcXG4gNDA5OlxcdFxcdFxcdHJldCA9IGlvX2tidWZfY29tbWl0KHJlcSwgYmwsIGxlbiwgbnIpO1xcbiA0MTA6XFx0XFx0aWYgKHJldCBcXHUwMDI2XFx1MDAyNiAocmVxLVxcdTAwM2VmbGFncyBcXHUwMDI2IFJFUV9GX0JVRl9NT1JFKSlcXG4gNDExOlxcdFxcdFxcdHJldCA9IGZhbHNlO1xcbiA0MTI6XFx0XFxuIDQxMzpcXHRcXHRyZXEtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH4oUkVRX0ZfQlVGRkVSX1JJTkcgfCBSRVFfRl9CVUZfTU9SRSk7XFxuIDQxNDpcXHRcXHRyZXR1cm4gcmV0O1xcbiA0MTU6XFx0fVxcbiA0MTY6XFx0XFxuIDQxNzpcXHR1bnNpZ25lZCBpbnQgX19pb19wdXRfa2J1ZnMoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBpb19idWZmZXJfbGlzdCAqYmwsXFxuIDQxODpcXHRcXHRcXHRcXHQgICAgaW50IGxlbiwgaW50IG5idWZzKVxcbiA0MTk6XFx0e1xcbiA0MjA6XFx0XFx0dW5zaWduZWQgaW50IHJldDtcXG4gNDIxOlxcdFxcbiA0MjI6XFx0XFx0cmV0ID0gSU9SSU5HX0NRRV9GX0JVRkZFUiB8IChyZXEtXFx1MDAzZWJ1Zl9pbmRleCBcXHUwMDNjXFx1MDAzYyBJT1JJTkdfQ1FFX0JVRkZFUl9TSElGVCk7XFxuIDQyMzpcXHRcXG4gNDI0OlxcdFxcdGlmICh1bmxpa2VseSghKHJlcS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBSRVFfRl9CVUZGRVJfUklORykpKSB7XFxuIDQyNTpcXHRcXHRcXHRpb19rYnVmX2Ryb3BfbGVnYWN5KHJlcSk7XFxuIDQyNjpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA0Mjc6XFx0XFx0fVxcbiA0Mjg6XFx0XFxuIDQyOTpcXHRcXHRpZiAoIV9faW9fcHV0X2tidWZfcmluZyhyZXEsIGJsLCBsZW4sIG5idWZzKSlcXG4gNDMwOlxcdFxcdFxcdHJldCB8PSBJT1JJTkdfQ1FFX0ZfQlVGX01PUkU7XFxuIDQzMTpcXHRcXHRyZXR1cm4gcmV0O1xcbiA0MzI6XFx0fVxcbiA0MzM6XFx0XFxuIDQzNDpcXHRzdGF0aWMgaW50IGlvX3JlbW92ZV9idWZmZXJzX2xlZ2FjeShzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCxcXG4gNDM1OlxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgaW9fYnVmZmVyX2xpc3QgKmJsLFxcbiA0MzY6XFx0XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgbmJ1ZnMpXFxuIDQzNzpcXHR7XFxuIDQzODpcXHRcXHR1bnNpZ25lZCBsb25nIGkgPSAwO1xcbiA0Mzk6XFx0XFx0c3RydWN0IGlvX2J1ZmZlciAqbnh0O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMzowNi41NDQ2MjY5NzlaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzUxNTk2NTY0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgTWVtb3J5IE1hbmFnZW1lbnQgSXNzdWUqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgc25pcHBldCwgc3BlY2lmaWNhbGx5IHRoZSBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGZ1bmN0aW9uLCBhbmQgc29tZXRoaW5nJ3MgaW1tZWRpYXRlbHkganVtcGluZyBvdXQgYXQgbWUuIElmIGBhcmctXHUwMDNlbW9kZSBcdTAwMjYgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIGBhcmctXHUwMDNlaW92c2AuIEhpc3RvcmljYWxseSwgaXQgbG9va3MgbGlrZSBgaW9fcmluZ19idWZmZXJzX3BlZWtgIG1pZ2h0IGhhdmUgYmVlbiBmcmVlaW5nIHRoZSBvbGQgYGFyZy1cdTAwM2Vpb3ZzYCBpZiBpdCBhbGxvY2F0ZWQgYSBuZXcgb25lLiBJIHRoaW5rIEkgc2VlIGEgcG90ZW50aWFsIGlzc3VlLi4uXG5cbkhvbGQgb24sIEkgc2VlIHRoZSBwYXRjaC4gSXQgc2VlbXMgdGhhdCB0aGUgYGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKWAgY2FsbCAqdXNlZCogdG8gYmUgd2l0aGluIHRoZSBmdW5jdGlvbiBidXQgaXMgbm93IGF0IHRoZSBlbmQuIFRoYXQncyBhIHJlZCBmbGFnISBJZiBgYXJnLVx1MDAzZW1vZGUgXHUwMDI2IEtCVUZfTU9ERV9GUkVFYCBpcyB0cnVlLCB0aGVuIHRoYXQgbWVhbnMgdGhlIGNhbGxlciBpcyBleHBlY3RpbmcgdG8gdXNlIGBhcmctXHUwMDNlaW92c2AgKmFmdGVyKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIEJ1dCBpZiB3ZSBmcmVlIGBhcmctXHUwMDNlaW92c2AgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHRoZSBjYWxsZXIgaXMgZ29pbmcgdG8gYmUgbGVmdCBob2xkaW5nIGEgZGFuZ2xpbmcgcG9pbnRlci4gVGhhdCdzIGEgY2xhc3NpYyB1c2UtYWZ0ZXItZnJlZSB2dWxuZXJhYmlsaXR5IVxuXG5MZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBwYXRjaCBvbmUgbW9yZSB0aW1lIHRvIGJlIHN1cmUuIFRoaXMgZGVmaW5pdGVseSBuZWVkcyBhIGNsb3NlciBsb29rLCBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byB0aGUgbGlmZXRpbWUgb2YgYGFyZy1cdTAwM2Vpb3ZzYCBhbmQgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNhbGxlciBhbmQgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODM4NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMzOjE0LjA2MDU5NTY5WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTcxMTY0MzYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiS0JVRl9NT0RFX0ZSRUVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW9fdXJpbmcvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImlvX3VyaW5nL2tidWYuYz0yNTM9c3RhdGljIGludCBpb19yaW5nX2J1ZmZlcnNfcGVlayhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgc3RydWN0IGJ1Zl9zZWxfYXJnICphcmcsXFxuLS1cXG5pb191cmluZy9rYnVmLmMtMzMwLVxcbmlvX3VyaW5nL2tidWYuYzozMzE6XFx0aWYgKGFyZy1cXHUwMDNlbW9kZSBcXHUwMDI2IEtCVUZfTU9ERV9GUkVFKVxcbmlvX3VyaW5nL2tidWYuYy0zMzItXFx0XFx0a2ZyZWUoYXJnLVxcdTAwM2Vpb3ZzKTtcXG4tLVxcbmlvX3VyaW5nL2tidWYuaD01Mz1lbnVtIHtcXG4tLVxcbmlvX3VyaW5nL2tidWYuaC01Ni1cXHQvKiBpZiBiaWdnZXIgdmVjIGFsbG9jYXRlZCwgZnJlZSBvbGQgb25lICovXFxuaW9fdXJpbmcva2J1Zi5oOjU3OlxcdEtCVUZfTU9ERV9GUkVFXFx0XFx0PSAyLFxcbmlvX3VyaW5nL2tidWYuaC01OC19O1xcbi0tXFxuaW9fdXJpbmcvbmV0LmM9NjA4PXN0YXRpYyBpbnQgaW9fc2VuZF9zZWxlY3RfYnVmZmVyKHN0cnVjdCBpb19raW9jYiAqcmVxLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MsXFxuLS1cXG5pb191cmluZy9uZXQuYy02MjItXFx0XFx0YXJnLmlvdnMgPSBrbXNnLVxcdTAwM2V2ZWMuaW92ZWM7XFxuaW9fdXJpbmcvbmV0LmM6NjIzOlxcdFxcdGFyZy5tb2RlID0gS0JVRl9NT0RFX0ZSRUU7XFxuaW9fdXJpbmcvbmV0LmMtNjI0LVxcdH1cXG4tLVxcbmlvX3VyaW5nL25ldC5jPTExMzc9c3RhdGljIGludCBpb19yZWN2X2J1Zl9zZWxlY3Qoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2csXFxuLS1cXG5pb191cmluZy9uZXQuYy0xMTU5LVxcdFxcdFxcdGFyZy5pb3ZzID0ga21zZy1cXHUwMDNldmVjLmlvdmVjO1xcbmlvX3VyaW5nL25ldC5jOjExNjA6XFx0XFx0XFx0YXJnLm1vZGUgfD0gS0JVRl9NT0RFX0ZSRUU7XFxuaW9fdXJpbmcvbmV0LmMtMTE2MS1cXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMzOjE0LjE3NzcxNjYxNloiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMzg3NzcyNjE2NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYSBQb3RlbnRpYWwgVXNlLUFmdGVyLUZyZWUgVnVsbmVyYWJpbGl0eSBpbiBpb191cmluZyoqXG5cbk9rYXksIGxldCdzIHNlZS4gSW4gYGlvX3JpbmdfYnVmZmVyc19wZWVrYCwgSSdtIGxvb2tpbmcgYXQgdGhlIGxvZ2ljIHJlbGF0ZWQgdG8gYGFyZy1cdTAwM2Vpb3ZzYCBhbmQgaG93IGl0IGhhbmRsZXMgcG90ZW50aWFsIHJlYWxsb2NhdGlvbi4gSSBzZWUgdGhhdCBpZiBgS0JVRl9NT0RFX0VYUEFORGAgaXMgc2V0IGFuZCBtb3JlIGlvdmVjcyBhcmUgbmVlZGVkLCBhIG5ldyBgaW92YCBhcnJheSBpcyBhbGxvY2F0ZWQgdXNpbmcgYGttYWxsb2Nfb2Jqc2AuIFRoaXMgbmV3IGFycmF5IHRoZW4gb3ZlcndyaXRlcyB0aGUgZXhpc3RpbmcgYGFyZy1cdTAwM2Vpb3ZzYCBwb2ludGVyLiBUaGUgZnVuY3Rpb24gdGhlbiBwcm9jZWVkcyB0byBwcm9jZXNzIHRoZSBkYXRhLlxuXG5Ob3csIEknbSB0aGlua2luZyBhYm91dCB0aGUgZnJlZWluZyBsb2dpYyBhdCB0aGUgZW5kLiBPcmlnaW5hbGx5LCBga2ZyZWUoYXJnLVx1MDAzZWlvdnMpYCB3YXMgY2FsbGVkIG9ubHkgaWYgYSBuZXcgYGlvdmAgd2Fzbid0IGFsbG9jYXRlZC4gVGhpcyBtZWFucyB0aGF0IGlmIGl0ICp3YXMqIHJlYWxsb2NhdGVkLCB0aGUgb2xkIG9uZSB3YXMgbGVha2VkLiBJdCB3YXMgYXR0ZW1wdGluZyB0byBzb2x2ZSB0aGUgb2xkIGxlYWssIGJ5IGludHJvZHVjaW5nIGEgbmV3IGBrZnJlZShhcmctXHUwMDNlaW92cylgIGNhbGwgYXQgdGhlIGVuZCwgY29uZGl0aW9uYWwgb24gYEtCVUZfTU9ERV9GUkVFYC5cblxuQnV0Li4uIGhvbGQgb24uIElmIGBhcmctXHUwMDNlaW92c2AgaXMgdXBkYXRlZCB0byBhIG5ldyBgaW92YCwgdGhlbiBga2ZyZWUoYXJnLVx1MDAzZWlvdnMpYCBhdCB0aGUgZW5kIHdpbGwgZnJlZSB0aGUgbmV3bHkgYWxsb2NhdGVkIGBpb3ZgISBUaGUgKm5ldyogb25lLiBBbmQgaXQgKmRvZXNuJ3QqIGZyZWUgdGhlIG9sZCBvbmUgYmVjYXVzZSBgYXJnLVx1MDAzZWlvdnNgIHdhcyBvdmVyd3JpdHRlbiEgSG93ZXZlciwgaWYgYGFyZy1cdTAwM2Vpb3ZzYCBpcyAqbm90KiB1cGRhdGVkLCB0aGUgb2xkIG9uZSAqaXMqIGZyZWVkLCB3aGljaCBpcyB0aGUgb3JpZ2luYWwgaW50ZW50LlxuXG5XaHkgZGlkIHN5ei1jbHVzdGVyIGFwcGx5IHRoaXMgcGF0Y2g/IEhtbSwgSSBzZWUgdGhlIHBhdGNoIG5vdy4gSXQgKm1vdmVkKiB0aGUgYGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKWAgdG8gdGhlIGVuZCBhbmQgYWRkZWQgdGhlIGBLQlVGX01PREVfRlJFRWAgY29uZGl0aW9uLiBBaGEhIFRoaXMgaXMgdGhlIGtleS4gVGhlIHBhdGNoIG5vdyBpbnRyb2R1Y2VzIGEgYnVnISBJdCBmcmVlcyBgYXJnLVx1MDAzZWlvdnNgIGF0IHRoZSAqZW5kKiBvZiB0aGUgZnVuY3Rpb24sIHdoaWNoIG1lYW5zIHRoZSBwb2ludGVyIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGBhcmctXHUwMDNlaW92c2ApIGlzIGJlaW5nIGZyZWVkICpiZWZvcmUqIHRoZSBjYWxsZXIgZ2V0cyBhIGNoYW5jZSB0byB1c2UgaXQuXG5cblNvLCBpZiBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgYGFyZy1cdTAwM2Vpb3ZzYCB3aWxsIEFMV0FZUyBiZSBmcmVlZCBhdCB0aGUgZW5kLiBUaGlzIGlzIGEgY2xlYXIgdXNlLWFmdGVyLWZyZWUhIEFuZCBpdCBsb29rcyBsaWtlIHRoZSBwYXRjaCBpcyBmcm9tIHN5ei1jbHVzdGVyLiBcInN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1wiLi4uIFllcCwgdGhpcyBpcyBhIHBhdGNoIHVuZGVyIHJldmlldywgYW5kIGl0IGludHJvZHVjZXMgYSB1c2UtYWZ0ZXItZnJlZSwgcGxhaW4gYW5kIHNpbXBsZSFcblxuU2luY2UgaXQgaW50cm9kdWNlcyBhIHVzZS1hZnRlci1mcmVlLCBpdCBkZWZpbml0ZWx5IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyBhbmQgc2hvdWxkIGJlIGZ1enplZCEgSXQncyBjcml0aWNhbC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQgYW5kIGhvdyBgYXJnLVx1MDAzZWlvdnNgIGlzIHVzZWQgYWZ0ZXIgdGhpcyBjYWxsLiBJJ2xsIG5lZWQgdG8gY2hlY2sgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgYW5kIGBpb19yZWN2X2J1Zl9zZWxlY3RgIGluIGBpb191cmluZy9uZXQuY2AgYmVjYXVzZSB0aGV5IGFyZSBsaWtlbHkgdGhlIGNhbGxlcnMgdGhhdCBwYXNzIGluIGBhcmdgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MzMzLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzM0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjMzOjI4LjA1NTQ0NTQwMVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDc5NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW9fdXJpbmcvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjA4LFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDYwODpcXHRzdGF0aWMgaW50IGlvX3NlbmRfc2VsZWN0X2J1ZmZlcihzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzLFxcbiA2MDk6XFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBpb19icl9zZWwgKnNlbCwgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZylcXG4gNjEwOlxcdHtcXG4gNjExOlxcdFxcdHN0cnVjdCBpb19zcl9tc2cgKnNyID0gaW9fa2lvY2JfdG9fY21kKHJlcSwgc3RydWN0IGlvX3NyX21zZyk7XFxuIDYxMjpcXHRcXHRzdHJ1Y3QgYnVmX3NlbF9hcmcgYXJnID0ge1xcbiA2MTM6XFx0XFx0XFx0LmlvdnMgPSBcXHUwMDI2a21zZy1cXHUwMDNlZmFzdF9pb3YsXFxuIDYxNDpcXHRcXHRcXHQubWF4X2xlbiA9IG1pbl9ub3RfemVybyhzci1cXHUwMDNlbGVuLCBJTlRfTUFYKSxcXG4gNjE1OlxcdFxcdFxcdC5ucl9pb3ZzID0gMSxcXG4gNjE2OlxcdFxcdFxcdC5idWZfZ3JvdXAgPSBzci1cXHUwMDNlYnVmX2dyb3VwLFxcbiA2MTc6XFx0XFx0fTtcXG4gNjE4OlxcdFxcdGludCByZXQ7XFxuIDYxOTpcXHRcXG4gNjIwOlxcdFxcdGlmIChrbXNnLVxcdTAwM2V2ZWMuaW92ZWMpIHtcXG4gNjIxOlxcdFxcdFxcdGFyZy5ucl9pb3ZzID0ga21zZy1cXHUwMDNldmVjLm5yO1xcbiA2MjI6XFx0XFx0XFx0YXJnLmlvdnMgPSBrbXNnLVxcdTAwM2V2ZWMuaW92ZWM7XFxuIDYyMzpcXHRcXHRcXHRhcmcubW9kZSA9IEtCVUZfTU9ERV9GUkVFO1xcbiA2MjQ6XFx0XFx0fVxcbiA2MjU6XFx0XFxuIDYyNjpcXHRcXHRpZiAoIShzci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT1JJTkdfUkVDVlNFTkRfQlVORExFKSlcXG4gNjI3OlxcdFxcdFxcdGFyZy5ucl9pb3ZzID0gMTtcXG4gNjI4OlxcdFxcdGVsc2VcXG4gNjI5OlxcdFxcdFxcdGFyZy5tb2RlIHw9IEtCVUZfTU9ERV9FWFBBTkQ7XFxuIDYzMDpcXHRcXG4gNjMxOlxcdFxcdHJldCA9IGlvX2J1ZmZlcnNfc2VsZWN0KHJlcSwgXFx1MDAyNmFyZywgc2VsLCBpc3N1ZV9mbGFncyk7XFxuIDYzMjpcXHRcXHRpZiAodW5saWtlbHkocmV0IFxcdTAwM2MgMCkpXFxuIDYzMzpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA2MzQ6XFx0XFxuIDYzNTpcXHRcXHRpZiAoYXJnLmlvdnMgIT0gXFx1MDAyNmttc2ctXFx1MDAzZWZhc3RfaW92IFxcdTAwMjZcXHUwMDI2IGFyZy5pb3ZzICE9IGttc2ctXFx1MDAzZXZlYy5pb3ZlYykge1xcbiA2MzY6XFx0XFx0XFx0a21zZy1cXHUwMDNldmVjLm5yID0gcmV0O1xcbiA2Mzc6XFx0XFx0XFx0a21zZy1cXHUwMDNldmVjLmlvdmVjID0gYXJnLmlvdnM7XFxuIDYzODpcXHRcXHRcXHRyZXEtXFx1MDAzZWZsYWdzIHw9IFJFUV9GX05FRURfQ0xFQU5VUDtcXG4gNjM5OlxcdFxcdH1cXG4gNjQwOlxcdFxcdHNyLVxcdTAwM2VsZW4gPSBhcmcub3V0X2xlbjtcXG4gNjQxOlxcdFxcbiA2NDI6XFx0XFx0aWYgKHJldCA9PSAxKSB7XFxuIDY0MzpcXHRcXHRcXHRzci1cXHUwMDNlYnVmID0gYXJnLmlvdnNbMF0uaW92X2Jhc2U7XFxuIDY0NDpcXHRcXHRcXHRyZXQgPSBpbXBvcnRfdWJ1ZihJVEVSX1NPVVJDRSwgc3ItXFx1MDAzZWJ1Ziwgc3ItXFx1MDAzZWxlbixcXG4gNjQ1OlxcdFxcdFxcdFxcdFxcdFxcdFxcdTAwMjZrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIpO1xcbiA2NDY6XFx0XFx0XFx0aWYgKHVubGlrZWx5KHJldCkpXFxuIDY0NzpcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiA2NDg6XFx0XFx0fSBlbHNlIHtcXG4gNjQ5OlxcdFxcdFxcdGlvdl9pdGVyX2luaXQoXFx1MDAyNmttc2ctXFx1MDAzZW1zZy5tc2dfaXRlciwgSVRFUl9TT1VSQ0UsXFxuIDY1MDpcXHRcXHRcXHRcXHRcXHRhcmcuaW92cywgcmV0LCBhcmcub3V0X2xlbik7XFxuIDY1MTpcXHRcXHR9XFxuIDY1MjpcXHRcXG4gNjUzOlxcdFxcdHJldHVybiAwO1xcbiA2NTQ6XFx0fVxcbiA2NTU6XFx0XFxuIDY1NjpcXHRpbnQgaW9fc2VuZChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxcbiA2NTc6XFx0e1xcbiA2NTg6XFx0XFx0c3RydWN0IGlvX3NyX21zZyAqc3IgPSBpb19raW9jYl90b19jbWQocmVxLCBzdHJ1Y3QgaW9fc3JfbXNnKTtcXG4gNjU5OlxcdFxcdHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2cgPSByZXEtXFx1MDAzZWFzeW5jX2RhdGE7XFxuIDY2MDpcXHRcXHRzdHJ1Y3QgaW9fYnJfc2VsIHNlbCA9IHsgfTtcXG4gNjYxOlxcdFxcdHN0cnVjdCBzb2NrZXQgKnNvY2s7XFxuIDY2MjpcXHRcXHR1bnNpZ25lZCBmbGFncztcXG4gNjYzOlxcdFxcdGludCBtaW5fcmV0ID0gMDtcXG4gNjY0OlxcdFxcdGludCByZXQ7XFxuIDY2NTpcXHRcXG4gNjY2OlxcdFxcdHNvY2sgPSBzb2NrX2Zyb21fZmlsZShyZXEtXFx1MDAzZWZpbGUpO1xcbiA2Njc6XFx0XFx0aWYgKHVubGlrZWx5KCFzb2NrKSlcXG4gNjY4OlxcdFxcdFxcdHJldHVybiAtRU5PVFNPQ0s7XFxuIDY2OTpcXHRcXG4gNjcwOlxcdFxcdGlmICghKHJlcS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBSRVFfRl9QT0xMRUQpIFxcdTAwMjZcXHUwMDI2XFxuIDY3MTpcXHRcXHQgICAgKHNyLVxcdTAwM2VmbGFncyBcXHUwMDI2IElPUklOR19SRUNWU0VORF9QT0xMX0ZJUlNUKSlcXG4gNjcyOlxcdFxcdFxcdHJldHVybiAtRUFHQUlOO1xcbiA2NzM6XFx0XFxuIDY3NDpcXHRcXHRpZiAocmVxLVxcdTAwM2VmbGFncyBcXHUwMDI2IFJFUV9GX0lNUE9SVF9CVUZGRVIpIHtcXG4gNjc1OlxcdFxcdFxcdHJldCA9IGlvX2ltcG9ydF9yZWdfYnVmKHJlcSwgXFx1MDAyNmttc2ctXFx1MDAzZW1zZy5tc2dfaXRlcixcXG4gNjc2OlxcdFxcdFxcdFxcdFxcdFxcdCh1NjQpKHVpbnRwdHJfdClzci1cXHUwMDNlYnVmLCBzci1cXHUwMDNlbGVuLFxcbiA2Nzc6XFx0XFx0XFx0XFx0XFx0XFx0SVRFUl9TT1VSQ0UsIGlzc3VlX2ZsYWdzKTtcXG4gNjc4OlxcdFxcdFxcdGlmICh1bmxpa2VseShyZXQpKVxcbiA2Nzk6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gNjgwOlxcdFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgXFx1MDAyNj0gflJFUV9GX0lNUE9SVF9CVUZGRVI7XFxuIDY4MTpcXHRcXHR9XFxuIDY4MjpcXHRcXG4gNjgzOlxcdFxcdGZsYWdzID0gc3ItXFx1MDAzZW1zZ19mbGFncztcXG4gNjg0OlxcdFxcdGlmIChpc3N1ZV9mbGFncyBcXHUwMDI2IElPX1VSSU5HX0ZfTk9OQkxPQ0spXFxuIDY4NTpcXHRcXHRcXHRmbGFncyB8PSBNU0dfRE9OVFdBSVQ7XFxuIDY4NjpcXHRcXG4gNjg3OlxcdHJldHJ5X2J1bmRsZTpcXG4gNjg4OlxcdFxcdHNlbC5idWZfbGlzdCA9IE5VTEw7XFxuIDY4OTpcXHRcXHRpZiAoaW9fZG9fYnVmZmVyX3NlbGVjdChyZXEpKSB7XFxuIDY5MDpcXHRcXHRcXHRyZXQgPSBpb19zZW5kX3NlbGVjdF9idWZmZXIocmVxLCBpc3N1ZV9mbGFncywgXFx1MDAyNnNlbCwga21zZyk7XFxuIDY5MTpcXHRcXHRcXHRpZiAocmV0KVxcbiA2OTI6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gNjkzOlxcdFxcdH1cXG4gNjk0OlxcdFxcbiA2OTU6XFx0XFx0LypcXG4gNjk2OlxcdFxcdCAqIElmIE1TR19XQUlUQUxMIGlzIHNldCwgb3IgdGhpcyBpcyBhIGJ1bmRsZSBzZW5kLCB0aGVuIHdlIG5lZWRcXG4gNjk3OlxcdFxcdCAqIHRoZSBmdWxsIGFtb3VudC4gSWYganVzdCBidW5kbGUgaXMgc2V0LCBpZiB3ZSBkbyBhIHNob3J0IHNlbmRcXG4gNjk4OlxcdFxcdCAqIHRoZW4gd2UgY29tcGxldGUgdGhlIGJ1bmRsZSBzZXF1ZW5jZSByYXRoZXIgdGhhbiBjb250aW51ZSBvbi5cXG4gNjk5OlxcdFxcdCAqL1xcbiA3MDA6XFx0XFx0aWYgKGZsYWdzIFxcdTAwMjYgTVNHX1dBSVRBTEwgfHwgc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0JVTkRMRSlcXG4gNzAxOlxcdFxcdFxcdG1pbl9yZXQgPSBpb3ZfaXRlcl9jb3VudChcXHUwMDI2a21zZy1cXHUwMDNlbXNnLm1zZ19pdGVyKTtcXG4gNzAyOlxcdFxcbiA3MDM6XFx0XFx0ZmxhZ3MgXFx1MDAyNj0gfk1TR19JTlRFUk5BTF9TRU5ETVNHX0ZMQUdTO1xcbiA3MDQ6XFx0XFx0a21zZy1cXHUwMDNlbXNnLm1zZ19mbGFncyA9IGZsYWdzO1xcbiA3MDU6XFx0XFx0cmV0ID0gc29ja19zZW5kbXNnKHNvY2ssIFxcdTAwMjZrbXNnLVxcdTAwM2Vtc2cpO1xcbiA3MDY6XFx0XFx0aWYgKHJldCBcXHUwMDNjIG1pbl9yZXQpIHtcXG4gNzA3OlxcdFxcdFxcdGlmIChyZXQgPT0gLUVBR0FJTiBcXHUwMDI2XFx1MDAyNiAoaXNzdWVfZmxhZ3MgXFx1MDAyNiBJT19VUklOR19GX05PTkJMT0NLKSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzM6MjguMDU1Nzk2NDIxWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwNTc4NTEwNzAzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlVzZS1BZnRlci1GcmVlIEJ1ZyBpbiBpb19zZW5kX3NlbGVjdF9idWZmZXIqKlxuXG5Pa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBJdCBsb29rcyBsaWtlIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGhhcyBhIGNyaXRpY2FsIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkuIFRoZSBjb3JlIHByb2JsZW0gbGllcyBpbiB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCwgYGlvX2J1ZmZlcnNfc2VsZWN0YCwgYW5kIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuXG5cbkZpcnN0LCBpZiBga21zZy1cdTAwM2V2ZWMuaW92ZWNgIGlzIGFscmVhZHkgYWxsb2NhdGVkIOKAkyBtZWFuaW5nIGBpb19zZW5kYCB3YXMgcHJldmlvdXNseSBjYWxsZWQgd2l0aCBhbiBpb3ZlYyBhcnJheSAobGlrZWx5IHRocm91Z2ggYGlvX3NlbmRtc2dgIG9yIGBpb19yZWN2bXNnYCBvciBhIHByZXZpb3VzIGFsbG9jYXRpb24pIOKAkyBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBzZXRzIGBhcmcubW9kZSA9IEtCVUZfTU9ERV9GUkVFYC4gIFRoZW4gYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBpcyBjYWxsZWQuXG5cbkhlcmUncyB0aGUgY3J1eDogaWYgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCAqYWxsb2NhdGVzKiBhIG5ldyBgaW92YCwgaXQgc2V0cyBgYXJnLmlvdnNgIHRvIHRoYXQgbmV3IGFsbG9jYXRpb24uIEhvd2V2ZXIsIGF0IHRoZSAqZW5kKiBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLCBpdCB1bmNvbmRpdGlvbmFsbHkgY2FsbHMgYGtmcmVlKGFyZy1cdTAwM2Vpb3ZzKWAgYmVjYXVzZSBgYXJnLm1vZGVgIGhhcyBgS0JVRl9NT0RFX0ZSRUVgIHNldC4gIFNvIHdlJ3ZlIGp1c3QgZnJlZWQgdGhlICpuZXdseSBhbGxvY2F0ZWQqIGBpb3ZgLiAgVGhlbiBiYWNrIGluIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgLCB0aGUgY29kZSBwcm9jZWVkcywgYW5kIG5vdyBga21zZy1cdTAwM2V2ZWMuaW92ZWNgIHBvaW50cyB0byBmcmVlZCBtZW1vcnkhIFRoZW4gd2UgdXNlIHRoYXQgZnJlZWQgbWVtb3J5ISBDbGFzc2ljIHVzZS1hZnRlci1mcmVlLlxuXG5CdXQgd2hhdCBpZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgICpkb2Vzbid0KiBhbGxvY2F0ZSBhIG5ldyBgaW92YD8gSW4gdGhhdCBjYXNlLCBgYXJnLVx1MDAzZWlvdnNgIHJlbWFpbnMgYGttc2ctXHUwMDNldmVjLmlvdmVjYC4gQXQgdGhlICplbmQqIG9mIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AsIGl0IHN0aWxsIGNhbGxzIGBrZnJlZShhcmctXHUwMDNlaW92cylgLCB3aGljaCBpcyBzdGlsbCBga21zZy1cdTAwM2V2ZWMuaW92ZWNgLCB3aGljaCBoYXMgYmVlbiBmcmVlZC4gVGhlIGNvZGUgY29udGludWVzIGluIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGFuZCB0aGVuIHByb2NlZWRzLCBhbmQgYWdhaW4sIGBhcmcuaW92c2AgaXMgdXNlZCBhZnRlciBiZWluZyBmcmVlZC5cblxuU28sIGluICpib3RoKiBzY2VuYXJpb3MgKG5ldyBpb3YgYWxsb2NhdGVkIG9yIG5vdCksIHRoZSBjb2RlIGZyZWVzIHRoZSBgaW92c2AgYXJyYXkgYW5kIHRoZW4gKmltbWVkaWF0ZWx5KiB1c2VzIGl0LiAgVGhpcyBpcyBhIGd1YXJhbnRlZWQsIHJlcHJvZHVjaWJsZSB1c2UtYWZ0ZXItZnJlZSBidWcgaWYgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQuXG5cbldoZW4gZG9lcyBgS0JVRl9NT0RFX0ZSRUVgIGdldCBzZXQ/ICBJdCBnZXRzIHNldCB3aGVuIGBrbXNnLVx1MDAzZXZlYy5pb3ZlY2AgaXMgbm9uLU5VTEwsIGFuZCB3ZSBlc3RhYmxpc2hlZCB0aGF0IGhhcHBlbnMgd2hlbiBgaW9fc2VuZGAgaXMgY2FsbGVkIHdpdGggYSBwcmUtYWxsb2NhdGVkIGlvdmVjIGFycmF5LiAgVGhpcyBtZWFucyB1c2luZyBgaW9fc2VuZG1zZ2Agb3IgYGlvX3JlY3Ztc2dgLCBvciBhZnRlciB0aGUgYXJyYXkgaGFzIGJlZW4gYWxsb2NhdGVkIGZyb20gYSBwcmV2aW91cyBjYWxsLiBJIG5lZWQgdG8gY29uZmlybSB3aGVyZSBgaW9fc2VuZGAgYWN0dWFsbHkgKnVzZXMqIGBrbXNnLVx1MDAzZXZlYy5pb3ZlY2AuIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIGBpb19zZW5kX3NldHVwYCBvciBzb21ldGhpbmcgc2ltaWxhciBmb3IgdGhlIGRldGFpbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMzY2LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODc2LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzM6MzguNjM0MzA5ODQzWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTIwMDEzNTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia21zZy1cXHUwMDNldmVjLmlvdmVjID1cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW9fdXJpbmcvbmV0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcvbmV0LmM9NjA4PXN0YXRpYyBpbnQgaW9fc2VuZF9zZWxlY3RfYnVmZmVyKHN0cnVjdCBpb19raW9jYiAqcmVxLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MsXFxuLS1cXG5pb191cmluZy9uZXQuYy02MzYtXFx0XFx0a21zZy1cXHUwMDNldmVjLm5yID0gcmV0O1xcbmlvX3VyaW5nL25ldC5jOjYzNzpcXHRcXHRrbXNnLVxcdTAwM2V2ZWMuaW92ZWMgPSBhcmcuaW92cztcXG5pb191cmluZy9uZXQuYy02MzgtXFx0XFx0cmVxLVxcdTAwM2VmbGFncyB8PSBSRVFfRl9ORUVEX0NMRUFOVVA7XFxuLS1cXG5pb191cmluZy9uZXQuYz0xMTM3PXN0YXRpYyBpbnQgaW9fcmVjdl9idWZfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLFxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtMTE3Ni1cXHRcXHRcXHRrbXNnLVxcdTAwM2V2ZWMubnIgPSByZXQ7XFxuaW9fdXJpbmcvbmV0LmM6MTE3NzpcXHRcXHRcXHRrbXNnLVxcdTAwM2V2ZWMuaW92ZWMgPSBhcmcuaW92cztcXG5pb191cmluZy9uZXQuYy0xMTc4LVxcdFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfTkVFRF9DTEVBTlVQO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozMzozOC43ODYzMTc5MDlaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTExMDA3MzExODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRlYnVnZ2luZyBhIEtlcm5lbCBNZXNzYWdpbmcgSXNzdWUqKlxuXG5Pa2F5LCBob2xkIG9uLiBUaGlzIGBrbXNnLVx1MDAzZXZlYy5pb3ZlY2AgcG9pbnRlci4uLiBpdCdzIGluaXRpYWxpemVkIHRvIGBOVUxMYD8gVGhhdCdzIGRlZmluaXRlbHkgbm90IHJpZ2h0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGVuIGFuZCBob3cgdGhpcyB2ZWN0b3IgaXMgc3VwcG9zZWQgdG8gYmUgcG9wdWxhdGVkLiBUaGUgZmFjdCB0aGF0IGl0J3MgYE5VTExgIG5vdyBpbXBsaWVzIGFuIGlzc3VlIGVhcmxpZXIgaW4gdGhlIHNldHVwLiBNeSBpbW1lZGlhdGUgaW5zdGluY3QgaXMgdG8gdHJhY2UgdGhpcyBiYWNrIHRocm91Z2ggdGhlIHNlbmQgcGF0aC4gSSdsbCBuZWVkIHRvIGxvb2sgYXQgZWl0aGVyIGBpb19zZW5kbXNnX3ByZXBgIG9yIHBvc3NpYmx5IGV2ZW4gYGlvX3NlbmRfcHJlcGAgZGVwZW5kaW5nIG9uIGhvdyB0aGUgbWVzc2FnaW5nIGlzIHN0cnVjdHVyZWQgaW4gdGhpcyBzcGVjaWZpYyBtb2R1bGUuIEl0IGlzIG1vc3QgbGlrZWx5IGluIG9uZSBvZiB0aG9zZSBmdW5jdGlvbnMuIEkgbmVlZCB0byBxdWlja2x5IGlkZW50aWZ5IHdoZXJlIHRoZSBgaW92ZWNgIGdldHMgYWxsb2NhdGVkIGFuZCBwb3B1bGF0ZWQuIFRoaXMgd2lsbCBhbGxvdyBtZSB0byBuYXJyb3cgZG93biB0aGUgc291cmNlIG9mIHRoaXMgcG90ZW50aWFsbHkgZmF0YWwgZXJyb3IuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0MTYyLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzM6NDkuODg3MDUxNjAxWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDgzNDA1OTksIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX3NlbmRfcHJlcFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzM6NDkuOTk1NDEyODRaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjc0MTYzNjYyMzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgZGVsaXZlcmVkIGFzIGEgZmlyc3QtcGVyc29uIHN1bW1hcnk6XG5cbioqRGl2aW5nIGludG8gaW9cXF9zZW5kbXNnXFxfcHJlcCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGluLiBMZXQncyBnZXQgcmlnaHQgZG93biB0byBpdC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gYGlvX3NlbmRtc2dfcHJlcGAuIEdpdmVuIG15IGV4cGVyaWVuY2UsIEkga25vdyB0aGlzIGlzIG9mdGVuIGEgY3JpdGljYWwgcG9pbnQgaW4gdGhlIG5ldHdvcmtpbmcgc3RhY2ssIHNvIEknbGwgd2FudCB0byBjYXJlZnVsbHkgZXhhbWluZSB0aGUgcHJlcGFyYXRpb24gc3RhZ2VzIGZvciBgc2VuZG1zZ2AuIFRoaW5ncyBjYW4gZ2V0IGhhaXJ5IHF1aWNrbHkgaW4gdGhpcyBhcmVhLCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIGFuY2lsbGFyeSBkYXRhLCBzY2F0dGVyL2dhdGhlciBJL08sIGFuZCB0aGUgbnVhbmNlcyBvZiB2YXJpb3VzIHNvY2tldCB0eXBlcy4gSSdtIGltbWVkaWF0ZWx5IHRoaW5raW5nIGFib3V0IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGJ1ZmZlciBtYW5hZ2VtZW50IGlzc3VlcywgYW5kIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgdGhlIHRyYW5zaXRpb24gZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4gSSdsbCBuZWVkIHRvIGxvb2sgY2xvc2VseSBhdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIHVzZWQsIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHJhdGVnaWVzLCBhbmQgYW55IHBvdGVudGlhbCBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuIFRpbWUgdG8gc2VlIHdoYXQncyByZWFsbHkgZ29pbmcgb24gdW5kZXIgdGhlIGhvb2QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0NDMwLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzQ6MTcuNDExNzgzMjk2WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1ODEwNzYwNDMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaW9fc2VuZG1zZ19wcmVwXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImlvX3VyaW5nL25ldC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImlvX3VyaW5nL25ldC5jPTM5Nj1zdGF0aWMgaW50IGlvX3NlbmRtc2dfc2V0dXAoc3RydWN0IGlvX2tpb2NiICpyZXEsIGNvbnN0IHN0cnVjdCBpb191cmluZ19zcWUgKnNxZSlcXG4tLVxcbmlvX3VyaW5nL25ldC5jLTQyMy1cXG5pb191cmluZy9uZXQuYzo0MjQ6aW50IGlvX3NlbmRtc2dfcHJlcChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxcbmlvX3VyaW5nL25ldC5jLTQyNS17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjE3Ljk5Mjg2NDc5OVoiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0MTI1MTA1NDE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBjb2RlLlxuXG4qKkFuYWx5emluZyBgaW9fc2VuZG1zZ19wcmVwYCBhbmQgYGlvX3NlbmRfcHJlcGAqKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIGhvdyB0aGVzZSBmdW5jdGlvbnMgd29yay4gU3RhcnRpbmcgd2l0aCBgaW9fc2VuZG1zZ19wcmVwYC4uLiBhbmQgbm93IEknbSB0aGlua2luZywgYmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uLCBgaW9fc2VuZF9wcmVwYCBpcyBwcm9iYWJseSB0aGUgYXN5bmNocm9ub3VzIHZlcnNpb24gb3IgaGFzIHNvbWUgc29ydCBvZiBhc3luY2hyb25vdXMgY29tcG9uZW50LiBQZXJoYXBzIGl0J3MgY2FsbGVkIHNvbWV0aGluZyBsaWtlIGBpb19zZW5kX3ByZXBfYXN5bmNgLCBvciBoYXMgYSBzaW1pbGFyIG5hbWluZyBwYXR0ZXJuLiBOZWVkIHRvIGNvbmZpcm0gdGhhdCBxdWlja2x5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDgwMiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjIyLjExNzk3NDU5NFoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTA2NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW9fdXJpbmcvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDAwLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQwMDpcXHRcXHRzdHJ1Y3QgdXNlcl9tc2doZHIgbXNnO1xcbiA0MDE6XFx0XFx0aW50IHJldDtcXG4gNDAyOlxcdFxcbiA0MDM6XFx0XFx0c3ItXFx1MDAzZWZsYWdzIHw9IElPUklOR19TRU5EX1ZFQ1RPUklaRUQ7XFxuIDQwNDpcXHRcXHRzci1cXHUwMDNldW1zZyA9IHU2NF90b191c2VyX3B0cihSRUFEX09OQ0Uoc3FlLVxcdTAwM2VhZGRyKSk7XFxuIDQwNTpcXHRcXHRyZXQgPSBpb19tc2dfY29weV9oZHIocmVxLCBrbXNnLCBcXHUwMDI2bXNnLCBJVEVSX1NPVVJDRSwgTlVMTCk7XFxuIDQwNjpcXHRcXHRpZiAodW5saWtlbHkocmV0KSlcXG4gNDA3OlxcdFxcdFxcdHJldHVybiByZXQ7XFxuIDQwODpcXHRcXHQvKiBzYXZlIG1zZ19jb250cm9sIGFzIHN5c19zZW5kbXNnKCkgb3ZlcndyaXRlcyBpdCAqL1xcbiA0MDk6XFx0XFx0c3ItXFx1MDAzZW1zZ19jb250cm9sID0ga21zZy1cXHUwMDNlbXNnLm1zZ19jb250cm9sX3VzZXI7XFxuIDQxMDpcXHRcXG4gNDExOlxcdFxcdGlmIChzci1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT1JJTkdfUkVDVlNFTkRfRklYRURfQlVGKSB7XFxuIDQxMjpcXHRcXHRcXHRrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIubnJfc2VncyA9IG1zZy5tc2dfaW92bGVuO1xcbiA0MTM6XFx0XFx0XFx0cmV0dXJuIGlvX3ByZXBfcmVnX2lvdmVjKHJlcSwgXFx1MDAyNmttc2ctXFx1MDAzZXZlYywgbXNnLm1zZ19pb3YsXFxuIDQxNDpcXHRcXHRcXHRcXHRcXHRcXHQgbXNnLm1zZ19pb3ZsZW4pO1xcbiA0MTU6XFx0XFx0fVxcbiA0MTY6XFx0XFx0aWYgKHJlcS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBSRVFfRl9CVUZGRVJfU0VMRUNUKVxcbiA0MTc6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDQxODpcXHRcXHRyZXR1cm4gaW9fbmV0X2ltcG9ydF92ZWMocmVxLCBrbXNnLCBtc2cubXNnX2lvdiwgbXNnLm1zZ19pb3ZsZW4sIElURVJfU09VUkNFKTtcXG4gNDE5OlxcdH1cXG4gNDIwOlxcdFxcbiA0MjE6XFx0I2RlZmluZSBTRU5ETVNHX0ZMQUdTIChJT1JJTkdfUkVDVlNFTkRfUE9MTF9GSVJTVCB8IElPUklOR19SRUNWU0VORF9CVU5ETEUgfCBcXFxcXFxuIDQyMjpcXHRcXHRcXHRcXHRJT1JJTkdfU0VORF9WRUNUT1JJWkVEIHwgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRilcXG4gNDIzOlxcdFxcbiA0MjQ6XFx0aW50IGlvX3NlbmRtc2dfcHJlcChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxcbiA0MjU6XFx0e1xcbiA0MjY6XFx0XFx0c3RydWN0IGlvX3NyX21zZyAqc3IgPSBpb19raW9jYl90b19jbWQocmVxLCBzdHJ1Y3QgaW9fc3JfbXNnKTtcXG4gNDI3OlxcdFxcbiA0Mjg6XFx0XFx0c3ItXFx1MDAzZWRvbmVfaW8gPSAwO1xcbiA0Mjk6XFx0XFx0c3ItXFx1MDAzZWxlbiA9IFJFQURfT05DRShzcWUtXFx1MDAzZWxlbik7XFxuIDQzMDpcXHRcXHRpZiAodW5saWtlbHkoc3ItXFx1MDAzZWxlbiBcXHUwMDNjIDApKVxcbiA0MzE6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQzMjpcXHRcXHRzci1cXHUwMDNlZmxhZ3MgPSBSRUFEX09OQ0Uoc3FlLVxcdTAwM2Vpb3ByaW8pO1xcbiA0MzM6XFx0XFx0aWYgKHNyLVxcdTAwM2VmbGFncyBcXHUwMDI2IH5TRU5ETVNHX0ZMQUdTKVxcbiA0MzQ6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQzNTpcXHRcXHRpZiAoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRikge1xcbiA0MzY6XFx0XFx0XFx0LyogcmVnaXN0ZXJlZCBidWZmZXIgc2VuZCBvbmx5IHN1cHBvcnRlZCBmb3IgcGxhaW4gSU9SSU5HX09QX1NFTkQgKi9cXG4gNDM3OlxcdFxcdFxcdGlmIChyZXEtXFx1MDAzZW9wY29kZSAhPSBJT1JJTkdfT1BfU0VORCB8fFxcbiA0Mzg6XFx0XFx0XFx0ICAgIChyZXEtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUkVRX0ZfQlVGRkVSX1NFTEVDVCkgfHxcXG4gNDM5OlxcdFxcdFxcdCAgICAoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgKElPUklOR19SRUNWU0VORF9CVU5ETEV8SU9SSU5HX1NFTkRfVkVDVE9SSVpFRCkpKVxcbiA0NDA6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQ0MTpcXHRcXHRcXHRyZXEtXFx1MDAzZWJ1Zl9pbmRleCA9IFJFQURfT05DRShzcWUtXFx1MDAzZWJ1Zl9pbmRleCk7XFxuIDQ0MjpcXHRcXHR9XFxuIDQ0MzpcXHRcXHRzci1cXHUwMDNlbXNnX2ZsYWdzID0gUkVBRF9PTkNFKHNxZS1cXHUwMDNlbXNnX2ZsYWdzKSB8IE1TR19OT1NJR05BTDtcXG4gNDQ0OlxcdFxcdGlmIChzci1cXHUwMDNlbXNnX2ZsYWdzIFxcdTAwMjYgTVNHX0RPTlRXQUlUKVxcbiA0NDU6XFx0XFx0XFx0cmVxLVxcdTAwM2VmbGFncyB8PSBSRVFfRl9OT1dBSVQ7XFxuIDQ0NjpcXHRcXHRpZiAocmVxLVxcdTAwM2VmbGFncyBcXHUwMDI2IFJFUV9GX0JVRkZFUl9TRUxFQ1QpXFxuIDQ0NzpcXHRcXHRcXHRzci1cXHUwMDNlYnVmX2dyb3VwID0gcmVxLVxcdTAwM2VidWZfaW5kZXg7XFxuIDQ0ODpcXHRcXHRpZiAoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0JVTkRMRSkge1xcbiA0NDk6XFx0XFx0XFx0aWYgKHJlcS1cXHUwMDNlb3Bjb2RlID09IElPUklOR19PUF9TRU5ETVNHKVxcbiA0NTA6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQ1MTpcXHRcXHRcXHRzci1cXHUwMDNlbXNnX2ZsYWdzIHw9IE1TR19XQUlUQUxMO1xcbiA0NTI6XFx0XFx0XFx0cmVxLVxcdTAwM2VmbGFncyB8PSBSRVFfRl9NVUxUSVNIT1Q7XFxuIDQ1MzpcXHRcXHR9XFxuIDQ1NDpcXHRcXG4gNDU1OlxcdFxcdGlmIChpb19pc19jb21wYXQocmVxLVxcdTAwM2VjdHgpKVxcbiA0NTY6XFx0XFx0XFx0c3ItXFx1MDAzZW1zZ19mbGFncyB8PSBNU0dfQ01TR19DT01QQVQ7XFxuIDQ1NzpcXHRcXG4gNDU4OlxcdFxcdGlmICh1bmxpa2VseSghaW9fbXNnX2FsbG9jX2FzeW5jKHJlcSkpKVxcbiA0NTk6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIDQ2MDpcXHRcXHRpZiAocmVxLVxcdTAwM2VvcGNvZGUgIT0gSU9SSU5HX09QX1NFTkRNU0cpXFxuIDQ2MTpcXHRcXHRcXHRyZXR1cm4gaW9fc2VuZF9zZXR1cChyZXEsIHNxZSk7XFxuIDQ2MjpcXHRcXHRpZiAodW5saWtlbHkoc3FlLVxcdTAwM2VhZGRyMiB8fCBzcWUtXFx1MDAzZWZpbGVfaW5kZXgpKVxcbiA0NjM6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDQ2NDpcXHRcXHRyZXR1cm4gaW9fc2VuZG1zZ19zZXR1cChyZXEsIHNxZSk7XFxuIDQ2NTpcXHR9XFxuIDQ2NjpcXHRcXG4gNDY3OlxcdHN0YXRpYyB2b2lkIGlvX3JlcV9tc2dfY2xlYW51cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSxcXG4gNDY4OlxcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXFxuIDQ2OTpcXHR7XFxuIDQ3MDpcXHRcXHRpb19uZXRtc2dfcmVjeWNsZShyZXEsIGlzc3VlX2ZsYWdzKTtcXG4gNDcxOlxcdH1cXG4gNDcyOlxcdFxcbiA0NzM6XFx0LypcXG4gNDc0OlxcdCAqIEZvciBidW5kbGUgY29tcGxldGlvbnMsIHdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgbWFueSBzZWdtZW50cyB3ZSBjb25zdW1lZC5cXG4gNDc1OlxcdCAqIEEgYnVuZGxlIGNvdWxkIGJlIHVzaW5nIGEgc2luZ2xlIElURVJfVUJVRiBpZiB0aGF0J3MgYWxsIHdlIG1hcHBlZCwgb3IgaXRcXG4gNDc2OlxcdCAqIGNvdWxkIGJlIHVzaW5nIGFuIElURVJfSU9WRUMuIElmIHRoZSBsYXR0ZXIsIHRoZW4gaWYgd2UgY29uc3VtZWQgYWxsIG9mXFxuIDQ3NzpcXHQgKiB0aGUgc2VnbWVudHMsIHRoZW4gaXQncyBhIHRyaXZpYWwgcXVlc3Rpb250IG8gYW5zd2VyLiBJZiB3ZSBoYXZlIHJlc2lkdWFsXFxuIDQ3ODpcXHQgKiBkYXRhIGluIHRoZSBpdGVyLCB0aGVuIGxvb3AgdGhlIHNlZ21lbnRzIHRvIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2VcXG4gNDc5OlxcdCAqIHRyYW5zZmVycmVkLlxcbiA0ODA6XFx0ICovXFxuIDQ4MTpcXHRzdGF0aWMgaW50IGlvX2J1bmRsZV9uYnVmcyhzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLCBpbnQgcmV0KVxcbiA0ODI6XFx0e1xcbiA0ODM6XFx0XFx0c3RydWN0IGlvdmVjICppb3Y7XFxuIDQ4NDpcXHRcXHRpbnQgbmJ1ZnM7XFxuIDQ4NTpcXHRcXG4gNDg2OlxcdFxcdC8qIG5vIGRhdGEgaXMgYWx3YXlzIHplcm8gc2VnbWVudHMsIGFuZCBhIHVidWYgaXMgYWx3YXlzIDEgc2VnbWVudCAqL1xcbiA0ODc6XFx0XFx0aWYgKHJldCBcXHUwMDNjPSAwKVxcbiA0ODg6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDQ4OTpcXHRcXHRpZiAoaXRlcl9pc191YnVmKFxcdTAwMjZrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIpKVxcbiA0OTA6XFx0XFx0XFx0cmV0dXJuIDE7XFxuIDQ5MTpcXHRcXG4gNDkyOlxcdFxcdGlvdiA9IGttc2ctXFx1MDAzZXZlYy5pb3ZlYztcXG4gNDkzOlxcdFxcdGlmICghaW92KVxcbiA0OTQ6XFx0XFx0XFx0aW92ID0gXFx1MDAyNmttc2ctXFx1MDAzZWZhc3RfaW92O1xcbiA0OTU6XFx0XFxuIDQ5NjpcXHRcXHQvKiBpZiBhbGwgZGF0YSB3YXMgdHJhbnNmZXJyZWQsIGl0J3MgYmFzaWMgcG9pbnRlciBtYXRoICovXFxuIDQ5NzpcXHRcXHRpZiAoIWlvdl9pdGVyX2NvdW50KFxcdTAwMjZrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIpKVxcbiA0OTg6XFx0XFx0XFx0cmV0dXJuIGl0ZXJfaW92KFxcdTAwMjZrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIpIC0gaW92O1xcbiA0OTk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjIyLjExODE4NzgzNFoiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMjEwMDMzMTg4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCdzIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipJbnZlc3RpZ2F0aW5nIGBJT1JJTkdfT1BfU0VORGAgYW5kIGBpb19zZW5kX3NldHVwYCoqXG5cbkFscmlnaHQsIGhhbmcgb24gYSBzZWNvbmQuIEknbSBzZWVpbmcgYGlvX3NlbmRfc2V0dXBgIGJlaW5nIGNhbGxlZCBpbiByZWxhdGlvbiB0byBgSU9SSU5HX09QX1NFTkRgLiBUaGF0IGRvZXNuJ3QgaW1tZWRpYXRlbHkgc3RyaWtlIG1lIGFzIHRoZSBtb3N0IG9idmlvdXMgc2V0dXAgZnVuY3Rpb24sIHNvIG15IGN1cmlvc2l0eSBpcyBwaXF1ZWQuIEkgbmVlZCB0byBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQgdGhhdCBwYXJ0aWN1bGFyIHNldHVwIGZ1bmN0aW9uIGlzIGRvaW5nIGluIHRoaXMgY29udGV4dC4gTGV0J3MgZGl2ZSBpbnRvIGBpb19zZW5kX3NldHVwYCBhbmQgbWFrZSBzdXJlIGl0J3MgaGFuZGxpbmcgdGhlIHJpZ2h0IHRoaW5ncywgYW5kIHRoYXQgdGhlcmUgYXJlbid0IGFueSBwb3RlbnRpYWwgc3VidGxldGllcyBJJ20gbWlzc2luZy4gVGltZSB0byBzZWUgd2hhdCdzIGFjdHVhbGx5IGhhcHBlbmluZyB1bmRlciB0aGUgaG9vZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY3OTgsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjI1LjMyODIyNTAxMloiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUyMDUyMjA3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX3NlbmRfc2V0dXBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW9fdXJpbmcvbmV0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcvbmV0LmM9MzQzPXZvaWQgaW9fc2VuZG1zZ19yZWN2bXNnX2NsZWFudXAoc3RydWN0IGlvX2tpb2NiICpyZXEpXFxuLS1cXG5pb191cmluZy9uZXQuYy0zNDktXFxuaW9fdXJpbmcvbmV0LmM6MzUwOnN0YXRpYyBpbnQgaW9fc2VuZF9zZXR1cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxcbmlvX3VyaW5nL25ldC5jLTM1MS17XFxuLS1cXG5pb191cmluZy9uZXQuYz00MjQ9aW50IGlvX3NlbmRtc2dfcHJlcChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtNDYwLVxcdGlmIChyZXEtXFx1MDAzZW9wY29kZSAhPSBJT1JJTkdfT1BfU0VORE1TRylcXG5pb191cmluZy9uZXQuYzo0NjE6XFx0XFx0cmV0dXJuIGlvX3NlbmRfc2V0dXAocmVxLCBzcWUpO1xcbmlvX3VyaW5nL25ldC5jLTQ2Mi1cXHRpZiAodW5saWtlbHkoc3FlLVxcdTAwM2VhZGRyMiB8fCBzcWUtXFx1MDAzZWZpbGVfaW5kZXgpKVxcbi0tXFxuaW9fdXJpbmcvbmV0LmM9MTM3Nz1pbnQgaW9fc2VuZF96Y19wcmVwKHN0cnVjdCBpb19raW9jYiAqcmVxLCBjb25zdCBzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWUpXFxuLS1cXG5pb191cmluZy9uZXQuYy0xNDMyLVxcdGlmIChyZXEtXFx1MDAzZW9wY29kZSA9PSBJT1JJTkdfT1BfU0VORF9aQykge1xcbmlvX3VyaW5nL25ldC5jOjE0MzM6XFx0XFx0cmV0ID0gaW9fc2VuZF9zZXR1cChyZXEsIHNxZSk7XFxuaW9fdXJpbmcvbmV0LmMtMTQzNC1cXHR9IGVsc2Uge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozNDoyNS40ODAyODM4MDlaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODQ4NzM0Mjg2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5J3JlIG15IG93bjpcblxuKipBbmFseXppbmcgYGlvX3NlbmRfc2V0dXBgKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgaW50byB0aGlzIGBpb19zZW5kX3NldHVwYCBmdW5jdGlvbi4gVGhlIG5hbWUgaXRzZWxmIGlzIHByZXR0eSBjbGVhcjsgaXQncyBhYm91dCBzZXR0aW5nIHVwIHRoZSBzZW5kaW5nIHByb2Nlc3MgZm9yIEkvTy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF0IHN0ZXBzIGl0J3MgdGFraW5nIHRvIGdldCBkYXRhIHJlYWR5IGZvciB0cmFuc21pc3Npb24sIHdoYXRldmVyIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIG9yIHByb3RvY29sIG1pZ2h0IGJlLiBXaGF0IHJlc291cmNlcyBpcyBpdCBhbGxvY2F0aW5nPyBXaGF0IGNoZWNrcyBpcyBpdCBwZXJmb3JtaW5nIHRvIGVuc3VyZSB0aGUgc2VuZCBvcGVyYXRpb24gaXMgdmlhYmxlPyBBcmUgdGhlcmUgYW55IG9wdGltaXphdGlvbnMsIGJ1ZmZlcmluZyBzdHJhdGVnaWVzLCBvciBlcnJvci1oYW5kbGluZyBtZWNoYW5pc21zIGF0IHBsYXk/IEknbGwgbmVlZCB0byBkaXNzZWN0IHRoZSBjb2RlIGNhcmVmdWxseSB0byB1bmRlcnN0YW5kIHRoZSBmbG93IGNvbnRyb2wgYW5kIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQuIEknbGwgYmUgcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaWRlbnRpZnlpbmcgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcyBvciBhcmVhcyB3aGVyZSBwZXJmb3JtYW5jZSBjb3VsZCBiZSBpbXByb3ZlZCwgZ2l2ZW4gbXkgZXhwZXJ0aXNlLiBMZXQncyBzZWUgaWYgdGhpcyBzZXR1cCBmdW5jdGlvbiBpcyBvcHRpbWl6ZWQgb3IganVzdCBhIGJhc2ljIGltcGxlbWVudGF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzM5OCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjMzLjk2NzYyOTk3MVoiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODkyNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW9fdXJpbmcvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzUwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzUwOlxcdHN0YXRpYyBpbnQgaW9fc2VuZF9zZXR1cChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgY29uc3Qgc3RydWN0IGlvX3VyaW5nX3NxZSAqc3FlKVxcbiAzNTE6XFx0e1xcbiAzNTI6XFx0XFx0c3RydWN0IGlvX3NyX21zZyAqc3IgPSBpb19raW9jYl90b19jbWQocmVxLCBzdHJ1Y3QgaW9fc3JfbXNnKTtcXG4gMzUzOlxcdFxcdHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2cgPSByZXEtXFx1MDAzZWFzeW5jX2RhdGE7XFxuIDM1NDpcXHRcXHR2b2lkIF9fdXNlciAqYWRkcjtcXG4gMzU1OlxcdFxcdHUxNiBhZGRyX2xlbjtcXG4gMzU2OlxcdFxcdGludCByZXQ7XFxuIDM1NzpcXHRcXG4gMzU4OlxcdFxcdHNyLVxcdTAwM2VidWYgPSB1NjRfdG9fdXNlcl9wdHIoUkVBRF9PTkNFKHNxZS1cXHUwMDNlYWRkcikpO1xcbiAzNTk6XFx0XFxuIDM2MDpcXHRcXHRpZiAoUkVBRF9PTkNFKHNxZS1cXHUwMDNlX19wYWQzWzBdKSlcXG4gMzYxOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzNjI6XFx0XFxuIDM2MzpcXHRcXHRrbXNnLVxcdTAwM2Vtc2cubXNnX25hbWUgPSBOVUxMO1xcbiAzNjQ6XFx0XFx0a21zZy1cXHUwMDNlbXNnLm1zZ19uYW1lbGVuID0gMDtcXG4gMzY1OlxcdFxcdGttc2ctXFx1MDAzZW1zZy5tc2dfY29udHJvbCA9IE5VTEw7XFxuIDM2NjpcXHRcXHRrbXNnLVxcdTAwM2Vtc2cubXNnX2NvbnRyb2xsZW4gPSAwO1xcbiAzNjc6XFx0XFx0a21zZy1cXHUwMDNlbXNnLm1zZ191YnVmID0gTlVMTDtcXG4gMzY4OlxcdFxcbiAzNjk6XFx0XFx0YWRkciA9IHU2NF90b191c2VyX3B0cihSRUFEX09OQ0Uoc3FlLVxcdTAwM2VhZGRyMikpO1xcbiAzNzA6XFx0XFx0YWRkcl9sZW4gPSBSRUFEX09OQ0Uoc3FlLVxcdTAwM2VhZGRyX2xlbik7XFxuIDM3MTpcXHRcXHRpZiAoYWRkcikge1xcbiAzNzI6XFx0XFx0XFx0cmV0ID0gbW92ZV9hZGRyX3RvX2tlcm5lbChhZGRyLCBhZGRyX2xlbiwgXFx1MDAyNmttc2ctXFx1MDAzZWFkZHIpO1xcbiAzNzM6XFx0XFx0XFx0aWYgKHVubGlrZWx5KHJldCBcXHUwMDNjIDApKVxcbiAzNzQ6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMzc1OlxcdFxcdFxcdGttc2ctXFx1MDAzZW1zZy5tc2dfbmFtZSA9IFxcdTAwMjZrbXNnLVxcdTAwM2VhZGRyO1xcbiAzNzY6XFx0XFx0XFx0a21zZy1cXHUwMDNlbXNnLm1zZ19uYW1lbGVuID0gYWRkcl9sZW47XFxuIDM3NzpcXHRcXHR9XFxuIDM3ODpcXHRcXHRpZiAoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1JFQ1ZTRU5EX0ZJWEVEX0JVRikge1xcbiAzNzk6XFx0XFx0XFx0aWYgKCEoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1NFTkRfVkVDVE9SSVpFRCkpIHtcXG4gMzgwOlxcdFxcdFxcdFxcdHJlcS1cXHUwMDNlZmxhZ3MgfD0gUkVRX0ZfSU1QT1JUX0JVRkZFUjtcXG4gMzgxOlxcdFxcdFxcdFxcdHJldHVybiAwO1xcbiAzODI6XFx0XFx0XFx0fVxcbiAzODM6XFx0XFxuIDM4NDpcXHRcXHRcXHRrbXNnLVxcdTAwM2Vtc2cubXNnX2l0ZXIubnJfc2VncyA9IHNyLVxcdTAwM2VsZW47XFxuIDM4NTpcXHRcXHRcXHRyZXR1cm4gaW9fcHJlcF9yZWdfaW92ZWMocmVxLCBcXHUwMDI2a21zZy1cXHUwMDNldmVjLCBzci1cXHUwMDNlYnVmLCBzci1cXHUwMDNlbGVuKTtcXG4gMzg2OlxcdFxcdH1cXG4gMzg3OlxcdFxcdGlmIChyZXEtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUkVRX0ZfQlVGRkVSX1NFTEVDVClcXG4gMzg4OlxcdFxcdFxcdHJldHVybiAwO1xcbiAzODk6XFx0XFxuIDM5MDpcXHRcXHRpZiAoc3ItXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SSU5HX1NFTkRfVkVDVE9SSVpFRClcXG4gMzkxOlxcdFxcdFxcdHJldHVybiBpb19uZXRfaW1wb3J0X3ZlYyhyZXEsIGttc2csIHNyLVxcdTAwM2VidWYsIHNyLVxcdTAwM2VsZW4sIElURVJfU09VUkNFKTtcXG4gMzkyOlxcdFxcbiAzOTM6XFx0XFx0cmV0dXJuIGltcG9ydF91YnVmKElURVJfU09VUkNFLCBzci1cXHUwMDNlYnVmLCBzci1cXHUwMDNlbGVuLCBcXHUwMDI2a21zZy1cXHUwMDNlbXNnLm1zZ19pdGVyKTtcXG4gMzk0OlxcdH1cXG4gMzk1OlxcdFxcbiAzOTY6XFx0c3RhdGljIGludCBpb19zZW5kbXNnX3NldHVwKHN0cnVjdCBpb19raW9jYiAqcmVxLCBjb25zdCBzdHJ1Y3QgaW9fdXJpbmdfc3FlICpzcWUpXFxuIDM5NzpcXHR7XFxuIDM5ODpcXHRcXHRzdHJ1Y3QgaW9fc3JfbXNnICpzciA9IGlvX2tpb2NiX3RvX2NtZChyZXEsIHN0cnVjdCBpb19zcl9tc2cpO1xcbiAzOTk6XFx0XFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZyA9IHJlcS1cXHUwMDNlYXN5bmNfZGF0YTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzQ6MzMuOTY3ODIxMjMxWiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEzNTU3ODkxMTA2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhlIGV4cGVydDpcblxuKipJbnZlc3RpZ2F0aW5nIGEgUG90ZW50aWFsIE1lbW9yeSBJc3N1ZSoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gYGlvX3NlbmRfc2V0dXBgLCBhbmQgc29tZXRoaW5nJ3MgYnVnZ2luZyBtZS4gSXQgbG9va3MgbGlrZSBpdCAqaW1wbGljaXRseSogYXNzdW1lcyBga21zZy1cdTAwM2V2ZWMuaW92ZWNgIGlzIGluaXRpYWxpemVkIHRvIE5VTEwuIFRoZSBjb2RlIGRvZXNuJ3QgZXhwbGljaXRseSBzZXQgaXQgdG8gTlVMTCwgd2hpY2ggaXMgYSBiaXQgb2YgYSByZWQgZmxhZy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSBhbGxvY2F0aW9uLCBidXQgSSBuZWVkIHRvIGJlIHN1cmUuIEkgaGF2ZSBhIGh1bmNoIHRoYXQgYGlvX21zZ19hbGxvY19hc3luY2AgKm1pZ2h0KiBiZSB6ZXJvaW5nIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCBpbmNsdWRpbmcgdGhlIGBpb3ZlY2AgcG9pbnRlciB3aXRoaW4gdGhhdCBga21zZ2Agc3RydWN0dXJlLiBCdXQgSSBjYW4ndCBiZSBjZXJ0YWluLiBUaGF0IGZ1bmN0aW9uIGlzIHRoZSBjcml0aWNhbCBwaWVjZSBvZiB0aGUgcHV6emxlIGhlcmUuIEkgcmVhbGx5IG5lZWQgdG8gY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBpb19tc2dfYWxsb2NfYXN5bmNgIHRvIGNvbmZpcm0gb3IgZWxpbWluYXRlIHRoaXMgcG9zc2libGUgc291cmNlIG9mIGFuIGlzc3VlLiBJcyBpdCBzYWZlIHRvIGFzc3VtZSB0aGF0IGBpb3ZlY2Agd2lsbCBiZSBudWxsLCBvciBhcmUgd2UgcmVseWluZyBvbiBzb21lIHNpZGUgZWZmZWN0IG9mIG1lbW9yeSBhbGxvY2F0aW9uPyBCZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5IOKAkyBsZXQncyBnbyBjaGVjayB0aGUgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg1NzQsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjQ3LjUyNTcxNTg0N1oiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYwNDIzNzg0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX21zZ19hbGxvY19hc3luY1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpb191cmluZy9uZXQuYz0xNjc9c3RhdGljIHZvaWQgaW9fbmV0bXNnX3JlY3ljbGUoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcXG4tLVxcbmlvX3VyaW5nL25ldC5jLTE4NS1cXG5pb191cmluZy9uZXQuYzoxODY6c3RhdGljIHN0cnVjdCBpb19hc3luY19tc2doZHIgKmlvX21zZ19hbGxvY19hc3luYyhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSlcXG5pb191cmluZy9uZXQuYy0xODcte1xcbi0tXFxuaW9fdXJpbmcvbmV0LmM9NDI0PWludCBpb19zZW5kbXNnX3ByZXAoc3RydWN0IGlvX2tpb2NiICpyZXEsIGNvbnN0IHN0cnVjdCBpb191cmluZ19zcWUgKnNxZSlcXG4tLVxcbmlvX3VyaW5nL25ldC5jLTQ1Ny1cXG5pb191cmluZy9uZXQuYzo0NTg6XFx0aWYgKHVubGlrZWx5KCFpb19tc2dfYWxsb2NfYXN5bmMocmVxKSkpXFxuaW9fdXJpbmcvbmV0LmMtNDU5LVxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi0tXFxuaW9fdXJpbmcvbmV0LmM9Nzc3PXN0YXRpYyBpbnQgaW9fcmVjdm1zZ19wcmVwX3NldHVwKHN0cnVjdCBpb19raW9jYiAqcmVxKVxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtNzgxLVxcbmlvX3VyaW5nL25ldC5jOjc4MjpcXHRrbXNnID0gaW9fbXNnX2FsbG9jX2FzeW5jKHJlcSk7XFxuaW9fdXJpbmcvbmV0LmMtNzgzLVxcdGlmICh1bmxpa2VseSgha21zZykpXFxuLS1cXG5pb191cmluZy9uZXQuYz0xMzc3PWludCBpb19zZW5kX3pjX3ByZXAoc3RydWN0IGlvX2tpb2NiICpyZXEsIGNvbnN0IHN0cnVjdCBpb191cmluZ19zcWUgKnNxZSlcXG4tLVxcbmlvX3VyaW5nL25ldC5jLTE0MjctXFxuaW9fdXJpbmcvbmV0LmM6MTQyODpcXHRpb21zZyA9IGlvX21zZ19hbGxvY19hc3luYyhyZXEpO1xcbmlvX3VyaW5nL25ldC5jLTE0MjktXFx0aWYgKHVubGlrZWx5KCFpb21zZykpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM0OjQ3LjY4NjE0NTkwMVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTA1Mjg1MTQzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIGBpb19tc2dfYWxsb2NfYXN5bmNgOlxuXG4qKkRlY29uc3RydWN0aW5nIGlvX21zZ19hbGxvY19hc3luYzogQSBEZWVwIERpdmUqKlxuXG5BbHJpZ2h0LCBzbyBJIHNlZSB3ZSdyZSBsb29raW5nIGF0IGBpb19tc2dfYWxsb2NfYXN5bmNgLiBJbW1lZGlhdGVseSwgbXkgZXhwZXJ0IGJyYWluIGtpY2tzIGluLCBjb25zaWRlcmluZyB3aGF0IGNvbnRleHQgdGhpcyBsaWtlbHkgc2l0cyB3aXRoaW4uIEJhc2VkIG9uIHRoZSBuYW1lLCBJJ20gYWxyZWFkeSBmb3JtdWxhdGluZyBhbiBleHBlY3RhdGlvbi4gSXQncyBhbiBhbGxvY2F0aW9uIGZ1bmN0aW9uLCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBhc3luY2hyb25vdXMgSS9PIG1lc3NhZ2VzLiBUaGUgXCJhc3luY1wiIGlzIHRoZSBrZXkgaW5kaWNhdG9yIGhlcmUsIHN1Z2dlc3Rpbmcgbm9uLWJsb2NraW5nIG9wZXJhdGlvbnMgYXJlIGNlbnRyYWwgdG8gaXRzIHB1cnBvc2UuIEknbSBtZW50YWxseSBwaWN0dXJpbmcgYSBzeXN0ZW0gd2hlcmUgSS9PIHJlcXVlc3RzIGFyZSBpbml0aWF0ZWQgd2l0aG91dCB3YWl0aW5nIGZvciBjb21wbGV0aW9uLCBmcmVlaW5nIHVwIHJlc291cmNlcyBmb3Igb3RoZXIgdGFza3MuIFRoZSBuYW1lIFwiaW9fbXNnXCIgZnVydGhlciBoaW50cyBhdCBhIHN0cnVjdHVyZWQgZGF0YSBwYWNrYWdlLCBwcm9iYWJseSBob2xkaW5nIGRldGFpbHMgYWJvdXQgdGhlIEkvTyBvcGVyYXRpb24gaXRzZWxmOiB0aGUgdGFyZ2V0IGZpbGUgZGVzY3JpcHRvciwgdGhlIGJ1ZmZlciwgdGhlIG9wZXJhdGlvbiB0eXBlIChyZWFkIG9yIHdyaXRlKSwgcG90ZW50aWFsbHkgc29tZSBmbGFncywgYW5kIGRlZmluaXRlbHkgYSBjb21wbGV0aW9uIGNhbGxiYWNrIG9yIHNvbWUgZm9ybSBvZiBzaWduYWxpbmcgbWVjaGFuaXNtLlxuXG5NeSBpbW1lZGlhdGUgcXVlc3Rpb25zIGFyZTogV2hhdCBleGFjdGx5IGlzIGJlaW5nIGFsbG9jYXRlZD8gSXMgaXQgYSBjb21wbGV0ZSBgaW9fbXNnYCBzdHJ1Y3R1cmUsIG9yIHNvbWUgaW50ZXJuYWwgZGF0YSByZWxhdGVkIHRvIGl0PyBEb2VzIGl0IGhhbmRsZSBtZW1vcnkgbWFuYWdlbWVudCBmb3IgdGhlIGFjdHVhbCBkYXRhIGJ1ZmZlciwgb3IgaXMgdGhhdCB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlcj8gV2hhdCBzb3J0IG9mIG1lbW9yeSBhbGxvY2F0b3IgaXMgaXQgdXNpbmc/IElzIGl0IHRocmVhZC1zYWZlPyBIb3cgZG9lcyBpdCBoYW5kbGUgZXJyb3JzPyBEb2VzIGl0IGhhdmUgYW55IG9wdGlvbnMgZm9yIHByZS1hbGxvY2F0aW9uIG9yIHJlc291cmNlIHBvb2xpbmcgdG8gbWluaW1pemUgb3ZlcmhlYWQ/IFVuZGVyc3RhbmRpbmcgdGhlc2UgZGV0YWlscyBpcyBjcnVjaWFsIHRvIHBlcmZvcm1hbmNlIGFuZCByb2J1c3RuZXNzLCBlc3BlY2lhbGx5IGluIGEgaGVhdmlseSB0aHJlYWRlZCBvciBjb25jdXJyZW50IGVudmlyb25tZW50LiBJIHdhbnQgdG8gc2VlIGhvdyBpdCBpbnRlZ3JhdGVzIHdpdGggdGhlIHVuZGVybHlpbmcga2VybmVsJ3MgYXN5bmNocm9ub3VzIEkvTyBtZWNoYW5pc21zLCBsaWtlIGBhaW9fcmVhZGAgYW5kIGBhaW9fd3JpdGVgLCBvciB3aGF0ZXZlciBsb3ctbGV2ZWwgcHJpbWl0aXZlcyBpdCdzIGJ1aWx0IHVwb24uIEknbSBrZWVuIHRvIHVuZGVyc3RhbmQgaG93IGl0IGhhbmRsZXMgc3luY2hyb25pemF0aW9uIGFuZCBhdm9pZHMgcmFjZSBjb25kaXRpb25zLCBlc3BlY2lhbGx5IGlmIGl0J3MgaW50ZXJhY3Rpbmcgd2l0aCBzaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzIG9yIGtlcm5lbCByZXNvdXJjZXMuIFRoaXMgaXMgYSBjcml0aWNhbCBidWlsZGluZyBibG9jayBmb3IgYW55IGFzeW5jaHJvbm91cyBJL08gc3lzdGVtLCBhbmQgdW5kZXJzdGFuZGluZyBpdHMgZGVzaWduIGlzIGtleSB0byBvcHRpbWl6aW5nIHRoZSBvdmVyYWxsIGFwcGxpY2F0aW9uIHBlcmZvcm1hbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTM1MywiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM1OjAyLjczOTAwMjc4OFoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNjk5MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW9fdXJpbmcvbmV0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTg2LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTg2OlxcdHN0YXRpYyBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICppb19tc2dfYWxsb2NfYXN5bmMoc3RydWN0IGlvX2tpb2NiICpyZXEpXFxuIDE4NzpcXHR7XFxuIDE4ODpcXHRcXHRzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCA9IHJlcS1cXHUwMDNlY3R4O1xcbiAxODk6XFx0XFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaGRyO1xcbiAxOTA6XFx0XFxuIDE5MTpcXHRcXHRoZHIgPSBpb191cmluZ19hbGxvY19hc3luY19kYXRhKFxcdTAwMjZjdHgtXFx1MDAzZW5ldG1zZ19jYWNoZSwgcmVxKTtcXG4gMTkyOlxcdFxcdGlmICghaGRyKVxcbiAxOTM6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDE5NDpcXHRcXG4gMTk1OlxcdFxcdC8qIElmIHRoZSBhc3luYyBkYXRhIHdhcyBjYWNoZWQsIHdlIG1pZ2h0IGhhdmUgYW4gaW92IGNhY2hlZCBpbnNpZGUuICovXFxuIDE5NjpcXHRcXHRpZiAoaGRyLVxcdTAwM2V2ZWMuaW92ZWMpXFxuIDE5NzpcXHRcXHRcXHRyZXEtXFx1MDAzZWZsYWdzIHw9IFJFUV9GX05FRURfQ0xFQU5VUDtcXG4gMTk4OlxcdFxcdHJldHVybiBoZHI7XFxuIDE5OTpcXHR9XFxuIDIwMDpcXHRcXG4gMjAxOlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBpb19tc2hvdF9wcmVwX3JldHJ5KHN0cnVjdCBpb19raW9jYiAqcmVxLFxcbiAyMDI6XFx0XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBpb19hc3luY19tc2doZHIgKmttc2cpXFxuIDIwMzpcXHR7XFxuIDIwNDpcXHRcXHRzdHJ1Y3QgaW9fc3JfbXNnICpzciA9IGlvX2tpb2NiX3RvX2NtZChyZXEsIHN0cnVjdCBpb19zcl9tc2cpO1xcbiAyMDU6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM1OjAyLjczOTM4MTE3OFoiLCJTZXEiOjMzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTc0NzQyNTU2NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0IG1lIGJyZWFrIHRoaXMgZG93bi5cblxuKipBbmFseXppbmcgdGhlIEFsbG9jYXRpb24gYW5kIFJlY3ljbGluZyBvZiBOZXR3b3JrIE1lc3NhZ2UgSGVhZGVycyoqXG5cbkFscmlnaHQsIHNvIGBpb19tc2dfYWxsb2NfYXN5bmNgIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIHRoZSBoZWFkZXIsIGBoZHJgLCBmb3IgbmV0d29yayBtZXNzYWdlcy4gVGhlIHBvdGVudGlhbCB3cmlua2xlIGhlcmUgaXMgdGhhdCBpZiB0aGlzIGhlYWRlciB3YXMgcHJldmlvdXNseSBjYWNoZWQsIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGF0IGBoZHItXHUwMDNldmVjLmlvdmVjYCBtaWdodCBhbHJlYWR5IGJlIHBvcHVsYXRlZC4gVGhlIGtleSBpcyB0byByZW1lbWJlciBpZiB0aGUgSS9PIHZlY3RvciBpcyBwb3B1bGF0ZWQsIGl0IG1lYW5zIHRoZSBoZWFkZXIgaGFzIGJlZW4gYWxsb2NhdGVkLCBpbiBhIHBhc3QgaW5zdGFuY2UuXG5cbk5vdyBJIHJlbWVtYmVyIHRoYXQgYGlvX25ldG1zZ19yZWN5Y2xlYCBjb21lcyBpbnRvIHBsYXkgaGVyZSwgYmVjYXVzZSB0aGF0J3Mgd2hlcmUgdGhlIGNhY2hpbmcgaXMgaW1wbGVtZW50ZWQuIFNvLCBteSBuZXh0IHN0ZXAgaXMgdG8gZHJpbGwgZG93biBpbnRvIGBpb19uZXRtc2dfcmVjeWNsZWAgYW5kIHZlcmlmeSBob3cgaXQgbWFuYWdlcyBhbmQgcmV1c2VzIHRoZXNlIGhlYWRlcnMuIEl0J3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucyBhbmQgaG93IHRoZSBgaW92ZWNgIGlzIG1hbmFnZWQgZHVyaW5nIHJlY3ljbGluZyB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIG1lbW9yeSBtYW5hZ2VtZW50IGNvbmZsaWN0cy4gVGhpcyByZXF1aXJlcyBhIGRlZXBlciBkaXZlIGludG8gdGhlIGBpb19uZXRtc2dfcmVjeWNsZWAgZnVuY3Rpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwMTYxLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozNToxOC40ODY4MDk1MzVaIiwiU2VxIjozNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIyOTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImlvX3VyaW5nL25ldC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE2NyxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE2NzpcXHRzdGF0aWMgdm9pZCBpb19uZXRtc2dfcmVjeWNsZShzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxcbiAxNjg6XFx0e1xcbiAxNjk6XFx0XFx0c3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaGRyID0gcmVxLVxcdTAwM2Vhc3luY19kYXRhO1xcbiAxNzA6XFx0XFxuIDE3MTpcXHRcXHQvKiBjYW4ndCByZWN5Y2xlLCBlbnN1cmUgd2UgZnJlZSB0aGUgaW92ZWMgaWYgd2UgaGF2ZSBvbmUgKi9cXG4gMTcyOlxcdFxcdGlmICh1bmxpa2VseShpc3N1ZV9mbGFncyBcXHUwMDI2IElPX1VSSU5HX0ZfVU5MT0NLRUQpKSB7XFxuIDE3MzpcXHRcXHRcXHRpb19uZXRtc2dfaW92ZWNfZnJlZShoZHIpO1xcbiAxNzQ6XFx0XFx0XFx0cmV0dXJuO1xcbiAxNzU6XFx0XFx0fVxcbiAxNzY6XFx0XFxuIDE3NzpcXHRcXHQvKiBMZXQgbm9ybWFsIGNsZWFudXAgcGF0aCByZWFwIGl0IGlmIHdlIGZhaWwgYWRkaW5nIHRvIHRoZSBjYWNoZSAqL1xcbiAxNzg6XFx0XFx0aW9fYWxsb2NfY2FjaGVfdmVjX2thc2FuKFxcdTAwMjZoZHItXFx1MDAzZXZlYyk7XFxuIDE3OTpcXHRcXHRpZiAoaGRyLVxcdTAwM2V2ZWMubnIgXFx1MDAzZSBJT19WRUNfQ0FDSEVfU09GVF9DQVApXFxuIDE4MDpcXHRcXHRcXHRpb192ZWNfZnJlZShcXHUwMDI2aGRyLVxcdTAwM2V2ZWMpO1xcbiAxODE6XFx0XFxuIDE4MjpcXHRcXHRpZiAoaW9fYWxsb2NfY2FjaGVfcHV0KFxcdTAwMjZyZXEtXFx1MDAzZWN0eC1cXHUwMDNlbmV0bXNnX2NhY2hlLCBoZHIpKVxcbiAxODM6XFx0XFx0XFx0aW9fcmVxX2FzeW5jX2RhdGFfY2xlYXIocmVxLCBSRVFfRl9ORUVEX0NMRUFOVVApO1xcbiAxODQ6XFx0fVxcbiAxODU6XFx0XFxuIDE4NjpcXHRzdGF0aWMgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqaW9fbXNnX2FsbG9jX2FzeW5jKHN0cnVjdCBpb19raW9jYiAqcmVxKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozNToxOC40ODY5MzM4NzVaIiwiU2VxIjozNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjkxMzcyNzc3ODIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqVXNlLUFmdGVyLUZyZWUgVnVsbmVyYWJpbGl0eSBpbiBpb191cmluZzogTXkgQW5hbHlzaXMqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMgaW9fdXJpbmcgY29kZSwgYW5kIEkgdGhpbmsgSSd2ZSBmb3VuZCBhIHByZXR0eSBzZXJpb3VzIGlzc3VlLiBUaGUgYGhkci1cdTAwM2V2ZWMuaW92ZWNgIHBvaW50ZXIgY2FuIGJlIG5vbi1OVUxMLCBlc3BlY2lhbGx5IGlmIGl0IHdhcyBwcmV2aW91c2x5IGNhY2hlZCwgb3IgaWYgdGhlIHVzZXIgc3VwcGxpZWQgbW9yZSB0aGFuIGBVSU9fRkFTVElPVmAgaW92ZWNzLCB3aGljaCBsZWFkcyB0byBgaW9fbmV0X2ltcG9ydF92ZWNgIGFsbG9jYXRpbmcgYGttc2ctXHUwMDNldmVjLmlvdmVjYC4gVGhhdCdzIHdoZXJlIGl0IHJlYWxseSBnZXRzIGludGVyZXN0aW5nIGJlY2F1c2UgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgc2V0cyBgYXJnLm1vZGUgPSBLQlVGX01PREVfRlJFRWAgd2hlbiBga21zZy1cdTAwM2V2ZWMuaW92ZWNgIGlzIG5vbi1OVUxMLiBCdXQgaGVyZSdzIHRoZSBraWNrZXI6IGBpb19yaW5nX2J1ZmZlcnNfcGVla2AgZ29lcyBhbmQgZnJlZXMgaXQhIFJpZ2h0IGF0IHRoZSBlbmQhXG5cbkFuZCB0aGVuLCBpbmNyZWRpYmx5LCBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCAqc3RpbGwqIHRyaWVzIHRvIHVzZSB0aGF0IGZyZWVkIG1lbW9yeS4gSXTigJlzIGEgdGV4dGJvb2sgdXNlLWFmdGVyLWZyZWUhIEnigJltIHByZXR0eSBjb25maWRlbnQgdGhhdCB0aGlzIGlzIGEgMTAwJSByZXByb2R1Y2libGUgZXhwbG9pdC4gVGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcgYW5kIGxvb2tpbmcgYXQgbW9yZSBjbG9zZWx5LlxuXG5MZXQncyBjaGVjayBgV29ydGhGdXp6aW5nYC4gWWVzLCBhYnNvbHV0ZWx5ISBXaGF0IGNvbmZpZ3VyYXRpb25zIGFyZSBuZWVkZWQ/IGBDT05GSUdfSU9fVVJJTkdgIGlzIGVzc2VudGlhbCwgYW5kIEkgc3VzcGVjdCBgQ09ORklHX05FVGAgaXMgcmVxdWlyZWQgYXMgd2VsbCwgZ2l2ZW4gdGhhdCB0aGlzIHNlZW1zIG5ldHdvcmtpbmcgcmVsYXRlZCBhbmQgSSBzZWUgaXQncyBpbiBgaW9fdXJpbmcvbmV0LmNgLiBJIHNob3VsZCBwcm9iYWJseSBjb25maXJtIHRoYXQgd2l0aCB0aGUgYGlvX3VyaW5nL0tjb25maWdgIGFuZCBgaW9fdXJpbmcvTWFrZWZpbGVgIGZpbGVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDg2NywiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM1OjQ3LjYyNDIxNTU1N1oiLCJTZXEiOjM2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTcwODU1MjM2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtidWYub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcvTWFrZWZpbGU9Nz1lbmRpZlxcbmlvX3VyaW5nL01ha2VmaWxlLTgtXFxuaW9fdXJpbmcvTWFrZWZpbGU6OTpvYmotJChDT05GSUdfSU9fVVJJTkcpXFx0XFx0Kz0gaW9fdXJpbmcubyBvcGRlZi5vIGtidWYubyByc3JjLm8gbm90aWYubyBcXFxcXFxuaW9fdXJpbmcvTWFrZWZpbGUtMTAtXFx0XFx0XFx0XFx0XFx0dGN0eC5vIGZpbGV0YWJsZS5vIHJ3Lm8gcG9sbC5vIFxcXFxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6MzU6NDguMTk1MDc3NzQzWiIsIlNlcSI6MzcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjczOTc4NTAwNjQyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGluIHRoZSBmaXJzdCBwZXJzb246XG5cbioqSW5pdGlhbCBJbnF1aXJ5OiBUaGUgU2lnbmlmaWNhbmNlIG9mIGBuZXQub2AqKlxuXG5IbW0sIGxldCBtZSBzZWXigKYgV2hhdCdzIHRoZSBjb250ZXh0IGhlcmU/IEp1c3QgdGhlIG1lbnRpb24gb2YgYG5ldC5vYCBtYWtlcyBteSBtaW5kIGp1bXAgdG8gYSBmZXcgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMuIElzIHRoaXMgcmVsYXRlZCB0byBuZXR3b3JraW5nLCBwZXJoYXBzIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZywgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFdpdGhvdXQgbW9yZSBpbmZvcm1hdGlvbiwgSSdtIGFscmVhZHkgc3RhcnRpbmcgdG8gbWVudGFsbHkgcnVuIHRocm91Z2ggc2NlbmFyaW9zLiBJcyBgbmV0Lm9gIGEgY29tcGlsZWQgb2JqZWN0IGZpbGUgcmVsYXRlZCB0byBhIG5ldHdvcmsgbW9kdWxlLCBwZXJoYXBzIGZyb20gYSBsYXJnZXIgcHJvamVjdD8gQ291bGQgaXQgYmUgYSBkZWJ1Z2dpbmcgc3ltYm9sIGZpbGU/IE9yIG1heWJlIGl0J3Mgc29tZSBjdXN0b20gZm9ybWF0IG9yIGxpYnJhcnk/IFRoZSBsYWNrIG9mIHN1cnJvdW5kaW5nIGNvbnRleHQgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGltbWVkaWF0ZWx5IGNsYXNzaWZ5LiBJIHdhbnQgdG8gZGVsdmUgZnVydGhlciB0byB1bmRlcnN0YW5kIGl0cyBzaWduaWZpY2FuY2UuIE15IGludHVpdGlvbiB0ZWxscyBtZSB0aGF0IHRoZSBpbW1lZGlhdGUgaW1wb3J0YW5jZSBsaWVzIG5vdCBpbiB0aGUgZmlsZSBpdHNlbGYsIGJ1dCB3aGVyZSBpdCBzaXRzLCBhbmQgaG93IGl0IGlzIHVzZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIxNTc2LCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozNzowMi4xNzM1ODMxNDVaIiwiU2VxIjozOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxNDM1MDc0NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXQub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcvTWFrZWZpbGU9MjM9b2JqLSQoQ09ORklHX05FVF9SWF9CVVNZX1BPTEwpXFx0Kz0gbmFwaS5vXFxuaW9fdXJpbmcvTWFrZWZpbGU6MjQ6b2JqLSQoQ09ORklHX05FVCkgKz0gbmV0Lm8gY21kX25ldC5vXFxuaW9fdXJpbmcvTWFrZWZpbGUtMjUtb2JqLSQoQ09ORklHX1BST0NfRlMpICs9IGZkaW5mby5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM3OjAyLjc4Nzk0MjQyOVoiLCJTZXEiOjM5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3Mjc1MDQ4NDk0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEtlcm5lbCBCdWcqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gbWFrZSBzdXJlIGBDT05GSUdfSU9fVVJJTkdgIGFuZCBgQ09ORklHX05FVGAgYXJlIGVuYWJsZWQuIFRoYXQgc2VlbXMgbGlrZSBhIGxvZ2ljYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhpcyBidWcuXG5cbk5vdywgbGV0J3MgZGl2ZSBpbnRvIHRoZSBkZXRhaWxzLiBJIG5lZWQgdG8gemVybyBpbiBvbiB0aGUgcmVsZXZhbnQgc3ltYm9scy4gVGhlIGJ1ZyBhcHBlYXJzIHRvIGJlIGluIGBpb19yaW5nX2J1ZmZlcnNfcGVla2Agd2l0aGluIGBpb191cmluZy9rYnVmLmNgLiBBbHJpZ2h0LCBsZXQncyBzZWUgd2hlcmUgdGhhdCBmdW5jdGlvbiBpcyBjYWxsZWQuIFRyYWNpbmcgdGhlIGNhbGxzLCBJIHNlZSBgaW9fYnVmZmVyc19zZWxlY3RgIGxlYWRzIHRvIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgLCB3aGljaCB0aGVuIGNhbGxzIGBpb19zZW5kYC4gSSBhbHNvIHNlZSBhIHNlcGFyYXRlIHBhdGggdGhyb3VnaCBgaW9fcmVjdl9idWZfc2VsZWN0YCB0aGF0IGFsc28gZXZlbnR1YWxseSBlbmRzIHVwIGNhbGxpbmcgYGlvX3JlY3ZgLlxuXG5TbyBteSBrZXkgZm9jdXMgYXJlYXMgYXJlOiBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGlzIGNlbnRyYWwsIGJ1dCBhbHNvIGBpb19idWZmZXJzX3NlbGVjdGAsIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgLCBgaW9fcmVjdl9idWZfc2VsZWN0YCwgYGlvX3NlbmRgLCBhbmQgYGlvX3JlY3ZgLiBMZXQgbWUgcXVpY2tseSBjb25maXJtIHdoZXRoZXIgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCBpcyBzdGF0aWMsIGluIGNhc2UgaXQgaXNuJ3QsIHNvIEkgdW5kZXJzdGFuZCB0aGUgc2NvcGUgb2YgdGhlIHByb2JsZW0uIEFoLCB5ZXMsIGl0J3Mgc3RhdGljLiBUaGF0IG5hcnJvd3MgdGhlIHNjb3BlIG9mIHRoZSBwb3RlbnRpYWwgaW1wYWN0LiBTbyBub3csIEknbGwgY29uY2VudHJhdGUgbXkgYW5hbHlzaXMgb24gdGhlIG90aGVyIGZ1bmN0aW9ucyBJIGp1c3QgaWRlbnRpZmllZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjE4OTcsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOTUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDdUMDM6Mzg6MTUuNTM4NDMwODY1WiIsIlNlcSI6NDAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjMzMjY4NDkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImlvX3NlbmRfc2VsZWN0X2J1ZmZlclwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpb191cmluZy9uZXQuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpb191cmluZy9uZXQuYz01NTk9aW50IGlvX3NlbmRtc2coc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncylcXG4tLVxcbmlvX3VyaW5nL25ldC5jLTYwNy1cXG5pb191cmluZy9uZXQuYzo2MDg6c3RhdGljIGludCBpb19zZW5kX3NlbGVjdF9idWZmZXIoc3RydWN0IGlvX2tpb2NiICpyZXEsIHVuc2lnbmVkIGludCBpc3N1ZV9mbGFncyxcXG5pb191cmluZy9uZXQuYy02MDktXFx0XFx0XFx0XFx0IHN0cnVjdCBpb19icl9zZWwgKnNlbCwgc3RydWN0IGlvX2FzeW5jX21zZ2hkciAqa21zZylcXG4tLVxcbmlvX3VyaW5nL25ldC5jPTY1Nj1pbnQgaW9fc2VuZChzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtNjg5LVxcdGlmIChpb19kb19idWZmZXJfc2VsZWN0KHJlcSkpIHtcXG5pb191cmluZy9uZXQuYzo2OTA6XFx0XFx0cmV0ID0gaW9fc2VuZF9zZWxlY3RfYnVmZmVyKHJlcSwgaXNzdWVfZmxhZ3MsIFxcdTAwMjZzZWwsIGttc2cpO1xcbmlvX3VyaW5nL25ldC5jLTY5MS1cXHRcXHRpZiAocmV0KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozODoxNy4xNzE3MDQ5MDZaIiwiU2VxIjo0MSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDUxNDU1MjE1MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIEZ1enppbmcgVGFyZ2V0cyoqXG5cbk9rYXksIGhvbGQgb24uIEkgbmVlZCB0byB0aGluayB0aHJvdWdoIHRoaXMuIEkganVzdCBzYXcgdGhhdCBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBpcyBhIHN0YXRpYyBmdW5jdGlvbi4gVGhhdCdzIGEga2V5IGRldGFpbC4gQ2FuIHN5emthbGxlciAqZGlyZWN0bHkqIGZ1enogc3RhdGljIGZ1bmN0aW9ucyBsaWtlIHRoYXQ/IEkgZG9uJ3QgdGhpbmsgc28sIGJ1dCBpdCdzIHN0aWxsIHdvcnRod2hpbGUgdG8gaW5jbHVkZSB0aGVtIGluIHRoZSBsaXN0LiBCeSBsaXN0aW5nIHRoZW0sIGV2ZW4gaWYgdGhlIGZ1enplciBjYW4ndCB0YXJnZXQgKnRoZW0qIGRpcmVjdGx5LCB3ZSBjYW4gZW5zdXJlIHRoYXQgY29kZSBwYXRocyB1c2luZyB0aGVzZSBmdW5jdGlvbnMgYXJlIHByaW9yaXRpemVkIGR1cmluZyBmdXp6aW5nLlxuXG5SaWdodCwgYmFjayB0byB0aGUgXCJGb2N1c1N5bWJvbHNcIiBkZWZpbml0aW9uLiBUaGF0J3MgYSBnb29kIHByb21wdCBmb3IgbWUgdG8gcmV2aWV3LiBJdCBpcyBhIFwiTGlzdCBvZiBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRvIGZvY3VzIGZ1enppbmcgb24uIFNob3VsZCBhdm9pZCBob3QtcGF0aCBmdW5jdGlvbnNcIi4gV2Ugd2FudCB0byBrZWVwIGZyb20gb3ZlcndoZWxtaW5nIHRoZSBmdXp6ZXIuXG5cbk9rYXksIGxldCdzIHNlZS4uLiBhIGdvb2QgY2FuZGlkYXRlIGZvciB0aGlzIGlzIGBpb19yaW5nX2J1ZmZlcnNfcGVla2AuIEl04oCZcyBsaWtlbHkgYSBnb29kIGVudHJ5IHBvaW50LiBUaGVuLCBsZXQncyBhbHNvIHJlbWVtYmVyIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGFuZCBgaW9fcmVjdl9idWZfc2VsZWN0YC4gVGhvc2UgbG9vayBsaWtlIHByb21pc2luZyB0YXJnZXRzIGFzIHdlbGwuIEknbSBzdGFydGluZyB0byByZW1lbWJlciB0aGF0IHRoaXMgYXBwcm9hY2ggaXMgdmFsdWFibGUuIExldCBtZSBmb2N1cyBvbiBgaW9fcmVjdl9idWZfc2VsZWN0YCBmb3IgYSBtb21lbnQgYW5kIHNlZSB3aGVyZSB0aGF0IGxlYWRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjY2NywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozODoyMS42ODYyNTk5NzlaIiwiU2VxIjo0MiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MjczNjg2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpb19yZWN2X2J1Zl9zZWxlY3RcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW9fdXJpbmcvbmV0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW9fdXJpbmcvbmV0LmM9MTA1MD1pbnQgaW9fcmVjdm1zZyhzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzKVxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtMTEzNi1cXG5pb191cmluZy9uZXQuYzoxMTM3OnN0YXRpYyBpbnQgaW9fcmVjdl9idWZfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLFxcbmlvX3VyaW5nL25ldC5jLTExMzgtXFx0XFx0XFx0ICAgICAgc3RydWN0IGlvX2JyX3NlbCAqc2VsLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXFxuLS1cXG5pb191cmluZy9uZXQuYz0xMjA5PWludCBpb19yZWN2KHN0cnVjdCBpb19raW9jYiAqcmVxLCB1bnNpZ25lZCBpbnQgaXNzdWVfZmxhZ3MpXFxuLS1cXG5pb191cmluZy9uZXQuYy0xMjQ3LVxcdFxcdHNlbC52YWwgPSBzci1cXHUwMDNlbGVuO1xcbmlvX3VyaW5nL25ldC5jOjEyNDg6XFx0XFx0cmV0ID0gaW9fcmVjdl9idWZfc2VsZWN0KHJlcSwga21zZywgXFx1MDAyNnNlbCwgaXNzdWVfZmxhZ3MpO1xcbmlvX3VyaW5nL25ldC5jLTEyNDktXFx0XFx0aWYgKHVubGlrZWx5KHJldCBcXHUwMDNjIDApKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM4OjIyLjEzOTAwNDE0OVoiLCJTZXEiOjQzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxOTM4MDczMjIwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIFZ1bG5lcmFiaWxpdGllcyBpbiBpb191cmluZy9rYnVmLmMqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMgYGlvX3VyaW5nL2tidWYuY2AgY29kZSwgYW5kIEkgbmVlZCB0byBwaW5wb2ludCB0aGUgY3JpdGljYWwgZnVuY3Rpb25zLiBGcm9tIHdoYXQgSSBjYW4gdGVsbCwgYGlvX3JpbmdfYnVmZmVyc19wZWVrYCwgYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAsIGFuZCBgaW9fcmVjdl9idWZfc2VsZWN0YCBhcmUgdGhlIHByaW1hcnkgb25lcyB0byB3YXRjaC4gSSBhbHNvIG5lZWQgdG8ga2VlcCBgaW9fYnVmZmVyc19zZWxlY3RgIGFuZCBgaW9fYnVmZmVyc19wZWVrYCBpbiBtaW5kLlxuXG5GaXJzdCwgbGV0IG1lIGNvbmZpcm0gc29tZXRoaW5nOiBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGlzIGluZGVlZCBzdGF0aWMsIGFzIEkgc3VzcGVjdGVkLiBOb3csIEknbGwgY3JlYXRlIGEgY2hlY2tsaXN0IG9mIHRob3NlIGZ1bmN0aW9ucy5cblxuKiAgIGBpb19yaW5nX2J1ZmZlcnNfcGVla2BcbiogICBgaW9fYnVmZmVyc19zZWxlY3RgXG4qICAgYGlvX2J1ZmZlcnNfcGVla2BcbiogICBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYFxuKiAgIGBpb19yZWN2X2J1Zl9zZWxlY3RgXG5cbkhvbGQgb24sIEkgc2VlIHNvbWV0aGluZyBzaWduaWZpY2FudCBhYm91dCBgaW9fcmluZ19idWZmZXJzX3BlZWtgIGZyb20gdGhpcyBwYXRjaC4gSXQgc2VlbXMgdGhhdCB0aGlzIHBhdGNoIGludHJvZHVjZXMgYSAqdXNlLWFmdGVyLWZyZWUqIHZ1bG5lcmFiaWxpdHkgYnkgbW92aW5nIHRoZSBga2ZyZWUoYXJnLVx1MDAzZWlvdnMpYCBjYWxsIHRvIHRoZSBlbmQgb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC4gVGhpcyBoYXBwZW5zIHdoZW4gYGFyZy1cdTAwM2Vtb2RlIFx1MDAyNiBLQlVGX01PREVfRlJFRWAgaXMgc2V0LiBOb3csIHdoZXJlIGlzIGBLQlVGX01PREVfRlJFRWAgYmVpbmcgc2V0PyBBaGEhIEl0J3Mgc2V0IGluIGBpb19zZW5kX3NlbGVjdF9idWZmZXJgIGFuZCBgaW9fcmVjdl9idWZfc2VsZWN0YCBzcGVjaWZpY2FsbHkgd2hlbiBga21zZy1cdTAwM2V2ZWMuaW92ZWNgIGlzIGFscmVhZHkgYWxsb2NhdGVkLlxuXG5UaGVyZWZvcmUsIHRoZSBmdXp6ZXIgc2hvdWxkIGRlZmluaXRlbHkgcHJpb3JpdGl6ZSB0YXJnZXRpbmcgdGhvc2UgdHdvIGZ1bmN0aW9ucyAoYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgYW5kIGBpb19yZWN2X2J1Zl9zZWxlY3RgKSBiZWNhdXNlIHRoZXkgYXJlIHByaW1lIGNhbmRpZGF0ZXMgZm9yIHRyaWdnZXJpbmcgdGhlIGJ1Zy4gSSByZWFsbHkgbmVlZCB0byBkb3VibGUtY2hlY2sgdG8gYmUgc3VyZSBJIGFtIG5vdCBtaXNzaW5nIGFueSBvdGhlciBwbGFjZXMgYEtCVUZfTU9ERV9GUkVFYCBtaWdodCBiZSBzZXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzMzYwLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mjg4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA3VDAzOjM4OjQxLjUxOTczODY5M1oiLCJTZXEiOjQ0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDQ3NjI2MzExLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIktCVUZfTU9ERV9GUkVFXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImlvX3VyaW5nL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpb191cmluZy9rYnVmLmM9MjUzPXN0YXRpYyBpbnQgaW9fcmluZ19idWZmZXJzX3BlZWsoc3RydWN0IGlvX2tpb2NiICpyZXEsIHN0cnVjdCBidWZfc2VsX2FyZyAqYXJnLFxcbi0tXFxuaW9fdXJpbmcva2J1Zi5jLTMzMC1cXG5pb191cmluZy9rYnVmLmM6MzMxOlxcdGlmIChhcmctXFx1MDAzZW1vZGUgXFx1MDAyNiBLQlVGX01PREVfRlJFRSlcXG5pb191cmluZy9rYnVmLmMtMzMyLVxcdFxcdGtmcmVlKGFyZy1cXHUwMDNlaW92cyk7XFxuLS1cXG5pb191cmluZy9rYnVmLmg9NTM9ZW51bSB7XFxuLS1cXG5pb191cmluZy9rYnVmLmgtNTYtXFx0LyogaWYgYmlnZ2VyIHZlYyBhbGxvY2F0ZWQsIGZyZWUgb2xkIG9uZSAqL1xcbmlvX3VyaW5nL2tidWYuaDo1NzpcXHRLQlVGX01PREVfRlJFRVxcdFxcdD0gMixcXG5pb191cmluZy9rYnVmLmgtNTgtfTtcXG4tLVxcbmlvX3VyaW5nL25ldC5jPTYwOD1zdGF0aWMgaW50IGlvX3NlbmRfc2VsZWN0X2J1ZmZlcihzdHJ1Y3QgaW9fa2lvY2IgKnJlcSwgdW5zaWduZWQgaW50IGlzc3VlX2ZsYWdzLFxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtNjIyLVxcdFxcdGFyZy5pb3ZzID0ga21zZy1cXHUwMDNldmVjLmlvdmVjO1xcbmlvX3VyaW5nL25ldC5jOjYyMzpcXHRcXHRhcmcubW9kZSA9IEtCVUZfTU9ERV9GUkVFO1xcbmlvX3VyaW5nL25ldC5jLTYyNC1cXHR9XFxuLS1cXG5pb191cmluZy9uZXQuYz0xMTM3PXN0YXRpYyBpbnQgaW9fcmVjdl9idWZfc2VsZWN0KHN0cnVjdCBpb19raW9jYiAqcmVxLCBzdHJ1Y3QgaW9fYXN5bmNfbXNnaGRyICprbXNnLFxcbi0tXFxuaW9fdXJpbmcvbmV0LmMtMTE1OS1cXHRcXHRcXHRhcmcuaW92cyA9IGttc2ctXFx1MDAzZXZlYy5pb3ZlYztcXG5pb191cmluZy9uZXQuYzoxMTYwOlxcdFxcdFxcdGFyZy5tb2RlIHw9IEtCVUZfTU9ERV9GUkVFO1xcbmlvX3VyaW5nL25ldC5jLTExNjEtXFx0XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozODo0MS45NjczNzAwNzRaIiwiU2VxIjo0NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NzQ4MDMzMjI4MDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIElPX1VSSU5HIFZ1bG5lcmFiaWxpdHkqKlxuXG5Pa2F5LCBzbyB0aGlzIGlzIGZvY3VzZWQgb24gYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgYW5kIGBpb19yZWN2X2J1Zl9zZWxlY3RgIOKAkyB3aGljaCBjb25maXJtcyB0aGUgZm9jdXMgc3ltYm9scyBJIGlkZW50aWZpZWQgYXJlIGNvcnJlY3QuIExldCdzIGJyZWFrIGRvd24gdGhlIGlzc3VlIG1ldGhvZGljYWxseS5cblxuVGhlIHBhdGNoJ3MgcHJvYmxlbSBsaWVzIGluIG1vdmluZyB0aGF0IGBrZnJlZShhcmctXHUwMDNlaW92cylgIGNhbGwgdG8gdGhlIGVuZCBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBUaGUgbG9naWMgaGVyZSBpcyBrZXk6IGlmIGBLQlVGX01PREVfRlJFRWAgaXMgc2V0LCBgYXJnLVx1MDAzZWlvdnNgIGdldHMgdW5jb25kaXRpb25hbGx5IGZyZWVkICpiZWZvcmUqIHRoZSBmdW5jdGlvbiByZXR1cm5zLiBOb3csIGBhcmctXHUwMDNlaW92c2AgaXMgKmVpdGhlciogYSBmcmVzaGx5IGFsbG9jYXRlZCBhcnJheSAoaWYgdGhlIG9yaWdpbmFsIG5lZWRlZCBleHBhbnNpb24pICpvciogdGhlIG9yaWdpbmFsIGFycmF5IHBhc3NlZCBpbi4gVGhlIGNyaXRpY2FsIHBvaW50IGlzIHRoYXQsIHJlZ2FyZGxlc3Mgb2YgYWxsb2NhdGlvbiwgdGhlIHBvaW50ZXIgdG8gYGFyZy1cdTAwM2Vpb3ZzYCBpcyAqc3RpbGwqIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIsIHdoaWNoIGlzIGVpdGhlciBgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBvciBgaW9fcmVjdl9idWZfc2VsZWN0YC5cblxuVGhpcyBjcmVhdGVzIGEgbmFzdHksIDEwMCUgcmVwcm9kdWNpYmxlIHVzZS1hZnRlci1mcmVlIHZ1bG5lcmFiaWxpdHkuIEVzc2VudGlhbGx5LCBpZiB5b3UncmUgdXNpbmcgcHJvdmlkZWQgYnVmZmVycyB3aXRoIGBpb19zZW5kYCBvciBgaW9fcmVjdmAsIHdpdGggcHJlLWFsbG9jYXRlZCBpb3ZlY3MsIHRoZSBidWZmZXJzIGFyZSBmcmVlZCBiZWZvcmUgdGhlIGNhbGxlciBjYW4gcHJvY2VzcyB0aGVtLiBUaGlzIGlzIGEgY2xlYXIsIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgc2NyZWFtcyBmb3IgZnV6emluZy5cblxuTXkgcHJpbWFyeSBjb25maWd1cmF0aW9uIGNvbmNlcm5zIGFyZSBgSU9fVVJJTkdgIGFuZCBgTkVUYCwgbmF0dXJhbGx5LlxuXG5Ob3csIGxldCdzIHByb2NlZWQgdG8gc2V0LXJlc3VsdHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0NTIzLCJPdXRwdXRUb2tlbnMiOjIzNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wN1QwMzozOTo1Ni43NzA2OTUzNFoiLCJTZXEiOjQ2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQzMTcxMjQ1NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSU9fVVJJTkdcIixcbiAgICBcIk5FVFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImlvX3JpbmdfYnVmZmVyc19wZWVrXCIsXG4gICAgXCJpb19idWZmZXJzX3NlbGVjdFwiLFxuICAgIFwiaW9fc2VuZF9zZWxlY3RfYnVmZmVyXCIsXG4gICAgXCJpb19yZWN2X2J1Zl9zZWxlY3RcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb3ZlcyBga2ZyZWUoYXJnLVxcdTAwM2Vpb3ZzKWAgdG8gdGhlIGVuZCBvZiBgaW9fcmluZ19idWZmZXJzX3BlZWtgLiBJZiBgS0JVRl9NT0RFX0ZSRUVgIGlzIHNldCwgdGhpcyB1bmNvbmRpdGlvbmFsbHkgZnJlZXMgYGFyZy1cXHUwMDNlaW92c2AgYmVmb3JlIHJldHVybmluZy4gSG93ZXZlciwgYGFyZy1cXHUwMDNlaW92c2AgaXMgZWl0aGVyIHRoZSBuZXdseSBhbGxvY2F0ZWQgYXJyYXkgKGlmIGV4cGFuZGVkKSBvciB0aGUgb3JpZ2luYWwgYXJyYXksIGFuZCBpbiBib3RoIGNhc2VzLCBpdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyIChgaW9fc2VuZF9zZWxlY3RfYnVmZmVyYCBvciBgaW9fcmVjdl9idWZfc2VsZWN0YCkgd2hpY2ggdGhlbiB1c2VzIGl0LiBUaGlzIGludHJvZHVjZXMgYSAxMDAlIHJlcHJvZHVjaWJsZSB1c2UtYWZ0ZXItZnJlZSB2dWxuZXJhYmlsaXR5IHdoZW4gdXNpbmcgcHJvdmlkZWQgYnVmZmVycyB3aXRoIGBpb19zZW5kYCBvciBgaW9fcmVjdmAgYW5kIHByZS1hbGxvY2F0ZWQgaW92ZWNzLiBUaGlzIGlzIGEgZnVuY3Rpb25hbCBjaGFuZ2UgdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklPX1VSSU5HXCIsXG4gICAgXCJORVRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJpb19yaW5nX2J1ZmZlcnNfcGVla1wiLFxuICAgIFwiaW9fYnVmZmVyc19zZWxlY3RcIixcbiAgICBcImlvX3NlbmRfc2VsZWN0X2J1ZmZlclwiLFxuICAgIFwiaW9fcmVjdl9idWZfc2VsZWN0XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW92ZXMgYGtmcmVlKGFyZy1cXHUwMDNlaW92cylgIHRvIHRoZSBlbmQgb2YgYGlvX3JpbmdfYnVmZmVyc19wZWVrYC4gSWYgYEtCVUZfTU9ERV9GUkVFYCBpcyBzZXQsIHRoaXMgdW5jb25kaXRpb25hbGx5IGZyZWVzIGBhcmctXFx1MDAzZWlvdnNgIGJlZm9yZSByZXR1cm5pbmcuIEhvd2V2ZXIsIGBhcmctXFx1MDAzZWlvdnNgIGlzIGVpdGhlciB0aGUgbmV3bHkgYWxsb2NhdGVkIGFycmF5IChpZiBleHBhbmRlZCkgb3IgdGhlIG9yaWdpbmFsIGFycmF5LCBhbmQgaW4gYm90aCBjYXNlcywgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciAoYGlvX3NlbmRfc2VsZWN0X2J1ZmZlcmAgb3IgYGlvX3JlY3ZfYnVmX3NlbGVjdGApIHdoaWNoIHRoZW4gdXNlcyBpdC4gVGhpcyBpbnRyb2R1Y2VzIGEgMTAwJSByZXByb2R1Y2libGUgdXNlLWFmdGVyLWZyZWUgdnVsbmVyYWJpbGl0eSB3aGVuIHVzaW5nIHByb3ZpZGVkIGJ1ZmZlcnMgd2l0aCBgaW9fc2VuZGAgb3IgYGlvX3JlY3ZgIGFuZCBwcmUtYWxsb2NhdGVkIGlvdmVjcy4gVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowzdqdq[1] Phase: Succeeded StartedAt: 2026-07-07 03:40:51 +0000 UTC FinishedAt: 2026-07-07 03:40:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-07 03:40:51 +0000 UTC FinishedAt: 2026-07-07 03:40:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2] Phase: Succeeded StartedAt: 2026-07-07 03:40:51 +0000 UTC FinishedAt: 2026-07-07 07:56:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-07 03:40:51 +0000 UTC FinishedAt: 2026-07-07 07:56:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-07 03:40:51 +0000 UTC FinishedAt: 2026-07-07 03:41:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-07 03:40:51 +0000 UTC FinishedAt: 2026-07-07 03:41:01 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},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-workflowzdqdq/series-workflowzdqdq-convert-artifact-3055105779/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-07 03:41:11 +0000 UTC FinishedAt: 2026-07-07 04:22:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-07 03:41:11 +0000 UTC FinishedAt: 2026-07-07 04:22:31 +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:*6447329e-0686-40ef-8c26-dbeeabe8968f,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-workflowzdqdq/series-workflowzdqdq-convert-artifact-3055105779/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": "6951537d-6ab8-49a8-a6c4-affc35e045e3", "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-workflowzdqdq/series-workflowzdqdq-build-action-3971193249/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-07 03:41:11 +0000 UTC FinishedAt: 2026-07-07 04:22:21 +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:*6447329e-0686-40ef-8c26-dbeeabe8968f,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-workflowzdqdq/series-workflowzdqdq-convert-artifact-3055105779/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": "6951537d-6ab8-49a8-a6c4-affc35e045e3", "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-workflowzdqdq/series-workflowzdqdq-build-action-3971193249/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-07 04:22:31 +0000 UTC FinishedAt: 2026-07-07 04:22:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-07 04:22:31 +0000 UTC FinishedAt: 2026-07-07 04:22:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-07 04:22:31 +0000 UTC FinishedAt: 2026-07-07 04:22:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-07 04:22:31 +0000 UTC FinishedAt: 2026-07-07 04:22:38 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},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-workflowzdqdq/series-workflowzdqdq-convert-artifact-2417923818/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-07 04:22:41 +0000 UTC FinishedAt: 2026-07-07 04:25:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-07 04:22:41 +0000 UTC FinishedAt: 2026-07-07 04:24:52 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*6951537d-6ab8-49a8-a6c4-affc35e045e3,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-workflowzdqdq/series-workflowzdqdq-build-action-3971193249/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-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-07 04:25:02 +0000 UTC FinishedAt: 2026-07-07 04:25:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-07 04:25:02 +0000 UTC FinishedAt: 2026-07-07 04:25:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-07 04:25:02 +0000 UTC FinishedAt: 2026-07-07 04:51:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-07 04:25:02 +0000 UTC FinishedAt: 2026-07-07 04:51:36 +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:*6447329e-0686-40ef-8c26-dbeeabe8968f,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-workflowzdqdq/series-workflowzdqdq-convert-artifact-2417923818/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": "65d7de9f-afdf-4f46-a752-b0873c55b06a", "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-workflowzdqdq/series-workflowzdqdq-build-action-44483342/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-07 04:25:02 +0000 UTC FinishedAt: 2026-07-07 04:51:26 +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:*6447329e-0686-40ef-8c26-dbeeabe8968f,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-workflowzdqdq/series-workflowzdqdq-convert-artifact-2417923818/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": "65d7de9f-afdf-4f46-a752-b0873c55b06a", "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-workflowzdqdq/series-workflowzdqdq-build-action-44483342/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-07 04:51:36 +0000 UTC FinishedAt: 2026-07-07 04:51:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-07 04:51:36 +0000 UTC FinishedAt: 2026-07-07 04:51:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-07 04:51:36 +0000 UTC FinishedAt: 2026-07-07 04:53:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-07 04:51:36 +0000 UTC FinishedAt: 2026-07-07 04:53:37 +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:*65d7de9f-afdf-4f46-a752-b0873c55b06a,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-workflowzdqdq/series-workflowzdqdq-build-action-44483342/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-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-07 04:53:47 +0000 UTC FinishedAt: 2026-07-07 07:56:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-07 04:53:47 +0000 UTC FinishedAt: 2026-07-07 07:56:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*6951537d-6ab8-49a8-a6c4-affc35e045e3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*65d7de9f-afdf-4f46-a752-b0873c55b06a,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-workflowzdqdq/series-workflowzdqdq-build-action-3971193249/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-workflowzdqdq/series-workflowzdqdq-build-action-44483342/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-07 04:53:47 +0000 UTC FinishedAt: 2026-07-07 04:53:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-07 04:53:47 +0000 UTC FinishedAt: 2026-07-07 04:53:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzdqdq/series-workflowzdqdq-convert-artifact-4148637567/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-07 04:53:47 +0000 UTC FinishedAt: 2026-07-07 04:53:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-07 04:53:47 +0000 UTC FinishedAt: 2026-07-07 04:53:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-07 04:53:48 +0000 UTC FinishedAt: 2026-07-07 04:53:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-07 04:53:58 +0000 UTC FinishedAt: 2026-07-07 07:56:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzdqdq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["io_uring"],"focus_symbols":["io_ring_buffers_peek","io_buffers_select","io_send_select_buffer","io_recv_buf_select"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"8cdeaa50eae8dad34885515f62559ee83e7e8dda","config_name":"upstream-apparmor-kasan.config","enable_configs":["IO_URING","NET"],"series_id":"468dd25d-90fc-4f9c-bfd8-20ef558367b9","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-07 04:53:58 +0000 UTC FinishedAt: 2026-07-07 07:56:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*6951537d-6ab8-49a8-a6c4-affc35e045e3,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*65d7de9f-afdf-4f46-a752-b0873c55b06a,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-workflowzdqdq/series-workflowzdqdq-build-action-3971193249/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-workflowzdqdq/series-workflowzdqdq-build-action-44483342/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-workflowzdqdq/series-workflowzdqdq-convert-artifact-4148637567/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,}