Owo7IGd2bWF0MzIuYXNtIC0tIEFzbSBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODYKOyBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBHaWxsZXMgVm9sbGFudC4KOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gKOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYwo7IEl0IG5lZWQgd21hc2sgPT0gMHg3ZmZmCjsgICAgIChhc3NlbWJseSBjb2RlIGlzIGZhc3RlciB3aXRoIGEgZml4ZWQgd21hc2spCjsKOyBGb3IgVmlzdWFsIEMrKyA0LjIgYW5kIE1MIDYuMTFjICh2ZXJzaW9uIGluIGRpcmVjdG9yeSBcTUFTTTYxMUMgb2YgV2luOTUgRERLKQo7ICAgSSBjb21waWxlIHdpdGggOiAibWwgL2NvZmYgL1ppIC9jIGd2bWF0MzIuYXNtIgo7Cgo7dUludCBsb25nZXN0X21hdGNoXzdmZmYocywgY3VyX21hdGNoKQo7ICAgIGRlZmxhdGVfc3RhdGUgKnM7CjsgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovCgoJTmJTdGFjayAgICAgICAgIGVxdSAgICAgNzYKCWN1cl9tYXRjaCAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0wXQoJc3RyX3MgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTRdCjsgNSBkd29yZCBvbiB0b3AgKHJldCxlYnAsZXNpLGVkaSxlYngpCglhZHJyZXQgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stOF0KCXB1c2hlYnAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0xMl0KCXB1c2hlZGkgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0xNl0KCXB1c2hlc2kgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0yMF0KCXB1c2hlYnggICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0yNF0KCgljaGFpbl9sZW5ndGggICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTI4XQoJbGltaXQgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay0zMl0KCWJlc3RfbGVuICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzZdCgl3aW5kb3cgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQwXQoJcHJldiAgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay00NF0KCXNjYW5fc3RhcnQgICAgICBlcXUgICAgICB3b3JkIHB0ciBbZXNwK05iU3RhY2stNDhdCgl3bWFzayAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTUyXQoJbWF0Y2hfc3RhcnRfcHRyIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay01Nl0KCW5pY2VfbWF0Y2ggICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjBdCglzY2FuICAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTY0XQoKCXdpbmRvd2xlbiAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjhdCgltYXRjaF9zdGFydCAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTcyXQoJc3RyZW5kICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay03Nl0KCU5iU3RhY2tBZGQgICAgICBlcXUgICAgIChOYlN0YWNrLTI0KQoKICAgIC4zODZwCgogICAgbmFtZSAgICBndm1hdGNoCiAgICAuTU9ERUwgIEZMQVQKCgoKOyAgYWxsIHRoZSArNCBvZmZzZXRzIGFyZSBkdWUgdG8gdGhlIGFkZGl0aW9uIG9mIHBlbmRpbmdfYnVmX3NpemUgKGluIHpsaWIKOyAgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIHNpbmNlIHRoZSBhc20gY29kZSB3YXMgZmlyc3Qgd3JpdHRlbgo7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCByZW1vdmUgdGhlICs0KS4KOyAgTm90ZSA6IHRoZXNlIHZhbHVlIGFyZSBnb29kIHdpdGggYSA4IGJ5dGVzIGJvdW5kYXJ5IHBhY2sgc3RydWN0dXJlCiAgICBkZXBfY2hhaW5fbGVuZ3RoICAgIGVxdSAgICAgNzBoKzQKICAgIGRlcF93aW5kb3cgICAgICAgICAgZXF1ICAgICAyY2grNAogICAgZGVwX3N0cnN0YXJ0ICAgICAgICBlcXUgICAgIDYwaCs0CiAgICBkZXBfcHJldl9sZW5ndGggICAgIGVxdSAgICAgNmNoKzQKICAgIGRlcF9uaWNlX21hdGNoICAgICAgZXF1ICAgICA4NGgrNAogICAgZGVwX3dfc2l6ZSAgICAgICAgICBlcXUgICAgIDIwaCs0CiAgICBkZXBfcHJldiAgICAgICAgICAgIGVxdSAgICAgMzRoKzQKICAgIGRlcF93X21hc2sgICAgICAgICAgZXF1ICAgICAyOGgrNAogICAgZGVwX2dvb2RfbWF0Y2ggICAgICBlcXUgICAgIDgwaCs0CiAgICBkZXBfbWF0Y2hfc3RhcnQgICAgIGVxdSAgICAgNjRoKzQKICAgIGRlcF9sb29rYWhlYWQgICAgICAgZXF1ICAgICA2OGgrNAoKCl9URVhUICAgICAgICAgICAgICAgICAgIHNlZ21lbnQKCklGREVGIE5PVU5ERVJMSU5FCgkJCXB1YmxpYyAgbG9uZ2VzdF9tYXRjaF83ZmZmCgkJCXB1YmxpYyAgbG9uZ2VzdF9tYXRjaF82ODYKOyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgbWF0Y2hfaW5pdApFTFNFCgkJCXB1YmxpYyAgX2xvbmdlc3RfbWF0Y2hfN2ZmZgoJCQlwdWJsaWMgIF9sb25nZXN0X21hdGNoXzY4Ngo7ICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBfbWF0Y2hfaW5pdApFTkRJRgoKICAgIE1BWF9NQVRDSCAgICAgICAgICAgZXF1ICAgICAyNTgKICAgIE1JTl9NQVRDSCAgICAgICAgICAgZXF1ICAgICAzCiAgICBNSU5fTE9PS0FIRUFEICAgICAgIGVxdSAgICAgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkKCgoKSUZERUYgTk9VTkRFUkxJTkUKO21hdGNoX2luaXQgICAgICBwcm9jIG5lYXIKOyAgICAgICAgICAgICAgICByZXQKO21hdGNoX2luaXQgICAgICBlbmRwCkVMU0UKO19tYXRjaF9pbml0ICAgICBwcm9jIG5lYXIKOyAgICAgICAgICAgICAgICByZXQKO19tYXRjaF9pbml0ICAgICBlbmRwCkVORElGCgoKSUZERUYgTk9VTkRFUkxJTkUKbG9uZ2VzdF9tYXRjaF83ZmZmICAgcHJvYyBuZWFyCkVMU0UKX2xvbmdlc3RfbWF0Y2hfN2ZmZiAgcHJvYyBuZWFyCkVORElGCgoJbW92ICAgICBlZHgsW2VzcCs0XQoKCgoJcHVzaCAgICBlYnAKCXB1c2ggICAgZWRpCglwdXNoICAgIGVzaQoJcHVzaCAgICBlYngKCglzdWIgICAgIGVzcCxOYlN0YWNrQWRkCgo7IGluaXRpYWxpemUgb3IgY2hlY2sgdGhlIHZhcmlhYmxlcyB1c2VkIGluIG1hdGNoLmFzbS4KCW1vdiAgICAgZWJwLGVkeAoKOyBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoCjsgaWYgKHByZXZfbGVuZ3RoPj1nb29kX21hdGNoKSBjaGFpbl9sZW5ndGggPj49IDIKCW1vdiAgICAgZWR4LFtlYnArZGVwX2NoYWluX2xlbmd0aF0KCW1vdiAgICAgZWJ4LFtlYnArZGVwX3ByZXZfbGVuZ3RoXQoJY21wICAgICBbZWJwK2RlcF9nb29kX21hdGNoXSxlYngKCWphICAgICAgbm9zaHIKCXNociAgICAgZWR4LDIKbm9zaHI6Cjsgd2UgaW5jcmVtZW50IGNoYWluX2xlbmd0aCBiZWNhdXNlIGluIHRoZSBhc20sIHRoZSAtLWNoYWluX2xlbmdodCBpcyBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb29wCglpbmMgICAgIGVkeAoJbW92ICAgICBlZGksW2VicCtkZXBfbmljZV9tYXRjaF0KCW1vdiAgICAgY2hhaW5fbGVuZ3RoLGVkeAoJbW92ICAgICBlYXgsW2VicCtkZXBfbG9va2FoZWFkXQoJY21wICAgICBlYXgsZWRpCjsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7CglqYWUgICAgIG5vbG9va2FoZWFkbmljZW1hdGNoCgltb3YgICAgIGVkaSxlYXgKbm9sb29rYWhlYWRuaWNlbWF0Y2g6CjsgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aAoJbW92ICAgICBiZXN0X2xlbixlYngKCjsgd2luZG93ID0gcy0+d2luZG93Cgltb3YgICAgIGVzaSxbZWJwK2RlcF93aW5kb3ddCgltb3YgICAgIGVjeCxbZWJwK2RlcF9zdHJzdGFydF0KCW1vdiAgICAgd2luZG93LGVzaQoKCW1vdiAgICAgbmljZV9tYXRjaCxlZGkKOyBzY2FuID0gd2luZG93ICsgc3Ryc3RhcnQKCWFkZCAgICAgZXNpLGVjeAoJbW92ICAgICBzY2FuLGVzaQo7IGR4ID0gKndpbmRvdwoJbW92ICAgICBkeCx3b3JkIHB0ciBbZXNpXQo7IGJ4ID0gKih3aW5kb3crYmVzdF9sZW4tMSkKCW1vdiAgICAgYngsd29yZCBwdHIgW2VzaStlYngtMV0KCWFkZCAgICAgZXNpLE1BWF9NQVRDSC0xCjsgc2Nhbl9zdGFydCA9ICpzY2FuCgltb3YgICAgIHNjYW5fc3RhcnQsZHgKOyBzdHJlbmQgPSBzY2FuICsgTUFYX01BVENILTEKCW1vdiAgICAgc3RyZW5kLGVzaQo7IGJ4ID0gc2Nhbl9lbmQgPSAqKHdpbmRvdytiZXN0X2xlbi0xKQoKOyAgICBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CjsgICAgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7CgoJbW92ICAgICBlc2ksW2VicCtkZXBfd19zaXplXQoJc3ViICAgICBlc2ksTUlOX0xPT0tBSEVBRAo7IGhlcmUgZXNpID0gTUFYX0RJU1QocykKCXN1YiAgICAgZWN4LGVzaQoJamEgICAgICBub2Rpc3QKCXhvciAgICAgZWN4LGVjeApub2Rpc3Q6Cgltb3YgICAgIGxpbWl0LGVjeAoKOyBwcmV2ID0gcy0+cHJldgoJbW92ICAgICBlZHgsW2VicCtkZXBfcHJldl0KCW1vdiAgICAgcHJldixlZHgKCjsKCW1vdiAgICAgZWR4LGR3b3JkIHB0ciBbZWJwK2RlcF9tYXRjaF9zdGFydF0KCW1vdiAgICAgYnAsc2Nhbl9zdGFydAoJbW92ICAgICBlYXgsY3VyX21hdGNoCgltb3YgICAgIG1hdGNoX3N0YXJ0LGVkeAoKCW1vdiAgICAgZWR4LHdpbmRvdwoJbW92ICAgICBlZGksZWR4CglhZGQgICAgIGVkaSxiZXN0X2xlbgoJbW92ICAgICBlc2kscHJldgoJZGVjICAgICBlZGkKOyB3aW5kb3dsZW4gPSB3aW5kb3cgKyBiZXN0X2xlbiAtMQoJbW92ICAgICB3aW5kb3dsZW4sZWRpCgoJam1wICAgICBiZWdpbmxvb3AyCglhbGlnbiAgIDQKCjsgaGVyZSwgaW4gdGhlIGxvb3AKOyAgICAgICBlYXggPSBheCA9IGN1cl9tYXRjaAo7ICAgICAgIGVjeCA9IGxpbWl0CjsgICAgICAgIGJ4ID0gc2Nhbl9lbmQKOyAgICAgICAgYnAgPSBzY2FuX3N0YXJ0CjsgICAgICAgZWRpID0gd2luZG93bGVuICh3aW5kb3cgKyBiZXN0X2xlbiAtMSkKOyAgICAgICBlc2kgPSBwcmV2CgoKOy8vIGhlcmU7IGNoYWluX2xlbmd0aCA8PTE2Cm5vcm1hbGJlZzBhZGQxNjoKCWFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2CglqeiAgICAgIGV4aXRsb29wCm5vcm1hbGJlZzA6CgljbXAgICAgIHdvcmQgcHRyW2VkaStlYXhdLGJ4CglqZSAgICAgIG5vcm1hbGJlZzJub3JvbGwKcmNvbnRsYWJub3JvbGw6CjsgY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10KCWFuZCAgICAgZWF4LDdmZmZoCgltb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0KOyBpZiBjdXJfbWF0Y2ggPiBsaW1pdCwgZ28gdG8gZXhpdGxvb3AKCWNtcCAgICAgZWN4LGVheAoJam5iICAgICBleGl0bG9vcAo7IGlmIC0tY2hhaW5fbGVuZ3RoICE9IDAsIGdvIHRvIGV4aXRsb29wCglkZWMgICAgIGNoYWluX2xlbmd0aAoJam56ICAgICBub3JtYWxiZWcwCglqbXAgICAgIGV4aXRsb29wCgpub3JtYWxiZWcybm9yb2xsOgo7IGlmIChzY2FuX3N0YXJ0PT0qKGN1cl9tYXRjaCt3aW5kb3cpKSBnb3RvIG5vcm1hbGJlZzIKCWNtcCAgICAgYnAsd29yZCBwdHJbZWR4K2VheF0KCWpuZSAgICAgcmNvbnRsYWJub3JvbGwKCWptcCAgICAgbm9ybWFsYmVnMgoKY29udGxvb3AzOgoJbW92ICAgICBlZGksd2luZG93bGVuCgo7IGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdCglhbmQgICAgIGVheCw3ZmZmaAoJbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdCjsgaWYgY3VyX21hdGNoID4gbGltaXQsIGdvIHRvIGV4aXRsb29wCgljbXAgICAgIGVjeCxlYXgKam5iZXhpdGxvb3BzaG9ydDE6CglqbmIgICAgIGV4aXRsb29wCjsgaWYgLS1jaGFpbl9sZW5ndGggIT0gMCwgZ28gdG8gZXhpdGxvb3AKCgo7IGJlZ2luIHRoZSBtYWluIGxvb3AKYmVnaW5sb29wMjoKCXN1YiAgICAgY2hhaW5fbGVuZ3RoLDE2KzEKOyBpZiBjaGFpbl9sZW5ndGggPD0xNiwgZG9uJ3QgdXNlIHRoZSB1bnJvbGxlZCBsb29wCglqbmEgICAgIG5vcm1hbGJlZzBhZGQxNgoKZG8xNjoKCWNtcCAgICAgd29yZCBwdHJbZWRpK2VheF0sYngKCWplICAgICAgbm9ybWFsYmVnMmRjMAoKbWFjY24gICBNQUNSTyAgIGxhYgoJYW5kICAgICBlYXgsN2ZmZmgKCW1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQoJY21wICAgICBlY3gsZWF4CglqbmIgICAgIGV4aXRsb29wCgljbXAgICAgIHdvcmQgcHRyW2VkaStlYXhdLGJ4CglqZSAgICAgIGxhYgoJRU5ETQoKcmNvbnRsb29wMDoKCW1hY2NuICAgbm9ybWFsYmVnMmRjMQoKcmNvbnRsb29wMToKCW1hY2NuICAgbm9ybWFsYmVnMmRjMgoKcmNvbnRsb29wMjoKCW1hY2NuICAgbm9ybWFsYmVnMmRjMwoKcmNvbnRsb29wMzoKCW1hY2NuICAgbm9ybWFsYmVnMmRjNAoKcmNvbnRsb29wNDoKCW1hY2NuICAgbm9ybWFsYmVnMmRjNQoKcmNvbnRsb29wNToKCW1hY2NuICAgbm9ybWFsYmVnMmRjNgoKcmNvbnRsb29wNjoKCW1hY2NuICAgbm9ybWFsYmVnMmRjNwoKcmNvbnRsb29wNzoKCW1hY2NuICAgbm9ybWFsYmVnMmRjOAoKcmNvbnRsb29wODoKCW1hY2NuICAgbm9ybWFsYmVnMmRjOQoKcmNvbnRsb29wOToKCW1hY2NuICAgbm9ybWFsYmVnMmRjMTAKCnJjb250bG9vcDEwOgoJbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxMQoKcmNvbnRsb29wMTE6CgltYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzEyCgpyY29udGxvb3AxMjoKCW1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTMKCnJjb250bG9vcDEzOgoJbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxNAoKcmNvbnRsb29wMTQ6CgltYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzE1CgpyY29udGxvb3AxNToKCWFuZCAgICAgZWF4LDdmZmZoCgltb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0KCWNtcCAgICAgZWN4LGVheAoJam5iICAgICBleGl0bG9vcAoKCXN1YiAgICAgY2hhaW5fbGVuZ3RoLDE2CglqYSAgICAgIGRvMTYKCWptcCAgICAgbm9ybWFsYmVnMGFkZDE2Cgo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwoKbm9ybWJlZyBNQUNSTyAgIHJjb250bGFiLHZhbHN1Ygo7IGlmIHdlIGFyZSBoZXJlLCB3ZSBrbm93IHRoYXQgKihtYXRjaCtiZXN0X2xlbi0xKSA9PSBzY2FuX2VuZAoJY21wICAgICBicCx3b3JkIHB0cltlZHgrZWF4XQo7IGlmIChtYXRjaCAhPSBzY2FuX3N0YXJ0KSBnb3RvIHJjb250bGFiCglqbmUgICAgIHJjb250bGFiCjsgY2FsY3VsYXRlIHRoZSBnb29kIGNoYWluX2xlbmd0aCwgYW5kIHdlJ2xsIGNvbXBhcmUgc2NhbiBhbmQgbWF0Y2ggc3RyaW5nCglhZGQgICAgIGNoYWluX2xlbmd0aCwxNi12YWxzdWIKCWptcCAgICAgaXNlcQoJRU5ETQoKCm5vcm1hbGJlZzJkYzExOgoJbm9ybWJlZyByY29udGxvb3AxMSwxMQoKbm9ybWFsYmVnMmRjMTI6Cglub3JtYmVnIHNob3J0IHJjb250bG9vcDEyLDEyCgpub3JtYWxiZWcyZGMxMzoKCW5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTMsMTMKCm5vcm1hbGJlZzJkYzE0OgoJbm9ybWJlZyBzaG9ydCByY29udGxvb3AxNCwxNAoKbm9ybWFsYmVnMmRjMTU6Cglub3JtYmVnIHNob3J0IHJjb250bG9vcDE1LDE1Cgpub3JtYWxiZWcyZGMxMDoKCW5vcm1iZWcgcmNvbnRsb29wMTAsMTAKCm5vcm1hbGJlZzJkYzk6Cglub3JtYmVnIHJjb250bG9vcDksOQoKbm9ybWFsYmVnMmRjODoKCW5vcm1iZWcgcmNvbnRsb29wOCw4Cgpub3JtYWxiZWcyZGM3OgoJbm9ybWJlZyByY29udGxvb3A3LDcKCm5vcm1hbGJlZzJkYzY6Cglub3JtYmVnIHJjb250bG9vcDYsNgoKbm9ybWFsYmVnMmRjNToKCW5vcm1iZWcgcmNvbnRsb29wNSw1Cgpub3JtYWxiZWcyZGM0OgoJbm9ybWJlZyByY29udGxvb3A0LDQKCm5vcm1hbGJlZzJkYzM6Cglub3JtYmVnIHJjb250bG9vcDMsMwoKbm9ybWFsYmVnMmRjMjoKCW5vcm1iZWcgcmNvbnRsb29wMiwyCgpub3JtYWxiZWcyZGMxOgoJbm9ybWJlZyByY29udGxvb3AxLDEKCm5vcm1hbGJlZzJkYzA6Cglub3JtYmVnIHJjb250bG9vcDAsMAoKCjsgd2UgZ28gaW4gbm9ybWFsYmVnMiBiZWNhdXNlICoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kCgpub3JtYWxiZWcyOgoJbW92ICAgICBlZGksd2luZG93CgoJY21wICAgICBicCx3b3JkIHB0cltlZGkrZWF4XQoJam5lICAgICBjb250bG9vcDMgICAgICAgICAgICAgICAgICAgOyBpZiAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQsIGNvbnRpbnVlCgppc2VxOgo7IGlmIHdlIGFyZSBoZXJlLCB3ZSBrbm93IHRoYXQgKihtYXRjaCtiZXN0X2xlbi0xKSA9PSBzY2FuX2VuZAo7IGFuZCAobWF0Y2ggPT0gc2Nhbl9zdGFydCkKCgltb3YgICAgIGVkaSxlZHgKCW1vdiAgICAgZXNpLHNjYW4gICAgICAgICAgICAgICAgICAgIDsgZXNpID0gc2NhbgoJYWRkICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICAgICAgOyBlZGkgPSB3aW5kb3cgKyBjdXJfbWF0Y2ggPSBtYXRjaAoKCW1vdiAgICAgZWR4LFtlc2krM10gICAgICAgICAgICAgICAgIDsgY29tcGFyZSBtYW51YWxseSBkd29yZCBhdCBtYXRjaCszCgl4b3IgICAgIGVkeCxbZWRpKzNdICAgICAgICAgICAgICAgICA7IGFuZCBzY2FuICszCgoJanogICAgICBiZWdpbmNvbXBhcmUgICAgICAgICAgICAgICAgOyBpZiBlcXVhbCwgZ28gdG8gbG9uZyBjb21wYXJlCgo7IHdlIHdpbGwgZGV0ZXJtaW5lIHRoZSB1bm1hdGNoIGJ5dGUgYW5kIGNhbGN1bGF0ZSBsZW4gKGluIGVzaSkKCW9yICAgICAgZGwsZGwKCWplICAgICAgZXExcnIKCW1vdiAgICAgZXNpLDMKCWptcCAgICAgdHJmaW52YWwKZXExcnI6CglvciAgICAgIGR4LGR4CglqZSAgICAgIGVxMQoKCW1vdiAgICAgZXNpLDQKCWptcCAgICAgdHJmaW52YWwKZXExOgoJYW5kICAgICBlZHgsMGZmZmZmZmgKCWp6ICAgICAgZXExMQoJbW92ICAgICBlc2ksNQoJam1wICAgICB0cmZpbnZhbAplcTExOgoJbW92ICAgICBlc2ksNgoJam1wICAgICB0cmZpbnZhbAoKYmVnaW5jb21wYXJlOgoJOyBoZXJlIHdlIG5vdyBzY2FuIGFuZCBtYXRjaCBiZWdpbiBzYW1lCglhZGQgICAgIGVkaSw2CglhZGQgICAgIGVzaSw2Cgltb3YgICAgIGVjeCwoTUFYX01BVENILSgyKzQpKS80ICAgICA7IHNjYW4gZm9yIGF0IG1vc3QgTUFYX01BVENIIGJ5dGVzCglyZXBlICAgIGNtcHNkICAgICAgICAgICAgICAgICAgICAgICA7IGxvb3AgdW50aWwgbWlzbWF0Y2gKCglqZSAgICAgIHRyZmluICAgICAgICAgICAgICAgICAgICAgICA7IGdvIHRvIHRyZmluIGlmIG5vdCB1bm1hdGNoCjsgd2UgZGV0ZXJtaW5lIHRoZSB1bm1hdGNoIGJ5dGUKCXN1YiAgICAgZXNpLDQKCW1vdiAgICAgZWR4LFtlZGktNF0KCXhvciAgICAgZWR4LFtlc2ldCgoJb3IgICAgICBkbCxkbAoJam56ICAgICB0cmZpbgoJaW5jICAgICBlc2kKCglvciAgICAgIGR4LGR4CglqbnogICAgIHRyZmluCglpbmMgICAgIGVzaQoKCWFuZCAgICAgZWR4LDBmZmZmZmZoCglqbnogICAgIHRyZmluCglpbmMgICAgIGVzaQoKdHJmaW46CglzdWIgICAgIGVzaSxzY2FuICAgICAgICAgIDsgZXNpID0gbGVuCnRyZmludmFsOgo7IGhlcmUgd2UgaGF2ZSBmaW5pc2VkIGNvbXBhcmUsIGFuZCBlc2kgY29udGFpbiBsZW4gb2YgZXF1YWwgc3RyaW5nCgljbXAgICAgIGVzaSxiZXN0X2xlbiAgICAgICAgOyBpZiBsZW4gPiBiZXN0X2xlbiwgZ28gbmV3YmVzdGxlbgoJamEgICAgICBzaG9ydCBuZXdiZXN0bGVuCjsgbm93IHdlIHJlc3RvcmUgZWR4LCBlY3ggYW5kIGVzaSwgZm9yIHRoZSBiaWcgbG9vcAoJbW92ICAgICBlc2kscHJldgoJbW92ICAgICBlY3gsbGltaXQKCW1vdiAgICAgZWR4LHdpbmRvdwoJam1wICAgICBjb250bG9vcDMKCm5ld2Jlc3RsZW46Cgltb3YgICAgIGJlc3RfbGVuLGVzaSAgICAgICAgOyBsZW4gYmVjb21lIGJlc3RfbGVuCgoJbW92ICAgICBtYXRjaF9zdGFydCxlYXggICAgIDsgc2F2ZSBuZXcgcG9zaXRpb24gYXMgbWF0Y2hfc3RhcnQKCWNtcCAgICAgZXNpLG5pY2VfbWF0Y2ggICAgICA7IGlmIGJlc3RfbGVuID49IG5pY2VfbWF0Y2gsIGV4aXQKCWphZSAgICAgZXhpdGxvb3AKCW1vdiAgICAgZWN4LHNjYW4KCW1vdiAgICAgZWR4LHdpbmRvdyAgICAgICAgICA7IHJlc3RvcmUgZWR4PXdpbmRvdwoJYWRkICAgICBlY3gsZXNpCglhZGQgICAgIGVzaSxlZHgKCglkZWMgICAgIGVzaQoJbW92ICAgICB3aW5kb3dsZW4sZXNpICAgICAgIDsgd2luZG93bGVuID0gd2luZG93ICsgYmVzdF9sZW4tMQoJbW92ICAgICBieCxbZWN4LTFdICAgICAgICAgIDsgYnggPSAqKHNjYW4rYmVzdF9sZW4tMSkgPSBzY2FuX2VuZAoKOyBub3cgd2UgcmVzdG9yZSBlY3ggYW5kIGVzaSwgZm9yIHRoZSBiaWcgbG9vcCA6Cgltb3YgICAgIGVzaSxwcmV2Cgltb3YgICAgIGVjeCxsaW1pdAoJam1wICAgICBjb250bG9vcDMKCmV4aXRsb29wOgo7IGV4aXQgOiBzLT5tYXRjaF9zdGFydD1tYXRjaF9zdGFydAoJbW92ICAgICBlYngsbWF0Y2hfc3RhcnQKCW1vdiAgICAgZWJwLHN0cl9zCgltb3YgICAgIGVjeCxiZXN0X2xlbgoJbW92ICAgICBkd29yZCBwdHIgW2VicCtkZXBfbWF0Y2hfc3RhcnRdLGVieAoJbW92ICAgICBlYXgsZHdvcmQgcHRyIFtlYnArZGVwX2xvb2thaGVhZF0KCWNtcCAgICAgZWN4LGVheAoJamEgICAgICBtaW5leGxvCgltb3YgICAgIGVheCxlY3gKbWluZXhsbzoKOyByZXR1cm4gbWluKGJlc3RfbGVuLHMtPmxvb2thaGVhZCkKCjsgcmVzdG9yZSBzdGFjayBhbmQgcmVnaXN0ZXIgZWJ4LGVzaSxlZGksZWJwCglhZGQgICAgIGVzcCxOYlN0YWNrQWRkCgoJcG9wICAgICBlYngKCXBvcCAgICAgZXNpCglwb3AgICAgIGVkaQoJcG9wICAgICBlYnAKCXJldApJbmZvQXV0aG9yOgo7IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQo7IFlvdXIgYXJlIGZyZWUgdXNlIGd2bWF0MzIgaW4gYW55IGZyZSBvciBjb21tZXJjaWFsIGFwcHMgaWYgeW91IGRvbid0IHJlbW92ZSB0aGUgc3RyaW5nIGluIHRoZSBiaW5hcnkhCglkYiAgICAgMGRoLDBhaCwiR1ZNYXQzMiBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSB3cml0dGVuIDE5OTYtOTggYnkgR2lsbGVzIFZvbGxhbnQiLDBkaCwwYWgKCgoKSUZERUYgTk9VTkRFUkxJTkUKbG9uZ2VzdF9tYXRjaF83ZmZmICAgZW5kcApFTFNFCl9sb25nZXN0X21hdGNoXzdmZmYgIGVuZHAKRU5ESUYKCgpJRkRFRiBOT1VOREVSTElORQpjcHVkZXRlY3QzMiAgICAgcHJvYyBuZWFyCkVMU0UKX2NwdWRldGVjdDMyICAgIHByb2MgbmVhcgpFTkRJRgoKCXB1c2gJZWJ4CgoJcHVzaGZkICAgICAgICAgICAgICAgICAgOyBwdXNoIG9yaWdpbmFsIEVGTEFHUwoJcG9wICAgICBlYXggICAgICAgICAgICAgOyBnZXQgb3JpZ2luYWwgRUZMQUdTCgltb3YgICAgIGVjeCwgZWF4ICAgICAgICA7IHNhdmUgb3JpZ2luYWwgRUZMQUdTCgl4b3IgICAgIGVheCwgNDAwMDBoICAgICA7IGZsaXAgQUMgYml0IGluIEVGTEFHUwoJcHVzaCAgICBlYXggICAgICAgICAgICAgOyBzYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sKCXBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQoJcHVzaGZkICAgICAgICAgICAgICAgICAgOyBnZXQgbmV3IEVGTEFHUwoJcG9wICAgICBlYXggICAgICAgICAgICAgOyBzdG9yZSBuZXcgRUZMQUdTIGluIEVBWAoJeG9yICAgICBlYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgQUMgYml0LCBwcm9jZXNzb3I9ODAzODYKCWp6ICAgICAgZW5kX2NwdV9pc18zODYgIDsganVtcCBpZiA4MDM4NiBwcm9jZXNzb3IKCXB1c2ggICAgZWN4Cglwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgQUMgYml0IGluIEVGTEFHUyBmaXJzdAoKCXB1c2hmZAoJcHVzaGZkCglwb3AgICAgIGVjeAoKCW1vdiAgICAgZWF4LCBlY3ggICAgICAgIDsgZ2V0IG9yaWdpbmFsIEVGTEFHUwoJeG9yICAgICBlYXgsIDIwMDAwMGggICAgOyBmbGlwIElEIGJpdCBpbiBFRkxBR1MKCXB1c2ggICAgZWF4ICAgICAgICAgICAgIDsgc2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrCglwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUKCXB1c2hmZCAgICAgICAgICAgICAgICAgIDsgZ2V0IG5ldyBFRkxBR1MKCXBvcAkJZWF4CSAgICAgICAgICAgIDsgc3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgKCXBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBvcmlnaW5hbCBFRkxBR1MKCXhvcgkJZWF4LCBlY3ggICAgICAgIDsgY2FuknQgdG9nZ2xlIElEIGJpdCwKCWplCQlpc19vbGRfNDg2CQk7IHByb2Nlc3Nvcj1vbGQKCgltb3YgICAgIGVheCwxCglkYiAgICAgIDBmaCwwYTJoICAgICAgICA7Q1BVSUQKCmV4aXRjcHVkZXRlY3Q6Cglwb3AJZWJ4CglyZXQKCmVuZF9jcHVfaXNfMzg2OgoJbW92ICAgICBlYXgsMDMwMGgKCWptcCAgICAgZXhpdGNwdWRldGVjdAoKaXNfb2xkXzQ4NjoKCW1vdiAgICAgZWF4LDA0MDBoCglqbXAgICAgIGV4aXRjcHVkZXRlY3QKCklGREVGIE5PVU5ERVJMSU5FCmNwdWRldGVjdDMyICAgICBlbmRwCkVMU0UKX2NwdWRldGVjdDMyICAgIGVuZHAKRU5ESUYKCgoKCk1BWF9NQVRDSCAgICAgICBlcXUgICAgIDI1OApNSU5fTUFUQ0ggICAgICAgZXF1ICAgICAzCk1JTl9MT09LQUhFQUQgICBlcXUgICAgIChNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKQpNQVhfTUFUQ0hfOF8gICAgIGVxdSAgICAgKChNQVhfTUFUQ0ggKyA3KSBBTkQgMEZGRjBoKQoKCjs7OyBzdGFjayBmcmFtZSBvZmZzZXRzCgpjaGFpbmxlbndtYXNrCWVxdSAgZXNwICsgMAk7IGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4KCQkJCQk7IGxvdyB3b3JkOiBzLT53bWFzawp3aW5kb3cJCWVxdSAgZXNwICsgNAk7IGxvY2FsIGNvcHkgb2Ygcy0+d2luZG93CndpbmRvd2Jlc3RsZW4JZXF1ICBlc3AgKyA4CTsgcy0+d2luZG93ICsgYmVzdGxlbgpzY2Fuc3RhcnQJZXF1ICBlc3AgKyAxNgk7IGZpcnN0IHR3byBieXRlcyBvZiBzdHJpbmcKc2NhbmVuZAkJZXF1ICBlc3AgKyAxMgk7IGxhc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwpzY2FuYWxpZ24JZXF1ICBlc3AgKyAyMAk7IGR3b3JkLW1pc2FsaWdubWVudCBvZiBzdHJpbmcKbmljZW1hdGNoCWVxdSAgZXNwICsgMjQJOyBhIGdvb2QgZW5vdWdoIG1hdGNoIHNpemUKYmVzdGxlbgkJZXF1ICBlc3AgKyAyOAk7IHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIKc2NhbgkJZXF1ICBlc3AgKyAzMgk7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaAoKTG9jYWxWYXJzU2l6ZQllcXUgMzYKOwlzYXZlZCBlYngJYnl0ZSBlc3AgKyAzNgo7CXNhdmVkIGVkaQlieXRlIGVzcCArIDQwCjsJc2F2ZWQgZXNpCWJ5dGUgZXNwICsgNDQKOwlzYXZlZCBlYnAJYnl0ZSBlc3AgKyA0OAo7CXJldHVybiBhZGRyZXNzCWJ5dGUgZXNwICsgNTIKZGVmbGF0ZXN0YXRlCWVxdSAgZXNwICsgNTYJOyB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCmN1cm1hdGNoCWVxdSAgZXNwICsgNjAKCjs7OyBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzCjs7OyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUsIHdpdGggdGhlCjs7OyBhc3N1bXB0aW9uIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgZHdvcmQtYWxpZ24gdGhlIGZpZWxkcy4gKFRodXMsCjs7OyBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzCjs7OyBwcm9ncmFtIHRvIGNyYXNoIGhvcnJpYmx5LCB3aXRob3V0IHNvIG11Y2ggYXMgYSB3YXJuaW5nIGF0Cjs7OyBjb21waWxlIHRpbWUuIFNpZ2guKQoKZHNXU2l6ZQkJZXF1IDM2CmRzV01hc2sJCWVxdSA0NApkc1dpbmRvdwllcXUgNDgKZHNQcmV2CQllcXUgNTYKZHNNYXRjaExlbgllcXUgODgKZHNQcmV2TWF0Y2gJZXF1IDkyCmRzU3RyU3RhcnQJZXF1IDEwMApkc01hdGNoU3RhcnQJZXF1IDEwNApkc0xvb2thaGVhZAllcXUgMTA4CmRzUHJldkxlbgllcXUgMTEyCmRzTWF4Q2hhaW5MZW4JZXF1IDExNgpkc0dvb2RNYXRjaAllcXUgMTMyCmRzTmljZU1hdGNoCWVxdSAxMzYKCgo7OzsgbWF0Y2guYXNtIC0tIFBlbnRpdW0tUHJvLW9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQo7OzsgV3JpdHRlbiBmb3IgemxpYiAxLjEuMgo7OzsgQ29weXJpZ2h0IChDKSAxOTk4IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+Cjs7OyBZb3UgY2FuIGxvb2sgYXQgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAo7OzsKOzs7IFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAo7OzsgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KCjtHTE9CQUwJX2xvbmdlc3RfbWF0Y2gsIF9tYXRjaF9pbml0CgoKO1NFQ1RJT04JLnRleHQKCjs7OyB1SW50IGxvbmdlc3RfbWF0Y2goZGVmbGF0ZV9zdGF0ZSAqZGVmbGF0ZXN0YXRlLCBJUG9zIGN1cm1hdGNoKQoKO19sb25nZXN0X21hdGNoOgpJRkRFRiBOT1VOREVSTElORQpsb25nZXN0X21hdGNoXzY4NiAgIHByb2MgbmVhcgpFTFNFCl9sb25nZXN0X21hdGNoXzY4NiAgcHJvYyBuZWFyCkVORElGCgoKOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8KOzs7IG1ha2Ugcm9vbSBmb3Igb3VyIHN0YWNrIGZyYW1lLgoKCQlwdXNoCWVicAoJCXB1c2gJZWRpCgkJcHVzaAllc2kKCQlwdXNoCWVieAoJCXN1Ygllc3AsIExvY2FsVmFyc1NpemUKCjs7OyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiBlY3ggd2lsbCBob2xkIGN1cl9tYXRjaAo7OzsgdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiBlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQo7OzsgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUKOzs7IGVudGVyaW5nIHRoZSBtYWluIGxvb3AuCgoJCW1vdgllZHgsIFtkZWZsYXRlc3RhdGVdCgkJbW92CWVjeCwgW2N1cm1hdGNoXQoKOzs7IHVJbnQgd21hc2sgPSBzLT53X21hc2s7Cjs7OyB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOwo7OzsgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsKOzs7ICAgICBjaGFpbl9sZW5ndGggPj49IDI7Cjs7OyB9CgoJCW1vdgllYXgsIFtlZHggKyBkc1ByZXZMZW5dCgkJbW92CWVieCwgW2VkeCArIGRzR29vZE1hdGNoXQoJCWNtcAllYXgsIGVieAoJCW1vdgllYXgsIFtlZHggKyBkc1dNYXNrXQoJCW1vdgllYngsIFtlZHggKyBkc01heENoYWluTGVuXQoJCWpsCUxhc3RNYXRjaEdvb2QKCQlzaHIJZWJ4LCAyCkxhc3RNYXRjaEdvb2Q6Cgo7OzsgY2hhaW5sZW4gaXMgZGVjcmVtZW50ZWQgb25jZSBiZWZvcmVoYW5kIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIGNhbgo7OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0Lgo7OzsgSXQgaXMgdGhlbiBzaGlmdGVkIGludG8gdGhlIGhpZ2ggd29yZCwgdG8gbWFrZSByb29tIGZvciB0aGUgd21hc2sKOzs7IHZhbHVlLCB3aGljaCBpdCB3aWxsIGFsd2F5cyBhY2NvbXBhbnkuCgoJCWRlYwllYngKCQlzaGwJZWJ4LCAxNgoJCW9yCWVieCwgZWF4CgkJbW92CVtjaGFpbmxlbndtYXNrXSwgZWJ4Cgo7OzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7CgoJCW1vdgllYXgsIFtlZHggKyBkc05pY2VNYXRjaF0KCQltb3YJZWJ4LCBbZWR4ICsgZHNMb29rYWhlYWRdCgkJY21wCWVieCwgZWF4CgkJamwJTG9va2FoZWFkTGVzcwoJCW1vdgllYngsIGVheApMb29rYWhlYWRMZXNzOgltb3YJW25pY2VtYXRjaF0sIGVieAoKOzs7IHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7CgoJCW1vdgllc2ksIFtlZHggKyBkc1dpbmRvd10KCQltb3YJW3dpbmRvd10sIGVzaQoJCW1vdgllYnAsIFtlZHggKyBkc1N0clN0YXJ0XQoJCWxlYQllZGksIFtlc2kgKyBlYnBdCgkJbW92CVtzY2FuXSwgZWRpCgo7OzsgRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHRoZSBzY2FuIHB0ciBpcyBvZmYgZnJvbSBiZWluZwo7OzsgZHdvcmQtYWxpZ25lZC4KCgkJbW92CWVheCwgZWRpCgkJbmVnCWVheAoJCWFuZAllYXgsIDMKCQltb3YJW3NjYW5hbGlnbl0sIGVheAoKOzs7IElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KOzs7ICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOwoKCQltb3YJZWF4LCBbZWR4ICsgZHNXU2l6ZV0KCQlzdWIJZWF4LCBNSU5fTE9PS0FIRUFECgkJc3ViCWVicCwgZWF4CgkJamcJTGltaXRQb3NpdGl2ZQoJCXhvcgllYnAsIGVicApMaW1pdFBvc2l0aXZlOgoKOzs7IGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOwoKCQltb3YJZWF4LCBbZWR4ICsgZHNQcmV2TGVuXQoJCW1vdglbYmVzdGxlbl0sIGVheAoKOzs7IFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gZXNpIGxvY2FsbHksIGFuZCBpbiBlc2kuCgoJCWFkZAllc2ksIGVheAoJCW1vdglbd2luZG93YmVzdGxlbl0sIGVzaQoKOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOwo7OzsgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwo7OzsgUG9zZiAqcHJldiA9IHMtPnByZXY7CgoJCW1vdnp4CWVieCwgd29yZCBwdHIgW2VkaV0KCQltb3YJW3NjYW5zdGFydF0sIGVieAoJCW1vdnp4CWVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdCgkJbW92CVtzY2FuZW5kXSwgZWJ4CgkJbW92CWVkaSwgW2VkeCArIGRzUHJldl0KCjs7OyBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4KCgkJbW92CWVkeCwgW2NoYWlubGVud21hc2tdCgkJam1wCXNob3J0IExvb3BFbnRyeQoKYWxpZ24gNAoKOzs7IGRvIHsKOzs7ICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKOzs7ICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwKOzs7ICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKOzs7ICAgICBbLi4uXQo7OzsgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0Cjs7OyAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsKOzs7Cjs7OyBIZXJlIGlzIHRoZSBpbm5lciBsb29wIG9mIHRoZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgc3BlbmQgdGhlCjs7OyBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbAo7OzsgYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuCjs7Owo7OzsgV2l0aGluIHRoaXMgbG9vcDoKOzs7IGVieCA9IHNjYW5lbmQKOzs7IGVjeCA9IGN1cm1hdGNoCjs7OyBlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykKOzs7IGVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikKOzs7IGVkaSA9IHByZXYKOzs7IGVicCA9IGxpbWl0CgpMb29rdXBMb29wOgoJCWFuZAllY3gsIGVkeAoJCW1vdnp4CWVjeCwgd29yZCBwdHIgW2VkaSArIGVjeCoyXQoJCWNtcAllY3gsIGVicAoJCWpiZQlMZWF2ZU5vdwoJCXN1YgllZHgsIDAwMDEwMDAwaAoJCWpzCUxlYXZlTm93Ckxvb3BFbnRyeToJbW92engJZWF4LCB3b3JkIHB0ciBbZXNpICsgZWN4IC0gMV0KCQljbXAJZWF4LCBlYngKCQlqbnoJTG9va3VwTG9vcAoJCW1vdgllYXgsIFt3aW5kb3ddCgkJbW92engJZWF4LCB3b3JkIHB0ciBbZWF4ICsgZWN4XQoJCWNtcAllYXgsIFtzY2Fuc3RhcnRdCgkJam56CUxvb2t1cExvb3AKCjs7OyBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBjaGFpbmxlbi4KCgkJbW92CVtjaGFpbmxlbndtYXNrXSwgZWR4Cgo7OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQo7OzsgYXJlIGhvcGluZyB0byBtYXRjaCBpdCB1cCB3aXRoLiBJbiBhY3R1YWxpdHksIGVzaSBhbmQgZWRpIGFyZQo7OzsgYm90aCBwb2ludGVkIChNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikgYnl0ZXMgYWhlYWQsIGFuZCBlZHggaXMKOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLgoKCQltb3YJZXNpLCBbd2luZG93XQoJCW1vdgllZGksIFtzY2FuXQoJCWFkZAllc2ksIGVjeAoJCW1vdgllYXgsIFtzY2FuYWxpZ25dCgkJbW92CWVkeCwgMGZmZmZmZWY4aDsgLShNQVhfTUFUQ0hfOCkKCQlsZWEJZWRpLCBbZWRpICsgZWF4ICsgMDEwOGhdIDtNQVhfTUFUQ0hfOF0KCQlsZWEJZXNpLCBbZXNpICsgZWF4ICsgMDEwOGhdIDtNQVhfTUFUQ0hfOF0KCjs7OyBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsCjs7OyBhZGp1c3QgZWR4IHNvIHRoYXQgaXQgaXMgb2Zmc2V0IHRvIHRoZSBleGFjdCBieXRlIHRoYXQgbWlzbWF0Y2hlZC4KOzs7Cjs7OyBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUKOzs7IHN0cmluZ3MgbWF0Y2ggZWFjaCBvdGhlciwgYW5kIHRoZXkgY2FuIGJlIHNhZmVseSBwYXNzZWQgb3ZlciBiZWZvcmUKOzs7IHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMwo7OzsgYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSBlZGkKOzs7IHBvaW50ZXIuIChlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikKOzs7Cjs7OyBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50Cjs7OyBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQo7Ozsgc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlCjs7OyBwZXJmb3JtYW5jZS4KCkxvb3BDbXBzOgoJCW1vdgllYXgsIFtlc2kgKyBlZHhdCgkJeG9yCWVheCwgW2VkaSArIGVkeF0KCQlqbnoJTGVhdmVMb29wQ21wcwoJCW1vdgllYXgsIFtlc2kgKyBlZHggKyA0XQoJCXhvcgllYXgsIFtlZGkgKyBlZHggKyA0XQoJCWpueglMZWF2ZUxvb3BDbXBzNAoJCWFkZAllZHgsIDgKCQlqbnoJTG9vcENtcHMKCQlqbXAJc2hvcnQgTGVuTWF4aW11bQpMZWF2ZUxvb3BDbXBzNDoJYWRkCWVkeCwgNApMZWF2ZUxvb3BDbXBzOgl0ZXN0CWVheCwgMDAwMEZGRkZoCgkJam56CUxlbkxvd2VyCgkJYWRkCWVkeCwgIDIKCQlzaHIJZWF4LCAxNgpMZW5Mb3dlcjoJc3ViCWFsLCAxCgkJYWRjCWVkeCwgMAoKOzs7IENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4gSWYgaXQgaXMgbG9uZ2VyIHRoYW4gTUFYX01BVENILAo7OzsgdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuCgoJCWxlYQllYXgsIFtlZGkgKyBlZHhdCgkJbW92CWVkaSwgW3NjYW5dCgkJc3ViCWVheCwgZWRpCgkJY21wCWVheCwgTUFYX01BVENICgkJamdlCUxlbk1heGltdW0KCjs7OyBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIGJlc3QgbWF0Y2ggd2UKOzs7IGhhdmUgc28gZmFyLCB0aGVuIGZvcmdldCBpdCBhbmQgcmV0dXJuIHRvIHRoZSBsb29rdXAgbG9vcC4KCgkJbW92CWVkeCwgW2RlZmxhdGVzdGF0ZV0KCQltb3YJZWJ4LCBbYmVzdGxlbl0KCQljbXAJZWF4LCBlYngKCQlqZwlMb25nZXJNYXRjaAoJCW1vdgllc2ksIFt3aW5kb3diZXN0bGVuXQoJCW1vdgllZGksIFtlZHggKyBkc1ByZXZdCgkJbW92CWVieCwgW3NjYW5lbmRdCgkJbW92CWVkeCwgW2NoYWlubGVud21hc2tdCgkJam1wCUxvb2t1cExvb3AKCjs7OyAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOwo7OzsgICAgICAgICBiZXN0X2xlbiA9IGxlbjsKOzs7ICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsKOzs7ICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwoKTG9uZ2VyTWF0Y2g6CW1vdgllYngsIFtuaWNlbWF0Y2hdCgkJbW92CVtiZXN0bGVuXSwgZWF4CgkJbW92CVtlZHggKyBkc01hdGNoU3RhcnRdLCBlY3gKCQljbXAJZWF4LCBlYngKCQlqZ2UJTGVhdmVOb3cKCQltb3YJZXNpLCBbd2luZG93XQoJCWFkZAllc2ksIGVheAoJCW1vdglbd2luZG93YmVzdGxlbl0sIGVzaQoJCW1vdnp4CWVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdCgkJbW92CWVkaSwgW2VkeCArIGRzUHJldl0KCQltb3YJW3NjYW5lbmRdLCBlYngKCQltb3YJZWR4LCBbY2hhaW5sZW53bWFza10KCQlqbXAJTG9va3VwTG9vcAoKOzs7IEFjY2VwdCB0aGUgY3VycmVudCBzdHJpbmcsIHdpdGggdGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoLgoKTGVuTWF4aW11bToJbW92CWVkeCwgW2RlZmxhdGVzdGF0ZV0KCQltb3YJZHdvcmQgcHRyIFtiZXN0bGVuXSwgTUFYX01BVENICgkJbW92CVtlZHggKyBkc01hdGNoU3RhcnRdLCBlY3gKCjs7OyBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47Cjs7OyByZXR1cm4gcy0+bG9va2FoZWFkOwoKTGVhdmVOb3c6CgkJbW92CWVkeCwgW2RlZmxhdGVzdGF0ZV0KCQltb3YJZWJ4LCBbYmVzdGxlbl0KCQltb3YJZWF4LCBbZWR4ICsgZHNMb29rYWhlYWRdCgkJY21wCWVieCwgZWF4CgkJamcJTG9va2FoZWFkUmV0CgkJbW92CWVheCwgZWJ4Ckxvb2thaGVhZFJldDoKCjs7OyBSZXN0b3JlIHRoZSBzdGFjayBhbmQgcmV0dXJuIGZyb20gd2hlbmNlIHdlIGNhbWUuCgoJCWFkZAllc3AsIExvY2FsVmFyc1NpemUKCQlwb3AJZWJ4CgkJcG9wCWVzaQoJCXBvcAllZGkKCQlwb3AJZWJwCgoJCXJldAo7IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQo7IFlvdXIgY2FuIGZyZWVseSB1c2UgZ3ZtYXQzMiBpbiBhbnkgZnJlZSBvciBjb21tZXJjaWFsIGFwcCBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSEKCWRiICAgICAwZGgsMGFoLCJhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSBmcm9tIEJyaWFuIFJhaXRlciwgd3JpdHRlbiAxOTk4IiwwZGgsMGFoCgpJRkRFRiBOT1VOREVSTElORQpsb25nZXN0X21hdGNoXzY4NiAgIGVuZHAKRUxTRQpfbG9uZ2VzdF9tYXRjaF82ODYgIGVuZHAKRU5ESUYKCl9URVhUICAgZW5kcwplbmQK