Owo7IGd2bWF0MzIuYXNtIC0tIEFzbSBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODYKOyBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBHaWxsZXMgVm9sbGFudC4KOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gKOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYwo7IEl0IG5lZWQgd21hc2sgPT0gMHg3ZmZmCjsgICAgIChhc3NlbWJseSBjb2RlIGlzIGZhc3RlciB3aXRoIGEgZml4ZWQgd21hc2spCjsKOyBGb3IgVmlzdWFsIEMrKyA0LjIgYW5kIE1MIDYuMTFjICh2ZXJzaW9uIGluIGRpcmVjdG9yeSBcTUFTTTYxMUMgb2YgV2luOTUgRERLKQo7ICAgSSBjb21waWxlIHdpdGggOiAibWwgL2NvZmYgL1ppIC9jIGd2bWF0MzIuYXNtIgo7Cgo7dUludCBsb25nZXN0X21hdGNoXzdmZmYocywgY3VyX21hdGNoKQo7ICAgIGRlZmxhdGVfc3RhdGUgKnM7CjsgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovCgogICAgICAgIE5iU3RhY2sgICAgICAgICBlcXUgICAgIDc2CiAgICAgICAgY3VyX21hdGNoICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTBdCiAgICAgICAgc3RyX3MgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTRdCjsgNSBkd29yZCBvbiB0b3AgKHJldCxlYnAsZXNpLGVkaSxlYngpCiAgICAgICAgYWRycmV0ICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLThdCiAgICAgICAgcHVzaGVicCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTEyXQogICAgICAgIHB1c2hlZGkgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0xNl0KICAgICAgICBwdXNoZXNpICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMjBdCiAgICAgICAgcHVzaGVieCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTI0XQoKICAgICAgICBjaGFpbl9sZW5ndGggICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTI4XQogICAgICAgIGxpbWl0ICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzJdCiAgICAgICAgYmVzdF9sZW4gICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay0zNl0KICAgICAgICB3aW5kb3cgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQwXQogICAgICAgIHByZXYgICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDRdCiAgICAgICAgc2Nhbl9zdGFydCAgICAgIGVxdSAgICAgIHdvcmQgcHRyIFtlc3ArTmJTdGFjay00OF0KICAgICAgICB3bWFzayAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTUyXQogICAgICAgIG1hdGNoX3N0YXJ0X3B0ciBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTZdCiAgICAgICAgbmljZV9tYXRjaCAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay02MF0KICAgICAgICBzY2FuICAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTY0XQoKICAgICAgICB3aW5kb3dsZW4gICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTY4XQogICAgICAgIG1hdGNoX3N0YXJ0ICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNzJdCiAgICAgICAgc3RyZW5kICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay03Nl0KICAgICAgICBOYlN0YWNrQWRkICAgICAgZXF1ICAgICAoTmJTdGFjay0yNCkKCiAgICAuMzg2cAoKICAgIG5hbWUgICAgZ3ZtYXRjaAogICAgLk1PREVMICBGTEFUCgoKCjsgIGFsbCB0aGUgKzQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBwZW5kaW5nX2J1Zl9zaXplIChpbiB6bGliCjsgIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4KOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjAuNCBvciBvbGRlciwgcmVtb3ZlIHRoZSArNCkuCjsgIE5vdGUgOiB0aGVzZSB2YWx1ZSBhcmUgZ29vZCB3aXRoIGEgOCBieXRlcyBib3VuZGFyeSBwYWNrIHN0cnVjdHVyZQogICAgZGVwX2NoYWluX2xlbmd0aCAgICBlcXUgICAgIDcwaCs0CiAgICBkZXBfd2luZG93ICAgICAgICAgIGVxdSAgICAgMmNoKzQKICAgIGRlcF9zdHJzdGFydCAgICAgICAgZXF1ICAgICA2MGgrNAogICAgZGVwX3ByZXZfbGVuZ3RoICAgICBlcXUgICAgIDZjaCs0CiAgICBkZXBfbmljZV9tYXRjaCAgICAgIGVxdSAgICAgODRoKzQKICAgIGRlcF93X3NpemUgICAgICAgICAgZXF1ICAgICAyMGgrNAogICAgZGVwX3ByZXYgICAgICAgICAgICBlcXUgICAgIDM0aCs0CiAgICBkZXBfd19tYXNrICAgICAgICAgIGVxdSAgICAgMjhoKzQKICAgIGRlcF9nb29kX21hdGNoICAgICAgZXF1ICAgICA4MGgrNAogICAgZGVwX21hdGNoX3N0YXJ0ICAgICBlcXUgICAgIDY0aCs0CiAgICBkZXBfbG9va2FoZWFkICAgICAgIGVxdSAgICAgNjhoKzQKCgpfVEVYVCAgICAgICAgICAgICAgICAgICBzZWdtZW50CgpJRkRFRiBOT1VOREVSTElORQogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGxvbmdlc3RfbWF0Y2hfN2ZmZgo7ICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBtYXRjaF9pbml0CkVMU0UKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBfbG9uZ2VzdF9tYXRjaF83ZmZmCjsgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIF9tYXRjaF9pbml0CkVORElGCgogICAgTUFYX01BVENIICAgICAgICAgICBlcXUgICAgIDI1OAogICAgTUlOX01BVENIICAgICAgICAgICBlcXUgICAgIDMKICAgIE1JTl9MT09LQUhFQUQgICAgICAgZXF1ICAgICAoTUFYX01BVENIK01JTl9NQVRDSCsxKQoKCgpJRkRFRiBOT1VOREVSTElORQo7bWF0Y2hfaW5pdCAgICAgIHByb2MgbmVhcgo7ICAgICAgICAgICAgICAgIHJldAo7bWF0Y2hfaW5pdCAgICAgIGVuZHAKRUxTRQo7X21hdGNoX2luaXQgICAgIHByb2MgbmVhcgo7ICAgICAgICAgICAgICAgIHJldAo7X21hdGNoX2luaXQgICAgIGVuZHAKRU5ESUYKCgpJRkRFRiBOT1VOREVSTElORQpsb25nZXN0X21hdGNoXzdmZmYgICBwcm9jIG5lYXIKRUxTRQpfbG9uZ2VzdF9tYXRjaF83ZmZmICBwcm9jIG5lYXIKRU5ESUYKCiAgICAgICAgbW92ICAgICBlZHgsW2VzcCs0XQoKCgogICAgICAgIHB1c2ggICAgZWJwCiAgICAgICAgcHVzaCAgICBlZGkKICAgICAgICBwdXNoICAgIGVzaQogICAgICAgIHB1c2ggICAgZWJ4CgogICAgICAgIHN1YiAgICAgZXNwLE5iU3RhY2tBZGQKCjsgaW5pdGlhbGl6ZSBvciBjaGVjayB0aGUgdmFyaWFibGVzIHVzZWQgaW4gbWF0Y2guYXNtLgogICAgICAgIG1vdiAgICAgZWJwLGVkeAoKOyBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoCjsgaWYgKHByZXZfbGVuZ3RoPj1nb29kX21hdGNoKSBjaGFpbl9sZW5ndGggPj49IDIKICAgICAgICBtb3YgICAgIGVkeCxbZWJwK2RlcF9jaGFpbl9sZW5ndGhdCiAgICAgICAgbW92ICAgICBlYngsW2VicCtkZXBfcHJldl9sZW5ndGhdCiAgICAgICAgY21wICAgICBbZWJwK2RlcF9nb29kX21hdGNoXSxlYngKICAgICAgICBqYSAgICAgIG5vc2hyCiAgICAgICAgc2hyICAgICBlZHgsMgpub3NocjoKOyB3ZSBpbmNyZW1lbnQgY2hhaW5fbGVuZ3RoIGJlY2F1c2UgaW4gdGhlIGFzbSwgdGhlIC0tY2hhaW5fbGVuZ2h0IGlzIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3AKICAgICAgICBpbmMgICAgIGVkeAogICAgICAgIG1vdiAgICAgZWRpLFtlYnArZGVwX25pY2VfbWF0Y2hdCiAgICAgICAgbW92ICAgICBjaGFpbl9sZW5ndGgsZWR4CiAgICAgICAgbW92ICAgICBlYXgsW2VicCtkZXBfbG9va2FoZWFkXQogICAgICAgIGNtcCAgICAgZWF4LGVkaQo7IGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwogICAgICAgIGphZSAgICAgbm9sb29rYWhlYWRuaWNlbWF0Y2gKICAgICAgICBtb3YgICAgIGVkaSxlYXgKbm9sb29rYWhlYWRuaWNlbWF0Y2g6CjsgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aAogICAgICAgIG1vdiAgICAgYmVzdF9sZW4sZWJ4Cgo7IHdpbmRvdyA9IHMtPndpbmRvdwogICAgICAgIG1vdiAgICAgZXNpLFtlYnArZGVwX3dpbmRvd10KICAgICAgICBtb3YgICAgIGVjeCxbZWJwK2RlcF9zdHJzdGFydF0KICAgICAgICBtb3YgICAgIHdpbmRvdyxlc2kKCiAgICAgICAgbW92ICAgICBuaWNlX21hdGNoLGVkaQo7IHNjYW4gPSB3aW5kb3cgKyBzdHJzdGFydAogICAgICAgIGFkZCAgICAgZXNpLGVjeAogICAgICAgIG1vdiAgICAgc2Nhbixlc2kKOyBkeCA9ICp3aW5kb3cKICAgICAgICBtb3YgICAgIGR4LHdvcmQgcHRyIFtlc2ldCjsgYnggPSAqKHdpbmRvdytiZXN0X2xlbi0xKQogICAgICAgIG1vdiAgICAgYngsd29yZCBwdHIgW2VzaStlYngtMV0KICAgICAgICBhZGQgICAgIGVzaSxNQVhfTUFUQ0gtMQo7IHNjYW5fc3RhcnQgPSAqc2NhbgogICAgICAgIG1vdiAgICAgc2Nhbl9zdGFydCxkeAo7IHN0cmVuZCA9IHNjYW4gKyBNQVhfTUFUQ0gtMQogICAgICAgIG1vdiAgICAgc3RyZW5kLGVzaQo7IGJ4ID0gc2Nhbl9lbmQgPSAqKHdpbmRvdytiZXN0X2xlbi0xKQoKOyAgICBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CjsgICAgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7CgogICAgICAgIG1vdiAgICAgZXNpLFtlYnArZGVwX3dfc2l6ZV0KICAgICAgICBzdWIgICAgIGVzaSxNSU5fTE9PS0FIRUFECjsgaGVyZSBlc2kgPSBNQVhfRElTVChzKQogICAgICAgIHN1YiAgICAgZWN4LGVzaQogICAgICAgIGphICAgICAgbm9kaXN0CiAgICAgICAgeG9yICAgICBlY3gsZWN4Cm5vZGlzdDoKICAgICAgICBtb3YgICAgIGxpbWl0LGVjeAoKOyBwcmV2ID0gcy0+cHJldgogICAgICAgIG1vdiAgICAgZWR4LFtlYnArZGVwX3ByZXZdCiAgICAgICAgbW92ICAgICBwcmV2LGVkeAoKOwogICAgICAgIG1vdiAgICAgZWR4LGR3b3JkIHB0ciBbZWJwK2RlcF9tYXRjaF9zdGFydF0KICAgICAgICBtb3YgICAgIGJwLHNjYW5fc3RhcnQKICAgICAgICBtb3YgICAgIGVheCxjdXJfbWF0Y2gKICAgICAgICBtb3YgICAgIG1hdGNoX3N0YXJ0LGVkeAoKICAgICAgICBtb3YgICAgIGVkeCx3aW5kb3cKICAgICAgICBtb3YgICAgIGVkaSxlZHgKICAgICAgICBhZGQgICAgIGVkaSxiZXN0X2xlbgogICAgICAgIG1vdiAgICAgZXNpLHByZXYKICAgICAgICBkZWMgICAgIGVkaQo7IHdpbmRvd2xlbiA9IHdpbmRvdyArIGJlc3RfbGVuIC0xCiAgICAgICAgbW92ICAgICB3aW5kb3dsZW4sZWRpCgogICAgICAgIGptcCAgICAgYmVnaW5sb29wMgogICAgICAgIGFsaWduICAgNAoKOyBoZXJlLCBpbiB0aGUgbG9vcAo7ICAgICAgIGVheCA9IGF4ID0gY3VyX21hdGNoCjsgICAgICAgZWN4ID0gbGltaXQKOyAgICAgICAgYnggPSBzY2FuX2VuZAo7ICAgICAgICBicCA9IHNjYW5fc3RhcnQKOyAgICAgICBlZGkgPSB3aW5kb3dsZW4gKHdpbmRvdyArIGJlc3RfbGVuIC0xKQo7ICAgICAgIGVzaSA9IHByZXYKCgo7Ly8gaGVyZTsgY2hhaW5fbGVuZ3RoIDw9MTYKbm9ybWFsYmVnMGFkZDE2OgogICAgICAgIGFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2CiAgICAgICAganogICAgICBleGl0bG9vcApub3JtYWxiZWcwOgogICAgICAgIGNtcCAgICAgd29yZCBwdHJbZWRpK2VheF0sYngKICAgICAgICBqZSAgICAgIG5vcm1hbGJlZzJub3JvbGwKcmNvbnRsYWJub3JvbGw6CjsgY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10KICAgICAgICBhbmQgICAgIGVheCw3ZmZmaAogICAgICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQo7IGlmIGN1cl9tYXRjaCA+IGxpbWl0LCBnbyB0byBleGl0bG9vcAogICAgICAgIGNtcCAgICAgZWN4LGVheAogICAgICAgIGpuYiAgICAgZXhpdGxvb3AKOyBpZiAtLWNoYWluX2xlbmd0aCAhPSAwLCBnbyB0byBleGl0bG9vcAogICAgICAgIGRlYyAgICAgY2hhaW5fbGVuZ3RoCiAgICAgICAgam56ICAgICBub3JtYWxiZWcwCiAgICAgICAgam1wICAgICBleGl0bG9vcAoKbm9ybWFsYmVnMm5vcm9sbDoKOyBpZiAoc2Nhbl9zdGFydD09KihjdXJfbWF0Y2grd2luZG93KSkgZ290byBub3JtYWxiZWcyCiAgICAgICAgY21wICAgICBicCx3b3JkIHB0cltlZHgrZWF4XQogICAgICAgIGpuZSAgICAgcmNvbnRsYWJub3JvbGwKICAgICAgICBqbXAgICAgIG5vcm1hbGJlZzIKCmNvbnRsb29wMzoKICAgICAgICBtb3YgICAgIGVkaSx3aW5kb3dsZW4KCjsgY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10KICAgICAgICBhbmQgICAgIGVheCw3ZmZmaAogICAgICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQo7IGlmIGN1cl9tYXRjaCA+IGxpbWl0LCBnbyB0byBleGl0bG9vcAogICAgICAgIGNtcCAgICAgZWN4LGVheApqbmJleGl0bG9vcHNob3J0MToKICAgICAgICBqbmIgICAgIGV4aXRsb29wCjsgaWYgLS1jaGFpbl9sZW5ndGggIT0gMCwgZ28gdG8gZXhpdGxvb3AKCgo7IGJlZ2luIHRoZSBtYWluIGxvb3AKYmVnaW5sb29wMjoKICAgICAgICBzdWIgICAgIGNoYWluX2xlbmd0aCwxNisxCjsgaWYgY2hhaW5fbGVuZ3RoIDw9MTYsIGRvbid0IHVzZSB0aGUgdW5yb2xsZWQgbG9vcAogICAgICAgIGpuYSAgICAgbm9ybWFsYmVnMGFkZDE2CgpkbzE2OgogICAgICAgIGNtcCAgICAgd29yZCBwdHJbZWRpK2VheF0sYngKICAgICAgICBqZSAgICAgIG5vcm1hbGJlZzJkYzAKCm1hY2NuICAgTUFDUk8gICBsYWIKICAgICAgICBhbmQgICAgIGVheCw3ZmZmaAogICAgICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQogICAgICAgIGNtcCAgICAgZWN4LGVheAogICAgICAgIGpuYiAgICAgZXhpdGxvb3AKICAgICAgICBjbXAgICAgIHdvcmQgcHRyW2VkaStlYXhdLGJ4CiAgICAgICAgamUgICAgICBsYWIKICAgICAgICBFTkRNCgpyY29udGxvb3AwOgogICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjMQoKcmNvbnRsb29wMToKICAgICAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzIKCnJjb250bG9vcDI6CiAgICAgICAgbWFjY24gICBub3JtYWxiZWcyZGMzCgpyY29udGxvb3AzOgogICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjNAoKcmNvbnRsb29wNDoKICAgICAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzUKCnJjb250bG9vcDU6CiAgICAgICAgbWFjY24gICBub3JtYWxiZWcyZGM2CgpyY29udGxvb3A2OgogICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjNwoKcmNvbnRsb29wNzoKICAgICAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzgKCnJjb250bG9vcDg6CiAgICAgICAgbWFjY24gICBub3JtYWxiZWcyZGM5CgpyY29udGxvb3A5OgogICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjMTAKCnJjb250bG9vcDEwOgogICAgICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTEKCnJjb250bG9vcDExOgogICAgICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTIKCnJjb250bG9vcDEyOgogICAgICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTMKCnJjb250bG9vcDEzOgogICAgICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTQKCnJjb250bG9vcDE0OgogICAgICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTUKCnJjb250bG9vcDE1OgogICAgICAgIGFuZCAgICAgZWF4LDdmZmZoCiAgICAgICAgbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdCiAgICAgICAgY21wICAgICBlY3gsZWF4CiAgICAgICAgam5iICAgICBleGl0bG9vcAoKICAgICAgICBzdWIgICAgIGNoYWluX2xlbmd0aCwxNgogICAgICAgIGphICAgICAgZG8xNgogICAgICAgIGptcCAgICAgbm9ybWFsYmVnMGFkZDE2Cgo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwoKbm9ybWJlZyBNQUNSTyAgIHJjb250bGFiLHZhbHN1Ygo7IGlmIHdlIGFyZSBoZXJlLCB3ZSBrbm93IHRoYXQgKihtYXRjaCtiZXN0X2xlbi0xKSA9PSBzY2FuX2VuZAogICAgICAgIGNtcCAgICAgYnAsd29yZCBwdHJbZWR4K2VheF0KOyBpZiAobWF0Y2ggIT0gc2Nhbl9zdGFydCkgZ290byByY29udGxhYgogICAgICAgIGpuZSAgICAgcmNvbnRsYWIKOyBjYWxjdWxhdGUgdGhlIGdvb2QgY2hhaW5fbGVuZ3RoLCBhbmQgd2UnbGwgY29tcGFyZSBzY2FuIGFuZCBtYXRjaCBzdHJpbmcKICAgICAgICBhZGQgICAgIGNoYWluX2xlbmd0aCwxNi12YWxzdWIKICAgICAgICBqbXAgICAgIGlzZXEKICAgICAgICBFTkRNCgoKbm9ybWFsYmVnMmRjMTE6CiAgICAgICAgbm9ybWJlZyByY29udGxvb3AxMSwxMQoKbm9ybWFsYmVnMmRjMTI6CiAgICAgICAgbm9ybWJlZyBzaG9ydCByY29udGxvb3AxMiwxMgoKbm9ybWFsYmVnMmRjMTM6CiAgICAgICAgbm9ybWJlZyBzaG9ydCByY29udGxvb3AxMywxMwoKbm9ybWFsYmVnMmRjMTQ6CiAgICAgICAgbm9ybWJlZyBzaG9ydCByY29udGxvb3AxNCwxNAoKbm9ybWFsYmVnMmRjMTU6CiAgICAgICAgbm9ybWJlZyBzaG9ydCByY29udGxvb3AxNSwxNQoKbm9ybWFsYmVnMmRjMTA6CiAgICAgICAgbm9ybWJlZyByY29udGxvb3AxMCwxMAoKbm9ybWFsYmVnMmRjOToKICAgICAgICBub3JtYmVnIHJjb250bG9vcDksOQoKbm9ybWFsYmVnMmRjODoKICAgICAgICBub3JtYmVnIHJjb250bG9vcDgsOAoKbm9ybWFsYmVnMmRjNzoKICAgICAgICBub3JtYmVnIHJjb250bG9vcDcsNwoKbm9ybWFsYmVnMmRjNjoKICAgICAgICBub3JtYmVnIHJjb250bG9vcDYsNgoKbm9ybWFsYmVnMmRjNToKICAgICAgICBub3JtYmVnIHJjb250bG9vcDUsNQoKbm9ybWFsYmVnMmRjNDoKICAgICAgICBub3JtYmVnIHJjb250bG9vcDQsNAoKbm9ybWFsYmVnMmRjMzoKICAgICAgICBub3JtYmVnIHJjb250bG9vcDMsMwoKbm9ybWFsYmVnMmRjMjoKICAgICAgICBub3JtYmVnIHJjb250bG9vcDIsMgoKbm9ybWFsYmVnMmRjMToKICAgICAgICBub3JtYmVnIHJjb250bG9vcDEsMQoKbm9ybWFsYmVnMmRjMDoKICAgICAgICBub3JtYmVnIHJjb250bG9vcDAsMAoKCjsgd2UgZ28gaW4gbm9ybWFsYmVnMiBiZWNhdXNlICoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kCgpub3JtYWxiZWcyOgogICAgICAgIG1vdiAgICAgZWRpLHdpbmRvdwoKICAgICAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkaStlYXhdCiAgICAgICAgam5lICAgICBjb250bG9vcDMgICAgICAgICAgICAgICAgICAgOyBpZiAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQsIGNvbnRpbnVlCgppc2VxOgo7IGlmIHdlIGFyZSBoZXJlLCB3ZSBrbm93IHRoYXQgKihtYXRjaCtiZXN0X2xlbi0xKSA9PSBzY2FuX2VuZAo7IGFuZCAobWF0Y2ggPT0gc2Nhbl9zdGFydCkKCiAgICAgICAgbW92ICAgICBlZGksZWR4CiAgICAgICAgbW92ICAgICBlc2ksc2NhbiAgICAgICAgICAgICAgICAgICAgOyBlc2kgPSBzY2FuCiAgICAgICAgYWRkICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICAgICAgOyBlZGkgPSB3aW5kb3cgKyBjdXJfbWF0Y2ggPSBtYXRjaAoKICAgICAgICBtb3YgICAgIGVkeCxbZXNpKzNdICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgbWFudWFsbHkgZHdvcmQgYXQgbWF0Y2grMwogICAgICAgIHhvciAgICAgZWR4LFtlZGkrM10gICAgICAgICAgICAgICAgIDsgYW5kIHNjYW4gKzMKCiAgICAgICAganogICAgICBiZWdpbmNvbXBhcmUgICAgICAgICAgICAgICAgOyBpZiBlcXVhbCwgZ28gdG8gbG9uZyBjb21wYXJlCgo7IHdlIHdpbGwgZGV0ZXJtaW5lIHRoZSB1bm1hdGNoIGJ5dGUgYW5kIGNhbGN1bGF0ZSBsZW4gKGluIGVzaSkKICAgICAgICBvciAgICAgIGRsLGRsCiAgICAgICAgamUgICAgICBlcTFycgogICAgICAgIG1vdiAgICAgZXNpLDMKICAgICAgICBqbXAgICAgIHRyZmludmFsCmVxMXJyOgogICAgICAgIG9yICAgICAgZHgsZHgKICAgICAgICBqZSAgICAgIGVxMQoKICAgICAgICBtb3YgICAgIGVzaSw0CiAgICAgICAgam1wICAgICB0cmZpbnZhbAplcTE6CiAgICAgICAgYW5kICAgICBlZHgsMGZmZmZmZmgKICAgICAgICBqeiAgICAgIGVxMTEKICAgICAgICBtb3YgICAgIGVzaSw1CiAgICAgICAgam1wICAgICB0cmZpbnZhbAplcTExOgogICAgICAgIG1vdiAgICAgZXNpLDYKICAgICAgICBqbXAgICAgIHRyZmludmFsCgpiZWdpbmNvbXBhcmU6CiAgICAgICAgOyBoZXJlIHdlIG5vdyBzY2FuIGFuZCBtYXRjaCBiZWdpbiBzYW1lCiAgICAgICAgYWRkICAgICBlZGksNgogICAgICAgIGFkZCAgICAgZXNpLDYKICAgICAgICBtb3YgICAgIGVjeCwoTUFYX01BVENILSgyKzQpKS80ICAgICA7IHNjYW4gZm9yIGF0IG1vc3QgTUFYX01BVENIIGJ5dGVzCiAgICAgICAgcmVwZSAgICBjbXBzZCAgICAgICAgICAgICAgICAgICAgICAgOyBsb29wIHVudGlsIG1pc21hdGNoCgogICAgICAgIGplICAgICAgdHJmaW4gICAgICAgICAgICAgICAgICAgICAgIDsgZ28gdG8gdHJmaW4gaWYgbm90IHVubWF0Y2gKOyB3ZSBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZQogICAgICAgIHN1YiAgICAgZXNpLDQKICAgICAgICBtb3YgICAgIGVkeCxbZWRpLTRdCiAgICAgICAgeG9yICAgICBlZHgsW2VzaV0KCiAgICAgICAgb3IgICAgICBkbCxkbAogICAgICAgIGpueiAgICAgdHJmaW4KICAgICAgICBpbmMgICAgIGVzaQoKICAgICAgICBvciAgICAgIGR4LGR4CiAgICAgICAgam56ICAgICB0cmZpbgogICAgICAgIGluYyAgICAgZXNpCgogICAgICAgIGFuZCAgICAgZWR4LDBmZmZmZmZoCiAgICAgICAgam56ICAgICB0cmZpbgogICAgICAgIGluYyAgICAgZXNpCgp0cmZpbjoKICAgICAgICBzdWIgICAgIGVzaSxzY2FuICAgICAgICAgIDsgZXNpID0gbGVuCnRyZmludmFsOgo7IGhlcmUgd2UgaGF2ZSBmaW5pc2VkIGNvbXBhcmUsIGFuZCBlc2kgY29udGFpbiBsZW4gb2YgZXF1YWwgc3RyaW5nCiAgICAgICAgY21wICAgICBlc2ksYmVzdF9sZW4gICAgICAgIDsgaWYgbGVuID4gYmVzdF9sZW4sIGdvIG5ld2Jlc3RsZW4KICAgICAgICBqYSAgICAgIHNob3J0IG5ld2Jlc3RsZW4KOyBub3cgd2UgcmVzdG9yZSBlZHgsIGVjeCBhbmQgZXNpLCBmb3IgdGhlIGJpZyBsb29wCiAgICAgICAgbW92ICAgICBlc2kscHJldgogICAgICAgIG1vdiAgICAgZWN4LGxpbWl0CiAgICAgICAgbW92ICAgICBlZHgsd2luZG93CiAgICAgICAgam1wICAgICBjb250bG9vcDMKCm5ld2Jlc3RsZW46CiAgICAgICAgbW92ICAgICBiZXN0X2xlbixlc2kgICAgICAgIDsgbGVuIGJlY29tZSBiZXN0X2xlbgoKICAgICAgICBtb3YgICAgIG1hdGNoX3N0YXJ0LGVheCAgICAgOyBzYXZlIG5ldyBwb3NpdGlvbiBhcyBtYXRjaF9zdGFydAogICAgICAgIGNtcCAgICAgZXNpLG5pY2VfbWF0Y2ggICAgICA7IGlmIGJlc3RfbGVuID49IG5pY2VfbWF0Y2gsIGV4aXQKICAgICAgICBqYWUgICAgIGV4aXRsb29wCiAgICAgICAgbW92ICAgICBlY3gsc2NhbgogICAgICAgIG1vdiAgICAgZWR4LHdpbmRvdyAgICAgICAgICA7IHJlc3RvcmUgZWR4PXdpbmRvdwogICAgICAgIGFkZCAgICAgZWN4LGVzaQogICAgICAgIGFkZCAgICAgZXNpLGVkeAoKICAgICAgICBkZWMgICAgIGVzaQogICAgICAgIG1vdiAgICAgd2luZG93bGVuLGVzaSAgICAgICA7IHdpbmRvd2xlbiA9IHdpbmRvdyArIGJlc3RfbGVuLTEKICAgICAgICBtb3YgICAgIGJ4LFtlY3gtMV0gICAgICAgICAgOyBieCA9ICooc2NhbitiZXN0X2xlbi0xKSA9IHNjYW5fZW5kCgo7IG5vdyB3ZSByZXN0b3JlIGVjeCBhbmQgZXNpLCBmb3IgdGhlIGJpZyBsb29wIDoKICAgICAgICBtb3YgICAgIGVzaSxwcmV2CiAgICAgICAgbW92ICAgICBlY3gsbGltaXQKICAgICAgICBqbXAgICAgIGNvbnRsb29wMwoKZXhpdGxvb3A6CjsgZXhpdCA6IHMtPm1hdGNoX3N0YXJ0PW1hdGNoX3N0YXJ0CiAgICAgICAgbW92ICAgICBlYngsbWF0Y2hfc3RhcnQKICAgICAgICBtb3YgICAgIGVicCxzdHJfcwogICAgICAgIG1vdiAgICAgZWN4LGJlc3RfbGVuCiAgICAgICAgbW92ICAgICBkd29yZCBwdHIgW2VicCtkZXBfbWF0Y2hfc3RhcnRdLGVieCAgICAgICAgCiAgICAgICAgbW92ICAgICBlYXgsZHdvcmQgcHRyIFtlYnArZGVwX2xvb2thaGVhZF0KICAgICAgICBjbXAgICAgIGVjeCxlYXgKICAgICAgICBqYSAgICAgIG1pbmV4bG8KICAgICAgICBtb3YgICAgIGVheCxlY3gKbWluZXhsbzoKOyByZXR1cm4gbWluKGJlc3RfbGVuLHMtPmxvb2thaGVhZCkKICAgICAgICAKOyByZXN0b3JlIHN0YWNrIGFuZCByZWdpc3RlciBlYngsZXNpLGVkaSxlYnAKICAgICAgICBhZGQgICAgIGVzcCxOYlN0YWNrQWRkCgogICAgICAgIHBvcCAgICAgZWJ4CiAgICAgICAgcG9wICAgICBlc2kKICAgICAgICBwb3AgICAgIGVkaQogICAgICAgIHBvcCAgICAgZWJwCiAgICAgICAgcmV0CkluZm9BdXRob3I6CjsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhCjsgWW91ciBhcmUgZnJlZSB1c2UgZ3ZtYXQzMiBpbiBhbnkgZnJlIG9yIGNvbW1lcmNpYWwgYXBwcyBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSEKICAgICAgICBkYiAgICAgMGRoLDBhaCwiR1ZNYXQzMiBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSB3cml0dGVuIDE5OTYtOTggYnkgR2lsbGVzIFZvbGxhbnQiLDBkaCwwYWgKCgoKSUZERUYgTk9VTkRFUkxJTkUKbG9uZ2VzdF9tYXRjaF83ZmZmICAgZW5kcApFTFNFCl9sb25nZXN0X21hdGNoXzdmZmYgIGVuZHAKRU5ESUYKCgpJRkRFRiBOT1VOREVSTElORQpjcHVkZXRlY3QzMiAgICAgcHJvYyBuZWFyCkVMU0UKX2NwdWRldGVjdDMyICAgIHByb2MgbmVhcgpFTkRJRgoKCglwdXNoZmQgICAgICAgICAgICAgICAgICA7IHB1c2ggb3JpZ2luYWwgRUZMQUdTCglwb3AgICAgIGVheCAgICAgICAgICAgICA7IGdldCBvcmlnaW5hbCBFRkxBR1MKCW1vdiAgICAgZWN4LCBlYXggICAgICAgIDsgc2F2ZSBvcmlnaW5hbCBFRkxBR1MKCXhvciAgICAgZWF4LCA0MDAwMGggICAgIDsgZmxpcCBBQyBiaXQgaW4gRUZMQUdTCglwdXNoICAgIGVheCAgICAgICAgICAgICA7IHNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbiBzdGFjawoJcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlCglwdXNoZmQgICAgICAgICAgICAgICAgICA7IGdldCBuZXcgRUZMQUdTCglwb3AgICAgIGVheCAgICAgICAgICAgICA7IHN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYCgl4b3IgICAgIGVheCwgZWN4ICAgICAgICA7IGNhbpJ0IHRvZ2dsZSBBQyBiaXQsIHByb2Nlc3Nvcj04MDM4NgoJanogICAgICBlbmRfY3B1X2lzXzM4NiAgOyBqdW1wIGlmIDgwMzg2IHByb2Nlc3NvcgoJcHVzaCAgICBlY3gKCXBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBBQyBiaXQgaW4gRUZMQUdTIGZpcnN0CgoJcHVzaGZkCglwdXNoZmQKCXBvcCAgICAgZWN4CgkJCQoJbW92ICAgICBlYXgsIGVjeCAgICAgICAgOyBnZXQgb3JpZ2luYWwgRUZMQUdTCgl4b3IgICAgIGVheCwgMjAwMDAwaCAgICA7IGZsaXAgSUQgYml0IGluIEVGTEFHUwoJcHVzaCAgICBlYXggICAgICAgICAgICAgOyBzYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sKCXBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQoJcHVzaGZkICAgICAgICAgICAgICAgICAgOyBnZXQgbmV3IEVGTEFHUwoJcG9wCQllYXgJICAgICAgICAgICAgOyBzdG9yZSBuZXcgRUZMQUdTIGluIEVBWAoJcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIG9yaWdpbmFsIEVGTEFHUwoJeG9yCQllYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgSUQgYml0LAoJamUJCWlzX29sZF80ODYJCTsgcHJvY2Vzc29yPW9sZAoKCW1vdiAgICAgZWF4LDEKCWRiICAgICAgMGZoLDBhMmggICAgICAgIDtDUFVJRCAgIAoKZXhpdGNwdWRldGVjdDoKCXJldAoKZW5kX2NwdV9pc18zODY6Cgltb3YgICAgIGVheCwwMzAwaAoJam1wICAgICBleGl0Y3B1ZGV0ZWN0Cgppc19vbGRfNDg2OgoJbW92ICAgICBlYXgsMDQwMGgKCWptcCAgICAgZXhpdGNwdWRldGVjdAoKSUZERUYgTk9VTkRFUkxJTkUKY3B1ZGV0ZWN0MzIgICAgIGVuZHAKRUxTRQpfY3B1ZGV0ZWN0MzIgICAgZW5kcApFTkRJRgoKX1RFWFQgICBlbmRzCmVuZAo=