Name: series-workflowhvl26 Phase: Succeeded StartedAt: 2026-09-03 19:16:29 +0000 UTC FinishedAt: 2026-09-03 23:11:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[0] Phase: Succeeded StartedAt: 2026-09-03 19:16:29 +0000 UTC FinishedAt: 2026-09-03 19:33:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[0].run-triage Phase: Succeeded StartedAt: 2026-09-03 19:16:29 +0000 UTC FinishedAt: 2026-09-03 19:33:49 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "e539025ff1f7351a42788c5a88aab59c26f5131b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMORY_HOTPLUG", "MEMORY_HOTREMOVE", "NUMA" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "e539025ff1f7351a42788c5a88aab59c26f5131b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMORY_HOTPLUG", "MEMORY_HOTREMOVE", "NUMA" ], "series_id": "274cbd31-137a-4f63-ba0e-430801aaeca6" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "try_offline_node", "node_is_memoryless", "try_remove_memory" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTU9SWV9IT1RQTFVHJiMzNDssCiAgICAmIzM0O01FTU9SWV9IT1RSRU1PVkUmIzM0OywKICAgICYjMzQ7TlVNQSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RyeV9vZmZsaW5lX25vZGUmIzM0OywKICAgICYjMzQ7bm9kZV9pc19tZW1vcnlsZXNzJiMzNDssCiAgICAmIzM0O3RyeV9yZW1vdmVfbWVtb3J5JiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaXMgYSBwdXJlIHJlZmFjdG9yaW5nIGluIG1tL21lbW9yeV9ob3RwbHVnLmMgdGhhdCBleHRyYWN0cyB0aGUgY2hlY2sgZGV0ZXJtaW5pbmcgaWYgYSBOVU1BIG5vZGUgaXMgbWVtb3J5bGVzcyAoY2hlY2tpbmcgbm9kZV9zcGFubmVkX3BhZ2VzIGFuZCBpdGVyYXRpbmcgbWVtb3J5IGJsb2NrcykgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gbm9kZV9pc19tZW1vcnlsZXNzKCkuIE5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIHBhdGh3YXlzIGFyZSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nOyBzdGFuZGFyZCBzYW5pdGl6ZXJzIGFuZCB0ZXN0IHN1aXRlcyAoS0FTQU4sIExPQ0tERVApIGFyZSBzdWZmaWNpZW50LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG1lbW9yeSBob3RwbHVnIGNvZGUgKG1tL21lbW9yeV9ob3RwbHVnLmMpLCBleHRyYWN0aW5nIG5vZGUgbWVtb3J5bGVzcyBjaGVja3MgaW50byBub2RlX2lzX21lbW9yeWxlc3MoKSB1c2VkIGR1cmluZyBOVU1BIG5vZGUgb2ZmbGluaW5nIGluIHRyeV9vZmZsaW5lX25vZGUoKS4gVGhpcyBpcyByZWFjaGFibGUgdmlhIG1lbW9yeSBob3QtdW5wbHVnIG9wZXJhdGlvbnMgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBhNTNlMTlhMGI2ZDI0YjIwMTQ5ZDA0YjM1YTAxZjVhNTk1MDFlZGZhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAxOTozMDo0NyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xuaW5kZXggMjI2YWI5Y2IwNzhhZC4uZDBlOTQwNTc2ODJhZiAxMDA2NDRcbi0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbW9yeV9ob3RwbHVnLmNcbkBAIC0xNDkxLDYgJiM0MzsxNDkxLDM2IEBAIHN0YXRpYyBpbnQgY3JlYXRlX2FsdG1hcHNfYW5kX21lbW9yeV9ibG9ja3MoaW50IG5pZCwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiYjNDM7c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdGludCBuaWQgPSAqKGludCAqKWFyZztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBJZiBhIG1lbW9yeSBibG9jayBiZWxvbmdzIHRvIG11bHRpcGxlIG5vZGVzLCB0aGUgc3RvcmVkIG5pZCBpcyBub3RcbiYjNDM7XHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbiYjNDM7XHQgKiBvZmZsaW5lZCkgYW5kLCB0aGVyZWZvcmUsIGFyZSBzdGlsbCBzcGFubmVkIGJ5IHRoZSBub2RlLlxuJiM0MztcdCAqL1xuJiM0MztcdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xuJiM0MztzdGF0aWMgYm9vbCBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQSBub2RlIHN0aWxsIHNwYW5uaW5nIHBhZ2VzIChlc3BlY2lhbGx5IFpPTkVfREVWSUNFKSBpcyBub3RcbiYjNDM7XHQgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksXG4mIzQzO1x0ICogZS5nLiBvbmNlIGEgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIG9ubGluZWQuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogT2ZmbGluZSBtZW1vcnkgYmxvY2tzIG1heSBub3QgYmUgc3Bhbm5lZCBieSB0aGUgbm9kZSB5ZXQsIGJ1dCB0aGV5XG4mIzQzO1x0ICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdFxuJiM0MztcdCAqIG1lbW9yeWxlc3Mgd2hpbGUgYW55IHJlbWFpbi5cbiYjNDM7XHQgKi9cbiYjNDM7XHRyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIE5PVEU6IFRoZSBjYWxsZXIgbXVzdCBjYWxsIGxvY2tfZGV2aWNlX2hvdHBsdWcoKSB0byBzZXJpYWxpemUgaG90cGx1Z1xuICAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuXG5AQCAtMjIxNCwxOCAmIzQzOzIyNDQsNiBAQCBzdGF0aWMgaW50IGNoZWNrX2NwdV9vbl9ub2RlKGludCBuaWQpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbi17XG4tXHRpbnQgbmlkID0gKihpbnQgKilhcmc7XG4tXG4tXHQvKlxuLVx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XG4tXHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbi1cdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXG4tXHQgKi9cbi1cdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuLX1cbi1cbiAvKipcbiAgKiB0cnlfb2ZmbGluZV9ub2RlXG4gICogQG5pZDogdGhlIG5vZGUgSURcbkBAIC0yMjM3LDIzICYjNDM7MjI1NSw3IEBAIHN0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXG4gICovXG4gdm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXG4ge1xuLVx0aW50IHJjO1xuLVxuLVx0Lypcbi1cdCAqIElmIHRoZSBub2RlIHN0aWxsIHNwYW5zIHBhZ2VzIChlc3BlY2lhbGx5IFpPTkVfREVWSUNFKSwgZG9uJiMzOTt0XG4tXHQgKiBvZmZsaW5lIGl0LiBBIG5vZGUgc3BhbnMgbWVtb3J5IGFmdGVyIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoKSxcbi1cdCAqIGUuZy4sIGFmdGVyIHRoZSBtZW1vcnkgYmxvY2sgd2FzIG9ubGluZWQuXG4tXHQgKi9cbi1cdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcbi1cdFx0cmV0dXJuO1xuLVxuLVx0Lypcbi1cdCAqIEVzcGVjaWFsbHkgb2ZmbGluZSBtZW1vcnkgYmxvY2tzIG1pZ2h0IG5vdCBiZSBzcGFubmVkIGJ5IHRoZVxuLVx0ICogbm9kZS4gVGhleSB3aWxsIGdldCBzcGFubmVkIGJ5IHRoZSBub2RlIG9uY2UgdGhleSBnZXQgb25saW5lZC5cbi1cdCAqIEhvd2V2ZXIsIHRoZXkgbGluayB0byB0aGUgbm9kZSBpbiBzeXNmcyBhbmQgY2FuIGdldCBvbmxpbmVkIGxhdGVyLlxuLVx0ICovXG4tXHRyYyA9IGZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbi1cdGlmIChyYylcbiYjNDM7XHRpZiAoIW5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpKVxuIFx0XHRyZXR1cm47XG4gXG4gXHRpZiAoY2hlY2tfY3B1X29uX25vZGUobmlkKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUkVNT1ZFJiMzNDssCiAgICAmIzM0O05VTUEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt0cnlfb2ZmbGluZV9ub2RlJiMzNDssCiAgICAmIzM0O25vZGVfaXNfbWVtb3J5bGVzcyYjMzQ7LAogICAgJiMzNDt0cnlfcmVtb3ZlX21lbW9yeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG1lbW9yeSBob3RwbHVnIGNvZGUgKG1tL21lbW9yeV9ob3RwbHVnLmMpLCBleHRyYWN0aW5nIG5vZGUgbWVtb3J5bGVzcyBjaGVja3MgaW50byBub2RlX2lzX21lbW9yeWxlc3MoKSB1c2VkIGR1cmluZyBOVU1BIG5vZGUgb2ZmbGluaW5nIGluIHRyeV9vZmZsaW5lX25vZGUoKS4gVGhpcyBpcyByZWFjaGFibGUgdmlhIG1lbW9yeSBob3QtdW5wbHVnIG9wZXJhdGlvbnMgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBhNTNlMTlhMGI2ZDI0YjIwMTQ5ZDA0YjM1YTAxZjVhNTk1MDFlZGZhCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMyAxOTozMDo0NyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDIyNmFiOWNiMDc4YWQuLmQwZTk0MDU3NjgyYWYgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMTQ5MSw2ICYjNDM7MTQ5MSwzNiBAQCBzdGF0aWMgaW50IGNyZWF0ZV9hbHRtYXBzX2FuZF9tZW1vcnlfYmxvY2tzKGludCBuaWQsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLAogCXJldHVybiByZXQ7CiB9CiAKJiM0MztzdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJaW50IG5pZCA9ICooaW50ICopYXJnOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJZiBhIG1lbW9yeSBibG9jayBiZWxvbmdzIHRvIG11bHRpcGxlIG5vZGVzLCB0aGUgc3RvcmVkIG5pZCBpcyBub3QKJiM0MzsJICogcmVsaWFibGUuIEhvd2V2ZXIsIHN1Y2ggYmxvY2tzIGFyZSBhbHdheXMgb25saW5lIChlLmcuLCBjYW5ub3QgZ2V0CiYjNDM7CSAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gbWVtLSZndDtuaWQgPT0gbmlkID8gLUVFWElTVCA6IDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovCiYjNDM7c3RhdGljIGJvb2wgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpCiYjNDM7ewomIzQzOwkvKgomIzQzOwkgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdAomIzQzOwkgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksCiYjNDM7CSAqIGUuZy4gb25jZSBhIG1lbW9yeSBibG9jayBoYXMgYmVlbiBvbmxpbmVkLgomIzQzOwkgKi8KJiM0MzsJaWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwkvKgomIzQzOwkgKiBPZmZsaW5lIG1lbW9yeSBibG9ja3MgbWF5IG5vdCBiZSBzcGFubmVkIGJ5IHRoZSBub2RlIHlldCwgYnV0IHRoZXkKJiM0MzsJICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdAomIzQzOwkgKiBtZW1vcnlsZXNzIHdoaWxlIGFueSByZW1haW4uCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jaygmYW1wO25pZCwgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2IpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWcKICAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuCkBAIC0yMjE0LDE4ICYjNDM7MjI0NCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfY3B1X29uX25vZGUoaW50IG5pZCkKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZykKLXsKLQlpbnQgbmlkID0gKihpbnQgKilhcmc7Ci0KLQkvKgotCSAqIElmIGEgbWVtb3J5IGJsb2NrIGJlbG9uZ3MgdG8gbXVsdGlwbGUgbm9kZXMsIHRoZSBzdG9yZWQgbmlkIGlzIG5vdAotCSAqIHJlbGlhYmxlLiBIb3dldmVyLCBzdWNoIGJsb2NrcyBhcmUgYWx3YXlzIG9ubGluZSAoZS5nLiwgY2Fubm90IGdldAotCSAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuCi0JICovCi0JcmV0dXJuIG1lbS0mZ3Q7bmlkID09IG5pZCA/IC1FRVhJU1QgOiAwOwotfQotCiAvKioKICAqIHRyeV9vZmZsaW5lX25vZGUKICAqIEBuaWQ6IHRoZSBub2RlIElECkBAIC0yMjM3LDIzICYjNDM7MjI1NSw3IEBAIHN0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpCiAgKi8KIHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKQogewotCWludCByYzsKLQotCS8qCi0JICogSWYgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpLCBkb24mIzM5O3QKLQkgKiBvZmZsaW5lIGl0LiBBIG5vZGUgc3BhbnMgbWVtb3J5IGFmdGVyIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoKSwKLQkgKiBlLmcuLCBhZnRlciB0aGUgbWVtb3J5IGJsb2NrIHdhcyBvbmxpbmVkLgotCSAqLwotCWlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBFc3BlY2lhbGx5IG9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtaWdodCBub3QgYmUgc3Bhbm5lZCBieSB0aGUKLQkgKiBub2RlLiBUaGV5IHdpbGwgZ2V0IHNwYW5uZWQgYnkgdGhlIG5vZGUgb25jZSB0aGV5IGdldCBvbmxpbmVkLgotCSAqIEhvd2V2ZXIsIHRoZXkgbGluayB0byB0aGUgbm9kZSBpbiBzeXNmcyBhbmQgY2FuIGdldCBvbmxpbmVkIGxhdGVyLgotCSAqLwotCXJjID0gZm9yX2VhY2hfbWVtb3J5X2Jsb2NrKCZhbXA7bmlkLCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYik7Ci0JaWYgKHJjKQomIzQzOwlpZiAoIW5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpKQogCQlyZXR1cm47CiAKIAlpZiAoY2hlY2tfY3B1X29uX25vZGUobmlkKSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzY0NwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDk0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTWVtb3J5IEhvdHBsdWcgUGF0Y2gqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW4uIE15IGZpcnN0IGluc3RpbmN0IGlzIGFsd2F5cyB0byBkaXNzZWN0IHRoZSBwYXRjaCBpdHNlbGYuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb2RlIGNoYW5nZXMgZGlyZWN0bHkuIEkmIzM5O2xsIHRoZW4gbW92ZSBvbiB0byBwaW5wb2ludGluZyB3aGVyZSB0aGUga2V5IGZ1bmN0aW9ucywgYG5vZGVfaXNfbWVtb3J5bGVzc2Agb3IgYHRyeV9vZmZsaW5lX25vZGVgLCBhcmUgYWN0dWFsbHkgYmVpbmcgKnVzZWQqLiBBIHF1aWNrIGByZWFkLWZpbGVgIG9yIGBncmVwcGVyYCBzY2FuIG9mIHRoZSBjb2RlYmFzZSBpcyBteSBnby10byBhcHByb2FjaCBoZXJlLiBTcGVjaWZpY2FsbHksIEkmIzM5O2xsIGJlIHRhcmdldGluZyBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIEkgd2FudCB0byBzZWUgaWYgYG5vZGVfaXNfbWVtb3J5bGVzc2AgaXMgYmVpbmcgbGV2ZXJhZ2VkIGFueXdoZXJlIGVsc2UgaW4gdGhhdCBmaWxlIGJleW9uZCB0aGUgaW1tZWRpYXRlIHNjb3BlIG9mIHRoZSBwYXRjaCwgYW5kIHRvIHVuZGVyc3RhbmQgdGhlIGNhbGwgc3RydWN0dXJlIHdpdGggYHRyeV9vZmZsaW5lX25vZGVgLiBBIGdvb2QgYGdyZXBgIG9yIGRpcmVjdCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgcmVhZGluZyBpcyB3aGF0IEkgbmVlZCBoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25vZGVfaXNfbWVtb3J5bGVzcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeV9ob3RwbHVnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYz0xNDk0PXN0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNTA2LS8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE1MDc6c3RhdGljIGJvb2wgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE1MDgte1xuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MjI1Nj12b2lkIHRyeV9vZmZsaW5lX25vZGUoaW50IG5pZClcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI1Ny17XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyNTg6XHRpZiAoIW5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpKVxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjU5LVx0XHRyZXR1cm47XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDE3MAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDQ4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuCgoqKkludmVzdGlnYXRpbmcgYSBDb2RlIFNlZ21lbnQgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgKioKCkFscmlnaHQsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgZ29pbmcgb24gYXJvdW5kIGxpbmVzIDE0OTAtMTU1MCBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB6b29tIG91dCBhIGJpdCBhbmQgZ2V0IHNvbWUgY29udGV4dC4gSSB3YW50IHRvIHNlZSBpZiB0aGlzIHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZSBpcyBqdXN0IGEgc3RhbmRhbG9uZSBmdW5jdGlvbiwgb3IgaWYgaXQmIzM5O3MgcGFydCBvZiBhIGxhcmdlciwgcG90ZW50aWFsbHkgcmVsYXRlZCBzZXJpZXMgb2YgY2FsbHMgd2l0aGluIHRoZSBob3RwbHVnIHN1YnN5c3RlbS4gSXMgdGhpcyBsaW5lIHBhcnQgb2YgYSBicm9hZGVyIHJlZmFjdG9yaW5nIGVmZm9ydCBvciBzb21lIGtpbmQgb2Ygc2VxdWVudGlhbCBwcm9jZXNzaW5nPyBVbmRlcnN0YW5kaW5nIHRoZSBzdXJyb3VuZGluZyBjb2RlIHdpbGwgbGlrZWx5IGJlIGtleSB0byBmaWd1cmluZyBvdXQgdGhlIG92ZXJhbGwgaW50ZW50IGFuZCBwb3RlbnRpYWwgaXNzdWVzIGluIHRoaXMgc3BlY2lmaWMgcmFuZ2UuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgcXVpY2tseSBzY2FubmluZyB0aGUgY2FsbCBncmFwaCBhbmQgYW55IG5lYXJieSBjb21tZW50cyB0byBzZWUgaG93IHRoaXMgZml0cyBpbnRvIHRoZSBiaWdnZXIgcGljdHVyZSBvZiBtZW1vcnkgaG90cGx1Z2dpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTQ4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNDgwOlx0XHRcdGlmIChyZXQpIHtcbjE0ODE6XHRcdFx0XHRhcmNoX3JlbW92ZV9tZW1vcnkoY3VyX3N0YXJ0LCBtZW1ibG9ja19zaXplLCBwYXJhbXMuYWx0bWFwLCBOVUxMKTtcbjE0ODI6XHRcdFx0XHRhbHRtYXBfZnJlZShwYXJhbXMuYWx0bWFwKTtcbjE0ODM6XHRcdFx0XHRnb3RvIG91dDtcbjE0ODQ6XHRcdFx0fVxuMTQ4NTpcdFx0fVxuMTQ4NjpcdFxuMTQ4NzpcdFx0cmV0dXJuIDA7XG4xNDg4Olx0b3V0OlxuMTQ4OTpcdFx0aWYgKHJldCBcdTAwMjZcdTAwMjYgY3VyX3N0YXJ0ICE9IHN0YXJ0KVxuMTQ5MDpcdFx0XHRyZW1vdmVfbWVtb3J5X2Jsb2Nrc19hbmRfYWx0bWFwcyhzdGFydCwgY3VyX3N0YXJ0IC0gc3RhcnQpO1xuMTQ5MTpcdFx0cmV0dXJuIHJldDtcbjE0OTI6XHR9XG4xNDkzOlx0XG4xNDk0Olx0c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbjE0OTU6XHR7XG4xNDk2Olx0XHRpbnQgbmlkID0gKihpbnQgKilhcmc7XG4xNDk3Olx0XG4xNDk4Olx0XHQvKlxuMTQ5OTpcdFx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XG4xNTAwOlx0XHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbjE1MDE6XHRcdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXG4xNTAyOlx0XHQgKi9cbjE1MDM6XHRcdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuMTUwNDpcdH1cbjE1MDU6XHRcbjE1MDY6XHQvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xuMTUwNzpcdHN0YXRpYyBib29sIG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKVxuMTUwODpcdHtcbjE1MDk6XHRcdC8qXG4xNTEwOlx0XHQgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdFxuMTUxMTpcdFx0ICogbWVtb3J5bGVzcy4gIEEgbm9kZSBzcGFucyBtZW1vcnkgYWZ0ZXIgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSgpLFxuMTUxMjpcdFx0ICogZS5nLiBvbmNlIGEgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIG9ubGluZWQuXG4xNTEzOlx0XHQgKi9cbjE1MTQ6XHRcdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcbjE1MTU6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTUxNjpcdFx0LypcbjE1MTc6XHRcdCAqIE9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtYXkgbm90IGJlIHNwYW5uZWQgYnkgdGhlIG5vZGUgeWV0LCBidXQgdGhleVxuMTUxODpcdFx0ICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdFxuMTUxOTpcdFx0ICogbWVtb3J5bGVzcyB3aGlsZSBhbnkgcmVtYWluLlxuMTUyMDpcdFx0ICovXG4xNTIxOlx0XHRyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbjE1MjI6XHR9XG4xNTIzOlx0XG4xNTI0Olx0LypcbjE1MjU6XHQgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcbjE1MjY6XHQgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyAodHJpZ2dlcmVkIGUuZy4gYnkgc3lzZnMpLlxuMTUyNzpcdCAqXG4xNTI4Olx0ICogd2UgYXJlIE9LIGNhbGxpbmcgX19tZW1pbml0IHN0dWZmIGhlcmUgLSB3ZSBoYXZlIENPTkZJR19NRU1PUllfSE9UUExVR1xuMTUyOTpcdCAqL1xuMTUzMDpcdHN0YXRpYyBpbnQgX19hZGRfbWVtb3J5X3Jlc291cmNlKGludCBuaWQsIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBtaHBfdCBtaHBfZmxhZ3MsXG4xNTMxOlx0XHRcdFx0XHQgZW51bSBtbW9wIG9ubGluZV90eXBlKVxuMTUzMjpcdHtcbjE1MzM6XHRcdHN0cnVjdCBtaHBfcGFyYW1zIHBhcmFtcyA9IHsgLnBncHJvdCA9IHBncHJvdF9taHAoUEFHRV9LRVJORUwpIH07XG4xNTM0Olx0XHRlbnVtIG1lbWJsb2NrX2ZsYWdzIG1lbWJsb2NrX2ZsYWdzID0gTUVNQkxPQ0tfTk9ORTtcbjE1MzU6XHRcdHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwID0gTlVMTDtcbjE1MzY6XHRcdHU2NCBzdGFydCwgc2l6ZTtcbjE1Mzc6XHRcdGJvb2wgbmV3X25vZGUgPSBmYWxzZTtcbjE1Mzg6XHRcdGludCByZXQ7XG4xNTM5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTM3MAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBpdHMgRGVwZW5kZW5jaWVzKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYF9fYWRkX21lbW9yeV9yZXNvdXJjZWAgZnVuY3Rpb24gYmV0dGVyLiBDbGVhcmx5LCBpdCYjMzk7cyBjZW50cmFsIHRvIGhvdyBtZW1vcnkgcmVzb3VyY2VzIGFyZSBhZGRlZCB0byB0aGUgc3lzdGVtLCBidXQgSSBuZWVkIHRoZSBicm9hZGVyIGNvbnRleHQuIE15IG5leHQgbW92ZSBpcyB0byBnbyBkZWVwZXIgaW50byBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgaXRzZWxmLiBJIHdhbnQgdG8gc2VlICpleGFjdGx5KiBob3cgYF9fYWRkX21lbW9yeV9yZXNvdXJjZWAgaXMgdXNlZC4gVGhpcyBtZWFucyB0cmFjaW5nIGFsbCB0aGUgY2FsbGVycy4gSXQmIzM5O3MgYSBjcml0aWNhbCBmdW5jdGlvbiwgbm8gZG91YnQsIGJ1dCB1bmRlcnN0YW5kaW5nIHRoZSBzdXJyb3VuZGluZyBsb2dpYyBpcyBwYXJhbW91bnQgdG8gc2VlaW5nIHRoZSBiaWdnZXIgcGljdHVyZS4gQXJlIHRoZXJlIGFueSBpbmRpcmVjdCBjYWxscz8gV2hhdCBraW5kIG9mIGRhdGEgc3RydWN0dXJlcyBkb2VzIGl0IG1hbmlwdWxhdGU/IEkgbmVlZCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBzdWJ0bGUgcmFjZSBjb25kaXRpb25zIG9yIG1lbW9yeSBhbGxvY2F0aW9uIGlzc3VlcyBsdXJraW5nIGluIHRoZSBjb2RlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTU0MDpcdFx0c3RhcnQgPSByZXMtXHUwMDNlc3RhcnQ7XG4xNTQxOlx0XHRzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpO1xuMTU0MjpcdFxuMTU0MzpcdFx0cmV0ID0gY2hlY2tfaG90cGx1Z19tZW1vcnlfcmFuZ2Uoc3RhcnQsIHNpemUpO1xuMTU0NDpcdFx0aWYgKHJldClcbjE1NDU6XHRcdFx0cmV0dXJuIHJldDtcbjE1NDY6XHRcbjE1NDc6XHRcdGlmIChtaHBfZmxhZ3MgXHUwMDI2IE1IUF9OSURfSVNfTUdJRCkge1xuMTU0ODpcdFx0XHRncm91cCA9IG1lbW9yeV9ncm91cF9maW5kX2J5X2lkKG5pZCk7XG4xNTQ5Olx0XHRcdGlmICghZ3JvdXApXG4xNTUwOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4xNTUxOlx0XHRcdG5pZCA9IGdyb3VwLVx1MDAzZW5pZDtcbjE1NTI6XHRcdH1cbjE1NTM6XHRcbjE1NTQ6XHRcdGlmICghbm9kZV9wb3NzaWJsZShuaWQpKSB7XG4xNTU1Olx0XHRcdFdBUk4oMSwgXCYjMzQ7bm9kZSAlZCB3YXMgYWJzZW50IGZyb20gdGhlIG5vZGVfcG9zc2libGVfbWFwXFxuXCYjMzQ7LCBuaWQpO1xuMTU1NjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjE1NTc6XHRcdH1cbjE1NTg6XHRcbjE1NTk6XHRcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XG4xNTYwOlx0XG4xNTYxOlx0XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJDSF9LRUVQX01FTUJMT0NLKSkge1xuMTU2MjpcdFx0XHRpZiAocmVzLVx1MDAzZWZsYWdzIFx1MDAyNiBJT1JFU09VUkNFX1NZU1JBTV9EUklWRVJfTUFOQUdFRClcbjE1NjM6XHRcdFx0XHRtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX0RSSVZFUl9NQU5BR0VEO1xuMTU2NDpcdFx0XHRyZXQgPSBtZW1ibG9ja19hZGRfbm9kZShzdGFydCwgc2l6ZSwgbmlkLCBtZW1ibG9ja19mbGFncyk7XG4xNTY1Olx0XHRcdGlmIChyZXQpXG4xNTY2Olx0XHRcdFx0Z290byBlcnJvcl9tZW1faG90cGx1Z19lbmQ7XG4xNTY3Olx0XHR9XG4xNTY4Olx0XG4xNTY5Olx0XHRyZXQgPSBfX3RyeV9vbmxpbmVfbm9kZShuaWQsIGZhbHNlKTtcbjE1NzA6XHRcdGlmIChyZXQgXHUwMDNjIDApXG4xNTcxOlx0XHRcdGdvdG8gZXJyb3JfbWVtYmxvY2tfcmVtb3ZlO1xuMTU3MjpcdFx0aWYgKHJldCkge1xuMTU3MzpcdFx0XHRub2RlX3NldF9vbmxpbmUobmlkKTtcbjE1NzQ6XHRcdFx0cmV0ID0gcmVnaXN0ZXJfbm9kZShuaWQpO1xuMTU3NTpcdFx0XHRpZiAoV0FSTl9PTihyZXQpKSB7XG4xNTc2Olx0XHRcdFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xuMTU3NzpcdFx0XHRcdGdvdG8gZXJyb3JfbWVtYmxvY2tfcmVtb3ZlO1xuMTU3ODpcdFx0XHR9XG4xNTc5Olx0XHRcdG5ld19ub2RlID0gdHJ1ZTtcbjE1ODA6XHRcdH1cbjE1ODE6XHRcbjE1ODI6XHRcdC8qXG4xNTgzOlx0XHQgKiBTZWxmIGhvc3RlZCBtZW1tYXAgYXJyYXlcbjE1ODQ6XHRcdCAqL1xuMTU4NTpcdFx0aWYgKChtaHBfZmxhZ3MgXHUwMDI2IE1IUF9NRU1NQVBfT05fTUVNT1JZKSBcdTAwMjZcdTAwMjZcbjE1ODY6XHRcdCAgICBtaHBfc3VwcG9ydHNfbWVtbWFwX29uX21lbW9yeSgpKSB7XG4xNTg3Olx0XHRcdHJldCA9IGNyZWF0ZV9hbHRtYXBzX2FuZF9tZW1vcnlfYmxvY2tzKG5pZCwgZ3JvdXAsIHN0YXJ0LCBzaXplKTtcbjE1ODg6XHRcdFx0aWYgKHJldClcbjE1ODk6XHRcdFx0XHRnb3RvIGVycm9yO1xuMTU5MDpcdFx0fSBlbHNlIHtcbjE1OTE6XHRcdFx0cmV0ID0gYXJjaF9hZGRfbWVtb3J5KG5pZCwgc3RhcnQsIHNpemUsIFx1MDAyNnBhcmFtcyk7XG4xNTkyOlx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4xNTkzOlx0XHRcdFx0Z290byBlcnJvcjtcbjE1OTQ6XHRcbjE1OTU6XHRcdFx0LyogY3JlYXRlIG1lbW9yeSBibG9jayBkZXZpY2VzIGFmdGVyIG1lbW9yeSB3YXMgYWRkZWQgKi9cbjE1OTY6XHRcdFx0cmV0ID0gY3JlYXRlX21lbW9yeV9ibG9ja19kZXZpY2VzKHN0YXJ0LCBzaXplLCBuaWQsIE5VTEwsIGdyb3VwKTtcbjE1OTc6XHRcdFx0aWYgKHJldCkge1xuMTU5ODpcdFx0XHRcdGFyY2hfcmVtb3ZlX21lbW9yeShzdGFydCwgc2l6ZSwgcGFyYW1zLmFsdG1hcCwgTlVMTCk7XG4xNTk5Olx0XHRcdFx0Z290byBlcnJvcjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NDk4CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIEkmIzM5O20gcmVhZHkgdG8gZGl2ZSBpbnRvIHRoYXQgc2VjdGlvbi4gSGVyZSYjMzk7cyBteSB0YWtlLCBhc3N1bWluZyBJJiMzOTttIHRoZSBvbmUgcHJvY2Vzc2luZyB0aGVzZSB0aG91Z2h0czoKCioqQW5hbHl6aW5nIExpbmVzIDE2MDAtMTYzMCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgemVybyBpbiBvbiBsaW5lcyAxNjAwIHRvIDE2MzAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IGVzdGFibGlzaCB0aGUgY29udGV4dC4gV2hhdCYjMzk7cyB0aGUgb3ZlcmFyY2hpbmcgdGhlbWUgb3IgYXJndW1lbnQgYmVpbmcgZGV2ZWxvcGVkIGluIHRoaXMgcGFydCBvZiB0aGUgZG9jdW1lbnQ/IEkgbmVlZCB0byBrbm93IHdoZXJlIHRoaXMgZmFsbHMgd2l0aGluIHRoZSBsYXJnZXIgc3RydWN0dXJlLiBJcyB0aGlzIGEgY3JpdGljYWwganVuY3R1cmUgaW4gdGhlIGFyZ3VtZW50PyBBcmUgd2UgZGVhbGluZyB3aXRoIGV2aWRlbmNlLCBhIGNvdW50ZXItYXJndW1lbnQsIG9yIGEgY29uY2x1c2lvbj8KCk5leHQsIEkmIzM5O2xsIG5lZWQgdG8gcGlucG9pbnQgdGhlIGtleSBwbGF5ZXJzIGFuZCB2YXJpYWJsZXMuIEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgdGVybXMgb3IgY29uY2VwdHMgYmVpbmcgaW50cm9kdWNlZCwgZGVmaW5lZCwgb3IgbWFuaXB1bGF0ZWQgd2l0aGluIHRoaXMgYmxvY2sgb2YgdGV4dD8gSSYjMzk7bSBsb29raW5nIGZvciB0aGUgY29yZSBpZGVhcyB0aGF0IHRoaXMgc2VjdGlvbiBoaW5nZXMgdXBvbi4KCkkmIzM5O2xsIHN0YXJ0IHJlYWRpbmcgdGhlIHNlbnRlbmNlcyB3aXRoIGFuIGV5ZSBmb3IgYW55IHBvdGVudGlhbCBhc3N1bXB0aW9ucyBvciBsb2dpY2FsIGxlYXBzIHRoYXQgbWF5IGJlIG9jY3VycmluZyB3aXRoaW4gdGhlIGxpbmVzLiBBcmUgdGhlcmUgYW55IGhpZGRlbiBwcmVtaXNlcyB0aGF0IHNob3VsZCBiZSBtYWRlIG1vcmUgZXhwbGljaXQ/IEkmIzM5O2xsIGFsc28gYmUgd2F0Y2hpbmcgZm9yIGFueSBpbnN0YW5jZXMgb2YgY29uZmlybWF0aW9uIGJpYXMgb3IgZmFsbGFjaW91cyByZWFzb25pbmcuCgpNeSBhbmFseXRpY2FsIGZvY3VzIHdpbGwgYmUgb24gdGhlIHN0cnVjdHVyZSBvZiBhbnkgYXJndW1lbnRzLCB0aGUgdmFsaWRpdHkgb2YgYW55IGNsYWltcywgYW5kIGhvdyB0aGV5IHJlbGF0ZSBiYWNrIHRvIHRoZSBvdmVyYWxsIG9iamVjdGl2ZS4gSWYgdGhlIGF1dGhvciBpcyBtYWtpbmcgYSBwZXJzdWFzaXZlIGFyZ3VtZW50LCBJJiMzOTtsbCBldmFsdWF0ZSB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGVpciByaGV0b3JpY2FsIHN0cmF0ZWd5LiBJZiB0aGV5JiMzOTtyZSBwcmVzZW50aW5nIGRhdGEsIEkmIzM5O2xsIGJlIGxvb2tpbmcgYXQgdGhlaXIgbWV0aG9kb2xvZ3kgYW5kIHBvdGVudGlhbCBmbGF3cyBpbiBpdC4KCkkgd2lsbCBuZWVkIHRvIGNhcmVmdWxseSBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSBsaW5lcywgbWFraW5nIHN1cmUgdGhlcmUgaXMgZmxvdyBhbmQgY29udGludWl0eS4gSXMgdGhlIGF1dGhvciBtYWtpbmcgYW55IG1lYW5pbmdmdWwgY29ubmVjdGlvbnMgYmV0d2VlbiBzZW50ZW5jZXMgb3IgdGhvdWdodHMsIG9yIGlzIGl0IGEgZGlzam9pbnRlZCBjaGFpbiBvZiBpZGVhcz8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTYwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjAwOlx0XHRcdH1cbjE2MDE6XHRcdH1cbjE2MDI6XHRcbjE2MDM6XHRcdHJlZ2lzdGVyX21lbW9yeV9ibG9ja3NfdW5kZXJfbm9kZV9ob3RwbHVnKG5pZCwgUEZOX0RPV04oc3RhcnQpLFxuMTYwNDpcdFx0XHRcdFx0XHQgIFBGTl9VUChzdGFydCAmIzQzOyBzaXplIC0gMSkpO1xuMTYwNTpcdFxuMTYwNjpcdFx0LyogY3JlYXRlIG5ldyBtZW1tYXAgZW50cnkgKi9cbjE2MDc6XHRcdGlmICghc3RyY21wKHJlcy1cdTAwM2VuYW1lLCBcJiMzNDtTeXN0ZW0gUkFNXCYjMzQ7KSlcbjE2MDg6XHRcdFx0ZmlybXdhcmVfbWFwX2FkZF9ob3RwbHVnKHN0YXJ0LCBzdGFydCAmIzQzOyBzaXplLCBcJiMzNDtTeXN0ZW0gUkFNXCYjMzQ7KTtcbjE2MDk6XHRcbjE2MTA6XHRcdC8qIGRldmljZV9vbmxpbmUoKSB3aWxsIHRha2UgdGhlIGxvY2sgd2hlbiBjYWxsaW5nIG9ubGluZV9wYWdlcygpICovXG4xNjExOlx0XHRtZW1faG90cGx1Z19kb25lKCk7XG4xNjEyOlx0XG4xNjEzOlx0XHQvKlxuMTYxNDpcdFx0ICogSW4gY2FzZSB3ZSYjMzk7cmUgYWxsb3dlZCB0byBtZXJnZSB0aGUgcmVzb3VyY2UsIGZsYWcgaXQgYW5kIHRyaWdnZXJcbjE2MTU6XHRcdCAqIG1lcmdpbmcgbm93IHRoYXQgYWRkaW5nIHN1Y2NlZWRlZC5cbjE2MTY6XHRcdCAqL1xuMTYxNzpcdFx0aWYgKG1ocF9mbGFncyBcdTAwMjYgTUhQX01FUkdFX1JFU09VUkNFKVxuMTYxODpcdFx0XHRtZXJnZV9zeXN0ZW1fcmFtX3Jlc291cmNlKHJlcyk7XG4xNjE5Olx0XG4xNjIwOlx0XHQvKiBvbmxpbmUgcGFnZXMgaWYgcmVxdWVzdGVkICovXG4xNjIxOlx0XHRpZiAob25saW5lX3R5cGUgIT0gTU1PUF9PRkZMSU5FKVxuMTYyMjpcdFx0XHR3YWxrX21lbW9yeV9ibG9ja3Moc3RhcnQsIHNpemUsIFx1MDAyNm9ubGluZV90eXBlLFxuMTYyMzpcdFx0XHRcdFx0ICAgb25saW5lX21lbW9yeV9ibG9jayk7XG4xNjI0Olx0XG4xNjI1Olx0XHRyZXR1cm4gcmV0O1xuMTYyNjpcdGVycm9yOlxuMTYyNzpcdFx0aWYgKG5ld19ub2RlKSB7XG4xNjI4Olx0XHRcdG5vZGVfc2V0X29mZmxpbmUobmlkKTtcbjE2Mjk6XHRcdFx0dW5yZWdpc3Rlcl9ub2RlKG5pZCk7XG4xNjMwOlx0XHR9XG4xNjMxOlx0ZXJyb3JfbWVtYmxvY2tfcmVtb3ZlOlxuMTYzMjpcdFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0FSQ0hfS0VFUF9NRU1CTE9DSykpXG4xNjMzOlx0XHRcdG1lbWJsb2NrX3JlbW92ZShzdGFydCwgc2l6ZSk7XG4xNjM0Olx0ZXJyb3JfbWVtX2hvdHBsdWdfZW5kOlxuMTYzNTpcdFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuMTYzNjpcdFx0cmV0dXJuIHJldDtcbjE2Mzc6XHR9XG4xNjM4Olx0XG4xNjM5Olx0aW50IGFkZF9tZW1vcnlfcmVzb3VyY2UoaW50IG5pZCwgc3RydWN0IHJlc291cmNlICpyZXMsIG1ocF90IG1ocF9mbGFncylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzQ4MQoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIGB0cnlfb2ZmbGluZV9ub2RlYCBDYWxsIFNpdGVzKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhlIGB0cnlfb2ZmbGluZV9ub2RlYCBmdW5jdGlvbiB3aXRoaW4gdGhlIGtlcm5lbC4gTXkgaW5pdGlhbCBmb2N1cyBpcyB0byBwaW5wb2ludCAqd2hlcmUqIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkLiBFc3NlbnRpYWxseSwgSSBuZWVkIHRvIHRyYWNlIGl0cyB1c2FnZSB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0cyBpbiB3aGljaCBhIG5vZGUgaXMgYmVpbmcgYnJvdWdodCBvZmZsaW5lLgoKVGhpcyBpcyBjcml0aWNhbCBiZWNhdXNlIGFuIG9mZmxpbmUgbm9kZSByZXByZXNlbnRzIGEgc2lnbmlmaWNhbnQgc3RhdGUgY2hhbmdlLCB3aXRoIHBvdGVudGlhbCBpbXBhY3RzIG9uIE5VTUEgYmFsYW5jaW5nLCBtZW1vcnkgYWxsb2NhdGlvbiwgQ1BVIGFmZmluaXR5LCBhbmQgdGhlIG92ZXJhbGwgc3lzdGVtJiMzOTtzIHJlc291cmNlIG1hbmFnZW1lbnQuIFVuZGVyc3RhbmRpbmcgdGhlIGNhbGwgc2l0ZXMgd2lsbCByZXZlYWwgdGhlIHRyaWdnZXJzIGZvciB0aGlzIG9wZXJhdGlvbiDigJMgYXJlIHdlIHRhbGtpbmcgYWJvdXQgaG90cGx1ZyBldmVudHMsIG1lbW9yeSBwcmVzc3VyZSBzY2VuYXJpb3MsIGVycm9yIGNvbmRpdGlvbnMsIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PwoKSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgdGhlIGNhbGwgZ3JhcGgsIGNvbnNpZGVyaW5nIHRoZSByZWxldmFudCBtb2R1bGVzIGFuZCBzdWJzeXN0ZW1zLiBJ4oCZbGwgc3RhcnQgYnkgdXNpbmcgc3RhdGljIGFuYWx5c2lzIHRvb2xzLCBsaWtlIGBjc2NvcGVgIG9yIGBncmVwIC1SYCB3aXRoIGFwcHJvcHJpYXRlIGZsYWdzLCB0byBxdWlja2x5IGlkZW50aWZ5IHRoZSBkaXJlY3QgY2FsbGVycy4gVGhlbiwgSSBtYXkgd2FudCB0byBsb29rIGF0IGNvbnRyb2wgZmxvdyBhbmFseXNpcyB0byBmaWd1cmUgb3V0IGNvbmRpdGlvbmFsIGNhbGxzIG9yIGNhbGxzIHRoYXQgZGVwZW5kIG9uIG90aGVyIG1vZHVsZXMuIEkmIzM5O2xsIG5lZWQgdG8gY29uc2lkZXIgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGluZGlyZWN0IGNhbGxzLgoKQmV5b25kIHRoZSBkaXJlY3QgY2FsbGVycywgSSBhbHNvIG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhlICpyZWFzb25pbmcqIGJlaGluZCB0aGVzZSBjYWxscy4gV2hhdCYjMzk7cyB0aGUgd2lkZXIgY29udGV4dD8gQXJlIHdlIGRlYWxpbmcgd2l0aCBoYXJkd2FyZSBmYWlsdXJlcywgYWRtaW5pc3RyYXRvciBpbnRlcnZlbnRpb24sIG9yIGF1dG9tYXRlZCBwb3dlciBtYW5hZ2VtZW50IHN5c3RlbXM/IFRoaXMgaXMgaW1wb3J0YW50IGZvciBkZXRlcm1pbmluZyB0aGUgcHJpb3JpdHksIHRpbWluZywgYW5kIHBvdGVudGlhbCBjb25zZXF1ZW5jZXMgb2YgdGhlIG9wZXJhdGlvbi4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYXNzb2NpYXRlZCBsb2dnaW5nIG1lc3NhZ2VzLCBlcnJvciBoYW5kbGluZyByb3V0aW5lcywgYW5kIGFueSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBlbXBsb3llZCBhcm91bmQgdGhlIGB0cnlfb2ZmbGluZV9ub2RlYCBjYWxscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dHJ5X29mZmxpbmVfbm9kZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYz00NzY9c3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG9zdF9lamVjdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSlcbi0tXG5kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYy01MTEtXG5kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYzo1MTI6XHR0cnlfb2ZmbGluZV9ub2RlKGNwdV90b19ub2RlKHByLVx1MDAzZWlkKSk7XG5kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYy01MTMtXG4tLVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oPTI2MD1zdGF0aWMgaW5saW5lIHZvaWQgcGdkYXRfcmVzaXplX2luaXQoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCkge31cbi0tXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgtMjY0LVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oOjI2NTpleHRlcm4gdm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpO1xuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI2Ni1leHRlcm4gaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oPTI3MT1pbnQgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMoY29uc3Qgc3RydWN0IHJhbmdlICpyYW5nZXMsXG4tLVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI3NC0jZWxzZVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oOjI3NTpzdGF0aWMgaW5saW5lIHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKSB7fVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI3Ni1cbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIyMzE9c3RhdGljIGludCBjaGVja19jcHVfb25fbm9kZShpbnQgbmlkKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI0Ny0vKipcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjI0ODogKiB0cnlfb2ZmbGluZV9ub2RlXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNDktICogQG5pZDogdGhlIG5vZGUgSURcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNTUtICovXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyNTY6dm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNTcte1xuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI3MC19XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyNzE6RVhQT1JUX1NZTUJPTCh0cnlfb2ZmbGluZV9ub2RlKTtcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI3Mi1cbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIyOTM9c3RhdGljIGludCB0cnlfcmVtb3ZlX21lbW9yeSh1NjQgc3RhcnQsIHU2NCBzaXplKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMjMzOS1cdGlmIChuaWQgIT0gTlVNQV9OT19OT0RFKVxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMzQwOlx0XHR0cnlfb2ZmbGluZV9ub2RlKG5pZCk7XG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIzNDEtXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMzUyLSAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zIGJlZm9yZSB0aGlzIGNhbGwsIGFzIHJlcXVpcmVkIGJ5XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIzNTM6ICogdHJ5X29mZmxpbmVfbm9kZSgpLlxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMzU0LSAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NTY5CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29tcGxldGUgcGljdHVyZSBvZiBob3cgYHRyeV9vZmZsaW5lX25vZGVgIHdvcmtzLiBJJiMzOTt2ZSBnb3QgdGhlIGltbWVkaWF0ZSBmdW5jdGlvbiBpbiBmcm9udCBvZiBtZSwgYnV0IHRvIHRydWx5IGdyYXNwIHRoZSBpbXBsaWNhdGlvbnMgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbnMsIEkgbmVlZCB0byB0cmFjZSBpdHMgdXNhZ2UuIEkmIzM5O20gZ29pbmcgdG8gZm9sbG93IHRoZSBjYWxsIGNoYWluIGFuZCB1bmRlcnN0YW5kIHdoZXJlIGB0cnlfb2ZmbGluZV9ub2RlYCBpcyBjYWxsZWQgZnJvbS4gVGhhdCBtZWFucyBkaWdnaW5nIGludG8gYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBmaW5kaW5nIGFsbCB0aGUgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIGFuYWx5emUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYHRyeV9vZmZsaW5lX25vZGVgIGl0c2VsZiB0byB1bmRlcnN0YW5kIGFueSBsb2NhbCBjb250ZXh0IHRoYXQgbWlnaHQgYmUgaW1wYWN0aW5nLiBFc3NlbnRpYWxseSwgSSYjMzk7bSB0cnlpbmcgdG8gZ2V0IGEgYmlyZHMgZXllIHZpZXcgb2YgdGhlIGVudGlyZSBmbG93IHNvIEkgZG9uJiMzOTt0IG1pc3MgYW55IGNyaXRpY2FsIGRldGFpbHMgcmVsYXRlZCB0byBtZW1vcnkgaG90cGx1Z2dpbmcuIE9uY2UgSSBnZXQgdGhlIGZ1bGwgY29udGV4dCwgSSBjYW4gcmVhbGx5IHN0YXJ0IHRvIGRpYWdub3NlIHdoYXRldmVyIGlzc3VlIEkmIzM5O20gbG9va2luZyBhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjI0NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA3MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMjQ1Olx0fVxuMjI0NjpcdFxuMjI0NzpcdC8qKlxuMjI0ODpcdCAqIHRyeV9vZmZsaW5lX25vZGVcbjIyNDk6XHQgKiBAbmlkOiB0aGUgbm9kZSBJRFxuMjI1MDpcdCAqXG4yMjUxOlx0ICogT2ZmbGluZSBhIG5vZGUgaWYgYWxsIG1lbW9yeSBzZWN0aW9ucyBhbmQgY3B1cyBvZiB0aGUgbm9kZSBhcmUgcmVtb3ZlZC5cbjIyNTI6XHQgKlxuMjI1MzpcdCAqIE5PVEU6IFRoZSBjYWxsZXIgbXVzdCBjYWxsIGxvY2tfZGV2aWNlX2hvdHBsdWcoKSB0byBzZXJpYWxpemUgaG90cGx1Z1xuMjI1NDpcdCAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zIGJlZm9yZSB0aGlzIGNhbGwuXG4yMjU1Olx0ICovXG4yMjU2Olx0dm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXG4yMjU3Olx0e1xuMjI1ODpcdFx0aWYgKCFub2RlX2lzX21lbW9yeWxlc3MobmlkKSlcbjIyNTk6XHRcdFx0cmV0dXJuO1xuMjI2MDpcdFxuMjI2MTpcdFx0aWYgKGNoZWNrX2NwdV9vbl9ub2RlKG5pZCkpXG4yMjYyOlx0XHRcdHJldHVybjtcbjIyNjM6XHRcbjIyNjQ6XHRcdC8qXG4yMjY1Olx0XHQgKiBhbGwgbWVtb3J5L2NwdSBvZiB0aGlzIG5vZGUgYXJlIHJlbW92ZWQsIHdlIGNhbiBvZmZsaW5lIHRoaXNcbjIyNjY6XHRcdCAqIG5vZGUgbm93LlxuMjI2NzpcdFx0ICovXG4yMjY4Olx0XHRub2RlX3NldF9vZmZsaW5lKG5pZCk7XG4yMjY5Olx0XHR1bnJlZ2lzdGVyX25vZGUobmlkKTtcbjIyNzA6XHR9XG4yMjcxOlx0RVhQT1JUX1NZTUJPTCh0cnlfb2ZmbGluZV9ub2RlKTtcbjIyNzI6XHRcbjIyNzM6XHRzdGF0aWMgaW50IG1lbW9yeV9ibG9ja3NfaGF2ZV9hbHRtYXBzKHU2NCBzdGFydCwgdTY0IHNpemUpXG4yMjc0Olx0e1xuMjI3NTpcdFx0dTY0IG51bV9tZW1ibG9ja3MgPSBzaXplIC8gbWVtb3J5X2Jsb2NrX3NpemVfYnl0ZXMoKTtcbjIyNzY6XHRcdHU2NCBudW1fYWx0bWFwcyA9IDA7XG4yMjc3Olx0XG4yMjc4Olx0XHRpZiAoIW1ocF9tZW1tYXBfb25fbWVtb3J5KCkpXG4yMjc5Olx0XHRcdHJldHVybiAwO1xuMjI4MDpcdFxuMjI4MTpcdFx0d2Fsa19tZW1vcnlfYmxvY2tzKHN0YXJ0LCBzaXplLCBcdTAwMjZudW1fYWx0bWFwcyxcbjIyODI6XHRcdFx0XHQgICBjb3VudF9tZW1vcnlfcmFuZ2VfYWx0bWFwc19jYik7XG4yMjgzOlx0XG4yMjg0Olx0XHRpZiAobnVtX2FsdG1hcHMgPT0gMClcbjIyODU6XHRcdFx0cmV0dXJuIDA7XG4yMjg2Olx0XG4yMjg3Olx0XHRpZiAoV0FSTl9PTl9PTkNFKG51bV9tZW1ibG9ja3MgIT0gbnVtX2FsdG1hcHMpKVxuMjI4ODpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjIyODk6XHRcbjIyOTA6XHRcdHJldHVybiAxO1xuMjI5MTpcdH1cbjIyOTI6XHRcbjIyOTM6XHRzdGF0aWMgaW50IHRyeV9yZW1vdmVfbWVtb3J5KHU2NCBzdGFydCwgdTY0IHNpemUpXG4yMjk0Olx0e1xuMjI5NTpcdFx0aW50IHJjLCBuaWQgPSBOVU1BX05PX05PREU7XG4yMjk2Olx0XG4yMjk3Olx0XHRCVUdfT04oY2hlY2tfaG90cGx1Z19tZW1vcnlfcmFuZ2Uoc3RhcnQsIHNpemUpKTtcbjIyOTg6XHRcbjIyOTk6XHRcdC8qXG4yMzAwOlx0XHQgKiBBbGwgbWVtb3J5IGJsb2NrcyBtdXN0IGJlIG9mZmxpbmVkIGJlZm9yZSByZW1vdmluZyBtZW1vcnkuICBDaGVja1xuMjMwMTpcdFx0ICogd2hldGhlciBhbGwgbWVtb3J5IGJsb2NrcyBpbiBxdWVzdGlvbiBhcmUgb2ZmbGluZSBhbmQgcmV0dXJuIGVycm9yXG4yMzAyOlx0XHQgKiBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS5cbjIzMDM6XHRcdCAqXG4yMzA0Olx0XHQgKiBXaGlsZSBhdCBpdCwgZGV0ZXJtaW5lIHRoZSBuaWQuIE5vdGUgdGhhdCBpZiB3ZSYjMzk7ZCBoYXZlIG1peGVkIG5vZGVzLFxuMjMwNTpcdFx0ICogd2UmIzM5O2Qgb25seSB0cnkgdG8gb2ZmbGluZSB0aGUgbGFzdCBkZXRlcm1pbmVkIG9uZSAtLSB3aGljaCBpcyBnb29kXG4yMzA2Olx0XHQgKiBlbm91Z2ggZm9yIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0LlxuMjMwNzpcdFx0ICovXG4yMzA4Olx0XHRyYyA9IHdhbGtfbWVtb3J5X2Jsb2NrcyhzdGFydCwgc2l6ZSwgXHUwMDI2bmlkLCBjaGVja19tZW1ibG9ja19vZmZsaW5lZF9jYik7XG4yMzA5Olx0XHRpZiAocmMpXG4yMzEwOlx0XHRcdHJldHVybiByYztcbjIzMTE6XHRcbjIzMTI6XHRcdC8qIHJlbW92ZSBtZW1tYXAgZW50cnkgKi9cbjIzMTM6XHRcdGZpcm13YXJlX21hcF9yZW1vdmUoc3RhcnQsIHN0YXJ0ICYjNDM7IHNpemUsIFwmIzM0O1N5c3RlbSBSQU1cJiMzNDspO1xuMjMxNDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5ODEzCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTQ0MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1lbW9yeSBIb3RwbHVnIFBhdGNoKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIG1vdGl2YXRpb24gYmVoaW5kIG1vdmluZyBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgIGFuZCBpbnRyb2R1Y2luZyBgbm9kZV9pc19tZW1vcnlsZXNzYC4gIEl0IGxvb2tzIGxpa2UgdGhpcyBjb21taXQgbWlnaHQgYmUgcmVsYXRlZCB0byBhIHNwZWNpZmljIGNvbW1pdCBJRDogYGE1M2UxOWEwYjZkMjRiMjAxNDlkMDRiMzVhMDFmNWE1OTUwMWVkZmFgLiBJJiMzOTtkIG5vcm1hbGx5IGNoZWNrIHRoZSBjb21taXQgaGlzdG9yeSAoYGdpdCBsb2dgIG9yIGBnaXQgc2hvd2ApIGZvciBjb250ZXh0LCBidXQgc2luY2UgSSBoYXZlIHRoZSBkaWZmLCBJIGNhbiB3b3JrIHdpdGggdGhhdCBkaXJlY3RseS4KCkZyb20gdGhlIHByb3ZpZGVkIGRpZmYsIEkgc2VlIHRoYXQgYGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiYCwgd2hpY2ggd2FzIHByZXZpb3VzbHkgZGVmaW5lZCAqYWZ0ZXIqIGl0cyB1c2UsIGhhcyBiZWVuIG1vdmVkIGVhcmxpZXIgaW4gdGhlIGZpbGUuICBDcnVjaWFsbHksIGl0IGlzIHRoZW4gKm1vdmVkKiBhbmQgYG5vZGVfaXNfbWVtb3J5bGVzc2AgaXMgY3JlYXRlZCBhbmQgdXNlZCB3aXRoaW4gYHRyeV9vZmZsaW5lX25vZGVgLiBUaGlzIGZ1bmN0aW9uIG5vdyB1c2VzIHRoZSBuZXcgaGVscGVyLCBgbm9kZV9pc19tZW1vcnlsZXNzYCwgdG8gZGV0ZXJtaW5lIGlmIGEgbm9kZSBjYW4gYmUgc2FmZWx5IHRha2VuIG9mZmxpbmUuCgpUaGUgYG5vZGVfaXNfbWVtb3J5bGVzc2AgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKHdoaWNoIHdvdWxkIGluZGljYXRlIG1lbW9yeSBpcyBzdGlsbCBwcmVzZW50KSwgYW5kIGlmIHNvLCByZXR1cm5zIGBmYWxzZWAuIFRoZW4sIGl0IGNoZWNrcyBpZiBhbnkgbWVtb3J5IGJsb2NrcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlLiBUaGUgb3JpZ2luYWwgY29kZSYjMzk7cyBjaGVjayB3aXRoaW4gYHRyeV9vZmZsaW5lX25vZGVgIGxvb2tzIGFsbW9zdCBpZGVudGljYWwsIHNvIHRoZSByZWZhY3RvcmluZyBnb2FsIG11c3QgYmUgc29tZXRoaW5nIHN1YnRsZSBhbmQgdGhlIGludGVudCBpcyBsaWtlbHkgcmUtdXNlLgoKVGhlIGNvcmUgb2YgdGhlIGNoYW5nZSBsaWVzIGluIGhvdyB0aGUgY29kZSBkZXRlcm1pbmVzIGlmIGEgbm9kZSBpcyB0cnVseSAmIzM0O21lbW9yeWxlc3MmIzM0OyBmb3Igb2ZmbGluZSBwdXJwb3Nlcy4gVGhlIHByZXZpb3VzIGNvZGUgY2hlY2tlZCBmb3IgbWVtb3J5IGJsb2Nrcywgbm93IHRoYXQgaXMgZW5jYXBzdWxhdGVkIGluIGBub2RlX2lzX21lbW9yeWxlc3NgLiAgVGhlIGNvbW1lbnQgbWFrZXMgYSB2YWxpZCBwb2ludCBhYm91dCBvZmZsaW5lIG1lbW9yeSBibG9ja3Mgbm90IG5lY2Vzc2FyaWx5IGJlaW5nICYjMzQ7c3Bhbm5lZCYjMzQ7IHlldCBidXQgcG90ZW50aWFsbHkgbGlua2VkIHRocm91Z2ggc3lzZnMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGNvbnNpZGVyYXRpb24gZm9yIG1lbW9yeSBob3RwbHVnLCBhbmQgaXRzIGhhbmRsaW5nIGNvdWxkIGJlIHN1YnRsZS4KCkdpdmVuIHRoaXMgaXMgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBhIGNvcmUgc3Vic3lzdGVtIGZvciBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIGl0IGludm9sdmVzIGEgbG9naWMgcmVzdHJ1Y3R1cmluZyBhbmQgcmVmYWN0b3JpbmcsIEkgbmVlZCB0byBldmFsdWF0ZSB0aGlzIGNoYW5nZSB3aXRoIGFuIGV4cGVydCYjMzk7cyBleWUuICBJJiMzOTttIGdvaW5nIHRvIGNhcmVmdWxseSBjb25zaWRlciB0aGUgbG9naWMgb2YgYG5vZGVfaXNfbWVtb3J5bGVzc2AsIGFzIHRoZSBiZWhhdmlvciBvZiBvZmZsaW5lIGFuZCBvbmxpbmUgbWVtb3J5IGNvdWxkIGJlIGFmZmVjdGVkLiBTaW5jZSBtZW1vcnkgaG90cGx1ZyBpcyBpbnZvbHZlZCwgSSB3aWxsIG5lZWQgdG8gYmUgdmVyeSBjb25maWRlbnQgdGhhdCB0aGlzIGNoYW5nZSBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHN1YnRsZSByZWdyZXNzaW9ucywgcGFydGljdWxhcmx5IGFyb3VuZCB0aGUgc3RhdGUgdHJhbnNpdGlvbnMgb2YgbWVtb3J5IGJsb2NrcyBhbmQgbm9kZSBhc3NvY2lhdGlvbnMgZHVyaW5nIGhvdHBsdWcgb3BlcmF0aW9ucy4gIEkmIzM5O2xsIHdhbnQgdG8gY2FyZWZ1bGx5IGNoZWNrIHRoZSBpbnRlcmFjdGlvbnMgd2l0aCBvdGhlciBtZW1vcnkgbWFuYWdlbWVudCBjb21wb25lbnRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttZW1vcnlfaG90cGx1Z1xcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9NjM9cGFnZS1hbGxvYy0kKENPTkZJR19TSFVGRkxFX1BBR0VfQUxMT0NBVE9SKSAmIzQzOz0gc2h1ZmZsZS5vXG4tLVxubW0vTWFrZWZpbGUtNjUtIyBHaXZlICYjMzk7bWVtb3J5X2hvdHBsdWcmIzM5OyBpdHMgb3duIG1vZHVsZS1wYXJhbWV0ZXIgbmFtZXNwYWNlXG5tbS9NYWtlZmlsZTo2NjptZW1vcnktaG90cGx1Zy0kKENPTkZJR19NRU1PUllfSE9UUExVRykgJiM0Mzs9IG1lbW9yeV9ob3RwbHVnLm9cbm1tL01ha2VmaWxlLTY3LVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTU0PXN0YXRpYyBpbnQgZ2V0X29ubGluZV9wb2xpY3koY2hhciAqYnVmZmVyLCBjb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcClcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE1OS0vKlxubW0vbWVtb3J5X2hvdHBsdWcuYzoxNjA6ICogbWVtb3J5X2hvdHBsdWcub25saW5lX3BvbGljeTogY29uZmlndXJlIG9ubGluZSBiZWhhdmlvciB3aGVuIG9ubGluaW5nIHdpdGhvdXRcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTYxLSAqIHNwZWNpZnlpbmcgYSB6b25lIChNTU9QX09OTElORSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIwMzkKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipDaGVja2luZyB0aGUgSG90cGx1ZyBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byBxdWlja2x5IHZlcmlmeSBzb21ldGhpbmcgcmVsYXRlZCB0byBtZW1vcnkgaG90cGx1Z2dpbmcuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIGhlYWQgc3RyYWlnaHQgdG8gdGhlIHNvdXJjZSDigJMgdGhlIGBtbS9LY29uZmlnYCBmaWxlLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCBjb25maWd1cmF0aW9ucyBhcmUgZGVmaW5lZCwgYW5kIGBDT05GSUdfTUVNT1JZX0hPVFBMVUdgIGlzIHRoZSBrZXkgSSYjMzk7bSBpbnRlcmVzdGVkIGluLiBJIHdhbnQgdG8gc2VlIGhvdyBpdCYjMzk7cyBoYW5kbGVkLCBhbnkgZGVwZW5kZW5jaWVzIGl0IG1pZ2h0IGhhdmUsIGFuZCBpZiB0aGVyZSBhcmUgYW55IHN1YnRsZSBudWFuY2VzIGluIGl0cyBkZWZpbml0aW9uIHRoYXQgSSBuZWVkIHRvIGJlIGF3YXJlIG9mLiBUaGlzIGlzIHVzdWFsbHkgdGhlIHF1aWNrZXN0IHdheSB0byBnZXQgYSBzb2xpZCBncmFzcCBvZiBob3cgaG90cGx1ZyBpcyBlbmFibGVkIG9yIGRpc2FibGVkIGFuZCB3aGF0IG90aGVyIGZlYXR1cmVzIGFyZSB0aWVkIHRvIGl0LiBObyBuZWVkIHRvIHdhc3RlIHRpbWUgZ3Vlc3Npbmc7IGdvIGRpcmVjdGx5IHRvIHRoZSBjb25maWd1cmF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTUVNT1JZX0hPVFBMVUdcXGImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz01MDU9Y29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHXG4tLVxubW0vS2NvbmZpZy01MDgtIyBldmVudHVhbGx5LCB3ZSBjYW4gaGF2ZSB0aGlzIG9wdGlvbiBqdXN0ICYjMzk7c2VsZWN0IFNQQVJTRU1FTSYjMzk7XG5tbS9LY29uZmlnOjUwOTptZW51Y29uZmlnIE1FTU9SWV9IT1RQTFVHXG5tbS9LY29uZmlnLTUxMC1cdGJvb2wgXCYjMzQ7TWVtb3J5IGhvdHBsdWdcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIzNDUKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byB0aGUgTWVtb3J5IEhvdHBsdWcgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGBNRU1PUllfSE9UUExVR2AgYW5kIGBNRU1PUllfSE9UUkVNT1ZFYC4gVGhlIGJlc3QgcGxhY2UgdG8gc3RhcnQsIGFzIGFsd2F5cywgaXMgdGhlIEtjb25maWcuIEkgd2FudCB0byBzZWUgd2hhdCBvdGhlciBmZWF0dXJlcyBvciBjb25maWd1cmF0aW9ucyBhcmUgdGllZCB0byB0aGVzZSBvcHRpb25zLiBBcmUgdGhlcmUgYW55IG90aGVyIHJlcXVpcmVkIGtlcm5lbCBmZWF0dXJlcz8gQXJlIHRoZXJlIHNwZWNpZmljIGFyY2hpdGVjdHVyYWwgcmVxdWlyZW1lbnRzPyBXaGF0IGxldmVscyBvZiBncmFudWxhcml0eSBhcmUgYXZhaWxhYmxlPyBVbmRlcnN0YW5kaW5nIHRoZSBpbnRlcmRlcGVuZGVuY2llcyBpcyBjcml0aWNhbC4gSXQmIzM5O3Mgb2Z0ZW4gdGhlIGhpZGRlbiBpbXBsaWNhdGlvbnMgYW5kIHJlbGF0ZWQgZmVhdHVyZXMgdGhhdCB3aWxsIGRpY3RhdGUgaG93IHdlbGwgdGhlc2UgZnVuY3Rpb25zIHdvcmsgaW4gYSBzcGVjaWZpYyBzZXR1cC4gVGltZSB0byBnZXQgdGhlIEtjb25maWcgb3BlbiBhbmQgc3RhcnQgZGlnZ2luZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTA1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1MDU6XHRjb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUdcbiA1MDY6XHRcdGJvb2xcbiA1MDc6XHRcbiA1MDg6XHQjIGV2ZW50dWFsbHksIHdlIGNhbiBoYXZlIHRoaXMgb3B0aW9uIGp1c3QgJiMzOTtzZWxlY3QgU1BBUlNFTUVNJiMzOTtcbiA1MDk6XHRtZW51Y29uZmlnIE1FTU9SWV9IT1RQTFVHXG4gNTEwOlx0XHRib29sIFwmIzM0O01lbW9yeSBob3RwbHVnXCYjMzQ7XG4gNTExOlx0XHRzZWxlY3QgTUVNT1JZX0lTT0xBVElPTlxuIDUxMjpcdFx0ZGVwZW5kcyBvbiBTUEFSU0VNRU1fVk1FTU1BUFxuIDUxMzpcdFx0ZGVwZW5kcyBvbiBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVR1xuIDUxNDpcdFx0ZGVwZW5kcyBvbiA2NEJJVFxuIDUxNTpcdFx0c2VsZWN0IE5VTUFfS0VFUF9NRU1JTkZPIGlmIE5VTUFcbiA1MTY6XHRcbiA1MTc6XHRpZiBNRU1PUllfSE9UUExVR1xuIDUxODpcdFxuIDUxOTpcdGNob2ljZVxuIDUyMDpcdFx0cHJvbXB0IFwmIzM0O01lbW9yeSBIb3RwbHVnIERlZmF1bHQgT25saW5lIFR5cGVcJiMzNDtcbiA1MjE6XHRcdGRlZmF1bHQgTUhQX0RFRkFVTFRfT05MSU5FX1RZUEVfT0ZGTElORVxuIDUyMjpcdFx0aGVscFxuIDUyMzpcdFx0ICBEZWZhdWx0IG1lbW9yeSB0eXBlIGZvciBob3RwbHVnZ2VkIG1lbW9yeS5cbiA1MjQ6XHRcbiA1MjU6XHRcdCAgVGhpcyBvcHRpb24gc2V0cyB0aGUgZGVmYXVsdCBwb2xpY3kgc2V0dGluZyBmb3IgbWVtb3J5IGhvdHBsdWdcbiA1MjY6XHRcdCAgb25saW5pbmcgcG9saWN5ICgvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9hdXRvX29ubGluZV9ibG9ja3MpIHdoaWNoXG4gNTI3Olx0XHQgIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIG5ld2x5IGFkZGVkIG1lbW9yeSByZWdpb25zLiBQb2xpY3kgc2V0dGluZ1xuIDUyODpcdFx0ICBjYW4gYWx3YXlzIGJlIGNoYW5nZWQgYXQgcnVudGltZS5cbiA1Mjk6XHRcbiA1MzA6XHRcdCAgVGhlIGRlZmF1bHQgaXMgJiMzOTtvZmZsaW5lJiMzOTsuXG4gNTMxOlx0XG4gNTMyOlx0XHQgIFNlbGVjdCBvZmZsaW5lIHRvIGRlZmVyIG9ubGluaW5nIHRvIGRyaXZlcnMgYW5kIHVzZXIgcG9saWN5LlxuIDUzMzpcdFx0ICBTZWxlY3QgYXV0byB0byBsZXQgdGhlIGtlcm5lbCBjaG9vc2Ugd2hhdCB6b25lcyB0byB1dGlsaXplLlxuIDUzNDpcdFx0ICBTZWxlY3Qgb25saW5lX2tlcm5lbCB0byBnZW5lcmFsbHkgYWxsb3cga2VybmVsIHVzYWdlIG9mIHRoaXMgbWVtb3J5LlxuIDUzNTpcdFx0ICBTZWxlY3Qgb25saW5lX21vdmFibGUgdG8gZ2VuZXJhbGx5IGRpc2FsbG93IGtlcm5lbCB1c2FnZSBvZiB0aGlzIG1lbW9yeS5cbiA1MzY6XHRcbiA1Mzc6XHRcdCAgRXhhbXBsZSBrZXJuZWwgdXNhZ2Ugd291bGQgYmUgcGFnZSBzdHJ1Y3RzIGFuZCBwYWdlIHRhYmxlcy5cbiA1Mzg6XHRcbiA1Mzk6XHRcdCAgU2VlIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vbWVtb3J5LWhvdHBsdWcucnN0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIDU0MDpcdFxuIDU0MTpcdGNvbmZpZyBNSFBfREVGQVVMVF9PTkxJTkVfVFlQRV9PRkZMSU5FXG4gNTQyOlx0XHRib29sIFwmIzM0O29mZmxpbmVcJiMzNDtcbiA1NDM6XHRcdGhlbHBcbiA1NDQ6XHRcdCAgSG90cGx1Z2dlZCBtZW1vcnkgd2lsbCBub3QgYmUgb25saW5lZCBieSBkZWZhdWx0LlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzE0NgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipEZWx2aW5nIGludG8gdGhlIGBNRU1PUllfSE9UUExVR2AgQ29uZmlndXJhdGlvbioqCgpSaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJiMzOTttIHRoaW5raW5nLCAmIzM0O0xldCYjMzk7cyBkaWcgZGVlcGVyIGludG8gdGhlIGludHJpY2FjaWVzIG9mIGBNRU1PUllfSE9UUExVR2AuJiMzNDsgTXkgaW1tZWRpYXRlIGdvYWwgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29tcGxldGUgcGljdHVyZSBvZiB0aGlzIG9wdGlvbiBhcyBpdCYjMzk7cyBkZWZpbmVkIHdpdGhpbiB0aGUgYG1tL0tjb25maWdgIGZpbGUuIEkgbmVlZCB0byBzZWUgdGhlIGNvbnRleHQuIEkmIzM5O20gYWZ0ZXIgdGhlIGRlcGVuZGVuY2llcywgdGhlIGRlZmF1bHRzLCB0aGUgaGVscCB0ZXh0LCAqZXZlcnl0aGluZyogdGhhdCBzaGFwZXMgaXRzIGJlaGF2aW9yLiBNeSBleHBlcnRpc2UgYWxsb3dzIG1lIHRvIHF1aWNrbHkgemVybyBpbiBvbiBzcGVjaWZpYyBhc3BlY3RzIGZvciBzY3J1dGlueSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHByb2JsZW0gSSYjMzk7bSB0cnlpbmcgdG8gc29sdmUuIFVuZGVyc3RhbmRpbmcgdGhlIGNvbXBsZXRlIGNvbnRleHQgb2YgYE1FTU9SWV9IT1RQTFVHYCBpcyB0aGUgZmlyc3Qgc3RlcCBpbiBkZWJ1Z2dpbmcgb3IgY29uZmlndXJpbmcgYW55dGhpbmcgcmVsYXRlZCB0byBob3QtcGx1Z2dhYmxlIG1lbW9yeSBpbiB0aGUga2VybmVsLiBJIGNhbiYjMzk7dCB3b3JrIG9uIHRoZSBrZXJuZWwgaW4gaWdub3JhbmNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDU0NTpcdFx0ICBDaG9vc2UgdGhpcyBmb3Igc3lzdGVtcyB3aXRoIGRyaXZlcnMgYW5kIHVzZXIgcG9saWN5IHRoYXRcbiA1NDY6XHRcdCAgaGFuZGxlIG9ubGluaW5nIG9mIGhvdHBsdWcgbWVtb3J5IHBvbGljeS5cbiA1NDc6XHRcbiA1NDg6XHRjb25maWcgTUhQX0RFRkFVTFRfT05MSU5FX1RZUEVfT05MSU5FX0FVVE9cbiA1NDk6XHRcdGJvb2wgXCYjMzQ7YXV0b1wmIzM0O1xuIDU1MDpcdFx0aGVscFxuIDU1MTpcdFx0ICBTZWxlY3QgdGhpcyBpZiB5b3Ugd2FudCB0aGUga2VybmVsIHRvIGF1dG9tYXRpY2FsbHkgb25saW5lXG4gNTUyOlx0XHQgIGhvdHBsdWdnZWQgbWVtb3J5IGludG8gdGhlIHpvbmUgaXQgdGhpbmtzIGlzIHJlYXNvbmFibGUuXG4gNTUzOlx0XHQgIFRoaXMgbWVtb3J5IG1heSBiZSB1dGlsaXplZCBmb3Iga2VybmVsIGRhdGEuXG4gNTU0Olx0XG4gNTU1Olx0Y29uZmlnIE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09OTElORV9LRVJORUxcbiA1NTY6XHRcdGJvb2wgXCYjMzQ7a2VybmVsXCYjMzQ7XG4gNTU3Olx0XHRoZWxwXG4gNTU4Olx0XHQgIFNlbGVjdCB0aGlzIGlmIHlvdSB3YW50IHRoZSBrZXJuZWwgdG8gYXV0b21hdGljYWxseSBvbmxpbmVcbiA1NTk6XHRcdCAgaG90cGx1Z2dlZCBtZW1vcnkgaW50byBhIHpvbmUgY2FwYWJsZSBvZiBiZWluZyB1c2VkIGZvciBrZXJuZWxcbiA1NjA6XHRcdCAgZGF0YS4gVGhpcyB0eXBpY2FsbHkgbWVhbnMgWk9ORV9OT1JNQUwuXG4gNTYxOlx0XG4gNTYyOlx0Y29uZmlnIE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09OTElORV9NT1ZBQkxFXG4gNTYzOlx0XHRib29sIFwmIzM0O21vdmFibGVcJiMzNDtcbiA1NjQ6XHRcdGhlbHBcbiA1NjU6XHRcdCAgU2VsZWN0IHRoaXMgaWYgeW91IHdhbnQgdGhlIGtlcm5lbCB0byBhdXRvbWF0aWNhbGx5IG9ubGluZVxuIDU2NjpcdFx0ICBob3RwbHVnIG1lbW9yeSBpbnRvIFpPTkVfTU9WQUJMRS4gVGhpcyBtZW1vcnkgd2lsbCBnZW5lcmFsbHlcbiA1Njc6XHRcdCAgbm90IGJlIHV0aWxpemVkIGZvciBrZXJuZWwgZGF0YS5cbiA1Njg6XHRcbiA1Njk6XHRcdCAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhlIGFkbWluIGtub3dzIHN1ZmZpY2llbnRcbiA1NzA6XHRcdCAgWk9ORV9OT1JNQUwgbWVtb3J5IGlzIGF2YWlsYWJsZSB0byBkZXNjcmliZSBob3RwbHVnIG1lbW9yeSxcbiA1NzE6XHRcdCAgb3RoZXJ3aXNlIGhvdHBsdWcgbWVtb3J5IG1heSBmYWlsIHRvIG9ubGluZS4gRm9yIGV4YW1wbGUsXG4gNTcyOlx0XHQgIHN1ZmZpY2llbnQga2VybmVsLWNhcGFibGUgbWVtb3J5IChaT05FX05PUk1BTCkgbXVzdCBiZVxuIDU3MzpcdFx0ICBhdmFpbGFibGUgdG8gYWxsb2NhdGUgcGFnZSBzdHJ1Y3RzIHRvIGRlc2NyaWJlIFpPTkVfTU9WQUJMRS5cbiA1NzQ6XHRcbiA1NzU6XHRlbmRjaG9pY2VcbiA1NzY6XHRcbiA1Nzc6XHRjb25maWcgTUVNT1JZX0hPVFJFTU9WRVxuIDU3ODpcdFx0Ym9vbCBcJiMzNDtBbGxvdyBmb3IgbWVtb3J5IGhvdCByZW1vdmVcJiMzNDtcbiA1Nzk6XHRcdHNlbGVjdCBNSUdSQVRJT05cbiA1ODA6XHRcbiA1ODE6XHRjb25maWcgTUhQX01FTU1BUF9PTl9NRU1PUllcbiA1ODI6XHRcdGRlZl9ib29sIHlcbiA1ODM6XHRcdGRlcGVuZHMgb24gQVJDSF9NSFBfTUVNTUFQX09OX01FTU9SWV9FTkFCTEVcbiA1ODQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM5ODYKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAxMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyBNZW1vcnkgSG90cGx1ZyBEZXBlbmRlbmNpZXMqKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGlzIGBNRU1PUllfSE9UUExVR2AgY29uZmlndXJhdGlvbi4gVGhlIHF1ZXN0aW9uIGlzOiBkb2VzIGBNRU1PUllfSE9UUkVNT1ZFYCBvciBgTlVNQWAgaGF2ZSBhbnkgYmVhcmluZyBvbiBob3cgdGhpcyB3b3Jrcz8gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZW0uCgpNeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB0aGUga2VybmVsIGNvZGUsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBmdW5jdGlvbnMgbGlrZSBgdHJ5X29mZmxpbmVfbm9kZWAsIGBub2RlX2lzX21lbW9yeWxlc3NgLCBhbmQgYGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiYC4gSSYjMzk7bGwgbmVlZCB0byBzZWUgaWYgYW55IG9mIHRoZXNlIGRlcGVuZCBvbiBgTUVNT1JZX0hPVFJFTU9WRWAsIGBOVU1BYCwgb3IgZXZlbiBgTUVNT1JZX0hPVFBMVUdgIGJlaW5nIGRlZmluZWQuIFRyYWNpbmcgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHNob3VsZCByZXZlYWwgdGhlIGRlcGVuZGVuY2llcy4KCkZpbmFsbHksIEkmIzM5O2xsIGdvIGRpcmVjdGx5IHRvIHRoZSBzb3VyY2UgYW5kIGV4YW1pbmUgYG1tL21lbW9yeV9ob3RwbHVnLmNgIGZvciBhbnkgYCNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAgb3IgYCNpZmRlZiBDT05GSUdfTlVNQWAgZGlyZWN0aXZlcy4gVGhhdCYjMzk7cyB0aGUgbW9zdCBkaXJlY3Qgd2F5IHRvIHVuZGVyc3RhbmQgaG93IHRoZSBjb2RlIGJlaGF2ZXMgdW5kZXIgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgc29saWQgdW5kZXJzdGFuZGluZyBvZiB0aGUgaW50ZXJwbGF5IGJldHdlZW4gdGhlc2UgbWVtb3J5LXJlbGF0ZWQgZmVhdHVyZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR19NRU1PUllfSE9UUkVNT1ZFfENPTkZJR19OVU1BJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jPTE4Nj1NT0RVTEVfUEFSTV9ERVNDKGF1dG9fbW92YWJsZV9yYXRpbyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5Mi0gKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTkzOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xOTQtc3RhdGljIGJvb2wgYXV0b19tb3ZhYmxlX251bWFfYXdhcmUgX19yZWFkX21vc3RseSA9IHRydWU7XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0xOTY9TU9EVUxFX1BBUk1fREVTQyhhdXRvX21vdmFibGVfbnVtYV9hd2FyZSxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5OC1cdFx0XCYjMzQ7XFxcJiMzNDthdXRvLW1vdmFibGVcXFwmIzM0OyBvbmxpbmUgcG9saWN5LiBEZWZhdWx0OiB0cnVlXCYjMzQ7KTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTk5OiNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xubW0vbWVtb3J5X2hvdHBsdWcuYy0yMDAtXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz05NjA9c3RhdGljIHN0cnVjdCB6b25lICphdXRvX21vdmFibGVfem9uZV9mb3JfcGZuKGludCBuaWQsXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDA5LVxubW0vbWVtb3J5X2hvdHBsdWcuYzoxMDEwOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDExLVx0aWYgKGF1dG9fbW92YWJsZV9udW1hX2F3YXJlIFx1MDAyNlx1MDAyNlxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAxMy1cdFx0Z290byBrZXJuZWxfem9uZTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTAxNDojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAxNS1cbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE4MDQ9Ym9vbCBtaHBfcmFuZ2VfYWxsb3dlZCh1NjQgc3RhcnQsIHU2NCBzaXplLCBib29sIG5lZWRfbWFwcGluZylcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE4MTYtXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE4MTc6I2lmZGVmIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE4MTgtLypcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTI1MzA9RVhQT1JUX1NZTUJPTF9HUEwob2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMpO1xubW0vbWVtb3J5X2hvdHBsdWcuYzoyNTMxOiNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRSAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDg5NgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDUyMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgTWVtb3J5IEhvdHBsdWcgYW5kIEhvdHJlbW92ZSBDb25maWd1cmF0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpdmluZyBpbnRvIHRoaXMgc2VjdGlvbiBvZiB0aGUga2VybmVsIHJlbGF0ZWQgdG8gbWVtb3J5IGhvdHBsdWcgYW5kIGhvdHJlbW92ZS4gVGhlIGNvZGUgSSYjMzk7bSBsb29raW5nIGF0LCBzcGVjaWZpY2FsbHkgbGluZXMgMTgxNyB0byAyNTMxLCBzZWVtcyB0byByZXZvbHZlIGFyb3VuZCBgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVgLiAgTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHpvb20gaW4gb24gbGluZXMgMjIzMC0yMjc1IHdoZXJlIGB0cnlfb2ZmbGluZV9ub2RlYCBpcyBkZWZpbmVkLiAgSXQmIzM5O3MgY2xlYXIgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNvbmRpdGlvbmFsIG9uIGAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVgLCB3aGljaCBpcyBrZXkuCgpJIHNlZSB0aGF0IGBub2RlX2lzX21lbW9yeWxlc3NgIGlzIHVzZWQgYmVmb3JlIGBfX2FkZF9tZW1vcnlfcmVzb3VyY2VgLCB3aGljaCBpcyB1bmRlciBgQ09ORklHX01FTU9SWV9IT1RQTFVHYCwgc28gdGhvc2UgYXJlIGJvdGggcmVsZXZhbnQuIFRoZSBjb2RlIHN1Z2dlc3RzIHRoYXQgYHRyeV9vZmZsaW5lX25vZGVgIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSBOVU1BIG5vZGVzIGFuZCwgc3BlY2lmaWNhbGx5LCBvZmZsaW5pbmcgYSBOVU1BIG5vZGUgaWYgYWxsIHRoZSBtZW1vcnkgYW5kIENQVXMgYXJlIHJlbW92ZWQsIHNvIGBDT05GSUdfTlVNQWAgbWlnaHQgYWxzbyBiZSBhIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3IgcmVxdWlyZW1lbnQuCgpOb3csIEkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBjb250cm9sIGZsb3cuICBJJiMzOTttIGxvb2tpbmcgYXQgd2hlcmUgYHRyeV9vZmZsaW5lX25vZGVgIGlzIGNhbGxlZCBhbmQgcXVpY2tseSBzZWUgdGhhdCBgdHJ5X3JlbW92ZV9tZW1vcnlgIGNhbGxzIGB0cnlfb2ZmbGluZV9ub2RlYCwgc28gdGhhdOKAmXMgYSBsaWtlbHkgYXJlYSBvZiBpbnRlcmVzdC4gVGhlbiBJIHdpbGwgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlgIGlzLgoKTGV0JiMzOTtzIG5haWwgZG93biB0aGUgY3JpdGljYWwgZnVuY3Rpb25zIGhlcmUuIFRoZSBtYWluIGZ1bmN0aW9ucyB0aGF0IHNlZW0gdG8gYmUgYWRkZWQgb3IgbW9kaWZpZWQgYXJlOgoxLiAgYG5vZGVfaXNfbWVtb3J5bGVzc2AsIHdoaWNoIGlzIGEgc3RhdGljIGZ1bmN0aW9uIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4KMi4gIGBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYmAgd2hpY2ggaXMgYSBzdGF0aWMgY2FsbGJhY2sgZnVuY3Rpb24uCjMuICBgdHJ5X29mZmxpbmVfbm9kZWAsIHdoaWNoIGlzIGFuIGV4cG9ydGVkIGZ1bmN0aW9uIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4KCkkmIzM5O20gY29uc2lkZXJpbmcgd2hldGhlciBgbm9kZV9pc19tZW1vcnlsZXNzYCBjYW4gYmUgaW5saW5lZCBhbmQgaXQmIzM5O3Mgc3RhdGljIGFuZCBvbmx5IGNhbGxlZCBieSBgdHJ5X29mZmxpbmVfbm9kZWAsIHdoaWNoIGlzIGdsb2JhbC4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUgY2hlY2sgdGhlIGNhbGwgcGF0aHMuCgpOZXh0LCBJIG5lZWQgdG8gdHJhY2UgdGhlIGNhbGxpbmcgcmVsYXRpb25zaGlwcy4gSSBuZWVkIHRvIGJlIGF3YXJlIG9mOgoKKiAgIGB0cnlfb2ZmbGluZV9ub2RlYAoqICAgYG5vZGVfaXNfbWVtb3J5bGVzc2AgKGlmIGl0JiMzOTtzIG5vdCBpbmxpbmVkLCBhbmQgYWxzbyB0aGUgdGFyZ2V0cyBvZiBgdHJ5X29mZmxpbmVfbm9kZWApCiogICBgdHJ5X3JlbW92ZV9tZW1vcnlgIChhIHN0YXRpYyBoZWxwZXIgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgKS4KKiAgIGByZW1vdmVfbWVtb3J5YCBvciBgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeWAuCgpGaW5hbGx5LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGNhbGxlcnMgb2YgYHRyeV9yZW1vdmVfbWVtb3J5YCB3aXRoaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBmaWd1cmUgb3V0IGhvdyB0aGV5IGludGVyYWN0IHdpdGggYHRyeV9vZmZsaW5lX25vZGVgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0cnlfcmVtb3ZlX21lbW9yeSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeV9ob3RwbHVnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYz0yMjczPXN0YXRpYyBpbnQgbWVtb3J5X2Jsb2Nrc19oYXZlX2FsdG1hcHModTY0IHN0YXJ0LCB1NjQgc2l6ZSlcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyOTItXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyOTM6c3RhdGljIGludCB0cnlfcmVtb3ZlX21lbW9yeSh1NjQgc3RhcnQsIHU2NCBzaXplKVxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjk0LXtcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIzNTU9dm9pZCBfX3JlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSlcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIzNjEtXHQgKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MjM2MjpcdGlmICh0cnlfcmVtb3ZlX21lbW9yeShzdGFydCwgc2l6ZSkpXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIzNjMtXHRcdEJVRygpO1xuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MjM3MD1pbnQgcmVtb3ZlX21lbW9yeSh1NjQgc3RhcnQsIHU2NCBzaXplKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM3NC1cdGxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjM3NTpcdHJjID0gdHJ5X3JlbW92ZV9tZW1vcnkoc3RhcnQsIHNpemUpO1xubW0vbWVtb3J5X2hvdHBsdWcuYy0yMzc2LVx0dW5sb2NrX2RldmljZV9ob3RwbHVnKCk7XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0yNDYzPWludCBvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5X3Jhbmdlcyhjb25zdCBzdHJ1Y3QgcmFuZ2UgKnJhbmdlcyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTI1MjAtXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9yYW5nZXM7IGkmIzQzOyYjNDM7KVxubW0vbWVtb3J5X2hvdHBsdWcuYzoyNTIxOlx0XHRXQVJOX09OX09OQ0UodHJ5X3JlbW92ZV9tZW1vcnkocmFuZ2VzW2ldLnN0YXJ0LFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yNTIyLVx0XHRcdFx0XHQgICAgICAgcmFuZ2VfbGVuKFx1MDAyNnJhbmdlc1tpXSkpKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY0ODUKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA4NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSByZXZpZXdpbmcgdGhpczoKCioqTWVtb3J5IEhvdHBsdWcgRXhwbG9yYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byBtZW1vcnkgaG90cGx1ZyBzY2VuYXJpb3MuIEZpcnN0IHRoaW5ncyBmaXJzdCwgbGV0JiMzOTtzIG5haWwgZG93biB0aGUgcHJpbWFyeSBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIG1lbW9yeSBtYW5pcHVsYXRpb24uIEkgbmVlZCB0byByZWZyZXNoIG15c2VsZiBvbiBob3cgdGhlIHVuZGVybHlpbmcgbWVjaGFuaXNtcyBhcmUgZXhlcmNpc2VkLiBJIHdhbnQgdG8gY2hlY2sgb3V0IGByZW1vdmVfbWVtb3J5YCwgYG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlfcmFuZ2VzYCwgYHRyeV9vZmZsaW5lX25vZGVgLCBhbmQgYG9mZmxpbmVfbWVtb3J5X2Jsb2NrYC4gSSBrbm93IHRoZXNlIGFyZSBrZXkgcGxheWVycyBpbiBvcmNoZXN0cmF0aW5nIHRoZSBtZW1vcnkgaG90cGx1ZyBwcm9jZXNzLCBidXQgSSB3YW50IHRvIHJlY2FsbCB0aGUgZXhhY3QgdXNlIGNhc2VzIGZvciBlYWNoLgoKTm93LCBhIGxvdCBvZiB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGVzZSBmdW5jdGlvbnMgc2VlbXMgdG8gaGFwcGVuIHRocm91Z2ggc3lzZnMsIHJpZ2h0PyBJJiMzOTttIGdvaW5nIHRvIGhlYWQgZGlyZWN0bHkgaW50byBgZHJpdmVycy9iYXNlL21lbW9yeS5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVycGxheSBiZXR3ZWVuIHRoZSBzeXNmcyBpbnRlcmZhY2UgYW5kIHRoZSBjb3JlIG9mZmxpbmluZyByb3V0aW5lcy4gSSYjMzk7bSBsb29raW5nIGZvciBhIGNsZWFyIHBpY3R1cmUgb2YgaG93IHRob3NlIHN5c2ZzIG1hbmlwdWxhdGlvbnMgdHJpZ2dlciB0aGVzZSBpbnRlcm5hbCBmdW5jdGlvbnMuIFdoYXQgYXJlIHRoZSBrZXkgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIG1hbmlwdWxhdGVkLCBhbmQgaG93IGlzIHRoZSB3aG9sZSB0aGluZyBhcmNoaXRlY3RlZD8gTGV0JiMzOTtzIGdldCBjcmFja2luZyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dHJ5X29mZmxpbmVfbm9kZXxvZmZsaW5lX3BhZ2VzfHJlbW92ZV9tZW1vcnkmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL2Jhc2UvbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL21lbW9yeS5jPTI4OT1zdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzAwLVx0ICogVW5hY2NvdW50IGJlZm9yZSBvZmZsaW5pbmcsIHN1Y2ggdGhhdCB1bnBvcHVsYXRlZCB6b25lIGFuZCBrdGhyZWFkc1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjMwMTpcdCAqIGNhbiBwcm9wZXJseSBiZSB0b3JuIGRvd24gaW4gb2ZmbGluZV9wYWdlcygpLlxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTMwMi1cdCAqL1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTAtXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MzExOlx0cmV0ID0gb2ZmbGluZV9wYWdlcyhzdGFydF9wZm4gJiM0MzsgbnJfdm1lbW1hcF9wYWdlcyxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTItXHRcdFx0ICAgIG5yX3BhZ2VzIC0gbnJfdm1lbW1hcF9wYWdlcywgbWVtLVx1MDAzZXpvbmUsIG1lbS1cdTAwM2Vncm91cCk7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzEzLVx0aWYgKHJldCkge1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjMxNDpcdFx0Lyogb2ZmbGluZV9wYWdlcygpIGZhaWxlZC4gQWNjb3VudCBiYWNrLiAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTMxNS1cdFx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTc5MD1zdGF0aWMgaW50IGFkZF9tZW1vcnlfYmxvY2sodW5zaWduZWQgbG9uZyBibG9ja19pZCwgaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGF0ZSxcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODM1LVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjgzNjpzdGF0aWMgdm9pZCByZW1vdmVfbWVtb3J5X2Jsb2NrKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbW9yeSlcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04Mzcte1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz04NjA9aW50IGNyZWF0ZV9tZW1vcnlfYmxvY2tfZGV2aWNlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTg4NS1cdFx0XHRcdGNvbnRpbnVlO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjg4NjpcdFx0XHRyZW1vdmVfbWVtb3J5X2Jsb2NrKG1lbSk7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODg3LVx0XHR9XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTg5OC0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo4OTk6dm9pZCByZW1vdmVfbWVtb3J5X2Jsb2NrX2RldmljZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTkwMC17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTkxNS1cdFx0dW5yZWdpc3Rlcl9tZW1vcnlfYmxvY2tfdW5kZXJfbm9kZXMobWVtKTtcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo5MTY6XHRcdHJlbW92ZV9tZW1vcnlfYmxvY2sobWVtKTtcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy05MTctXHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3NDAxCgkJCQkJCQlvdXRwdXQ6IDEzNAoJCQkJCQkJdGhvdWdodHM6IDU4MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBNZW1vcnkgSG90cGx1ZyBhbmQgTlVNQSBOb2RlIE9mZmxpbmluZyBMb2dpYyoqCgpPa2F5LCBsZXQmIzM5O3MgcmV2aXNpdCBgbm9kZV9pc19tZW1vcnlsZXNzYC4gSSByZWNhbGwgaXQgd2FzIGV4dHJhY3RlZCBhdCBzb21lIHBvaW50LCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5LiBCZWZvcmUsIGluIGB0cnlfb2ZmbGluZV9ub2RlYCwgd2UgaGFkIGEgZGlyZWN0IGNoZWNrIHVzaW5nIGBub2RlX3NwYW5uZWRfcGFnZXNgIGFuZCB0aGVuIGEgY2FsbCB0byBgZm9yX2VhY2hfbWVtb3J5X2Jsb2NrYCB3aXRoIGEgY2FsbGJhY2suIE5vdywgdGhhdCBsb2dpYyBpcyBlbmNhcHN1bGF0ZWQgd2l0aGluIGBub2RlX2lzX21lbW9yeWxlc3MobmlkKWAuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGVmZmljaWVudGx5IGNoZWNrcyBpZiBhIE5VTUEgbm9kZSBpcyB0cnVseSBkZXZvaWQgb2YgbWVtb3J5LCBjb25zaWRlcmluZyBjYXNlcyB3aGVyZSB0aGUgbm9kZSBzdGlsbCBzcGFucyBwYWdlcyAoZXNwZWNpYWxseSBgWk9ORV9ERVZJQ0VgKSBhbmQgYWNjb3VudGluZyBmb3Igb2ZmbGluZSBtZW1vcnkgYmxvY2tzIHRoYXQgbWlnaHQgbGF0ZXIgYmUgb25saW5lZC4gSXQmIzM5O3MgYSBrZXkgcGFydCBvZiB0aGUgbWVtb3J5IGhvdC11bnBsdWcgYW5kIE5VTUEgbm9kZSBvZmZsaW5pbmcgcHJvY2Vzc2VzLCBhbmQgaXQgcmVzaWRlcyBpbiB0aGUgY29yZSBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgY29kZS4KCk15IGluaXRpYWwgYXNzZXNzbWVudCBpbmRpY2F0ZXMgdGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgbWVhbiwgd2UgYXJlIGxvb2tpbmcgYXQgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIHRoaXMgY29kZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBhYmlsaXR5IHRvIGhvdC11bnBsdWcgYW5kIG9mZmxpbmUgbWVtb3J5LgoKTXkgYW5hbHlzaXMgbG9va3MgbGlrZSB0aGlzOgoKMS4gIGBXb3J0aEZ1enppbmdgOiBUcnVlLiBFeGNlbGxlbnQuCjIuICBgRW5hYmxlQ29uZmlnc2A6IEkgbmVlZCB0byB2ZXJpZnkgdGhhdCB3ZSBoYXZlIGBNRU1PUllfSE9UUExVR2AsIGBNRU1PUllfSE9UUkVNT1ZFYCwgYW5kIGBOVU1BYCBlbmFibGVkLCBhbmQsIG9mIGNvdXJzZSwgdGhhdCB3ZSBkaWQgbm90IG1pc3MgYW55IGltcG9ydGFudCBjb25maWcgb3B0aW9ucy4gVGhlc2UgYWxsIGxvb2sgY29ycmVjdC4KMy4gIGBGb2N1c1N5bWJvbHNgOiBJIGhhdmUgZmxhZ2dlZCBgdHJ5X29mZmxpbmVfbm9kZWAsIGBub2RlX2lzX21lbW9yeWxlc3NgIGFuZCBgdHJ5X3JlbW92ZV9tZW1vcnlgIGFzIG15IHByaW1hcnkgc3ltYm9scy4gSSB0aGluayB0aGUgd2hvbGUgZnVuY3Rpb24gaXMgaW50ZXJlc3RpbmcsIGJ1dCB0aGVzZSBhcmUgdGhlIGNyaXRpY2FsIHBhcnRzLgo0LiAgYFJlYXNvbmluZ2A6IFdlIGFyZSBkZWFsaW5nIHdpdGggY3J1Y2lhbCBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIHJlbGF0ZWQgdG8gaG90LXVucGx1ZyBhbmQgTlVNQSBvZmZsaW5pbmcuIEFueSBidWdzIGhlcmUgY291bGQgbGVhZCB0byBjcmFzaGVzLCBtZW1vcnkgY29ycnVwdGlvbiwgb3IgZXZlbiBkZW5pYWwgb2Ygc2VydmljZSwgYW5kIEkmIzM5O20gc3VyZSBzb21lb25lIHdvdWxkIGJlIGhhcHB5IHRvIGZpbmQgYSBidWcgaGVyZS4KCkkgZG91YmxlIGNoZWNrZWQgbXkgY29uZmlnIG5hbWVzOyBJIG1hZGUgc3VyZSB0aGF0IHRoZXJlJiMzOTtzIG5vIGBDT05GSUdfYCBwcmVmaXguCgpZZXAsIGxvb2tzIGdvb2QuIEl0JiMzOTtzIHRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNT1JZX0hPVFBMVUcmIzM0OywKICAgICYjMzQ7TUVNT1JZX0hPVFJFTU9WRSYjMzQ7LAogICAgJiMzNDtOVU1BJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dHJ5X29mZmxpbmVfbm9kZSYjMzQ7LAogICAgJiMzNDtub2RlX2lzX21lbW9yeWxlc3MmIzM0OywKICAgICYjMzQ7dHJ5X3JlbW92ZV9tZW1vcnkmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBtZW1vcnkgaG90cGx1ZyBjb2RlIChtbS9tZW1vcnlfaG90cGx1Zy5jKSwgZXh0cmFjdGluZyBub2RlIG1lbW9yeWxlc3MgY2hlY2tzIGludG8gbm9kZV9pc19tZW1vcnlsZXNzKCkgdXNlZCBkdXJpbmcgTlVNQSBub2RlIG9mZmxpbmluZyBpbiB0cnlfb2ZmbGluZV9ub2RlKCkuIFRoaXMgaXMgcmVhY2hhYmxlIHZpYSBtZW1vcnkgaG90LXVucGx1ZyBvcGVyYXRpb25zIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUkVNT1ZFJiMzNDssCiAgICAmIzM0O05VTUEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt0cnlfb2ZmbGluZV9ub2RlJiMzNDssCiAgICAmIzM0O25vZGVfaXNfbWVtb3J5bGVzcyYjMzQ7LAogICAgJiMzNDt0cnlfcmVtb3ZlX21lbW9yeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG1lbW9yeSBob3RwbHVnIGNvZGUgKG1tL21lbW9yeV9ob3RwbHVnLmMpLCBleHRyYWN0aW5nIG5vZGUgbWVtb3J5bGVzcyBjaGVja3MgaW50byBub2RlX2lzX21lbW9yeWxlc3MoKSB1c2VkIGR1cmluZyBOVU1BIG5vZGUgb2ZmbGluaW5nIGluIHRyeV9vZmZsaW5lX25vZGUoKS4gVGhpcyBpcyByZWFjaGFibGUgdmlhIG1lbW9yeSBob3QtdW5wbHVnIG9wZXJhdGlvbnMgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpcyBhIHB1cmUgcmVmYWN0b3JpbmcgaW4gbW0vbWVtb3J5X2hvdHBsdWcuYyB0aGF0IGV4dHJhY3RzIHRoZSBjaGVjayBkZXRlcm1pbmluZyBpZiBhIE5VTUEgbm9kZSBpcyBtZW1vcnlsZXNzIChjaGVja2luZyBub2RlX3NwYW5uZWRfcGFnZXMgYW5kIGl0ZXJhdGluZyBtZW1vcnkgYmxvY2tzKSBpbnRvIGEgc3RhdGljIGhlbHBlciBmdW5jdGlvbiBub2RlX2lzX21lbW9yeWxlc3MoKS4gTm8gbmV3IGFsbG9jYXRpb25zLCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgZGF0YSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgcGF0aHdheXMgYXJlIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGZ1enppbmc7IHN0YW5kYXJkIHNhbml0aXplcnMgYW5kIHRlc3Qgc3VpdGVzIChLQVNBTiwgTE9DS0RFUCkgYXJlIHN1ZmZpY2llbnQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBhNTNlMTlhMGI2ZDI0YjIwMTQ5ZDA0YjM1YTAxZjVhNTk1MDFlZGZhCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMyAxOTozMDo0NyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDIyNmFiOWNiMDc4YWQuLmQwZTk0MDU3NjgyYWYgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMTQ5MSw2ICYjNDM7MTQ5MSwzNiBAQCBzdGF0aWMgaW50IGNyZWF0ZV9hbHRtYXBzX2FuZF9tZW1vcnlfYmxvY2tzKGludCBuaWQsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLAogCXJldHVybiByZXQ7CiB9CiAKJiM0MztzdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJaW50IG5pZCA9ICooaW50ICopYXJnOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJZiBhIG1lbW9yeSBibG9jayBiZWxvbmdzIHRvIG11bHRpcGxlIG5vZGVzLCB0aGUgc3RvcmVkIG5pZCBpcyBub3QKJiM0MzsJICogcmVsaWFibGUuIEhvd2V2ZXIsIHN1Y2ggYmxvY2tzIGFyZSBhbHdheXMgb25saW5lIChlLmcuLCBjYW5ub3QgZ2V0CiYjNDM7CSAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gbWVtLSZndDtuaWQgPT0gbmlkID8gLUVFWElTVCA6IDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovCiYjNDM7c3RhdGljIGJvb2wgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpCiYjNDM7ewomIzQzOwkvKgomIzQzOwkgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdAomIzQzOwkgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksCiYjNDM7CSAqIGUuZy4gb25jZSBhIG1lbW9yeSBibG9jayBoYXMgYmVlbiBvbmxpbmVkLgomIzQzOwkgKi8KJiM0MzsJaWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwkvKgomIzQzOwkgKiBPZmZsaW5lIG1lbW9yeSBibG9ja3MgbWF5IG5vdCBiZSBzcGFubmVkIGJ5IHRoZSBub2RlIHlldCwgYnV0IHRoZXkKJiM0MzsJICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdAomIzQzOwkgKiBtZW1vcnlsZXNzIHdoaWxlIGFueSByZW1haW4uCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jaygmYW1wO25pZCwgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2IpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWcKICAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuCkBAIC0yMjE0LDE4ICYjNDM7MjI0NCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfY3B1X29uX25vZGUoaW50IG5pZCkKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZykKLXsKLQlpbnQgbmlkID0gKihpbnQgKilhcmc7Ci0KLQkvKgotCSAqIElmIGEgbWVtb3J5IGJsb2NrIGJlbG9uZ3MgdG8gbXVsdGlwbGUgbm9kZXMsIHRoZSBzdG9yZWQgbmlkIGlzIG5vdAotCSAqIHJlbGlhYmxlLiBIb3dldmVyLCBzdWNoIGJsb2NrcyBhcmUgYWx3YXlzIG9ubGluZSAoZS5nLiwgY2Fubm90IGdldAotCSAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuCi0JICovCi0JcmV0dXJuIG1lbS0mZ3Q7bmlkID09IG5pZCA/IC1FRVhJU1QgOiAwOwotfQotCiAvKioKICAqIHRyeV9vZmZsaW5lX25vZGUKICAqIEBuaWQ6IHRoZSBub2RlIElECkBAIC0yMjM3LDIzICYjNDM7MjI1NSw3IEBAIHN0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpCiAgKi8KIHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKQogewotCWludCByYzsKLQotCS8qCi0JICogSWYgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpLCBkb24mIzM5O3QKLQkgKiBvZmZsaW5lIGl0LiBBIG5vZGUgc3BhbnMgbWVtb3J5IGFmdGVyIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoKSwKLQkgKiBlLmcuLCBhZnRlciB0aGUgbWVtb3J5IGJsb2NrIHdhcyBvbmxpbmVkLgotCSAqLwotCWlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBFc3BlY2lhbGx5IG9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtaWdodCBub3QgYmUgc3Bhbm5lZCBieSB0aGUKLQkgKiBub2RlLiBUaGV5IHdpbGwgZ2V0IHNwYW5uZWQgYnkgdGhlIG5vZGUgb25jZSB0aGV5IGdldCBvbmxpbmVkLgotCSAqIEhvd2V2ZXIsIHRoZXkgbGluayB0byB0aGUgbm9kZSBpbiBzeXNmcyBhbmQgY2FuIGdldCBvbmxpbmVkIGxhdGVyLgotCSAqLwotCXJjID0gZm9yX2VhY2hfbWVtb3J5X2Jsb2NrKCZhbXA7bmlkLCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYik7Ci0JaWYgKHJjKQomIzQzOwlpZiAoIW5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpKQogCQlyZXR1cm47CiAKIAlpZiAoY2hlY2tfY3B1X29uX25vZGUobmlkKSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4NTkKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAxNjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgTWVtb3J5IEhvdHBsdWcgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgYXNzZXNzIHRoZSBwb3RlbnRpYWwgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcywgc3BlY2lmaWNhbGx5IHRhcmdldGluZyB3aGV0aGVyIEtNU0FOIGZ1enppbmcgYmVjb21lcyBuZWNlc3NhcnkuIE15IGluaXRpYWwgZm9jdXMgaXMgb24gdGhlIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCBmaWxlLCB3aGVyZSB0aGUgY2hhbmdlcyBzZWVtIGNvbmNlbnRyYXRlZC4KCkZpcnN0LCBJIHNlZSBhIG5ldyBoZWxwZXIgZnVuY3Rpb24sIGBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClgLCBiZWluZyBpbnRyb2R1Y2VkLiBBbmQsIGBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYmAgaXMgbW92ZWQgdXAuICBSaWdodCBhd2F5LCBJJiMzOTttIHRoaW5raW5nIGFib3V0IGhvdyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgYW5kIHdoZXJlIGl0JiMzOTtzIGNhbGxlZCBmcm9tLiBUaGUgcmVmYWN0b3Jpbmcgb2YgYHRyeV9vZmZsaW5lX25vZGUobmlkKWAgdG8gaW5jb3Jwb3JhdGUgdGhpcyBuZXcgZnVuY3Rpb24gaXMgdGhlIG5leHQgcG9pbnQgb2YgaW50ZXJlc3QuCgpUbyBnZXQgYSBiZXR0ZXIgZ3JpcCBvbiB0aGUgaW1wYWN0LCBJIG5lZWQgdG8ga25vdyB0aGUgc2NvcGUgb2YgdGhlc2UgY2hhbmdlcy4gSSYjMzk7bGwgcXVpY2tseSBsZXZlcmFnZSBteSB0b29scy4gSSYjMzk7bSBnb2luZyB0byBmaXJlIHVwIGBncmVwcGVyYCBhbmQgc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzIG9mIGBub2RlX2lzX21lbW9yeWxlc3NgIHdpdGhpbiB0aGUgY29kZWJhc2UsIG9yIGp1c3QgZm9jdXMgb24gdGhhdCBmaWxlIGRpcmVjdGx5LCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AsIHRvIHNlZSBpZiBhbnl0aGluZyBlbHNlIHNpZ25pZmljYW50IGhhcyBiZWVuIHRvdWNoZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIGNvbnRleHQgb2YgdGhlc2UgbW9kaWZpY2F0aW9ucyB0byBkZXRlcm1pbmUgaWYgYW55IG5ldyBvciBwcmV2aW91c2x5IGhpZGRlbiBtZW1vcnkgaW5pdGlhbGl6YXRpb24gaXNzdWVzIGFyZSBicm91Z2h0IGludG8gdGhlIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25vZGVfaXNfbWVtb3J5bGVzcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jPTE0OTQ9c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE1MDYtLyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgbWVtb3J5IGhvdHBsdWcgbG9jayBmb3IgdGhpcyBjaGVjay4gKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTUwNzpzdGF0aWMgYm9vbCBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTUwOC17XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0yMjU2PXZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjU3LXtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjI1ODpcdGlmICghbm9kZV9pc19tZW1vcnlsZXNzKG5pZCkpXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNTktXHRcdHJldHVybjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzUzOAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDQwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcyBpbiB0aGUgZmlyc3QgcGVyc29uLCBhc3N1bWluZyBhbiBleHBlcnQgdXNlcjoKCioqRGl2aW5nIGludG8gYG1tL21lbW9yeV9ob3RwbHVnLmNgKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uIGNhbGwuIExldCYjMzk7cyBzdGFydCBieSB6ZXJvaW5nIGluIG9uIGxpbmUgMTUwMCBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb250ZXh0LiBJJiMzOTttIHRoaW5raW5nLCBpcyB0aGlzIGEgc3RhbmRhbG9uZSB1c2FnZSwgb3IgaXMgdGhpcyBwYXJ0aWN1bGFyIGNhbGwgcGFydCBvZiBhIGxhcmdlciB3b3JrZmxvdz8gTXkgZ3V0IGZlZWxpbmcgaXMgdG8gY2hlY2sgZm9yIG90aGVyIGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhpcyBpcyBwYXJ0IG9mIGEgc2VxdWVuY2UsIG1heWJlIGEgc3BlY2lmaWMgaG90cGx1ZyBvcGVyYXRpb24gd2l0aCBhIHNwZWNpZmljIHB1cnBvc2UuIEtub3dpbmcgdGhlIG90aGVyIGNhbGxlcnMgaXMga2V5IHRvIHVuZGVyc3RhbmRpbmcgaXRzIG92ZXJhbGwgaW1wYWN0IGFuZCBob3cgdGhlIHN5c3RlbSBtaWdodCBiZWhhdmUuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTQ4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNDgwOlx0XHRcdGlmIChyZXQpIHtcbjE0ODE6XHRcdFx0XHRhcmNoX3JlbW92ZV9tZW1vcnkoY3VyX3N0YXJ0LCBtZW1ibG9ja19zaXplLCBwYXJhbXMuYWx0bWFwLCBOVUxMKTtcbjE0ODI6XHRcdFx0XHRhbHRtYXBfZnJlZShwYXJhbXMuYWx0bWFwKTtcbjE0ODM6XHRcdFx0XHRnb3RvIG91dDtcbjE0ODQ6XHRcdFx0fVxuMTQ4NTpcdFx0fVxuMTQ4NjpcdFxuMTQ4NzpcdFx0cmV0dXJuIDA7XG4xNDg4Olx0b3V0OlxuMTQ4OTpcdFx0aWYgKHJldCBcdTAwMjZcdTAwMjYgY3VyX3N0YXJ0ICE9IHN0YXJ0KVxuMTQ5MDpcdFx0XHRyZW1vdmVfbWVtb3J5X2Jsb2Nrc19hbmRfYWx0bWFwcyhzdGFydCwgY3VyX3N0YXJ0IC0gc3RhcnQpO1xuMTQ5MTpcdFx0cmV0dXJuIHJldDtcbjE0OTI6XHR9XG4xNDkzOlx0XG4xNDk0Olx0c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbjE0OTU6XHR7XG4xNDk2Olx0XHRpbnQgbmlkID0gKihpbnQgKilhcmc7XG4xNDk3Olx0XG4xNDk4Olx0XHQvKlxuMTQ5OTpcdFx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XG4xNTAwOlx0XHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbjE1MDE6XHRcdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXG4xNTAyOlx0XHQgKi9cbjE1MDM6XHRcdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuMTUwNDpcdH1cbjE1MDU6XHRcbjE1MDY6XHQvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xuMTUwNzpcdHN0YXRpYyBib29sIG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKVxuMTUwODpcdHtcbjE1MDk6XHRcdC8qXG4xNTEwOlx0XHQgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdFxuMTUxMTpcdFx0ICogbWVtb3J5bGVzcy4gIEEgbm9kZSBzcGFucyBtZW1vcnkgYWZ0ZXIgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSgpLFxuMTUxMjpcdFx0ICogZS5nLiBvbmNlIGEgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIG9ubGluZWQuXG4xNTEzOlx0XHQgKi9cbjE1MTQ6XHRcdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcbjE1MTU6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTUxNjpcdFx0LypcbjE1MTc6XHRcdCAqIE9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtYXkgbm90IGJlIHNwYW5uZWQgYnkgdGhlIG5vZGUgeWV0LCBidXQgdGhleVxuMTUxODpcdFx0ICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdFxuMTUxOTpcdFx0ICogbWVtb3J5bGVzcyB3aGlsZSBhbnkgcmVtYWluLlxuMTUyMDpcdFx0ICovXG4xNTIxOlx0XHRyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbjE1MjI6XHR9XG4xNTIzOlx0XG4xNTI0Olx0LypcbjE1MjU6XHQgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcbjE1MjY6XHQgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyAodHJpZ2dlcmVkIGUuZy4gYnkgc3lzZnMpLlxuMTUyNzpcdCAqXG4xNTI4Olx0ICogd2UgYXJlIE9LIGNhbGxpbmcgX19tZW1pbml0IHN0dWZmIGhlcmUgLSB3ZSBoYXZlIENPTkZJR19NRU1PUllfSE9UUExVR1xuMTUyOTpcdCAqL1xuMTUzMDpcdHN0YXRpYyBpbnQgX19hZGRfbWVtb3J5X3Jlc291cmNlKGludCBuaWQsIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBtaHBfdCBtaHBfZmxhZ3MsXG4xNTMxOlx0XHRcdFx0XHQgZW51bSBtbW9wIG9ubGluZV90eXBlKVxuMTUzMjpcdHtcbjE1MzM6XHRcdHN0cnVjdCBtaHBfcGFyYW1zIHBhcmFtcyA9IHsgLnBncHJvdCA9IHBncHJvdF9taHAoUEFHRV9LRVJORUwpIH07XG4xNTM0Olx0XHRlbnVtIG1lbWJsb2NrX2ZsYWdzIG1lbWJsb2NrX2ZsYWdzID0gTUVNQkxPQ0tfTk9ORTtcbjE1MzU6XHRcdHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwID0gTlVMTDtcbjE1MzY6XHRcdHU2NCBzdGFydCwgc2l6ZTtcbjE1Mzc6XHRcdGJvb2wgbmV3X25vZGUgPSBmYWxzZTtcbjE1Mzg6XHRcdGludCByZXQ7XG4xNTM5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3MTYKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA4OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCioqQW5hbHl6aW5nIHRoZSBgbm9kZV9pc19tZW1vcnlsZXNzYCBFeHRyYWN0aW9uKioKClJpZ2h0LCBzbyBgbm9kZV9pc19tZW1vcnlsZXNzYC4uLiB0aGF0IHdhcyBwdWxsZWQgb3V0IG9mIHRoZSBgdHJ5X29mZmxpbmVfbm9kZWAgZnVuY3Rpb24sIEkgcmVtZW1iZXIgdGhhdCBjb2RlLiBJIG5lZWQgdG8gcXVpY2tseSBhc3Nlc3MgdGhlIGltcGFjdCBvZiB0aGlzIHJlZmFjdG9yaW5nLCB3aGF0JiMzOTtzIGl0cyByZWFjaD8gRmlyc3QsIEkmIzM5O2xsIHNjYW4gdGhyb3VnaCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55ICpvdGhlciogY29kZSBtb2RpZmljYXRpb25zIG1hZGUgaW4gdGhhdCBmaWxlIGFyb3VuZCB0aGUgc2FtZSB0aW1lLiBUaGVuLCBhbmQgdGhpcyBpcyBrZXksIEkmIzM5O2xsIG5lZWQgdG8gY29uZmlybSB0aGUgbmV3IGZ1bmN0aW9u4oCZcyBwdXJwb3NlLCBhbmQgY29uZmlybSB0aGF0IGlzIGNvcnJlY3QuIEkgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBpcyBub3QgdXNlZCBhbnl3aGVyZSBlbHNlIChpbiBgX19hZGRfbWVtb3J5X3Jlc291cmNlYCBmb3IgZXhhbXBsZSksIGFzIHRoYXQgbWF5IHNob3cgdGhlIGZ1bmN0aW9uIGlzIGRvaW5nIG1vcmUgdGhhbiBqdXN0IHZlcmlmeWluZyB0aGUgbm9kZSBkb2VzIG5vdCBoYXZlIG1lbW9yeSBhc3NpZ25lZC4gSSYjMzk7bGwgZm9jdXMgbXkgaW5pdGlhbCByZWFkaW5nIGJldHdlZW4gbGluZXMgMTUzMCBhbmQgMTU3MC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2Qgb3ZlcnZpZXcgb2YgdGhlIGltbWVkaWF0ZSBjb250ZXh0IGFuZCB1c2FnZSBvZiBgbm9kZV9pc19tZW1vcnlsZXNzYC4gVGltZSB0byBkaXZlIGluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeV9ob3RwbHVnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNTMwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE1MzA6XHRzdGF0aWMgaW50IF9fYWRkX21lbW9yeV9yZXNvdXJjZShpbnQgbmlkLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgbWhwX3QgbWhwX2ZsYWdzLFxuMTUzMTpcdFx0XHRcdFx0IGVudW0gbW1vcCBvbmxpbmVfdHlwZSlcbjE1MzI6XHR7XG4xNTMzOlx0XHRzdHJ1Y3QgbWhwX3BhcmFtcyBwYXJhbXMgPSB7IC5wZ3Byb3QgPSBwZ3Byb3RfbWhwKFBBR0VfS0VSTkVMKSB9O1xuMTUzNDpcdFx0ZW51bSBtZW1ibG9ja19mbGFncyBtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX05PTkU7XG4xNTM1Olx0XHRzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCA9IE5VTEw7XG4xNTM2Olx0XHR1NjQgc3RhcnQsIHNpemU7XG4xNTM3Olx0XHRib29sIG5ld19ub2RlID0gZmFsc2U7XG4xNTM4Olx0XHRpbnQgcmV0O1xuMTUzOTpcdFxuMTU0MDpcdFx0c3RhcnQgPSByZXMtXHUwMDNlc3RhcnQ7XG4xNTQxOlx0XHRzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpO1xuMTU0MjpcdFxuMTU0MzpcdFx0cmV0ID0gY2hlY2tfaG90cGx1Z19tZW1vcnlfcmFuZ2Uoc3RhcnQsIHNpemUpO1xuMTU0NDpcdFx0aWYgKHJldClcbjE1NDU6XHRcdFx0cmV0dXJuIHJldDtcbjE1NDY6XHRcbjE1NDc6XHRcdGlmIChtaHBfZmxhZ3MgXHUwMDI2IE1IUF9OSURfSVNfTUdJRCkge1xuMTU0ODpcdFx0XHRncm91cCA9IG1lbW9yeV9ncm91cF9maW5kX2J5X2lkKG5pZCk7XG4xNTQ5Olx0XHRcdGlmICghZ3JvdXApXG4xNTUwOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4xNTUxOlx0XHRcdG5pZCA9IGdyb3VwLVx1MDAzZW5pZDtcbjE1NTI6XHRcdH1cbjE1NTM6XHRcbjE1NTQ6XHRcdGlmICghbm9kZV9wb3NzaWJsZShuaWQpKSB7XG4xNTU1Olx0XHRcdFdBUk4oMSwgXCYjMzQ7bm9kZSAlZCB3YXMgYWJzZW50IGZyb20gdGhlIG5vZGVfcG9zc2libGVfbWFwXFxuXCYjMzQ7LCBuaWQpO1xuMTU1NjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjE1NTc6XHRcdH1cbjE1NTg6XHRcbjE1NTk6XHRcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XG4xNTYwOlx0XG4xNTYxOlx0XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJDSF9LRUVQX01FTUJMT0NLKSkge1xuMTU2MjpcdFx0XHRpZiAocmVzLVx1MDAzZWZsYWdzIFx1MDAyNiBJT1JFU09VUkNFX1NZU1JBTV9EUklWRVJfTUFOQUdFRClcbjE1NjM6XHRcdFx0XHRtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX0RSSVZFUl9NQU5BR0VEO1xuMTU2NDpcdFx0XHRyZXQgPSBtZW1ibG9ja19hZGRfbm9kZShzdGFydCwgc2l6ZSwgbmlkLCBtZW1ibG9ja19mbGFncyk7XG4xNTY1Olx0XHRcdGlmIChyZXQpXG4xNTY2Olx0XHRcdFx0Z290byBlcnJvcl9tZW1faG90cGx1Z19lbmQ7XG4xNTY3Olx0XHR9XG4xNTY4Olx0XG4xNTY5Olx0XHRyZXQgPSBfX3RyeV9vbmxpbmVfbm9kZShuaWQsIGZhbHNlKTtcbjE1NzA6XHRcdGlmIChyZXQgXHUwMDNjIDApXG4xNTcxOlx0XHRcdGdvdG8gZXJyb3JfbWVtYmxvY2tfcmVtb3ZlO1xuMTU3MjpcdFx0aWYgKHJldCkge1xuMTU3MzpcdFx0XHRub2RlX3NldF9vbmxpbmUobmlkKTtcbjE1NzQ6XHRcdFx0cmV0ID0gcmVnaXN0ZXJfbm9kZShuaWQpO1xuMTU3NTpcdFx0XHRpZiAoV0FSTl9PTihyZXQpKSB7XG4xNTc2Olx0XHRcdFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xuMTU3NzpcdFx0XHRcdGdvdG8gZXJyb3JfbWVtYmxvY2tfcmVtb3ZlO1xuMTU3ODpcdFx0XHR9XG4xNTc5Olx0XHRcdG5ld19ub2RlID0gdHJ1ZTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTgyNQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipEaWdnaW5nIGludG8gYHRyeV9vZmZsaW5lX25vZGVgKioKCk9rYXksIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IGB0cnlfb2ZmbGluZV9ub2RlYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDIyNTAuIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhhdCB0aGlzIGZ1bmN0aW9uIGxpa2VseSBoYW5kbGVzIHRoZSBsb2dpYyBmb3IgZGVhbGluZyB3aXRoIGEgbm9kZSB0aGF0IGhhcyBnb25lIG9mZmxpbmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nICphcm91bmQqIHRoYXQgc3BlY2lmaWMgbGluZSB0byBnZXQgYSBncmFzcCBvZiB0aGUgZW50aXJlIGZsb3cuIEl0JiMzOTtzIHVzdWFsbHkgbm90IGVub3VnaCB0byBqdXN0IGxvb2sgYXQgYSBzaW5nbGUgbGluZSBpbiBhIGNvbXBsZXggc3lzdGVtIGxpa2UgdGhpcy4gQ29udGV4dCBpcyBrZXksIGFuZCB0aGUgc3Vycm91bmRpbmcgY29kZSBpcyBnb2luZyB0byBnaXZlIG1lIHRoYXQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucyBhbmQgZXJyb3IgaGFuZGxpbmcgaGVyZS4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBzdXJyb3VuZGluZyBsb2dpYyBpcyB0cnlpbmcgdG8gYWNoaWV2ZS4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2Ugd2hhdCB0cmlnZ2VycyB0aGlzIGZ1bmN0aW9uLCB3aGF0IGFyZSBpdHMgaW5wdXRzIGFuZCBvdXRwdXRzLCBhbmQgd2hhdCBzdWJzZXF1ZW50IGFjdGlvbnMgaXQgdGFrZXMuIExldCYjMzk7cyBkaWcgaW4gYW5kIGZpZ3VyZSB0aGlzIG91dC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjI0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMjQwOlx0XHRcdFx0ICovXG4yMjQxOlx0XHRcdFx0cmV0dXJuIC1FQlVTWTtcbjIyNDI6XHRcdH1cbjIyNDM6XHRcbjIyNDQ6XHRcdHJldHVybiAwO1xuMjI0NTpcdH1cbjIyNDY6XHRcbjIyNDc6XHQvKipcbjIyNDg6XHQgKiB0cnlfb2ZmbGluZV9ub2RlXG4yMjQ5Olx0ICogQG5pZDogdGhlIG5vZGUgSURcbjIyNTA6XHQgKlxuMjI1MTpcdCAqIE9mZmxpbmUgYSBub2RlIGlmIGFsbCBtZW1vcnkgc2VjdGlvbnMgYW5kIGNwdXMgb2YgdGhlIG5vZGUgYXJlIHJlbW92ZWQuXG4yMjUyOlx0ICpcbjIyNTM6XHQgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcbjIyNTQ6XHQgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyBiZWZvcmUgdGhpcyBjYWxsLlxuMjI1NTpcdCAqL1xuMjI1NjpcdHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxuMjI1NzpcdHtcbjIyNTg6XHRcdGlmICghbm9kZV9pc19tZW1vcnlsZXNzKG5pZCkpXG4yMjU5Olx0XHRcdHJldHVybjtcbjIyNjA6XHRcbjIyNjE6XHRcdGlmIChjaGVja19jcHVfb25fbm9kZShuaWQpKVxuMjI2MjpcdFx0XHRyZXR1cm47XG4yMjYzOlx0XG4yMjY0Olx0XHQvKlxuMjI2NTpcdFx0ICogYWxsIG1lbW9yeS9jcHUgb2YgdGhpcyBub2RlIGFyZSByZW1vdmVkLCB3ZSBjYW4gb2ZmbGluZSB0aGlzXG4yMjY2Olx0XHQgKiBub2RlIG5vdy5cbjIyNjc6XHRcdCAqL1xuMjI2ODpcdFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xuMjI2OTpcdFx0dW5yZWdpc3Rlcl9ub2RlKG5pZCk7XG4yMjcwOlx0fVxuMjI3MTpcdEVYUE9SVF9TWU1CT0wodHJ5X29mZmxpbmVfbm9kZSk7XG4yMjcyOlx0XG4yMjczOlx0c3RhdGljIGludCBtZW1vcnlfYmxvY2tzX2hhdmVfYWx0bWFwcyh1NjQgc3RhcnQsIHU2NCBzaXplKVxuMjI3NDpcdHtcbjIyNzU6XHRcdHU2NCBudW1fbWVtYmxvY2tzID0gc2l6ZSAvIG1lbW9yeV9ibG9ja19zaXplX2J5dGVzKCk7XG4yMjc2Olx0XHR1NjQgbnVtX2FsdG1hcHMgPSAwO1xuMjI3NzpcdFxuMjI3ODpcdFx0aWYgKCFtaHBfbWVtbWFwX29uX21lbW9yeSgpKVxuMjI3OTpcdFx0XHRyZXR1cm4gMDtcbjIyODA6XHRcbjIyODE6XHRcdHdhbGtfbWVtb3J5X2Jsb2NrcyhzdGFydCwgc2l6ZSwgXHUwMDI2bnVtX2FsdG1hcHMsXG4yMjgyOlx0XHRcdFx0ICAgY291bnRfbWVtb3J5X3JhbmdlX2FsdG1hcHNfY2IpO1xuMjI4MzpcdFxuMjI4NDpcdFx0aWYgKG51bV9hbHRtYXBzID09IDApXG4yMjg1Olx0XHRcdHJldHVybiAwO1xuMjI4NjpcdFxuMjI4NzpcdFx0aWYgKFdBUk5fT05fT05DRShudW1fbWVtYmxvY2tzICE9IG51bV9hbHRtYXBzKSlcbjIyODg6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMjg5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY3MzQKCQkJCQkJCW91dHB1dDogMTQ0CgkJCQkJCQl0aG91Z2h0czogNDkwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIE1lbW9yeSBIb3RwbHVnIFJlZmFjdG9yaW5nKioKCk9rYXksIHNvIHRoaXMgZGlmZiBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgaXMgZXNzZW50aWFsbHkgYSByZWZhY3RvcmluZy4gVGhleSYjMzk7dmUgdGFrZW4gdGhlIGV4aXN0aW5nIGxvZ2ljIGluIGB0cnlfb2ZmbGluZV9ub2RlYCBhbmQgYGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiYCBhbmQgY29uc29saWRhdGVkIGl0IGludG8gYSBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uLCBgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpYC4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gc2NhbiBmb3IgYW55IHBvdGVudGlhbCByaXNrczogdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGBjb3B5X3RvX3VzZXJgIGNhbGxzIHRoYXQgY291bGQgbGVhayBpbmZvcm1hdGlvbiwgb3IgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4KCkxldCBtZSBicmVhayBkb3duIHRoZSBjb2RlOgoKMS4gIGBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYmAgZ2V0cyBgJmFtcDtuaWRgLCBkZXJlZmVyZW5jZXMgdG8gZ2V0IHRoZSBub2RlIGlkLCB0aGVuIGNvbXBhcmVzIHRvIGBtZW0tJmd0O25pZGAuCjIuICBgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpYCBjaGVja3MgaWYgdGhlIG5vZGUgaGFzIGFueSBzcGFubmVkIHBhZ2VzIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBtZW1vcnkgYmxvY2tzIG9uIHRoZSBub2RlIHZpYSB0aGUgY2FsbGJhY2suCjMuICBgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKWAgdGhlbiBjYWxscyB0aGlzIG5ldyBoZWxwZXIuCgpBZnRlciBhIHRob3JvdWdoIGxvb2ssIEkmIzM5O20gbm90IHNlZWluZyBhbnl0aGluZyB0aGF0IHJhaXNlcyBhIHJlZCBmbGFnOgoKKiAgIE5vIHVzZXItc3BhY2UgY29waWVzIG9yIHBvdGVudGlhbCBpbmZvcm1hdGlvbiBsZWFrcy4KKiAgIE5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcyBvciBidWZmZXJzIGludHJvZHVjZWQuCiogICBObyBjb21wbGV4IGFsbG9jYXRpb25zIG9yIHVzYWdlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4KKiAgIEl0JiMzOTtzIGEgcHVyZSBjb250cm9sLWZsb3cgcmVmYWN0b3JpbmcuCgpUaGVyZWZvcmUsIE5lZWRzS01TQU4gc2hvdWxkIGJlIGZhbHNlLgoKTGV0IG1lIHNvbGlkaWZ5IG15IHJlYXNvbmluZy4gVGhlIGV4aXN0aW5nIHNhbml0aXplcnMsIHBhcnRpY3VsYXJseSBLQVNBTiwgaGFuZGxlIGdlbmVyYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIGFuZCBsb2NrZGVwIGlzIHRoZXJlIGZvciBsb2NraW5nIGlzc3VlcywgYm90aCBvZiB3aGljaCBhcmUgb3J0aG9nb25hbCB0byB0aGlzIHBhdGNoLiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZm9yIGRldGVjdGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MgYW5kIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UuIFRoaXMgcGF0Y2ggc2ltcGx5IHJlc3RydWN0dXJlcyAqZXhpc3RpbmcqIGxvZ2ljIGZvciBjaGVja2luZyBpZiBhIG5vZGUgaXMgbWVtb3J5bGVzcy4gTm8gbmV3IG1lbW9yeSBpcyBiZWluZyBhbGxvY2F0ZWQsIG5vIGNvcGllcyB0byB1c2VyLXNwYWNlIGFyZSBiZWluZyBpbnRyb2R1Y2VkLCBhbmQgbm8gbmV3IHNvdXJjZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYXJlIGludm9sdmVkLiBHaXZlbiB0aGlzLCBLTVNBTiB3b3VsZG4mIzM5O3QgcmV2ZWFsIGFueXRoaW5nIHRoYXQgaXNuJiMzOTt0IGFscmVhZHkgaGFuZGxlZCBieSBvdGhlciBydW50aW1lIHNhbml0aXplcnMuIFJ1bm5pbmcgS01TQU4gb24gdGhpcyB3b3VsZCBiZSBhIHdhc3RlIG9mIHJlc291cmNlcy4KCk9rYXksIEkmIzM5O20gcmVhZHkgdG8gYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaXMgYSBwdXJlIHJlZmFjdG9yaW5nIGluIG1tL21lbW9yeV9ob3RwbHVnLmMgdGhhdCBleHRyYWN0cyB0aGUgY2hlY2sgZGV0ZXJtaW5pbmcgaWYgYSBOVU1BIG5vZGUgaXMgbWVtb3J5bGVzcyAoY2hlY2tpbmcgbm9kZV9zcGFubmVkX3BhZ2VzIGFuZCBpdGVyYXRpbmcgbWVtb3J5IGJsb2NrcykgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gbm9kZV9pc19tZW1vcnlsZXNzKCkuIE5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIHBhdGh3YXlzIGFyZSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nOyBzdGFuZGFyZCBzYW5pdGl6ZXJzIGFuZCB0ZXN0IHN1aXRlcyAoS0FTQU4sIExPQ0tERVApIGFyZSBzdWZmaWNpZW50LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaXMgYSBwdXJlIHJlZmFjdG9yaW5nIGluIG1tL21lbW9yeV9ob3RwbHVnLmMgdGhhdCBleHRyYWN0cyB0aGUgY2hlY2sgZGV0ZXJtaW5pbmcgaWYgYSBOVU1BIG5vZGUgaXMgbWVtb3J5bGVzcyAoY2hlY2tpbmcgbm9kZV9zcGFubmVkX3BhZ2VzIGFuZCBpdGVyYXRpbmcgbWVtb3J5IGJsb2NrcykgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gbm9kZV9pc19tZW1vcnlsZXNzKCkuIE5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIHBhdGh3YXlzIGFyZSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nOyBzdGFuZGFyZCBzYW5pdGl6ZXJzIGFuZCB0ZXN0IHN1aXRlcyAoS0FTQU4sIExPQ0tERVApIGFyZSBzdWZmaWNpZW50LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMDo0OC4wNTQ5Mzk1MjVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjkyMzQzNzE5MTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNT1JZX0hPVFBMVUdcIixcbiAgICBcIk1FTU9SWV9IT1RSRU1PVkVcIixcbiAgICBcIk5VTUFcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnlfb2ZmbGluZV9ub2RlXCIsXG4gICAgXCJub2RlX2lzX21lbW9yeWxlc3NcIixcbiAgICBcInRyeV9yZW1vdmVfbWVtb3J5XCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpcyBhIHB1cmUgcmVmYWN0b3JpbmcgaW4gbW0vbWVtb3J5X2hvdHBsdWcuYyB0aGF0IGV4dHJhY3RzIHRoZSBjaGVjayBkZXRlcm1pbmluZyBpZiBhIE5VTUEgbm9kZSBpcyBtZW1vcnlsZXNzIChjaGVja2luZyBub2RlX3NwYW5uZWRfcGFnZXMgYW5kIGl0ZXJhdGluZyBtZW1vcnkgYmxvY2tzKSBpbnRvIGEgc3RhdGljIGhlbHBlciBmdW5jdGlvbiBub2RlX2lzX21lbW9yeWxlc3MoKS4gTm8gbmV3IGFsbG9jYXRpb25zLCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgZGF0YSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgcGF0aHdheXMgYXJlIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGZ1enppbmc7IHN0YW5kYXJkIHNhbml0aXplcnMgYW5kIHRlc3Qgc3VpdGVzIChLQVNBTiwgTE9DS0RFUCkgYXJlIHN1ZmZpY2llbnQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBtZW1vcnkgaG90cGx1ZyBjb2RlIChtbS9tZW1vcnlfaG90cGx1Zy5jKSwgZXh0cmFjdGluZyBub2RlIG1lbW9yeWxlc3MgY2hlY2tzIGludG8gbm9kZV9pc19tZW1vcnlsZXNzKCkgdXNlZCBkdXJpbmcgTlVNQSBub2RlIG9mZmxpbmluZyBpbiB0cnlfb2ZmbGluZV9ub2RlKCkuIFRoaXMgaXMgcmVhY2hhYmxlIHZpYSBtZW1vcnkgaG90LXVucGx1ZyBvcGVyYXRpb25zIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMDo0OC4wNTQ5NDU2NjVaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQxOTAxNTMxMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGE1M2UxOWEwYjZkMjRiMjAxNDlkMDRiMzVhMDFmNWE1OTUwMWVkZmFcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBTZXAgMyAxOTozMDo0NyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xcbmluZGV4IDIyNmFiOWNiMDc4YWQuLmQwZTk0MDU3NjgyYWYgMTAwNjQ0XFxuLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuY1xcbisrKyBiL21tL21lbW9yeV9ob3RwbHVnLmNcXG5AQCAtMTQ5MSw2ICsxNDkxLDM2IEBAIHN0YXRpYyBpbnQgY3JlYXRlX2FsdG1hcHNfYW5kX21lbW9yeV9ibG9ja3MoaW50IG5pZCwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsXFxuIFxcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXFxuK3tcXG4rXFx0aW50IG5pZCA9ICooaW50ICopYXJnO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XFxuK1xcdCAqIHJlbGlhYmxlLiBIb3dldmVyLCBzdWNoIGJsb2NrcyBhcmUgYWx3YXlzIG9ubGluZSAoZS5nLiwgY2Fubm90IGdldFxcbitcXHQgKiBvZmZsaW5lZCkgYW5kLCB0aGVyZWZvcmUsIGFyZSBzdGlsbCBzcGFubmVkIGJ5IHRoZSBub2RlLlxcbitcXHQgKi9cXG4rXFx0cmV0dXJuIG1lbS1cXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xcbit9XFxuK1xcbisvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xcbitzdGF0aWMgYm9vbCBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClcXG4re1xcbitcXHQvKlxcbitcXHQgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdFxcbitcXHQgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksXFxuK1xcdCAqIGUuZy4gb25jZSBhIG1lbW9yeSBibG9jayBoYXMgYmVlbiBvbmxpbmVkLlxcbitcXHQgKi9cXG4rXFx0aWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdC8qXFxuK1xcdCAqIE9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtYXkgbm90IGJlIHNwYW5uZWQgYnkgdGhlIG5vZGUgeWV0LCBidXQgdGhleVxcbitcXHQgKiBsaW5rIHRvIGl0IGluIHN5c2ZzIGFuZCBjYW4gYmUgb25saW5lZCBsYXRlciwgc28gdGhlIG5vZGUgaXMgbm90XFxuK1xcdCAqIG1lbW9yeWxlc3Mgd2hpbGUgYW55IHJlbWFpbi5cXG4rXFx0ICovXFxuK1xcdHJldHVybiAhZm9yX2VhY2hfbWVtb3J5X2Jsb2NrKFxcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcXG4rfVxcbitcXG4gLypcXG4gICogTk9URTogVGhlIGNhbGxlciBtdXN0IGNhbGwgbG9ja19kZXZpY2VfaG90cGx1ZygpIHRvIHNlcmlhbGl6ZSBob3RwbHVnXFxuICAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuXFxuQEAgLTIyMTQsMTggKzIyNDQsNiBAQCBzdGF0aWMgaW50IGNoZWNrX2NwdV9vbl9ub2RlKGludCBuaWQpXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxcbi17XFxuLVxcdGludCBuaWQgPSAqKGludCAqKWFyZztcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIElmIGEgbWVtb3J5IGJsb2NrIGJlbG9uZ3MgdG8gbXVsdGlwbGUgbm9kZXMsIHRoZSBzdG9yZWQgbmlkIGlzIG5vdFxcbi1cXHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcXG4tXFx0ICogb2ZmbGluZWQpIGFuZCwgdGhlcmVmb3JlLCBhcmUgc3RpbGwgc3Bhbm5lZCBieSB0aGUgbm9kZS5cXG4tXFx0ICovXFxuLVxcdHJldHVybiBtZW0tXFx1MDAzZW5pZCA9PSBuaWQgPyAtRUVYSVNUIDogMDtcXG4tfVxcbi1cXG4gLyoqXFxuICAqIHRyeV9vZmZsaW5lX25vZGVcXG4gICogQG5pZDogdGhlIG5vZGUgSURcXG5AQCAtMjIzNywyMyArMjI1NSw3IEBAIHN0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXFxuICAqL1xcbiB2b2lkIHRyeV9vZmZsaW5lX25vZGUoaW50IG5pZClcXG4ge1xcbi1cXHRpbnQgcmM7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBJZiB0aGUgbm9kZSBzdGlsbCBzcGFucyBwYWdlcyAoZXNwZWNpYWxseSBaT05FX0RFVklDRSksIGRvbid0XFxuLVxcdCAqIG9mZmxpbmUgaXQuIEEgbm9kZSBzcGFucyBtZW1vcnkgYWZ0ZXIgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSgpLFxcbi1cXHQgKiBlLmcuLCBhZnRlciB0aGUgbWVtb3J5IGJsb2NrIHdhcyBvbmxpbmVkLlxcbi1cXHQgKi9cXG4tXFx0aWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKVxcbi1cXHRcXHRyZXR1cm47XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBFc3BlY2lhbGx5IG9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtaWdodCBub3QgYmUgc3Bhbm5lZCBieSB0aGVcXG4tXFx0ICogbm9kZS4gVGhleSB3aWxsIGdldCBzcGFubmVkIGJ5IHRoZSBub2RlIG9uY2UgdGhleSBnZXQgb25saW5lZC5cXG4tXFx0ICogSG93ZXZlciwgdGhleSBsaW5rIHRvIHRoZSBub2RlIGluIHN5c2ZzIGFuZCBjYW4gZ2V0IG9ubGluZWQgbGF0ZXIuXFxuLVxcdCAqL1xcbi1cXHRyYyA9IGZvcl9lYWNoX21lbW9yeV9ibG9jayhcXHUwMDI2bmlkLCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYik7XFxuLVxcdGlmIChyYylcXG4rXFx0aWYgKCFub2RlX2lzX21lbW9yeWxlc3MobmlkKSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4gXFx0aWYgKGNoZWNrX2NwdV9vbl9ub2RlKG5pZCkpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMwOjQ4LjQ3NDc0NjEzN1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTQ4MTc4NTIzNzUzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTU9SWV9IT1RQTFVHXCIsXG4gICAgXCJNRU1PUllfSE9UUkVNT1ZFXCIsXG4gICAgXCJOVU1BXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ5X29mZmxpbmVfbm9kZVwiLFxuICAgIFwibm9kZV9pc19tZW1vcnlsZXNzXCIsXG4gICAgXCJ0cnlfcmVtb3ZlX21lbW9yeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IGhvdHBsdWcgY29kZSAobW0vbWVtb3J5X2hvdHBsdWcuYyksIGV4dHJhY3Rpbmcgbm9kZSBtZW1vcnlsZXNzIGNoZWNrcyBpbnRvIG5vZGVfaXNfbWVtb3J5bGVzcygpIHVzZWQgZHVyaW5nIE5VTUEgbm9kZSBvZmZsaW5pbmcgaW4gdHJ5X29mZmxpbmVfbm9kZSgpLiBUaGlzIGlzIHJlYWNoYWJsZSB2aWEgbWVtb3J5IGhvdC11bnBsdWcgb3BlcmF0aW9ucyBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhNTNlMTlhMGI2ZDI0YjIwMTQ5ZDA0YjM1YTAxZjVhNTk1MDFlZGZhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAxOTozMDo0NyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jXG5pbmRleCAyMjZhYjljYjA3OGFkLi5kMGU5NDA1NzY4MmFmIDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuY1xuKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xuQEAgLTE0OTEsNiArMTQ5MSwzNiBAQCBzdGF0aWMgaW50IGNyZWF0ZV9hbHRtYXBzX2FuZF9tZW1vcnlfYmxvY2tzKGludCBuaWQsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLFxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4rc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbit7XG4rXHRpbnQgbmlkID0gKihpbnQgKilhcmc7XG4rXG4rXHQvKlxuK1x0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XG4rXHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbitcdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXG4rXHQgKi9cbitcdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuK31cbitcbisvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xuK3N0YXRpYyBib29sIG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKVxuK3tcbitcdC8qXG4rXHQgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdFxuK1x0ICogbWVtb3J5bGVzcy4gIEEgbm9kZSBzcGFucyBtZW1vcnkgYWZ0ZXIgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSgpLFxuK1x0ICogZS5nLiBvbmNlIGEgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIG9ubGluZWQuXG4rXHQgKi9cbitcdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0LypcbitcdCAqIE9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtYXkgbm90IGJlIHNwYW5uZWQgYnkgdGhlIG5vZGUgeWV0LCBidXQgdGhleVxuK1x0ICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdFxuK1x0ICogbWVtb3J5bGVzcyB3aGlsZSBhbnkgcmVtYWluLlxuK1x0ICovXG4rXHRyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbit9XG4rXG4gLypcbiAgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcbiAgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyAodHJpZ2dlcmVkIGUuZy4gYnkgc3lzZnMpLlxuQEAgLTIyMTQsMTggKzIyNDQsNiBAQCBzdGF0aWMgaW50IGNoZWNrX2NwdV9vbl9ub2RlKGludCBuaWQpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbi17XG4tXHRpbnQgbmlkID0gKihpbnQgKilhcmc7XG4tXG4tXHQvKlxuLVx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XG4tXHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbi1cdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXG4tXHQgKi9cbi1cdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuLX1cbi1cbiAvKipcbiAgKiB0cnlfb2ZmbGluZV9ub2RlXG4gICogQG5pZDogdGhlIG5vZGUgSURcbkBAIC0yMjM3LDIzICsyMjU1LDcgQEAgc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbiAgKi9cbiB2b2lkIHRyeV9vZmZsaW5lX25vZGUoaW50IG5pZClcbiB7XG4tXHRpbnQgcmM7XG4tXG4tXHQvKlxuLVx0ICogSWYgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpLCBkb24ndFxuLVx0ICogb2ZmbGluZSBpdC4gQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksXG4tXHQgKiBlLmcuLCBhZnRlciB0aGUgbWVtb3J5IGJsb2NrIHdhcyBvbmxpbmVkLlxuLVx0ICovXG4tXHRpZiAobm9kZV9zcGFubmVkX3BhZ2VzKG5pZCkpXG4tXHRcdHJldHVybjtcbi1cbi1cdC8qXG4tXHQgKiBFc3BlY2lhbGx5IG9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtaWdodCBub3QgYmUgc3Bhbm5lZCBieSB0aGVcbi1cdCAqIG5vZGUuIFRoZXkgd2lsbCBnZXQgc3Bhbm5lZCBieSB0aGUgbm9kZSBvbmNlIHRoZXkgZ2V0IG9ubGluZWQuXG4tXHQgKiBIb3dldmVyLCB0aGV5IGxpbmsgdG8gdGhlIG5vZGUgaW4gc3lzZnMgYW5kIGNhbiBnZXQgb25saW5lZCBsYXRlci5cbi1cdCAqL1xuLVx0cmMgPSBmb3JfZWFjaF9tZW1vcnlfYmxvY2soXHUwMDI2bmlkLCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYik7XG4tXHRpZiAocmMpXG4rXHRpZiAoIW5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpKVxuIFx0XHRyZXR1cm47XG4gXG4gXHRpZiAoY2hlY2tfY3B1X29uX25vZGUobmlkKSlcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMwOjQ4LjQ3NDc0Nzc4N1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE0ODQ5ODE2ODYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IEhvdHBsdWcgUGF0Y2gqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGluLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyBhbHdheXMgdG8gZGlzc2VjdCB0aGUgcGF0Y2ggaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29kZSBjaGFuZ2VzIGRpcmVjdGx5LiBJJ2xsIHRoZW4gbW92ZSBvbiB0byBwaW5wb2ludGluZyB3aGVyZSB0aGUga2V5IGZ1bmN0aW9ucywgYG5vZGVfaXNfbWVtb3J5bGVzc2Agb3IgYHRyeV9vZmZsaW5lX25vZGVgLCBhcmUgYWN0dWFsbHkgYmVpbmcgKnVzZWQqLiBBIHF1aWNrIGByZWFkLWZpbGVgIG9yIGBncmVwcGVyYCBzY2FuIG9mIHRoZSBjb2RlYmFzZSBpcyBteSBnby10byBhcHByb2FjaCBoZXJlLiBTcGVjaWZpY2FsbHksIEknbGwgYmUgdGFyZ2V0aW5nIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4gSSB3YW50IHRvIHNlZSBpZiBgbm9kZV9pc19tZW1vcnlsZXNzYCBpcyBiZWluZyBsZXZlcmFnZWQgYW55d2hlcmUgZWxzZSBpbiB0aGF0IGZpbGUgYmV5b25kIHRoZSBpbW1lZGlhdGUgc2NvcGUgb2YgdGhlIHBhdGNoLCBhbmQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbCBzdHJ1Y3R1cmUgd2l0aCBgdHJ5X29mZmxpbmVfbm9kZWAuIEEgZ29vZCBgZ3JlcGAgb3IgZGlyZWN0IGBtbS9tZW1vcnlfaG90cGx1Zy5jYCByZWFkaW5nIGlzIHdoYXQgSSBuZWVkIGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM2NDcsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMxOjAzLjMyNDU2NzE3WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY0NzAyNTU3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5vZGVfaXNfbWVtb3J5bGVzc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeV9ob3RwbHVnLmM9MTQ5ND1zdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNTA2LS8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxNTA3OnN0YXRpYyBib29sIG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTUwOC17XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIyNTY9dm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjU3LXtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyNTg6XFx0aWYgKCFub2RlX2lzX21lbW9yeWxlc3MobmlkKSlcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNTktXFx0XFx0cmV0dXJuO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMTowMy4zODkyNzYyMzdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDkyMDA1NjU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy5cblxuKipJbnZlc3RpZ2F0aW5nIGEgQ29kZSBTZWdtZW50IGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCoqXG5cbkFscmlnaHQsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbiBhcm91bmQgbGluZXMgMTQ5MC0xNTUwIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHpvb20gb3V0IGEgYml0IGFuZCBnZXQgc29tZSBjb250ZXh0LiBJIHdhbnQgdG8gc2VlIGlmIHRoaXMgcGFydGljdWxhciBwaWVjZSBvZiBjb2RlIGlzIGp1c3QgYSBzdGFuZGFsb25lIGZ1bmN0aW9uLCBvciBpZiBpdCdzIHBhcnQgb2YgYSBsYXJnZXIsIHBvdGVudGlhbGx5IHJlbGF0ZWQgc2VyaWVzIG9mIGNhbGxzIHdpdGhpbiB0aGUgaG90cGx1ZyBzdWJzeXN0ZW0uIElzIHRoaXMgbGluZSBwYXJ0IG9mIGEgYnJvYWRlciByZWZhY3RvcmluZyBlZmZvcnQgb3Igc29tZSBraW5kIG9mIHNlcXVlbnRpYWwgcHJvY2Vzc2luZz8gVW5kZXJzdGFuZGluZyB0aGUgc3Vycm91bmRpbmcgY29kZSB3aWxsIGxpa2VseSBiZSBrZXkgdG8gZmlndXJpbmcgb3V0IHRoZSBvdmVyYWxsIGludGVudCBhbmQgcG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIHNwZWNpZmljIHJhbmdlLiBJJ20gZ29pbmcgdG8gc3RhcnQgYnkgcXVpY2tseSBzY2FubmluZyB0aGUgY2FsbCBncmFwaCBhbmQgYW55IG5lYXJieSBjb21tZW50cyB0byBzZWUgaG93IHRoaXMgZml0cyBpbnRvIHRoZSBiaWdnZXIgcGljdHVyZSBvZiBtZW1vcnkgaG90cGx1Z2dpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQxNzAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMTowNS44ODEyODM3NjJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzY2MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNDgwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNDgwOlxcdFxcdFxcdGlmIChyZXQpIHtcXG4xNDgxOlxcdFxcdFxcdFxcdGFyY2hfcmVtb3ZlX21lbW9yeShjdXJfc3RhcnQsIG1lbWJsb2NrX3NpemUsIHBhcmFtcy5hbHRtYXAsIE5VTEwpO1xcbjE0ODI6XFx0XFx0XFx0XFx0YWx0bWFwX2ZyZWUocGFyYW1zLmFsdG1hcCk7XFxuMTQ4MzpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4xNDg0OlxcdFxcdFxcdH1cXG4xNDg1OlxcdFxcdH1cXG4xNDg2OlxcdFxcbjE0ODc6XFx0XFx0cmV0dXJuIDA7XFxuMTQ4ODpcXHRvdXQ6XFxuMTQ4OTpcXHRcXHRpZiAocmV0IFxcdTAwMjZcXHUwMDI2IGN1cl9zdGFydCAhPSBzdGFydClcXG4xNDkwOlxcdFxcdFxcdHJlbW92ZV9tZW1vcnlfYmxvY2tzX2FuZF9hbHRtYXBzKHN0YXJ0LCBjdXJfc3RhcnQgLSBzdGFydCk7XFxuMTQ5MTpcXHRcXHRyZXR1cm4gcmV0O1xcbjE0OTI6XFx0fVxcbjE0OTM6XFx0XFxuMTQ5NDpcXHRzdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxcbjE0OTU6XFx0e1xcbjE0OTY6XFx0XFx0aW50IG5pZCA9ICooaW50ICopYXJnO1xcbjE0OTc6XFx0XFxuMTQ5ODpcXHRcXHQvKlxcbjE0OTk6XFx0XFx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XFxuMTUwMDpcXHRcXHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcXG4xNTAxOlxcdFxcdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXFxuMTUwMjpcXHRcXHQgKi9cXG4xNTAzOlxcdFxcdHJldHVybiBtZW0tXFx1MDAzZW5pZCA9PSBuaWQgPyAtRUVYSVNUIDogMDtcXG4xNTA0OlxcdH1cXG4xNTA1OlxcdFxcbjE1MDY6XFx0LyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgbWVtb3J5IGhvdHBsdWcgbG9jayBmb3IgdGhpcyBjaGVjay4gKi9cXG4xNTA3OlxcdHN0YXRpYyBib29sIG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKVxcbjE1MDg6XFx0e1xcbjE1MDk6XFx0XFx0LypcXG4xNTEwOlxcdFxcdCAqIEEgbm9kZSBzdGlsbCBzcGFubmluZyBwYWdlcyAoZXNwZWNpYWxseSBaT05FX0RFVklDRSkgaXMgbm90XFxuMTUxMTpcXHRcXHQgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksXFxuMTUxMjpcXHRcXHQgKiBlLmcuIG9uY2UgYSBtZW1vcnkgYmxvY2sgaGFzIGJlZW4gb25saW5lZC5cXG4xNTEzOlxcdFxcdCAqL1xcbjE1MTQ6XFx0XFx0aWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKVxcbjE1MTU6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbjE1MTY6XFx0XFx0LypcXG4xNTE3OlxcdFxcdCAqIE9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtYXkgbm90IGJlIHNwYW5uZWQgYnkgdGhlIG5vZGUgeWV0LCBidXQgdGhleVxcbjE1MTg6XFx0XFx0ICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdFxcbjE1MTk6XFx0XFx0ICogbWVtb3J5bGVzcyB3aGlsZSBhbnkgcmVtYWluLlxcbjE1MjA6XFx0XFx0ICovXFxuMTUyMTpcXHRcXHRyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jayhcXHUwMDI2bmlkLCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYik7XFxuMTUyMjpcXHR9XFxuMTUyMzpcXHRcXG4xNTI0OlxcdC8qXFxuMTUyNTpcXHQgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcXG4xNTI2OlxcdCAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuXFxuMTUyNzpcXHQgKlxcbjE1Mjg6XFx0ICogd2UgYXJlIE9LIGNhbGxpbmcgX19tZW1pbml0IHN0dWZmIGhlcmUgLSB3ZSBoYXZlIENPTkZJR19NRU1PUllfSE9UUExVR1xcbjE1Mjk6XFx0ICovXFxuMTUzMDpcXHRzdGF0aWMgaW50IF9fYWRkX21lbW9yeV9yZXNvdXJjZShpbnQgbmlkLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgbWhwX3QgbWhwX2ZsYWdzLFxcbjE1MzE6XFx0XFx0XFx0XFx0XFx0IGVudW0gbW1vcCBvbmxpbmVfdHlwZSlcXG4xNTMyOlxcdHtcXG4xNTMzOlxcdFxcdHN0cnVjdCBtaHBfcGFyYW1zIHBhcmFtcyA9IHsgLnBncHJvdCA9IHBncHJvdF9taHAoUEFHRV9LRVJORUwpIH07XFxuMTUzNDpcXHRcXHRlbnVtIG1lbWJsb2NrX2ZsYWdzIG1lbWJsb2NrX2ZsYWdzID0gTUVNQkxPQ0tfTk9ORTtcXG4xNTM1OlxcdFxcdHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwID0gTlVMTDtcXG4xNTM2OlxcdFxcdHU2NCBzdGFydCwgc2l6ZTtcXG4xNTM3OlxcdFxcdGJvb2wgbmV3X25vZGUgPSBmYWxzZTtcXG4xNTM4OlxcdFxcdGludCByZXQ7XFxuMTUzOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzE6MDUuODgxNDIyNDMxWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjQ2NDU2OTI1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgYW5kIGl0cyBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBfX2FkZF9tZW1vcnlfcmVzb3VyY2VgIGZ1bmN0aW9uIGJldHRlci4gQ2xlYXJseSwgaXQncyBjZW50cmFsIHRvIGhvdyBtZW1vcnkgcmVzb3VyY2VzIGFyZSBhZGRlZCB0byB0aGUgc3lzdGVtLCBidXQgSSBuZWVkIHRoZSBicm9hZGVyIGNvbnRleHQuIE15IG5leHQgbW92ZSBpcyB0byBnbyBkZWVwZXIgaW50byBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgaXRzZWxmLiBJIHdhbnQgdG8gc2VlICpleGFjdGx5KiBob3cgYF9fYWRkX21lbW9yeV9yZXNvdXJjZWAgaXMgdXNlZC4gVGhpcyBtZWFucyB0cmFjaW5nIGFsbCB0aGUgY2FsbGVycy4gSXQncyBhIGNyaXRpY2FsIGZ1bmN0aW9uLCBubyBkb3VidCwgYnV0IHVuZGVyc3RhbmRpbmcgdGhlIHN1cnJvdW5kaW5nIGxvZ2ljIGlzIHBhcmFtb3VudCB0byBzZWVpbmcgdGhlIGJpZ2dlciBwaWN0dXJlLiBBcmUgdGhlcmUgYW55IGluZGlyZWN0IGNhbGxzPyBXaGF0IGtpbmQgb2YgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgbWFuaXB1bGF0ZT8gSSBuZWVkIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IHN1YnRsZSByYWNlIGNvbmRpdGlvbnMgb3IgbWVtb3J5IGFsbG9jYXRpb24gaXNzdWVzIGx1cmtpbmcgaW4gdGhlIGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzNzAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMxOjEyLjM0NTk5MzY1OFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyNjk2OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1NDAsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE1NDA6XFx0XFx0c3RhcnQgPSByZXMtXFx1MDAzZXN0YXJ0O1xcbjE1NDE6XFx0XFx0c2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTtcXG4xNTQyOlxcdFxcbjE1NDM6XFx0XFx0cmV0ID0gY2hlY2tfaG90cGx1Z19tZW1vcnlfcmFuZ2Uoc3RhcnQsIHNpemUpO1xcbjE1NDQ6XFx0XFx0aWYgKHJldClcXG4xNTQ1OlxcdFxcdFxcdHJldHVybiByZXQ7XFxuMTU0NjpcXHRcXG4xNTQ3OlxcdFxcdGlmIChtaHBfZmxhZ3MgXFx1MDAyNiBNSFBfTklEX0lTX01HSUQpIHtcXG4xNTQ4OlxcdFxcdFxcdGdyb3VwID0gbWVtb3J5X2dyb3VwX2ZpbmRfYnlfaWQobmlkKTtcXG4xNTQ5OlxcdFxcdFxcdGlmICghZ3JvdXApXFxuMTU1MDpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4xNTUxOlxcdFxcdFxcdG5pZCA9IGdyb3VwLVxcdTAwM2VuaWQ7XFxuMTU1MjpcXHRcXHR9XFxuMTU1MzpcXHRcXG4xNTU0OlxcdFxcdGlmICghbm9kZV9wb3NzaWJsZShuaWQpKSB7XFxuMTU1NTpcXHRcXHRcXHRXQVJOKDEsIFxcXCJub2RlICVkIHdhcyBhYnNlbnQgZnJvbSB0aGUgbm9kZV9wb3NzaWJsZV9tYXBcXFxcblxcXCIsIG5pZCk7XFxuMTU1NjpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4xNTU3OlxcdFxcdH1cXG4xNTU4OlxcdFxcbjE1NTk6XFx0XFx0bWVtX2hvdHBsdWdfYmVnaW4oKTtcXG4xNTYwOlxcdFxcbjE1NjE6XFx0XFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0FSQ0hfS0VFUF9NRU1CTE9DSykpIHtcXG4xNTYyOlxcdFxcdFxcdGlmIChyZXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SRVNPVVJDRV9TWVNSQU1fRFJJVkVSX01BTkFHRUQpXFxuMTU2MzpcXHRcXHRcXHRcXHRtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX0RSSVZFUl9NQU5BR0VEO1xcbjE1NjQ6XFx0XFx0XFx0cmV0ID0gbWVtYmxvY2tfYWRkX25vZGUoc3RhcnQsIHNpemUsIG5pZCwgbWVtYmxvY2tfZmxhZ3MpO1xcbjE1NjU6XFx0XFx0XFx0aWYgKHJldClcXG4xNTY2OlxcdFxcdFxcdFxcdGdvdG8gZXJyb3JfbWVtX2hvdHBsdWdfZW5kO1xcbjE1Njc6XFx0XFx0fVxcbjE1Njg6XFx0XFxuMTU2OTpcXHRcXHRyZXQgPSBfX3RyeV9vbmxpbmVfbm9kZShuaWQsIGZhbHNlKTtcXG4xNTcwOlxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjE1NzE6XFx0XFx0XFx0Z290byBlcnJvcl9tZW1ibG9ja19yZW1vdmU7XFxuMTU3MjpcXHRcXHRpZiAocmV0KSB7XFxuMTU3MzpcXHRcXHRcXHRub2RlX3NldF9vbmxpbmUobmlkKTtcXG4xNTc0OlxcdFxcdFxcdHJldCA9IHJlZ2lzdGVyX25vZGUobmlkKTtcXG4xNTc1OlxcdFxcdFxcdGlmIChXQVJOX09OKHJldCkpIHtcXG4xNTc2OlxcdFxcdFxcdFxcdG5vZGVfc2V0X29mZmxpbmUobmlkKTtcXG4xNTc3OlxcdFxcdFxcdFxcdGdvdG8gZXJyb3JfbWVtYmxvY2tfcmVtb3ZlO1xcbjE1Nzg6XFx0XFx0XFx0fVxcbjE1Nzk6XFx0XFx0XFx0bmV3X25vZGUgPSB0cnVlO1xcbjE1ODA6XFx0XFx0fVxcbjE1ODE6XFx0XFxuMTU4MjpcXHRcXHQvKlxcbjE1ODM6XFx0XFx0ICogU2VsZiBob3N0ZWQgbWVtbWFwIGFycmF5XFxuMTU4NDpcXHRcXHQgKi9cXG4xNTg1OlxcdFxcdGlmICgobWhwX2ZsYWdzIFxcdTAwMjYgTUhQX01FTU1BUF9PTl9NRU1PUlkpIFxcdTAwMjZcXHUwMDI2XFxuMTU4NjpcXHRcXHQgICAgbWhwX3N1cHBvcnRzX21lbW1hcF9vbl9tZW1vcnkoKSkge1xcbjE1ODc6XFx0XFx0XFx0cmV0ID0gY3JlYXRlX2FsdG1hcHNfYW5kX21lbW9yeV9ibG9ja3MobmlkLCBncm91cCwgc3RhcnQsIHNpemUpO1xcbjE1ODg6XFx0XFx0XFx0aWYgKHJldClcXG4xNTg5OlxcdFxcdFxcdFxcdGdvdG8gZXJyb3I7XFxuMTU5MDpcXHRcXHR9IGVsc2Uge1xcbjE1OTE6XFx0XFx0XFx0cmV0ID0gYXJjaF9hZGRfbWVtb3J5KG5pZCwgc3RhcnQsIHNpemUsIFxcdTAwMjZwYXJhbXMpO1xcbjE1OTI6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuMTU5MzpcXHRcXHRcXHRcXHRnb3RvIGVycm9yO1xcbjE1OTQ6XFx0XFxuMTU5NTpcXHRcXHRcXHQvKiBjcmVhdGUgbWVtb3J5IGJsb2NrIGRldmljZXMgYWZ0ZXIgbWVtb3J5IHdhcyBhZGRlZCAqL1xcbjE1OTY6XFx0XFx0XFx0cmV0ID0gY3JlYXRlX21lbW9yeV9ibG9ja19kZXZpY2VzKHN0YXJ0LCBzaXplLCBuaWQsIE5VTEwsIGdyb3VwKTtcXG4xNTk3OlxcdFxcdFxcdGlmIChyZXQpIHtcXG4xNTk4OlxcdFxcdFxcdFxcdGFyY2hfcmVtb3ZlX21lbW9yeShzdGFydCwgc2l6ZSwgcGFyYW1zLmFsdG1hcCwgTlVMTCk7XFxuMTU5OTpcXHRcXHRcXHRcXHRnb3RvIGVycm9yO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMToxMi4zNDYxMjE5MzdaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNzUwMDY5NDg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBJJ20gcmVhZHkgdG8gZGl2ZSBpbnRvIHRoYXQgc2VjdGlvbi4gSGVyZSdzIG15IHRha2UsIGFzc3VtaW5nIEknbSB0aGUgb25lIHByb2Nlc3NpbmcgdGhlc2UgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIExpbmVzIDE2MDAtMTYzMCoqXG5cbkFscmlnaHQsIGxldCdzIHplcm8gaW4gb24gbGluZXMgMTYwMCB0byAxNjMwLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gcXVpY2tseSBlc3RhYmxpc2ggdGhlIGNvbnRleHQuIFdoYXQncyB0aGUgb3ZlcmFyY2hpbmcgdGhlbWUgb3IgYXJndW1lbnQgYmVpbmcgZGV2ZWxvcGVkIGluIHRoaXMgcGFydCBvZiB0aGUgZG9jdW1lbnQ/IEkgbmVlZCB0byBrbm93IHdoZXJlIHRoaXMgZmFsbHMgd2l0aGluIHRoZSBsYXJnZXIgc3RydWN0dXJlLiBJcyB0aGlzIGEgY3JpdGljYWwganVuY3R1cmUgaW4gdGhlIGFyZ3VtZW50PyBBcmUgd2UgZGVhbGluZyB3aXRoIGV2aWRlbmNlLCBhIGNvdW50ZXItYXJndW1lbnQsIG9yIGEgY29uY2x1c2lvbj9cblxuTmV4dCwgSSdsbCBuZWVkIHRvIHBpbnBvaW50IHRoZSBrZXkgcGxheWVycyBhbmQgdmFyaWFibGVzLiBBcmUgdGhlcmUgYW55IHNwZWNpZmljIHRlcm1zIG9yIGNvbmNlcHRzIGJlaW5nIGludHJvZHVjZWQsIGRlZmluZWQsIG9yIG1hbmlwdWxhdGVkIHdpdGhpbiB0aGlzIGJsb2NrIG9mIHRleHQ/IEknbSBsb29raW5nIGZvciB0aGUgY29yZSBpZGVhcyB0aGF0IHRoaXMgc2VjdGlvbiBoaW5nZXMgdXBvbi5cblxuSSdsbCBzdGFydCByZWFkaW5nIHRoZSBzZW50ZW5jZXMgd2l0aCBhbiBleWUgZm9yIGFueSBwb3RlbnRpYWwgYXNzdW1wdGlvbnMgb3IgbG9naWNhbCBsZWFwcyB0aGF0IG1heSBiZSBvY2N1cnJpbmcgd2l0aGluIHRoZSBsaW5lcy4gQXJlIHRoZXJlIGFueSBoaWRkZW4gcHJlbWlzZXMgdGhhdCBzaG91bGQgYmUgbWFkZSBtb3JlIGV4cGxpY2l0PyBJJ2xsIGFsc28gYmUgd2F0Y2hpbmcgZm9yIGFueSBpbnN0YW5jZXMgb2YgY29uZmlybWF0aW9uIGJpYXMgb3IgZmFsbGFjaW91cyByZWFzb25pbmcuXG5cbk15IGFuYWx5dGljYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgc3RydWN0dXJlIG9mIGFueSBhcmd1bWVudHMsIHRoZSB2YWxpZGl0eSBvZiBhbnkgY2xhaW1zLCBhbmQgaG93IHRoZXkgcmVsYXRlIGJhY2sgdG8gdGhlIG92ZXJhbGwgb2JqZWN0aXZlLiBJZiB0aGUgYXV0aG9yIGlzIG1ha2luZyBhIHBlcnN1YXNpdmUgYXJndW1lbnQsIEknbGwgZXZhbHVhdGUgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlaXIgcmhldG9yaWNhbCBzdHJhdGVneS4gSWYgdGhleSdyZSBwcmVzZW50aW5nIGRhdGEsIEknbGwgYmUgbG9va2luZyBhdCB0aGVpciBtZXRob2RvbG9neSBhbmQgcG90ZW50aWFsIGZsYXdzIGluIGl0LlxuXG5JIHdpbGwgbmVlZCB0byBjYXJlZnVsbHkgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgbGluZXMsIG1ha2luZyBzdXJlIHRoZXJlIGlzIGZsb3cgYW5kIGNvbnRpbnVpdHkuIElzIHRoZSBhdXRob3IgbWFraW5nIGFueSBtZWFuaW5nZnVsIGNvbm5lY3Rpb25zIGJldHdlZW4gc2VudGVuY2VzIG9yIHRob3VnaHRzLCBvciBpcyBpdCBhIGRpc2pvaW50ZWQgY2hhaW4gb2YgaWRlYXM/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjY0OTgsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMxOjE1LjA5NjE5MzQ5MloiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjU1NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNjAwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNjAwOlxcdFxcdFxcdH1cXG4xNjAxOlxcdFxcdH1cXG4xNjAyOlxcdFxcbjE2MDM6XFx0XFx0cmVnaXN0ZXJfbWVtb3J5X2Jsb2Nrc191bmRlcl9ub2RlX2hvdHBsdWcobmlkLCBQRk5fRE9XTihzdGFydCksXFxuMTYwNDpcXHRcXHRcXHRcXHRcXHRcXHQgIFBGTl9VUChzdGFydCArIHNpemUgLSAxKSk7XFxuMTYwNTpcXHRcXG4xNjA2OlxcdFxcdC8qIGNyZWF0ZSBuZXcgbWVtbWFwIGVudHJ5ICovXFxuMTYwNzpcXHRcXHRpZiAoIXN0cmNtcChyZXMtXFx1MDAzZW5hbWUsIFxcXCJTeXN0ZW0gUkFNXFxcIikpXFxuMTYwODpcXHRcXHRcXHRmaXJtd2FyZV9tYXBfYWRkX2hvdHBsdWcoc3RhcnQsIHN0YXJ0ICsgc2l6ZSwgXFxcIlN5c3RlbSBSQU1cXFwiKTtcXG4xNjA5OlxcdFxcbjE2MTA6XFx0XFx0LyogZGV2aWNlX29ubGluZSgpIHdpbGwgdGFrZSB0aGUgbG9jayB3aGVuIGNhbGxpbmcgb25saW5lX3BhZ2VzKCkgKi9cXG4xNjExOlxcdFxcdG1lbV9ob3RwbHVnX2RvbmUoKTtcXG4xNjEyOlxcdFxcbjE2MTM6XFx0XFx0LypcXG4xNjE0OlxcdFxcdCAqIEluIGNhc2Ugd2UncmUgYWxsb3dlZCB0byBtZXJnZSB0aGUgcmVzb3VyY2UsIGZsYWcgaXQgYW5kIHRyaWdnZXJcXG4xNjE1OlxcdFxcdCAqIG1lcmdpbmcgbm93IHRoYXQgYWRkaW5nIHN1Y2NlZWRlZC5cXG4xNjE2OlxcdFxcdCAqL1xcbjE2MTc6XFx0XFx0aWYgKG1ocF9mbGFncyBcXHUwMDI2IE1IUF9NRVJHRV9SRVNPVVJDRSlcXG4xNjE4OlxcdFxcdFxcdG1lcmdlX3N5c3RlbV9yYW1fcmVzb3VyY2UocmVzKTtcXG4xNjE5OlxcdFxcbjE2MjA6XFx0XFx0Lyogb25saW5lIHBhZ2VzIGlmIHJlcXVlc3RlZCAqL1xcbjE2MjE6XFx0XFx0aWYgKG9ubGluZV90eXBlICE9IE1NT1BfT0ZGTElORSlcXG4xNjIyOlxcdFxcdFxcdHdhbGtfbWVtb3J5X2Jsb2NrcyhzdGFydCwgc2l6ZSwgXFx1MDAyNm9ubGluZV90eXBlLFxcbjE2MjM6XFx0XFx0XFx0XFx0XFx0ICAgb25saW5lX21lbW9yeV9ibG9jayk7XFxuMTYyNDpcXHRcXG4xNjI1OlxcdFxcdHJldHVybiByZXQ7XFxuMTYyNjpcXHRlcnJvcjpcXG4xNjI3OlxcdFxcdGlmIChuZXdfbm9kZSkge1xcbjE2Mjg6XFx0XFx0XFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xcbjE2Mjk6XFx0XFx0XFx0dW5yZWdpc3Rlcl9ub2RlKG5pZCk7XFxuMTYzMDpcXHRcXHR9XFxuMTYzMTpcXHRlcnJvcl9tZW1ibG9ja19yZW1vdmU6XFxuMTYzMjpcXHRcXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJDSF9LRUVQX01FTUJMT0NLKSlcXG4xNjMzOlxcdFxcdFxcdG1lbWJsb2NrX3JlbW92ZShzdGFydCwgc2l6ZSk7XFxuMTYzNDpcXHRlcnJvcl9tZW1faG90cGx1Z19lbmQ6XFxuMTYzNTpcXHRcXHRtZW1faG90cGx1Z19kb25lKCk7XFxuMTYzNjpcXHRcXHRyZXR1cm4gcmV0O1xcbjE2Mzc6XFx0fVxcbjE2Mzg6XFx0XFxuMTYzOTpcXHRpbnQgYWRkX21lbW9yeV9yZXNvdXJjZShpbnQgbmlkLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgbWhwX3QgbWhwX2ZsYWdzKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMToxNS4wOTYzMjA4NDJaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjY1OTA1NTgzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgYHRyeV9vZmZsaW5lX25vZGVgIENhbGwgU2l0ZXMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoZSBgdHJ5X29mZmxpbmVfbm9kZWAgZnVuY3Rpb24gd2l0aGluIHRoZSBrZXJuZWwuIE15IGluaXRpYWwgZm9jdXMgaXMgdG8gcGlucG9pbnQgKndoZXJlKiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZC4gRXNzZW50aWFsbHksIEkgbmVlZCB0byB0cmFjZSBpdHMgdXNhZ2UgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dHMgaW4gd2hpY2ggYSBub2RlIGlzIGJlaW5nIGJyb3VnaHQgb2ZmbGluZS5cblxuVGhpcyBpcyBjcml0aWNhbCBiZWNhdXNlIGFuIG9mZmxpbmUgbm9kZSByZXByZXNlbnRzIGEgc2lnbmlmaWNhbnQgc3RhdGUgY2hhbmdlLCB3aXRoIHBvdGVudGlhbCBpbXBhY3RzIG9uIE5VTUEgYmFsYW5jaW5nLCBtZW1vcnkgYWxsb2NhdGlvbiwgQ1BVIGFmZmluaXR5LCBhbmQgdGhlIG92ZXJhbGwgc3lzdGVtJ3MgcmVzb3VyY2UgbWFuYWdlbWVudC4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbCBzaXRlcyB3aWxsIHJldmVhbCB0aGUgdHJpZ2dlcnMgZm9yIHRoaXMgb3BlcmF0aW9uIOKAkyBhcmUgd2UgdGFsa2luZyBhYm91dCBob3RwbHVnIGV2ZW50cywgbWVtb3J5IHByZXNzdXJlIHNjZW5hcmlvcywgZXJyb3IgY29uZGl0aW9ucywgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/XG5cbkknbGwgYmUgbG9va2luZyBmb3IgdGhlIGNhbGwgZ3JhcGgsIGNvbnNpZGVyaW5nIHRoZSByZWxldmFudCBtb2R1bGVzIGFuZCBzdWJzeXN0ZW1zLiBJ4oCZbGwgc3RhcnQgYnkgdXNpbmcgc3RhdGljIGFuYWx5c2lzIHRvb2xzLCBsaWtlIGBjc2NvcGVgIG9yIGBncmVwIC1SYCB3aXRoIGFwcHJvcHJpYXRlIGZsYWdzLCB0byBxdWlja2x5IGlkZW50aWZ5IHRoZSBkaXJlY3QgY2FsbGVycy4gVGhlbiwgSSBtYXkgd2FudCB0byBsb29rIGF0IGNvbnRyb2wgZmxvdyBhbmFseXNpcyB0byBmaWd1cmUgb3V0IGNvbmRpdGlvbmFsIGNhbGxzIG9yIGNhbGxzIHRoYXQgZGVwZW5kIG9uIG90aGVyIG1vZHVsZXMuIEknbGwgbmVlZCB0byBjb25zaWRlciBmdW5jdGlvbiBwb2ludGVycyBhbmQgaW5kaXJlY3QgY2FsbHMuXG5cbkJleW9uZCB0aGUgZGlyZWN0IGNhbGxlcnMsIEkgYWxzbyBuZWVkIHRvIGJlIGF3YXJlIG9mIHRoZSAqcmVhc29uaW5nKiBiZWhpbmQgdGhlc2UgY2FsbHMuIFdoYXQncyB0aGUgd2lkZXIgY29udGV4dD8gQXJlIHdlIGRlYWxpbmcgd2l0aCBoYXJkd2FyZSBmYWlsdXJlcywgYWRtaW5pc3RyYXRvciBpbnRlcnZlbnRpb24sIG9yIGF1dG9tYXRlZCBwb3dlciBtYW5hZ2VtZW50IHN5c3RlbXM/IFRoaXMgaXMgaW1wb3J0YW50IGZvciBkZXRlcm1pbmluZyB0aGUgcHJpb3JpdHksIHRpbWluZywgYW5kIHBvdGVudGlhbCBjb25zZXF1ZW5jZXMgb2YgdGhlIG9wZXJhdGlvbi4gSSdsbCBiZSBsb29raW5nIGZvciBhc3NvY2lhdGVkIGxvZ2dpbmcgbWVzc2FnZXMsIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzLCBhbmQgYW55IHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGVtcGxveWVkIGFyb3VuZCB0aGUgYHRyeV9vZmZsaW5lX25vZGVgIGNhbGxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NDgxLCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMToxNy43NTUzNzg5NDlaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MTYyMjI2OTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidHJ5X29mZmxpbmVfbm9kZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYz00NzY9c3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG9zdF9lamVjdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSlcXG4tLVxcbmRyaXZlcnMvYWNwaS9hY3BpX3Byb2Nlc3Nvci5jLTUxMS1cXG5kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYzo1MTI6XFx0dHJ5X29mZmxpbmVfbm9kZShjcHVfdG9fbm9kZShwci1cXHUwMDNlaWQpKTtcXG5kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYy01MTMtXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg9MjYwPXN0YXRpYyBpbmxpbmUgdm9pZCBwZ2RhdF9yZXNpemVfaW5pdChzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0KSB7fVxcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI2NC1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg6MjY1OmV4dGVybiB2b2lkIHRyeV9vZmZsaW5lX25vZGUoaW50IG5pZCk7XFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI2Ni1leHRlcm4gaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg9MjcxPWludCBvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5X3Jhbmdlcyhjb25zdCBzdHJ1Y3QgcmFuZ2UgKnJhbmdlcyxcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaC0yNzQtI2Vsc2VcXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg6Mjc1OnN0YXRpYyBpbmxpbmUgdm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpIHt9XFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI3Ni1cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MjIzMT1zdGF0aWMgaW50IGNoZWNrX2NwdV9vbl9ub2RlKGludCBuaWQpXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNDctLyoqXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMjQ4OiAqIHRyeV9vZmZsaW5lX25vZGVcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNDktICogQG5pZDogdGhlIG5vZGUgSURcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI1NS0gKi9cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyNTY6dm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjU3LXtcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI3MC19XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMjcxOkVYUE9SVF9TWU1CT0wodHJ5X29mZmxpbmVfbm9kZSk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjcyLVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0yMjkzPXN0YXRpYyBpbnQgdHJ5X3JlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSlcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjMzOS1cXHRpZiAobmlkICE9IE5VTUFfTk9fTk9ERSlcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIzNDA6XFx0XFx0dHJ5X29mZmxpbmVfbm9kZShuaWQpO1xcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM0MS1cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM1Mi0gKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyBiZWZvcmUgdGhpcyBjYWxsLCBhcyByZXF1aXJlZCBieVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjM1MzogKiB0cnlfb2ZmbGluZV9ub2RlKCkuXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMzU0LSAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMToxOS40NzE2MDY4NDdaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjIyNjgzODU1NTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtb3J5X2hvdHBsdWcuY2AqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29tcGxldGUgcGljdHVyZSBvZiBob3cgYHRyeV9vZmZsaW5lX25vZGVgIHdvcmtzLiBJJ3ZlIGdvdCB0aGUgaW1tZWRpYXRlIGZ1bmN0aW9uIGluIGZyb250IG9mIG1lLCBidXQgdG8gdHJ1bHkgZ3Jhc3AgdGhlIGltcGxpY2F0aW9ucyBhbmQgcG90ZW50aWFsIGludGVyYWN0aW9ucywgSSBuZWVkIHRvIHRyYWNlIGl0cyB1c2FnZS4gSSdtIGdvaW5nIHRvIGZvbGxvdyB0aGUgY2FsbCBjaGFpbiBhbmQgdW5kZXJzdGFuZCB3aGVyZSBgdHJ5X29mZmxpbmVfbm9kZWAgaXMgY2FsbGVkIGZyb20uIFRoYXQgbWVhbnMgZGlnZ2luZyBpbnRvIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCBhbmQgZmluZGluZyBhbGwgdGhlIGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbi4gSSdsbCBuZWVkIHRvIGFuYWx5emUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYHRyeV9vZmZsaW5lX25vZGVgIGl0c2VsZiB0byB1bmRlcnN0YW5kIGFueSBsb2NhbCBjb250ZXh0IHRoYXQgbWlnaHQgYmUgaW1wYWN0aW5nLiBFc3NlbnRpYWxseSwgSSdtIHRyeWluZyB0byBnZXQgYSBiaXJkcyBleWUgdmlldyBvZiB0aGUgZW50aXJlIGZsb3cgc28gSSBkb24ndCBtaXNzIGFueSBjcml0aWNhbCBkZXRhaWxzIHJlbGF0ZWQgdG8gbWVtb3J5IGhvdHBsdWdnaW5nLiBPbmNlIEkgZ2V0IHRoZSBmdWxsIGNvbnRleHQsIEkgY2FuIHJlYWxseSBzdGFydCB0byBkaWFnbm9zZSB3aGF0ZXZlciBpc3N1ZSBJJ20gbG9va2luZyBhdC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODU2OSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjIxLjczOTk5NTg2MVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzM3MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMjQ1LFxuICBcIkxpbmVDb3VudFwiOiA3MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMjQ1OlxcdH1cXG4yMjQ2OlxcdFxcbjIyNDc6XFx0LyoqXFxuMjI0ODpcXHQgKiB0cnlfb2ZmbGluZV9ub2RlXFxuMjI0OTpcXHQgKiBAbmlkOiB0aGUgbm9kZSBJRFxcbjIyNTA6XFx0ICpcXG4yMjUxOlxcdCAqIE9mZmxpbmUgYSBub2RlIGlmIGFsbCBtZW1vcnkgc2VjdGlvbnMgYW5kIGNwdXMgb2YgdGhlIG5vZGUgYXJlIHJlbW92ZWQuXFxuMjI1MjpcXHQgKlxcbjIyNTM6XFx0ICogTk9URTogVGhlIGNhbGxlciBtdXN0IGNhbGwgbG9ja19kZXZpY2VfaG90cGx1ZygpIHRvIHNlcmlhbGl6ZSBob3RwbHVnXFxuMjI1NDpcXHQgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyBiZWZvcmUgdGhpcyBjYWxsLlxcbjIyNTU6XFx0ICovXFxuMjI1NjpcXHR2b2lkIHRyeV9vZmZsaW5lX25vZGUoaW50IG5pZClcXG4yMjU3OlxcdHtcXG4yMjU4OlxcdFxcdGlmICghbm9kZV9pc19tZW1vcnlsZXNzKG5pZCkpXFxuMjI1OTpcXHRcXHRcXHRyZXR1cm47XFxuMjI2MDpcXHRcXG4yMjYxOlxcdFxcdGlmIChjaGVja19jcHVfb25fbm9kZShuaWQpKVxcbjIyNjI6XFx0XFx0XFx0cmV0dXJuO1xcbjIyNjM6XFx0XFxuMjI2NDpcXHRcXHQvKlxcbjIyNjU6XFx0XFx0ICogYWxsIG1lbW9yeS9jcHUgb2YgdGhpcyBub2RlIGFyZSByZW1vdmVkLCB3ZSBjYW4gb2ZmbGluZSB0aGlzXFxuMjI2NjpcXHRcXHQgKiBub2RlIG5vdy5cXG4yMjY3OlxcdFxcdCAqL1xcbjIyNjg6XFx0XFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xcbjIyNjk6XFx0XFx0dW5yZWdpc3Rlcl9ub2RlKG5pZCk7XFxuMjI3MDpcXHR9XFxuMjI3MTpcXHRFWFBPUlRfU1lNQk9MKHRyeV9vZmZsaW5lX25vZGUpO1xcbjIyNzI6XFx0XFxuMjI3MzpcXHRzdGF0aWMgaW50IG1lbW9yeV9ibG9ja3NfaGF2ZV9hbHRtYXBzKHU2NCBzdGFydCwgdTY0IHNpemUpXFxuMjI3NDpcXHR7XFxuMjI3NTpcXHRcXHR1NjQgbnVtX21lbWJsb2NrcyA9IHNpemUgLyBtZW1vcnlfYmxvY2tfc2l6ZV9ieXRlcygpO1xcbjIyNzY6XFx0XFx0dTY0IG51bV9hbHRtYXBzID0gMDtcXG4yMjc3OlxcdFxcbjIyNzg6XFx0XFx0aWYgKCFtaHBfbWVtbWFwX29uX21lbW9yeSgpKVxcbjIyNzk6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjI4MDpcXHRcXG4yMjgxOlxcdFxcdHdhbGtfbWVtb3J5X2Jsb2NrcyhzdGFydCwgc2l6ZSwgXFx1MDAyNm51bV9hbHRtYXBzLFxcbjIyODI6XFx0XFx0XFx0XFx0ICAgY291bnRfbWVtb3J5X3JhbmdlX2FsdG1hcHNfY2IpO1xcbjIyODM6XFx0XFxuMjI4NDpcXHRcXHRpZiAobnVtX2FsdG1hcHMgPT0gMClcXG4yMjg1OlxcdFxcdFxcdHJldHVybiAwO1xcbjIyODY6XFx0XFxuMjI4NzpcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKG51bV9tZW1ibG9ja3MgIT0gbnVtX2FsdG1hcHMpKVxcbjIyODg6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMjI4OTpcXHRcXG4yMjkwOlxcdFxcdHJldHVybiAxO1xcbjIyOTE6XFx0fVxcbjIyOTI6XFx0XFxuMjI5MzpcXHRzdGF0aWMgaW50IHRyeV9yZW1vdmVfbWVtb3J5KHU2NCBzdGFydCwgdTY0IHNpemUpXFxuMjI5NDpcXHR7XFxuMjI5NTpcXHRcXHRpbnQgcmMsIG5pZCA9IE5VTUFfTk9fTk9ERTtcXG4yMjk2OlxcdFxcbjIyOTc6XFx0XFx0QlVHX09OKGNoZWNrX2hvdHBsdWdfbWVtb3J5X3JhbmdlKHN0YXJ0LCBzaXplKSk7XFxuMjI5ODpcXHRcXG4yMjk5OlxcdFxcdC8qXFxuMjMwMDpcXHRcXHQgKiBBbGwgbWVtb3J5IGJsb2NrcyBtdXN0IGJlIG9mZmxpbmVkIGJlZm9yZSByZW1vdmluZyBtZW1vcnkuICBDaGVja1xcbjIzMDE6XFx0XFx0ICogd2hldGhlciBhbGwgbWVtb3J5IGJsb2NrcyBpbiBxdWVzdGlvbiBhcmUgb2ZmbGluZSBhbmQgcmV0dXJuIGVycm9yXFxuMjMwMjpcXHRcXHQgKiBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS5cXG4yMzAzOlxcdFxcdCAqXFxuMjMwNDpcXHRcXHQgKiBXaGlsZSBhdCBpdCwgZGV0ZXJtaW5lIHRoZSBuaWQuIE5vdGUgdGhhdCBpZiB3ZSdkIGhhdmUgbWl4ZWQgbm9kZXMsXFxuMjMwNTpcXHRcXHQgKiB3ZSdkIG9ubHkgdHJ5IHRvIG9mZmxpbmUgdGhlIGxhc3QgZGV0ZXJtaW5lZCBvbmUgLS0gd2hpY2ggaXMgZ29vZFxcbjIzMDY6XFx0XFx0ICogZW5vdWdoIGZvciB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dC5cXG4yMzA3OlxcdFxcdCAqL1xcbjIzMDg6XFx0XFx0cmMgPSB3YWxrX21lbW9yeV9ibG9ja3Moc3RhcnQsIHNpemUsIFxcdTAwMjZuaWQsIGNoZWNrX21lbWJsb2NrX29mZmxpbmVkX2NiKTtcXG4yMzA5OlxcdFxcdGlmIChyYylcXG4yMzEwOlxcdFxcdFxcdHJldHVybiByYztcXG4yMzExOlxcdFxcbjIzMTI6XFx0XFx0LyogcmVtb3ZlIG1lbW1hcCBlbnRyeSAqL1xcbjIzMTM6XFx0XFx0ZmlybXdhcmVfbWFwX3JlbW92ZShzdGFydCwgc3RhcnQgKyBzaXplLCBcXFwiU3lzdGVtIFJBTVxcXCIpO1xcbjIzMTQ6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjIxLjc0MDEzMTA3WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE1NTE4MDI0Njc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IEhvdHBsdWcgUGF0Y2gqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIG1vdGl2YXRpb24gYmVoaW5kIG1vdmluZyBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgIGFuZCBpbnRyb2R1Y2luZyBgbm9kZV9pc19tZW1vcnlsZXNzYC4gIEl0IGxvb2tzIGxpa2UgdGhpcyBjb21taXQgbWlnaHQgYmUgcmVsYXRlZCB0byBhIHNwZWNpZmljIGNvbW1pdCBJRDogYGE1M2UxOWEwYjZkMjRiMjAxNDlkMDRiMzVhMDFmNWE1OTUwMWVkZmFgLiBJJ2Qgbm9ybWFsbHkgY2hlY2sgdGhlIGNvbW1pdCBoaXN0b3J5IChgZ2l0IGxvZ2Agb3IgYGdpdCBzaG93YCkgZm9yIGNvbnRleHQsIGJ1dCBzaW5jZSBJIGhhdmUgdGhlIGRpZmYsIEkgY2FuIHdvcmsgd2l0aCB0aGF0IGRpcmVjdGx5LlxuXG5Gcm9tIHRoZSBwcm92aWRlZCBkaWZmLCBJIHNlZSB0aGF0IGBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYmAsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGRlZmluZWQgKmFmdGVyKiBpdHMgdXNlLCBoYXMgYmVlbiBtb3ZlZCBlYXJsaWVyIGluIHRoZSBmaWxlLiAgQ3J1Y2lhbGx5LCBpdCBpcyB0aGVuICptb3ZlZCogYW5kIGBub2RlX2lzX21lbW9yeWxlc3NgIGlzIGNyZWF0ZWQgYW5kIHVzZWQgd2l0aGluIGB0cnlfb2ZmbGluZV9ub2RlYC4gVGhpcyBmdW5jdGlvbiBub3cgdXNlcyB0aGUgbmV3IGhlbHBlciwgYG5vZGVfaXNfbWVtb3J5bGVzc2AsIHRvIGRldGVybWluZSBpZiBhIG5vZGUgY2FuIGJlIHNhZmVseSB0YWtlbiBvZmZsaW5lLlxuXG5UaGUgYG5vZGVfaXNfbWVtb3J5bGVzc2AgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKHdoaWNoIHdvdWxkIGluZGljYXRlIG1lbW9yeSBpcyBzdGlsbCBwcmVzZW50KSwgYW5kIGlmIHNvLCByZXR1cm5zIGBmYWxzZWAuIFRoZW4sIGl0IGNoZWNrcyBpZiBhbnkgbWVtb3J5IGJsb2NrcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlLiBUaGUgb3JpZ2luYWwgY29kZSdzIGNoZWNrIHdpdGhpbiBgdHJ5X29mZmxpbmVfbm9kZWAgbG9va3MgYWxtb3N0IGlkZW50aWNhbCwgc28gdGhlIHJlZmFjdG9yaW5nIGdvYWwgbXVzdCBiZSBzb21ldGhpbmcgc3VidGxlIGFuZCB0aGUgaW50ZW50IGlzIGxpa2VseSByZS11c2UuXG5cblRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UgbGllcyBpbiBob3cgdGhlIGNvZGUgZGV0ZXJtaW5lcyBpZiBhIG5vZGUgaXMgdHJ1bHkgXCJtZW1vcnlsZXNzXCIgZm9yIG9mZmxpbmUgcHVycG9zZXMuIFRoZSBwcmV2aW91cyBjb2RlIGNoZWNrZWQgZm9yIG1lbW9yeSBibG9ja3MsIG5vdyB0aGF0IGlzIGVuY2Fwc3VsYXRlZCBpbiBgbm9kZV9pc19tZW1vcnlsZXNzYC4gIFRoZSBjb21tZW50IG1ha2VzIGEgdmFsaWQgcG9pbnQgYWJvdXQgb2ZmbGluZSBtZW1vcnkgYmxvY2tzIG5vdCBuZWNlc3NhcmlseSBiZWluZyBcInNwYW5uZWRcIiB5ZXQgYnV0IHBvdGVudGlhbGx5IGxpbmtlZCB0aHJvdWdoIHN5c2ZzLiBUaGlzIGlzIGFuIGltcG9ydGFudCBjb25zaWRlcmF0aW9uIGZvciBtZW1vcnkgaG90cGx1ZywgYW5kIGl0cyBoYW5kbGluZyBjb3VsZCBiZSBzdWJ0bGUuXG5cbkdpdmVuIHRoaXMgaXMgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBhIGNvcmUgc3Vic3lzdGVtIGZvciBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIGl0IGludm9sdmVzIGEgbG9naWMgcmVzdHJ1Y3R1cmluZyBhbmQgcmVmYWN0b3JpbmcsIEkgbmVlZCB0byBldmFsdWF0ZSB0aGlzIGNoYW5nZSB3aXRoIGFuIGV4cGVydCdzIGV5ZS4gIEknbSBnb2luZyB0byBjYXJlZnVsbHkgY29uc2lkZXIgdGhlIGxvZ2ljIG9mIGBub2RlX2lzX21lbW9yeWxlc3NgLCBhcyB0aGUgYmVoYXZpb3Igb2Ygb2ZmbGluZSBhbmQgb25saW5lIG1lbW9yeSBjb3VsZCBiZSBhZmZlY3RlZC4gU2luY2UgbWVtb3J5IGhvdHBsdWcgaXMgaW52b2x2ZWQsIEkgd2lsbCBuZWVkIHRvIGJlIHZlcnkgY29uZmlkZW50IHRoYXQgdGhpcyBjaGFuZ2UgZG9lc24ndCBpbnRyb2R1Y2UgYW55IHN1YnRsZSByZWdyZXNzaW9ucywgcGFydGljdWxhcmx5IGFyb3VuZCB0aGUgc3RhdGUgdHJhbnNpdGlvbnMgb2YgbWVtb3J5IGJsb2NrcyBhbmQgbm9kZSBhc3NvY2lhdGlvbnMgZHVyaW5nIGhvdHBsdWcgb3BlcmF0aW9ucy4gIEknbGwgd2FudCB0byBjYXJlZnVsbHkgY2hlY2sgdGhlIGludGVyYWN0aW9ucyB3aXRoIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGNvbXBvbmVudHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk4MTMsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDQxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzI6MzcuMjU4MTU4NTk2WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTU5MjM5OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1vcnlfaG90cGx1Z1xcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9NjM9cGFnZS1hbGxvYy0kKENPTkZJR19TSFVGRkxFX1BBR0VfQUxMT0NBVE9SKSArPSBzaHVmZmxlLm9cXG4tLVxcbm1tL01ha2VmaWxlLTY1LSMgR2l2ZSAnbWVtb3J5X2hvdHBsdWcnIGl0cyBvd24gbW9kdWxlLXBhcmFtZXRlciBuYW1lc3BhY2VcXG5tbS9NYWtlZmlsZTo2NjptZW1vcnktaG90cGx1Zy0kKENPTkZJR19NRU1PUllfSE9UUExVRykgKz0gbWVtb3J5X2hvdHBsdWcub1xcbm1tL01ha2VmaWxlLTY3LVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xNTQ9c3RhdGljIGludCBnZXRfb25saW5lX3BvbGljeShjaGFyICpidWZmZXIsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNTktLypcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE2MDogKiBtZW1vcnlfaG90cGx1Zy5vbmxpbmVfcG9saWN5OiBjb25maWd1cmUgb25saW5lIGJlaGF2aW9yIHdoZW4gb25saW5pbmcgd2l0aG91dFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTYxLSAqIHNwZWNpZnlpbmcgYSB6b25lIChNTU9QX09OTElORSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzI6MzcuMzA3NzU2Mzc0WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI3NzcwNTQxNjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKkNoZWNraW5nIHRoZSBIb3RwbHVnIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gcXVpY2tseSB2ZXJpZnkgc29tZXRoaW5nIHJlbGF0ZWQgdG8gbWVtb3J5IGhvdHBsdWdnaW5nLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBoZWFkIHN0cmFpZ2h0IHRvIHRoZSBzb3VyY2Ug4oCTIHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gVGhhdCdzIHdoZXJlIGFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCBjb25maWd1cmF0aW9ucyBhcmUgZGVmaW5lZCwgYW5kIGBDT05GSUdfTUVNT1JZX0hPVFBMVUdgIGlzIHRoZSBrZXkgSSdtIGludGVyZXN0ZWQgaW4uIEkgd2FudCB0byBzZWUgaG93IGl0J3MgaGFuZGxlZCwgYW55IGRlcGVuZGVuY2llcyBpdCBtaWdodCBoYXZlLCBhbmQgaWYgdGhlcmUgYXJlIGFueSBzdWJ0bGUgbnVhbmNlcyBpbiBpdHMgZGVmaW5pdGlvbiB0aGF0IEkgbmVlZCB0byBiZSBhd2FyZSBvZi4gVGhpcyBpcyB1c3VhbGx5IHRoZSBxdWlja2VzdCB3YXkgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb2YgaG93IGhvdHBsdWcgaXMgZW5hYmxlZCBvciBkaXNhYmxlZCBhbmQgd2hhdCBvdGhlciBmZWF0dXJlcyBhcmUgdGllZCB0byBpdC4gTm8gbmVlZCB0byB3YXN0ZSB0aW1lIGd1ZXNzaW5nOyBnbyBkaXJlY3RseSB0byB0aGUgY29uZmlndXJhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIwMzksIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMjo0MC4wODQ4MjM1NDdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUxMDAyOTk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBNRU1PUllfSE9UUExVR1xcXFxiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTUwNT1jb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUdcXG4tLVxcbm1tL0tjb25maWctNTA4LSMgZXZlbnR1YWxseSwgd2UgY2FuIGhhdmUgdGhpcyBvcHRpb24ganVzdCAnc2VsZWN0IFNQQVJTRU1FTSdcXG5tbS9LY29uZmlnOjUwOTptZW51Y29uZmlnIE1FTU9SWV9IT1RQTFVHXFxubW0vS2NvbmZpZy01MTAtXFx0Ym9vbCBcXFwiTWVtb3J5IGhvdHBsdWdcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjQwLjEzNTgzMzIzNFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozMTIxMTI2OTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaXZpbmcgaW50byB0aGUgTWVtb3J5IEhvdHBsdWcgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGRlcGVuZGVuY2llcyBmb3IgYE1FTU9SWV9IT1RQTFVHYCBhbmQgYE1FTU9SWV9IT1RSRU1PVkVgLiBUaGUgYmVzdCBwbGFjZSB0byBzdGFydCwgYXMgYWx3YXlzLCBpcyB0aGUgS2NvbmZpZy4gSSB3YW50IHRvIHNlZSB3aGF0IG90aGVyIGZlYXR1cmVzIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSB0aWVkIHRvIHRoZXNlIG9wdGlvbnMuIEFyZSB0aGVyZSBhbnkgb3RoZXIgcmVxdWlyZWQga2VybmVsIGZlYXR1cmVzPyBBcmUgdGhlcmUgc3BlY2lmaWMgYXJjaGl0ZWN0dXJhbCByZXF1aXJlbWVudHM/IFdoYXQgbGV2ZWxzIG9mIGdyYW51bGFyaXR5IGFyZSBhdmFpbGFibGU/IFVuZGVyc3RhbmRpbmcgdGhlIGludGVyZGVwZW5kZW5jaWVzIGlzIGNyaXRpY2FsLiBJdCdzIG9mdGVuIHRoZSBoaWRkZW4gaW1wbGljYXRpb25zIGFuZCByZWxhdGVkIGZlYXR1cmVzIHRoYXQgd2lsbCBkaWN0YXRlIGhvdyB3ZWxsIHRoZXNlIGZ1bmN0aW9ucyB3b3JrIGluIGEgc3BlY2lmaWMgc2V0dXAuIFRpbWUgdG8gZ2V0IHRoZSBLY29uZmlnIG9wZW4gYW5kIHN0YXJ0IGRpZ2dpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMzQ1LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzI6NDMuMjU2OTYyNDQyWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMDAyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUwNSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUwNTpcXHRjb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUdcXG4gNTA2OlxcdFxcdGJvb2xcXG4gNTA3OlxcdFxcbiA1MDg6XFx0IyBldmVudHVhbGx5LCB3ZSBjYW4gaGF2ZSB0aGlzIG9wdGlvbiBqdXN0ICdzZWxlY3QgU1BBUlNFTUVNJ1xcbiA1MDk6XFx0bWVudWNvbmZpZyBNRU1PUllfSE9UUExVR1xcbiA1MTA6XFx0XFx0Ym9vbCBcXFwiTWVtb3J5IGhvdHBsdWdcXFwiXFxuIDUxMTpcXHRcXHRzZWxlY3QgTUVNT1JZX0lTT0xBVElPTlxcbiA1MTI6XFx0XFx0ZGVwZW5kcyBvbiBTUEFSU0VNRU1fVk1FTU1BUFxcbiA1MTM6XFx0XFx0ZGVwZW5kcyBvbiBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVR1xcbiA1MTQ6XFx0XFx0ZGVwZW5kcyBvbiA2NEJJVFxcbiA1MTU6XFx0XFx0c2VsZWN0IE5VTUFfS0VFUF9NRU1JTkZPIGlmIE5VTUFcXG4gNTE2OlxcdFxcbiA1MTc6XFx0aWYgTUVNT1JZX0hPVFBMVUdcXG4gNTE4OlxcdFxcbiA1MTk6XFx0Y2hvaWNlXFxuIDUyMDpcXHRcXHRwcm9tcHQgXFxcIk1lbW9yeSBIb3RwbHVnIERlZmF1bHQgT25saW5lIFR5cGVcXFwiXFxuIDUyMTpcXHRcXHRkZWZhdWx0IE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09GRkxJTkVcXG4gNTIyOlxcdFxcdGhlbHBcXG4gNTIzOlxcdFxcdCAgRGVmYXVsdCBtZW1vcnkgdHlwZSBmb3IgaG90cGx1Z2dlZCBtZW1vcnkuXFxuIDUyNDpcXHRcXG4gNTI1OlxcdFxcdCAgVGhpcyBvcHRpb24gc2V0cyB0aGUgZGVmYXVsdCBwb2xpY3kgc2V0dGluZyBmb3IgbWVtb3J5IGhvdHBsdWdcXG4gNTI2OlxcdFxcdCAgb25saW5pbmcgcG9saWN5ICgvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9hdXRvX29ubGluZV9ibG9ja3MpIHdoaWNoXFxuIDUyNzpcXHRcXHQgIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIG5ld2x5IGFkZGVkIG1lbW9yeSByZWdpb25zLiBQb2xpY3kgc2V0dGluZ1xcbiA1Mjg6XFx0XFx0ICBjYW4gYWx3YXlzIGJlIGNoYW5nZWQgYXQgcnVudGltZS5cXG4gNTI5OlxcdFxcbiA1MzA6XFx0XFx0ICBUaGUgZGVmYXVsdCBpcyAnb2ZmbGluZScuXFxuIDUzMTpcXHRcXG4gNTMyOlxcdFxcdCAgU2VsZWN0IG9mZmxpbmUgdG8gZGVmZXIgb25saW5pbmcgdG8gZHJpdmVycyBhbmQgdXNlciBwb2xpY3kuXFxuIDUzMzpcXHRcXHQgIFNlbGVjdCBhdXRvIHRvIGxldCB0aGUga2VybmVsIGNob29zZSB3aGF0IHpvbmVzIHRvIHV0aWxpemUuXFxuIDUzNDpcXHRcXHQgIFNlbGVjdCBvbmxpbmVfa2VybmVsIHRvIGdlbmVyYWxseSBhbGxvdyBrZXJuZWwgdXNhZ2Ugb2YgdGhpcyBtZW1vcnkuXFxuIDUzNTpcXHRcXHQgIFNlbGVjdCBvbmxpbmVfbW92YWJsZSB0byBnZW5lcmFsbHkgZGlzYWxsb3cga2VybmVsIHVzYWdlIG9mIHRoaXMgbWVtb3J5LlxcbiA1MzY6XFx0XFxuIDUzNzpcXHRcXHQgIEV4YW1wbGUga2VybmVsIHVzYWdlIHdvdWxkIGJlIHBhZ2Ugc3RydWN0cyBhbmQgcGFnZSB0YWJsZXMuXFxuIDUzODpcXHRcXG4gNTM5OlxcdFxcdCAgU2VlIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vbWVtb3J5LWhvdHBsdWcucnN0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxcbiA1NDA6XFx0XFxuIDU0MTpcXHRjb25maWcgTUhQX0RFRkFVTFRfT05MSU5FX1RZUEVfT0ZGTElORVxcbiA1NDI6XFx0XFx0Ym9vbCBcXFwib2ZmbGluZVxcXCJcXG4gNTQzOlxcdFxcdGhlbHBcXG4gNTQ0OlxcdFxcdCAgSG90cGx1Z2dlZCBtZW1vcnkgd2lsbCBub3QgYmUgb25saW5lZCBieSBkZWZhdWx0LlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMjo0My4yNTcwNjM2NzJaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjA4OTU2Nzk3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkRlbHZpbmcgaW50byB0aGUgYE1FTU9SWV9IT1RQTFVHYCBDb25maWd1cmF0aW9uKipcblxuUmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJ20gdGhpbmtpbmcsIFwiTGV0J3MgZGlnIGRlZXBlciBpbnRvIHRoZSBpbnRyaWNhY2llcyBvZiBgTUVNT1JZX0hPVFBMVUdgLlwiIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvbXBsZXRlIHBpY3R1cmUgb2YgdGhpcyBvcHRpb24gYXMgaXQncyBkZWZpbmVkIHdpdGhpbiB0aGUgYG1tL0tjb25maWdgIGZpbGUuIEkgbmVlZCB0byBzZWUgdGhlIGNvbnRleHQuIEknbSBhZnRlciB0aGUgZGVwZW5kZW5jaWVzLCB0aGUgZGVmYXVsdHMsIHRoZSBoZWxwIHRleHQsICpldmVyeXRoaW5nKiB0aGF0IHNoYXBlcyBpdHMgYmVoYXZpb3IuIE15IGV4cGVydGlzZSBhbGxvd3MgbWUgdG8gcXVpY2tseSB6ZXJvIGluIG9uIHNwZWNpZmljIGFzcGVjdHMgZm9yIHNjcnV0aW55LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgcHJvYmxlbSBJJ20gdHJ5aW5nIHRvIHNvbHZlLiBVbmRlcnN0YW5kaW5nIHRoZSBjb21wbGV0ZSBjb250ZXh0IG9mIGBNRU1PUllfSE9UUExVR2AgaXMgdGhlIGZpcnN0IHN0ZXAgaW4gZGVidWdnaW5nIG9yIGNvbmZpZ3VyaW5nIGFueXRoaW5nIHJlbGF0ZWQgdG8gaG90LXBsdWdnYWJsZSBtZW1vcnkgaW4gdGhlIGtlcm5lbC4gSSBjYW4ndCB3b3JrIG9uIHRoZSBrZXJuZWwgaW4gaWdub3JhbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzE0NiwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzI6NDUuMzQ2NjM2MDc0WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMDA5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU0NSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDU0NTpcXHRcXHQgIENob29zZSB0aGlzIGZvciBzeXN0ZW1zIHdpdGggZHJpdmVycyBhbmQgdXNlciBwb2xpY3kgdGhhdFxcbiA1NDY6XFx0XFx0ICBoYW5kbGUgb25saW5pbmcgb2YgaG90cGx1ZyBtZW1vcnkgcG9saWN5LlxcbiA1NDc6XFx0XFxuIDU0ODpcXHRjb25maWcgTUhQX0RFRkFVTFRfT05MSU5FX1RZUEVfT05MSU5FX0FVVE9cXG4gNTQ5OlxcdFxcdGJvb2wgXFxcImF1dG9cXFwiXFxuIDU1MDpcXHRcXHRoZWxwXFxuIDU1MTpcXHRcXHQgIFNlbGVjdCB0aGlzIGlmIHlvdSB3YW50IHRoZSBrZXJuZWwgdG8gYXV0b21hdGljYWxseSBvbmxpbmVcXG4gNTUyOlxcdFxcdCAgaG90cGx1Z2dlZCBtZW1vcnkgaW50byB0aGUgem9uZSBpdCB0aGlua3MgaXMgcmVhc29uYWJsZS5cXG4gNTUzOlxcdFxcdCAgVGhpcyBtZW1vcnkgbWF5IGJlIHV0aWxpemVkIGZvciBrZXJuZWwgZGF0YS5cXG4gNTU0OlxcdFxcbiA1NTU6XFx0Y29uZmlnIE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09OTElORV9LRVJORUxcXG4gNTU2OlxcdFxcdGJvb2wgXFxcImtlcm5lbFxcXCJcXG4gNTU3OlxcdFxcdGhlbHBcXG4gNTU4OlxcdFxcdCAgU2VsZWN0IHRoaXMgaWYgeW91IHdhbnQgdGhlIGtlcm5lbCB0byBhdXRvbWF0aWNhbGx5IG9ubGluZVxcbiA1NTk6XFx0XFx0ICBob3RwbHVnZ2VkIG1lbW9yeSBpbnRvIGEgem9uZSBjYXBhYmxlIG9mIGJlaW5nIHVzZWQgZm9yIGtlcm5lbFxcbiA1NjA6XFx0XFx0ICBkYXRhLiBUaGlzIHR5cGljYWxseSBtZWFucyBaT05FX05PUk1BTC5cXG4gNTYxOlxcdFxcbiA1NjI6XFx0Y29uZmlnIE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09OTElORV9NT1ZBQkxFXFxuIDU2MzpcXHRcXHRib29sIFxcXCJtb3ZhYmxlXFxcIlxcbiA1NjQ6XFx0XFx0aGVscFxcbiA1NjU6XFx0XFx0ICBTZWxlY3QgdGhpcyBpZiB5b3Ugd2FudCB0aGUga2VybmVsIHRvIGF1dG9tYXRpY2FsbHkgb25saW5lXFxuIDU2NjpcXHRcXHQgIGhvdHBsdWcgbWVtb3J5IGludG8gWk9ORV9NT1ZBQkxFLiBUaGlzIG1lbW9yeSB3aWxsIGdlbmVyYWxseVxcbiA1Njc6XFx0XFx0ICBub3QgYmUgdXRpbGl6ZWQgZm9yIGtlcm5lbCBkYXRhLlxcbiA1Njg6XFx0XFxuIDU2OTpcXHRcXHQgIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBhZG1pbiBrbm93cyBzdWZmaWNpZW50XFxuIDU3MDpcXHRcXHQgIFpPTkVfTk9STUFMIG1lbW9yeSBpcyBhdmFpbGFibGUgdG8gZGVzY3JpYmUgaG90cGx1ZyBtZW1vcnksXFxuIDU3MTpcXHRcXHQgIG90aGVyd2lzZSBob3RwbHVnIG1lbW9yeSBtYXkgZmFpbCB0byBvbmxpbmUuIEZvciBleGFtcGxlLFxcbiA1NzI6XFx0XFx0ICBzdWZmaWNpZW50IGtlcm5lbC1jYXBhYmxlIG1lbW9yeSAoWk9ORV9OT1JNQUwpIG11c3QgYmVcXG4gNTczOlxcdFxcdCAgYXZhaWxhYmxlIHRvIGFsbG9jYXRlIHBhZ2Ugc3RydWN0cyB0byBkZXNjcmliZSBaT05FX01PVkFCTEUuXFxuIDU3NDpcXHRcXG4gNTc1OlxcdGVuZGNob2ljZVxcbiA1NzY6XFx0XFxuIDU3NzpcXHRjb25maWcgTUVNT1JZX0hPVFJFTU9WRVxcbiA1Nzg6XFx0XFx0Ym9vbCBcXFwiQWxsb3cgZm9yIG1lbW9yeSBob3QgcmVtb3ZlXFxcIlxcbiA1Nzk6XFx0XFx0c2VsZWN0IE1JR1JBVElPTlxcbiA1ODA6XFx0XFxuIDU4MTpcXHRjb25maWcgTUhQX01FTU1BUF9PTl9NRU1PUllcXG4gNTgyOlxcdFxcdGRlZl9ib29sIHlcXG4gNTgzOlxcdFxcdGRlcGVuZHMgb24gQVJDSF9NSFBfTUVNTUFQX09OX01FTU9SWV9FTkFCTEVcXG4gNTg0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMjo0NS4zNDY3NTgwMjRaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDE1NDg0MjU0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIE1lbW9yeSBIb3RwbHVnIERlcGVuZGVuY2llcyoqXG5cbk9rYXksIHNvIEknbSBkaXZpbmcgaW50byB0aGlzIGBNRU1PUllfSE9UUExVR2AgY29uZmlndXJhdGlvbi4gVGhlIHF1ZXN0aW9uIGlzOiBkb2VzIGBNRU1PUllfSE9UUkVNT1ZFYCBvciBgTlVNQWAgaGF2ZSBhbnkgYmVhcmluZyBvbiBob3cgdGhpcyB3b3Jrcz8gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZW0uXG5cbk15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIHRoZSBrZXJuZWwgY29kZSwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGZ1bmN0aW9ucyBsaWtlIGB0cnlfb2ZmbGluZV9ub2RlYCwgYG5vZGVfaXNfbWVtb3J5bGVzc2AsIGFuZCBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgLiBJJ2xsIG5lZWQgdG8gc2VlIGlmIGFueSBvZiB0aGVzZSBkZXBlbmQgb24gYE1FTU9SWV9IT1RSRU1PVkVgLCBgTlVNQWAsIG9yIGV2ZW4gYE1FTU9SWV9IT1RQTFVHYCBiZWluZyBkZWZpbmVkLiBUcmFjaW5nIHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBzaG91bGQgcmV2ZWFsIHRoZSBkZXBlbmRlbmNpZXMuXG5cbkZpbmFsbHksIEknbGwgZ28gZGlyZWN0bHkgdG8gdGhlIHNvdXJjZSBhbmQgZXhhbWluZSBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgZm9yIGFueSBgI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFYCBvciBgI2lmZGVmIENPTkZJR19OVU1BYCBkaXJlY3RpdmVzLiBUaGF0J3MgdGhlIG1vc3QgZGlyZWN0IHdheSB0byB1bmRlcnN0YW5kIGhvdyB0aGUgY29kZSBiZWhhdmVzIHVuZGVyIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGludGVycGxheSBiZXR3ZWVuIHRoZXNlIG1lbW9yeS1yZWxhdGVkIGZlYXR1cmVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzk4NiwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjQ5LjUwMTYwMzUzOFoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDczMDMzMzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX01FTU9SWV9IT1RSRU1PVkV8Q09ORklHX05VTUFcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jPTE4Nj1NT0RVTEVfUEFSTV9ERVNDKGF1dG9fbW92YWJsZV9yYXRpbyxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTkyLSAqL1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTkzOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTk0LXN0YXRpYyBib29sIGF1dG9fbW92YWJsZV9udW1hX2F3YXJlIF9fcmVhZF9tb3N0bHkgPSB0cnVlO1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xOTY9TU9EVUxFX1BBUk1fREVTQyhhdXRvX21vdmFibGVfbnVtYV9hd2FyZSxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTk4LVxcdFxcdFxcXCJcXFxcXFxcImF1dG8tbW92YWJsZVxcXFxcXFwiIG9ubGluZSBwb2xpY3kuIERlZmF1bHQ6IHRydWVcXFwiKTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE5OTojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIwMC1cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9OTYwPXN0YXRpYyBzdHJ1Y3Qgem9uZSAqYXV0b19tb3ZhYmxlX3pvbmVfZm9yX3BmbihpbnQgbmlkLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDA5LVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTAxMDojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEwMTEtXFx0aWYgKGF1dG9fbW92YWJsZV9udW1hX2F3YXJlIFxcdTAwMjZcXHUwMDI2XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEwMTMtXFx0XFx0Z290byBrZXJuZWxfem9uZTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjEwMTQ6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDE1LVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xODA0PWJvb2wgbWhwX3JhbmdlX2FsbG93ZWQodTY0IHN0YXJ0LCB1NjQgc2l6ZSwgYm9vbCBuZWVkX21hcHBpbmcpXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE4MTYtXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxODE3OiNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTgxOC0vKlxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0yNTMwPUVYUE9SVF9TWU1CT0xfR1BMKG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlfcmFuZ2VzKTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjI1MzE6I2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjQ5LjU0ODkxNTA0NloiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo4MTU0MzUyNzk2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBNZW1vcnkgSG90cGx1ZyBhbmQgSG90cmVtb3ZlIENvbmZpZ3VyYXRpb25zKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgc2VjdGlvbiBvZiB0aGUga2VybmVsIHJlbGF0ZWQgdG8gbWVtb3J5IGhvdHBsdWcgYW5kIGhvdHJlbW92ZS4gVGhlIGNvZGUgSSdtIGxvb2tpbmcgYXQsIHNwZWNpZmljYWxseSBsaW5lcyAxODE3IHRvIDI1MzEsIHNlZW1zIHRvIHJldm9sdmUgYXJvdW5kIGBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAuICBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gem9vbSBpbiBvbiBsaW5lcyAyMjMwLTIyNzUgd2hlcmUgYHRyeV9vZmZsaW5lX25vZGVgIGlzIGRlZmluZWQuICBJdCdzIGNsZWFyIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjb25kaXRpb25hbCBvbiBgI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFYCwgd2hpY2ggaXMga2V5LlxuXG5JIHNlZSB0aGF0IGBub2RlX2lzX21lbW9yeWxlc3NgIGlzIHVzZWQgYmVmb3JlIGBfX2FkZF9tZW1vcnlfcmVzb3VyY2VgLCB3aGljaCBpcyB1bmRlciBgQ09ORklHX01FTU9SWV9IT1RQTFVHYCwgc28gdGhvc2UgYXJlIGJvdGggcmVsZXZhbnQuIFRoZSBjb2RlIHN1Z2dlc3RzIHRoYXQgYHRyeV9vZmZsaW5lX25vZGVgIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSBOVU1BIG5vZGVzIGFuZCwgc3BlY2lmaWNhbGx5LCBvZmZsaW5pbmcgYSBOVU1BIG5vZGUgaWYgYWxsIHRoZSBtZW1vcnkgYW5kIENQVXMgYXJlIHJlbW92ZWQsIHNvIGBDT05GSUdfTlVNQWAgbWlnaHQgYWxzbyBiZSBhIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3IgcmVxdWlyZW1lbnQuXG5cbk5vdywgSSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdy4gIEknbSBsb29raW5nIGF0IHdoZXJlIGB0cnlfb2ZmbGluZV9ub2RlYCBpcyBjYWxsZWQgYW5kIHF1aWNrbHkgc2VlIHRoYXQgYHRyeV9yZW1vdmVfbWVtb3J5YCBjYWxscyBgdHJ5X29mZmxpbmVfbm9kZWAsIHNvIHRoYXTigJlzIGEgbGlrZWx5IGFyZWEgb2YgaW50ZXJlc3QuIFRoZW4gSSB3aWxsIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGBvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5YCBpcy5cblxuTGV0J3MgbmFpbCBkb3duIHRoZSBjcml0aWNhbCBmdW5jdGlvbnMgaGVyZS4gVGhlIG1haW4gZnVuY3Rpb25zIHRoYXQgc2VlbSB0byBiZSBhZGRlZCBvciBtb2RpZmllZCBhcmU6XG4xLiAgYG5vZGVfaXNfbWVtb3J5bGVzc2AsIHdoaWNoIGlzIGEgc3RhdGljIGZ1bmN0aW9uIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC5cbjIuICBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgIHdoaWNoIGlzIGEgc3RhdGljIGNhbGxiYWNrIGZ1bmN0aW9uLlxuMy4gIGB0cnlfb2ZmbGluZV9ub2RlYCwgd2hpY2ggaXMgYW4gZXhwb3J0ZWQgZnVuY3Rpb24gaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLlxuXG5JJ20gY29uc2lkZXJpbmcgd2hldGhlciBgbm9kZV9pc19tZW1vcnlsZXNzYCBjYW4gYmUgaW5saW5lZCBhbmQgaXQncyBzdGF0aWMgYW5kIG9ubHkgY2FsbGVkIGJ5IGB0cnlfb2ZmbGluZV9ub2RlYCwgd2hpY2ggaXMgZ2xvYmFsLiBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIHRoZSBjYWxsIHBhdGhzLlxuXG5OZXh0LCBJIG5lZWQgdG8gdHJhY2UgdGhlIGNhbGxpbmcgcmVsYXRpb25zaGlwcy4gSSBuZWVkIHRvIGJlIGF3YXJlIG9mOlxuXG4qICAgYHRyeV9vZmZsaW5lX25vZGVgXG4qICAgYG5vZGVfaXNfbWVtb3J5bGVzc2AgKGlmIGl0J3Mgbm90IGlubGluZWQsIGFuZCBhbHNvIHRoZSB0YXJnZXRzIG9mIGB0cnlfb2ZmbGluZV9ub2RlYClcbiogICBgdHJ5X3JlbW92ZV9tZW1vcnlgIChhIHN0YXRpYyBoZWxwZXIgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgKS5cbiogICBgcmVtb3ZlX21lbW9yeWAgb3IgYG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlgLlxuXG5GaW5hbGx5LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGNhbGxlcnMgb2YgYHRyeV9yZW1vdmVfbWVtb3J5YCB3aXRoaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBmaWd1cmUgb3V0IGhvdyB0aGV5IGludGVyYWN0IHdpdGggYHRyeV9vZmZsaW5lX25vZGVgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDg5NiwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMjo1Ny43MDMyNzAzMzJaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyNjYxNjQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRyeV9yZW1vdmVfbWVtb3J5XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbW9yeV9ob3RwbHVnLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuYz0yMjczPXN0YXRpYyBpbnQgbWVtb3J5X2Jsb2Nrc19oYXZlX2FsdG1hcHModTY0IHN0YXJ0LCB1NjQgc2l6ZSlcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI5Mi1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyOTM6c3RhdGljIGludCB0cnlfcmVtb3ZlX21lbW9yeSh1NjQgc3RhcnQsIHU2NCBzaXplKVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI5NC17XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIzNTU9dm9pZCBfX3JlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSlcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM2MS1cXHQgKi9cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIzNjI6XFx0aWYgKHRyeV9yZW1vdmVfbWVtb3J5KHN0YXJ0LCBzaXplKSlcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIzNjMtXFx0XFx0QlVHKCk7XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIzNzA9aW50IHJlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSlcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM3NC1cXHRsb2NrX2RldmljZV9ob3RwbHVnKCk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMzc1OlxcdHJjID0gdHJ5X3JlbW92ZV9tZW1vcnkoc3RhcnQsIHNpemUpO1xcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM3Ni1cXHR1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MjQ2Mz1pbnQgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMoY29uc3Qgc3RydWN0IHJhbmdlICpyYW5nZXMsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTI1MjAtXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3JhbmdlczsgaSsrKVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjUyMTpcXHRcXHRXQVJOX09OX09OQ0UodHJ5X3JlbW92ZV9tZW1vcnkocmFuZ2VzW2ldLnN0YXJ0LFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjUyMi1cXHRcXHRcXHRcXHRcXHQgICAgICAgcmFuZ2VfbGVuKFxcdTAwMjZyYW5nZXNbaV0pKSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjU3Ljc1NTkzNDE0WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM0NjE2ODk4OTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSByZXZpZXdpbmcgdGhpczpcblxuKipNZW1vcnkgSG90cGx1ZyBFeHBsb3JhdGlvbioqXG5cbk9rYXksIHNvIEknbSBkaXZpbmcgaW50byBtZW1vcnkgaG90cGx1ZyBzY2VuYXJpb3MuIEZpcnN0IHRoaW5ncyBmaXJzdCwgbGV0J3MgbmFpbCBkb3duIHRoZSBwcmltYXJ5IGZ1bmN0aW9ucyByZXNwb25zaWJsZSBmb3IgbWVtb3J5IG1hbmlwdWxhdGlvbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXlzZWxmIG9uIGhvdyB0aGUgdW5kZXJseWluZyBtZWNoYW5pc21zIGFyZSBleGVyY2lzZWQuIEkgd2FudCB0byBjaGVjayBvdXQgYHJlbW92ZV9tZW1vcnlgLCBgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXNgLCBgdHJ5X29mZmxpbmVfbm9kZWAsIGFuZCBgb2ZmbGluZV9tZW1vcnlfYmxvY2tgLiBJIGtub3cgdGhlc2UgYXJlIGtleSBwbGF5ZXJzIGluIG9yY2hlc3RyYXRpbmcgdGhlIG1lbW9yeSBob3RwbHVnIHByb2Nlc3MsIGJ1dCBJIHdhbnQgdG8gcmVjYWxsIHRoZSBleGFjdCB1c2UgY2FzZXMgZm9yIGVhY2guXG5cbk5vdywgYSBsb3Qgb2YgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlc2UgZnVuY3Rpb25zIHNlZW1zIHRvIGhhcHBlbiB0aHJvdWdoIHN5c2ZzLCByaWdodD8gSSdtIGdvaW5nIHRvIGhlYWQgZGlyZWN0bHkgaW50byBgZHJpdmVycy9iYXNlL21lbW9yeS5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVycGxheSBiZXR3ZWVuIHRoZSBzeXNmcyBpbnRlcmZhY2UgYW5kIHRoZSBjb3JlIG9mZmxpbmluZyByb3V0aW5lcy4gSSdtIGxvb2tpbmcgZm9yIGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhvc2Ugc3lzZnMgbWFuaXB1bGF0aW9ucyB0cmlnZ2VyIHRoZXNlIGludGVybmFsIGZ1bmN0aW9ucy4gV2hhdCBhcmUgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgbWFuaXB1bGF0ZWQsIGFuZCBob3cgaXMgdGhlIHdob2xlIHRoaW5nIGFyY2hpdGVjdGVkPyBMZXQncyBnZXQgY3JhY2tpbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NDg1LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MDEuMjE3NjI4NjAzWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1Mjg2NzMxOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0cnlfb2ZmbGluZV9ub2RlfG9mZmxpbmVfcGFnZXN8cmVtb3ZlX21lbW9yeVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2Jhc2UvbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9iYXNlL21lbW9yeS5jPTI4OT1zdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMDAtXFx0ICogVW5hY2NvdW50IGJlZm9yZSBvZmZsaW5pbmcsIHN1Y2ggdGhhdCB1bnBvcHVsYXRlZCB6b25lIGFuZCBrdGhyZWFkc1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozMDE6XFx0ICogY2FuIHByb3Blcmx5IGJlIHRvcm4gZG93biBpbiBvZmZsaW5lX3BhZ2VzKCkuXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTMwMi1cXHQgKi9cXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTAtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjMxMTpcXHRyZXQgPSBvZmZsaW5lX3BhZ2VzKHN0YXJ0X3BmbiArIG5yX3ZtZW1tYXBfcGFnZXMsXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTMxMi1cXHRcXHRcXHQgICAgbnJfcGFnZXMgLSBucl92bWVtbWFwX3BhZ2VzLCBtZW0tXFx1MDAzZXpvbmUsIG1lbS1cXHUwMDNlZ3JvdXApO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTMtXFx0aWYgKHJldCkge1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozMTQ6XFx0XFx0Lyogb2ZmbGluZV9wYWdlcygpIGZhaWxlZC4gQWNjb3VudCBiYWNrLiAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTUtXFx0XFx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9NzkwPXN0YXRpYyBpbnQgYWRkX21lbW9yeV9ibG9jayh1bnNpZ25lZCBsb25nIGJsb2NrX2lkLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXRlLFxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTgzNS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6ODM2OnN0YXRpYyB2b2lkIHJlbW92ZV9tZW1vcnlfYmxvY2soc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtb3J5KVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04Mzcte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTg2MD1pbnQgY3JlYXRlX21lbW9yeV9ibG9ja19kZXZpY2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04ODUtXFx0XFx0XFx0XFx0Y29udGludWU7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjg4NjpcXHRcXHRcXHRyZW1vdmVfbWVtb3J5X2Jsb2NrKG1lbSk7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTg4Ny1cXHRcXHR9XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODk4LSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo4OTk6dm9pZCByZW1vdmVfbWVtb3J5X2Jsb2NrX2RldmljZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy05MDAte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTkxNS1cXHRcXHR1bnJlZ2lzdGVyX21lbW9yeV9ibG9ja191bmRlcl9ub2RlcyhtZW0pO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo5MTY6XFx0XFx0cmVtb3ZlX21lbW9yeV9ibG9jayhtZW0pO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy05MTctXFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMzowMS4yNzA1MDM5MzFaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTUzMDM0Njk5MzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgTWVtb3J5IEhvdHBsdWcgYW5kIE5VTUEgTm9kZSBPZmZsaW5pbmcgTG9naWMqKlxuXG5Pa2F5LCBsZXQncyByZXZpc2l0IGBub2RlX2lzX21lbW9yeWxlc3NgLiBJIHJlY2FsbCBpdCB3YXMgZXh0cmFjdGVkIGF0IHNvbWUgcG9pbnQsIGFuZCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aHkuIEJlZm9yZSwgaW4gYHRyeV9vZmZsaW5lX25vZGVgLCB3ZSBoYWQgYSBkaXJlY3QgY2hlY2sgdXNpbmcgYG5vZGVfc3Bhbm5lZF9wYWdlc2AgYW5kIHRoZW4gYSBjYWxsIHRvIGBmb3JfZWFjaF9tZW1vcnlfYmxvY2tgIHdpdGggYSBjYWxsYmFjay4gTm93LCB0aGF0IGxvZ2ljIGlzIGVuY2Fwc3VsYXRlZCB3aXRoaW4gYG5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpYC4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gZWZmaWNpZW50bHkgY2hlY2tzIGlmIGEgTlVNQSBub2RlIGlzIHRydWx5IGRldm9pZCBvZiBtZW1vcnksIGNvbnNpZGVyaW5nIGNhc2VzIHdoZXJlIHRoZSBub2RlIHN0aWxsIHNwYW5zIHBhZ2VzIChlc3BlY2lhbGx5IGBaT05FX0RFVklDRWApIGFuZCBhY2NvdW50aW5nIGZvciBvZmZsaW5lIG1lbW9yeSBibG9ja3MgdGhhdCBtaWdodCBsYXRlciBiZSBvbmxpbmVkLiBJdCdzIGEga2V5IHBhcnQgb2YgdGhlIG1lbW9yeSBob3QtdW5wbHVnIGFuZCBOVU1BIG5vZGUgb2ZmbGluaW5nIHByb2Nlc3NlcywgYW5kIGl0IHJlc2lkZXMgaW4gdGhlIGNvcmUgYG1tL21lbW9yeV9ob3RwbHVnLmNgIGNvZGUuXG5cbk15IGluaXRpYWwgYXNzZXNzbWVudCBpbmRpY2F0ZXMgdGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgbWVhbiwgd2UgYXJlIGxvb2tpbmcgYXQgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIHRoaXMgY29kZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBhYmlsaXR5IHRvIGhvdC11bnBsdWcgYW5kIG9mZmxpbmUgbWVtb3J5LlxuXG5NeSBhbmFseXNpcyBsb29rcyBsaWtlIHRoaXM6XG5cbjEuICBgV29ydGhGdXp6aW5nYDogVHJ1ZS4gRXhjZWxsZW50LlxuMi4gIGBFbmFibGVDb25maWdzYDogSSBuZWVkIHRvIHZlcmlmeSB0aGF0IHdlIGhhdmUgYE1FTU9SWV9IT1RQTFVHYCwgYE1FTU9SWV9IT1RSRU1PVkVgLCBhbmQgYE5VTUFgIGVuYWJsZWQsIGFuZCwgb2YgY291cnNlLCB0aGF0IHdlIGRpZCBub3QgbWlzcyBhbnkgaW1wb3J0YW50IGNvbmZpZyBvcHRpb25zLiBUaGVzZSBhbGwgbG9vayBjb3JyZWN0LlxuMy4gIGBGb2N1c1N5bWJvbHNgOiBJIGhhdmUgZmxhZ2dlZCBgdHJ5X29mZmxpbmVfbm9kZWAsIGBub2RlX2lzX21lbW9yeWxlc3NgIGFuZCBgdHJ5X3JlbW92ZV9tZW1vcnlgIGFzIG15IHByaW1hcnkgc3ltYm9scy4gSSB0aGluayB0aGUgd2hvbGUgZnVuY3Rpb24gaXMgaW50ZXJlc3RpbmcsIGJ1dCB0aGVzZSBhcmUgdGhlIGNyaXRpY2FsIHBhcnRzLlxuNC4gIGBSZWFzb25pbmdgOiBXZSBhcmUgZGVhbGluZyB3aXRoIGNydWNpYWwgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSByZWxhdGVkIHRvIGhvdC11bnBsdWcgYW5kIE5VTUEgb2ZmbGluaW5nLiBBbnkgYnVncyBoZXJlIGNvdWxkIGxlYWQgdG8gY3Jhc2hlcywgbWVtb3J5IGNvcnJ1cHRpb24sIG9yIGV2ZW4gZGVuaWFsIG9mIHNlcnZpY2UsIGFuZCBJJ20gc3VyZSBzb21lb25lIHdvdWxkIGJlIGhhcHB5IHRvIGZpbmQgYSBidWcgaGVyZS5cblxuSSBkb3VibGUgY2hlY2tlZCBteSBjb25maWcgbmFtZXM7IEkgbWFkZSBzdXJlIHRoYXQgdGhlcmUncyBubyBgQ09ORklHX2AgcHJlZml4LlxuXG5ZZXAsIGxvb2tzIGdvb2QuIEl0J3MgdGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3NDAxLCJPdXRwdXRUb2tlbnMiOjEzNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU4MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMzoxNi41NzM5NzcyNjRaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3OTI4ODk1NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNT1JZX0hPVFBMVUdcIixcbiAgICBcIk1FTU9SWV9IT1RSRU1PVkVcIixcbiAgICBcIk5VTUFcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnlfb2ZmbGluZV9ub2RlXCIsXG4gICAgXCJub2RlX2lzX21lbW9yeWxlc3NcIixcbiAgICBcInRyeV9yZW1vdmVfbWVtb3J5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBtZW1vcnkgaG90cGx1ZyBjb2RlIChtbS9tZW1vcnlfaG90cGx1Zy5jKSwgZXh0cmFjdGluZyBub2RlIG1lbW9yeWxlc3MgY2hlY2tzIGludG8gbm9kZV9pc19tZW1vcnlsZXNzKCkgdXNlZCBkdXJpbmcgTlVNQSBub2RlIG9mZmxpbmluZyBpbiB0cnlfb2ZmbGluZV9ub2RlKCkuIFRoaXMgaXMgcmVhY2hhYmxlIHZpYSBtZW1vcnkgaG90LXVucGx1ZyBvcGVyYXRpb25zIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTU9SWV9IT1RQTFVHXCIsXG4gICAgXCJNRU1PUllfSE9UUkVNT1ZFXCIsXG4gICAgXCJOVU1BXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ5X29mZmxpbmVfbm9kZVwiLFxuICAgIFwibm9kZV9pc19tZW1vcnlsZXNzXCIsXG4gICAgXCJ0cnlfcmVtb3ZlX21lbW9yeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IGhvdHBsdWcgY29kZSAobW0vbWVtb3J5X2hvdHBsdWcuYyksIGV4dHJhY3Rpbmcgbm9kZSBtZW1vcnlsZXNzIGNoZWNrcyBpbnRvIG5vZGVfaXNfbWVtb3J5bGVzcygpIHVzZWQgZHVyaW5nIE5VTUEgbm9kZSBvZmZsaW5pbmcgaW4gdHJ5X29mZmxpbmVfbm9kZSgpLiBUaGlzIGlzIHJlYWNoYWJsZSB2aWEgbWVtb3J5IGhvdC11bnBsdWcgb3BlcmF0aW9ucyBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MTYuNjUzMjczNjlaIiwiU2VxIjozMSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwNjM2MDI4MTI2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MTYuNjUzODA0MDVaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyMDYzNTQ5MzQzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaXMgYSBwdXJlIHJlZmFjdG9yaW5nIGluIG1tL21lbW9yeV9ob3RwbHVnLmMgdGhhdCBleHRyYWN0cyB0aGUgY2hlY2sgZGV0ZXJtaW5pbmcgaWYgYSBOVU1BIG5vZGUgaXMgbWVtb3J5bGVzcyAoY2hlY2tpbmcgbm9kZV9zcGFubmVkX3BhZ2VzIGFuZCBpdGVyYXRpbmcgbWVtb3J5IGJsb2NrcykgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gbm9kZV9pc19tZW1vcnlsZXNzKCkuIE5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIHBhdGh3YXlzIGFyZSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nOyBzdGFuZGFyZCBzYW5pdGl6ZXJzIGFuZCB0ZXN0IHN1aXRlcyAoS0FTQU4sIExPQ0tERVApIGFyZSBzdWZmaWNpZW50LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGE1M2UxOWEwYjZkMjRiMjAxNDlkMDRiMzVhMDFmNWE1OTUwMWVkZmFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAzIDE5OjMwOjQ3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vbWVtb3J5X2hvdHBsdWcuYyBiL21tL21lbW9yeV9ob3RwbHVnLmNcbmluZGV4IDIyNmFiOWNiMDc4YWQuLmQwZTk0MDU3NjgyYWYgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jXG4rKysgYi9tbS9tZW1vcnlfaG90cGx1Zy5jXG5AQCAtMTQ5MSw2ICsxNDkxLDM2IEBAIHN0YXRpYyBpbnQgY3JlYXRlX2FsdG1hcHNfYW5kX21lbW9yeV9ibG9ja3MoaW50IG5pZCwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbitzdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxuK3tcbitcdGludCBuaWQgPSAqKGludCAqKWFyZztcbitcbitcdC8qXG4rXHQgKiBJZiBhIG1lbW9yeSBibG9jayBiZWxvbmdzIHRvIG11bHRpcGxlIG5vZGVzLCB0aGUgc3RvcmVkIG5pZCBpcyBub3RcbitcdCAqIHJlbGlhYmxlLiBIb3dldmVyLCBzdWNoIGJsb2NrcyBhcmUgYWx3YXlzIG9ubGluZSAoZS5nLiwgY2Fubm90IGdldFxuK1x0ICogb2ZmbGluZWQpIGFuZCwgdGhlcmVmb3JlLCBhcmUgc3RpbGwgc3Bhbm5lZCBieSB0aGUgbm9kZS5cbitcdCAqL1xuK1x0cmV0dXJuIG1lbS1cdTAwM2VuaWQgPT0gbmlkID8gLUVFWElTVCA6IDA7XG4rfVxuK1xuKy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovXG4rc3RhdGljIGJvb2wgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpXG4re1xuK1x0LypcbitcdCAqIEEgbm9kZSBzdGlsbCBzcGFubmluZyBwYWdlcyAoZXNwZWNpYWxseSBaT05FX0RFVklDRSkgaXMgbm90XG4rXHQgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksXG4rXHQgKiBlLmcuIG9uY2UgYSBtZW1vcnkgYmxvY2sgaGFzIGJlZW4gb25saW5lZC5cbitcdCAqL1xuK1x0aWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHQvKlxuK1x0ICogT2ZmbGluZSBtZW1vcnkgYmxvY2tzIG1heSBub3QgYmUgc3Bhbm5lZCBieSB0aGUgbm9kZSB5ZXQsIGJ1dCB0aGV5XG4rXHQgKiBsaW5rIHRvIGl0IGluIHN5c2ZzIGFuZCBjYW4gYmUgb25saW5lZCBsYXRlciwgc28gdGhlIG5vZGUgaXMgbm90XG4rXHQgKiBtZW1vcnlsZXNzIHdoaWxlIGFueSByZW1haW4uXG4rXHQgKi9cbitcdHJldHVybiAhZm9yX2VhY2hfbWVtb3J5X2Jsb2NrKFx1MDAyNm5pZCwgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2IpO1xuK31cbitcbiAvKlxuICAqIE5PVEU6IFRoZSBjYWxsZXIgbXVzdCBjYWxsIGxvY2tfZGV2aWNlX2hvdHBsdWcoKSB0byBzZXJpYWxpemUgaG90cGx1Z1xuICAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuXG5AQCAtMjIxNCwxOCArMjI0NCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfY3B1X29uX25vZGUoaW50IG5pZClcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxuLXtcbi1cdGludCBuaWQgPSAqKGludCAqKWFyZztcbi1cbi1cdC8qXG4tXHQgKiBJZiBhIG1lbW9yeSBibG9jayBiZWxvbmdzIHRvIG11bHRpcGxlIG5vZGVzLCB0aGUgc3RvcmVkIG5pZCBpcyBub3Rcbi1cdCAqIHJlbGlhYmxlLiBIb3dldmVyLCBzdWNoIGJsb2NrcyBhcmUgYWx3YXlzIG9ubGluZSAoZS5nLiwgY2Fubm90IGdldFxuLVx0ICogb2ZmbGluZWQpIGFuZCwgdGhlcmVmb3JlLCBhcmUgc3RpbGwgc3Bhbm5lZCBieSB0aGUgbm9kZS5cbi1cdCAqL1xuLVx0cmV0dXJuIG1lbS1cdTAwM2VuaWQgPT0gbmlkID8gLUVFWElTVCA6IDA7XG4tfVxuLVxuIC8qKlxuICAqIHRyeV9vZmZsaW5lX25vZGVcbiAgKiBAbmlkOiB0aGUgbm9kZSBJRFxuQEAgLTIyMzcsMjMgKzIyNTUsNyBAQCBzdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxuICAqL1xuIHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxuIHtcbi1cdGludCByYztcbi1cbi1cdC8qXG4tXHQgKiBJZiB0aGUgbm9kZSBzdGlsbCBzcGFucyBwYWdlcyAoZXNwZWNpYWxseSBaT05FX0RFVklDRSksIGRvbid0XG4tXHQgKiBvZmZsaW5lIGl0LiBBIG5vZGUgc3BhbnMgbWVtb3J5IGFmdGVyIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoKSxcbi1cdCAqIGUuZy4sIGFmdGVyIHRoZSBtZW1vcnkgYmxvY2sgd2FzIG9ubGluZWQuXG4tXHQgKi9cbi1cdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcbi1cdFx0cmV0dXJuO1xuLVxuLVx0Lypcbi1cdCAqIEVzcGVjaWFsbHkgb2ZmbGluZSBtZW1vcnkgYmxvY2tzIG1pZ2h0IG5vdCBiZSBzcGFubmVkIGJ5IHRoZVxuLVx0ICogbm9kZS4gVGhleSB3aWxsIGdldCBzcGFubmVkIGJ5IHRoZSBub2RlIG9uY2UgdGhleSBnZXQgb25saW5lZC5cbi1cdCAqIEhvd2V2ZXIsIHRoZXkgbGluayB0byB0aGUgbm9kZSBpbiBzeXNmcyBhbmQgY2FuIGdldCBvbmxpbmVkIGxhdGVyLlxuLVx0ICovXG4tXHRyYyA9IGZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbi1cdGlmIChyYylcbitcdGlmICghbm9kZV9pc19tZW1vcnlsZXNzKG5pZCkpXG4gXHRcdHJldHVybjtcbiBcbiBcdGlmIChjaGVja19jcHVfb25fbm9kZShuaWQpKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MTYuNjUzODEyOVoiLCJTZXEiOjMzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1MTk1OTYwMjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIE1lbW9yeSBIb3RwbHVnIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBhc3Nlc3MgdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLCBzcGVjaWZpY2FsbHkgdGFyZ2V0aW5nIHdoZXRoZXIgS01TQU4gZnV6emluZyBiZWNvbWVzIG5lY2Vzc2FyeS4gTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiB0aGUgYG1tL21lbW9yeV9ob3RwbHVnLmNgIGZpbGUsIHdoZXJlIHRoZSBjaGFuZ2VzIHNlZW0gY29uY2VudHJhdGVkLlxuXG5GaXJzdCwgSSBzZWUgYSBuZXcgaGVscGVyIGZ1bmN0aW9uLCBgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpYCwgYmVpbmcgaW50cm9kdWNlZC4gQW5kLCBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgIGlzIG1vdmVkIHVwLiAgUmlnaHQgYXdheSwgSSdtIHRoaW5raW5nIGFib3V0IGhvdyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgYW5kIHdoZXJlIGl0J3MgY2FsbGVkIGZyb20uIFRoZSByZWZhY3RvcmluZyBvZiBgdHJ5X29mZmxpbmVfbm9kZShuaWQpYCB0byBpbmNvcnBvcmF0ZSB0aGlzIG5ldyBmdW5jdGlvbiBpcyB0aGUgbmV4dCBwb2ludCBvZiBpbnRlcmVzdC5cblxuVG8gZ2V0IGEgYmV0dGVyIGdyaXAgb24gdGhlIGltcGFjdCwgSSBuZWVkIHRvIGtub3cgdGhlIHNjb3BlIG9mIHRoZXNlIGNoYW5nZXMuIEknbGwgcXVpY2tseSBsZXZlcmFnZSBteSB0b29scy4gSSdtIGdvaW5nIHRvIGZpcmUgdXAgYGdyZXBwZXJgIGFuZCBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMgb2YgYG5vZGVfaXNfbWVtb3J5bGVzc2Agd2l0aGluIHRoZSBjb2RlYmFzZSwgb3IganVzdCBmb2N1cyBvbiB0aGF0IGZpbGUgZGlyZWN0bHksIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCwgdG8gc2VlIGlmIGFueXRoaW5nIGVsc2Ugc2lnbmlmaWNhbnQgaGFzIGJlZW4gdG91Y2hlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgY29udGV4dCBvZiB0aGVzZSBtb2RpZmljYXRpb25zIHRvIGRldGVybWluZSBpZiBhbnkgbmV3IG9yIHByZXZpb3VzbHkgaGlkZGVuIG1lbW9yeSBpbml0aWFsaXphdGlvbiBpc3N1ZXMgYXJlIGJyb3VnaHQgaW50byB0aGUgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg1OSwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2NywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMzOjIxLjg0OTc3NTQ5WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDY1MTY3NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibm9kZV9pc19tZW1vcnlsZXNzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jPTE0OTQ9c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTUwNi0vKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTUwNzpzdGF0aWMgYm9vbCBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE1MDgte1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0yMjU2PXZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI1Ny17XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMjU4OlxcdGlmICghbm9kZV9pc19tZW1vcnlsZXNzKG5pZCkpXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjU5LVxcdFxcdHJldHVybjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MjIuMDk2MzA2NzlaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjA2MTg0NzE3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcyBpbiB0aGUgZmlyc3QgcGVyc29uLCBhc3N1bWluZyBhbiBleHBlcnQgdXNlcjpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtb3J5X2hvdHBsdWcuY2AqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbiBjYWxsLiBMZXQncyBzdGFydCBieSB6ZXJvaW5nIGluIG9uIGxpbmUgMTUwMCBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb250ZXh0LiBJJ20gdGhpbmtpbmcsIGlzIHRoaXMgYSBzdGFuZGFsb25lIHVzYWdlLCBvciBpcyB0aGlzIHBhcnRpY3VsYXIgY2FsbCBwYXJ0IG9mIGEgbGFyZ2VyIHdvcmtmbG93PyBNeSBndXQgZmVlbGluZyBpcyB0byBjaGVjayBmb3Igb3RoZXIgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiB0aGlzIGlzIHBhcnQgb2YgYSBzZXF1ZW5jZSwgbWF5YmUgYSBzcGVjaWZpYyBob3RwbHVnIG9wZXJhdGlvbiB3aXRoIGEgc3BlY2lmaWMgcHVycG9zZS4gS25vd2luZyB0aGUgb3RoZXIgY2FsbGVycyBpcyBrZXkgdG8gdW5kZXJzdGFuZGluZyBpdHMgb3ZlcmFsbCBpbXBhY3QgYW5kIGhvdyB0aGUgc3lzdGVtIG1pZ2h0IGJlaGF2ZS4gTGV0J3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM1MzgsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMzoyNC4xNTgxNTc4NzNaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcxMTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL21lbW9yeV9ob3RwbHVnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTQ4MCxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTQ4MDpcXHRcXHRcXHRpZiAocmV0KSB7XFxuMTQ4MTpcXHRcXHRcXHRcXHRhcmNoX3JlbW92ZV9tZW1vcnkoY3VyX3N0YXJ0LCBtZW1ibG9ja19zaXplLCBwYXJhbXMuYWx0bWFwLCBOVUxMKTtcXG4xNDgyOlxcdFxcdFxcdFxcdGFsdG1hcF9mcmVlKHBhcmFtcy5hbHRtYXApO1xcbjE0ODM6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMTQ4NDpcXHRcXHRcXHR9XFxuMTQ4NTpcXHRcXHR9XFxuMTQ4NjpcXHRcXG4xNDg3OlxcdFxcdHJldHVybiAwO1xcbjE0ODg6XFx0b3V0OlxcbjE0ODk6XFx0XFx0aWYgKHJldCBcXHUwMDI2XFx1MDAyNiBjdXJfc3RhcnQgIT0gc3RhcnQpXFxuMTQ5MDpcXHRcXHRcXHRyZW1vdmVfbWVtb3J5X2Jsb2Nrc19hbmRfYWx0bWFwcyhzdGFydCwgY3VyX3N0YXJ0IC0gc3RhcnQpO1xcbjE0OTE6XFx0XFx0cmV0dXJuIHJldDtcXG4xNDkyOlxcdH1cXG4xNDkzOlxcdFxcbjE0OTQ6XFx0c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcXG4xNDk1OlxcdHtcXG4xNDk2OlxcdFxcdGludCBuaWQgPSAqKGludCAqKWFyZztcXG4xNDk3OlxcdFxcbjE0OTg6XFx0XFx0LypcXG4xNDk5OlxcdFxcdCAqIElmIGEgbWVtb3J5IGJsb2NrIGJlbG9uZ3MgdG8gbXVsdGlwbGUgbm9kZXMsIHRoZSBzdG9yZWQgbmlkIGlzIG5vdFxcbjE1MDA6XFx0XFx0ICogcmVsaWFibGUuIEhvd2V2ZXIsIHN1Y2ggYmxvY2tzIGFyZSBhbHdheXMgb25saW5lIChlLmcuLCBjYW5ub3QgZ2V0XFxuMTUwMTpcXHRcXHQgKiBvZmZsaW5lZCkgYW5kLCB0aGVyZWZvcmUsIGFyZSBzdGlsbCBzcGFubmVkIGJ5IHRoZSBub2RlLlxcbjE1MDI6XFx0XFx0ICovXFxuMTUwMzpcXHRcXHRyZXR1cm4gbWVtLVxcdTAwM2VuaWQgPT0gbmlkID8gLUVFWElTVCA6IDA7XFxuMTUwNDpcXHR9XFxuMTUwNTpcXHRcXG4xNTA2OlxcdC8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovXFxuMTUwNzpcXHRzdGF0aWMgYm9vbCBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClcXG4xNTA4OlxcdHtcXG4xNTA5OlxcdFxcdC8qXFxuMTUxMDpcXHRcXHQgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdFxcbjE1MTE6XFx0XFx0ICogbWVtb3J5bGVzcy4gIEEgbm9kZSBzcGFucyBtZW1vcnkgYWZ0ZXIgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSgpLFxcbjE1MTI6XFx0XFx0ICogZS5nLiBvbmNlIGEgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIG9ubGluZWQuXFxuMTUxMzpcXHRcXHQgKi9cXG4xNTE0OlxcdFxcdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcXG4xNTE1OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4xNTE2OlxcdFxcdC8qXFxuMTUxNzpcXHRcXHQgKiBPZmZsaW5lIG1lbW9yeSBibG9ja3MgbWF5IG5vdCBiZSBzcGFubmVkIGJ5IHRoZSBub2RlIHlldCwgYnV0IHRoZXlcXG4xNTE4OlxcdFxcdCAqIGxpbmsgdG8gaXQgaW4gc3lzZnMgYW5kIGNhbiBiZSBvbmxpbmVkIGxhdGVyLCBzbyB0aGUgbm9kZSBpcyBub3RcXG4xNTE5OlxcdFxcdCAqIG1lbW9yeWxlc3Mgd2hpbGUgYW55IHJlbWFpbi5cXG4xNTIwOlxcdFxcdCAqL1xcbjE1MjE6XFx0XFx0cmV0dXJuICFmb3JfZWFjaF9tZW1vcnlfYmxvY2soXFx1MDAyNm5pZCwgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2IpO1xcbjE1MjI6XFx0fVxcbjE1MjM6XFx0XFxuMTUyNDpcXHQvKlxcbjE1MjU6XFx0ICogTk9URTogVGhlIGNhbGxlciBtdXN0IGNhbGwgbG9ja19kZXZpY2VfaG90cGx1ZygpIHRvIHNlcmlhbGl6ZSBob3RwbHVnXFxuMTUyNjpcXHQgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyAodHJpZ2dlcmVkIGUuZy4gYnkgc3lzZnMpLlxcbjE1Mjc6XFx0ICpcXG4xNTI4OlxcdCAqIHdlIGFyZSBPSyBjYWxsaW5nIF9fbWVtaW5pdCBzdHVmZiBoZXJlIC0gd2UgaGF2ZSBDT05GSUdfTUVNT1JZX0hPVFBMVUdcXG4xNTI5OlxcdCAqL1xcbjE1MzA6XFx0c3RhdGljIGludCBfX2FkZF9tZW1vcnlfcmVzb3VyY2UoaW50IG5pZCwgc3RydWN0IHJlc291cmNlICpyZXMsIG1ocF90IG1ocF9mbGFncyxcXG4xNTMxOlxcdFxcdFxcdFxcdFxcdCBlbnVtIG1tb3Agb25saW5lX3R5cGUpXFxuMTUzMjpcXHR7XFxuMTUzMzpcXHRcXHRzdHJ1Y3QgbWhwX3BhcmFtcyBwYXJhbXMgPSB7IC5wZ3Byb3QgPSBwZ3Byb3RfbWhwKFBBR0VfS0VSTkVMKSB9O1xcbjE1MzQ6XFx0XFx0ZW51bSBtZW1ibG9ja19mbGFncyBtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX05PTkU7XFxuMTUzNTpcXHRcXHRzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCA9IE5VTEw7XFxuMTUzNjpcXHRcXHR1NjQgc3RhcnQsIHNpemU7XFxuMTUzNzpcXHRcXHRib29sIG5ld19ub2RlID0gZmFsc2U7XFxuMTUzODpcXHRcXHRpbnQgcmV0O1xcbjE1Mzk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMzOjI0LjE1ODMzMDg3M1oiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNjU2NzM1NjU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uXG5cbioqQW5hbHl6aW5nIHRoZSBgbm9kZV9pc19tZW1vcnlsZXNzYCBFeHRyYWN0aW9uKipcblxuUmlnaHQsIHNvIGBub2RlX2lzX21lbW9yeWxlc3NgLi4uIHRoYXQgd2FzIHB1bGxlZCBvdXQgb2YgdGhlIGB0cnlfb2ZmbGluZV9ub2RlYCBmdW5jdGlvbiwgSSByZW1lbWJlciB0aGF0IGNvZGUuIEkgbmVlZCB0byBxdWlja2x5IGFzc2VzcyB0aGUgaW1wYWN0IG9mIHRoaXMgcmVmYWN0b3JpbmcsIHdoYXQncyBpdHMgcmVhY2g/IEZpcnN0LCBJJ2xsIHNjYW4gdGhyb3VnaCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55ICpvdGhlciogY29kZSBtb2RpZmljYXRpb25zIG1hZGUgaW4gdGhhdCBmaWxlIGFyb3VuZCB0aGUgc2FtZSB0aW1lLiBUaGVuLCBhbmQgdGhpcyBpcyBrZXksIEknbGwgbmVlZCB0byBjb25maXJtIHRoZSBuZXcgZnVuY3Rpb27igJlzIHB1cnBvc2UsIGFuZCBjb25maXJtIHRoYXQgaXMgY29ycmVjdC4gSSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGFueXdoZXJlIGVsc2UgKGluIGBfX2FkZF9tZW1vcnlfcmVzb3VyY2VgIGZvciBleGFtcGxlKSwgYXMgdGhhdCBtYXkgc2hvdyB0aGUgZnVuY3Rpb24gaXMgZG9pbmcgbW9yZSB0aGFuIGp1c3QgdmVyaWZ5aW5nIHRoZSBub2RlIGRvZXMgbm90IGhhdmUgbWVtb3J5IGFzc2lnbmVkLiBJJ2xsIGZvY3VzIG15IGluaXRpYWwgcmVhZGluZyBiZXR3ZWVuIGxpbmVzIDE1MzAgYW5kIDE1NzAuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIG92ZXJ2aWV3IG9mIHRoZSBpbW1lZGlhdGUgY29udGV4dCBhbmQgdXNhZ2Ugb2YgYG5vZGVfaXNfbWVtb3J5bGVzc2AuIFRpbWUgdG8gZGl2ZSBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDcxNiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MjYuODE1MDY5WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3Mjc5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1MzAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE1MzA6XFx0c3RhdGljIGludCBfX2FkZF9tZW1vcnlfcmVzb3VyY2UoaW50IG5pZCwgc3RydWN0IHJlc291cmNlICpyZXMsIG1ocF90IG1ocF9mbGFncyxcXG4xNTMxOlxcdFxcdFxcdFxcdFxcdCBlbnVtIG1tb3Agb25saW5lX3R5cGUpXFxuMTUzMjpcXHR7XFxuMTUzMzpcXHRcXHRzdHJ1Y3QgbWhwX3BhcmFtcyBwYXJhbXMgPSB7IC5wZ3Byb3QgPSBwZ3Byb3RfbWhwKFBBR0VfS0VSTkVMKSB9O1xcbjE1MzQ6XFx0XFx0ZW51bSBtZW1ibG9ja19mbGFncyBtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX05PTkU7XFxuMTUzNTpcXHRcXHRzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCA9IE5VTEw7XFxuMTUzNjpcXHRcXHR1NjQgc3RhcnQsIHNpemU7XFxuMTUzNzpcXHRcXHRib29sIG5ld19ub2RlID0gZmFsc2U7XFxuMTUzODpcXHRcXHRpbnQgcmV0O1xcbjE1Mzk6XFx0XFxuMTU0MDpcXHRcXHRzdGFydCA9IHJlcy1cXHUwMDNlc3RhcnQ7XFxuMTU0MTpcXHRcXHRzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpO1xcbjE1NDI6XFx0XFxuMTU0MzpcXHRcXHRyZXQgPSBjaGVja19ob3RwbHVnX21lbW9yeV9yYW5nZShzdGFydCwgc2l6ZSk7XFxuMTU0NDpcXHRcXHRpZiAocmV0KVxcbjE1NDU6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4xNTQ2OlxcdFxcbjE1NDc6XFx0XFx0aWYgKG1ocF9mbGFncyBcXHUwMDI2IE1IUF9OSURfSVNfTUdJRCkge1xcbjE1NDg6XFx0XFx0XFx0Z3JvdXAgPSBtZW1vcnlfZ3JvdXBfZmluZF9ieV9pZChuaWQpO1xcbjE1NDk6XFx0XFx0XFx0aWYgKCFncm91cClcXG4xNTUwOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjE1NTE6XFx0XFx0XFx0bmlkID0gZ3JvdXAtXFx1MDAzZW5pZDtcXG4xNTUyOlxcdFxcdH1cXG4xNTUzOlxcdFxcbjE1NTQ6XFx0XFx0aWYgKCFub2RlX3Bvc3NpYmxlKG5pZCkpIHtcXG4xNTU1OlxcdFxcdFxcdFdBUk4oMSwgXFxcIm5vZGUgJWQgd2FzIGFic2VudCBmcm9tIHRoZSBub2RlX3Bvc3NpYmxlX21hcFxcXFxuXFxcIiwgbmlkKTtcXG4xNTU2OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjE1NTc6XFx0XFx0fVxcbjE1NTg6XFx0XFxuMTU1OTpcXHRcXHRtZW1faG90cGx1Z19iZWdpbigpO1xcbjE1NjA6XFx0XFxuMTU2MTpcXHRcXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJDSF9LRUVQX01FTUJMT0NLKSkge1xcbjE1NjI6XFx0XFx0XFx0aWYgKHJlcy1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT1JFU09VUkNFX1NZU1JBTV9EUklWRVJfTUFOQUdFRClcXG4xNTYzOlxcdFxcdFxcdFxcdG1lbWJsb2NrX2ZsYWdzID0gTUVNQkxPQ0tfRFJJVkVSX01BTkFHRUQ7XFxuMTU2NDpcXHRcXHRcXHRyZXQgPSBtZW1ibG9ja19hZGRfbm9kZShzdGFydCwgc2l6ZSwgbmlkLCBtZW1ibG9ja19mbGFncyk7XFxuMTU2NTpcXHRcXHRcXHRpZiAocmV0KVxcbjE1NjY6XFx0XFx0XFx0XFx0Z290byBlcnJvcl9tZW1faG90cGx1Z19lbmQ7XFxuMTU2NzpcXHRcXHR9XFxuMTU2ODpcXHRcXG4xNTY5OlxcdFxcdHJldCA9IF9fdHJ5X29ubGluZV9ub2RlKG5pZCwgZmFsc2UpO1xcbjE1NzA6XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuMTU3MTpcXHRcXHRcXHRnb3RvIGVycm9yX21lbWJsb2NrX3JlbW92ZTtcXG4xNTcyOlxcdFxcdGlmIChyZXQpIHtcXG4xNTczOlxcdFxcdFxcdG5vZGVfc2V0X29ubGluZShuaWQpO1xcbjE1NzQ6XFx0XFx0XFx0cmV0ID0gcmVnaXN0ZXJfbm9kZShuaWQpO1xcbjE1NzU6XFx0XFx0XFx0aWYgKFdBUk5fT04ocmV0KSkge1xcbjE1NzY6XFx0XFx0XFx0XFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xcbjE1Nzc6XFx0XFx0XFx0XFx0Z290byBlcnJvcl9tZW1ibG9ja19yZW1vdmU7XFxuMTU3ODpcXHRcXHRcXHR9XFxuMTU3OTpcXHRcXHRcXHRuZXdfbm9kZSA9IHRydWU7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMzOjI2LjgxNTI0MzIzWiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNDg0ODg3OTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipEaWdnaW5nIGludG8gYHRyeV9vZmZsaW5lX25vZGVgKipcblxuT2theSwgc28gd2UncmUgbG9va2luZyBhdCBgdHJ5X29mZmxpbmVfbm9kZWAsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAyMjUwLiBNeSBleHBlcmllbmNlIHRlbGxzIG1lIHRoYXQgdGhpcyBmdW5jdGlvbiBsaWtlbHkgaGFuZGxlcyB0aGUgbG9naWMgZm9yIGRlYWxpbmcgd2l0aCBhIG5vZGUgdGhhdCBoYXMgZ29uZSBvZmZsaW5lLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nICphcm91bmQqIHRoYXQgc3BlY2lmaWMgbGluZSB0byBnZXQgYSBncmFzcCBvZiB0aGUgZW50aXJlIGZsb3cuIEl0J3MgdXN1YWxseSBub3QgZW5vdWdoIHRvIGp1c3QgbG9vayBhdCBhIHNpbmdsZSBsaW5lIGluIGEgY29tcGxleCBzeXN0ZW0gbGlrZSB0aGlzLiBDb250ZXh0IGlzIGtleSwgYW5kIHRoZSBzdXJyb3VuZGluZyBjb2RlIGlzIGdvaW5nIHRvIGdpdmUgbWUgdGhhdC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHN0YXRlIHRyYW5zaXRpb25zIGFuZCBlcnJvciBoYW5kbGluZyBoZXJlLiBMZXQncyBzZWUgd2hhdCB0aGUgc3Vycm91bmRpbmcgbG9naWMgaXMgdHJ5aW5nIHRvIGFjaGlldmUuIEknbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2Ugd2hhdCB0cmlnZ2VycyB0aGlzIGZ1bmN0aW9uLCB3aGF0IGFyZSBpdHMgaW5wdXRzIGFuZCBvdXRwdXRzLCBhbmQgd2hhdCBzdWJzZXF1ZW50IGFjdGlvbnMgaXQgdGFrZXMuIExldCdzIGRpZyBpbiBhbmQgZmlndXJlIHRoaXMgb3V0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo1ODI1LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMzoyOC45NjM3MzQzOThaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg3MDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL21lbW9yeV9ob3RwbHVnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjI0MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjI0MDpcXHRcXHRcXHRcXHQgKi9cXG4yMjQxOlxcdFxcdFxcdFxcdHJldHVybiAtRUJVU1k7XFxuMjI0MjpcXHRcXHR9XFxuMjI0MzpcXHRcXG4yMjQ0OlxcdFxcdHJldHVybiAwO1xcbjIyNDU6XFx0fVxcbjIyNDY6XFx0XFxuMjI0NzpcXHQvKipcXG4yMjQ4OlxcdCAqIHRyeV9vZmZsaW5lX25vZGVcXG4yMjQ5OlxcdCAqIEBuaWQ6IHRoZSBub2RlIElEXFxuMjI1MDpcXHQgKlxcbjIyNTE6XFx0ICogT2ZmbGluZSBhIG5vZGUgaWYgYWxsIG1lbW9yeSBzZWN0aW9ucyBhbmQgY3B1cyBvZiB0aGUgbm9kZSBhcmUgcmVtb3ZlZC5cXG4yMjUyOlxcdCAqXFxuMjI1MzpcXHQgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcXG4yMjU0OlxcdCAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zIGJlZm9yZSB0aGlzIGNhbGwuXFxuMjI1NTpcXHQgKi9cXG4yMjU2OlxcdHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxcbjIyNTc6XFx0e1xcbjIyNTg6XFx0XFx0aWYgKCFub2RlX2lzX21lbW9yeWxlc3MobmlkKSlcXG4yMjU5OlxcdFxcdFxcdHJldHVybjtcXG4yMjYwOlxcdFxcbjIyNjE6XFx0XFx0aWYgKGNoZWNrX2NwdV9vbl9ub2RlKG5pZCkpXFxuMjI2MjpcXHRcXHRcXHRyZXR1cm47XFxuMjI2MzpcXHRcXG4yMjY0OlxcdFxcdC8qXFxuMjI2NTpcXHRcXHQgKiBhbGwgbWVtb3J5L2NwdSBvZiB0aGlzIG5vZGUgYXJlIHJlbW92ZWQsIHdlIGNhbiBvZmZsaW5lIHRoaXNcXG4yMjY2OlxcdFxcdCAqIG5vZGUgbm93LlxcbjIyNjc6XFx0XFx0ICovXFxuMjI2ODpcXHRcXHRub2RlX3NldF9vZmZsaW5lKG5pZCk7XFxuMjI2OTpcXHRcXHR1bnJlZ2lzdGVyX25vZGUobmlkKTtcXG4yMjcwOlxcdH1cXG4yMjcxOlxcdEVYUE9SVF9TWU1CT0wodHJ5X29mZmxpbmVfbm9kZSk7XFxuMjI3MjpcXHRcXG4yMjczOlxcdHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2Nrc19oYXZlX2FsdG1hcHModTY0IHN0YXJ0LCB1NjQgc2l6ZSlcXG4yMjc0OlxcdHtcXG4yMjc1OlxcdFxcdHU2NCBudW1fbWVtYmxvY2tzID0gc2l6ZSAvIG1lbW9yeV9ibG9ja19zaXplX2J5dGVzKCk7XFxuMjI3NjpcXHRcXHR1NjQgbnVtX2FsdG1hcHMgPSAwO1xcbjIyNzc6XFx0XFxuMjI3ODpcXHRcXHRpZiAoIW1ocF9tZW1tYXBfb25fbWVtb3J5KCkpXFxuMjI3OTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4yMjgwOlxcdFxcbjIyODE6XFx0XFx0d2Fsa19tZW1vcnlfYmxvY2tzKHN0YXJ0LCBzaXplLCBcXHUwMDI2bnVtX2FsdG1hcHMsXFxuMjI4MjpcXHRcXHRcXHRcXHQgICBjb3VudF9tZW1vcnlfcmFuZ2VfYWx0bWFwc19jYik7XFxuMjI4MzpcXHRcXG4yMjg0OlxcdFxcdGlmIChudW1fYWx0bWFwcyA9PSAwKVxcbjIyODU6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjI4NjpcXHRcXG4yMjg3OlxcdFxcdGlmIChXQVJOX09OX09OQ0UobnVtX21lbWJsb2NrcyAhPSBudW1fYWx0bWFwcykpXFxuMjI4ODpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4yMjg5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMzoyOC45NjM5Mjc0NjhaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6ODMyNTM0Mzc0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBNZW1vcnkgSG90cGx1ZyBSZWZhY3RvcmluZyoqXG5cbk9rYXksIHNvIHRoaXMgZGlmZiBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgaXMgZXNzZW50aWFsbHkgYSByZWZhY3RvcmluZy4gVGhleSd2ZSB0YWtlbiB0aGUgZXhpc3RpbmcgbG9naWMgaW4gYHRyeV9vZmZsaW5lX25vZGVgIGFuZCBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgIGFuZCBjb25zb2xpZGF0ZWQgaXQgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24sIGBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClgLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBzY2FuIGZvciBhbnkgcG90ZW50aWFsIHJpc2tzOiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgYGNvcHlfdG9fdXNlcmAgY2FsbHMgdGhhdCBjb3VsZCBsZWFrIGluZm9ybWF0aW9uLCBvciBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLlxuXG5MZXQgbWUgYnJlYWsgZG93biB0aGUgY29kZTpcblxuMS4gIGBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYmAgZ2V0cyBgXHUwMDI2bmlkYCwgZGVyZWZlcmVuY2VzIHRvIGdldCB0aGUgbm9kZSBpZCwgdGhlbiBjb21wYXJlcyB0byBgbWVtLVx1MDAzZW5pZGAuXG4yLiAgYG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKWAgY2hlY2tzIGlmIHRoZSBub2RlIGhhcyBhbnkgc3Bhbm5lZCBwYWdlcyBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gbWVtb3J5IGJsb2NrcyBvbiB0aGUgbm9kZSB2aWEgdGhlIGNhbGxiYWNrLlxuMy4gIGB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpYCB0aGVuIGNhbGxzIHRoaXMgbmV3IGhlbHBlci5cblxuQWZ0ZXIgYSB0aG9yb3VnaCBsb29rLCBJJ20gbm90IHNlZWluZyBhbnl0aGluZyB0aGF0IHJhaXNlcyBhIHJlZCBmbGFnOlxuXG4qICAgTm8gdXNlci1zcGFjZSBjb3BpZXMgb3IgcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWtzLlxuKiAgIE5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcyBvciBidWZmZXJzIGludHJvZHVjZWQuXG4qICAgTm8gY29tcGxleCBhbGxvY2F0aW9ucyBvciB1c2FnZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuXG4qICAgSXQncyBhIHB1cmUgY29udHJvbC1mbG93IHJlZmFjdG9yaW5nLlxuXG5UaGVyZWZvcmUsIE5lZWRzS01TQU4gc2hvdWxkIGJlIGZhbHNlLlxuXG5MZXQgbWUgc29saWRpZnkgbXkgcmVhc29uaW5nLiBUaGUgZXhpc3Rpbmcgc2FuaXRpemVycywgcGFydGljdWxhcmx5IEtBU0FOLCBoYW5kbGUgZ2VuZXJhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcywgYW5kIGxvY2tkZXAgaXMgdGhlcmUgZm9yIGxvY2tpbmcgaXNzdWVzLCBib3RoIG9mIHdoaWNoIGFyZSBvcnRob2dvbmFsIHRvIHRoaXMgcGF0Y2guIEtNU0FOIGlzIHNwZWNpZmljYWxseSBmb3IgZGV0ZWN0aW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBhbmQgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlciBzcGFjZS4gVGhpcyBwYXRjaCBzaW1wbHkgcmVzdHJ1Y3R1cmVzICpleGlzdGluZyogbG9naWMgZm9yIGNoZWNraW5nIGlmIGEgbm9kZSBpcyBtZW1vcnlsZXNzLiBObyBuZXcgbWVtb3J5IGlzIGJlaW5nIGFsbG9jYXRlZCwgbm8gY29waWVzIHRvIHVzZXItc3BhY2UgYXJlIGJlaW5nIGludHJvZHVjZWQsIGFuZCBubyBuZXcgc291cmNlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhcmUgaW52b2x2ZWQuIEdpdmVuIHRoaXMsIEtNU0FOIHdvdWxkbid0IHJldmVhbCBhbnl0aGluZyB0aGF0IGlzbid0IGFscmVhZHkgaGFuZGxlZCBieSBvdGhlciBydW50aW1lIHNhbml0aXplcnMuIFJ1bm5pbmcgS01TQU4gb24gdGhpcyB3b3VsZCBiZSBhIHdhc3RlIG9mIHJlc291cmNlcy5cblxuT2theSwgSSdtIHJlYWR5IHRvIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY3MzQsIk91dHB1dFRva2VucyI6MTQ0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDkwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MzcuMjg5MjczNzc1WiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIyMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpcyBhIHB1cmUgcmVmYWN0b3JpbmcgaW4gbW0vbWVtb3J5X2hvdHBsdWcuYyB0aGF0IGV4dHJhY3RzIHRoZSBjaGVjayBkZXRlcm1pbmluZyBpZiBhIE5VTUEgbm9kZSBpcyBtZW1vcnlsZXNzIChjaGVja2luZyBub2RlX3NwYW5uZWRfcGFnZXMgYW5kIGl0ZXJhdGluZyBtZW1vcnkgYmxvY2tzKSBpbnRvIGEgc3RhdGljIGhlbHBlciBmdW5jdGlvbiBub2RlX2lzX21lbW9yeWxlc3MoKS4gTm8gbmV3IGFsbG9jYXRpb25zLCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgZGF0YSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgcGF0aHdheXMgYXJlIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGZ1enppbmc7IHN0YW5kYXJkIHNhbml0aXplcnMgYW5kIHRlc3Qgc3VpdGVzIChLQVNBTiwgTE9DS0RFUCkgYXJlIHN1ZmZpY2llbnQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaXMgYSBwdXJlIHJlZmFjdG9yaW5nIGluIG1tL21lbW9yeV9ob3RwbHVnLmMgdGhhdCBleHRyYWN0cyB0aGUgY2hlY2sgZGV0ZXJtaW5pbmcgaWYgYSBOVU1BIG5vZGUgaXMgbWVtb3J5bGVzcyAoY2hlY2tpbmcgbm9kZV9zcGFubmVkX3BhZ2VzIGFuZCBpdGVyYXRpbmcgbWVtb3J5IGJsb2NrcykgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gbm9kZV9pc19tZW1vcnlsZXNzKCkuIE5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIHBhdGh3YXlzIGFyZSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nOyBzdGFuZGFyZCBzYW5pdGl6ZXJzIGFuZCB0ZXN0IHN1aXRlcyAoS0FTQU4sIExPQ0tERVApIGFyZSBzdWZmaWNpZW50LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowhvl26[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-03 19:16:29 +0000 UTC FinishedAt: 2026-09-03 19:33:39 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "e539025ff1f7351a42788c5a88aab59c26f5131b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMORY_HOTPLUG", "MEMORY_HOTREMOVE", "NUMA" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "e539025ff1f7351a42788c5a88aab59c26f5131b", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MEMORY_HOTPLUG", "MEMORY_HOTREMOVE", "NUMA" ], "series_id": "274cbd31-137a-4f63-ba0e-430801aaeca6" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "try_offline_node", "node_is_memoryless", "try_remove_memory" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01FTU9SWV9IT1RQTFVHJiMzNDssCiAgICAmIzM0O01FTU9SWV9IT1RSRU1PVkUmIzM0OywKICAgICYjMzQ7TlVNQSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RyeV9vZmZsaW5lX25vZGUmIzM0OywKICAgICYjMzQ7bm9kZV9pc19tZW1vcnlsZXNzJiMzNDssCiAgICAmIzM0O3RyeV9yZW1vdmVfbWVtb3J5JiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaXMgYSBwdXJlIHJlZmFjdG9yaW5nIGluIG1tL21lbW9yeV9ob3RwbHVnLmMgdGhhdCBleHRyYWN0cyB0aGUgY2hlY2sgZGV0ZXJtaW5pbmcgaWYgYSBOVU1BIG5vZGUgaXMgbWVtb3J5bGVzcyAoY2hlY2tpbmcgbm9kZV9zcGFubmVkX3BhZ2VzIGFuZCBpdGVyYXRpbmcgbWVtb3J5IGJsb2NrcykgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gbm9kZV9pc19tZW1vcnlsZXNzKCkuIE5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIHBhdGh3YXlzIGFyZSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nOyBzdGFuZGFyZCBzYW5pdGl6ZXJzIGFuZCB0ZXN0IHN1aXRlcyAoS0FTQU4sIExPQ0tERVApIGFyZSBzdWZmaWNpZW50LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG1lbW9yeSBob3RwbHVnIGNvZGUgKG1tL21lbW9yeV9ob3RwbHVnLmMpLCBleHRyYWN0aW5nIG5vZGUgbWVtb3J5bGVzcyBjaGVja3MgaW50byBub2RlX2lzX21lbW9yeWxlc3MoKSB1c2VkIGR1cmluZyBOVU1BIG5vZGUgb2ZmbGluaW5nIGluIHRyeV9vZmZsaW5lX25vZGUoKS4gVGhpcyBpcyByZWFjaGFibGUgdmlhIG1lbW9yeSBob3QtdW5wbHVnIG9wZXJhdGlvbnMgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBhNTNlMTlhMGI2ZDI0YjIwMTQ5ZDA0YjM1YTAxZjVhNTk1MDFlZGZhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAxOTozMDo0NyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xuaW5kZXggMjI2YWI5Y2IwNzhhZC4uZDBlOTQwNTc2ODJhZiAxMDA2NDRcbi0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbW9yeV9ob3RwbHVnLmNcbkBAIC0xNDkxLDYgJiM0MzsxNDkxLDM2IEBAIHN0YXRpYyBpbnQgY3JlYXRlX2FsdG1hcHNfYW5kX21lbW9yeV9ibG9ja3MoaW50IG5pZCwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiYjNDM7c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdGludCBuaWQgPSAqKGludCAqKWFyZztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBJZiBhIG1lbW9yeSBibG9jayBiZWxvbmdzIHRvIG11bHRpcGxlIG5vZGVzLCB0aGUgc3RvcmVkIG5pZCBpcyBub3RcbiYjNDM7XHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbiYjNDM7XHQgKiBvZmZsaW5lZCkgYW5kLCB0aGVyZWZvcmUsIGFyZSBzdGlsbCBzcGFubmVkIGJ5IHRoZSBub2RlLlxuJiM0MztcdCAqL1xuJiM0MztcdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xuJiM0MztzdGF0aWMgYm9vbCBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClcbiYjNDM7e1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQSBub2RlIHN0aWxsIHNwYW5uaW5nIHBhZ2VzIChlc3BlY2lhbGx5IFpPTkVfREVWSUNFKSBpcyBub3RcbiYjNDM7XHQgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksXG4mIzQzO1x0ICogZS5nLiBvbmNlIGEgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIG9ubGluZWQuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogT2ZmbGluZSBtZW1vcnkgYmxvY2tzIG1heSBub3QgYmUgc3Bhbm5lZCBieSB0aGUgbm9kZSB5ZXQsIGJ1dCB0aGV5XG4mIzQzO1x0ICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdFxuJiM0MztcdCAqIG1lbW9yeWxlc3Mgd2hpbGUgYW55IHJlbWFpbi5cbiYjNDM7XHQgKi9cbiYjNDM7XHRyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIE5PVEU6IFRoZSBjYWxsZXIgbXVzdCBjYWxsIGxvY2tfZGV2aWNlX2hvdHBsdWcoKSB0byBzZXJpYWxpemUgaG90cGx1Z1xuICAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuXG5AQCAtMjIxNCwxOCAmIzQzOzIyNDQsNiBAQCBzdGF0aWMgaW50IGNoZWNrX2NwdV9vbl9ub2RlKGludCBuaWQpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbi17XG4tXHRpbnQgbmlkID0gKihpbnQgKilhcmc7XG4tXG4tXHQvKlxuLVx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XG4tXHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbi1cdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXG4tXHQgKi9cbi1cdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuLX1cbi1cbiAvKipcbiAgKiB0cnlfb2ZmbGluZV9ub2RlXG4gICogQG5pZDogdGhlIG5vZGUgSURcbkBAIC0yMjM3LDIzICYjNDM7MjI1NSw3IEBAIHN0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXG4gICovXG4gdm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXG4ge1xuLVx0aW50IHJjO1xuLVxuLVx0Lypcbi1cdCAqIElmIHRoZSBub2RlIHN0aWxsIHNwYW5zIHBhZ2VzIChlc3BlY2lhbGx5IFpPTkVfREVWSUNFKSwgZG9uJiMzOTt0XG4tXHQgKiBvZmZsaW5lIGl0LiBBIG5vZGUgc3BhbnMgbWVtb3J5IGFmdGVyIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoKSxcbi1cdCAqIGUuZy4sIGFmdGVyIHRoZSBtZW1vcnkgYmxvY2sgd2FzIG9ubGluZWQuXG4tXHQgKi9cbi1cdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcbi1cdFx0cmV0dXJuO1xuLVxuLVx0Lypcbi1cdCAqIEVzcGVjaWFsbHkgb2ZmbGluZSBtZW1vcnkgYmxvY2tzIG1pZ2h0IG5vdCBiZSBzcGFubmVkIGJ5IHRoZVxuLVx0ICogbm9kZS4gVGhleSB3aWxsIGdldCBzcGFubmVkIGJ5IHRoZSBub2RlIG9uY2UgdGhleSBnZXQgb25saW5lZC5cbi1cdCAqIEhvd2V2ZXIsIHRoZXkgbGluayB0byB0aGUgbm9kZSBpbiBzeXNmcyBhbmQgY2FuIGdldCBvbmxpbmVkIGxhdGVyLlxuLVx0ICovXG4tXHRyYyA9IGZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbi1cdGlmIChyYylcbiYjNDM7XHRpZiAoIW5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpKVxuIFx0XHRyZXR1cm47XG4gXG4gXHRpZiAoY2hlY2tfY3B1X29uX25vZGUobmlkKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUkVNT1ZFJiMzNDssCiAgICAmIzM0O05VTUEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt0cnlfb2ZmbGluZV9ub2RlJiMzNDssCiAgICAmIzM0O25vZGVfaXNfbWVtb3J5bGVzcyYjMzQ7LAogICAgJiMzNDt0cnlfcmVtb3ZlX21lbW9yeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG1lbW9yeSBob3RwbHVnIGNvZGUgKG1tL21lbW9yeV9ob3RwbHVnLmMpLCBleHRyYWN0aW5nIG5vZGUgbWVtb3J5bGVzcyBjaGVja3MgaW50byBub2RlX2lzX21lbW9yeWxlc3MoKSB1c2VkIGR1cmluZyBOVU1BIG5vZGUgb2ZmbGluaW5nIGluIHRyeV9vZmZsaW5lX25vZGUoKS4gVGhpcyBpcyByZWFjaGFibGUgdmlhIG1lbW9yeSBob3QtdW5wbHVnIG9wZXJhdGlvbnMgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBhNTNlMTlhMGI2ZDI0YjIwMTQ5ZDA0YjM1YTAxZjVhNTk1MDFlZGZhCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMyAxOTozMDo0NyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDIyNmFiOWNiMDc4YWQuLmQwZTk0MDU3NjgyYWYgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMTQ5MSw2ICYjNDM7MTQ5MSwzNiBAQCBzdGF0aWMgaW50IGNyZWF0ZV9hbHRtYXBzX2FuZF9tZW1vcnlfYmxvY2tzKGludCBuaWQsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLAogCXJldHVybiByZXQ7CiB9CiAKJiM0MztzdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJaW50IG5pZCA9ICooaW50ICopYXJnOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJZiBhIG1lbW9yeSBibG9jayBiZWxvbmdzIHRvIG11bHRpcGxlIG5vZGVzLCB0aGUgc3RvcmVkIG5pZCBpcyBub3QKJiM0MzsJICogcmVsaWFibGUuIEhvd2V2ZXIsIHN1Y2ggYmxvY2tzIGFyZSBhbHdheXMgb25saW5lIChlLmcuLCBjYW5ub3QgZ2V0CiYjNDM7CSAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gbWVtLSZndDtuaWQgPT0gbmlkID8gLUVFWElTVCA6IDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovCiYjNDM7c3RhdGljIGJvb2wgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpCiYjNDM7ewomIzQzOwkvKgomIzQzOwkgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdAomIzQzOwkgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksCiYjNDM7CSAqIGUuZy4gb25jZSBhIG1lbW9yeSBibG9jayBoYXMgYmVlbiBvbmxpbmVkLgomIzQzOwkgKi8KJiM0MzsJaWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwkvKgomIzQzOwkgKiBPZmZsaW5lIG1lbW9yeSBibG9ja3MgbWF5IG5vdCBiZSBzcGFubmVkIGJ5IHRoZSBub2RlIHlldCwgYnV0IHRoZXkKJiM0MzsJICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdAomIzQzOwkgKiBtZW1vcnlsZXNzIHdoaWxlIGFueSByZW1haW4uCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jaygmYW1wO25pZCwgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2IpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWcKICAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuCkBAIC0yMjE0LDE4ICYjNDM7MjI0NCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfY3B1X29uX25vZGUoaW50IG5pZCkKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZykKLXsKLQlpbnQgbmlkID0gKihpbnQgKilhcmc7Ci0KLQkvKgotCSAqIElmIGEgbWVtb3J5IGJsb2NrIGJlbG9uZ3MgdG8gbXVsdGlwbGUgbm9kZXMsIHRoZSBzdG9yZWQgbmlkIGlzIG5vdAotCSAqIHJlbGlhYmxlLiBIb3dldmVyLCBzdWNoIGJsb2NrcyBhcmUgYWx3YXlzIG9ubGluZSAoZS5nLiwgY2Fubm90IGdldAotCSAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuCi0JICovCi0JcmV0dXJuIG1lbS0mZ3Q7bmlkID09IG5pZCA/IC1FRVhJU1QgOiAwOwotfQotCiAvKioKICAqIHRyeV9vZmZsaW5lX25vZGUKICAqIEBuaWQ6IHRoZSBub2RlIElECkBAIC0yMjM3LDIzICYjNDM7MjI1NSw3IEBAIHN0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpCiAgKi8KIHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKQogewotCWludCByYzsKLQotCS8qCi0JICogSWYgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpLCBkb24mIzM5O3QKLQkgKiBvZmZsaW5lIGl0LiBBIG5vZGUgc3BhbnMgbWVtb3J5IGFmdGVyIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoKSwKLQkgKiBlLmcuLCBhZnRlciB0aGUgbWVtb3J5IGJsb2NrIHdhcyBvbmxpbmVkLgotCSAqLwotCWlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBFc3BlY2lhbGx5IG9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtaWdodCBub3QgYmUgc3Bhbm5lZCBieSB0aGUKLQkgKiBub2RlLiBUaGV5IHdpbGwgZ2V0IHNwYW5uZWQgYnkgdGhlIG5vZGUgb25jZSB0aGV5IGdldCBvbmxpbmVkLgotCSAqIEhvd2V2ZXIsIHRoZXkgbGluayB0byB0aGUgbm9kZSBpbiBzeXNmcyBhbmQgY2FuIGdldCBvbmxpbmVkIGxhdGVyLgotCSAqLwotCXJjID0gZm9yX2VhY2hfbWVtb3J5X2Jsb2NrKCZhbXA7bmlkLCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYik7Ci0JaWYgKHJjKQomIzQzOwlpZiAoIW5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpKQogCQlyZXR1cm47CiAKIAlpZiAoY2hlY2tfY3B1X29uX25vZGUobmlkKSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzY0NwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDk0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgTWVtb3J5IEhvdHBsdWcgUGF0Y2gqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW4uIE15IGZpcnN0IGluc3RpbmN0IGlzIGFsd2F5cyB0byBkaXNzZWN0IHRoZSBwYXRjaCBpdHNlbGYuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb2RlIGNoYW5nZXMgZGlyZWN0bHkuIEkmIzM5O2xsIHRoZW4gbW92ZSBvbiB0byBwaW5wb2ludGluZyB3aGVyZSB0aGUga2V5IGZ1bmN0aW9ucywgYG5vZGVfaXNfbWVtb3J5bGVzc2Agb3IgYHRyeV9vZmZsaW5lX25vZGVgLCBhcmUgYWN0dWFsbHkgYmVpbmcgKnVzZWQqLiBBIHF1aWNrIGByZWFkLWZpbGVgIG9yIGBncmVwcGVyYCBzY2FuIG9mIHRoZSBjb2RlYmFzZSBpcyBteSBnby10byBhcHByb2FjaCBoZXJlLiBTcGVjaWZpY2FsbHksIEkmIzM5O2xsIGJlIHRhcmdldGluZyBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIEkgd2FudCB0byBzZWUgaWYgYG5vZGVfaXNfbWVtb3J5bGVzc2AgaXMgYmVpbmcgbGV2ZXJhZ2VkIGFueXdoZXJlIGVsc2UgaW4gdGhhdCBmaWxlIGJleW9uZCB0aGUgaW1tZWRpYXRlIHNjb3BlIG9mIHRoZSBwYXRjaCwgYW5kIHRvIHVuZGVyc3RhbmQgdGhlIGNhbGwgc3RydWN0dXJlIHdpdGggYHRyeV9vZmZsaW5lX25vZGVgLiBBIGdvb2QgYGdyZXBgIG9yIGRpcmVjdCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgcmVhZGluZyBpcyB3aGF0IEkgbmVlZCBoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25vZGVfaXNfbWVtb3J5bGVzcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeV9ob3RwbHVnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYz0xNDk0PXN0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNTA2LS8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE1MDc6c3RhdGljIGJvb2wgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE1MDgte1xuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MjI1Nj12b2lkIHRyeV9vZmZsaW5lX25vZGUoaW50IG5pZClcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI1Ny17XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyNTg6XHRpZiAoIW5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpKVxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjU5LVx0XHRyZXR1cm47XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDE3MAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDQ4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuCgoqKkludmVzdGlnYXRpbmcgYSBDb2RlIFNlZ21lbnQgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgKioKCkFscmlnaHQsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgZ29pbmcgb24gYXJvdW5kIGxpbmVzIDE0OTAtMTU1MCBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB6b29tIG91dCBhIGJpdCBhbmQgZ2V0IHNvbWUgY29udGV4dC4gSSB3YW50IHRvIHNlZSBpZiB0aGlzIHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZSBpcyBqdXN0IGEgc3RhbmRhbG9uZSBmdW5jdGlvbiwgb3IgaWYgaXQmIzM5O3MgcGFydCBvZiBhIGxhcmdlciwgcG90ZW50aWFsbHkgcmVsYXRlZCBzZXJpZXMgb2YgY2FsbHMgd2l0aGluIHRoZSBob3RwbHVnIHN1YnN5c3RlbS4gSXMgdGhpcyBsaW5lIHBhcnQgb2YgYSBicm9hZGVyIHJlZmFjdG9yaW5nIGVmZm9ydCBvciBzb21lIGtpbmQgb2Ygc2VxdWVudGlhbCBwcm9jZXNzaW5nPyBVbmRlcnN0YW5kaW5nIHRoZSBzdXJyb3VuZGluZyBjb2RlIHdpbGwgbGlrZWx5IGJlIGtleSB0byBmaWd1cmluZyBvdXQgdGhlIG92ZXJhbGwgaW50ZW50IGFuZCBwb3RlbnRpYWwgaXNzdWVzIGluIHRoaXMgc3BlY2lmaWMgcmFuZ2UuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgcXVpY2tseSBzY2FubmluZyB0aGUgY2FsbCBncmFwaCBhbmQgYW55IG5lYXJieSBjb21tZW50cyB0byBzZWUgaG93IHRoaXMgZml0cyBpbnRvIHRoZSBiaWdnZXIgcGljdHVyZSBvZiBtZW1vcnkgaG90cGx1Z2dpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTQ4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNDgwOlx0XHRcdGlmIChyZXQpIHtcbjE0ODE6XHRcdFx0XHRhcmNoX3JlbW92ZV9tZW1vcnkoY3VyX3N0YXJ0LCBtZW1ibG9ja19zaXplLCBwYXJhbXMuYWx0bWFwLCBOVUxMKTtcbjE0ODI6XHRcdFx0XHRhbHRtYXBfZnJlZShwYXJhbXMuYWx0bWFwKTtcbjE0ODM6XHRcdFx0XHRnb3RvIG91dDtcbjE0ODQ6XHRcdFx0fVxuMTQ4NTpcdFx0fVxuMTQ4NjpcdFxuMTQ4NzpcdFx0cmV0dXJuIDA7XG4xNDg4Olx0b3V0OlxuMTQ4OTpcdFx0aWYgKHJldCBcdTAwMjZcdTAwMjYgY3VyX3N0YXJ0ICE9IHN0YXJ0KVxuMTQ5MDpcdFx0XHRyZW1vdmVfbWVtb3J5X2Jsb2Nrc19hbmRfYWx0bWFwcyhzdGFydCwgY3VyX3N0YXJ0IC0gc3RhcnQpO1xuMTQ5MTpcdFx0cmV0dXJuIHJldDtcbjE0OTI6XHR9XG4xNDkzOlx0XG4xNDk0Olx0c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbjE0OTU6XHR7XG4xNDk2Olx0XHRpbnQgbmlkID0gKihpbnQgKilhcmc7XG4xNDk3Olx0XG4xNDk4Olx0XHQvKlxuMTQ5OTpcdFx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XG4xNTAwOlx0XHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbjE1MDE6XHRcdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXG4xNTAyOlx0XHQgKi9cbjE1MDM6XHRcdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuMTUwNDpcdH1cbjE1MDU6XHRcbjE1MDY6XHQvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xuMTUwNzpcdHN0YXRpYyBib29sIG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKVxuMTUwODpcdHtcbjE1MDk6XHRcdC8qXG4xNTEwOlx0XHQgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdFxuMTUxMTpcdFx0ICogbWVtb3J5bGVzcy4gIEEgbm9kZSBzcGFucyBtZW1vcnkgYWZ0ZXIgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSgpLFxuMTUxMjpcdFx0ICogZS5nLiBvbmNlIGEgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIG9ubGluZWQuXG4xNTEzOlx0XHQgKi9cbjE1MTQ6XHRcdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcbjE1MTU6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTUxNjpcdFx0LypcbjE1MTc6XHRcdCAqIE9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtYXkgbm90IGJlIHNwYW5uZWQgYnkgdGhlIG5vZGUgeWV0LCBidXQgdGhleVxuMTUxODpcdFx0ICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdFxuMTUxOTpcdFx0ICogbWVtb3J5bGVzcyB3aGlsZSBhbnkgcmVtYWluLlxuMTUyMDpcdFx0ICovXG4xNTIxOlx0XHRyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbjE1MjI6XHR9XG4xNTIzOlx0XG4xNTI0Olx0LypcbjE1MjU6XHQgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcbjE1MjY6XHQgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyAodHJpZ2dlcmVkIGUuZy4gYnkgc3lzZnMpLlxuMTUyNzpcdCAqXG4xNTI4Olx0ICogd2UgYXJlIE9LIGNhbGxpbmcgX19tZW1pbml0IHN0dWZmIGhlcmUgLSB3ZSBoYXZlIENPTkZJR19NRU1PUllfSE9UUExVR1xuMTUyOTpcdCAqL1xuMTUzMDpcdHN0YXRpYyBpbnQgX19hZGRfbWVtb3J5X3Jlc291cmNlKGludCBuaWQsIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBtaHBfdCBtaHBfZmxhZ3MsXG4xNTMxOlx0XHRcdFx0XHQgZW51bSBtbW9wIG9ubGluZV90eXBlKVxuMTUzMjpcdHtcbjE1MzM6XHRcdHN0cnVjdCBtaHBfcGFyYW1zIHBhcmFtcyA9IHsgLnBncHJvdCA9IHBncHJvdF9taHAoUEFHRV9LRVJORUwpIH07XG4xNTM0Olx0XHRlbnVtIG1lbWJsb2NrX2ZsYWdzIG1lbWJsb2NrX2ZsYWdzID0gTUVNQkxPQ0tfTk9ORTtcbjE1MzU6XHRcdHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwID0gTlVMTDtcbjE1MzY6XHRcdHU2NCBzdGFydCwgc2l6ZTtcbjE1Mzc6XHRcdGJvb2wgbmV3X25vZGUgPSBmYWxzZTtcbjE1Mzg6XHRcdGludCByZXQ7XG4xNTM5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTM3MAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBpdHMgRGVwZW5kZW5jaWVzKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYF9fYWRkX21lbW9yeV9yZXNvdXJjZWAgZnVuY3Rpb24gYmV0dGVyLiBDbGVhcmx5LCBpdCYjMzk7cyBjZW50cmFsIHRvIGhvdyBtZW1vcnkgcmVzb3VyY2VzIGFyZSBhZGRlZCB0byB0aGUgc3lzdGVtLCBidXQgSSBuZWVkIHRoZSBicm9hZGVyIGNvbnRleHQuIE15IG5leHQgbW92ZSBpcyB0byBnbyBkZWVwZXIgaW50byBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgaXRzZWxmLiBJIHdhbnQgdG8gc2VlICpleGFjdGx5KiBob3cgYF9fYWRkX21lbW9yeV9yZXNvdXJjZWAgaXMgdXNlZC4gVGhpcyBtZWFucyB0cmFjaW5nIGFsbCB0aGUgY2FsbGVycy4gSXQmIzM5O3MgYSBjcml0aWNhbCBmdW5jdGlvbiwgbm8gZG91YnQsIGJ1dCB1bmRlcnN0YW5kaW5nIHRoZSBzdXJyb3VuZGluZyBsb2dpYyBpcyBwYXJhbW91bnQgdG8gc2VlaW5nIHRoZSBiaWdnZXIgcGljdHVyZS4gQXJlIHRoZXJlIGFueSBpbmRpcmVjdCBjYWxscz8gV2hhdCBraW5kIG9mIGRhdGEgc3RydWN0dXJlcyBkb2VzIGl0IG1hbmlwdWxhdGU/IEkgbmVlZCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBzdWJ0bGUgcmFjZSBjb25kaXRpb25zIG9yIG1lbW9yeSBhbGxvY2F0aW9uIGlzc3VlcyBsdXJraW5nIGluIHRoZSBjb2RlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTU0MDpcdFx0c3RhcnQgPSByZXMtXHUwMDNlc3RhcnQ7XG4xNTQxOlx0XHRzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpO1xuMTU0MjpcdFxuMTU0MzpcdFx0cmV0ID0gY2hlY2tfaG90cGx1Z19tZW1vcnlfcmFuZ2Uoc3RhcnQsIHNpemUpO1xuMTU0NDpcdFx0aWYgKHJldClcbjE1NDU6XHRcdFx0cmV0dXJuIHJldDtcbjE1NDY6XHRcbjE1NDc6XHRcdGlmIChtaHBfZmxhZ3MgXHUwMDI2IE1IUF9OSURfSVNfTUdJRCkge1xuMTU0ODpcdFx0XHRncm91cCA9IG1lbW9yeV9ncm91cF9maW5kX2J5X2lkKG5pZCk7XG4xNTQ5Olx0XHRcdGlmICghZ3JvdXApXG4xNTUwOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4xNTUxOlx0XHRcdG5pZCA9IGdyb3VwLVx1MDAzZW5pZDtcbjE1NTI6XHRcdH1cbjE1NTM6XHRcbjE1NTQ6XHRcdGlmICghbm9kZV9wb3NzaWJsZShuaWQpKSB7XG4xNTU1Olx0XHRcdFdBUk4oMSwgXCYjMzQ7bm9kZSAlZCB3YXMgYWJzZW50IGZyb20gdGhlIG5vZGVfcG9zc2libGVfbWFwXFxuXCYjMzQ7LCBuaWQpO1xuMTU1NjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjE1NTc6XHRcdH1cbjE1NTg6XHRcbjE1NTk6XHRcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XG4xNTYwOlx0XG4xNTYxOlx0XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJDSF9LRUVQX01FTUJMT0NLKSkge1xuMTU2MjpcdFx0XHRpZiAocmVzLVx1MDAzZWZsYWdzIFx1MDAyNiBJT1JFU09VUkNFX1NZU1JBTV9EUklWRVJfTUFOQUdFRClcbjE1NjM6XHRcdFx0XHRtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX0RSSVZFUl9NQU5BR0VEO1xuMTU2NDpcdFx0XHRyZXQgPSBtZW1ibG9ja19hZGRfbm9kZShzdGFydCwgc2l6ZSwgbmlkLCBtZW1ibG9ja19mbGFncyk7XG4xNTY1Olx0XHRcdGlmIChyZXQpXG4xNTY2Olx0XHRcdFx0Z290byBlcnJvcl9tZW1faG90cGx1Z19lbmQ7XG4xNTY3Olx0XHR9XG4xNTY4Olx0XG4xNTY5Olx0XHRyZXQgPSBfX3RyeV9vbmxpbmVfbm9kZShuaWQsIGZhbHNlKTtcbjE1NzA6XHRcdGlmIChyZXQgXHUwMDNjIDApXG4xNTcxOlx0XHRcdGdvdG8gZXJyb3JfbWVtYmxvY2tfcmVtb3ZlO1xuMTU3MjpcdFx0aWYgKHJldCkge1xuMTU3MzpcdFx0XHRub2RlX3NldF9vbmxpbmUobmlkKTtcbjE1NzQ6XHRcdFx0cmV0ID0gcmVnaXN0ZXJfbm9kZShuaWQpO1xuMTU3NTpcdFx0XHRpZiAoV0FSTl9PTihyZXQpKSB7XG4xNTc2Olx0XHRcdFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xuMTU3NzpcdFx0XHRcdGdvdG8gZXJyb3JfbWVtYmxvY2tfcmVtb3ZlO1xuMTU3ODpcdFx0XHR9XG4xNTc5Olx0XHRcdG5ld19ub2RlID0gdHJ1ZTtcbjE1ODA6XHRcdH1cbjE1ODE6XHRcbjE1ODI6XHRcdC8qXG4xNTgzOlx0XHQgKiBTZWxmIGhvc3RlZCBtZW1tYXAgYXJyYXlcbjE1ODQ6XHRcdCAqL1xuMTU4NTpcdFx0aWYgKChtaHBfZmxhZ3MgXHUwMDI2IE1IUF9NRU1NQVBfT05fTUVNT1JZKSBcdTAwMjZcdTAwMjZcbjE1ODY6XHRcdCAgICBtaHBfc3VwcG9ydHNfbWVtbWFwX29uX21lbW9yeSgpKSB7XG4xNTg3Olx0XHRcdHJldCA9IGNyZWF0ZV9hbHRtYXBzX2FuZF9tZW1vcnlfYmxvY2tzKG5pZCwgZ3JvdXAsIHN0YXJ0LCBzaXplKTtcbjE1ODg6XHRcdFx0aWYgKHJldClcbjE1ODk6XHRcdFx0XHRnb3RvIGVycm9yO1xuMTU5MDpcdFx0fSBlbHNlIHtcbjE1OTE6XHRcdFx0cmV0ID0gYXJjaF9hZGRfbWVtb3J5KG5pZCwgc3RhcnQsIHNpemUsIFx1MDAyNnBhcmFtcyk7XG4xNTkyOlx0XHRcdGlmIChyZXQgXHUwMDNjIDApXG4xNTkzOlx0XHRcdFx0Z290byBlcnJvcjtcbjE1OTQ6XHRcbjE1OTU6XHRcdFx0LyogY3JlYXRlIG1lbW9yeSBibG9jayBkZXZpY2VzIGFmdGVyIG1lbW9yeSB3YXMgYWRkZWQgKi9cbjE1OTY6XHRcdFx0cmV0ID0gY3JlYXRlX21lbW9yeV9ibG9ja19kZXZpY2VzKHN0YXJ0LCBzaXplLCBuaWQsIE5VTEwsIGdyb3VwKTtcbjE1OTc6XHRcdFx0aWYgKHJldCkge1xuMTU5ODpcdFx0XHRcdGFyY2hfcmVtb3ZlX21lbW9yeShzdGFydCwgc2l6ZSwgcGFyYW1zLmFsdG1hcCwgTlVMTCk7XG4xNTk5Olx0XHRcdFx0Z290byBlcnJvcjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NDk4CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIEkmIzM5O20gcmVhZHkgdG8gZGl2ZSBpbnRvIHRoYXQgc2VjdGlvbi4gSGVyZSYjMzk7cyBteSB0YWtlLCBhc3N1bWluZyBJJiMzOTttIHRoZSBvbmUgcHJvY2Vzc2luZyB0aGVzZSB0aG91Z2h0czoKCioqQW5hbHl6aW5nIExpbmVzIDE2MDAtMTYzMCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgemVybyBpbiBvbiBsaW5lcyAxNjAwIHRvIDE2MzAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IGVzdGFibGlzaCB0aGUgY29udGV4dC4gV2hhdCYjMzk7cyB0aGUgb3ZlcmFyY2hpbmcgdGhlbWUgb3IgYXJndW1lbnQgYmVpbmcgZGV2ZWxvcGVkIGluIHRoaXMgcGFydCBvZiB0aGUgZG9jdW1lbnQ/IEkgbmVlZCB0byBrbm93IHdoZXJlIHRoaXMgZmFsbHMgd2l0aGluIHRoZSBsYXJnZXIgc3RydWN0dXJlLiBJcyB0aGlzIGEgY3JpdGljYWwganVuY3R1cmUgaW4gdGhlIGFyZ3VtZW50PyBBcmUgd2UgZGVhbGluZyB3aXRoIGV2aWRlbmNlLCBhIGNvdW50ZXItYXJndW1lbnQsIG9yIGEgY29uY2x1c2lvbj8KCk5leHQsIEkmIzM5O2xsIG5lZWQgdG8gcGlucG9pbnQgdGhlIGtleSBwbGF5ZXJzIGFuZCB2YXJpYWJsZXMuIEFyZSB0aGVyZSBhbnkgc3BlY2lmaWMgdGVybXMgb3IgY29uY2VwdHMgYmVpbmcgaW50cm9kdWNlZCwgZGVmaW5lZCwgb3IgbWFuaXB1bGF0ZWQgd2l0aGluIHRoaXMgYmxvY2sgb2YgdGV4dD8gSSYjMzk7bSBsb29raW5nIGZvciB0aGUgY29yZSBpZGVhcyB0aGF0IHRoaXMgc2VjdGlvbiBoaW5nZXMgdXBvbi4KCkkmIzM5O2xsIHN0YXJ0IHJlYWRpbmcgdGhlIHNlbnRlbmNlcyB3aXRoIGFuIGV5ZSBmb3IgYW55IHBvdGVudGlhbCBhc3N1bXB0aW9ucyBvciBsb2dpY2FsIGxlYXBzIHRoYXQgbWF5IGJlIG9jY3VycmluZyB3aXRoaW4gdGhlIGxpbmVzLiBBcmUgdGhlcmUgYW55IGhpZGRlbiBwcmVtaXNlcyB0aGF0IHNob3VsZCBiZSBtYWRlIG1vcmUgZXhwbGljaXQ/IEkmIzM5O2xsIGFsc28gYmUgd2F0Y2hpbmcgZm9yIGFueSBpbnN0YW5jZXMgb2YgY29uZmlybWF0aW9uIGJpYXMgb3IgZmFsbGFjaW91cyByZWFzb25pbmcuCgpNeSBhbmFseXRpY2FsIGZvY3VzIHdpbGwgYmUgb24gdGhlIHN0cnVjdHVyZSBvZiBhbnkgYXJndW1lbnRzLCB0aGUgdmFsaWRpdHkgb2YgYW55IGNsYWltcywgYW5kIGhvdyB0aGV5IHJlbGF0ZSBiYWNrIHRvIHRoZSBvdmVyYWxsIG9iamVjdGl2ZS4gSWYgdGhlIGF1dGhvciBpcyBtYWtpbmcgYSBwZXJzdWFzaXZlIGFyZ3VtZW50LCBJJiMzOTtsbCBldmFsdWF0ZSB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGVpciByaGV0b3JpY2FsIHN0cmF0ZWd5LiBJZiB0aGV5JiMzOTtyZSBwcmVzZW50aW5nIGRhdGEsIEkmIzM5O2xsIGJlIGxvb2tpbmcgYXQgdGhlaXIgbWV0aG9kb2xvZ3kgYW5kIHBvdGVudGlhbCBmbGF3cyBpbiBpdC4KCkkgd2lsbCBuZWVkIHRvIGNhcmVmdWxseSBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSBsaW5lcywgbWFraW5nIHN1cmUgdGhlcmUgaXMgZmxvdyBhbmQgY29udGludWl0eS4gSXMgdGhlIGF1dGhvciBtYWtpbmcgYW55IG1lYW5pbmdmdWwgY29ubmVjdGlvbnMgYmV0d2VlbiBzZW50ZW5jZXMgb3IgdGhvdWdodHMsIG9yIGlzIGl0IGEgZGlzam9pbnRlZCBjaGFpbiBvZiBpZGVhcz8KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTYwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNjAwOlx0XHRcdH1cbjE2MDE6XHRcdH1cbjE2MDI6XHRcbjE2MDM6XHRcdHJlZ2lzdGVyX21lbW9yeV9ibG9ja3NfdW5kZXJfbm9kZV9ob3RwbHVnKG5pZCwgUEZOX0RPV04oc3RhcnQpLFxuMTYwNDpcdFx0XHRcdFx0XHQgIFBGTl9VUChzdGFydCAmIzQzOyBzaXplIC0gMSkpO1xuMTYwNTpcdFxuMTYwNjpcdFx0LyogY3JlYXRlIG5ldyBtZW1tYXAgZW50cnkgKi9cbjE2MDc6XHRcdGlmICghc3RyY21wKHJlcy1cdTAwM2VuYW1lLCBcJiMzNDtTeXN0ZW0gUkFNXCYjMzQ7KSlcbjE2MDg6XHRcdFx0ZmlybXdhcmVfbWFwX2FkZF9ob3RwbHVnKHN0YXJ0LCBzdGFydCAmIzQzOyBzaXplLCBcJiMzNDtTeXN0ZW0gUkFNXCYjMzQ7KTtcbjE2MDk6XHRcbjE2MTA6XHRcdC8qIGRldmljZV9vbmxpbmUoKSB3aWxsIHRha2UgdGhlIGxvY2sgd2hlbiBjYWxsaW5nIG9ubGluZV9wYWdlcygpICovXG4xNjExOlx0XHRtZW1faG90cGx1Z19kb25lKCk7XG4xNjEyOlx0XG4xNjEzOlx0XHQvKlxuMTYxNDpcdFx0ICogSW4gY2FzZSB3ZSYjMzk7cmUgYWxsb3dlZCB0byBtZXJnZSB0aGUgcmVzb3VyY2UsIGZsYWcgaXQgYW5kIHRyaWdnZXJcbjE2MTU6XHRcdCAqIG1lcmdpbmcgbm93IHRoYXQgYWRkaW5nIHN1Y2NlZWRlZC5cbjE2MTY6XHRcdCAqL1xuMTYxNzpcdFx0aWYgKG1ocF9mbGFncyBcdTAwMjYgTUhQX01FUkdFX1JFU09VUkNFKVxuMTYxODpcdFx0XHRtZXJnZV9zeXN0ZW1fcmFtX3Jlc291cmNlKHJlcyk7XG4xNjE5Olx0XG4xNjIwOlx0XHQvKiBvbmxpbmUgcGFnZXMgaWYgcmVxdWVzdGVkICovXG4xNjIxOlx0XHRpZiAob25saW5lX3R5cGUgIT0gTU1PUF9PRkZMSU5FKVxuMTYyMjpcdFx0XHR3YWxrX21lbW9yeV9ibG9ja3Moc3RhcnQsIHNpemUsIFx1MDAyNm9ubGluZV90eXBlLFxuMTYyMzpcdFx0XHRcdFx0ICAgb25saW5lX21lbW9yeV9ibG9jayk7XG4xNjI0Olx0XG4xNjI1Olx0XHRyZXR1cm4gcmV0O1xuMTYyNjpcdGVycm9yOlxuMTYyNzpcdFx0aWYgKG5ld19ub2RlKSB7XG4xNjI4Olx0XHRcdG5vZGVfc2V0X29mZmxpbmUobmlkKTtcbjE2Mjk6XHRcdFx0dW5yZWdpc3Rlcl9ub2RlKG5pZCk7XG4xNjMwOlx0XHR9XG4xNjMxOlx0ZXJyb3JfbWVtYmxvY2tfcmVtb3ZlOlxuMTYzMjpcdFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0FSQ0hfS0VFUF9NRU1CTE9DSykpXG4xNjMzOlx0XHRcdG1lbWJsb2NrX3JlbW92ZShzdGFydCwgc2l6ZSk7XG4xNjM0Olx0ZXJyb3JfbWVtX2hvdHBsdWdfZW5kOlxuMTYzNTpcdFx0bWVtX2hvdHBsdWdfZG9uZSgpO1xuMTYzNjpcdFx0cmV0dXJuIHJldDtcbjE2Mzc6XHR9XG4xNjM4Olx0XG4xNjM5Olx0aW50IGFkZF9tZW1vcnlfcmVzb3VyY2UoaW50IG5pZCwgc3RydWN0IHJlc291cmNlICpyZXMsIG1ocF90IG1ocF9mbGFncylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzQ4MQoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIGB0cnlfb2ZmbGluZV9ub2RlYCBDYWxsIFNpdGVzKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhlIGB0cnlfb2ZmbGluZV9ub2RlYCBmdW5jdGlvbiB3aXRoaW4gdGhlIGtlcm5lbC4gTXkgaW5pdGlhbCBmb2N1cyBpcyB0byBwaW5wb2ludCAqd2hlcmUqIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkLiBFc3NlbnRpYWxseSwgSSBuZWVkIHRvIHRyYWNlIGl0cyB1c2FnZSB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0cyBpbiB3aGljaCBhIG5vZGUgaXMgYmVpbmcgYnJvdWdodCBvZmZsaW5lLgoKVGhpcyBpcyBjcml0aWNhbCBiZWNhdXNlIGFuIG9mZmxpbmUgbm9kZSByZXByZXNlbnRzIGEgc2lnbmlmaWNhbnQgc3RhdGUgY2hhbmdlLCB3aXRoIHBvdGVudGlhbCBpbXBhY3RzIG9uIE5VTUEgYmFsYW5jaW5nLCBtZW1vcnkgYWxsb2NhdGlvbiwgQ1BVIGFmZmluaXR5LCBhbmQgdGhlIG92ZXJhbGwgc3lzdGVtJiMzOTtzIHJlc291cmNlIG1hbmFnZW1lbnQuIFVuZGVyc3RhbmRpbmcgdGhlIGNhbGwgc2l0ZXMgd2lsbCByZXZlYWwgdGhlIHRyaWdnZXJzIGZvciB0aGlzIG9wZXJhdGlvbiDigJMgYXJlIHdlIHRhbGtpbmcgYWJvdXQgaG90cGx1ZyBldmVudHMsIG1lbW9yeSBwcmVzc3VyZSBzY2VuYXJpb3MsIGVycm9yIGNvbmRpdGlvbnMsIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PwoKSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgdGhlIGNhbGwgZ3JhcGgsIGNvbnNpZGVyaW5nIHRoZSByZWxldmFudCBtb2R1bGVzIGFuZCBzdWJzeXN0ZW1zLiBJ4oCZbGwgc3RhcnQgYnkgdXNpbmcgc3RhdGljIGFuYWx5c2lzIHRvb2xzLCBsaWtlIGBjc2NvcGVgIG9yIGBncmVwIC1SYCB3aXRoIGFwcHJvcHJpYXRlIGZsYWdzLCB0byBxdWlja2x5IGlkZW50aWZ5IHRoZSBkaXJlY3QgY2FsbGVycy4gVGhlbiwgSSBtYXkgd2FudCB0byBsb29rIGF0IGNvbnRyb2wgZmxvdyBhbmFseXNpcyB0byBmaWd1cmUgb3V0IGNvbmRpdGlvbmFsIGNhbGxzIG9yIGNhbGxzIHRoYXQgZGVwZW5kIG9uIG90aGVyIG1vZHVsZXMuIEkmIzM5O2xsIG5lZWQgdG8gY29uc2lkZXIgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGluZGlyZWN0IGNhbGxzLgoKQmV5b25kIHRoZSBkaXJlY3QgY2FsbGVycywgSSBhbHNvIG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhlICpyZWFzb25pbmcqIGJlaGluZCB0aGVzZSBjYWxscy4gV2hhdCYjMzk7cyB0aGUgd2lkZXIgY29udGV4dD8gQXJlIHdlIGRlYWxpbmcgd2l0aCBoYXJkd2FyZSBmYWlsdXJlcywgYWRtaW5pc3RyYXRvciBpbnRlcnZlbnRpb24sIG9yIGF1dG9tYXRlZCBwb3dlciBtYW5hZ2VtZW50IHN5c3RlbXM/IFRoaXMgaXMgaW1wb3J0YW50IGZvciBkZXRlcm1pbmluZyB0aGUgcHJpb3JpdHksIHRpbWluZywgYW5kIHBvdGVudGlhbCBjb25zZXF1ZW5jZXMgb2YgdGhlIG9wZXJhdGlvbi4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYXNzb2NpYXRlZCBsb2dnaW5nIG1lc3NhZ2VzLCBlcnJvciBoYW5kbGluZyByb3V0aW5lcywgYW5kIGFueSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBlbXBsb3llZCBhcm91bmQgdGhlIGB0cnlfb2ZmbGluZV9ub2RlYCBjYWxscy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dHJ5X29mZmxpbmVfbm9kZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYz00NzY9c3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG9zdF9lamVjdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSlcbi0tXG5kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYy01MTEtXG5kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYzo1MTI6XHR0cnlfb2ZmbGluZV9ub2RlKGNwdV90b19ub2RlKHByLVx1MDAzZWlkKSk7XG5kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYy01MTMtXG4tLVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oPTI2MD1zdGF0aWMgaW5saW5lIHZvaWQgcGdkYXRfcmVzaXplX2luaXQoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCkge31cbi0tXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgtMjY0LVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oOjI2NTpleHRlcm4gdm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpO1xuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI2Ni1leHRlcm4gaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oPTI3MT1pbnQgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMoY29uc3Qgc3RydWN0IHJhbmdlICpyYW5nZXMsXG4tLVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI3NC0jZWxzZVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oOjI3NTpzdGF0aWMgaW5saW5lIHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKSB7fVxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI3Ni1cbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIyMzE9c3RhdGljIGludCBjaGVja19jcHVfb25fbm9kZShpbnQgbmlkKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI0Ny0vKipcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjI0ODogKiB0cnlfb2ZmbGluZV9ub2RlXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNDktICogQG5pZDogdGhlIG5vZGUgSURcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNTUtICovXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyNTY6dm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNTcte1xuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI3MC19XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyNzE6RVhQT1JUX1NZTUJPTCh0cnlfb2ZmbGluZV9ub2RlKTtcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI3Mi1cbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIyOTM9c3RhdGljIGludCB0cnlfcmVtb3ZlX21lbW9yeSh1NjQgc3RhcnQsIHU2NCBzaXplKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMjMzOS1cdGlmIChuaWQgIT0gTlVNQV9OT19OT0RFKVxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMzQwOlx0XHR0cnlfb2ZmbGluZV9ub2RlKG5pZCk7XG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIzNDEtXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMzUyLSAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zIGJlZm9yZSB0aGlzIGNhbGwsIGFzIHJlcXVpcmVkIGJ5XG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIzNTM6ICogdHJ5X29mZmxpbmVfbm9kZSgpLlxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMzU0LSAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NTY5CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29tcGxldGUgcGljdHVyZSBvZiBob3cgYHRyeV9vZmZsaW5lX25vZGVgIHdvcmtzLiBJJiMzOTt2ZSBnb3QgdGhlIGltbWVkaWF0ZSBmdW5jdGlvbiBpbiBmcm9udCBvZiBtZSwgYnV0IHRvIHRydWx5IGdyYXNwIHRoZSBpbXBsaWNhdGlvbnMgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbnMsIEkgbmVlZCB0byB0cmFjZSBpdHMgdXNhZ2UuIEkmIzM5O20gZ29pbmcgdG8gZm9sbG93IHRoZSBjYWxsIGNoYWluIGFuZCB1bmRlcnN0YW5kIHdoZXJlIGB0cnlfb2ZmbGluZV9ub2RlYCBpcyBjYWxsZWQgZnJvbS4gVGhhdCBtZWFucyBkaWdnaW5nIGludG8gYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBmaW5kaW5nIGFsbCB0aGUgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIGFuYWx5emUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYHRyeV9vZmZsaW5lX25vZGVgIGl0c2VsZiB0byB1bmRlcnN0YW5kIGFueSBsb2NhbCBjb250ZXh0IHRoYXQgbWlnaHQgYmUgaW1wYWN0aW5nLiBFc3NlbnRpYWxseSwgSSYjMzk7bSB0cnlpbmcgdG8gZ2V0IGEgYmlyZHMgZXllIHZpZXcgb2YgdGhlIGVudGlyZSBmbG93IHNvIEkgZG9uJiMzOTt0IG1pc3MgYW55IGNyaXRpY2FsIGRldGFpbHMgcmVsYXRlZCB0byBtZW1vcnkgaG90cGx1Z2dpbmcuIE9uY2UgSSBnZXQgdGhlIGZ1bGwgY29udGV4dCwgSSBjYW4gcmVhbGx5IHN0YXJ0IHRvIGRpYWdub3NlIHdoYXRldmVyIGlzc3VlIEkmIzM5O20gbG9va2luZyBhdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjI0NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA3MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMjQ1Olx0fVxuMjI0NjpcdFxuMjI0NzpcdC8qKlxuMjI0ODpcdCAqIHRyeV9vZmZsaW5lX25vZGVcbjIyNDk6XHQgKiBAbmlkOiB0aGUgbm9kZSBJRFxuMjI1MDpcdCAqXG4yMjUxOlx0ICogT2ZmbGluZSBhIG5vZGUgaWYgYWxsIG1lbW9yeSBzZWN0aW9ucyBhbmQgY3B1cyBvZiB0aGUgbm9kZSBhcmUgcmVtb3ZlZC5cbjIyNTI6XHQgKlxuMjI1MzpcdCAqIE5PVEU6IFRoZSBjYWxsZXIgbXVzdCBjYWxsIGxvY2tfZGV2aWNlX2hvdHBsdWcoKSB0byBzZXJpYWxpemUgaG90cGx1Z1xuMjI1NDpcdCAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zIGJlZm9yZSB0aGlzIGNhbGwuXG4yMjU1Olx0ICovXG4yMjU2Olx0dm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXG4yMjU3Olx0e1xuMjI1ODpcdFx0aWYgKCFub2RlX2lzX21lbW9yeWxlc3MobmlkKSlcbjIyNTk6XHRcdFx0cmV0dXJuO1xuMjI2MDpcdFxuMjI2MTpcdFx0aWYgKGNoZWNrX2NwdV9vbl9ub2RlKG5pZCkpXG4yMjYyOlx0XHRcdHJldHVybjtcbjIyNjM6XHRcbjIyNjQ6XHRcdC8qXG4yMjY1Olx0XHQgKiBhbGwgbWVtb3J5L2NwdSBvZiB0aGlzIG5vZGUgYXJlIHJlbW92ZWQsIHdlIGNhbiBvZmZsaW5lIHRoaXNcbjIyNjY6XHRcdCAqIG5vZGUgbm93LlxuMjI2NzpcdFx0ICovXG4yMjY4Olx0XHRub2RlX3NldF9vZmZsaW5lKG5pZCk7XG4yMjY5Olx0XHR1bnJlZ2lzdGVyX25vZGUobmlkKTtcbjIyNzA6XHR9XG4yMjcxOlx0RVhQT1JUX1NZTUJPTCh0cnlfb2ZmbGluZV9ub2RlKTtcbjIyNzI6XHRcbjIyNzM6XHRzdGF0aWMgaW50IG1lbW9yeV9ibG9ja3NfaGF2ZV9hbHRtYXBzKHU2NCBzdGFydCwgdTY0IHNpemUpXG4yMjc0Olx0e1xuMjI3NTpcdFx0dTY0IG51bV9tZW1ibG9ja3MgPSBzaXplIC8gbWVtb3J5X2Jsb2NrX3NpemVfYnl0ZXMoKTtcbjIyNzY6XHRcdHU2NCBudW1fYWx0bWFwcyA9IDA7XG4yMjc3Olx0XG4yMjc4Olx0XHRpZiAoIW1ocF9tZW1tYXBfb25fbWVtb3J5KCkpXG4yMjc5Olx0XHRcdHJldHVybiAwO1xuMjI4MDpcdFxuMjI4MTpcdFx0d2Fsa19tZW1vcnlfYmxvY2tzKHN0YXJ0LCBzaXplLCBcdTAwMjZudW1fYWx0bWFwcyxcbjIyODI6XHRcdFx0XHQgICBjb3VudF9tZW1vcnlfcmFuZ2VfYWx0bWFwc19jYik7XG4yMjgzOlx0XG4yMjg0Olx0XHRpZiAobnVtX2FsdG1hcHMgPT0gMClcbjIyODU6XHRcdFx0cmV0dXJuIDA7XG4yMjg2Olx0XG4yMjg3Olx0XHRpZiAoV0FSTl9PTl9PTkNFKG51bV9tZW1ibG9ja3MgIT0gbnVtX2FsdG1hcHMpKVxuMjI4ODpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjIyODk6XHRcbjIyOTA6XHRcdHJldHVybiAxO1xuMjI5MTpcdH1cbjIyOTI6XHRcbjIyOTM6XHRzdGF0aWMgaW50IHRyeV9yZW1vdmVfbWVtb3J5KHU2NCBzdGFydCwgdTY0IHNpemUpXG4yMjk0Olx0e1xuMjI5NTpcdFx0aW50IHJjLCBuaWQgPSBOVU1BX05PX05PREU7XG4yMjk2Olx0XG4yMjk3Olx0XHRCVUdfT04oY2hlY2tfaG90cGx1Z19tZW1vcnlfcmFuZ2Uoc3RhcnQsIHNpemUpKTtcbjIyOTg6XHRcbjIyOTk6XHRcdC8qXG4yMzAwOlx0XHQgKiBBbGwgbWVtb3J5IGJsb2NrcyBtdXN0IGJlIG9mZmxpbmVkIGJlZm9yZSByZW1vdmluZyBtZW1vcnkuICBDaGVja1xuMjMwMTpcdFx0ICogd2hldGhlciBhbGwgbWVtb3J5IGJsb2NrcyBpbiBxdWVzdGlvbiBhcmUgb2ZmbGluZSBhbmQgcmV0dXJuIGVycm9yXG4yMzAyOlx0XHQgKiBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS5cbjIzMDM6XHRcdCAqXG4yMzA0Olx0XHQgKiBXaGlsZSBhdCBpdCwgZGV0ZXJtaW5lIHRoZSBuaWQuIE5vdGUgdGhhdCBpZiB3ZSYjMzk7ZCBoYXZlIG1peGVkIG5vZGVzLFxuMjMwNTpcdFx0ICogd2UmIzM5O2Qgb25seSB0cnkgdG8gb2ZmbGluZSB0aGUgbGFzdCBkZXRlcm1pbmVkIG9uZSAtLSB3aGljaCBpcyBnb29kXG4yMzA2Olx0XHQgKiBlbm91Z2ggZm9yIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0LlxuMjMwNzpcdFx0ICovXG4yMzA4Olx0XHRyYyA9IHdhbGtfbWVtb3J5X2Jsb2NrcyhzdGFydCwgc2l6ZSwgXHUwMDI2bmlkLCBjaGVja19tZW1ibG9ja19vZmZsaW5lZF9jYik7XG4yMzA5Olx0XHRpZiAocmMpXG4yMzEwOlx0XHRcdHJldHVybiByYztcbjIzMTE6XHRcbjIzMTI6XHRcdC8qIHJlbW92ZSBtZW1tYXAgZW50cnkgKi9cbjIzMTM6XHRcdGZpcm13YXJlX21hcF9yZW1vdmUoc3RhcnQsIHN0YXJ0ICYjNDM7IHNpemUsIFwmIzM0O1N5c3RlbSBSQU1cJiMzNDspO1xuMjMxNDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5ODEzCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogMTQ0MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIE1lbW9yeSBIb3RwbHVnIFBhdGNoKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIG1vdGl2YXRpb24gYmVoaW5kIG1vdmluZyBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgIGFuZCBpbnRyb2R1Y2luZyBgbm9kZV9pc19tZW1vcnlsZXNzYC4gIEl0IGxvb2tzIGxpa2UgdGhpcyBjb21taXQgbWlnaHQgYmUgcmVsYXRlZCB0byBhIHNwZWNpZmljIGNvbW1pdCBJRDogYGE1M2UxOWEwYjZkMjRiMjAxNDlkMDRiMzVhMDFmNWE1OTUwMWVkZmFgLiBJJiMzOTtkIG5vcm1hbGx5IGNoZWNrIHRoZSBjb21taXQgaGlzdG9yeSAoYGdpdCBsb2dgIG9yIGBnaXQgc2hvd2ApIGZvciBjb250ZXh0LCBidXQgc2luY2UgSSBoYXZlIHRoZSBkaWZmLCBJIGNhbiB3b3JrIHdpdGggdGhhdCBkaXJlY3RseS4KCkZyb20gdGhlIHByb3ZpZGVkIGRpZmYsIEkgc2VlIHRoYXQgYGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiYCwgd2hpY2ggd2FzIHByZXZpb3VzbHkgZGVmaW5lZCAqYWZ0ZXIqIGl0cyB1c2UsIGhhcyBiZWVuIG1vdmVkIGVhcmxpZXIgaW4gdGhlIGZpbGUuICBDcnVjaWFsbHksIGl0IGlzIHRoZW4gKm1vdmVkKiBhbmQgYG5vZGVfaXNfbWVtb3J5bGVzc2AgaXMgY3JlYXRlZCBhbmQgdXNlZCB3aXRoaW4gYHRyeV9vZmZsaW5lX25vZGVgLiBUaGlzIGZ1bmN0aW9uIG5vdyB1c2VzIHRoZSBuZXcgaGVscGVyLCBgbm9kZV9pc19tZW1vcnlsZXNzYCwgdG8gZGV0ZXJtaW5lIGlmIGEgbm9kZSBjYW4gYmUgc2FmZWx5IHRha2VuIG9mZmxpbmUuCgpUaGUgYG5vZGVfaXNfbWVtb3J5bGVzc2AgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKHdoaWNoIHdvdWxkIGluZGljYXRlIG1lbW9yeSBpcyBzdGlsbCBwcmVzZW50KSwgYW5kIGlmIHNvLCByZXR1cm5zIGBmYWxzZWAuIFRoZW4sIGl0IGNoZWNrcyBpZiBhbnkgbWVtb3J5IGJsb2NrcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlLiBUaGUgb3JpZ2luYWwgY29kZSYjMzk7cyBjaGVjayB3aXRoaW4gYHRyeV9vZmZsaW5lX25vZGVgIGxvb2tzIGFsbW9zdCBpZGVudGljYWwsIHNvIHRoZSByZWZhY3RvcmluZyBnb2FsIG11c3QgYmUgc29tZXRoaW5nIHN1YnRsZSBhbmQgdGhlIGludGVudCBpcyBsaWtlbHkgcmUtdXNlLgoKVGhlIGNvcmUgb2YgdGhlIGNoYW5nZSBsaWVzIGluIGhvdyB0aGUgY29kZSBkZXRlcm1pbmVzIGlmIGEgbm9kZSBpcyB0cnVseSAmIzM0O21lbW9yeWxlc3MmIzM0OyBmb3Igb2ZmbGluZSBwdXJwb3Nlcy4gVGhlIHByZXZpb3VzIGNvZGUgY2hlY2tlZCBmb3IgbWVtb3J5IGJsb2Nrcywgbm93IHRoYXQgaXMgZW5jYXBzdWxhdGVkIGluIGBub2RlX2lzX21lbW9yeWxlc3NgLiAgVGhlIGNvbW1lbnQgbWFrZXMgYSB2YWxpZCBwb2ludCBhYm91dCBvZmZsaW5lIG1lbW9yeSBibG9ja3Mgbm90IG5lY2Vzc2FyaWx5IGJlaW5nICYjMzQ7c3Bhbm5lZCYjMzQ7IHlldCBidXQgcG90ZW50aWFsbHkgbGlua2VkIHRocm91Z2ggc3lzZnMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGNvbnNpZGVyYXRpb24gZm9yIG1lbW9yeSBob3RwbHVnLCBhbmQgaXRzIGhhbmRsaW5nIGNvdWxkIGJlIHN1YnRsZS4KCkdpdmVuIHRoaXMgaXMgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBhIGNvcmUgc3Vic3lzdGVtIGZvciBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIGl0IGludm9sdmVzIGEgbG9naWMgcmVzdHJ1Y3R1cmluZyBhbmQgcmVmYWN0b3JpbmcsIEkgbmVlZCB0byBldmFsdWF0ZSB0aGlzIGNoYW5nZSB3aXRoIGFuIGV4cGVydCYjMzk7cyBleWUuICBJJiMzOTttIGdvaW5nIHRvIGNhcmVmdWxseSBjb25zaWRlciB0aGUgbG9naWMgb2YgYG5vZGVfaXNfbWVtb3J5bGVzc2AsIGFzIHRoZSBiZWhhdmlvciBvZiBvZmZsaW5lIGFuZCBvbmxpbmUgbWVtb3J5IGNvdWxkIGJlIGFmZmVjdGVkLiBTaW5jZSBtZW1vcnkgaG90cGx1ZyBpcyBpbnZvbHZlZCwgSSB3aWxsIG5lZWQgdG8gYmUgdmVyeSBjb25maWRlbnQgdGhhdCB0aGlzIGNoYW5nZSBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgYW55IHN1YnRsZSByZWdyZXNzaW9ucywgcGFydGljdWxhcmx5IGFyb3VuZCB0aGUgc3RhdGUgdHJhbnNpdGlvbnMgb2YgbWVtb3J5IGJsb2NrcyBhbmQgbm9kZSBhc3NvY2lhdGlvbnMgZHVyaW5nIGhvdHBsdWcgb3BlcmF0aW9ucy4gIEkmIzM5O2xsIHdhbnQgdG8gY2FyZWZ1bGx5IGNoZWNrIHRoZSBpbnRlcmFjdGlvbnMgd2l0aCBvdGhlciBtZW1vcnkgbWFuYWdlbWVudCBjb21wb25lbnRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDttZW1vcnlfaG90cGx1Z1xcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9NjM9cGFnZS1hbGxvYy0kKENPTkZJR19TSFVGRkxFX1BBR0VfQUxMT0NBVE9SKSAmIzQzOz0gc2h1ZmZsZS5vXG4tLVxubW0vTWFrZWZpbGUtNjUtIyBHaXZlICYjMzk7bWVtb3J5X2hvdHBsdWcmIzM5OyBpdHMgb3duIG1vZHVsZS1wYXJhbWV0ZXIgbmFtZXNwYWNlXG5tbS9NYWtlZmlsZTo2NjptZW1vcnktaG90cGx1Zy0kKENPTkZJR19NRU1PUllfSE9UUExVRykgJiM0Mzs9IG1lbW9yeV9ob3RwbHVnLm9cbm1tL01ha2VmaWxlLTY3LVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MTU0PXN0YXRpYyBpbnQgZ2V0X29ubGluZV9wb2xpY3koY2hhciAqYnVmZmVyLCBjb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcClcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE1OS0vKlxubW0vbWVtb3J5X2hvdHBsdWcuYzoxNjA6ICogbWVtb3J5X2hvdHBsdWcub25saW5lX3BvbGljeTogY29uZmlndXJlIG9ubGluZSBiZWhhdmlvciB3aGVuIG9ubGluaW5nIHdpdGhvdXRcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTYxLSAqIHNwZWNpZnlpbmcgYSB6b25lIChNTU9QX09OTElORSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIwMzkKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipDaGVja2luZyB0aGUgSG90cGx1ZyBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkgbmVlZCB0byBxdWlja2x5IHZlcmlmeSBzb21ldGhpbmcgcmVsYXRlZCB0byBtZW1vcnkgaG90cGx1Z2dpbmcuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIGhlYWQgc3RyYWlnaHQgdG8gdGhlIHNvdXJjZSDigJMgdGhlIGBtbS9LY29uZmlnYCBmaWxlLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCBjb25maWd1cmF0aW9ucyBhcmUgZGVmaW5lZCwgYW5kIGBDT05GSUdfTUVNT1JZX0hPVFBMVUdgIGlzIHRoZSBrZXkgSSYjMzk7bSBpbnRlcmVzdGVkIGluLiBJIHdhbnQgdG8gc2VlIGhvdyBpdCYjMzk7cyBoYW5kbGVkLCBhbnkgZGVwZW5kZW5jaWVzIGl0IG1pZ2h0IGhhdmUsIGFuZCBpZiB0aGVyZSBhcmUgYW55IHN1YnRsZSBudWFuY2VzIGluIGl0cyBkZWZpbml0aW9uIHRoYXQgSSBuZWVkIHRvIGJlIGF3YXJlIG9mLiBUaGlzIGlzIHVzdWFsbHkgdGhlIHF1aWNrZXN0IHdheSB0byBnZXQgYSBzb2xpZCBncmFzcCBvZiBob3cgaG90cGx1ZyBpcyBlbmFibGVkIG9yIGRpc2FibGVkIGFuZCB3aGF0IG90aGVyIGZlYXR1cmVzIGFyZSB0aWVkIHRvIGl0LiBObyBuZWVkIHRvIHdhc3RlIHRpbWUgZ3Vlc3Npbmc7IGdvIGRpcmVjdGx5IHRvIHRoZSBjb25maWd1cmF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTUVNT1JZX0hPVFBMVUdcXGImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vS2NvbmZpZz01MDU9Y29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHXG4tLVxubW0vS2NvbmZpZy01MDgtIyBldmVudHVhbGx5LCB3ZSBjYW4gaGF2ZSB0aGlzIG9wdGlvbiBqdXN0ICYjMzk7c2VsZWN0IFNQQVJTRU1FTSYjMzk7XG5tbS9LY29uZmlnOjUwOTptZW51Y29uZmlnIE1FTU9SWV9IT1RQTFVHXG5tbS9LY29uZmlnLTUxMC1cdGJvb2wgXCYjMzQ7TWVtb3J5IGhvdHBsdWdcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIzNDUKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byB0aGUgTWVtb3J5IEhvdHBsdWcgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBkZXBlbmRlbmNpZXMgZm9yIGBNRU1PUllfSE9UUExVR2AgYW5kIGBNRU1PUllfSE9UUkVNT1ZFYC4gVGhlIGJlc3QgcGxhY2UgdG8gc3RhcnQsIGFzIGFsd2F5cywgaXMgdGhlIEtjb25maWcuIEkgd2FudCB0byBzZWUgd2hhdCBvdGhlciBmZWF0dXJlcyBvciBjb25maWd1cmF0aW9ucyBhcmUgdGllZCB0byB0aGVzZSBvcHRpb25zLiBBcmUgdGhlcmUgYW55IG90aGVyIHJlcXVpcmVkIGtlcm5lbCBmZWF0dXJlcz8gQXJlIHRoZXJlIHNwZWNpZmljIGFyY2hpdGVjdHVyYWwgcmVxdWlyZW1lbnRzPyBXaGF0IGxldmVscyBvZiBncmFudWxhcml0eSBhcmUgYXZhaWxhYmxlPyBVbmRlcnN0YW5kaW5nIHRoZSBpbnRlcmRlcGVuZGVuY2llcyBpcyBjcml0aWNhbC4gSXQmIzM5O3Mgb2Z0ZW4gdGhlIGhpZGRlbiBpbXBsaWNhdGlvbnMgYW5kIHJlbGF0ZWQgZmVhdHVyZXMgdGhhdCB3aWxsIGRpY3RhdGUgaG93IHdlbGwgdGhlc2UgZnVuY3Rpb25zIHdvcmsgaW4gYSBzcGVjaWZpYyBzZXR1cC4gVGltZSB0byBnZXQgdGhlIEtjb25maWcgb3BlbiBhbmQgc3RhcnQgZGlnZ2luZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTA1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1MDU6XHRjb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUdcbiA1MDY6XHRcdGJvb2xcbiA1MDc6XHRcbiA1MDg6XHQjIGV2ZW50dWFsbHksIHdlIGNhbiBoYXZlIHRoaXMgb3B0aW9uIGp1c3QgJiMzOTtzZWxlY3QgU1BBUlNFTUVNJiMzOTtcbiA1MDk6XHRtZW51Y29uZmlnIE1FTU9SWV9IT1RQTFVHXG4gNTEwOlx0XHRib29sIFwmIzM0O01lbW9yeSBob3RwbHVnXCYjMzQ7XG4gNTExOlx0XHRzZWxlY3QgTUVNT1JZX0lTT0xBVElPTlxuIDUxMjpcdFx0ZGVwZW5kcyBvbiBTUEFSU0VNRU1fVk1FTU1BUFxuIDUxMzpcdFx0ZGVwZW5kcyBvbiBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVR1xuIDUxNDpcdFx0ZGVwZW5kcyBvbiA2NEJJVFxuIDUxNTpcdFx0c2VsZWN0IE5VTUFfS0VFUF9NRU1JTkZPIGlmIE5VTUFcbiA1MTY6XHRcbiA1MTc6XHRpZiBNRU1PUllfSE9UUExVR1xuIDUxODpcdFxuIDUxOTpcdGNob2ljZVxuIDUyMDpcdFx0cHJvbXB0IFwmIzM0O01lbW9yeSBIb3RwbHVnIERlZmF1bHQgT25saW5lIFR5cGVcJiMzNDtcbiA1MjE6XHRcdGRlZmF1bHQgTUhQX0RFRkFVTFRfT05MSU5FX1RZUEVfT0ZGTElORVxuIDUyMjpcdFx0aGVscFxuIDUyMzpcdFx0ICBEZWZhdWx0IG1lbW9yeSB0eXBlIGZvciBob3RwbHVnZ2VkIG1lbW9yeS5cbiA1MjQ6XHRcbiA1MjU6XHRcdCAgVGhpcyBvcHRpb24gc2V0cyB0aGUgZGVmYXVsdCBwb2xpY3kgc2V0dGluZyBmb3IgbWVtb3J5IGhvdHBsdWdcbiA1MjY6XHRcdCAgb25saW5pbmcgcG9saWN5ICgvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9hdXRvX29ubGluZV9ibG9ja3MpIHdoaWNoXG4gNTI3Olx0XHQgIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIG5ld2x5IGFkZGVkIG1lbW9yeSByZWdpb25zLiBQb2xpY3kgc2V0dGluZ1xuIDUyODpcdFx0ICBjYW4gYWx3YXlzIGJlIGNoYW5nZWQgYXQgcnVudGltZS5cbiA1Mjk6XHRcbiA1MzA6XHRcdCAgVGhlIGRlZmF1bHQgaXMgJiMzOTtvZmZsaW5lJiMzOTsuXG4gNTMxOlx0XG4gNTMyOlx0XHQgIFNlbGVjdCBvZmZsaW5lIHRvIGRlZmVyIG9ubGluaW5nIHRvIGRyaXZlcnMgYW5kIHVzZXIgcG9saWN5LlxuIDUzMzpcdFx0ICBTZWxlY3QgYXV0byB0byBsZXQgdGhlIGtlcm5lbCBjaG9vc2Ugd2hhdCB6b25lcyB0byB1dGlsaXplLlxuIDUzNDpcdFx0ICBTZWxlY3Qgb25saW5lX2tlcm5lbCB0byBnZW5lcmFsbHkgYWxsb3cga2VybmVsIHVzYWdlIG9mIHRoaXMgbWVtb3J5LlxuIDUzNTpcdFx0ICBTZWxlY3Qgb25saW5lX21vdmFibGUgdG8gZ2VuZXJhbGx5IGRpc2FsbG93IGtlcm5lbCB1c2FnZSBvZiB0aGlzIG1lbW9yeS5cbiA1MzY6XHRcbiA1Mzc6XHRcdCAgRXhhbXBsZSBrZXJuZWwgdXNhZ2Ugd291bGQgYmUgcGFnZSBzdHJ1Y3RzIGFuZCBwYWdlIHRhYmxlcy5cbiA1Mzg6XHRcbiA1Mzk6XHRcdCAgU2VlIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vbWVtb3J5LWhvdHBsdWcucnN0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIDU0MDpcdFxuIDU0MTpcdGNvbmZpZyBNSFBfREVGQVVMVF9PTkxJTkVfVFlQRV9PRkZMSU5FXG4gNTQyOlx0XHRib29sIFwmIzM0O29mZmxpbmVcJiMzNDtcbiA1NDM6XHRcdGhlbHBcbiA1NDQ6XHRcdCAgSG90cGx1Z2dlZCBtZW1vcnkgd2lsbCBub3QgYmUgb25saW5lZCBieSBkZWZhdWx0LlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzE0NgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipEZWx2aW5nIGludG8gdGhlIGBNRU1PUllfSE9UUExVR2AgQ29uZmlndXJhdGlvbioqCgpSaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJiMzOTttIHRoaW5raW5nLCAmIzM0O0xldCYjMzk7cyBkaWcgZGVlcGVyIGludG8gdGhlIGludHJpY2FjaWVzIG9mIGBNRU1PUllfSE9UUExVR2AuJiMzNDsgTXkgaW1tZWRpYXRlIGdvYWwgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29tcGxldGUgcGljdHVyZSBvZiB0aGlzIG9wdGlvbiBhcyBpdCYjMzk7cyBkZWZpbmVkIHdpdGhpbiB0aGUgYG1tL0tjb25maWdgIGZpbGUuIEkgbmVlZCB0byBzZWUgdGhlIGNvbnRleHQuIEkmIzM5O20gYWZ0ZXIgdGhlIGRlcGVuZGVuY2llcywgdGhlIGRlZmF1bHRzLCB0aGUgaGVscCB0ZXh0LCAqZXZlcnl0aGluZyogdGhhdCBzaGFwZXMgaXRzIGJlaGF2aW9yLiBNeSBleHBlcnRpc2UgYWxsb3dzIG1lIHRvIHF1aWNrbHkgemVybyBpbiBvbiBzcGVjaWZpYyBhc3BlY3RzIGZvciBzY3J1dGlueSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHByb2JsZW0gSSYjMzk7bSB0cnlpbmcgdG8gc29sdmUuIFVuZGVyc3RhbmRpbmcgdGhlIGNvbXBsZXRlIGNvbnRleHQgb2YgYE1FTU9SWV9IT1RQTFVHYCBpcyB0aGUgZmlyc3Qgc3RlcCBpbiBkZWJ1Z2dpbmcgb3IgY29uZmlndXJpbmcgYW55dGhpbmcgcmVsYXRlZCB0byBob3QtcGx1Z2dhYmxlIG1lbW9yeSBpbiB0aGUga2VybmVsLiBJIGNhbiYjMzk7dCB3b3JrIG9uIHRoZSBrZXJuZWwgaW4gaWdub3JhbmNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDU0NTpcdFx0ICBDaG9vc2UgdGhpcyBmb3Igc3lzdGVtcyB3aXRoIGRyaXZlcnMgYW5kIHVzZXIgcG9saWN5IHRoYXRcbiA1NDY6XHRcdCAgaGFuZGxlIG9ubGluaW5nIG9mIGhvdHBsdWcgbWVtb3J5IHBvbGljeS5cbiA1NDc6XHRcbiA1NDg6XHRjb25maWcgTUhQX0RFRkFVTFRfT05MSU5FX1RZUEVfT05MSU5FX0FVVE9cbiA1NDk6XHRcdGJvb2wgXCYjMzQ7YXV0b1wmIzM0O1xuIDU1MDpcdFx0aGVscFxuIDU1MTpcdFx0ICBTZWxlY3QgdGhpcyBpZiB5b3Ugd2FudCB0aGUga2VybmVsIHRvIGF1dG9tYXRpY2FsbHkgb25saW5lXG4gNTUyOlx0XHQgIGhvdHBsdWdnZWQgbWVtb3J5IGludG8gdGhlIHpvbmUgaXQgdGhpbmtzIGlzIHJlYXNvbmFibGUuXG4gNTUzOlx0XHQgIFRoaXMgbWVtb3J5IG1heSBiZSB1dGlsaXplZCBmb3Iga2VybmVsIGRhdGEuXG4gNTU0Olx0XG4gNTU1Olx0Y29uZmlnIE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09OTElORV9LRVJORUxcbiA1NTY6XHRcdGJvb2wgXCYjMzQ7a2VybmVsXCYjMzQ7XG4gNTU3Olx0XHRoZWxwXG4gNTU4Olx0XHQgIFNlbGVjdCB0aGlzIGlmIHlvdSB3YW50IHRoZSBrZXJuZWwgdG8gYXV0b21hdGljYWxseSBvbmxpbmVcbiA1NTk6XHRcdCAgaG90cGx1Z2dlZCBtZW1vcnkgaW50byBhIHpvbmUgY2FwYWJsZSBvZiBiZWluZyB1c2VkIGZvciBrZXJuZWxcbiA1NjA6XHRcdCAgZGF0YS4gVGhpcyB0eXBpY2FsbHkgbWVhbnMgWk9ORV9OT1JNQUwuXG4gNTYxOlx0XG4gNTYyOlx0Y29uZmlnIE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09OTElORV9NT1ZBQkxFXG4gNTYzOlx0XHRib29sIFwmIzM0O21vdmFibGVcJiMzNDtcbiA1NjQ6XHRcdGhlbHBcbiA1NjU6XHRcdCAgU2VsZWN0IHRoaXMgaWYgeW91IHdhbnQgdGhlIGtlcm5lbCB0byBhdXRvbWF0aWNhbGx5IG9ubGluZVxuIDU2NjpcdFx0ICBob3RwbHVnIG1lbW9yeSBpbnRvIFpPTkVfTU9WQUJMRS4gVGhpcyBtZW1vcnkgd2lsbCBnZW5lcmFsbHlcbiA1Njc6XHRcdCAgbm90IGJlIHV0aWxpemVkIGZvciBrZXJuZWwgZGF0YS5cbiA1Njg6XHRcbiA1Njk6XHRcdCAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhlIGFkbWluIGtub3dzIHN1ZmZpY2llbnRcbiA1NzA6XHRcdCAgWk9ORV9OT1JNQUwgbWVtb3J5IGlzIGF2YWlsYWJsZSB0byBkZXNjcmliZSBob3RwbHVnIG1lbW9yeSxcbiA1NzE6XHRcdCAgb3RoZXJ3aXNlIGhvdHBsdWcgbWVtb3J5IG1heSBmYWlsIHRvIG9ubGluZS4gRm9yIGV4YW1wbGUsXG4gNTcyOlx0XHQgIHN1ZmZpY2llbnQga2VybmVsLWNhcGFibGUgbWVtb3J5IChaT05FX05PUk1BTCkgbXVzdCBiZVxuIDU3MzpcdFx0ICBhdmFpbGFibGUgdG8gYWxsb2NhdGUgcGFnZSBzdHJ1Y3RzIHRvIGRlc2NyaWJlIFpPTkVfTU9WQUJMRS5cbiA1NzQ6XHRcbiA1NzU6XHRlbmRjaG9pY2VcbiA1NzY6XHRcbiA1Nzc6XHRjb25maWcgTUVNT1JZX0hPVFJFTU9WRVxuIDU3ODpcdFx0Ym9vbCBcJiMzNDtBbGxvdyBmb3IgbWVtb3J5IGhvdCByZW1vdmVcJiMzNDtcbiA1Nzk6XHRcdHNlbGVjdCBNSUdSQVRJT05cbiA1ODA6XHRcbiA1ODE6XHRjb25maWcgTUhQX01FTU1BUF9PTl9NRU1PUllcbiA1ODI6XHRcdGRlZl9ib29sIHlcbiA1ODM6XHRcdGRlcGVuZHMgb24gQVJDSF9NSFBfTUVNTUFQX09OX01FTU9SWV9FTkFCTEVcbiA1ODQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM5ODYKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAxMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyBNZW1vcnkgSG90cGx1ZyBEZXBlbmRlbmNpZXMqKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byB0aGlzIGBNRU1PUllfSE9UUExVR2AgY29uZmlndXJhdGlvbi4gVGhlIHF1ZXN0aW9uIGlzOiBkb2VzIGBNRU1PUllfSE9UUkVNT1ZFYCBvciBgTlVNQWAgaGF2ZSBhbnkgYmVhcmluZyBvbiBob3cgdGhpcyB3b3Jrcz8gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZW0uCgpNeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB0aGUga2VybmVsIGNvZGUsIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBmdW5jdGlvbnMgbGlrZSBgdHJ5X29mZmxpbmVfbm9kZWAsIGBub2RlX2lzX21lbW9yeWxlc3NgLCBhbmQgYGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiYC4gSSYjMzk7bGwgbmVlZCB0byBzZWUgaWYgYW55IG9mIHRoZXNlIGRlcGVuZCBvbiBgTUVNT1JZX0hPVFJFTU9WRWAsIGBOVU1BYCwgb3IgZXZlbiBgTUVNT1JZX0hPVFBMVUdgIGJlaW5nIGRlZmluZWQuIFRyYWNpbmcgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHNob3VsZCByZXZlYWwgdGhlIGRlcGVuZGVuY2llcy4KCkZpbmFsbHksIEkmIzM5O2xsIGdvIGRpcmVjdGx5IHRvIHRoZSBzb3VyY2UgYW5kIGV4YW1pbmUgYG1tL21lbW9yeV9ob3RwbHVnLmNgIGZvciBhbnkgYCNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAgb3IgYCNpZmRlZiBDT05GSUdfTlVNQWAgZGlyZWN0aXZlcy4gVGhhdCYjMzk7cyB0aGUgbW9zdCBkaXJlY3Qgd2F5IHRvIHVuZGVyc3RhbmQgaG93IHRoZSBjb2RlIGJlaGF2ZXMgdW5kZXIgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgc29saWQgdW5kZXJzdGFuZGluZyBvZiB0aGUgaW50ZXJwbGF5IGJldHdlZW4gdGhlc2UgbWVtb3J5LXJlbGF0ZWQgZmVhdHVyZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR19NRU1PUllfSE9UUkVNT1ZFfENPTkZJR19OVU1BJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jPTE4Nj1NT0RVTEVfUEFSTV9ERVNDKGF1dG9fbW92YWJsZV9yYXRpbyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5Mi0gKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTkzOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xOTQtc3RhdGljIGJvb2wgYXV0b19tb3ZhYmxlX251bWFfYXdhcmUgX19yZWFkX21vc3RseSA9IHRydWU7XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0xOTY9TU9EVUxFX1BBUk1fREVTQyhhdXRvX21vdmFibGVfbnVtYV9hd2FyZSxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE5OC1cdFx0XCYjMzQ7XFxcJiMzNDthdXRvLW1vdmFibGVcXFwmIzM0OyBvbmxpbmUgcG9saWN5LiBEZWZhdWx0OiB0cnVlXCYjMzQ7KTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTk5OiNlbmRpZiAvKiBDT05GSUdfTlVNQSAqL1xubW0vbWVtb3J5X2hvdHBsdWcuYy0yMDAtXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz05NjA9c3RhdGljIHN0cnVjdCB6b25lICphdXRvX21vdmFibGVfem9uZV9mb3JfcGZuKGludCBuaWQsXG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDA5LVxubW0vbWVtb3J5X2hvdHBsdWcuYzoxMDEwOiNpZmRlZiBDT05GSUdfTlVNQVxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDExLVx0aWYgKGF1dG9fbW92YWJsZV9udW1hX2F3YXJlIFx1MDAyNlx1MDAyNlxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAxMy1cdFx0Z290byBrZXJuZWxfem9uZTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTAxNDojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cbm1tL21lbW9yeV9ob3RwbHVnLmMtMTAxNS1cbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTE4MDQ9Ym9vbCBtaHBfcmFuZ2VfYWxsb3dlZCh1NjQgc3RhcnQsIHU2NCBzaXplLCBib29sIG5lZWRfbWFwcGluZylcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE4MTYtXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE4MTc6I2lmZGVmIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE4MTgtLypcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTI1MzA9RVhQT1JUX1NZTUJPTF9HUEwob2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMpO1xubW0vbWVtb3J5X2hvdHBsdWcuYzoyNTMxOiNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRSAqL1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDg5NgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDUyMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgTWVtb3J5IEhvdHBsdWcgYW5kIEhvdHJlbW92ZSBDb25maWd1cmF0aW9ucyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpdmluZyBpbnRvIHRoaXMgc2VjdGlvbiBvZiB0aGUga2VybmVsIHJlbGF0ZWQgdG8gbWVtb3J5IGhvdHBsdWcgYW5kIGhvdHJlbW92ZS4gVGhlIGNvZGUgSSYjMzk7bSBsb29raW5nIGF0LCBzcGVjaWZpY2FsbHkgbGluZXMgMTgxNyB0byAyNTMxLCBzZWVtcyB0byByZXZvbHZlIGFyb3VuZCBgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVgLiAgTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHpvb20gaW4gb24gbGluZXMgMjIzMC0yMjc1IHdoZXJlIGB0cnlfb2ZmbGluZV9ub2RlYCBpcyBkZWZpbmVkLiAgSXQmIzM5O3MgY2xlYXIgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNvbmRpdGlvbmFsIG9uIGAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RSRU1PVkVgLCB3aGljaCBpcyBrZXkuCgpJIHNlZSB0aGF0IGBub2RlX2lzX21lbW9yeWxlc3NgIGlzIHVzZWQgYmVmb3JlIGBfX2FkZF9tZW1vcnlfcmVzb3VyY2VgLCB3aGljaCBpcyB1bmRlciBgQ09ORklHX01FTU9SWV9IT1RQTFVHYCwgc28gdGhvc2UgYXJlIGJvdGggcmVsZXZhbnQuIFRoZSBjb2RlIHN1Z2dlc3RzIHRoYXQgYHRyeV9vZmZsaW5lX25vZGVgIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSBOVU1BIG5vZGVzIGFuZCwgc3BlY2lmaWNhbGx5LCBvZmZsaW5pbmcgYSBOVU1BIG5vZGUgaWYgYWxsIHRoZSBtZW1vcnkgYW5kIENQVXMgYXJlIHJlbW92ZWQsIHNvIGBDT05GSUdfTlVNQWAgbWlnaHQgYWxzbyBiZSBhIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3IgcmVxdWlyZW1lbnQuCgpOb3csIEkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBjb250cm9sIGZsb3cuICBJJiMzOTttIGxvb2tpbmcgYXQgd2hlcmUgYHRyeV9vZmZsaW5lX25vZGVgIGlzIGNhbGxlZCBhbmQgcXVpY2tseSBzZWUgdGhhdCBgdHJ5X3JlbW92ZV9tZW1vcnlgIGNhbGxzIGB0cnlfb2ZmbGluZV9ub2RlYCwgc28gdGhhdOKAmXMgYSBsaWtlbHkgYXJlYSBvZiBpbnRlcmVzdC4gVGhlbiBJIHdpbGwgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlgIGlzLgoKTGV0JiMzOTtzIG5haWwgZG93biB0aGUgY3JpdGljYWwgZnVuY3Rpb25zIGhlcmUuIFRoZSBtYWluIGZ1bmN0aW9ucyB0aGF0IHNlZW0gdG8gYmUgYWRkZWQgb3IgbW9kaWZpZWQgYXJlOgoxLiAgYG5vZGVfaXNfbWVtb3J5bGVzc2AsIHdoaWNoIGlzIGEgc3RhdGljIGZ1bmN0aW9uIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4KMi4gIGBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYmAgd2hpY2ggaXMgYSBzdGF0aWMgY2FsbGJhY2sgZnVuY3Rpb24uCjMuICBgdHJ5X29mZmxpbmVfbm9kZWAsIHdoaWNoIGlzIGFuIGV4cG9ydGVkIGZ1bmN0aW9uIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4KCkkmIzM5O20gY29uc2lkZXJpbmcgd2hldGhlciBgbm9kZV9pc19tZW1vcnlsZXNzYCBjYW4gYmUgaW5saW5lZCBhbmQgaXQmIzM5O3Mgc3RhdGljIGFuZCBvbmx5IGNhbGxlZCBieSBgdHJ5X29mZmxpbmVfbm9kZWAsIHdoaWNoIGlzIGdsb2JhbC4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUgY2hlY2sgdGhlIGNhbGwgcGF0aHMuCgpOZXh0LCBJIG5lZWQgdG8gdHJhY2UgdGhlIGNhbGxpbmcgcmVsYXRpb25zaGlwcy4gSSBuZWVkIHRvIGJlIGF3YXJlIG9mOgoKKiAgIGB0cnlfb2ZmbGluZV9ub2RlYAoqICAgYG5vZGVfaXNfbWVtb3J5bGVzc2AgKGlmIGl0JiMzOTtzIG5vdCBpbmxpbmVkLCBhbmQgYWxzbyB0aGUgdGFyZ2V0cyBvZiBgdHJ5X29mZmxpbmVfbm9kZWApCiogICBgdHJ5X3JlbW92ZV9tZW1vcnlgIChhIHN0YXRpYyBoZWxwZXIgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgKS4KKiAgIGByZW1vdmVfbWVtb3J5YCBvciBgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeWAuCgpGaW5hbGx5LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGNhbGxlcnMgb2YgYHRyeV9yZW1vdmVfbWVtb3J5YCB3aXRoaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBmaWd1cmUgb3V0IGhvdyB0aGV5IGludGVyYWN0IHdpdGggYHRyeV9vZmZsaW5lX25vZGVgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0cnlfcmVtb3ZlX21lbW9yeSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL21lbW9yeV9ob3RwbHVnLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vbWVtb3J5X2hvdHBsdWcuYz0yMjczPXN0YXRpYyBpbnQgbWVtb3J5X2Jsb2Nrc19oYXZlX2FsdG1hcHModTY0IHN0YXJ0LCB1NjQgc2l6ZSlcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyOTItXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyOTM6c3RhdGljIGludCB0cnlfcmVtb3ZlX21lbW9yeSh1NjQgc3RhcnQsIHU2NCBzaXplKVxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjk0LXtcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIzNTU9dm9pZCBfX3JlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSlcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIzNjEtXHQgKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MjM2MjpcdGlmICh0cnlfcmVtb3ZlX21lbW9yeShzdGFydCwgc2l6ZSkpXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIzNjMtXHRcdEJVRygpO1xuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmM9MjM3MD1pbnQgcmVtb3ZlX21lbW9yeSh1NjQgc3RhcnQsIHU2NCBzaXplKVxuLS1cbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM3NC1cdGxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjM3NTpcdHJjID0gdHJ5X3JlbW92ZV9tZW1vcnkoc3RhcnQsIHNpemUpO1xubW0vbWVtb3J5X2hvdHBsdWcuYy0yMzc2LVx0dW5sb2NrX2RldmljZV9ob3RwbHVnKCk7XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0yNDYzPWludCBvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5X3Jhbmdlcyhjb25zdCBzdHJ1Y3QgcmFuZ2UgKnJhbmdlcyxcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTI1MjAtXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9yYW5nZXM7IGkmIzQzOyYjNDM7KVxubW0vbWVtb3J5X2hvdHBsdWcuYzoyNTIxOlx0XHRXQVJOX09OX09OQ0UodHJ5X3JlbW92ZV9tZW1vcnkocmFuZ2VzW2ldLnN0YXJ0LFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yNTIyLVx0XHRcdFx0XHQgICAgICAgcmFuZ2VfbGVuKFx1MDAyNnJhbmdlc1tpXSkpKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTY0ODUKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA4NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSByZXZpZXdpbmcgdGhpczoKCioqTWVtb3J5IEhvdHBsdWcgRXhwbG9yYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBkaXZpbmcgaW50byBtZW1vcnkgaG90cGx1ZyBzY2VuYXJpb3MuIEZpcnN0IHRoaW5ncyBmaXJzdCwgbGV0JiMzOTtzIG5haWwgZG93biB0aGUgcHJpbWFyeSBmdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIG1lbW9yeSBtYW5pcHVsYXRpb24uIEkgbmVlZCB0byByZWZyZXNoIG15c2VsZiBvbiBob3cgdGhlIHVuZGVybHlpbmcgbWVjaGFuaXNtcyBhcmUgZXhlcmNpc2VkLiBJIHdhbnQgdG8gY2hlY2sgb3V0IGByZW1vdmVfbWVtb3J5YCwgYG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlfcmFuZ2VzYCwgYHRyeV9vZmZsaW5lX25vZGVgLCBhbmQgYG9mZmxpbmVfbWVtb3J5X2Jsb2NrYC4gSSBrbm93IHRoZXNlIGFyZSBrZXkgcGxheWVycyBpbiBvcmNoZXN0cmF0aW5nIHRoZSBtZW1vcnkgaG90cGx1ZyBwcm9jZXNzLCBidXQgSSB3YW50IHRvIHJlY2FsbCB0aGUgZXhhY3QgdXNlIGNhc2VzIGZvciBlYWNoLgoKTm93LCBhIGxvdCBvZiB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGVzZSBmdW5jdGlvbnMgc2VlbXMgdG8gaGFwcGVuIHRocm91Z2ggc3lzZnMsIHJpZ2h0PyBJJiMzOTttIGdvaW5nIHRvIGhlYWQgZGlyZWN0bHkgaW50byBgZHJpdmVycy9iYXNlL21lbW9yeS5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVycGxheSBiZXR3ZWVuIHRoZSBzeXNmcyBpbnRlcmZhY2UgYW5kIHRoZSBjb3JlIG9mZmxpbmluZyByb3V0aW5lcy4gSSYjMzk7bSBsb29raW5nIGZvciBhIGNsZWFyIHBpY3R1cmUgb2YgaG93IHRob3NlIHN5c2ZzIG1hbmlwdWxhdGlvbnMgdHJpZ2dlciB0aGVzZSBpbnRlcm5hbCBmdW5jdGlvbnMuIFdoYXQgYXJlIHRoZSBrZXkgZGF0YSBzdHJ1Y3R1cmVzIGJlaW5nIG1hbmlwdWxhdGVkLCBhbmQgaG93IGlzIHRoZSB3aG9sZSB0aGluZyBhcmNoaXRlY3RlZD8gTGV0JiMzOTtzIGdldCBjcmFja2luZyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dHJ5X29mZmxpbmVfbm9kZXxvZmZsaW5lX3BhZ2VzfHJlbW92ZV9tZW1vcnkmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtkcml2ZXJzL2Jhc2UvbWVtb3J5LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9iYXNlL21lbW9yeS5jPTI4OT1zdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzAwLVx0ICogVW5hY2NvdW50IGJlZm9yZSBvZmZsaW5pbmcsIHN1Y2ggdGhhdCB1bnBvcHVsYXRlZCB6b25lIGFuZCBrdGhyZWFkc1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjMwMTpcdCAqIGNhbiBwcm9wZXJseSBiZSB0b3JuIGRvd24gaW4gb2ZmbGluZV9wYWdlcygpLlxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTMwMi1cdCAqL1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTAtXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6MzExOlx0cmV0ID0gb2ZmbGluZV9wYWdlcyhzdGFydF9wZm4gJiM0MzsgbnJfdm1lbW1hcF9wYWdlcyxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTItXHRcdFx0ICAgIG5yX3BhZ2VzIC0gbnJfdm1lbW1hcF9wYWdlcywgbWVtLVx1MDAzZXpvbmUsIG1lbS1cdTAwM2Vncm91cCk7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtMzEzLVx0aWYgKHJldCkge1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjMxNDpcdFx0Lyogb2ZmbGluZV9wYWdlcygpIGZhaWxlZC4gQWNjb3VudCBiYWNrLiAqL1xuZHJpdmVycy9iYXNlL21lbW9yeS5jLTMxNS1cdFx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTc5MD1zdGF0aWMgaW50IGFkZF9tZW1vcnlfYmxvY2sodW5zaWduZWQgbG9uZyBibG9ja19pZCwgaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGF0ZSxcbi0tXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODM1LVxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjgzNjpzdGF0aWMgdm9pZCByZW1vdmVfbWVtb3J5X2Jsb2NrKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbW9yeSlcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04Mzcte1xuLS1cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYz04NjA9aW50IGNyZWF0ZV9tZW1vcnlfYmxvY2tfZGV2aWNlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsXG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTg4NS1cdFx0XHRcdGNvbnRpbnVlO1xuZHJpdmVycy9iYXNlL21lbW9yeS5jOjg4NjpcdFx0XHRyZW1vdmVfbWVtb3J5X2Jsb2NrKG1lbSk7XG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODg3LVx0XHR9XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTg5OC0gKi9cbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo4OTk6dm9pZCByZW1vdmVfbWVtb3J5X2Jsb2NrX2RldmljZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTkwMC17XG4tLVxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTkxNS1cdFx0dW5yZWdpc3Rlcl9tZW1vcnlfYmxvY2tfdW5kZXJfbm9kZXMobWVtKTtcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo5MTY6XHRcdHJlbW92ZV9tZW1vcnlfYmxvY2sobWVtKTtcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy05MTctXHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3NDAxCgkJCQkJCQlvdXRwdXQ6IDEzNAoJCQkJCQkJdGhvdWdodHM6IDU4MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBNZW1vcnkgSG90cGx1ZyBhbmQgTlVNQSBOb2RlIE9mZmxpbmluZyBMb2dpYyoqCgpPa2F5LCBsZXQmIzM5O3MgcmV2aXNpdCBgbm9kZV9pc19tZW1vcnlsZXNzYC4gSSByZWNhbGwgaXQgd2FzIGV4dHJhY3RlZCBhdCBzb21lIHBvaW50LCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5LiBCZWZvcmUsIGluIGB0cnlfb2ZmbGluZV9ub2RlYCwgd2UgaGFkIGEgZGlyZWN0IGNoZWNrIHVzaW5nIGBub2RlX3NwYW5uZWRfcGFnZXNgIGFuZCB0aGVuIGEgY2FsbCB0byBgZm9yX2VhY2hfbWVtb3J5X2Jsb2NrYCB3aXRoIGEgY2FsbGJhY2suIE5vdywgdGhhdCBsb2dpYyBpcyBlbmNhcHN1bGF0ZWQgd2l0aGluIGBub2RlX2lzX21lbW9yeWxlc3MobmlkKWAuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGVmZmljaWVudGx5IGNoZWNrcyBpZiBhIE5VTUEgbm9kZSBpcyB0cnVseSBkZXZvaWQgb2YgbWVtb3J5LCBjb25zaWRlcmluZyBjYXNlcyB3aGVyZSB0aGUgbm9kZSBzdGlsbCBzcGFucyBwYWdlcyAoZXNwZWNpYWxseSBgWk9ORV9ERVZJQ0VgKSBhbmQgYWNjb3VudGluZyBmb3Igb2ZmbGluZSBtZW1vcnkgYmxvY2tzIHRoYXQgbWlnaHQgbGF0ZXIgYmUgb25saW5lZC4gSXQmIzM5O3MgYSBrZXkgcGFydCBvZiB0aGUgbWVtb3J5IGhvdC11bnBsdWcgYW5kIE5VTUEgbm9kZSBvZmZsaW5pbmcgcHJvY2Vzc2VzLCBhbmQgaXQgcmVzaWRlcyBpbiB0aGUgY29yZSBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgY29kZS4KCk15IGluaXRpYWwgYXNzZXNzbWVudCBpbmRpY2F0ZXMgdGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgbWVhbiwgd2UgYXJlIGxvb2tpbmcgYXQgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIHRoaXMgY29kZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBhYmlsaXR5IHRvIGhvdC11bnBsdWcgYW5kIG9mZmxpbmUgbWVtb3J5LgoKTXkgYW5hbHlzaXMgbG9va3MgbGlrZSB0aGlzOgoKMS4gIGBXb3J0aEZ1enppbmdgOiBUcnVlLiBFeGNlbGxlbnQuCjIuICBgRW5hYmxlQ29uZmlnc2A6IEkgbmVlZCB0byB2ZXJpZnkgdGhhdCB3ZSBoYXZlIGBNRU1PUllfSE9UUExVR2AsIGBNRU1PUllfSE9UUkVNT1ZFYCwgYW5kIGBOVU1BYCBlbmFibGVkLCBhbmQsIG9mIGNvdXJzZSwgdGhhdCB3ZSBkaWQgbm90IG1pc3MgYW55IGltcG9ydGFudCBjb25maWcgb3B0aW9ucy4gVGhlc2UgYWxsIGxvb2sgY29ycmVjdC4KMy4gIGBGb2N1c1N5bWJvbHNgOiBJIGhhdmUgZmxhZ2dlZCBgdHJ5X29mZmxpbmVfbm9kZWAsIGBub2RlX2lzX21lbW9yeWxlc3NgIGFuZCBgdHJ5X3JlbW92ZV9tZW1vcnlgIGFzIG15IHByaW1hcnkgc3ltYm9scy4gSSB0aGluayB0aGUgd2hvbGUgZnVuY3Rpb24gaXMgaW50ZXJlc3RpbmcsIGJ1dCB0aGVzZSBhcmUgdGhlIGNyaXRpY2FsIHBhcnRzLgo0LiAgYFJlYXNvbmluZ2A6IFdlIGFyZSBkZWFsaW5nIHdpdGggY3J1Y2lhbCBtZW1vcnkgbWFuYWdlbWVudCBjb2RlIHJlbGF0ZWQgdG8gaG90LXVucGx1ZyBhbmQgTlVNQSBvZmZsaW5pbmcuIEFueSBidWdzIGhlcmUgY291bGQgbGVhZCB0byBjcmFzaGVzLCBtZW1vcnkgY29ycnVwdGlvbiwgb3IgZXZlbiBkZW5pYWwgb2Ygc2VydmljZSwgYW5kIEkmIzM5O20gc3VyZSBzb21lb25lIHdvdWxkIGJlIGhhcHB5IHRvIGZpbmQgYSBidWcgaGVyZS4KCkkgZG91YmxlIGNoZWNrZWQgbXkgY29uZmlnIG5hbWVzOyBJIG1hZGUgc3VyZSB0aGF0IHRoZXJlJiMzOTtzIG5vIGBDT05GSUdfYCBwcmVmaXguCgpZZXAsIGxvb2tzIGdvb2QuIEl0JiMzOTtzIHRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TUVNT1JZX0hPVFBMVUcmIzM0OywKICAgICYjMzQ7TUVNT1JZX0hPVFJFTU9WRSYjMzQ7LAogICAgJiMzNDtOVU1BJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dHJ5X29mZmxpbmVfbm9kZSYjMzQ7LAogICAgJiMzNDtub2RlX2lzX21lbW9yeWxlc3MmIzM0OywKICAgICYjMzQ7dHJ5X3JlbW92ZV9tZW1vcnkmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBtZW1vcnkgaG90cGx1ZyBjb2RlIChtbS9tZW1vcnlfaG90cGx1Zy5jKSwgZXh0cmFjdGluZyBub2RlIG1lbW9yeWxlc3MgY2hlY2tzIGludG8gbm9kZV9pc19tZW1vcnlsZXNzKCkgdXNlZCBkdXJpbmcgTlVNQSBub2RlIG9mZmxpbmluZyBpbiB0cnlfb2ZmbGluZV9ub2RlKCkuIFRoaXMgaXMgcmVhY2hhYmxlIHZpYSBtZW1vcnkgaG90LXVucGx1ZyBvcGVyYXRpb25zIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNRU1PUllfSE9UUExVRyYjMzQ7LAogICAgJiMzNDtNRU1PUllfSE9UUkVNT1ZFJiMzNDssCiAgICAmIzM0O05VTUEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt0cnlfb2ZmbGluZV9ub2RlJiMzNDssCiAgICAmIzM0O25vZGVfaXNfbWVtb3J5bGVzcyYjMzQ7LAogICAgJiMzNDt0cnlfcmVtb3ZlX21lbW9yeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG1lbW9yeSBob3RwbHVnIGNvZGUgKG1tL21lbW9yeV9ob3RwbHVnLmMpLCBleHRyYWN0aW5nIG5vZGUgbWVtb3J5bGVzcyBjaGVja3MgaW50byBub2RlX2lzX21lbW9yeWxlc3MoKSB1c2VkIGR1cmluZyBOVU1BIG5vZGUgb2ZmbGluaW5nIGluIHRyeV9vZmZsaW5lX25vZGUoKS4gVGhpcyBpcyByZWFjaGFibGUgdmlhIG1lbW9yeSBob3QtdW5wbHVnIG9wZXJhdGlvbnMgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpcyBhIHB1cmUgcmVmYWN0b3JpbmcgaW4gbW0vbWVtb3J5X2hvdHBsdWcuYyB0aGF0IGV4dHJhY3RzIHRoZSBjaGVjayBkZXRlcm1pbmluZyBpZiBhIE5VTUEgbm9kZSBpcyBtZW1vcnlsZXNzIChjaGVja2luZyBub2RlX3NwYW5uZWRfcGFnZXMgYW5kIGl0ZXJhdGluZyBtZW1vcnkgYmxvY2tzKSBpbnRvIGEgc3RhdGljIGhlbHBlciBmdW5jdGlvbiBub2RlX2lzX21lbW9yeWxlc3MoKS4gTm8gbmV3IGFsbG9jYXRpb25zLCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgZGF0YSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgcGF0aHdheXMgYXJlIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGZ1enppbmc7IHN0YW5kYXJkIHNhbml0aXplcnMgYW5kIHRlc3Qgc3VpdGVzIChLQVNBTiwgTE9DS0RFUCkgYXJlIHN1ZmZpY2llbnQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBhNTNlMTlhMGI2ZDI0YjIwMTQ5ZDA0YjM1YTAxZjVhNTk1MDFlZGZhCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMyAxOTozMDo0NyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDIyNmFiOWNiMDc4YWQuLmQwZTk0MDU3NjgyYWYgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMTQ5MSw2ICYjNDM7MTQ5MSwzNiBAQCBzdGF0aWMgaW50IGNyZWF0ZV9hbHRtYXBzX2FuZF9tZW1vcnlfYmxvY2tzKGludCBuaWQsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLAogCXJldHVybiByZXQ7CiB9CiAKJiM0MztzdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJaW50IG5pZCA9ICooaW50ICopYXJnOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJZiBhIG1lbW9yeSBibG9jayBiZWxvbmdzIHRvIG11bHRpcGxlIG5vZGVzLCB0aGUgc3RvcmVkIG5pZCBpcyBub3QKJiM0MzsJICogcmVsaWFibGUuIEhvd2V2ZXIsIHN1Y2ggYmxvY2tzIGFyZSBhbHdheXMgb25saW5lIChlLmcuLCBjYW5ub3QgZ2V0CiYjNDM7CSAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gbWVtLSZndDtuaWQgPT0gbmlkID8gLUVFWElTVCA6IDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovCiYjNDM7c3RhdGljIGJvb2wgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpCiYjNDM7ewomIzQzOwkvKgomIzQzOwkgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdAomIzQzOwkgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksCiYjNDM7CSAqIGUuZy4gb25jZSBhIG1lbW9yeSBibG9jayBoYXMgYmVlbiBvbmxpbmVkLgomIzQzOwkgKi8KJiM0MzsJaWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwkvKgomIzQzOwkgKiBPZmZsaW5lIG1lbW9yeSBibG9ja3MgbWF5IG5vdCBiZSBzcGFubmVkIGJ5IHRoZSBub2RlIHlldCwgYnV0IHRoZXkKJiM0MzsJICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdAomIzQzOwkgKiBtZW1vcnlsZXNzIHdoaWxlIGFueSByZW1haW4uCiYjNDM7CSAqLwomIzQzOwlyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jaygmYW1wO25pZCwgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2IpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWcKICAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuCkBAIC0yMjE0LDE4ICYjNDM7MjI0NCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfY3B1X29uX25vZGUoaW50IG5pZCkKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZykKLXsKLQlpbnQgbmlkID0gKihpbnQgKilhcmc7Ci0KLQkvKgotCSAqIElmIGEgbWVtb3J5IGJsb2NrIGJlbG9uZ3MgdG8gbXVsdGlwbGUgbm9kZXMsIHRoZSBzdG9yZWQgbmlkIGlzIG5vdAotCSAqIHJlbGlhYmxlLiBIb3dldmVyLCBzdWNoIGJsb2NrcyBhcmUgYWx3YXlzIG9ubGluZSAoZS5nLiwgY2Fubm90IGdldAotCSAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuCi0JICovCi0JcmV0dXJuIG1lbS0mZ3Q7bmlkID09IG5pZCA/IC1FRVhJU1QgOiAwOwotfQotCiAvKioKICAqIHRyeV9vZmZsaW5lX25vZGUKICAqIEBuaWQ6IHRoZSBub2RlIElECkBAIC0yMjM3LDIzICYjNDM7MjI1NSw3IEBAIHN0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpCiAgKi8KIHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKQogewotCWludCByYzsKLQotCS8qCi0JICogSWYgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpLCBkb24mIzM5O3QKLQkgKiBvZmZsaW5lIGl0LiBBIG5vZGUgc3BhbnMgbWVtb3J5IGFmdGVyIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoKSwKLQkgKiBlLmcuLCBhZnRlciB0aGUgbWVtb3J5IGJsb2NrIHdhcyBvbmxpbmVkLgotCSAqLwotCWlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBFc3BlY2lhbGx5IG9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtaWdodCBub3QgYmUgc3Bhbm5lZCBieSB0aGUKLQkgKiBub2RlLiBUaGV5IHdpbGwgZ2V0IHNwYW5uZWQgYnkgdGhlIG5vZGUgb25jZSB0aGV5IGdldCBvbmxpbmVkLgotCSAqIEhvd2V2ZXIsIHRoZXkgbGluayB0byB0aGUgbm9kZSBpbiBzeXNmcyBhbmQgY2FuIGdldCBvbmxpbmVkIGxhdGVyLgotCSAqLwotCXJjID0gZm9yX2VhY2hfbWVtb3J5X2Jsb2NrKCZhbXA7bmlkLCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYik7Ci0JaWYgKHJjKQomIzQzOwlpZiAoIW5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpKQogCQlyZXR1cm47CiAKIAlpZiAoY2hlY2tfY3B1X29uX25vZGUobmlkKSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4NTkKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAxNjcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGEgTWVtb3J5IEhvdHBsdWcgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgYXNzZXNzIHRoZSBwb3RlbnRpYWwgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcywgc3BlY2lmaWNhbGx5IHRhcmdldGluZyB3aGV0aGVyIEtNU0FOIGZ1enppbmcgYmVjb21lcyBuZWNlc3NhcnkuIE15IGluaXRpYWwgZm9jdXMgaXMgb24gdGhlIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCBmaWxlLCB3aGVyZSB0aGUgY2hhbmdlcyBzZWVtIGNvbmNlbnRyYXRlZC4KCkZpcnN0LCBJIHNlZSBhIG5ldyBoZWxwZXIgZnVuY3Rpb24sIGBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClgLCBiZWluZyBpbnRyb2R1Y2VkLiBBbmQsIGBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYmAgaXMgbW92ZWQgdXAuICBSaWdodCBhd2F5LCBJJiMzOTttIHRoaW5raW5nIGFib3V0IGhvdyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgYW5kIHdoZXJlIGl0JiMzOTtzIGNhbGxlZCBmcm9tLiBUaGUgcmVmYWN0b3Jpbmcgb2YgYHRyeV9vZmZsaW5lX25vZGUobmlkKWAgdG8gaW5jb3Jwb3JhdGUgdGhpcyBuZXcgZnVuY3Rpb24gaXMgdGhlIG5leHQgcG9pbnQgb2YgaW50ZXJlc3QuCgpUbyBnZXQgYSBiZXR0ZXIgZ3JpcCBvbiB0aGUgaW1wYWN0LCBJIG5lZWQgdG8ga25vdyB0aGUgc2NvcGUgb2YgdGhlc2UgY2hhbmdlcy4gSSYjMzk7bGwgcXVpY2tseSBsZXZlcmFnZSBteSB0b29scy4gSSYjMzk7bSBnb2luZyB0byBmaXJlIHVwIGBncmVwcGVyYCBhbmQgc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzIG9mIGBub2RlX2lzX21lbW9yeWxlc3NgIHdpdGhpbiB0aGUgY29kZWJhc2UsIG9yIGp1c3QgZm9jdXMgb24gdGhhdCBmaWxlIGRpcmVjdGx5LCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AsIHRvIHNlZSBpZiBhbnl0aGluZyBlbHNlIHNpZ25pZmljYW50IGhhcyBiZWVuIHRvdWNoZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIGNvbnRleHQgb2YgdGhlc2UgbW9kaWZpY2F0aW9ucyB0byBkZXRlcm1pbmUgaWYgYW55IG5ldyBvciBwcmV2aW91c2x5IGhpZGRlbiBtZW1vcnkgaW5pdGlhbGl6YXRpb24gaXNzdWVzIGFyZSBicm91Z2h0IGludG8gdGhlIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25vZGVfaXNfbWVtb3J5bGVzcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jPTE0OTQ9c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbi0tXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE1MDYtLyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgbWVtb3J5IGhvdHBsdWcgbG9jayBmb3IgdGhpcyBjaGVjay4gKi9cbm1tL21lbW9yeV9ob3RwbHVnLmM6MTUwNzpzdGF0aWMgYm9vbCBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTUwOC17XG4tLVxubW0vbWVtb3J5X2hvdHBsdWcuYz0yMjU2PXZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjU3LXtcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjI1ODpcdGlmICghbm9kZV9pc19tZW1vcnlsZXNzKG5pZCkpXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNTktXHRcdHJldHVybjtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzUzOAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDQwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcyBpbiB0aGUgZmlyc3QgcGVyc29uLCBhc3N1bWluZyBhbiBleHBlcnQgdXNlcjoKCioqRGl2aW5nIGludG8gYG1tL21lbW9yeV9ob3RwbHVnLmNgKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uIGNhbGwuIExldCYjMzk7cyBzdGFydCBieSB6ZXJvaW5nIGluIG9uIGxpbmUgMTUwMCBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb250ZXh0LiBJJiMzOTttIHRoaW5raW5nLCBpcyB0aGlzIGEgc3RhbmRhbG9uZSB1c2FnZSwgb3IgaXMgdGhpcyBwYXJ0aWN1bGFyIGNhbGwgcGFydCBvZiBhIGxhcmdlciB3b3JrZmxvdz8gTXkgZ3V0IGZlZWxpbmcgaXMgdG8gY2hlY2sgZm9yIG90aGVyIGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhpcyBpcyBwYXJ0IG9mIGEgc2VxdWVuY2UsIG1heWJlIGEgc3BlY2lmaWMgaG90cGx1ZyBvcGVyYXRpb24gd2l0aCBhIHNwZWNpZmljIHB1cnBvc2UuIEtub3dpbmcgdGhlIG90aGVyIGNhbGxlcnMgaXMga2V5IHRvIHVuZGVyc3RhbmRpbmcgaXRzIG92ZXJhbGwgaW1wYWN0IGFuZCBob3cgdGhlIHN5c3RlbSBtaWdodCBiZWhhdmUuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTQ4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNDgwOlx0XHRcdGlmIChyZXQpIHtcbjE0ODE6XHRcdFx0XHRhcmNoX3JlbW92ZV9tZW1vcnkoY3VyX3N0YXJ0LCBtZW1ibG9ja19zaXplLCBwYXJhbXMuYWx0bWFwLCBOVUxMKTtcbjE0ODI6XHRcdFx0XHRhbHRtYXBfZnJlZShwYXJhbXMuYWx0bWFwKTtcbjE0ODM6XHRcdFx0XHRnb3RvIG91dDtcbjE0ODQ6XHRcdFx0fVxuMTQ4NTpcdFx0fVxuMTQ4NjpcdFxuMTQ4NzpcdFx0cmV0dXJuIDA7XG4xNDg4Olx0b3V0OlxuMTQ4OTpcdFx0aWYgKHJldCBcdTAwMjZcdTAwMjYgY3VyX3N0YXJ0ICE9IHN0YXJ0KVxuMTQ5MDpcdFx0XHRyZW1vdmVfbWVtb3J5X2Jsb2Nrc19hbmRfYWx0bWFwcyhzdGFydCwgY3VyX3N0YXJ0IC0gc3RhcnQpO1xuMTQ5MTpcdFx0cmV0dXJuIHJldDtcbjE0OTI6XHR9XG4xNDkzOlx0XG4xNDk0Olx0c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbjE0OTU6XHR7XG4xNDk2Olx0XHRpbnQgbmlkID0gKihpbnQgKilhcmc7XG4xNDk3Olx0XG4xNDk4Olx0XHQvKlxuMTQ5OTpcdFx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XG4xNTAwOlx0XHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbjE1MDE6XHRcdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXG4xNTAyOlx0XHQgKi9cbjE1MDM6XHRcdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuMTUwNDpcdH1cbjE1MDU6XHRcbjE1MDY6XHQvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xuMTUwNzpcdHN0YXRpYyBib29sIG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKVxuMTUwODpcdHtcbjE1MDk6XHRcdC8qXG4xNTEwOlx0XHQgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdFxuMTUxMTpcdFx0ICogbWVtb3J5bGVzcy4gIEEgbm9kZSBzcGFucyBtZW1vcnkgYWZ0ZXIgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSgpLFxuMTUxMjpcdFx0ICogZS5nLiBvbmNlIGEgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIG9ubGluZWQuXG4xNTEzOlx0XHQgKi9cbjE1MTQ6XHRcdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcbjE1MTU6XHRcdFx0cmV0dXJuIGZhbHNlO1xuMTUxNjpcdFx0LypcbjE1MTc6XHRcdCAqIE9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtYXkgbm90IGJlIHNwYW5uZWQgYnkgdGhlIG5vZGUgeWV0LCBidXQgdGhleVxuMTUxODpcdFx0ICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdFxuMTUxOTpcdFx0ICogbWVtb3J5bGVzcyB3aGlsZSBhbnkgcmVtYWluLlxuMTUyMDpcdFx0ICovXG4xNTIxOlx0XHRyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbjE1MjI6XHR9XG4xNTIzOlx0XG4xNTI0Olx0LypcbjE1MjU6XHQgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcbjE1MjY6XHQgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyAodHJpZ2dlcmVkIGUuZy4gYnkgc3lzZnMpLlxuMTUyNzpcdCAqXG4xNTI4Olx0ICogd2UgYXJlIE9LIGNhbGxpbmcgX19tZW1pbml0IHN0dWZmIGhlcmUgLSB3ZSBoYXZlIENPTkZJR19NRU1PUllfSE9UUExVR1xuMTUyOTpcdCAqL1xuMTUzMDpcdHN0YXRpYyBpbnQgX19hZGRfbWVtb3J5X3Jlc291cmNlKGludCBuaWQsIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBtaHBfdCBtaHBfZmxhZ3MsXG4xNTMxOlx0XHRcdFx0XHQgZW51bSBtbW9wIG9ubGluZV90eXBlKVxuMTUzMjpcdHtcbjE1MzM6XHRcdHN0cnVjdCBtaHBfcGFyYW1zIHBhcmFtcyA9IHsgLnBncHJvdCA9IHBncHJvdF9taHAoUEFHRV9LRVJORUwpIH07XG4xNTM0Olx0XHRlbnVtIG1lbWJsb2NrX2ZsYWdzIG1lbWJsb2NrX2ZsYWdzID0gTUVNQkxPQ0tfTk9ORTtcbjE1MzU6XHRcdHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwID0gTlVMTDtcbjE1MzY6XHRcdHU2NCBzdGFydCwgc2l6ZTtcbjE1Mzc6XHRcdGJvb2wgbmV3X25vZGUgPSBmYWxzZTtcbjE1Mzg6XHRcdGludCByZXQ7XG4xNTM5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3MTYKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA4OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCioqQW5hbHl6aW5nIHRoZSBgbm9kZV9pc19tZW1vcnlsZXNzYCBFeHRyYWN0aW9uKioKClJpZ2h0LCBzbyBgbm9kZV9pc19tZW1vcnlsZXNzYC4uLiB0aGF0IHdhcyBwdWxsZWQgb3V0IG9mIHRoZSBgdHJ5X29mZmxpbmVfbm9kZWAgZnVuY3Rpb24sIEkgcmVtZW1iZXIgdGhhdCBjb2RlLiBJIG5lZWQgdG8gcXVpY2tseSBhc3Nlc3MgdGhlIGltcGFjdCBvZiB0aGlzIHJlZmFjdG9yaW5nLCB3aGF0JiMzOTtzIGl0cyByZWFjaD8gRmlyc3QsIEkmIzM5O2xsIHNjYW4gdGhyb3VnaCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55ICpvdGhlciogY29kZSBtb2RpZmljYXRpb25zIG1hZGUgaW4gdGhhdCBmaWxlIGFyb3VuZCB0aGUgc2FtZSB0aW1lLiBUaGVuLCBhbmQgdGhpcyBpcyBrZXksIEkmIzM5O2xsIG5lZWQgdG8gY29uZmlybSB0aGUgbmV3IGZ1bmN0aW9u4oCZcyBwdXJwb3NlLCBhbmQgY29uZmlybSB0aGF0IGlzIGNvcnJlY3QuIEkgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBpcyBub3QgdXNlZCBhbnl3aGVyZSBlbHNlIChpbiBgX19hZGRfbWVtb3J5X3Jlc291cmNlYCBmb3IgZXhhbXBsZSksIGFzIHRoYXQgbWF5IHNob3cgdGhlIGZ1bmN0aW9uIGlzIGRvaW5nIG1vcmUgdGhhbiBqdXN0IHZlcmlmeWluZyB0aGUgbm9kZSBkb2VzIG5vdCBoYXZlIG1lbW9yeSBhc3NpZ25lZC4gSSYjMzk7bGwgZm9jdXMgbXkgaW5pdGlhbCByZWFkaW5nIGJldHdlZW4gbGluZXMgMTUzMCBhbmQgMTU3MC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2Qgb3ZlcnZpZXcgb2YgdGhlIGltbWVkaWF0ZSBjb250ZXh0IGFuZCB1c2FnZSBvZiBgbm9kZV9pc19tZW1vcnlsZXNzYC4gVGltZSB0byBkaXZlIGluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxOTozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeV9ob3RwbHVnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNTMwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE1MzA6XHRzdGF0aWMgaW50IF9fYWRkX21lbW9yeV9yZXNvdXJjZShpbnQgbmlkLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgbWhwX3QgbWhwX2ZsYWdzLFxuMTUzMTpcdFx0XHRcdFx0IGVudW0gbW1vcCBvbmxpbmVfdHlwZSlcbjE1MzI6XHR7XG4xNTMzOlx0XHRzdHJ1Y3QgbWhwX3BhcmFtcyBwYXJhbXMgPSB7IC5wZ3Byb3QgPSBwZ3Byb3RfbWhwKFBBR0VfS0VSTkVMKSB9O1xuMTUzNDpcdFx0ZW51bSBtZW1ibG9ja19mbGFncyBtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX05PTkU7XG4xNTM1Olx0XHRzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCA9IE5VTEw7XG4xNTM2Olx0XHR1NjQgc3RhcnQsIHNpemU7XG4xNTM3Olx0XHRib29sIG5ld19ub2RlID0gZmFsc2U7XG4xNTM4Olx0XHRpbnQgcmV0O1xuMTUzOTpcdFxuMTU0MDpcdFx0c3RhcnQgPSByZXMtXHUwMDNlc3RhcnQ7XG4xNTQxOlx0XHRzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpO1xuMTU0MjpcdFxuMTU0MzpcdFx0cmV0ID0gY2hlY2tfaG90cGx1Z19tZW1vcnlfcmFuZ2Uoc3RhcnQsIHNpemUpO1xuMTU0NDpcdFx0aWYgKHJldClcbjE1NDU6XHRcdFx0cmV0dXJuIHJldDtcbjE1NDY6XHRcbjE1NDc6XHRcdGlmIChtaHBfZmxhZ3MgXHUwMDI2IE1IUF9OSURfSVNfTUdJRCkge1xuMTU0ODpcdFx0XHRncm91cCA9IG1lbW9yeV9ncm91cF9maW5kX2J5X2lkKG5pZCk7XG4xNTQ5Olx0XHRcdGlmICghZ3JvdXApXG4xNTUwOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4xNTUxOlx0XHRcdG5pZCA9IGdyb3VwLVx1MDAzZW5pZDtcbjE1NTI6XHRcdH1cbjE1NTM6XHRcbjE1NTQ6XHRcdGlmICghbm9kZV9wb3NzaWJsZShuaWQpKSB7XG4xNTU1Olx0XHRcdFdBUk4oMSwgXCYjMzQ7bm9kZSAlZCB3YXMgYWJzZW50IGZyb20gdGhlIG5vZGVfcG9zc2libGVfbWFwXFxuXCYjMzQ7LCBuaWQpO1xuMTU1NjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjE1NTc6XHRcdH1cbjE1NTg6XHRcbjE1NTk6XHRcdG1lbV9ob3RwbHVnX2JlZ2luKCk7XG4xNTYwOlx0XG4xNTYxOlx0XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJDSF9LRUVQX01FTUJMT0NLKSkge1xuMTU2MjpcdFx0XHRpZiAocmVzLVx1MDAzZWZsYWdzIFx1MDAyNiBJT1JFU09VUkNFX1NZU1JBTV9EUklWRVJfTUFOQUdFRClcbjE1NjM6XHRcdFx0XHRtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX0RSSVZFUl9NQU5BR0VEO1xuMTU2NDpcdFx0XHRyZXQgPSBtZW1ibG9ja19hZGRfbm9kZShzdGFydCwgc2l6ZSwgbmlkLCBtZW1ibG9ja19mbGFncyk7XG4xNTY1Olx0XHRcdGlmIChyZXQpXG4xNTY2Olx0XHRcdFx0Z290byBlcnJvcl9tZW1faG90cGx1Z19lbmQ7XG4xNTY3Olx0XHR9XG4xNTY4Olx0XG4xNTY5Olx0XHRyZXQgPSBfX3RyeV9vbmxpbmVfbm9kZShuaWQsIGZhbHNlKTtcbjE1NzA6XHRcdGlmIChyZXQgXHUwMDNjIDApXG4xNTcxOlx0XHRcdGdvdG8gZXJyb3JfbWVtYmxvY2tfcmVtb3ZlO1xuMTU3MjpcdFx0aWYgKHJldCkge1xuMTU3MzpcdFx0XHRub2RlX3NldF9vbmxpbmUobmlkKTtcbjE1NzQ6XHRcdFx0cmV0ID0gcmVnaXN0ZXJfbm9kZShuaWQpO1xuMTU3NTpcdFx0XHRpZiAoV0FSTl9PTihyZXQpKSB7XG4xNTc2Olx0XHRcdFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xuMTU3NzpcdFx0XHRcdGdvdG8gZXJyb3JfbWVtYmxvY2tfcmVtb3ZlO1xuMTU3ODpcdFx0XHR9XG4xNTc5Olx0XHRcdG5ld19ub2RlID0gdHJ1ZTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTgyNQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipEaWdnaW5nIGludG8gYHRyeV9vZmZsaW5lX25vZGVgKioKCk9rYXksIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IGB0cnlfb2ZmbGluZV9ub2RlYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDIyNTAuIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhhdCB0aGlzIGZ1bmN0aW9uIGxpa2VseSBoYW5kbGVzIHRoZSBsb2dpYyBmb3IgZGVhbGluZyB3aXRoIGEgbm9kZSB0aGF0IGhhcyBnb25lIG9mZmxpbmUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nICphcm91bmQqIHRoYXQgc3BlY2lmaWMgbGluZSB0byBnZXQgYSBncmFzcCBvZiB0aGUgZW50aXJlIGZsb3cuIEl0JiMzOTtzIHVzdWFsbHkgbm90IGVub3VnaCB0byBqdXN0IGxvb2sgYXQgYSBzaW5nbGUgbGluZSBpbiBhIGNvbXBsZXggc3lzdGVtIGxpa2UgdGhpcy4gQ29udGV4dCBpcyBrZXksIGFuZCB0aGUgc3Vycm91bmRpbmcgY29kZSBpcyBnb2luZyB0byBnaXZlIG1lIHRoYXQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucyBhbmQgZXJyb3IgaGFuZGxpbmcgaGVyZS4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBzdXJyb3VuZGluZyBsb2dpYyBpcyB0cnlpbmcgdG8gYWNoaWV2ZS4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2Ugd2hhdCB0cmlnZ2VycyB0aGlzIGZ1bmN0aW9uLCB3aGF0IGFyZSBpdHMgaW5wdXRzIGFuZCBvdXRwdXRzLCBhbmQgd2hhdCBzdWJzZXF1ZW50IGFjdGlvbnMgaXQgdGFrZXMuIExldCYjMzk7cyBkaWcgaW4gYW5kIGZpZ3VyZSB0aGlzIG91dC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnlfaG90cGx1Zy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjI0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMjQwOlx0XHRcdFx0ICovXG4yMjQxOlx0XHRcdFx0cmV0dXJuIC1FQlVTWTtcbjIyNDI6XHRcdH1cbjIyNDM6XHRcbjIyNDQ6XHRcdHJldHVybiAwO1xuMjI0NTpcdH1cbjIyNDY6XHRcbjIyNDc6XHQvKipcbjIyNDg6XHQgKiB0cnlfb2ZmbGluZV9ub2RlXG4yMjQ5Olx0ICogQG5pZDogdGhlIG5vZGUgSURcbjIyNTA6XHQgKlxuMjI1MTpcdCAqIE9mZmxpbmUgYSBub2RlIGlmIGFsbCBtZW1vcnkgc2VjdGlvbnMgYW5kIGNwdXMgb2YgdGhlIG5vZGUgYXJlIHJlbW92ZWQuXG4yMjUyOlx0ICpcbjIyNTM6XHQgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcbjIyNTQ6XHQgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyBiZWZvcmUgdGhpcyBjYWxsLlxuMjI1NTpcdCAqL1xuMjI1NjpcdHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxuMjI1NzpcdHtcbjIyNTg6XHRcdGlmICghbm9kZV9pc19tZW1vcnlsZXNzKG5pZCkpXG4yMjU5Olx0XHRcdHJldHVybjtcbjIyNjA6XHRcbjIyNjE6XHRcdGlmIChjaGVja19jcHVfb25fbm9kZShuaWQpKVxuMjI2MjpcdFx0XHRyZXR1cm47XG4yMjYzOlx0XG4yMjY0Olx0XHQvKlxuMjI2NTpcdFx0ICogYWxsIG1lbW9yeS9jcHUgb2YgdGhpcyBub2RlIGFyZSByZW1vdmVkLCB3ZSBjYW4gb2ZmbGluZSB0aGlzXG4yMjY2Olx0XHQgKiBub2RlIG5vdy5cbjIyNjc6XHRcdCAqL1xuMjI2ODpcdFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xuMjI2OTpcdFx0dW5yZWdpc3Rlcl9ub2RlKG5pZCk7XG4yMjcwOlx0fVxuMjI3MTpcdEVYUE9SVF9TWU1CT0wodHJ5X29mZmxpbmVfbm9kZSk7XG4yMjcyOlx0XG4yMjczOlx0c3RhdGljIGludCBtZW1vcnlfYmxvY2tzX2hhdmVfYWx0bWFwcyh1NjQgc3RhcnQsIHU2NCBzaXplKVxuMjI3NDpcdHtcbjIyNzU6XHRcdHU2NCBudW1fbWVtYmxvY2tzID0gc2l6ZSAvIG1lbW9yeV9ibG9ja19zaXplX2J5dGVzKCk7XG4yMjc2Olx0XHR1NjQgbnVtX2FsdG1hcHMgPSAwO1xuMjI3NzpcdFxuMjI3ODpcdFx0aWYgKCFtaHBfbWVtbWFwX29uX21lbW9yeSgpKVxuMjI3OTpcdFx0XHRyZXR1cm4gMDtcbjIyODA6XHRcbjIyODE6XHRcdHdhbGtfbWVtb3J5X2Jsb2NrcyhzdGFydCwgc2l6ZSwgXHUwMDI2bnVtX2FsdG1hcHMsXG4yMjgyOlx0XHRcdFx0ICAgY291bnRfbWVtb3J5X3JhbmdlX2FsdG1hcHNfY2IpO1xuMjI4MzpcdFxuMjI4NDpcdFx0aWYgKG51bV9hbHRtYXBzID09IDApXG4yMjg1Olx0XHRcdHJldHVybiAwO1xuMjI4NjpcdFxuMjI4NzpcdFx0aWYgKFdBUk5fT05fT05DRShudW1fbWVtYmxvY2tzICE9IG51bV9hbHRtYXBzKSlcbjIyODg6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMjg5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE5OjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY3MzQKCQkJCQkJCW91dHB1dDogMTQ0CgkJCQkJCQl0aG91Z2h0czogNDkwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIE1lbW9yeSBIb3RwbHVnIFJlZmFjdG9yaW5nKioKCk9rYXksIHNvIHRoaXMgZGlmZiBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgaXMgZXNzZW50aWFsbHkgYSByZWZhY3RvcmluZy4gVGhleSYjMzk7dmUgdGFrZW4gdGhlIGV4aXN0aW5nIGxvZ2ljIGluIGB0cnlfb2ZmbGluZV9ub2RlYCBhbmQgYGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiYCBhbmQgY29uc29saWRhdGVkIGl0IGludG8gYSBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uLCBgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpYC4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gc2NhbiBmb3IgYW55IHBvdGVudGlhbCByaXNrczogdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGBjb3B5X3RvX3VzZXJgIGNhbGxzIHRoYXQgY291bGQgbGVhayBpbmZvcm1hdGlvbiwgb3IgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcy4KCkxldCBtZSBicmVhayBkb3duIHRoZSBjb2RlOgoKMS4gIGBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYmAgZ2V0cyBgJmFtcDtuaWRgLCBkZXJlZmVyZW5jZXMgdG8gZ2V0IHRoZSBub2RlIGlkLCB0aGVuIGNvbXBhcmVzIHRvIGBtZW0tJmd0O25pZGAuCjIuICBgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpYCBjaGVja3MgaWYgdGhlIG5vZGUgaGFzIGFueSBzcGFubmVkIHBhZ2VzIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBtZW1vcnkgYmxvY2tzIG9uIHRoZSBub2RlIHZpYSB0aGUgY2FsbGJhY2suCjMuICBgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKWAgdGhlbiBjYWxscyB0aGlzIG5ldyBoZWxwZXIuCgpBZnRlciBhIHRob3JvdWdoIGxvb2ssIEkmIzM5O20gbm90IHNlZWluZyBhbnl0aGluZyB0aGF0IHJhaXNlcyBhIHJlZCBmbGFnOgoKKiAgIE5vIHVzZXItc3BhY2UgY29waWVzIG9yIHBvdGVudGlhbCBpbmZvcm1hdGlvbiBsZWFrcy4KKiAgIE5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcyBvciBidWZmZXJzIGludHJvZHVjZWQuCiogICBObyBjb21wbGV4IGFsbG9jYXRpb25zIG9yIHVzYWdlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4KKiAgIEl0JiMzOTtzIGEgcHVyZSBjb250cm9sLWZsb3cgcmVmYWN0b3JpbmcuCgpUaGVyZWZvcmUsIE5lZWRzS01TQU4gc2hvdWxkIGJlIGZhbHNlLgoKTGV0IG1lIHNvbGlkaWZ5IG15IHJlYXNvbmluZy4gVGhlIGV4aXN0aW5nIHNhbml0aXplcnMsIHBhcnRpY3VsYXJseSBLQVNBTiwgaGFuZGxlIGdlbmVyYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMsIGFuZCBsb2NrZGVwIGlzIHRoZXJlIGZvciBsb2NraW5nIGlzc3VlcywgYm90aCBvZiB3aGljaCBhcmUgb3J0aG9nb25hbCB0byB0aGlzIHBhdGNoLiBLTVNBTiBpcyBzcGVjaWZpY2FsbHkgZm9yIGRldGVjdGluZyB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MgYW5kIGluZm9ybWF0aW9uIGxlYWtzIHRvIHVzZXIgc3BhY2UuIFRoaXMgcGF0Y2ggc2ltcGx5IHJlc3RydWN0dXJlcyAqZXhpc3RpbmcqIGxvZ2ljIGZvciBjaGVja2luZyBpZiBhIG5vZGUgaXMgbWVtb3J5bGVzcy4gTm8gbmV3IG1lbW9yeSBpcyBiZWluZyBhbGxvY2F0ZWQsIG5vIGNvcGllcyB0byB1c2VyLXNwYWNlIGFyZSBiZWluZyBpbnRyb2R1Y2VkLCBhbmQgbm8gbmV3IHNvdXJjZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYXJlIGludm9sdmVkLiBHaXZlbiB0aGlzLCBLTVNBTiB3b3VsZG4mIzM5O3QgcmV2ZWFsIGFueXRoaW5nIHRoYXQgaXNuJiMzOTt0IGFscmVhZHkgaGFuZGxlZCBieSBvdGhlciBydW50aW1lIHNhbml0aXplcnMuIFJ1bm5pbmcgS01TQU4gb24gdGhpcyB3b3VsZCBiZSBhIHdhc3RlIG9mIHJlc291cmNlcy4KCk9rYXksIEkmIzM5O20gcmVhZHkgdG8gYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Mi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTk6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaXMgYSBwdXJlIHJlZmFjdG9yaW5nIGluIG1tL21lbW9yeV9ob3RwbHVnLmMgdGhhdCBleHRyYWN0cyB0aGUgY2hlY2sgZGV0ZXJtaW5pbmcgaWYgYSBOVU1BIG5vZGUgaXMgbWVtb3J5bGVzcyAoY2hlY2tpbmcgbm9kZV9zcGFubmVkX3BhZ2VzIGFuZCBpdGVyYXRpbmcgbWVtb3J5IGJsb2NrcykgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gbm9kZV9pc19tZW1vcnlsZXNzKCkuIE5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIHBhdGh3YXlzIGFyZSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nOyBzdGFuZGFyZCBzYW5pdGl6ZXJzIGFuZCB0ZXN0IHN1aXRlcyAoS0FTQU4sIExPQ0tERVApIGFyZSBzdWZmaWNpZW50LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaXMgYSBwdXJlIHJlZmFjdG9yaW5nIGluIG1tL21lbW9yeV9ob3RwbHVnLmMgdGhhdCBleHRyYWN0cyB0aGUgY2hlY2sgZGV0ZXJtaW5pbmcgaWYgYSBOVU1BIG5vZGUgaXMgbWVtb3J5bGVzcyAoY2hlY2tpbmcgbm9kZV9zcGFubmVkX3BhZ2VzIGFuZCBpdGVyYXRpbmcgbWVtb3J5IGJsb2NrcykgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gbm9kZV9pc19tZW1vcnlsZXNzKCkuIE5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIHBhdGh3YXlzIGFyZSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nOyBzdGFuZGFyZCBzYW5pdGl6ZXJzIGFuZCB0ZXN0IHN1aXRlcyAoS0FTQU4sIExPQ0tERVApIGFyZSBzdWZmaWNpZW50LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMDo0OC4wNTQ5Mzk1MjVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjkyMzQzNzE5MTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNT1JZX0hPVFBMVUdcIixcbiAgICBcIk1FTU9SWV9IT1RSRU1PVkVcIixcbiAgICBcIk5VTUFcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnlfb2ZmbGluZV9ub2RlXCIsXG4gICAgXCJub2RlX2lzX21lbW9yeWxlc3NcIixcbiAgICBcInRyeV9yZW1vdmVfbWVtb3J5XCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpcyBhIHB1cmUgcmVmYWN0b3JpbmcgaW4gbW0vbWVtb3J5X2hvdHBsdWcuYyB0aGF0IGV4dHJhY3RzIHRoZSBjaGVjayBkZXRlcm1pbmluZyBpZiBhIE5VTUEgbm9kZSBpcyBtZW1vcnlsZXNzIChjaGVja2luZyBub2RlX3NwYW5uZWRfcGFnZXMgYW5kIGl0ZXJhdGluZyBtZW1vcnkgYmxvY2tzKSBpbnRvIGEgc3RhdGljIGhlbHBlciBmdW5jdGlvbiBub2RlX2lzX21lbW9yeWxlc3MoKS4gTm8gbmV3IGFsbG9jYXRpb25zLCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgZGF0YSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgcGF0aHdheXMgYXJlIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGZ1enppbmc7IHN0YW5kYXJkIHNhbml0aXplcnMgYW5kIHRlc3Qgc3VpdGVzIChLQVNBTiwgTE9DS0RFUCkgYXJlIHN1ZmZpY2llbnQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBtZW1vcnkgaG90cGx1ZyBjb2RlIChtbS9tZW1vcnlfaG90cGx1Zy5jKSwgZXh0cmFjdGluZyBub2RlIG1lbW9yeWxlc3MgY2hlY2tzIGludG8gbm9kZV9pc19tZW1vcnlsZXNzKCkgdXNlZCBkdXJpbmcgTlVNQSBub2RlIG9mZmxpbmluZyBpbiB0cnlfb2ZmbGluZV9ub2RlKCkuIFRoaXMgaXMgcmVhY2hhYmxlIHZpYSBtZW1vcnkgaG90LXVucGx1ZyBvcGVyYXRpb25zIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMDo0OC4wNTQ5NDU2NjVaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQxOTAxNTMxMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGE1M2UxOWEwYjZkMjRiMjAxNDlkMDRiMzVhMDFmNWE1OTUwMWVkZmFcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBTZXAgMyAxOTozMDo0NyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xcbmluZGV4IDIyNmFiOWNiMDc4YWQuLmQwZTk0MDU3NjgyYWYgMTAwNjQ0XFxuLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuY1xcbisrKyBiL21tL21lbW9yeV9ob3RwbHVnLmNcXG5AQCAtMTQ5MSw2ICsxNDkxLDM2IEBAIHN0YXRpYyBpbnQgY3JlYXRlX2FsdG1hcHNfYW5kX21lbW9yeV9ibG9ja3MoaW50IG5pZCwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsXFxuIFxcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXFxuK3tcXG4rXFx0aW50IG5pZCA9ICooaW50ICopYXJnO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XFxuK1xcdCAqIHJlbGlhYmxlLiBIb3dldmVyLCBzdWNoIGJsb2NrcyBhcmUgYWx3YXlzIG9ubGluZSAoZS5nLiwgY2Fubm90IGdldFxcbitcXHQgKiBvZmZsaW5lZCkgYW5kLCB0aGVyZWZvcmUsIGFyZSBzdGlsbCBzcGFubmVkIGJ5IHRoZSBub2RlLlxcbitcXHQgKi9cXG4rXFx0cmV0dXJuIG1lbS1cXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xcbit9XFxuK1xcbisvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xcbitzdGF0aWMgYm9vbCBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClcXG4re1xcbitcXHQvKlxcbitcXHQgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdFxcbitcXHQgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksXFxuK1xcdCAqIGUuZy4gb25jZSBhIG1lbW9yeSBibG9jayBoYXMgYmVlbiBvbmxpbmVkLlxcbitcXHQgKi9cXG4rXFx0aWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdC8qXFxuK1xcdCAqIE9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtYXkgbm90IGJlIHNwYW5uZWQgYnkgdGhlIG5vZGUgeWV0LCBidXQgdGhleVxcbitcXHQgKiBsaW5rIHRvIGl0IGluIHN5c2ZzIGFuZCBjYW4gYmUgb25saW5lZCBsYXRlciwgc28gdGhlIG5vZGUgaXMgbm90XFxuK1xcdCAqIG1lbW9yeWxlc3Mgd2hpbGUgYW55IHJlbWFpbi5cXG4rXFx0ICovXFxuK1xcdHJldHVybiAhZm9yX2VhY2hfbWVtb3J5X2Jsb2NrKFxcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcXG4rfVxcbitcXG4gLypcXG4gICogTk9URTogVGhlIGNhbGxlciBtdXN0IGNhbGwgbG9ja19kZXZpY2VfaG90cGx1ZygpIHRvIHNlcmlhbGl6ZSBob3RwbHVnXFxuICAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuXFxuQEAgLTIyMTQsMTggKzIyNDQsNiBAQCBzdGF0aWMgaW50IGNoZWNrX2NwdV9vbl9ub2RlKGludCBuaWQpXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxcbi17XFxuLVxcdGludCBuaWQgPSAqKGludCAqKWFyZztcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIElmIGEgbWVtb3J5IGJsb2NrIGJlbG9uZ3MgdG8gbXVsdGlwbGUgbm9kZXMsIHRoZSBzdG9yZWQgbmlkIGlzIG5vdFxcbi1cXHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcXG4tXFx0ICogb2ZmbGluZWQpIGFuZCwgdGhlcmVmb3JlLCBhcmUgc3RpbGwgc3Bhbm5lZCBieSB0aGUgbm9kZS5cXG4tXFx0ICovXFxuLVxcdHJldHVybiBtZW0tXFx1MDAzZW5pZCA9PSBuaWQgPyAtRUVYSVNUIDogMDtcXG4tfVxcbi1cXG4gLyoqXFxuICAqIHRyeV9vZmZsaW5lX25vZGVcXG4gICogQG5pZDogdGhlIG5vZGUgSURcXG5AQCAtMjIzNywyMyArMjI1NSw3IEBAIHN0YXRpYyBpbnQgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2Ioc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtLCB2b2lkICphcmcpXFxuICAqL1xcbiB2b2lkIHRyeV9vZmZsaW5lX25vZGUoaW50IG5pZClcXG4ge1xcbi1cXHRpbnQgcmM7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBJZiB0aGUgbm9kZSBzdGlsbCBzcGFucyBwYWdlcyAoZXNwZWNpYWxseSBaT05FX0RFVklDRSksIGRvbid0XFxuLVxcdCAqIG9mZmxpbmUgaXQuIEEgbm9kZSBzcGFucyBtZW1vcnkgYWZ0ZXIgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSgpLFxcbi1cXHQgKiBlLmcuLCBhZnRlciB0aGUgbWVtb3J5IGJsb2NrIHdhcyBvbmxpbmVkLlxcbi1cXHQgKi9cXG4tXFx0aWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKVxcbi1cXHRcXHRyZXR1cm47XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBFc3BlY2lhbGx5IG9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtaWdodCBub3QgYmUgc3Bhbm5lZCBieSB0aGVcXG4tXFx0ICogbm9kZS4gVGhleSB3aWxsIGdldCBzcGFubmVkIGJ5IHRoZSBub2RlIG9uY2UgdGhleSBnZXQgb25saW5lZC5cXG4tXFx0ICogSG93ZXZlciwgdGhleSBsaW5rIHRvIHRoZSBub2RlIGluIHN5c2ZzIGFuZCBjYW4gZ2V0IG9ubGluZWQgbGF0ZXIuXFxuLVxcdCAqL1xcbi1cXHRyYyA9IGZvcl9lYWNoX21lbW9yeV9ibG9jayhcXHUwMDI2bmlkLCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYik7XFxuLVxcdGlmIChyYylcXG4rXFx0aWYgKCFub2RlX2lzX21lbW9yeWxlc3MobmlkKSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4gXFx0aWYgKGNoZWNrX2NwdV9vbl9ub2RlKG5pZCkpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMwOjQ4LjQ3NDc0NjEzN1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTQ4MTc4NTIzNzUzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTU9SWV9IT1RQTFVHXCIsXG4gICAgXCJNRU1PUllfSE9UUkVNT1ZFXCIsXG4gICAgXCJOVU1BXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ5X29mZmxpbmVfbm9kZVwiLFxuICAgIFwibm9kZV9pc19tZW1vcnlsZXNzXCIsXG4gICAgXCJ0cnlfcmVtb3ZlX21lbW9yeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IGhvdHBsdWcgY29kZSAobW0vbWVtb3J5X2hvdHBsdWcuYyksIGV4dHJhY3Rpbmcgbm9kZSBtZW1vcnlsZXNzIGNoZWNrcyBpbnRvIG5vZGVfaXNfbWVtb3J5bGVzcygpIHVzZWQgZHVyaW5nIE5VTUEgbm9kZSBvZmZsaW5pbmcgaW4gdHJ5X29mZmxpbmVfbm9kZSgpLiBUaGlzIGlzIHJlYWNoYWJsZSB2aWEgbWVtb3J5IGhvdC11bnBsdWcgb3BlcmF0aW9ucyBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhNTNlMTlhMGI2ZDI0YjIwMTQ5ZDA0YjM1YTAxZjVhNTk1MDFlZGZhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAxOTozMDo0NyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jXG5pbmRleCAyMjZhYjljYjA3OGFkLi5kMGU5NDA1NzY4MmFmIDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuY1xuKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuY1xuQEAgLTE0OTEsNiArMTQ5MSwzNiBAQCBzdGF0aWMgaW50IGNyZWF0ZV9hbHRtYXBzX2FuZF9tZW1vcnlfYmxvY2tzKGludCBuaWQsIHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwLFxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4rc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbit7XG4rXHRpbnQgbmlkID0gKihpbnQgKilhcmc7XG4rXG4rXHQvKlxuK1x0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XG4rXHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbitcdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXG4rXHQgKi9cbitcdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuK31cbitcbisvKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xuK3N0YXRpYyBib29sIG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKVxuK3tcbitcdC8qXG4rXHQgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdFxuK1x0ICogbWVtb3J5bGVzcy4gIEEgbm9kZSBzcGFucyBtZW1vcnkgYWZ0ZXIgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSgpLFxuK1x0ICogZS5nLiBvbmNlIGEgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIG9ubGluZWQuXG4rXHQgKi9cbitcdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0LypcbitcdCAqIE9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtYXkgbm90IGJlIHNwYW5uZWQgYnkgdGhlIG5vZGUgeWV0LCBidXQgdGhleVxuK1x0ICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdFxuK1x0ICogbWVtb3J5bGVzcyB3aGlsZSBhbnkgcmVtYWluLlxuK1x0ICovXG4rXHRyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbit9XG4rXG4gLypcbiAgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcbiAgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyAodHJpZ2dlcmVkIGUuZy4gYnkgc3lzZnMpLlxuQEAgLTIyMTQsMTggKzIyNDQsNiBAQCBzdGF0aWMgaW50IGNoZWNrX2NwdV9vbl9ub2RlKGludCBuaWQpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbi17XG4tXHRpbnQgbmlkID0gKihpbnQgKilhcmc7XG4tXG4tXHQvKlxuLVx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XG4tXHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcbi1cdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXG4tXHQgKi9cbi1cdHJldHVybiBtZW0tXHUwMDNlbmlkID09IG5pZCA/IC1FRVhJU1QgOiAwO1xuLX1cbi1cbiAvKipcbiAgKiB0cnlfb2ZmbGluZV9ub2RlXG4gICogQG5pZDogdGhlIG5vZGUgSURcbkBAIC0yMjM3LDIzICsyMjU1LDcgQEAgc3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcbiAgKi9cbiB2b2lkIHRyeV9vZmZsaW5lX25vZGUoaW50IG5pZClcbiB7XG4tXHRpbnQgcmM7XG4tXG4tXHQvKlxuLVx0ICogSWYgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpLCBkb24ndFxuLVx0ICogb2ZmbGluZSBpdC4gQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksXG4tXHQgKiBlLmcuLCBhZnRlciB0aGUgbWVtb3J5IGJsb2NrIHdhcyBvbmxpbmVkLlxuLVx0ICovXG4tXHRpZiAobm9kZV9zcGFubmVkX3BhZ2VzKG5pZCkpXG4tXHRcdHJldHVybjtcbi1cbi1cdC8qXG4tXHQgKiBFc3BlY2lhbGx5IG9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtaWdodCBub3QgYmUgc3Bhbm5lZCBieSB0aGVcbi1cdCAqIG5vZGUuIFRoZXkgd2lsbCBnZXQgc3Bhbm5lZCBieSB0aGUgbm9kZSBvbmNlIHRoZXkgZ2V0IG9ubGluZWQuXG4tXHQgKiBIb3dldmVyLCB0aGV5IGxpbmsgdG8gdGhlIG5vZGUgaW4gc3lzZnMgYW5kIGNhbiBnZXQgb25saW5lZCBsYXRlci5cbi1cdCAqL1xuLVx0cmMgPSBmb3JfZWFjaF9tZW1vcnlfYmxvY2soXHUwMDI2bmlkLCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYik7XG4tXHRpZiAocmMpXG4rXHRpZiAoIW5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpKVxuIFx0XHRyZXR1cm47XG4gXG4gXHRpZiAoY2hlY2tfY3B1X29uX25vZGUobmlkKSlcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMwOjQ4LjQ3NDc0Nzc4N1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE0ODQ5ODE2ODYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IEhvdHBsdWcgUGF0Y2gqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGluLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyBhbHdheXMgdG8gZGlzc2VjdCB0aGUgcGF0Y2ggaXRzZWxmLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29kZSBjaGFuZ2VzIGRpcmVjdGx5LiBJJ2xsIHRoZW4gbW92ZSBvbiB0byBwaW5wb2ludGluZyB3aGVyZSB0aGUga2V5IGZ1bmN0aW9ucywgYG5vZGVfaXNfbWVtb3J5bGVzc2Agb3IgYHRyeV9vZmZsaW5lX25vZGVgLCBhcmUgYWN0dWFsbHkgYmVpbmcgKnVzZWQqLiBBIHF1aWNrIGByZWFkLWZpbGVgIG9yIGBncmVwcGVyYCBzY2FuIG9mIHRoZSBjb2RlYmFzZSBpcyBteSBnby10byBhcHByb2FjaCBoZXJlLiBTcGVjaWZpY2FsbHksIEknbGwgYmUgdGFyZ2V0aW5nIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4gSSB3YW50IHRvIHNlZSBpZiBgbm9kZV9pc19tZW1vcnlsZXNzYCBpcyBiZWluZyBsZXZlcmFnZWQgYW55d2hlcmUgZWxzZSBpbiB0aGF0IGZpbGUgYmV5b25kIHRoZSBpbW1lZGlhdGUgc2NvcGUgb2YgdGhlIHBhdGNoLCBhbmQgdG8gdW5kZXJzdGFuZCB0aGUgY2FsbCBzdHJ1Y3R1cmUgd2l0aCBgdHJ5X29mZmxpbmVfbm9kZWAuIEEgZ29vZCBgZ3JlcGAgb3IgZGlyZWN0IGBtbS9tZW1vcnlfaG90cGx1Zy5jYCByZWFkaW5nIGlzIHdoYXQgSSBuZWVkIGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM2NDcsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMxOjAzLjMyNDU2NzE3WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY0NzAyNTU3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5vZGVfaXNfbWVtb3J5bGVzc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeV9ob3RwbHVnLmM9MTQ5ND1zdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNTA2LS8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxNTA3OnN0YXRpYyBib29sIG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTUwOC17XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIyNTY9dm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjU3LXtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyNTg6XFx0aWYgKCFub2RlX2lzX21lbW9yeWxlc3MobmlkKSlcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNTktXFx0XFx0cmV0dXJuO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMTowMy4zODkyNzYyMzdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDkyMDA1NjU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy5cblxuKipJbnZlc3RpZ2F0aW5nIGEgQ29kZSBTZWdtZW50IGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCoqXG5cbkFscmlnaHQsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbiBhcm91bmQgbGluZXMgMTQ5MC0xNTUwIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHpvb20gb3V0IGEgYml0IGFuZCBnZXQgc29tZSBjb250ZXh0LiBJIHdhbnQgdG8gc2VlIGlmIHRoaXMgcGFydGljdWxhciBwaWVjZSBvZiBjb2RlIGlzIGp1c3QgYSBzdGFuZGFsb25lIGZ1bmN0aW9uLCBvciBpZiBpdCdzIHBhcnQgb2YgYSBsYXJnZXIsIHBvdGVudGlhbGx5IHJlbGF0ZWQgc2VyaWVzIG9mIGNhbGxzIHdpdGhpbiB0aGUgaG90cGx1ZyBzdWJzeXN0ZW0uIElzIHRoaXMgbGluZSBwYXJ0IG9mIGEgYnJvYWRlciByZWZhY3RvcmluZyBlZmZvcnQgb3Igc29tZSBraW5kIG9mIHNlcXVlbnRpYWwgcHJvY2Vzc2luZz8gVW5kZXJzdGFuZGluZyB0aGUgc3Vycm91bmRpbmcgY29kZSB3aWxsIGxpa2VseSBiZSBrZXkgdG8gZmlndXJpbmcgb3V0IHRoZSBvdmVyYWxsIGludGVudCBhbmQgcG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIHNwZWNpZmljIHJhbmdlLiBJJ20gZ29pbmcgdG8gc3RhcnQgYnkgcXVpY2tseSBzY2FubmluZyB0aGUgY2FsbCBncmFwaCBhbmQgYW55IG5lYXJieSBjb21tZW50cyB0byBzZWUgaG93IHRoaXMgZml0cyBpbnRvIHRoZSBiaWdnZXIgcGljdHVyZSBvZiBtZW1vcnkgaG90cGx1Z2dpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQxNzAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMTowNS44ODEyODM3NjJaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzY2MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNDgwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNDgwOlxcdFxcdFxcdGlmIChyZXQpIHtcXG4xNDgxOlxcdFxcdFxcdFxcdGFyY2hfcmVtb3ZlX21lbW9yeShjdXJfc3RhcnQsIG1lbWJsb2NrX3NpemUsIHBhcmFtcy5hbHRtYXAsIE5VTEwpO1xcbjE0ODI6XFx0XFx0XFx0XFx0YWx0bWFwX2ZyZWUocGFyYW1zLmFsdG1hcCk7XFxuMTQ4MzpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4xNDg0OlxcdFxcdFxcdH1cXG4xNDg1OlxcdFxcdH1cXG4xNDg2OlxcdFxcbjE0ODc6XFx0XFx0cmV0dXJuIDA7XFxuMTQ4ODpcXHRvdXQ6XFxuMTQ4OTpcXHRcXHRpZiAocmV0IFxcdTAwMjZcXHUwMDI2IGN1cl9zdGFydCAhPSBzdGFydClcXG4xNDkwOlxcdFxcdFxcdHJlbW92ZV9tZW1vcnlfYmxvY2tzX2FuZF9hbHRtYXBzKHN0YXJ0LCBjdXJfc3RhcnQgLSBzdGFydCk7XFxuMTQ5MTpcXHRcXHRyZXR1cm4gcmV0O1xcbjE0OTI6XFx0fVxcbjE0OTM6XFx0XFxuMTQ5NDpcXHRzdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxcbjE0OTU6XFx0e1xcbjE0OTY6XFx0XFx0aW50IG5pZCA9ICooaW50ICopYXJnO1xcbjE0OTc6XFx0XFxuMTQ5ODpcXHRcXHQvKlxcbjE0OTk6XFx0XFx0ICogSWYgYSBtZW1vcnkgYmxvY2sgYmVsb25ncyB0byBtdWx0aXBsZSBub2RlcywgdGhlIHN0b3JlZCBuaWQgaXMgbm90XFxuMTUwMDpcXHRcXHQgKiByZWxpYWJsZS4gSG93ZXZlciwgc3VjaCBibG9ja3MgYXJlIGFsd2F5cyBvbmxpbmUgKGUuZy4sIGNhbm5vdCBnZXRcXG4xNTAxOlxcdFxcdCAqIG9mZmxpbmVkKSBhbmQsIHRoZXJlZm9yZSwgYXJlIHN0aWxsIHNwYW5uZWQgYnkgdGhlIG5vZGUuXFxuMTUwMjpcXHRcXHQgKi9cXG4xNTAzOlxcdFxcdHJldHVybiBtZW0tXFx1MDAzZW5pZCA9PSBuaWQgPyAtRUVYSVNUIDogMDtcXG4xNTA0OlxcdH1cXG4xNTA1OlxcdFxcbjE1MDY6XFx0LyogQ2FsbGVyIG11c3QgaG9sZCB0aGUgbWVtb3J5IGhvdHBsdWcgbG9jayBmb3IgdGhpcyBjaGVjay4gKi9cXG4xNTA3OlxcdHN0YXRpYyBib29sIG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKVxcbjE1MDg6XFx0e1xcbjE1MDk6XFx0XFx0LypcXG4xNTEwOlxcdFxcdCAqIEEgbm9kZSBzdGlsbCBzcGFubmluZyBwYWdlcyAoZXNwZWNpYWxseSBaT05FX0RFVklDRSkgaXMgbm90XFxuMTUxMTpcXHRcXHQgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksXFxuMTUxMjpcXHRcXHQgKiBlLmcuIG9uY2UgYSBtZW1vcnkgYmxvY2sgaGFzIGJlZW4gb25saW5lZC5cXG4xNTEzOlxcdFxcdCAqL1xcbjE1MTQ6XFx0XFx0aWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKVxcbjE1MTU6XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbjE1MTY6XFx0XFx0LypcXG4xNTE3OlxcdFxcdCAqIE9mZmxpbmUgbWVtb3J5IGJsb2NrcyBtYXkgbm90IGJlIHNwYW5uZWQgYnkgdGhlIG5vZGUgeWV0LCBidXQgdGhleVxcbjE1MTg6XFx0XFx0ICogbGluayB0byBpdCBpbiBzeXNmcyBhbmQgY2FuIGJlIG9ubGluZWQgbGF0ZXIsIHNvIHRoZSBub2RlIGlzIG5vdFxcbjE1MTk6XFx0XFx0ICogbWVtb3J5bGVzcyB3aGlsZSBhbnkgcmVtYWluLlxcbjE1MjA6XFx0XFx0ICovXFxuMTUyMTpcXHRcXHRyZXR1cm4gIWZvcl9lYWNoX21lbW9yeV9ibG9jayhcXHUwMDI2bmlkLCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYik7XFxuMTUyMjpcXHR9XFxuMTUyMzpcXHRcXG4xNTI0OlxcdC8qXFxuMTUyNTpcXHQgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcXG4xNTI2OlxcdCAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuXFxuMTUyNzpcXHQgKlxcbjE1Mjg6XFx0ICogd2UgYXJlIE9LIGNhbGxpbmcgX19tZW1pbml0IHN0dWZmIGhlcmUgLSB3ZSBoYXZlIENPTkZJR19NRU1PUllfSE9UUExVR1xcbjE1Mjk6XFx0ICovXFxuMTUzMDpcXHRzdGF0aWMgaW50IF9fYWRkX21lbW9yeV9yZXNvdXJjZShpbnQgbmlkLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgbWhwX3QgbWhwX2ZsYWdzLFxcbjE1MzE6XFx0XFx0XFx0XFx0XFx0IGVudW0gbW1vcCBvbmxpbmVfdHlwZSlcXG4xNTMyOlxcdHtcXG4xNTMzOlxcdFxcdHN0cnVjdCBtaHBfcGFyYW1zIHBhcmFtcyA9IHsgLnBncHJvdCA9IHBncHJvdF9taHAoUEFHRV9LRVJORUwpIH07XFxuMTUzNDpcXHRcXHRlbnVtIG1lbWJsb2NrX2ZsYWdzIG1lbWJsb2NrX2ZsYWdzID0gTUVNQkxPQ0tfTk9ORTtcXG4xNTM1OlxcdFxcdHN0cnVjdCBtZW1vcnlfZ3JvdXAgKmdyb3VwID0gTlVMTDtcXG4xNTM2OlxcdFxcdHU2NCBzdGFydCwgc2l6ZTtcXG4xNTM3OlxcdFxcdGJvb2wgbmV3X25vZGUgPSBmYWxzZTtcXG4xNTM4OlxcdFxcdGludCByZXQ7XFxuMTUzOTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzE6MDUuODgxNDIyNDMxWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjQ2NDU2OTI1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgYW5kIGl0cyBEZXBlbmRlbmNpZXMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGBfX2FkZF9tZW1vcnlfcmVzb3VyY2VgIGZ1bmN0aW9uIGJldHRlci4gQ2xlYXJseSwgaXQncyBjZW50cmFsIHRvIGhvdyBtZW1vcnkgcmVzb3VyY2VzIGFyZSBhZGRlZCB0byB0aGUgc3lzdGVtLCBidXQgSSBuZWVkIHRoZSBicm9hZGVyIGNvbnRleHQuIE15IG5leHQgbW92ZSBpcyB0byBnbyBkZWVwZXIgaW50byBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgaXRzZWxmLiBJIHdhbnQgdG8gc2VlICpleGFjdGx5KiBob3cgYF9fYWRkX21lbW9yeV9yZXNvdXJjZWAgaXMgdXNlZC4gVGhpcyBtZWFucyB0cmFjaW5nIGFsbCB0aGUgY2FsbGVycy4gSXQncyBhIGNyaXRpY2FsIGZ1bmN0aW9uLCBubyBkb3VidCwgYnV0IHVuZGVyc3RhbmRpbmcgdGhlIHN1cnJvdW5kaW5nIGxvZ2ljIGlzIHBhcmFtb3VudCB0byBzZWVpbmcgdGhlIGJpZ2dlciBwaWN0dXJlLiBBcmUgdGhlcmUgYW55IGluZGlyZWN0IGNhbGxzPyBXaGF0IGtpbmQgb2YgZGF0YSBzdHJ1Y3R1cmVzIGRvZXMgaXQgbWFuaXB1bGF0ZT8gSSBuZWVkIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IHN1YnRsZSByYWNlIGNvbmRpdGlvbnMgb3IgbWVtb3J5IGFsbG9jYXRpb24gaXNzdWVzIGx1cmtpbmcgaW4gdGhlIGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzNzAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMxOjEyLjM0NTk5MzY1OFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyNjk2OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1NDAsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE1NDA6XFx0XFx0c3RhcnQgPSByZXMtXFx1MDAzZXN0YXJ0O1xcbjE1NDE6XFx0XFx0c2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTtcXG4xNTQyOlxcdFxcbjE1NDM6XFx0XFx0cmV0ID0gY2hlY2tfaG90cGx1Z19tZW1vcnlfcmFuZ2Uoc3RhcnQsIHNpemUpO1xcbjE1NDQ6XFx0XFx0aWYgKHJldClcXG4xNTQ1OlxcdFxcdFxcdHJldHVybiByZXQ7XFxuMTU0NjpcXHRcXG4xNTQ3OlxcdFxcdGlmIChtaHBfZmxhZ3MgXFx1MDAyNiBNSFBfTklEX0lTX01HSUQpIHtcXG4xNTQ4OlxcdFxcdFxcdGdyb3VwID0gbWVtb3J5X2dyb3VwX2ZpbmRfYnlfaWQobmlkKTtcXG4xNTQ5OlxcdFxcdFxcdGlmICghZ3JvdXApXFxuMTU1MDpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4xNTUxOlxcdFxcdFxcdG5pZCA9IGdyb3VwLVxcdTAwM2VuaWQ7XFxuMTU1MjpcXHRcXHR9XFxuMTU1MzpcXHRcXG4xNTU0OlxcdFxcdGlmICghbm9kZV9wb3NzaWJsZShuaWQpKSB7XFxuMTU1NTpcXHRcXHRcXHRXQVJOKDEsIFxcXCJub2RlICVkIHdhcyBhYnNlbnQgZnJvbSB0aGUgbm9kZV9wb3NzaWJsZV9tYXBcXFxcblxcXCIsIG5pZCk7XFxuMTU1NjpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4xNTU3OlxcdFxcdH1cXG4xNTU4OlxcdFxcbjE1NTk6XFx0XFx0bWVtX2hvdHBsdWdfYmVnaW4oKTtcXG4xNTYwOlxcdFxcbjE1NjE6XFx0XFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0FSQ0hfS0VFUF9NRU1CTE9DSykpIHtcXG4xNTYyOlxcdFxcdFxcdGlmIChyZXMtXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU9SRVNPVVJDRV9TWVNSQU1fRFJJVkVSX01BTkFHRUQpXFxuMTU2MzpcXHRcXHRcXHRcXHRtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX0RSSVZFUl9NQU5BR0VEO1xcbjE1NjQ6XFx0XFx0XFx0cmV0ID0gbWVtYmxvY2tfYWRkX25vZGUoc3RhcnQsIHNpemUsIG5pZCwgbWVtYmxvY2tfZmxhZ3MpO1xcbjE1NjU6XFx0XFx0XFx0aWYgKHJldClcXG4xNTY2OlxcdFxcdFxcdFxcdGdvdG8gZXJyb3JfbWVtX2hvdHBsdWdfZW5kO1xcbjE1Njc6XFx0XFx0fVxcbjE1Njg6XFx0XFxuMTU2OTpcXHRcXHRyZXQgPSBfX3RyeV9vbmxpbmVfbm9kZShuaWQsIGZhbHNlKTtcXG4xNTcwOlxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjE1NzE6XFx0XFx0XFx0Z290byBlcnJvcl9tZW1ibG9ja19yZW1vdmU7XFxuMTU3MjpcXHRcXHRpZiAocmV0KSB7XFxuMTU3MzpcXHRcXHRcXHRub2RlX3NldF9vbmxpbmUobmlkKTtcXG4xNTc0OlxcdFxcdFxcdHJldCA9IHJlZ2lzdGVyX25vZGUobmlkKTtcXG4xNTc1OlxcdFxcdFxcdGlmIChXQVJOX09OKHJldCkpIHtcXG4xNTc2OlxcdFxcdFxcdFxcdG5vZGVfc2V0X29mZmxpbmUobmlkKTtcXG4xNTc3OlxcdFxcdFxcdFxcdGdvdG8gZXJyb3JfbWVtYmxvY2tfcmVtb3ZlO1xcbjE1Nzg6XFx0XFx0XFx0fVxcbjE1Nzk6XFx0XFx0XFx0bmV3X25vZGUgPSB0cnVlO1xcbjE1ODA6XFx0XFx0fVxcbjE1ODE6XFx0XFxuMTU4MjpcXHRcXHQvKlxcbjE1ODM6XFx0XFx0ICogU2VsZiBob3N0ZWQgbWVtbWFwIGFycmF5XFxuMTU4NDpcXHRcXHQgKi9cXG4xNTg1OlxcdFxcdGlmICgobWhwX2ZsYWdzIFxcdTAwMjYgTUhQX01FTU1BUF9PTl9NRU1PUlkpIFxcdTAwMjZcXHUwMDI2XFxuMTU4NjpcXHRcXHQgICAgbWhwX3N1cHBvcnRzX21lbW1hcF9vbl9tZW1vcnkoKSkge1xcbjE1ODc6XFx0XFx0XFx0cmV0ID0gY3JlYXRlX2FsdG1hcHNfYW5kX21lbW9yeV9ibG9ja3MobmlkLCBncm91cCwgc3RhcnQsIHNpemUpO1xcbjE1ODg6XFx0XFx0XFx0aWYgKHJldClcXG4xNTg5OlxcdFxcdFxcdFxcdGdvdG8gZXJyb3I7XFxuMTU5MDpcXHRcXHR9IGVsc2Uge1xcbjE1OTE6XFx0XFx0XFx0cmV0ID0gYXJjaF9hZGRfbWVtb3J5KG5pZCwgc3RhcnQsIHNpemUsIFxcdTAwMjZwYXJhbXMpO1xcbjE1OTI6XFx0XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuMTU5MzpcXHRcXHRcXHRcXHRnb3RvIGVycm9yO1xcbjE1OTQ6XFx0XFxuMTU5NTpcXHRcXHRcXHQvKiBjcmVhdGUgbWVtb3J5IGJsb2NrIGRldmljZXMgYWZ0ZXIgbWVtb3J5IHdhcyBhZGRlZCAqL1xcbjE1OTY6XFx0XFx0XFx0cmV0ID0gY3JlYXRlX21lbW9yeV9ibG9ja19kZXZpY2VzKHN0YXJ0LCBzaXplLCBuaWQsIE5VTEwsIGdyb3VwKTtcXG4xNTk3OlxcdFxcdFxcdGlmIChyZXQpIHtcXG4xNTk4OlxcdFxcdFxcdFxcdGFyY2hfcmVtb3ZlX21lbW9yeShzdGFydCwgc2l6ZSwgcGFyYW1zLmFsdG1hcCwgTlVMTCk7XFxuMTU5OTpcXHRcXHRcXHRcXHRnb3RvIGVycm9yO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMToxMi4zNDYxMjE5MzdaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNzUwMDY5NDg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBJJ20gcmVhZHkgdG8gZGl2ZSBpbnRvIHRoYXQgc2VjdGlvbi4gSGVyZSdzIG15IHRha2UsIGFzc3VtaW5nIEknbSB0aGUgb25lIHByb2Nlc3NpbmcgdGhlc2UgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIExpbmVzIDE2MDAtMTYzMCoqXG5cbkFscmlnaHQsIGxldCdzIHplcm8gaW4gb24gbGluZXMgMTYwMCB0byAxNjMwLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gcXVpY2tseSBlc3RhYmxpc2ggdGhlIGNvbnRleHQuIFdoYXQncyB0aGUgb3ZlcmFyY2hpbmcgdGhlbWUgb3IgYXJndW1lbnQgYmVpbmcgZGV2ZWxvcGVkIGluIHRoaXMgcGFydCBvZiB0aGUgZG9jdW1lbnQ/IEkgbmVlZCB0byBrbm93IHdoZXJlIHRoaXMgZmFsbHMgd2l0aGluIHRoZSBsYXJnZXIgc3RydWN0dXJlLiBJcyB0aGlzIGEgY3JpdGljYWwganVuY3R1cmUgaW4gdGhlIGFyZ3VtZW50PyBBcmUgd2UgZGVhbGluZyB3aXRoIGV2aWRlbmNlLCBhIGNvdW50ZXItYXJndW1lbnQsIG9yIGEgY29uY2x1c2lvbj9cblxuTmV4dCwgSSdsbCBuZWVkIHRvIHBpbnBvaW50IHRoZSBrZXkgcGxheWVycyBhbmQgdmFyaWFibGVzLiBBcmUgdGhlcmUgYW55IHNwZWNpZmljIHRlcm1zIG9yIGNvbmNlcHRzIGJlaW5nIGludHJvZHVjZWQsIGRlZmluZWQsIG9yIG1hbmlwdWxhdGVkIHdpdGhpbiB0aGlzIGJsb2NrIG9mIHRleHQ/IEknbSBsb29raW5nIGZvciB0aGUgY29yZSBpZGVhcyB0aGF0IHRoaXMgc2VjdGlvbiBoaW5nZXMgdXBvbi5cblxuSSdsbCBzdGFydCByZWFkaW5nIHRoZSBzZW50ZW5jZXMgd2l0aCBhbiBleWUgZm9yIGFueSBwb3RlbnRpYWwgYXNzdW1wdGlvbnMgb3IgbG9naWNhbCBsZWFwcyB0aGF0IG1heSBiZSBvY2N1cnJpbmcgd2l0aGluIHRoZSBsaW5lcy4gQXJlIHRoZXJlIGFueSBoaWRkZW4gcHJlbWlzZXMgdGhhdCBzaG91bGQgYmUgbWFkZSBtb3JlIGV4cGxpY2l0PyBJJ2xsIGFsc28gYmUgd2F0Y2hpbmcgZm9yIGFueSBpbnN0YW5jZXMgb2YgY29uZmlybWF0aW9uIGJpYXMgb3IgZmFsbGFjaW91cyByZWFzb25pbmcuXG5cbk15IGFuYWx5dGljYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgc3RydWN0dXJlIG9mIGFueSBhcmd1bWVudHMsIHRoZSB2YWxpZGl0eSBvZiBhbnkgY2xhaW1zLCBhbmQgaG93IHRoZXkgcmVsYXRlIGJhY2sgdG8gdGhlIG92ZXJhbGwgb2JqZWN0aXZlLiBJZiB0aGUgYXV0aG9yIGlzIG1ha2luZyBhIHBlcnN1YXNpdmUgYXJndW1lbnQsIEknbGwgZXZhbHVhdGUgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlaXIgcmhldG9yaWNhbCBzdHJhdGVneS4gSWYgdGhleSdyZSBwcmVzZW50aW5nIGRhdGEsIEknbGwgYmUgbG9va2luZyBhdCB0aGVpciBtZXRob2RvbG9neSBhbmQgcG90ZW50aWFsIGZsYXdzIGluIGl0LlxuXG5JIHdpbGwgbmVlZCB0byBjYXJlZnVsbHkgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgbGluZXMsIG1ha2luZyBzdXJlIHRoZXJlIGlzIGZsb3cgYW5kIGNvbnRpbnVpdHkuIElzIHRoZSBhdXRob3IgbWFraW5nIGFueSBtZWFuaW5nZnVsIGNvbm5lY3Rpb25zIGJldHdlZW4gc2VudGVuY2VzIG9yIHRob3VnaHRzLCBvciBpcyBpdCBhIGRpc2pvaW50ZWQgY2hhaW4gb2YgaWRlYXM/XG5cblxuIiwiSW5wdXRUb2tlbnMiOjY0OTgsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMxOjE1LjA5NjE5MzQ5MloiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjU1NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNjAwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNjAwOlxcdFxcdFxcdH1cXG4xNjAxOlxcdFxcdH1cXG4xNjAyOlxcdFxcbjE2MDM6XFx0XFx0cmVnaXN0ZXJfbWVtb3J5X2Jsb2Nrc191bmRlcl9ub2RlX2hvdHBsdWcobmlkLCBQRk5fRE9XTihzdGFydCksXFxuMTYwNDpcXHRcXHRcXHRcXHRcXHRcXHQgIFBGTl9VUChzdGFydCArIHNpemUgLSAxKSk7XFxuMTYwNTpcXHRcXG4xNjA2OlxcdFxcdC8qIGNyZWF0ZSBuZXcgbWVtbWFwIGVudHJ5ICovXFxuMTYwNzpcXHRcXHRpZiAoIXN0cmNtcChyZXMtXFx1MDAzZW5hbWUsIFxcXCJTeXN0ZW0gUkFNXFxcIikpXFxuMTYwODpcXHRcXHRcXHRmaXJtd2FyZV9tYXBfYWRkX2hvdHBsdWcoc3RhcnQsIHN0YXJ0ICsgc2l6ZSwgXFxcIlN5c3RlbSBSQU1cXFwiKTtcXG4xNjA5OlxcdFxcbjE2MTA6XFx0XFx0LyogZGV2aWNlX29ubGluZSgpIHdpbGwgdGFrZSB0aGUgbG9jayB3aGVuIGNhbGxpbmcgb25saW5lX3BhZ2VzKCkgKi9cXG4xNjExOlxcdFxcdG1lbV9ob3RwbHVnX2RvbmUoKTtcXG4xNjEyOlxcdFxcbjE2MTM6XFx0XFx0LypcXG4xNjE0OlxcdFxcdCAqIEluIGNhc2Ugd2UncmUgYWxsb3dlZCB0byBtZXJnZSB0aGUgcmVzb3VyY2UsIGZsYWcgaXQgYW5kIHRyaWdnZXJcXG4xNjE1OlxcdFxcdCAqIG1lcmdpbmcgbm93IHRoYXQgYWRkaW5nIHN1Y2NlZWRlZC5cXG4xNjE2OlxcdFxcdCAqL1xcbjE2MTc6XFx0XFx0aWYgKG1ocF9mbGFncyBcXHUwMDI2IE1IUF9NRVJHRV9SRVNPVVJDRSlcXG4xNjE4OlxcdFxcdFxcdG1lcmdlX3N5c3RlbV9yYW1fcmVzb3VyY2UocmVzKTtcXG4xNjE5OlxcdFxcbjE2MjA6XFx0XFx0Lyogb25saW5lIHBhZ2VzIGlmIHJlcXVlc3RlZCAqL1xcbjE2MjE6XFx0XFx0aWYgKG9ubGluZV90eXBlICE9IE1NT1BfT0ZGTElORSlcXG4xNjIyOlxcdFxcdFxcdHdhbGtfbWVtb3J5X2Jsb2NrcyhzdGFydCwgc2l6ZSwgXFx1MDAyNm9ubGluZV90eXBlLFxcbjE2MjM6XFx0XFx0XFx0XFx0XFx0ICAgb25saW5lX21lbW9yeV9ibG9jayk7XFxuMTYyNDpcXHRcXG4xNjI1OlxcdFxcdHJldHVybiByZXQ7XFxuMTYyNjpcXHRlcnJvcjpcXG4xNjI3OlxcdFxcdGlmIChuZXdfbm9kZSkge1xcbjE2Mjg6XFx0XFx0XFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xcbjE2Mjk6XFx0XFx0XFx0dW5yZWdpc3Rlcl9ub2RlKG5pZCk7XFxuMTYzMDpcXHRcXHR9XFxuMTYzMTpcXHRlcnJvcl9tZW1ibG9ja19yZW1vdmU6XFxuMTYzMjpcXHRcXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJDSF9LRUVQX01FTUJMT0NLKSlcXG4xNjMzOlxcdFxcdFxcdG1lbWJsb2NrX3JlbW92ZShzdGFydCwgc2l6ZSk7XFxuMTYzNDpcXHRlcnJvcl9tZW1faG90cGx1Z19lbmQ6XFxuMTYzNTpcXHRcXHRtZW1faG90cGx1Z19kb25lKCk7XFxuMTYzNjpcXHRcXHRyZXR1cm4gcmV0O1xcbjE2Mzc6XFx0fVxcbjE2Mzg6XFx0XFxuMTYzOTpcXHRpbnQgYWRkX21lbW9yeV9yZXNvdXJjZShpbnQgbmlkLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgbWhwX3QgbWhwX2ZsYWdzKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMToxNS4wOTYzMjA4NDJaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjY1OTA1NTgzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgYHRyeV9vZmZsaW5lX25vZGVgIENhbGwgU2l0ZXMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoZSBgdHJ5X29mZmxpbmVfbm9kZWAgZnVuY3Rpb24gd2l0aGluIHRoZSBrZXJuZWwuIE15IGluaXRpYWwgZm9jdXMgaXMgdG8gcGlucG9pbnQgKndoZXJlKiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZC4gRXNzZW50aWFsbHksIEkgbmVlZCB0byB0cmFjZSBpdHMgdXNhZ2UgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dHMgaW4gd2hpY2ggYSBub2RlIGlzIGJlaW5nIGJyb3VnaHQgb2ZmbGluZS5cblxuVGhpcyBpcyBjcml0aWNhbCBiZWNhdXNlIGFuIG9mZmxpbmUgbm9kZSByZXByZXNlbnRzIGEgc2lnbmlmaWNhbnQgc3RhdGUgY2hhbmdlLCB3aXRoIHBvdGVudGlhbCBpbXBhY3RzIG9uIE5VTUEgYmFsYW5jaW5nLCBtZW1vcnkgYWxsb2NhdGlvbiwgQ1BVIGFmZmluaXR5LCBhbmQgdGhlIG92ZXJhbGwgc3lzdGVtJ3MgcmVzb3VyY2UgbWFuYWdlbWVudC4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbCBzaXRlcyB3aWxsIHJldmVhbCB0aGUgdHJpZ2dlcnMgZm9yIHRoaXMgb3BlcmF0aW9uIOKAkyBhcmUgd2UgdGFsa2luZyBhYm91dCBob3RwbHVnIGV2ZW50cywgbWVtb3J5IHByZXNzdXJlIHNjZW5hcmlvcywgZXJyb3IgY29uZGl0aW9ucywgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/XG5cbkknbGwgYmUgbG9va2luZyBmb3IgdGhlIGNhbGwgZ3JhcGgsIGNvbnNpZGVyaW5nIHRoZSByZWxldmFudCBtb2R1bGVzIGFuZCBzdWJzeXN0ZW1zLiBJ4oCZbGwgc3RhcnQgYnkgdXNpbmcgc3RhdGljIGFuYWx5c2lzIHRvb2xzLCBsaWtlIGBjc2NvcGVgIG9yIGBncmVwIC1SYCB3aXRoIGFwcHJvcHJpYXRlIGZsYWdzLCB0byBxdWlja2x5IGlkZW50aWZ5IHRoZSBkaXJlY3QgY2FsbGVycy4gVGhlbiwgSSBtYXkgd2FudCB0byBsb29rIGF0IGNvbnRyb2wgZmxvdyBhbmFseXNpcyB0byBmaWd1cmUgb3V0IGNvbmRpdGlvbmFsIGNhbGxzIG9yIGNhbGxzIHRoYXQgZGVwZW5kIG9uIG90aGVyIG1vZHVsZXMuIEknbGwgbmVlZCB0byBjb25zaWRlciBmdW5jdGlvbiBwb2ludGVycyBhbmQgaW5kaXJlY3QgY2FsbHMuXG5cbkJleW9uZCB0aGUgZGlyZWN0IGNhbGxlcnMsIEkgYWxzbyBuZWVkIHRvIGJlIGF3YXJlIG9mIHRoZSAqcmVhc29uaW5nKiBiZWhpbmQgdGhlc2UgY2FsbHMuIFdoYXQncyB0aGUgd2lkZXIgY29udGV4dD8gQXJlIHdlIGRlYWxpbmcgd2l0aCBoYXJkd2FyZSBmYWlsdXJlcywgYWRtaW5pc3RyYXRvciBpbnRlcnZlbnRpb24sIG9yIGF1dG9tYXRlZCBwb3dlciBtYW5hZ2VtZW50IHN5c3RlbXM/IFRoaXMgaXMgaW1wb3J0YW50IGZvciBkZXRlcm1pbmluZyB0aGUgcHJpb3JpdHksIHRpbWluZywgYW5kIHBvdGVudGlhbCBjb25zZXF1ZW5jZXMgb2YgdGhlIG9wZXJhdGlvbi4gSSdsbCBiZSBsb29raW5nIGZvciBhc3NvY2lhdGVkIGxvZ2dpbmcgbWVzc2FnZXMsIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzLCBhbmQgYW55IHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGVtcGxveWVkIGFyb3VuZCB0aGUgYHRyeV9vZmZsaW5lX25vZGVgIGNhbGxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NDgxLCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMToxNy43NTUzNzg5NDlaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MTYyMjI2OTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidHJ5X29mZmxpbmVfbm9kZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYz00NzY9c3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG9zdF9lamVjdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSlcXG4tLVxcbmRyaXZlcnMvYWNwaS9hY3BpX3Byb2Nlc3Nvci5jLTUxMS1cXG5kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYzo1MTI6XFx0dHJ5X29mZmxpbmVfbm9kZShjcHVfdG9fbm9kZShwci1cXHUwMDNlaWQpKTtcXG5kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYy01MTMtXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg9MjYwPXN0YXRpYyBpbmxpbmUgdm9pZCBwZ2RhdF9yZXNpemVfaW5pdChzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0KSB7fVxcbi0tXFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI2NC1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg6MjY1OmV4dGVybiB2b2lkIHRyeV9vZmZsaW5lX25vZGUoaW50IG5pZCk7XFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI2Ni1leHRlcm4gaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg9MjcxPWludCBvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5X3Jhbmdlcyhjb25zdCBzdHJ1Y3QgcmFuZ2UgKnJhbmdlcyxcXG4tLVxcbmluY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaC0yNzQtI2Vsc2VcXG5pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmg6Mjc1OnN0YXRpYyBpbmxpbmUgdm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpIHt9XFxuaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oLTI3Ni1cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MjIzMT1zdGF0aWMgaW50IGNoZWNrX2NwdV9vbl9ub2RlKGludCBuaWQpXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNDctLyoqXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMjQ4OiAqIHRyeV9vZmZsaW5lX25vZGVcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIyNDktICogQG5pZDogdGhlIG5vZGUgSURcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI1NS0gKi9cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyNTY6dm9pZCB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjU3LXtcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI3MC19XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMjcxOkVYUE9SVF9TWU1CT0wodHJ5X29mZmxpbmVfbm9kZSk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjcyLVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0yMjkzPXN0YXRpYyBpbnQgdHJ5X3JlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSlcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjMzOS1cXHRpZiAobmlkICE9IE5VTUFfTk9fTk9ERSlcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIzNDA6XFx0XFx0dHJ5X29mZmxpbmVfbm9kZShuaWQpO1xcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM0MS1cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM1Mi0gKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyBiZWZvcmUgdGhpcyBjYWxsLCBhcyByZXF1aXJlZCBieVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjM1MzogKiB0cnlfb2ZmbGluZV9ub2RlKCkuXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMzU0LSAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMToxOS40NzE2MDY4NDdaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjIyNjgzODU1NTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtb3J5X2hvdHBsdWcuY2AqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29tcGxldGUgcGljdHVyZSBvZiBob3cgYHRyeV9vZmZsaW5lX25vZGVgIHdvcmtzLiBJJ3ZlIGdvdCB0aGUgaW1tZWRpYXRlIGZ1bmN0aW9uIGluIGZyb250IG9mIG1lLCBidXQgdG8gdHJ1bHkgZ3Jhc3AgdGhlIGltcGxpY2F0aW9ucyBhbmQgcG90ZW50aWFsIGludGVyYWN0aW9ucywgSSBuZWVkIHRvIHRyYWNlIGl0cyB1c2FnZS4gSSdtIGdvaW5nIHRvIGZvbGxvdyB0aGUgY2FsbCBjaGFpbiBhbmQgdW5kZXJzdGFuZCB3aGVyZSBgdHJ5X29mZmxpbmVfbm9kZWAgaXMgY2FsbGVkIGZyb20uIFRoYXQgbWVhbnMgZGlnZ2luZyBpbnRvIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCBhbmQgZmluZGluZyBhbGwgdGhlIGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbi4gSSdsbCBuZWVkIHRvIGFuYWx5emUgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaW4gYHRyeV9vZmZsaW5lX25vZGVgIGl0c2VsZiB0byB1bmRlcnN0YW5kIGFueSBsb2NhbCBjb250ZXh0IHRoYXQgbWlnaHQgYmUgaW1wYWN0aW5nLiBFc3NlbnRpYWxseSwgSSdtIHRyeWluZyB0byBnZXQgYSBiaXJkcyBleWUgdmlldyBvZiB0aGUgZW50aXJlIGZsb3cgc28gSSBkb24ndCBtaXNzIGFueSBjcml0aWNhbCBkZXRhaWxzIHJlbGF0ZWQgdG8gbWVtb3J5IGhvdHBsdWdnaW5nLiBPbmNlIEkgZ2V0IHRoZSBmdWxsIGNvbnRleHQsIEkgY2FuIHJlYWxseSBzdGFydCB0byBkaWFnbm9zZSB3aGF0ZXZlciBpc3N1ZSBJJ20gbG9va2luZyBhdC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODU2OSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjIxLjczOTk5NTg2MVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzM3MjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMjQ1LFxuICBcIkxpbmVDb3VudFwiOiA3MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMjQ1OlxcdH1cXG4yMjQ2OlxcdFxcbjIyNDc6XFx0LyoqXFxuMjI0ODpcXHQgKiB0cnlfb2ZmbGluZV9ub2RlXFxuMjI0OTpcXHQgKiBAbmlkOiB0aGUgbm9kZSBJRFxcbjIyNTA6XFx0ICpcXG4yMjUxOlxcdCAqIE9mZmxpbmUgYSBub2RlIGlmIGFsbCBtZW1vcnkgc2VjdGlvbnMgYW5kIGNwdXMgb2YgdGhlIG5vZGUgYXJlIHJlbW92ZWQuXFxuMjI1MjpcXHQgKlxcbjIyNTM6XFx0ICogTk9URTogVGhlIGNhbGxlciBtdXN0IGNhbGwgbG9ja19kZXZpY2VfaG90cGx1ZygpIHRvIHNlcmlhbGl6ZSBob3RwbHVnXFxuMjI1NDpcXHQgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyBiZWZvcmUgdGhpcyBjYWxsLlxcbjIyNTU6XFx0ICovXFxuMjI1NjpcXHR2b2lkIHRyeV9vZmZsaW5lX25vZGUoaW50IG5pZClcXG4yMjU3OlxcdHtcXG4yMjU4OlxcdFxcdGlmICghbm9kZV9pc19tZW1vcnlsZXNzKG5pZCkpXFxuMjI1OTpcXHRcXHRcXHRyZXR1cm47XFxuMjI2MDpcXHRcXG4yMjYxOlxcdFxcdGlmIChjaGVja19jcHVfb25fbm9kZShuaWQpKVxcbjIyNjI6XFx0XFx0XFx0cmV0dXJuO1xcbjIyNjM6XFx0XFxuMjI2NDpcXHRcXHQvKlxcbjIyNjU6XFx0XFx0ICogYWxsIG1lbW9yeS9jcHUgb2YgdGhpcyBub2RlIGFyZSByZW1vdmVkLCB3ZSBjYW4gb2ZmbGluZSB0aGlzXFxuMjI2NjpcXHRcXHQgKiBub2RlIG5vdy5cXG4yMjY3OlxcdFxcdCAqL1xcbjIyNjg6XFx0XFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xcbjIyNjk6XFx0XFx0dW5yZWdpc3Rlcl9ub2RlKG5pZCk7XFxuMjI3MDpcXHR9XFxuMjI3MTpcXHRFWFBPUlRfU1lNQk9MKHRyeV9vZmZsaW5lX25vZGUpO1xcbjIyNzI6XFx0XFxuMjI3MzpcXHRzdGF0aWMgaW50IG1lbW9yeV9ibG9ja3NfaGF2ZV9hbHRtYXBzKHU2NCBzdGFydCwgdTY0IHNpemUpXFxuMjI3NDpcXHR7XFxuMjI3NTpcXHRcXHR1NjQgbnVtX21lbWJsb2NrcyA9IHNpemUgLyBtZW1vcnlfYmxvY2tfc2l6ZV9ieXRlcygpO1xcbjIyNzY6XFx0XFx0dTY0IG51bV9hbHRtYXBzID0gMDtcXG4yMjc3OlxcdFxcbjIyNzg6XFx0XFx0aWYgKCFtaHBfbWVtbWFwX29uX21lbW9yeSgpKVxcbjIyNzk6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjI4MDpcXHRcXG4yMjgxOlxcdFxcdHdhbGtfbWVtb3J5X2Jsb2NrcyhzdGFydCwgc2l6ZSwgXFx1MDAyNm51bV9hbHRtYXBzLFxcbjIyODI6XFx0XFx0XFx0XFx0ICAgY291bnRfbWVtb3J5X3JhbmdlX2FsdG1hcHNfY2IpO1xcbjIyODM6XFx0XFxuMjI4NDpcXHRcXHRpZiAobnVtX2FsdG1hcHMgPT0gMClcXG4yMjg1OlxcdFxcdFxcdHJldHVybiAwO1xcbjIyODY6XFx0XFxuMjI4NzpcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKG51bV9tZW1ibG9ja3MgIT0gbnVtX2FsdG1hcHMpKVxcbjIyODg6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMjI4OTpcXHRcXG4yMjkwOlxcdFxcdHJldHVybiAxO1xcbjIyOTE6XFx0fVxcbjIyOTI6XFx0XFxuMjI5MzpcXHRzdGF0aWMgaW50IHRyeV9yZW1vdmVfbWVtb3J5KHU2NCBzdGFydCwgdTY0IHNpemUpXFxuMjI5NDpcXHR7XFxuMjI5NTpcXHRcXHRpbnQgcmMsIG5pZCA9IE5VTUFfTk9fTk9ERTtcXG4yMjk2OlxcdFxcbjIyOTc6XFx0XFx0QlVHX09OKGNoZWNrX2hvdHBsdWdfbWVtb3J5X3JhbmdlKHN0YXJ0LCBzaXplKSk7XFxuMjI5ODpcXHRcXG4yMjk5OlxcdFxcdC8qXFxuMjMwMDpcXHRcXHQgKiBBbGwgbWVtb3J5IGJsb2NrcyBtdXN0IGJlIG9mZmxpbmVkIGJlZm9yZSByZW1vdmluZyBtZW1vcnkuICBDaGVja1xcbjIzMDE6XFx0XFx0ICogd2hldGhlciBhbGwgbWVtb3J5IGJsb2NrcyBpbiBxdWVzdGlvbiBhcmUgb2ZmbGluZSBhbmQgcmV0dXJuIGVycm9yXFxuMjMwMjpcXHRcXHQgKiBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS5cXG4yMzAzOlxcdFxcdCAqXFxuMjMwNDpcXHRcXHQgKiBXaGlsZSBhdCBpdCwgZGV0ZXJtaW5lIHRoZSBuaWQuIE5vdGUgdGhhdCBpZiB3ZSdkIGhhdmUgbWl4ZWQgbm9kZXMsXFxuMjMwNTpcXHRcXHQgKiB3ZSdkIG9ubHkgdHJ5IHRvIG9mZmxpbmUgdGhlIGxhc3QgZGV0ZXJtaW5lZCBvbmUgLS0gd2hpY2ggaXMgZ29vZFxcbjIzMDY6XFx0XFx0ICogZW5vdWdoIGZvciB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dC5cXG4yMzA3OlxcdFxcdCAqL1xcbjIzMDg6XFx0XFx0cmMgPSB3YWxrX21lbW9yeV9ibG9ja3Moc3RhcnQsIHNpemUsIFxcdTAwMjZuaWQsIGNoZWNrX21lbWJsb2NrX29mZmxpbmVkX2NiKTtcXG4yMzA5OlxcdFxcdGlmIChyYylcXG4yMzEwOlxcdFxcdFxcdHJldHVybiByYztcXG4yMzExOlxcdFxcbjIzMTI6XFx0XFx0LyogcmVtb3ZlIG1lbW1hcCBlbnRyeSAqL1xcbjIzMTM6XFx0XFx0ZmlybXdhcmVfbWFwX3JlbW92ZShzdGFydCwgc3RhcnQgKyBzaXplLCBcXFwiU3lzdGVtIFJBTVxcXCIpO1xcbjIzMTQ6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjIxLjc0MDEzMTA3WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE1NTE4MDI0Njc1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgTWVtb3J5IEhvdHBsdWcgUGF0Y2gqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIG1vdGl2YXRpb24gYmVoaW5kIG1vdmluZyBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgIGFuZCBpbnRyb2R1Y2luZyBgbm9kZV9pc19tZW1vcnlsZXNzYC4gIEl0IGxvb2tzIGxpa2UgdGhpcyBjb21taXQgbWlnaHQgYmUgcmVsYXRlZCB0byBhIHNwZWNpZmljIGNvbW1pdCBJRDogYGE1M2UxOWEwYjZkMjRiMjAxNDlkMDRiMzVhMDFmNWE1OTUwMWVkZmFgLiBJJ2Qgbm9ybWFsbHkgY2hlY2sgdGhlIGNvbW1pdCBoaXN0b3J5IChgZ2l0IGxvZ2Agb3IgYGdpdCBzaG93YCkgZm9yIGNvbnRleHQsIGJ1dCBzaW5jZSBJIGhhdmUgdGhlIGRpZmYsIEkgY2FuIHdvcmsgd2l0aCB0aGF0IGRpcmVjdGx5LlxuXG5Gcm9tIHRoZSBwcm92aWRlZCBkaWZmLCBJIHNlZSB0aGF0IGBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYmAsIHdoaWNoIHdhcyBwcmV2aW91c2x5IGRlZmluZWQgKmFmdGVyKiBpdHMgdXNlLCBoYXMgYmVlbiBtb3ZlZCBlYXJsaWVyIGluIHRoZSBmaWxlLiAgQ3J1Y2lhbGx5LCBpdCBpcyB0aGVuICptb3ZlZCogYW5kIGBub2RlX2lzX21lbW9yeWxlc3NgIGlzIGNyZWF0ZWQgYW5kIHVzZWQgd2l0aGluIGB0cnlfb2ZmbGluZV9ub2RlYC4gVGhpcyBmdW5jdGlvbiBub3cgdXNlcyB0aGUgbmV3IGhlbHBlciwgYG5vZGVfaXNfbWVtb3J5bGVzc2AsIHRvIGRldGVybWluZSBpZiBhIG5vZGUgY2FuIGJlIHNhZmVseSB0YWtlbiBvZmZsaW5lLlxuXG5UaGUgYG5vZGVfaXNfbWVtb3J5bGVzc2AgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgdGhlIG5vZGUgc3RpbGwgc3BhbnMgcGFnZXMgKHdoaWNoIHdvdWxkIGluZGljYXRlIG1lbW9yeSBpcyBzdGlsbCBwcmVzZW50KSwgYW5kIGlmIHNvLCByZXR1cm5zIGBmYWxzZWAuIFRoZW4sIGl0IGNoZWNrcyBpZiBhbnkgbWVtb3J5IGJsb2NrcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlLiBUaGUgb3JpZ2luYWwgY29kZSdzIGNoZWNrIHdpdGhpbiBgdHJ5X29mZmxpbmVfbm9kZWAgbG9va3MgYWxtb3N0IGlkZW50aWNhbCwgc28gdGhlIHJlZmFjdG9yaW5nIGdvYWwgbXVzdCBiZSBzb21ldGhpbmcgc3VidGxlIGFuZCB0aGUgaW50ZW50IGlzIGxpa2VseSByZS11c2UuXG5cblRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UgbGllcyBpbiBob3cgdGhlIGNvZGUgZGV0ZXJtaW5lcyBpZiBhIG5vZGUgaXMgdHJ1bHkgXCJtZW1vcnlsZXNzXCIgZm9yIG9mZmxpbmUgcHVycG9zZXMuIFRoZSBwcmV2aW91cyBjb2RlIGNoZWNrZWQgZm9yIG1lbW9yeSBibG9ja3MsIG5vdyB0aGF0IGlzIGVuY2Fwc3VsYXRlZCBpbiBgbm9kZV9pc19tZW1vcnlsZXNzYC4gIFRoZSBjb21tZW50IG1ha2VzIGEgdmFsaWQgcG9pbnQgYWJvdXQgb2ZmbGluZSBtZW1vcnkgYmxvY2tzIG5vdCBuZWNlc3NhcmlseSBiZWluZyBcInNwYW5uZWRcIiB5ZXQgYnV0IHBvdGVudGlhbGx5IGxpbmtlZCB0aHJvdWdoIHN5c2ZzLiBUaGlzIGlzIGFuIGltcG9ydGFudCBjb25zaWRlcmF0aW9uIGZvciBtZW1vcnkgaG90cGx1ZywgYW5kIGl0cyBoYW5kbGluZyBjb3VsZCBiZSBzdWJ0bGUuXG5cbkdpdmVuIHRoaXMgaXMgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLCBhIGNvcmUgc3Vic3lzdGVtIGZvciBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIGl0IGludm9sdmVzIGEgbG9naWMgcmVzdHJ1Y3R1cmluZyBhbmQgcmVmYWN0b3JpbmcsIEkgbmVlZCB0byBldmFsdWF0ZSB0aGlzIGNoYW5nZSB3aXRoIGFuIGV4cGVydCdzIGV5ZS4gIEknbSBnb2luZyB0byBjYXJlZnVsbHkgY29uc2lkZXIgdGhlIGxvZ2ljIG9mIGBub2RlX2lzX21lbW9yeWxlc3NgLCBhcyB0aGUgYmVoYXZpb3Igb2Ygb2ZmbGluZSBhbmQgb25saW5lIG1lbW9yeSBjb3VsZCBiZSBhZmZlY3RlZC4gU2luY2UgbWVtb3J5IGhvdHBsdWcgaXMgaW52b2x2ZWQsIEkgd2lsbCBuZWVkIHRvIGJlIHZlcnkgY29uZmlkZW50IHRoYXQgdGhpcyBjaGFuZ2UgZG9lc24ndCBpbnRyb2R1Y2UgYW55IHN1YnRsZSByZWdyZXNzaW9ucywgcGFydGljdWxhcmx5IGFyb3VuZCB0aGUgc3RhdGUgdHJhbnNpdGlvbnMgb2YgbWVtb3J5IGJsb2NrcyBhbmQgbm9kZSBhc3NvY2lhdGlvbnMgZHVyaW5nIGhvdHBsdWcgb3BlcmF0aW9ucy4gIEknbGwgd2FudCB0byBjYXJlZnVsbHkgY2hlY2sgdGhlIGludGVyYWN0aW9ucyB3aXRoIG90aGVyIG1lbW9yeSBtYW5hZ2VtZW50IGNvbXBvbmVudHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk4MTMsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNDQxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzI6MzcuMjU4MTU4NTk2WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTU5MjM5OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1vcnlfaG90cGx1Z1xcXFwub1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9NjM9cGFnZS1hbGxvYy0kKENPTkZJR19TSFVGRkxFX1BBR0VfQUxMT0NBVE9SKSArPSBzaHVmZmxlLm9cXG4tLVxcbm1tL01ha2VmaWxlLTY1LSMgR2l2ZSAnbWVtb3J5X2hvdHBsdWcnIGl0cyBvd24gbW9kdWxlLXBhcmFtZXRlciBuYW1lc3BhY2VcXG5tbS9NYWtlZmlsZTo2NjptZW1vcnktaG90cGx1Zy0kKENPTkZJR19NRU1PUllfSE9UUExVRykgKz0gbWVtb3J5X2hvdHBsdWcub1xcbm1tL01ha2VmaWxlLTY3LVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xNTQ9c3RhdGljIGludCBnZXRfb25saW5lX3BvbGljeShjaGFyICpidWZmZXIsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xNTktLypcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE2MDogKiBtZW1vcnlfaG90cGx1Zy5vbmxpbmVfcG9saWN5OiBjb25maWd1cmUgb25saW5lIGJlaGF2aW9yIHdoZW4gb25saW5pbmcgd2l0aG91dFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTYxLSAqIHNwZWNpZnlpbmcgYSB6b25lIChNTU9QX09OTElORSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzI6MzcuMzA3NzU2Mzc0WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI3NzcwNTQxNjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKkNoZWNraW5nIHRoZSBIb3RwbHVnIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gcXVpY2tseSB2ZXJpZnkgc29tZXRoaW5nIHJlbGF0ZWQgdG8gbWVtb3J5IGhvdHBsdWdnaW5nLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBoZWFkIHN0cmFpZ2h0IHRvIHRoZSBzb3VyY2Ug4oCTIHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gVGhhdCdzIHdoZXJlIGFsbCB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgcmVsYXRlZCBjb25maWd1cmF0aW9ucyBhcmUgZGVmaW5lZCwgYW5kIGBDT05GSUdfTUVNT1JZX0hPVFBMVUdgIGlzIHRoZSBrZXkgSSdtIGludGVyZXN0ZWQgaW4uIEkgd2FudCB0byBzZWUgaG93IGl0J3MgaGFuZGxlZCwgYW55IGRlcGVuZGVuY2llcyBpdCBtaWdodCBoYXZlLCBhbmQgaWYgdGhlcmUgYXJlIGFueSBzdWJ0bGUgbnVhbmNlcyBpbiBpdHMgZGVmaW5pdGlvbiB0aGF0IEkgbmVlZCB0byBiZSBhd2FyZSBvZi4gVGhpcyBpcyB1c3VhbGx5IHRoZSBxdWlja2VzdCB3YXkgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb2YgaG93IGhvdHBsdWcgaXMgZW5hYmxlZCBvciBkaXNhYmxlZCBhbmQgd2hhdCBvdGhlciBmZWF0dXJlcyBhcmUgdGllZCB0byBpdC4gTm8gbmVlZCB0byB3YXN0ZSB0aW1lIGd1ZXNzaW5nOyBnbyBkaXJlY3RseSB0byB0aGUgY29uZmlndXJhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIwMzksIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMjo0MC4wODQ4MjM1NDdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUxMDAyOTk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBNRU1PUllfSE9UUExVR1xcXFxiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTUwNT1jb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUdcXG4tLVxcbm1tL0tjb25maWctNTA4LSMgZXZlbnR1YWxseSwgd2UgY2FuIGhhdmUgdGhpcyBvcHRpb24ganVzdCAnc2VsZWN0IFNQQVJTRU1FTSdcXG5tbS9LY29uZmlnOjUwOTptZW51Y29uZmlnIE1FTU9SWV9IT1RQTFVHXFxubW0vS2NvbmZpZy01MTAtXFx0Ym9vbCBcXFwiTWVtb3J5IGhvdHBsdWdcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjQwLjEzNTgzMzIzNFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozMTIxMTI2OTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaXZpbmcgaW50byB0aGUgTWVtb3J5IEhvdHBsdWcgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGRlcGVuZGVuY2llcyBmb3IgYE1FTU9SWV9IT1RQTFVHYCBhbmQgYE1FTU9SWV9IT1RSRU1PVkVgLiBUaGUgYmVzdCBwbGFjZSB0byBzdGFydCwgYXMgYWx3YXlzLCBpcyB0aGUgS2NvbmZpZy4gSSB3YW50IHRvIHNlZSB3aGF0IG90aGVyIGZlYXR1cmVzIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSB0aWVkIHRvIHRoZXNlIG9wdGlvbnMuIEFyZSB0aGVyZSBhbnkgb3RoZXIgcmVxdWlyZWQga2VybmVsIGZlYXR1cmVzPyBBcmUgdGhlcmUgc3BlY2lmaWMgYXJjaGl0ZWN0dXJhbCByZXF1aXJlbWVudHM/IFdoYXQgbGV2ZWxzIG9mIGdyYW51bGFyaXR5IGFyZSBhdmFpbGFibGU/IFVuZGVyc3RhbmRpbmcgdGhlIGludGVyZGVwZW5kZW5jaWVzIGlzIGNyaXRpY2FsLiBJdCdzIG9mdGVuIHRoZSBoaWRkZW4gaW1wbGljYXRpb25zIGFuZCByZWxhdGVkIGZlYXR1cmVzIHRoYXQgd2lsbCBkaWN0YXRlIGhvdyB3ZWxsIHRoZXNlIGZ1bmN0aW9ucyB3b3JrIGluIGEgc3BlY2lmaWMgc2V0dXAuIFRpbWUgdG8gZ2V0IHRoZSBLY29uZmlnIG9wZW4gYW5kIHN0YXJ0IGRpZ2dpbmcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMzQ1LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzI6NDMuMjU2OTYyNDQyWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMDAyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUwNSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUwNTpcXHRjb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUdcXG4gNTA2OlxcdFxcdGJvb2xcXG4gNTA3OlxcdFxcbiA1MDg6XFx0IyBldmVudHVhbGx5LCB3ZSBjYW4gaGF2ZSB0aGlzIG9wdGlvbiBqdXN0ICdzZWxlY3QgU1BBUlNFTUVNJ1xcbiA1MDk6XFx0bWVudWNvbmZpZyBNRU1PUllfSE9UUExVR1xcbiA1MTA6XFx0XFx0Ym9vbCBcXFwiTWVtb3J5IGhvdHBsdWdcXFwiXFxuIDUxMTpcXHRcXHRzZWxlY3QgTUVNT1JZX0lTT0xBVElPTlxcbiA1MTI6XFx0XFx0ZGVwZW5kcyBvbiBTUEFSU0VNRU1fVk1FTU1BUFxcbiA1MTM6XFx0XFx0ZGVwZW5kcyBvbiBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVR1xcbiA1MTQ6XFx0XFx0ZGVwZW5kcyBvbiA2NEJJVFxcbiA1MTU6XFx0XFx0c2VsZWN0IE5VTUFfS0VFUF9NRU1JTkZPIGlmIE5VTUFcXG4gNTE2OlxcdFxcbiA1MTc6XFx0aWYgTUVNT1JZX0hPVFBMVUdcXG4gNTE4OlxcdFxcbiA1MTk6XFx0Y2hvaWNlXFxuIDUyMDpcXHRcXHRwcm9tcHQgXFxcIk1lbW9yeSBIb3RwbHVnIERlZmF1bHQgT25saW5lIFR5cGVcXFwiXFxuIDUyMTpcXHRcXHRkZWZhdWx0IE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09GRkxJTkVcXG4gNTIyOlxcdFxcdGhlbHBcXG4gNTIzOlxcdFxcdCAgRGVmYXVsdCBtZW1vcnkgdHlwZSBmb3IgaG90cGx1Z2dlZCBtZW1vcnkuXFxuIDUyNDpcXHRcXG4gNTI1OlxcdFxcdCAgVGhpcyBvcHRpb24gc2V0cyB0aGUgZGVmYXVsdCBwb2xpY3kgc2V0dGluZyBmb3IgbWVtb3J5IGhvdHBsdWdcXG4gNTI2OlxcdFxcdCAgb25saW5pbmcgcG9saWN5ICgvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9hdXRvX29ubGluZV9ibG9ja3MpIHdoaWNoXFxuIDUyNzpcXHRcXHQgIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIG5ld2x5IGFkZGVkIG1lbW9yeSByZWdpb25zLiBQb2xpY3kgc2V0dGluZ1xcbiA1Mjg6XFx0XFx0ICBjYW4gYWx3YXlzIGJlIGNoYW5nZWQgYXQgcnVudGltZS5cXG4gNTI5OlxcdFxcbiA1MzA6XFx0XFx0ICBUaGUgZGVmYXVsdCBpcyAnb2ZmbGluZScuXFxuIDUzMTpcXHRcXG4gNTMyOlxcdFxcdCAgU2VsZWN0IG9mZmxpbmUgdG8gZGVmZXIgb25saW5pbmcgdG8gZHJpdmVycyBhbmQgdXNlciBwb2xpY3kuXFxuIDUzMzpcXHRcXHQgIFNlbGVjdCBhdXRvIHRvIGxldCB0aGUga2VybmVsIGNob29zZSB3aGF0IHpvbmVzIHRvIHV0aWxpemUuXFxuIDUzNDpcXHRcXHQgIFNlbGVjdCBvbmxpbmVfa2VybmVsIHRvIGdlbmVyYWxseSBhbGxvdyBrZXJuZWwgdXNhZ2Ugb2YgdGhpcyBtZW1vcnkuXFxuIDUzNTpcXHRcXHQgIFNlbGVjdCBvbmxpbmVfbW92YWJsZSB0byBnZW5lcmFsbHkgZGlzYWxsb3cga2VybmVsIHVzYWdlIG9mIHRoaXMgbWVtb3J5LlxcbiA1MzY6XFx0XFxuIDUzNzpcXHRcXHQgIEV4YW1wbGUga2VybmVsIHVzYWdlIHdvdWxkIGJlIHBhZ2Ugc3RydWN0cyBhbmQgcGFnZSB0YWJsZXMuXFxuIDUzODpcXHRcXG4gNTM5OlxcdFxcdCAgU2VlIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW0vbWVtb3J5LWhvdHBsdWcucnN0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxcbiA1NDA6XFx0XFxuIDU0MTpcXHRjb25maWcgTUhQX0RFRkFVTFRfT05MSU5FX1RZUEVfT0ZGTElORVxcbiA1NDI6XFx0XFx0Ym9vbCBcXFwib2ZmbGluZVxcXCJcXG4gNTQzOlxcdFxcdGhlbHBcXG4gNTQ0OlxcdFxcdCAgSG90cGx1Z2dlZCBtZW1vcnkgd2lsbCBub3QgYmUgb25saW5lZCBieSBkZWZhdWx0LlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMjo0My4yNTcwNjM2NzJaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjA4OTU2Nzk3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkRlbHZpbmcgaW50byB0aGUgYE1FTU9SWV9IT1RQTFVHYCBDb25maWd1cmF0aW9uKipcblxuUmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJ20gdGhpbmtpbmcsIFwiTGV0J3MgZGlnIGRlZXBlciBpbnRvIHRoZSBpbnRyaWNhY2llcyBvZiBgTUVNT1JZX0hPVFBMVUdgLlwiIE15IGltbWVkaWF0ZSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvbXBsZXRlIHBpY3R1cmUgb2YgdGhpcyBvcHRpb24gYXMgaXQncyBkZWZpbmVkIHdpdGhpbiB0aGUgYG1tL0tjb25maWdgIGZpbGUuIEkgbmVlZCB0byBzZWUgdGhlIGNvbnRleHQuIEknbSBhZnRlciB0aGUgZGVwZW5kZW5jaWVzLCB0aGUgZGVmYXVsdHMsIHRoZSBoZWxwIHRleHQsICpldmVyeXRoaW5nKiB0aGF0IHNoYXBlcyBpdHMgYmVoYXZpb3IuIE15IGV4cGVydGlzZSBhbGxvd3MgbWUgdG8gcXVpY2tseSB6ZXJvIGluIG9uIHNwZWNpZmljIGFzcGVjdHMgZm9yIHNjcnV0aW55LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgcHJvYmxlbSBJJ20gdHJ5aW5nIHRvIHNvbHZlLiBVbmRlcnN0YW5kaW5nIHRoZSBjb21wbGV0ZSBjb250ZXh0IG9mIGBNRU1PUllfSE9UUExVR2AgaXMgdGhlIGZpcnN0IHN0ZXAgaW4gZGVidWdnaW5nIG9yIGNvbmZpZ3VyaW5nIGFueXRoaW5nIHJlbGF0ZWQgdG8gaG90LXBsdWdnYWJsZSBtZW1vcnkgaW4gdGhlIGtlcm5lbC4gSSBjYW4ndCB3b3JrIG9uIHRoZSBrZXJuZWwgaW4gaWdub3JhbmNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzE0NiwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzI6NDUuMzQ2NjM2MDc0WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMDA5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU0NSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDU0NTpcXHRcXHQgIENob29zZSB0aGlzIGZvciBzeXN0ZW1zIHdpdGggZHJpdmVycyBhbmQgdXNlciBwb2xpY3kgdGhhdFxcbiA1NDY6XFx0XFx0ICBoYW5kbGUgb25saW5pbmcgb2YgaG90cGx1ZyBtZW1vcnkgcG9saWN5LlxcbiA1NDc6XFx0XFxuIDU0ODpcXHRjb25maWcgTUhQX0RFRkFVTFRfT05MSU5FX1RZUEVfT05MSU5FX0FVVE9cXG4gNTQ5OlxcdFxcdGJvb2wgXFxcImF1dG9cXFwiXFxuIDU1MDpcXHRcXHRoZWxwXFxuIDU1MTpcXHRcXHQgIFNlbGVjdCB0aGlzIGlmIHlvdSB3YW50IHRoZSBrZXJuZWwgdG8gYXV0b21hdGljYWxseSBvbmxpbmVcXG4gNTUyOlxcdFxcdCAgaG90cGx1Z2dlZCBtZW1vcnkgaW50byB0aGUgem9uZSBpdCB0aGlua3MgaXMgcmVhc29uYWJsZS5cXG4gNTUzOlxcdFxcdCAgVGhpcyBtZW1vcnkgbWF5IGJlIHV0aWxpemVkIGZvciBrZXJuZWwgZGF0YS5cXG4gNTU0OlxcdFxcbiA1NTU6XFx0Y29uZmlnIE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09OTElORV9LRVJORUxcXG4gNTU2OlxcdFxcdGJvb2wgXFxcImtlcm5lbFxcXCJcXG4gNTU3OlxcdFxcdGhlbHBcXG4gNTU4OlxcdFxcdCAgU2VsZWN0IHRoaXMgaWYgeW91IHdhbnQgdGhlIGtlcm5lbCB0byBhdXRvbWF0aWNhbGx5IG9ubGluZVxcbiA1NTk6XFx0XFx0ICBob3RwbHVnZ2VkIG1lbW9yeSBpbnRvIGEgem9uZSBjYXBhYmxlIG9mIGJlaW5nIHVzZWQgZm9yIGtlcm5lbFxcbiA1NjA6XFx0XFx0ICBkYXRhLiBUaGlzIHR5cGljYWxseSBtZWFucyBaT05FX05PUk1BTC5cXG4gNTYxOlxcdFxcbiA1NjI6XFx0Y29uZmlnIE1IUF9ERUZBVUxUX09OTElORV9UWVBFX09OTElORV9NT1ZBQkxFXFxuIDU2MzpcXHRcXHRib29sIFxcXCJtb3ZhYmxlXFxcIlxcbiA1NjQ6XFx0XFx0aGVscFxcbiA1NjU6XFx0XFx0ICBTZWxlY3QgdGhpcyBpZiB5b3Ugd2FudCB0aGUga2VybmVsIHRvIGF1dG9tYXRpY2FsbHkgb25saW5lXFxuIDU2NjpcXHRcXHQgIGhvdHBsdWcgbWVtb3J5IGludG8gWk9ORV9NT1ZBQkxFLiBUaGlzIG1lbW9yeSB3aWxsIGdlbmVyYWxseVxcbiA1Njc6XFx0XFx0ICBub3QgYmUgdXRpbGl6ZWQgZm9yIGtlcm5lbCBkYXRhLlxcbiA1Njg6XFx0XFxuIDU2OTpcXHRcXHQgIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBhZG1pbiBrbm93cyBzdWZmaWNpZW50XFxuIDU3MDpcXHRcXHQgIFpPTkVfTk9STUFMIG1lbW9yeSBpcyBhdmFpbGFibGUgdG8gZGVzY3JpYmUgaG90cGx1ZyBtZW1vcnksXFxuIDU3MTpcXHRcXHQgIG90aGVyd2lzZSBob3RwbHVnIG1lbW9yeSBtYXkgZmFpbCB0byBvbmxpbmUuIEZvciBleGFtcGxlLFxcbiA1NzI6XFx0XFx0ICBzdWZmaWNpZW50IGtlcm5lbC1jYXBhYmxlIG1lbW9yeSAoWk9ORV9OT1JNQUwpIG11c3QgYmVcXG4gNTczOlxcdFxcdCAgYXZhaWxhYmxlIHRvIGFsbG9jYXRlIHBhZ2Ugc3RydWN0cyB0byBkZXNjcmliZSBaT05FX01PVkFCTEUuXFxuIDU3NDpcXHRcXG4gNTc1OlxcdGVuZGNob2ljZVxcbiA1NzY6XFx0XFxuIDU3NzpcXHRjb25maWcgTUVNT1JZX0hPVFJFTU9WRVxcbiA1Nzg6XFx0XFx0Ym9vbCBcXFwiQWxsb3cgZm9yIG1lbW9yeSBob3QgcmVtb3ZlXFxcIlxcbiA1Nzk6XFx0XFx0c2VsZWN0IE1JR1JBVElPTlxcbiA1ODA6XFx0XFxuIDU4MTpcXHRjb25maWcgTUhQX01FTU1BUF9PTl9NRU1PUllcXG4gNTgyOlxcdFxcdGRlZl9ib29sIHlcXG4gNTgzOlxcdFxcdGRlcGVuZHMgb24gQVJDSF9NSFBfTUVNTUFQX09OX01FTU9SWV9FTkFCTEVcXG4gNTg0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMjo0NS4zNDY3NTgwMjRaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDE1NDg0MjU0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIE1lbW9yeSBIb3RwbHVnIERlcGVuZGVuY2llcyoqXG5cbk9rYXksIHNvIEknbSBkaXZpbmcgaW50byB0aGlzIGBNRU1PUllfSE9UUExVR2AgY29uZmlndXJhdGlvbi4gVGhlIHF1ZXN0aW9uIGlzOiBkb2VzIGBNRU1PUllfSE9UUkVNT1ZFYCBvciBgTlVNQWAgaGF2ZSBhbnkgYmVhcmluZyBvbiBob3cgdGhpcyB3b3Jrcz8gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZW0uXG5cbk15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIHRoZSBrZXJuZWwgY29kZSwgc3BlY2lmaWNhbGx5IGZvY3VzaW5nIG9uIGZ1bmN0aW9ucyBsaWtlIGB0cnlfb2ZmbGluZV9ub2RlYCwgYG5vZGVfaXNfbWVtb3J5bGVzc2AsIGFuZCBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgLiBJJ2xsIG5lZWQgdG8gc2VlIGlmIGFueSBvZiB0aGVzZSBkZXBlbmQgb24gYE1FTU9SWV9IT1RSRU1PVkVgLCBgTlVNQWAsIG9yIGV2ZW4gYE1FTU9SWV9IT1RQTFVHYCBiZWluZyBkZWZpbmVkLiBUcmFjaW5nIHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBzaG91bGQgcmV2ZWFsIHRoZSBkZXBlbmRlbmNpZXMuXG5cbkZpbmFsbHksIEknbGwgZ28gZGlyZWN0bHkgdG8gdGhlIHNvdXJjZSBhbmQgZXhhbWluZSBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgZm9yIGFueSBgI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFYCBvciBgI2lmZGVmIENPTkZJR19OVU1BYCBkaXJlY3RpdmVzLiBUaGF0J3MgdGhlIG1vc3QgZGlyZWN0IHdheSB0byB1bmRlcnN0YW5kIGhvdyB0aGUgY29kZSBiZWhhdmVzIHVuZGVyIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGludGVycGxheSBiZXR3ZWVuIHRoZXNlIG1lbW9yeS1yZWxhdGVkIGZlYXR1cmVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzk4NiwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjQ5LjUwMTYwMzUzOFoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDczMDMzMzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQ09ORklHX01FTU9SWV9IT1RSRU1PVkV8Q09ORklHX05VTUFcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jPTE4Nj1NT0RVTEVfUEFSTV9ERVNDKGF1dG9fbW92YWJsZV9yYXRpbyxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTkyLSAqL1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTkzOiNpZmRlZiBDT05GSUdfTlVNQVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTk0LXN0YXRpYyBib29sIGF1dG9fbW92YWJsZV9udW1hX2F3YXJlIF9fcmVhZF9tb3N0bHkgPSB0cnVlO1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xOTY9TU9EVUxFX1BBUk1fREVTQyhhdXRvX21vdmFibGVfbnVtYV9hd2FyZSxcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTk4LVxcdFxcdFxcXCJcXFxcXFxcImF1dG8tbW92YWJsZVxcXFxcXFwiIG9ubGluZSBwb2xpY3kuIERlZmF1bHQ6IHRydWVcXFwiKTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjE5OTojZW5kaWYgLyogQ09ORklHX05VTUEgKi9cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIwMC1cXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9OTYwPXN0YXRpYyBzdHJ1Y3Qgem9uZSAqYXV0b19tb3ZhYmxlX3pvbmVfZm9yX3BmbihpbnQgbmlkLFxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDA5LVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTAxMDojaWZkZWYgQ09ORklHX05VTUFcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEwMTEtXFx0aWYgKGF1dG9fbW92YWJsZV9udW1hX2F3YXJlIFxcdTAwMjZcXHUwMDI2XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTEwMTMtXFx0XFx0Z290byBrZXJuZWxfem9uZTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjEwMTQ6I2VuZGlmIC8qIENPTkZJR19OVU1BICovXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0xMDE1LVxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0xODA0PWJvb2wgbWhwX3JhbmdlX2FsbG93ZWQodTY0IHN0YXJ0LCB1NjQgc2l6ZSwgYm9vbCBuZWVkX21hcHBpbmcpXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE4MTYtXFxubW0vbWVtb3J5X2hvdHBsdWcuYzoxODE3OiNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTgxOC0vKlxcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0yNTMwPUVYUE9SVF9TWU1CT0xfR1BMKG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlfcmFuZ2VzKTtcXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjI1MzE6I2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjQ5LjU0ODkxNTA0NloiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo4MTU0MzUyNzk2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBNZW1vcnkgSG90cGx1ZyBhbmQgSG90cmVtb3ZlIENvbmZpZ3VyYXRpb25zKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoaXMgc2VjdGlvbiBvZiB0aGUga2VybmVsIHJlbGF0ZWQgdG8gbWVtb3J5IGhvdHBsdWcgYW5kIGhvdHJlbW92ZS4gVGhlIGNvZGUgSSdtIGxvb2tpbmcgYXQsIHNwZWNpZmljYWxseSBsaW5lcyAxODE3IHRvIDI1MzEsIHNlZW1zIHRvIHJldm9sdmUgYXJvdW5kIGBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRWAuICBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gem9vbSBpbiBvbiBsaW5lcyAyMjMwLTIyNzUgd2hlcmUgYHRyeV9vZmZsaW5lX25vZGVgIGlzIGRlZmluZWQuICBJdCdzIGNsZWFyIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjb25kaXRpb25hbCBvbiBgI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFYCwgd2hpY2ggaXMga2V5LlxuXG5JIHNlZSB0aGF0IGBub2RlX2lzX21lbW9yeWxlc3NgIGlzIHVzZWQgYmVmb3JlIGBfX2FkZF9tZW1vcnlfcmVzb3VyY2VgLCB3aGljaCBpcyB1bmRlciBgQ09ORklHX01FTU9SWV9IT1RQTFVHYCwgc28gdGhvc2UgYXJlIGJvdGggcmVsZXZhbnQuIFRoZSBjb2RlIHN1Z2dlc3RzIHRoYXQgYHRyeV9vZmZsaW5lX25vZGVgIGlzIGRlc2lnbmVkIHRvIGhhbmRsZSBOVU1BIG5vZGVzIGFuZCwgc3BlY2lmaWNhbGx5LCBvZmZsaW5pbmcgYSBOVU1BIG5vZGUgaWYgYWxsIHRoZSBtZW1vcnkgYW5kIENQVXMgYXJlIHJlbW92ZWQsIHNvIGBDT05GSUdfTlVNQWAgbWlnaHQgYWxzbyBiZSBhIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3IgcmVxdWlyZW1lbnQuXG5cbk5vdywgSSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdy4gIEknbSBsb29raW5nIGF0IHdoZXJlIGB0cnlfb2ZmbGluZV9ub2RlYCBpcyBjYWxsZWQgYW5kIHF1aWNrbHkgc2VlIHRoYXQgYHRyeV9yZW1vdmVfbWVtb3J5YCBjYWxscyBgdHJ5X29mZmxpbmVfbm9kZWAsIHNvIHRoYXTigJlzIGEgbGlrZWx5IGFyZWEgb2YgaW50ZXJlc3QuIFRoZW4gSSB3aWxsIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGBvZmZsaW5lX2FuZF9yZW1vdmVfbWVtb3J5YCBpcy5cblxuTGV0J3MgbmFpbCBkb3duIHRoZSBjcml0aWNhbCBmdW5jdGlvbnMgaGVyZS4gVGhlIG1haW4gZnVuY3Rpb25zIHRoYXQgc2VlbSB0byBiZSBhZGRlZCBvciBtb2RpZmllZCBhcmU6XG4xLiAgYG5vZGVfaXNfbWVtb3J5bGVzc2AsIHdoaWNoIGlzIGEgc3RhdGljIGZ1bmN0aW9uIGluIGBtbS9tZW1vcnlfaG90cGx1Zy5jYC5cbjIuICBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgIHdoaWNoIGlzIGEgc3RhdGljIGNhbGxiYWNrIGZ1bmN0aW9uLlxuMy4gIGB0cnlfb2ZmbGluZV9ub2RlYCwgd2hpY2ggaXMgYW4gZXhwb3J0ZWQgZnVuY3Rpb24gaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgLlxuXG5JJ20gY29uc2lkZXJpbmcgd2hldGhlciBgbm9kZV9pc19tZW1vcnlsZXNzYCBjYW4gYmUgaW5saW5lZCBhbmQgaXQncyBzdGF0aWMgYW5kIG9ubHkgY2FsbGVkIGJ5IGB0cnlfb2ZmbGluZV9ub2RlYCwgd2hpY2ggaXMgZ2xvYmFsLiBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIHRoZSBjYWxsIHBhdGhzLlxuXG5OZXh0LCBJIG5lZWQgdG8gdHJhY2UgdGhlIGNhbGxpbmcgcmVsYXRpb25zaGlwcy4gSSBuZWVkIHRvIGJlIGF3YXJlIG9mOlxuXG4qICAgYHRyeV9vZmZsaW5lX25vZGVgXG4qICAgYG5vZGVfaXNfbWVtb3J5bGVzc2AgKGlmIGl0J3Mgbm90IGlubGluZWQsIGFuZCBhbHNvIHRoZSB0YXJnZXRzIG9mIGB0cnlfb2ZmbGluZV9ub2RlYClcbiogICBgdHJ5X3JlbW92ZV9tZW1vcnlgIChhIHN0YXRpYyBoZWxwZXIgaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgKS5cbiogICBgcmVtb3ZlX21lbW9yeWAgb3IgYG9mZmxpbmVfYW5kX3JlbW92ZV9tZW1vcnlgLlxuXG5GaW5hbGx5LCBJIG5lZWQgdG8gY2hlY2sgdGhlIGNhbGxlcnMgb2YgYHRyeV9yZW1vdmVfbWVtb3J5YCB3aXRoaW4gYG1tL21lbW9yeV9ob3RwbHVnLmNgIGFuZCBmaWd1cmUgb3V0IGhvdyB0aGV5IGludGVyYWN0IHdpdGggYHRyeV9vZmZsaW5lX25vZGVgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDg5NiwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMjo1Ny43MDMyNzAzMzJaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyNjYxNjQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInRyeV9yZW1vdmVfbWVtb3J5XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL21lbW9yeV9ob3RwbHVnLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vbWVtb3J5X2hvdHBsdWcuYz0yMjczPXN0YXRpYyBpbnQgbWVtb3J5X2Jsb2Nrc19oYXZlX2FsdG1hcHModTY0IHN0YXJ0LCB1NjQgc2l6ZSlcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI5Mi1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIyOTM6c3RhdGljIGludCB0cnlfcmVtb3ZlX21lbW9yeSh1NjQgc3RhcnQsIHU2NCBzaXplKVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI5NC17XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIzNTU9dm9pZCBfX3JlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSlcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM2MS1cXHQgKi9cXG5tbS9tZW1vcnlfaG90cGx1Zy5jOjIzNjI6XFx0aWYgKHRyeV9yZW1vdmVfbWVtb3J5KHN0YXJ0LCBzaXplKSlcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTIzNjMtXFx0XFx0QlVHKCk7XFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jPTIzNzA9aW50IHJlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSlcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM3NC1cXHRsb2NrX2RldmljZV9ob3RwbHVnKCk7XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMzc1OlxcdHJjID0gdHJ5X3JlbW92ZV9tZW1vcnkoc3RhcnQsIHNpemUpO1xcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjM3Ni1cXHR1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTtcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmM9MjQ2Mz1pbnQgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXMoY29uc3Qgc3RydWN0IHJhbmdlICpyYW5nZXMsXFxuLS1cXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTI1MjAtXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3JhbmdlczsgaSsrKVxcbm1tL21lbW9yeV9ob3RwbHVnLmM6MjUyMTpcXHRcXHRXQVJOX09OX09OQ0UodHJ5X3JlbW92ZV9tZW1vcnkocmFuZ2VzW2ldLnN0YXJ0LFxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjUyMi1cXHRcXHRcXHRcXHRcXHQgICAgICAgcmFuZ2VfbGVuKFxcdTAwMjZyYW5nZXNbaV0pKSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMyOjU3Ljc1NTkzNDE0WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM0NjE2ODk4OTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSByZXZpZXdpbmcgdGhpczpcblxuKipNZW1vcnkgSG90cGx1ZyBFeHBsb3JhdGlvbioqXG5cbk9rYXksIHNvIEknbSBkaXZpbmcgaW50byBtZW1vcnkgaG90cGx1ZyBzY2VuYXJpb3MuIEZpcnN0IHRoaW5ncyBmaXJzdCwgbGV0J3MgbmFpbCBkb3duIHRoZSBwcmltYXJ5IGZ1bmN0aW9ucyByZXNwb25zaWJsZSBmb3IgbWVtb3J5IG1hbmlwdWxhdGlvbi4gSSBuZWVkIHRvIHJlZnJlc2ggbXlzZWxmIG9uIGhvdyB0aGUgdW5kZXJseWluZyBtZWNoYW5pc21zIGFyZSBleGVyY2lzZWQuIEkgd2FudCB0byBjaGVjayBvdXQgYHJlbW92ZV9tZW1vcnlgLCBgb2ZmbGluZV9hbmRfcmVtb3ZlX21lbW9yeV9yYW5nZXNgLCBgdHJ5X29mZmxpbmVfbm9kZWAsIGFuZCBgb2ZmbGluZV9tZW1vcnlfYmxvY2tgLiBJIGtub3cgdGhlc2UgYXJlIGtleSBwbGF5ZXJzIGluIG9yY2hlc3RyYXRpbmcgdGhlIG1lbW9yeSBob3RwbHVnIHByb2Nlc3MsIGJ1dCBJIHdhbnQgdG8gcmVjYWxsIHRoZSBleGFjdCB1c2UgY2FzZXMgZm9yIGVhY2guXG5cbk5vdywgYSBsb3Qgb2YgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlc2UgZnVuY3Rpb25zIHNlZW1zIHRvIGhhcHBlbiB0aHJvdWdoIHN5c2ZzLCByaWdodD8gSSdtIGdvaW5nIHRvIGhlYWQgZGlyZWN0bHkgaW50byBgZHJpdmVycy9iYXNlL21lbW9yeS5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGludGVycGxheSBiZXR3ZWVuIHRoZSBzeXNmcyBpbnRlcmZhY2UgYW5kIHRoZSBjb3JlIG9mZmxpbmluZyByb3V0aW5lcy4gSSdtIGxvb2tpbmcgZm9yIGEgY2xlYXIgcGljdHVyZSBvZiBob3cgdGhvc2Ugc3lzZnMgbWFuaXB1bGF0aW9ucyB0cmlnZ2VyIHRoZXNlIGludGVybmFsIGZ1bmN0aW9ucy4gV2hhdCBhcmUgdGhlIGtleSBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgbWFuaXB1bGF0ZWQsIGFuZCBob3cgaXMgdGhlIHdob2xlIHRoaW5nIGFyY2hpdGVjdGVkPyBMZXQncyBnZXQgY3JhY2tpbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2NDg1LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MDEuMjE3NjI4NjAzWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1Mjg2NzMxOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0cnlfb2ZmbGluZV9ub2RlfG9mZmxpbmVfcGFnZXN8cmVtb3ZlX21lbW9yeVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJkcml2ZXJzL2Jhc2UvbWVtb3J5LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9iYXNlL21lbW9yeS5jPTI4OT1zdGF0aWMgaW50IG1lbW9yeV9ibG9ja19vZmZsaW5lKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSlcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMDAtXFx0ICogVW5hY2NvdW50IGJlZm9yZSBvZmZsaW5pbmcsIHN1Y2ggdGhhdCB1bnBvcHVsYXRlZCB6b25lIGFuZCBrdGhyZWFkc1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozMDE6XFx0ICogY2FuIHByb3Blcmx5IGJlIHRvcm4gZG93biBpbiBvZmZsaW5lX3BhZ2VzKCkuXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTMwMi1cXHQgKi9cXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTAtXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjMxMTpcXHRyZXQgPSBvZmZsaW5lX3BhZ2VzKHN0YXJ0X3BmbiArIG5yX3ZtZW1tYXBfcGFnZXMsXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTMxMi1cXHRcXHRcXHQgICAgbnJfcGFnZXMgLSBucl92bWVtbWFwX3BhZ2VzLCBtZW0tXFx1MDAzZXpvbmUsIG1lbS1cXHUwMDNlZ3JvdXApO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTMtXFx0aWYgKHJldCkge1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzozMTQ6XFx0XFx0Lyogb2ZmbGluZV9wYWdlcygpIGZhaWxlZC4gQWNjb3VudCBiYWNrLiAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy0zMTUtXFx0XFx0aWYgKG5yX3ZtZW1tYXBfcGFnZXMpXFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM9NzkwPXN0YXRpYyBpbnQgYWRkX21lbW9yeV9ibG9jayh1bnNpZ25lZCBsb25nIGJsb2NrX2lkLCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXRlLFxcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTgzNS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmM6ODM2OnN0YXRpYyB2b2lkIHJlbW92ZV9tZW1vcnlfYmxvY2soc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtb3J5KVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04Mzcte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jPTg2MD1pbnQgY3JlYXRlX21lbW9yeV9ibG9ja19kZXZpY2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG4tLVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy04ODUtXFx0XFx0XFx0XFx0Y29udGludWU7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jOjg4NjpcXHRcXHRcXHRyZW1vdmVfbWVtb3J5X2Jsb2NrKG1lbSk7XFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTg4Ny1cXHRcXHR9XFxuLS1cXG5kcml2ZXJzL2Jhc2UvbWVtb3J5LmMtODk4LSAqL1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo4OTk6dm9pZCByZW1vdmVfbWVtb3J5X2Jsb2NrX2RldmljZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKVxcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy05MDAte1xcbi0tXFxuZHJpdmVycy9iYXNlL21lbW9yeS5jLTkxNS1cXHRcXHR1bnJlZ2lzdGVyX21lbW9yeV9ibG9ja191bmRlcl9ub2RlcyhtZW0pO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYzo5MTY6XFx0XFx0cmVtb3ZlX21lbW9yeV9ibG9jayhtZW0pO1xcbmRyaXZlcnMvYmFzZS9tZW1vcnkuYy05MTctXFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMzowMS4yNzA1MDM5MzFaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTUzMDM0Njk5MzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgTWVtb3J5IEhvdHBsdWcgYW5kIE5VTUEgTm9kZSBPZmZsaW5pbmcgTG9naWMqKlxuXG5Pa2F5LCBsZXQncyByZXZpc2l0IGBub2RlX2lzX21lbW9yeWxlc3NgLiBJIHJlY2FsbCBpdCB3YXMgZXh0cmFjdGVkIGF0IHNvbWUgcG9pbnQsIGFuZCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aHkuIEJlZm9yZSwgaW4gYHRyeV9vZmZsaW5lX25vZGVgLCB3ZSBoYWQgYSBkaXJlY3QgY2hlY2sgdXNpbmcgYG5vZGVfc3Bhbm5lZF9wYWdlc2AgYW5kIHRoZW4gYSBjYWxsIHRvIGBmb3JfZWFjaF9tZW1vcnlfYmxvY2tgIHdpdGggYSBjYWxsYmFjay4gTm93LCB0aGF0IGxvZ2ljIGlzIGVuY2Fwc3VsYXRlZCB3aXRoaW4gYG5vZGVfaXNfbWVtb3J5bGVzcyhuaWQpYC4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gZWZmaWNpZW50bHkgY2hlY2tzIGlmIGEgTlVNQSBub2RlIGlzIHRydWx5IGRldm9pZCBvZiBtZW1vcnksIGNvbnNpZGVyaW5nIGNhc2VzIHdoZXJlIHRoZSBub2RlIHN0aWxsIHNwYW5zIHBhZ2VzIChlc3BlY2lhbGx5IGBaT05FX0RFVklDRWApIGFuZCBhY2NvdW50aW5nIGZvciBvZmZsaW5lIG1lbW9yeSBibG9ja3MgdGhhdCBtaWdodCBsYXRlciBiZSBvbmxpbmVkLiBJdCdzIGEga2V5IHBhcnQgb2YgdGhlIG1lbW9yeSBob3QtdW5wbHVnIGFuZCBOVU1BIG5vZGUgb2ZmbGluaW5nIHByb2Nlc3NlcywgYW5kIGl0IHJlc2lkZXMgaW4gdGhlIGNvcmUgYG1tL21lbW9yeV9ob3RwbHVnLmNgIGNvZGUuXG5cbk15IGluaXRpYWwgYXNzZXNzbWVudCBpbmRpY2F0ZXMgdGhpcyBpcyBkZWZpbml0ZWx5IHdvcnRoIGZ1enppbmcuIEkgbWVhbiwgd2UgYXJlIGxvb2tpbmcgYXQgY29yZSBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIHRoaXMgY29kZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBhYmlsaXR5IHRvIGhvdC11bnBsdWcgYW5kIG9mZmxpbmUgbWVtb3J5LlxuXG5NeSBhbmFseXNpcyBsb29rcyBsaWtlIHRoaXM6XG5cbjEuICBgV29ydGhGdXp6aW5nYDogVHJ1ZS4gRXhjZWxsZW50LlxuMi4gIGBFbmFibGVDb25maWdzYDogSSBuZWVkIHRvIHZlcmlmeSB0aGF0IHdlIGhhdmUgYE1FTU9SWV9IT1RQTFVHYCwgYE1FTU9SWV9IT1RSRU1PVkVgLCBhbmQgYE5VTUFgIGVuYWJsZWQsIGFuZCwgb2YgY291cnNlLCB0aGF0IHdlIGRpZCBub3QgbWlzcyBhbnkgaW1wb3J0YW50IGNvbmZpZyBvcHRpb25zLiBUaGVzZSBhbGwgbG9vayBjb3JyZWN0LlxuMy4gIGBGb2N1c1N5bWJvbHNgOiBJIGhhdmUgZmxhZ2dlZCBgdHJ5X29mZmxpbmVfbm9kZWAsIGBub2RlX2lzX21lbW9yeWxlc3NgIGFuZCBgdHJ5X3JlbW92ZV9tZW1vcnlgIGFzIG15IHByaW1hcnkgc3ltYm9scy4gSSB0aGluayB0aGUgd2hvbGUgZnVuY3Rpb24gaXMgaW50ZXJlc3RpbmcsIGJ1dCB0aGVzZSBhcmUgdGhlIGNyaXRpY2FsIHBhcnRzLlxuNC4gIGBSZWFzb25pbmdgOiBXZSBhcmUgZGVhbGluZyB3aXRoIGNydWNpYWwgbWVtb3J5IG1hbmFnZW1lbnQgY29kZSByZWxhdGVkIHRvIGhvdC11bnBsdWcgYW5kIE5VTUEgb2ZmbGluaW5nLiBBbnkgYnVncyBoZXJlIGNvdWxkIGxlYWQgdG8gY3Jhc2hlcywgbWVtb3J5IGNvcnJ1cHRpb24sIG9yIGV2ZW4gZGVuaWFsIG9mIHNlcnZpY2UsIGFuZCBJJ20gc3VyZSBzb21lb25lIHdvdWxkIGJlIGhhcHB5IHRvIGZpbmQgYSBidWcgaGVyZS5cblxuSSBkb3VibGUgY2hlY2tlZCBteSBjb25maWcgbmFtZXM7IEkgbWFkZSBzdXJlIHRoYXQgdGhlcmUncyBubyBgQ09ORklHX2AgcHJlZml4LlxuXG5ZZXAsIGxvb2tzIGdvb2QuIEl0J3MgdGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3NDAxLCJPdXRwdXRUb2tlbnMiOjEzNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU4MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMzoxNi41NzM5NzcyNjRaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3OTI4ODk1NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTUVNT1JZX0hPVFBMVUdcIixcbiAgICBcIk1FTU9SWV9IT1RSRU1PVkVcIixcbiAgICBcIk5VTUFcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnlfb2ZmbGluZV9ub2RlXCIsXG4gICAgXCJub2RlX2lzX21lbW9yeWxlc3NcIixcbiAgICBcInRyeV9yZW1vdmVfbWVtb3J5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBtZW1vcnkgaG90cGx1ZyBjb2RlIChtbS9tZW1vcnlfaG90cGx1Zy5jKSwgZXh0cmFjdGluZyBub2RlIG1lbW9yeWxlc3MgY2hlY2tzIGludG8gbm9kZV9pc19tZW1vcnlsZXNzKCkgdXNlZCBkdXJpbmcgTlVNQSBub2RlIG9mZmxpbmluZyBpbiB0cnlfb2ZmbGluZV9ub2RlKCkuIFRoaXMgaXMgcmVhY2hhYmxlIHZpYSBtZW1vcnkgaG90LXVucGx1ZyBvcGVyYXRpb25zIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1FTU9SWV9IT1RQTFVHXCIsXG4gICAgXCJNRU1PUllfSE9UUkVNT1ZFXCIsXG4gICAgXCJOVU1BXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ5X29mZmxpbmVfbm9kZVwiLFxuICAgIFwibm9kZV9pc19tZW1vcnlsZXNzXCIsXG4gICAgXCJ0cnlfcmVtb3ZlX21lbW9yeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbWVtb3J5IGhvdHBsdWcgY29kZSAobW0vbWVtb3J5X2hvdHBsdWcuYyksIGV4dHJhY3Rpbmcgbm9kZSBtZW1vcnlsZXNzIGNoZWNrcyBpbnRvIG5vZGVfaXNfbWVtb3J5bGVzcygpIHVzZWQgZHVyaW5nIE5VTUEgbm9kZSBvZmZsaW5pbmcgaW4gdHJ5X29mZmxpbmVfbm9kZSgpLiBUaGlzIGlzIHJlYWNoYWJsZSB2aWEgbWVtb3J5IGhvdC11bnBsdWcgb3BlcmF0aW9ucyBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MTYuNjUzMjczNjlaIiwiU2VxIjozMSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwNjM2MDI4MTI2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MTYuNjUzODA0MDVaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyMDYzNTQ5MzQzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaXMgYSBwdXJlIHJlZmFjdG9yaW5nIGluIG1tL21lbW9yeV9ob3RwbHVnLmMgdGhhdCBleHRyYWN0cyB0aGUgY2hlY2sgZGV0ZXJtaW5pbmcgaWYgYSBOVU1BIG5vZGUgaXMgbWVtb3J5bGVzcyAoY2hlY2tpbmcgbm9kZV9zcGFubmVkX3BhZ2VzIGFuZCBpdGVyYXRpbmcgbWVtb3J5IGJsb2NrcykgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gbm9kZV9pc19tZW1vcnlsZXNzKCkuIE5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIHBhdGh3YXlzIGFyZSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nOyBzdGFuZGFyZCBzYW5pdGl6ZXJzIGFuZCB0ZXN0IHN1aXRlcyAoS0FTQU4sIExPQ0tERVApIGFyZSBzdWZmaWNpZW50LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGE1M2UxOWEwYjZkMjRiMjAxNDlkMDRiMzVhMDFmNWE1OTUwMWVkZmFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVGh1IFNlcCAzIDE5OjMwOjQ3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vbWVtb3J5X2hvdHBsdWcuYyBiL21tL21lbW9yeV9ob3RwbHVnLmNcbmluZGV4IDIyNmFiOWNiMDc4YWQuLmQwZTk0MDU3NjgyYWYgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jXG4rKysgYi9tbS9tZW1vcnlfaG90cGx1Zy5jXG5AQCAtMTQ5MSw2ICsxNDkxLDM2IEBAIHN0YXRpYyBpbnQgY3JlYXRlX2FsdG1hcHNfYW5kX21lbW9yeV9ibG9ja3MoaW50IG5pZCwgc3RydWN0IG1lbW9yeV9ncm91cCAqZ3JvdXAsXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbitzdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxuK3tcbitcdGludCBuaWQgPSAqKGludCAqKWFyZztcbitcbitcdC8qXG4rXHQgKiBJZiBhIG1lbW9yeSBibG9jayBiZWxvbmdzIHRvIG11bHRpcGxlIG5vZGVzLCB0aGUgc3RvcmVkIG5pZCBpcyBub3RcbitcdCAqIHJlbGlhYmxlLiBIb3dldmVyLCBzdWNoIGJsb2NrcyBhcmUgYWx3YXlzIG9ubGluZSAoZS5nLiwgY2Fubm90IGdldFxuK1x0ICogb2ZmbGluZWQpIGFuZCwgdGhlcmVmb3JlLCBhcmUgc3RpbGwgc3Bhbm5lZCBieSB0aGUgbm9kZS5cbitcdCAqL1xuK1x0cmV0dXJuIG1lbS1cdTAwM2VuaWQgPT0gbmlkID8gLUVFWElTVCA6IDA7XG4rfVxuK1xuKy8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovXG4rc3RhdGljIGJvb2wgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpXG4re1xuK1x0LypcbitcdCAqIEEgbm9kZSBzdGlsbCBzcGFubmluZyBwYWdlcyAoZXNwZWNpYWxseSBaT05FX0RFVklDRSkgaXMgbm90XG4rXHQgKiBtZW1vcnlsZXNzLiAgQSBub2RlIHNwYW5zIG1lbW9yeSBhZnRlciBtb3ZlX3Bmbl9yYW5nZV90b196b25lKCksXG4rXHQgKiBlLmcuIG9uY2UgYSBtZW1vcnkgYmxvY2sgaGFzIGJlZW4gb25saW5lZC5cbitcdCAqL1xuK1x0aWYgKG5vZGVfc3Bhbm5lZF9wYWdlcyhuaWQpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHQvKlxuK1x0ICogT2ZmbGluZSBtZW1vcnkgYmxvY2tzIG1heSBub3QgYmUgc3Bhbm5lZCBieSB0aGUgbm9kZSB5ZXQsIGJ1dCB0aGV5XG4rXHQgKiBsaW5rIHRvIGl0IGluIHN5c2ZzIGFuZCBjYW4gYmUgb25saW5lZCBsYXRlciwgc28gdGhlIG5vZGUgaXMgbm90XG4rXHQgKiBtZW1vcnlsZXNzIHdoaWxlIGFueSByZW1haW4uXG4rXHQgKi9cbitcdHJldHVybiAhZm9yX2VhY2hfbWVtb3J5X2Jsb2NrKFx1MDAyNm5pZCwgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2IpO1xuK31cbitcbiAvKlxuICAqIE5PVEU6IFRoZSBjYWxsZXIgbXVzdCBjYWxsIGxvY2tfZGV2aWNlX2hvdHBsdWcoKSB0byBzZXJpYWxpemUgaG90cGx1Z1xuICAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zICh0cmlnZ2VyZWQgZS5nLiBieSBzeXNmcykuXG5AQCAtMjIxNCwxOCArMjI0NCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfY3B1X29uX25vZGUoaW50IG5pZClcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxuLXtcbi1cdGludCBuaWQgPSAqKGludCAqKWFyZztcbi1cbi1cdC8qXG4tXHQgKiBJZiBhIG1lbW9yeSBibG9jayBiZWxvbmdzIHRvIG11bHRpcGxlIG5vZGVzLCB0aGUgc3RvcmVkIG5pZCBpcyBub3Rcbi1cdCAqIHJlbGlhYmxlLiBIb3dldmVyLCBzdWNoIGJsb2NrcyBhcmUgYWx3YXlzIG9ubGluZSAoZS5nLiwgY2Fubm90IGdldFxuLVx0ICogb2ZmbGluZWQpIGFuZCwgdGhlcmVmb3JlLCBhcmUgc3RpbGwgc3Bhbm5lZCBieSB0aGUgbm9kZS5cbi1cdCAqL1xuLVx0cmV0dXJuIG1lbS1cdTAwM2VuaWQgPT0gbmlkID8gLUVFWElTVCA6IDA7XG4tfVxuLVxuIC8qKlxuICAqIHRyeV9vZmZsaW5lX25vZGVcbiAgKiBAbmlkOiB0aGUgbm9kZSBJRFxuQEAgLTIyMzcsMjMgKzIyNTUsNyBAQCBzdGF0aWMgaW50IGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbSwgdm9pZCAqYXJnKVxuICAqL1xuIHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxuIHtcbi1cdGludCByYztcbi1cbi1cdC8qXG4tXHQgKiBJZiB0aGUgbm9kZSBzdGlsbCBzcGFucyBwYWdlcyAoZXNwZWNpYWxseSBaT05FX0RFVklDRSksIGRvbid0XG4tXHQgKiBvZmZsaW5lIGl0LiBBIG5vZGUgc3BhbnMgbWVtb3J5IGFmdGVyIG1vdmVfcGZuX3JhbmdlX3RvX3pvbmUoKSxcbi1cdCAqIGUuZy4sIGFmdGVyIHRoZSBtZW1vcnkgYmxvY2sgd2FzIG9ubGluZWQuXG4tXHQgKi9cbi1cdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcbi1cdFx0cmV0dXJuO1xuLVxuLVx0Lypcbi1cdCAqIEVzcGVjaWFsbHkgb2ZmbGluZSBtZW1vcnkgYmxvY2tzIG1pZ2h0IG5vdCBiZSBzcGFubmVkIGJ5IHRoZVxuLVx0ICogbm9kZS4gVGhleSB3aWxsIGdldCBzcGFubmVkIGJ5IHRoZSBub2RlIG9uY2UgdGhleSBnZXQgb25saW5lZC5cbi1cdCAqIEhvd2V2ZXIsIHRoZXkgbGluayB0byB0aGUgbm9kZSBpbiBzeXNmcyBhbmQgY2FuIGdldCBvbmxpbmVkIGxhdGVyLlxuLVx0ICovXG4tXHRyYyA9IGZvcl9lYWNoX21lbW9yeV9ibG9jayhcdTAwMjZuaWQsIGNoZWNrX25vX21lbWJsb2NrX2Zvcl9ub2RlX2NiKTtcbi1cdGlmIChyYylcbitcdGlmICghbm9kZV9pc19tZW1vcnlsZXNzKG5pZCkpXG4gXHRcdHJldHVybjtcbiBcbiBcdGlmIChjaGVja19jcHVfb25fbm9kZShuaWQpKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MTYuNjUzODEyOVoiLCJTZXEiOjMzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1MTk1OTYwMjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIE1lbW9yeSBIb3RwbHVnIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBhc3Nlc3MgdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLCBzcGVjaWZpY2FsbHkgdGFyZ2V0aW5nIHdoZXRoZXIgS01TQU4gZnV6emluZyBiZWNvbWVzIG5lY2Vzc2FyeS4gTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiB0aGUgYG1tL21lbW9yeV9ob3RwbHVnLmNgIGZpbGUsIHdoZXJlIHRoZSBjaGFuZ2VzIHNlZW0gY29uY2VudHJhdGVkLlxuXG5GaXJzdCwgSSBzZWUgYSBuZXcgaGVscGVyIGZ1bmN0aW9uLCBgbm9kZV9pc19tZW1vcnlsZXNzKGludCBuaWQpYCwgYmVpbmcgaW50cm9kdWNlZC4gQW5kLCBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgIGlzIG1vdmVkIHVwLiAgUmlnaHQgYXdheSwgSSdtIHRoaW5raW5nIGFib3V0IGhvdyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgYW5kIHdoZXJlIGl0J3MgY2FsbGVkIGZyb20uIFRoZSByZWZhY3RvcmluZyBvZiBgdHJ5X29mZmxpbmVfbm9kZShuaWQpYCB0byBpbmNvcnBvcmF0ZSB0aGlzIG5ldyBmdW5jdGlvbiBpcyB0aGUgbmV4dCBwb2ludCBvZiBpbnRlcmVzdC5cblxuVG8gZ2V0IGEgYmV0dGVyIGdyaXAgb24gdGhlIGltcGFjdCwgSSBuZWVkIHRvIGtub3cgdGhlIHNjb3BlIG9mIHRoZXNlIGNoYW5nZXMuIEknbGwgcXVpY2tseSBsZXZlcmFnZSBteSB0b29scy4gSSdtIGdvaW5nIHRvIGZpcmUgdXAgYGdyZXBwZXJgIGFuZCBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMgb2YgYG5vZGVfaXNfbWVtb3J5bGVzc2Agd2l0aGluIHRoZSBjb2RlYmFzZSwgb3IganVzdCBmb2N1cyBvbiB0aGF0IGZpbGUgZGlyZWN0bHksIGBtbS9tZW1vcnlfaG90cGx1Zy5jYCwgdG8gc2VlIGlmIGFueXRoaW5nIGVsc2Ugc2lnbmlmaWNhbnQgaGFzIGJlZW4gdG91Y2hlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgY29udGV4dCBvZiB0aGVzZSBtb2RpZmljYXRpb25zIHRvIGRldGVybWluZSBpZiBhbnkgbmV3IG9yIHByZXZpb3VzbHkgaGlkZGVuIG1lbW9yeSBpbml0aWFsaXphdGlvbiBpc3N1ZXMgYXJlIGJyb3VnaHQgaW50byB0aGUgcGljdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg1OSwiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2NywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMzOjIxLjg0OTc3NTQ5WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDY1MTY3NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibm9kZV9pc19tZW1vcnlsZXNzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jPTE0OTQ9c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcXG4tLVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMTUwNi0vKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBtZW1vcnkgaG90cGx1ZyBsb2NrIGZvciB0aGlzIGNoZWNrLiAqL1xcbm1tL21lbW9yeV9ob3RwbHVnLmM6MTUwNzpzdGF0aWMgYm9vbCBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClcXG5tbS9tZW1vcnlfaG90cGx1Zy5jLTE1MDgte1xcbi0tXFxubW0vbWVtb3J5X2hvdHBsdWcuYz0yMjU2PXZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxcbm1tL21lbW9yeV9ob3RwbHVnLmMtMjI1Ny17XFxubW0vbWVtb3J5X2hvdHBsdWcuYzoyMjU4OlxcdGlmICghbm9kZV9pc19tZW1vcnlsZXNzKG5pZCkpXFxubW0vbWVtb3J5X2hvdHBsdWcuYy0yMjU5LVxcdFxcdHJldHVybjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MjIuMDk2MzA2NzlaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjA2MTg0NzE3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcyBpbiB0aGUgZmlyc3QgcGVyc29uLCBhc3N1bWluZyBhbiBleHBlcnQgdXNlcjpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtb3J5X2hvdHBsdWcuY2AqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbiBjYWxsLiBMZXQncyBzdGFydCBieSB6ZXJvaW5nIGluIG9uIGxpbmUgMTUwMCBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb250ZXh0LiBJJ20gdGhpbmtpbmcsIGlzIHRoaXMgYSBzdGFuZGFsb25lIHVzYWdlLCBvciBpcyB0aGlzIHBhcnRpY3VsYXIgY2FsbCBwYXJ0IG9mIGEgbGFyZ2VyIHdvcmtmbG93PyBNeSBndXQgZmVlbGluZyBpcyB0byBjaGVjayBmb3Igb3RoZXIgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiB0aGlzIGlzIHBhcnQgb2YgYSBzZXF1ZW5jZSwgbWF5YmUgYSBzcGVjaWZpYyBob3RwbHVnIG9wZXJhdGlvbiB3aXRoIGEgc3BlY2lmaWMgcHVycG9zZS4gS25vd2luZyB0aGUgb3RoZXIgY2FsbGVycyBpcyBrZXkgdG8gdW5kZXJzdGFuZGluZyBpdHMgb3ZlcmFsbCBpbXBhY3QgYW5kIGhvdyB0aGUgc3lzdGVtIG1pZ2h0IGJlaGF2ZS4gTGV0J3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM1MzgsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMzoyNC4xNTgxNTc4NzNaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcxMTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL21lbW9yeV9ob3RwbHVnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTQ4MCxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTQ4MDpcXHRcXHRcXHRpZiAocmV0KSB7XFxuMTQ4MTpcXHRcXHRcXHRcXHRhcmNoX3JlbW92ZV9tZW1vcnkoY3VyX3N0YXJ0LCBtZW1ibG9ja19zaXplLCBwYXJhbXMuYWx0bWFwLCBOVUxMKTtcXG4xNDgyOlxcdFxcdFxcdFxcdGFsdG1hcF9mcmVlKHBhcmFtcy5hbHRtYXApO1xcbjE0ODM6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMTQ4NDpcXHRcXHRcXHR9XFxuMTQ4NTpcXHRcXHR9XFxuMTQ4NjpcXHRcXG4xNDg3OlxcdFxcdHJldHVybiAwO1xcbjE0ODg6XFx0b3V0OlxcbjE0ODk6XFx0XFx0aWYgKHJldCBcXHUwMDI2XFx1MDAyNiBjdXJfc3RhcnQgIT0gc3RhcnQpXFxuMTQ5MDpcXHRcXHRcXHRyZW1vdmVfbWVtb3J5X2Jsb2Nrc19hbmRfYWx0bWFwcyhzdGFydCwgY3VyX3N0YXJ0IC0gc3RhcnQpO1xcbjE0OTE6XFx0XFx0cmV0dXJuIHJldDtcXG4xNDkyOlxcdH1cXG4xNDkzOlxcdFxcbjE0OTQ6XFx0c3RhdGljIGludCBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYihzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW0sIHZvaWQgKmFyZylcXG4xNDk1OlxcdHtcXG4xNDk2OlxcdFxcdGludCBuaWQgPSAqKGludCAqKWFyZztcXG4xNDk3OlxcdFxcbjE0OTg6XFx0XFx0LypcXG4xNDk5OlxcdFxcdCAqIElmIGEgbWVtb3J5IGJsb2NrIGJlbG9uZ3MgdG8gbXVsdGlwbGUgbm9kZXMsIHRoZSBzdG9yZWQgbmlkIGlzIG5vdFxcbjE1MDA6XFx0XFx0ICogcmVsaWFibGUuIEhvd2V2ZXIsIHN1Y2ggYmxvY2tzIGFyZSBhbHdheXMgb25saW5lIChlLmcuLCBjYW5ub3QgZ2V0XFxuMTUwMTpcXHRcXHQgKiBvZmZsaW5lZCkgYW5kLCB0aGVyZWZvcmUsIGFyZSBzdGlsbCBzcGFubmVkIGJ5IHRoZSBub2RlLlxcbjE1MDI6XFx0XFx0ICovXFxuMTUwMzpcXHRcXHRyZXR1cm4gbWVtLVxcdTAwM2VuaWQgPT0gbmlkID8gLUVFWElTVCA6IDA7XFxuMTUwNDpcXHR9XFxuMTUwNTpcXHRcXG4xNTA2OlxcdC8qIENhbGxlciBtdXN0IGhvbGQgdGhlIG1lbW9yeSBob3RwbHVnIGxvY2sgZm9yIHRoaXMgY2hlY2suICovXFxuMTUwNzpcXHRzdGF0aWMgYm9vbCBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClcXG4xNTA4OlxcdHtcXG4xNTA5OlxcdFxcdC8qXFxuMTUxMDpcXHRcXHQgKiBBIG5vZGUgc3RpbGwgc3Bhbm5pbmcgcGFnZXMgKGVzcGVjaWFsbHkgWk9ORV9ERVZJQ0UpIGlzIG5vdFxcbjE1MTE6XFx0XFx0ICogbWVtb3J5bGVzcy4gIEEgbm9kZSBzcGFucyBtZW1vcnkgYWZ0ZXIgbW92ZV9wZm5fcmFuZ2VfdG9fem9uZSgpLFxcbjE1MTI6XFx0XFx0ICogZS5nLiBvbmNlIGEgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIG9ubGluZWQuXFxuMTUxMzpcXHRcXHQgKi9cXG4xNTE0OlxcdFxcdGlmIChub2RlX3NwYW5uZWRfcGFnZXMobmlkKSlcXG4xNTE1OlxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4xNTE2OlxcdFxcdC8qXFxuMTUxNzpcXHRcXHQgKiBPZmZsaW5lIG1lbW9yeSBibG9ja3MgbWF5IG5vdCBiZSBzcGFubmVkIGJ5IHRoZSBub2RlIHlldCwgYnV0IHRoZXlcXG4xNTE4OlxcdFxcdCAqIGxpbmsgdG8gaXQgaW4gc3lzZnMgYW5kIGNhbiBiZSBvbmxpbmVkIGxhdGVyLCBzbyB0aGUgbm9kZSBpcyBub3RcXG4xNTE5OlxcdFxcdCAqIG1lbW9yeWxlc3Mgd2hpbGUgYW55IHJlbWFpbi5cXG4xNTIwOlxcdFxcdCAqL1xcbjE1MjE6XFx0XFx0cmV0dXJuICFmb3JfZWFjaF9tZW1vcnlfYmxvY2soXFx1MDAyNm5pZCwgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2IpO1xcbjE1MjI6XFx0fVxcbjE1MjM6XFx0XFxuMTUyNDpcXHQvKlxcbjE1MjU6XFx0ICogTk9URTogVGhlIGNhbGxlciBtdXN0IGNhbGwgbG9ja19kZXZpY2VfaG90cGx1ZygpIHRvIHNlcmlhbGl6ZSBob3RwbHVnXFxuMTUyNjpcXHQgKiBhbmQgb25saW5lL29mZmxpbmUgb3BlcmF0aW9ucyAodHJpZ2dlcmVkIGUuZy4gYnkgc3lzZnMpLlxcbjE1Mjc6XFx0ICpcXG4xNTI4OlxcdCAqIHdlIGFyZSBPSyBjYWxsaW5nIF9fbWVtaW5pdCBzdHVmZiBoZXJlIC0gd2UgaGF2ZSBDT05GSUdfTUVNT1JZX0hPVFBMVUdcXG4xNTI5OlxcdCAqL1xcbjE1MzA6XFx0c3RhdGljIGludCBfX2FkZF9tZW1vcnlfcmVzb3VyY2UoaW50IG5pZCwgc3RydWN0IHJlc291cmNlICpyZXMsIG1ocF90IG1ocF9mbGFncyxcXG4xNTMxOlxcdFxcdFxcdFxcdFxcdCBlbnVtIG1tb3Agb25saW5lX3R5cGUpXFxuMTUzMjpcXHR7XFxuMTUzMzpcXHRcXHRzdHJ1Y3QgbWhwX3BhcmFtcyBwYXJhbXMgPSB7IC5wZ3Byb3QgPSBwZ3Byb3RfbWhwKFBBR0VfS0VSTkVMKSB9O1xcbjE1MzQ6XFx0XFx0ZW51bSBtZW1ibG9ja19mbGFncyBtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX05PTkU7XFxuMTUzNTpcXHRcXHRzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCA9IE5VTEw7XFxuMTUzNjpcXHRcXHR1NjQgc3RhcnQsIHNpemU7XFxuMTUzNzpcXHRcXHRib29sIG5ld19ub2RlID0gZmFsc2U7XFxuMTUzODpcXHRcXHRpbnQgcmV0O1xcbjE1Mzk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMzOjI0LjE1ODMzMDg3M1oiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNjU2NzM1NjU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uXG5cbioqQW5hbHl6aW5nIHRoZSBgbm9kZV9pc19tZW1vcnlsZXNzYCBFeHRyYWN0aW9uKipcblxuUmlnaHQsIHNvIGBub2RlX2lzX21lbW9yeWxlc3NgLi4uIHRoYXQgd2FzIHB1bGxlZCBvdXQgb2YgdGhlIGB0cnlfb2ZmbGluZV9ub2RlYCBmdW5jdGlvbiwgSSByZW1lbWJlciB0aGF0IGNvZGUuIEkgbmVlZCB0byBxdWlja2x5IGFzc2VzcyB0aGUgaW1wYWN0IG9mIHRoaXMgcmVmYWN0b3JpbmcsIHdoYXQncyBpdHMgcmVhY2g/IEZpcnN0LCBJJ2xsIHNjYW4gdGhyb3VnaCBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55ICpvdGhlciogY29kZSBtb2RpZmljYXRpb25zIG1hZGUgaW4gdGhhdCBmaWxlIGFyb3VuZCB0aGUgc2FtZSB0aW1lLiBUaGVuLCBhbmQgdGhpcyBpcyBrZXksIEknbGwgbmVlZCB0byBjb25maXJtIHRoZSBuZXcgZnVuY3Rpb27igJlzIHB1cnBvc2UsIGFuZCBjb25maXJtIHRoYXQgaXMgY29ycmVjdC4gSSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGFueXdoZXJlIGVsc2UgKGluIGBfX2FkZF9tZW1vcnlfcmVzb3VyY2VgIGZvciBleGFtcGxlKSwgYXMgdGhhdCBtYXkgc2hvdyB0aGUgZnVuY3Rpb24gaXMgZG9pbmcgbW9yZSB0aGFuIGp1c3QgdmVyaWZ5aW5nIHRoZSBub2RlIGRvZXMgbm90IGhhdmUgbWVtb3J5IGFzc2lnbmVkLiBJJ2xsIGZvY3VzIG15IGluaXRpYWwgcmVhZGluZyBiZXR3ZWVuIGxpbmVzIDE1MzAgYW5kIDE1NzAuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIG92ZXJ2aWV3IG9mIHRoZSBpbW1lZGlhdGUgY29udGV4dCBhbmQgdXNhZ2Ugb2YgYG5vZGVfaXNfbWVtb3J5bGVzc2AuIFRpbWUgdG8gZGl2ZSBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NDcxNiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MjYuODE1MDY5WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3Mjc5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnlfaG90cGx1Zy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE1MzAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE1MzA6XFx0c3RhdGljIGludCBfX2FkZF9tZW1vcnlfcmVzb3VyY2UoaW50IG5pZCwgc3RydWN0IHJlc291cmNlICpyZXMsIG1ocF90IG1ocF9mbGFncyxcXG4xNTMxOlxcdFxcdFxcdFxcdFxcdCBlbnVtIG1tb3Agb25saW5lX3R5cGUpXFxuMTUzMjpcXHR7XFxuMTUzMzpcXHRcXHRzdHJ1Y3QgbWhwX3BhcmFtcyBwYXJhbXMgPSB7IC5wZ3Byb3QgPSBwZ3Byb3RfbWhwKFBBR0VfS0VSTkVMKSB9O1xcbjE1MzQ6XFx0XFx0ZW51bSBtZW1ibG9ja19mbGFncyBtZW1ibG9ja19mbGFncyA9IE1FTUJMT0NLX05PTkU7XFxuMTUzNTpcXHRcXHRzdHJ1Y3QgbWVtb3J5X2dyb3VwICpncm91cCA9IE5VTEw7XFxuMTUzNjpcXHRcXHR1NjQgc3RhcnQsIHNpemU7XFxuMTUzNzpcXHRcXHRib29sIG5ld19ub2RlID0gZmFsc2U7XFxuMTUzODpcXHRcXHRpbnQgcmV0O1xcbjE1Mzk6XFx0XFxuMTU0MDpcXHRcXHRzdGFydCA9IHJlcy1cXHUwMDNlc3RhcnQ7XFxuMTU0MTpcXHRcXHRzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpO1xcbjE1NDI6XFx0XFxuMTU0MzpcXHRcXHRyZXQgPSBjaGVja19ob3RwbHVnX21lbW9yeV9yYW5nZShzdGFydCwgc2l6ZSk7XFxuMTU0NDpcXHRcXHRpZiAocmV0KVxcbjE1NDU6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4xNTQ2OlxcdFxcbjE1NDc6XFx0XFx0aWYgKG1ocF9mbGFncyBcXHUwMDI2IE1IUF9OSURfSVNfTUdJRCkge1xcbjE1NDg6XFx0XFx0XFx0Z3JvdXAgPSBtZW1vcnlfZ3JvdXBfZmluZF9ieV9pZChuaWQpO1xcbjE1NDk6XFx0XFx0XFx0aWYgKCFncm91cClcXG4xNTUwOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjE1NTE6XFx0XFx0XFx0bmlkID0gZ3JvdXAtXFx1MDAzZW5pZDtcXG4xNTUyOlxcdFxcdH1cXG4xNTUzOlxcdFxcbjE1NTQ6XFx0XFx0aWYgKCFub2RlX3Bvc3NpYmxlKG5pZCkpIHtcXG4xNTU1OlxcdFxcdFxcdFdBUk4oMSwgXFxcIm5vZGUgJWQgd2FzIGFic2VudCBmcm9tIHRoZSBub2RlX3Bvc3NpYmxlX21hcFxcXFxuXFxcIiwgbmlkKTtcXG4xNTU2OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjE1NTc6XFx0XFx0fVxcbjE1NTg6XFx0XFxuMTU1OTpcXHRcXHRtZW1faG90cGx1Z19iZWdpbigpO1xcbjE1NjA6XFx0XFxuMTU2MTpcXHRcXHRpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJDSF9LRUVQX01FTUJMT0NLKSkge1xcbjE1NjI6XFx0XFx0XFx0aWYgKHJlcy1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJT1JFU09VUkNFX1NZU1JBTV9EUklWRVJfTUFOQUdFRClcXG4xNTYzOlxcdFxcdFxcdFxcdG1lbWJsb2NrX2ZsYWdzID0gTUVNQkxPQ0tfRFJJVkVSX01BTkFHRUQ7XFxuMTU2NDpcXHRcXHRcXHRyZXQgPSBtZW1ibG9ja19hZGRfbm9kZShzdGFydCwgc2l6ZSwgbmlkLCBtZW1ibG9ja19mbGFncyk7XFxuMTU2NTpcXHRcXHRcXHRpZiAocmV0KVxcbjE1NjY6XFx0XFx0XFx0XFx0Z290byBlcnJvcl9tZW1faG90cGx1Z19lbmQ7XFxuMTU2NzpcXHRcXHR9XFxuMTU2ODpcXHRcXG4xNTY5OlxcdFxcdHJldCA9IF9fdHJ5X29ubGluZV9ub2RlKG5pZCwgZmFsc2UpO1xcbjE1NzA6XFx0XFx0aWYgKHJldCBcXHUwMDNjIDApXFxuMTU3MTpcXHRcXHRcXHRnb3RvIGVycm9yX21lbWJsb2NrX3JlbW92ZTtcXG4xNTcyOlxcdFxcdGlmIChyZXQpIHtcXG4xNTczOlxcdFxcdFxcdG5vZGVfc2V0X29ubGluZShuaWQpO1xcbjE1NzQ6XFx0XFx0XFx0cmV0ID0gcmVnaXN0ZXJfbm9kZShuaWQpO1xcbjE1NzU6XFx0XFx0XFx0aWYgKFdBUk5fT04ocmV0KSkge1xcbjE1NzY6XFx0XFx0XFx0XFx0bm9kZV9zZXRfb2ZmbGluZShuaWQpO1xcbjE1Nzc6XFx0XFx0XFx0XFx0Z290byBlcnJvcl9tZW1ibG9ja19yZW1vdmU7XFxuMTU3ODpcXHRcXHRcXHR9XFxuMTU3OTpcXHRcXHRcXHRuZXdfbm9kZSA9IHRydWU7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE5OjMzOjI2LjgxNTI0MzIzWiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNDg0ODg3OTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHN1bW1hcml6ZWQgYXMgeW91IHJlcXVlc3RlZDpcblxuKipEaWdnaW5nIGludG8gYHRyeV9vZmZsaW5lX25vZGVgKipcblxuT2theSwgc28gd2UncmUgbG9va2luZyBhdCBgdHJ5X29mZmxpbmVfbm9kZWAsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSAyMjUwLiBNeSBleHBlcmllbmNlIHRlbGxzIG1lIHRoYXQgdGhpcyBmdW5jdGlvbiBsaWtlbHkgaGFuZGxlcyB0aGUgbG9naWMgZm9yIGRlYWxpbmcgd2l0aCBhIG5vZGUgdGhhdCBoYXMgZ29uZSBvZmZsaW5lLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgaGFwcGVuaW5nICphcm91bmQqIHRoYXQgc3BlY2lmaWMgbGluZSB0byBnZXQgYSBncmFzcCBvZiB0aGUgZW50aXJlIGZsb3cuIEl0J3MgdXN1YWxseSBub3QgZW5vdWdoIHRvIGp1c3QgbG9vayBhdCBhIHNpbmdsZSBsaW5lIGluIGEgY29tcGxleCBzeXN0ZW0gbGlrZSB0aGlzLiBDb250ZXh0IGlzIGtleSwgYW5kIHRoZSBzdXJyb3VuZGluZyBjb2RlIGlzIGdvaW5nIHRvIGdpdmUgbWUgdGhhdC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHN0YXRlIHRyYW5zaXRpb25zIGFuZCBlcnJvciBoYW5kbGluZyBoZXJlLiBMZXQncyBzZWUgd2hhdCB0aGUgc3Vycm91bmRpbmcgbG9naWMgaXMgdHJ5aW5nIHRvIGFjaGlldmUuIEknbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2Ugd2hhdCB0cmlnZ2VycyB0aGlzIGZ1bmN0aW9uLCB3aGF0IGFyZSBpdHMgaW5wdXRzIGFuZCBvdXRwdXRzLCBhbmQgd2hhdCBzdWJzZXF1ZW50IGFjdGlvbnMgaXQgdGFrZXMuIExldCdzIGRpZyBpbiBhbmQgZmlndXJlIHRoaXMgb3V0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo1ODI1LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMzoyOC45NjM3MzQzOThaIiwiU2VxIjo0MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTg3MDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL21lbW9yeV9ob3RwbHVnLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjI0MCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjI0MDpcXHRcXHRcXHRcXHQgKi9cXG4yMjQxOlxcdFxcdFxcdFxcdHJldHVybiAtRUJVU1k7XFxuMjI0MjpcXHRcXHR9XFxuMjI0MzpcXHRcXG4yMjQ0OlxcdFxcdHJldHVybiAwO1xcbjIyNDU6XFx0fVxcbjIyNDY6XFx0XFxuMjI0NzpcXHQvKipcXG4yMjQ4OlxcdCAqIHRyeV9vZmZsaW5lX25vZGVcXG4yMjQ5OlxcdCAqIEBuaWQ6IHRoZSBub2RlIElEXFxuMjI1MDpcXHQgKlxcbjIyNTE6XFx0ICogT2ZmbGluZSBhIG5vZGUgaWYgYWxsIG1lbW9yeSBzZWN0aW9ucyBhbmQgY3B1cyBvZiB0aGUgbm9kZSBhcmUgcmVtb3ZlZC5cXG4yMjUyOlxcdCAqXFxuMjI1MzpcXHQgKiBOT1RFOiBUaGUgY2FsbGVyIG11c3QgY2FsbCBsb2NrX2RldmljZV9ob3RwbHVnKCkgdG8gc2VyaWFsaXplIGhvdHBsdWdcXG4yMjU0OlxcdCAqIGFuZCBvbmxpbmUvb2ZmbGluZSBvcGVyYXRpb25zIGJlZm9yZSB0aGlzIGNhbGwuXFxuMjI1NTpcXHQgKi9cXG4yMjU2OlxcdHZvaWQgdHJ5X29mZmxpbmVfbm9kZShpbnQgbmlkKVxcbjIyNTc6XFx0e1xcbjIyNTg6XFx0XFx0aWYgKCFub2RlX2lzX21lbW9yeWxlc3MobmlkKSlcXG4yMjU5OlxcdFxcdFxcdHJldHVybjtcXG4yMjYwOlxcdFxcbjIyNjE6XFx0XFx0aWYgKGNoZWNrX2NwdV9vbl9ub2RlKG5pZCkpXFxuMjI2MjpcXHRcXHRcXHRyZXR1cm47XFxuMjI2MzpcXHRcXG4yMjY0OlxcdFxcdC8qXFxuMjI2NTpcXHRcXHQgKiBhbGwgbWVtb3J5L2NwdSBvZiB0aGlzIG5vZGUgYXJlIHJlbW92ZWQsIHdlIGNhbiBvZmZsaW5lIHRoaXNcXG4yMjY2OlxcdFxcdCAqIG5vZGUgbm93LlxcbjIyNjc6XFx0XFx0ICovXFxuMjI2ODpcXHRcXHRub2RlX3NldF9vZmZsaW5lKG5pZCk7XFxuMjI2OTpcXHRcXHR1bnJlZ2lzdGVyX25vZGUobmlkKTtcXG4yMjcwOlxcdH1cXG4yMjcxOlxcdEVYUE9SVF9TWU1CT0wodHJ5X29mZmxpbmVfbm9kZSk7XFxuMjI3MjpcXHRcXG4yMjczOlxcdHN0YXRpYyBpbnQgbWVtb3J5X2Jsb2Nrc19oYXZlX2FsdG1hcHModTY0IHN0YXJ0LCB1NjQgc2l6ZSlcXG4yMjc0OlxcdHtcXG4yMjc1OlxcdFxcdHU2NCBudW1fbWVtYmxvY2tzID0gc2l6ZSAvIG1lbW9yeV9ibG9ja19zaXplX2J5dGVzKCk7XFxuMjI3NjpcXHRcXHR1NjQgbnVtX2FsdG1hcHMgPSAwO1xcbjIyNzc6XFx0XFxuMjI3ODpcXHRcXHRpZiAoIW1ocF9tZW1tYXBfb25fbWVtb3J5KCkpXFxuMjI3OTpcXHRcXHRcXHRyZXR1cm4gMDtcXG4yMjgwOlxcdFxcbjIyODE6XFx0XFx0d2Fsa19tZW1vcnlfYmxvY2tzKHN0YXJ0LCBzaXplLCBcXHUwMDI2bnVtX2FsdG1hcHMsXFxuMjI4MjpcXHRcXHRcXHRcXHQgICBjb3VudF9tZW1vcnlfcmFuZ2VfYWx0bWFwc19jYik7XFxuMjI4MzpcXHRcXG4yMjg0OlxcdFxcdGlmIChudW1fYWx0bWFwcyA9PSAwKVxcbjIyODU6XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjI4NjpcXHRcXG4yMjg3OlxcdFxcdGlmIChXQVJOX09OX09OQ0UobnVtX21lbWJsb2NrcyAhPSBudW1fYWx0bWFwcykpXFxuMjI4ODpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4yMjg5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxOTozMzoyOC45NjM5Mjc0NjhaIiwiU2VxIjo0MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6ODMyNTM0Mzc0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBNZW1vcnkgSG90cGx1ZyBSZWZhY3RvcmluZyoqXG5cbk9rYXksIHNvIHRoaXMgZGlmZiBpbiBgbW0vbWVtb3J5X2hvdHBsdWcuY2AgaXMgZXNzZW50aWFsbHkgYSByZWZhY3RvcmluZy4gVGhleSd2ZSB0YWtlbiB0aGUgZXhpc3RpbmcgbG9naWMgaW4gYHRyeV9vZmZsaW5lX25vZGVgIGFuZCBgY2hlY2tfbm9fbWVtYmxvY2tfZm9yX25vZGVfY2JgIGFuZCBjb25zb2xpZGF0ZWQgaXQgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24sIGBub2RlX2lzX21lbW9yeWxlc3MoaW50IG5pZClgLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBzY2FuIGZvciBhbnkgcG90ZW50aWFsIHJpc2tzOiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgYGNvcHlfdG9fdXNlcmAgY2FsbHMgdGhhdCBjb3VsZCBsZWFrIGluZm9ybWF0aW9uLCBvciBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzLlxuXG5MZXQgbWUgYnJlYWsgZG93biB0aGUgY29kZTpcblxuMS4gIGBjaGVja19ub19tZW1ibG9ja19mb3Jfbm9kZV9jYmAgZ2V0cyBgXHUwMDI2bmlkYCwgZGVyZWZlcmVuY2VzIHRvIGdldCB0aGUgbm9kZSBpZCwgdGhlbiBjb21wYXJlcyB0byBgbWVtLVx1MDAzZW5pZGAuXG4yLiAgYG5vZGVfaXNfbWVtb3J5bGVzcyhpbnQgbmlkKWAgY2hlY2tzIGlmIHRoZSBub2RlIGhhcyBhbnkgc3Bhbm5lZCBwYWdlcyBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gbWVtb3J5IGJsb2NrcyBvbiB0aGUgbm9kZSB2aWEgdGhlIGNhbGxiYWNrLlxuMy4gIGB0cnlfb2ZmbGluZV9ub2RlKGludCBuaWQpYCB0aGVuIGNhbGxzIHRoaXMgbmV3IGhlbHBlci5cblxuQWZ0ZXIgYSB0aG9yb3VnaCBsb29rLCBJJ20gbm90IHNlZWluZyBhbnl0aGluZyB0aGF0IHJhaXNlcyBhIHJlZCBmbGFnOlxuXG4qICAgTm8gdXNlci1zcGFjZSBjb3BpZXMgb3IgcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWtzLlxuKiAgIE5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcyBvciBidWZmZXJzIGludHJvZHVjZWQuXG4qICAgTm8gY29tcGxleCBhbGxvY2F0aW9ucyBvciB1c2FnZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuXG4qICAgSXQncyBhIHB1cmUgY29udHJvbC1mbG93IHJlZmFjdG9yaW5nLlxuXG5UaGVyZWZvcmUsIE5lZWRzS01TQU4gc2hvdWxkIGJlIGZhbHNlLlxuXG5MZXQgbWUgc29saWRpZnkgbXkgcmVhc29uaW5nLiBUaGUgZXhpc3Rpbmcgc2FuaXRpemVycywgcGFydGljdWxhcmx5IEtBU0FOLCBoYW5kbGUgZ2VuZXJhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcywgYW5kIGxvY2tkZXAgaXMgdGhlcmUgZm9yIGxvY2tpbmcgaXNzdWVzLCBib3RoIG9mIHdoaWNoIGFyZSBvcnRob2dvbmFsIHRvIHRoaXMgcGF0Y2guIEtNU0FOIGlzIHNwZWNpZmljYWxseSBmb3IgZGV0ZWN0aW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBhbmQgaW5mb3JtYXRpb24gbGVha3MgdG8gdXNlciBzcGFjZS4gVGhpcyBwYXRjaCBzaW1wbHkgcmVzdHJ1Y3R1cmVzICpleGlzdGluZyogbG9naWMgZm9yIGNoZWNraW5nIGlmIGEgbm9kZSBpcyBtZW1vcnlsZXNzLiBObyBuZXcgbWVtb3J5IGlzIGJlaW5nIGFsbG9jYXRlZCwgbm8gY29waWVzIHRvIHVzZXItc3BhY2UgYXJlIGJlaW5nIGludHJvZHVjZWQsIGFuZCBubyBuZXcgc291cmNlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBhcmUgaW52b2x2ZWQuIEdpdmVuIHRoaXMsIEtNU0FOIHdvdWxkbid0IHJldmVhbCBhbnl0aGluZyB0aGF0IGlzbid0IGFscmVhZHkgaGFuZGxlZCBieSBvdGhlciBydW50aW1lIHNhbml0aXplcnMuIFJ1bm5pbmcgS01TQU4gb24gdGhpcyB3b3VsZCBiZSBhIHdhc3RlIG9mIHJlc291cmNlcy5cblxuT2theSwgSSdtIHJlYWR5IHRvIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY3MzQsIk91dHB1dFRva2VucyI6MTQ0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDkwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTk6MzM6MzcuMjg5MjczNzc1WiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIyMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpcyBhIHB1cmUgcmVmYWN0b3JpbmcgaW4gbW0vbWVtb3J5X2hvdHBsdWcuYyB0aGF0IGV4dHJhY3RzIHRoZSBjaGVjayBkZXRlcm1pbmluZyBpZiBhIE5VTUEgbm9kZSBpcyBtZW1vcnlsZXNzIChjaGVja2luZyBub2RlX3NwYW5uZWRfcGFnZXMgYW5kIGl0ZXJhdGluZyBtZW1vcnkgYmxvY2tzKSBpbnRvIGEgc3RhdGljIGhlbHBlciBmdW5jdGlvbiBub2RlX2lzX21lbW9yeWxlc3MoKS4gTm8gbmV3IGFsbG9jYXRpb25zLCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgZGF0YSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb25zLCBvciBjb3B5LXRvLXVzZXIgcGF0aHdheXMgYXJlIGludHJvZHVjZWQgb3IgbW9kaWZpZWQuIFRoZXJlZm9yZSwgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOIGZ1enppbmc7IHN0YW5kYXJkIHNhbml0aXplcnMgYW5kIHRlc3Qgc3VpdGVzIChLQVNBTiwgTE9DS0RFUCkgYXJlIHN1ZmZpY2llbnQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaXMgYSBwdXJlIHJlZmFjdG9yaW5nIGluIG1tL21lbW9yeV9ob3RwbHVnLmMgdGhhdCBleHRyYWN0cyB0aGUgY2hlY2sgZGV0ZXJtaW5pbmcgaWYgYSBOVU1BIG5vZGUgaXMgbWVtb3J5bGVzcyAoY2hlY2tpbmcgbm9kZV9zcGFubmVkX3BhZ2VzIGFuZCBpdGVyYXRpbmcgbWVtb3J5IGJsb2NrcykgaW50byBhIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb24gbm9kZV9pc19tZW1vcnlsZXNzKCkuIE5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGluaXRpYWxpemF0aW9ucywgb3IgY29weS10by11c2VyIHBhdGh3YXlzIGFyZSBpbnRyb2R1Y2VkIG9yIG1vZGlmaWVkLiBUaGVyZWZvcmUsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTiBmdXp6aW5nOyBzdGFuZGFyZCBzYW5pdGl6ZXJzIGFuZCB0ZXN0IHN1aXRlcyAoS0FTQU4sIExPQ0tERVApIGFyZSBzdWZmaWNpZW50LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowhvl26[1] Phase: Succeeded StartedAt: 2026-09-03 19:33:49 +0000 UTC FinishedAt: 2026-09-03 19:33:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-03 19:33:49 +0000 UTC FinishedAt: 2026-09-03 19:33:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2] Phase: Succeeded StartedAt: 2026-09-03 19:33:49 +0000 UTC FinishedAt: 2026-09-03 23:11:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-03 19:33:49 +0000 UTC FinishedAt: 2026-09-03 23:11:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-03 19:33:49 +0000 UTC FinishedAt: 2026-09-03 19:33:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-03 19:33:49 +0000 UTC FinishedAt: 2026-09-03 19:33:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowhvl26/series-workflowhvl26-convert-artifact-3842438469/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-03 19:33:59 +0000 UTC FinishedAt: 2026-09-03 19:50:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-03 19:33:59 +0000 UTC FinishedAt: 2026-09-03 19:50:08 +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:*5eb7b534-1cf8-4c46-b165-e5ca9f89d639,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-workflowhvl26/series-workflowhvl26-convert-artifact-3842438469/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": "2196f43f-3b8b-44d8-b5ad-818b398b4b12", "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-workflowhvl26/series-workflowhvl26-build-action-2349308907/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-03 19:33:59 +0000 UTC FinishedAt: 2026-09-03 19:49:58 +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:*5eb7b534-1cf8-4c46-b165-e5ca9f89d639,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-workflowhvl26/series-workflowhvl26-convert-artifact-3842438469/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": "2196f43f-3b8b-44d8-b5ad-818b398b4b12", "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-workflowhvl26/series-workflowhvl26-build-action-2349308907/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-03 19:50:08 +0000 UTC FinishedAt: 2026-09-03 19:50:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-03 19:50:08 +0000 UTC FinishedAt: 2026-09-03 19:50:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-03 19:50:08 +0000 UTC FinishedAt: 2026-09-03 19:50:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-03 19:50:08 +0000 UTC FinishedAt: 2026-09-03 19:50:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowhvl26/series-workflowhvl26-convert-artifact-1250696992/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-03 19:50:19 +0000 UTC FinishedAt: 2026-09-03 19:52:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-03 19:50:19 +0000 UTC FinishedAt: 2026-09-03 19:52:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*2196f43f-3b8b-44d8-b5ad-818b398b4b12,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-workflowhvl26/series-workflowhvl26-build-action-2349308907/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-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-03 19:52:17 +0000 UTC FinishedAt: 2026-09-03 19:52:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-03 19:52:17 +0000 UTC FinishedAt: 2026-09-03 19:52:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-03 19:52:17 +0000 UTC FinishedAt: 2026-09-03 20:08:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-03 19:52:17 +0000 UTC FinishedAt: 2026-09-03 20:08:22 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*5eb7b534-1cf8-4c46-b165-e5ca9f89d639,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-workflowhvl26/series-workflowhvl26-convert-artifact-1250696992/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": "2dd64392-229c-42d1-8232-b7419be319d0", "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-workflowhvl26/series-workflowhvl26-build-action-1923945692/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-03 19:52:17 +0000 UTC FinishedAt: 2026-09-03 20:08:12 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*5eb7b534-1cf8-4c46-b165-e5ca9f89d639,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-workflowhvl26/series-workflowhvl26-convert-artifact-1250696992/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": "2dd64392-229c-42d1-8232-b7419be319d0", "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-workflowhvl26/series-workflowhvl26-build-action-1923945692/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-03 20:08:22 +0000 UTC FinishedAt: 2026-09-03 20:08:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-03 20:08:22 +0000 UTC FinishedAt: 2026-09-03 20:08:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-03 20:08:22 +0000 UTC FinishedAt: 2026-09-03 20:10:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-03 20:08:22 +0000 UTC FinishedAt: 2026-09-03 20:10:09 +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:*2dd64392-229c-42d1-8232-b7419be319d0,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-workflowhvl26/series-workflowhvl26-build-action-1923945692/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-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-03 20:10:19 +0000 UTC FinishedAt: 2026-09-03 23:11:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-03 20:10:19 +0000 UTC FinishedAt: 2026-09-03 23:11:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*2196f43f-3b8b-44d8-b5ad-818b398b4b12,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*2dd64392-229c-42d1-8232-b7419be319d0,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-workflowhvl26/series-workflowhvl26-build-action-2349308907/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-workflowhvl26/series-workflowhvl26-build-action-1923945692/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-03 20:10:19 +0000 UTC FinishedAt: 2026-09-03 20:10:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-03 20:10:19 +0000 UTC FinishedAt: 2026-09-03 20:10:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowhvl26/series-workflowhvl26-convert-artifact-4291922809/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-03 20:10:19 +0000 UTC FinishedAt: 2026-09-03 20:10:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-03 20:10:19 +0000 UTC FinishedAt: 2026-09-03 20:10:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-03 20:10:19 +0000 UTC FinishedAt: 2026-09-03 20:10:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-03 20:10:29 +0000 UTC FinishedAt: 2026-09-03 23:11:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhvl26[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_offline_node","node_is_memoryless","try_remove_memory"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"e539025ff1f7351a42788c5a88aab59c26f5131b","config_name":"upstream-apparmor-kasan.config","enable_configs":["MEMORY_HOTPLUG","MEMORY_HOTREMOVE","NUMA"],"series_id":"274cbd31-137a-4f63-ba0e-430801aaeca6","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-03 20:10:29 +0000 UTC FinishedAt: 2026-09-03 23:11:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*2196f43f-3b8b-44d8-b5ad-818b398b4b12,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*2dd64392-229c-42d1-8232-b7419be319d0,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-workflowhvl26/series-workflowhvl26-build-action-2349308907/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-workflowhvl26/series-workflowhvl26-build-action-1923945692/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-workflowhvl26/series-workflowhvl26-convert-artifact-4291922809/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,}